Showing posts with label software engineering. Show all posts
Showing posts with label software engineering. Show all posts

Thursday, July 30, 2026

AI Breaks Developer Boundaries 1 - Why Walls Form

Series · AI Breaks Developer Boundaries

Article series · Ongoing

Episode 1 · AI Breaks Developer Boundaries 1 - Why Walls Form

This is the first of a three-part series on the boundaries among web, game, and embedded development, and on how AI tools are reshaping them. A developer has long been someone who absorbs the cost of connecting layers that were not designed to fit together neatly.

After enough time in one kind of project, other disciplines can feel foreign. A web developer may hesitate at a game server's threading model; a game developer may slow down when a board and a serial port appear; an embedded engineer may regard browser-framework churn as someone else's weather. That is not a measure of intelligence. Each domain has required a different shape of knowledge.

This article describes those differences without romanticizing them. The later articles will not argue that AI automatically performs every technical task. They ask a narrower question: how does AI lower the cost of searching, translating, and experimenting when someone first crosses an unfamiliar boundary?

Here, enterprise web development includes public-sector, finance, and business systems. The list of technologies below does not mean one person uses every item in every project; it shows why the combinations can become difficult.

Web complexity comes from combinations more than a single depth

The web looks approachable because anyone can render HTML, style it with CSS, and add behavior with JavaScript. Production work, however, also joins HTTP, identity, databases, deployment, accessibility, browser compatibility, logging, security patches, and incidents. MDN distinguishes browser APIs, third-party APIs, and libraries or frameworks in its client-side API introduction. The joins between those layers are the real boundary.

It helps to keep languages and tools in separate categories. HTML, CSS, JavaScript, TypeScript, and SQL express structure, presentation, behavior, types, or queries. Java, C#, and PHP can serve the backend. XML and JSON are data formats; JSP is a Java-based server-page technology. Spring and Spring Boot are server frameworks; React, Vue, Angular, and Svelte are client UI ecosystems; Node.js is a runtime; Vite is a build tool; Electron is a desktop runtime. MySQL, Oracle, SQL Server, and PostgreSQL are DBMS products with different operational trade-offs. CSS has also advanced through modules and browser support, not as one monolithic “CSS5.”

So even a small-looking feature often contains multiple contracts:

type Profile = { id: string; displayName: string };

export async function loadProfile(signal: AbortSignal): Promise<Profile> {
  const response = await fetch('/api/me', {
    headers: { Accept: 'application/json' }, credentials: 'include', signal,
  });
  if (!response.ok) throw new Error(`profile request failed: ${response.status}`);
  return response.json() as Promise<Profile>;
}

Behind this function sit session policy, CORS, API versioning, schema design, observability, and privacy decisions. Web developers built broad experience not because they merely skimmed technologies, but because they repeatedly owned a new combination of those decisions. The AI coding era can propose combinations faster, but product and organizational context still chooses among them.

Web, game, and embedded development barriers shown as connected layers

<The connection points that create different boundaries across development domains 1.1>

Games move code and assets together

Reducing game development to “knowing C++” misses half the product. C++ remains widely used in performance-sensitive engine, network, and tooling work, while C# and other stacks coexist. More importantly, a game is not code alone: scenes, GameObjects, Components, Prefabs, textures, materials, 3D models, animation, and sound refer to one another. Unity's key concepts describe those building blocks, and its Inspector documentation shows how components and exposed fields can be adjusted without editing source.

using UnityEngine;
public sealed class FollowTarget : MonoBehaviour {
  [SerializeField] private Transform target;
  [SerializeField] private float speed = 4f;
  void Update() {
    if (target == null) return;
    transform.position = Vector3.MoveTowards(transform.position, target.position,
      speed * Time.deltaTime);
  }
}

The code is ordinary, but target needs a scene object or Prefab and speed needs a design decision. Source code alone may not reconstruct which Prefab was connected, what import configuration and material produced the image, or what felt wrong in play. Unity's asset workflow explains how asset identifiers and references are preserved. The accurate statement is not that AI cannot learn editor work; it is that assets, visual evaluation, and runtime context make text-only reconstruction incomplete.

Unreal teaches the same lesson. Epic's Blueprint versus C++ guide says most projects benefit from combining both. Blueprint helps asset and API discovery; C++ helps with text diffs, merges, and low-level control. Shaders, animation, and effects cross tools such as Materials, Niagara, and Sequencer, as well as an art pipeline. The boundary is therefore a production-pipeline boundary as much as a language boundary.

Embedded systems add the physical world

In embedded development, correct code can still produce a failed product. Board power, pin layout, voltage, firmware version, sensor noise, serial speed, and boot order all participate. Diagnosing a problem may require cables, instruments, boards, and firmware revisions in addition to a log. A Linux-based board adds an OS, device trees, drivers, permissions, and a filesystem. A web UI talking to the device may need a local service or native bridge.

Before writing a serial driver, a developer may first inspect what is connected:

ls /dev/ttyUSB* /dev/ttyACM* 2>/dev/null
sudo dmesg --ctime | tail -n 40
stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb

These commands do not control a device or flash firmware; they merely inspect connectivity and configure a known test port. Chip vendor, board design, OS, and Bluetooth stack can change the debugging path completely. That is why embedded expertise is more than C/C++ syntax.

A boundary is the cost of verification, not a lack of intelligence

Domain Central complexity Evidence outside code How failure is verified
Enterprise web Many layers and requirements combined policy, browser, data tests, logs, user journeys
Games Real-time performance and asset pipeline scenes, Prefabs, art, play feel profiling and play tests
Embedded OS and hardware together board, power, sensors, firmware instrumentation, logs, physical tests

A comparison of breadth, runtime pressure, and physical coupling across three developer domains

<How verification cost accumulates differently in each domain 1.2>

Parallelism in games is a useful example. More threads can relieve a bottleneck, but they can also introduce races and hard-to-reproduce bugs. Unreal's performance considerations explicitly warns about threads and race conditions. The solution is profiling and measurement, not a language-level guess.

AI may lower the boundary, but it does not erase responsibility. Game frame time, web privacy, and embedded electrical or mechanical safety require real measurements and approval processes, not generated code alone.

Developers built value in their domain not merely by keeping secrets. They linked documentation, failed logs, tools, and site constraints until a system was verified. The next article examines why AI can draw that initial map faster, and why public code plus code-native interfaces matter. A familiar developer CLI workflow can become an experiment interface when combined with AI.

Friday, July 24, 2026

The end of frameworks part 1: tools built for humans

For search readers, this essay treats human centered frameworks, development frameworks, software engineering, and the AI coding era as one connected transition.

Development frameworks have always looked like tools for computers. In practice, they were mostly tools for people. The real question is whether that kind of human centered framework still needs to keep appearing in the same way.

A self-made information card for The Mythical Man-Month explaining human-scale software work

<The Mythical Man-Month information card 1.1>

1. Frameworks reduced the memory burden of human developers

When developers talk about frameworks, productivity is usually the first word that appears. React, Django, Rails, Spring, Laravel, and Next.js all look like ways to build faster. But under the surface, the central function of a framework is not speed alone. A framework externalizes memory. It stores repeated decisions so that a person does not have to make the same structural choices again on every project.

Standard folder structures, routing rules, ORM conventions, authentication modules, build presets, deployment patterns, boilerplates, official manuals, and reusable components all reduce cognitive load. A developer does not have to ask where every file should live, how state should flow, how the database should be connected, or how the build should be wired. The framework creates rails so humans make fewer mistakes and teams speak the same language.

That is why the end of frameworks does not simply mean that tools disappear. It means the reason for creating new human centered frameworks may weaken. If fewer humans read, memorize, edit, and coordinate code directly, then rules designed primarily for human comfort become less central.

Framework element What it did for humans Why it mattered
Standard folders Reduced placement decisions Teammates could find code quickly
Presets and boilerplates Reused repeated setup Fewer early configuration mistakes
Components and libraries Avoided repeated implementation Humans did not rebuild everything
Official manuals Provided a learning path People needed a shared reference
Community patterns Stored repeated experience Teams avoided the same failures

A good framework was therefore a social contract as much as an execution tool. The computer did not care whether a project used Rails, Django, or Next.js. People cared, because people needed conventions they could remember, teach, review, and discuss.

2. Brooks explains why frameworks became necessary

Fred Brooks’ The Mythical Man-Month remains important because it explains why large software projects are not solved by simply adding people. In No Silver Bullet, Brooks separates software difficulty into essential complexity and accidental complexity.

Essential complexity comes from the problem itself. A payment system has money, permissions, refunds, settlement, fraud, security, and exceptions. A hospital system has patients, prescriptions, records, responsibility, and regulation. Better tools do not remove that core difficulty. Accidental complexity comes from awkward languages, painful builds, slow compilation, repetitive setup, poor documentation, and communication overhead.

Frameworks grew because they attacked accidental complexity. They helped developers spend less energy on routing, database plumbing, rendering rules, or integration boilerplate, and more energy on the actual business problem.

From Brooks’ perspective, a framework is not a silver bullet. It is more like a cleaning tool for accidental complexity. It does not remove the essence of software, but it lets humans stay closer to the essence for longer.

This makes frameworks extremely valuable in the human era. Standardization reduced memory. Manuals reduced learning friction. Components reduced repetition. Presets reduced avoidable mistakes. Frameworks mattered because humans were limited by memory, attention, and coordination.

3. Design Patterns was a shared human vocabulary

The same idea appears in Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. The book described 23 classic object-oriented design patterns, but its deepest value was not just code examples. It gave developers names for recurring structures.

A self-made information card for Design Patterns explaining reusable object-oriented software

<Design Patterns information card 1.2>

Names like Singleton, Factory, Observer, and Adapter became powerful because they compressed long design discussions into short phrases. “Use an Observer here” or “extract an Adapter” saved many sentences. That compression was for humans. It helped people review, explain, and coordinate software.

Framework conventions work the same way. Next.js App Router, Rails convention over configuration, Spring dependency injection, and Django batteries included are not just technical features. They are a human vocabulary for understanding a system quickly.

Human collaboration problem What patterns and frameworks offered What may change with AI
Design intent is hard to explain A named pattern compresses intent AI may use statistical similarity more than names
New teammates must learn quickly Manuals and conventions guide them If fewer people read code, manuals lose weight
Repeated design is tiring Components and abstractions reduce repetition AI can regenerate routine code cheaply
Code review needs standards Framework norms create review criteria Tests and harnesses may become stronger criteria

Human centered frameworks were therefore technologies for saving memory and agreement. They existed because people needed them. Machines ultimately execute state transitions, not manuals.

4. Popular technologies become easier terrain for AI

This does not mean every framework immediately becomes meaningless in the AI coding era. Today’s models still work on the code, documentation, open source projects, questions, answers, examples, and manuals humans have left behind. Widely used languages and frameworks are therefore easier terrain for AI.

GitHub Octoverse 2024 reports that Python became the most used language on GitHub and that generative AI and data science activity surged. Stack Overflow Developer Survey 2024 shows how strongly developers rely on API and SDK documentation, and how broadly tools such as Docker, npm, and PostgreSQL are used. The pattern is clear: the human development ecosystem becomes the map that AI has learned most deeply.

Here is the paradox. Human centered frameworks may stop being the main place of innovation, but the frameworks humans used most will become the safest recipes for AI. React, Python, PostgreSQL, Docker, REST, OAuth, HTML, and SQL are predictable because examples are everywhere. By contrast, internal DSLs, private company frameworks, and undocumented abstractions are unfamiliar territory for a model. This connects directly to the broader discussion around Software 3.0 and the AI coding era.

The key risk in the AI coding era is not simply whether a framework is used. The risk is whether the model has learned the terrain well enough. A tool familiar to humans is not always a tool familiar to the model.

Part 1 ends here. Development frameworks were built for people: standardization, presets, easy components, manuals, and design patterns all served human productivity and collaboration. As the human share of development shrinks, the need for new frameworks designed mainly for human comfort may shrink too.

Continued in part 2. The next part looks at AI recipes, executable assets after code, and the possibility of AI-native frameworks.

404 Dev Room 30 - Taming

Series · 404 Dev Room Webtoon · Ongoing Episode 30 · 404 Dev Room 30 - Taming The trainer in the AI coding room has changed. <...