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.

1 2 3 4 5 6 7 8 Browser You type a URL DNS Name → IP address Web server HTTPS · TLS Rendering HTML · CSS · JS Response Status · HTML · JSON Backend / API Business logic Cache Fast answers Database Stored data
Live example
Read the full transcript
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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.
  10. 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.

1 2 3 4 5 6 7 8 Working directory Your edits Staging area git add Local repository git commit Feature branch git switch -c Pull request Review · CI checks GitHub (remote) git push Teammates git pull main branch Merged code
Live example
Read the full transcript
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. Step 7 · Pull: Teammates run git pull to bring the latest main into their own copies, so everyone builds on the newest code.
  9. 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.
  10. 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.

1 2 3 4 5 6 7 8 Terminal bash commands Files & folders ls · cd · cat Permissions chmod · users Docker image docker build Dockerfile Build recipe Your app code app.py Container docker run Browser localhost:8080 Registry docker push
Live example
Read the full transcript
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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.
  10. 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.

Want to learn this with a mentor?

Join the Epitomsoft Academy Foundations track: live sessions, real projects and career support.