From Zero to AI Agents
Claude Code, Codex, Copilot, Cursor — they all do one thing:
Generate code.
The magic is code. The output is code. The thing that runs on servers, powers apps, and costs your company money is code.
Even “no-code” tools generate code under the hood.
You may never write code yourself. But code is what’s running — and someone needs to understand it.
In your next job, you will:
Without the basics, you’ll be flying blind.
The goal is not to make you a software developer.
But you will be prototyping with AI. You’ll vibe-code internal tools, A/B tests, dashboards. AI makes that easy now.
What AI won’t tell you:
Important
Don’t be the employee who shipped a vibecoded A/B test to real users and leaked the company’s API keys. Understanding the basics is what keeps you safe, fast, and effective.
Imagine you’re writing a recipe. You list ingredients, describe each step, and someone follows your instructions to make a dish.
Code is exactly that — a set of instructions that tells a computer what to do.
The difference? Computers are incredibly literal.
If your recipe says “add salt” but doesn’t say how much, a human figures it out. A computer would crash (or add infinite salt).
At the lowest level, computers only understand binary — ones and zeros.
01001000 01100101 01101100 01101100 01101111 = "Hello"
Every photo, video, song, and app on your phone is ultimately a sequence of 1s and 0s.
Writing programs in binary would be insane. That’s why we have programming languages — human-readable ways to write instructions that get translated into binary.
The journey from your code to computer action:
Tip
Compiled languages (C, Go, Rust) translate all the code at once before running. Like translating a whole book.
Interpreted languages (Python, JavaScript) translate line by line as they run. Like having a live translator.
Every program is built from just a few pieces. Let’s start with variables — storing data.
Conditionals let your program make decisions.
Loops repeat things so you don’t have to.
Functions are reusable blocks of logic.
Important
All software — from Instagram to self-driving cars — is built from these same building blocks: variables, conditionals, loops, and functions.
The complexity comes from combining them in clever ways.
If code is a recipe, then programming languages are the different human languages you can write that recipe in.
A chocolate cake recipe in English, French, or Japanese — same result, different words.
Different languages are optimized for different tasks:
| Language | Best For | Example Use |
|---|---|---|
| Python | Data science, AI, scripting | ChatGPT, Instagram backend |
| JavaScript | Web browsers, frontend | Every website you visit |
| Go | Fast servers, cloud tools | Docker, Kubernetes |
| Java | Enterprise, Android apps | Banking systems |
| C/C++ | Operating systems, games | Windows, Unreal Engine |
| Rust | Safe, fast systems | Firefox, Cloudflare |
Tip
Python reads almost like English, has a massive ecosystem for AI/ML, and is the most popular language in data science. That’s why we use it throughout this course.
Compiled languages (C, Go, Rust) — translate the entire program to machine code before running. Faster execution.
Interpreted languages (Python, JavaScript, Ruby) — translate code line-by-line while running. Slower, but you can run code instantly.
The most famous programming interview question:
Python wins on simplicity — one line vs four or more.
You’re working on a project. You make changes, break something, and want to go back. Without version control:
project_final.pyproject_final_v2.pyproject_final_v2_FIXED.pyproject_final_v2_FIXED_for_real.pyGit solves this — it tracks every change, lets you go back in time, and lets multiple people work on the same project.
Git is a version control system. It keeps a complete history of every change to every file.
When you run git diff, you see exactly what changed — red lines were removed, green lines were added:
Tip
This is how code review works. Before merging, your team reads the diff to check what changed. You’ll see this view constantly in pull requests.
A repository (repo) is a project folder tracked by Git:
.git/ folder)Tip
Every repo has a main branch — the “official” version. You create branches to work on features, then merge them back.
GitHub hosts Git repositories in the cloud. It adds:
Note
GitHub is to Git what Gmail is to email. Git is the technology, GitHub is the popular service. Alternatives: GitLab, Bitbucket.
1. git pull ← Get latest changes
2. git checkout -b feature ← Create a branch
3. (write code)
4. git add . ← Stage changes
5. git commit -m "Add feature" ← Save snapshot
6. git push ← Upload to GitHub
7. Open a Pull Request ← Ask for code review
8. Merge to main ← Ship it!
Important
Never commit secrets (passwords, API keys, tokens) to Git. Once in history, it’s very hard to remove. Use .gitignore to exclude sensitive files.
When you open a website, everything you see and interact with — the buttons, text, images, animations — that’s the frontend.
It runs in your browser (Chrome, Safari, Firefox).
Every website is built with three technologies:
| Technology | Role | Analogy |
|---|---|---|
| HTML | Structure | The skeleton / blueprint |
| CSS | Style | The paint, furniture, decoration |
| JavaScript | Behavior | The electricity, plumbing, moving parts |
HTML (HyperText Markup Language) defines what’s on the page:
The browser reads your HTML and builds a tree structure called the DOM (Document Object Model):
document
└── html
├── head
│ └── title
└── body
├── h1
├── p
└── button
JavaScript can add, remove, or change any node in this tree — that’s how modern web apps work.
We can use Python to generate HTML. This is actually how many web frameworks work — the server builds HTML and sends it to the browser.
Note
What we just did — generating HTML with code — is the core idea behind server-side rendering. Django, Express, and Rails all do this at scale.
Today, most web apps use frameworks that make frontend development easier:
These frameworks let you build complex, interactive apps without manually manipulating the DOM.
The frontend is what you see. The backend is the brain behind it — it decides what happens, enforces the rules, and keeps your secrets safe.
When you open Instagram, the frontend shows photos. But the backend decided which photos to show you, checked you’re allowed to see them, and billed the advertiser who paid to be in your feed. All invisible to you.
Imagine Spotify with no backend:
The backend solves all of this. It’s the single source of truth that every device talks to.
Important
Mobile, web, TV, watch — they’re all just different frontends. The backend is the one brain they all share. Change the logic once, every device gets the update.
A server is just a computer that’s always on, always listening for requests.
Note
Any computer can be a server. Your laptop could be one right now. “The cloud” is just someone else’s servers in a data center.
An API (Application Programming Interface) is like a waiter at a restaurant:
You never go into the kitchen yourself. The API is the middleman.
When your browser talks to a server, it uses HTTP methods:
| Method | Purpose | Example |
|---|---|---|
| GET | Read data | “Show me user #42’s profile” |
| POST | Create data | “Create a new account” |
| PUT | Update data | “Change my email address” |
| DELETE | Remove data | “Delete this photo” |
APIs send data as JSON (JavaScript Object Notation) — a simple text format that both humans and computers can read:
Tip
In production, you’d use a framework like FastAPI or Flask (Python), Express (Node.js), or Gin (Go) to build real API servers.
Every app needs to store data somewhere. User accounts, posts, messages, orders — all of it lives in a database.
Without databases, every time you closed an app, all your data would vanish.
Think of a database as a highly organized filing cabinet — everything is neatly arranged in tables with rows and columns.
| id | name | role | |
|---|---|---|---|
| 1 | Alice | alice@example.com | engineer |
| 2 | Bob | bob@example.com | designer |
| 3 | Charlie | charlie@example.com | data scientist |
Start with the data. Before writing any code, ask: what am I storing, and how does it relate? Think about Spotify: a user creates many playlists, a playlist contains many songs, a song can be in many playlists.

Tip
Once you map your data and relationships, the code almost writes itself. This is called a data model — the first thing engineers design before touching code.
SQL (Structured Query Language) is how you ask a database for data:
Note
SQL has been around since the 1970s and is used by virtually every company. Learning SQL is one of the highest-ROI skills in tech.
Not all databases are tables. Different data needs different structures:
| Type | Example | Best For |
|---|---|---|
| Relational (SQL) | PostgreSQL, MySQL | Structured data, relationships |
| Document | MongoDB | Flexible data, JSON-like documents |
| Key-Value | Redis | Caching, sessions, fast lookups |
| Graph | Neo4j | Social networks, recommendations |
Tip
When in doubt, use PostgreSQL. It’s free, open-source, reliable, and handles everything from a small side project to Instagram-scale.
A cache is a quick-access copy of data. Your fridge is a cache. The supermarket is the database.
Important
That’s exactly how a cache works in software. The fridge (cache) is fast but limited and can go stale. The supermarket (database/backend) is the real source — slower to reach, but always has everything.
An API key is like a password that lets your app access someone else’s data or service.
Important
API keys are passwords for machines. If someone steals your key, they can use your account, rack up charges, and access your data. Treat them like you treat your bank password.
Your app needs different settings in different places:
| Setting | Development | Production |
|---|---|---|
| Database URL | localhost:5432 |
prod-db.aws.com:5432 |
| API Key | test_key_123 |
live_key_abc |
| Debug Mode | true |
false |
You can’t hardcode these — the same code runs in both environments.
Env vars are key-value pairs set outside your code:
.env File & SecretsLocally, developers use a .env file:
# .env file (NEVER commit this to Git!)
DATABASE_URL=postgresql://localhost:5432/myapp
API_KEY=sk-test-12345
SECRET_KEY=super-secret-value
DEBUG=true
Important
Add .env to your .gitignore immediately. Leaked API keys can cost thousands — bots scan GitHub for exposed keys.
In production, secrets are stored securely:
| Platform | Where Secrets Live |
|---|---|
| Vercel | Dashboard → Settings → Environment Variables |
| GitHub Actions | Repo → Settings → Secrets |
| AWS | Secrets Manager / Parameter Store |
Without authentication, anyone can access anyone’s data. Your app has no idea who is making a request.
Authentication answers one question: “Are you who you say you are?”
Important
If you build a prototype with no auth, every user can see every other user’s data. This is the #1 mistake in vibecoded apps.
Tip
Services like Supabase, Auth0, and Firebase handle all of this for you. You don’t build auth from scratch — you plug in a provider.
You’ve built an app on your laptop. But how does the rest of the world use it?
The cloud is just someone else’s computers in a data center. Instead of buying servers, you rent them by the hour from Amazon, Google, and Microsoft.
Note
Your laptop goes to sleep, loses internet, and can only handle a few users. Cloud servers run 24/7, handle millions of requests, and scale up when traffic spikes.
| Platform | Company | Best For |
|---|---|---|
| AWS | Amazon | Everything — the biggest cloud (32% market share) |
| GCP | AI/ML workloads, BigQuery data analytics | |
| Azure | Microsoft | Enterprise, Windows-heavy organizations |
| Vercel | Vercel | Frontend apps, Next.js, simple deploys |
Every cloud service exposes APIs that you can call. Let’s fetch real data from GitHub’s API:
Tip
Every time an app shows you the weather, stock prices, or your Uber driver’s location, it’s calling a cloud API just like this. APIs are the backbone of the modern internet.
Imagine you fix the kitchen sink, and accidentally the bathroom toilet stops flushing.
That’s a regression — something that used to work breaks because of a new change.
In code, this happens constantly. You fix one feature, another breaks. The codebase is bigger than any one person can hold in their head.
A unit test is a small piece of code that checks if another piece of code works correctly.
You write them once, and they run every time you change code — catching regressions automatically.
Important
Without tests, you only discover regressions when users find them. With tests, you discover them before you ship.
Note
You don’t need to write tests by hand. AI coding agents can generate them for you. But you need to know they should exist and insist on them.
Vercel is the fastest way to get a website live on the internet. Free for personal projects, takes about 2 minutes.
Vercel connects to your GitHub repository. Every time you push code, Vercel automatically builds and deploys it.
This is called CI/CD (Continuous Integration / Continuous Deployment).
Note
CI/CD means: every time you save your code, it automatically gets tested and published. No manual uploading, no FTP, no server configuration. Push code, site updates.
index.html fileyour-project.vercel.appWhen you push code to GitHub:
npm run build to compile your codeEvery subsequent push repeats the cycle automatically. If the build fails, Vercel keeps the previous working version live.
Note
Vercel also creates preview deployments for every pull request — a unique URL to test features before merging.
| Platform | Best For | Effort Level |
|---|---|---|
| Vercel | Frontend, Next.js, static sites | Very easy |
| Railway | Full-stack apps with databases | Easy |
| Fly.io | Docker containers, global distribution | Medium |
| AWS / GCP | Anything, full control | Advanced |
Important
Don’t spend weeks learning AWS when Vercel can deploy your project in 2 minutes. Use the simplest tool that meets your needs. You can always migrate later.
A tech stack is the combination of technologies used to build an application.
Just like a house needs a foundation, walls, and a roof, an app needs a database, backend, and frontend.
| Database | Type | Strengths | Used By |
|---|---|---|---|
| PostgreSQL | Relational (SQL) | Reliable, feature-rich, free | Instagram, Stripe, Reddit |
| MongoDB | Document (NoSQL) | Flexible schema, JSON-native | Adobe, eBay |
| Redis | Key-Value (cache) | Blazing fast, in-memory | Twitter, GitHub |
Tip
Start with PostgreSQL for almost everything. Add Redis later if you need caching.
| Framework | Language | Strengths | Used By |
|---|---|---|---|
| FastAPI | Python | Fast, modern, great for AI APIs | Uber, Netflix |
| Next.js (API routes) | JavaScript/TypeScript | Backend built into your frontend | Vercel, TikTok |
| Node.js / Express | JavaScript | Lightweight, massive ecosystem | Netflix, PayPal |
| Go (stdlib / Gin) | Go | Extremely fast, great concurrency | Google, Uber, Docker |
Tip
For AI/ML projects, FastAPI (Python) is ideal — your backend and your ML code are in the same language. Django and Flask are also popular Python options (Django for large apps, Flask for simple ones).
| Framework | Language | Strengths | Used By |
|---|---|---|---|
| React + Vite | JavaScript/TypeScript | Component-based, fast dev server | Facebook, Airbnb |
| Next.js | JavaScript/TypeScript | React + SSR + API routes (full-stack) | TikTok, Hulu |
| Vue | JavaScript/TypeScript | Simpler than React, gentle learning curve | GitLab, Nintendo |
Note
Next.js can be both your frontend AND backend — it has built-in API routes. React + Vite is frontend-only and needs a separate backend (like FastAPI or Express).
The Full-Stack JS
(one language, one framework)
The AI / Python Stack
(great for ML)
The Performance Stack
(max speed)
Important
Don’t overthink the stack. Pick something popular with good documentation, and start building.
Shipping beats perfecting.
The terminal is just a text-based way to talk to your computer.
Instead of clicking buttons and dragging icons, you type commands.
Think of it like texting your computer instead of pointing at things. Same computer, same capabilities — just a different interface.
Tip
Every developer, every server, and every AI tool ultimately runs through a terminal. Learning it is like learning to drive stick — not strictly necessary, but it unlocks everything.
Or find it in Applications → Utilities → Terminal
Or install Windows Terminal from the Microsoft Store for a better experience.
Congratulations. You opened a terminal.
You are now officially a hacker.
Just enough to get around:
Note
To stop a running command: Ctrl + C (both Mac and Windows). This is your emergency brake — use it whenever something is stuck or you want to cancel.
That’s it. That’s all you need to know to get started. Everything else you can look up — or ask Claude.
Tip
Don’t worry — we’ll do this together. And once you have Claude Code, it can install the rest for you.
1. Install Homebrew
2. Install Node.js (includes npm & npx) and Git
3. Install the CLI tools via npm
Once you have Claude Code installed, you can ask it to do the rest:
Tip
This is the whole point — Claude Code can run terminal commands for you. You don’t need to memorize any of this.
These are AI agents that run in your terminal — not chatbots in a browser.
| Claude Code | OpenAI Codex | |
|---|---|---|
| By | Anthropic | OpenAI |
| Launch | claude |
codex |
| YOLO | --dangerously-skip-permissions |
--yolo |
| Models | Sonnet, Opus, Haiku | GPT-5.4, 5.4 mini, 5.4 nano |
Both can read your codebase, write files, run commands, and iterate autonomously. Use whichever you prefer — the workflow is the same.
Important
The chat UI (claude.ai, ChatGPT) is great for questions. But for building software, the CLI is in a different league.
Skip all permission prompts — let the AI just go:
Warning
YOLO mode means the AI will create files, install packages, and run commands without asking you first.
Use it for greenfield projects where you trust it to figure it out. Don’t use it on production code you care about.
Think of it like autopilot. Great for takeoff on an empty runway. Maybe not for landing in a thunderstorm.
Start with a plan before letting Claude execute:
/plan in Claude Code to enter plan modeTip
Best workflow: Plan first (so you understand what’s about to happen), then run in YOLO mode to execute the plan without interruptions.
Important
Build a networking tracker — a website to record the people you need to network with at Berkeley.
Stack: Next.js + Supabase + Vercel
Open your terminal and run:
This creates a folder, enters it, and launches your AI agent in YOLO mode.
Paste this into Claude Code:
/plan Build a networking tracker web app with this stack:
- Next.js (App Router, TypeScript, Tailwind CSS)
- Supabase (PostgreSQL database)
- Deploy to Vercel
The app should:
1. Have a simple, clean UI to add contacts with: name, company, role,
where you met them, notes, and a priority level (high/medium/low)
2. Display contacts in a sortable table/list
3. Let you edit and delete contacts
4. Use Supabase for the database (create the table schema)
5. Include a .env.local file template for NEXT_PUBLIC_SUPABASE_URL
and NEXT_PUBLIC_SUPABASE_ANON_KEY
Install all dependencies with npx create-next-app@latest, set up
the project structure, and create all necessary files.
Note
After reviewing the plan, exit plan mode. Claude will:
Just watch it work. This is what AI-assisted development looks like.
When Claude is done building, deploy to the world:
One command. Follow the prompts. Your app is live.
Important
You just built and deployed a full-stack web application with a database, a UI, and a live URL — in one class session.
This is what Level 2 fluency looks like in practice.
You walked in today not knowing what a terminal was.
You just:
Important
That’s not a tutorial. That’s software engineering.
Welcome to the club. See you in Class 2.
Help me improve! Take 1 minute to fill out this anonymous survey:

→ Class 1 Survey (Google Form)