I was asked a few weeks ago to speak with some high school seniors interested in pursuing computer science[1]. The talk was to center around three ideas: how I got started in Computer Science, what my college experience was like, and transitioning from college to a career. After a quick introduction, here's my recollection of what I said:
Growing up, my father worked for the Navy and so he had access to ARPANET, which was the Internet before there was such a thing as the Internet. Once the real internet came out we were one of the first families around to have it. I got an early start making simple webpages, writen in raw HTML and later JavaScript. At one point I had a book about Perl thinking I would write some CGI scripts. Unfortauntly I didn't have access to a server at the time so I wrote out programs on notepads, compiling them in my mind. This eventually led me to taking AP Comp Sci 1 and AP Comp Sci 2 in high school and then taking a 300-level course at George Mason University my senior year of high school. It was pretty obvious to me at the time that I wanted to pursue computer science and engineering in college.
College was a bit of a struggle for me. While I love learning new things I never particularly enjoyed school itself. I attended most of my classes, but I also fell asleep in many of them. The best piece of advice I can give you about college is that if you are going to sleep through your classes do it in the classroom and not in your dorm - your professors tell you what's on the tests at the beginning or end of each class, plus you don't have to lie to your parents about attending!
Many of you mentioned earlier that you've already built some apps or websites. These are admirable accomplishments, no matter the scale of effort. However, a computer science curriculum is not like that. Most curriculums will focus on the base knowledge you need to succeed rather than the applicable skills and tools. Platforms, frameworks, and toolsets come and go but if you understand the underlying science you will know how to use whatever the tool of the day is. Some days this may feel frustrating - "when do we get to build real things?!" but will pay off in the long run.
I didn't love my computer science classes. It was a lot of slides and lecturing, which wasn't an effective learning technique for me, although it might be for you. My favorite class was actually a political science class that was very discussion and essay based. I highly recommend taking interesting non-CS classes. The breadth of experience and knowledge that you gain will make you a better programmer. Programming is fundamentally about using tools to solve problems; if you only know how to use the tool but don't understand the problem then you won't know how to correctly apply the tool.
Unless you become independently wealthy and can write software for pure fun, the output of your efforts will be a small part of a larger organizational effort, and probably a business one. The more you understand how your work contributes to the organization as a whole and that's organization's goals, the more valuable your work can be, and thus the more valuable you will be. Learn how all aspects of a business work - even try starting one yourself during school. Join interesting research projects, participate in team activities. Working with teams and understanding higher level goals will be emparative to a successful career.
Most likely you will be making software that other people use. Know that not everyone is like you and take that into account when writing software. Consider your users and design for them. I will leave you with a quote from Kobe Bryant. He was once asked about advice he would give to his rookie self. His answer was about compassion and empathy for teammates. Apply his message to all aspects of your life but especially in this regard to your users and coworkers:
"The biggest thing about being a leader ... is understanding how to put yourself in other people's shoes ... about understanding others and what they may be going through. When you understand that, you can communicate with them a little better and bring out the best in them."
Thank you and best of luck in your future.
[1] - Alumni Lunch and Learn - Getting Down to Computer Basics.