# Software Engineering
Design patterns, principles, data structures, and concepts.[^1]
## Principles and Patterns
<!-- keep-sorted start case=no -->
- [[Composition vs Inheritance]] — is-a vs has-a, when to use each
- [[Complex Systems]] — Gall's Law on evolving from simple systems
- [[Design Patterns]] — Gang of Four: creational, structural, behavioral
- [[GNU Conventions]] — GNU standards for CLI argument syntax
- [[OOP]] — four pillars of object-oriented programming
- [[Rubber Duck Debugging]] — debug by explaining code out loud
- [[SOLID]] — five OOP design principles
- [[The Elements of Programming Style]] — 56 Kernighan/Plauger maxims
- [[Web Development Stack]] — modern landscape and common stacks
- [[Zen of Zig]] — Zig's design principles, universally applicable
<!-- keep-sorted end -->
## Data Structures and Algorithms
<!-- keep-sorted start case=no -->
- [[Bloom Filters and FM Sketches]] — probabilistic data structures
<!-- keep-sorted end -->
## Concurrency
<!-- keep-sorted start case=no -->
- [[Compare-and-Swap]] — CAS instruction, ABA problem, hardware support
- [[Double-Checked Locking]] — thread-safe lazy initialization pattern
- [[Initialization-on-demand Holder Idiom]] — Bill Pugh Singleton via class loading
<!-- keep-sorted end -->
## Databases
<!-- keep-sorted start case=no -->
- [[ACID]] — transaction guarantees: Atomicity, Consistency, Isolation, Durability
- [[Blind Write]] — writing without reading, implications for serializability
- [[Database Schemas]] — how schemas vary across PostgreSQL, MySQL, Oracle, SQLite
- [[Database Transaction Schedule]] — serializability, recoverability, concurrency control
- [[Materialized View]] — precomputed query results stored on disk
- [[Write-Write Conflict]] — lost update problem and prevention methods
<!-- keep-sorted end -->
## Testing
<!-- keep-sorted start case=no -->
- [[Test Case Writing Patterns]] — GWT, AAA, table-driven, property-based
- [[Types of Software Testing]] — comprehensive taxonomy and testing pyramid
<!-- keep-sorted end -->
[^1]: This page is maintained manually. Once Obsidian Publish supports Bases, replace with a Base.