In my last post, I talked about why AI has become part of my workforce.
I have too many things I want to build and not enough hours to personally implement every little detail.
But there's an important distinction I want to explore.
Delegating code and delegating decisions are not the same thing.
And I think understanding that difference is going to become increasingly important as AI-assisted development becomes more common.
Writing Code Is Only Part of Engineering
When people talk about AI writing code, the conversation often centers on whether the generated code works.
Does it compile?
Do the tests pass?
Does the application run?
Those are important questions.
But they're not the only questions.
Software engineering involves deciding what should exist in the first place.
What belongs in a library?
What belongs in an application?
What should be configurable?
What should be opinionated?
What responsibilities should a component own?
What dependencies should it introduce?
What happens when requirements change?
Those decisions shape the system long before implementation begins.
And those are the decisions I'm not interested in blindly delegating.
KiwiEngine Has An Architectural Philosophy
Take Juice as an example.
One of my goals is to avoid recreating CSS.
I want Juice to provide a small vocabulary for expressing common design intentions while allowing CSS to remain CSS.
Something like:
<div content adapt="grid" mobile="stack">
communicates an intention.
It doesn't need to expose every possible responsive layout option.
Now imagine I ask AI to implement additional responsive functionality.
It might produce something that works perfectly well.
But what if it introduces twenty new attributes?
What if it creates a completely different configuration pattern?
What if it solves the immediate problem by making Juice responsible for something that should belong to CSS?
The implementation might work.
But it would violate the architecture.
That's why the distinction matters.
The Architect Defines The Boundaries
My preferred workflow starts with understanding the problem.
Before delegating implementation, I want to establish:
What problem are we solving?
Where does the solution belong?
What existing patterns should it follow?
What should remain outside its responsibility?
How will we know the implementation is correct?
Once those decisions are established, AI becomes incredibly useful.
It can implement an established pattern.
It can help create tests.
It can identify repetitive work.
It can help document the behavior.
It can examine edge cases I may have overlooked.
But it isn't automatically authorized to redefine the system.
That's a separate decision.
No Ghost Code
I've been very deliberate about this boundary while working on KiwiEngine.
AI doesn't get independent authority to commit code.
It doesn't get to rewrite architecture without approval.
It doesn't get to introduce dependencies simply because they're convenient.
And it doesn't get to silently make changes that I haven't authorized.
If a proposed implementation requires changing the architecture, that's a conversation.
Not an automatic next step.
I want to know what changed.
I want to know why it changed.
And I want to understand what I'm approving.
That doesn't mean I need to personally type every line.
It means I remain responsible for the work.
AI Can Challenge My Decisions
There's another important distinction here.
Retaining architectural authority doesn't mean refusing to listen.
I actually want AI to challenge my assumptions.
If there's a simpler implementation, show me.
If an abstraction introduces unnecessary complexity, explain why.
If an API creates a maintenance problem, point it out.
If my proposed design has an obvious weakness, I want to know.
But there's a difference between presenting an alternative and silently implementing it.
I can consider the recommendation.
I can compare the tradeoffs.
I can change my mind.
That's still engineering.
The important part is that the decision remains deliberate.
Review Is More Than Reading A Diff
As AI becomes more capable, I think reviewing generated code needs to become more sophisticated.
A diff can tell me what changed.
It doesn't necessarily tell me whether the change belongs.
I need to understand the behavior.
I need to understand the dependencies.
I need to understand the architectural consequences.
I need to know whether the implementation follows established conventions.
I need to know whether the tests actually validate the intended behavior.
And I need to know whether the solution creates more complexity than the problem requires.
A passing test suite is valuable.
It isn't a substitute for understanding the system.
Delegation Is A Skill
One thing I'm discovering is that using AI effectively requires becoming better at communicating engineering intent.
Vague instructions produce more room for assumptions.
Clear boundaries produce work that's easier to evaluate.
Instead of simply saying:
"Add a theme system."
I can explain that Juice consumes project configuration and generates stylesheets for its attribute-based styling system.
The project owns its design decisions.
Juice translates those decisions into reusable styling behavior.
CSS remains available for everything outside that scope.
Now the implementation has a direction.
That's a much better starting point.
I Still Want To Be An Engineer
Using AI doesn't mean I want to stop learning.
I still want to understand software architecture.
I still want to improve my programming ability.
I still want to understand electronics, DSP, embedded systems, and the technologies behind the things I'm building.
But I don't need to personally perform every repetitive task to prove that I understand my work.
I can learn deeply while delegating appropriately.
Those ideas aren't mutually exclusive.
The Difference Matters
I don't want AI to replace my judgment.
I want it to extend my capacity.
I want to spend more time designing systems, solving interesting problems, making music, building electronics, and creating things that matter to me.
And I want the code supporting those ambitions to remain understandable and intentional.
That's the relationship I'm trying to build.
Delegate implementation where it makes sense. Retain responsibility for the decisions.
AI can help me build KiwiEngine.
But it doesn't get to decide what KiwiEngine is.
Top comments (0)