软件开发的第一性原理
何谓第一性原理,其实就是思考某个技术的本质,从本质出发按照发展的过程,自己重新在演绎一遍。这里面的核心在于推导和验证,所谓的推导,我们可以这样理解基于你现有的技术知识去猜它的实现,没错就是猜,然后通过搜集资料,去验证你的猜想。通过不断循环推导-验证这样的过程,去演绎一个技术从最原始的样子慢慢的到这个技术现在的样子。从中获取到自己的技术树。所以学习最基本的知识很重要,就如数学中的定理一般,一切都是从这里开始的。
可能这样你听起来比较迷糊,我来举个例子,C语言为什么会出现的?首先我们需要回答C语言为什么而诞生?要回答这个问题,我们需要看看C语言是用来干嘛的?而想要知道C语言是用来干嘛的,就需要去搜集资料,学习。通过学习,我们知道了C语言是用来编写计算机程序的。这个时候我们需要追溯历史,看看没有C语言之前是如何编写程序的,我们通过追述历史发现,没有C语言的时候,是使用汇编编写程序的。那么就出现了一个关键的问题,为什么有了汇编语言还需要C语言呢?这个时候你不得不了解一下汇编语言,通过了解汇编语言,你发现汇编语言的特点就是事无巨细,和CPU强关联。没有C语言好用的数据类型,分支结构,循环结构,不需要关心底层的指令集架构。于是我们就可以回答开头的问题,C语言为什么会出现,主要是因为汇编语言与底层的指令集架构强关联,而且编写程序时,存在太多冗余,而且容易出错,于是通过抽象和总结一些特点,就创建了C语言,C语言就实现了这些特点,比如与底层的指令集架构无关,总结出的分支结构,与循环结构并用语法元素实现。抽象出了类型系统来替代汇编语言的直接操作内存。这个时候就会出现第二核心问题,C语言是如何实现这些语言特性的?,这个时候就需要你根据自己的知识去猜测,推导,验证。举个例子,比如C语言如何实现与指令集架构无关的?我们都知道计算机执行的只不过是机器码,而汇编语言不过是机器码的一个映射,比如 add指令对应哪个机器码,而不同的指令架构对应的机器码不同,从而对应的汇编语言不同。既不同指令集的机器码不同,但是C语言编程的程序却能在不同的指令集架构中运行。这是怎么做到的呢?我们猜测一定是C语言的代码转化为机器码的时候,某个东西帮我们做了处理,于是我们需要了解 C语言代码如何转换成机器码的?大致的过程是这样的 预处理,编译,汇编,链接。这里面最重要的是编译这一步,编译这一步就是将C语言代码转换为汇编代码。汇编这一步就是将生成的汇编代码翻译成机器码。这样我们就知道了,哪有什么岁月静好,不过是有人在替我们负重前行。就如《人月神话》中说的一样,本质复杂度永远无法被消除,我们只能减少随机复杂度。而这里,就是编译器帮我们实现了从C语言代码转换为机器码,这其中包括适配不同的指令集架构。