How to Develop Systems Thinking in the Age of AI (Part 2)

Table of contents
- Start by Reverse Engineering Great Systems
- Practice Trade-off Analysis Daily
- Learn to Think in Abstractions
- Study Failure Modes and Post-Mortems
- Build Mental Models for System Behavior
- Practice Constraint-Driven Design
- Think in Multiple Time Horizons
- Develop a Technology Evaluation Framework
- Embrace AI as Your Research Assistant
- Learn from Open Source Architecture
- The Mindset Shift: From Feature Builder to System Designer
- Practice Architectural Communication
- Start Small, Think Big
- The Compound Effect
- Conclusion: The Journey from Coder to Architect

In Part 1, I argued that the most valuable skill in our AI-driven world isn't writing code—it's architecting systems. The response was overwhelming. Developers from around the world reached out asking the same question: "I'm convinced, but how do I actually develop these skills?"
This isn't a trivial question. Traditional computer science education focuses heavily on algorithms and implementation, while most coding bootcamps teach you to build features, not systems. Meanwhile, AI has accelerated the timeline for developing architectural thinking from "nice to have someday" to "essential for survival."
The good news? Systems thinking can be learned, and AI itself can be a powerful tool in that learning process. Here's how to make the transition from implementer to architect.
Start by Reverse Engineering Great Systems
The fastest way to develop architectural intuition is to study systems that have stood the test of time and scale. But don't just read documentation—actively reverse engineer their design decisions.
Pick a system you use regularly: Netflix, Slack, GitHub, or Spotify. Ask yourself: Why did they architect it this way? What constraints led to these decisions? Use AI to help you explore these questions. You might prompt ChatGPT with: "Analyze Netflix's microservices architecture. What problems were they solving that led to this design, and what trade-offs did they make?"
The key is moving beyond "how it works" to "why it was designed this way." Every architectural decision is a response to specific constraints—user scale, team size, consistency requirements, performance needs. Learning to identify these constraints and their solutions builds your pattern recognition.
Take GitHub's pull request system as an example. On the surface, it's just a code review tool. But architecturally, it's a brilliant solution to the distributed collaboration problem. It maintains code quality while allowing thousands of contributors to work simultaneously without blocking each other. Understanding this deeper purpose helps you recognize similar patterns in other systems.
Practice Trade-off Analysis Daily
Architecture is fundamentally about trade-offs, and every coding decision—no matter how small—offers an opportunity to practice this thinking. When you're about to implement a feature, pause and ask:
What are three different ways I could solve this?
What are the trade-offs of each approach?
How might each choice affect the system six months from now?
Start small. Choosing between storing data in memory versus a database is a trade-off between speed and persistence. Deciding whether to validate data on the client or server is a trade-off between user experience and security. Each decision creates constraints that ripple through your system.
Use AI as a thought partner here. Describe your problem and ask it to help you explore alternatives: "I need to implement user notifications. Help me compare push notifications, email, and in-app messaging in terms of reliability, user experience, and system complexity."
But remember: AI can help you explore options, but you need to make the contextual decision about what's right for your specific situation. The trade-off that makes sense for a startup with 1,000 users is different from one that makes sense for a platform with 100 million users.
Learn to Think in Abstractions
Great architects see systems as layers of abstraction, each hiding complexity from the layers above. This is perhaps the hardest skill to develop because it requires shifting from concrete thinking to abstract thinking.
Practice by identifying the abstractions in systems you encounter. When you use a REST API, think about what it's hiding: database queries, business logic, authentication, caching. When you call a function, consider what abstractions it represents.
Try this exercise: Take a complex system you've worked on and draw it as a series of boxes and arrows. Each box should represent a responsibility, each arrow a dependency. If you can't easily explain what each box does in one sentence, your abstraction isn't clear enough.
For example, an e-commerce system might have abstractions like "User Management," "Product Catalog," "Order Processing," and "Payment Handling." Each of these hides significant complexity while presenting a clean interface to other parts of the system.
AI can help here too. Ask it to help you identify the core abstractions in a system: "Help me identify the key abstractions in a ride-sharing platform like Uber. What are the main responsibilities that should be separated?"
Study Failure Modes and Post-Mortems
Nothing teaches system design like understanding how systems fail. Make it a habit to read post-mortems from companies like Google, Netflix, GitHub, and Stripe. But don't just read them—analyze them architecturally.
Ask yourself: What architectural decisions contributed to this failure? How could different design choices have prevented or mitigated the issue? What trade-offs would those alternatives have required?
Create a personal collection of failure patterns: single points of failure, cascade failures, data consistency issues, scaling bottlenecks. Understanding how systems break teaches you how to design systems that don't.
Use AI to help synthesize these learnings: "Based on this post-mortem about a database outage, what architectural patterns could have made this system more resilient?"
Some common failure patterns to study:
Cascade failures: When one component's failure causes others to fail
Thundering herd: When many clients simultaneously retry failed requests
Split brain: When distributed systems can't agree on state
Resource exhaustion: When systems run out of memory, connections, or disk space
Build Mental Models for System Behavior
Experienced architects have mental models for how different types of systems behave under stress. They can predict where bottlenecks will emerge, how load will propagate through a system, and where failures are most likely to occur.
Start building these models by sketching out systems you're working on. Draw how data flows through your application. Identify where state lives and how it changes. Map out the dependencies between components.
When you're designing a new feature, sketch multiple approaches before writing any code. Consider: Where will this feature put load on the system? What happens if this component fails? How will this interact with existing features?
AI can help you validate your mental models: "I'm designing a chat system that needs to handle 10,000 concurrent users. Help me think through the data flow when a user sends a message to a group. Where might bottlenecks occur?"
Practice Constraint-Driven Design
Real architectural decisions are always made within constraints: budget, time, team size, regulatory requirements, existing systems. Learn to design within constraints rather than in an ideal world.
For every system you design, explicitly list your constraints:
How many users will this serve?
What are your consistency requirements?
What's your budget for infrastructure?
How many developers will maintain this?
What compliance requirements exist?
What's your timeline for delivery?
Then design the simplest system that meets these constraints. Resist the urge to over-engineer. The best architects know when not to use the latest technology.
For example, if you're building a system for a small team with limited resources, a monolithic architecture might be the right choice, even if microservices are theoretically better. The constraint of team size outweighs the theoretical benefits of distributed systems.
Think in Multiple Time Horizons
Unlike code, which can be refactored relatively easily, architectural decisions have long-term consequences. Learn to think in multiple time horizons: What works today? What will work next year? What about in five years?
Practice this by reviewing architectural decisions you've made in the past. What seemed like good ideas that became problems? What decisions aged well? What would you do differently now?
Consider the maintenance burden of your decisions. Complex architectures might be impressive, but can your team actually maintain them? Will new team members be able to understand and modify the system?
Ask yourself: How will this system need to evolve? What assumptions am I making that might not hold true in the future? How can I design for change?
Develop a Technology Evaluation Framework
With new tools and frameworks emerging constantly—many now AI-generated—architects need frameworks for evaluating technology choices beyond just "does it work?"
Create your own evaluation criteria:
Problem fit: Does this solve a problem we actually have?
Total cost of ownership: What are the hidden costs and maintenance overhead?
Team alignment: How does this fit with our team's skills and existing systems?
Maturity: How stable is this technology? What's the community support like?
Migration path: What happens if we need to move away from this technology?
Lock-in: How dependent will we become on this specific solution?
Use AI to help research new technologies, but apply your own judgment to architectural decisions: "Help me understand the trade-offs between GraphQL and REST for a mobile-first application with limited bandwidth, considering our team's experience with Node.js."
Embrace AI as Your Research Assistant
Here's the paradox: while AI can't make architectural decisions for you, it's an incredibly powerful tool for developing architectural thinking. Use it to:
Research how other companies solved similar problems
Explore trade-offs you might not have considered
Generate system diagrams and documentation
Analyze existing codebases for architectural patterns
Validate your reasoning about system design
Simulate different scenarios and their implications
The key is using AI to expand your thinking, not to replace it. AI can help you explore possibilities, but you need to make the contextual decisions about what's right for your specific situation.
For example, you might ask: "What are the different ways companies handle user authentication at scale? What are the trade-offs of each approach?" Then use that information to make an informed decision based on your specific constraints and requirements.
Learn from Open Source Architecture
One of the best ways to develop systems thinking is to study how successful open source projects are architected. Projects like Kubernetes, PostgreSQL, and Redis have evolved over years to handle complex requirements and massive scale.
Pick a project you're interested in and dive deep into its architecture:
How is the codebase organized?
What are the key abstractions?
How do different components communicate?
How does the system handle failure?
How has the architecture evolved over time?
Read the project's architectural decision records (ADRs) if they exist. These documents capture the reasoning behind major architectural choices and are goldmines for understanding how experienced architects think.
The Mindset Shift: From Feature Builder to System Designer
Developing systems thinking requires a fundamental mindset shift from "making it work" to "making it work well over time." This means:
Questioning your first solution: The first approach that comes to mind is rarely the best one
Considering multiple approaches: Always explore alternatives before implementing
Thinking about evolution: How will this system need to change over time?
Understanding constraints: What are the real limitations you're working within?
Embracing simplicity: The best solution is often the simplest one that meets your requirements
Recognizing patterns: Similar problems often have similar solutions
Practice Architectural Communication
Systems thinking isn't just about making good decisions—it's about communicating those decisions effectively. Practice explaining your architectural choices to others:
Why did you choose this approach over alternatives?
What trade-offs did you consider?
How will this decision affect the system's evolution?
What are the risks and how are you mitigating them?
Create architecture diagrams, write design documents, and present your ideas to others. The act of explaining your thinking helps clarify it and often reveals gaps in your reasoning.
Start Small, Think Big
You don't need to be working on massive distributed systems to develop architectural thinking. Every codebase, no matter how small, has architecture. Start by applying these principles to whatever you're working on:
Map your current system: Draw out the components and their relationships
Identify the key abstractions: What are the main responsibilities?
Analyze the trade-offs: What decisions were made and why?
Consider alternatives: How else could this be structured?
Think about evolution: How might this need to change?
The Compound Effect
The beautiful thing about developing systems thinking is that it compounds over time. Each system you study, each trade-off you analyze, each failure you understand adds to your architectural intuition. The patterns you learn in one domain often apply to others.
As you develop these skills, you'll find that you naturally start thinking architecturally about new problems. You'll catch potential issues earlier, design more robust systems, and make decisions that age well.
Conclusion: The Journey from Coder to Architect
The transition from writing code to architecting systems isn't about abandoning your technical skills—it's about elevating them. You're not replacing your ability to implement solutions; you're adding the ability to design solutions that work at scale, over time, and in the real world.
This journey requires patience, curiosity, and continuous learning. But every developer who makes this transition finds themselves more valuable, more impactful, and more fulfilled in their work. They become the developers that companies compete to hire, the ones who shape technical strategy, and the ones who build systems that truly matter.
The rise of AI has made this transition more urgent, but it has also made it more achievable. Use AI as a research tool, a thought partner, and a way to explore possibilities. But remember that the strategic decisions, the contextual judgments, and the long-term thinking that define great architecture remain uniquely human.
Start today. Pick one system you admire and reverse engineer its design. Practice trade-off analysis on your next feature. Study a post-mortem and think about how different architectural choices might have prevented the failure. Each step builds your architectural intuition and moves you closer to becoming the kind of developer who doesn't just write code, but shapes the future of technology.
The future belongs to those who can think in systems. And that future starts with your next architectural decision.
Subscribe to my newsletter
Read articles from Opeyemi Ojo directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
