纯技术话题:程序,是算法重要还是数据结构重要?
我认为这个话题有助于自己找到自己看重程序的那一部分。
我认为这个话题有助于自己找到自己看重程序的那一部分。
源自 那谁 的博客思考
https://www.codedump.info/post/20200605-how-to-read-code-v2020/
虽然说“程序设计=算法+数据结构”,然后我实际中的体会,数据结构更加重要。
因为结构定义了一个程序的架构,结构定下来了才有具体的实现。好比盖房子,数据结构就是房子的框架结构,如果一间房子很大,而你并不清楚这个房子的结构,会在这里面迷路。而对于算法,如果属于暂时不需要深究的细节部分,可以参考前面“区分主线和支线剧情”部分,先了解其入口、出口参数以及作用即可。
Linus 说: “烂程序员关心的是代码。好程序员关心的是数据结构和它们之间的关系。”
因此,在阅读一份代码时,厘清核心的数据结构之间的关系尤其重要。这个时候,需要使用一些工具来画一下这些结构之间的关系,我的源码分析类博客中有很多这样的例子,比如《 Leveldb 代码阅读笔记》、《 Etcd 存储的实现》等等。
需要说明的是,情景分析、厘清核心数据结构这两步并没有严格的顺序关系,不见得是先做某事再做某事,而是交互进行的。
比如,你如果现在刚接手某个项目,需要简单的了解一下项目,可以先阅读代码了解都有哪些核心数据结构。理解了之后,如果不清楚某些情景下的流程,可以使用情景分析法。总而言之,交替进行直到解答你的疑问为止。
至于基础算法会不会常用,就看项目有没有各种条条框框限制了,模块内优化还是需要的
业务最重要
至于业务重要,其实大部分程序员的工作不是设计业务(这是世界或者社会的活,轮不到你区区一个智人种个体),而是理解业务,再将业务转化为数据结构和算法(也就是计算机听得懂的方式)。
“业务”和“数据结构和算法”哪个重要?这个问题跟主题的问题也一样。
总结,面对技术来说,两者都重要;面对业务来说,数据结构更重要;面对薪资来说,老板认为哪个重要就重要。撇开上述的,当然是两者都重要,并没有最重要分区别。因为你写的每一行代码都是粗略的算法,或多或小都包含数据结构这方面的知识。
数据结构是算法用得比较多之后内化出来的一个模型. 重视数据结构的代码比不重视数据结构的代码清晰易懂好维护, 不过数据结构一般不会让你做出之前不能做到的事情. 你可以把数据结构看作某些算法的沉淀.
Linus, Rob Pike 很多人都说过类似的问题, 这里引用一个 Eric Raymond: http://www.catb.org/esr/writings/taoup/html/ch01s06.html#id2878263
大意是人很难理解简单的过程逻辑, 但是却能理解很复杂的数据结构.
对比一下一个 50 行的 if else for 循环, 和一个 50 行的 class.
或者一个不太恰当的比喻:
只注重算法≈把逻辑全扔到 controller 里: 随着 use case 的增多代码会很难读且有很重复.
重视数据结构≈把逻辑逐渐沉淀到 model 层, 然后想要理解代码的人着重看一看 model 就很快能理解, 而维护代码的人经常能直接用上 model 里已有的很多东西.
如果是狭义上的那些算法,像什么排序,查找,贪心,动态规划,这些的确业务上不需要实现,但是如果你遇到一个你要看得懂,同样的,数据结构也是一样的,你读源码,你造轮子,不一样要接触这些东西吗?
在目前大部分商业开发种,数据结构类似房的地基和框架,没这个你算法再牛逼,也成不了大气候
说都重要的实际上就是再搅稀泥,来 v2 大家都知道主问的算法和数据结构指的是啥
两者是相辅相成的。
数据结构为算法服务,算法作用于特定的数据结构
在目前大部分商业开发种,数据结构类似房的地基和框架,没这个你算法再牛逼,也成不了大气候
说都重要的实际上就是再搅稀泥,来 v2 大家都知道主问的算法和数据结构指的是啥
明白人
如果没有场景,为什么不能设立场景分析呢?
如果问题不明朗,为什么不额外探究问题的新的可选答案呢?
如果问题能够激发自己的思考,为什么不深入思考一下帮助自己进一步理解编程在做什么呢?
我是站着这样的立场向自己提出的思考,分享这个问题希望大家也能获益。