Becoming A Software Developer

I get asked a lot for advice on becoming a software developer. I didn't study anything related to software in university, but now it's what I do for a living. I also spent about 3.5 years mentoring with Lighthouse Labs, a local web development bootcamp, and watched (and would like to believe at least in some cases, helped) hundreds of people of every age from wildly diverse backgrounds get jobs as software developers.

This is my advice for people with no technical experience who want to land their first job writing software. It's based on my experience as both a person who did it myself and as a mentor to other people who did it. There's no single right way to go about this, and no matter how you do it's a lot of work. But these are some things that have worked for other people, myself included. These suggestions are arranged roughly in order, but of course many overlap and kind of happen at the same time.

Know what you're getting yourself into

Software engineering is nothing like I expected it to be. All the hard parts involve dealing with people. Part of my original motivation for choosing a career in software was thinking I wouldn't have to deal much with people. I wasn't very good at it and didn't enjoy it, but my fantasy of just sitting in front of my computer all day and watching my bank account fill up was totally delusional.

The reality of writing code for a living, in my experience, includes dealing with a lot of office politics, entitled middle managers, stressed out co-workers, and yes, condescencion and occasional harassment (especially if you're not male). I find the culture of the tech industry generally toxic and abusive and it has very nearly broken my spirit on multiple occasions.

You won't be alone dealing with this. Your co-workers and countless people across the industry share the experience. And it is ultimately bearable.

I don't say this to discourage anyone from getting into software, but just to highlight that the stuff you hear from recruiters is bullshit. It's not all free trips and fancy perks and big paycheques. It is those things, sure, but the reality is much less glamorous than they make it sound.

Being a software developer means getting paid to solve other people's problems. The rest is fluff. This makes it a solid career path, though, because other people have a lot of problems.

It is still an empowering and lucrative career. Despite my generally negative view of the industry, I still highly recommend and help people into a career in software regularly. Most individual software developers, like most people, are genuine and kind. And I can't speak to problems in other industries first hand, but I gather most high-paying, male-dominated industries are pretty similar anyway.

Meet lots of people

I was referred to three of the four programming jobs I've had so far through friends. I made friends with those people who were already programmers at meetups. I didn't ask them to get me a job, but a lot of companies are pretty much always looking for new software engineers, so when your friend hears you're looking for that kind of job, they can bring it up at work. I still did interviews, but it makes an enormous difference when someone the boss already knows and trusts can vouch for you.

A word on meeting strangers. I, like many people who are into nerd things like software, am the most introverted person I know. I found hanging out in groups of new people excruciating at first, but honestly learning how to not be awkward around strangers is just as important as learning how to code if you want to do well in your career. I just went to the meetups and stood off to the side, awkwardly making eye contact with a few random people. Eventually a friendly extrovert would come up and initiate a conversation, and before I knew it I could hold my own in a crowd.

Check out meetups for programming languages you're interested in, or if there aren't those kinds of groups where you live, join online communities. Most programming languages have a slack or discord server where people hang out, and in my experience people are usually very welcoming and kind to newbies (at least in the Ruby, Elixir, and Clojure communities; all of which I highly recommend).

Learn how to code, in public

Without any formal education in software development, you have to offer something else to prove you actually know how to write code. I did this by building a bunch of crappy side projects. The very first thing I ever did was replicate the Google landing page with HTML and CSS. The first actual app I made was a blackjack game with Sinatra. I also made Twitter and Reddit clones with Rails, and little browser games like Pacman with different JavaScript frameworks. Some of that code still exists in my GitHub graveyard if you want to see what I mean by crappy. Other common toy projects include link shorteners, photo galleries, e-commerce stores, time trackers, or clones of whatever software you normally use, like spreadsheets, workflow management, calendars, etc. The possibilities are endless.

Look for tutorials online that walk through how to build the kinds of things you're interested in. If you don't know where to start, The Odin Project and Free Code Camp are two free programs that offer very realistic learning roadmaps. I did parts of both of those but never finished either. I also did several free courses on Coursera and edX, which are both amazing but you have to be careful not to end up in a rabbit hole. Those two mostly have actual university courses, which are super interesting, but not very relevant to things you'll do in a real job.

If your goal is to get from nothing to making money as a developer as fast as possible I recommend sticking to a more targeted learning roadmap like the two above. There are also countless paid ones which vary wildly in price and quality. Be weary about shelling out huge amounts of money for bootcamps. I did pay for a few months of Launch School (which at the time was called "Tea Leaf Academy"), and it was the best career move I ever made. I highly recommend them because they're in a sweet spot of offering a robust and relevant curriculum without costing a fortune. It's not free ($200/month), but a few hundred dollars is a very small investment in the scheme of your career. Apparently they also offer a deferred payment option now, too.

The career-oriented bootcamps will also teach you loads of useful practical things they don't teach in the free university courses, like version control (git), testing, and how to collaborate with other developers on one project.

It took me 6 months of studying, meeting people, and building crappy software full time before I got my first internship. 95% of Lighthouse Labs graduates are employed as software developers in that timeframe. Launch School delivers impressive, concrete results for many of their students, too. I never finished most of the courses or programs I started. I funded that time off by living like a peasant on money I made running one of those student painting businesses the previous summer. Learning to code can feel like a slog at times, but just stick with it and you're very likely to be among the vast majority who succeed at this self-educated developer thing. It is a totally achievable and realistic goal and you're in good company.

Other than doing free online courses and building apps from tutorials, other ways I learned in public during this time included blogging about my learning journey, making myself a portfolio website to showcase my little projects, and volunteering with some local tech communities. Do what works for you, but focus on ending up with at least a few medium sized projects you can show someone to prove you know how to make software that works.

Learn best practices

A surprising number of experienced developers still write really horrible code. Spend some time learning about software design and software engineering best practices to avoid becoming one of them. How you do that depends a lot on how you learn. (BTW, you should figure that out before you embark upon a journey of self-re-education for a career change). I absorb a lot from reading and prefer to learn by studying theory over trial and error, so reading and watching talks works really well for me. YMMV and you do ultimately just need experience to really get this stuff, but you don't have to start from scratch.

Read "The Pragmatic Programmer" by Dave Thomas and Andrew Hunt, and anything by Sandi Metz. Watch Rich Hickey's talks, especially "Simple Made Easy", and Sarah Mei's "Livable Code". Other classics include Eric Evans' "Domain Driven Design" and Martin Fowler's "Refactoring". There are countless others and everyone has their opinion about what should be included in the software engineering canon, but these are my recommendations. They'll provide a solid foundation and ample fodder for further reading and watching.

Pour your heart out

Once you can write code that mostly works, start looking for a job. Put the word out that you're seeking your first role writing software. Hopefully one of your programmer friends will know about an open position, but you can still apply to random jobs on the internet, too. This has a very low success rate, but it's possible. I got one of my four jobs by firing my resume into the abyss. I included a very long and heartfelt cover letter about how I loved programming so much and really wanted to work for this specific company (which I did), and how I learn fast and really believed I could do the job if they'd give me a chance.

It worked. The hiring manager said my letter caught his attention. I had one year of experience at that time and had never worked remotely before, but I got the job.

Don't be afraid to be authentic. Don't lie and say you know more than you do, but don't sell yourself short, either. Bootstrapping a career in software is no small feat and there are many teams out there who would love to hire the kinds of self-starting fast learners who do it.

Don't be too picky (at first!)

The reality is that your first job or two will probably be pretty crappy and underpaid. At this point you're trying to convince someone to take a chance on you, and it's a trade off between your dignity and your future career. In the very beginning, you should prioritize gaining experience over almost everything else. Obviously never put up with anything you're uncomfortable with, but if you can stick it out it's worth setting the bar pretty low just to get your first few months of real job experience, IMHO.

I lucked out and worked with the most amazing team in the world for my first job as a developer, but I discovered from the students I mentored that that is very much not the norm.

There are pros and cons to every kind of company, so don't worry too much about finding the perfect fit right away. Focus on gaining experience at first so you can have the freedom to focus on finding the perfect fit later. I've worked with a few different kinds of companies and there are pros and cons no matter where you go.

Big corporations usually have a lot of experienced developers and lethargic processes, so there's more opportunity to take your time and get help from people more advanced than you. The pressure is often pretty low because people have such low expectations for new developers, which honestly is fair. You have a lot of room to screw up because you're such a tiny cog in a massive machine. The downsides depend on your personality. For me it was that I find most large tech companies to be evil and didn't like the soul-crushing feeling of helping to build something I hated.

Startups usually have fewer people available to be mentors, but more opportunity to take on disproportionate responsibility for your level, which can be an amazing learning experience in a different way. You also have a lot of room to screw up, but it's more because your screw ups just blend in with the overall culture of moving fast and breaking things. I now believe that's a ridiculous way to run a business, but when there's widespread acceptance of breaking even important things, you have a lot freedom to experiment and learn by trial and error.

Be a good student

Lastly, once you finally land your first job, be a good student. Treat your first year or two on the job like paid education, not your chance to go in and show everyone how it's done. You know way less than you think, and you have no idea what it takes to build functioning software systems, let alone to deploy or maintain them. Always be humble and eager to learn. Soak up every minute of attention you get from more experienced developers around you and learn from them. Not everything they say is wise or true, but pay attention and copy the things that work whilst ignoring the things that clearly don't.

Learn how to ask good questions. Don't be afraid to ask for help, but before you do, at least try to figure out the problem yourself. Write down what you tried, and explain why you're surprised your attempt didn't work.

There are certain things you can only really learn from experience on a real world project, so see what opportunities there are to learn those things, for example:

These are just a few examples of things you won't run into on your little demo projects. Pay attention to the problems you're dealing with at work that you don't run into on side projects and learn how to fix those. That's your pathway to levelling up. Most importantly, never stop learning.

That's all

Software development is a great career. It's allowed me to be financially independent and stable, travel the world, meet cool people, and lots more. My path won't work for everyone. There are as many different ways to become a software developer as there are people, but I've seen countless aspiring software engineers go through their own journeys and many of them touch on these points, so see how they fit in to your own path. And let me know how it goes 🙂