<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DDD on kenji.blog</title><link>http://kenji.blog/en/tags/ddd/</link><description>Recent content in DDD on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/en/tags/ddd/index.xml" rel="self" type="application/rss+xml"/><item><title>The 'Human-Specific Engineering Skills' Required in the Era of AI Writing Code</title><link>http://kenji.blog/en/p/human-engineer-skills-ai-era/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/en/p/human-engineer-skills-ai-era/</guid><description>&lt;img src="http://kenji.blog/p/human-engineer-skills-ai-era/img/eyecatch.jpg" alt="Featured image of post The 'Human-Specific Engineering Skills' Required in the Era of AI Writing Code" />&lt;h1 id="the-human-specific-engineering-skills-required-in-the-era-of-ai-writing-code">The &amp;lsquo;Human-Specific Engineering Skills&amp;rsquo; Required in the Era of AI Writing Code
&lt;/h1>&lt;p>In recent years, the landscape of software engineering has changed dramatically with the rapid evolution of Generative AI and Large Language Models (LLMs). GitHub Copilot and various AI coding assistants are now used on a daily basis, and the phenomenon where &amp;ldquo;AI instantly generates code if you give instructions in natural language&amp;rdquo; is no longer science fiction from the future, but today&amp;rsquo;s reality.&lt;/p>
&lt;p>In such an era, it is natural for many engineers to harbor anxiety that &amp;ldquo;my job might be taken away by AI.&amp;rdquo; Indeed, &amp;ldquo;mere coding work (Typing Code)&amp;rdquo; such as creating boilerplate for routine CRUD applications, implementing simple algorithms, or calling APIs of well-known libraries is rapidly becoming commoditized.&lt;/p>
&lt;p>However, the essence of software engineering is not about &amp;ldquo;typing code.&amp;rdquo; It is about solving business challenges through technology and building scalable, maintainable systems. In this article, we will explore in profound and technical depth the &amp;ldquo;human-specific engineering skills&amp;rdquo; that become even more valuable in the era of AI writing code, looking at it from perspectives such as the technical limitations of LLMs, Domain-Driven Design (DDD), system architecture, and debugging distributed systems.&lt;/p>
&lt;hr>
&lt;h2 id="1-understanding-the-structural-limitations-of-large-language-models-llms">1. Understanding the Structural Limitations of Large Language Models (LLMs)
&lt;/h2>&lt;p>To properly evaluate AI&amp;rsquo;s capabilities and discern the areas where humans should demonstrate value, we must first understand the structural limitations of AI (especially LLMs) from mathematical and architectural standpoints.&lt;/p>
&lt;h3 id="11-limits-of-computational-complexity-and-context-in-the-transformer-architecture">1.1 Limits of Computational Complexity and Context in the Transformer Architecture
&lt;/h3>&lt;p>The majority of current LLMs are based on the &amp;ldquo;Transformer&amp;rdquo; architecture introduced by Google in 2017. The core of the Transformer lies in its &amp;ldquo;Self-Attention Mechanism.&amp;rdquo; The self-attention mechanism computes how closely each token in an input sequence is related to all other tokens.&lt;/p>
&lt;p>This attention calculation formula is expressed as follows:&lt;/p>
$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$&lt;p>Here, $Q$ (Query), $K$ (Key), and $V$ (Value) are linear transformations of the input sequence, and $d_k$ is the dimensionality of the keys.
The most critical constraint in this calculation is the computational complexity associated with the matrix multiplication $QK^T$. If the input sequence (number of tokens) is $N$, this computational complexity grows on the order of $O(N^2)$ both in terms of time and space (memory).&lt;/p>
$$ \text{Complexity} = O(N^2 \cdot d) $$&lt;p>In recent years, research on hardware-level optimizations like FlashAttention, Sparse Attention, and even alternative architectures capable of linear time $O(N)$ processing such as Mamba (State Space Models) has been advancing. Still, &amp;ldquo;perfectly comprehending an infinite context and generating globally optimized outputs&amp;rdquo; remains extremely difficult.&lt;/p>
&lt;p>Furthermore, even if the context window can be physically expanded, a phenomenon called &amp;ldquo;Lost in the Middle&amp;rdquo; occurs. LLMs are highly susceptible to information at the beginning and end of a prompt, and tend to ignore important requirements and constraints placed in the middle. This is why, if you load the entire source code of a tens-of-thousands-of-lines enterprise system into an LLM and instruct it to &amp;ldquo;perform optimal refactoring&amp;rdquo;, it generates code that is locally correct but globally broken.&lt;/p>
&lt;h3 id="12-characteristics-of-probabilistic-generative-models-and-hallucinations">1.2 Characteristics of Probabilistic Generative Models and &amp;ldquo;Hallucinations&amp;rdquo;
&lt;/h3>&lt;p>The true nature of an LLM is a &amp;ldquo;probabilistic generative model&amp;rdquo; that predicts the token with the highest probability of appearing next, based on the input context (prompt) and the generation results so far.&lt;/p>
$$ P(w_t | w_{1:t-1}) = \text{softmax}(W \cdot h_t) $$&lt;p>The model merely learns &amp;ldquo;statistical co-occurrence relationships of words&amp;rdquo; from vast amounts of training data, and does not understand the &amp;ldquo;Semantics&amp;rdquo; of the generated code or the &amp;ldquo;real-world implications of the execution results.&amp;rdquo; This is what causes &amp;ldquo;hallucinations.&amp;rdquo;
Bugs such as calling imaginary library functions that do not exist, or passing variables with subtly mismatched types, are simply the result of the LLM generating a &amp;ldquo;grammatically plausible (high probability) sequence of tokens.&amp;rdquo;&lt;/p>
&lt;h3 id="13-lack-of-real-world-grounding">1.3 Lack of Real-World Grounding
&lt;/h3>&lt;p>AI lacks the ability to intuitively understand &amp;ldquo;physical constraints&amp;rdquo; or &amp;ldquo;real business constraints&amp;rdquo; (Grounding). For instance, it cannot consider the business reality that &amp;ldquo;a 100ms delay in payment processing latency reduces the conversion rate by 5%&amp;rdquo;, or environment-specific tacit knowledge like &amp;ldquo;transactions are prone to time out during this time period because batch processing runs on this legacy DB at 2:00 AM&amp;rdquo;, unless explicitly provided as text.&lt;/p>
&lt;p>Given these technical and structural limitations, we can see that while AI is an extremely excellent tool for &amp;ldquo;rapidly generating code within a clearly defined, narrow scope (functions, classes, modules)&amp;rdquo;, the act of &amp;ldquo;designing a whole system from ambiguous requirements and aligning it with real-world constraints&amp;rdquo; remains a uniquely human domain.&lt;/p>
&lt;hr>
&lt;h2 id="2-human-specific-skill-1-extracting-true-challenges-from-ambiguous-requirements">2. Human-Specific Skill 1: Extracting &amp;ldquo;True Challenges&amp;rdquo; from Ambiguous Requirements
&lt;/h2>&lt;p>The greatest hurdle in software development is not writing the code itself.
Frederick Brooks, author of the software engineering classic &amp;ldquo;The Mythical Man-Month&amp;rdquo;, stated:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;The hardest single part of building a software system is deciding precisely what to build.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Non-technical stakeholders (management, sales departments, customers) are mostly unable to verbalize what they truly want. Every day, engineers receive extremely ambiguous and contradictory requests such as &amp;ldquo;I want you to make a system that increases sales using AI&amp;rdquo; or &amp;ldquo;I want a screen where everything is automated with just the push of a single button.&amp;rdquo;&lt;/p>
&lt;p>Even if you feed a prompt into an AI saying, &amp;ldquo;Write code for a system that increases sales&amp;rdquo;, no usable system will come out. What is required of engineers is the following process:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Deep diving into the domain&lt;/strong>: Drawing out the &amp;ldquo;real business challenges&amp;rdquo; hidden behind the stakeholders&amp;rsquo; words through dialogue.&lt;/li>
&lt;li>&lt;strong>Scoping requirements&lt;/strong>: Weighing technical feasibility against cost (ROI) and deciding &amp;ldquo;what not to do.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Formalizing specifications&lt;/strong>: Translating ambiguous requirements into clear logical constraints (prompts or architecture blueprints) that AI can understand.&lt;/li>
&lt;/ol>
&lt;p>This &amp;ldquo;high-level human-to-human communication and negotiation&amp;rdquo; is a highly personalized and valuable skill that AI can never replace.&lt;/p>
&lt;hr>
&lt;h2 id="3-human-specific-skill-2-domain-driven-design-ddd-and-modeling">3. Human-Specific Skill 2: Domain-Driven Design (DDD) and Modeling
&lt;/h2>&lt;p>After eliciting requirements, the most powerful weapon for translating them into software structure is &amp;ldquo;Domain-Driven Design&amp;rdquo; (DDD). As AI increasingly generates local code automatically, the DDD concept of where to draw the &amp;ldquo;boundaries&amp;rdquo; of the overall system becomes vitally important.&lt;/p>
&lt;h3 id="31-establishing-a-ubiquitous-language">3.1 Establishing a Ubiquitous Language
&lt;/h3>&lt;p>In system development, if the &amp;ldquo;meaning of words&amp;rdquo; differs between the business side and the development side, AI will generate code in the wrong context. For example, the word &amp;ldquo;user&amp;rdquo; might refer to a &amp;ldquo;lead (prospective customer)&amp;rdquo; for the marketing department, but to an &amp;ldquo;already-contracted account&amp;rdquo; for customer support.
Human engineers must establish a unified &amp;ldquo;Ubiquitous Language&amp;rdquo; across the entire project, and enforce this language all the way down to class names, method names in code, and prompts to the AI.&lt;/p>
&lt;h3 id="32-designing-bounded-contexts">3.2 Designing Bounded Contexts
&lt;/h3>&lt;p>Attempting to represent a massive system with a single model will invariably fail. In DDD, a system is divided into meaningful boundaries (Bounded Contexts).
For example, in an e-commerce site, the concept of a &amp;ldquo;Product&amp;rdquo; has completely different attributes and behaviors it should possess in the catalog (display) context versus the inventory (management) context.&lt;/p>
&lt;p>Only when a human architect draws the correct context boundaries and assigns implementations to AI with independent prompts and specifications for each context, can the AI generate &amp;ldquo;code based on correct domain knowledge.&amp;rdquo;&lt;/p>
&lt;p>The following diagram illustrates the DDD approach and the division of roles in the AI era.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Business Requirements / Stakeholder Requests&amp;#34;] --&amp;gt; B[&amp;#34;Domain-Driven Design (Human&amp;#39;s Role)&amp;#34;]
B --&amp;gt; C[&amp;#34;Defining Bounded Contexts&amp;#34;]
B --&amp;gt; D[&amp;#34;Establishing Ubiquitous Language&amp;#34;]
C --&amp;gt; E[&amp;#34;Prompting AI / Code Generation&amp;#34;]
D --&amp;gt; E
E --&amp;gt; F[&amp;#34;Code Review / Validating Architecture&amp;#34;]
F --&amp;gt; G[&amp;#34;System Deployment and Monitoring&amp;#34;]
style B fill:#f9f,stroke:#333,stroke-width:2px
style C fill:#f9f,stroke:#333,stroke-width:2px
style D fill:#f9f,stroke:#333,stroke-width:2px
&lt;/pre>
&lt;p>Rather than instructing AI to &amp;ldquo;build the entire system&amp;rdquo;, humans will delegate implementation to AI strictly within the &amp;ldquo;context boundaries&amp;rdquo; they have defined. This will become the fundamental paradigm of software development going forward.&lt;/p>
&lt;hr>
&lt;h2 id="4-human-specific-skill-3-distributed-system-architecture-design-and-scaling">4. Human-Specific Skill 3: Distributed System Architecture Design and Scaling
&lt;/h2>&lt;p>Modern software is evolving from monoliths running on a single server to cloud-native microservices architectures and event-driven architectures. Designing such distributed systems is a profoundly difficult area for AI, which can only perform localized logic optimization.&lt;/p>
&lt;h3 id="41-the-cap-theorem-and-judging-trade-offs">4.1 The CAP Theorem and Judging Trade-offs
&lt;/h3>&lt;p>When designing a distributed system, engineers constantly confront the &amp;ldquo;CAP Theorem.&amp;rdquo; The CAP Theorem is the principle that a distributed system can only satisfy two out of the following three properties simultaneously:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Consistency&lt;/strong>: Does every node see the same data at the same time?&lt;/li>
&lt;li>&lt;strong>Availability&lt;/strong>: Does the system continue to respond even if some nodes fail?&lt;/li>
&lt;li>&lt;strong>Partition Tolerance&lt;/strong>: Does the system continue to operate even if a network partition occurs?&lt;/li>
&lt;/ul>
$$ P(\text{Availability} \cup \text{Consistency}) | \text{PartitionTolerance} $$&lt;p>Since partitions are unavoidable in real-world networks, engineers must make severe trade-off decisions directly tied to business requirements, such as &amp;ldquo;This payment system prioritizes Consistency, so we stop the service during a failure (CP)&amp;rdquo; or &amp;ldquo;This SNS timeline prioritizes Availability, so we tolerate temporary data inconsistency (AP).&amp;rdquo;&lt;/p>
&lt;p>While AI can write &amp;ldquo;code that prioritizes C&amp;rdquo; or &amp;ldquo;code that prioritizes A&amp;rdquo;, it cannot autonomously make the decision of &amp;ldquo;which should be prioritized,&amp;rdquo; a decision that involves business risks.&lt;/p>
&lt;h3 id="42-asynchronous-communication-and-eventual-consistency">4.2 Asynchronous Communication and Eventual Consistency
&lt;/h3>&lt;p>As systems scale up, inter-service coordination transitions from synchronous communication via REST APIs to asynchronous communication using message queues (such as Kafka or RabbitMQ). Here, data consistency shifts from immediate consistency to &amp;ldquo;Eventual Consistency.&amp;rdquo;
At what point should advanced architectural patterns like the Saga pattern or CQRS (Command Query Responsibility Segregation) be introduced? Making these complex decisions and drawing the blueprint for the entire system is exactly where the true worth of a senior engineer shines.&lt;/p>
&lt;pre class="mermaid">
flowchart LR
Client[&amp;#34;Client&amp;#34;] --&amp;gt; API[&amp;#34;API Gateway&amp;#34;]
API --&amp;gt; Order[&amp;#34;Order Service (Context)&amp;#34;]
Order -. &amp;#34;Asynchronous Event (Kafka)&amp;#34; .-&amp;gt; Inventory[&amp;#34;Inventory Service&amp;#34;]
Order -. &amp;#34;Asynchronous Event (Kafka)&amp;#34; .-&amp;gt; Payment[&amp;#34;Payment Service&amp;#34;]
Inventory --&amp;gt; DB1[&amp;#34;Inventory DB&amp;#34;]
Payment --&amp;gt; DB2[&amp;#34;Payment DB&amp;#34;]
Order --&amp;gt; DB3[&amp;#34;Order DB&amp;#34;]
&lt;/pre>
&lt;hr>
&lt;h2 id="5-human-specific-skill-4-debugging-and-troubleshooting-complex-systems">5. Human-Specific Skill 4: Debugging and Troubleshooting Complex Systems
&lt;/h2>&lt;p>The more AI-generated code there is, the higher the risk that &amp;ldquo;code nobody fully understands&amp;rdquo; runs in the production environment. While it may run smoothly in normal times, the true value of human engineers is tested during troubleshooting when an outage occurs.&lt;/p>
&lt;h3 id="51-designing-observability">5.1 Designing Observability
&lt;/h3>&lt;p>To rapidly resolve system outages, simply pasting error logs into an AI is insufficient. In a microservices environment, a single request traverses dozens of services.
Engineers must appropriately build the &amp;ldquo;three pillars of observability&amp;rdquo;—Logs, Metrics, and Traces—into the system. It is a human&amp;rsquo;s role to utilize tools like OpenTelemetry to build a foundation that can pinpoint &amp;ldquo;which database query in which service is experiencing latency&amp;rdquo; through distributed tracing.&lt;/p>
&lt;h3 id="52-environment-dependent-bugs-and-chaos-engineering">5.2 Environment-Dependent Bugs and Chaos Engineering
&lt;/h3>&lt;p>&amp;ldquo;Bugs that don&amp;rsquo;t reproduce in local or test environments, but only occur during peak times in the production environment&amp;rdquo;—for instance, memory leaks, database deadlocks, connection pool exhaustion, or network packet loss—can never be found simply by static analysis of the source code.&lt;/p>
&lt;p>Human engineers form hypotheses while glaring at production environment metrics, analyze thread dumps and heap dumps, and identify bottlenecks. AI cannot tap away at a terminal to directly profile a production server process (nor should it be permitted to do so, as a security requirement).
As systems become more complex, the value of engineers possessing &amp;ldquo;low-level knowledge&amp;rdquo; of physical infrastructure, network protocols, and OS kernel tuning, along with &amp;ldquo;intuitive hypothesis-driven reasoning skills&amp;rdquo;, will skyrocket.&lt;/p>
&lt;hr>
&lt;h2 id="6-the-value-function-and-time-allocation-of-engineers-in-the-ai-era">6. The Value Function and Time Allocation of Engineers in the AI Era
&lt;/h2>&lt;p>As discussed thus far, the skill set required of engineers in the AI era is undergoing a massive paradigm shift. If we model this mathematically, the value created by an engineer ($V$) could be expressed as follows:&lt;/p>
$$ V = \left( \sum_{i=1}^{n} \text{DomainKnowledge}_i + \text{ArchitectureSkill} + \text{ProblemSolving} \right) \times \text{AI\_Leverage}^{\alpha} $$&lt;p>Traditional &amp;ldquo;coding speed&amp;rdquo; and &amp;ldquo;syntax memory&amp;rdquo; have been eliminated from this formula. Instead, it is structured to generate exponential value by multiplying the &amp;ldquo;sum&amp;rdquo; of deep domain knowledge, architecture design skills, and complex problem-solving abilities by the leverage of mastering AI ($\text{AI\_Leverage}^{\alpha}$).&lt;/p>
&lt;p>This paradigm shift will also be clearly evident in how engineers use their time on a daily basis (time allocation).&lt;/p>
&lt;pre class="mermaid">
pie title Engineer Time Allocation (Pre-AI)
&amp;#34;Coding / Fixing Syntax Errors&amp;#34;: 50
&amp;#34;Requirements Definition / System Design&amp;#34;: 20
&amp;#34;Implementing and Running Tests&amp;#34;: 20
&amp;#34;Production Ops / Debugging&amp;#34;: 10
&lt;/pre>
&lt;pre class="mermaid">
pie title Engineer Time Allocation (AI Era)
&amp;#34;Domain Modeling and Architecture Design&amp;#34;: 40
&amp;#34;Prompting AI and Code Validation&amp;#34;: 20
&amp;#34;Advanced Production Debugging and Ops&amp;#34;: 30
&amp;#34;Self-Coding (Core Areas)&amp;#34;: 10
&lt;/pre>
&lt;p>In the AI era, engineers will be elevated from &amp;ldquo;code typists&amp;rdquo; to &amp;ldquo;conductors orchestrating the entire system.&amp;rdquo; Precisely because AI will write massive amounts of code, the role of &amp;ldquo;reviewer&amp;rdquo; and &amp;ldquo;architect&amp;rdquo;—who monitors and governs whether the code is pointing in the right direction, satisfies security requirements, and aligns with the overall system architecture—will be demanded of all engineers, from junior to senior levels.&lt;/p>
&lt;hr>
&lt;h2 id="7-conclusion-dont-resist-evolution-ride-the-wave">7. Conclusion: Don&amp;rsquo;t Resist Evolution, Ride the Wave
&lt;/h2>&lt;p>The &amp;ldquo;era of AI writing code&amp;rdquo; is not a threat to engineers, but the greatest opportunity in history. Just as the transition from assembly language to C occurred in the past, and just as the evolution from manual memory pointer management to Java&amp;rsquo;s garbage collection took place, code generation by AI is simply &amp;ldquo;moving up one level of abstraction.&amp;rdquo;&lt;/p>
&lt;p>Engineers of the future will not be swayed by the trivial specifications of a particular programming language or framework upgrades, but will be able to concentrate their resources on more essential, higher-order human problem solving, such as: &lt;strong>&amp;ldquo;What is the business challenge?&amp;rdquo;, &amp;ldquo;How should data be partitioned and integrated?&amp;rdquo;, and &amp;ldquo;How do we rapidly recover when the system goes down?&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>A true engineer is not someone who writes code, but someone who solves problems.
Domain modeling, scalable architecture design, communication with stakeholders, and debugging complex systems. For those who continue to polish these &amp;ldquo;human-specific engineering skills,&amp;rdquo; AI will not be an enemy that takes away jobs, but the ultimate partner that expands their own creativity and productivity tens of times over.&lt;/p></description></item></channel></rss>