Skip to Content
Navigation:

Comics!

Here are (almost) all of the comics I've published! They're ordered approximately by popularity, most popular first.

bash tricks
/proc
how I got better at debugging
grep
permissions
how to be a wizard programmer
more bash tricks
ssh
what to talk about in 1:1s
bash brackets cheat sheet
the box model
memory allocation
misc commands
SELECT queries start with FROM
the most important HTTP request headers
curl
bash errors
xargs
awk
CORS
CSS variables
containers aren't magic
virtual memory
system calls
content delivery networks
inline vs block
ask for specific feedback
ip
what's HTTP?
how URLs work
namespaces
CSS units
centering in CSS
less
netcat
HAVING
sed
write for one person
ngrep
du & df
floating point
cgroups
shared libraries
take on hard projects
anatomy of a http request
anatomy of a HTTP response
why containers?
dig
ps
my rules for simple JOINs
http status codes
sort & uniq
how indexes make your queries fast
ss
nmap
lsof
man page sections
CSS selectors
cookies
CSS testing checklist
copy on write
the OOM killer
CPU scheduling
HTTP/2
tar
unix domain sockets
iptables
tshark
EXPLAIN
cat
find
debugging is hard. take breaks.
segmentation faults
CSS isn't easy
page faults
network protocols
bash parameter expansion
COALESCE
single quote your strings
mmap
processes
libc
when debugging, your attitude matters
overlay filesystems
what's a shell?
debugging tips: check your assumptions
inodes
pipes
learn one thing at a time
ping
kill
terminals
a branch is a pointer to a commit
file buffering
hash functions
openssl
bash redirects
why updating DNS is slow
shellcheck
if you understand a bug, you can fix it
sockets
file descriptors
HTTP response headers
tcpdump
head & tail
mitmproxy
oh shit! I accidentally committed to the wrong branch!
the same-origin policy
async functions
socat
assembly
top
TLS certificates
capabilities
HTTP security headers
questions to ask about your data
threads
highlight the main ideas
ethtool
container kernel features
what's your manager's job?
debugging tip: code one thing at a time
CSS specificity
tc
containers = processes
writing code with bugs is normal
NULL surprises
on surviving performance reviews
binary search
understand the bug before trying to fix it
CSS grid areas
HTTP caching headers
set clear expectations
position: absolute
seccomp-bpf
shell script arguments
bash if statements
window functions
why the same-origin policy matters
debugging tip: change one thing at a time
NULL: unknown or missing
CSS isn't design
oh shit! I committed something to main that should have been on a brand new branch!
GROUP BY
what's a header?
amazing debugging features
understand your error messages
HTTP request methods 1
signals
PID namespaces
let your bugs teach you
using HTTP APIs
conntrack
SQL: ways to count
bash functions
trap
container networking
figure out what your manager is great at
container registries
the 4 types of DNS servers
subqueries
stacking contexts
padding syntax
WHERE
CNAME records
DNS record types
talk about problems early
how to read an error message
why we need DNS
flexbox basics
debugging tip: you've probably seen this bug before
debug by writing a test
subdomains
top-level domains
how to handle intermittent bugs
picking a domain registrar
authoritative nameservers
make your code easy to debug
work with your manager to get promoted
keep conversations mostly constructive
debugging tip: build your mental model
a SHA always refers to the same code
HTTP request methods 2
build the support system you need
receiving email at your domain
domain privacy
debugging tip: more assumptions to check
debugging tip: get specific about what the bug is
how to give good feedback
directories and symlinks
ipv6
what's a mac address?
inter-process communication
2fa
user space vs kernel space
the senior engineer
ways i want my team to be
tcp
page table
having productive conversations when i disagree
what does an operating system do?
the stack
no feigning surprise
how to talk to your operating system
anatomy of a packet
networking concepts
network address translation
mutexes
man pages are awesome
rr
bpf filters
bash tips
the cap theorem
acid
the filesystem cache
computers are fast
blogging principles
how does dns work
directories and symlinks
linux tracing systems
getting started with ftrace
vim sessions
what's slow on a computer
learning to design software
building confidence in kubernetes
how kubernetes can break - etcd
writing tip: say something surprising
writing tip: ask good questions
why I love bash
ways to build expertise
user namespaces
understand your manager's goals
tips for reading code
the CSS inspector
subshells
share your debugging stories
scenes from kubernetes
scenes from design docs
remember your manager's only human
read the source code
pivot-root
opening a file
on emotional labour
oh shit! I want to undo something from 5 commits ago!
oh shit! I want to split my commit into 2 commits!
oh shit! I tried to run a diff but nothing happened!
oh shit! I tried to commit a file that should be ignored!
oh shit! I started rebasing and now I have 1000000 conflicts to fix!
oh shit! I need to change the message on my last commit!
oh shit! I have a merge conflict!
oh shit! I did something terribly wrong, does git have a magic time machine?
oh shit! I committed but I want to make one small change!
non-POSIX features
network namespaces
miscellaneous networking tools
media queries
love your bugs
let's build expertise!
learning on my own
learning at work
layers
kubernetes components
know your spy tools
it's not too late to start learning
invest in understanding
how to work well with your manager
how to make a namespace
hiding elements with CSS
git mistakes you can't fix
getting started with SELECT
getting a new manager
every commit has a parent
debugging tip: track what you changed
debugging tip: slow down
debugging tip: ask lots of questions
containers: the big idea: include EVERY dependency
container configuration options
command line arguments
clock_gettime
browser default stylesheets
bash variables
bash pipes
bash input
bash globs
bash for loops
bash debugging
asking good questions (part 2)
asking good questions
SQL example: get the time between baby feedings
SQL example: LEFT JOIN + GROUP BY
SELECT
POSIX compatibility
OVER() assigns every row a window
ORDER BY and LIMIT
INNER JOIN and LEFT JOIN
HTTPS
HTTP redirects
HTTP exercises
HEAD is the commit you have checked out
CSS transitions
CSS isn't arbitrary
CSS borders
CSS backwards compatibility
CASE
BPF cheat sheet
8 bytes, many meanings
css specifications
file locking
terminal escape codes
IMSI catchers (fake cellphone towers)
ASCII
environment variables
bash quotes
bash builtins
background processes
list what you've learned
why some bugs feel "impossible"
track your progress
make a minimal reproduction
ask lots of questions
guesses are often wrong
bytes
the gaps between floats
signed vs unsigned integers
science <3 floating point
meet the byte
little vs big endian
integers
integer overflow
how floats are printed
how bitwise operations are used
hexadecimal
floating point: the bits
floating point representation
floating point math
floating point is weird
floating point alternatives
fixed point
bit flags
big integers
bases
NaN and infinity
DNS: cast of characters
life of a DNS query
DNS queries
DNS queries aren't harmless
how to read dig output
everything in a DNS packet
glue records
how airports lie to you with DNS
DNS is distributed
SPF & DKIM records
things that can break your DNS
the root nameservers
DNS cache levels
resolvers vs authoritative nameservers
negative caching
the DNS hierarchy
bitwise operations
32 bits is small
PATH
some people who make programming easier
TCP: how to reliably get a cat
strace command line flags I love
every Linux networking tool I know
a debugging manifesto
preserve the crime scene
read the error message
reread the error message
reproduce the bug
inspect unreproducible bugs
identify one small question
retrace the code's steps
write a failing test
brainstorm some suspects
rule things out
keep a log book
draw a diagram
add lots of print statements
use a debugger
jump into a REPL
find a version that works
look at recent changes
sprinkle assertions everywhere
analyze the logs
read the docs
comment out code
learn one small thing
find the type of bug
tidy up your code
read the library's code
find a new source of info
write a tiny program
take a break
reduce randomness
one thing at a time
delete the buggy code
investigate the bug together
timebox your investigation
write a message asking for help
explain the bug out loud
try out a new tool
make sure your code is running
do the annoying thing
types of debugging tools
shorten your feedback loop
colours, graphs, and sounds
add pretty printing
document your quest
tell a friend what you learned
find related bugs
do a victory lap
add a comment
a tiny DNS resolver
every git jargon
meet the merge
let's explore a commit
git discussion bingo
why DNS updates are slow: caching
getaddrinfo
resolvers can lie
dig command line arguments
NS records
let's meet dig
A & AAAA records
TCP DNS
MX records
TXT records & more
search domains
DNS records
your domain's authoritative nameservers
rules for rebasing
every git command I use
meet the branch
HEAD and heads
branches have no rules
git cheat sheet
combining diverged branches
scenes from distributed systems
remote branch caching
orphan commits
inside .git
combining branches
diverged branches
fixing diverged branches
losing your work
the current branch: HEAD
detached HEAD state
git branches: the rules
git references
knowing where you are in git
merge commits
interactive rebase
submodules
git worktree
git add -p
merge conflict tips
PATH tips
PATH and finding programs
quitting in the terminal
line editing
folder gotchas

Saturday Morning Comics!

Want another comic like this in your email every Saturday? Sign up here!

I'll send you one of my favourite comics from my archives every Saturday.
© Julia Evans 2024 | All rights reserved (see the FAQ for notes about licensing)