Entry-level knowledge worker positions, such as the venerable GIS analyst, often have a narrow set of career paths. One can move up into project management and/or personnel management. But that usually means doing less of the geospatial problem solving that got you interested in GIS in the first place!
Another commonly suggested path is to learn to code. Programming requires constant problem solving, and the huge demand for developers and engineers means that salaries are generous. In addition, the post-pandemic world means that companies are suddenly more amenable to remote workers from anywhere in the United States. But how would you actually go about making this career change?
I recently had the privilege to be a guest on the Mapscaping Podcast and discuss how I pivoted from GIS analyst to software engineer. This blog post offers some additional details to anyone considering a similar pivot.
Go For A Test Drive
Upon hearing of the huge salaries that Silicon Valley software engineers rake in, some folks want to immediately quit their jobs and jump feet first into a master’s program or a coding bootcamp. This is the kind of moxie and gutsiness that America was built on…right? Wrong.
Make sure you actually enjoy programming before committing to costly education.
Let’s do a thought experiment. Pretend you’re in the market for a used car. You find something with low mileage from a brand with a reputation for reliability. However, it’s listed on Craigslist so it lacks a warranty. Moreover, the seller refuses to let you test drive or even see the car before you put down a deposit. Would you send a wire transfer sight unseen? Definitely not: only a fool would be so rash! For the same reason, only a fool would dive into a master’s program or bootcamp without going for a proverbial “test drive” beforehand.
The best way to test drive whether you like programming is to use it in your current job. Much of the day-to-day busy work of knowledge workers can be enhanced, made more efficient, or perhaps completely automated through some kind of programming:
- Microsoft Excel, for all its faults, is immensely powerful in the right hands. Incredibly complex logic can be achieved through formulas alone, not to mention dashboards, pivot tables, etc. Check out /r/excel for ideas.
- Microsoft Word, Excel, PowerPoint, Outlook, and Access can run macros in the VBA programming language. You can even “record” a macro to see how point-and-click actions are translated into VBA code. However, corporate IT policies often disable macros for security reasons, so this may not be a viable path.
- Google Docs, Sheets, Slides have programming APIs you can use to automate certain processes.
- For the ArcGIS users out there, you can convert a Model Builder model into a Python script in one click. This is how I took my first baby steps in Python as a GIS analyst back using ArcGIS.
- Repeated processes like monthly reports, document preparation, email notifications, etc. can often be automated. If you want to learn how to do this in Python, check out Automate the Boring Stuff with Python by Al Sweigart.
After writing macros, automating periodic workflows, or playing around with custom plugins, you’ve finished a test drive. It’s normal to feel frustrated and confused while learning these programming tools and concepts. But how did you feel after you managed to get something working? Was the time saved and sense of satisfaction worth all the toil?
If the answer is “no” then that’s okay. Knowing you don’t like something is as powerful as knowing you do like something. Plus, you never committed to paying (tens of) thousands of dollars for a bootcamp or graduate program that you probably would have disliked anyways.
If the answer is “yes” then you’re ready to dive a little deeper.
Learn Programming Part-Time
There has never been a better time to learn programming. The number of high-quality free and low-cost (less than $100) resources like books, online courses, and interactive learning platforms is astounding, and continues to grow. Best of all, most of this learning is self-paced, meaning you can fit it into your schedule one way or another without having to quit your current job. This is critical to reducing the risk of opportunity cost.
Opportunity cost is the implicit price you pay for not doing something. Pretend that the full-time tuition for a one-year graduate program is $25,000. If you had to quit your job to attend, and that job paid $50,000 in salary, then the true cost is $75,000: the explicit $25k tuition cost plus the implicit $50k of opportunity cost in the form of foregone income. Whatever you gain by attending graduate school has to justify not $25k, but $75k – a threefold difference! Awareness of opportunity costs is critical to not wasting time and money when “investing” in formal education for a career change.
When picking a resource from which to learn, try to find something relevant to your day job. It’s tempting to dive into an 800-page “Programming 101” book, but if you lack the opportunity to actually use this learning then it will be harder to remember and harder to stay motivated. Ideally, you can iteratively learn new material and apply those learnings (discussed below), following the same pattern as your test drive.
The same is true when choosing a programming language: if the software in your day job can run scripts and/or plugins, consider learning that language first so you can leverage your skills right away. It’s relatively easy to switch between high-level programming languages once you know the general concepts, so don’t stress too much about this choice. My old day job used ArcGIS 10, whose scripting language was Python, so I focused on learning Python and ArcGIS’ Python APIs.
Some free learn-to-code resources are Codecademy, FreeCodeCamp, Khan Academy, Code Conquest, and MIT OpenCourseWare. These typically introduce first principles and build up from there. Don’t hesitate to jump between different learning platforms if it doesn’t fit your style e.g. lecture videos vs. demo videos vs. written content.
Low-cost books, ebooks, and online courses can sometimes be higher quality than free resources, especially as you move beyond the basics. Cousera and Udemy have excellent courses which are a mix of self-paced content and scheduled cohorts. I also recommend the ebooks from Manning which include a slick online reader that is much easier for copy-pasting code snippets than regular ebook readers.
To defray the cost of these resources, look into professional development stipends from your employer. Getting approval from your boss for a $30 ebook or a $100 online course is easier if you demonstrated value in your test drive (see above) and other instances of applying your learnings (see below).
Eventually you may consider taking a “real” part-time computer science class from an accredited community college or university. These are especially helpful you are considering a formal post-baccalaureate or graduate program (see below) since passing grades may allow you to bypass prerequisites. In my case, I took classes at Harvard Extension School on data structures, discrete math, and C programming, all of which are remote-friendly. Combined with what I had learned previously, these were roughly equivalent to a minor degree in CS; in hindsight, this was instrumental to succeeding in graduate school.
However, accredited CS classes are substantially more expensive: typically a couple of thousand dollars, each. The cost can be defrayed if your employer offers a tuition reimbursement program. On the flipside, the fact that you’re paying for (part of) the class may motivate you to be more engaged. Also, bear in mind that academic computer science is more theoretical and less relevant to day-to-day programming work than the aforementioned free and low-cost resources. If you are seriously considering attending a graduate program, I strongly recommend taking at least one of these courses before matriculating. It’s a relatively inexpensive way to de-risk the cost and opportunity cost of enrolling.
Apply Your Part-Time Learning
The best way to learn something part-time is to use it in your day job. You want learn and apply what you learn concurrently and iteratively. This will improve your retention of information, increase your motivation to get through dense books and long courses, and help guide your learning path into more advanced and specialized topics.
Once you’ve written a time-saving macro or developed a handy plugin or found a workaround for a well-known annoyance, share it internally with your colleagues! Their feedback will be incredibly helpful to make your tool even more powerful and user-friendly – a virtuous cycle. As your skills improve, you might consider sharing something more broadly, giving a lightning talk, presenting at a meetup or conference, proposing an idea for an external client, or giving a decision-maker a powerful tool/dashboard/visualization. By leveraging the programming skills you’ve acquired in these “extracurricular” activities, you can build a reputation as an employee who takes initiative, possibly fast-tracking raises, bonuses, and promotions.
If your job lacks the opportunities to apply your programming skills, consider part-time work (or volunteering) for a friend, family member, or local organization. To the less tech-savvy, computer programming is magic, and they will likely be grateful to have a magician help solve their problem or make their life easier.
Mentors are another helpful source of feedback. These are colleagues, networking contacts, friends, even clients who have jobs or responsibilities or skills that you hope to have one day. The best mentor-mentee relationships are often unofficial – my most impactful mentors don’t even know that I consider them as such. Moreover, mentors’ advice is often conveyed at meetups, or over drinks at a conference, or in a Twitter thread rather than via traditional channels like email or performance reviews. It’s your job to be outgoing, curious, and friendly and seek out the advice of mentors – they won’t come to you.
Eventually, your programming skills will reach a critical mass where it can become an official part of your job. The safest way to explore these options is by asking around internally at your current employer. If there’s a project where the manager was expecting to have to hire/contract a team of programmers, then replacing or supplementing them could be an opportunity to gain professional experience without the risk associated with changing jobs. In my case, a client heard about one of the ArcGIS tools I made (for internal use), and they ended up signing a modest contract for me to productionize it for them.
If you’re looking at a new job externally, a straight-up “Software Engineer” position may still be out of reach at this point (see below). Even so, there are many jobs postings that list programming skills in the “desired” section even if it’s not in the “required” section. Highlighting these skills in your resume and cover letter can set you apart from other candidates, and put you in a position to negotiate a higher salary.
Paths to Software Engineer
Just because you’ve attained a certain level of programming ability does not mean you must work at a software company and have “programmer” or “developer” or “engineer” in your title. Some of the most impactful programmers are big fish in little ponds: they are the indispensable magician at a non-software company. As discussed above, there are myriad ways to parlay these skills into promotions, raises, and career-changing opportunities without having to make a drastic shift.
But some folks do know they want to make a drastic shift.
In my case, I did not want to be a GIS analyst with programming skills, I wanted to be a software engineer with geospatial subject matter expertise. These sound similar, but I anecdotally felt that the software engineer route offered better compensation, more job security, and more potential for growth. Nowadays, contrasting “analyst” and “software engineer” is a false dichotomy because of the growth in data science and data engineering jobs between the two extremes. But in 2015, the job landscape looked a bit different.
Graduate school is not a strict prerequisite to being offered a six-figure software engineering job and succeeding once you’re there. But it does help in a few key ways. There are three distinct groups of people you need to impress to achieve that goal, and the characteristics needed to impress each group are largely disjoint i.e. they don’t overlap with each other.
- Recruiters. You need to be attractive to recruiters just to get the interview in the first place. Having formal education, like a CS degree, is an obvious signal to a recruiter that you’re worth interviewing. Recruiters are not technical, so they often lack the ability to recognize a talented self-taught engineer. If you are self taught, to tip the scales in your favor with recruiters you’ll want to backfill your resume with part-time coursework, open source contributions, cloud certifications, etc. But the easiest way is to bypass recruiters entirely by networking. Try to meet the hiring manager who is able to recognize self-taught talent at conferences, meetups, Twitter, professional organizations, etc.
- Interviewers. Second, you need to impress interviewers. For better or worse, the majority of software engineer interviews involve answering arcane algorithms and data structure questions on a whiteboard or a virtual code editor. Computer science students have to learn a lot of this math-heavy theory as part of their academic curriculum. But a self-taught engineer using free and low-cost resources (see above) probably skipped over a lot of this theory because it’s boring and not very useful day-to-day. So you’ll need to practice technical interview questions from a book like Cracking the Coding Interview, ideally with a friend. If you’re comfortable doing the “easy” problems on Leetcode, you’re in good shape.
- Colleagues. Third, you need to impress colleagues once you’re on the job. Unlike the previous two groups, self-taught engineers are at an advantage here because they’ve had to develop a practicality and resourcefulness that fresh-faced college graduates have not necessarily had to. Schoolwork is usually done in a very contrived environment where there’s always a correct answer that’s achievable in a reasonable amount of time. Any experienced knowledge worker knows that’s often not the case in real life. Recent graduates can also struggle working with others in an office environment. The most dreaded assignments for students are group projects where one is inevitably stuck with a bunch of slackers or procrastinators. But—surprise!—real life office work is a giant group project. If you’re a self-taught engineer, the “soft skills” you gained from previous jobs will be an asset. It’s just a shame that these soft skills become relevant only after impressing recruiters and passing the interview.
As perceived by each of these three groups (recruiters, interviewers, and colleagues) there are certainly benefits to having formal education in computer science. But it’s definitely not a strict requirement. In my day job, about half of the engineers do not have a degree in computer science or a closely-related field. And yet they’re just as likely to be a critical team member, and top contributor, and a leader.
Imposter Syndrome and the Myth of Following Your Passion
A common refrain is that everyone has a true calling, and if they simply follow their passion all of their professional dreams will come true. Learning a new skill like programming is challenging, and it’s easy to feel pangs of doubt about whether it is your “true calling” – Imposter Syndrome.
Imposter Syndrome is the profound sense of inadequacy where your skills feel insignificant, your accomplishments feel like dumb luck, and you feel on the verge of being outed as a fraud. Learning any new topic can trigger Imposter Syndrome, but it’s especially common when trying to learn programming. The actual difficulty in learning to code is inflated by pervasive jargon, rapid technological changes, and the portrayal of programmers in TV and movies. I felt this acutely throughout my graduate studies at CMU, despite the support and encouragement from loved ones, friends, classmates, and advisors.
Fortunately, the idea of following your passion is a myth. Instead of following your passion, your goal is to become passionate about your work. As discussed in So Good They Can’t Ignore You by Cal Newport, by developing valuable skills, like programming, you will gain the compensation and autonomy in order to become passionate about your work.
If you hear those doubts, tune them out. Learning programming takes time, it’s abstract, it’s unforgiving, and it’s completely normal to feel stupid. This feeling may be more acute for women and underrepresented minorities in tech, since they also feel discouraged that there are fewer people that look like them on the other side of the interviewing table.
But programming is not an innate skill. Everyone had to learn it from zero, bit by bit, through experimentation, exploration, building, reading, collaborating, getting help, giving help, and absorbing a tiny fraction of the global knowledge base. The fact that you lack a CS degree, or you struggle grasping some “basic” concept, or you don’t look like a typical white male brogrammer does not mean you can’t achieve this goal. Be persistent, ignore the intrusive thoughts of Imposter Syndrome, and you’ll get there.
If you found this content helpful, purchasing a book or online course through one of the affiliate links is a way to show your support.