I've just been hired into my first dedicated software engineering role. After returning to school for CS in November 2016, I've just emerged on the other side almost two years later. This is the first thing I've done in my career that feels like it fits how I think and work, and I'm planning on making the most of it.
- Move into a semi-technical role where I had better access to engineering (TPM / BI Analyst).
- Start a CS degree. I opted for the Oregon State Online Post-bacc in CS, which is an excellent program that I highly recommend.
- Work up a sizable resume of personal projects that prove that you can do the work (I'm still working on this bit. This blog is one of those).
And it I'm glad to say it worked!
Three Important Aspects of Switching into Software Development
Here's the different angles I took on understanding the career switch as I went through it. It's an odd one, but depending on where you're transitioning from, it can be an excellent choice.
The Learning Aspects
Compared to many types of career you'd try to switch into, many people switching into CS will be touching a STEM-type field for the first time in their lives. Comparably, it's one of the more accessible sciences to get into because computers are ubiquitous and drive everything in the world today. I've spent a lot of the last two years just learning as much as I could.
First and most obviously, it's hard. Few people can do it quickly. It takes most people a few years at least. When you hear stories about people who were grinding Leetcode for 3 months and got the offer, know that they're vastly outside the normal distribution of how long it takes people.
The problem domain is vast. You quickly get into territory for which there is no set solution, everything has a trade-off, and it's often difficult to espouse why. This is a significant generalization, but the breadth of problems that I've had to solve in my short time doing software engineering vastly eclipses most roles I've had or worked with previously. There's so much to know, and you'll likely never be an expert in more than a few small subdomains of the large problem space.
There are few, if any, scenarios today where you'll happen to fall into software engineering without significant, dedicated effort. It's common for senior engineers to mention how they may have done this back in the day when they got their start programming for Amiga, Commodore 64, or in the early days of the web. This represents a minority of those career switching into development.
There are plenty of ways to get the education for it. Bias showing, I recommend spending the time and money to go to school through an accredited college/university. Boot camps are enticing in that they're quick turnarounds, can get you very career-ready compared to school, and are generally much less expensive. In general, I'd be cautious of the drastic uptick in Boot Camps that have sprung up as of late. There are plenty of excellent ones, but there are also enough bad ones to offset those. You may find yourself at a disadvantage for any job that requires a solid foundation in data structures/algorithms/operating systems/etc. Boot camps generally focus very heavily on web development, and usually teach a single ecosystem (i.e. Node/Express, Ruby on Rails, etc).
The Technical Aspects
There's a lot of different tech out there and you're not going to learn it all. There's likely a lot of stuff you'll never touch in your lifetime. It's a very wide field with tons of specializations, most of which you'll probably have limited ability to gain meaningful experience in school or boot camp or being self-taught. Seeking out which technologies you want to learn/use is good, but with some caveats:
As a junior, being opinionated about which technologies you want to use will limit your opportunities. If you don't particularly like Microsoft, or don't like Java, you may cut yourself off from gaining experience. You can be selective if you so desire, but it will restrict your career in the short-term. Getting that sexy startup job with 2-years experience in any sort of software development role will be significantly easier than having none.
The single most advantageous skill is being resourceful and looking for answers. Good engineers are the ones who can use the resources available too them (Google, stackoverflow, Github, etc) and make decent, working code out of it.
Know at least one low-level or compiled language and at least one high-level or interpreted language. The concepts from the lower level languages you learn will be applicable to using the high-level language. Someone using a high-level language may never know why something like copying an array is slow, because they're not aware of how memory works in relation to the code you're writing. Writing C or a similar low-level language quickly eradicates many common misunderstandings.
Buy/build a home server or get an AWS account. Start tinkering as a way of learning. Set up some services and have fun.
Learn databases and SQL. Most applications you use will interact with a database in some manner. It's easy to get proficient.
Get good at setting up your working environment. Having a great local setup using tools you're comfortable with pays significant productivity dividends. There's a reason that developers are so choosy about which tools they like.
The Human Aspects
Managers outside of development won't help your career switch. If you're working on improving your skills to the point where you could start as a developer (by school, code boot camp, etc), they will often espouse support but generally have no idea what that means they should do to help you. Doesn't mean you shouldn't be honest with them about your intentions, but don't expect them to come to you with solutions.
Mentorship is exceedingly difficult to come by. You must purposefully seek it out if you want it. If you end up having an opportunity with someone who shares an interest in your future, nurture that flame. Let them know you're interested. It's easy to feel defensive about being inexperienced. This is a nice way to gain some perspective on what that means for you right now.
When you hear about software engineer hiring shortages, they're referencing senior engineering talent. Junior roles can often be saturated with new listings all the time, and suffer from a glut of genuinely unqualified applicants. That means people who list things on their resume they have zero experience with, to the point they haven't even done a Udemy tutorial on them.
There's a lot of noise out there. Many people, with many opinions (including this one), and lots of people will tell you the best approach. If there's only one thing to keep in mind, it's to be patient with yourself and understand that nobody else is in your exact scenario.
Navigating the Transition
Switching into software development these days can feel like jumping on a bandwagon where everyone is smarter than you, paid better than you, and has intense opinions on what is right and wrong. It can feel like an insurmountable hill to climb.
However, there are plenty out there like myself for which software engineering is an open door to a much better career. Once I've been in the role for a while, I'll have a part two to this post where I cover my transition period.