<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Misma on Medium]]></title>
        <description><![CDATA[Stories by Misma on Medium]]></description>
        <link>https://medium.com/@misma?source=rss-0104740595ae------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*J3UAkeZR07aTvsmC_8AjQw.jpeg</url>
            <title>Stories by Misma on Medium</title>
            <link>https://medium.com/@misma?source=rss-0104740595ae------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 28 May 2026 17:00:44 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@misma/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Evaluating architecture “ilities” before implementation for quality]]></title>
            <link>https://medium.com/@misma/evaluating-architecture-bilities-before-implementation-for-quality-9c37aaa8476d?source=rss-0104740595ae------2</link>
            <guid isPermaLink="false">https://medium.com/p/9c37aaa8476d</guid>
            <dc:creator><![CDATA[Misma]]></dc:creator>
            <pubDate>Tue, 10 Feb 2026 06:56:51 GMT</pubDate>
            <atom:updated>2026-02-11T00:19:47.883Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5QLOv4FeoaJK12yNcACZgw.jpeg" /><figcaption>Cropped from photo by <a href="https://unsplash.com/@sylwiabartyzel?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Sylwia Bartyzel</a> on <a href="https://unsplash.com/photos/a-large-wooden-structure-with-a-clock-on-its-side-2fYXPV-kGTs?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>When thinking all the aspects that might define “what quality means”, there is several so called “ilities”. If quality is something that matters to someone who matters then it is more than likely your project has several “bilities” even if you are not yet aware of them. Maybe your delivery team has goals to improve many aspects of a new product you’re developing. Some of these might be maintainability, observability, testability and deployability. These are all so called -bilities. It includes also other things such as security and accessibility. But we’re not looking into those here.</p><p>Instead, let’s see what we could do before single line has been written yet and you’re looking at your new architecture plans!</p><p><em>Generative AI tools were used to extract bullet points for the different abilities. Content has been “spiced” up by me using my experience across various software projects</em></p><h3>Maintainability: The Future-Proof Lens</h3><p>How easily the system we’re desiginging can evolve, repair, or improve without breaking existing functionality?</p><p>Following might apply to your design, maybe not.</p><p><strong>Key Principles:</strong></p><ul><li><strong>Coupling &amp; Cohesion</strong>: Identify God Components (components with too many responsibilities) or tangled dependencies. This is bit like the infamous God Class.</li><li><strong>Abstraction Layers</strong>: Verify implementation details are hidden (can you swap databases without rewriting business logic?). This might be familiar to you from “good tests”, be they unit, integration or end to end tests. Can you switch frameworks, tools “easily”.</li><li><strong>Standardization</strong>: Consistent patterns for error handling, logging, data access, and configuration</li><li><strong>Configuration Management</strong>: How settings and secrets flow across environments.</li><li><strong>Backward Compatibility</strong>: Check mechanisms to prevent breaking changes, not just handle them</li><li><strong>Technical Debt Visibility</strong>: Confirm architecture exposes complexity metrics</li></ul><p>Remember, there is such thing as “too much of a good thing”. Sometimes for example abstractions can become too abstract. One aspect of maintainability is “how easy it is for a new person to jump in”.</p><h3>Observability: The Internal Health Lens</h3><p>Can we quickly observe and track things as they move across the architecture. And especially if something goes wrong.</p><p><strong>Key Principles:</strong></p><ul><li><strong>Traceability</strong>: In distributed systems, can you track single requests across all services?</li><li><strong>Measurement Consistency</strong>: Specify what’s measured (business metrics vs. infrastructure) and ensure uniform collection methods. This can be tricky in large organisations and multiple teams.</li><li><strong>Context Enrichment</strong>: Include Correlation IDs and metadata for meaningful logs and metrics</li><li><strong>Alerting Strategy</strong>: Define when and how teams receive notifications</li><li><strong>Debugging Workflows</strong>: Map the path from alert to resolution</li><li><strong>Security &amp; Audit</strong>: Track security events and compliance trails</li><li><strong>Cost Visibility</strong>: Monitor observability infrastructure overhead</li></ul><p>If you’re only one team dealing with the architecture under design, things can be much easier than in large organisation. As sometimes you need to do with what tooling is available for you. Just because you want to track something across distributed systems, is it even feasable? Do you get enough “bang for buck” if you implement partial traceability?</p><h3>Testability: The Verification Lens</h3><p>Testability measures how easily you can verify system and test the system. I am using here both words verify, associated with automated testing, and test system for what could be described as exploratory testing.</p><p><strong>Key Principles:</strong></p><ul><li><strong>Isolation</strong>: Test components independently without full infrastructure</li><li><strong>Determinism</strong>: Minimize side effects causing flaky tests (hidden global states)</li><li><strong>Controllability</strong>: Inject failures and bad data to validate resilience</li><li><strong>Contract Validation</strong>: Verify service agreements in distributed systems</li><li><strong>Performance Testing</strong>: Support load and stress testing scenarios</li><li><strong>Privacy-Safe Data</strong>: Generate test data respecting compliance requirements</li><li><strong>Deployment Testing</strong>: Validate the deployment process itself</li></ul><p>Once again, your situation is different. What if you cannot control test data? Is there any ways you can create mocks, containers or similar to control things that are outside your control? This can be affect greatly the speed at which your team moves if you’re waiting days for test data availability for single round of automated or especially exploratory testing. Isolation becomes very important factor. But then you really need to understand also how the systems you’re interfacing with can fail, behave. So you need to take this into account when your team is defining your test strategy.</p><h3>Deployability: The Production Release Lens</h3><p>Deployability measures how safely and efficiently code reaches production.</p><p><strong>Key Principles:</strong></p><ul><li><strong>Deployment Independence</strong>: Deploy components without coordinated releases</li><li><strong>Rollback Mechanisms</strong>: Quick reversion when issues arise</li><li><strong>Progressive Delivery</strong>: Support blue/green, canary, and feature flag patterns</li><li><strong>Environment Parity</strong>: Minimize differences between dev, staging, and production</li><li><strong>Automation</strong>: Reduce manual steps and human error</li></ul><p>This can be important goal for your team especially in monolith to microservice migration projects. What guidelines your team needs to follow from the organisation? How much you can decouple and when you can start moving faster? Is the architecture plan mix and match of monolith and microservice architecture? What service and server architecture you have available for example to reach environment parity?</p><h3>The Checklist Questions for Each bility</h3><p>When your team is working on the plans, here is some questions that can be relevant. Remember, we’re dealing here with the architecture planning phase. And no, doesn’t mean we are dealing with waterfall SDLC.</p><p>I recognize that architecture also emerges as you go. And some of these questions are not relevant for you in early architecture planning. But they will become important as your solution starts maturing. So it is good thing to be aware of them now and get back to them when time is more mature.</p><h3>Maintainability Questions</h3><p><strong>The Replaceability Test</strong>: If replacing the primary database or third-party API, how many components require modification? This is sort of thing to consider, if we’re already replacing some APIs, what happens if say the payment gateway API changes again as they often can.</p><p><strong>The New Hire Test</strong>: Can new developers understand a module’s purpose without reading system-wide documentation? This is one of my favorite “flags” for maintainability. If we assume you’re say starting from the infamous “big ball of mud”, you want the end up with much streamlined, easier to understand landscape.</p><p><strong>Dependency Mapping</strong>: Are there circular dependencies between services that we’re drafting?</p><p><strong>Version Strategy</strong>: How does the architecture handle API breaking changes? Is versioning built-in? When you’re moving into microservices out from monoliths, expect APIs to start changing more often too as the organisation gaines more momentum for changes thanks to the microservices.</p><p><strong>The Configuration Chaos Test</strong>: Can you trace how a single setting propagates from source to runtime? Are secrets managed securely? This could go as well in observability section.</p><p><strong>The Abandoned Code Test</strong>: How are we identifying unused services or features for removal? How we find out if someone else is still using it?</p><p><strong>Documentation Auto-Generation</strong>: Does the architecture support generating docs from code (OpenAPI specs, dependency graphs)?</p><h3>Observability Questions</h3><p><strong>The Needle in a Haystack Test</strong>: When users report errors, what unique ID finds the exact log entry across all services? What hidden assumptions we might have of the observability tools we have?</p><p><strong>The New Hire Test (Observability)</strong>: Can someone new understand telemetry without tribal knowledge?</p><p><strong>Health Definitions</strong>: Does the architecture define Healthy vs. Degraded vs. Down states for each component? Can it? Which parts of the architecture can report different states, and what does it mean from the point of view of cascading problems?</p><p><strong>Measurement Standards</strong>: Is there consistent format for logs (JSON with standard fields) and metrics (naming conventions, labels) across the entire system? What can we do in our team to start implementing these good practises?</p><p><strong>The 2 AM Test</strong>: If this breaks at 2 AM, what does the on-call engineer see first? Is it actionable?</p><p><strong>The Regulatory Audit Test</strong>: Can you prove what happened six months ago? Are audit logs tamper-proof?</p><p><strong>Cost Attribution</strong>: Can you track observability costs per service or team? What are the cost implications of our teams observability riggings?</p><h3>Testability Questions</h3><p><strong>Mock-ability</strong>: Are external dependencies (APIs, databases, file systems) hidden behind interfaces for easy mocking?</p><p><strong>State Management</strong>: How do you reset the system to a clean state for automated checks and verifications?</p><p><strong>Failure Injection</strong>: What do we need to do with our plans to allow us to create intentional failures? Time outs, cut connections. Wrong API versions.</p><p><strong>Data Seeding</strong>: Is there a clear path for generating and injecting test data?</p><p><strong>Contract Testing</strong>: How do you verify service contracts (API schemas, message formats) between teams?</p><p><strong>Performance Baselines</strong>: Can you run load tests that mirror production traffic patterns? Which parts of your architecture you can exercise that are under your control? How you isolate 3rd parties or agree on test windows?</p><p><strong>Privacy Compliance</strong>: Does test data generation anonymize or synthesize sensitive information?</p><p><strong>Environment Cloning</strong>: Can you replicate production-like conditions in test environments?</p><h3>Deployability Questions</h3><p><strong>The Solo Deploy Test</strong>: Can you deploy one service without coordinating with other teams?</p><p><strong>Rollback Speed</strong>: How quickly can you revert to the previous version? Is it automated?</p><p><strong>Progressive Delivery</strong>: Does the architecture support canary releases (deploying to 5% of users first)?</p><p><strong>Feature Flags</strong>: Can you toggle functionality without deploying code?</p><p><strong>Environment Promotion</strong>: How do artifacts move from dev to staging to production? Are they identical?</p><p><strong>The Zero-Downtime Test</strong>: Can you deploy during business hours without user impact?</p><p><strong>Deployment Observability</strong>: Do deployments generate telemetry showing their progress and impact?</p><p><strong>Disaster Recovery</strong>: Can you test failover procedures without causing downtime?</p><h3>In Conclusion</h3><p>You notice how much these related to testing. Testing failovers, testing in production with progressive delivery and flags for example. No wonder maintainability, observability, deployability are classified as software quality attributes. Or maybe that is because of my own bias as a quality advocate, tester and QA.</p><p>So there you have it, a lot could be also written say on asking as a team cross cutting questions on these bilities that highlight where they intersect. Such as intersection of maintainability and observability. Or maybe “red flags” for your architecture design phases. And this doesn’t cover other bilities such as resilience.</p><p>Talking explicitly about these kind of abilities in architecture drafting phase is one of those things that can shift quality left. And if you’re a QA, bring these up with your product owner, product manger, project manager. Work with them on the business goals of your project, and find out what goals might be hidden in the technical side and expectations that do not reflect directly to end user say in form of a product feature (“add product to cart”, “publish a blog post”.).</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9c37aaa8476d" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>