Build your own lightsaber
Our industry is booming, not just in Silicon Valley, but all over the place. The job outlook for software developers is great as a result. However a lot of these jobs aren’t the “computer programmer” jobs of the 1980s and 1990s. A lot of these jobs are front-end web development work for example, jobs that often require additional skills (graphic design, ability to communicate effectively with clients, etc.) not typically associated with the old school hacker stereotype.
There’s a lot of debate and articles out there trying to define the differences between a developer, designer, programmer, coder, computer scientist, computer programmer, software engineer, software developer etc. I don’t really want to get into that too much. The truth is it’s a mess to try to define. So few people agree on any particular arrangement of labels.
There’s also the problem that people turn labels into unnecessary hierarchies, when it’s really just a matter of differences. There’s a lot of great front-end developers who have no interest to learn theoretical computer science and there’s a lot of great back-end developers that don’t have a knack for graphic design, but often times you need a balanced team to create something great. Suggesting one is better than the other is like suggesting a defenceman is more important than a forward in hockey – both are required to win, so it doesn’t really make much sense.
That said, we’ve seen a lot of innovative efforts to crank out more people that “know how to code” to meet the demand for these new job openings:
- Online courses and learning platforms, e.g. Codecademy and Udemy
- Various “learn to code” initiatives backed by government and/or major industry partners
- Learn to code workshops that introduce attendees to material in 1 day to 2 week formats, e.g. Ladies Learning Code
- Intensive developer bootcamps that try to teach programming in time periods of roughly 9-16 weeks, e.g. Bitmaker Labs
Going back to the hockey analogy… we’re doing a great job developing talent at the “forward” position let’s say, but what about the other positions on the tech team?
Lately I’ve noticed an uptick in people contacting me or asking me about things like scalability issues, code generation, and analytics. There are some problems out there where no matter how brilliant a manager leads however many great people that “know how to code”, it’s not going to be enough to solve the problem. There’s some problems that just necessarily require some “hardcore” mathematics and computer science to properly and economically solve them. Solving these hard technical problems is critically important to the success or failure of many startup businesses. Look at what happened to Friendster (founded by McMaster computer science alumni Jonathan Abrams):
…it basically came down to failed execution on the technology side — we had millions of Friendster members begging us to get the site working faster so they could log in and spend hours social networking with their friends. I remember coming in to the office for months reading thousands of customer service emails telling us that if we didn’t get our site working better soon, they’d be ‘forced to join’ a new social networking site that had just launched called MySpace… the rest is history.
So I worry a bit that in our industry’s rush to “teach everyone to code” or “just build an MVP” we’re neglecting the importance of the mathematics and computer science behind a lot of great products. I wouldn’t even just limit it to mathematical computer science, I’d add other computer science subtopics to the mix too like software testing, design and usability. I’m sure supply and demand will correct any imbalance over the long run, if indeed there is an actual problem.
But to newcomers who are learning to code for the first time and finding that they enjoy it very much, I’d encourage you to keep going. If you’ve gone through a Codacademy, learn to code workshop or coding Bootcamp and have “caught the bug” (no pun intended) and find yourself thirsty for more technical problems, there’s a lot more out there you should know about.
If you find you love creating and modifying WordPress themes, try building a plug-in next. If you get that far, try building an actual content management system next. Yes, those are some pretty big leaps, but if you find yourself loving it, why not make the jump? You’ll be opening yourself up to positions that let you build more complicated software systems. A huge amount if not the vast majority of work in our industry is at this technical level too, and it tends to be better paid.
What if you want to keep going even further? Some people will tell you to “re-build an existing popular web app”. For example, try to make a Twitter-clone. That’s not a bad idea.
But I think an even better idea is to build a compiler and/or operating system. Why? Because Jedis know how to build their own lightsabers, that’s why! Like a Jedi’s lighsaber, compilers and operating systems are your most foundational tools as a software developer. Understanding them enough to be able to build your own isn’t directly essential to your career, but it will make you a stronger developer.
But also because compilers and operating systems are where a lot of more foundational computer science concepts “come together” in an interesting way. Building a compiler and an operating system forces you to put together different areas of computer science in an interesting and practical way, knowledge of everything from the registers in the CPU to formal grammars is required. It’s the thought process of having to put those different areas together that matters.
Building a compiler and operating system will also force you to learn about how the programs you write execute on a more fundamental level. Because unless you are writing assembly code some form of compilation or code transformation is happening to your programs at some point, and the program is operating in some form of operating system/environment.
Chances are you will never have to build a compiler or operating system on the job, the employment in these fields is practically a niche area in the field. It’s just not a skill that everybody needs to have. But if you can build these tools yourself chances are you’ll have obtained enough experience at figuring things like this out that you’ll be able to tackle other problems where their solutions require piecing together knowledge from otherwise unrelated areas of computer science.
Want to give it a try? Here are some resources…
Compiler
Basics of Compiler Design – free PDF book
Dragon Book and related course notes
Let’s Build a Compiler by Jack Crenshaw
Recommended:
Coursera / Stanford compiler course – includes an optional project where you build an actual compiler
Operating System
The Dinosaur Book
Nachos
Minix3
Recommended:
PintOS – Nice and simple educational OS project out of Standford
Interestingly, I’m not the first to make the (very nerdy) argument about Jedis building their own lightsabers in relation to compilers.