12 October 2017
Apprenticeship: Building to Something Bigger
Just a little over two years ago, I was living clear on the other side of the world. I was in Japan, working as a translator, and I had just begun working as a freelancer full-time. I had zero experience with programming and admittedly computer illiterate at the time. Still, I always wanted to learn programming, and with my new freelance lifestyle, I was able to set aside time during the day that I could dedicate solely to learning. After a couple of months of working on it almost every day, I completed my first app (a basic photo processing iOS app in Swift). I still remember the feeling of triumph I had when I launched the app on my phone. Despite how trivial the app was, I couldn’t resist wanting to show my friends what I had made.
Needless to say, that feeling of seeing something I built come to life is what got me hooked on programming. From there, I spent the next couple of years studying all I could about coding. After my first introductory course with Swift, I moved on to web apps and became enamored with Ruby on Rails. I loved the speed with which you can build a real working app in Rails and have it up and running on the web. During the course of building my first Rails app, I became acquainted with JavaScript. I liked JavaScript for the simple reason that you can see its effects with your own eyes. I eventually went on to learn about some other front-end frameworks including Angular 2, React, and Ember. After that, about one year ago I found my favorite language yet: Elixir. I immediately fell in love with its immense power. I couldn’t believe how easy Elixir makes running distributed systems. Its baked-in fault tolerance is unparalleled. The syntax is straightforward and a pleasure to work with.
By the time I started working with Elixir, I began to feel more inclined to make a career out of programming. But… how? I struggled with self-doubt for a while. The bulk of my professional experience was as a linguist and translator. Not necessarily the skill set most companies looking for developers list in job postings.
I was also wary of taking a step back career-wise. I loved the lifestyle and freedom that freelancing provided. I also felt comfortable and competent in my career as a translator. At any rate, I looked for job postings for junior developers in Japan and back here in the U.S. for a few months, hoping I could find a decent position. My goal was to find a position where I could pry my way in by demonstrating what I had been able to do on my own.
After a few months of searching, I was working on an Elixir project and trying to integrate a Phoenix (Elixir’s web framework) app with an Angular 2 front-end. That’s when I happened to stumble upon a YouTube tutorial by Gaslight. The tutorial was tremendously helpful, so I decided to look around Gaslight’s web page. To my great surprise, I found Gaslight was located in my hometown of Cincinnati. To top that off, I found the description for the DevBuilders Apprenticeship program on the web page.
It seemed like the perfect fit for me: I could make my way back home after living abroad for eight years. The position would help me get my foot in the door as a programmer, and I wouldn’t have to put my life on hold by accepting an unpaid or poorly paid internship-type position. I talked it over with family and made the decision to apply for a position in DevBuilders that night.
Now in my sixth week in the program, I can say that the apprenticeship program has delivered on all fronts and that I am learning more than I ever expected. Working on a team with other programmers on a big codebase is an experience that you just can’t get when you are developing apps on your own. The communication with team members, talking through design requirements, setting up test environments, and trying to understand the big picture are all challenges that working on a team presents. After spending a couple of years building your own apps, then coming into an existing codebase and trying to figure out how all the pieces fit together is an exciting but daunting challenge. Also, working with other developers who can look at your code and give you advice or question your implementations is extremely valuable. I want to list some of the main takeaways that I have gleaned from the apprenticeship so far:
1. Talk through complex problems before you start writing code. Sharing your thoughts and discussing complicated problems with others helps bring clarity to what you are doing and expedites the process when you actually start writing code. Discussion also helps you avoid unnecessary issues such as side-effects on downstream systems.
2. Use clear naming conventions. If you have to introduce a new variable into a file, make it self-describing. A developer who is new to the code should be able to grok what is going simply by reading the code.
3. Write your tests first! This is something I tried to adhere to when I was writing code on my own. Even so, I often found myself haphazardly experimenting around until I got something working. Once I had a successful implementation, I often neglected to go back and write tests. The problem with this is that you might break some untested functionality when you are working on a completely different part of the codebase with no tests to warn you.
4. Learn keyboard shortcuts and an editor like VIM or EMACS. It is amazing how much more productive these make you. Moving the mouse to get around and edit text looks so slow and clunky compared to what you can do with the keyboard.
5. Make sure you understand the big picture. Ask questions if you don’t. If you still don’t understand, ask more questions. Working on complex systems with dozens of other engineers can be mind-bending. Stay aware of what the overall purpose is and find people who can help enlighten you to things you may be unaware of.
6. Keep building. Even though you may have found a job as a developer, don’t stop enjoying it. Code something for fun or work on a side project with co-workers and/or friends. I have found this to be the most valuable learning experience. The journey of building something always takes you through unforeseen challenges. Learn from them and enjoy the ride.