If you're seeking insights on how to become a software architect, look no further. Rather than spending another day as an average software engineer, allow me to guide you step by step on your journey to becoming a software architect.
While software architecture can vary slightly from one company to another, the core skills required remain consistent. Hence, in this post, I aim to demystify what software architecture entails and how you can excel in this field.
I want to start out with some background knowledge on what is software architecture and who are software architects.
Breaking into Software Architecture (Step by Step)
What is Software Architecture?
Defining software architecture (SA) isn't a straightforward task, given that it operates at a high level of abstraction and often seems to encompass "the things you can't google". Despite its nebulous nature, I tend to think of software architecture as system design. Traditionally, it's less concerned with implementation details and more focused on overall design.
Why are software architects (SAs) generally more senior and receive higher compensation? This is largely because decisions made at the design level carry significant consequences. A case in point could be the selection of a programming language for a project.
Typically, people are not hired directly as SAs. Instead, this responsibility is usually entrusted to Senior and Staff+ level engineers, due to their extensive experience and expertise.
What kind of decisions do Software Architects Make?
Software architects determine how and why a system will be built in a certain way, always keeping the requirements at the heart of the design process. For example, when choosing a programming language, it's a crucial decision. If a system requires high performance and multithreading, interpreted languages like Python wouldn't be the strongest choice. Instead, Rust, C, or Java could be potential options. The role of an SA often involves managing tradeoffs and understanding the pros and cons of the technologies under consideration. Another common tradeoff in SA involves data patterns, such as streaming versus batching. Here's a useful graphic from ServerlessLand:
Typically, streaming is employed when near real-time or low latency requirements are present, while batching serves well in most other cases due to its cost-effectiveness and simplicity.
Software Architecture can be thought of as the blueprint for implementation. This is why design decisions hold significant weight - if the design is flawed, the implementation is doomed.
Software Architecture Background
Here is the bad news. Generally, no one is looking for SAs with little experience. SA is a job type that one needs some experience for to be impactful at. Generally, the job function of SA is taken by your Senior and Staff+ level engineers. Here are the prerequisite steps:
Step 1: Develop a Strong Foundation in Software Engineering:
Start by acquiring a bachelor's degree in computer science, or STEM related field. Develop a strong foundation in programming, algorithms, data structures, operating systems, and databases. Practical programming experience, through internships or open source contributions, is required.
Step 2: Gain Real-world Experience:
Work as a software engineer to understand the challenges that come with developing and maintaining software. This experience will expose you to different software development methodologies and tools, help you understand the business and user perspective, and teach you about software quality and testing.
Gaining experience allows you to develop perspective and form opinions on what strategies work, what approaches fail, and which practices you want to avoid throughout your career. You'll observe both successful and failed projects, and from these experiences, you'll begin to define your professional identity and establish your core competencies.
Long-term ownership of software and systems is a critical skill that many professionals overlook. The trend among younger professionals to change jobs every 3-4 years can deprive them of grappling with the tradeoffs of long-term software ownership. An engineer should experience the impacts of their decisions 5-10 years down the line, especially when paradigms shift or new technologies emerge. This is where consultants often fall short, as they typically lack the perspective that comes with long-term ownership thinking.
The transition from a software engineer to a SA or a staff+ engineer generally requires substantial industry experience and a deep understanding of multiple aspects of software development. There's no set timeline for when one can make this transition as it largely depends on the individual's talent.
However, on average, it typically takes between 5 to 10 years of experience in software development roles for someone to transition into a SA or staff+ engineer position. During this time, one would ideally gain experience with various software projects, systems design, various technologies, programming languages, and gain insights into business and user needs.
Remember, it's not just about the number of years of experience. What's crucial is the breadth and depth of the experience during this time. Working on different kinds of projects, exposure to various parts of the software development lifecycle, understanding how to work with different teams and stakeholders, and solving complex problems are all vital to gaining a breadth of experience.
Step 3: Gaining a Breadth of Experience
SAs need several years of experience to create perspective
Software architects are tasked with making pivotal decisions that influence the entire direction of a software project. This includes choices on system design, technology stack, and identifying potential risks and mitigation strategies. To effectively navigate these responsibilities, they need a broad and deep understanding of multiple facets of software engineering. This breadth of knowledge typically comes with several years of hands-on experience working on a range of projects, using various technologies, and encountering a variety of challenges.
Experience over time allows architects to comprehend the larger picture of software development, from the granular coding level up to the high-level strategic planning. It also provides them with insights into the inherent trade-offs that come with different design choices. They understand, for instance, that choosing a particular programming language or database technology might boost performance but limit scalability, or vice versa. Therefore, their accumulated years of experience aren't just about technical skills, but also about gaining perspective, understanding nuances, and being able to make informed decisions that balance immediate needs with long-term project goals.
Step 4: Master Relevant Technologies and Patterns:
Software Architects (SAs) must be proficient in multiple technologies, languages, and frameworks. They should learn various programming languages (like Java, Python, C#, etc.) and achieve mastery in at least one. While the role of an SA often includes less coding than other software engineering roles, maintaining proficiency or mastery in a language is still essential for the occasional development work they need to undertake.
Understanding architectural patterns (such as Micro-Frontends, Microservices, etc.), databases, and software infrastructure is crucial. SAs are typically responsible for the primary decisions surrounding the use of design patterns. They assess the tradeoffs of each pattern and choose the one that best aligns with their goals or meets specific requirements.
A solid grasp of cloud technologies (like AWS, Azure, or GCP) is also a necessity in today's tech landscape, as the vast majority of firms operate their infrastructure on a cloud platform. SAs must have at least a fundamental understanding of how to integrate various services to establish a design pattern, ultimately leading to the creation of a product. This is typically another domain that falls under the responsibility of the SA.
Step 5: Start Taking on Architectural Responsibilities:
As an early career engineer looking to grow, it is paramount that you seize opportunities to engage in tasks that involve system design or architectural decisions. These tasks provide invaluable hands-on experience, granting you an in-depth understanding of the intricacies involved in architecting a system from the ground up. They enable you to see firsthand the multitude of factors that must be taken into account, such as scalability, security, cost, and the interplay of different technologies and systems.
I had an old friend of mine who always said “Do not wait for the work that you want to appear, invent the opportunity you want for yourself”. Meaning you need to actively be creating the work you need to progress to the next level.
Working directly on these aspects not only broadens your technical expertise but also helps cultivate essential skills like problem-solving, strategic thinking, and communication. You learn how to balance immediate coding tasks with long-term strategic considerations, how to analyze trade-offs, and how to articulate your decisions to both technical and non-technical stakeholders.
Additionally, shadowing experienced architects in your organization can offer a wealth of insights. You'll observe how they navigate complex architectural challenges, manage stakeholder expectations, and adapt to unforeseen issues. Pay close attention to their decision-making processes: how do they evaluate different options? How do they mitigate risks? How do they balance business requirements with technological capabilities?
Gradually, as your understanding deepens, start making architectural decisions yourself. Begin with smaller decisions and progressively take on more significant ones as you gain confidence and expertise. This process of learning, observing, and gradually taking on more responsibilities is an effective strategy to transition from a software engineer to a software architect or staff+ engineer.
Step 6 Apply for Jobs
You should be targeting Sr or Staff level engineering openings. If you need resume help or similar DM me on twitter/x/ @bowtiedcelt.
Conclusion
Navigating the transition from a software engineer to a software architect isn't an overnight process but rather a journey that requires dedication, learning, and a deep understanding of multiple aspects of software development. The steps detailed in this post provide a roadmap for this journey, from the necessity of acquiring a robust foundation in software engineering to the need for gaining real-world experience and understanding the intricate trade-offs in long-term software ownership.
This journey doesn't stop with mastery in various programming languages, technologies, and architectural patterns. Instead, it involves taking on tasks related to system design, actively creating the work you aspire to do, and gradually stepping into the role of a decision-maker. As your technical skills expand, your ability to manage complex architectural challenges, evaluate different options, and articulate your decisions becomes a key part of your professional growth.
The role of a software architect is not for everyone; it requires a blend of technical proficiency, strategic thinking, and a deep understanding of the bigger picture of software development. However, if you are determined and willing to invest the time and effort, the path to becoming a software architect is a rewarding and fulfilling career journey.
-celt