Week 3 | Lesson 14

Professional Development & Career

AI, Code Reviews, and Building Your Career



© 2026 by Monika Protivová

The Changing Landscape

How Software Development is Evolving

AI is changing how we write code, but not why we write it or what makes great software.

What's Changing:

  • AI can generate code from descriptions
  • Boilerplate code is automated
  • Syntax lookup is instant
  • Simple bugs are caught automatically
  • Documentation is AI-assisted
  • Basic testing can be generated

What Remains Essential:

  • Understanding system architecture
  • Making design decisions
  • Debugging complex issues
  • Understanding business context
  • Ensuring security and reliability
  • Validating correctness
💡 ️ The question isn't whether AI will change development.

It already has.

The real question is:
What kind of developer will thrive in this new world?

Opportunity, Not Threat

AI tools make good developers more productive, not obsolete.

Think of AI as the latest in a long line of productivity tools:

  • Assembly → High-level languages - We didn't stop needing programmers
  • Manual memory → Garbage collection - We focused on higher-level problems
  • Writing HTML → React/frameworks - We built more complex applications
  • Manual testing → Automated testing - We improved software quality

Each tool raised the bar and changed what developers do, but increased demand.

The Pattern:

  1. New tool automates routine tasks
  2. Developers solve harder problems
  3. Software becomes more sophisticated
  4. Demand for skilled developers increases

AI follows the same pattern. The difference? It's happening faster.

What Stays the Same

Fundamental principles of good software don't change with AI.

Regardless of who (or what) writes the code, great software requires:

  • Clear architecture - Systems must be maintainable and evolvable
  • Proper testing - Correctness must be verified
  • Security mindset - Vulnerabilities must be prevented
  • Performance consideration - Resources are not infinite
  • Operational excellence - Software must run reliably in production
  • Business alignment - Solutions must solve real problems

AI can help with implementation, but these concerns require human judgment, understanding of context, and experience with trade-offs.

💡 ️ Your value as a developer has never been just about typing code. It's about understanding problems and crafting solutions.

What AI Can and Cannot Do

What AI Does Well

AI excels at pattern recognition, code generation from clear specs, and automating repetitive tasks.

AI's strengths in software development:

  • Code generation from descriptions
    "Create a REST endpoint that returns all users" → Working code
  • Boilerplate and scaffolding
    Data classes, repositories, basic CRUD operations
  • Syntax and API usage
    How to use a library, correct syntax, method signatures
  • Code transformation
    Refactoring, translating between languages
  • Documentation and comments
    Explaining what code does
  • Simple test generation
    Basic unit tests for straightforward functions

These are all valuable! Use AI for these tasks. It will make you faster.

What AI Struggles With

AI has difficulty with architecture, business context, and complex system-level decisions.

AI's limitations:

  • System architecture
    How should services communicate? What belongs where? What are the boundaries?
  • Business context
    Why are we building this? What problem does it solve? What are the priorities?
  • Complex debugging
    Production issues, race conditions, performance bottlenecks
  • Security implications
    Subtle vulnerabilities, authentication flows, data exposure
  • Performance trade-offs
    When to cache? What data structure? How to optimize?
  • Maintaining consistency
    Keeping large codebases coherent across many files
💡 ️ AI sees code. You see the system. That's your advantage.

The Human Gap

The gap between AI capabilities and business needs is where developers provide value.

Consider building a task management API (your final project):

AI can:

  • Generate CRUD endpoints
  • Create entity classes
  • Write basic validation
  • Generate repository code
  • Create simple tests

You must:

  • Design the overall architecture
  • Decide on data model and relationships
  • Implement business rules
  • Ensure security (who can delete whose tasks?)
  • Handle error cases properly
  • Make it production-ready

The difference: AI gives you working code. You create a working system.

AI is a tool in your toolbox. Like any tool, its value depends on the skill of the person using it.

Working Effectively with AI

AI as a Learning Tool

Use AI to learn faster, but always verify and understand what you learn.

How to use AI for learning

  • Ask for explanations
    "Explain how Spring's @Transactional annotation works"
  • Request examples
    "Show me an example of using MockK to mock a repository"
  • Explore alternatives
    "What are the trade-offs between JDBC and JPA?"
  • Debug your understanding
    "Why doesn't this code work?" (paste error)

Critical rules

  1. Always verify - AI can be confidently wrong
  2. Test the code - Don't assume it works
  3. Read the docs - AI summarizes, docs are authoritative
  4. Understand before using - If you can't explain it, don't use it
⚠️ ️ AI is a brilliant tutor with occasional hallucinations. Use it, but verify everything.

AI as a Productivity Tool

Let AI handle boilerplate so you can focus on architecture and business logic.

Effective uses for productivity

  • Generate boilerplate
    Data classes, DTOs, entity mapping functions
  • Write repetitive code
    Similar endpoints, CRUD operations, basic validation
  • Create test templates
    Setup code, common test patterns, mock structures
  • Documentation
    KDoc comments, README sections, API documentation
  • Refactoring assistance
    Renaming, restructuring, extracting methods

The productivity pattern

  1. You design the solution
  2. AI generates initial implementation
  3. You review and refine
  4. You write tests to verify
  5. You integrate into the larger system
💡 ️ You're still in control. AI is your assistant, not your replacement.

When to Trust AI

Learn to distinguish between tasks where AI is reliable vs where it needs heavy verification.

Generally reliable

  • Standard patterns you recognize
  • Well-documented APIs
  • Simple transformations
  • Common use cases
  • Syntax you can verify quickly

Quick reviewTestAccept

Needs careful verification

  • Security-sensitive code
  • Complex business logic
  • Performance-critical sections
  • Unfamiliar libraries or patterns
  • Anything you don't understand

Thorough reviewUnderstandTest extensivelyVerifyAccept

Red flags - Don't trust AI when

  • You don't understand the generated code
  • It uses libraries or patterns unfamiliar to you
  • The explanation doesn't make sense
  • It contradicts official documentation
  • Multiple AI sessions give different answers
💡 ️ If you wouldn't accept code like this from a junior developer, don't accept it from AI.

AI as Your Pair Programmer

Treat AI like a junior partner: valuable for brainstorming, but needs your guidance and review.

The pair programming mindset

In traditional pair programming, one person writes code while the other reviews. With AI, you can switch roles dynamically:

  • AI generates, you review
    "Create a repository method for finding tasks by status"
    You verify correctness, check for edge cases, ensure it fits your architecture
  • You write the code, AI reviews
    "Here's my implementation of the service layer. Suggest improvements..."
    AI suggests optimizations, points out potential bugs, recommends best practices
  • You design, AI implements
    "I need a service that validates task permissions. Here's the interface..."
    You define structure, AI fills in implementation details
  • Collaborative debugging
    "This test is failing. Here's the code and error..."
    AI suggests possibilities, you investigate and verify

Best practices

  • Give AI context (show related code, explain the system)
  • Be specific in your requests
  • Ask AI to explain its suggestions
  • Challenge AI's assumptions
  • Use AI to explore alternatives before deciding

Reviewing AI-Generated Code

Apply the same rigor to AI code as you would to code from any other source.
  1. Does it do what you asked?
    Test the happy path first
  2. Does it handle edge cases?
    Null values, empty lists, invalid input, boundary conditions
  3. Is it secure?
    SQL injection, XSS, authentication, authorization
  4. Does it follow your architecture?
    Correct layer, proper dependencies, consistent patterns
  5. Is it testable?
    Can you write tests for it? Are dependencies injectable?
  6. Is it maintainable?
    Clear naming, reasonable complexity, proper error handling
  7. Does it perform well?
    N+1 queries, unnecessary loops, memory usage
⚠️ ️Remember: You're responsible for the code, not the AI.

Common AI Mistakes

AI has predictable failure modes. Learn to recognize and catch them.

Watch out for

  • Hallucinated APIs
    AI invents methods or parameters that don't exist
    → Always check documentation
  • Missing error handling
    Assumes happy path, ignores exceptions
    → Add try-catch, validation, null checks
  • Incorrect assumptions
    Assumes data structure, state, or behavior
    → Verify assumptions match your system
  • Outdated patterns
    Uses deprecated APIs or old approaches
    → Check if code is current
  • Over-complicated solutions
    Uses complex patterns when simple would work
    → Simplify if possible
  • Missing security checks
    Forgets authentication, authorization, validation
    → Add security layers
⚠️ ️ AI is optimizing for code that looks right, not code that is right.

Testing AI-Generated Code

AI-generated code needs even more thorough testing than human code.

Why test AI code more thoroughly?

  • You didn't write it, so you might miss edge cases in review
  • AI doesn't understand your business rules
  • AI might make subtle logical errors
  • AI doesn't consider integration with your existing code

Testing strategy

  1. Start with the tests AI suggests
    They often cover basic cases
  2. Add edge case tests
    Null, empty, boundary values, invalid input
  3. Test error scenarios
    What happens when things go wrong?
  4. Integration tests
    Does it work with your actual database, services, etc?
  5. Manual testing
    Use the API/UI yourself - does it feel right?
⚠️ ️ If you wouldn't trust your own code without tests, don't trust AI code without tests.

Skills That Matter Most

Architectural Thinking

The ability to design systems and make architectural decisions is becoming more valuable, not less.

Architecture matters more than ever

  • AI generates components, not systems
    It can create individual classes but struggles with overall system design
  • Trade-offs require context
    Should this be synchronous or async? Monolith or microservices? AI doesn't know your constraints
  • Evolution matters
    Systems must grow and change. Architecture determines how painful that will be
  • Integration complexity
    How services communicate, where boundaries are, what depends on what

This course gives you architectural thinking

  • Layered architecture (Controller → Service → Repository)
  • Separation of concerns (DTOs vs Entities)
  • Dependency management (Dependency Injection)
  • Data access patterns (JDBC vs JPA vs JOOQ)
  • Transaction boundaries and consistency
💡 ️ AI can build the bricks. You design the building.

Testing and Quality

Writing tests becomes even more critical when AI generates implementation code.

Why testing matters with AI

  • Verification of correctness
    How do you know AI-generated code actually works? Tests.
  • Edge case discovery
    AI often misses edge cases. Good tests catch them.
  • Documentation of intent
    Tests show what code should do, not just what it does
  • Refactoring safety
    Tests let you safely improve AI-generated code
  • Integration validation
    Does this component work with the rest of your system?

Testing skills you've learned

  • Unit testing with JUnit and Kotest
  • Mocking with MockK
  • Controller testing with MockMvc
  • Service and repository testing patterns
  • Test organization and best practices
💡 ️ These skills let you confidently validate any code, regardless of its source.

Debugging and Problem Solving

When things go wrong (and they will), AI can suggest possibilities but you must investigate and verify.

Debugging in the AI era

AI can help with

  • Suggesting possible causes
  • Explaining error messages
  • Proposing solutions to try
  • Finding similar issues

You must handle

  • Understanding your system state
  • Reproducing the issue
  • Verifying the actual cause
  • Testing the fix works
  • Ensuring no side effects

Complex debugging scenarios AI struggles with

  • Race conditions and concurrency issues
  • Production-only bugs with partial information
  • Performance degradation in specific scenarios
  • Integration issues across multiple services
  • Security vulnerabilities and their implications
💡 ️ Your ability to systematically investigate, form hypotheses, and verify solutions is what makes you valuable when problems occur.

Production Readiness

Getting code to work in development is one thing. Making it production-ready is where experience matters.

What makes code production-ready?

  • Error handling
    What happens when things go wrong? How do you recover?
  • Security
    Authentication, authorization, input validation, SQL injection prevention
  • Performance
    Database query optimization, caching, resource management
  • Observability
    Logging, metrics, monitoring - can you debug issues in production?
  • Reliability
    Transaction handling, data consistency, graceful degradation
  • Maintainability
    Clear code, good naming, reasonable complexity, documentation

AI-generated code often lacks these considerations.

Your knowledge of production concerns - learned through this course and experience - is what transforms working code into reliable systems.

Deep Understanding vs Surface Knowledge

Why Deep Understanding Matters

In an age where AI can generate code, your understanding becomes your competitive advantage.

The difference between using AI and being replaceable by AI:

Surface Knowledge:

  • "AI says to do it this way"
  • Can't explain why code works
  • Struggles when AI suggestions fail
  • Unable to evaluate trade-offs
  • Copies without understanding
  • Can't debug unexpected issues

This person adds little value beyond what AI provides.

Deep Understanding:

  • "Here's why this approach works"
  • Explains trade-offs and implications
  • Debugs when things go wrong
  • Makes informed architectural decisions
  • Reviews and improves AI suggestions
  • Adapts solutions to context

This person multiplies AI's value.

If you don't understand the code better than the AI that wrote it, why would anyone hire you instead of just using the AI?

Building Deep Knowledge

Deep understanding comes from deliberate practice, curiosity, and connecting concepts.

How to build deep knowledge (not just surface familiarity):

  1. Don't just copy - understand why
    When AI gives you code, ask: Why does this work? What are the alternatives? What could go wrong?
  2. Experiment and break things
    Change the code. What happens? Why? This builds mental models.
  3. Explain it to others (or yourself)
    If you can't explain it clearly, you don't understand it deeply enough.
  4. Read the actual documentation
    AI summaries are useful, but reading docs builds deeper understanding of design decisions and edge cases.
  5. Connect concepts
    How does JPA relate to JDBC? Why do we use DTOs? How do transactions work? The connections matter.
  6. Solve problems without AI first
    Try solving on your own, then use AI to compare approaches. This builds problem-solving skills.

This course is designed to build deep understanding:

We don't just show you code. We explain why, explore trade-offs, and connect concepts across lessons.

The Compounding Value of Fundamentals

Strong fundamentals compound over time. Surface knowledge becomes obsolete quickly.

Why fundamentals matter more in the AI era:

  • Fundamentals transfer
    Understanding HTTP, databases, architecture, testing - these apply everywhere
  • New tools, same problems
    Frameworks change. The problems they solve don't. Fundamentals let you quickly master new tools.
  • Foundation for judgment
    You can only evaluate AI suggestions if you understand the underlying concepts
  • Enables learning
    Deep fundamentals make learning new technologies much faster
  • Career resilience
    As tools and technologies change, fundamentals keep you relevant

Fundamentals you've learned in this course:

  • HTTP and REST principles
  • Database design and transactions
  • Layered architecture patterns
  • Testing strategies
  • Object-oriented programming
  • Dependency injection and inversion of control

These concepts will be relevant regardless of what frameworks or tools you use in 5 or 10 years.

Git Workflows & Collaboration

Git Workflows & Branching Strategies

Different teams need different approaches to collaboration. Git workflows provide structure for how code flows from development to production.

As teams grow and products mature, the way you manage branches and releases becomes critical. A good workflow prevents chaos, reduces bugs, and ensures everyone can work efficiently without stepping on each other's toes.

Without a Workflow

  • Merge conflicts everywhere
  • Unclear what's in production
  • Hard to revert bad changes
  • No coordination between developers
  • Difficult to manage releases
  • Testing becomes a nightmare

With a Workflow

  • Clear branching strategy
  • Predictable release process
  • Easy rollbacks when needed
  • Parallel development possible
  • Quality gates (code review, testing)
  • Traceable history
💡 ️ There's no "best" workflow - only the workflow that best fits your team's needs, size, and deployment model.

GitHub Flow - Simple & Modern

The simplest workflow: branch from main, develop your feature, create a pull request, merge back to main, deploy immediately.

Everything happens on the main branch or short-lived feature branches. When you're ready to work on something, create a branch. When it's done, open a pull request for review. After approval, merge to main and deploy. Main is always deployable.

main feature/login Pull Request Code Review feature/payment Pull Request Code Review Deploy Deploy
  • + Simple and easy to learn
  • + Fast iteration and deployment
  • + Works perfectly with CI/CD
  • + Single source of truth (main)
  • - Less control over releases
  • - Not ideal for scheduled releases
  • - Can be chaotic for large teams
💡 ️Best For: GitHub Flow is ideal for web applications with continuous deployment, small to medium teams, and products with a single production version. Used by GitHub, many startups, and modern SaaS companies.

Git Flow - Structured & Controlled

A comprehensive branching model with dedicated branches for features, releases, and hotfixes. Provides maximum control for scheduled releases.

Two long-lived branches: main (production) and develop (integration). Feature branches merge into develop. When ready for release, create a release branch for testing. After QA approval, merge to main and back to develop. Hotfixes branch from main and merge to both main and develop.

main develop feature/xyz release/1.0 hotfix/bug Branch Types: Production (main) Integration (develop) Features Releases Hotfixes
  • + Clear structure for large teams
  • + Great for scheduled releases
  • + Parallel development streams
  • + Hotfix workflow built-in
  • - More complex to manage
  • - Slower feedback loops
  • - Can accumulate merge conflicts
  • - Overkill for small teams
💡 ️Best For: Git Flow works well for enterprise software, desktop applications, mobile apps with app store releases, and any project requiring scheduled releases, multiple versions in production, or formal QA cycles.

Trunk-Based Development - Continuous Integration

All developers work on a single trunk (main) with very short-lived feature branches. Maximum integration speed with feature flags for incomplete work.

Everyone commits to main (the trunk) multiple times per day. If branches are used, they're extremely short-lived (hours, not days). Incomplete features are hidden behind feature flags. Requires excellent automated testing and CI/CD. Every commit to main is potentially deployable.

main / trunk short feature 1-2 days max Feature Flags Control features ↓ Continuous Deployment ↓
  • + Fastest integration
  • + Minimizes merge conflicts
  • + True continuous integration
  • + Simplest workflow
  • - Requires strong test coverage
  • - Needs feature flags for incomplete work
  • - High discipline required
  • - Less time for thorough code review
  • - Can feel risky to teams
  • - Requires mature CI/CD
💡 ️Best For: Trunk-Based Development is ideal for mature engineering teams with excellent automated testing, strong CI/CD infrastructure, and a culture of continuous delivery. Used by Google, Facebook, and other tech giants.

Now go build something amazing.

Code Reviews

Why Code Reviews Matter

Code reviews are one of the most valuable practices in software development for catching bugs, sharing knowledge, and maintaining code quality.

Benefits of code reviews

  • Catch bugs before production
    Multiple eyes on code find issues that tests miss
  • Share knowledge
    Team members learn about different parts of the codebase
  • Maintain consistency
    Ensure code follows team standards and architectural patterns
  • Improve code quality
    Discussion leads to better solutions and cleaner code
  • Mentorship opportunity
    Junior developers learn from senior developers' feedback, or by reviewing seniors' code
  • Collective ownership
    Everyone understands and takes responsibility for the codebase
💡 ️ Code reviews are not about finding fault - they're about collaborative improvement and learning together.

What to Look For in Code Reviews

Effective code reviews focus on both technical correctness and broader software engineering principles.

Technical Aspects:

  • Correctness
    Does the code do what it's supposed to do?
  • Tests
    Are there appropriate tests? Do they cover edge cases?
  • Error handling
    Are errors handled appropriately?
  • Performance
    Are there obvious performance issues?
  • Security
    Are there security vulnerabilities?
  • Edge cases
    What happens with null, empty, or extreme values?

Design & Maintainability:

  • Readability
    Is the code easy to understand?
  • Architecture
    Does it fit the overall design?
  • SOLID principles
    Is the code well-designed and maintainable?
  • DRY
    Is there unnecessary duplication?
  • Naming
    Are names clear and descriptive?
  • Documentation
    Is complex logic explained?

How to Give Constructive Feedback

Effective code review feedback is specific, kind, and focused on the code, not the person.

Principles for good feedback:

Do

  • Be specific
    "This function could be split into smaller functions" vs "This is messy"
  • Ask questions
    "Could we use a map here instead of filtering twice?"
  • Explain why
    "This could cause a race condition because..."
  • Acknowledge good code
    "Nice handling of this edge case!"
  • Suggest alternatives
    "What about trying X approach?"
  • Distinguish required vs optional
    "nit:" for style, "BLOCKER:" for must-fix

Don't

  • Be vague
    "This doesn't look right"
  • Make it personal
    "Why did you write it this way?"
  • Nitpick everything
    Focus on important issues
  • Assume incompetence
    Maybe they know something you don't
  • Rewrite in your style
    Accept different valid approaches
  • Only criticize
    Point out good things too
❗ ️ Remember: You're reviewing code, not judging the person. Frame feedback as collaborative problem-solving.

How to Receive Feedback Professionally

Receiving code review feedback gracefully is a key professional skill that accelerates your growth.
  • Assume good intent - Reviewers are trying to help improve the code, not criticize you personally
  • Ask for clarification - If feedback is unclear, ask questions rather than getting defensive
  • Explain your reasoning - If you disagree, explain your thinking: "I chose this approach because..."
  • Be open to learning - Even senior developers learn from reviews. Every reviewer has different experience
  • Separate ego from code - Your code is not you. Better code benefits everyone
  • You may decide not to make a change based on feedback - That's okay if you have a good reason. Just explain your choice respectfully
  • Thank reviewers - Someone took time to help improve your work. Acknowledge that

Good responses

  • "Good catch! I'll fix that"
  • "Could you explain more about why?"
  • "I hadn't considered that case. Thanks!"
  • "I chose X because Y, but I'm open to alternatives"
  • "You're right, but I will do it in separate branch."

Avoid

  • "That's just your opinion"
  • "It works, doesn't it?"
  • "I didn't have time to do it properly"
  • Silence or ignoring feedback

Your Career in an AI World

What Jobs Are Becoming More Valuable

Some developer roles are becoming more valuable with AI. Others are at risk.

Increasing in value:

  • Architects
    Design systems, make technical decisions
  • Senior engineers
    Review code, mentor, solve complex problems
  • Technical leads
    Bridge business and technology
  • Platform engineers
    Build tools and infrastructure
  • Security engineers
    Identify and prevent vulnerabilities
  • Performance engineers
    Optimize systems at scale

Declining in value:

  • Pure code writers
    Converting specs to code without judgment
  • Boilerplate generators
    Creating repetitive CRUD code
  • Syntax experts
    Knowing language syntax but not architecture
  • Copy-paste developers
    Using code without understanding

These tasks can increasingly be automated

The pattern: Roles requiring judgment, experience, and context are becoming more valuable. Roles focused on mechanical code production are being automated.

Your Future in Software Development

AI is a tool that makes skilled developers more powerful, not less relevant.
  • Software development has always been about solving problems, not just writing code
  • AI can generate code, but it can't understand your users' needs or your business context
  • The skills you've learned - architecture, testing, debugging, production thinking - are becoming more valuable, not less
  • Developers who embrace AI as a tool will be far more productive than those who ignore it
  • But developers who rely only on AI without deep understanding will struggle

The opportunity

💡 ️ We're entering an era where skilled developers can build more, faster, and better than ever before. AI removes the tedium and lets you focus on what matters: architecture, design, problem-solving, and creating software that actually solves real problems.
💡 ️ The best developers have always been those who understand problems deeply, make good decisions, and build reliable systems. That hasn't changed. AI is just a new tool in your toolbox.
💡 ️ Your value is not in typing code. It's in understanding what to build and how to build it well.