On Becoming a Self-Taught Dev
Here I will share how I went from a biology graduate who couldn’t find a job to a lead iOS developer making 6 figures (which goes a long way where I live.) My advice to others looking to do the same can be boiled down to this simple phrase:
Just start building.
I understand that what I’m about to say is not for everyone. After all, I’m going to share what worked for me inparticular. If you’re of a similar disposition to yours truly then perhaps this advice will work for you too.
So let me ask you this. Are you the type of person who prefers to figure things out on your own? Do you only come to understand something to its fullest when you see it from your own perspective rather than that of others? When someone is explaining how to operate something do you have the urge to grab it from them and try it for yourself?
If so then perhaps what I’m about to tell you will work.
If you’re someone who performs better in groups. If non-singular activities like pair programming, or study groups sound like a good idea to you then perhaps you should flee in horror as reading this may contaminate your soul and and leave you muttering incoherently on the fringes of society.
In all seriousness I respect that this may not work for everyone and if it doesn't, perhaps that’s a good thing because it means you’re normal and the path well travelled will work for you (which is an ironic thing to say considering my next reference to paths and the frequency of their travel.)
However, if you’re a bit strange. If you tend not to associate with groups, if you genuinely find programming interesting and engaging then perhaps you have the right disposition to be a self taught developer.
I should mention that the notion of being “self taught” will always have a bit of a stench to it. Don’t count on getting a job at an established organization where credentials matter. People will secretly look down on you for being self taught for a number of reasons—from envy (which should be ignored) to perceived knowledge gaps (which shouldn’t.)
While everything you need to know to start creating software of all sorts—from mobile apps to web services to games—is available for free online, there are still some important things that you miss out on as a result of bypassing the institution. There will be holes in your game. And while you’ll still be able to “get shit done,” which is ultimately all that matters, you’re always at risk of becoming too pigeonholed—lacking a lot of the fundamental, first principles knowledge that comes from a good CS degree.
Now, the question is how to get started. You may think that getting started is hard. There are so many topics to focus on. Which ones are more important? Which areas should be prioritized? It seems a bit overwhelming, even paralyzing.
But getting started doesn’t have to be hard when you have a clear vision in your head of what you want to build. This is where having an idea actually matters because you’re about to put some skin in the game. As long as you have a vision, each step on the path to understanding will reveal itself naturally and by the time you finish building you’ll have most if not all of the requisite knowledge to start getting paid as a developer.
Although you should always be considering the marketability of what you invest your time into, you don’t need a game changing idea to get started. You might simply have an idea to improve upon an existing app, or perhaps your motivation is as petty as not wanting to pay for a certain product and you’d rather just build it yourself. In other words, it shouldn’t be that hard to come up with an idea for a product.
Once you have your idea you simply start building. Note I am taking some things for granted here. For example if your idea is to build a website where people can create accounts and upload files to share, I’m assuming you’ve obtained the background knowledge of what comprises such a system and that a significant part of building your ideas will be obtaining the necessary knowledge to do so—especially at first. But you get the idea. It’s all building if you think about it—building knowledge, building code and repeating that process until you have something that actually works and perhaps even looks good to show the world. You can google “how to [absolutely anything].” There’s no excuse for not knowing where to start as long as you have a practical vision.
Details are important and help deepen your knowledge. Again using the above example of a multi-user file sharing service, consider that you want each user to have a profile page with a nicely formatted url with no file extensions or query parameters. You might find yourself gaining valuable knowledge about Apache rewrite rules and regular expressions in the process. So it’s in your own best interest to be uncompromising when it comes to details. It’s not always enough for something to just work. It should work as closely as possible to how you envisioned it.
I think it’s important to re-emphasize the vital role of engagement. You have to find this stuff interesting. Dare I say “love” it? Again, especially at first. I can’t imagine how anyone could do this without genuinely liking it. In other words, ask yourself why you’re doing it. If your motivations arise from genuine interest in the craft then you’re on good footing to succeed. If you’re doing it for the paycheck, although I don’t blame you one bit, you’re at a disadvantage motivationally speaking. There are a lot of people who choose computer science in college because they heard it pays well. Just note that although you can’t rid yourself of the stigma that comes from being self taught, genuine interest in the field will be an advantage over those who are in it for other reasons.
Beware of gurus.
Most of what you need to know can be found on StackOverflow where many of the questions are by working devs simply trying to get something done (probably under pressure from their boss.) People who make a living from selling books and courses about the latest trendy tech are unlikely to cover all of the inconvenient edge cases that inevitably arise when building something for real. It’s rare to complete a project of any size without having to employ some sort of hack to work around a limitation of the platform—especially when you’re uncompromising about sticking to your vision. Again, just start building and google when you get stuck. You’ll most likely end up at Stack Overflow which reminds me; you can skip reading the question most of the time as it’s already been stated in the title. Just scroll to the accepted answer and you’re back in business.
The road most travelled.
When choosing a programming language it’s tempting to base your decision on what’s fashionable. I’m reminded of DHH who evangelized Ruby to great success as a counter solution to PHP with its paltry aesthetics and Java with its corporate verbosity. I guess code can be beautiful. Elegant solutions are made even more so when done in a well designed language. But keep in mind that even the most elegant syntax will lose its shine when forced to deal with the inevitable edge cases that arise on your quest to build the finer points of your vision.
PHP is often derided for its poor design and bad aesthetics. It can be plain ugly. PHP’s creator, Rasmus Lerdorf, famously despised programming. He was a problem solver. He created PHP to make his job less tedious. But there’s no denying it’s meteoric success. It is almost guaranteed that anything you’re looking to accomplish with regards to building the back-end for a web service or app has been done in PHP and there will be a multitude of examples online to base your solution on. Languages like Python and Ruby are nice, and although it is not as true today as it was years ago, you’re more likely to find yourself in the weeds if you rely upon them for your backend. When the goal is building something, you want to stay on the beaten path as much as possible lest find yourself wrestling with the quirks of the platform. Basically, one should choose reliable tools and get to building.
I guess I should mention my thoughts on the related topic of cross-platform solutions. This can be tricky. You’ll inevitably encounter cross platform solutions with variations on Java’s original promise to “write once, run anywhere.” If it’s any indication how such solutions end up, consider that Java’s primary role today is as a server side language on linux systems. Pretty specific.
The most prominent cross platform solutions I can think of today include the likes of Xamarin (by Microsoft), Flutter (by Google) and React Native (by ?) which promise support for both iOS and Android (among others.) The idea of killing two (or more) birds with one stone is difficult to resist. On it’s face, the value proposition offered by Xamarin and Flutter is a no-brainer which is why it’s so easy to sell to managers. But I remain skeptical.
It’s bad enough that as a developer you can’t help but be dependent upon a number of third party platforms (best mitigated by sticking to the beaten path.) Adopting Xamarin or Flutter introduces yet another layer of dependence. You cede yet more control for the theoretical promise of supporting every platform with one codebase. Sounds great but is it realistic? I don’t know. It’s not exactly sticking to the first principles idea I proposed earlier but perhaps in today’s landscape where an app needs presence on both iOS and Android to gain critical mass it’s not such a bad idea for limited budgets. You can see I have mixed opinions.
Anyway, back to the topic at hand. Let’s assume you’ve followed my advice. You’ve formulated an idea and you’ve done the work to make it a reality. Now what?
Now you have something to put on your resume. It’s your foot in the door. Simply having something to point to and say “I built that” is quite powerful. It’s irrefutable proof of your abilities. You can leverage it to get your first entry level job.
Of course a sample project is not the only factor that will turn the tide of an interview in your favor. Although less so in tech, it’s safe to assume that all of the classic advice on how to compose a resume and conduct yourself in an interview still applies. On a personal note, I was struggling with severe social anxiety, depression and basement level self esteem when I landed my first real job as a web developer. Fortunately tech has a higher tolerance for fringe dwelling weirdos where in some cases such traits are considered an asset.
I won’t bore you with canned advice on how to climb corporate ladders, get promotions, raises and things of the sort. I’ll simply say that if you want to max out your earning potential, be prepared to change jobs (a lot.) It’s rare that an employer will cough up a raise north of 20% but that’s exactly what you can get by changing jobs—especially in your early career.
Again, my advice in a nutshell is to just start building. All you need is a computer and an internet connection to get started.
Recent events driven by the COVID pandemic have changed the game for knowledge workers—widening the field even further as more and more companies embrace remote work. This is great in that office environments, commutes and 9-to-5 schedules can be soul-crushing. However I don’t see how an overall reduction in wages can be avoided now that the pool of applicants just exploded while the number of jobs has remained relatively static.
The idea of entering the job market in 2020 is quite daunting but building your knowledge and building products to show for it will pay off as the technology empowering individuals picks up steam again and continues its inexorable march forward. And you’ll be ready to ride the next wave.