系统设计比你想象的更重要
过去一个月,我全身心投入系统设计。在一次面试中惨败后(不妨看看我之前关于自己糟糕表现的博客文章,缓解一下你的冒名顶替综合症),我把这次失败视为自己的错觉,并决定投入大量时间来提升我的系统设计知识和技能。如果说我在这段经历中学到什么,那就是系统设计不仅仅是面试准备,也不是只有高级工程师才需要担心的事情。它是每一位软件工程师都应该努力定期练习和发展的一项重要技能。
故事时间:我推出了“系统设计日报”(System Design Daily),这是一款互动学习工具,主要供我自己使用,但也为其他想要以更引人入胜的方式学习这些概念的工程师提供服务。我最近添加了一些让我非常兴奋的游戏化功能,但那是另一篇文章要讲的故事了。
在 Valorant 和系统设计面试中均获得铜牌
该网站启动后,我获得了多达 3 个用户:我、我的测试帐户以及我的合作伙伴(我绝对没有强迫他们使用它)。
我在发布时检查我的用户数量
是时候进行一些#数字营销和#公共建设了。唯一的问题是,在过去的9年里,我在推特上只有大约14个粉丝,却只发了大约4条帖子。我不太热衷于社交媒体。
起初我采用了康宝莱的模式,联系了我所有软件工程师的朋友和家人,恳求他们在网站上提供一些反馈。这种方法还算有效,但有一个问题:我所有亲密的朋友和家人都在工作,并没有积极地去面试。所以这个工具对他们来说没什么用。(希望我读完这篇文章后能改变他们的想法)。
我决定改变策略,在网上和陌生人交流。我没有让他们去使用我的网站,而是询问他们的故事和经历。我首先在领英上搜索,专门寻找像我一样的#opentowork 成员。然后我扩展到 Reddit 和一些 Discord 社区。在与人们交流并阅读他们的评论和回复的过程中,我开始意识到一些关于系统设计的事情。
就业市场💩🔥
与失业的兄弟姐妹们交谈后,我对 2024 年科技招聘状况有了两个关键认识:
- 就业市场竞争异常激烈
- 如果您是新毕业生 - 点 1,但要用大红色文字加上火焰和骨架来强调。
外面真是残酷至极。工程师们纷纷被裁员。大量经验丰富的人才涌入市场。他们中的许多人绝对是 Leetcode 大神——我见过一些资料显示,他们一天解决的 Leetcode 题目比我一年解决的题目还多。
这意味着什么?这意味着现在每个人都擅长编程面试。YouTube 上有五亿个频道讲解三和题和快慢指针。实际上,所有曾经问过或将来会问到的问题都在 Leetcode 上。因此,面试格局正在开始发生变化,因为公司开始意识到 Leetcode 面试者死记硬背答案的重要性,在某些情况下,系统设计和行为面试正在完全取代 Leetcode 式的面试。总而言之:如果你是一名试图竞争的工程师,Leetcode 已经远远不够了。
尤其是在行业招聘中,你真的不能不擅长系统设计。以你的水平,系统设计和行为面试将是决定你是否能得到这份工作的决定性因素。尤其是系统设计,它还会被用来决定你的资历。所以,如果你想赚大钱并给blind.com留下深刻印象,了解这些知识对你大有裨益。
2024 年左右的平均系统设计研究人员
对于你们这些刚毕业的学生来说,你们可能会想——好吧,我这下可就没事了,对吧?错!(有点错!)虽然面试时通常不会要求你展示系统设计知识,但这是一项极其重要的长期技能。这是因为了解系统设计可以加速你的职业发展。我会更详细地讲,但长话短说,你将建立一种设计“意识”和系统知识,这将使你在工作中承担更多责任。最终的结果是,你将快速晋升到那些薪水丰厚的高级/首席工程师职位。
还有一件事要提醒各位新毕业生——虽然系统设计这个“死神”暂时不会找上门来,但它的“邪恶小弟”——低层面向对象设计——很可能会找上门来。当然,两者的粒度可能不一样,但都需要用到同样的技能:你需要收集需求,组织和描述你的类,并解释它们之间的交互方式。
职业发展
所以你可能会想,“好吧,我有工作。让那些失业的家伙去担心系统设计吧。”
首先,我很钦佩您相信自己会拥有永久的工作保障的信心——尤其是在最近科技行业大规模裁员和人工智能兴起的情况下。
其次,我相信系统设计即使对于你们这些受雇的人来说也是有用的。
招聘高级工程师时会考虑系统设计是有原因的。系统设计是衡量经验的标准。最擅长系统设计的人见多识广,也构建过很多系统。他们知道哪些地方可能出错,因为他们有过类似的经验,并且能够根据这些经验进行相应的设计,以减轻潜在的问题。
但是,你究竟该如何开始在这些系统上工作呢?当然,你的经理或许会足够信任你,主动把大型项目交给你。但99%的情况下,你需要主动要求承担更多责任和自主权。为了自信地做到这一点,你需要证明自己了解架构模式、数据存储技术和扩展策略等知识。简而言之,系统设计将帮助你从初级晋升到高级。
好吧,如果你已经是高级工程师或首席工程师了,那又如何呢?这对你有什么帮助?首先,请教我。其次,技术瞬息万变,如果不保持敏锐,很容易失去这些技能。
我在亚马逊工作时,我被提醒的最重要的事情之一就是很容易与更广泛的软件世界隔绝。当你总是使用相同的工具和流程时,你就会开始依赖它们做正确的事情,最终忘记它们最初被设计成这样的原因。你也会把自己与那些你可能从未想过的新问题解决方法隔绝开来。复习系统设计主题也能帮助你掌握最新的范式和技术,并提高你的适应能力。
系统设计不是 Leetcode!
这就引出了我的下一个观点。系统设计不像 Leetcode。我的意思是什么呢?软件工程师中普遍存在一种观念,认为“面试准备材料”(通常只有 Leetcode 才有)只有在找新工作的时候才会拿出来用。通常情况下,“入室盗窃 II”、“合并 K 个排序列表”以及 Blind 75 帮的其他内容都会被埋在你记忆深处一英尺厚的水泥地下。

工程师们重新开始他们的 Leetcode 高级订阅就像
说实话,这其实是应对 Leetcode 和 DSA/编程面试的一个很好的方法。因为你要解决的大多数问题都不是你在实际工作中会遇到的。更重要的是,“白板面试环境”完全是大公司为了筛选应聘者而特意设计的,非常不自然。在现实世界中,你根本不需要完全凭记忆在 40 分钟内高效地实现一个通常晦涩难懂的算法。所以,就像基于拉取的 CDN 一样,你几乎只在需要时才从对象存储中检索这些知识和技能。
这根本不是什么新鲜事。“LeetCode 面试”已经被科技界的权威人士(理所当然地)嘲讽了一段时间。但我认为,虽然这种“冷藏”的思维模式对 LeetCode 来说很合理,但它并不适用于系统设计,也不应该适用于它。
正如我之前提到的,系统设计实际上具有实际应用。在工作中,你不会总是有大量的机会设计高级系统架构。你的日常工作不可避免地会被与设计无关的工作填满,所以你需要通过健康的学习和练习来锻炼你的设计能力。
此外,系统组件和设计模式也随着整个技术格局的不断发展而不断演变。这意味着如果你想保持领先地位,就必须紧跟这些变化。理解系统设计可以为你提供一个有效实现这一点的框架。
要点:系统设计很棒
归根结底,了解系统设计会让你成为一名更优秀的工程师,就这么简单。虽然听起来可能只是因为我正在开发一个系统设计学习工具,但我真心相信,了解可扩展分布式软件系统的工作原理,会让你在构建可扩展分布式软件系统方面做得更好。
我也觉得它既有趣又酷。当然,系统设计中规定的方法和资源可能会让人感觉恰恰相反。但如果你能克服材料通常枯燥乏味的演示格式,你可能会像我一样,被那些规模庞大的公司如何处理随之而来的独特、往往出乎意料的问题所吸引。对于所有游戏玩家来说,这就像玩那些优化或管理模拟游戏(比如《异星工厂》、《双点医院》等等)一样。
总之,我觉得系统设计很棒,但被低估了,所以想聊聊这个。就这样吧。回头见。
鏂囩珷鏉ユ簮锛�https://dev.to/dezhango/system-design-is-more-important-than-you-think-g0e