From Coding to Engineering: What AI Taught Me About Becoming a Better Software Engineer

Norbert Osiemo
Software and AI Engineer, Codex Championship Winner
Sep 14, 2026
8 min
From Coding to Engineering: What AI Taught Me About Becoming a Better Software Engineer

If AI can perform many entry-level coding tasks, how will junior engineers develop the experience needed to become senior ones? My journey through Andela’s learning programs showed me that AI should accelerate learning, but it must not replace the critical thinking, testing, and system-design skills engineers need.

The first time I watched an AI coding agent move through a repository - reading files, planning its work, modifying code, running tests, and correcting its own mistakes -, I felt both excited and unsettled.

I was excited because tasks that once took hours could now be completed in minutes. I was unsettled because the experience raised a more difficult question:

If AI coding agents can increasingly write code, what makes someone a good software engineer?

My journey through several Andela learning programs offered a collection of insights. The experience also changed the very question above that I sought out to answer. I became less concerned with whether AI could produce code and more interested in whether I understood the problem, the users, the system's architecture, the risks, and the standard by which the result should be judged.

I came to a simple conclusion: AI made me faster at building software. Learning how to use it, however, taught me that good software engineering involves much more than producing code.

When writing code was the main challenge

When I began learning software development, progress was often measured by how well I could translate requirements into code. Building an application meant writing functions, creating interfaces, connecting databases, studying documentation, and spending long hours debugging.

Those activities remain important. The difference is that developers no longer have to perform all of them alone. Or, even, hold 100% accountability for them.

AI assistants can generate boilerplate, explain unfamiliar code, suggest fixes, create tests, and draft documentation. Coding agents go further: they can examine an entire repository, plan changes across multiple files, execute commands, and revise implementations after analyzing test results. 

OpenAI’s description of Codex and GitHub’s documentation for its Copilot coding agent reflect how software development is moving from isolated code suggestions towards delegated workflows. To me, this is an extraordinary improvement in implementation capability. But implementation is only one part of engineering.

Coding creates functions, endpoints, and components. Engineering asks why they should exist, how they should interact, what constraints they must respect, and what will happen when expected conditions disappear.

Andela AI Learning programs helped me appreciate that distinction. AI made it real.

Engineering begins before the first line of code

Andela's AI Engineering Bootcamp, an intensive ten-week program designed to help participants become market-ready AI engineers, inspired me to begin thinking more seriously about the relationship between technology and the problem it is supposed to solve.

One of the most influential ideas I encountered was the mindset of a Forward Deployed Engineer: an engineer who works close to customers and operational problems, translates ambiguity into a usable solution, and continues adapting that solution in a real environment.

This perspective challenged the image of a developer as someone who receives a completed list of requirements and responds by writing code. In practice, requirements are rarely complete. Users may describe symptoms rather than the underlying problem. Business priorities can change, technical limitations emerge, and a feature that appears valuable during planning may prove unnecessary when placed in front of users.

The engineer must, therefore, ask questions before choosing technologies:

  • What problem are we solving?
  • Who experiences them?
  • What conditions shape those experiences?
  • What does success look like?
  • What is the simplest responsible solution?

These questions become more valuable, not less, when AI makes implementation faster. If a team misunderstands the problem, an AI agent may help it build the wrong solution with impressive speed.

The easier implementation becomes, the more valuable problem understanding becomes.

From writing code to directing a development workflow

My first hands-on experience with coding agents came through Andela's two-week OpenAI-Andela Codex Accelerator. It introduced a shift in how I prompt: I began moving from asking AI for pieces of code to directing a larger engineering workflow.

This required more than writing a clever prompt. I needed to describe the goal, provide relevant context, define constraints, identify the expected behaviour, and explain how success would be verified. Importantly, I also needed to state what should not change.

A request such as 'add authentication' appears clear until the engineering questions begin. Which authentication method should be used? Which routes require protection? How should sessions expire? What information may be stored? How should errors appear to users? What tests must pass? How should the change fit the existing architecture?

Without those answers, an agent must make assumptions. Some may be reasonable, but logical decisions are not necessarily correct product decisions.

That is why specification writing has become an important engineering skill. A vague prompt can produce vague software, but the deeper lesson is that good instructions depend on technical knowledge. You must understand what a sound implementation looks like before you can describe it clearly or evaluate what AI produces. That emphasis on sound engineering judgment was a recurring theme in Andela's learning programs.

Context also matters. Files such as AGENTS.md, architecture notes, testing instructions, and project conventions were previously viewed mainly as documentation for human collaborators. They are now also part of the interface between engineers and AI agents. OpenAI similarly advises that agents perform better when they receive clear documentation, reliable tests, and a properly configured development environment.

In this sense, documentation is shifting from post-development to  increasingly helping control development itself.

Speed is not the same as confidence

GitHub Copilot 101, a two-week program with four dedicated learning sessions, reinforced a related lesson: effective AI-assisted development depends on how work is scoped.

Asking AI to build an entire application without boundaries may produce a great deal of code, but quantity is not evidence of quality. A stronger process breaks the work into manageable tasks, establishes acceptance criteria, implements incrementally, and verifies each change before expanding the scope.

This is where testing becomes central.

AI-generated code can be persuasive. It may use familiar patterns, follow framework conventions, and look polished during review. It can compile and still be logically wrong. It can pass the happy path while failing under unusual inputs, interrupted integrations, or unexpected user behaviour.

AI can also produce obviously broken software. But the greater risk is that it produces software that looks finished before it has truly been engineered.

Testing, therefore, becomes more important as code generation accelerates. AI can help write tests, but a human engineer must still decide which assumptions deserve to be challenged. The most valuable test may end up being the one that asks what happens when a dependency is unavailable, the input is malformed, the user bypasses the interface, or the system enters a state nobody expected.

AI can generate an implementation, but testing determines whether that implementation deserves trust.

Ubuntu Voice: What rapid development made possible

Ubuntu Voice, an AI-assisted web application that served as the culminating project for the OpenAI-Andela Codex Accelerator, gave me an opportunity to experience both the power and the limitations of AI-assisted development.

The idea was to create a peace-technology platform that could help conflict-affected communities’ access useful information and report incidents through accessible channels. With AI-assisted development, I moved from the original idea to a working prototype within the short timeframe of a hackathon. The project ultimately won first place.

That experience demonstrated something important: AI can reduce the distance between an idea and a functional product. An individual or small team can now explore solutions that might previously have required far more time and resources.

The first version worked well enough to demonstrate its intended experience. But the most important learning came after the build, when the application underwent QA testing.

QA shifted the question from 'Can the application perform its main function?' to 'How does the application behave when conditions are no longer ideal?'

The testers explored unexpected flows, unusual inputs, integration failures, incomplete validation, and assumptions that had not been visible during rapid implementation. AI helped us build the experience we intended for the hackathon. QA revealed user experiences and conditions we had not intended, or even imagined.

As Kate Woska, VP, Impact Partnerships at Andela, observed during the QA process:

"A robust system is not defined by how it performs under perfect conditions, but by how intelligently it responds when everything goes wrong."

That idea captures the difference between a successful demonstration and a dependable system.

An API working during a demo tells us very little about resilience. What happens when it times out, returns incomplete information, or becomes unavailable? A user interface may guide people towards expected actions, but what happens when someone bypasses it and accesses an endpoint directly? A form may accept normal data, but what happens when it receives an unexpected format?

These are not afterthought questions added once 'real development' is complete. They are part of development.

Another lesson from Kate's observations was that security weaknesses often exist inside assumptions developers never questioned. We may assume that users will follow the intended workflow, integrations will return valid responses, or internal services will remain inaccessible from outside. QA and security testing force those assumptions into the open.

Ubuntu Voice, therefore, taught me two apparently opposing lessons. AI can make ambitious ideas possible within remarkably short periods, but the faster a system is created, the more deliberately it must be examined.

AI slop, technical debt, and the value of system design

There is a temptation to interpret faster code generation as evidence that deep engineering knowledge matters less. 

For prototypes and low-risk experiments, in particular, AI may indeed allow people to build useful tools without mastering every underlying detail. However, not every application needs enterprise-level architecture, and unnecessary complexity remains a form of poor engineering.

Engineers, not AI, make the determination of how much reliability, security, or scalability a system requires. An engineer must make that judgment based on the users, the context, and the consequences of failure.

Without that judgment, speed can create a new problem: AI slop - software that appears complete but contains duplicated logic, inconsistent structures, weak error handling, poor abstractions, or insufficient tests.

The faster we can generate code, the faster we can accumulate code we do not fully understand.

This is why system design has become more important to me. I once viewed architecture as knowledge I would need later, perhaps after becoming a senior engineer. AI changed that perspective. An agent can implement a poor architecture much faster than I can, multiplying the consequences of a weak decision across databases, APIs, services, and interfaces.

Engineers still need to understand data flow, service boundaries, failure handling, security, maintainability, and trade-offs. AI may know recognised patterns, but choosing a pattern requires context. A technically elegant design may be inappropriate for the team, the budget, the users, or the scale of the problem.

Experienced engineers have a particular advantage here. Their judgment is shaped by documentation and best-practice guides, as well as by failed deployments, production incidents, difficult migrations, performance bottlenecks, and architectural decisions that seemed reasonable until reality challenged them.

AI can absorb many of the rules. Experience teaches an engineer when those rules are insufficient. Context offers the human advantage.

The junior engineer paradox

This transformation creates an uncomfortable question for the industry.

AI can already perform many tasks traditionally assigned to junior developers. Yet, companies will continue to need experienced engineers. The question becomes: Where will those experienced engineers come from if junior professionals are denied the real work through which judgment develops?

Experience cannot be downloaded. It grows through implementation, review, mistakes, feedback, and responsibility.

We should keep junior engineers involved in the development process. However, we need to reconsider how they develop. Junior engineers can use AI to learn faster, explore unfamiliar systems, receive explanations, and attempt more ambitious work. But they must also learn to question generated code, trace decisions, write tests, understand architecture, and explain why a solution is appropriate.

AI should become a multiplier for developing engineers, not a substitute for their development.

This places a responsibility on organisations and learning communities. They must teach people how to operate the newest tools and how to evaluate their output and take responsibility for the resulting systems.

For junior developers, learning programs such as Andela's can provide structured opportunities to build those habits, practise with modern tools, and develop the judgment required of today's engineers.

What continuous learning now means to me

Across my experiences with Andela's learning programs, the tools changed quickly, but the fundamental lessons remained remarkably consistent.

Understand the problem. Communicate clearly. Design deliberately. Break complex work into manageable tasks. Document decisions. Test assumptions. Review the result. Consider users, business objectives, and failure conditions. Remain responsible for what reaches production.

Continuous learning requires developing environments where engineers can understand how new capabilities change the application of enduring engineering principles. 

From my experience, a future-ready software engineer is someone who can translate ambiguity into clear specifications, use AI effectively, understand the architecture around the generated code (not necessarily, the most code), test beyond the happy path, and connect technical decisions to human outcomes.

I began this journey thinking primarily about how to become better at coding. AI pushed me to think more deeply about engineering.

It made me faster at producing software, but it also made me more aware of the knowledge I still need to develop. I am now less concerned about whether AI can write code and more interested in whether I understand what that code should accomplish, what can go wrong, and how I can verify that the result deserves to be trusted.

That, for me, is the most valuable lesson AI has taught me as I become a better software engineer.

Norbert Osiemo
Software and AI Engineer, Codex Championship Winner
No items found.
No items found.
No items found.

Recent articles