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 should work, pay very careful attention to how things do 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 turn you into 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.
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.
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.
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 everybody 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.
I have tried a lot but the being arrgant when you meet somene with similar skills is so tough to avoid. Plus the sheer chauvinism against non-techie people, makes me feel guilty too. What do you suggest to avoid the ego factor?
The best way to avoid this is to not tie your self-worth to your technological prowess. Discover what you like to do (beyond programming), and go do it, and be willing to put yourself out there and enjoy things even if you don't get any outside approval for it. Oftentimes this makes people really anxious; therapists or talking things over with a solid circle of friends can be helpful for discharging the anxiety, but really you pretty much have to lean into it and accept that being good with computers is not going to make you better than anyone else or solve any other problems you might have.
She had started out as a math major.
The biggest negative for a young person is pursuing something they have no passion for. The dilemma of college for most young people is that they have little idea what a field entails until they arrive on campus and start taking courses - and even those who do have applicable knowledge of the reality still don't know about many of their other options.
So why do you want to major in CS?
http://sloentrepreneur.wordpress.com/2008/02/10/the-pmarca-g...
(My former cofounder was a psych undergrad + MBA, my girlfriend is a business undergrad + MBA, and I've got many more startup offers from people wanting to found companies with me than either of them.)
That's not to say that there are not other paths, but entrepreneurship works well in the Bill Gates model - he and Allen were in the software business in high school.
A business which fell out of their passion for programming. If Gates had followed the money as a teenager, he probably would have gone into the family business - law.
Good luck.
The lack of social skills, assuming that you don't have one and didn't gain much of it during college, will carry over to your negotiation skills when you look for jobs.
Depending on which area of software engineer you are going in, your tech skills have a half life of supposely 2.5 years. Meaning there will always be something to learn, dev black berry for a long time now? Ha! Iphone and Android is the shizzle now. Cold fusion? Well, now, it's PHP & Ruby.
There is a decent chance you will work under an idiot that lied his/her way to where he/she is now and will back stab you (very high chance if you work in the public sector ie gov,fed,state). Ah! Politics, it's a bitch and it can be in any profession really, but I feel it's more pronounce in this profession. Especially, well the dev team is a few developers and you're like how the fuck is this guy paying more than me and I'm doing most of the work? Eventually, if you catch on, you'll quit and learn how to embellish and get better at interviews.
Ah this lead to ego! It fucking hurts that someone is getting paid more than you but you know more than them. Yeah sure you can say you're just whiny. But really, you can constantly feel like you're being underpaid and under appreciated.
So if you're considering it because you already love programming then (for me) there were no down sides. (I even met my wife there.) if you are considering it because "all the money is in computers" then rather pick something else.
Yes, many, ( most?) will make a reasonable amount of money, and there's always the carrot of the big payday for the very very few, but when it takes 2 days to find and fix an obscure bug, which turns out to be a , instead of a . then suddenly something like duck farming sounds like a more fulfilling way to make a living.
If you love it, go for it.
To state the obvious, I would say don't major in Computer Science if you aren't genuinely interested in it. There are many different kinds of businesses to start and simply knowing how to program doesn't really make you any more likely to found a successful one. Even if it did, you don't need to study it in college. While I believe that learning the fundamentals in college is the best way, a person of above-average intelligence with a desire to learn could become a serviceable programmer in a matter of months with nothing more than a computer and a few books.
When you start college you do crazy things like envision a path to success that relies on specific factors that you will soon realize really didn't make any difference. In short, your major will have a predictive rate of about 0% of an impact on your success after college and that's especially true if you are going to start a business.
Shoulder, neck, back issues. RSI, eye strain are all common complaints. You have to be prepared to integrate decent amounts of exercise into your free time to stay healthy.
I know engineers that are so used to having everything accessible at their finger tips that it becomes a major effort to get off their ass and go and put a disk into a server.
Always remember, when you go to interview for a job - look at the team. Are they healthy & active or will you be joining a culture that expects you to be sedentary all day.
I'd still recommend a CS major, but I urge perspective.
Many people learn to program on their own, or in their spare time.
How many people learn algebraic topology on their spare time? Or delve deep into combinatorial optimization?
Consider doing something else, and figure out the programming stuff on your own.
There's lots of fluff in your average CS degree. You might want to take a mathematics degree instead, which is `harder' (as in `not as soft' and fluffy).