less programmer-competency-matrix
Programmer Competency Matrix
A rough guide to where a programmer stands on 44 skills, from 2ⁿ (level 0) to log(n) (level 3). Knowledge at each level is cumulative: being at level n implies you know everything from the levels below it.
Updated in 2026. The progression held up; the specifics didn't. VSS is gone, git won, and whole areas like security, cloud, observability and AI agents were missing. The 2008 original is still around.
computer science
2ⁿ level 0n² level 1n level 2log(n) level 32ⁿDoesn’t know the difference between an array and a linked listn²Able to explain and use arrays, linked lists, dictionaries etc. in practical programming tasksnKnows space and time tradeoffs of the basic data structures, arrays vs linked lists, able to explain how hash tables can be implemented and can handle collisions, priority queues and ways to implement them etc.log(n)Knowledge of advanced data structures like B-trees, LSM trees, binomial and Fibonacci heaps, AVL/red-black trees, splay trees, skip lists, tries, Bloom filters, HyperLogLog etc.2ⁿUnable to find the average of numbers in an array (it’s hard to believe but I’ve interviewed such candidates)n²Basic sorting, searching and data structure traversal and retrieval algorithmsnTree, graph, simple greedy and divide and conquer algorithms, is able to understand the relevance of the levels of this matrix.log(n)Able to recognize and code dynamic programming solutions, good knowledge of graph algorithms, good knowledge of numerical computation algorithms, able to identify NP-hard problems etc.2ⁿDoesn’t know what a compiler, linker or interpreter isn²Basic understanding of compilers, linkers and interpreters. Understands what assembly code is and how things work at the hardware level. Some knowledge of virtual memory and paging.nUnderstands kernel mode vs. user mode, multi-threading, async I/O and event loops, synchronization primitives and how they’re implemented, able to read assembly code. Understands how networks work, network protocols and socket level programming.log(n)Understands the entire programming stack, hardware (CPU + memory + cache + interrupts + microcode), binary code, assembly, static and dynamic linking, compilation, interpretation, JIT compilation, garbage collection, heap, stack, memory addressing…The fallacies of distributed computing are still the best one-page summary of this row.
2ⁿAssumes the network is reliable and remote calls are instantn²Knows that remote calls fail and time out; adds timeouts and retriesnDesigns idempotent operations, understands at-least-once vs exactly-once delivery, queues, caching and cache invalidation, CAP and eventual consistencylog(n)Understands consistency models, consensus (Raft/Paxos), clocks and ordering, partitioning and replication. Designs for partial failure and can reason about what happens when any one part is slow or gone.software engineering
2ⁿ level 0n² level 1n level 2log(n) level 3E.g. git: bisect, reflog, interactive rebase.
2ⁿFolder backups by daten²Clones, commits, pushes and pulls, mostly on one branchnComfortable with branches, rebasing, resolving merge conflicts and pull requests. Writes small commits with useful messages.log(n)Uses history search, recovery and interactive rewriting without fear, understands how the version control system stores history, and can design the branching, review and release workflow for a team2ⁿOnly knows how to build from the IDEn²Can build the system and run the tests from the command linenHas set up a CI pipeline that builds, lints and tests every pull requestlog(n)Makes builds reproducible and cached; has the pipeline produce versioned artifacts and release notes, and deploy with feature flags, staged rollouts and one-step rollbacks2ⁿThinks that all testing is the job of the testern²Writes unit tests for the code they change and comes up with good test casesnWrites tests first when it helps (TDD), uses fakes and mocks sensibly, writes integration tests against real dependencieslog(n)Uses property-based, contract, snapshot and fuzz testing where they fit; able to set up load/performance and end-to-end tests2ⁿTests whatever is easy to testn²Knows the test pyramid and why most tests should be small and fastnKeeps the suite fast and trustworthy: fixes or quarantines flaky tests, measures coverage without worshipping itlog(n)Decides what not to test, balances pre-merge tests against canaries, monitoring and testing in production, and can explain the cost of each layerprogramming
2ⁿ level 0n² level 1n level 2log(n) level 32ⁿOnly straight line code with copy paste for reusen²Able to break up a problem into multiple functionsnAble to come up with reusable functions/objects that solve the overall problemlog(n)Uses appropriate data structures and algorithms and writes generic, composable code that encapsulates the aspects of the problem that are subject to change.2ⁿNot able to think above the level of a single file/classn²Able to break up the problem space and design a solution as long as it is within the same platform/technologynAble to design systems that span multiple technologies/platforms.log(n)Able to visualize and design complex systems with multiple product lines and integrations with external systems, including where the boundaries between teams should fallThis is an often underrated but very critical criterion for judging a programmer. With teams spread across time zones, more and more of it is written: pull requests, design docs, chat threads, and now prompts to AI agents. I know of several projects that failed because the programmers could not understand what the intent of the communication was.
2ⁿCannot express thoughts/ideas to peers. Poor spelling and grammar.n²Peers can understand what is being said. Good spelling and grammar.nIs able to effectively communicate with peers, in person and in writinglog(n)Able to understand and communicate thoughts/design/ideas/specs in an unambiguous manner and adjusts communication as per the context2ⁿNo evidence of organization within a filen²Methods are grouped logically or by accessibilitynCode is grouped by purpose, formatted by a formatter rather than by hand, and commented where the why isn’t obviouslog(n)The file reads top to bottom: what it’s for, the public surface first, details after. The file should look beautiful.2ⁿNo thought given to organizing code across filesn²Related files are grouped into a foldernEach physical file has a unique purpose, e.g. one class definition, one feature implementation etc.log(n)Code organization at a physical level closely matches design and looking at file names and folder distribution provides insights into designThe difference between this and the previous item is in the scale of organization, source tree organization relates to the entire set of artifacts that define the system.
2ⁿEverything in one foldern²Basic separation of code into logical folders.nNo circular dependencies; source, generated code, docs, build config and third-party code are all organized into appropriate folderslog(n)Physical layout of source tree matches logical hierarchy and organization. The directory names and organization provide insights into the design of the system.2ⁿMono-syllable namesn²Good names for files, variables, classes, methods etc.nNo long functions, comments explaining unusual code, bug fixes, code assumptions. Lint-clean.log(n)Code reads like the problem it solves: names, flow and structure make the intent obvious, so comments are left for the why – no deep nesting of conditionals or methods2ⁿDoesn’t understand the conceptn²Checks all arguments and asserts critical assumptions in codenFails fast at boundaries, validates external input at the edge, and checks every return value and error pathlog(n)Uses the type system to make invalid states unrepresentable, has their own library to help with defensive coding, writes tests that simulate faults2ⁿOnly codes the happy casen²Basic error handling around code that can throw exceptions/generate errorsnEnsures that errors/exceptions leave the program in a good state; resources, connections and memory are all cleaned up properlylog(n)Codes to detect possible exceptions beforehand, maintains a consistent error handling strategy in all layers of code, comes up with guidelines on error handling for the entire system.2ⁿMostly uses the editor for text editingn²Knows their way around the interface, able to use search, the menus and the debuggernKnows keyboard shortcuts for most used operations, uses the language server for navigation and refactoring, debugs with breakpoints rather than print statementslog(n)Has shaped their environment to how they work – config, extensions, dotfiles under version control – and has written plugins or tools for itE.g. the Java standard library, .NET, the browser DOM, a cloud provider’s SDK or the custom API for the application
2ⁿNeeds to look up the documentation frequentlyn²Has the most frequently used APIs in memorynVast and in-depth knowledge of the APIlog(n)Has written libraries that sit on top of the API to simplify frequently used tasks and to fill in gaps in the API2ⁿHas not used any framework outside of the core platformn²Has used one of the popular frameworks for the platformnHas used more than one framework in a professional capacity and is well-versed with the idioms of the frameworks.log(n)Has written a framework that other people useIn 2008 I said this matrix was biased against web developers. This row is a start on fixing that.
2ⁿThinks the front end is just HTML and CSS that someone else doesn²Builds working pages and components with a framework; knows the box model, the DOM and the basics of HTTPnBuilds accessible, responsive UIs, keeps state in one place, handles loading, error and empty states, and measures load and rendering performancelog(n)Understands how the browser parses, lays out, paints and schedules work; designs for accessibility, performance budgets and slow networks from the start, and can debug jank or layout problems from a profile2ⁿTakes the given requirements and codes to specn²Comes up with questions regarding missed cases in the specnUnderstands the complete picture and comes up with entire areas that need to be speccedlog(n)Able to suggest better alternatives and flows to given requirements based on experienceE.g. Python, Ruby, Node, PowerShell.
2ⁿNo knowledge of scripting toolsn²Shell scripts and one-linersnA general-purpose scripting language for automation, glue code and data munginglog(n)Has written and published reusable scripts or CLI tools2ⁿThinks that Excel is a databasen²Knows basic database concepts, normalization, ACID, transactions and can write simple selectsnAble to design good and normalized database schemas keeping in mind the queries that’ll have to be run, proficient in use of views, stored procedures and constraints. Knows difference between clustered and non-clustered indexes. Proficient with ORMs and knows when to drop down to SQL. Writes safe schema migrations.log(n)Can do basic database administration, reads query plans, does performance and index optimization, writes advanced queries, able to replace cursor usage with relational SQL, understands how data and indexes are stored internally, understands replication and sharding and the tradeoffs between relational, document, key-value and columnar stores. Understands how two-phase commit works.security
2ⁿ level 0n² level 1n level 2log(n) level 32ⁿTrusts all input; secrets live in the source coden²Knows the OWASP Top 10 – injection, XSS, CSRF – uses parameterized queries and output encoding, keeps secrets out of the reponDesigns authentication and authorization properly, uses a secrets manager, keeps dependencies patched and watches the supply chain (lockfiles, signing, provenance)log(n)Can find and exploit vulnerabilities in their own and others’ code: fuzzes, reverse engineers binaries, plays CTFs, has reported or fixed real CVEs2ⁿThinks security is someone else’s jobn²Asks “what could go wrong?” about the feature they’re buildingnThreat-models new designs: trust boundaries, attacker goals, least privilege, blast radiuslog(n)Sets security architecture and practice for a system or team, and gets real value out of pen tests and bug bountiesinfrastructure and operations
2ⁿ level 0n² level 1n level 2log(n) level 32ⁿThe app runs on “the server”n²Can deploy to a cloud provider through the console; understands VMs, storage and managed databasesnUses containers and an orchestrator or serverless platform, understands networking, DNS, load balancers and IAM, keeps an eye on costlog(n)Designs multi-region, highly available systems, knows how each part fails, and can explain the billE.g. Terraform, Pulumi, CloudFormation, Dockerfiles.
2ⁿConfigures servers by hand and nobody remembers hown²Uses scripts or container definitions to set up environmentsnKeeps all infrastructure declared in code, reviewed and applied through CIlog(n)Builds reusable modules and platforms that other teams use to provision their own environments safely2ⁿDebugs production with print statements and sshn²Writes structured logs and basic metricsnUses distributed tracing and dashboards, alerts on symptoms rather than causes, defines SLOslog(n)Designs systems to be debuggable in production: can answer a new question about how the system behaves without shipping new code2ⁿHas never been on calln²Has been on call and can follow a runbooknLeads incident response, writes runbooks and blameless postmortemslog(n)Designs for operability – graceful degradation, load shedding, chaos testing – and changes how the team works based on incident trendsdata and ml
2ⁿ level 0n² level 1n level 2log(n) level 32ⁿData lives in spreadsheets emailed aroundn²Can write SQL against a warehouse and build a simple report or notebooknBuilds reliable batch and streaming pipelines; understands schemas, data quality checks and idempotent reprocessinglog(n)Designs the data platform: lineage, governance, privacy, and the tradeoffs between warehouse, lake and streaming architectures2ⁿThinks ML is magicn²Can train and use an off-the-shelf model; understands train/test splits and overfittingnPicks features, models and evaluation metrics to suit the problem, and knows when a heuristic beats a modellog(n)Ships and runs models in production – drift monitoring, retraining, evaluation pipelines – and understands the math well enough to debug themai-assisted development
2ⁿ level 0n² level 1n level 2log(n) level 3The bar for reviewing code didn’t drop because a machine wrote it. If anything it went up.
More in the AI Agent Competency Matrix.
2ⁿPastes generated code without reading it, or refuses to try the toolsn²Uses AI completion and chat for boilerplate and explanations; reviews and tests what comes backnGives agents the context, tests and constraints they need, breaks work into reviewable chunks, knows which tasks they’re good and bad atlog(n)Matches how much they hand an agent to the task and the risk, knows when not to use one, and builds the instructions, evals and guardrails that make more work safe to delegateexperience
2ⁿ level 0n² level 1n level 2log(n) level 32ⁿImperative or object-orientedn²Imperative, object-oriented and declarative (SQL), added bonus if they understand static vs dynamic typing, weak vs strong typing and type inferencenFunctional, added bonus if they understand lazy evaluation, currying, continuations and algebraic data typeslog(n)Concurrent (Erlang/Elixir, Go) and systems languages with manual or ownership-based memory management (C, Rust)2ⁿNo knowledge of the domainn²Has worked on at least one product in the domain.nHas worked on multiple products in the same domain.log(n)Domain expert. Has designed and implemented several products/solutions in the domain. Well versed with standard terms, protocols used in the domain.knowledge
2ⁿ level 0n² level 1n level 2log(n) level 3E.g. grep, jq, curl, perf, strace, Wireshark.
2ⁿLimited to their primary IDEn²Knows about some alternatives to popular and standard tools.nGood knowledge of editors, debuggers, profilers, the command line, containers and open source alternativeslog(n)Picks the right tool for an unfamiliar problem – a profiler, a tracer, a packet capture – and can get useful answers out of it quickly2ⁿOnly the language they work inn²Has read code in a few languages from different familiesnHas written small programs in a functional, a systems and a dynamic language, and can compare their type systems and memory modelslog(n)Has explored the edges – Lisp, Haskell, Prolog, Forth, APL, an assembly language – and brings ideas from them back into everyday code2ⁿHas never looked at the codebasen²Basic knowledge of the code layout and how to build the systemnGood working knowledge of code base, has implemented several bug fixes and maybe some small features.log(n)Has implemented multiple big features in the codebase and can easily visualize the changes required for most features or bug fixes.2ⁿHas not heard of the upcoming technologiesn²Has heard of upcoming technologies in the fieldnHas tried the betas and previews and read the docs and release noteslog(n)Has built something real with them and, as a bonus, shared what they learned2ⁿZero knowledge of platform internalsn²Has basic knowledge of how the platform works internallynDeep knowledge of platform internals and can visualize how the platform takes the program and converts it into executable code.log(n)Has written tools to enhance or provide information on platform internals, e.g. disassemblers, decompilers, debuggers, profilers, tracers etc.2ⁿUnleashed series, 21 days series, 24 hour series, dummies series…n²Code Complete, Don’t Make Me Think, Mastering Regular Expressions, The Pragmatic ProgrammernDesign Patterns, Peopleware, Programming Pearls, The Algorithm Design Manual, The Mythical Man-Month, A Philosophy of Software Design, Acceleratelog(n)Structure and Interpretation of Computer Programs; Concepts, Techniques, and Models of Computer Programming; The Art of Computer Programming; Designing Data-Intensive Applications; An Introduction to Database Systems by C. J. Date; Thinking Forth; The Little Schemer2ⁿHas heard of blogs and podcasts but never got the time.n²Reads tech blogs and newsletters and listens to podcasts or talks regularly.nKeeps and shares a collection of useful articles, notes and toolslog(n)Writes or speaks publicly about their own insights and thoughts on programming