首先來思考這麼一個問題,何謂編程?java
編程就是寫代碼嗎?不,在《GoF,設計模式-解釋器模式》這本書中解釋道:所謂的編程,其實就是不斷的對這個現實世界中的問題創建模型並將其固化爲代碼自動化執行的過程。也許你以爲這很抽象,其實簡單地說,編程就是拆解任務,把一個任務,拆解成很細很細的步驟,一步步教計算機去作。舉個栗子,好比說咱們早上起來去上課,那麼就能夠這麼細分:起牀--穿衣--拿飯盒--去食堂--買早飯--吃飯--洗飯盒--回宿舍--放飯盒--拿書--出門--若是人都走完,要記得鎖門--去教室--推門--找到本身的座位--走過去--坐下來--等待上課--上課。沒錯,如你所見,編程就是將一個複雜的問題簡單化,簡單成每一個動做都像1+1=2那麼簡單。可能你會認爲好麻煩,可是沒辦法,計算機太蠢了,就像一個永遠也長不大的孩子,只會作一些基本的事情。不過今天,咱們不具體談這個,咱們來聊一聊編程與武學的關係。python
相信有很多人很是喜歡看金庸小說,在武俠世界裏,修煉武功分爲內功與外功,所謂內功即內功心法,外功就是那些武學招式。即便外功再厲害的人,在內功高強的人面前,依舊會被一一化解,甚至秒殺。可是顯然,空有一身內功也不行。那麼咱們來思考一個問題,何謂內功?假設如今有兩我的在比武,他們所學的武功招式都同樣,可是有一我的內功要弱一點,另外一我的內功要強一點,那麼他們對打起來結果會是如何呢?應該會是內功高一點的人佔優點吧(固然,排除另外一個使用陰謀詭計)。爲啥佔優點?由於內功高,是否是意味着我招式的力度就比對面更加有力?渾然有力;由於內功高,因此我對自身招式的運用就會更加的爲所欲爲、如魚得水。由於內功高,因此我在和別人對掌的時候,所散發出的氣勢會更強。而對面,雖然他對招式的運用已經很熟練了,可是,他內功低,這也就致使他的招式華而不實。或者說,對他而言,只是單純的把所學的招式重複練了一遍,就像雜技表演同樣,沒法徹底的發揮出來。c++
回到編程裏,其實學習編程就好像學習武功同樣,那編程裏的外功和內功是什麼呢?在編程裏,所謂的外功,或者說招式,其實就是咱們所學的那些語言、數據結構、設計模式,還有工具的使用等等,這些均可被稱之爲外功。其實吧,對於剛剛入門的程序員來講,學習這些外功最能起到立竿見影的效果。這就比如在金庸的武俠世界裏,對於一個初學武功的人來講,我學了一些武功招式,即便是一些所謂的花拳繡腿,我也能用他幹一些事情了,好比打幾個地痞流氓,趕走幾個山賊,或是在一羣不會武功的人面前隨便秀兩手,也能夠贏得他們的掌聲、喝彩,從而知足本身的虛榮心,可是也僅侷限於次罷了。對於一個程序員來講,在剛開始階段,也都是學習一些「招式」,即編程語言,而後咱們就能夠用這些「招式」來寫出各類各樣的小程序來,這些程序就是咱們用來打開編程界大門的鑰匙,也就是「初入江湖」了。程序員
那麼來到第二個問題,何謂編程內功呢?有好幾種說法,一種說法是:所謂的編程內功就是你的編程思想、編程規範,整個架構的把握、理解,其實就是你的經驗;還有的人說編程內功就是你對事物本質的理解。說得細點,就是你對一些比較深的,或者說底層相關知識的理解。好比計算機理論、操做系統原理、彙編語言(assembly language)、二進制、編譯原理等等,這些均可以稱之爲程序員的內功。這就比如一我的會開車,開得很溜,但另外一我的不只會開的很溜,他還會修車,即他對整輛車的內部結構、部件、功能等摸索得一清二楚。這就是隻會外功的程序員和外功、內功都會的程序員之間的區別。算法
還有一種說法,即所謂的編程內功就是算法(algorithm),即你對《數據結構與算法》這門課的掌握程度。那麼問題又來了,何謂算法呢?有一本很是著名的書,叫作《算法導論》,它是不少程序員爲了提高本身的編程內功而不惜花費大量的時間和精力攻讀的一本書(全世界真正能將它讀透的人很少,由於你必須得有很強的數學功底)。它對算法的定義是這樣的:算法就是任何良定義的計算過程,該過程取某個值的或值的集合做爲輸入併產生某個值或值的集合做爲輸出。簡單的說,算法就是解決問題的過程,包括原由(目的)、通過、結果,缺一不可。舉個很簡單的栗子,消消樂遊戲中的提示功能就是一個算法。編程
其實不管是哪種說法,均可以歸位一種,即最後所說的 算法。你的編程思想、編程規範、經驗等,難道不是跟你解決問題的能力相掛鉤嗎?你對同樣事物越理解,也就意味着當發生問題的時候,將其更加快速的解決的可能性就越大。算法,就是用來解決問題的。這也就是業界廣泛流傳而且承認的一句話:算法是衡量一個程序員內功深厚的標準。小程序
回到金庸的武俠世界裏,咱們知道,在一個內功強大的人手裏,不論是再低級、平庸的招式,甚至是人家隨手打出的一掌,均可能達到驚天動地的效果。在學習編程的時候,咱們其實能夠從任何一門語言裏,不斷地提高本身的編程內功。對於內功自己,不存在語言特性,不論是c也好,c++,java,python,是否是都是在用同一種方法在作事情?所以,從任何一門語言着手,均可以修煉到哪內功的極致,關鍵在於我的。相似的,程序員這個職位也並非青春飯,一個武功高強的人,即便對方老了,也依舊具備很強的影響力,至少人家所擁有的威望、功底、閱歷、經驗,不是初入江湖的小子能夠比擬的。一個剛入職沒幾年的程序員,其花上一天一晚上加班寫出來的代碼,可能一個擁有十幾年甚至幾十年經驗的老程序員,只須要半天不到的時間就能寫出,還能保質保量呢~設計模式
所以,衡量一個程序員綜合編程能力的強弱,不只要看他的外功,還要看他的內功。低級程序員比的是「武功招式」,高級程序員比的是「武學修養」。對於一個真正的武學大師而言,其已經達到了無招勝有招的境界,即他已經不那麼看重所謂的招式了。數據結構