Course overview

Objective

The objective of this course is to train people to get a good job in technology.

Pre-requisites of this course is having completed Code Your Future’s Intro to Programming course which teaches the basics of programming with JavaScript, Python, and SQL.

Outcomes of this course are that you can write high quality code in multiple languages, are able to consider trade-offs, can design systems that involve multiple components, and can get a job as a Software Engineer.

A trainee may choose to take further specialisation courses after this one, for instance to learn a specific language or framework, but this should not be required to get most software engineering jobs.

Modules

Tools

  1. Binary and hexadecimal numbers
  2. CPU and memory
  3. How Computer really work? Chapter 1 & 2
  4. Shell tools
  5. cat
  6. man pages
  7. ls
  8. wc
  9. grep
  10. sed
  11. awk
  1. Programming language concepts
  2. Bitwise operators
  3. Comparing programming languages
  4. Shell pipelines
  5. grep in pipelines
  6. sort and uniq
  7. head and tail
  8. tr
  9. jq
  1. NodeJS
  2. Using dependencies from npm
  3. Installing dependencies with npm
  4. Operating systems
  1. Single-use data analysis programs
  2. Comparing JavaScript and Python
  3. Converting JavaScript to Python
  4. Virtual environments
  5. Using Python dependencies

Logic

  1. Introduction
  2. Deduction
  3. Induction
  4. Abduction
  5. The Problem Domain
  6. Falsification
  7. Bisection
  8. Boolean Logic
  9. 1000 Bottles of Wine
  10. Binary Information Theory

Decomposition

  1. Read about the Internet
  2. Read about the world-wide web
  3. Limitations of frontends
  4. What is a backend?
  5. Backend statefulness
  6. Limitations of backends
  7. Responsibilities of frontends, backends, and databases
  8. Design a frontend and backend
  9. Write a frontend and backend
  10. Deploy a frontend and backend
  1. Data validation
  2. Chat application requirements
  3. Making a non-live chat application
  4. Deploying the chat application
  5. Limitations of a single request/response
  6. Designing a streaming API
  7. Repeated client requests for updates
  8. Long-polling
  1. WebSockets
  2. Adding like/dislike
  3. Identifying common functionality
  4. Extracting common functionality
  5. Continuation styles
  6. Extracting a middleware
  7. Using existing middleware
  1. Why we use types
  2. Type checking with mypy
  3. Classes and objects
  4. Methods
  5. Dataclasses
  6. Generics
  7. Type-guided refactorings
  8. Enums
  9. Inheritance

Legacy code

  1. What is Legacy Code?
  2. Understanding Legacy Code
  3. Fear and logic
  4. Finding things
  5. Identifying patterns
  6. Debugging: Proposing and Discarding Hypotheses
  7. Capturing behaviour in tests
  8. Fixing: Targeted Changes with Test Support
  9. Extending: Adding Features the Right Way

Complexity

  1. Memory consumption
  2. Big-O
  3. Worked example: Duplicate Encoder
  4. "Expensive" Operations
  5. Network as a bottleneck
  6. N+1 Query Problem
  1. Caching
  2. Cache Invalidation
  3. Memoisation
  4. Caching too much
  5. Pre-computing
  6. Trade-offs