原文:https://livebook.manning.com/...
译:祝坤荣

fb543da4d0da6b785bb5120e98e52bff.jpeg
bt3gl ♡图片: https://www.pexels.com/zh-cn/...

1.3.4 拥抱复杂与模糊

复杂性很可怕,模糊不清更可怕,因为你不知道你要被吓到什么程度会更吓人。

处理模糊性是微软招聘时核心技能的问题之一。经常有一些假设性的问题如“在纽约有多少小提琴维修商店?”“洛杉矶有多少加油站?”或者“总统有多少特工,他们的排班表是?列出他们的名字,在图中指出他们从白宫经过的可能路线”

解决这些问题的技巧最后会变成澄清所有你知道的部分并基于这些事实到达最终目标。比如,你可以从纽约的人口和多少人口可能会玩小提琴。这能帮你理清市场的大小和市场能支持多少竞争。

同样的,当面对一个有许多未知参数的问题,比如估算开发一个特性需要多少时间时,你也可以基于你知道的来缩小近似窗口。你可以用自己了解的做为优势并尽量用,这样能将模糊性减少。

有意思的是,处理复杂性也是一样的。一些看起来极端复杂的东西也可以通过分而治之的方式变成可控,然后变得更简单。

你越清楚,就越能处理未知。在这本书中学习的技巧可以帮你搞清楚类似的东西并让你在处理模糊性和复杂性时更有信心。

1.4 现代软件开发的问题

除了持续增加的复杂性,数不清的抽象层和现代栈溢出,现在软件开发也有其他的问题:

  • 有太多技术:太多的编程语言,太多框架,太多库,想想npm(node.js框架的包管理工具)有一个库叫”left-pad”来处理给字符串结束加空格。
  • 它是范例驱动的,因此很保守。许多程序员认为编程语言,最佳实践,设计模式,算法和数据结构是外星种族的遗产,不知道它们是怎么工作的。
  • 技术开始变得不透明,就像汽车。人们曾经可以修理他们自己的车子。现在随着引擎变得更加高级,我们能看到的只有金属外壳,就像法老墓会诅咒任何打开了它的人。软件开发技术也没有不同。尽管现在大多数东西都是开源的,我想新技术仍然比从1990年的二进制代码的逆向工程更复杂,正是由于软件持续增加的复杂性。
  • 人们不关心他们代码的开销,因为我们有更多的资源。你写过一个新的简单聊天应用吗?你知道把它与全功能的浏览器绑在一起可以节省你的时间并且没人会关注你用了GB级的内存,那么为什么不呢?
  • 程序员关注他们自己的栈并且忽视其他工作,这很合理:他们要端菜上桌,没时间学习了。我叫这个“上菜开发者问题”。许多事情会影响产品的质量的内容会由于他们自身的局限出现。一个web开发人员通常对于网络协议在下面是如何工作的完全不了解。他们接受加载页面的延迟并接受现状,因为他们不知道一个小技术细节,一个不必要的长证书链很降低网页的加载速度。
  • 感谢我们学过的编程范式,对于低级工作有个鄙视链,比如不要重复你自己或复制黏贴。你期望找到一种DRY解决方案。这种文化导致你质疑自己和自己的能力并最终损害你的生产力。

关于NPM和Left-pad的故事
过去十年npm已经成为了JavaScript库的包生态系统。人们可以将他们自己的包贡献给生态系统,其他包可以使用它们,让开发大型项目更简单。Azer Koculu是其中的开发者。Left-pad只是他贡献给npm生态的250个包中的一个。它只有一个功能:给字符串加上空格保证它一直是一个合适的大小。

一天,他收到了一封npm的邮件告诉他由于一家同名公司的抱怨,它们移除了他的一个叫“Kik”的包。npm决定移除Azer的包并把名字给那家公司。这让Azer很恼火,并移除了所有他贡献的包,包括left-pad。所以问题是,上百个大型项目直接或间接依赖了这个包。他的动作导致所有这些项目停工。这个灾难给我们上了关于对平台新人的一课。

故事告诉我们生活的路上充满了吓人的惊喜。

在这本书,我提供了这些问题的一些解决方案,包括复习一些你可能觉得很无聊的核心概念,优先考虑实用性,简单性,拒绝一些固有的不可质疑的信念,更重要的是,质疑我们做的一切。先问问题是很有价值的。


本文来自祝坤荣(时序)的微信公众号「麦芽面包」,公众号id「darkjune_think」

开发者/科幻爱好者/硬核主机玩家/业余翻译
转载请注明。

微博:祝坤荣
B站: https://space.bilibili.com/23...

交流Email: zhukunrong@yeah.net


祝坤荣
1k 声望1.5k 粉丝

科幻影迷,书虫,硬核玩家,译者