<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Doctolib</title>
    <description>The latest articles on Forem by Doctolib (@doctolib).</description>
    <link>https://forem.com/doctolib</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F9536%2Fba740bf4-ef29-482a-bec7-6480ba850932.png</url>
      <title>Forem: Doctolib</title>
      <link>https://forem.com/doctolib</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/doctolib"/>
    <language>en</language>
    <item>
      <title>Cracking the code: How Copilot supercharged my last CTF and where it fell short</title>
      <dc:creator>Thomas Betous</dc:creator>
      <pubDate>Mon, 30 Jun 2025 12:02:18 +0000</pubDate>
      <link>https://forem.com/doctolib/cracking-the-code-how-copilot-supercharged-my-last-ctf-and-where-it-fell-short-5g1i</link>
      <guid>https://forem.com/doctolib/cracking-the-code-how-copilot-supercharged-my-last-ctf-and-where-it-fell-short-5g1i</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffnzc1aa74fjnzjzgs9hd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffnzc1aa74fjnzjzgs9hd.jpg" alt="Using AI for CTF" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Over the years, I’ve always been drawn to riddles and brainteasers. It’s no surprise, then, that as a software engineer, I’ve always been interested in &lt;a href="https://en.wikipedia.org/wiki/Capture_the_flag_(cybersecurity)" rel="noopener noreferrer"&gt;Capture The Flag&lt;/a&gt; (CTF) cybersecurity challenges. In these challenges, you need to find a solution (hack) to retrieve a secret string hidden somewhere. This could be in a website, social media, assembly code, images, or any medium that can conceal information. These challenges require a broad range of knowledge, particularly in computer science and software engineering, but also creativity and inventiveness. However, I never dared to try because, in my mind, CTFs were reserved for the elite: the seasoned hackers with skills far beyond my own.&lt;/p&gt;

&lt;p&gt;Now, at 35, life is busier than ever. I recently became a father, and finding time for new pursuits feels almost impossible. But the itch to finally try a CTF remained. My main obstacles? A lack of time and the belief that I didn’t have enough knowledge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fea61ht9dj43tqb9t0cgf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fea61ht9dj43tqb9t0cgf.jpg" alt="Hacker vs me" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s when generative AI, like &lt;a href="https://openai.com/chatgpt/overview/" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt;, &lt;a href="https://gemini.google.com/" rel="noopener noreferrer"&gt;Gemini&lt;/a&gt;, &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;Github Copilot&lt;/a&gt; sparked an idea: what if I tried hacking with AI as my sidekick? To my surprise, not only were CTF challenges more accessible than I’d imagined, but AI assistants also helped me save precious time by accelerating my learning and problem-solving. Thanks to this partnership, I completed the &lt;a href="https://www.404ctf.fr/" rel="noopener noreferrer"&gt;404 CTF&lt;/a&gt; — one of France’s most famous competitions — and finished in a respectable 165th place out of more than 2,800 participants.&lt;/p&gt;

&lt;p&gt;In this article, I’ll share how I used AI to supercharge my hacking journey, the tips I picked up along the way, and where the limits of AI became clear. As a disclaimer before diving in, while I used &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt; for this article, other technologies like &lt;a href="https://www.cursor.com/" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;, &lt;a href="https://claude.ai/login" rel="noopener noreferrer"&gt;Claude&lt;/a&gt;, and similar tools are equally valid choices. You can even use several of them simultaneously, the end goal remains the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬 Prompts I used the most and how I used them
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Explain me the purpose of XXX?
&lt;/h3&gt;

&lt;p&gt;GitHub Copilot is an excellent assistant that &lt;a href="https://code.visualstudio.com/docs/copilot/overview" rel="noopener noreferrer"&gt;integrates seamlessly with VS Code&lt;/a&gt;. Microsoft’s plugin provides a powerful interface where you can query specific lines of code or use a dedicated console to focus Copilot’s attention on particular files or directories.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxdkjtx4zbn4zdfqfuc4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxdkjtx4zbn4zdfqfuc4.png" alt="Github Copilot inegration in VS Code" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since most CTF challenges begin with analyzing files, Copilot proved to be a perfect investigation tool. My typical workflow starts by asking Copilot to analyze the project, explain its purpose, and map out the function of each file. Then, I examine each file in detail, and whenever I encounter something unfamiliar, I ask Copilot to explain specific sections.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Copilot, could you explain the purpose of this project? Could you describe the function of each file and directory?"&lt;/em&gt; — prompt example&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For instance, one web security challenge included an nginx configuration file. While I don't regularly work with nginx configurations, by asking Copilot to explain specific instructions, I could quickly understand their purpose without leaving VS Code. This allowed me to learn just enough to efficiently identify potential attack vectors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk2nsyaryzao8nazc5gpl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk2nsyaryzao8nazc5gpl.png" alt="Asking Copilot what's proxy_cache my_cache;" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An important consideration is that files aren't always immediately readable by Copilot (or any AI assistant). Sometimes you need to be creative with file formatting. For example, when challenges provide binary files, Copilot can't interpret them directly. The solution is to export the binary's hexadecimal or assembly code to a text file. This conversion makes the content accessible to Copilot for analysis. While this approach is valuable for initial investigation, sometime specialized tools are necessary for deeper analysis. In my last example, after the initial examination with Copilot, I had to switch to BinaryNinja for a more thorough investigation of the binary file.&lt;/p&gt;

&lt;p&gt;Another interesting example involves analyzing a pcapng file containing network captures. The challenge was to discover how a malicious user extracted a password from numerous network packets. While this file wasn't readable in VS Code and required Wireshark for viewing, it contained an overwhelming amount of data, including many irrelevant packets. To effectively analyze such data with an AI assistant, you first need to filter out the relevant packets (in my case, HTTP packets) through Wireshark and then export them to a more comprehensible format like JSON. It's essential to perform this initial filtering step, as otherwise, the AI assistant won't be able to analyze the data effectively due to the sheer volume of information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do you see any security issues or unusual elements?
&lt;/h3&gt;

&lt;p&gt;After analyzing the structure of a challenge, there are times when I don't immediately spot relevant issues. In such scenarios, I ask Copilot to identify potential security vulnerabilities. Often, Copilot suggests multiple issues that provide a good foundation for starting to hack. This is where your skills as a hacker/developer become crucial, you need to evaluate and filter these suggestions, identifying which are viable and which aren't. You also need to find synergies and discover exploits that Copilot didn't explicitly mention. Frequently, challenges require exploiting multiple security vulnerabilities in combination rather than just a single issue.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Copilot, do you see any security issue or unusual elements in route.py? Do you see any deprecated dependencies?"&lt;/em&gt; — prompt example&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example, in one web security challenge from the 404CTF, solving it required combining multiple vulnerabilities that Copilot helped identify such as issues in both the backend and proxy cache server. Out of the various potential problems Copilot pointed out, I had to analyze, select, and connect the relevant ones to reach the solution and extract the flag. This experience shows how AI can accelerate the investigative process, but still requires human intuition to piece everything together.&lt;/p&gt;

&lt;p&gt;Finally, when Copilot identifies vulnerabilities, the method of exploitation isn't always obvious. You can continue the conversation with your AI assistant by asking how to exploit these vulnerabilities and requesting more detailed information. Don't hesitate to ask about specific tools or request step-by-step instructions for executing your hack. Those questions are always instructive and provides valuable learning opportunities.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Copilot, what's a smuggle request and how can I do it ? Can you guide me step-by-step?"&lt;/em&gt; — prompt example&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Write a Python script to accomplish XXX?
&lt;/h3&gt;

&lt;p&gt;The analysis process generates numerous ideas. Generally, these ideas require some coding to create a proof of concept for a vulnerability. When you're unsure where to start and time is limited, asking an AI to write a small code snippet can be valuable. Copilot can adapt to your repository structure and generate files in the appropriate locations with the requested code. While not essential, this approach saves time.&lt;/p&gt;

&lt;p&gt;One crucial point to notice is that you need to be precise with your requirements; otherwise, the generated code may not align with your needs. Don't hesitate to specify the programming language, preferred libraries, and your desired outcome. The goal isn't to obtain perfect code, but rather to get something you can easily customize to suit your specific needs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Copilot, can you write a Python script with pwntools that connects to [IP] and [PORT], receives two numbers, adds them, and sends back the result."&lt;/em&gt; — prompt example&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🔄 It's an iterative process
&lt;/h2&gt;

&lt;p&gt;This process is often iterative. Basically, after the global analysis, I enter a loop where I filter the data I have, analyze it, ask questions, inquire about security issues, and reflect on the results. Then, I reiterate again and again until I start to assemble pieces of the puzzle to solve the challenge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepursja1jo6dgvf8odb6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepursja1jo6dgvf8odb6.jpg" alt="Using AI for CTF process" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💔 What's the drawback of using AI for a CTF
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Using AI is exhausting
&lt;/h3&gt;

&lt;p&gt;Using AI allows me to learn quickly, but it's exhausting. While you can access specific information and documentation faster than ever, it involves processing a lot of knowledge in a short time. You need to read extensively, maintain focus, and review every suggestion and generated code snippet. It's a different style of work. Counter-intuitively, working with an AI assistant actually consumes more energy than working alone. While one might think that having a computer do the thinking would require less effort, the reality is quite different.&lt;/p&gt;

&lt;p&gt;Working without an AI assistant is a steady hike; working with one is a sprint - you move faster, but it takes a lot more energy.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI == cheat?
&lt;/h3&gt;

&lt;p&gt;A legitimate question might be: is using AI cheating in a CTF? For the easiest challenges, like the Intro or Easy levels in 404CTF, AI can sometimes hand you the solution on a silver platter. But as soon as you move up to Medium or harder, the problems get too complex for Copilot or any AI to just solve for you.&lt;/p&gt;

&lt;p&gt;That's why I don't see AI as a cheat code. In reality, it's just one tool among many, like the ones real hackers use to break systems in the wild. Sometimes it helps, sometimes it doesn't, and it rarely cracks the tough challenges on its own. In cybersecurity, there are no shortcuts, just different methods and tools to reach your goal. And honestly, no hacker would refuse a useful tool just because it feels "unfair."&lt;/p&gt;

&lt;p&gt;AI mostly raises the floor, not the ceiling. It helps beginners level up faster, but expert won't suddenly become stronger thanks to AI alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI can be censored for certain types of questions
&lt;/h3&gt;

&lt;p&gt;Sometimes I encountered limitations with Copilot, likely due to ethical considerations. When attempting to create attacks, Copilot sometimes refuses to provide assistance. As a workaround, I needed to specify in my initial prompt that I was working in a CTF context. However, even with this clarification, Copilot might still censor certain responses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tfqys4grjqhymm3l1kn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tfqys4grjqhymm3l1kn.png" alt="Oups, Copilot don't want help me - Example of censorship" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's amusing to realize that you sometimes have to find creative ways to "hack" Copilot itself. It reminds me of Asimov's novels, where clever loopholes are found in the famous three laws of robotics. In a similar way, you need to think outside the box to get Copilot to do what you want.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI can push you to do some unsecure actions
&lt;/h3&gt;

&lt;p&gt;While asking Copilot how to exploit vulnerabilities, I sometimes received recommendations for tools whose safety I wasn't entirely confident about. When investigating these tools on GitHub, regardless of their quality, they often had few stars, indicating limited usage, and were frequently unmaintained with commits dating back years. This didn't inspire much confidence.&lt;/p&gt;

&lt;p&gt;For example, when I was looking for a password generator based on social knowledge, Copilot recommended tools like pypasswords. While I won't judge this tool's quality, it may be good but pypasswords' last commit was 5 years ago and the project only had 1 star. Without looking in more details, it can be dangerous to install such a library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyai7ti6lw2ehrxo49z8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyai7ti6lw2ehrxo49z8e.png" alt="Copilot tell me how to install pypasswords" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's why, as personal advice, I recommend not blindly trusting what your AI suggests when it comes to running commands or installing libraries. Always verify what you're about to execute.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI can lead you down the wrong path
&lt;/h3&gt;

&lt;p&gt;I think it's part of the experience, but I've lost count of the times Copilot has hallucinated issues where there were none, or assured me everything was fine when there was actually a subtle problem. I once spent hours trying to craft a smuggling request that turned out to be impossible - simply because Copilot suggested it might work. But as I mentioned earlier, this is a valuable lesson: don't blindly trust everything your AI suggests.&lt;/p&gt;

&lt;p&gt;That said, I'd put this into perspective based on your goals with CTFs. If your aim is to learn new skills, sometimes following the wrong leads can be incredibly educational.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Beyond the CTF
&lt;/h2&gt;

&lt;p&gt;Using AI to solve CTFs is fun, and I strongly encourage you to try it. You'll sharpen your AI skills for analysis and programming while learning extensively about specific domains. Personally, I focused mainly on web security since I specialize in web development. The knowledge I gained is valuable and helps me spot issues I might have missed before. It's all about honing your skills.&lt;/p&gt;

&lt;p&gt;At Doctolib, we actively encourage software engineers to embrace AI, not to work less, but to free up time for higher-value tasks that truly matter. This philosophy mirrors exactly what I experienced during my CTF journey.&lt;/p&gt;

&lt;p&gt;Just as I used AI to accelerate my learning and problem-solving in cybersecurity challenges, at Doctolib, we leverage tools like GitHub Copilot, Cursor, and Claude Code to streamline routine coding tasks, accelerate debugging, and enhance code exploration. The goal isn't to replace our expertise, but to augment it allowing us to focus on architectural decisions, complex problem-solving, and innovative solutions that improve healthcare for millions of patients.&lt;/p&gt;

&lt;p&gt;Whether it's analyzing nginx configurations in a CTF challenge or refactoring critical healthcare infrastructure at Doctolib, AI serves as an amplifier of human intelligence. The key lesson from both contexts remains the same: AI is most powerful when it enhances human judgment, not when it replaces it.&lt;/p&gt;

&lt;p&gt;Thank you for reading. If you have any questions or insights to share, feel free to reach out or leave a comment.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Special thanks to Justin Rabiller for reviewing this article and providing valuable insights.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>ai</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Beyond Barnum: crafting meaningful requirements in System Design</title>
      <dc:creator>Thomas de Saint Exupery</dc:creator>
      <pubDate>Wed, 29 Jan 2025 11:10:26 +0000</pubDate>
      <link>https://forem.com/doctolib/beyond-barnum-crafting-meaningful-requirements-in-system-design-53k5</link>
      <guid>https://forem.com/doctolib/beyond-barnum-crafting-meaningful-requirements-in-system-design-53k5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Make it scalable, but not too complex. And of course, everything needs to be secured and compliant.&lt;/p&gt;

&lt;p&gt;— Every System Design Ever&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you've ever participated in a system design interview – whether as an interviewer or candidate – these words probably sound familiar. They're the software engineering equivalent of a horoscope: vague enough to apply to any system, yet specific enough to feel meaningful. Just as horoscopes tell you that you're "sometimes outgoing but also enjoy quiet time alone" (who doesn't?), these requirements seem to provide guidance while actually saying very little. &lt;/p&gt;

&lt;p&gt;Welcome to the &lt;a href="https://en.wikipedia.org/wiki/Barnum_effect" rel="noopener noreferrer"&gt;Barnum effect&lt;/a&gt; in system design. &lt;/p&gt;

&lt;p&gt;As a staff engineer at Doctolib who has been conducting system design interviews for over a year, I've seen this pattern repeat itself: candidates nod sagely at these generic requirements, only to struggle when it comes to making concrete design decisions.&lt;/p&gt;

&lt;p&gt;But here's the thing: real systems aren't built on &lt;a href="https://en.wikipedia.org/wiki/Truism" rel="noopener noreferrer"&gt;truisms&lt;/a&gt;. You can't tell your infrastructure team to make it "not too complex" or ask your security team to just make “everything secure." These Barnum statements are the comfort food of system design – they feel good but provide little nutritional value for your actual engineering decisions.&lt;/p&gt;

&lt;h1&gt;
  
  
  The anatomy of void requirements
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Make it scalable&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;What's our growth projection? Are we expanding to new countries? Each territory brings its own complexity: different currencies, tax systems, time zones, etc. There are many other dimensions of scalability often overlooked: data volume growth over time, number of supported third-party integrations, variety of client applications or even organizational scalability as teams grow and specialize. These dimensions radically change our technical choices.&lt;/em&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;but not too complex,&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;What does "complex" mean in your context? Sometimes, a "complex" solution might be exactly what's needed to solve a complex problem. Also "Not too" is a classic example of a truism - a statement that's so obviously true it adds no value to the discussion.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;And of course, everything needs to be secured, &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;What threats are we protecting against, and what's the actual impact of a breach? Overemphasizing security can actively harm user experience or system maintainability. Like "not too complex", this is another truism - no one would argue for an unsecured system, making the requirement meaningless without specifics.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;and compliant. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Compliant with what regulations, in which jurisdictions, and for what type of data? The choice between AWS, Azure, or on-premise hosting could hinge entirely on specific compliance requirements. This requirement often appears as a checkbox item, ignoring that compliance is a complex spectrum of legal, technical, and operational considerations.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  From void to valuable: four principles for better requirements
&lt;/h1&gt;

&lt;p&gt;After reading these Barnum-like requirements, you might be wondering "How do I write better ones?" Here's a confession: reviewing my own system designs from the past two years, I discovered I had fallen into the same trap. I sometimes used these vague requirements to subtly steer architecture decisions in the direction I preferred. To protect myself from this bias and improve the quality of my designs, I strictly follow these principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🎯 Focus on outcomes, not solutions

&lt;ul&gt;
&lt;li&gt;Define what success looks like rather than prescribing how to achieve it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;🧪 Requirements must be testable

&lt;ul&gt;
&lt;li&gt;If you can't test it, you can't verify it, and therefore it's not a requirement.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;↔️ Use ranges and degrees instead of absolutes

&lt;ul&gt;
&lt;li&gt;Express constraints through both ranges and precise language (must/should/may) to communicate flexibility and priorities.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;⚖️ Define necessary and sufficient conditions

&lt;ul&gt;
&lt;li&gt;Understand both the minimum needed to succeed and when additional effort yields no value.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To illustrate them, I'll share conversations between two engineers - one proposing requirements, let's call them Pat, the other - Sam - helping to refine them. You might recognize yourself in either role: I know I've played both parts and I’ll continue. That’s why I need to be challenged by others to cover my blind spots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principle 1: Focus on outcomes, not solutions 🎯
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Crafting requirements
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmpz9vo928snapwt842o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmpz9vo928snapwt842o.png" alt="P – The system must be scalable.&amp;lt;br&amp;gt;
S – Actually, scalability is a category of requirements, not a requirement itself." width="519" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvkqudewougq6e217lvkv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvkqudewougq6e217lvkv.png" alt="P – Okay... so what kind of requirements then?&amp;lt;br&amp;gt;
S – What outcomes do you need? How many users? Which regions? How many devs?" width="519" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvxs0h7ie02qyo2b0genl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvxs0h7ie02qyo2b0genl.png" alt="P – Well, we’re in France, with plans to expand to Germany next year. And our dev team will grow from 5 to 20 people.&amp;lt;br&amp;gt;
S – Now that's something we can work with!" width="519" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Software engineering literature often distinguishes between functional and non-functional requirements. But the real insight isn't in sorting requirements into these categories - it's understanding their origins and purposes.&lt;/p&gt;

&lt;p&gt;Functional requirements emerge from business outcomes: they describe what problems we need to solve. They come from product vision, user problems, and business goals. "Doctors can view their schedule offline" is a clear outcome we can build for.&lt;/p&gt;

&lt;p&gt;Non-functional requirements are different - they're rarely explicitly requested but always implicitly expected. As technical experts, it's our responsibility to identify, propose, and quantify them. When a product owner says "doctors should view their schedule," they might not specify "with less than 200ms latency" - but we know that slow response times would make the feature useless. These requirements help us choose between technically viable solutions and find the one that best serves our users.&lt;/p&gt;

&lt;p&gt;These non-functional requirements serve as a mood board for technical quality: security, maintainability, observability, &lt;a href="https://en.wikipedia.org/wiki/Non-functional_requirement" rel="noopener noreferrer"&gt;and many more&lt;/a&gt;. They represent our professional standards rather than specific features. &lt;/p&gt;

&lt;p&gt;Requirements translate desired outcomes into actionable information that helps us evaluate and choose between possible solutions. Each solution comes with its own trade-offs, but we can only assess these trade-offs meaningfully when we clearly understand what we're trying to achieve.&lt;/p&gt;

&lt;p&gt;For example, "support expansion to 3 new countries" might lead us to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-region deployment&lt;/li&gt;
&lt;li&gt;Data residency solutions&lt;/li&gt;
&lt;li&gt;Internationalization approaches.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The hidden solution trap
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F16xdv8i6vwfjam6a3bou.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F16xdv8i6vwfjam6a3bou.png" alt="Later that day…&amp;lt;br&amp;gt;
P – Also, the system must support independent runtimes.&amp;lt;br&amp;gt;
S – And there you have it \- you've fallen into the hidden trap of disguising a solution as a requirement." width="526" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚠️ Sometimes we already have a solution in mind and work backwards to write requirements that will inevitably lead to that solution.&lt;/p&gt;

&lt;p&gt;❌ Once I wrote: "The system must maintain strict consistency across all operations", thinking: "Let’s use PostgreSQL".&lt;br&gt;
✅ Real requirement: "Users must never see outdated prices during checkout"&lt;/p&gt;

&lt;p&gt;❌ another time, I wrote: "The system must support independent deployment of components", thinking: "I want microservices".&lt;br&gt;
✅ Real requirement: "Teams must be able to release features independently"&lt;/p&gt;

&lt;p&gt;Requirements should create space for architectural discussions, not circumvent them. When we find ourselves writing requirements that can only be satisfied by one specific solution, it's often a sign we're working backwards from a preferred technology rather than forward from actual problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principle 2: Requirements must be testable 🧪
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhkok8t1etqwxvc3xwi9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhkok8t1etqwxvc3xwi9.png" alt="P – Okay “not too complex” means nothing, how about “must be user-friendly”?&amp;lt;br&amp;gt;
S – Let's use another tool for this one, can you test user-friendly?" width="519" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kmh1byigs85d8ltm6j3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kmh1byigs85d8ltm6j3.png" alt="P – I guess... if practitioners can easily upload their documents without getting frustrated.&amp;lt;br&amp;gt;
S – Now we're getting somewhere !" width="519" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6cz7zdqd4j9089up075r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6cz7zdqd4j9089up075r.png" alt="S – We could say '95% of practitioners successfully upload their first document within 2 minutes without assistance.'&amp;lt;br&amp;gt;
P – That's something we can actually measure!" width="519" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a fundamental truth in software engineering: if you can't test it, you can't verify it. And if you can't verify it, it's not really a requirement - it's a wish.&lt;/p&gt;

&lt;p&gt;From untestable to testable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Don't : The code should be maintainable &lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Do : A new developer should make their first production commit within their first week&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;❌ Don't : The application should handle high load -&amp;gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Do : The system maintains response times under 200ms for the 99th percentile while processing 100 concurrent requests&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice how testable requirements naturally become more specific and actionable. They create clear acceptance criteria and enable objective discussions about whether they've been met.&lt;/p&gt;

&lt;p&gt;By the way, even architectural decisions can be tested - as Neal Ford describes in &lt;a href="https://www.oreilly.com/library/view/software-architecture-the/9781492086888/" rel="noopener noreferrer"&gt;Software Architecture: The Hard Parts&lt;/a&gt;, fitness functions help us verify our architectural characteristics through automated tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principle 3: Use ranges and degrees instead of absolutes ↔️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ogw3iuozy248vtrhp89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ogw3iuozy248vtrhp89.png" alt="P – For the document upload feature, everything must be secure.&amp;lt;br&amp;gt;
S – Must? Are you sure about that word choice?" width="519" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6srlk6s4aveja7467gkl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6srlk6s4aveja7467gkl.png" alt="P – Well... isn't security always mandatory?&amp;lt;br&amp;gt;
S – Let's break it down. What aspects of security are truly mandatory versus highly desirable?" width="519" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1iqzdget6qx5nc0n9lu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1iqzdget6qx5nc0n9lu.png" alt="P – Okay... patient documents MUST be encrypted. The upload link SHOULD expire after 24 hours. And we MAY add watermarking for extra tracking." width="519" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In software engineering, precision in language helps communicate constraints and priorities. That's why we use specific terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔒 MUST: Absolute requirement, non-negotiable&lt;/li&gt;
&lt;li&gt;📌 SHOULD: Highly desirable but not mandatory&lt;/li&gt;
&lt;li&gt;✨ MAY: Optional, nice to have&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7n21ul1jew02jreoalc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7n21ul1jew02jreoalc.png" alt="P – Ah, and we'll have to validate documents with the government, they have an API that takes a second.&amp;lt;br&amp;gt;
S – 1 second every time? What's your confidence here? Maybe you can use tolerances?" width="579" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foozf35sbki2cxm3uidsb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foozf35sbki2cxm3uidsb.png" alt="P – Well... their documentation says 1 second, but that's probably best-case scenario.&amp;lt;br&amp;gt;
S – A controlled API might give you 1s ± 50ms. But for a government service, we're probably looking at 1-2s under load." width="578" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnndhemg5w063kyb4mli6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnndhemg5w063kyb4mli6.png" alt="P – That's quite different! One is precision, the other is uncertainty.&amp;lt;br&amp;gt;
S – Exactly! Be explicit about this uncertainty, it helps us make better design decisions." width="574" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just like mechanical engineering uses tolerances, software requirements work better with realistic ranges. &lt;br&gt;
They not only acknowledge that perfect precision is neither possible nor necessary but also help us express our level of confidence - especially crucial when dealing with external dependencies.&lt;/p&gt;

&lt;p&gt;For example, when specifying API response times:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In-memory search must return within 5ms ± 1ms (precise, highly controlled)&lt;/li&gt;
&lt;li&gt;Full-text search should take 0.5-2s (moderate variability, Historical data available)&lt;/li&gt;
&lt;li&gt;System should serve 10k-100k users (Low Confidence for new Market Entry Based on comparable markets)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Principle 4: Define necessary and sufficient conditions ⚖️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rsw0fdthcxe73mp9itc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rsw0fdthcxe73mp9itc.png" alt="P – For the document upload service, how do we figure out what availability we provide?&amp;lt;br&amp;gt;
S – Let's find our boundaries. What's the minimum that keeps doctors using the service?" width="530" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftqypznhiu8n90k8141lg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftqypznhiu8n90k8141lg.png" alt="P – Well, at 99.9%, that's 43 minutes of downtime per month...&amp;lt;br&amp;gt;
S – During business hours, that's already one visible incident. Any more would damage trust." width="530" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnifxsdc2kg4oxbgjiyo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnifxsdc2kg4oxbgjiyo.png" alt="P – So that's our necessary condition \- can't go lower.&amp;lt;br&amp;gt;
S – Right. Now, 99.999% means 26 seconds downtime per month, and 99.9999% is just 2.6 seconds." width="529" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbs3hc7k2e1rf86v75xe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbs3hc7k2e1rf86v75xe.png" alt="P – Doctors won't notice the difference. So 99,999% is sufficient." width="530" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This dialogue illustrates a key principle: requirements have both a lower and upper bound. While necessary conditions are rarely missed (failure makes them obvious), sufficient conditions are often overlooked - leading to wasted optimization efforts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✔️ Necessary conditions&lt;/strong&gt; define the minimum viable threshold - below this, the solution fails its purpose. This creates a clear "MUST" requirement that helps eliminate unviable solutions early. For example, if document upload takes more than 5 seconds, users won't use it, making any solution that can't meet this threshold unviable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Sufficient conditions&lt;/strong&gt; identify the point beyond which additional improvement has no impact on users or business outcomes. It's not about trade-offs - if users can't perceive a difference, any additional optimization is objectively worthless, regardless of how easy or hard it might be to achieve. I want to insist on this. The sufficient condition isn't a compromise - it's the point where further improvements become meaningless.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When displaying product inventory in e-commerce

&lt;ul&gt;
&lt;li&gt;✅ Sufficient conditions : 5-second consistency delay&lt;/li&gt;
&lt;li&gt;Users take longer than this to add items to cart, faster synchronization creates no benefit&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;When displaying search results

&lt;ul&gt;
&lt;li&gt;✅ Sufficient conditions : 100 results per page&lt;/li&gt;
&lt;li&gt;Analytics show users never scroll past result 80&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;When processing expense claims

&lt;ul&gt;
&lt;li&gt;✅ 48-hour validation delay&lt;/li&gt;
&lt;li&gt;Payroll cycles operate monthly, faster processing doesn't accelerate reimbursement&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Between these boundaries lies our practical engineering target. Understanding this helps prevent the common pitfall of over-engineering in pursuit of unnecessary perfection.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Requirements aren't just a box to check in your system design process - they're the foundation that enables and justifies rational technical decisions. They serve a dual purpose: first guiding our design choices, then later justifying these decisions to others.&lt;br&gt;
We didn't choose Redis because it was trendy, but because we needed sub-millisecond access to session data. We didn't adopt Kubernetes because everyone else did, but because our deployment requirements demanded independent scaling of components. These requirements become the rational foundation of our architecture - not "because the tech lead said so" but because specific, measurable criteria led us there.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎁 My Go-to Checklist
&lt;/h2&gt;

&lt;p&gt;As a gift for reading to the end, here's what I keep on my mental sticky note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you hear "we need X" → ask "what problem are we solving?"&lt;/li&gt;
&lt;li&gt;When requirements feel vague → "how would we test this?"&lt;/li&gt;
&lt;li&gt;When unsure about numbers → start with ranges&lt;/li&gt;
&lt;li&gt;When optimizing → check if you're past "good enough"&lt;/li&gt;
&lt;li&gt;When justifying decisions → point to requirements, not opinions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep these in your back pocket - they've saved me from many circular architecture discussions!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
