05. Taxonomy
This document defines the two trees that hold the nodes, the language template, the levels, the core list, the crosswalks to outside classifications, and the border with algorithm and math2.
5.1 Two trees and one rule
Programming knowledge has two axes. One is the idea (closures, error handling, dependency injection, data races). The other is the language (how Python does it, how Rust does it). A single tree cannot hold both without duplicating one of them.
So there are two trees:
| Tree | Root | Holds | Example path |
|---|---|---|---|
| Topic tree | nodes/<top>/ |
concepts, definitions, tasks, patterns, techniques, practices, tools, libraries, formats, standards, weaknesses, works, people, organizations | nodes/functions/closures-and-scope/closures/ |
| Language trees | nodes/languages/<lang>/ |
the language node and its features, one tree per language of tiers 1 to 3 | nodes/languages/python/control-flow/match-statement/ |
The rule that connects them: a fact about one language goes in that language's tree, and the topic page shows it through realizes edges. A concept page never holds a long section about one language that a feature page should hold. The concept page's language section is short (the example, the one-line verdict, the differences), and it links the feature page for the rules.
Releases, diagnostics, api cards and proposals have owners (04.3), so they hang under their owner's language, tool or library, but they are cards and do not need a directory.
5.2 The topic tree
topics/areas.yaml holds the tree, with the same fields as algorithm (id, name, summary, children) and two new fields: kinds (the kinds this area holds most) and crosswalk (the CS2023, SWEBOK v4 and ACM CCS ids it maps, 5.7).
The top level has 36 areas, in 6 groups. The group is for the home page and the book; it is not part of the URL.
A. Foundations of programs
| id | Name | Holds (examples of sub-areas) |
|---|---|---|
foundations |
Foundations | what a program is, computation models in practice, bits and representation, numbers in machines (integers, overflow, floating point, decimal), characters and text, the machine model (CPU, memory hierarchy, instructions), the stack and the heap, compilation and interpretation at an overview, hello world in every language |
paradigms |
Paradigms | imperative, procedural, structured, object-oriented, functional, logic, declarative, dataflow, reactive, array, concatenative, event-driven, aspect-oriented, actor, multi-paradigm design |
syntax-and-semantics |
Syntax and semantics | lexical structure, grammars and notation (BNF, EBNF, PEG), expressions and statements, evaluation order, scope and binding, operational/denotational/axiomatic semantics at the practitioner level, undefined and implementation-defined behaviour |
types |
Types | type systems, static and dynamic checking, inference, generics and parametric polymorphism, subtyping and variance, algebraic data types, gradual typing, dependent and refinement types in practice, nullability, type classes and traits, type erasure and reification, units of measure |
data-and-values |
Data and values | primitive types, strings and string handling, collections in languages (arrays, lists, maps, sets, tuples, records), value and reference semantics, mutability and immutability, equality and identity, hashing in practice, serialization, copying (shallow and deep), dates and times, money and decimals |
functions-and-abstraction |
Functions and abstraction | functions and procedures, parameters and arguments (by value, by reference, by name, defaults, keyword, variadic), recursion and tail calls, first-class and higher-order functions, closures and scope, currying and partial application, lazy evaluation, continuations, generators and coroutines, modules and namespaces, information hiding |
objects-and-classes |
Objects and classes | objects, classes, prototypes, encapsulation, inheritance (single, multiple, mixins), interfaces and protocols, polymorphism and dispatch (single, double, multiple), composition over inheritance, constructors and initialization, object lifecycle, the expression problem |
memory-and-resources |
Memory and resources | allocation, manual memory management, garbage collection (tracing, reference counting, generational, concurrent), ownership and borrowing, RAII and deterministic destruction, smart pointers, memory safety, leaks, arenas and pools, resource handles (files, sockets, locks) |
errors-and-control |
Errors and control flow | control structures, exceptions, error values and result types, panics and aborts, assertions and contracts, non-local exits, cleanup (finally, defer, using, with), retries and timeouts |
concurrency-and-parallelism |
Concurrency and parallelism | processes and threads, shared memory and locks, atomics and memory models, message passing, async/await and event loops, futures and promises, actors, CSP and channels, structured concurrency, data parallelism, GPU programming in languages, races and deadlocks |
metaprogramming |
Metaprogramming | reflection and introspection, macros (textual, hygienic, procedural), templates and compile-time evaluation, code generation, annotations and attributes, decorators, eval, homoiconicity, DSLs embedded in a host language |
B. Making languages
| id | Name | Holds |
|---|---|---|
language-implementation |
Language implementation | lexing and parsing in practice, ASTs and IRs, interpreters (tree-walking, bytecode), compilers (front, middle, back end), JIT compilation, virtual machines, runtime systems, linking and loading, ABIs and calling conventions, garbage collector implementation, WebAssembly as a target, language servers |
languages |
Languages | the catalogue of all languages by family and lineage (the Algol family, the C family, Lisps, MLs, Smalltalk, the shell family, query languages, array languages, esoteric languages, ...), the genealogy, language design principles, the history of languages; the language trees hang here (5.3) |
C. Building software
| id | Name | Holds |
|---|---|---|
software-design |
Software design | design principles (SOLID, DRY, KISS, YAGNI, cohesion and coupling, separation of concerns), design patterns (creational, structural, behavioral), architecture styles and patterns, domain-driven design, API design, modularity, interfaces and contracts, design for change |
construction-practice |
Construction practice | naming, readable code, comments and documentation in code, code style and formatting, code smells, refactoring (the catalogue of refactorings), code review, technical debt, defensive programming, working with legacy code, pair and mob programming |
testing |
Testing | unit, integration, system and end-to-end testing, test doubles, test design techniques, property-based testing, fuzzing, mutation testing, snapshot and golden testing, coverage, TDD and BDD, test frameworks per language, flaky tests, testing concurrency |
debugging-and-observability |
Debugging and observability | debugging methods, debuggers, breakpoints and watchpoints, core dumps, logging, tracing, metrics, profiling as diagnosis, sanitizers, reproducible bug reports, post-mortems |
tools-and-workflow |
Tools and workflow | the shell and the command line, editors and IDEs, version control (Git in depth), build systems, package managers and dependency management, continuous integration and delivery, containers for developers, documentation tools, code search, dotfiles and environment management |
program-analysis-and-verification |
Program analysis and verification | static analysis, linters and type checkers as analyzers, abstract interpretation in practice, symbolic execution, model checking, deductive verification (Dafny, Why3, Frama-C, SPARK, Verus), proof assistants for programs, design by contract, runtime verification |
performance |
Performance | measuring (benchmarks, profilers), complexity in practice (linked to algorithm), caches and memory layout, allocation cost, vectorization, compiler optimizations, concurrency for speed, I/O performance, latency and throughput, performance of each runtime |
security |
Secure programming | the weakness catalogue (CWE), injection, memory-safety weaknesses, authentication and session handling in code, cryptography use (not the mathematics), secrets handling, input validation and output encoding, supply-chain security, secure defaults per language, sandboxing, threat modelling for programmers |
software-engineering-process |
Software engineering process | requirements in practice, estimation, methodologies (agile, Scrum, Kanban, XP, waterfall), releases and versioning, maintenance, metrics, documentation, team practice, laws of software (Brooks, Conway, Hyrum, ...), ethics and professional practice |
open-source-and-licensing |
Open source and licensing | free and open-source software, licences (every SPDX licence as a card), contribution practice, governance, foundations, copyright and patents for programmers, export rules at an overview |
D. Data, systems and the network
| id | Name | Holds |
|---|---|---|
data-and-persistence |
Data and persistence | SQL in depth, relational modelling, transactions and isolation, ORMs, NoSQL models, data formats (JSON, YAML, TOML, XML, CSV, Protocol Buffers, ...), regular expressions, text encodings and Unicode, files and file systems from a program, caching |
systems-programming |
Systems programming | the OS interface (system calls, POSIX, Win32), processes and signals, file descriptors and I/O models, memory mapping, IPC, networking sockets, low-level C and Rust, assembly language, linkers and object files, the kernel from a programmer's view |
web-development |
Web development | HTTP for programmers, HTML, CSS, the DOM and Web APIs, front-end frameworks, back-end frameworks, REST, GraphQL and RPC, authentication flows, web performance, accessibility in code, browsers as runtimes, WebAssembly on the web |
mobile-and-desktop |
Mobile and desktop | Android, iOS, cross-platform frameworks, desktop GUI toolkits, UI programming models (immediate, retained, declarative), app packaging and distribution |
distributed-and-cloud |
Distributed and cloud programming | distributed systems for programmers (RPC, consensus as used, idempotency, retries), microservices, message queues and streams, cloud platforms and services as programming targets, infrastructure as code, serverless, Kubernetes for developers, site reliability engineering practice |
E. Domains
| id | Name | Holds |
|---|---|---|
data-science-and-ml-programming |
Data science and ML programming | notebooks, dataframes, array programming (NumPy and its kin), plotting libraries, ML frameworks as programming tools (PyTorch, JAX, TensorFlow), data pipelines, reproducibility; the learning theory itself links out |
ai-assisted-programming |
AI-assisted programming | code completion, coding agents, prompting for code, tool use and MCP, evaluation of generated code, code LLM benchmarks, review of AI-written code, licensing and provenance of generated code, agent workflows (this project is one) |
graphics-and-games-programming |
Graphics and games programming | graphics APIs (OpenGL, Vulkan, Metal, Direct3D, WebGPU), shaders and shading languages, game loops, game engines as programming environments, audio programming |
scientific-and-hpc |
Scientific and high-performance computing | Fortran, Julia and numerical languages, MPI, OpenMP, CUDA and other accelerators, numerical pitfalls, reproducible scientific software |
embedded-and-hardware |
Embedded and hardware | microcontrollers, real-time programming, interrupts, bare-metal C and Rust, HDLs (Verilog, VHDL, Chisel), FPGA programming, PLC languages (IEC 61131-3), safety-critical coding standards (MISRA C, AUTOSAR C++14, JSF) |
domain-programming |
Domain programming | spreadsheets and formula languages, financial programming, bioinformatics programming, smart contracts, robotics (ROS), automation and scripting, education languages (Scratch, Logo), creative coding |
F. People and history
| id | Name | Holds |
|---|---|---|
history-and-culture |
History and culture | the history of programming by period, landmark works (the canon), people, organizations, events, folklore and jargon, programming culture and communities |
learning-programming |
Learning programming | how people learn to program, curricula (CS2023, the K-12 frameworks), common misconceptions (each as a node linked to the concept it is about), exercises and practice sites, notional machines |
Notes:
- The topic tree is a Draft. 21 (milestones) M1 fixes it. Each top area gets a
READMEpage and a sub-area list intopics/areas.yamlat M1, made by the catalog step (14.4). - The sub-areas are 4 to 25 per top area. Estimate: 600 sub-areas over the tree.
- An item has one primary area and may have secondary areas (04.5). The rule for the primary area: the area whose sub-area name a reader would look under first. When two areas tie, the more specific wins (
sql-injectiongoes undersecurity/injection, notdata-and-persistence/sql).
5.3 The language trees and the language template
Every language of tiers 1 to 3 (08.2) has a tree under nodes/languages/<lang>/. The sub-areas of a language tree are fixed by the language template, so that every language guide has the same shape, readers can move from one language to another at the same place, and the coverage report can show gaps per sub-area.
| # | Sub-area id | Name | Holds (features, api groups) | Tier 1 | Tier 2 | Tier 3 |
|---|---|---|---|---|---|---|
| 1 | overview |
Overview and history | the language node, its design goals, history, editions and releases, implementations | ✓ | ✓ | ✓ |
| 2 | getting-started |
Getting started | install, toolchain, hello world, the REPL, running a program, project layout | ✓ | ✓ | ✓ |
| 3 | syntax |
Lexical structure and syntax | tokens, comments, identifiers, literals, operators and precedence, statements and expressions, the grammar | ✓ | ✓ | ✓ |
| 4 | values-and-types |
Values and types | the built-in types, numbers, text, booleans, null and its friends, type conversions, the type system of the language | ✓ | ✓ | ✓ |
| 5 | variables-and-scope |
Variables, binding and scope | declarations, constants, scope rules, shadowing, lifetime | ✓ | ✓ | ✓ |
| 6 | control-flow |
Control flow | conditionals, loops, pattern matching, jumps, labelled blocks | ✓ | ✓ | ✓ |
| 7 | functions |
Functions | definitions, parameters, returns, closures, recursion, lambdas, overloading | ✓ | ✓ | ✓ |
| 8 | collections |
Built-in collections | arrays, lists, maps, sets, tuples, slices, ranges, iteration protocols, comprehensions | ✓ | ✓ | ✓ |
| 9 | strings-and-text |
Strings and text | string types, encodings, formatting and interpolation, regex support, Unicode handling | ✓ | ✓ | |
| 10 | user-types |
User-defined types | structs, records, classes, enums, unions, interfaces, traits, protocols, generics | ✓ | ✓ | ✓ |
| 11 | errors |
Errors and exceptions | the error model, the exception hierarchy, error values, panics, cleanup | ✓ | ✓ | ✓ |
| 12 | memory |
Memory and resources | allocation, the GC or ownership model, destructors, resource handling, unsafe code | ✓ | ✓ | |
| 13 | modules-and-packages |
Modules, packages and builds | the module system, imports, visibility, packages, the package manager, the build tool, publishing | ✓ | ✓ | ✓ |
| 14 | concurrency |
Concurrency and parallelism | threads, async, channels, the memory model of the language, synchronization in its stdlib | ✓ | ✓ | |
| 15 | metaprogramming |
Metaprogramming | macros, reflection, annotations, decorators, code generation, compile-time evaluation | ✓ | ✓ | |
| 16 | stdlib |
The standard library | a map of the standard library; the api cards hang here (one api group per module or package) | ✓ | ✓ | ✓ |
| 17 | io-and-os |
I/O, files and the OS | files, paths, processes, environment, time, networking from the stdlib | ✓ | ✓ | |
| 18 | testing |
Testing | the test frameworks, assertions, mocking, test runners and conventions | ✓ | ✓ | |
| 19 | tooling |
Tooling | compilers and interpreters, debuggers, profilers, linters, formatters, LSP, notebooks | ✓ | ✓ | |
| 20 | ecosystem |
Ecosystem | the main libraries and frameworks by need, the community, the governance and proposal process | ✓ | ✓ | |
| 21 | performance |
Performance | the cost model, optimization guidance, the profiling workflow, the compilation and runtime knobs | ✓ | ||
| 22 | interop |
Interoperability | FFI, calling C, embedding, the ABI, interop with the platform languages | ✓ | ✓ | |
| 23 | idioms-and-style |
Idioms and style | the style guide, the idioms, what code in this language "should" look like, naming conventions | ✓ | ✓ | ✓ |
| 24 | pitfalls |
Pitfalls | the known traps, each as a feature or a short node, linked to diagnostics and weaknesses | ✓ | ✓ | |
| 25 | versions |
Versions and migration | the release nodes, the migration guides between major versions, deprecations and removals | ✓ | ✓ | ✓ |
Rules:
- A ✓ means the sub-area must exist for the language at its tier, with at least its README and the features that the catalog step finds (14.4). A missing ✓ sub-area fails rule E12 at C3 for the language.
- A language may add sub-areas after the 25 (for example
ownership-and-borrowingfor Rust,templatesfor C++,pointersfor C and Go,the-borrow-checkerstays a feature,jvmfor Java and Kotlin,ffi-and-unsafefor Rust). An added sub-area is inlanguages/<lang>/areas.yaml, with a reason. - A sub-area that does not apply to a language (for example
memoryfor SQL) says so in its README, with one line of reason, and has no features. It counts as done. - Domain languages of tier 1 (SQL, shell, regex, HTML and CSS, PowerShell, 08.2) use a domain template that replaces some rows. SQL:
queries,joins,aggregation,window-functions,ddl,transactions,indexes,procedural-extensions,dialects. Regex:syntax,character-classes,quantifiers,groups-and-backreferences,lookaround,flags,flavours,performance-and-redos. Shell:commands-and-pipelines,quoting-and-expansion,variables,control-flow,functions,redirection,job-control,portability,the-core-utilities. 08.5 lists all of them.
5.4 The core list
The core is the set of items that must be complete before the site is called "complete for the core". It answers "what does every programmer need?" It is the measure for M2 and M3 (21).
| Core part | What | Size (Estimate) | Source of the list |
|---|---|---|---|
| Core concepts | concepts and definitions that appear in at least 2 of: the CS2023 Software Development Fundamentals and Foundations of Programming Languages knowledge units, SWEBOK v4 Software Construction, the index of 3 of the canon textbooks (13.3), the concept lists of 3 tier-1 language references | 400 | the canon match step (14.5), as in algorithm |
| Core features | for each tier-1 language, the features that its own tutorial or "tour" covers | 120 per language, 1,800 for 15 languages | the official tutorials (Python tutorial, The Rust Book, A Tour of Go, Java tutorial, ...) |
| Core tasks | the tasks of the core task list: the intersection of Programming-Idioms, Rosetta task names, Go by Example and Rust by Example titles, plus the "how do I" queries of 17.9 with high volume | 300 | 10.1 |
| Core patterns | the GoF 23, the POSA and PoEAA core, the main concurrency and resilience patterns, the main smells and anti-patterns | 150 | the canon (13.3) |
| Core refactorings and smells | the refactoring catalogue and the code smells | 66 refactorings and 24 smells | Fowler's catalogue (refactoring.com) and the smells of Refactoring 2nd ed., names only |
| Core weaknesses | CWE Top 25 (2025) and the OWASP Top 10 (2025) | 35 | CWE and OWASP |
| Core tools | the tools in every tier-1 language's toolchain row, Git, the main editors, the main CI services, the main debuggers and profilers | 120 | registers/languages.yaml and the developer surveys |
| Core formats and standards | JSON, YAML, TOML, XML, CSV, Protocol Buffers, UTF-8 and Unicode, HTTP, URI, semver, the main language standards | 40 | by hand, with reasons |
| Core practices | principles, laws and methods that the canon names | 80 | the canon |
Total core: about 3,000 items (Estimate). The core is computed and stored in registers/core.yaml with the reason for each item, as in algorithm 05.5. A person approves it at the end of M1.
5.5 Order of sub-areas and items
As in algorithm 05.4: the sub-areas of an area and the items of a sub-area are listed in a reading order, not alphabetically. The order is from the prereqs DAG first, then by level, then by a hand-set order field. Language trees follow the template order (5.3).
5.6 Levels
| Level | Who it is for | Example |
|---|---|---|
intro |
a person in the first year of programming | variables, loops, functions, strings, hello world |
core |
a working programmer | closures, exceptions, generics, Git branching, unit tests, SQL joins |
advanced |
a senior or specialist programmer | memory models, variance, macros, lock-free code, JIT tiers |
research |
a PL or SE researcher, or the edge of practice | effect handlers, session types, gradual typing soundness |
The level is a field of the front matter (04.5), set by the curator and checked by the critic. It controls the reading order and the default view of search (17.4).
5.7 Crosswalks
The build keeps crosswalks to the classifications that readers and other sites use. Each crosswalk is a register; each row maps one outside id to one or more item tags, with the kind of match (exact, broader, narrower, related).
| Crosswalk | Outside system | Licence of the outside ids | Used for |
|---|---|---|---|
crosswalk/cs2023.yaml |
ACM/IEEE/AAAI CS2023 knowledge areas and units (SDF, FPL, SE, SEP, PDC, SEC, SF, ...) | names of a public curriculum, cited | the coverage report and the learning paths (16.12) |
crosswalk/swebok-v4.yaml |
SWEBOK v4 knowledge areas and topics (18 areas) | names cited | the coverage of the software-engineering areas |
crosswalk/acm-ccs-2012.yaml |
ACM CCS 2012, "Software and its engineering" and "Theory of computation › Semantics" subtrees | free to use with credit | the link from papers to items |
crosswalk/cwe.yaml |
CWE ids, all versions since 4.0 | CWE terms of use (free with credit) | the weakness kind |
crosswalk/wikidata.yaml |
Wikidata QIDs for each item that has one | CC0 | same_as, people and languages |
crosswalk/pldb.yaml |
PLDB ids | public domain | language cards (08.3) |
crosswalk/linguist.yaml |
GitHub Linguist language names | MIT | file extensions and syntax colour |
crosswalk/so-tags.yaml |
Stack Overflow tags with counts | CC BY-SA (counts are facts) | search terms and the "missing" signal (18.6) |
crosswalk/rosetta.yaml |
Rosetta Code task names | names only (13.5) | the task universe (10.1) |
crosswalk/spdx.yaml |
SPDX licence and exception ids | CC0 | the licence cards |
crosswalk/algorithm.yaml |
algorithm.tamnd.com tags | CC0 (our own) | the border (5.8) |
Rules:
- The crosswalks drive the "no missing" checks of 18.4. A row of an outside list that maps to no item is a gap. The universe register (18.3) takes it in with an outcome.
- An outside system's text is never copied into a node. Only ids and names are kept, with the source.
5.8 The border with algorithm and math2
The three sites are one library with three wings. The border rules:
| Question | Goes to | Example |
|---|---|---|
| Is it a procedure that solves a problem, with correctness and cost as the subject? | algorithm | merge sort, Dijkstra, a hash table as a data structure, consistent hashing |
| Is it how a language, a library or a tool does something, or how programmers work? | programming | Python's sorted and key=, java.util.HashMap's API and its resize behaviour, Go maps and iteration order |
| Is it a mathematical object or theorem? | math2 | lambda calculus as mathematics, the Curry-Howard correspondence as a theorem, Hoare logic soundness |
| Is it the programmer's use of a mathematical idea? | programming, with a link | type inference in practice, Hoare triples in a code review, floating point rounding in code |
- Items that sit on both sides get a node on each site, each about its own side, and the two link each other with
same_as.algorithmorsame_as.math2. Example: "hash table" on algorithm (the data structure, its analysis) and "maps and dictionaries" on programming (the language facilities, iteration order, hashing of keys, the pitfalls). - The universe register (18.3) records the outcome
elsewhere:algorithmorelsewhere:math2for an item that belongs only to the other site, with the target tag. Such items are linked from search and from the area pages, so a reader of programming who looks for "quicksort" finds the way to it. - The
algorithmregister of languages (registers/languages.yaml) and the programming language nodes stay in sync: the programming language node is the source of truth for toolchain versions, and the algorithm register copies from it at each release of programming (20.6).