-->

后端面试38讲_01_开篇词_掌握软件开发技术的第一性原理

你好,我是李智慧。

我们呢都知道计算机软件开发是一个日新月异的领域,几乎每一天都有新的技术诞生。

每隔几年呢,这个领域就会进行一次大的技术潮流变换。

作为软件技术开发人员,我们也常常疲于奔命,不断学习各种新知识、新技术,特别害怕被这个快速变革的时代所抛弃。

但是呢每次从头学习一个新的技术,这个过程可能很漫长,而且也很痛苦。

好不容易掌握的差不多了,新的技术又出现了,只能不断重复,从入门到放弃,以至于整个行业形成了一种所谓的共识。

随着学习能力和体力精力的下降,编程知识和技能逐渐衰退。

三十五岁以后就不能写代码了,真的是这样吗?其实啊很多看起来难以坚持让人容易放弃的事情,并不是什么智力、体力或者是意志力的问题。

更多的呢其实是方法问题。

很多时候呢我们学习新知识和新技术,之所以困难,是因为没有理解他们背后的思想和原理以及来源。

我们常说太阳底下没有新鲜事。

绝大多数新技术呢其实脱胎于一些既有的技术体系。

如果你能建立起这套技术思维体系,掌握他们背后的原理。

那么当你接触一个新事物的时候,就可以快速的把握住这个新技术的本质特征和思路方法。

然后呢,再用你的技术思维体系快速推导出这个新技术是如何实现的。

这个时候呢,你其实不是去学习这个新技术,而是去验证这个新技术了。

你会去看它的文档和代码,去验证它和你推导猜测的实现方式是不是一致,而不是去学习它怎么用了。

这个时候啊你就会发现,学习一个新技术变成了一个简单轻松、快速而且充满乐趣的过程。

你不再害怕学习新的技术,而是开始抱怨为什么技术革新的这么慢,简直太无聊了。

甚至你还可以开始自己创造新技术。

那么,如何实现这一美好的愿景,建立自己的技术思维体系呢?不知道你有没有听过,物理学有一个第一性原理,指的是根据一些最基本的物理学常量从头进行物理学的推导,进而得到整个物理学体系。

你肯定知道做航空火箭的埃隆马斯克吧,他呢就特别推崇第一性原理,他做电动汽车,做航空火箭并没有去忠从别人的老路,而是从这个产品最本质的需求和实现原理出发,重新设计的产品,最核心的关键以及发展路径,进而开发出自己独特创新的产品。

Google的创始人拉里佩奇也曾经说过,让我自由的从物理规则出发去思考问题,而不是迎合那些所谓的世俗智慧。

其实呢这也是第一性原理。

第一性原理就是让我们抓住事物最本质的特征、原理,依据事物本身的规律,去推导分析,演绎事物的各种变化规律,然后洞悉事物在各种场景下的表现形式,而不是追随事物的表面现象,甚半硬套各种所谓的规矩、经验和技巧。

最终呢在各种纷繁复杂的冲突纠结中迷失了方向。

软件开发技术是非常庞杂的,各种基础技术啊,各种编程原理啊、各种编程语言啊、各种工具框架啊、各种设计模式啊、架构方法啊,这些很容易让人无所适从。

就算下定决心要从基础学起上来一本厚厚的操作系统原理,好不容易咬牙坚持学完,回头一看呢还是各种迷茫啊,不知道在讲什么,继续学下去,再来一套更厚的TCPIP详解。

这下好了,彻底耗尽了意志力和兴趣,完全放弃。

其实呢我们不需要一开始就精通操作系统,进程调度的各种算法,也不需要上来,就掌握TCPAP协议里的各种真格式。

我们应该从软件技术的第一性原理出发,了解每个基础技术方向那些最关键的技术原理,明白这些原理是如何和我们日常开发工作发生关系呢?比如我们的程序是如何被操作系统调度执行的?为什么高并发的时候会崩溃?原理是什么?在编程的时候,什么场合下应该使用原理,发么场合下应该使用数组,为什么呢?当我们使用哈希表的时候,什么情况下它的性能会急剧降低?原理又是什么呢?我们用EDIS这样的分布式缓冲的时候,到底要解决什么问题呢?分布式缓冲又是如何工作的呢?还有哪些技术看起来和REDIS毫不相干?其实工作原理是一样的呢。

如果我们能把这些基本问题都回答清楚了,那么这些问题背后的核心技术原理也就清楚了。

这样一来,我们就能够开始建立起自己的技术思维体系了当有新的问题和技术就出现时,哎,你就可以思考这是属于哪个技术领域的呀,它的核心原理和哪个技术方案本质上是一样的呢?如果你掌握了软件开发技术的第一性原理,那么当你为了解决某个新问题去学习和研究一个新技术的时候,就算遇到了知识的盲点,也可以快速定位到它在技术体系中的具体位置。

然后呢,进一步阅读相关的书籍资料。

这个时候呢你就会深入到操作系统的调度算法里,或者是通讯协议投信息的具体编码里。

但是这时你就不会觉得无聊了,你会觉得哦原来是这样啊,真是太有意思了。

甚至觉得这里其实可以实现的更好呢。

我就是想从软件技术第一性原理出发,去写一写软件技术那些最基本的知识原理和知识体系。

在这个专栏中,我对自己过去二十年软件编程生涯和业界的技术发展进行了总结提炼。

在软件知识技术体系分成了三个部分,软件的基础原理,软件的设计原理和架构的核心原理。

在软件的基础原理里呢,主要是操作系统、数据结构、数据库、原理。

这些内容我会从一个常见的问题出手直达这些基础技术最本质的原理,并覆盖这些基础技术的关键技术点,让你理解这些基础技术原理和你日常开发工作的关键关系。

这样一来,你就可以对这些基础技术有一个全新的认知了。

在软件的设计原理里呢,我会讲述如何设计一个强大灵活、易复用、易维护的软件。

在这个过程中,应该依赖哪些工具和方法呢?又该遵循哪些原则和思想呢?应该使用哪些模式和手段呢?我认为如果软件只是实现功能,那么程序员就没有高下之分,软件也没有好坏之分了,技术也就不会有进步。

可是好的软件究竟好在哪里呢?如何自己也写出一个好的程序呢?我将在这个模块一一道来架构的核心原理。

这个模块呢我会给你剖析目前主要的互联网分布式架构以及大数据物联网架构。

我会给你分析这些架构背后的原理,他们都遵循了怎样的驱动力和设计思想呢?有哪些看起来不同的技术,其实原理是一样的呢?如何通过这些技术实现系统的高可用和高性能呢?软件开发是一个实践性很强的活动。

如果你只是学习技术,那么就是在纸上谈兵。

只有将知识技术应用到工作,实践中才能够真正的体会到,技术的关键点在哪里,才能够分别出哪些技术是真正有用的,哪些方法其实就是花拳绣腿。

但是有一个问题,公司不是实践技术的实验室,怎样才能处理好工作中的各种关系得到充分的授权和信任呢?如何在工作中实践自己的技术思想,并为公司创造更多价值,得到更多的晋升发挥空间,使自己的技术成长和职业发展进入互相促进的正向通道呢?我将会在第四个模块和你分享一些这方面的方法和认知。

记得我在学几何的时候,最开始的时候呢也常常困扰于各种定理推论,我觉得他们长得太像了,以至于进行几何证明的时候,不知道该用哪个。

后来呢我就干脆不去管这些定理和推论了,而是直接从公理开始证明。

虽然证明步骤长了一点,但是总归是能证明出来了。

后来做的题多了,发现有一些中间推导过程总是重复出现,再打开书学习,发现这些中间结果就是各种定理和推动。

这个时候我不去记这些定理,也能够随心所欲的去使用它们了。

其实呢我学几何的这种方式就是第一性原理。

定义性原理,也是一种思维方式、一种学习方式,一种围绕事物核心、推动事物正确前进的做事方式。

也许这个专栏讲到的很多知识技术你已经掌握。

但是这些知识技术和软件技术最基本的原理的关系呢,也许你还不太了解它们从何而来,又将如何构建出新的技术呢?如果把这些关系和原理都理解透彻,你会发现日常开发用到的各种技术,你不但可以随心所欲的去使用,甚至可以重新创造。

如果说具体的技术是一朵花,那么技术思维体系就是一棵树。

希望你能跟随我的专栏,种下自己的技术思维体系之树,收获一束繁华。

在学习的路上,你有哪些建议或者心得体会呢?欢迎您分享。

在评论区,我会和你一起交流这些学习方法,也欢迎把这篇文章分享给你的朋友或者同事一起来交流吧。