什么是第一性原理
如果你想做一些真正的创新,你必须应用一种第一性原理的分析,不要用类比来推理。类比是指对过去的参考。第一性原理意味着,你看一下事物最基本的原理在一个特定的领域,从那些几乎无可争议的真理中推理出一个结论。如果你看到这个结论是与人们普遍相信的东西不一致的,那么你就有机会了
If you want to do something really innovative, you have to apply a sort of first principles analysis, not and don't don't reason by analogy. Analogies are referencing the past. So first principles means you look at the most fundamental truths in a particular area and the things that really are almost indisputably correct and you reason up from there to a conclusion.And if you see that conclusion is at odds with what people generally believe then you have an opportunity.
这是埃隆马斯克在某次采访中所说的原话,这里面讲了他对第一性原理的理解。很多人可能会误以为第一性原理是马斯克提出的,其实不是,只是他在近几年重新带火了这个概念。
通俗地理解来说,第一性原理就是倡导探究事物本质,回归那些几乎不可动摇的基本原则,以此来得出新的结论或者完整地理解一个事物的原理或解决某个问题。
把它与”比较思维“对比会更好理解,我们大多数人当遇到一个问题时,往往下意识会去想有没有过类似的案例可供参考,而此时这种思维会大大局限住我们解决问题的思路,从而可能错失很多创新的机会。
为什么需要第一性原理
- 真正做到从根本上解决问题,而不是留下隐患
- 透过具体问题去理解事物本质,从而做到可以举一反三
- 有利于构建知识体系,将知识点形成网络
接下来我将围绕近期遇到的一个技术问题展开,讲述我的一次第一性原理实践,也就是如何在实际生活中运用第一性原理进行思考。
一次问题解决的场景还原
背景是朋友给我发了这两张截图,问我这个14.6.1的包怎么删掉,因为已经安装了12.10.1的包,担心14.6.1这个安装包会额外占用服务器的空间。
他已经尝试过了上图这种解决方式,但根据提示可以看出这会将已经安装的gitlab-ce包进行删除,这不是他想要的。
也尝试过上图这样的操作 ,但根据提示可以发现删除并没有生效,因为提示命令参数错误。
于是我开始在谷歌搜索yum delete remove,经过几个结果的查看,找到一个相对靠谱的解决方案。如下图
这里面给了一个很重要的提示,就是如果你想删除指定版本的包,在使用yum uninstall命令指定包名时,CPU架构参数要放在最后,但依照这种方式尝试后结果如下图
两种方式皆无果
那么问题又回到原点,究竟要怎么删掉14.6.1这个包呢。
我又使用谷歌对问题关键词的各种排列组合进行搜索,包括”yum remove pkg version“等等。翻了几个搜索结果后,感觉产生帮助的信息并不多。于是我开始重新观察朋友发给我的截图
我开始好奇这幅图里能传达给我什么信息。首先是展示出这些信息的命令yum list。
我随即去谷歌查找yum list,在结果中发现了redhat官方的cheat sheet,先了解了一下yum可用命令的全貌,然后着重看了下list、info、search、install、update、reinstall、erase、remove和autoremove这几个命令。
接着我把焦点放在了erase、remove和autoremove这三个命令上(其实这时候由于忽略了list命令中关键的信息——avaiable和installed,从而错过一次发现真相的机会)
remove和erase没什么问题,看上去是同样功能的两个命令,可能是alias关系。然后是autoremove,这个看上去好像是个很智能的高级命令,在删除包时,yum貌似会自行分析该包的关联包一并删除。但随即想了一下,好像也不太符合我的场景,因为我们的gitlab-ce就是一个单纯的安装包,并无其他关联包。
问题至此仍没有什么进展,我决定把问题降一个纬度去研究,先去了解一下yum,
在查询这个条目前我也大概知道yum是做什么的,只不过经过这次搜索,有了更清晰的认识。yum是Red Hat(linux的一种发行版)的包管理器,仅此而已。
参考链接:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-yum
然后我在yum官方文档中看到了这样一节内容,它解释了命令输出信息中每列所表示的含义。从而得知x86_64表示包所适合的CPU架构,而包版本号由点号(.)分割为两部分,前面的数字表示包的版本号,后面的数字则表示发布标识,二者联合起来可以唯一表示一个包的某个发行版。而展示信息的最后一列表示包所在的位置,这个信息对我有所启发,我立刻回去重看朋友提供给我的图。
这里面为什么一个是@System,一个是gitlab-ce,此时我感觉发现了新线索。同时我还通过对比,开始好奇为什么上面的包在Installed Packages下,而14.6.1在Available Packages,这两种类型是什么意思。
我随即在谷歌中搜索yum available packages关键词
搜索结果中有些是我刚才访问过的链接,同时我重新翻看刚才找到的一些官方文档,包括下图
avaiable这个词我在前面的各个截图和搜索结果里都有一闪而过地看到过,但没留意,现在我开始把焦点指向它,我开始思考它究竟是什么含义。然后我又重新看了一开始的那个图
这里面的@System很明显是表示12.10.1这个包已经安装到当前机器,那14.6.1所在的gitlab-ce呢,很明显不是机器上的一个路径标识,而且它在Avaiable Packages下。于是我同一时刻串联起前面查找的所有有效信息,从而得出以下结论:
Avaiable Packages表示可用包,而这个可用并不意味着这个包在当前机器上,它可能是在远程仓库,只是它可用而已。这就像前端使用的npm包也会分为项目的node_modules、当前机器的node_modules和远程仓库;Java的包管理器Maven的配置文件pom.xml的解析规则也是先从本机仓库查找依赖包,如果找不到最后会去Maven远程的公共源中查找包。
看起来包管理机制在各个领域的用法似乎都是相通的,于是我瞬间豁然开朗,真相就是我们一直在苦苦追寻想删除的14.16.1,它根本就不存在于我们的机器,那还谈何删除呢。
至此,整个问题得到了满意的答案,我也通过这个问题的研究过程实践了第一性原理,通过将问题降维至元问题,比如这个问题中想要使用yum删除某个特定的包,先去了解yum到底是什么,yum的相关命令又都是什么作用,怎么工作的。也许不需要对每个知识点都深入了解,但要在整个分析过程中对所涉及的概念保持清晰的理解,而不是盲人摸象。
有时候有些问题放到具体场景里,就会很难找到问题的真实原因,因为问题会被千差万别的场景所包裹。如果你直接拿着带有场景描述的关键词去搜索,可能会导致你离正确答案越来越远。比如你不应该直接搜索”如何使用yum remove删除指定版本的包“,这样的描述会把搜索结果圈定在一个很小的范围,因为你给了太多了场景描述,这可能会将真正对你有帮助的信息拒之门外。
另外,别担心对于搜索问题中所涉及到的一些元概念学习所花费的时间,比如这里我单独去搜索yum和yum list。这些都是问题最基本的元素,我在这个问题中学习了这些概念,可能日后遇到其他有关yum安装包的问题时,我可以很快的找到原因而无需进行太多的搜索,这是因为我对yum这个事物有了很深的了解。
这也是运用第一性原理的魅力所在,因为它将所有的问题打回原形,追本溯源,通过将问题拆解成一个一个元素,以此来理解整个问题,因此达到以一敌百的效果。也就是因为解决一个问题,从而大大节省了日后解决同类问题的时间,从而大大提高学习知识的速度。因为我们每次遇到的问题都是由一些基本问题或基本元素所组成的,而这些元素大多数都会存在交集。
举个例子,你在解决一个计算机问题时,由于这个问题牵扯到一个物理知识,你为了理解这个问题而去了解了这个物理知识点,这样日后你在遇到某个和该知识点有关的问题出现时,就会更加容易理解。比如某个生物问题,其核心最后也关联到了这个物理知识,这样你便会逐渐形成属于自己的知识网络,从而建立起对这个世界更完整的认知。
总结——如何运用第一性原理
面对问题,先停下来,冷静思考,问题究竟是什么。
比如这里,问题是“如何删除指定版本的包“吗?不是。如果沿着这个思路去查解决办法,一定是越走越远。时间花了很多,但对问题的解决没有任何帮助,或者说帮助很小。因为这里你根本就在试图解决一个不存在的问题。
因此就需要我们运用第一性原理去拆解这个问题,问题看似是要删除某个指定版本的包,但首先我们需要了解yum是什么,yum list列出的是什么,yum list展示出的内容包含哪些信息以及gitlab-ce是什么。
yum是Red Hat(linux的一种发行版)的包管理器,可用于查询可用包信息、从仓库获取包、安装/卸载、更新包等功能。yum list是用于列举已安装包
和可用包
的yum命令选项。但这些还仅是针对于特定问题的第一性原理运用方式,如果要应对更多更通用的问题该怎么解决呢。我这里列举一些适用于研究各种问题的第一性原理技巧。
1)使用搜索引擎
搜索引擎大家都会用,不就百度吗,但每个人使用搜索引擎真正解决问题的效率可谓天差地别。这里我们直接说结论,怎样才算是符合第一性原理地使用搜索引擎呢。首先就是搜索引擎的搜索范围要足够”大“,也就是使用谷歌。因为不同的搜索引擎在查找内容时,搜索范围其实是不一样的,你可以理解为不同的池子,比如abcd...。假如你想要的答案在z池子里,而百度的搜索范围却只包含abcde,那你可能永远都找不到想要的答案。
而我们常用的搜索引擎有哪些呢,在国内环境下,不同的浏览器厂商可能会默认绑定自家的搜索引擎,比如搜狗、360。如果你用Window自带的IE或Edge,默认的搜索引擎会是Bing(必应)。百度就不用多说了,大家都知道”百度一下,你就知道“,但是使用百度,你真的就能知道你想知道的吗?
对于学术或技术类的东西,很多时候放眼整个世界范围内各个圈子的讨论,谷歌肯定是比百度搜索到的范围要大很多,这就导致了一种”真知在海外“的怪象。所以如果你秉承第一性原理去研究一个东西时,如果可以,还是尽量使用谷歌来扩大你的搜索范围。
2)想好你搜索的关键词
搜索引擎是很强大的工具,但是能不能用好它也很关键,工具本身并不产生价值,而是使用者赋予了它价值。比如你在查一个问题时,不应该把问题的解决完全寄托于搜索引擎而失去自己对于问题的思考,否则工具能发挥的作用可能微乎其微。
比如当搜索一个问题时,如果你对这个问题中所涉及到的一些基本概念
很清晰,那你可以在此基础上去搜索相对具体的描述内容或场景。而如果你对问题中所涉及的基本概念不是很了解,盲目地输入具体问题描述,搜索出的结果很可能把你圈定在一个很小的范围,有时甚至会把”正确答案“过滤在外。