How do you do successful AI based software development?
Updated: Jan 1
My experience suggests that AI software development works best when you let the AI agent own the entire development process, start to finish. Trying to micromanage or constantly intervene usually just slows things down and introduces inconsistencies.
That said, your job as the developer doesn't disappear—it shifts. You're responsible for three things:
1. Give the AI clear ground rules. For Claude, this means writing a detailed CLAUDE.md file.
2. Provide a tight specification. Make sure your expectations are crystal clear.
3. Test relentlessly. You can't just trust that the AI got it right. Verify that everything works and nothing's missing.
Ground Rules: The CLAUDE.md File
I created a CLAUDE.md file that spelled out exactly how I wanted Claude to approach development.
It needs to be pretty comprehensive; but, you can sketch it out and have Claude fill in many of the details:
Context and overview: Sets the stage and helps Claude understand the project's purpose. I'm not sure how necessary this is—Claude has perfect recall and doesn't need hand-holding—but it felt right. Arguably, this is as much or more for human readers of the document to better understand it as it is for Claude.
Technology stack: What languages and frameworks to use, where each fits in the architecture, and how they interact with each other.
Supporting documentation: I specified several files for Claude to create and maintain throughout development:
- A work log so I could understand what happened when, and so Claude could pick up where it left off between sessions
- A learnings file where Claude could record insights that would help with future development; I'm struggling with this-- I'm hoping having this will help improve future CLAUDE.md files; but I don't know that I know how to use it to do that
- *User documentation* for people actually using the software; eventually, perhaps with additional content, this could become user manuals, usage documentation, and "how it works" documentation so that users better understand what the software is doing
- Developer documentation with notes on the codebase for anyone extending it manually- at least, that was the original intent; but for the projects I've had Claude create so far, I haven't done any development and I think that's likely the way of the future-- Claude just owns the development
- Testing documentation covering test procedures, which doubles as a way for users to learn the system
Development workflow: I outlined expectations for each piece of functionality:
1. Create work log entries
2. Write initial tests based on the specification
3. Draft a development plan and review it with me
4. Implement the plan
5. Add additional tests as needed
6. Run tests and fix issues until everything passes
7. Re-run the full test suite to catch any changes that have caused issues with pervious development and fix those new bugs
8. Update all documentation
9. Commit to git and push to Github
That was my starting point—probably 100+ lines. However, the best practice is to let Claude rewrite this file. When Claude was done with its version, the file had grown to over 400 lines. It significantly built out the technical requirements section, added specific version numbers for dependencies, and created detailed formats for all the documentation files. Overall, it was more detailed, more complete, and more useful to Claude. Plus, Markdown formatted-- so prettier for humans, also.
Claude's version was better than mine. But—and this is important—you need to read its output carefully. Make sure nothing got lost in translation. Also, fair warning: Claude doesn't always follow its own instructions as faithfully as you'd hope. It sometimes skipped the "review the plan before implementing" step, didn't always run tests after completing a feature, and didn't seem to use its test suite as rigorously as I wanted for validating correctness before declaring something done.
What's in the CLAUDE.md that the developer writes is based on three things: best Claude practices that you've gained through both experience and reading other developer's approaches; your personal priorities and general experience as a developer; and project-specific priorities.
What's in the final version, written by Claude, is a translation with details that make Claude better at what it does.
Specification: Tell the AI What to Build
Same principle as the CLAUDE.md file: I wrote up a specification, then asked Claude to enhance it.
My original spec had:
- Overview: The big picture of what we're building
- Non-functional requirements: Claude significantly expanded this section with details about performance expectations, security considerations, and operational requirements
- Technology details: Claude added version specifics and configuration file formats
- Functional specification: This is where Claude really added value
For every section, Claude made the specifications more specific. I gave it color names; Claude substituted hex codes. I described data structures loosely; Claude defined exact JSON schemas. It specified API contracts for both the frontend-backend interface and external REST endpoints.
The database schema got substantially more detailed. It included more details on the tables and field names and foreign and primary keys.
Claude provided directory-by-directory file structures. It reorganized sections, broke things down differently, and filled in gaps I hadn't considered.
Claude's rewrites were mostly excellent. I've always considered myself detail-oriented when writing specs, but Claude's versions were more thorough and better organized. This makes me think I can write lighter initial specifications in the future and rely on Claude to flesh them out.
Testing: Verify Everything
Building tests into the specification serves two purposes: it shapes the functionality requirements, and it creates a baseline that should work reliably when development is complete.
Part of Claude's job is to evaluate what it built and add additional tests. The goal is comprehensive automated test coverage for everything that can be tested programmatically.
At the end of each unit of development, Claude also adds test cases to the testing documentation. This captures anything that can't be automated—things that require manual verification, end-to-end workflows, edge cases that need human judgment.
The theory is that automated tests let Claude validate its own work. The reality is messier. Claude sometimes claims tests are passing when they aren't, or tests are incomplete, or tests exist but Claude isn't actually running them. I've had to learn to hold Claude accountable—trust but verify.
The bottom line: AI can write the code, but the developer and their team own confirming that it's correct and that the software works as desired.



Comments