Some time in spring this year, I went to UCLA to recruit interns. While I was there, I gave a talk which ended up attracting quite a few interns working with me. Some people really enjoyed the talk so I decided to clean up my notes and publish them here. Hopefully, you will find it useful, too.
Many years ago, there was a college kid who was interested in an internship position at a tech startup. So he was invited for an in person interview. Bear in mind, this was all pre-pandemic. He showed up a little bit late, which is frowned upon. And he was wearing a large oversize suit, which I think belonged to his dad, a bright red tie and a pair of white socks. He was asked to implement a Fibonacci number generator. Initially, he was obviously nervous. Basically, he froze with the marker pen in his pen, with his ass facing the interviewer the whole time. But over time he became more and more confident as hints were given. He then met the CEO in his final interview and he was able to clearly articulate his passion in technology. That summer, he did a wonderful project that brought real business impact to the company. The company actually went public shortly after. Fast forward a few years, he got a job as a software engineer right after he graduated.
The career path that I have just described in that story is not uncommon among students who are pursuing a computer science or equivalent technical degree. However, not everyone ends up at the same destination, some people do take longer to get to where they want to be and sometimes people give up too. I am sure many of you are reading this because you want to learn the secrets of how to be successful as a software engineer. Maybe you wonder if you could hack it so that you can skip detours and eliminate unnecessary steps in reaching your goal. The answer is yes!
Having been in technology leadership for almost 24 years, I have worked with nearly a thousand engineers, both directly and indirectly, since the beginning of my career. I am beginning to see a pattern among software engineers who are successful. This pattern is observed time and time again, and the success rate is highly predictable.
Let’s dive right in. Let me break this down into the What, the How and the Why. What exactly does a software engineer’s career path look like? Knowing what it is would make hacking a lot easier. And how to go about hacking this and finally understanding the why for doing all of this would be important as well.
So what exactly does a software engineer do? That’s really a loaded question. Some people say, “Oh, they write code.” But that’s a very simplistic way to look at it. I would like to examine this through the lens of a metamorphosis. So what does that mean? Like a butterfly, a software engineer goes through a 4 giant transformation. Each time when an engineer transforms, they become a totally different person and the impact of their abilities often increases exponentially.
The life cycle of an engineer begins with Learner. Learner is someone who has been just introduced to the world of software either through informal means or more formal means. Informal means would involve taking a self-paced online course on Cousera, building a crypto miner with GPUs, or hacking around a video game. On the other hand, a more formal means would involve taking a software bootcamp class or pursuing a technology degree. In either case, a Learner is able to write a script or compile code, mostly for educational or entertainment purposes. More often than not, a Learner typically writes code at this stage on his own. Age doesn’t play an important role, you can be 5 or 50 years old to be a Learner. However, starting early has its advantages. Bill Gates wrote his first video game at the age of 15. Co-founder of Apple, Steve Wozniak, also started early. According to Stack Overflow’s 2020 Developers survey, over 54 percent of professional developers wrote their first line of code by the time they turned 16. This goes to show being exposed to the concept and actual implementation of software engineering early on has huge benefits to career development.
At some point, a Learner becomes a Builder when they start writing code in a professional setting. This setting usually starts with some type of internship and then eventually a full time position at a tech company. Some people enjoy and thrive in a startup setting but others perform better in a corporate environment. Regardless, this would be the first time a software engineer starts to work in teams. So learning to use tools like GIT, a version control tool, in a team environment would be critical. Their code also often gets peer reviewed through the process of a pull request. Sometimes, some Builders begin to participate in open source projects, either through their work projects or personal projects. These often are excellent opportunities to become a contributor to productivity software used by millions world wide. Did you know that Linux has 27.8 million lines of code and nearly 5000 contributors in 2020? And most of them did not even get paid for those open source contributions. At this stage, this is where software engineers really cut their teeth in their craft.
Typically 5 to 10 years into the profession, a Learner then becomes an Architect. An architect is a software expert who makes high-level design choices and dictates technical standards, including software coding standards, tools, and platforms. This person typically has broad and deep technical experience, usually very knowledgeable on 2 or more programming languages and major software platforms. Aside from the hardcore technical skills, he is also a master communicator who excels in both verbal and written communications. It would not be surprising to find an Architect who would sometimes take on the role of a team lead, working with a group of entry-level or intermediate engineers. I would highlight that some of the technical decisions made by an Architect at this stage could have a profound financial impact on companies. Sometimes it is life or death for smaller companies or it is a matter of costing millions for corporations.Can you see that a software engineer becomes more and more impactful as they go through these different stages?
The final stage of the life cycle of a software engineer is Leader. A technology leader is someone who has a grand vision about the future and is capable of inspiring other technology fellows in pursuit of a technological advancement that can reshape humanity. You may have guessed it by now – these are visionaries, dreamers and disruptors in technology today – most famously, Elon Musk of Tesla/SpaceX, Mark Zuckerberg of Meta, Jeff Bezos of Amazon. Their in-depth technical knowledge made them formidable among non-tech peers in today’s technology businesses. Because they know the tech as they think business strategies, make decisions and scale their businesses.
So we spoke about the what, let’s look at the how.
Get ready for a lifetime of learning. After 24 years in the business, I feel like every 3 months knowledge I have acquired becomes obsolete just like that. Everything in the software world changes incredibly fast. If you want to do well and accelerate your career life cycle, you need to be a committed learner.
Be open to new programming languages but hone in onto the ones that you like.
Many junior engineers often ask, “what programming language or framework should I learn?” It is easy to get wildly excited when you see so many choices out there. I like to use the Vegas buffet analogy when it comes to this. The best strategy is to sample everything before you feast on it. Don’t stuff yourself with pizza when there is steak, sashimi and lobster at the end of the table. Take a few rounds before you zero in..
Best software engineers think like designers.
Great software engineers think deeply about the user experience of their code. They might not think about it in those terms, but whether it is an external API, programmatic API, user interface, protocol, or any other interface; great engineers consider who will be using it, why it will be used, how it will be used, and what is important to those users, what might be the naming convention for things. A good software engineer must step into other people’s shoes so don’t bring your ego to work.
If you don’t have a good grasp on the universe of what’s possible, you can’t design a good system. Many years ago, I worked for a Fortune 200 company. They had all the resources in the world to deliver a system. However, this project suffered numerous launch delays and terrible performance problems. Why? The system architect insisted on building their own data centers when AWS was becoming popular. They picked an obscure frontend framework called Silverlight, which has been discontinued. The architect in this project did not understand the implications of his decisions on the solution framework as a result the project failed to achieve its full potential. Keeping up with the developer ecosystem is time consuming but it is nevertheless a responsibility you can’t avoid. Without the details of what is possible, it is not possible to deliver the right solution that can scale.
The best code is no code, or code you don’t have to maintain
Years ago when I was a less experienced tech lead, I wanted my team to build everything. And so we did. It felt good to know how to build something but maintaining it is a nightmare and it didn’t help the business valuation.
Most software engineers are always going to err on the side of writing code, especially when a non-technical solution isn’t obvious. Engineering teams are dying to reinvent the wheel, when lots of wheels already exist. This is a balancing act, there are lots of reasons to grow your own, but one must do build-vs-buy analysis from time to time.
Low frequency hacks, instead of high
In my career as a fintech leader, I have witnessed a lot of cybercrimes. The most innocent-looking yet effective hacking against a password protected website is these low-frequency password guessing scripts. They hit your server every other hour and rotate the IP address. Same thing should be applied to your tactics in general. You can’t be a good software engineer overnight. Perfect your craft, a little at a time over a long period then you will definitely get somewhere. Practice makes perfect.
Ok, we’ve talked about the how, now let’s look at the why.
The why sits at the center of everything. Because it is going to drive your motivation for doing the how and what. This is the stuff that will keep you going when going gets rough. If your motivation is just making a big salary, then I am sorry this is probably not going to work because there are other jobs that generate income more efficiently than working as a software engineer. You should think of it as making big bucks is simply a result of being good at your job.
Before you go down this career, think about the things that excite you and get you up in the morning. Start developing a passion early on in your career and explore the ever expanding universe of computer science. Ask yourself why constantly because it can change from time to time as you go through different life stages. And remember, it is ok to be different from others since everyone has their own preference. For some people, they want to disrupt something and turn an industry upside down. On the other hand, some may just work in a big tech company like Google, Meta, Amazon and climb the corporate ladder and enjoy the perks. Both are equally good reasons to want to be a software engineer. You just need to discover for yourself.
I want to continue the boy’s story from the beginning. The boy wasn’t so lucky after graduation actually. When a global financial crisis hit, he was then laid off from his first full time job ever. He took some time off and decided to apply his technical skills in his parent’s family business. That was an interesting detour. While he was successful at doing it, he longed for a big corporate R&D environment so that he could continue to explore other areas of the technology field. With that motivation, he found new opportunities in big global companies, became a tech lead and got to travel and live internationally early in his career. Just as he thought he was at the height of his career, he had some setbacks. He got into a CS PhD program but realized that academia wasn’t really for him. So he returned to the corporate world. But after a while, he felt out of place because he was bored. So he co-founded a startup with some people he thought he could trust, but before he knew it he was ousted from the executive suite. He was too naive. But every time he fell down, he would dust off his clothes and get up again. And that was exactly his metamorphosis – at every stage – he would become stronger, more impactful and a little wiser too. Why does he keep going? At one point in his mid career, he realized that the purpose in his life had always been to free people from mundane, repetitive, boring tasks by leveraging technology. So, where is this gentleman today? This person is none other but yours truly. I am the living proof that a good career is possible for everyone reading this today. What I presented to you is just a version of it, you have all the power in the world to design your career that fits you by doing what you love. Go out there and hack away!