Interview preparation
One mechanism, one lesson. The Python track starts with the foundation — from classes and collections to tests, threads and environments — and then follows how often a topic is asked: decorators, descriptors, iterators and generators. The Go track also starts with the foundation — from structs and pointers to modules and concurrency patterns. Each lesson explains the mechanism from the documentation and the sources — measured, not remembered.
- Sections
- 3
- Articles
- 71
- SOURCES
- 340
Sections
Articles
Covered by articles
These come up just as often, but a full article covers them — measurements and sources included.
Knowledge graph
NON-LINEAR · PREREQUISITE AWARETopics are connected, and the connections here were not drawn by hand — they were counted: every article states what it builds on and what it sits next to, and the picture is assembled from those statements. A dashed circle is a topic the articles already call related but that has not been written yet.
30 nodes · 30 edges
No connections: maps
Edges as a list · 29
- Channels in Go: a value that bypasses the buffer, a select with no priorities, and a price paid in parking — connects to: Context in Go: cancellation only downwards, a cancel that is not about cancelling, and a Value that grows dearer with depth, Goroutines and the Go scheduler: two thousand bytes, preemption, and a GOMAXPROCS that limits the wrong thing, sync and atomic in Go: two pieces of advice that fall apart under measurement
- Functions and closures in Go: what gets captured and when — connects to: Concurrency patterns in Go: worker pool, pipeline, fan-in, Pointers in Go: everything is passed by value, even a pointer
- Concurrency patterns in Go: worker pool, pipeline, fan-in — connects to: Functions and closures in Go: what gets captured and when
- Context in Go: cancellation only downwards, a cancel that is not about cancelling, and a Value that grows dearer with depth — connects to: Channels in Go: a value that bypasses the buffer, a select with no priorities, and a price paid in parking, Goroutines and the Go scheduler: two thousand bytes, preemption, and a GOMAXPROCS that limits the wrong thing, The HTTP server in Go: what net/http does by itself and what it does not do until asked
- Data races in Go: what breaks, what -race sees and what it does not — connects to: sync and atomic in Go: two pieces of advice that fall apart under measurement, Testing in Go: what t.Run, t.Parallel and a benchmark really do
- defer, panic and recover in Go: three moments instead of one, and a recover that silently does nothing — connects to: Errors in Go: the one letter that breaks the chain, and the type assertion that will stop working
- Struct embedding in Go: composition that gets mistaken for inheritance — connects to: Method receivers in Go: the copy you cannot see, and the "pointer is faster" that is wrong
- Errors in Go: the one letter that breaks the chain, and the type assertion that will stop working — connects to: defer, panic and recover in Go: three moments instead of one, and a recover that silently does nothing, Interfaces in Go: two words, a nil that is not nil, and a call four times dearer
- Stack, heap and escape analysis: why a pointer means nothing yet — connects to: Interfaces in Go: two words, a nil that is not nil, and a call four times dearer, Slices in Go: a window onto somebody else's array, two paths through append, and a growth rule everyone remembers wrong, The garbage collector: why pauses do not grow with the heap, and GOGC speeds up nothing
- The garbage collector: why pauses do not grow with the heap, and GOGC speeds up nothing — connects to: Profiling in Go: what pprof shows and what it does not show by default, Stack, heap and escape analysis: why a pointer means nothing yet
- The HTTP server in Go: what net/http does by itself and what it does not do until asked — connects to: Context in Go: cancellation only downwards, a cancel that is not about cancelling, and a Value that grows dearer with depth, Graceful shutdown: where the errors on every rollout come from, Timeouts and deadlines: the client left, the work carried on
- Interfaces in Go: two words, a nil that is not nil, and a call four times dearer — connects to: Errors in Go: the one letter that breaks the chain, and the type assertion that will stop working, Method receivers in Go: the copy you cannot see, and the "pointer is faster" that is wrong, Stack, heap and escape analysis: why a pointer means nothing yet
- io.Reader and io.Writer: a contract of two methods — connects to: Structs and methods in Go: a value that is copied whole
- JSON in Go: tags, omitempty and what encoding/json does silently — connects to: Reflection in Go: reflect.Type, reflect.Value and the settability rule, Structs and methods in Go: a value that is copied whole
- Method receivers in Go: the copy you cannot see, and the "pointer is faster" that is wrong — connects to: Interfaces in Go: two words, a nil that is not nil, and a call four times dearer, Struct embedding in Go: composition that gets mistaken for inheritance
- Go modules and dependencies: go.mod, go.sum and minimal version selection — connects to: Packages in Go: visibility, init and project layout
- Packages in Go: visibility, init and project layout — connects to: Go modules and dependencies: go.mod, go.sum and minimal version selection, Go tooling: build, vet, fmt and what they check, Structs and methods in Go: a value that is copied whole
- Pointers in Go: everything is passed by value, even a pointer — connects to: Functions and closures in Go: what gets captured and when, Reflection in Go: reflect.Type, reflect.Value and the settability rule, Structs and methods in Go: a value that is copied whole
- Profiling in Go: what pprof shows and what it does not show by default — connects to: The garbage collector: why pauses do not grow with the heap, and GOGC speeds up nothing
- Reflection in Go: reflect.Type, reflect.Value and the settability rule — connects to: JSON in Go: tags, omitempty and what encoding/json does silently, Pointers in Go: everything is passed by value, even a pointer, Structs and methods in Go: a value that is copied whole
- Goroutines and the Go scheduler: two thousand bytes, preemption, and a GOMAXPROCS that limits the wrong thing — connects to: Channels in Go: a value that bypasses the buffer, a select with no priorities, and a price paid in parking, Context in Go: cancellation only downwards, a cancel that is not about cancelling, and a Value that grows dearer with depth, sync and atomic in Go: two pieces of advice that fall apart under measurement
- Slices in Go: a window onto somebody else's array, two paths through append, and a growth rule everyone remembers wrong — connects to: Stack, heap and escape analysis: why a pointer means nothing yet, Strings, runes and bytes: why len does not count characters, and a substring holds megabytes
- Strings, runes and bytes: why len does not count characters, and a substring holds megabytes — connects to: Slices in Go: a window onto somebody else's array, two paths through append, and a growth rule everyone remembers wrong
- Structs and methods in Go: a value that is copied whole — connects to: io.Reader and io.Writer: a contract of two methods, JSON in Go: tags, omitempty and what encoding/json does silently, Packages in Go: visibility, init and project layout, Pointers in Go: everything is passed by value, even a pointer, Reflection in Go: reflect.Type, reflect.Value and the settability rule
- sync and atomic in Go: two pieces of advice that fall apart under measurement — connects to: Channels in Go: a value that bypasses the buffer, a select with no priorities, and a price paid in parking, Data races in Go: what breaks, what -race sees and what it does not, Goroutines and the Go scheduler: two thousand bytes, preemption, and a GOMAXPROCS that limits the wrong thing
- Testing in Go: what t.Run, t.Parallel and a benchmark really do — connects to: Data races in Go: what breaks, what -race sees and what it does not
- Go tooling: build, vet, fmt and what they check — connects to: Packages in Go: visibility, init and project layout
- Graceful shutdown: where the errors on every rollout come from — connects to: The HTTP server in Go: what net/http does by itself and what it does not do until asked
- Timeouts and deadlines: the client left, the work carried on — connects to: The HTTP server in Go: what net/http does by itself and what it does not do until asked
32 nodes · 44 edges
Edges as a list · 32
- *args and **kwargs: two stars with different prices — and one of them makes unknown names acceptable — connects to: Decorators: expressions top-down, application bottom-up
- async/await: the call runs nothing — and three bugs that never crash follow from that — connects to: Context managers: two methods, one returned truth, and one silent data loss, Exceptions and finally: the one word that stops a function from failing, Iterators and generators: one method apart, and one silent bug, Threads and processes: what to choose for computation, and what for waiting
- Built-in collections: list, tuple, dict and set — what to use when — connects to: Classes and OOP: self is an argument, and a class attribute is shared by all, Complexity of operations: O-notation, counted on built-in types, List vs tuple: the 16 bytes you only get from one comparison out of three, and the two operations where there is no difference, Lists from the inside: growth, shrinking, and the price of the front, Modules and imports: a module runs once, and from copies a reference, Python dictionaries from the inside: the CPython hash table
- Classes and OOP: self is an argument, and a class attribute is shared by all — connects to: Built-in collections: list, tuple, dict and set — what to use when, Descriptors: one precedence rule that property, methods and slots all grow out of, MRO and multiple inheritance: C3, the diamond, and where super() really goes, Mutable default arguments: the value lives in a field of the function, and every call shares it, Testing: unittest, pytest and mock — what is really being checked, What happens on o.x: descriptors, the MRO and the type cache
- Closures capture the variable, not the value — and the scope chain walks past the class body — connects to: Comprehensions: the scope boundary runs inside the square brackets, not around them, Decorators: expressions top-down, application bottom-up, lambda: the same thing as def except for two — and the famous loop bug is neither of them, Modules and imports: a module runs once, and from copies a reference, MRO and multiple inheritance: C3, the diamond, and where super() really goes
- Complexity of operations: O-notation, counted on built-in types — connects to: Built-in collections: list, tuple, dict and set — what to use when, Lists from the inside: growth, shrinking, and the price of the front, Strings and formatting: immutability, slices, f-strings and the cost of concatenation
- Comprehensions: the scope boundary runs inside the square brackets, not around them — connects to: Closures capture the variable, not the value — and the scope chain walks past the class body, Iterators and generators: one method apart, and one silent bug
- Context managers: two methods, one returned truth, and one silent data loss — connects to: async/await: the call runs nothing — and three bugs that never crash follow from that, Exceptions and finally: the one word that stops a function from failing
- Decorators: expressions top-down, application bottom-up — connects to: *args and **kwargs: two stars with different prices — and one of them makes unknown names acceptable, Closures capture the variable, not the value — and the scope chain walks past the class body, Descriptors: one precedence rule that property, methods and slots all grow out of, Metaclasses: the six steps of class creation, which show what a metaclass is for and what no longer needs one
- Descriptors: one precedence rule that property, methods and slots all grow out of — connects to: Classes and OOP: self is an argument, and a class attribute is shared by all, Decorators: expressions top-down, application bottom-up, Metaclasses: the six steps of class creation, which show what a metaclass is for and what no longer needs one, MRO and multiple inheritance: C3, the diamond, and where super() really goes
- Exceptions and finally: the one word that stops a function from failing — connects to: async/await: the call runs nothing — and three bugs that never crash follow from that, Context managers: two methods, one returned truth, and one silent data loss, Garbage collection: why an object is alive when nothing refers to it
- Garbage collection: why an object is alive when nothing refers to it — connects to: Exceptions and finally: the one word that stops a function from failing, is versus ==: one asks about identity, the other calls a method — and half the famous surprises are about neither, Memory management in CPython: three numbers everyone repeats wrong
- is versus ==: one asks about identity, the other calls a method — and half the famous surprises are about neither — connects to: Copying: assignment copies nothing, copy copies one level, deepcopy copies the whole graph, Garbage collection: why an object is alive when nothing refers to it, List vs tuple: the 16 bytes you only get from one comparison out of three, and the two operations where there is no difference
- Iterators and generators: one method apart, and one silent bug — connects to: async/await: the call runs nothing — and three bugs that never crash follow from that, Comprehensions: the scope boundary runs inside the square brackets, not around them
- lambda: the same thing as def except for two — and the famous loop bug is neither of them — connects to: Closures capture the variable, not the value — and the scope chain walks past the class body
- List vs tuple: the 16 bytes you only get from one comparison out of three, and the two operations where there is no difference — connects to: Built-in collections: list, tuple, dict and set — what to use when, Copying: assignment copies nothing, copy copies one level, deepcopy copies the whole graph, is versus ==: one asks about identity, the other calls a method — and half the famous surprises are about neither
- Metaclasses: the six steps of class creation, which show what a metaclass is for and what no longer needs one — connects to: Decorators: expressions top-down, application bottom-up, Descriptors: one precedence rule that property, methods and slots all grow out of, MRO and multiple inheritance: C3, the diamond, and where super() really goes
- Modules and imports: a module runs once, and from copies a reference — connects to: Built-in collections: list, tuple, dict and set — what to use when, Closures capture the variable, not the value — and the scope chain walks past the class body, Environments and dependencies: what venv does, and what pip does, Mutable default arguments: the value lives in a field of the function, and every call shares it, Testing: unittest, pytest and mock — what is really being checked, Threads and processes: what to choose for computation, and what for waiting
- MRO and multiple inheritance: C3, the diamond, and where super() really goes — connects to: Classes and OOP: self is an argument, and a class attribute is shared by all, Closures capture the variable, not the value — and the scope chain walks past the class body, Descriptors: one precedence rule that property, methods and slots all grow out of, Metaclasses: the six steps of class creation, which show what a metaclass is for and what no longer needs one, What happens on o.x: descriptors, the MRO and the type cache
- Mutable default arguments: the value lives in a field of the function, and every call shares it — connects to: Classes and OOP: self is an argument, and a class attribute is shared by all, Modules and imports: a module runs once, and from copies a reference
- Copying: assignment copies nothing, copy copies one level, deepcopy copies the whole graph — connects to: is versus ==: one asks about identity, the other calls a method — and half the famous surprises are about neither, List vs tuple: the 16 bytes you only get from one comparison out of three, and the two operations where there is no difference
- Strings and formatting: immutability, slices, f-strings and the cost of concatenation — connects to: Complexity of operations: O-notation, counted on built-in types, Strings from the inside: three widths, four layout cases, interning, and the price of concatenation
- Threads and processes: what to choose for computation, and what for waiting — connects to: async/await: the call runs nothing — and three bugs that never crash follow from that, GIL: not “Python can't do threads,” but “a thread waits exactly as long as you asked”, Modules and imports: a module runs once, and from copies a reference
- Testing: unittest, pytest and mock — what is really being checked — connects to: Classes and OOP: self is an argument, and a class attribute is shared by all, Modules and imports: a module runs once, and from copies a reference, Testing in Go: what t.Run, t.Parallel and a benchmark really do
- Environments and dependencies: what venv does, and what pip does — connects to: Modules and imports: a module runs once, and from copies a reference
- What happens on o.x: descriptors, the MRO and the type cache — connects to: Classes and OOP: self is an argument, and a class attribute is shared by all, MRO and multiple inheritance: C3, the diamond, and where super() really goes
- Python dictionaries from the inside: the CPython hash table — connects to: Built-in collections: list, tuple, dict and set — what to use when
- GIL: not “Python can't do threads,” but “a thread waits exactly as long as you asked” — connects to: Threads and processes: what to choose for computation, and what for waiting
- Testing in Go: what t.Run, t.Parallel and a benchmark really do — connects to: Testing: unittest, pytest and mock — what is really being checked
- Lists from the inside: growth, shrinking, and the price of the front — connects to: Built-in collections: list, tuple, dict and set — what to use when, Complexity of operations: O-notation, counted on built-in types
- Memory management in CPython: three numbers everyone repeats wrong — connects to: Garbage collection: why an object is alive when nothing refers to it
- Strings from the inside: three widths, four layout cases, interning, and the price of concatenation — connects to: Strings and formatting: immutability, slices, f-strings and the cost of concatenation
21 nodes · 36 edges
Edges as a list · 21
- The accept queue: the connection is established and the server knows nothing about it — connects to: Graceful shutdown: where the errors on every rollout come from, Load balancing: who picks the server, and what they know when they pick, Queues and tails: why 19 % more load makes latency four times worse, Timeouts and deadlines: the client left, the work carried on, Too many open files: whose limit it is, why it is not shared, and what counts as a descriptor
- cgroups and the OOM killer: who gets killed, why the log is empty, and what 137 really means — connects to: Container escape: how attackers reach the host, and how to close it, Signals, zombies and PID 1: why a container ignores SIGTERM
- Consistent hashing: how many keys move when the membership changes — connects to: Load balancing: who picks the server, and what they know when they pick, Load balancing: why two random choices beat round-robin
- Too many open files: whose limit it is, why it is not shared, and what counts as a descriptor — connects to: Signals, zombies and PID 1: why a container ignores SIGTERM, The accept queue: the connection is established and the server knows nothing about it
- Graceful shutdown: where the errors on every rollout come from — connects to: Health checks: three different questions called by one name, Load balancing: who picks the server, and what they know when they pick, Rollouts and rollbacks: why a canary does not help without the right detector, Signals, zombies and PID 1: why a container ignores SIGTERM, The accept queue: the connection is established and the server knows nothing about it
- Health checks: three different questions called by one name — connects to: Graceful shutdown: where the errors on every rollout come from, Load balancing: who picks the server, and what they know when they pick, Rollouts and rollbacks: why a canary does not help without the right detector, SLOs and error budgets: why "99.9 %" without a window means nothing
- Idempotency: exactly once is about the effect, not the delivery — connects to: Load balancing: who picks the server, and what they know when they pick, Retries and jitter: why a service falls over a second time at the moment it recovers
- Load balancing: why two random choices beat round-robin — connects to: Consistent hashing: how many keys move when the membership changes, Load balancing: who picks the server, and what they know when they pick, Queues and tails: why 19 % more load makes latency four times worse
- Name resolution: the application calls getaddrinfo, not DNS — connects to: Load balancing: who picks the server, and what they know when they pick, The TLS handshake: what the first connection pays for, Timeouts and deadlines: the client left, the work carried on
- Page cache and fsync: why "written" and "will not be lost" are different claims — connects to: Signals, zombies and PID 1: why a container ignores SIGTERM
- Queues and tails: why 19 % more load makes latency four times worse — connects to: Load balancing: who picks the server, and what they know when they pick, Load balancing: why two random choices beat round-robin, SLOs and error budgets: why "99.9 %" without a window means nothing, The accept queue: the connection is established and the server knows nothing about it
- Retries and jitter: why a service falls over a second time at the moment it recovers — connects to: Idempotency: exactly once is about the effect, not the delivery, Load balancing: who picks the server, and what they know when they pick, The TLS handshake: what the first connection pays for, The transaction outbox: what it guarantees, what it does not, and what it costs, Timeouts and deadlines: the client left, the work carried on
- Rollouts and rollbacks: why a canary does not help without the right detector — connects to: Graceful shutdown: where the errors on every rollout come from, Health checks: three different questions called by one name
- Signals, zombies and PID 1: why a container ignores SIGTERM — connects to: cgroups and the OOM killer: who gets killed, why the log is empty, and what 137 really means, Container escape: how attackers reach the host, and how to close it, Graceful shutdown: where the errors on every rollout come from, Page cache and fsync: why "written" and "will not be lost" are different claims, Too many open files: whose limit it is, why it is not shared, and what counts as a descriptor
- SLOs and error budgets: why "99.9 %" without a window means nothing — connects to: Health checks: three different questions called by one name, Queues and tails: why 19 % more load makes latency four times worse
- TIME_WAIT and ephemeral ports: the client hits the wall first — connects to: Load balancing: who picks the server, and what they know when they pick, The TLS handshake: what the first connection pays for
- Timeouts and deadlines: the client left, the work carried on — connects to: Load balancing: who picks the server, and what they know when they pick, Name resolution: the application calls getaddrinfo, not DNS, Retries and jitter: why a service falls over a second time at the moment it recovers, The accept queue: the connection is established and the server knows nothing about it
- The TLS handshake: what the first connection pays for — connects to: Load balancing: who picks the server, and what they know when they pick, Name resolution: the application calls getaddrinfo, not DNS, Retries and jitter: why a service falls over a second time at the moment it recovers, TIME_WAIT and ephemeral ports: the client hits the wall first
- Load balancing: who picks the server, and what they know when they pick — connects to: Consistent hashing: how many keys move when the membership changes, Graceful shutdown: where the errors on every rollout come from, Health checks: three different questions called by one name, Idempotency: exactly once is about the effect, not the delivery, Load balancing: why two random choices beat round-robin, Name resolution: the application calls getaddrinfo, not DNS, Queues and tails: why 19 % more load makes latency four times worse, Retries and jitter: why a service falls over a second time at the moment it recovers, The accept queue: the connection is established and the server knows nothing about it, The TLS handshake: what the first connection pays for, TIME_WAIT and ephemeral ports: the client hits the wall first, Timeouts and deadlines: the client left, the work carried on
- Container escape: how attackers reach the host, and how to close it — connects to: cgroups and the OOM killer: who gets killed, why the log is empty, and what 137 really means, Signals, zombies and PID 1: why a container ignores SIGTERM
- The transaction outbox: what it guarantees, what it does not, and what it costs — connects to: Retries and jitter: why a service falls over a second time at the moment it recovers