My Journey as a Software Developer

Part 0: Origin Story

I've been interested in programming since I was a pre-teenager. When I was 12, my family purchased a Gateway P60 (Pentium 60MHz) desktop system with 8MB RAM, 3.5" floppy disk drive, CD-ROM and a 14.4Kbps dialup. I tinkered endlessly with the available freeware and shareware on Windows 3.1, played The Neverhood from CD, read Microsoft Encarta articles, and explored command line MS-DOS to navigate the file system.

After playing a few games and exploring the web through AOL's free online trial, my curiosity piqued and I wanted to learn how all of this stuff worked.

This curiosity led me down countless rabbit holes, into endless challenges and combing the software topic bookshelves at local libraries. I became acquainted with BASIC, HTML (before CSS was a thing), C/C++, and some other older languages like Pascal and Fortran. JavaScript and PHP was recently created, and VBScript was a new contender.

While I segued away from programming in my late teens through mid-20s to explore other things such as art, design and music production, ultimately I circled back and pursued a career in software development.

Part I: Internal Growth

My first role in tech was ironically not as a software developer. My first title was "Junior Graphic Designer" in a small company of about 40 people. My first job there was to convert paper-printed curriculum into highly visual and engaging PDF designs for music and film school programs.

Within 6 years my role grew to "Lead Developer / Designer" and I eventually left the company after 8 years for a fullstack developer role elsewhere.

In order to grow internally at the first company and prepare to make an eventual jump for a more fulfilling role, I had to learn new things to increase my value.

I'll outline some key values and specific decisions which led to steady internal growth in my first position. These are steps which took me outside of my comfort zone and pushed my limit. I believe these steps are universal in nature and can be applied to many careers, but are especially relevant to software engineering.

1. Push Boundaries

All websites and applications, no matter how impressive, have something in common: people built them. People no different from you or me. People who worked hard, tried new things, and maybe had a bit of luck along the way.

Everything can be created.

"I can't build that" is not a valid excuse. There's an incredible amount of open source projects, tutorials, and blog posts at our disposal to learn from. Nothing is impossible to create, and breakthroughs happen every day. With time and dedication to learning, much can be accomplished.

If I limited myself to what I already knew, or what I'd already tried and had success with, I would not have grown at all. I had to push myself.

2. Network

This may go without saying for many people, but it's still important enough to reiterate here. For my first few years as a developer (this might sound silly), I did not know there was an actual developer community out there!

I went to community college and made a few acquaintances, but most of us in class were flying solo. There were no real collaborative dev projects like you would find in the real world. This experience was not an accurate reflection of common software development, where team integration is a critical piece.

I stumbled on the developer community by accident.

There are a myriad of podcasts and highly-visible software developers out there; find your preferred technology and then search for relevant podcasts. There's a fit for everyone!

X (formerly Twitter) and LinkedIn can be an exceptional place to connect and interact with other professional developers - many of whom have worked on or created the very libraries and packages you use every day. Following people who have made significant contributions to technology is rewarding and very accessible.

3. Automate Yourself: Work Differently

I've come across the notion that some developers feel the need to keep themselves employed by overcomplicating their work. The thought is that if they make their work so overly complex, nobody else can take it over and their tenure with the company is guaranteed.

The truth is that there are countless developers out there who not only can take it over, but they will gladly do so. Over-complicating your work for job security only makes their onboarding a bit more challenging.

I've found the opposite effort to be true: automate yourself.

If you find opportunity to automate yourself out of a task, do it. Don't hang on to doing something just because it keeps you busy or it keeps the company dependent on you. There's more exciting work around the corner to focus on.

Part II: Preparing to Jump

After several years within the same company, I realized I hit a ceiling for growth. There was nowhere to grow internally, and my compensation was not going to improve.

At this point, I realized I needed to make a jump. But how? I developed software alone. How could I level up my skills to work with a team?

Read on about some steps I took to help grow my skills and make myself more marketable to companies with engineering teams.

1. Testing Code

I would see posts online about TDD (Test-Driven Development). I'd ask myself: "Do I have time to write this extra code? Do I have to ask permission from upper management to allocate some of my time to do this?"

As I learned more about it, I decided not to ask permission, but rather to take the risk of having to ask for forgiveness.

I never had to ask for forgiveness.

2. Act as If

Using version control software is a non-negotiable requirement in modern software development. Learning to leverage git was a critical stepping stone for growth.

git software is typically leveraged by teams to allow developers to work on the same codebase simultaneously without much friction.

Within the context of the company I worked for, git's primary purpose was to track the commit history to verify which work was done; to save a historical record of progress.

I read up a bit on team development, and learned more about branching, releasing, and what the pull-request (PR) process should look like. I learned about continuous integration (CI) and continuous deployment (CD). I realized that these were practices that I could learn and practice on my own — even without a team!

In Closing

At the end of the day, it's all about self-improvement and progression. When I found myself working repetitively, or stagnant, I became restless. The solution was typically to get outside my comfort zone, try new things, and learn.

The beauty of a software development career is that it's never stale. New technology and techniques are available nearly every day. There is no shortage of innovation and ideas.

The best software engineers continue to learn and grow, remain humble, and never settle for the routine for too long.

Enjoy the journey!