Introduction to Modern Software Engineering in the Age of Generative AI
October 2025 (1386 Words, 8 Minutes)

Getting to Know Each Other
Before we dive into the course content, we’d like to understand your current experience with software development. This helps us tailor the lectures to your needs and track our collective learning progress throughout the semester.
Please take 5 minutes to complete this anonymous survey:
đź“‹ Take the Software Development Skills Survey
Your responses are completely anonymous and will help us understand the class’s baseline knowledge in areas like version control, programming languages, development tools, and AI-assisted coding.
Introduction
The following ideas are adapted from the textbook Software Engineering at Google (O’Reilly).
They highlight how Google frames the distinction between programming and software engineering,
and introduce key principles for thinking about software as something that must endure and evolve over time.
Programming vs. Software Engineering
In everyday language, people often use programming and software engineering as if they mean the same thing. But there’s an important difference:
- Programming is mainly about writing code to make computers do something. It’s the skill most students first practice when they study computer science and start their careers.
- Software engineering, on the other hand, goes a step further. It implies building something real and reliable by applying structured knowledge—just as mechanical, civil, or aeronautical engineers do in their fields.
The “real thing” software engineers create isn’t a bridge or an airplane, but rather software systems that people depend on. While less tangible, these systems still require the same disciplined approach and responsibility that other engineering professions demand.
Software Engineering as Programming Over Time
Software engineering is more than just writing code—it’s about everything an organization does to build, maintain, and evolve that code over time. Writing the first version of a program is often the easy part. The real challenge comes later: keeping it useful, sustainable, and adaptable as technology and requirements change.
A helpful way to think about software engineering is as “programming integrated over time.” This perspective reminds us that software has a life cycle: from its first conception, through active use and maintenance, and eventually to retirement. The central question becomes: What practices allow software to survive and stay valuable throughout that cycle?
Three guiding principles help shape this mindset:
- Time and Change – Code must adapt as requirements, technologies, and environments evolve.
- Scale and Growth – Organizations and systems need to handle increasing complexity as they expand.
- Trade-offs and Costs – Every decision comes with consequences; balancing short-term needs with long-term sustainability is key.
By focusing on these principles, software engineering becomes less about quick fixes and more about creating systems that are robust, adaptable, and maintainable in the long run.
The New Paradigm: AI-Assisted Development
Welcome to our first lecture on modern software engineering! Today we’ll explore how the landscape of software development has been transformed by generative AI and automation tools, fundamentally changing how we build, test, and deploy software.
The software engineering field has experienced a revolutionary shift with the advent of generative AI. We’re no longer just writing code; we’re orchestrating intelligent systems that help us think, design, and implement solutions more effectively.
Key Principles of Modern Software Engineering
- AI-Human Collaboration: Leveraging AI as a coding partner, not a replacement
- Automation-First Mindset: Automating repetitive tasks from day one
- Rapid Iteration: Faster feedback cycles through intelligent tooling
- Quality Assurance: AI-powered testing and code review
- Continuous Learning: Tools that adapt and improve with usage
Essential Modern Tools Ecosystem
Version Control & Collaboration: GitHub
GitHub has evolved far beyond simple version control:
- GitHub Copilot: AI pair programming directly in your editor
- GitHub Actions: Automated workflows for CI/CD
- GitHub Codespaces: Cloud development environments
- GitHub Issues & Projects: Integrated project management
- Security Features: Automated vulnerability scanning and dependency management
# Example GitHub Action for Python project
name: CI/CD Pipeline
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up uv
uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- name: Set up Python
run: uv python install 3.12
- name: Install dependencies
run: uv sync
- name: Run tests
run: uv run pytest
Development Environment: VS Code + Extensions
Visual Studio Code has become the de facto standard, enhanced by:
- GitHub Copilot: Intelligent code completion and generation
- Copilot Chat: Conversational programming assistance
- IntelliSense: Advanced code understanding
- Integrated Terminal: Seamless command-line integration
- Extension Ecosystem: Thousands of productivity extensions
Python Development: The Astral Revolution
The Python ecosystem has been revolutionized by Astral’s tools:
uv - Ultra-fast Python Package Manager
# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# Create new project
uv init my-project
cd my-project
# Add dependencies
uv add requests pandas numpy
# Run scripts
uv run main.py
Ruff - Lightning-fast Python Linter and Formatter
# pyproject.toml
[tool.ruff]
line-length = 88
target-version = "py311"
[tool.ruff.lint]
select = ["E", "F", "UP", "B", "SIM", "I"]
Key Benefits of Astral Tools
- Speed: 10-100x faster than traditional tools
- Simplicity: Single binary installations
- Integration: Seamless workflow integration
- Reliability: Built in Rust for performance and safety
Modern Development Workflow
Automation Examples in Practice
Automated Code Quality
# .github/workflows/quality.yml
name: Code Quality
on: [push, pull_request]
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up uv
uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- name: Lint with Ruff
run: uv run ruff check .
- name: Format check
run: uv run ruff format --check .
- name: Type check with Pyright
run: uv run pyright
Automated Documentation
# Using AI to generate docstrings
def calculate_performance_metrics(data: pd.DataFrame) -> dict:
"""
Calculate key performance metrics from time series data.
Args:
data: DataFrame containing timestamp and value columns
Returns:
Dictionary containing calculated metrics including mean, std, etc.
"""
# Implementation with Copilot assistance
pass
The AI-First Development Process
- Problem Definition: Use AI to refine requirements and user stories
- Architecture Design: Leverage AI for system design suggestions
- Code Generation: Copilot assists with implementation
- Testing: AI-generated test cases and edge case identification
- Documentation: Automated documentation generation
- Deployment: AI-optimized CI/CD pipelines
- Monitoring: Intelligent alerting and performance analysis
Best Practices for AI-Assisted Development
Prompt Engineering for Developers
- Be specific in your requests to AI tools
- Provide context about your project and constraints
- Ask for explanations, not just code
- Iterate and refine based on AI suggestions
Tool Integration Strategy
# Modern Python project setup
uv init software-engineering-demo
cd software-engineering-demo
# Add development dependencies
uv add --dev pytest pyright ruff
# Configure VS Code settings
echo '{"python.defaultInterpreterPath": ".venv/bin/python"}' > .vscode/settings.json
Automation Checklist
- Automated formatting (Ruff/Black)
- Automated linting (Ruff)
- Automated testing (pytest + GitHub Actions)
- Automated dependency updates (Dependabot)
- Automated security scanning (CodeQL)
- Automated documentation generation
Future Trends
- AI-Generated Tests: More sophisticated test case generation
- Intelligent Refactoring: AI-powered code restructuring
- Predictive Development: AI predicting bugs and performance issues
- Natural Language Programming: Converting requirements to code
- Autonomous Debugging: AI-powered issue resolution
Practical Exercise
For next class, set up a modern Python development environment:
- Install uv and set up a new project
- Configure VS Code with GitHub Copilot
- Set up a GitHub repository with Actions
- Create a simple Python application with automated testing
- Use Ruff for code formatting and linting
Summary
Modern software engineering is characterized by:
- AI-Human Collaboration: Using AI as an intelligent assistant
- Automation: Reducing manual, repetitive tasks
- Speed: Faster development cycles with better tools
- Quality: Higher code quality through automated checks
- Integration: Seamless tool ecosystems
The tools we’ve discussed—GitHub, VS Code, Copilot, and Astral’s Python toolchain—represent the new standard for professional software development. Mastering these tools and understanding how to leverage AI assistance effectively will be crucial for your success as a modern software engineer.