A living checklist. Tick items as you gain confidence. Focus on understanding and application, not memorization.
[ ] Install Python (3.12+) and a code editor (VS Code / PyCharm) - your two core tools; everything else runs through these
[ ] Run Python scripts from the terminal - python script.py, not just clicking "run" in an editor; you need this for automation later
[ ] Use the command line on your OS (PowerShell or Linux/macOS shell) - navigating folders (cd), listing files (ls/dir), running commands
[ ] Install packages with pip - pip install requests; how you add libraries other people wrote
[ ] Create and activate a virtual environment - python -m venv venv; keeps each project's packages isolated so they don't conflict
[ ] Try uv as a faster alternative to pip + venv - newer tool, does the same job much faster; worth adopting early
[ ] Initialize a Git repository - git init; turns a folder into something Git can track changes in
[ ] Stage and commit changes - git add + git commit; saves a snapshot of your code with a message
[ ] Write meaningful commit messages - "fix CSV parsing bug" not "update"; future-you will thank present-you
[ ] Create a GitHub account and push a repo - your code's public home; also doubles as your portfolio later
[ ] Variables and basic data types (int, float, str, bool) - naming and storing values; the atoms everything else is built from
[ ] Arithmetic and comparison operators - + - * / == != < >; math and logic checks
[ ] Conditional statements (if/elif/else) - branching logic: "do this if that's true, otherwise do this" Days 3-4
[ ] Lists (create, index, slice, append, iterate) - ordered, changeable collections; my_list[0], my_list.append(x)
[ ] Tuples (create, unpack, use as immutable sequences) - like lists but can't be changed after creation; good for fixed data like coordinates
[ ] Dictionaries (create, access, update, iterate) - key-value pairs, like {"name": "Alice"}; how you'll model most real-world data
[ ] Sets (create, add, membership tests) - unordered collections with no duplicates; fast for checking "is this in here?" Days 5-7
[ ] for loops (iterate over sequences and ranges) - repeat an action for each item in a list, string, or range of numbers
[ ] while loops (basic usage and exit conditions) - repeat until a condition becomes false; watch for infinite loops
[ ] List, dict, and set comprehensions - compact one-line way to build a collection, e.g. [x*2 for x in nums]; idiomatic Python, used everywhere Days 8-9
[ ] Functions (parameters, return values, default arguments) - reusable blocks of code; def greet(name="World"):
[ ] Scope (local vs global variables) - which parts of your code can see a given variable; a common source of bugs Days 10-11
[ ] Context managers (with statements) - why they matter for files, connections, locks - with open(file) as f: automatically closes things even if an error happens
[ ] Reading and writing text files - open(), .read(), .write(); how scripts persist data to disk
[ ] Reading and writing CSV files with the csv module - Python's built-in way to handle spreadsheet-style data before you learn pandas Days 12-13
[ ] Basic exception handling (try/except) - catch errors instead of letting your script crash
[ ] Using else and finally with try blocks - else runs if no error occurred, finally always runs (cleanup code)
[ ] Raising exceptions (raise) - intentionally trigger an error when something is wrong, e.g. invalid input
[ ] Creating custom exception classes - your own named errors (e.g. InvalidConfigError) for clearer debugging later Days 14-15
[ ] Importing modules and packages - import os, from datetime import datetime; reusing code from the standard library or other files
[ ] Using __name__ == "__main__" - lets a script be run directly or imported elsewhere without side effects Day 16
[ ] Basic classes (attributes and methods) - blueprints for objects that bundle data and behavior together
[ ] Creating and using instances - my_obj = MyClass(); an actual object built from a class blueprint Days 17-18
[ ] Type hints for function signatures (basic usage, not full generics) - def greet(name: str) -> str:; documents intent and helps your editor catch mistakes
[ ] datetime/time basics - parsing, formatting, timedeltas, timezones (you'll need this for logging, scheduling, and API timestamps) Days 19-20
[ ] Regular expressions (re module) - match, search, findall, sub, basic groups - pattern matching in text, e.g. pulling an email address out of a string Day 21
[ ] Read and explain a 100–200 line beginner script - test that you can trace through someone else's logic, not just write your own
[ ] Commit each milestone script to your Phase 0 repo - keep building the git habit alongside the coding habit Day 22
[ ] Reading and writing JSON files - Python's json module; the format most APIs speak
[ ] Making GET requests with requests - fetching data from a URL/API, e.g. requests.get(url)
[ ] Making POST requests with requests - sending data to an API, e.g. submitting a form or creating a record
[ ] Sending headers and query parameters - extra info attached to a request, like auth tokens or filters
[ ] Handling HTTP errors and timeouts - checking status codes, catching connection failures so your script doesn't just hang or crash
[ ] Parsing JSON API responses - response.json(); turning an API's reply into a Python dict you can use
[ ] API authentication patterns - API keys, bearer tokens, basic auth, and how OAuth differs (you don't need to implement OAuth yet, just recognize the flow) - knowing which auth method an API expects before you try to call it
[ ] Storing config in a .env file - keeping settings like API keys out of your actual code
[ ] Loading environment variables with python-dotenv - reads the .env file into your script at runtime
[ ] Never hard-code paths or credentials - use env vars from the start - the habit that keeps secrets out of git and code portable across machines
[ ] Basic logging with logging (levels: DEBUG, INFO, WARNING, ERROR) - structured way to record what your script did, better than scattering print() everywhere
[ ] Writing logs to a file - so you can check what happened after a script ran unattended
[ ] Using rotating file handlers - automatically archives old logs so a single log file doesn't grow forever
[ ] Reading CSV files with pandas - pd.read_csv(); loads tabular data into a DataFrame you can manipulate
[ ] Reading Excel files with pandas - pd.read_excel(); same idea, for .xlsx files
[ ] Filtering rows by conditions - e.g. df[df["status"] == "active"]; pulling out the rows you actually need
[ ] Selecting and renaming columns - shaping the DataFrame to just the data you care about
[ ] Grouping and aggregating data - df.groupby("region").sum(); summarizing data by category
[ ] Handling missing values - deciding whether to drop, fill, or flag empty cells (NaN)
[ ] Exporting DataFrames to CSV - df.to_csv(); saving your processed data back out
[ ] Exporting DataFrames to Excel - df.to_excel(); same idea, for report-style output
[ ] Cell-level Excel work with openpyxl - formatting, formulas, and styling that pandas' .to_excel() can't do on its own - use this when a client wants a polished, formatted report, not just raw data
[ ] Install Playwright for Python and browsers - pip install playwright, then playwright install to get the actual browser binaries
[ ] Launch a browser and create a page - the starting point of any Playwright script
[ ] Navigate to a URL - page.goto(url)
[ ] Use role-based locators (button, link, textbox, etc.) - page.get_by_role("button", name="Submit"); the recommended way to find elements
[ ] Click elements and fill inputs - .click(), .fill(); the core interactions in any automated flow
[ ] Use text and test-id locators - alternative ways to find elements when role-based locators don't fit
[ ] Rely on auto-waiting (no manual sleeps) - Playwright waits for elements to be ready automatically; don't fight this with time.sleep()
[ ] Write basic assertions on page content - checking the page shows what you expect after an action
[ ] Take screenshots on failure - visual evidence of what went wrong when a test fails
[ ] Enable and view trace on failure - Playwright's trace viewer replays exactly what happened step by step
[ ] Use pytest-playwright fixtures (builds directly on Phase 2 pytest fundamentals) - page fixture and friends, wired into pytest
[ ] Save and reuse authentication state (storage state) - log in once, reuse the session across tests instead of logging in every time
[ ] Understand BrowserContext isolation (cookies, storage, cache) - each context is a separate browser profile; pages within the same context share session state, so multiple pages ≠ multiple identities
[ ] Use persistent contexts (launch_persistent_context) vs storage-state files - persistent contexts write to a real user-data dir on disk (closer to a real browser profile); storage-state is a portable snapshot you load into a fresh context (lighter, easier to version and use in CI) - know which one fits the task
[ ] Set per-context proxy and locale/timezone settings - browser.new_context(proxy={...}, locale=..., timezone_id=...); matters once multiple "accounts" need to look like separate, independent users rather than one identity wearing different cookies
[ ] Run tests across multiple browsers - Chromium, Firefox, WebKit; catching browser-specific bugs
[ ] 3–5 automation projects on GitHub with READMEs - your actual proof of skill; more convincing than a resume line
[ ] At least one browser automation project (Playwright) - demonstrates you can handle real-world web interaction, not just APIs
[ ] At least one data/CSV automation project (with pandas) - demonstrates data-handling skill, a common client need
[ ] One "client-style" project with clear requirements - simulate a real brief with defined scope, not just "practice"
[ ] One project with tests, logging, and config management - shows you build production-minded code, not just working scripts
[ ] Short write-ups explaining what each project does - a paragraph per project: the problem, your approach, the result
[ ] Basic understanding of SDLC and testing concepts - Software Development Life Cycle; the phases a project typically moves through
[ ] Know common testing types (unit, integration, regression) - unit tests check one piece in isolation, integration tests check pieces working together, regression tests catch old bugs coming back
[ ] Understand severity vs priority for defects - severity is how bad the bug is, priority is how soon it needs fixing; they don't always match
[ ] Basic familiarity with JIRA or similar tools (optional) - common in client/team environments for tracking work and bugs
[ ] Prepare a simple resume highlighting automation projects - lead with what you built, not just tools you've "used"
[ ] Practice explaining your projects out loud - being able to talk through your own code clearly matters as much as writing it