Note: This has been updated for 2024.
Introduction
I have had this story up since I started writing this blog in 2012. To many, it may seem like being a programmer comes natural to me, like a natural talent. In reality, it's really taken a lot of work and effort to get to where I am today. I still learn everyday from my mistakes, friends, and colleagues. I am always trying to tap into a wealth of materials in which I have been fortunate enough to have access to.
We all have seen and heard these stereotypes that programmers start out as kids who were coding video games, or hacking away on the internet and getting their first programming internship while in high school.
I didn't fall into that stereotype. At best, I tried to be the stereotype. I had the passion for computers as a young child, and I liked playing video games, but that was about it. I had many attempts learning how to program throughout my childhood, and failed on a lot of personal projects. Frankly, programming and any code confused me. I tried many times over to read programming books, copy examples and asked questions in programming forums just to wrap my head around some of the concepts.
Fun fact: I took an AP Computer Science course in high school to which I had no business sitting in. My teacher gave me a chance simply due to intense personal interest in the subject. (Thank you, Mr. Lin) I remember asking him during a fire drill outside of class in frustration: "What's the point of for
and while
loops? I don't get it!". You see, coding didn't make sense at all to me!
I decided to go attend college at UCSB as an Electrical Engineer in hopes of getting a stable 9-5 job at a Big-Defense-Company (starts with an R and ends with an eon). My desire back then was to just have a decent life paying bills, and making a living. Turns out, I was even bad at that. ????
I am glad I actually did poorly (relatively) as an Electrical Engineering major during my first quarter in Engineering School It was enough to make me consider a complete major switch to Computer Science because I naively thought it would be easier. Of course, I now believe college majors are quite difficult in their own sense.
Who would have thought I would turn out to be Software Engineer? I honestly did not expect it.
The Beginnings (1994 - 2000)
I am passionate about technology. I remember touching my first computer as early as 4 years old. The main reason why I got into computing was because my older sister wanted my younger sister and I to learn some typing skills so that we could be ahead of the curve in school. Looking back at it, that was an incredible move by her.
The PC my family ran in summer of 1994 (I was 4!) was pretty modest specification-wise. It was an Intel 486 DX-4 which ran at 100 MHz and 8 MB of RAM. I think the graphics card was a 1 MB Trident ISA VLB SVGA card. We also had a (quad-speed) 4x CD-ROM drive and a MediaVision AudioSpectrum Pro 16 card. It was a pretty awesome machine for playing DOS video games, the prototypical "multimedia" MPC computer of the time.
This PC was so influential to me in so many ways. I had no idea that it would be the foundation for not only my learning, but eventually a passion, career and hobby.
Although I was young, I remember myself vividly typing commands in MS-DOS 6.22 and making Windows 3.1 crash. It took me many years later to realize that memmaker
didn't really do anything useful -- which I ran religiously because the application looked cool in DOS, and Dr. Watson wasn't, well... a real Doctor.
While splitting my time running random DOS utilities, playing Sim City 2000 and No$GMB (Pokemon Red!), I fiddled around with QuickBASIC 4.5. One day, while randomly surfing the internet, I found qbasic.com which hosted a few BASIC tutorials. The tutorials were written well enough that I wrote a bunch of simple programs as a kid. The programs mostly consisted of taking in simple input and then spitting out an output such as the sum of two numbers, or calculating the date of Easter for a specific year. Unfortunately, the tutorials were not extensive enough to explain what I was even typing. So, I didn't really touch anything programming related until about a year later when I was ten years old or so. Most of my interests in computers was just into learning about hardware and hoping to one day build a PC of my own.
Grade School, Building Webpages and First Programming Attempts (2000 - 2003)
2000 was a great year! My parents had finally bought me a computer so that I could use solely for myself! As a 10 year old, this was like getting a house for free! The machine came from Costco and was a Compaq Presario. If I recall correctly, it was a 7000 series. It had a Pentium III 1 GHz CPU, 128 MB of RAM and a huge 60 GB hard drive at the time.
Anyway, what made this era special for me was that I was finally able to get on the internet reliably, and for free too. For those who are a bit young to remember, back in the late 1990s and early 2000s, most households were hooked on 56 Kbps dial-up. At the time, AOL, Earthlink, Prodigy, MSN, etc were all big players in providing internet service. Some ISPs provided free dial up internet service with a bit of an exchange for advertising on your computer. This was what some companies like NetZero and Juno provided. Now, I went with the free dial-up internet route. At the time, the limit was only 40 hours each month per account. I was using both NetZero and Juno and had about 80 hours to use monthly. Eventually, I became really curious as to how NetZero and Juno implemented their counter in determining usage limits. Thinking back, one would assume it would be per telephone number. But nope, turns out the limit was per account!
So, eventually my 10 year old self figured this out and found a way to exploit the quota and soon enough, I was having unlimited free internet access. This continued on for about 3 years or so until I had jumped on the broadband train and got SBC DSL. Anyway, at the time I felt so happy and so clever at getting myself free dial up internet access that I realized I could do so much more.
I think at about that age, I realized that I was definitely going to be doing something with computers as a career.
What do you get when you put a 10 year old kid, Dragon Ball Z and the internet together? A Dragon Ball Z web page! My first serious step into coding, was creating cheesy Dragon Ball Z fan sites in mostly static HTML. At the time I jumped from web host to web host, from services like Homestead to Geocities. I remember going to Lissa Explains and following the tutorials available on writing HTML markup.
I looked to guys like PlanetNamek and Ginga Giri Giri as inspirations. Their pages were top notch and I was always trying to figure out why their pages were so much better than mine. Other than content, it was because they were more advanced with web development techniques by implementing scripts to update their pages dynamically on the server side. Had I known then, I would not have been so discouraged and would have went right onto learning client side JavaScript and server side scripting!
Eventually, my web development interest fizzled out. I think I was about 12 years old, going onto the seventh grade was when my interest in Dragon Ball Z had begun to diminish a bit. Writing static HTML pages was not as fun anymore either. Coincidentally, right about this time, I picked up programming again. I went back to QuickBasic and went through the same tutorials I had found years back. They were easier to understand this time, but still not much theory. I was able to become good enough to write a command line which executed stupid joke "programs" though. For what it was worth, these "programs" were merely little functions in the same command line program I had created. I remember I had a program that basically just played a guessing game of numbers. The CPU would just basically pick a number from 1-100 and the user would just have to keep guessing until the input had equaled to what the CPU chose.
Overall, I think the best I did was basically a compound interest calculator which I just basically got the idea from my Algebra book from school. I will say again, at the time I still didn't really truly knew how some patterns and logic worked in programming. For example, I still had no idea on how for/while
loops really worked. I just "did 'em".
The whole for/while
loop thing would come back to be the greatest annoyance of all my newbie-programming frustrations. With all the tinkering, I just basically wrote the same programs over and over again and had actually started to think this was what programming was and had the assumption in that it was uninteresting.
I eventually stumbled upon Microsoft Visual Studio 6.0 and worked a bit with Visual Basic 6.0 and Visual C++ 6.0 but nothing interesting came out of my efforts. What was different though was that I was able to have a GUI and pretty images around my programs. I had actually gotten good enough to write my own hard coded RPG game with graphics drawn in Microsoft Paint called SomeRPG. It had a silly storyline and was just mostly composed of Windows Forms. The whole program was reminiscent to the old early 1990s Shareware games written in 16-bit Visual Basic. I think it was my inspiration due to having a lack of computing power through my life, and not being able to play the latest 3D PC games at the time. I actually contribute this experience to my huge interest in retro gaming and computing.
As far as my grade school academics go, I was considered to be a pretty ambitious and bright student. Working with computers for so long as compared to my peers then allowed me to actually fix some of the computer problems my teachers had. I remember being called up time and time again to fix my teachers' computers in their classrooms. This ranged from old Pentiums running Windows 95/98 to Macintosh G3s and iMacs on OS 9.
Eventually, I went from fixing computer problems at school to helping friends and relatives with their computing problems. I eventually just became known as "the computer guy".
You know how they say kids change their minds all the time? I happened to have changed my mind all the time! Since I had became pretty confident at solving computer problems, and I wanted to do something with computers as a career, I was thinking about going into IT hooking up networks and data centers professionally. I liked being the tech guy.
From the PC fixing, to the efforts in programming... all this was actually enough to impress my parents enough so that they were open to letting me build my first PC by myself!
Building My First PC (2003 - 2004)
I went all out on this first build of mine. In 2003, the top of the line PC was a Pentium 4 with 512 MB of DDR RAM, and that was what I got. I made my dad spend the cash for a Pentium 4 2.4 GHz Northwood, a Soyo Socket 478 Motherboard, 512 MB Kingston HyperX DDR memory, 2x 80GB hard drives on RAID, and finally my all time favorite GPU, the ATI All In Wonder 9700 Pro AGP!
All this cost about $2300 total at the time. Pretty insane. Who would trust a kid to handle that much hardware? My parents did, and I'm glad they did.
This system would carry along with me until college. It was eventually upgraded multiple times until it became a Core 2 Q6600 to which I used into my early professional career.
Anyway, with all the computing power, I went through a couple of years just playing video games, downloading and watching anime and not doing many "productive personal growth" things like my parents was convinced I was going to do with the computer... I was actually just enjoying being a 13 year old kid and just eating junk food and playing video games all the time.
High School (2004 - 2008)
When high school rolled along, I still had this idea that I wanted to be some kind of IT Administrator. I thought it would be pretty simple and wouldn't require much stress to study since I already had some aptitude for it.
Since I also had such a huge ego and was over-confident with all this, my parents pushed me to take the CompTIA A+ Certification test to prove that I actually had the skills for the IT world. I eventually passed, and fairly easily. It also made me realize that maybe I should strive for improving myself. So, I decided to improve in some way. What to improve? Well, at the time did not know much about the UNIX operating system, so I decided to start on that.
Again, I found myself trying to be clever and went on Amazon.com and bought a FreeBSD manual titled FreeBSD Unleashed from Sams. I went through the book and unfortunately I couldn't appreciate the material enough to really learn much. I thought UNIX was too complicated for me at that moment. Of course, at the time I didn't understand the whole concept of underlying OS kernel concepts -- all I cared about was having something easy to use and understand!
All the effort wasn't a total waste of time. I became obsessed with running home servers and even hosted my web pages through an old Pentium 166 box. This experience allowed me to gain some knowledge on how Web applications worked. This was something my 10 year old self would have loved to have experienced.
Around this time, I found myself interested in a cool little machine that came out called the Apple Mac Mini. Yes the original first generation Mac Mini! I persuaded my parents to get me one after much begging. "UNIX" was actually interesting now!
By the time I was 16, I had decided that maybe it was time to just give programming a chance again. The high school I had attended provided AP Computer Science as a course, so I just signed up for it. It was taught by a man named Michael Lin. I do not name drop often, but I feel like Mr. Lin deserves the mention since he essentially inspired me to not give up.
I don't think I was anything special as a student in that class. I knew how to declare and initialize variables, write control statements, loops, and class objects, but I had no clue why I was even doing them. I remember having a fire drill at school one day and I was absolutely venting my frustration at Mr. Lin at not being able to understand how loops worked. In retrospect, I actually couldn't express the key question in that I really wanted to learn how the computer internally invoked loops, and not the "rules" to looping.
I ended up failing the AP test. At this point, I felt like maybe I wasn't meant for programming. I didn't really give up though, as I really did want to prove to myself that I could really learn this stuff.
I spent the summer between 11th and 12th grade of high school picking up a Java book and finally grinded away at all the chapters and learning how to program. I didn't socialize much, nor did I even do extra-curricular activities all high school students who wanted to achieve good marks did -- like to prepare for college applications. Everyone else did that summer. All I wanted to do was just program.
I entered Senior year in high school a much different person with a different mindset. I finally understood the material from my previous class, and had decided to enroll in it again to re-take the AP test. At this point in time, I also figured out my learning style from that single summer. I was really good at reading long documentation and actually digesting material first before going "hands-on". It's a learning style I still continue to use to this day.
As it turns out, the efforts were not wasted as that year I had passed the AP test with a 3. Sure, it was not the maximum score (a 5), but it was validation of improvement. As college applications came into the picture, I did not really see myself actually doing anything programming related. I figured maybe I wasn't very great at programming since it took so much effort to get to where I was at the time. So I decided to just apply to a bunch of colleges as an Electrical Engineering major for UC and Computer Science for Cal Poly SLO.
As acceptance letters came, I narrowed my choices to either UCSB or Cal Poly SLO. Both were highly regarded in the engineering schools list, and were in the general area of each other. I had visited the schools and decided that maybe picking a bigger named (UCSB) school would be better for me in the long run.
College (2008 - 2012)
I goofed around in a nerdy way in my first year of College. I was admitted to the UCSB College of Engineering as an engineering student. At this point I thought I had assumed that I wasn't going to go into programming professionally, and really wanted to be closer to hardware... so I could make PC hardware! Unfortunately, I took school too lightly in the beginning by playing too much basketball, and surfing too much Digg (yes, Digg) and Reddit, lifting weights, and overall just not being really motivated to study. I did not perform well academically my first two quarters in EE. So then, I decided to give Computer Science another shot. I also decided to switch because I had decided maybe I could make video games for a living and programming was a way to that career.
I guess I became a programmer simply because I wanted to make video games. (Unfortunately, now years into my career, I don't think it is happening)
The first few introductory classes to programming I took in college were easy! I didn't even do much reading and was able to do every single assignment and pass every mid-term and final with an A. This was probably due to the fact that my AP Computer Science material from high school carried over well into college.
Taking those classes really did give a bit of a confidence booster. I felt like I was gifted for this, and had probably just put myself down all along for the unrealistic expectations I put on myself as a kid! But of course, the feeling in having momentum did not last long... By the time I got into studying abstract data structures and efficiency of algorithms, I had fallen into old habits in thinking the material was too boring and too "hard".
Who cares about a "linked list", right? Who cares about why bubble sort and quick sort are such different algorithms when it comes to their worst case efficiency! I run the sort algorithms on my PC and they both seem fast! I want real stuff! I want to make video games! Teach me how to make them instead! ????
My third year of college was probably the most memorable. I had signed up for a digital image processing course to satisfy a major elective in my program. As it turns out, that DIP class improved my programming skills dramatically. I do not know for sure whether it was the heavy use of multi-dimensional arrays that I was working with along with complicated data structures, but that class really challenged me, and I enjoyed it in a way I never would have imagined.
The projects were extremely interesting and difficult, but I had come to appreciate a lot about previous computer science concepts I had encountered in my previous courses. I also struggled a bit in the class due to not having as strong of a mathematical background as others, which I attribute to my past tendencies in not paying attention in class. I was able to pass by annoying my TA and not being afraid to ask the questions. Even if it required drilling things down to the most minute detail.
An example of a very important CS concept I finally "learned" in this class was abstraction. For example, a digitally stored image at its most basic level is a two dimensional array (width and height) of values (pixels) of 3 element vectors (R, G, B)
. To any average person this may not seem like an important detail, but to myself at the time, it was when I realized that with the concept of abstraction, we can virtually almost represent any real world object in a virtual manner.
Not only that, I finally understood the importance of efficiency. I remember I had written a routine that would iterate over a set of images while applying a filter in some way. The whole algorithm was like O(N^5)
and took in the order of 10 minutes to process completely! When I had learned how to profile code, I analyzed my algorithm and eventually cut things down to around O(N^2)
! I think I can do much better now. :)
Things just started clicking. Sure, these projects took me many nights to finish, but I finally understood efficiency, I understood abstraction, I understood data structures, and I understood what made OOP powerful in certain applications and functional programming in others. Things were just starting to click now. Better late than never!
It was this year I learned by not giving up, and taking my time to learn had its perks. Suddenly, all the Computer Science concepts I had learned in the past which I thought useless, was proving to be actually useful!
At the same time, I was beginning to get a little nervous when it came to deciding what I should be doing after school. I decided maybe it was time to think about jobs and internships to get some working experience for my resume.
I ended up working as a computer lab consultant just helping out others with computer problems in the various computing facilities in my University. I actually developed a reputation on being a uptight when it came to keeping the facilities clean, that I was nicknamed "Mr. Clean".
I did learn quite a bit. I learned patience, dealing with difficult people, and behaving professionally when things didn't go my way.
At the same time, I had attended my school's career fair and was invited to a preliminary interview with Microsoft. I was super excited to know someone like Microsoft would be interested in me, so I accepted.
I remember I was interviewing for an SDET intern position for the summer. The first round question asked was to code a Fibonacci algorithm. I was so nervous that I felt that I might have seemed like I did not know how to program at all in the eyes of the interviewer. I walked out of the interview that day thinking I had bombed completely.
A few days later, I was notified by email that I would be going to Seattle for a second round interview for Microsoft! I'll spare everyone the details on what happened during these second rounds, but I had failed miserably and got stuck in the fail-bus back to the hotel. It was extremely discouraging, but I learned a lot about myself during those 3 days.
Rather than being depressed off of one interview, I decided the only thing I could do to make it up to myself was to just improve more!
First Internship and Final Year of College (2012)
I came into my Senior year of college much improved. I had spent the summer coding as much as I could and reading up on various technology related things. I also came into the school year with a mindset of finally setting in stone, what I would be doing after college. I decided I really did want to become a professional Software Engineer.
Early in the school year, a Bioinformatics Programmer research internship opened up and I had a chance to snatch it up before anyone else could. I spent the year working for Professor Todd Oakley at UCSB writing a bunch of Perl scripts to process large datasets. I used the opportunity to basically learn how to be a better coder. :)
Working for Dr. Oakley was an extremely enriching experience. His problems were HARD. After a few months, I realized this, and things got easier to the point where I became more confident as a programmer.
First Job (2012 - 2016)
I had a chance to go interview at Yardi Systems during the second half of the last year of my academic career. For this experience, I could describe it as "love at first sight". I had interviewed with 5 managers, and through all the interviews I felt extremely comfortable. The first few months of my job, I was essentially thrown into an environment I had never truly been in before. It was quite intimidating, but my manager allowed me to make mistakes and was generally open to me having more freedom. I spent the nights after work just coding even more and improving as much as I could so I become more competent at my job.
I guess those nights were worth it and the hard work paid off as I was promoted the next year to a Senior Software Engineer position. The promotion essentially motivated me to keep learning and growing not only technically, but also within the area of the business line.
My direct Manager, Directors and VPs in which I reported to were all wonderful and allowed me the creative freedom needed to succeed. I had grown much more confident in my own abilities as the years went on. I made effort to not only stay extremely knowledgeable but also learn how to share the knowledge with my peers.
During my time as an engineer there, I essentially learned that there was much more to software than just spitting out code. There were many aspects to being successful in software:
- Getting functionality for the client needs is more important than writing the greatest code ever. NO customer, NO sale, and NO money.
- Be patient with everyone you meet, kindness is key. It can be frustrating handling customer issues with a panicking customer rep. at times, or you may disagree with a designer, but ultimately you all are in it for the common purpose of providing solutions for customer problems.
- Providing enough context in communication through writing and speaking are just as important as being technically great.
- Knowing the line of business and its functions will aid you in writing better code. Knowing what problems you are solving gives a much clearer thought process.
I was at Yardi for about 4 years and ended my career there officially as a Project Manager. Though I was put in the less technical track, I caught myself performing a dual role as a Software Engineer and Project Manager. I was told at times to not worry about the technical problems, and focus on the core business problems. This experience also let me discover that the non-technical track may not have been for me. I still gave it a chance though. I even relocated to Boise, Idaho to be closer to my team to make the job easier. By the end of it all, I had learned how to design a system and interface it end-to-end which interoperated with third-party/client systems.
For the purposes of career growth and ultimately the desire to solve technical problems through code again, I had decided to pursue other opportunities due to needing a new environment as well as a new project to be challenged with.
I had interviewed around the last 6 months of my career at Yardi. I remember it was eventually down to 2 offers: SpaceX and TSheets. With the former, I would be relocating back to California, and after much discussion with my wife one night due to the strength of the two offers, we had decided going to TSheets was the better option. I did not regret that decision at all.
It was also around this time I had started reading technical books at a higher frequency. I made it a goal to read a a couple of books every month. I averaged anywhere between 1-3 books a month depending on the technical difficulty, concept and length.
Second Job (2016 - 2017)
When I first interviewed at TSheets (now Intuit), I remember getting a phone screen from a lead engineer and was tasked with actually coding not a programming puzzle, but an actual mini-exercise that involved all aspects of web development. The type of problems that would occur on the day-to-day job. The problem was by no means "easy". It was just that it was more in line of what I was already currently doing at my job.
When it came to the on-site interview, I remember sitting in the conference room with J.D. Mullin (Engineering VP) and I was ready to be grilled with some tough programming puzzles.
Contrary to my initial thoughts, the first thing J.D. told me with the friendliest smile on his face, as if he knew what I was thinking. This was along the lines of:
"We're going just have a nice chat about tech and your background. There aren't any tricks to to this interview. No obscure white-board programming problems, just things to test your basic background."
And so, the interview was exactly like he promised it to be. It was simple, and enjoyable. In fact, I felt that I enjoyed it too much and that it was too simple to even be a tech interview! I initially thought that the company may have had a low-hiring bar. I now believe my initial thoughts were insincere, and completely wrong.
After much thought, and now in this present day where I am more mature as a person and engineer, I am fully now aware of what J.D. was trying to do.
The initial phone screen was already deliberately designed to test my technical ability. In reality, our jobs aren't always about recreating academic algorithms, but rather producing practical code that can drive a product of a business to keep customers happy.
I pretty much hit the ground running at TSheets. The experience was amazing. It all felt like one huge coding camp. I learned many new things which I could not have picked up at my former job. During this time, I became quite knowledgeable with automated browser UI testing, browser rendering, web performance, and UI/UX concepts.
The great thing about TSheets was that they had a similar concept to Google's 80/20 time. 80% of TSheets time was to complete the current product iteration/sprint while at the end of the sprint, the rest of the 20% of the time could be used to further one's knowledge through either 1) studying, or 2) working on a hobby project. I frequently did a bit of both.
My experience at TSheets also made me appreciate code reviews. Code reviews were taken seriously at the time I was there and agile development was run very well. It made me appreciate development processes even more and realized that the term "agile" is applied loosely at too many organizations. TSheets really took agile seriously and the development culture just moved fast.
I had started reading research papers around this time and started fiddling around more with my passion with computer hardware. It was then I started to learn more about how internet protocols worked and even other things like game console emulation.
Third Job (2017 - 2018)
Still in Boise, Idaho, I started to feel home-sick around the end of Winter 2017. Idaho actually had experienced quite a harsh winter. As a result, I had been experiencing SAD (look it up!). I think regardless of this, I would've found my way home eventually. During April of 2017, my wife was also experiencing the same thing and we agreed to pack our bags back to California.
IBM Cloud had offered me a position as a Software Engineer specializing in front-end web development for their cloud services. At the time, IBM was in the process in integrating all the SoftLayer services into their own cloud. Basically, my experience at TSheets had made me knowledgeable enough that I would be fulfilling a lead role on the web and front-end development of the offering. ????
This role was quite interesting. It was the first time I was working at such a big company and the culture varied widely across teams. I was lucky to have an amazing team lead who consistently took care of any non-technical issues myself and the team as a whole with politics and decisions. She also entrusted me with many tasks that would be quite important in the delivery of the product. I think I was lucky here.
My time at IBM and work performed there was essentially a cumulative application of everything I hard learned at Yardi and TSheets. As the "expert" web engineer in the team, I was responsible for creating browser UI automation frameworks, front-end components, debugging methods, API, and new pages for the existing internal and external management systems involved in maintaining our offering at the time.
I found that my opinion on things was highly valued due to the knowledge I brought in my role. For the first time in my career, I did not need much ramp up time to get used to the job. In fact, I was able to be productive on the very first day!
The above realization was quite a surprise for me. Up until that point, I had always seen myself as the "junior". At IBM Cloud, I felt like I was specifically brought in for my skills to make an immediate impact. That is important for anyone, not just in software to feel in a team.
By also being in a very large company, I also received more exposure to the technical interview process. The opportunity to interview many software engineering candidates lead me to try and make the interviewing process for technical candidates much more friendly and pleasant. This was actually very appreciated as my manager had told me he was supportive in my efforts, and thus became a frequent interviewer for potential contributors in the organization.
All in all, I decided moved on from IBM Cloud simply due to the fact that I found that being in a service-heavy, network/cloud development team was not within my career goals. I also was interested in working with a team with a background closer to mine so that I could continue to learn and grow technically in web development. However, being part of that team was a great experience and leveled up my non-technical skills in various ways. Some noteworthy learning experiences:
- Project Managers are very important. At IBM, they are called "Offering Managers" and are experts in the business domain you are developing for. They are vital to the product's success.
- As with all big companies, you have to be very careful about what you say as it can affect others -- for better or for worse. There are a lot of people with various responsibilities that run the machine, and if you mislead anyone with any statements, make sure to own up to it.
- Your team leads will protect you as long as they are aware. They will make sure you get what you need and will shield you away from things you should not be concerned about. Trust in them.
- Always, always, always learn the business domain. Terminology can sometimes be harder than programming itself! (This is the recurring theme!)
Fourth Job - Microsoft/Skype (2018 - 2019)
I started a new role in early 2018 as a contributor to Skype at Microsoft. During this time, Microsoft was transitioning Skype to be a web app sitting within Electron for the desktop experience. The team I was working in had the responsibility in delivering "add-in" experiences, or essentially, "plugins" to the Skype chat feature. Things such as getting the weather, creating a poll, listening to Spotify, and talking to chat bots was the work of my team. I had even prototyped real time collaboration in these plugins in various hackathons by creating novel "apps" such as a whiteboard in Skype. These plugins were in reality React web apps mounted within a root div. It was a clever architecture, and I am sad that we had to discontinue major development in features in 2019.
At Skype, my responsibility was to serve as a "full-stack" developer. Technically, my other roles in TSheets and at IBM were considered "full-stack" too, this role at Microsoft was really my first "official" full-stack role. it really gave me insight on how large scale apps in big-tech worked, and how testing, and deployment worked. It was the first time I was exposed to real tooling relating to feature flag deployment and targeted roll outs for experimentation. Documentation was also a very important aspect of the job, and one that I never had to take very seriously until my time at Microsoft.
Now, before I say anymore on the next part, I'd like to just make sure that I make it clear that Microsoft is an amazing company. I had the most growth in my career during my time at Microsoft. I came in at L61 (lower-band of Software Engineer 2) and got promoted up to L64 (top-end of the Senior Software Engineer band). So my work was ultimately recognized, but I will tell the story on how I felt at the time in this next part.
In the middle of 2019, my team in Silicon Valley was reorg'd into the "new" Microsoft Teams organization. At the time. Teams only had 10s of million of MAU, and not the 300+ million of today. Naturally, the best team which aligned with my team's knowledge and expertise was the Messaging team. My team in SV would be tasked with creating a new experience in Microsoft Teams involving real-time collaborative editing which would ultimately become Loop Components in Teams.
At some point, I decided that the work I was tasked with wasn't aligning with my expertise and interests. I did a lot of cool things though. I lead the effort with standing up some of the basic infrastructure and initial evaluation of the technology as a founding member, and even wrote some of the earlier code in real time message passing between clients. My proudest moment was actually getting into a 1-on-1 call with David Fowler, a Distinguished Engineer at Microsoft and the creator of SignalR with regards to insight in the transport tech I had been tasked to architect. He probably doesn't even remember me, or the conversation, but it was super cool talking to a legendary engineer.
All the work I did though followed pretty much the same pattern in fighting for the work, and actually doing it without reassurance there would be strong support. At the time I didn't know how to voice this concern appropriately. Essentially, I had felt like the work I was doing seemed less important than my peers, and that even some of the work was redundant in some aspects to other work my own colleagues had been working on. In hindsight, I felt if I had spoken up sooner, I think it would not have lead to me leaving Microsoft the first time around. My suspicion on what made me unhappy was simply due to being ignorant about the growing pains in standing up a founding team and working to create something big from scratch. (i.e, clarity isn't achieved immediately)
I moved on, and this is ultimately a career move I deeply regret in retrospective. I should've made it more clear to my manager that my contributions weren't aligning with my interests, and I should've expressed more concerns about some of the initial prioritization in project planning. Instead of addressing the problems through communication, I had chose to run away by finding a different opportunity. I should've handled it better.
Fifth Job - Front (2019 - 2020)
I interviewed at places such as Google, LinkedIn and various other start ups, The one start up that caught my attention in particular was Front. Front is a YC-backed company which specialized in email collaboration. At the time it was a very interesting and novel concept. I found it interesting and pretty delightful to use. In fact, shortly I got hired, I actually linked my personal email account with the client. I was hired as a Full-Stack Software Engineer in the Platform team.
My biggest deliverable during the time was to create an OAuth flow that would integrate Jira and Front applications together, allowing for users to actually create and manage Jira tasks within Front during email composition, and other places. Given that Front's user base tended to be companies with employees performing service work like operations, delivery and IT, it was a cool feature to have, and some customers wouldn't even have to leave the email client to create a Jira ticket.
I also did some other work in contact management, and a few administration features. I joined the company in late 2019, and so you can kind of predict why I didn't deliver more than what I just mentioned...
Two major things happened in my life in 2020.
- COVID-19 pandemic happened
- My daughter was born
Yes, that's a horrible 1-2 combination. Bringing in a newborn into a world where there is a deadly virus roaming around isn't the best scenario I had imagine. At the time when COVID-19 started, my wife was about 8 months pregnant. Interestingly enough, many companies fell into remote mode right away. My company did too at the time, but still, there was a bit of uncertainty.
I had a feeling that the remote work would last a while, but I wasn't sure if it would last long enough for me to feel comfortable about going out and coming back home to my baby. As a result, my priority was to keep my family safe.
I resigned from Front soon after my paternity leave as I had enjoyed just being around at home and doing personal projects. I decided to go on a mini-sabbatical and try my hand with game development. My goal was to have my next job be in games -- thus completing the circle in why I wanted to be a programmer to begin with... to make games.
It's funny, in hindsight, the lockdown and remote work stayed much longer than I had imagined, and by the time it was all safe again, my daughter had already learned how to walk and say her first words!
I made a few game demos on my own time, and then tried to get a game-dev job when I felt I was ready to work again, but ultimately, I decided that I couldn't just get a position in game development with the compensation I wanted to keep my family healthy, and also with the career advancement I was looking for. After some serious thinking, I came to conclusion that I would rather do anything video-game related on "extra time" as opposed to "professional time".
Sixth Job - Microsoft (2020 - 2024)
I decided to go back to Microsoft for another shot with the same team I had left a year earlier. To this day, I joke about this gap as a "really long vacation". Some people who had worked with me outside of my immediate team didn't even realize I had left. I found that to be entertaining for a while. The one nice thing about Microsoft is that if you didn't leave for too long, your previous tenure counts in addition to the current one. So, I celebrated my 5 years of service in 2024.
By the time I had come back to Microsoft, the team had just finished what was started my first time around. Loop Components in Teams was transitioning from being a prototype, to something that would see through to production. I was a part of this effort by taking lead on some of the memory and performance-related problems. I learned a lot about the browser rendering engine, V8 internals, and memory management during this time.
I became an SME in JavaScript performance for my team. My first year back was very productive as I had found a niche of work which my colleagues respected me working within. It became much easier to advocate for work, and things were really good! Sometime in the middle of 2021, I had found myself working more and more within the overall chat app in Teams. I helped fix some difficult issues blocking roll out of a rewritten chat app, and also found my way into working more and more with the rich text editor found in the chat box.
Through a series of events, I found myself becoming the lead developer and architect in rewriting a more modern rich text editing experience in Teams. I spent the next year through 2022 creating a production grade web-based RTE, and ultimately delivered before the end of the year. It was quite an achievement. As a reward for the effort and execution, I was finally promoted from Software Engineer 2 (L62) to Senior Software Engineer (L63). During this year, I found myself being a top committer in the Teams codebase. This would be repeated the following year.
I continued to be the subject matter expert, and leader for the compose area. Eventually finding myself leading 3 other developers. I was promoted once more in 2023 to L64 (still senior) and took more responsibility as the technical lead. The Teams product my RTE was specifically built for "New Teams" finally released to GA, and I had contributed a lot to it. For 2023 my passion was working on Teams. I loved it.
Eventually, I felt it was time to continue my technical journey. After a few years in working with RTEs, I had concluded that it was time for me to make my next move and bring in a whole set of new challenges to the table.
The Present - Netflix (2024 - Present)
After 4 years wrangling with contenteditable
-based rich text editors, I will soon start a new job as a Senior Software Engineer at Netflix. I will be working on UI and will look to solve some interesting problems. Stay tuned. ????
Closing Thoughts, Life Lessons, Etc.
Would I consider luck to have been a factor in where I am today? I would have to answer: of course. A wide variety of things happened in my life that essentially placed me in where I am today. I am very lucky in that I have been able to take every opportunity presented to me so far.
I have been lucky in that:
- Although have been periods in time where I was not in the best family environment. My parents had some issues with each other and it was a distraction for me and my siblings growing up... but when it came to it, they were very supportive of my interests in computers and thus put away their differences to make sure I got what I needed to learn more.
- I naturally have the intense interest in computers and computer hardware. This has made it easy for me to be motivated to understand computers at a (relatively) deeper level than what would be considered "normal". I can spend hours on a topic. I would say this has translated well in my software engineering career in understanding machine-related concepts.
- I have been lucky enough to have great jobs that allowed me to push my limits further. My managers and teammates have always been supportive of me and have always been available to help me grow as an engineer.
- There were times where I had to pivot in huge decisions. The first being my major in college. I had no idea how switching to Computer Science would turn out. All I knew was that I needed to come out with a job by the end of it all to pay off the huge student loan debt I would have accrued after the 4 years in college. It obviously became much more than that.
- To add to that, choosing TSheets over SpaceX was extremely risky at the time. I would be giving up an opportunity to work for an extremely innovative company. In retrospect, this decision forked my career in a direction that has benefited me immensely. TSheets was a place where my skills improved vastly in the short period of time I was there.
- My wife, Alexa is extremely supportive of me, my interests and hobbies. She's allowed me to at free-will, pursue any of my career interests, side projects and studying within reason. She understands the nature of the industry and is always by my side when I need the support. (Thank you for that.)
I would not discount hard work, but I am also realistic in a a lot of aspects. Would I say that it was also pure hard work with no intelligence involved? Probably not. I have a few disclaimers I should probably make and point out. I do not want anyone to interpret my story as a sort of Cinderella, miracle story. Quite away from it, in fact. From this story, there are some things I should probably disclose and should probably be known that have probably given me an advantage throughout my journey:
- I am extremely passionate about technology. I've been obsessed with technology and science since a child.
- I was actually considered to be a very bright student throughout grade school, middle school and did very well in high school. Grades and school were never really an issue.
- I have read many, many books throughout my life. Starting when I first was even able to to read as a kindergartner. I've not gone long without actually not reading a book. I think it has helped me learn and improve some of my communication skills.
- I found my learning style early on in life and have been using it to my advantage when it comes to studying for things.
I think being successful at programming and successful in what society thinks "at a professional level" are exclusive to one another. I've learned that you can be a great programmer, but fail miserably as a professional programmer at some corporate entity. I think there's an interesting combination in understanding the business that you're in and identifying what the real problems are and shooting to solve those as opposed to solving problems you would think are problems. Anyway, I am not 100% sure on this, and it's more empirical and based on feel... So, all I know is that a combination of all has helped me get to where I am today.
There are also some things we can and cannot control. What should I tell a person who does not have a loved one who supports them? Don't love them? No, that's not right. How about a person who grew up in a rural area with no convenient access to technology? Should I then say they should've moved elsewhere with more accessibility to technology? Of course not. There are things out of our control and reach that no matter what we do, we cannot avoid. The best thing I can say here is just give something you are even interested in a shot. Whatever obstacles that may hinder you and your progress, take each failure, write it down, learn from it and start fresh. Be stubborn, fail, learn and repeat. Reflection here is the important part because it allows you to learn and repeat. Repeating without learning is just doing the same thing over and over again which already doesn't work. That's no good. So make sure to reflect! You'll find that maybe you'll fail less. I know I failed less by not giving up and reflecting each time.
I think the main thing to take away from all this is that you will never know where your life is going to end up. I had almost trained myself to think that I would never become a great programmer. It was because I refused to completely give up that the simple decision to be stubborn and hope that one day the material would "stick" by just working hard at it actually paid off. As cliche as it sounds, by not giving up, I eventually learned enough about myself, the situation and environment that things were finally able to "click".
I had spent a lot of previous attempts in learning to code always comparing myself to what others would be able to do that I never looked back at my own growth. But after writing all this out, I realized that each time I fell and stood back up, I had actually improved and matured in many ways unrelated to programming. However, it was because I was too distracted with failing that I never saw this important detail. I am glad however, that I eventually did given all that time -- even if, unintentionally.
I still have much to learn. We are never better than anyone else -- we are never perfect. We make mistakes and we don't know things that others do. The simple fact is that no matter how far we come, there is always something to learn... either from someone or somewhere. Stay humble and always be willing to empty your glass and let someone else fill it up with something that can potentially be better.
What matters most is if you yourself have improved over the course of time. Always take time to self-reflect and see how far you've come. Respect your progress and respect the pace. That's what matters. Personal growth and self-awareness is what I am now striving for myself, and this is the best advice I can give for anyone who wants to go into software.
Others
I have had a few acquaintances and former co-workers tell me a little about their stories for inspiration. Here are some of the experiences they shared:
Harman Goei
Harman is a Staff Engineer at CrunchyRoll. Here's his story!
https://hrgui.dev/posts/my-journey/
Jamie Garrett
LinkedIn: https://www.linkedin.com/in/jamie-garrett-3027a11/
We had a 486 PC when I was in high school. I loved working with it, and even installed a super fast 33.6 Kbps modem, complete with onboard COM port switches. The 5.25 floppy disk games were awesome! The Nightmare on Elm Street was my favorite. This is the reason I chose a CIS degree in college.
Installing a 33.6 Kbps modem was a fun challenge. You have to first install the drivers, and then manually set your COM ports by switching the onboard device switches, as well as setting the device settings in Windows to match the same port settings as your switches. As long as the COM port isn't currently used by another device, you are golden! (e.g. never use COM port 2 as that is typically reserved for the mouse)
In college, I found there weren't many other peers who knew how to build or install systems. In fact, most didn't even know what the Windows registry was. However, the dot com bubble started when I was in college and not everyone grew up owning a computer. My career path was Business IT Management, and we were required to take two programming electives. Once I took my first software development class, I was hooked. I loved the challenge! My first program I developed was a monopoly style game written in VB. I chose more electives in software development because you couldn't easily Google your way through it. The best project I completed in school was creating an eCommerce website for a local company.
To be honest, I just love science in general and I took physics, chemistry, and astrology classes just for fun. I chose a software development internship during my senior year and the rest is history!