Becoming a Senior Software Engineer or Architect: Essential Traits and Tips
Essential Qualities to Develop for Advancing as a Senior Software Engineer and Architect
In this post, you will learn about the traits required to be considered a Senior Software Engineer (also applicable to Senior Software/Solution/Security/Infrastructure/Other Architects). My aim is not to be exhaustive but to explain these traits in a general and easy-to-understand way.
There is ample literature on this topic. Recently, I read “The Software Engineer’s Guidebook”, which I highly recommend if you are interested in learning more about this topic.
From both literature and experience, I have learned that, as juniors, we often expect to work in isolation, and some might even prefer it. However, as we gain experience, we realize the necessity of working with others to build something greater. Teamwork is crucial for achieving significant goals.
Achieving great goals comes at a cost, and companies have limited resources. Therefore, we must prioritize and focus on the most valuable goals that have a greater impact on the business. Teams that build these solutions consist of individuals with the knowledge to make better decisions and trade-offs. These decisions are usually made by seniors with accountability and ownership.
These teams are not composed solely of seniors; it is common to find juniors within them. These less experienced professionals require mentorship from seniors to improve their skills and ensure tasks are executed correctly (please, do not confuse this with micromanagement).
The Four Cardinal Points
Overall, we can abstract from the previous paragraphs these qualities required by every Senior Software Engineer:
Teamwork
Hard and Soft Skills
Leadership
Prioritization by business value
These qualities can be thought of as "The Four Cardinal Points." Just as the cardinal points guide us in the right direction, these traits are essential for navigating and advancing in your career. I know these are broad viewpoints, as I mentioned in the first paragraph, but I think this abstraction makes them easier to understand. Let’s dive a little deeper into each.
Teamwork
One person usually sees only a few viewpoints. For instance, UX designers are primarily concerned with user interactions and the impact of every color and UI component on the user experience. They might not be as concerned with performance, data protection, or the effort required to implement a feature. This is why modern teams are interdisciplinary, composed of programmers (both frontend and backend), designers, architects, product owners, quality assurance professionals, and more. Each person adds value and perspective to the work, ensuring better deliveries by covering more viewpoints and scenarios that the solution must address.
Recently, I learned about a case where an Engineering Manager often made decisions without considering the ideas or comments of other team members. In one project, this Manager made a decision with the best intentions, but it introduced a security vulnerability. When the team discovered this, they researched and proposed a better alternative. After several attempts to convince the Manager to consider the new information, the Manager fortunately reconsidered and decided to adopt the improved solution.
This example illustrates the importance of teamwork and collaboration. By leveraging the diverse expertise of team members, we can identify potential issues early and develop more robust solutions.
One can acquire and improve this quality through practice. Exercises like pair/mob programming, code reviews, debating ideas, and requesting/giving feedback will help you to progress in your career to a senior level.
Hard and Soft Skills
Senior Software Engineers need to make decisions, propose solutions, and listen to other opinions. To achieve this, they must have knowledge and experience in various technologies, methodologies, collaborative work, and more.
For instance, a modern Software Engineer should be familiar with OAuth, JWT, Architecture Patterns, Design Patterns, Cloud, CI/CD, etc. However, the ability to determine which of these tools to use in a specific situation is a crucial skill that every Senior must possess.
Of course, it's not just about technical skills. Six years ago, I joined a new project as a Software Architect, in a hybrid role with Engineering Manager responsibilities. In my team, there was a Tech Lead with an excellent background whom I trusted for the project's success. However, I noticed that although his work was outstanding, he was aggressive towards me, especially when I proposed ideas to the team.
This was the first time I encountered such a situation, and I didn't know how to handle it. I sought advice from other Seniors on how to manage it effectively. I didn't want to exclude this person from the team because he was an expert and passionate about his work, which was beneficial for the project. However, his aggressive behavior began to negatively affect team dynamics. Fortunately, with the guidance I received, I was able to address the situation and improve the team's collaboration.
As we can see, being a great technical engineer is not enough. We must also know how to communicate and collaborate with others to excel in our roles. As Seniors, we must address these challenges and help others develop these essential skills.
Leadership
Everyone starts as a junior, and as we work and experience different situations, we grow in our careers. This evolution process is different for each person. As Seniors, we have the responsibility to train and mentor juniors to make them better for the company. This benefits not only the company but also the Seniors and Juniors involved.
Companies' products are built by their teams. If the engineers are skilled, they will build better solutions and deliver more value to the business. On the other hand, when a Senior teaches, their own abilities are enhanced, and they often gain new knowledge from the process. Additionally, the juniors who receive this mentorship can progress in their careers to become Seniors. It’s a win-win situation.
Leadership is about influencing people, not just holding a title. It involves influencing others for the benefit of the individuals affected and the company’s mission. There are many books on this subject, but my focus is on the ability of Seniors to positively influence others. Writing blogs, teaching and mentoring juniors, listening to people, receiving feedback, knowing your team, feeling genuine empathy, building real connections, and collaborating to create a great environment are ways to develop and demonstrate leadership.
One of my favorite books that taught me how to begin being a leader is “The Leader Who Had No Title.” I strongly recommend it if you are interested in improving this ability.
Prioritization by business value
As software engineers, especially as seniors, we must always keep in mind the business value we are delivering. This focus helps us prioritize tasks and make better decisions.
Great senior software engineers usually make decisions rationally and pragmatically. This approach sometimes involves assuming technical debt to take advantage of time-to-market opportunities or validate an idea. At times, it may also mean discarding features, reducing scope, or delivering something more critical for the company at that moment.
We need to be flexible enough to accept changes over time because contexts and situations evolve, requiring us to reprioritize and make new decisions swiftly.
The following steps are those I usually follow in my daily work that help me to prioritize:
List tasks: Write down everything you need to do.
Identify value: Mark the tasks that will deliver the most value when completed. If unsure about the value, seek help.
Prioritize: Ask yourself, "If I could only complete one task from this list, what would it be?"
Focus: Start and concentrate on that most important task.
These tools and practices have also helped me:
Request For Comments (RFC): This helps us get feedback from other team members, considering the pros and cons of a solution. It enables better decision-making based on data.
Attribute-Driven Design (ADD): This methodology helps design solutions by making decisions based on the most critical factors.
Quality Attribute Workshops (QAWs): These workshops help gather information about the quality attributes required for the solution or product.
Conclusion
In summary, to be considered a Senior Software Engineer or Architect, one must develop and master four key qualities, referred to as "The Four Cardinal Points":
Teamwork
Hard and Soft Skills
Leadership
Prioritization by Business Value
These qualities guide and support a Senior Engineer in navigating their role and driving success for themselves and their teams. By focusing on these Four Cardinal Points, you can advance your career and make a significant impact in your projects.
Thank you for reading. I hope you found this post insightful and helpful in your professional development. I invite you to share your thoughts and experiences. What qualities do you think are essential for a Senior Software Engineer? Let’s discuss in the comments!