Knowledge

Using AI tools without losing engineering ownership

Practical guardrails for using AI to accelerate implementation while keeping review, testing, and product judgment explicit.

The Ownership Problem

AI can write code faster than humans, but it can’t take responsibility for that code. When things break, you’re still on the hook. The challenge is leveraging AI’s speed without surrendering control.

Core Principles

1. You Review Everything

Rule: Never commit AI-generated code without reading it line by line.

# Bad workflow
ai generate feature → git add . → git commit -m "Add feature"

# Good workflow
ai generate feature → read every line → test manually → 
refactor if needed → git add . → git commit -m "Add feature"

Red flags to watch for:

2. Maintain Test Coverage

AI doesn’t write tests unless explicitly asked—and even then, they’re often shallow.

# What AI might generate
def calculate_discount(price, discount_rate):
    return price * (1 - discount_rate)

# What you should add
def test_calculate_discount():
    # Normal case
    assert calculate_discount(100, 0.1) == 90
    
    # Edge cases AI missed
    assert calculate_discount(100, 0) == 100
    assert calculate_discount(100, 1) == 0
    
    # Invalid inputs
    with pytest.raises(ValueError):
        calculate_discount(-100, 0.1)
    
    with pytest.raises(ValueError):
        calculate_discount(100, 1.5)

Minimum test requirements:

3. Keep Architecture Decisions Human

AI is terrible at architectural decisions because it lacks context about:

Decisions humans must make:

Where AI helps:

4. Document AI’s Role

Be transparent about what AI generated:

## Implementation Notes

This module was initially scaffolded using Claude 3.5 Sonnet with the following prompt:
"Create a Python class for handling user authentication with JWT tokens..."

Human modifications:
- Added rate limiting logic
- Refactored error handling to match project standards
- Integrated with existing user service
- Added comprehensive test coverage

Review checklist completed:
☑ Security review passed
☑ Performance benchmarks acceptable
☑ Code style matches project guidelines
☑ All edge cases handled

This creates accountability and helps future maintainers understand the code’s origins.

Practical Workflow

Step 1: Define the Problem Clearly

Bad prompt: "Build a login system"

Good prompt: """
Create a Flask route for user login with these requirements:
- Accept email and password via POST request
- Validate credentials against PostgreSQL database
- Return JWT token valid for 24 hours
- Rate limit: 5 attempts per IP per minute
- Log failed attempts for security monitoring
- Follow existing project patterns in auth/ directory
"""

Step 2: Generate and Review

# Get initial implementation
ai generate --prompt="..." --output=login_route.py

# Review checklist
□ Does it handle all edge cases?
□ Are there security issues?
□ Does it match our coding standards?
□ Are error messages user-friendly?
□ Is logging adequate?

# Make corrections
vim login_route.py  # Fix issues found in review

Step 3: Test Thoroughly

# Run existing test suite
pytest tests/auth/ -v

# Add new tests for AI-generated code
pytest tests/auth/test_login_route.py -v

# Manual testing
curl -X POST http://localhost:5000/login \
  -H "Content-Type: application/json" \
  -d '{"email":"test@example.com","password":"secret"}'

Step 4: Integrate Carefully

# Check for conflicts
git diff main...feature/ai-login

# Ensure no unintended changes
git status

# Commit with clear message
git commit -m "Add login route (AI-assisted, human reviewed)

- Generated initial implementation with Claude 3.5
- Added rate limiting and security logging
- Comprehensive test coverage
- Reviewed for OWASP compliance"

Common Pitfalls

❌ Blind Trust

“Iterate until it works” without understanding why it works.

Fix: Always ask “why does this approach work?” before accepting code.

❌ Context Loss

AI doesn’t know your codebase conventions, leading to inconsistent styles.

Fix: Provide examples of existing code patterns in your prompts.

❌ Over-Engineering

AI tends to solve problems more complexly than needed.

Fix: Explicitly request “simple, readable solution” and reject unnecessary abstractions.

❌ Security Gaps

AI may introduce vulnerabilities it wasn’t trained to avoid.

Fix: Run security scanners (SAST tools) on all AI-generated code.

Tools That Help

Code Review Assistants

Testing Tools

Security Scanners

Measuring Success

Track these metrics to ensure AI assistance improves rather than degrades quality:

Metric Target Why It Matters
Bug rate in AI code < 5% of commits Quality control
Time to review AI PRs < 30 minutes Review efficiency
Test coverage > 80% Safety net
Security findings 0 critical Risk management
Developer satisfaction > 4/5 Tool adoption

Conclusion

AI is a powerful tool, but it’s a tool—not a replacement for engineering judgment. The teams that succeed with AI are those that use it to amplify human expertise, not replace it.

Stay curious, stay skeptical, and stay in control.

📖 阅读中文版本

← Back to all articles