← Back to writing

AI-Assisted Development Workflow

·3 min read

After months of experimenting with AI-assisted development, I've settled into a workflow that actually works. Here's what I've learned about using LLMs as a coding partner.

The tools I use daily

Cursor is my primary IDE now. The inline completions are fast, and having Claude available in the sidebar for longer conversations is invaluable. I pay for the Pro plan—it's worth it.

Claude (via API and chat) handles the heavy thinking. Architecture decisions, debugging complex issues, understanding unfamiliar codebases. When I need to think through a problem, Claude is my rubber duck that talks back.

What AI is good at

Boilerplate generation. Creating DTOs, mapping functions, test scaffolding—all the repetitive stuff that used to eat hours. Example:

// Before: I write this by hand, takes 5 minutes
public class CustomerDto
{
    public Guid Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public string Email { get; set; } = string.Empty;
    public DateTime CreatedAt { get; set; }
    public List<OrderDto> Orders { get; set; } = new();
}
 
// Now: I describe what I need, AI generates it in seconds

Code explanation. Dropped into a legacy codebase? Paste the confusing function and ask "what does this do?" The explanations are usually accurate and save hours of deciphering.

Test generation. Give it your function, ask for unit tests. It handles happy paths and edge cases better than I'd think to write manually.

[Fact]
public async Task CreateCustomer_WithValidData_ReturnsSuccess()
{
    // Arrange
    var command = new CreateCustomerCommand
    {
        Name = "Test Customer",
        Email = "test@example.com"
    };
    
    // Act
    var result = await _handler.Handle(command, CancellationToken.None);
    
    // Assert
    result.IsSuccess.Should().BeTrue();
    result.Value.Name.Should().Be(command.Name);
}
 
[Fact]
public async Task CreateCustomer_WithDuplicateEmail_ReturnsError()
{
    // Arrange
    var existingCustomer = await CreateTestCustomer("existing@example.com");
    var command = new CreateCustomerCommand
    {
        Name = "New Customer",
        Email = "existing@example.com" // Duplicate
    };
    
    // Act
    var result = await _handler.Handle(command, CancellationToken.None);
    
    // Assert
    result.IsFailure.Should().BeTrue();
    result.Error.Should().Contain("already exists");
}

What AI struggles with

Complex business logic. It can write the code, but it doesn't understand why your payment system has that weird edge case for Turkish bank holidays. Context matters.

System-wide architecture. AI excels at local optimizations but struggles to see how changes ripple through a system. That's still your job.

Security-critical code. I never trust AI-generated auth, encryption, or payment logic without thorough review. The code often looks right but has subtle flaws.

My actual workflow

  1. Start with a plan. Before touching code, I describe what I'm building to Claude. It helps me think through edge cases I'd miss.

  2. Generate scaffolding. Let AI create the basic structure—entities, DTOs, interfaces. I review and adjust.

  3. Write the hard parts myself. Core business logic, anything security-related, complex algorithms. AI assists but doesn't drive.

  4. Use AI for tests. After I've written the implementation, AI generates tests. I add cases it misses.

  5. Code review with AI. Before committing, I have Claude review my changes. It catches things I overlook when I'm deep in the code.

The honest take

AI hasn't replaced thinking. It's replaced typing. The cognitive work—understanding requirements, making tradeoffs, ensuring correctness—that's still on me.

But for a solo developer or small team? The productivity boost is real. What used to take a day now takes hours. What took hours takes minutes.

The key is knowing when to trust it and when to verify.