Where Humans Still Beat AI: System Design and Engineering
Key takeaways
AI-generated code can produce software components, but system design defines intended use, software architecture, system constraints, failure modes, and production behavior.
AI cannot replace requirements engineering. Requirements engineering establishes functional requirements, non-functional requirements, system constraints, risk analysis, verification strategy, and acceptance criteria before implementation begins.
Production software depends on system architecture and engineering trade-offs. Production software requires software architecture, performance, memory management, cybersecurity, reliability, maintainability, cost, schedule, and engineering trade-offs beyond code generation.
AI-assisted software development still requires human verification, i.e. relies on architecture review, code review, static analysis, software testing, security validation, and release readiness before production deployment.
Human engineers remain accountable for production software: make architecture decisions, resolve ambiguous requirements, validate AI-generated code, approve engineering trade-offs, and remain accountable for production software quality and risk.
A new tool appears, changes the economics of work, and people start arguing about whether it is magic or a threat. We have seen this pattern before. Who still remembers the Luddites and the machines they smashed?
In my view, both positions miss the engineering challenges it creates.
The current consensus AI can write code. The myth around it is that code generation equals product engineering.
AI should not be rejected out of panic, nor should it be treated as a senior engineer in a browser tab. Used well, it is a powerful accelerator. Used blindly, it is a fast way to manufacture technical debt with confident formatting.
The real challenge begins when we move from generating components to designing the system.
By system design and engineering, I do not mean only low-level or embedded programming, but mostly deciding what the product, as a whole system, must do, what constraints it must survive, what risks are unacceptable, and how all components behave together in production. It is the difference between making a function work and making the product behave correctly when users, data, infrastructure, and failure modes collide.
AI can help generate components. It can write boilerplate, suggest wrappers, translate code, produce test skeletons, and summarize unfamiliar modules. Meanwhile, a product is not a pile of components, but a system designed to satisfy real customer requirements under real-life constraints: performance, memory, safety, security, maintainability, cost, schedule, and failure modes.
Producing code faster does not remove the engineering decisions the product still requires. And this is where humans still beat AI.
The AnyMegaCalc Test: What You Meant vs. What AI Hears
The problem is easier to see when we compare two prompts.
A beginner may write something like this:
“Hey AI coder, develop a new AnyMegaCalc application similar to NotAMegaCalc, but with new shiny buttons.”
A more experienced vibe coder may write something closer to this:
“You are a seasoned software engineer. Develop a new AnyMegaCalc application, make it rock solid, with no bugs, no memory leaks or race conditions, suitable for production use, and strict enough that it could survive regulated-grade review if needed. Pull the requirements from the internet for competing applications and follow the latest engineering principles.
The second prompt is obviously better. It asks for quality, production readiness, memory safety, concurrency discipline, competitive analysis, and engineering principles.
The problem is that it still does not define the system. At the component level, this sounds like a request for code. At the level of system design, it is a request for a product strategy, requirements process, architecture, risk analysis, non-functional specification, verification plan, toolchain policy, and release criteria.
Component-level work is a narrow task behind an interface: read a file, write to a database, call an API, display a state change, parse a response, transform an object, generate a report. System design is the work of making the whole product solve the customer’s problem. It defines why the components exist, how they interact, what constraints they must respect, and what must never happen.
AI-assisted development fails not only when the model invents something and starts hallucinating. It also fails when it follows an incomplete prompt exactly as written, when the right engineering response would be to challenge it first. A parser can be correct, a database write can be correct, and a UI update can be correct, while the full workflow still violates the customer’s intent.
Usually, the customer expects that “what he meant” doesn’t equal “what he literally said.” Human engineers know that gap very well. So, unlike LLM models, they are not guessing better. They start asking questions, like: “Who is the user? What does “calculator” mean in this domain? What decisions does it support? What happens if the answer is wrong? What does “rock solid” mean: uptime, numerical accuracy, deterministic behavior, bounded latency, no memory leaks, no data loss, no race conditions, no privilege escalation? What platform are we targeting? What is the budget? What is the release timeline? What is the acceptable risk?
The right approach is to make the assumptions explicit, get answers, and even change the architecture if needed. The goal is not the most elegant architecture. It is architecture that solves this problem within the project’s time, budget, and risk profile.
Where AI Delivers Value Now
I don’t want to say that AI is useless in system design and engineering. I am not an anti-AI luddite looking forward to reducing AI usage to zero. The point is to use it where acceleration is real, and the verification path is clear.
Based on my team’s experience, AI is already useful for:
- Scaffolding, glue, and migration. Wrappers, adapters, API clients, language translation, configuration, build scripts, CI plumbing, and repetitive integration code.
- Test generation. Drafting unit tests, property-based test seeds, fuzzing harnesses, mock data, and skeletons for integration tests. Engineers still define what matters and review test outputs.
- Code comprehension. Summarizing unfamiliar modules, generating call graphs, identifying likely entry points, or helping reviewers understand a subsystem before reading the code.
- Repetitive engineering work. Configuration variants, edge-case enumeration, documentation skeletons, policy templates, and similar work where output is easy to verify.
- Review preparation. Highlighting suspicious patterns, comparing code against project conventions, and preparing review questions. Reviewing remains a human responsibility.
The practical rule is simple: use AI where being wrong is inexpensive and the output can be verified. Keep engineering decisions where they belong.
Where Humans Still Outperform AI
Humans still outperform AI where engineering is not just code synthesis.
Ambiguous requirements. Real requirements are rarely complete. Humans negotiate scope, find missing constraints, challenge contradictions, and translate customer intent into engineering decisions.
Domain reality. Subject Matter Experts know what the textbooks omit: operational details, historical accidents, edge cases, and the difference between “technically correct” and “will survive contact with the real world.”
Failure experience. Many risks remain theoretical until someone has seen the impact directly. When a hammer falls on your foot, it hurts. Engineers who have lived through failures design, review, and approve differently.
Architecture and non-functional trade-offs. Choosing an architecture means balancing latency, throughput, memory, failure modes, deployment constraints, cybersecurity, observability, maintainability, cost, and schedule. Syntax is the easy part.
Invariants and properties. AI can help check invariants once humans define them. It should not be trusted to invent the critical properties of the system on its own.
Risk ownership. Risk is not a paragraph in a generated document. It is a decision about what can go wrong, how bad it can be, how likely it is, and what controls are sufficient.
Accountability. AI can propose. Humans decide, justify, explain, and sign. This is true in regulated industries, but not only there. Every shipped product has an accountable organization behind it.
Ethical and legal judgment. Privacy, safety, liability, fairness, and misuse are socio-technical decisions. They are not solved by autocomplete.
No perfect prompt removes the need for grounded domain knowledge, review, validation, and human decision-making. Believing otherwise is just another version of magical thinking.
How We Approach This in Practice
AI works best when it is placed inside an engineering process, not used as a replacement for engineering judgment.
A serious system design approach starts with intent. What is the product supposed to do? Who uses it? What decision or workflow does it support? What harm, loss, or operational failure must be prevented?
Then come the constraints: reliability targets, latency budgets, memory ceilings, throughput, availability, data integrity, cybersecurity posture, observability, deployment environment, platform limits, and maintenance expectations.
Usually, after come engineering choices: operating system, language, hardware, portability needs, safe subsets, MISRA-like rules where relevant, memory model, concurrency model, lock hierarchy, scheduling rules, and failure-handling behavior.
Not every product needs the same level of control. But every product needs a deliberate decision about which constraints matter, which risks are acceptable, and which assumptions must be tested before release.
Finally, come the gates: requirements review, architecture review, design review, static analysis, dynamic analysis, security scanning, test coverage, fuzzing where needed, code review, and release readiness.
AI can support many of these steps. It can draft requirements, propose edge cases, generate test skeletons, summarize code, suggest refactoring, and prepare documentation. The decisions, however, still belong to qualified engineers and SMEs.
AI does not remove engineering work. It moves more of that work from raw creation into defining intent, results verification, and correcting direction. Deep domain knowledge is still needed to catch subtle bugs. System design thinking is needed to recognize the moment when correct components produce a broken system. Process maturity is still needed to prevent compliance, security, and reliability from becoming a theatre.
What Goes Wrong When Nobody Watches
Failures are often not dramatic at first. They look small. That is what makes them dangerous.
In one bash script, AI mixed if/fi shell syntax with C-style curly braces inside the same conditional clause. Easy to spot, easy to fix. The bug is trivial. The lesson is not: AI can present invalid output in a production-ready tone.
In another case, while parsing return codes from a widely used open-source tool, AI shifted error-message strings by two positions. The bit parsing logic was correct. The error strings were accurate copies from the manual page. The combined solution was wrong. Perfect-looking pieces, broken system.
The same pattern appears in interviews. Candidates submit nearly identical AI-generated solutions with the same bug. The code works as an abstract answer but ignores the test’s constraints for accuracy and performance. This is what happens when people submit generated components without understanding constraints.
These examples are not arguments against AI. They are arguments against using AI without supervision. The most dangerous AI output is not the obviously broken output. The dangerous output is plausible, readable, and almost right.
Conclusion: Engineering Still Owns the System
AI can help produce artifacts. It cannot replace engineering judgment or the gates that protect a production system.
AnyMegaCalc may not be a pacemaker or a braking controller. Maybe nobody gets hurt when it returns the wrong answer. Maybe no regulator calls. Maybe the incident only becomes a support ticket. “Not safety-critical” still does not mean “not engineered.” The engineering principle remains the same: the system must satisfy its intended use, not merely produce output that looks like software.
For prototypes, AI-first development can be fast and useful. For production systems, “the code looks right” is not a release criterion.
Before shipping AI-assisted software, product owners and engineering leaders should be able to answer a few questions:
- Is intended use written down clearly enough that engineering and QA can test against it?
- Are non-functional requirements defined, including latency, memory, throughput, reliability, security, and observability?
- Are architecture decisions documented with their rationale?
- Are deterministic checks used wherever AI output could be plausible but wrong: static analysis, tests, linters, security scanning?
- Does a human owner sign off at important engineering gates?
If several answers are “no,” the team may be moving fast, but it is probably not moving under control.
AI can sprint. Engineering still decides what gets built, what gets shipped, and what risks are acceptable. Once AI accelerates implementation, the bottleneck moves to judgment, evidence, and accountability.
The next question is no longer whether AI belongs in engineering. It is how to keep AI-assisted development under control without turning every software team into a regulatory department.
That is the subject of the next article.

