How I Went from Zero to San Francisco Software Engineer in 12 Months
Introduction
A year ago, I was working as a math tutor and wondering what I wanted to do with my life. Today, I‘m a backend software engineer at a FinTech startup in the heart of San Francisco.
My journey to this point has been exhilarating, arduous, and transformative. I went from knowing virtually nothing about programming to building complex applications in a matter of months. And while it certainly wasn‘t easy, I believe that anyone with sufficient motivation can follow a similar path.
In this post, I‘ll share my story of how I became a professional software engineer in under a year. I‘ll go through the steps I took, the skills I needed to develop, the resources I used, and the lessons I learned along the way. Whether you‘re contemplating a career change or already learning to code, I hope you find it useful. Let‘s dive in.
Recognizing the Need for Change
In 2018, I was feeling lost. I had graduated with a math degree a few years prior but still hadn‘t figured out my long-term career plans. To pay the bills, I was working part-time as a private math tutor for high school and college students.
Tutoring was rewarding in some ways – I enjoyed working with students and seeing them make progress. But the hours were sporadic and the pay mediocre. I had no benefits. And I couldn‘t shake the feeling that I wasn‘t living up to my potential. I wanted a career that was intellectually stimulating, paid well, and offered room for growth. I just wasn‘t quite sure what that career should be.
Deep down, I had always been fascinated by the technology industry. Living in the Bay Area, I was acutely aware of how programmers were in high demand and earning impressive salaries. According to the Bureau of Labor Statistics, the median annual wage for software developers was $105,590 in May 2018, and employment of software developers is projected to grow 21 percent from 2018 to 2028, much faster than the average for all occupations.
A few of my friends had even become software engineers after doing 3-month coding bootcamps. But I had never pursued programming myself, feeling intimidated by what seemed like an impossibly vast body of knowledge.
One fateful day, I came across freeCodeCamp, a free online community that teaches full-stack web development. I tentatively started the curriculum, not expecting much. But to my surprise, I found the early lessons intuitive and rewarding. I was amazed that within the first day, I was already writing simple scripts that could run in a browser.
I began dedicating more and more time to freeCodeCamp, my enthusiasm growing with each passing lesson. Within a couple weeks, I had an epiphany – programming was the perfect blend of creativity and analytical problem solving that I craved. I knew with unflinching certainty that I wanted to become a professional software engineer.
I decided then and there that I would complete the freeCodeCamp curriculum and do whatever else it took to land a full-time coding job. If others could go from novice to employed in a matter of months, there was no reason I couldn‘t do the same. After years of aimlessness, I finally had a clear direction and sense of purpose. My coding journey had begun.
The Key Skills and Technologies I Focused On
As a total beginner to coding, I knew I had a lot to learn before I could be job-ready. Based on my research into the job market and the advice of experienced developers, I decided to focus on becoming a full-stack JavaScript engineer.
JavaScript is the language of the web, used by over 95% of all websites. It can be used for front-end web development (client-side scripting), back-end web development (server-side scripting), and more recently, mobile app development with frameworks like React Native. Its versatility and ubiquity make it an excellent language for aspiring web developers to learn.
On the front-end, I focused on learning:
- HTML and CSS for structuring and styling web pages
- Responsive web design principles to create pages that look good on any device
- JavaScript fundamentals like variables, functions, arrays, objects, loops, etc.
- DOM manipulation and event handling to create interactive web pages
- ES6+ syntax and features like arrow functions, destructuring, async/await, etc.
- React, the most popular JavaScript front-end framework, for building modular and reusable UI components
- Redux for managing application state in a predictable manner
On the back-end, I focused on learning:
- Node.js, a JavaScript runtime that allows running JavaScript outside the browser
- Express, the most popular Node web application framework
- RESTful API design principles for building well-structured and maintainable back-ends
- MongoDB, a NoSQL database, for storing and retrieving data
- Mongoose, an object-data modeling (ODM) library for MongoDB and Node.js
- Authentication and security best practices
In addition to these specific technologies, I also worked on improving my:
- Problem solving and logical thinking skills
- Understanding of data structures and algorithms
- Ability to read and understand unfamiliar codebases
- Debugging and error handling skills
- Git and GitHub proficiency for version control
- Agile development best practices
Of course, this is a lot to learn for any beginner. The key is focusing on one thing at a time, and building iteratively. Every new concept I learned built on the foundation of previous concepts. Consistent focused effort over time leads to remarkable results.
Building Real-World Projects
While theoretical knowledge of concepts and syntax is important, the key to truly understanding programming is applying those concepts to solve real problems. Throughout my learning journey, I placed a huge emphasis on building projects to solidify my knowledge.
Here are some of the key projects I built:
Pomodoro Clock
- Utilized React to create a custom and responsive Pomodoro clock application
- Implemented key React concepts like components, state, props, and lifecycle methods
- Enabled users to set custom work and break intervals and start/stop the timer as needed
Heatmap Visualizer
- Used D3.js, a data visualization library, to create an interactive choropleth map showing temperature data by country
- Parsed and manipulated JSON data to extract meaningful insights
- Implemented a legend to help users interpret the color scale intuitively
Stock Market Tracker
- Built a full-stack stock portfolio tracking application with Node, Express, React, and MongoDB
- Integrated a third-party API to fetch real-time and historical stock price data
- Enabled users to add, remove, and track the performance of stocks in their portfolio over time
- Utilized Recharts, a composable charting library built on React components, to visualize price data
Social Media Dashboard
- Created a social media dashboard application for tracking Twitter and Reddit metrics
- Implemented OAuth-based authentication flows to enable secure sign-on with social media accounts
- Utilized the Twitter and Reddit APIs to fetch real-time social media data and analytics
- Displayed key metrics like followers, likes, retweets, upvotes, keywords, etc. in a visually appealing, easy-to-understand dashboard interface
Hiking Trail Planner
- Built a full-stack application for planning, creating, and sharing hiking routes using mapping tools
- Utilized Node and Express to create a RESTful API backend, with endpoints for trails, users, and reviews
- Implemented a responsive and intuitive React frontend, with components for trail search, trail details, user profiles, etc.
- Integrated the Google Maps API for an interactive trail mapping and elevation profile experience
- Stored trail and user data in a MongoDB database, with geospatial querying capabilities
For each project, I followed a similar process:
- Set clear goals and requirements for minimum viable product (MVP) functionality
- Architected the application structure and data models
- Built the back-end API with Node/Express and integrated with the database
- Created a responsive, mobile-friendly front-end with React and any relevant libraries
- Iterated on styling, UX enhancements, and edge case handling
- Deployed the application (using tools like Heroku, Netlify, or DigitalOcean)
- Wrote detailed documentation including setup instructions and key features
Building these projects was incredibly challenging but equally rewarding. Each project pushed me to learn new technologies and techniques, overcome obstacles, and create something tangible. They gave me the confidence that I could build full-featured, professional-quality applications.
Having a portfolio of deployed projects was also crucial for demonstrating my skills to potential employers. Rather than just claiming proficiency in a language or framework, I could show them live applications I had built and walk them through the code. There is no better proof of your capabilities as an engineer.
Preparing for the Job Search
After 10 months of intense study and project building, I knew it was time to start applying for developer jobs. From my first tentative "hello world" to building full-stack applications, I had come a long way. But I also knew that landing that first technology job would be a challenge of its own.
San Francisco is a hotbed for tech talent. With top companies like Google, Facebook, Airbnb and countless startups in the area, competition for entry-level roles is fierce. I would be going up against computer science graduates from top schools as well as experienced engineers. As a self-taught developer with a non-traditional background, I knew I would need to work extra hard to stand out.
To prepare for the job search process, I did the following:
Algorithm and data structure practice: Technical interviews, especially at larger companies, often involve solving coding problems on a whiteboard. To prepare, I spent several weeks practicing common algorithms and data structures. I used resources like Leetcode, HackerRank, and Cracking the Coding Interview to solve hundreds of problems. I practiced talking through my thought process out loud and explaining my solutions clearly.
System design practice: For more senior roles, interviewers often ask system design questions to gauge your ability to think through complex problems at a high level. Although I wasn‘t targeting senior roles, I still wanted to demonstrate my understanding of scalability, performance, and reliability principles. I studied common system design concepts and practiced diagramming and discussing the architecture of popular applications.
Resume and online presence optimization: I updated my resume to highlight my newly acquired skills and projects. I emphasized the technologies I used, the role I played, and the impact of each project. I also created a personal website to showcase my portfolio and serve as a central hub for my online presence. I made sure my GitHub profile was up-to-date and that each project had a clear, informative README.
Networking and outreach: I knew that relying on online applications alone was not the most effective job search strategy. I made a list of companies I was interested in and searched for employees who had attended my university. I reached out with personalized connection requests, asking for informational interviews or advice. I attended local tech meetups and conferences to expand my professional network.
Interview practice: To get comfortable with the interview process, I did mock interviews with friends and peers. I asked for honest, constructive feedback on my responses and communication. I also took advantage of online resources like Pramp, which pairs you with another job seeker for practice technical interviews.
By the time I was ready to apply for jobs, I had put in dozens of hours preparing. I knew that the process would be challenging, but I was determined to give it my all.
The Job Search: By the Numbers
I started applying for full-time software engineering roles in October 2018, about 10 months after I had written my first line of code. I focused my search on San Francisco and the surrounding Bay Area, as that‘s where I knew the most opportunities would be.
I applied to a wide range of companies, from tech giants to early-stage startups. I searched for roles that mentioned JavaScript, Node, React, or other technologies I was proficient in. For each application, I tailored my resume and cover letter to highlight my most relevant projects and skills.
Here is a breakdown of my job search funnel:
Metric | Number |
---|---|
Total applications | 152 |
Phone screens | 27 |
Technical screens/challenges | 19 |
On-site interviews | 8 |
Offers | 3 |
As you can see, the process was quite intensive. For every 50 applications I submitted, I got about 9 phone screens, 6 technical screens, 2-3 onsites, and 1 offer. The whole process from start to offer took about 2 months.
The technical screens and coding challenges were especially grueling. I was asked to solve algorithmic problems, build out full-stack features, and discuss my approach to system design. I had to draw on everything I had learned over the past year and communicate my thought process clearly.
The onsites were even more intensive, often involving 4-5 hour long interviews with various members of the engineering team. I was tested on my coding skills, system design knowledge, debugging ability, and cultural fit.
After each rejection, I tried to gather feedback on what I could improve. Common pieces of feedback included:
- Needing more practice with certain data structures and algorithms
- Communicating my thought process more clearly while problem solving
- Having more in-depth knowledge of the technologies and frameworks I listed on my resume
I incorporated this feedback into my preparation and continued to hone my skills. I tried to stay resilient in the face of rejection and view each interview as a learning opportunity.
Finally, after dozens of applications and interviews, I received an offer for a backend software engineer role at ForwardLane, an AI-driven FinTech startup in San Francisco. I knew it was the right fit from my conversations with the team and the exciting problems they were working on. I eagerly accepted the offer and prepared to start my new career.
Reflections and Lessons Learned
Looking back on my journey from math tutor to software engineer, I‘m amazed at how much I was able to achieve in such a short amount of time. Coding every day for a year transformed my life and opened up incredible opportunities. Here are some of my key takeaways:
Consistency is key: Learning to code is not a sprint, it‘s a marathon. It requires consistent, focused effort over a long period of time. There were many days when I didn‘t feel like coding, but I pushed through and put in the work. Small steps every day lead to huge progress over time.
Build, build, build: The best way to learn is by doing. Theory and syntax are important, but they only get you so far. Building projects is what truly solidifies your knowledge and gives you the confidence to call yourself an engineer. Whenever I learned a new concept, I tried to apply it in a project.
Learn how to learn: As a self-taught developer, you have to be able to learn things quickly and independently. This requires a combination of resourcefulness, discipline, and experimentation. I learned how to Google effectively, read documentation, and debug error messages. These skills are just as important as any particular language or framework.
The job search is a numbers game: Applying for jobs can be a daunting and ego-bruising process. It‘s important not to get discouraged by rejections and keep putting yourself out there. The more you apply and interview, the better you‘ll get and the more likely you are to find the right fit. It only takes one yes.
Never stop learning: Getting a job is not the end of the journey, it‘s the beginning. Technology moves fast and there‘s always more to learn. I try to approach every workday with a growth mindset and learn as much as I can from my colleagues. I‘m still coding every day and building side projects to expand my skillset.
To those on a similar path, dreaming of breaking into tech from a different background, my advice is this: you can absolutely do it. It won‘t be easy, but if you‘re willing to put in the time and effort, the reward is life changing.
Embrace the struggle, celebrate the small wins, and never stop learning. With the abundance of online resources and the insatiable demand for software talent, there‘s never been a better time to be an aspiring engineer. Your future self will thank you.