I have never been asked to talk at a commencement event. I’m not surprised — I’m not nearly famous enough. However, I’m pretty sure that after reading this blog post, nobody will make the mistake of inviting me. Here, I’ll be talking about a career as a software engineer, since this is the only career I can speak confidently about.
Anyone who goes to college, especially a good college, for a CS degree is making a huge mistake. Well, almost anyone. If you want to be an academic researcher in CS, this might be the right program for you. However, if you want a career as a software engineer, that was not the optimal to take. Sure, a degree is fine — but you can get one just as good from a minor college, and do a lot better for yourself.
But first, let me digress a bit from what you should have done better, and tell you what your college should have done better. Instead of teaching you for 9 months out of the year, and having you intern for three, it should have been the reverse. When you started, they should have given you a three months crash course about programming — C, C++, Python and Java would have been my choices. In three months, 40 hours per week, you can learn the basics of programming in each of those. For the end, you would write a basic web server which calls out to C for low-level string crunching. Then, your college would help you intern for some “code monkey” position — writing code for a large hairy web application written in a mixture of five languages. I’m sure many companies would love to hire a minimum wage employee to fix those bugs. Those would not be the most pleasant of nine months, but at the end of those you will have learned what bug tracking systems are, what source control is, how to work with co-workers and other important life skills.
For the next three months, you would have studied networking and operating system. You would finish with writing a device driver and a TCP stack. With these skills, and one internship already under your belt, you would be again farmed out for internship at one of the big-but-interesting companies — Cisco, Oracle and the like. There you would work as a temporary employee on one of the products that they are bringing to market. You would learn how to delve into code bases, how to ask the right questions and how to take initiative.
The next-to-last three months would be devoted to theory — finite automata and Turing machines, statistics, calculus and linear algebra. The nine months after that you would, ideally, find an internship in something that interests you.
The senior year (well, three months) you would spend on electives — technical writing, public speaking, advanced math, security, genetics or multiple other topics would be provided for you to specialize in. With a year’s worth of studies and more than two years’ worth of work experience, you will be snatched up by many employers.
However, your college has been optimized to train academic researchers, not to provide the software industry with ready valuable employees. So what can one person, without ability to change the system, do?
Spend the first two years getting a CS associate degree at a no-name college. Do the minimum work to get a half-reasonable GPA, and in the rest of the time, choose a well-known open source projects, and start contributing to it. Most reasonable projects have public bug lists — just start fixing bugs. It will be hard, at first, but keep at it. Two years of this should be enough for you to be a well-recognized contributor.
After that, get into a CS program at any local college that will accept you. Continue contributing on your open source project of choice, but now start answering questions related to it on Stack Overflow, and also start your own projects. What projects? Think for five minutes (on the clock!) about 20 new ways to improve your life using software, and choose the 3 most appealing. Publish them with a reasonable license (say, BSD Lite) on github. Make sure to try for interesting internships every summer.