What is Computing?

TL;DR. Computing is not just about software or hardware.

Models of Computing
- IPO (input-process-output)
- IPPO (input-preprocess-process-output)
IPO
- function call
- RPC (remote procedure call)
- output is optional
- push (service → client)
- pull (client → service)
- API (language-specific)
IPPO
- proxy (HAProxy, nginx)
- interface (SQL, GraphQL)
- indirection
- routing (twemproxy)
- pre-process
- data cleansing
- data validation
- pre-flight check
- protocol (language-agnostic, specification for common behavior)
- log proxy

Computing Architecture
- client/service
- peer to peer
Computing Forces
- push (service → client)
- pull (client → service)
Three-Tier Architecture
- presentation tier (desktop/mobile)
- business logic tier (web services, microservices)
- database (storage)
Dev/Ops Architecture
https://medium.com/p/web-services-vs-microservices-7d2230480329
- presentation tier (desktop, mobile, SAM Pattern)
- Web services (user-facing Web server apps)
- microservices (business logic, RPC, message routing, message queue, 12-Factor App)
- database (SQL, NoSQL, file, block, object storage)
- analytics (OLAP, ML, AI, stream processing, etc)
- ops (monitoring, logging, metrics, instrumentation, etc)
Abstraction
- “Abstraction is the luxury of experts” — Heath Brothers
- No to leaky abstraction
- “Abstracting away the differences” is a leaky abstraction (e.g. libcloud, ORM, etc)
- Why proxy pattern is a better abstraction
Programming
- declarative programming — declare the protocol (nsq.io), intent (DSL), query (SQL), separate interfaces from engines
- imperative programming — sequence (recipe), what to do (procedure), decision (if/else)
- functional programming — higher-order functions, lazy evaluation
Real-Life Example of Microservices in Action
https://monzo.com/blog/2016/09/19/building-a-modern-bank-backend/
- Rule of Modularity: Write simple parts connected by clean interfaces.
- Rule of Clarity: Clarity is better than cleverness.
- Rule of Composition: Design programs to be connected to other programs.
- Rule of Separation: Separate policy from mechanism; separate interfaces from engines.
- Rule of Simplicity: Design for simplicity; add complexity only where you must.
- Rule of Parsimony: Write a big program only when it is clear by demonstration that nothing else will do.
- Rule of Transparency: Design for visibility to make inspection and debugging easier.
- Rule of Robustness: Robustness is the child of transparency and simplicity.
- Rule of Representation: Fold knowledge into data so program logic can be stupid and robust.
- Rule of Least Surprise: In interface design, always do the least surprising thing.
- Rule of Silence: When a program has nothing surprising to say, it should say nothing.
- Rule of Repair: When you must fail, fail noisily and as soon as possible.
- Rule of Economy: Programmer time is expensive; conserve it in preference to machine time.
- Rule of Generation: Avoid frameworks. Build frameworks to build frameworks (aka meta-frameworks).
- Rule of Optimization: Prototype before polishing. Get it working before you optimize it.
- Rule of Diversity: Distrust all claims for “one true way”.
- Rule of Extensibility: Design for the future, because it will be here sooner than you think.