“I’m learning how to program…”
As someone who goes to quite a few tech meetups, I hear people say this on a regular basis. When I mention that I code for a living, I often get a torrent of questions about the best ways to learn. Rather than be a dick and tell them “hey, I wrote book about learning, just read that!”, I end up writing epically long emails about all the factors a newcomer to coding should consider.
In an effort to spend less time writing emails, I decided to create this blog post. Since I’m usually telling people the same things over and over again, it makes sense to just have this information in a single, easily-accessible place.
Most people who say they want to program are doing it because they heard how much programmers make and decided that they, too, would like to make six figures. While there’s nothing wrong with wanting to upgrade your lifestyle and make more money, deciding to embark on this path just for more cash is a genuinely terrible idea.
You need to adopt a realistic understanding of what being a programmer is, what programmers do to earn their wages, and what types of programmers are out there.
The reason programmers get paid well is primarily because they’re solving hard problems. Solving hard problems is, well, hard. But these problems are worth so much to these businesses that they’re willing to shell out large sums to anyone who can fix them.
What this means is that, assuming you’re decent enough to find work as a programmer, you’re going to become a professional problem solver.
This can be a good or a bad thing – it all depends on your personality. If you like digging into complex systems and finding ways to simplify them then you’ll probably like coding for a living.
On the other hand, if staring at a computer screen, trying to nail down that one problem (which ends up being a missing semicolon on line 432) for hours (sometimes days) at a time sounds like your worst nightmare, you’ll hate it.
Programming is not glamorous, despite how it is portrayed to the world outside of tech. It can be mentally gruelling work, and burnout is common. If you’re motivated soley by money, you’re either going to A) fail, or B) succeed and hate your daily life.
What Type of Programmer Do You Want To Be?
The world of coding offers a large number of paths, but I like to think they generally fall into a few distinct categories: employee, freelancer, hybrid, magician and builder.
Most coders fall into this category. You work for a company that pays you either hourly or annually to code up solutions to their business problems. If you’re new to programming, you probably see this as the most attractive option.
This is going to be tough to do in a short period of time, but absolutely doable if you’re willing to take 10-12 months to really focus and take yourself from beginner to junior developer.
The biggest con I see, aside from the time required, is the previously mentioned fact that programmer salaries are public knowledge, and now everyone and their mom wants to be one. For your purposes, this means companies often have their pick when it comes to junior developers. There’s less competition the higher up you go in experience and skill level, but new guys will have to fight it out.
Startups are sometimes receptive to taking on newish programmers, but they often don’t have the capital to spend on someone who can’t contribute immediately. Bigger companies have more money to burn on new guys, but will generally have more rigid hiring requirements (such as a BS in Computer Science or other technical discipline) and overly bureaucratic processes.
If you join a small startup you probably won’t have a ton of opportunities to move up – they generally hire to keep you in one position, and may consider you for something akin to a senior dev/CTO role way down the road if they stay in business long enough (which is a big if).
Bigger companies may put roadblocks on your progress if you don’t have specific academic credentials, although it is certainly possible to move up in some companies without them.
No matter what size company it is, you will need to go through the dreaded interview process. This is one aspect of working for others as a developer that absolutely, 100% blows.
Depending on the interviewer, this might be as simple as an informal conversation about the programming tools you’ll be using or as complex as implementing a binary search tree on a whiteboard.
Yes, you read that correctly: on a fucking whiteboard. It’s idiotic, but some companies still insist on doing this and if you want to be competitive you’ll need to learn how to do it. That’s the game, my friend.
When you work for a company, there is usually a set of processes that you’ll be expected to follow when it comes to coding, deployment, etc. This varies from company to company, but you’ll need to get up to speed with whatever tools and ideas they’re using (such as Agile methodology, continuous integration, version control, etc.) if you want to stay there.
These are all valuable things to know, and I’m a firm believer in development processes, just realize that this aspect will add on to the time and effort required for you to get a job.
Hours for developers can be quite long, and the demands (especially in startups) can cause burnout pretty quickly. You’ll often deal with non-technical management that will expect the impossible from you and punish you when you can’t deliver.
You’ll witness organizational stupidity on a level that will leave you speechless. Although there’s plenty of satisfaction to be had – particularly when you fix a nasty bug or successfully fire up a new app for the first time – it is not all sunshine and roses, not by a longshot.
You should also understand that companies who can afford to pay their developers high salaries can do so because those developers are making shitloads of money for them. For example, the average developer at Google makes something like $130k per year.
That sounds incredible…until you realize that a single developer is generating millions of dollars worth of value for Google. On the whole, Google makes upwards of $7m per hour ($66b annual revenue in 2014 / 8,760 hours).
Fuck yeah they can pay you $120k, they could pay you twice that every day and still be just fine!
In other words, your six figure salary is actually a gigantic discount for the company. Working for someone else as a coder means you trade the perceived safety of a steady job for a gigantic difference in generated value.
Companies are also absolutely terrified of in-house value destruction. In other words, they’re scared that you’re so incompetent that you’ll destroy whatever it is you’re working on. Most startups are worried about burning through cash they can’t afford to lose. Big companies often do it because they’re big, dumb lumbering giants that don’t like taking risks.
Danny Crichton over at TechCrunch wrote an entire article about this phenomenon, which he calls the “Secretly Terrible Engineer.” I highly recommend you take a moment to read it.
It takes quite a bit of time and effort to get good enough to become an employee. Develop thick skin if you don’t have it already, because the field is competitive right now and those with established skills have the advantage.
But it isn’t all bad. One big pro of being an employee is that you’ll get to work side-by-side with experienced developers, who will teach you all kinds of cool tricks you didn’t know about before.
Learning from these types of characters is almost a cheat code for your career. Or, if they’re dicks, they’ll constant berate you for not being on their level (fuck those kinds of developers in general, by the way).
You’ll also be getting a paid education in programming, which is a pretty sweet deal. Many guys work for other people for a few years, then take the skills they were paid to hone and transition into something more lucrative, like freelancing or building a startup.
Freelance work is often romantacized, especially by the fine people of my generation. The idea of living nomadically, travelling the world and working on your own terms does sound incredibly sexy. Unfortunately, not many freelancers actually do this. I’m currently a freelancer, and I do have quite a bit of freedom and yet, like any other job, there are both pros and cons.
To work as a freelancer, you’ll probably need to work in a company first. I say this because you’re going to need some kind of money to sustain you while you look for work on your own. You might get lucky, but most guys don’t just jump right into freelancing. It’s often a result of working at a company and deciding you don’t like working at companies.
The interview process will be much different (you probably won’t have to do much white boarding), and previous projects will be much more important to whether someone hires you.
This path requires you to have a great deal of discipline, as you’ll be responsible for finding work, keeping your skills sharp, managing business stuff like taxes and licenses and whole host of other things.
The money aspect is probably the biggest pro: although not consistent (especially in the beginning), you can charge quite a bit more as a freelancer than what a big company will pay you. It is worth noting, however, that the extra money doesn’t involve taxes, which you’ll need to account for at the end of the year.
You also get to pick what kinds of work you want to do, and you don’t have to worry about getting bogged down with some bullshit task that got passed down to you by someone else who didn’t want to deal with it.
The primary con I see with freelancing is the clients. Clients can be all over the place, and I’m firmly convinced that 10-20% of all freelance clients are flat out malicious.
There are also a whole host of people out there with “amazing” ideas who want you to build their app (“Think Facebook and Snapchat mixed with Tinder. It’s gonna be worth billions, bro.”) for equity (read: nothing) or a bullshit rate (“…I’ve got $200 to spend.”). You’ll need to deal with these landmines entirely on your own.
This path is not designed for people who want predictable paychecks or lots of perceived “safety.” If you feel like you can’t take risks because you have children and a mortgage, don’t become a freelancer.
It’s also not a good choice if the idea of marketing yourself makes you queezy. Freelancers need to know how to go out and get work, which often means going to public events, cold calling and engaging in other business-related activities that many programmers have zero experience with. These skills can be learned, some people just don’t want to learn them.
Being a freelancer can be immensely rewarding, and you do get to make your own schedule. If you don’t want to work today, you don’t have to work today. Go to the beach, hit the gym, whatever. If your last project paid well, you can go on a month-long vacation in Indonesia if the feeling strikes you. Shit, maybe you like it so much you decide to move there for a while. You can do that if you’re a freelancer – remote work is very much a standard practice.
A hybrid is someone who only spends some of their time coding and is expected to realistically have at least an intermediate understanding of programming concepts. Job titles in this category often involve either involve management of some kind or sales/marketing.
These types of jobs are good for people who have experience in a field, but maybe want to pivot into something a bit more technical. For example, if you have a bunch of experience as a salesperson, you could learn to code in your free time and then transition into a “sales engineer” role. Sales engineers are responsible for talking to technical staff at target companies and selling them products or services.
Another hybrid job would be an “evangelist.” These people fly all over the world and present technical products or services publicly. I personally think this job would be amazing, and if you have any kind of sales experience I would recommend you look into it.
Magicians are people whose jobs do not specifically involve programming, but instead use code as a way to enhance their job somehow. I’m talking about accountants, salespeople, marketers and anyone else whose job titles are rarely associated with actual coding.
These people are magicians because, to their non-technical coworkers and managers, they appear to be making that blinky light box thing do magical, amazing things right before their eyes. They add value to the workplace purely by being able to conjure up technical solutions to problems that are taking up valuable company time and money.
Magicians don’t have to be (and usually aren’t) the best programmers in the world, but they know enough to make useful applications. Sure, the source code may be completely lacking in design patterns or useful comments.
Guess what? That doesn’t matter. What matters is that a task which used to require a living, breathing, salary-taking human being is now being performed by a computer.
Being a magician makes you a much bigger fish in a much smaller pond. Developers of all stripes are becoming more and more common, but an accountant who can code is exceedingly rare – and valuable – to have on board.
Builders are programmers who learn to code specifically so they can make some idea they have into a reality. It might be an idea that can be translated into a real business, or it could just be a fun project that solves a trivial problem. Either way, builders code specifically because there are certain things missing in the world that they want to exist.
To become a builder, you don’t have to learn anything more than what’s involved in creating the project you want to put together. There’s obviously some learning that has to occur ahead of time, but for your first project, you should just pick a language (and possibly framework) and learn those.
The rewards for builders can be immense. Especially right now, when there’s so much money floating around from investors, you can learn only what you need to know to make something work, then go out and see if anyone wants to give you money for it (either as an investor or customer).
You don’t need to be a computer science genius, you just need to make something functional. Facebook was pretty lacking in its first iterations, but it worked enough to turn into what it is now. Stories like this are common in Silicon Valley.
Obviously, most products and services don’t end up with that kind of success. Here’s the cool part: whatever you make doesn’t have to be that successful.
Why? Because you’re living in the only time in human history where you, a single person, can plant the seeds of a global empire by simply sitting down at a computer and writing some code. The startup investment is extremely small – you could get everything moving for ~$100, maybe less – and as a result failure isn’t that big of a deal.
In previous eras, “starting up” meant going to the bank for a big loan, buying property, apply for all kinds of licenses and all kinds of other horrible things. It also meant that failure wasn’t nearly as much of an option, in fact it usually meant bankruptcy.
Now you can code up an idea got in a dream in a few weeks, give it a spin and, if it doesn’t gain any traction, you can trash it and move on to something else. Rinse and repeat until you’re sipping champagne on a yacht with your concubines (or boy toys, whatever you’re into).
Even better, being a builder means you’re going to get a high-level view of all the cooperating components of whatever system you build. Do this enough and you can become an “architect” of applications – someone who knows enough about the structure of systems to design them and then have someone else build them while you go to the beach.
What Should I Do?
I’m not going to tell you which path is best here, because each person is going to want different things from life. Some people want to worry only about doing their jobs and then go home and deal exclusively with their personal lives. There’s nothing wrong with that.
Some people want to supplement their skills, and that’s cool, too. Others dream about building big things, and, once again, that’s completely fine as well. It’s all about what you want out of your time on our humble blue dot. The good part about programming is that it gives you a great deal of choice when it comes to career moves.
What Code Actually Represents
Some people who program for a living are in love with code, and they view that relationship as positive – an advantage, even. I don’t.
Loving something inanimate like code is not only unhealthy, it’s also a backwards way of looking at its role in the world. Code isn’t there to be admired and optimized to the point of perfection. It’s there to solve problems.
If the code you write solves other people’s problems, it doesn’t matter if the code is beautiful. This will drive some developers bonkers, but it’s the truth. What matters is functionality – period. Sure, you should make sure your algorithm doesn’t run in exponential time and optimize enough of your components that the end-user has a good experience.
You should also make an effort to ensure that anyone else who is going to work on it won’t want to end up with an urge to stab you. But you don’t need to over-engineer everything to save a couple of milliseconds or only use the most cutting-edge frameworks.
I tell everyone who asks me about programming, especially people who are looking to become employees, that code is just a tool. Use it to solve problems and don’t worry about trying to build perfection or falling in love with the code you write.
The worst kind of person in a tech company is the guy who is in a position to lead but doesn’t make the effort to learn anything about what his or her subordinates do. That’s not leadership, that’s lazy incompetence.
If you’re already managing developers or you’re thinking about maybe hiring some developers to build or work on a project you have in mind, you really do need to learn at least the basics of coding. There are a few reasons for this:
- It’s easy to get ripped off if you don’t know anything about programming. This is especially true if you use overseas developers that you have exactly zero legal power over. The prices for coders in developing countries are sometimes there for a reason: they aren’t particularly good, and their primary income stream comes from people who don’t know any better. It’s information assymetry at its finest. Not to say that all or even most overseas developers operate like this, just that there absolutely are some who do.
- You’ll have zero perspective on how long certain tasks should take. Non-technical managers who demand huge amounts of perfect code in unreasonable timeframes should not be allowed to manage coders. At one job I had, a (non-technical) manager gave another developer a matter of minutes to fix a bug, and when his first rushed solution didn’t work, the manager exploded. “Fuck, did he even test this shit?!” were his exact words. No, he didn’t test it because you didn’t give him a chance to. Don’t be like this guy. All it does is kill productivity (because you’re going to get more bugs than you can deal with) and breed resentment within your developers.
- Learning to code will net you huge amounts of respect with developers. This is especially true if your job description does not explictly require you to code. Bonus points if there are other managers who make no effort to learn. You don’t need to be a wizard or anything, just demonstrate some curiousity about what they’re doing and it will pay back massive dividends. Remember this when you’re having a technical conversation and they bring up something you don’t understand. Make a point of asking additional questions, writing things down or doing anything else that demonstrates you’re actually interested.
If you’ve made it this far and still want to move forward with learning to code, then don’t hesitate. Find a couple of good books to learn from, sign up for an online course and take a stab at it from whatever angle sounds most interesting to you.
Most importantly, just start. Don’t worry about competing with Facebook (you can’t), or solving the Universe’s most difficult problems (you won’t), just make something. Put together a trivial program for the sake of building and nothing else.
This program will probably suck and that’s OK. Everything amateurs make sucks. You’ll maintain this mediocrity for a while, until you build something that’s actually worth a damn. How do you know it’s worth a damn? It solves some sort of problem. It doesn’t have to be the best available solution, as long as it is actually a solution.
One of the biggest problems for new programmers right now is that there is an avalanche of learning sources. Analysis paralysis grips anyone who frantically searches for the “best” way to learn how to program.
I’ll tell you right now: there is no “best” method. They’re all pretty good, because you’re going to learn something from each one. There are certainly going to be sources that are better than others, but you’ll gain knowledge even from books and courses you don’t like overall.
You’re going to stumble and fall quite a bit. Concepts will be explained by teachers with the curse of knowledge who simply can’t grasp what it’s like to be in your shoes again. Ideas will bend your mind to the point that you feel dizzy. Bugs that seem unfixable will haunt your dreams.
Fear not, each time you stumble you’ll learn something – if you get back up.
If you want a concrete time frame, I’d say give it about a year. For those of you with jobs, just start doing it in your free time. A little bit each day before or after work until you either want to go deeper or decide that it’s not worth your time.
Anyone who has the luxury of time should dedicate at least a couple of hours per day to learning.
You’ll know after a year whether you want to move forward or not. It’s basically a win-win either way: no matter what, you’re going to learn more about computers, which run basically everything now.
This by itself is a big advantage since most people view the computers they use every day as some sort of voodoo.
If you discover that you enjoy coding, there are a variety of options open to you after a year of working on your skills. If not, oh well – at least you learned something about computers.
Sign up for my one-of-a-kind newsletter that’s read by over 1,000 people and I’ll send you my free, 7-part Learning Basics course.