掌握面试或网络创业的系统设计
自从 Facebook、Google、Palantir 等巨头在面试环节中加入了系统设计环节后,“系统设计”这个词在软件工程师中就变得非常流行。我就是这样接触到这个词的。
现在我们脑海中浮现的一个显而易见的问题是,为什么大规模系统设计的知识对这些公司如此重要?我的意思是,如果一个候选人是一位专业程序员,拥有为任何问题编写 O(1) 复杂度解决方案的超能力。那么,他真的有必要也具备良好的系统设计知识吗?好吧,O(1) 有点夸张,但我想你明白我的意思了。在我们的软件开发生涯中,我们很少有机会从零开始设计大规模服务。这难道不是太奢侈了吗?
我们谈谈吧。
为什么你应该掌握大型系统的设计?
首先,我们将讨论为什么系统设计对于软件开发人员来说如此重要。它不是为了面试,也不是为了被录用。而是为了你的知识和职业发展,或者也许你想自己创业,你有一个很酷的想法,想设计一个可以扩展到数百万用户的系统。你会怎么做呢?
你会聘请架构师还是自己设计?当然是自己设计。要设计一个可扩展的系统,了解 Web 应用/软件架构,并根据用例选择合适的技术,难道不是很有用吗?
拥有大规模系统设计的知识,换句话说,拥有 Web 架构、软件架构、分布式系统的知识,可以让你作为软件开发人员获得优势。
在您的工作中,当您实现新功能或从框架设计新模块或尝试扩展平台以应对流量涌入时,您可以运用系统设计知识做出更好的决策,并在同行中脱颖而出。
让我向您介绍软件从框架开始的典型开发过程以及为什么应用程序设计知识对开发人员如此重要。
系统设计的意义——正确构建应用程序架构的重要性
架构是应用程序的基础,必须仔细考虑,以避免以后出现任何重大的设计变更和代码重构。
凭经验来说,你肯定不想费力地重新设计东西。它会像黑洞一样吞噬你的时间。它可能会把你的发货日期推迟几个月,甚至更长。更别提由此造成的工程和财务资源的浪费了。
这也取决于我们在开发过程的哪个阶段因为在初始设计阶段仓促做出的决定而陷入僵局。所以,在我们动手写代码之前,我们必须确保底层架构正确。
看看我们的应用程序的架构,每个人都会微笑。
虽然软件开发是一个不断迭代和演进的过程,但我们并不总是能一次就做到完美。但这并不能成为我们不做充分准备的借口。
软件开发过程概述
在行业中,架构师、开发人员和产品负责人会花费大量时间研究和讨论业务需求。用软件工程术语来说,这被称为需求收集和分析。
确定业务需求后,我们会坐下来,集思广益,确定需要实现的用例。这需要尽早找出极端情况,并像拼乐高积木一样将它们拼凑起来。
如果您喜欢文档,您可能还想编写一份高级设计文档。
现在,我们已经了解了业务需求、用例、极端情况等等。是时候开始研究选择合适的技术栈来实现这些用例了。
概念验证
选择合适的技术栈后,我们开始编写 POC(概念验证)
为什么要使用 POC?
POC 帮助我们更深入、更实际地了解该技术和基本用例的实现。我们可以深入了解该技术的优缺点、性能或其他技术限制(如果有)。
如果我们使用全新的技术,它有助于学习曲线,而且非技术人员(例如产品所有者、利益相关者)也可以使用一些具体的东西并以此为基础做出进一步的决策。
目前,这仅适用于行业规模的产品。如果您是独立开发者或小团队,您可以跳过 POC 部分,直接开始编写主代码。
因此,我们向利益相关者展示了 POC,如果每个人都满意,我们最终就会开始在 GitHub 或企业喜欢的任何其他类似代码托管服务上创建主 repo 和我们的第一个开发分支。
呼!!
所以,现在您应该已经意识到第一次正确获得架构以及 Web 架构知识对开发人员来说是多么重要。
并非只有你在行业中工作了很长时间才应该研究软件架构,而应该反过来。在学习编程的过程中,你应该不断学习架构方面的知识。
所以,以上内容是关于如何掌握系统设计知识,从而编写自己的代码。现在,我们来了解一下公司在系统设计面试中对候选人的要求。
系统设计面试流程
在系统设计面试环节中,公司在寻找什么样的候选人?
公司并不指望我们成为系统设计专家。设计讨论是开放式的,没有完美的解决方案,也没有灵丹妙药,总是需要权衡利弊。
他们想了解我们的思维过程,他们想了解我们是如何处理设计问题的,或者当我们遇到从未见过的问题时,我们是否会立即陷入恐慌模式。
他们给我们的问题故意没有详细说明。他们希望我们能够发起对话,并就问题提出一些澄清性的问题,例如是否存在任何限制、系统需要处理哪些类型的输入、系统预期的流量大小、流量模式等等。
正如我之前所说,面试官并非想寻找具体的解决方案,而是想了解我们如何解决问题。随着系统设计的推进,我们最终会与面试官就许多不同的主题进行相当详细的讨论,例如可扩展性策略、适配技术、数据处理策略、设计选择等等。在谈话过程中,面试官会试图评估我们在该主题上的广度和深度。
我们需要对系统设计过程负责,我们有责任向面试官解释我们所做的设计选择、我们选择的数据库类型、是否真的需要消息队列或架构中的任何其他组件等等。
公司希望聘请值得信赖的工程师,让他们无需过多的监督就能找到解决问题的好办法。他们希望工程师能够深入了解用例和需求,并提出合适的解决方案,而不是仅仅被行业流行语和炒作所左右。
让我们听听谷歌对系统设计面试的看法
准备你的 Google 面试 – 系统设计
在这些面试中表现最好的方法是放松,把整个面试过程想象成你为自己的初创公司设计系统的环节。与面试官交流你的想法。主导设计过程,并与他进行讨论。
掌握大规模分布式系统的设计知识是软件开发人员应具备的最重要的技能之一。我从零开始开发过无数应用程序,这些基础知识总能帮助我节省时间和大量金钱。
到目前为止,我们讨论了为什么要掌握系统设计。现在该谈谈如何掌握系统设计了。
学习系统设计的正确方法
我在网上找到的大多数资源都会告诉你,哦!如果你要去X公司面试,你需要花几周时间准备系统设计面试。不,不会的。我强烈反对这种说法。
设计大规模分布式系统是一门艺术。你不可能在几周内学会。试图在几周内学会所有东西,注定会面试失败。当面试官开始深入探讨具体的组件和设计策略时,你只会茫然地站在那里。即使你在这个行业有几年的经验,仅仅了解一些表面的知识也无法帮助你在系统设计面试中脱颖而出。
好的!!那么我该怎么做呢?
学习软件架构需要时间,你必须随着时间的推移不断地自我教育,否则你最终会不堪重负。
以下是我推荐的一些很好的资源:
InfoQ是一个很棒的网站,可以关注高级架构内容。
这个软件架构 subreddit是讨论软件架构的好地方。
你可以阅读 Reddit、Facebook 等大型互联网服务的工程博客。只需在 Google 上搜索“X 服务工程博客”即可。
我在博客上写一些关于现实生活中的建筑的文章。以下是我写的几篇关于现实生活中建筑的热门文章。
YouTube 数据库 – 它如何存储如此多的视频而不会耗尽存储空间?
您可以加入我的时事通讯,以便及时了解博客上的新内容。
以下是我推荐的两门系统设计课程。
最佳系统设计课程
说到两个能让你快速掌握的顶级系统设计课程,它们是:
Web 应用程序和软件架构 101
本课程由我编写,于2019年12月在Educative.io上线,在很短的时间内就成为该平台上最畅销的课程之一。它是你系统设计面试准备的垫脚石。
那么,这门课程到底讲什么呢?
如果您需要从基础开始深入了解 Web 架构,本课程将逐步讲解设计 Web 应用架构时涉及的不同组件和概念,涵盖从用户界面到后端,包括消息队列、数据库、流媒体、选择合适的技术栈等等。您应该参加本课程。
在本课程中,我们将学习选择合适的架构和技术栈来实现用例的技巧。我将带您了解不同的用例,帮助您深入了解在编写 Web 应用程序时,哪种技术和架构最适合特定用例。您将了解其中涉及的技术权衡。
如果您是刚踏入软件开发领域的新手,这门课程将对您大有裨益。软件设计就像拼装乐高积木。通过这门课程,您将深入了解如何将积木拼装在一起,并构建出精彩的作品。它还能帮助您应对软件工程面试,尤其是全栈开发人员的职位。
课程结束后,您将对 Web 应用程序架构有全面的了解。您将从零开始,踏上应用程序设计之路。如果您有一个创业想法,并且正在思考:如何实现我的应用程序?我应该使用哪些技术?我应该从哪里开始?本课程将帮助您开启创业之旅。
单击此处在 Educative.io 上购买课程,目前该课程有 40% 的折扣,但仅限一段时间。
如果你想知道我是谁,请先了解一下我:
我叫 Shivang。过去 8 年我一直从事代码编写工作,个人编程经验更是长达 14 年。在我的职业生涯中,我有机会为一些行业巨头开发大型互联网服务,涉及电商、金融科技、电信等多个领域。
我编写过从最基础的程序,从构思到最终投入生产。我维护过代码,也为每天访问量数百万的系统提供过生产支持。
我上一份工作是在惠普企业公司,担任其技术解决方案研发团队的全栈开发人员。
通过这门课程,我尽力与大家分享我在多年软件开发中获得的知识、见解和经验!
您可以在这里了解更多关于我的信息。这是我的LinkedIn 个人资料。
我的博客上也有一篇关于这门课程的详细文章。如果你想读的话可以看看。
接下来…
理解系统设计面试
系统设计面试课程探讨如何设计大型服务,就像公司期望你设计 Twitter、Uber、Facebook、Instagram、Dropbox 等众多大型服务一样。课程共讨论 15 个案例研究。
如果您已经掌握了基础知识,或者您是一位经验丰富的开发人员,并且对基础知识了如指掌,我强烈推荐您参加这门课程。您可以直接参加这门课程。
该课程由曾在谷歌、Facebook、微软和亚马逊工作过的招聘经理开发。课程中包含的案例研究已多次被顶级公司问询。
免责声明:这是一个联盟链接。当您购买课程时,我会收取少量佣金,您无需支付任何额外费用。
这两门课程均可在 Educative.io 平台上学习。Educative 是一个为软件开发者提供交互式编程课程的平台,课程内置编程环境,旨在让学习过程快速高效。无需任何设置,开发者环境已在云端预先配置好。您可以通过浏览器内的练习,按照自己的节奏学习。
好了,伙计们!!🙂 这篇长文终于完结了。我会持续更新,因为我会发现更多有趣的系统设计资源。你可以收藏此页面,也可以订阅我的新闻邮件,以便及时了解我发布的新内容。
再见…
干杯!!
文章来源:https://dev.to/techpackets/master-system-design-for-your-interviews-or-your-web-startup-1n9i