极客时间已完结课程限时免费阅读

开篇词 | 掌握软件开发技术的第一性原理

开篇词 | 掌握软件开发技术的第一性原理-极客时间

开篇词 | 掌握软件开发技术的第一性原理

讲述:李智慧

时长10:27大小9.57M

计算机软件开发是一个日新月异的领域,几乎每天都有新的技术诞生。每隔几年,软件开发领域就会进行一次大的技术潮流变换,所以身处其中的软件开发技术人员也常常疲于奔命,不断学习各种新知识、新技术,生怕被这个快速变革的时代所抛弃。
但是每次从头开始学习一个新的技术,这个过程既痛苦又漫长,好不容易掌握得差不多了,新的技术又出现了,于是不断重复从入门到放弃这一过程。这个过程是如此痛苦、艰难,以至于整个行业形成了一种所谓的“共识”:随着学习能力和体力精力的下降,编程知识和技能逐渐衰退,35 岁以后就不能写代码了。
其实很多看起来难以坚持、让人容易放弃的事情,并不是智力、体力或者意志力的问题,更多的是方法问题。很多时候,学习新知识和新技术之所以困难,是因为没有理解这些新技术背后的思想和原理,以及这些新技术诞生的来源。太阳底下没有新鲜事,绝大多数新技术其实都脱胎于一些既有的技术体系。
如果你能建立起这套技术思维体系,掌握这套技术体系背后的原理,那么当你接触一个新技术的时候,就可以快速把握住这个新技术的本质特征和思路方法,然后用你的技术思维体系快速推导出这个新技术是如何实现的。这个时候你其实不需要去学习这个新技术了,而是去验证这个新技术,你会去看它的文档和代码,去验证它是不是和你推导、猜测的实现方式一致,而不是去学习它怎么用了。那么,学习一个新技术就变成了一个简单、轻松、快速且充满乐趣的过程了。你不再惧怕学习新技术,而是开始抱怨:为什么技术革新得这么慢,太无聊了。你甚至可以开始自己创造新技术。

第一性原理——建立技术体系的起点

那么如何实现这一美好的愿景,建立自己的技术思维体系呢?
物理学有一个第一性原理, 指的是根据一些最基本的物理学常量,从头进行物理学的推导,进而得到整个物理学体系。有硅谷钢铁侠之称的埃隆·马斯克特别推崇第一性原理,他做电动汽车、做航空火箭,并没有去遵从别人的老路,而是从这个产品最本质的需求和实现原理出发,重新设计了产品最核心的关键以及发展路径,进而开发出自己独特创新的产品。Google 的创始人拉里·佩奇说过:“让我自由地从物理规则出发去思考问题,而不是迎合那些所谓的世俗智慧。”其实也是第一性原理。
第一性原理就是让我们抓住事物最本质的特征原理,依据事物本身的规律,去推导、分析、演绎事物的各种变化规律,进而洞悉事物在各种具体场景下的表现形式,而不是追随事物的表面现象,生搬硬套各种所谓的规矩、经验和技巧,以至于在各种纷繁复杂的冲突和纠结中迷失了方向。
软件开发技术也是非常庞杂的,各种基础技术,各种编程语言,各种工具框架,各种设计模式,各种架构方法,很容易让人觉得无所适从。就算下定决心要从基础学起,上来一本厚厚的《操作系统原理》,好不容易咬牙坚持学完,回头一看,还是各种迷茫,不知道在讲什么。继续学下去,再来一套更厚的《TCP/IP 详解》,彻底耗尽了意志力和兴趣,完全放弃。
其实,我们不需要一开始就精通操作系统进程调度的各种算法,也不需要上来就掌握 TCP/IP 协议里的各种帧格式。我们应该从软件技术的第一性原理出发,了解每个基础技术方向那些最关键的技术原理,明白这些原理是如何和我们日常开发工作发生关系的。
比如我们的程序是如何被操作系统调度执行的?为什么高并发的时候系统会崩溃,原理是什么?在编程时,什么场合下应该使用链表,什么场合下应该使用数组,为什么?当我们使用 Hash 表的时候,什么情况下它的性能会急剧降低,原理又是什么?我们用 Redis 这样的分布式缓存的时候,到底要解决什么问题?分布式缓存是如何工作的?还有哪些技术看起来和 Redis 毫不相干,其实工作原理是一样的?
如果我们能把这些基本问题都回答清楚了,那么这些问题背后的核心技术原理也都理解了,我们就开始建立起自己的技术思维体系了。当有新的问题和技术出现,你就可以思考,这是属于哪个技术领域的?它的核心原理和哪个技术方案本质是一样的?
如果你掌握了软件开发技术的第一性原理,那么当你为了解决某个新问题,去学习和研究一个新技术的时候,就算遇到了知识的盲点,也可以快速定位到自己技术体系的具体位置,进一步阅读相关的书籍资料,这个时候也许你就会深入到操作系统的调度算法实现或者通信协议头信息的具体编码里,但是这时,你不会觉得枯燥无聊,也不会觉得迷茫无措,只会觉得原来如此,太有意思了,甚至觉得这其实可以实现得更好。

专栏如何帮你建立技术体系

我想从软件技术的第一性原理出发,写一写软件技术那些最基本的知识原理和知识体系。在这个专栏中,我对自己过去二十年软件编程生涯和业界的技术发展历史进行回顾总结,将软件知识技术体系分成软件的基础原理、软件的设计原理、架构的核心原理三个部分。
软件的基础原理主要是操作系统、数据结构、数据库原理等等,我会从一个常见的问题入手,直达这些基础技术最本质的原理,并覆盖这些基础技术的主要关键技术点,让你理解这些基础技术原理和你日常开发工作的关联关系,对这些基础技术有一个全新的认知。
在软件的设计原理里,我会讲述如何设计一个强大灵活,易复用,易维护的软件。在这个过程中,应该依赖哪些工具和方法,遵循哪些原则和思想,使用哪些模式和手段。如果软件只是实现功能,那么程序员就没有高下之分,软件也没有好坏之分,技术也就不会有进步。好的软件究竟好在哪里?如何自己也写出一个好的程序?我将在这个模块一一道来。
架构的核心原理围绕目前主要的互联网分布式架构以及大数据物联网架构进行剖析,分析这些架构背后的原理,它们都遵循了怎样的驱动力和设计思想,有哪些看似不同的技术其实原理是一样的,以及如何通过这些技术实现系统的高可用和高性能。
软件开发是一个实践性很强的活动,如果你只是学习技术,那么就是在纸上谈兵。只有将知识技能应用到工作实践中,才能真正体会到技术的关键点在哪里,才能分辨出哪些技术是真正有用的,哪些方法是花拳绣腿。但是公司不是你实践技术的实验室,怎样才能处理好工作中的各种关系,得到充分的授权和信任,在工作中实践自己的技术思想,并为公司创造更多价值,得到更多的晋升和发挥的空间,使自己的技术成长和职业发展进入互相促进的正向通道?我将会在第四模块,技术人的思维修炼和你分享一些这方面的方法和认知。
我在学习几何的时候,开始常常困扰于各种定理、推论,我觉得它们都很相似,以至于进行几何证明的时候,不知道该用哪个。后来我索性不去管这些定理和推论,而是直接从公理开始证明,虽然证明步骤长了一点,但是总归能证明出来。后来做的题多了,发现有些中间推导结果总是重复出现,打开书再学习,发现这些重复出现的中间结果就是各种定理、推论。这个时候我不去记这些定理,也能随心所欲去用它们了。
其实我学几何的这种方式就是第一性原理。第一性原理是一种思维方式,一种学习方式,一种围绕事物核心推动事物正确前进的做事方式。也许这个专栏讲到的很多知识技术你已经掌握,但是这些知识技术和软件技术最基本的原理的关系你也许不甚了解。它们从何而来,又将如何构建出新的技术?如果把这些关系和原理都理解透彻了,你会发现,日常开发用到的各种技术,你不但可以随心所欲地去使用,甚至可以重新创造。
如果说具体的技术是一朵花,那么技术思维体系就是一棵树,希望你跟随我的专栏,种下自己的技术思维体系之树,收获一树繁花。
在学习的路上,你有哪些建议或者心得体会呢?欢迎你分享在评论区,我会和你一起交流这些学习方法,也欢迎把这篇文章分享给你的朋友或者同事,一起交流一下吧!
分享给需要的人,Ta购买本课程,你将得18
生成海报并分享

赞 56

提建议

下一篇
01丨程序运行原理:程序是如何运行又是如何崩溃的?
 写留言

精选留言(36)

  • Archer-上源-嘿喵
    2019-11-18
    学习的第一性原理其实就是两个关键动机 「偷懒的专业化」和「灵活的抽象化」。我们之所以发明计算机就是为了可以在大批量重复计算中偷懒,发明专业性计算机。后来我们发现单一用途的计算机每次都要从头搭建于是为了灵活一点,抽象出程序语言,发明通用可编程计算机。后来在编程中自动化程度高了,又发现同样的问题。太自动化的程序不好调节,为了偷懒于是出现了模块化解耦编程,专业化又来了,就是分包分库,甚至高级语言。可是后来又发现各种分包分库中有很多重复动作,于是出现了重复动作的抽象打包,或者打包成函数或者打包成对象,这样编程起来又简单省事了。现在又进入专业性的时代,比如web应用的MVC框架,AI的神经网络框架...下一步估计又要抽象出各种框架的共性出现真正的元框架了吧...
    展开

    作者回复: 👍

    67
  • Y024
    2019-11-18
    查理·芒格认为:学习并不是追求更多的知识,而是要寻找更好的决策依据。这个更好的决策依据,就是那些经过广泛验证的原理和规律,称之为思维模型。第一性原理和芒格的思维模型很相似。

    作者回复: 👍

    共 2 条评论
    41
  • 无形
    2019-11-19
    李老师的专栏,买就对了,李老师大数据的专栏是我第一个看完的专栏,记得李老师的《大型网站架构》里的一句话,是事情成就了人,非常受用,也深有体会,正是因为有了一件件非常具有挑战性和技术难点的难题,在解决这些难题的过程中,才会不断成长和进步。基于事情成就人的观点,最近准备搞一个基于文件的高性能检索系统,涉及爬虫,数据的存储,倒排索引等,一方面能够用大量的数据考验技术,也能让自己在之前不曾涉及的具体的挑战面前去学习、思考技术的细节,探索问题的本质,在解决问题的过程中使自己进步,现在已经遇到了一些问题,老师的专栏来的正是时候👏👏👏
    展开

    作者回复: 👍

    共 4 条评论
    12
  • 胡鹏
    2019-11-20
    我今年九月份的时候,真正得出了第一性原理,过程是这样的: 五月份之前一直在思考怎么才能学的更快,一天晚上在阳台,听了一首电音曲《remember》,同时回忆起深度学习中,神经网络的逆向传播反馈更新权重的过程, 我认识到知识都是信息,信息是静态的,因为有我们都在时间的长河所以以为是动态的。于是我可以把学习定义为信心的 输入 以及 加工。接下来就需要解决两个问题,加工个输入,加工速度取决于大脑已有的信息(不知道的东西肯定无法加工),于是主要还是信息的输入。 这里问题就来了,信息输入大多都是别人自由的成果,针对于研究类的项目,就需要推理了(为了增加推理能力,我开始玩真人探案游戏了,《青台山疯人院》《永生大酒店》有人玩过没?),要想推理,必须的根据事物发展的规律,且已有一些基础信息才能完成推理。完了
    展开
    共 5 条评论
    7
  • 度衡
    2019-11-18
    前端路过,我有些逆潮流,我想具有全栈开发能力

    作者回复: 欢迎

    共 4 条评论
    6
  • 宋文杰
    2019-11-18
    上次看老师直播,就非常期待这门课,终于上线了!

    作者回复: 谢谢~

    6
  • Paul Shan
    2019-12-01
    获取新知识的途径分为两类,一类是归纳,一类是演绎。前者,有点像集邮,当年博物学就是这么发展起来的,进化论也是达尔文无数观察的集大成,物理学早期也是这样,天文学家第谷积累了大量第一手资料。第谷的助手开普勒,在此基础上,提出了行星运动的三大定律。牛顿在三大定律之上,提出了更为简洁深刻的万有引力定理。归纳法,容易操作,我们也经常使用。但如果要得出有用的结论,往往需要总结大量案例,费时耗力,而且不够聚焦,常人难以坚持,更无法穷尽。另外一种学习途径,就是演绎,从基本原理出发,推导出各种定理,构建一张有向图。图的节点是公理和定理,边是逻辑推导。遇到新的问题,先定义问题的基本元素,然后从公理和已知的定理出发,通过逻辑推导到新的问题,再找到答案,找到答案以后,这个问题就成为新的定理,成为解决其他问题的基石。欧几里德几何体系就是这样处理的,它由五个公理出发,遇到新的几何问题,就增加定义,让问题转化为公理和已知定理能解决的形式,然后解决问题,拓展整个定理体系。演绎法中,公理往往比较少,容易掌握,逻辑推导虽然复杂,但是一致性强,而且通用。但是,打造软件的演绎系统非常不易,软件是一门工程性很强的学科,重实践。在这个演绎系统中,选择哪些作为公理,那些作为定理,哪些作为推论,如何运用逻辑关系,都不是容易选择,期待李老师的精彩讲解。
    展开
    5
  • 探索无止境
    2019-11-19
    希望看到有一个深入推导的过程,这样就会非常精彩,而不是直接给出一个结论,期待

    作者回复: 我正是这样努力的。多交流,多指正~

    5
  • niuniu
    2019-11-19
    看到第一性原理,想到欧几里得的几何原本,从5个公设推导出整个古典几何理论,不过如果不借助一些中间结果,有些定理还是很难证明的。
    3
  • 老男孩
    2019-11-18
    时隔一年,智慧哥终于又上线了。看了开篇内容,我不由想起了一句话“授之于鱼不如授之于渔”。21世纪是一个技术爆炸的时代,软件技术更是日新月异。4G技术的应用开启了移动互联网时代。而5G的出现,将带给我们一个全新的未来——万物互联。也许就此开始一次新的工业革命!在这样一个背景下,身为老码农的我既高兴又焦虑。如何快速迭代技术?估计要付出非常人的努力。也许技术本身只是工具,智慧哥说的第一性原理才是技术大厦的根基。万变不离其宗,武侠小说中绝世高手所谓的手中无剑心中有剑,也许就是高手参悟了武学的第一性原理,所以手中拿什么都不重要了,只是工具而已。所以这个专栏很值得期待!
    展开

    作者回复: 🤗

    共 2 条评论
    3
  • Expif
    2020-12-01
    人再聪明,没有合适的方法也是一事无成。对,说的就是我,哈哈哈哈。
    2
  • 台风骆骆
    2019-12-04
    刚看完您的大数据专栏,很震憾,自己虽然看过不少大数据框架的源码,但是最重要的是思考这些框架本身的意义所在,以及所有这些大数据框架的共性和人性所在,同时在专栏里也听你说了很多做为技术人应该怎么去思考自己的人性,怎么样才能更好去发展自己的职业,以及怎么才能照着正常的路的,有一句很对,路只要走对了,就不怕远和难,受您的指导,受益菲浅,希望在这个专栏继续跟着您去感觉计算机这个有趣的领域。
    2
  • 丁丁历险记
    2019-11-20
    满世界的技术为业务服务论调。(当然,这是对的) 突然听到一个特别的声音 第一性原理思维方式。 卖点 收货个人技术树。 其实很多看起来难以坚持、让人容易放弃的事情,并不是智力、体力或者意志力的问题,更多的是方法问题。很多时候,学习新知识和新技术之所以困难,是因为没有理解这些新技术背后的思想和原理,以及这些新技术诞生的来源。太阳底下没有新鲜事,绝大多数新技术其实都脱胎于一些既有的技术体系。 如果你能建立起这套技术思维体系,掌握这套技术体系背后的原理,那么当你接触一个新技术的时候,就可以快速把握住这个新技术的本质特征和思路方法,然后用你的技术思维体系快速推导出这个新技术是如何实现的。这个时候你其实不需要去学习这个新技术了,而是去验证这个新技
    展开
    共 1 条评论
    2
  • William
    2019-11-19
    李老师有很多话,都被我在不同场合所引用,人如其名,充满智慧的内容

    作者回复: 🌹

    2
  • escray
    2020-09-15
    看完这篇专栏之后,仍然有一点疑惑,软件开发技术的第一性原理究竟是什么? 是老师将要在专栏里面介绍的基础(操作系统、数据结构、数据库原理)、设计(SOLID 原则)和架构(高可用、高性能、可扩展)么?我觉的这样说的话,可能有一些“零散”了,我总是觉的第一性原理应该是高度概括的。 在网络上看到一篇文章,将软件开发的第一性原理归纳了以下五个方面: 1. Proof that code works 2. Principle of least astonishment 3. Principle of least knowledge 4. Separation of concerns 5. Abstraction https://www.sargalias.com/blog/programming-first-principles-purpose-what-this-series-is-about/
    展开
    1
  • 赵春辉
    2020-04-17
    我高中学数学也是这样学,公式太多记不住,每次都是自己推导公式。 不过后来发现考试的时候这样效率太低……
    共 2 条评论
    1
  • Geek_664d31
    2019-12-19
    我是这样理解智慧老师的课程的:学习一件东西不仅要学会怎么做,还要要猜想,推理,验证为什么是这样的,而猜想推理验证是基于我们的知识体系的。我们要在学习中,不仅学会怎么做,还要去构建这个体系。关于这个体系智慧老师给了三个方面:软件的基础原理、软件的设计原理、架构的核心原理。 软件的基础原理:操作系统、数据结构、数据库原理等 软件的设计原理:如何设计一个强大灵活,易复用,易维护的软件 架构的核心原理:围绕目前主要的互联网分布式架构以及大数据物联网架构进行剖析
    展开
    1
  • 未知
    2019-12-03
    猜测,推断。然后验证。曾经一位大牛也说过这种学习方法,自己也慢慢在实践。很管用。估计李老师也那位大牛也认识。
    共 1 条评论
    1
  • kissingers
    2019-11-19
    第一性原理,建立对需求和对技术最本质的认识,以推导的方式审视技术历史和技术演变,建立自己的技术体系和视角。
    1
  • 幸福来敲门
    2019-11-19
    希望后续的课程,老师能针对性的讲一些场景落地的技术解决案例和案例。鉴于篇幅,不期待事无巨细。但希望有所启迪。编程老鸟。前来报道
    1