《程序员的自我修养》
在“某当”或是“某东”上搜索“程序员的自我修养”,映入眼帘的是两本具有相同名字,但是不同种类的书。颜色一黑一白,内容也大相径庭。
不同的人对相同事情的理解是不可能完全一样的,不同的程序员因为其背景和价值观的不同,对程序员的自我修养到底是什么的认识当然更是千差万别。那么我们抛开主观的观点,先来看看这两本书分别是说什么的吧。
书名 | 作者 | 主题描述 |
---|---|---|
《程序员的自我修养—链接、装载与库》 | 俞甲子、石凡、潘爱民 | 程序运行背后的机制和由来,重点介绍链接、装载与库 |
《程序员的自我修养》 | 陈逸鹤 | 程序员如何理解自己的职业与发展、程序员如何看待自己的工作与生活 |
潘爱民老师编写和翻译的许多作品,大家都是耳熟能详的,如《COM原理与应用》、《C++Primer中文版》(第三版)等;而且潘爱民老师研究和创业的方向也都是操作系统方向;俞甲子、石凡不是很有名,但是从其经历和介绍来看,也都是对编译器、操作系统等计算机底层技术有相当造诣的;
从三位作者的背景来看,我们能判断这本书应该是一本技术书籍,而其介绍的内容也应该是和计算机底层强相关的。那这本书到底要讲什么呢?从序言中我们能窥得一斑。
“为什么程序是从main开始执行?”
“目标文件是什么?链接又是什么?”
“PE/ELF文件里面存的是什么?”
从这些只言片语中可以理解到,这本书的研究方向跟“程序到底是怎么运行的?”这样的问题有关系,在序言中作者们也提到,程序员写程序不仅要知其然,更要知其所以然,这样才能提高作为程序员的自我修养。
陈逸鹤在业内的名气并没有潘爱民老师大,这本书对他的描述如下:
“陈逸鹤,拥有将近15年的软件开发及IT管理经验,曾先后在易保网络、平安保险、平安银行、AIG公司担任架构师、技术经理等工作。业余时间,他是一名全栈工程师,做着自己喜欢的开源项目,也是本书配套主题网站技匠社(jijiangshe.com)的发起人与创建者。此外,作者以“技匠”为笔名创建的个人博客更是深受年轻程序员们的喜爱,累计订阅读者达数万人。他也是稀土掘金的联合编辑、51CTO专栏作者、慕课签约作者、百度知道日报特邀作者、以及LinkedIn的专栏作者。”
我特意到该作者的博客看了,摘到了他写这本书的起因:
“最近,无意中看到一本书,叫作《程序员的自我修养》,书名很吸引我,翻开看时,却发现里面的内容多是有关Windows底层技术的介绍,比如编译器、链接库的原理,运行库的实现等等。可能是自己不常做Windows编程的缘故,便觉得索然,不愿再往下读了。反而是这书名倒让我起了些意见,明明应该叫作“深入Windows开发核心”之类,却被冠以“程序员自我修养”的名字,确有些言过其实了吧。“
详见:https://www.jianshu.com/p/e7e247589295
从这句话来看,他肯定是没有仔细看过这本书,不知道他的技术如何,但是至少在我看来不是一个特别认真的人。因为我自己是一个Linux的程序员,10年前买的这本书,每次看俞甲子他们的书都有新的认识。我可以很负责任的告诉大家,这本书不是深入Windows开发核心”之类的书。
从他写的这本书的内容来看,看似说的是程序员应该如何生活和工作,但是实际上更是一个”人“如何工作和生活的描述,看起来很实在,却虚的很。
我不喜欢这个人!
在我看来,既然把书名写成“程序员”相关,那就多说说程序员自己的事情,而不是拿自己的管理经验和其他的人生经验来堆砌这本书。本本以下内容不会再提陈逸鹤的这本书。
底层 VS 上层
底层和上层这两个词本身就是相对的概念,那到底什么是底层技术,什么是上层技术?譬如我利用python的Django框架写了一个发票管理系统,在这个系统中,我们利用Django提供的一系列API和规则可以很简单的完成整个系统的编写,但是这些API和规则是如何实现的?Django的框架的实现机制是什么?这两个问题的解答我认为对于这个例子来说就是底层技术,而如何通过API和规则实现系统就是上层技术。
有些时候我们只需要知道怎么做,而不需要知道原理就可以做出我们想要的系统和软件,就跟我们骑自行车一样,我们只需要学会怎么骑,而不需要知道自行车的工作原理是什么。
但是,一个好的软件不仅仅只是实现其功能,还需要保证其性能、稳定性等;而且可以说一个软件中70%的代码都是为了处理一些异常实现的,而为了处理这些性能、稳定性的问题,作为一个软件开发人员,必须要对实现原理有一定的了解,否则并无法设计出功能、性能、稳定性均极佳的作品。
我眼中程序员的自我修养
- 扎实的基础知识。这些知识包括数据结构、算法、操作系统等。
- 强悍的学习能力和逻辑思维能力。
这两点分别对应底层和上层:
第一:如果没有扎实的基础知识,或是不知道软件的本质是什么,实现原理是什么,那么很难写出高质量的代码;就像上面说的,只知道怎么做,而不知道为什么这么做,对碰到的很多性能、稳定性问题将无从下手,也自然无法设计和开发出好的软件;
第二:如果没有强悍的学习能力和逻辑思维能力,那么将无法适应随时变化的工作,因为随时都有可能用新的接口,新的框架来实现不同的功能,实现不同的系统,作为程序员必须要能随用随学,边干边学;