The word “architecture” gets thrown around a lot in software discussions. But we don’t seem to always use it the same way. Some example usages:
Our app uses Redux for our architecture.
Sometimes we assume that because we are using a framework or data management library, that must be our architecture.
I created a diagram of our dependency graph, showing all the imports in the code, as a way of seeing our architecture.
We could also say the way your program is structured (which files depend on which other files) represents your architecture. If we’re fancy, then maybe we have UML diagrams representing this structure.
Bob is our architecture guy: he decides what dependencies we can bring in, is always asking us to refactor code to make it “cleaner”, and runs a design meeting before each feature to decide how to structure the code
This final quote sounds like architecture is more about the decisions you’re making as you go through a project.
So if the community isn’t using the term consistently, let’s ask the experts. Here are 2 definitions from folks who have written popular books on software architecture.
Robert Martin (Uncle Bob) uses the following definition in Clean Architecture:
The goal of software architecture is to minimize the human resources required to build and maintain the required system.
Martin Fowler gave his definition in a talk titled Making Architecture Matter. It is worth watching in full, but paraphrased, his definition is:
Software architecture is those decisions which are both important and hard to change
These 2 definitions turn out to be complementary. Uncle Bob motivates architecture: we’re focused on minimizing the work put into the system. Martin Fowler’s definition shows what parts of the system architecture is concerned with: the parts that are “important” and hard to change.
The next question of course is… what is important? The unsatisfactory answer is that it depends. It will change between projects, and will change within a project over time. But when we scope the question to the domain of front end development, common themes emerge. Specifically there are 6 areas of concern that I see coming up again and again in public and private front end architecture discussions. They’re not exclusive to the front end, but they’re a good starting point for anyone thinking about building web applications.
When new requirements arrive, how quickly are developers able to make changes and release new code to production? When there are bugs, how easy is it to find the problem and fix it? Are developers able to consistently deliver correct code? Or are multiple iterations often required?
Can a malicious user inject code into your site? Are you unnecessarily exposing information about your users or code structure? And you are working with your API developers to use secure authentication and authorization practices right?
This concern is broader than the way the word is often used in web dev circles. Is the full audience of this site or application able to use it with as few limitations as possible? Users with disabilities? Users with older but supported browsers? How about international users or those with slow connections? Does your site work on mobile? Offline? On Apple Watch? Do you support AMP? And do your pages appear nicely on social media? Do you even care about any of these audiences? Maybe you’re optimizing for people who aren’t your users?
Is a site or application consistently available to users? Does it often fail, and if so how does it recover? If things are breaking, are the developers aware of it quickly? Do different users in different scenarios receive a consistent experience?
Is a site or application consistently quick to load and interact with? If there are animations or highly interactive elements, are they responsive and usable, or do they freeze/jank? Is the user disrupted in their tasks by strange loading behavior?
Is your site limited in fulfilling its purpose because of foundational decisions or tradeoffs with the other concerns? Have you made decisions that let you serve your audience in unique ways because of your tech stack or development processes? Do your technical decisions even make sense in the context of your site or application’s purpose?
I’m hoping to look at each of these areas more in depth in the coming weeks, as well as exploring how we make decisions that impact multiple areas simultaneously. In the meantime, as you’re looking at decisions and tools that will impact the long term structure of your front end application, consider how they’ll impact each of these areas.
I have a new book review up on the site today! A Philosophy Of Software Design is my new recommendation for an “intermediate” software development book. It’s a great read for anyone who can write working code and wants to start writing better code.
I also took some time over the holidays to spruce up the site a bit. I improved the email subscribe experience, some details around the post sidebar and ads, and I added a section specifically for book reviews. Go ahead and check it out.
The Gift Of Giving Up - It’s nice to read about a “failed” project sometimes. Oftentimes it’s only the successes that get published, but generally the failures are where the learning lives.
Why Review Code - A great summary of the value of code reviews
How Much Of The Internet Is Fake? - Short answer: A lot of it.
Apple needs to change iPhone’s call UI Android fans will smirk at this, but this is my biggest annoyance with my iPhone these days. Telephony is no longer the primary use case of “phones” for most of us, and the iPhone should adapt its UX to that reality.
May Your City Never Become San Francisco, New York or Seattle - Interesting reading about the circular anxiety of major US cities.
Happy New Year all! 🎉🎊🎶