Become a better software engineer

Last week, I had the pleasure of representing Zen8Labs to deliver a speech at Fortna, a major global player in the warehouse and logistics industry. The topic of my speech was “become a better software engineer”, and I structured it into three parts:

  1. Why every software engineer should strive for improvement?
  2. What they should learn continuously?
  3. How they learn it?

Are you interested in this topic? In just 10 minutes of reading, you can gain valuable insights to help both software engineers enhance their careers and engineering managers support their team members in their professional growth. You can access the full presentation here.

Ready?

Why a software engineer should learn every single day?

I have observed and engaged in discussions with thousands of software engineers, and I’ve identified three key motivations that drive them to continually acquire new knowledge:

  1. Passion: Many engineers derive deep satisfaction from problem-solving, system design, and coding. For them, the joy of resolving issues is addictive. They constantly seek new challenges and, in the process, engage in research and learning. For these individuals, learning is an intrinsic part of their nature.
  2. Ambition: Some software engineers harbor ambitious goals, such as creating a product that serves billions in their daily lives, making a global impact, or attaining prominent roles like a tech-lead or CTO in a major corporation. Learning is their pathway to expertise.
  3. Fear: In an industry where technology evolves rapidly and sees a constant influx of new engineers year after year, there’s a widespread consensus that failing to keep learning can lead to obsolescence. This fear has grown more pronounced, especially due to recent trends of layoffs.

Do your motivations align with one of these three? Or do you have another driving force?

What software engineer should learn every single day?

“Yes, I should learn. I want to learn. But what should I learn?” These are common questions I’ve encountered in my discussions with software engineers. Many engineers often find themselves struggling to identify suitable learning topics, and as a result, they tend to limit their learning to what is required for their jobs (passive learning) rather than actively guiding their own learning (active learning).

Developing a career is akin to navigating with a map. Firstly, we must define our destination, which might include future roles like senior software engineer, CTO, CPO, and more. Secondly, it’s crucial to assess where we currently stand in terms of our knowledge, skills, and career progress. Based on my extensive experience with hundreds of interviews, I’ve found that understanding where we currently stand is a major challenge for software engineers. Some tend to underestimate their abilities, while others overestimate themselves. For instance, some claim to be qualified for team-lead positions but struggle to clearly articulate problems and solutions. Effective communication skills are essential for any team lead. Understanding where we are in our career journey is of utmost importance. Lastly, we need a map to guide us from our starting point to our destination.

So, what does this map entail? To me, it comprises four key areas:

  1. Software Engineering: Undoubtedly, this is the most critical area encompassing programming, technology, frameworks, platform knowledge, problem-solving, and tooling… skills.
  2. Domain Knowledge: Software engineers are problem solvers. A proficient software engineer can seamlessly integrate their software engineering knowledge with industry-specific expertise in areas such as ERP, e-commerce, warehousing, e-learning, or operating systems, networking, or development environments… I firmly believe that no one can be considered a senior engineer if they haven’t mastered at least one domain, as the true test of seniority lies in the ability to tackle substantial real-world problems.
  3. Working Professional: This area focuses on how an engineer operates both independently and within teams, encompassing skills like time management, collaboration, planning, continuous learning, and community participation.
  4. Leadership: Leadership skills encompass the ability to influence others through serving, mentoring, coaching, and visioning. These skills are instrumental in career growth.

The choice of areas to enhance should align with your career destination. For instance, if you aspire to become a team-lead, prioritizing leadership development is crucial. However, if your goal is to remain an individual contributor, working professionalism remains important. If you aim to ascend beyond a senior position, then strengthening your skills in all these areas becomes imperative.

Now, delving into the realm of software engineering, we can identify four essential components:

  1. Programming: This entails mastering programming languages, platforms, and frameworks, as they are the direct tools that enable us to solve problems effectively.
  2. Data structure & algorithm: Often perceived as technical jargon, these are the foundational elements of problem-solving. Although they may be indirect tools, they significantly enhance the effectiveness of our solutions.
  3. Engineering: This involves understanding how computers and networks operate, familiarity with design patterns, architecture patterns, security measures, and compliance standards… Proficiency in these areas ensures we solve problems correctly and efficiently.
  4. Process: In today’s collaborative work environments, no one builds software in isolation. Therefore, it’s essential to comprehend how teams work together and the underlying processes that facilitate their collaboration.

How software engineer learn every single day?

This concept is central to my book, DevUP, which is aimed at software engineers and was published in 2020. The book introduces a framework for the career development of software engineers, incorporating a visual framework consisting of the following components:

Dilemmas

To advance our careers as software engineers, we must grapple with the dilemmas facing both ourselves and our organizations, be it a team or a company. In my advisory role, I often field questions such as, “should I work for a startup or an enterprise?” or “should we prioritize clean code or opt for a quick-and-dirty approach?” or “should we organize our teams by functionalities, domains, or tech stacks?”. Drawing from my experiences working in both startups and enterprises, in Vietnam and abroad, I can affirm that each environment and solution comes with its unique set of advantages and disadvantages. For instance, choosing a startup environment offers fewer boundaries and allows software engineers to participate in various aspects of the product development lifecycle. However, it might offer fewer opportunities to work on larger systems. While clean code is generally appreciated, its value diminishes if a product cannot be released on time, missing out on market opportunities. Organizations seek loyal employees, but how can they achieve this if engineers change jobs frequently? In reality, good engineers are often seeking career clarity from their organizations. It’s a dilemma that necessitates mutual understanding from both sides.

Experiments

Knowledge arises from grasping facts and dilemmas, but engineers need practical experience. Experiences are gleaned through active experiments. I strongly advocate that software engineers engage in experimentation across 6 levels, from elements they have complete control over to those they can influence, ranging from small code segments to the broader work environment.

Valuation

Experiments are invaluable, but only if we extract lessons from them. After each active experiment, it is essential to evaluate the results to accumulate knowledge, skills, and progress along the career ladder. A substantial debate in the software industry revolves around understanding the differences between junior, intermediate, and senior engineers and determining how an engineer accurately positions themselves within these ranks. This self-valuation process can be based on market standards, peer feedback, and organizational recognition. I recommend a method that enables every engineer to assess themselves against these benchmarks.

Unlearn

In the learning journey, unlearning is a pivotal phase. Everyone carries past experiences and ideas, but through valuations derived from new experiments, we can refine our prior knowledge and embrace fresh ideas. This process is referred to as a systemic (un)learning cycle.

Performance

Ultimately, a software engineer delivers results, not just knowledge. Every software engineer requires a clear approach to translate their knowledge into performance, incorporating industry standards, technical skills, and soft skills.

Is it enough?

While DevUP offers a well-defined framework for advancing a software engineer’s career, a fundamental question persists: Why should a software engineer embrace an improvement framework like DevUP? Let’s revisit the answers provided in the initial question, Why should a software engineer learn every single day?: passion, ambition, and fear.

But is this enough? In my observation, there’s a flaw in each of these motivations:

  1. Passion: While passion is a perfect instinctive motivator, it’s not a universal driving force. In reality, fewer than 1% of individuals are solely driven by passion. For most people, their hobbies may be misconstrued as passion, and hobbies don’t necessarily offer solace in challenging situations.
  2. Ambition: Similarly, not every software engineer harbors ambitious goals.
  3. Fear: While fear can be a catalyst in difficult circumstances, it doesn’t sustain motivation in favorable conditions.

Ultimately, what endures as a lasting source of motivation is meaning. Software engineers can find meaning in their work and life through various avenues: the satisfaction of users benefiting from their products in daily life, the quality code they contribute to their organizations, the success of their colleagues whom they support, or simply helping others with their knowledge or resources. For instance, personally, I consider myself fortunate. I’ve put in hard work, and I continue to do so, but there are individuals who work even harder yet earn less than me. Why is this the case? It’s largely due to my good fortune in being part of the IT industry, which has experienced substantial growth recently, affording me more benefits than others. I feel a responsibility to assist others; it gives meaning to my life. That’s why I strive to improve every day, to earn more every day, and to be in a position to help more people every day.

Have you discovered your own sense of meaning?

I’m delighted to see my colleagues at Zen8Labs persist in writing high-quality articles for this blog. They are driven by a desire to share their knowledge with the community, enabling others to save time by learning from their successes and failures. They have found their meaning, and they are making a positive impact!

And you?

Hien Nguyen, Co-founder & CEO