â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.
Why?
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.
Employee
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.
Freelancer
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.
Hybrid
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.
Magician
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.
Builder
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.
Leading Developers
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.
Bottom Line
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.