当我们在问题的泥潭里不可自拔的时候,当我们面临问题花费了大量之间不知所措的时候,这些时候你脑子的铃铛应该提醒你,是时候利用第一性原理重新审视你现在的麻烦,重新构造新的解决方案了。

第一性原理对于解决复杂的问题特别有用,因为它让你将一个问题分解成核心的元素,然后系统的从这些核心元素构建解决方案。这可能比试图用先入为主的概念或根据过去的经验对问题做出假设来解决问题更有效。

第一性原理的定义

第一性原理被主要应用在计算机科学,工程学和物理学,但它是可以应用到任何的行业的。本文主要讨论第一性原理在软件开发中的应用。

应用第一性原理大致有四个步骤:

1、识别你想要解决的问题

2、将问题分解成基本的部分

3、质疑和挑战你的假设

4、从头开始创建一个新的解决方案

第一性原理是什么?

第一性原理是你用来建立论点的出发点或者假设。第一性原理思维指的是将一个问题分解为基本部分,并按顺序研究每个部分,直到找到答案的过程。

第一原则思维不同于其他解决问题的技术,因为它让你专注于问题中最重要的元素,而不会被无关的细节或二手信息分散注意力。通过这种方法,你可以比直接跳过推理过程中的某些步骤更快速、更有自信地找到解决方案。

第一性原理思维是一种通过查看问题的根源来分析复杂问题的方法。

第一性原理的历史

第一性原理在哲学和科学的范畴里已经有非常悠久的历史了。它可以追溯到古希腊哲学家亚里士多德,他认为所有的知识和理解都必须源于第一性原理(基本原理)。在他的作品中,亚里士多德强调了从不言自明的真理或公理开始,并使用逻辑推理来推断更复杂的想法的重要性。

第一性原理的概念在现代科学和哲学思想的发展中继续具有巨大的影响。在17和18世纪,哲学家笛卡尔和伊曼努尔·康德也强调了从第一性原理开始,用理性来推导知识和理解的重要性。

在20世纪,物理学家理查德·费曼推广了费曼技术的使用,该技术包括将一个概念或问题分解为其基本原理,以便更好地理解和解决它。

马斯克在创建特斯拉时也使用了第一性原理思维。在那个时候,电池很贵,而且不能充太多电。当考虑用什么来制造电池时,马斯克使用第一性原理思考了为什么电池这么贵。马斯克认为电动汽车会比汽油便宜。一个巨大的发电站一定是比小型内燃机更有效的发电方式。马斯克建立了巨大的千兆级工厂,以降低电池成本。

第一性原理思维的另外一个例子是Space X和降低太空火箭的成本。马斯克认为,太空火箭的巨大成本是它们只能使用一次,而Space X制造的可重复使用的火箭可以安全着陆并再次使用。

马斯克与第一性原理

在软件开发中,你也可以用4步来解决你面临的问题。这个问题可能是需求问题,产品设计问题,技术解决方案以及bug错误等。

第一性原理的四个步骤

第一步:识别你要解决的问题并将问题分解成基本的部分

第一性原理思维首先要确定问题中最重要的部分,然后将它们分解成它们的组成部分。

识别你问题中最重要的部分;

将每一个部分分解成它自己的组件部分,然后识别每一部分和整体之间的关系;

重复上两步的过程,直到你把所有东西都分解了。

识别问题并分解成基本部分

第二步:问“为什么”

一旦你把问题分解成各个组成部分,就该问“为什么”了。问“五次为什么”是一种很有用的方法,可以从源头上找到问题或结果的根本原因。当你每次都问“为什么”,并不断深入挖掘,你最终可以找到任何问题或结果的核心——即使看起来有多种原因在起作用。

我们看一个例子:假设你的程序崩溃了:

  • 为什么?因为API停止接受请求。

  • 为什么?因为最新的部署在应用程序启动时导致了死锁。

  • 为什么?因为生产环境比测试环境有更多的并发请求,并且使用了非线程安全的数据结构。

  • 为什么?在开发过程中并没有考虑到这一点。所有测试都通过了。

  • 为什么?自动化测试不包括任何高吞吐量场景。

第三步:挑战自己的假设

假设是构建解决方案的基础。它们可能是对的,也可能是错的,但它们总是基于你在此时此刻知道是正确的事实。如果你的假设是正确的,那么它们应该会引导你找到一个好的解决方案;如果他们是不正确的,那么他们可能会导致后续可怕的后果。

挑战假设

当一个满怀希望的假设被证明是错误的时候,代码需要更改,依赖或与它的所有内容也可能需要更改。

我们通过第一性原理思维对我们的软件开发中的假设提出质疑和挑战:我们的商业目标和目的到底是什么?而不是仅仅是需求,因为很多需求是错误的或者是有信息丢失的。

需求是常见的假设领域,对需求的假设一般出现在边缘场景(特殊的情况)。

边缘情况占总可用性的20%,却承担实现复杂性的80%。对于系统的可操作性来说,边缘情况通常不是必需的,但它们确实对用户体验有很大影响。

在早期“最小可行性产品”的发布范围塑造和功能优先级划分过程中,把边缘情况留到下一个实现阶段可能会让你的应用的发布速度加快好几周。

假设主要有下面的分类:

a)对市场的假设;

b)对问题的假设;

c)对解决方案的假设;

d)对人的假设。

一些假设的例子,比如:

  • 假设某人制定的计划是好的,并且考虑到了一切;

  • 假设某个解决方案所需的规模;

  • 假设先前的文档是一个可以复制的好模板

  • 假设一个人知道他们自己在说什么

  • 假设bug不在某个特定区域

  • 假设是绕过思考,我们假设别人已经为我们做了所有的思考,而我们不需要。

第四步:专注于你的目标,并从头开始创造一个新的解决方案

下一步就是专注于你的目标。第一步是确定问题,第二步是收集信息,了解解决问题需要做些什么。现在是你需要把注意力集中在解决问题的最终结果上的时候了。

在实践中意味着:

  • 不要被细节分心,除非它们与解决你的问题和实现你的目标有关;

  • 专注于实现这些目标,不要担心过程中会发生什么。

在软件开发中的应用

第一性原理思维可以在几个方面帮助软件开发。使用本方法的一些具体好处包括:

  • 通过将问题分解为基本原则并确定关键需求和目标,有助于阐明软件要解决的问题或挑战。

  • 它通过使用确定的原则来指导技术、架构和设计模式的选择,为做出明智的设计和开发决策提供了基础。

  • 通过使用这些原则来评估解决方案的健壮性和有效性,有助于识别和解决对问题理解中的差距或不一致。

我们通过两个例子来应用第一性原理:

1、设计一个电商应用

产品问题:

  • 用户为什么需要这个应用程序?快速找到并购买他们需要的商品。

  • 为什么他们需要我们减少结帐过程中的步骤?他们想节省时间。一键结帐可能会有所帮助。

  • 为什么他们需要我们来支持评论?这有助于他们对所购买的商品建立信任,并帮助他们更快地决定购买。

软件工程问题:

  • 实现功能的最低要求是什么?一个搜索框,能够过滤结果和产品页面的方法,分类页面以及一个结帐方法。

  • 我们可以使用哪些技术来建造它?这个电商平台已经有了一个用于搜索、过滤和显示结果的API。也许一个CSS+JS的基本UI就足够了。

  • 我们的用户如何相互交互?他们可以留下商品下评论,系统中的每个人都可以看到这些评论。我们可能需要支持创建/管理评论。

2、设计一个社交应用

问题:

  • 用户为什么需要这个应用程序?用户希望找到其他有类似兴趣的人,然后与他们联系。他们可以搜索个人资料,阅读个人的公开信息,并在个人资料上发表评论。

  • 为什么用户之间需要交互?他们想要在他们的个人资料页面上发送信息或留下评论。

  • 我们的数据模型是什么?用户有个人资料,他们可以向他们的个人资料中添加照片。我们将如何在系统中表示用户?一个用户将有一个名字,一个电子邮件地址(我们可以用来发送消息),以及一些其他基本信息,如年龄或性别。

结语

第一性原理可以应用到软件开发的每一个环节面临的问题,不限于需求问题,产品设计问题,技术解决方案以及bug错误等。

当我们在问题的泥潭里不可自拔的时候,当我们面临问题花费了大量之间不知所措的时候,这些时候你脑子的铃铛应该提醒你,是时候利用第一性原理重新审视你现在的麻烦,重新构造新的解决方案了。

参考资料:

https://addyosmani.com/blog/first-principles-thinking-software-engineers/

https://uxdesign.cc/8-first-principles-of-software-design-6f24ad1590b9

https://itnext.io/first-principles-thinking-in-software-development-b0450447aa67

https://www.theengineeringmanager.com/growth/first-principles-and-asking-why/

文章出自:爱科学的卫斯理,如有转载本文请联系爱科学的卫斯理今日头条号。

责任编辑:武晓燕来源: 今日头条