I assume you're actually thinking of going into software engineering as a profession, and not just getting a CS degree and doing something else. The latter can actually be pretty useful in a variety of scientific, technical, and management fields, except you have to pair it with something. Anyway, here's my list (for reference, I'm 32, have roughly 9 years of professional experience all of it in software, and currently work on search for Google. I have a CS degree but went to a liberal arts college and switched around between physics, philosophy, and sociology before settling on it):<p>1. Programming is a very cognitively demanding and highly rational skill. To do it well, you to some extent need to "shut down" your emotional circuitry and your intuitions about how things <i>should</i> work, pay very careful attention to how things <i>do</i> work, and then retrain your instincts to take this into account. All on a very rigorous, formal, mathematical level. Unfortunately, if you do this without simultaneously maintaining an active social life, you risk finding yourself unable to relate to "normal" people. It's not just that programming attracts geeks, it's that programming enough can <i>turn you into</i> a geek. This is avoidable (some of the top minds in our field have a life outside work and are quite approachable as human beings), but it requires that you set strict limits on the time you spend hacking - which can often be hard to keep to when you hear about a 19-year-old kid who invented a peer-to-peer protocol or a 23-year-old who invented a programming language.<p>2. There's an expiration date on your knowledge. It's not as drastic as some people make it out to be - it is still possible to get hired as an engineer past 40. But pretty much everything you learned when you first started out will be obsolete. I've only been doing this since 2000 and I've had to reinvent myself at least three times - I started as a desktop UI dev working with Java Swing; then I learned JS and web technologies pretty deeply; then I got into unstructured data mining, clustering, and ranking algorithms; now I'm back doing UI, but for mobile web devices (which have completely different performance characteristics as desktop) in a lead role. In fields like law or accounting you gradually learn more of a huge body of relatively static knowledge, and so your intellectual capital increases monotonically over your career. In computing, large bodies of knowledge become completely obsolete overnight, and so you can easily have huge discontinuities in your career where you have to adapt or fade into irrelevance.<p>3. Programming is not amenable to just putting in your time and packing it away when you go home at 5. It's a creative profession, and creativity is subject to the whims of your brain and requires engagement and grappling with the subject. Many programmers find it really hard to work on a set schedule - Paul Graham has a good essay called "Maker's schedule vs. Manager's schedule" on this.<p>4. The egos. A large segment of the software world seems to be composed of people who keep trying to one-up each others in their knowledge of esoteric trivia, and then once they've found something they know that nobody else does, suddenly everyone else is an idiot. This is exhausting and not all that pleasant. It is much more prevalent in some communities than others - there are places you can go that are quite supportive, where <i>everybody</i> is interested in learning new things and new knowledge is gently pointed out and explained - but if you read many of the places where programmers gather, there are many a pissing contest that are just complete wastes of time.