A Philosophy of Software Design

Introduction If you can visualize a system, you can probably implement it Means greatest limitation is theĀ  ability to understand the system we are creating Over time, complexity accumulates, leading to bugs which slows development two general approaches to fight complexity making code simpler and more obvious encapsulate complexity software design continual process, waterfall rarely… Continue reading A Philosophy of Software Design

Designing Data-Intensive Applications

Reliable, Scalable, and Maintainable Applications Intro applications today more data-intensive than compute intensive need to store data (dbs), remember expensive operations (cache), allow users to search (indexes), send a message to another process async (stream processing), periodically crunch a large amount of data (batch) Thinking About Data Systems wide-ranging requirements handled by stitching different tools… Continue reading Designing Data-Intensive Applications

Working Effectively with Legacy Code

Changing Software Four reasons to change software adding a feature fixing a bug improving design optimizing resource usage Adding features and fixing bugs some argue whether something is a bug fix vs feature more important distinction is behavior i.e. adding or changing Improving Design (Refactoring) keep behavior intact programmers avoid because easy to lose behavior… Continue reading Working Effectively with Legacy Code

Building Microservices

Microservices Intro Emerged in context of domain driven design, CI/CD, on-demand virtualization, infrastructure automation, small autonomous teams, systems at scale more flexibility to respond faster is goal What are microservices? small autonomous services that work together service boundaries based on business boundaries shouldn’t be too big (~2 weeks to rewrite) separate entities ideally own own… Continue reading Building Microservices