Tasks
All the tasks of the course in one place, by module. Each one leads to the lesson that explains what you need.
Tasks from the lessons
Section titled "Tasks from the lessons"Design patterns
- Why patterns
- Strategy
- Observer
- Factory Method and Simple Factory
- Builder
- Singleton and Dependency Injection
- Adapter and Facade
- Decorator
- Composite
- Command
- State
- Template Method and Iterator
- Repository
- The shop: which pattern where: The order's states · A discount over €100 · Storage that remembers · A third-party courier
Clean code and refactoring
- Names in code
- Functions: one job, few parameters, no hidden side effects
- Comments that lie and comments that help
- Code smells: long method, large class, duplication, primitives instead of types, long if chains
- Tests as a safety net
- Refactoring in small steps
- SOLID without dogma
- Exercise: a messy class, cleaned up step by step: The receipt in its own class · The plan from text · Night from the hour · The student
Complexity
- Time complexity: counting steps
- Big-O: how the work grows
- Best, average and worst case
- Space complexity
- Amortized complexity
Searching
Sorting
- Insertion sort and selection sort
- Merge sort and "divide and conquer"
- Quick sort and the bad pivot
- Heap and heap sort
- Counting sort and radix sort
- Stable sorting and the built-in sort
Recursion
- The call stack from the inside
- From recursion to a loop
- Fast exponentiation
- Divide and conquer and the recursion tree
Data structures
- The dynamic array from the inside
- Linked list
- Stack and queue
- Hash table
- Binary search tree
- Priority queue
- Trie
- Union-find
Graphs
- Graph: adjacency list and matrix
- BFS: the fewest stops
- DFS: islands and cycles
- Topological sorting
- Dijkstra
- Minimum spanning tree
Dynamic programming
- Overlapping subproblems
- The coin change problem
- The knapsack problem
- The longest common subsequence and diff
- How to recognise a DP task
Greedy algorithms
Problem-solving techniques
Project: city navigation
Concurrency and race conditions
- Why threads
- Race condition
- Locking
- Atomic operations and immutable objects
- Deadlock
- Producer and consumer
- A pool of threads and tasks
- async is not a thread
- Testing concurrent code
Security for developers
- Untrusted input
- Injections: when data becomes a command
- XSS: someone else’s script in your page
- Passwords
- Sessions, cookies and CSRF
- JWT and its traps
- Secrets in code and in git
- Dependencies: other people’s code that yours runs
- Cryptography you don't write yourself
Software architecture
- Layers
- Hexagonal and clean architecture
- Monolith, modular monolith, services
- Events and queues
- Transactional outbox
- API design: contract, versions, retried requests
- Caching
- Scaling
- ADR: architecture decision records
The architect at work
- Non-functional requirements you can measure
- Trade-offs
- When the neighbour is slow: timeout, retry, circuit breaker
- A transaction across services (saga)
- Integrating old and foreign systems
- Changing a live system (strangler fig, expand–contract)
- Architecture review
- The enterprise landscape and capabilities
- Your first architecture task
- Your first architecture task
- Your first architecture task
- Your first architecture task
- Your first architecture task
- Your first architecture task
- Your first architecture task
- Your first architecture task