首先非常有必要跟大家去解释一下为什么大公司或独角兽公司都喜欢考察系统设计的问题。
在真实工作中,你会发现,启动一个新的产品或功能的开发后,往往会花大部分时间与不同的组讨论requirement,需要考虑站在customer的角度来看产品功能是不是符合实际需求,这里的customer不仅是传统意义上购买你产品的一些用户,他也可以是在组里边或者其他组里面用你的这个工具或者service的同事。另外整个系统的performance是不是很好,latency是不是比较低?scalibility是不是比较强?是否利于维护和debug等等? 这些都是很重要的考量点。
系统设计有问题就会对外部客户产生经济损失,比如外卖平台宕机,电商平台丢失订单等等,都是几百万甚至上千万的损失。从内部客户的角度来看,公司中没有人愿意去维护一个不成熟的系统,这会花费很多精力,也很可能推倒重来。
因此面试中考察系统设计就成为了一种非常高效的做法,来看你解决实际工程问题的能力。
那么对于非计算机课班的同学,篱笆老师推荐一些准备的思路,希望对大家有帮助。
第一,扫盲基础知识篇:
操作系统基础知识:文件系统,虚拟内存,存储器分页,指令执行周期等知识
网络基础知识:应该了解TCP,IP, Internet,HTTP request, 客户端与服务端的工作基础
并发基础知识:线程,进程,各种锁,互斥锁等。
数据库基础知识:数据库的类型(SQL与无SQL等),哈希和索引,基于EAV的数据库,数据库的sharding,数据库caching,主从服务器等
一些基本架构的思想:例如负载均衡器,读写分离、异步代理,服务器,数据库服务器,缓存服务器,预计算,logging等
第二,理解并熟记系统设计的性能指标
响应时间,并发数,QPS和TPS,吞吐量,系统活跃度等等
只有熟练应用这些系统指标,你在设计中才会考虑到如何提升系统的设计。
第三,不断来练习系统设计的case
这里给大家推荐一下“4S分析法”的框架,百试不爽的。
Scenario,Service, Storage, Scale
Scenario就是要去向面试官了解清楚你在设计什么样一个产品,这个产品大概有哪些主要的功能?它需要支持多大的用户群体,QPS,memory,storage等等,一定要搞清楚这些问题再开始设计。
Service环节就是搭架子,对系统进行组件的设计,这时候建议大家要用白板进行画图,把系统需要的功能用block的形式画出来,并且把相似的功能合并成大的service
Storage是对每个service去选择合适的存储结构,最好能够去把数据的schema写出来。用画图的方式去展现清楚你的数据存储和读取的流程。
Scale
这里常见的问题例如:
如何防止单点失效:数据库sharding和replication
是否需要部署在多台机器然后进行负载均衡呢?
数据量是否大到需要分库分表?
好了,以上就是篱笆老师为大家提供的一些关于系统设计的准备思路。系统设计的知识非常庞杂,但是绝对是勤能补拙的面试环节。我非常建议大家尽早开始学习,保持记笔记的习惯。