How to Ace System Design


Always think about different approaches, think better approaches and say it.

Step 1:
Ask questions, don't assume (at lease check your assumption)
- whether this is algorithm or design problem?
Step 2: System interface definition
- interface, main functions
Step 3: High level design with some diagram
Back-of-the-envelope capacity estimation
Defining the data model
Identifying and resolving bottlenecks

Make a List:
- main functions of the system
- locate bottleneck + how to scale

Unique challenges of these features/system
Non-function features
Unique features
Rate limiter - scalable, availability,  DDos
Priority - Critical vs Non-Critical
Load smoothy or spiky(predictable or not)?

Use cases analysis

- How client is going to use it

Locate the problem of the current design 
- show you are aware of them
How to optimize it if possible
How to scale

Separate of concerns
Separate or not
Rate limiter - embedded in application or seperated
Tiny url - separate write, read api

Follow the user case, end to end What's the bottleneck, the challenge
How to scale
How to handle change - node added/removed/crashed



The features of these functions
- read/write ratio, read heavy or write heavy or both

How to use it
Senario
Better user experience
User perceived experience/speed
- cheat, approximate
Thinking from client/user perspective
How they use it, what they would like to know

Extra functions that may be related or needed

API Design
Idempotency
Idempotency key
Back pressure exponential backoff
Randomness, Jitter

Fault-tolerant
Retry
Timeout
Rate limit

Degrade
Separation of services
Priority - Critical vs Non-Critical

Offline tasks
Use data from offline tasks

- topn followers, interest getCore

限流
削峰
异步处理
用户体验

用户交互

及时拒绝,防止雪崩


How to Conduct System Design Interview
In memory -> persistence

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)