Breaking into Tech
Saturday, February 18, 2023
I haven't posted here in over two years because I've been too busy with my new career to find much time to write. I'd like to begin blogging again (albeit less frequently than once per week as I did before), and reflecting on my transition from amateur coder to professional web developer seemed like a perfect place to start. It's been almost five years since I wrote my first lines of code and a lot has changed since then, culminating with my being promoted to Senior Frontend Engineer earlier this month.
My first article illuminates the process I used to learn to code, and within roughly six months of beginning that undertaking I had acquired the requisite skills for an entry-level position in frontend web development. I began applying every day to as many jobs as possible, but to no avail. By the time I had built this personal website and blog, the better part of a year had passed since I began to apply. I had nothing to show for it save for a handful of preliminary phone interviews with recruiters and human resources personnel, and it was growing increasingly difficult to keep doubts from creeping into my mind.
In retrospect, I think the main reason for this lack of success was that I was somewhat insecure about my knowledge and proficiency, and as a result was overly eager to use the most technical terms possible. This was not wise because if I was talking to a non-technical person, they were unable to follow what I was saying or verify if it was accurate. Conversely, if I was talking to a technical person, I was revealing the vast limitations of my current knowledge. That second point is only obvious in hindsight, as I didn't fully realize at the time how much greater my understanding of programming could and would become.
I continued to diligently apply for jobs and work on improving my portfolio, and in November of 2020 I finally did well enough in a phone interview that I was sent a take-home programming challenge. It specified that I needed to use Angular.js, which is an outdated framework with which I had no previous experience. I was overjoyed at the opportunity and got right to work.
Within hours, disaster struck. My computer suddenly shut down and refused to turn back on. This was extremely disheartening, as was the $400 quote I received when I took it to a repair specialist the following morning (this misfortune is another reason I abruptly stopped blogging that November). Fortunately, I had recently begun to date a young woman named Andrea, and she lent me her old Acer computer. Writing code on it was out of the question since it barely worked at all, but at least I could get online using a bigger screen than my phone.
I spent all day Thursday and Friday learning as much as possible about Angular.js, then drove to Andrea's apartment in Etobicoke, where we had already planned for me to spend the weekend. She generously allowed me to download Visual Studio Code onto her MacBook, and I spent virtually every waking moment of both days working on the challenge. I still have my solution on Github and it makes me laugh whenever I look at it, as my inexperience at the time is painfully obvious.
I submitted the code on Monday morning just before the deadline, along with a brief explanation of the issues which had stemmed from my laptop short-circuiting. I had debated neglecting to mention the situation at all (since it could appear that I was simply fabricating excuses to explain away my poor performance on the challenge), but I know now that including this information was definitely the right decision - my boss told me recently that my having persisted despite that adversity was a key factor in his decision to move me on to the next stage of the interview process.
Next up was a Zoom call with the founders of the company. Paul (the CEO) and Wayne (the CTO) immediately struck me as extremely smart and kind people, and the way they described the culture they wanted to foster also deeply resonated with me. The company is called Sowingo and is a Toronto-based eCommerce and SaaS startup in the dental space. Paul is an oral surgeon and founded the company because he saw the need for better digitization of inventory and medical records, and since then the scope has greatly expanded to also include procurement.
Following the technical interview, I was invited to come meet the two of them in person. Andrea felt sure that this meant I had the job, but I didn't want to jinx it (despite the obvious added weight imbued to an in-person meeting at the height of a global pandemic). Sure enough, I was offered the position and eagerly accepted.
My first three weeks were a blur as I acclimated myself not only to the codebase but also to the processes which come along with programming as part of a team. I had always simply pushed to a "master" branch on the Github repos of all my portfolio projects, and now had to greatly improve my understanding of Git. I also had to get up to speed with regard to a number of tools like Jira and Slack which I'd never used before. The learning curve was steep, but by the time we got back from Christmas break I had the basics down.
The first major undertaking was localizing the application, since we had designs on entering the untapped and overwhelmingly francophone Quebec market. Doing so was an incredibly tedious and time-consuming process, but it was also a great way for me to learn more about how the code was structured and where different modules lived. I worked closely with the QA and customer success team during the process and developed great working relationships with them.
The first iteration of localization took a few months to complete, and next I was tasked with building the new Product Details Page. This major feature is a crucial part of the checkout flow, and working through the specifications with the designer, product manager, and backend devs was extremely beneficial when it came to my ability to think as an engineer instead of merely as a coder. I've worked on many features with equivalent utility and greater complexity since then, but the PDP will always hold a special place in my heart as the first major feature I built.
The team and I continued to roll out new features over the remainder of my first year on the job, and my predominant secondary focus became modernizing the application - we were still using Angular.js with es5 and had absolutely no unit testing. Fortunately, we were able to incorporate Karma and Jasmine and set up a rudimentary CI/CD pipeline. No one at the company had any experience with TDD, so we had to figure it out together as we went. This is one of my favourite things about working at a startup: everyone is necessarily a generalist. I've had many opportunities to spearhead initiatives, along with the freedom to make mistakes so we can learn from them. At many larger companies I wouldn't have even been in the meetings where senior developers discussed these decisions.
We had initially hoped to migrate the codebase from Angular.js to Angular 2+, and had a few false starts which wound up not bearing fruit. We finally decided to instead use a submodule-based approach, and I began working on a new React app. I love React and use it almost exclusively in the applications I build for fun, so I was very excited to begin using it professionally as well. Our plan for migration is best analogized using the Ship of Theseus: replacing one rotten Angular.js board at a time with a fresh React one.
Wayne and I worked closely together scoping out the initial implementation of the submodule. We'd never used TypeScript or esLint but had seen first-hand the issues which can arise from the lack thereof, so I began configuring both. I also wrote extensive documentation about our standards, and built a proprietary abstraction layer for making API requests using Axios.
The most challenging part of creating the submodule was achieving interoperability with the existing Angular application (since we didn't have enough manpower to rewrite the entire app and then port over). I found a blog post describing how to create HTML elements which were React components under the hood, and tailored it to our needs by incorporating Angular directives. We've made minor adjustments to it since then but it's proven to be an excellent solution, and one of my coworkers thinks I should submit a talk to ReactConf explaining how it works. I may do so, as undoubtedly many companies are paying the same technical debt as us and would benefit from our hard-won knowledge.
Since then my grasp of TypeScript has improved exponentially and I now really do prefer it to the dynamically typed mayhem of JS. Incorporating tools like Mock Service Worker and React Query has also been extremely fun and educational, and using a modern stack has made the entire development process more engaging, rewarding, and enjoyable. I've become the goto person when it comes to BDD, and a goal for this year is to continue to improve my understanding of e2e testing with Cypress.
On a personal note, Andrea and I have been living together for the past year and a half in a lovely apartment in a quiet East York neighbourhood. We own our own home gym, I can play bass in the attic without bothering anyone else, and we're lucky enough to both work from home. I count these blessings and many more each day. It's amazing how much my life has improved in a few short years, and it was all made possible by computer programming and the love of a good woman.
I'm in a senior role and the team has more than doubled in size since I joined, so my responsibilities at work have greatly expanded. I have even less spare time and mental bandwidth than previously, but programming hasn't lost an ounce of joy for me and I still work on my side projects whenever I get the chance. In much the same way that I continued to play bass for fun when I was a professional musician and lift weights in my spare time when I worked as a personal trainer, I feel blessed to have a career that's also a hobby and a passion.