{"id":21,"date":"2026-09-04T22:45:14","date_gmt":"2026-09-05T06:45:14","guid":{"rendered":"https:\/\/grumpyoldengineer.com\/?p=21"},"modified":"2026-09-04T23:21:54","modified_gmt":"2026-09-05T07:21:54","slug":"requirements","status":"publish","type":"post","link":"https:\/\/grumpyoldengineer.com\/?p=21","title":{"rendered":"Requirements"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"has-medium-font-size wp-block-paragraph\">I know that you believe that you understand what you think I said, but I am not sure you realize that what you heard is not what I meant \u2013 Anonymous<\/p>\n<\/blockquote>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\">The biggest challenge with requirements is finding the right balance between academic purity, practical usability, appropriate granularity, and of course, timing. In other words: trying to satisfy four competing masters while everyone around you insists their favorite one is the only one that matters.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Structure<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are countless ways to structure requirements, and every team swears their way is the &#8220;one true way&#8221;. In reality, the structure should be whatever actually works for the team and the system of interest (within the limits of your standard operating procedure). Despite the endless debates, the core structure across organizations is shockingly similar.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"282\" height=\"231\" src=\"https:\/\/grumpyoldengineer.com\/wp-content\/uploads\/2025\/11\/image-1.png\" alt=\"\" class=\"wp-image-43\"\/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">All requirements start somewhere. It may be provided by the customer or by an internal team. These requirements are then decomposed to a level where engineering can start development or make a decision on whether to make, reuse, or buy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That latter path is mostly relevant in formal contractual environments, the kind where the system is large, complex, and terrifyingly high\u2011risk because half the capabilities have never existed before. In internal R&amp;D, where you\u2019re iterating on an existing product, that level of overhead is usually unnecessary. Below are examples of how requirements <em>can<\/em> be structured.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"385\" height=\"301\" src=\"https:\/\/grumpyoldengineer.com\/wp-content\/uploads\/2025\/11\/image-2.png\" alt=\"\" class=\"wp-image-44\" srcset=\"https:\/\/grumpyoldengineer.com\/wp-content\/uploads\/2025\/11\/image-2.png 385w, https:\/\/grumpyoldengineer.com\/wp-content\/uploads\/2025\/11\/image-2-300x235.png 300w\" sizes=\"auto, (max-width: 385px) 100vw, 385px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">The structure and hierarchy depend on the system and the applicable regulatory standards. If it checks the boxes and the team isn\u2019t screaming, it\u2019s probably fine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In internal R&amp;D, the focus often lands on the \u201clowest level\u201d requirements, with higher\u2011level ones backfilled later to satisfy process or regulatory paperwork. This is acceptable when risk is low. It is absolutely <em>not<\/em> acceptable for a brand\u2011new system where nothing exists yet, unless you enjoy catastrophic surprises.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Think of Requirements as a hub<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Requirements will never contain all the details and edge cases needed to implement a system. They capture the <strong>WHAT<\/strong>, not the <strong>HOW<\/strong>, because, newsflash, the system doesn&#8217;t have a solution and hasn&#8217;t been built yet. This surprisingly is a very difficult concept to get through some people&#8217;s thick head.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Below is an diagram to illustrate requirements context.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"483\" height=\"457\" src=\"https:\/\/grumpyoldengineer.com\/wp-content\/uploads\/2025\/11\/image-7.png\" alt=\"\" class=\"wp-image-83\" srcset=\"https:\/\/grumpyoldengineer.com\/wp-content\/uploads\/2025\/11\/image-7.png 483w, https:\/\/grumpyoldengineer.com\/wp-content\/uploads\/2025\/11\/image-7-300x284.png 300w\" sizes=\"auto, (max-width: 483px) 100vw, 483px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">What requirement enables is a navigable pathway between system elements, capturing the decomposition trace, justification, and how we got to a certain point. For example, I may navigate from a risk to the associated requirement, the design, and how it&#8217;s being verified.  Note, the child owns the trace. Always<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What vs How<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One phrase I keep hearing (and which I immediately correct) is &#8220;requirement needs to be at the level which developers can code to&#8221;. This is just total horse shit and the person repeating this should be escorted out of the building.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Requirements should be at the level where design can occur. Then implementation follows design. The leading cause of hyper\u2011granular, unmaintainable requirements is teams who implement first (documenting in JIRA) and then reverse\u2011engineer \u201crequirements\u201d from whatever they just built. This guarantees a future of pain, because the WHAT becomes dependent on the HOW, a dependency inversion that should make any systems engineer break out in hives.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I once saw a software requirements spec exceed 700 pages for a standalone mobile app. Seven. Fucking. Hundred. Pages for a standalone phone app. That\u2019s not engineering, that\u2019s a cry for help. That&#8217;s almost as large as Trump&#8217;s One Big Beautiful Bill.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keeping requirements at the WHAT level is crucial. The only exception is when the HOW is explicitly a risk mitigation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s assume we contracted out development work to two subcontractors A and B using the same set of requirements.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"625\" height=\"150\" src=\"https:\/\/grumpyoldengineer.com\/wp-content\/uploads\/2025\/11\/image-3.png\" alt=\"\" class=\"wp-image-45\" srcset=\"https:\/\/grumpyoldengineer.com\/wp-content\/uploads\/2025\/11\/image-3.png 625w, https:\/\/grumpyoldengineer.com\/wp-content\/uploads\/2025\/11\/image-3-300x72.png 300w\" sizes=\"auto, (max-width: 625px) 100vw, 625px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In the above scenario, we would get two different design and implementation from each subcontractor that would still meet the requirements. If we wanted more granularity and control, we contract out with the design spec; this will get us two different subcontractor implementations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keeping the requirements at the &#8220;WHAT&#8221; level provides flexibility to the Lead Systems Integrator. For example, if one SW subcontractor is &#8220;not working out&#8221;, we can switch to a different SW subcontractor. While this can get complicated in reality, the requirements methodology supports it.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>Team<\/strong>: we don&#8217;t know what the requirements are because we haven&#8217;t done the solutioning yet.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>Me<\/strong>: please leave me the fuck alone&#8230;<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Side effect of HOW\u2011level requirements is requirements completion gets delayed until design is locked down. Worse if design is captured post\u2011implementation. Requirements will start changing every time design changes. This downwards dependency is not only wrong but also costly.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">Traceability is your friend, don&#8217;t abuse them<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Traceability is essentially the integrity of the system. You can tell a lot about the project and team just by looking at their traceability structure.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>Donut<\/strong>: you cannot do traceability without a tool like Jama or DOORS.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>Me<\/strong>: traceability is a concept you donut! How the hell do you think people did it decades ago before DOORS existed?<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Traceability is a concept of going from A to B in a uniquely identifiable way. First thing is to understand why we need it (besides process and regulations) and how we&#8217;re going to implement it in the most practical way.  Once this is understood, we leverage tools like DOORS and Jama to help us execute.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Traceability is simply the ability to go from A to B in a uniquely identifiable way. First understand why you need it (besides process and regulations), then figure out the most practical way to implement it. Tools like DOORS and Jama help execute, they don&#8217;t define the concept.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote has-small-font-size is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>Manager<\/strong>: leadership is asking for SE achievements past year, so I created a slide highlighting we created over 14000 traces in DOORS.<\/p>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>Me<\/strong>: whatever&#8217;s wrong with you, it ain&#8217;t something small.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Tools are great, but without understanding the \u201cwhy,\u201d they get misused. And misuse leads to maintenance nightmares.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The worst abuse I see is tracing requirements to downstream free\u2011form design documents. People are now stuffing entire documents into requirements tools and tracing them to requirements. This happens because tool vendors love showing off shiny (useless) features, and organizations behave like kids in a candy store.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do not trace requirements to headings, sentences, or paragraphs in free\u2011form design docs. Traceability works when items are atomic and standalone. If you try to trace a WHAT requirement into a sprawling design doc, you\u2019ll end up with traces scattered everywhere. Now imagine updating the design doc later. Enjoy your thousand broken traces.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Closing Thoughts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Just don&#8217;t do stupid shit. Please.<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I know that you believe that you understand what you think I said, but I am not sure you realize that what you heard is not what I meant \u2013 Anonymous The biggest challenge with requirements is finding the right balance between academic purity, practical usability, appropriate granularity, and of course, timing. In other words: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-21","post","type-post","status-publish","format-standard","hentry","category-requirements"],"_links":{"self":[{"href":"https:\/\/grumpyoldengineer.com\/index.php?rest_route=\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/grumpyoldengineer.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/grumpyoldengineer.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/grumpyoldengineer.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/grumpyoldengineer.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=21"}],"version-history":[{"count":5,"href":"https:\/\/grumpyoldengineer.com\/index.php?rest_route=\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":259,"href":"https:\/\/grumpyoldengineer.com\/index.php?rest_route=\/wp\/v2\/posts\/21\/revisions\/259"}],"wp:attachment":[{"href":"https:\/\/grumpyoldengineer.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/grumpyoldengineer.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/grumpyoldengineer.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}