Blog
Programming, software engineering and computer science, explained from the ground up. Each article starts free to read; the rest needs a free account.
- Java and Spring5 min read
Spring Boot for beginners
Build your first Spring Boot application: what Spring and Spring Boot add, creating a project with Spring Initializr, a REST controller, dependency injection with services, configuration in application.yml, saving data with Spring Data JPA, testing and packaging.
- Java and Spring5 min read
Spring Security explained
How Spring Security works and how to configure it: the filter chain, authentication versus authorisation, a SecurityFilterChain for a REST API, users and password encoding, method security, JWT resource servers, CSRF and CORS, and testing secured endpoints.
- Security5 min read
SQL injection explained
How SQL injection works and how to prevent it for good: a vulnerable login and search with real payloads, what attackers can do, parameterised queries in Java, Python and Node.js, ORMs and their raw-query traps, dynamic identifiers, least privilege, and testing.
- Databases6 min read
SQL joins
SQL joins explained with two small tables and their exact results: inner, left, right and full outer joins, cross joins, self joins, joining on several conditions, the ON versus WHERE trap, anti-joins for finding missing rows, duplicate rows from one-to-many joins, and performance.
- Databases4 min read
SQL vs NoSQL
What separates relational databases from document, key-value, wide-column and graph stores: schemas, joins, transactions, scaling and consistency, with a practical guide to choosing, and why "both" is often the honest answer.
- Security6 min read
SSH keys explained
How SSH key authentication works and how to use it safely: public and private keys, generating Ed25519 keys, authorized_keys on servers, passphrases and ssh-agent, the ~/.ssh/config file, host key verification and known_hosts, hardening the SSH server, agent forwarding risks, and hardware-backed keys.
- Programming6 min read
Stack vs heap memory
Where a program's data lives: the call stack with its frames for local variables, the heap for objects that outlive a function call, how C, C++, Java and Python use each, stack overflow and recursion, heap allocation costs and fragmentation, and common bugs such as dangling pointers and leaks.
- Careers6 min read
Starting competitive programming
How to begin competitive programming: what contests are like, choosing a language and setting up, the major platforms, reading problems and constraints, a first-month plan, practising by rating, learning from editorials, contest strategy, common mistakes, and how CP helps with interviews and careers.
- Security5 min read
Storing passwords: bcrypt, scrypt and Argon2
How to store passwords safely: why plain text, encryption and fast hashes like SHA-256 all fail, what salts and slow hashing do, how bcrypt, scrypt and Argon2 compare, working code in Python and Java, choosing parameters, and upgrading old hashes.
- DevOps5 min read
systemd services
Run your application as a proper Linux service with systemd: what systemd does, writing a unit file for a Java, Node.js or Python app, environment files for secrets, restart policies, users and security hardening, logs with journalctl, timers instead of cron, and troubleshooting a service that will not start.
- Security4 min read
TACACS+ vs RADIUS
The two AAA protocols network teams use, side by side: what TACACS+ is for, how it separates authentication, authorisation and accounting, per-command authorisation for routers and switches, encryption and transport differences, and when to use each.
- Careers6 min read
Take-home assignments
How to approach take-home coding assignments in software hiring: what reviewers actually evaluate, clarifying scope, planning your time, structure, tests and error handling, a README that does half the work, using AI tools honestly, submitting, and the follow-up discussion.
- Networking5 min read
TCP vs UDP
TCP and UDP compared: connections and the three-way handshake, reliable ordered delivery, flow and congestion control, UDP's minimal datagrams, which applications use which and why, QUIC and HTTP/3 built on UDP, and a working socket example of each in Python.
- DevOps6 min read
Terraform for beginners
Learn infrastructure as code with Terraform: providers, resources and the HCL language, the init, plan and apply workflow, state and remote backends with locking, variables and outputs, data sources, modules, managing environments, and the habits that keep infrastructure changes safe.
- Programming6 min read
Test-driven development
Test-driven development explained with a worked example: the red, green, refactor cycle, writing the smallest failing test, triangulation, how TDD shapes design, a complete kata in Python, TDD with mocks and outside-in, when TDD helps and when it does not, and common misconceptions.
- Java and Spring5 min read
Testing with JUnit
Write good tests in Java with JUnit 5: setting up with Maven or Gradle, test structure and assertions, AssertJ, lifecycle methods, parameterised tests, testing exceptions, nested and display names, mocking with Mockito, Spring Boot test slices, Testcontainers for real databases, and habits that keep tests valuable.
- Programming4 min read
The builder pattern
The builder pattern for objects with many optional parameters: the telescoping-constructor problem it solves, a complete Java builder with validation, immutability, Lombok and records, the Python equivalent, and when a builder is overkill.
- Databases5 min read
The CAP theorem
The CAP theorem explained without the myths: consistency, availability and partition tolerance defined precisely, why partitions force a choice, CP and AP systems with real database examples, PACELC and the latency trade-off, tunable consistency, and how to use CAP in design discussions.
- Programming5 min read
The four pillars of OOP
Encapsulation, abstraction, inheritance and polymorphism, explained with one running example in Java and Python, why each matters in real code, and the mistakes interviewers listen for.
- Java and Spring6 min read
The Java memory model
What the Java memory model guarantees when threads share data: why reordering and CPU caches break naive code, the happens-before relationship, volatile, synchronized, final fields and safe publication, atomic classes, the double-checked locking trap, and practical rules for correct concurrent code.