让我们大家一句一句的理解这句名言吧!
(1)“低水平程序员总在考虑代码”。
我感觉好多新手或者菜鸟现在还处于这个阶段(我想我也处于这个阶段),要实现某个功能首先是以面向过程的思路考虑我要定义一个怎样的函数,函数返回值是什么类型,有几个传参,传参类型是什么,函数体内部怎么写。大部分新手活菜鸟都是这样写代码的,完全没有考虑需要首先创建一个怎样的结构体类型就直接下手写函数了,这就是面向过程的设计思想,将注意力放到了算法上(程序=数据结构+算法),这样写的代码可移植性差、复杂性大、扩展能力差,不容易理解,容易出错,完全小白的写法,他就认为程序就是一个个函数,其实我想说恰恰相反程序宏观上是一个一个数据。
(2)“高水平程序员总是考虑数据结构以及它们之间的关系”
我理解这句话,是从面向对象的思路编写代码。首先先别急着写代码,先思考定义一种结构体类型,包含哪些成员,然后定义操作这些结构体的函数(一般是作为函数参数,通过结构体指针传参实现的)。这是另外一层写代码的方式,这层方法的核心或者说注意力是放在数据结构上。也就是程序员先不着急动手写函数,首先要思考构建一个怎样的结构体类型能够准确描述需要实现功能的对象(例如人类的特征),建立好结构体类型后然后就是创建操作那个这些结构体内部成员的函数(人能完成的事情),其次再创建对应结构体类型的全局变量,最后在函数内部调用这些函数去操纵这些全局变量。
也就说 程序=数据结构+算法,其实有2层含义:
第一层:数据结构类型+算法(函数),这两个是一对。
第二层:数据结构类型的具体实现(全局变量)+函数调用(可能通过指针方式实现传参),这两个是另外一对。
最近在看一些高手写的程序代码,我发现他们首先定义了一些比较复杂的数据结构,然后定义了操纵这些数据结构的函数,其次定义了全局变量或者堆内存,最后调用这些函数操作这些全局变量或者堆内存。我刚开始看到数据结构类型的时候不太明白为什么要包含这么多的成员,甚至成员包含各种数组和结构体,后来我发现高手定义了这么复杂的数据结构后,编写的操作这些数据结构的算法(函数)内部比较简单,有一种“自然而然写出来或者让我写也会这样写”的感觉。于是我想起了Linus的这句名义,当然这里只针对“高水平程序员总是考虑数据结构”这半句。
(3)最后我们来看最后半句话“高水平程序员总是考虑数据结构之间的关系”。
也就说定义数据结构对应全局变量这些数据之间的存在某些联系。例如我们调用某些函数去操纵某个结构体类型变量的时候,会对定义的另外一个全局变量数组产生影响,他们之间存在某种关系。这一层境界是最高的,也是最难理解的,需要程序员对以上“2层含义”有深刻的认识,当达到能够一眼看出数据结构之间的关系的时候才算是达到高手水平,一般人都是达到或认识到了程序的“2层含义”,缺乏全局变量与全局变量之间的关系的认识。(这也是我要努力的方向,数据与数据之间的关系)。
顺便说一下,数据结构之间的关系,其实最常见的就是结构体内部间接包含其他结构体,也就是结构体内部包含了另外一个结构体变量的指针,我们通过操作个指针变量去操纵(读写,作为赋值运算符的右值,左值)真正的结构体成员。
总之,Linus的这句话强调程序的核心应该是数据结构,而非代码。有点面向对象的思想,首先创建数据结构,然后再写代码(阅读代码也一样,首先要读懂数据结构,然后在理解代码;其次理解全局变量,最后理解函数调用,这4步就是程序的编写和阅读整个过程)。可以更概括的说“程序是什么?程序宏观上就是一个一个数据的内容在不断地变化,而这些变化就是通过调用对应算法(函数)实现的。一个一个数据不断变化就实现了计算机或者硬件要完成的工作(例如寄存器和硬件功能的对应关系,内存可以理解为一种特殊的寄存器,它需要程序员自己把握操作,因为寄存器有些动作是硬件完成的,而内存需要程序员自己细无巨细的操作)”。
程序=数据结构+算法,数据结构和算法构成了程序的骨肉,数据结构是骨架(核心),算法只是骨架上的“血肉”。
818

被折叠的 条评论
为什么被折叠?



