Epitomsoft Academy · Foundations course · weeks 1–4
Tech Foundations
The essentials every employer expects from a junior engineer: how the web works, Git and GitHub, Linux and Docker, Python and SQL – explained with animations, real examples and code you can run today.
What you will learn
The skills every tech job builds on
Whatever your track – full-stack, QA, data and AI, or cloud – these foundations come up in every interview and every first job. Master them first and everything after becomes easier.
- Explain what happens when you open a website – a classic interview question
- Work like a professional team with Git branches and pull requests
- Use the Linux command line and run applications in Docker containers
- Write clean Python programs with functions, lists and dictionaries
- Query data confidently with SQL: filter, group and join
- Publish a portfolio-ready project on GitHub
Course at a glance
- Sessions: 3 animated video lessons + reading + lab
- Level: Beginner – no experience needed
- Prerequisites: A laptop and curiosity
- You will build: A containerised “jobs API” with a database, published on GitHub
Session 1 of 3
How the web works
Follow one click from the browser through DNS, HTTPS, the backend, the database and the cache – and back to the screen.
Read the full transcript
- Welcome: Hi, I am Epi! Every developer needs to understand what really happens when you open a website. Let us follow one click: a student opens jobs dot example dot com, slash remote, to see remote jobs.
- Step 1 · DNS lookup: Computers talk using IP addresses, not names. So the browser first asks the Domain Name System, DNS, which acts like the internet’s phone book, for the address of jobs dot example dot com.
- Step 2 · Secure connection: With the address, the browser connects to the web server. HTTPS uses TLS to encrypt everything, so nobody in between can read or change the data. That is the padlock in your browser.
- Step 3 · HTTP request: The browser sends an HTTP request: a method such as GET, a path such as slash remote, and headers. The web server passes it to the backend application, which holds the business logic.
- Step 4 · Database: The backend needs data, so it asks the database for remote jobs, usually with SQL. Databases store information permanently and can search it quickly.
- Step 5 · Cache: Popular results are kept in a cache, a fast in-memory store, so the next visitor gets the answer in milliseconds without asking the database again.
- Step 6 · Response: The backend builds a response with a status code, such as two hundred for OK or four zero four for not found, plus the content: an HTML page, or JSON data for apps.
- Step 7 · Rendering: The browser reads the HTML for structure, the CSS for style, and runs the JavaScript for interactivity, then draws the page on screen.
- Step 8 · On screen: And the student sees the list of remote jobs, usually less than a second after clicking. Every web app you will build follows this same journey.
- Recap: DNS finds the server, HTTPS secures the connection, the backend and database produce the data, a cache speeds it up, and the browser renders the response. Next, let us learn how developers work together on code, with Git.
Session 2 of 3
Git & GitHub workflow
Branch, stage, commit, push, open a pull request, merge and pull – the daily loop of every software team.
Read the full transcript
- Welcome: Git is how every software team works together. In this session you will follow one change from your laptop to the team’s main code. Our example: adding a remote-only checkbox to the job search page.
- Step 1 · Branch: Never work directly on main. Create a feature branch, a safe copy where you can experiment without breaking anyone else’s work.
- Step 2 · Stage: You edit files in your working directory. When a change is ready, git add puts it in the staging area, choosing exactly what goes into the next snapshot.
- Step 3 · Commit: git commit saves a snapshot in your local repository, with a clear message explaining why the change was made. Small, focused commits are easier to review and undo.
- Step 4 · Push: git push uploads your commits to the shared repository on GitHub, so your work is backed up and visible to the team.
- Step 5 · Pull request: On GitHub you open a pull request. Teammates review the code and suggest improvements, while automated checks run the tests. This is where you learn the most.
- Step 6 · Merge: Once approved and green, the pull request is merged into main. If two people changed the same lines, Git asks a person to resolve the merge conflict.
- Step 7 · Pull: Teammates run git pull to bring the latest main into their own copies, so everyone builds on the newest code.
- Step 8 · Next feature: And the cycle starts again with a new branch for the next task. Clean history, reviewed code and backups come for free.
- Recap: Branch, stage, commit, push, pull request, merge and pull. Master this loop and you can contribute to any team or open-source project. Next: Linux and Docker basics.
Session 3 of 3
Linux & Docker basics
Navigate the terminal, understand permissions, then package a Python API into a Docker image and run it.
Read the full transcript
- Welcome: Most servers in the cloud run Linux, and most applications ship in containers. In this session you will run a tiny Python API in a Docker container, step by step.
- Step 1 · Navigate: Developers work in the terminal. You move around with cd, list files with ls, and read a file with cat. These few commands cover most daily work.
- Step 2 · Permissions: Linux protects files with permissions for the owner, the group and everyone else. Six four four means the owner can read and write, and others can only read.
- Step 3 · The app: Here is our application: a small Python web API in app dot py, with its libraries listed in requirements dot text.
- Step 4 · Dockerfile: A Dockerfile is the recipe: start from a Python base image, copy the code, install the requirements, and say which command starts the app.
- Step 5 · Build: docker build follows the recipe and produces an image: a portable package with your app and everything it needs, which runs the same on any machine.
- Step 6 · Run: docker run starts a container, a running instance of the image. The p flag maps a port on your laptop to the port inside the container.
- Step 7 · Test: Open localhost colon eight zero eight zero in your browser, and the API answers from inside the container. Works on my machine now means works everywhere.
- Step 8 · Share: Finally, push the image to a registry, such as Docker Hub or Amazon ECR, so servers and Kubernetes clusters can pull and run it.
- Recap: Terminal, files and permissions, then Dockerfile, image, container and registry. You now have the foundations for cloud and DevOps work, including our Kubernetes course.
Deep dive
Key concepts, explained with examples
HTTP and status codes
Browsers and apps talk to servers with HTTP requests (GET, POST, PUT, DELETE) and get responses with status codes: 2xx success, 3xx redirect, 4xx client error, 5xx server error.
Example: GET /jobs → 200 OK; GET /jobs/999 → 404 Not Found; a bug in the server → 500.
APIs and JSON
An API is a contract that lets programs talk. Most web APIs exchange JSON – simple text made of objects (key–value pairs) and lists.
Example: {“title”: “Junior Python Developer”, “remote”: true} is a JSON object describing one job.
Frontend vs backend
The frontend runs in the browser (HTML, CSS, JavaScript); the backend runs on servers (Python, Java, .NET, Node.js) with the business logic and database access.
Example: The search box is frontend; filtering jobs from the database is backend.
Git branching and pull requests
Branches isolate work; pull requests bring it back through review and automated tests. Small commits with clear messages make history easy to read.
Example: “Fix pagination bug on /jobs (#23)” tells teammates exactly what changed and why.
Linux essentials
Most servers run Linux. Know how to navigate (cd, ls, pwd), read files (cat, less), search (grep), check processes (ps, top) and change permissions (chmod).
Example: grep -i error app.log finds every error line in a log file in seconds.
Containers
A container packages an app with everything it needs, so it runs identically everywhere. Images are built from a Dockerfile; containers are running images.
Example: The same jobs-api:1.0 image runs on your laptop, a teammate’s laptop and a Kubernetes cluster.
Python essentials
Variables, lists, dictionaries, loops, functions, error handling and packages. Python is the most common first language and the language of data and AI.
Example: A 15-line Python script can read a JSON list of jobs and count openings per city.
SQL and relational databases
Data lives in tables of rows and columns. SQL lets you SELECT, filter with WHERE, combine tables with JOIN and summarise with GROUP BY.
Example: SELECT city, COUNT(*) FROM jobs GROUP BY city answers “where are the openings?”
Your toolkit
Tools you will use from day one
All free – install them in week 1.
Editor
Visual Studio Code
The most popular code editor, with extensions for Python, Git, Docker and SQL.
Version control
Git + GitHub
Track every change, collaborate through pull requests and publish your portfolio.
Terminal
Bash / WSL
Use the Linux command line on macOS, Linux or Windows (Windows Subsystem for Linux).
Containers
Docker Desktop
Build and run containers locally, exactly like production.
APIs
curl / Postman
Send HTTP requests to test APIs and inspect responses.
AI assistants
Use them responsibly
Great for explanations and first drafts – but understand and review every line you commit.
Worked examples
Code you can run today
Small, real examples for each foundation – try them on your own laptop.
Example 1 – Make an HTTP request and read the response
curl -i https://api.github.com/users/octocat # -i shows the status line and headers
# HTTP/2 200
# content-type: application/json; charset=utf-8
# { "login": "octocat", "public_repos": 8, ... }
Example 2 – The everyday Git workflow
git switch -c feature/remote-checkbox # 1. new branch
git add search.html search.js # 2. stage changes
git commit -m "Add remote-only checkbox (#17)" # 3. snapshot
git push -u origin feature/remote-checkbox # 4. upload, then open a pull request on GitHub
git switch main && git pull # 5. after merge: update your main branch
Example 3 – Python: lists, dictionaries, loops and functions
import json
jobs = [
{"title": "Junior Python Developer", "city": "Austin", "remote": True},
{"title": "QA Automation Intern", "city": "Dallas", "remote": False},
{"title": "Cloud Support Associate", "city": "Austin", "remote": True},
]
def remote_jobs(items):
"""Return only the remote jobs."""
return [job for job in items if job["remote"]]
counts = {}
for job in jobs:
counts[job["city"]] = counts.get(job["city"], 0) + 1
print([j["title"] for j in remote_jobs(jobs)])
print(counts) # {'Austin': 2, 'Dallas': 1}
print(json.dumps(remote_jobs(jobs), indent=2))
Example 4 – SQL: create, insert, filter, group and join (works in SQLite or PostgreSQL)
CREATE TABLE companies (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
CREATE TABLE jobs (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
city TEXT,
remote BOOLEAN DEFAULT FALSE,
company_id INTEGER REFERENCES companies(id)
);
INSERT INTO companies (id, name) VALUES (1, 'Epitomsoft'), (2, 'Acme Cloud');
INSERT INTO jobs (id, title, city, remote, company_id) VALUES
(1, 'Junior Python Developer', 'Austin', TRUE, 1),
(2, 'QA Automation Intern', 'Dallas', FALSE, 2),
(3, 'Cloud Support Associate', 'Austin', TRUE, 2);
SELECT title, city FROM jobs WHERE remote = TRUE ORDER BY title; -- filter
SELECT city, COUNT(*) AS openings FROM jobs GROUP BY city; -- summarise
SELECT j.title, c.name AS company -- combine
FROM jobs j JOIN companies c ON c.id = j.company_id;
Example 5 – A Python API in a Docker container (requirements.txt contains: flask)
# app.py
from flask import Flask, jsonify
app = Flask(__name__)
@app.get("/jobs")
def jobs():
return jsonify([{"title": "Junior Python Developer", "remote": True}])
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
# Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
# terminal
docker build -t jobs-api:1.0 .
docker run -p 8080:5000 jobs-api:1.0
curl https://epitomsoft.com/jobs
Hands-on lab
Your first portfolio project
Combine every foundation into one project you can show employers – and explain confidently in interviews.
- Create a GitHub repository with a clear README
- Build a small Python API that serves jobs from a SQLite database
- Work in feature branches and merge through pull requests
- Write three SQL queries the API uses: filter, group and join
- Add a Dockerfile and run the API in a container
- Record a 2-minute demo explaining what happens when you call the API
Key terms
Vocabulary to master
- DNS
- HTTP
- HTTPS / TLS
- Status code
- API
- JSON
- Frontend
- Backend
- Cache
- Repository
- Branch
- Commit
- Pull request
- Merge conflict
- Terminal
- Permissions
- Dockerfile
- Image
- Container
- Function
- Dictionary
- SELECT
- JOIN
- GROUP BY
- Primary key
Check your understanding
Course quizzes
Score 70% or more on every quiz to complete the course and unlock your certificate on My progress.
Further learning
Free official documentation & open-source references
Primary sources and free hands-on resources to go deeper.
- MDN – How the web works – clear introduction from Mozilla
- MDN – An overview of HTTP – requests, responses and status codes
- Pro Git (free book) – the complete, free Git book
- Learn Git Branching – interactive, visual Git practice
- GitHub Skills – free hands-on GitHub courses
- Linux Journey – free beginner Linux lessons
- Docker – Get started – official Docker tutorial
- The Python Tutorial – official Python documentation
- SQLBolt – free interactive SQL lessons
- CS50x (Harvard) – free introduction to computer science
- freeCodeCamp – free curriculum and certifications
- The Odin Project – free, open-source full-stack curriculum
Want to learn this with a mentor?
Join the Epitomsoft Academy Foundations track: live sessions, real projects and career support.
