我们要先搞懂系统设计是什么
划重点,这里讲的系统设计都是系统设计面试,而非是工业上的设计系统。系统设计,其实就是一个“吹牛逼”的行为,在和面试官你来我往的沟通中,用“嘴皮子”创建一个系统,讨论系统。
设计某某系统 Design XXX System
• 设计微博 Design Twitter
• 设计滴滴 Design Uber
• 设计微信 Design Whatsapp
• 设计点评 Design Yelp
• 设计短网址系统 Design Tiny URL
• 设计NoSQL数据库 Design NoSQL
……
设计一个功能实现对用户访问频率的限制
• 设计一个功能实现统计某个具体事件的历史发生次数
• 设计删除一个 Tweet 的功能
• 设计邮件系统中将所有邮件标记为已读的功能
……
某某系统的技术选型比如缓存用Redis
还是Memcached
、网关用Spring Cloud Gateway
还是Netflix Zuul2
。
……
所谓知己知彼,百战不殆,弄清面试官的意图很重要。
系统设计面试不是希望你在30min左右设计出一个完整的系统,而是考察你在面对一个复杂的问题时,如何把它进行拆解、细化、运用现有的系统知识完成一个具体的项目,实现工作中leader需要你实现的功能。
推荐一下系统架构设计 System Design 2021 版
课程包含秒杀系统与订单系统、网站系统、协同实时编辑系统、限流器与实时数据系统、即时通讯系统、视频系统、爬虫系统等18个常见的系统,覆盖了系统设计全面的面试题型。
课上还会提供系统设计的通用解题步骤,并独创了系统设计训练方式,通过编程掌握核心技术点。让系统设计面试像刷题一样有迹可循。
第一节的免费试听课程就会讲到设计Twitter和系统设计的通用解题法则,不妨去感受一下,简单入个门。
毕竟系统设计面试不是希望你在30min左右设计出一个完整的系统,而是考察你在面对一个复杂的问题时,如何把它进行拆解、细化、运用现有的系统知识完成一个具体的项目,实现工作中leader需要你实现的功能。
想明白了这点,对于你之后的解题很有帮助,所以我才说系统设计就是“吹牛逼”。
1.首先多找些常见的系统设计题,弄清楚题目的具体要求
举个例子,比如你准备面Facebook,他们常考的一个design find nearby places。这个题目搜一下过去两年的面经会发现到处都是,根据网友们的描述大致可以总结出这一题最核心考点是什么。
接着你就可以根据自身经验能力,把各个方案做一些比较和总结,最后再准备一些拔高的的知识点。整个面试如果能有条有理深入浅出的讲完就行了!
2.利用自身的能力对系统进行抽象设计
当面试官给出了系统设计题目之后,一定不要立即开始设计解决方案。 你需要先理解系统设计的需求:功能性需求和非功能性需求。
不要上来题目刚出还没怎么思考呢,就大谈特谈。
例如不要在面试官说首先考虑10w量级的用户,先把系统搭建起来然后再看scale之后。他花大量时间blabla说了一堆市面上比较fancy的技术,实际上只会暴露出你对这些技术的不了解。
整体看下来特别像孔乙己在高谈阔论茴的四种写法。这样并不会让你在面试时获得高分,因为面试的核心是看你怎么解决问题,并不是让你造火箭,更何况绝大部分人也造不好。
对于绝大部分非天才非大牛的L4来说,面系统设计不要试图答成L6的水平,面试时你可以画出系统的抽象架构图,这个抽象架构图中包含了系统的一些组件以及这些组件之间的连接。
3.想好了再回答,不要太绝对,及时反思
思路清晰,表达流畅,有重点有逻辑有主线会很加分,系统设计没有标准答案,重要的是你和面试官一起交流的过程。
一般情况下,你会在和面试官的交流过程中,一步一步完成系统设计这个过程中,你会在面试官的引导下不断完善自己的系统设计方案。
系统设计没有最好的设计方案,只有最合适的设计方案。
刚开始设计的系统不需要太完美,可以慢慢优化。
使用稳定的、适合业务的技术,不必要过于追求新技术。
系统设计应当追求简单避免复杂。
神书DDIA
不用多说,大家都在推荐,我也依然很推荐。书里很多的理论证明,还有各种细节上的讨论,比如phantom read的具体情况,其实对于准备系统面试来说,并不是非常有帮助。
更多的反而可能是写在各章summary里的,那些对于名词和术语的总结,还有对于为什么某些东西在系统设计里很重要的简单分析。
搭配这些,和一些网上的读书笔记,就能让你对这些东西有一个比较合适的理解。
值得注意的是,我们来到senior-staff这个级别的系统设计面试的话是不够的,我甚至觉得它里面的一些有点复制粘贴意思的trade-off分析,和它不分场景都上来先算capacity的做法,其实容易把人带进沟里。
Youtube或者一些独立站上有不少看起来几十万阅读量的up主上传了很多系统设计的视频,也是深度不足且细节问题一堆,都是没有太多实战经验的人,基于一个类似的模版反复套用在不同系统上进行分析,最多会追加一两个针对该系统的特色的设计。
九章的面向对象设计入门课可以算得上是广受好评,主要讲解4种题型的设计模式,用实例讲解设计模式和常考的面向对象设计真题,包括Strategy,Singleton,Factory,Adaptor等。
覆盖到希望深入了解设计模式的学习者,现在可以免费试听:
我单独拿这个出来说,是因为哪怕你学习到位,方法论总结到位,但是如果你要直接上阵,你还是不知道那套方法论在实践的时候会变成什么样,所以我的建议是多练习实操项目,至少有一个能拿得出手的系统项目。
所以我再推荐几个可以跟着学习的系统设计。
1.mall
mall
项目致力于打造一个完整的电商系统,采用现阶段流行技术实现。
作为一套电商系统,它包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。
2.打车系统
这是一个仿滴滴打车的Android出行项目,主要针对滴滴等出行平台一直饱受质疑的“人车不符”问题,以及当前越发火热的国际化和出海战略,并且给出行项目增加了下面几个功能:
1. RFID识别验证功能:在司机证件或者车内识别硬件里嵌入RFID识别芯片,乘客使用手机读取到芯片信息,并且通过网络(okhttp3)发送到出行平台数据库进行验证。如果不是合规的“人”或“车”,则不能完成订单并向平台或监管单位汇报当前位置。
2. 海外版功能:点击切换当前语言。
3. 司机证件号码识别功能:读取司机证件上的证件号码,也可以用来与出行平台数据库的信息进行核实比对。
3.Twitter后端项目
设计Twitter本质上就是在考高并发的信息流系统,其涉及的技术难点非常多,项目的难度也更能检验面试者水平,而且从L3~L5都能问到。
对于初级程序员(SDE1),可以把“设计Twitter”拆解出单独设计一个关注功能来问
对于高级程序员(SDE2+),面试官通常会要求面试者实现设计登陆、发推、点赞、关注、取关等一系列功能
这些技术难点在Twitter后端项目首节试听课中都有详细介绍,整个项目涉及万行代码,最后可以按工业化要求产出的可上线产品。现在可以免费报名试听。
4.JavaWeb
一个小型公司管理项目
模拟公司组建于发展壮大过程而实现的一款管理软件。
5.电商秒杀系统 - Spring项目实战
实战高并发最好的项目之一,课程是由阿里巴巴资深架构师主讲,负责每年双十一淘宝系统的维护。
对于长期在中小厂工作,缺乏高并发经验的程序员非常适用,课程会从项目基础架构搭建、数据库表分析及创建、MyBatis 整合与逆向生成等开始讲起,逐步完成一个电商秒杀系统。
首节试听课上会讲解秒杀系统的重难点、常用的技术架构,现在开放了免费试听。
比如完全不明白一个系统是怎么样end-to-end工作的。这个就无解了,只能回炉重练。实际上这样的候选人非常罕见。
没有主线,过度发散,很容易被带偏。
这是非常常见的问题,很多候选人其实是知道怎么设计的,该有的知识也有。但是说话没个章法,一会说这一会说那,整个设计半个小时下来看不到什么逻辑性。Interviewer随便问个问题很容易就被带偏然后花好几分钟去描述一个其实不是很重要的东西。感觉什么都讲了但是好像又没讲什么,那就只能fail了。
花太多时间在不重要的地方上。
这也是个很常见的问题。一个题目出出来都是有重心的,如果他重点问你设计数据结构,你就不要在authentication上花一点点时间。面试的时间有限,每一题要考哪些signal都是提前设计好的。比如一共要考察10个点,在45分钟的时间budget下,你答的点越多越好。我见过太多candidate花大量时间去说一些不在我考察范围内的事情,这本质上就是把你有限的时间资源都浪费掉了,最后时间到了我只能收集到一两个点的signal,那当然容易是no hire。
如何找到重心?一靠经验,二靠准备。网上有海量面经,下功夫精细准备10个题,后面基本上就了解要考什么了。上面也有讲。
不论如何准备,你都会碰到意料之外的。在实行经验的时候,也可能随时被要求谈不同的部分,这些都是没办法提前准备好,只能在大量的面试和练习之下,自然而然养成应对的本能。然后每一次面试结束,做好总结归纳,
系统设计面试,说到最后还是面试,还是让对方在短时间内建立起你对的良好印象的一步。能够应对面试官的需求,改变你的套路,也是交流沟通的重要一环。
希望能对苦于系统设计的各位,提供一些帮助。也欢迎各位随时提问,知无不言,言无不尽。
部分资料来源: @堕落的猴子
原文链接:猴子也能懂的系统设计套路