系统设计向世界诠释:第1卷

2020-12-28 02:06:20

"系统设计"是研究的一个分支,试图找到适用于各个学科的通用建筑模式。

您可能会认为这不是真正的可能性。回到大学后,同学们常常取笑系统设计工程师,称其为“盒子和箭头”。工程。您会发现,这不是真正的工程,因为它没有触及任何有形的东西,例如建筑物,电机,盐酸或电子。

我不认为系统设计人员会太认真地对待这种批评,因为我们都知道该程序在整个大学中具有最严格的入学标准。

(机械工程师曾经告诉我,他们以相同的方式看电子工程师/计算机工程师:在屏幕上处理波形,而不是可以触摸,更改和固定的真实物理物体。)

我认为我们每个人都不真正理解当时的工程原理,但是幸运的是,现在我已经老了。让我告诉你一些故事。

当我在一家大技术公司工作时,我开始对系统设计进行更清晰的思考,以帮助人们完善自我晋升的员工审查数据包。其中大部分非常简单明了,可以帮助人们将自己的成就映射到工程阶梯上的下一步。因此,如果您是Junior的新手,则必须证明无需过多的监督就可以修复错误。如果选择高级,则必须证明无需过多的监督即可实现整个设计。去找员工,您必须证明您可以根据业务问题进行设计,而基本上无需管理;去找高级职员,你必须解决越来越大的业务问题;等等。

在帮助了几十个人进行评估之后,我注意到了一种趋势。大多数开发人员都很好地将其绘制在阶梯上,但有些人不适合,即使他们对我来说似乎是伟大的工程师。

曾担任高级工程师(建造东西)但没有想到要或能够做到让员工工程师(翻译业务问题)的人。

处于初级级别的人员,但是在解决业务问题方面比在修复错误方面要好得多。

第1组已经正式入账:官方的说法是,大多数员工永远都不应期望超过高级工程师。那就是称该级别为“高级”的全部要点。对于想赚更多钱或在职业生涯的未来20至30年内不断进步的人们来说,这并不是什么安慰,但这至少是我们可以谈论的。

(金·斯科特(Kim Scott)撰写的RadicalCandor一书中讨论了如何处理那些只想建造东西的优秀工程师。她为坚如磐石的工程师提出了另一种发展思路,他们只是想成为他们所从事的事物的世界级专家, #39;在陡峭的轨道后退,&"工程师,他们对细节的关注可能较少,但他们想要处理越来越大的事情并跳来跳去。)

#2组中的人不应该存在。他们正在做一些艰苦的工作,将业务问题转化为设计,并拥有丰富的专业知识,但是对于那些经过培训可以寻找“正好一个层次”的初级推广委员会来说,这些成就并不有趣。这些属性包括在一两个特定领域的深厚技术知识,快速,大量错误修复的历史记录,小型独立发布以及不久的将来。同时,由于无法快速编写代码,因此无法(仍然)设计出纸袋方式的同龄人在早期队伍中的崛起更快。

Tanya Reilly的精彩演讲(和转录的幻灯片)称为BeingGlue,可以完美地捕捉到这种效果。用她的话来说:"当你年长时,胶工作是期望的;而当你不时,胶工作是冒险的。

她所说的胶水工作,我将称之为系统设计。它们是同一问题的两个方面。人类是所有系统中最不守规矩的系统,但令人惊奇的是,它们遵循与其他系统相同的许多模式。

天生擅长胶水工作的人通常会在规定的工程流程中尽早退出,即使他们在后期阶段(工作人员工程师,董事和高管)表现出色,而传统上更伟大的工程师会为此奋斗。实际上,有据可查的是,一家高科技公司的执行官所需的技能几乎与程序员完​​全不同,而且晋升至最高水平根本无法为您做好这份工作的准备。由于这个原因,许多大型科技公司从公司外部雇用高管,有时甚至从他们自己的行业外部雇用高管。

...但是我想我仍然没有回答这个问题。什么是系统设计?如果您做错了,那最终会杀死您的项目,但可能不会马上结束。它是宏观经济学而不是微观经济学。确定您的公司甚至拥有哪些晋升阶梯,而不是试图爬上阶梯。它知道什么时候分布式系统不合适,而不仅仅是知道如何构建一个分布式系统。它' srepairing的激励机制在政治制度,而不是刚刚当选andpassing自己喜欢的法律。

最重要的是,不知道如何查找的人看不到系统设计。至少使用代码,您可以按行或通过bug来衡量输出,还可以雇用更多的程序员来获取更多的代码。通过系统设计,关键的见解可能是在正确的时间向正确的人给出的一句话解释,这会影响接下来的5年工作,或者是过度增长与稳定增长之间的区别。

抱歉,我不知道该怎么解释。我可以做的是谈论一些系统设计问题和原型,这些问题和原型在多个领域中反复出现。如果您能够在搜索类型出现时就识别出它们并在它们终止项目之前对其进行处理,那么您将成为系统设计师。

让我们从一个显而易见的问题开始:集中式与分布式控制结构的问题。您知道所有这些,对吧?如果我问您什么是更好的组织结构:命令和控制的层次结构或单位组织,大多数人都被灌输显然是后者。同样,如果我问您是应该使用旧的集中式数据库还是精美的分布式数据库,那么每个人都希望构建后者。如果您是SRE,并且我们开始谈论宠物和牛,那么您总是会投票给牛。如果我建议使用非分布式软件版本控制系统,您可能会嘲笑我。我听说,货币的未来是分布式分散式加密货币。如果您想击败审查制度,则需要一个分布式的社交网络。趋势很明显。有什么要辩论的?

好吧,实际的结构要比这复杂得多。我在这个主题上介绍的最好的入门文章是JoFreeman的《无组织的暴政》,其中包括著名的名言:"这种明显的缺乏结构性常常掩盖了非正式的,未经承认的和不负责任的领导,而这种领导由于其本身的存在而更加有害。被拒绝。"

"非正式,未经承认和不负责任的领导"就像人类社会系统中一样常见的分布式计算系统。

事实是,几乎所有设计无层次,扁平的控制系统的尝试都只会移动中央控制,直到您看不到它为止。人的结构都有领导者,无论是隐性的还是显性的,而且显性的领导者往往更加多样化。

该网络取决于集中控制的DNS和TLS证书颁发者;全球互联网依赖于解决路由问题的小集团。每个区块链系统都取决于谁决定本周偏好的链是否分叉,谁经营受欢迎的交易所,以及谁决定是否逮捕这些人。分布式无线电网络取决于中央政府频谱许可证。民主取决于行使您的投票权的人。资本主义有赖于某人强化“自由”的基本规则。市场。

在我的第一家初创公司中,我们试图将开发团队作为一个扁平组织来运作,在这里,每个人都听取了所有人的意见,每个人都可以辩论采取最佳行动方式。总体共识是我们成功了。但是我永远不会忘记我以前的一位同事之后对我说的话:"我们的团队感到平淡而平等。但是您永远不会忘记那只是那样,因为您强迫它就那样了。"

确实存在分布式系统。地球的生态系统也许就是其中之一(尽管它变得越来越脆弱,并且依赖于人类不破坏它)。尽管通常很慢,但使用Raftconsensus或类似算法的分布式数据库确实存在并且可以工作。分布式版本控制(例如git)实际上是分布式的,尽管讽刺的是最终还是通过类似Github的方式将其使用重新集中化。

CAP定理可能是分布式控制系统中折衷,一致性,可用性和“分区容限”之间最折衷的说法。通常,我们认为CAP定理适用于数据库,但实际上适用于所有分布式系统。集中式数据库在一致性和可用性方面做得很好,但是在分区容忍度上却很烂;威权政府结构也是如此。

在系统设计中,很少有适用于任何地方的正确答案。但是对于集中式系统还是分布式系统,我的经验法则是准确执行Jo Freeman的建议:至少确保控制结构明确。明确显示后,您可以对其进行调试。

原型系统的另一个设计问题是“鸡-蛋问题”,它的简称:鸡还是蛋?

如果您来自哪里不是一个普遍的问题,那么主意就是鸡蛋生产鸡肉,而鸡肉生产鸡蛋。出发后一切都很好,但是发生在远古的历史上呢?第一次迭代的第一步是鸡蛋还是鸡肉?

这个问题起初听起来很愚蠢和虚假的,但是有一个面面俱到的答案,这个答案特别适用于商业世界中的实际问题。

谜语的字面答案是“都不是”。除非您是圣经文字学家,否则您实际上无法追溯到放置原始鸡蛋的原始鸡肉。取而代之的可能是一只像鸡的鸟,上面放着一个鸡蛋般的卵,而在此之前,它已经进化了数百万年,一直回到单细胞生物,而首先出现的现象却是这种生物。首先是什么?所有其他的东西。

在构建软件或发布产品时,鸡蛋问题一直存在。 HTML5 Web浏览器或HTML5 Web内容哪个先出现?它们以松散同步的方式发展,从HTML本身之前的方式追溯,然后缓慢增长,然后迅速流行。

我之所以提到鸡蛋问题,是因为设计师对它们一无所知。以下是一些著名的鸡蛋问题:

鸡肉技术或产品的定义特征是,除非其他人也使用它,否则它对您没有用。由于采用新技术不是免费的(以美元,时间或两者兼而有之),因此除非人们看到了某些价值,否则人们不太可能采用新技术,但是直到他们看到了价值,才有可能。他们不这样做。一个难题。

对于我来说,真的很了不起,有很多梦想家认为他们可以解决这个问题(最终会赶上这个问题!),或者超过这个问题(我的新手机操作系统会解决这个问题)太好了,我们只会补贴几百万部手机)。而且有很多人认为克服鸡蛋问题真是倒霉。

但不是!就像真鸡和真蛋一样,有一种方法可以通过从较小的物体中引导来实现。主要技术是降低采用成本,并在用户较少的情况下提供更大的价值。

视频游戏机制造商(任天堂,索尼,微软)在这方面已经相当出色。他们是我所知道的唯一每隔几年就故意这样做的人。他们使用的一些技巧是:

向后兼容较旧的游戏机,因此购买该产品的人甚至可以在拥有许多本机内容之前就可以使用它。

从一代到下一代的兼容游戏手柄,因此开发人员可以更轻松地移植旧游戏。

独家发行标题:共同营销,可确保为消费者(新游戏!)和内容制作者提供先期价值(补贴,免费营销,起初价格较高)。

相比之下,让我最生气的设计是绝对忽略了鸡蛋问题的设计。 Firefox和Ubuntu手机,分布式开源社交网络,替代应用商店,桌面Linux,Netflix竞争对手。

这本日记的追随者已经对IPv6充满了兴趣:直到100%部署它为止,它几乎对任何人都没有价值(因此我们最终可以关闭IPv4!),但是却立即增加了复杂性和维护成本(构建和运行整个并行Internet) )。如果设计人员优先考虑消除鸡肉问题,是否可以更快地推出IPv6?绝对没错。但是他们没有意识到这是设计问题的绝对核心,就像Android,Xbox,蓝光和Facebook一样。

如果您的产品或公司遇到鸡蛋问题,而您又不能清楚地阐明解决问题的具体计划,那么投资者绝对不应该投资于您的公司。解决鸡蛋问题应该是清单上的第一件事,而不是事后的想法。

顺便说一句,虽然我们在这里,但是还有更多的高级蛋问题。 Facebook或传真是基本形式:使用Facebook或拥有传真机的人越多,彼此之间获得的所有价值就越高。

下一个升级是双向市场,例如Uber或Ebay。除非有司机,否则没人能从Uber搭车。但是除非得到工作,否则司机不想为Uber工作。优步必须吸引两种类型的用户(更糟糕的是:在同一地区!一天中的同一时间!),然后再从这两种类型的交易中脱颖而出。这很难。尽管Uber谨慎地一次只在少数几个市场,尤其是刚开始的时候,他们还是决定花自己的方式成功。

我所知道的最困难的层面是三方市场。例如,UberEats将消费者,驾驶员和饭店联系起来。进行三方市场滚动非常复杂,昂贵且容易失败。我永远不会自己尝试,所以给尝试的人留下了深刻的印象.UberEats具有领先优势,因为Uber至少已经在其网络中拥有了消费者和驱动程序,只需要再增加一个方面就可以了。 ;到他们的市场。他们的大多数竞争对手都只是为了吸引所有三个方面。哇

如果您要建立一个单边,两边或三边市场,则可以更好地了解系统设计,鸡肉和鸡蛋。

绕开业务问题,让我们继续探讨工程师更直接体验的系统问题:第二系统效果,这个术语来自Fred Brooks的出色著作The MythicalMan-Month。

初始产品从小规模开始,然后以较低的预算开始逐步构建。

该系统不断发展,越来越多的黑客入侵,早期的设计折衷开始成为瓶颈。

工程师们想出了一个新的设计,可以解决我们所知道的所有错误,以及更多的错误! (他们可能是正确的。)

由于该产品已经很受欢迎,因此很容易证明花时间在这次正确的事情上是合理的。并在接下来的10年中建立一个强大的平台。因此,启动了一个项目以从头开始重写所有内容。预计将需要至少几个月,甚至几年的时间,以及一支庞大的工程团队。

听起来有点熟?早在1975年撰写本书时,人们就在尝试这种方法,而现在仍在尝试。它很少起作用。即使它确实起作用,也非常痛苦。

在这本书问世25年之后,乔尔·斯波斯基(Joel Spolsky)写了《你永远不应该做的事情》,这是关于Netscape / Mozilla尝试这样做的公司毁灭性影响的一部分。从头开始重写代码。"

第二个系统效果的其他示例是IPv6,Python 3,Perl 6,Plan9 OS和美国政府系统。

新设计通常确实可以解决原始设计中的体系结构问题。但是,它出乎意料地产生了最初所没有的新体系结构问题。

随着项目的逾期越来越多,即使用户仍然偏爱旧系统,项目经理也越来越有可能关闭旧系统以迫使用户切换到新系统。

第二系统可能仅仅是昂贵的,或者它们可能会使您的公司破产或破坏您的用户社区。对Perl 6的关注严重削弱了Perl的进展;关于Python 3的工作使python社区破裂了十多年(并且至今还在);尽管25年来,IPv6被创建用来解决问题,但IPv6仍顽固地仍在尝试弃用IPv4。

至于解决方案,除了要尽最大努力防止这种情况发生外,对于第二种系统效果没有什么可说的。它完全是自我强加的。改为重构您的代码。即使似乎渐进主义会更有效……这还是值得的。

在书中,弗雷德·布鲁克斯(Fred Brooks)称其为“第二”。有目的的系统,因为他认为在经历了这个错误之后,任何设计师都将逐步构建他们的第三个及以后的系统,这样他们就不必再经历了。如果您足够乐于学习历史智慧,那么即使您的第二系统也不会受此困扰。

问题的一个更令人尴尬的相关脚注是,大公司试图为自己的第一个系统构建替代产品,但是第一个系统的开发人员已经离开或已经学会了“第二个系统”,并且不愿意玩这种游戏。这样,一个全新的团队就被组装起来以制造替代产品,而没有建立第一个替代产品的经验,但是拥有一组对表面缺陷有丰富经验的用户的信心。我什至不知道该现象应该叫什么。替代性第二系统效应?无论如何,如果您发现自己正在构建或使用这样的产品,我将会为之哀悼。您可以期待多年的痛苦。

让我们改变步伐,谈论对您的创业公司实际上是好消息的系统设计问题,尽管通常对大公司来说是个坏消息。 《创新者的困境》是克莱顿·克里斯滕森(Clayton Christensen)的一本很棒的书,其中讨论了一个非常有趣的现象。

创新者的困境是如此优雅和美丽,您几乎无法相信它们以如此可重复的抽象形式存在。通过关于AppleSilicon的Anandtech文章,这是我最新的消息:

出现了一些糟糕的初创公司(在这种情况下为ARM),并且制造了糟糕的规格竞争产品。 他们似乎唯一想要的就是可以廉价地制造一些低端垃圾。 作为一家成功的大型公司,您的整个业务都经过优化以提高利润和利润。 您的勤奋员工意识到,如果他们仅将市场的超低端垃圾部分让给该竞争对手,他们将有更多时间花在高价值客户身上。 作为奖励,我们的平均保证金会提高! 天才。 明年,您竞争对手的产品会变得更好一点,并且您放弃了市场的新低点,而利润和利润 ......