首先来思考这么一个问题,何谓编程?java
编程就是写代码吗?不,在《GoF,设计模式-解释器模式》这本书中解释道:所谓的编程,其实就是不断的对这个现实世界中的问题创建模型并将其固化为代码自动化执行的过程。也许你以为这很抽象,其实简单地说,编程就是拆解任务,把一个任务,拆解成很细很细的步骤,一步步教计算机去作。举个栗子,好比说咱们早上起来去上课,那么就能够这么细分:起床--穿衣--拿饭盒--去食堂--买早饭--吃饭--洗饭盒--回宿舍--放饭盒--拿书--出门--若是人都走完,要记得锁门--去教室--推门--找到本身的座位--走过去--坐下来--等待上课--上课。没错,如你所见,编程就是将一个复杂的问题简单化,简单成每一个动做都像1+1=2那么简单。可能你会认为好麻烦,可是没办法,计算机太蠢了,就像一个永远也长不大的孩子,只会作一些基本的事情。不过今天,咱们不具体谈这个,咱们来聊一聊编程与武学的关系。python
相信有很多人很是喜欢看金庸小说,在武侠世界里,修炼武功分为内功与外功,所谓内功即内功心法,外功就是那些武学招式。即便外功再厉害的人,在内功高强的人面前,依旧会被一一化解,甚至秒杀。可是显然,空有一身内功也不行。那么咱们来思考一个问题,何谓内功?假设如今有两我的在比武,他们所学的武功招式都同样,可是有一我的内功要弱一点,另外一我的内功要强一点,那么他们对打起来结果会是如何呢?应该会是内功高一点的人占优点吧(固然,排除另外一个使用阴谋诡计)。为啥占优点?由于内功高,是否是意味着我招式的力度就比对面更加有力?浑然有力;由于内功高,因此我对自身招式的运用就会更加的为所欲为、如鱼得水。由于内功高,因此我在和别人对掌的时候,所散发出的气势会更强。而对面,虽然他对招式的运用已经很熟练了,可是,他内功低,这也就致使他的招式华而不实。或者说,对他而言,只是单纯的把所学的招式重复练了一遍,就像杂技表演同样,没法彻底的发挥出来。c++
回到编程里,其实学习编程就好像学习武功同样,那编程里的外功和内功是什么呢?在编程里,所谓的外功,或者说招式,其实就是咱们所学的那些语言、数据结构、设计模式,还有工具的使用等等,这些均可被称之为外功。其实吧,对于刚刚入门的程序员来讲,学习这些外功最能起到立竿见影的效果。这就比如在金庸的武侠世界里,对于一个初学武功的人来讲,我学了一些武功招式,即便是一些所谓的花拳绣腿,我也能用他干一些事情了,好比打几个地痞流氓,赶走几个山贼,或是在一群不会武功的人面前随便秀两手,也能够赢得他们的掌声、喝彩,从而知足本身的虚荣心,可是也仅局限于次罢了。对于一个程序员来讲,在刚开始阶段,也都是学习一些“招式”,即编程语言,而后咱们就能够用这些“招式”来写出各类各样的小程序来,这些程序就是咱们用来打开编程界大门的钥匙,也就是“初入江湖”了。程序员
那么来到第二个问题,何谓编程内功呢?有好几种说法,一种说法是:所谓的编程内功就是你的编程思想、编程规范,整个架构的把握、理解,其实就是你的经验;还有的人说编程内功就是你对事物本质的理解。说得细点,就是你对一些比较深的,或者说底层相关知识的理解。好比计算机理论、操做系统原理、汇编语言(assembly language)、二进制、编译原理等等,这些均可以称之为程序员的内功。这就比如一我的会开车,开得很溜,但另外一我的不只会开的很溜,他还会修车,即他对整辆车的内部结构、部件、功能等摸索得一清二楚。这就是只会外功的程序员和外功、内功都会的程序员之间的区别。算法
还有一种说法,即所谓的编程内功就是算法(algorithm),即你对《数据结构与算法》这门课的掌握程度。那么问题又来了,何谓算法呢?有一本很是著名的书,叫作《算法导论》,它是不少程序员为了提高本身的编程内功而不惜花费大量的时间和精力攻读的一本书(全世界真正能将它读透的人很少,由于你必须得有很强的数学功底)。它对算法的定义是这样的:算法就是任何良定义的计算过程,该过程取某个值的或值的集合做为输入并产生某个值或值的集合做为输出。简单的说,算法就是解决问题的过程,包括原由(目的)、通过、结果,缺一不可。举个很简单的栗子,消消乐游戏中的提示功能就是一个算法。编程
其实不管是哪种说法,均可以归位一种,即最后所说的 算法。你的编程思想、编程规范、经验等,难道不是跟你解决问题的能力相挂钩吗?你对同样事物越理解,也就意味着当发生问题的时候,将其更加快速的解决的可能性就越大。算法,就是用来解决问题的。这也就是业界广泛流传而且承认的一句话:算法是衡量一个程序员内功深厚的标准。小程序
回到金庸的武侠世界里,咱们知道,在一个内功强大的人手里,不论是再低级、平庸的招式,甚至是人家随手打出的一掌,均可能达到惊天动地的效果。在学习编程的时候,咱们其实能够从任何一门语言里,不断地提高本身的编程内功。对于内功自己,不存在语言特性,不论是c也好,c++,java,python,是否是都是在用同一种方法在作事情?所以,从任何一门语言着手,均可以修炼到哪内功的极致,关键在于我的。相似的,程序员这个职位也并非青春饭,一个武功高强的人,即便对方老了,也依旧具备很强的影响力,至少人家所拥有的威望、功底、阅历、经验,不是初入江湖的小子能够比拟的。一个刚入职没几年的程序员,其花上一天一晚上加班写出来的代码,可能一个拥有十几年甚至几十年经验的老程序员,只须要半天不到的时间就能写出,还能保质保量呢~设计模式
所以,衡量一个程序员综合编程能力的强弱,不只要看他的外功,还要看他的内功。低级程序员比的是“武功招式”,高级程序员比的是“武学修养”。对于一个真正的武学大师而言,其已经达到了无招胜有招的境界,即他已经不那么看重所谓的招式了。数据结构