Digital Garden
This is my digital garden. It’s a sort of personal knowledgebase – a curated collection of notes and reference materials for all sorts of topics within the field of computer science.
Like a regular garden, a digital garden needs careful planning and regular tending. You need to be selective about what things you add to it and what you omit. You need to think about how everything will be arranged. In time, new living documents may be planted, and older ones weeded out. It is a perpetual work-in-progress. For more background, see Maggie Appleton’s essay.
In my digital garden, my preference is for atomic documents formatted in AsciiDoc. Each .adoc file is focused on a single idea or concept. Topics may cross-reference one another, but otherwise each file is a self-contained document.
Legend
- 🌱 Seedling: Early draft.
- 🌿 Budding: Needs attention.
- 🌳 Evergreen: Mature document.
- 🍂 Rotting: No longer maintained.
Contents
Core topics
The following topics are "tent poles" that link out to most others.
- Architecture and design 🌱
- Artificial intelligence (AI) 🌱
- Computer science 🌱
- Design patterns 🌱
- Hardware 🌱
- Laws and principles 🌱
- Testing 🌱
Hot topics 🔥
I’m actively researching these topics at this time:
- Machine learning 🌱
- Large language model (LLM) 🌳
- Transformer architecture 🌱
- Generative AI 🌱
- AI assistant 🌱
- AI coding assistant 🌱
- Agent 🌱
- Agent harness 🌱
- Agent orchestration 🌱
- Agent loop 🌱
- Agent skills 🌱
- Context engineering 🌱
- Model Context Protocol 🌱
- Agent2Agent (A2A) 🌱
All topics
0-9
A
- A/B testing 🌱
- Abstraction 🌱
- Acceptance criteria 🌱
- Acceptance testing 🌿
- Access patterns 🌱
- Accessibility testing 🌱
- ACID principles 🌱
- Active-active 🌱
- Adapter pattern 🌱
- Adaptive software development 🌳
- Agent2Agent (A2A) 🌱
- Agent harness 🌱
- Agent loop 🌱
- Agile software development 🌱
- Agent 🌱
- Agent orchestration 🌱
- Agent skills 🌱
- AI assistant 🌱
- AI coding assistant 🌱
- Alerting 🌱
- Algorithms 🌱
- Alpha testing 🌱
- Alpha version 🌿
- Analytical databases 🌱
- Anti-pattern 🌿
- API-first design 🌱
- API gateway 🌱
- Application performance management (APM) 🌱
- ArchiMate 🌱
- Architectural pattern 🌱
- Architecture and design 🌱
- Association 🌱
- Artificial intelligence (AI) 🌱
- Asynchronous communication 🌱
- Asynchronous processing 🌱
- Asynchronous programming 🌿
- Atomic operation 🌱
- Authentication 🌱
- Authorization 🌱
- Auto-scaling 🌱
- Automated testing 🌱
- Availability 🌱
- Availability zone 🌱
B
- Backwards compatibility 🌱
- Bash 🌱
- Batch processing 🌱
- Behavior-driven development (BDD) 🌱
- Behavioral testing 🌿
- Beta testing 🌱
- Beta version 🌿
- Big ball of mud 🌱
- Big bang 🌱
- Big data 🌱
- Big design up-front 🌱
- Big O notation 🌿
- Bike shedding 🌱
- Blackboard 🌱
- Black-box testing 🌿
- Block storage 🌱
- Bloom filter 🌱
- Blue-green deployment 🌱
- Booch method 🌱
- Border Gateway Protocol (BGP) 🌱
- Bounded context 🌱
- Bottom-up design 🌱
- Business Process Model and Notation (BPMN) 🌱
- Bulk synchronous parallel 🌱
- Bulkhead 🌱
- Bus factor 🌱
C
- C4 model 🌱
- Caching 🌱
- Canary deployment 🌱
- CAP theorem 🌱
- Capability Maturity Model 🌱
- Capacity 🌱
- Cargo-culting 🌱
- Cell-based architecture 🌱
- Change data capture 🌱
- Chaos engineering 🌱
- Checksum 🌱
- CI/CD 🌱
- CIDR (Classless Inter-Domain Routing) 🌱
- Circuit breaker 🌱
- Clean architecture 🌱
- Clean code 🌱
- Cleanroom 🌱
- Client-server architecture 🌱
- Cloud computing 🌱
- Cloud networking 🌱
- Cloud service providers 🌱
- Clustering 🌱
- Code conventions 🌱
- Code kata 🌿
- Code freeze 🌱
- Code reuse 🌱
- Cohesion 🌱
- Command Query Responsibility Segregation (CQRS) 🌱
- Commit early, commit often 🌱
- Communication patterns 🌱
- Complexity 🌱
- Compliance 🌱
- Compliance testing 🌿
- Composition 🌱
- Computer-Aided Software Engineering (CASE) 🌱
- Change data capture (CDC) 🌱
- Computer science 🌱
- Concatenative language 🌱
- Conceptual integrity 🌱
- Concurrency 🌿
- Configuration management 🌱
- Consensus algorithms 🌱
- Consistency 🌱
- Consistent hashing 🌱
- Container 🌱
- Container orchestration 🌱
- Containerization 🌱
- Content delivery networks 🌱
- Context engineering 🌱
- Continuous delivery 🌱
- Continuous deployment 🌱
- Continuous integration 🌱
- Conway’s law 🌱
- Coupling 🌱
- Crash-only 🌿
- Crash program 🌱
- Class-Responsibility-Collaboration (CRC) card 🌱
- Critical path analysis 🌱
- Cross-cutting concern 🌱
- Cross-functional teams 🌱
- Cross-site scripting 🌱
- Cryptography 🌱
- Crystal Clear 🌿
- Cynefin framework 🌿
D
- DACI framework 🌱
- Data-driven programming 🌱
- Data integrity 🌱
- Data mesh 🌱
- Data modeling 🌱
- Data-oriented architecture 🌱
- Data-oriented design 🌱
- Data retention 🌱
- Data structures 🌱
- Databases 🌱
- Database indexes 🌱
- Database query optimization 🌱
- Dead letter queue 🌱
- Deadlock 🌱
- Debugger 🌱
- Decomposition 🌱
- Decoupling 🌱
- Denormalization 🌱
- Dependency injection 🌱
- Dependency inversion 🌱
- Deployment pipeline 🌱
- Deployment strategies 🌱
- Design patterns 🌱
- Design principles 🌱
- Developer Certificate of Origin (DCO) 🌱
- DevOps 🌱
- DHCP 🌱
- Diagramming 🌱
- Diagrams-as-code 🌱
- Disaster recovery 🌱
- Discovery 🌱
- Distributed caching 🌱
- Distributed databases 🌱
- Distributed file systems 🌱
- Distributed locking 🌱
- Distributed system 🌱
- Distributed transaction 🌱
- DNS 🌱
- Do what I mean (DWIM) 🌱
- Docker 🌱
- Document-oriented databases 🌱
- Document search 🌱
- Domain 🌱
- Domain-driven design 🌱
- Domain experts 🌱
- Domain engineering 🌱
- Domain model 🌱
- Domain-specific language (DSL) 🌱
- Downtime 🌱
- DRY – Don’t Repeat Yourself 🌱
- DSDM 🌱
- Durability 🌱
E
- ECMAScript 🌱
- Edge proxy 🌱
- Efficiency 🌱
- Egoless programming 🌱
- Elastic stack 🌱
- Encapsulation 🌱
- Encryption 🌱
- Enterprise application software (EAS) 🌱
- Enterprise architecture (EA) 🌱
- Enterprise resource planning (ERP) 🌱
- Entity Component System (ECS) 🌱
- Entity-Relationship Diagram (ERD) 🌱
- Envelope encryption 🌱
- ETL – Extract, Transform, Load 🌱
- Event bus 🌱
- Event-based systems 🌱
- Event-driven architecture 🌱
- Event sourcing 🌳
- Event storming 🌱
- Event stream 🌱
- Eventual consistency 🌱
- Evolvability 🌱
- Execution model 🌱
- Execution orchestrator 🌱
- Exploratory testing 🌿
- Extensibility 🌱
- Extreme Programming (XP) 🌱
F
- Factory 🌱
- Fail-fast 🌱
- Failover 🌱
- Fanout 🌱
- Fault tolerance 🌱
- Feature-driven development 🌱
- Feature factory 🌱
- Feature flags 🌱
- File storage 🌱
- Firewalls 🌱
- Fitness function 🌱
- Flaccid agile 🌿
- Forcing function 🌱
- Foreign keys 🌱
- Formal methods 🌱
- FTP 🌱
- Function-as-a-Service (FaaS) 🌱
- Functional requirements 🌱
- Functional testing 🌱
G
- Gail’s law 🌱
- Garage startup 🌿
- Generative AI 🌱
- Geohashing 🌱
- Gherkin 🌳
- Goodhart’s law 🌱
- Google Cloud Platform 🌱
- Gossip Protocol 🌱
- Governance 🌱
- Graceful degradation 🌱
- Graph databases 🌱
- GraphML 🌱
- Graph Modelling Language (GML) 🌱
- GraphQL 🌱
- GRASP 🌱
- gRPC 🌱
H
- Hardware 🌱
- Hashing 🌱
- Heartbeat 🌱
- Hexagonal architecture 🌱
- High integrity 🌿
- High-level design 🌱
- High-performance computing (HPC) 🌱
- Hock principle 🌱
- Horizontal scaling 🌱
- HTTP 🌱
- HTTP API 🌿
- Hypervisor 🌱
I
- ICMP 🌱
- ICONIX 🌱
- Idempotent 🌱
- Inception 🌱
- Inheritance 🌱
- In-memory databases 🌱
- Infrastructure as code 🌱
- Input validation 🌱
- Installation testing 🌿
- Integrated development environments 🌱
- Integration testing 🌱
- Inter-process communication 🌱
- Interface definition language (IDL) 🌱
- Interfaces 🌱
- Internet Protocol (IP) 🌱
- Internet Protocol (IP) address 🌱
- Inversion of control 🌱
- Isolation 🌱
- Iterative and incremental development 🌱
J
- JavaScript 🌱
- JSON 🌱
- JSON-LD 🌱
- JSON Schema 🌱
- JWT 🌱
K
L
- Language Server Protocol 🌱
- Large language model (LLM) 🌳
- Latency 🌱
- Law of Demeter 🌱
- Laws and principles 🌱
- Laws of software evolution 🌱
- Layered architecture 🌱
- Lazy loading 🌱
- Leaky abstractions 🌱
- Lean software development 🌱
- Leetspeak 🌱
- Lightweight text markup languages 🌱
- Linting 🌱
- Linux 🌱
- Literate programming 🌱
- Load 🌱
- Load balancer 🌱
- Load balancing 🌱
- Load testing 🌿
- Local-first software 🌱
- Locking 🌱
- Logging 🌱
- Logic table 🌱
- Long polling 🌱
- Loop engineering 🌱
M
- Machine learning 🌱
- Maker’s schedule 🌱
- Managed hosting 🌱
- Management information systems (MIS) 🌱
- Manual testing 🌱
- MapReduce 🌱
- Mashup 🌿
- Materialized view 🌱
- Memoization 🌱
- Memory allocation 🌱
- Message broker 🌱
- Message-driven architecture 🌱
- Message queues 🌱
- Messaging protocols 🌱
- Metcalfe’s Law 🌱
- Metrics 🌱
- Micro front-end 🌱
- Microservices 🌱
- MIPS (Million Instructions per Second) 🌿
- Mob programming 🌿
- Model access layer 🌱
- Model Context Protocol 🌱
- Model-driven architecture (MDA) 🌱
- Model-driven development 🌱
- Modeling 🌱
- Modular design 🌱
- Modular monolith 🌱
- Monitoring 🌱
- Monolith 🌱
- Multi-tenant 🌱
- Mutation testing 🌿
- The Mythical Man-Month 🌱
N
- Nanoservices 🌱
- Network protocols 🌱
- Ninety-ninety rule 🌱
- Non-functional requirements 🌱
- Nonce 🌱
- Normalization 🌱
- NoSQL databases 🌱
- Not invented here! 🌱
O
- Object-oriented programming (OOP) 🌱
- Object storage 🌱
- On-call 🌱
- Observability 🌱
- Observer pattern 🌱
- Onion architecture 🌱
- Ontology 🌱
- Open-closed principle 🌱
- Open-weight model 🌱
- OSI model 🌱
- OWASP – Open Worldwide Application Security Project 🌱
P
- PACELC theorem 🌱
- Pagination 🌱
- Pair programming 🌱
- Parallelism 🌿
- Pareto principle 🌱
- Parkinson’s law 🌱
- Partition tolerance 🌱
- Peer-to-peer (P2P) architecture 🌱
- Penetration testing 🌱
- Performance 🌱
- Performance testing 🌿
- Persona 🌱
- PERT chart 🌱
- Phased commit (2PC, 3PC) 🌱
- Pipe-and-filter 🌱
- Platform-as-a-service (PaaS) 🌱
- Platform engineering 🌱
- Polymorphism 🌱
- Ports and adapters 🌱
- POSIX 🌱
- Postel’s law (aka. the Robustness Principle) 🌱
- Premature optimization 🌱
- Preprocessing 🌱
- Principle of least astonishment 🌱
- Privacy 🌱
- Problem space 🌿
- Processor architectures 🌱
- Product requirements document (PRD) 🌱
- Profiling 🌱
- Prompt engineering 🌱
- Programming paradigm 🌱
- Project paradox 🌱
- Protocol Buffers 🌱
- Proxy server 🌱
- Publish-subscribe (pubsub) pattern 🌱
- Pull architecture 🌱
- Push architecture 🌱
Q
R
- RAAML - Risk Analysis and Assessment Modeling language
- RabbitMQ 🌱
- RAD 🌱
- Rainbow table 🌱
- Rate limiting 🌱
- Rational Unified Process 🌱
- Reactive programming 🌱
- Reactive systems 🌱
- Recovery testing 🌿
- Redis 🌱
- Redundancy 🌱
- Refactoring 🌱
- Referential integrity 🌱
- Regression testing 🌿
- Relational database management systems (RDBMS) 🌱
- Release early, release often 🌱
- Release model 🌱
- Remote procedure call (RPC) 🌱
- Replay attack 🌱
- Replication 🌱
- Request-response communication 🌱
- Requirements 🌱
- Resilience 🌱
- Resource-oriented architecture 🌱
- REpresentational state transfer (REST) 🌱
- Result cache 🌱
- Retry 🌱
- Reverse engineering 🌱
- Reverse proxy 🌱
- Ring zero escalation 🌱
- Robustness principle
- Role-based access controls 🌱
- Rollback 🌱
- Rolling deployments 🌱
- Rolling release 🌱
- Round-trip time (RTT) 🌱
- Rubber ducking 🌱
- Rule of least power 🌱
- Runbook 🌱
S
- Safety-critical system 🌱
- Saga 🌱
- Salt 🌱
- Scaffolding 🌱
- Scalability 🌱
- Scatter-and-gather 🌱
- Scope creep 🌱
- Scrum 🌱
- Security 🌱
- Security headers 🌱
- Security testing 🌿
- Secure by design 🌱
- Self-contained system 🌱
- Semantic diffusion 🌱
- SEMAT 🌱
- Separation of concerns 🌱
- Serverless architecture 🌳
- Serverless computing 🌳
- Service discovery 🌱
- Service level agreement (SLA) 🌱
- Service mesh 🌱
- Server-Sent Events (SSE) 🌱
- Service-oriented architecture 🌱
- Sharding 🌱
- Shell 🌱
- Shift left 🌱
- Shrinkwrap software 🌱
- Structure and Interpretation of Computer Programs 🌱
- Silver bullet 🌱
- Single point of failure (SPOF) 🌱
- Single source of truth 🌱
- Singleton 🌱
- Site reliability engineering (SRE) 🌱
- Smoke testing 🌿
- SMTP 🌱
- Snapshot tests 🌱
- Software architecture 🌱
- Software-as-a-service (SaaS) 🌱
- Software assurance 🌱
- Software bloat 🌱
- Software craftsmanship 🌿
- Software quality 🌱
- Software rot 🌱
- SOLID 🌱
- Spatial databases 🌱
- Specification by Example 🌱
- Spiral model 🌱
- Spoofing 🌱
- Spring Framework 🌱
- SQL 🌱
- SQL injection 🌱
- SSADM 🌱
- SSRF (Server-Side Request Forgery) 🌱
- Stack language 🌱
- Stamp coupling 🌱
- Stand-in 🌱
- State 🌱
- Stateless 🌱
- Static analysis 🌱
- Stepwise refinement 🌱
- Story-driven modeling 🌱
- Strangler fig pattern 🌱
- Strategy pattern 🌱
- Stream processing systems 🌱
- Stress testing 🌱
- Structured data 🌱
- Structured programming 🌱
- Surgical team 🌱
- SWEBOK 🌱
- Synchronization 🌱
- Synchronous communication 🌱
- Systems Modeling Language (SysML) 🌱
- System design 🌱
- System requirements specification (SRS) 🌱
- System health checks 🌱
- System testing (aka end-to-end or e2e testing) 🌱
T
- Task queue 🌱
- TCP 🌱
- Technical debt 🌱
- Telemetry 🌱
- Tesler’s law 🌱
- Test-driven development 🌱
- Test harness 🌱
- Testing 🌱
- Thread safety 🌱
- Throughput (aka. bandwidth) 🌱
- Time series databases 🌱
- Time-share computing 🌱
- TOGAF – The Open Group Architecture Framework 🌱
- Top-down design 🌱
- Traceability 🌱
- Tracing 🌱
- Transactional databases 🌱
- Transaction 🌱
- Transformer architecture 🌱
- Trivial Graph Format (TGF) 🌱
- TPS report 🌱
- Trunk-based development 🌱
- TypeScript 🌱
U
- Ubiquitous language 🌱
- UDP 🌱
- Unified Modeling Language (UML) 🌱
- Unified Process 🌱
- Uniform access principle 🌱
- Unit testing 🌿
- Unix 🌱
- Unix philosophy 🌱
- Uptime 🌱
- Usability testing 🌿
- Use case 🌱
- User-centered design 🌱
- User story 🌱
V
- Value stream management 🌱
- Vector database 🌱
- Vega 🌱
- Version control 🌱
- Vertical scaling 🌱
- Vertical-slice architecture 🌱
- Vibe coding 🌱
- Virtual machine 🌱
- Virtualization 🌱
- Visibility 🌱
- Voice-to-text 🌱
- Vulnerability databases 🌱
W
- Walking skeleton 🌱
- Waterfall (aka. stepwise) model 🌱
- Ways of working 🌱
- Web-oriented architecture 🌱
- Webhook 🌱
- WebSockets 🌱
- WebRTC (Web Real-Time Communication) 🌱
- White-box testing 🌿
- Wicked problem 🌱
- Wide-column stores 🌱
- Wirth’s law 🌿
- Worse is better 🌱
Y
- YAGNI 🌱
- Yak shaving 🌳