Sitting in transit between client projects at Thoughtworks — waiting for my next formal team assignment while rolling off a long engagement — left me a brief window to contribute to Bahmni, an open-source hospital management system containing over one million lines of Java code distributed across dozens of interdependent repositories. I knew nothing about it. I bypassed the standard onboarding. Instead of tracing execution paths manually, I fed the raw Jira ticket descriptions directly into an LLM to see if natural language prompts could reliably generate functional source code patches. It felt like a shortcut.
The Immediate Onboarding Bypass
My assigned task required fixing a hard application crash that occurred whenever a user attempted to log in with specific FHIR export privileges enabled within the external add-on extension module. I prompted the AI directly. Rather than spending three days grepping through unfamiliar directory structures to understand how the modules communicated, I simply pasted the bug description alongside the error stack trace into the prompt window. The result was entirely instantaneous. Within seven minutes, the AI correctly identified that the initialization failure stemmed from a misspelled CSV filename deep within the application configuration rather than a fundamental flaw in the Java logic itself. It saved days of work. Operating without access to production environments or dedicated development servers meant that this generative text approach provided an immediate solution to an otherwise agonizing architectural investigation within the complex open-source hierarchy.
Silent API Mutations
The QA review ultimately failed. Testers discovered an unhandled edge case involving underprivileged users attempting to access cross-mark patient data without the required export permissions — a logic flaw residing in an entirely different backend code repo. I repeated the exact process. I fed the tester feedback directly into the prompt to generate a secondary patch, expecting a simple HTTP status code adjustment to handle the missing date parameters gracefully without altering underlying architectural functionality. The generated patch was deceptive.
While it technically satisfied the immediate requirement of throwing a client error, it achieved this by quietly rewriting the endpoint logic to make the previously optional start and end dates strictly required. The API was fundamentally broken. Because the original prompt included the specific word ‘missing’ from the tester feedback, the model aggressively reconfigured the data validation layer and inadvertently destroyed the backward compatibility of the existing patient query endpoint. Text parsing is physically exhausting. Verifying these natural language patches requires reading massive blocks of human-style text, which imposes a far higher cognitive load than quickly scanning a localized git diff in a highly familiar repository structure. I caught the silent failure.
The Middle Developer Syndrome
After submitting my revised patch to the internal queue, I received an automated critique generated by the system that detailed twelve distinct problems, suggestions, and blocking issues concerning my minor logic adjustment. The feedback was incredibly noisy. A significant portion of the analysis complained about trailing tab characters gaining blank lines, completely failing to recognize that this formatting was forced by the OpenMRS Maven parent POM configuration during the automated build. Context was entirely missing here. The review process felt exactly like dealing with an inexperienced developer who had memorized a textbook of clean code principles but lacked the historical project context required to apply those rules effectively. The raw output was literal.
This whole file’s diff is just a blank line gaining a trailing tab character — looks like unintentional IDE auto-formatting, unrelated to the FHIR export fix.
While roughly sixty percent of the generated suggestions correctly identified valid architectural concerns, separating those genuine insights from the pedantic formatting complaints required a frustrating round of manual clarification with the engineering lead. The ratio was highly inefficient.
The Maintainability Void
The Google Sheets Incident
Having experienced both success and friction during the Bahmni experience, I reflected on a personal utility script I had fully vibe-coded six months prior to manage our packing lists for family trips. The original script had some bugs. When my wife requested a minor layout fix because adding new rows caused table checkboxes to misalign visually, I opened the Google Apps Script editor and realized I had zero comprehension of the execution flow. I closed the editor immediately.
The Reality of Maintenance Debt
Maintaining software requires a persistent mental model of the underlying architecture, and relying entirely on generated logic meant that any attempt to fix the checkbox misalignment felt exactly like writing the entire program from scratch. I prompted the required fix. Feeding the original prompt back into the generative model required re-explaining the entire operational context of the master table just to restore the basic visual alignment of a previously generated hacky fix. The text output lacked meaning.
After four manual testing iterations the tool eventually worked as expected, but this isolated incident highlighted the severe maintenance debt that accumulates when engineers bypass the process of thoroughly comprehending their own implementation logic. The code remained a mystery. Trading fundamental comprehension for raw generation speed transforms customized personal utilities into impenetrable source files that demand a complete cognitive reset every time a minor bug requires an inevitable structural intervention down the line. I accepted the structural compromise.
Practical Applications and Constraints
Operating at a sixty percent correctness threshold renders this methodology entirely unsuited for maintaining a legacy enterprise application where structural stability and predictable API contracts hold priority over immediate feature delivery. Startups face entirely different realities. In early-stage environments where financial survival depends strictly on aggressive prototyping and rapid time-to-market, discarding long-term code maintainability in favor of instantaneous implementation speed represents a highly rational engineering compromise. Internal tooling benefits greatly here. If the objective involves generating single-use shell scripts or localized data parsers that will never require formal quality assurance or future modernization, bypassing syntax memorization entirely yields a massive return on temporal investment. The technological paradigm will shift. Assuming engineers maintain strict disciplinary oversight over the generated output, writing explicit logic statements today might eventually become just as obsolete as manually configuring hardware memory registers via complex assembly language instructions. The current friction is temporary.
