注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
往期推荐
系统设计是区分初阶、中阶、高阶程序员的一轮面试,是作为跳槽面试中必然会面的一轮。一个产品的实现,分为产品定义,模块划分,每个模块下面有不同的功能,每个功能有不同的需求,每个需求可以拆分为多个Task。
拿TikTok 创作工具产品举例,有拍摄、编辑、发布、特效等模块,特效里面有特效面板、特效搜索、发现推荐等功能,特效面板里会有UI优化的需求,这个需求可以拆分成几个小的Task。
![]()
一个人刷题能力很强可以说明他执行力很强,给一个Task能够快速高质量的完成。所以刷题能力只是最基础的要求。程序员的成长,就是能实现更大的需求,从更高维度去设计系统。这也是为什么在跳槽的时候,系统设计是关键考察候选人能力并且影响定级的一个环境。
相比于刷题题目类型丰富,题库很大,每题有固定解法和准确答案,发挥空间主要在把这个题目用正确的算法解释清楚。
往往系统设计题没有明确的答案,题库较小,每题没有固定的解法,发挥空间较大。开始练习系统设计面试时,做过几个题之后,看几个youtube视频,就能总结出套路。
常见的系统设计问题
OS 常见的系统设计问题包括设计news feed,设计歌单,主要考察App architecture (MVP, MVVM), UITableView,UICollectionView,Delegate设计,DataModel设计,网络API设计等。
下面来分析一下系统设计面试的操作步骤Steps和考点:- Identifying technique requirement, limitations,跟面试官沟通,明确需求,定义Scope,比如对于客户端的面试,可以明确是否后端数据库等实现不在这次面试Scope里
- High level design,技术选型,用MVVM还是MVP模式;用UITableView还是UICollectionView;数据持久化存储用CoreData还是UserDefault,SQLite。这一步有条件可以画一下各个模块共同的草稿图,就像这样:
![]() - Implementation,可以写一下UITableView的几个delegate的实现
- Low level Details,UITableView 需要实现dequeueReusableCell,来提升内存利用率,提高滑屏流畅度;网络请求部分,设计成异步api,并且用一个指定的queue来处理等,这些细节的掌握从侧面反应出你考虑事情的周全,这样的候选人代码质量普遍较高
- Other considerations 大部分准备充分的候选人,都能把基础的1-4步回答到点上,基本上就能覆盖考点并且通过系统设计轮,但是要把系统面试答出花来,令面试官印象深刻,需要在第五点进行拓展。拓展点就是一个展现考点之外的知识点好机会。甚至能够弥补1-4步里面回答的一些不足。
拓展点
- Mobile limitation, 手机算力的限制,一些复杂的操作比如机器学习的一些算法没法在手机上跑,或者在手机上只能跑低精度版本的;28% of users are using the latest, 所以确保实现的功能在中低端机上能使用,模型、视频、图片的下发就需要设计成分机型下发
- Networking,无网弱网的时候怎么处理,比如news feed划着划着没网了,怎么处理,facebook news feed无网时在最下面有一个scissors design,来提示用户,继续划看到的就是之前缓存的post
- Event Tracking (ET) and metrics,这个需求的实现,需要添加哪些Event tracking,每个按钮的点击,每次网络请求的发送和返回,后期如何用这些ET来建立Funnel Logging,建立稳定性指标等等
- trade-offs, 讲一讲多种技术可以实现的时候,如何做选择,比如数据存本地,还是存服务端;移动端开发选择React Native 这种跨端实现还是选择原生框架实现
- OS SDKs,在实现的时候,选择哪些OS SDKs,比如相机相关的会用到AVFoundation,数据库CoreData
- i18n and a11y, 分别指代internationalization和accessibility,是指国际化字符串的翻译,和视障人士辅助功能。国际化的产品,都需要做i18n and a11y,通常大公司有内部的库来实现这些功能,只需要产品实现的时候调用对应的库就行了
- AB design, 作为一个数据驱动的公司,每个需求都需要设计一些AB 实验,来测试新功能的好坏
- mobile app architecture,
- app lifecycle
- UI rendering
- memory constraints
总结
总结起来,系统设计面试本身不难,不会遇到算法不会就卡壳的情况,需要候选人提前准备好知识点,面试过程中按照操作步骤,结合问题和知识点,从high level design, 到low level detail给出一个完整的设计,然后选几个other consideration展开讲解一下。就能给面试官传递一个信号:他不仅完成了所有的需求点,还给了一个更加面向全球化、兼顾未来迭代、性能优化的超出预期的回答!
大家有做mobile 开发的可以留言交流,另外TikTok 我们组也有iOS Android 岗位,欢迎跳槽来撩。
码子不易,如果觉得有用的话,欢迎分享给您的朋友,或者赞赏一点大米,支持我继续创作优质的职业发展文章。
|