计算机界的无上心法

引论

我觉得这个话题说大不大,说小不小。引发我思考的根源是无意中看到的一篇知乎上的讨论,有人推荐酷壳中的一篇相关的文章可以参考。对于他人的回答我不做过多评论,怎么看待就见仁见智了。回过头说话,无上心法终究是谁提出的不太清楚,但是来源于武林这是八九不离十。武林中的武功修为与现在大多数技术圈的修炼异曲同工,都是需要一定的积累方可成就,怎么去积累就有怎样的成就。也会延伸出诸多的领域,就说计算机科学无外乎以下几类(参考Wiki):

  • 理论计算机科学
    • 计算理论
    • 算法与数据结构
    • 程序设计语言理论
    • 信息与编码
    • 并发与分布式系统
    • 数据库与检索
    • 形式化方法
  • 应用计算机科学
    • AI
    • 计算机体系结构
    • 计算机视觉
    • 计算机安全与密码学
    • 计算科学
    • 信息科学
    • 软件工程

谈谈数学

首先,既然名为计算机,与计算相关就离不了数学,这是本源。没错我的出发点并非你所学所用需要的技巧,而是本身对于计算机整个体系构建的形态为何,就是数学。上面可以看出,计算机科学至少有两大分支,一是理论,一是应用。我不确定这样分是否科学,我自己的经验是:计算机乃一门实践性质很强的学科,如果创造的理论没有应用价值其意义就不大,包括传说中的量子计算,一定得是我们看的着的,努力努力也能摸得到的。

这些理论基础细分到不能细分,简化到不能简化,归其本质,无非数学二字。假如计算机的代表就是编程,不管什么程序,不管多么初级且简单亦或是多么高深且复杂,都是由数学所积淀。汇编语言若没有优秀的数理逻辑写出来就是一团乱麻;再观函数式编程,其所包含的便是一种很优秀的抽象思想。既然都叫函数式了,就算不知其所以然,也要知其然,编制函数式程序,很容易就体会得到那种数学的形式美,但是你是否真的能够做到充分的理解也许不算是重点

谈谈表达

表达能力是一个外向的能力,如同你编程,实际上是把自己心中的想法说出来,告诉一台机器要怎么做。表达的准确,得到的结果就会接近预期。请想一想,在你的学生生涯中,你是否对于作文课感到头痛?基本的语文素养怎么样?最重要的是每当你像他人阐述想法时,是否足够准确,且高效。记得有人说代码就像诗歌,也有人把一个优秀的coder称作是创作家,比如说画家(参考黑客与画家),文艺工作者或艺术家们都是善于表现与表达的人群,把自己的想法通过文字、音符或者色彩、造型表达出来就是他们所擅长的。

而在计算机界,表达的媒介是代码,仅仅是在形式上与艺术家们不同而已。我强调作为圈内人士应当注重自己的这种能力,与优秀的数学素养同样重要,一个占据右脑,一个占据左脑,左右搭配干活不累。

回到计算机

其实数学所体现的价值就好比计算机的所需要的内功一样,是一种后劲,也许不能够帮助你完成漂亮的招式,但其的确是漂亮招式的大前提。不是所有接触编程的人都想成为计算机科学家,甚至很多人连算法之类的都不想去碰。不过我却认为假如受过比较系统的训练,在这些方面你表现的会比一般的程序员好些。说白了就是抽象能力与建模能力会强一些,体现在编程上就是代码会清晰简洁,简单就是美。

而优秀的表达能力则是让你把存在于大脑中想法高效且准确的通过某种形式转化出来,想想一个人表达能力很差劲,写出的代码或许就会脱离自己本来的想法,甚至很混乱繁复。如果不是编程,而是单纯的系统设计也是如此,建筑师的图纸画得跟涂鸦一样,那么很难想象那栋建筑是否能真的能被建造出来,即便可以,中间也必然会浪费很多被迫与土木工程师协调沟通的精力。不过这种情况不太可能发生就是了,在这里仅打个比方。

总结

所以综上所述,我认为计算机界的无上心法无非就是数学与表达。不过若想做好,仅仅会内功是不行的,有时候还需要一些高明的招式,比如做事的感觉与对事物的品味等等,很多有多年经验的顶级Hacker都表达出了相似的内容,这不与我所说的矛盾。先打好基础,其他的事自然会水到渠成。有同学给出了建议:不如在谈论这个话题之前,先把下面的书都读懂。注意是读,而不是读哦:

  • Code Complete (2nd edition) by Steve McConnell
  • The Pragmatic Programmer
  • Structure and Interpretation of Computer Programs
  • The C Programming Language by Kernighan and Ritchie
  • Introduction to Algorithms by Cormen, Leiserson, Rivest & Stein
  • Design Patterns by the Gang of Four
  • Refactoring: Improving the Design of Existing Code
  • The Mythical Man Month
  • The Art of Computer Programming by Donald Knuth
  • Compilers: Principles, Techniques and Tools by Alfred V. Aho, Ravi Sethi and Jeffrey D. Ullman
  • Gödel, Escher, Bach by Douglas Hofstadter
  • Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin
  • Effective C++
  • More Effective C++
  • CODE by Charles Petzold
  • Programming Pearls by Jon Bentley
  • Working Effectively with Legacy Code by Michael C. Feathers
  • Peopleware by Demarco and Lister
  • Coders at Work by Peter Seibel
  • Surely You’re Joking, Mr. Feynman!

注:以上列表来自 StackOverflow 关于 程序员该读的书 投票的前20名。