论编程与武学的相关性-该文件没有程序与之关联来执行该操作

论编程与武学的相关性

首先来思考这么一个问题,何谓编程?

编程就是写代码吗?不,在《GoF,设计模式-解释器模式》这本书中解释道:所谓的编程,其实就是不断的对这个现实世界中的问题建立模型并将其固化为代码自动化执行的过程。也许你觉得这很抽象,其实简单地说,编程就是拆解任务,把一个任务,拆解成很细很细的步骤,一步步教计算机去做。举个栗子,比如说我们早上起来去上课,那么就可以这么细分:起床--穿衣--拿饭盒--去食堂--买早饭--吃饭--洗饭盒--回宿舍--放饭盒--拿书--出门--如果人都走完,要记得锁门--去教室--推门--找到自己的座位--走过去--坐下来--等待上课--上课。没错,如你所见,编程就是将一个复杂的问题简单化,简单成每个动作都像1+1=2那么简单。可能你会认为好麻烦,但是没办法,计算机太蠢了,就像一个永远也长不大的孩子,只会做一些基本的事情。不过今天,我们不具体谈这个,我们来聊一聊编程与武学的关系。

相信有不少人非常喜欢看金庸小说,在武侠世界里,修炼武功分为内功与外功,所谓内功即内功心法,外功就是那些武学招式。即使外功再厉害的人,在内功高强的人面前,依旧会被一一化解,甚至秒杀。但是显然,空有一身内功也不行。那么我们来思考一个问题,何谓内功?假设现在有两个人在比武,他们所学的武功招式都一样,但是有一个人内功要弱一点,另一个人内功要强一点,那么他们对打起来结果会是如何呢?应该会是内功高一点的人占优势吧(当然,排除另一个使用阴谋诡计)。为啥占优势?因为内功高,是不是意味着我招式的力度就比对面更加有力?浑然有力;因为内功高,所以我对自身招式的运用就会更加的随心所欲、如鱼得水。因为内功高,所以我在和别人对掌的时候,所散发出的气势会更强。而对面,虽然他对招式的运用已经很熟练了,但是,他内功低,这也就导致他的招式华而不实。或者说,对他而言,只是单纯的把所学的招式重复练了一遍,就像杂技表演一样,无法完全的发挥出来。

回到编程里,其实学习编程就好像学习武功一样,那编程里的外功和内功是什么呢?在编程里,所谓的外功,或者说招式,其实就是我们所学的那些语言、数据结构、设计模式,还有工具的使用等等,这些都可被称之为外功。其实吧,对于刚刚入门的程序员来说,学习这些外功最能起到立竿见影的效果。这就好比在金庸的武侠世界里,对于一个初学武功的人来说,我学了一些武功招式,即使是一些所谓的花拳绣腿,我也能用他干一些事情了,比如打几个地痞流氓,赶走几个山贼,或是在一群不会武功的人面前随便秀两手,也可以赢得他们的掌声、喝彩,从而满足自己的虚荣心,但是也仅局限于次罢了。对于一个程序员来说,在刚开始阶段,也都是学习一些“招式”,即编程语言,然后我们就可以用这些“招式”来写出各种各样的小程序来,这些程序就是我们用来打开编程界大门的钥匙,也就是“初入江湖”了。

那么来到第二个问题,何谓编程内功呢?有好几种说法,一种说法是:所谓的编程内功就是你的编程思想、编程规范,整个架构的把握、理解,其实就是你的经验;还有的人说编程内功就是你对事物本质的理解。说得细点,就是你对一些比较深的,或者说底层相关知识的理解。比如计算机理论、操作系统原理、汇编语言(assembly language)、二进制、编译原理等等,这些都可以称之为程序员的内功。这就好比一个人会开车,开得很溜,但另一个人不仅会开的很溜,他还会修车,即他对整辆车的内部结构、部件、功能等摸索得一清二楚。这就是只会外功的程序员和外功、内功都会的程序员之间的区别。

还有一种说法,即所谓的编程内功就是算法(algorithm),即你对《数据结构与算法》这门课的掌握程度。那么问题又来了,何谓算法呢?有一本非常著名的书,叫做《算法导论》,它是很多程序员为了提升自己的编程内功而不惜花费大量的时间和精力攻读的一本书(全世界真正能将它读透的人不多,因为你必须得有很强的数学功底)。它对算法的定义是这样的:算法就是任何良定义的计算过程,该过程取某个值的或值的集合作为输入并产生某个值或值的集合作为输出。简单的说,算法就是解决问题的过程,包括起因(目的)、经过、结果,缺一不可。举个很简单的栗子,消消乐游戏中的提示功能就是一个算法。

其实不论是哪一种说法,都可以归位一种,即最后所说的 算法。你的编程思想、编程规范、经验等,难道不是跟你解决问题的能力相挂钩吗?你对一样事物越理解,也就意味着当发生问题的时候,将其更加快速的解决的可能性就越大。算法,就是用来解决问题的。这也就是业界普遍流传并且认可的一句话:算法是衡量一个程序员内功深厚的标准。

回到金庸的武侠世界里,我们知道,在一个内功强大的人手里,不管是再低级、平庸的招式,甚至是人家随手打出的一掌,都可能达到惊天动地的效果。在学习编程的时候,我们其实可以从任何一门语言里,不断地提升自己的编程内功。对于内功本身,不存在语言特性,不管是c也好,c++,java,python,是不是都是在用同一种方法在做事情?因此,从任何一门语言着手,都可以修炼到哪内功的极致,关键在于个人。类似的,程序员这个职位也并不是青春饭,一个武功高强的人,即使对方老了,也依旧具有很强的影响力,至少人家所拥有的威望、功底、阅历、经验,不是初入江湖的小子可以比拟的。一个刚入职没几年的程序员,其花上一天一夜加班写出来的代码,可能一个拥有十几年甚至几十年经验的老程序员,只需要半天不到的时间就能写出,还能保质保量呢~

因此,衡量一个程序员综合编程能力的强弱,不仅要看他的外功,还要看他的内功。低级程序员比的是“武功招式”,高级程序员比的是“武学修养”。对于一个真正的武学大师而言,其已经达到了无招胜有招的境界,即他已经不那么看重所谓的招式了。

推荐阅读