學習一門新的編程語言首要您需要明白什麼是編程。

對於需要輸入的數據經過一系列工序達成預期的輸出。而把這個過程變成計算機能夠代爲執行的語言的過程就是編程。

這種例子生活中最典型的是做菜,一般而言越是精緻的菜餚工序越多。而程序源碼就是菜譜。不同的是程序源碼是由計算機執行預期目標的,而菜譜是有廚師來執行的。

如果把編程比做做菜,那麼編程的工具就是炊具。那麼編程的工具又是怎麼來的呢?我們要製作炊具,比如鐵鍋,我們需要採礦,冶鐵,製作模具,鑄造......等等工序。而我們做菜是不會從採礦開始的,同樣的我們編程也不會從製作編程工具開始的。我們知道鐵鍋也是由一系列工序構成,鐵匠就是執行工序的人。同樣的編程的工具也是編程而來的,執行的也是計算機。

我們知道了編程工具也是編程而來,那麼當計算機世界內第一個程序是怎麼來的呢?有知道計算機史的人大概會說是二級制機器語言,人類製作的第一臺現代計算機智能理解二級制語言,人們通過直接寫入硬盤的二進制語言讓計算機來執行,第一批軟件(工具)就是這麼形成的。但是我這裏有着不同的觀點,我通常認爲世界是先驗的,現有道而後有天地。第一套程序大概是來自於數字邏輯,人們基於現代邏輯學設計了門電路(只是二級制恰好能夠完美表達各類邏輯電路而已),畫電路圖大概是最早編程了,而後各類電路算法的實現形成了現代的計算機。

計算機內最常見的編程工具就是編譯器了,編譯器的本質就是翻譯器,把計算機不懂的語言變成二級制計算機能夠理解的語言,並且執行。舉例說,計算機不懂C語言,就有了C語言翻譯成彙編語言的工具,計算機但是也不懂彙編語言,於是就有彙編語言翻譯成二級制的工具。

再對比做菜,如果說編譯器是炊具,計算機是廚師,那麽源代碼就是菜譜,要書寫菜譜,妳不可能重新發明筆和紙,雖然在二級制編碼的時代,人們也是用紙打孔讓計算機理解的。我們現在用文本編輯器,如上所述,文本編輯器也是編程得來的。計算機的偉大之處也是在於各種東西最終都是二級制,而現實生活中,做菜,造炊具以及造紙幣是完全不同的事情,需要不同的執行者和材料。

有了合適的編譯器和文本編輯器,妳就可以指導妳的大廚做菜了。

接下來我們談談做菜的工序,從邏輯上說世上使用三種工序的組織方式:順序、循環、選擇。

一般而言菜譜都是順序的,就是每道工序都是有先有後的。比如西紅柿炒蛋的食譜(有其他做法,咱們不擡槓哈)如下:

主料:西紅柿,雞蛋
輔料:小蔥
配料:油,鹽,糖
步驟:

  1. 洗西紅柿
  2. 切西紅柿
  3. 雞蛋打散
  4. 坐鍋放油燒熱,倒入雞蛋
  5. 大火快速滑炒後裝起
  6. 用余油開始炒番茄
  7. 要壹直炒至出湯,出湯後再加小半碗水進去
  8. 等到湯汁漸濃之後把雞蛋和蔥花倒進去
  9. 炒勻,放少許白糖及鹽調味即可

但是仔細考慮考慮實際情況,炒完蛋可能油加少了,我們也可以設計選擇的結構,如下:

主料:西紅柿,雞蛋
輔料:小蔥
配料:油,鹽,糖
步驟:

  1. 洗西紅柿
  2. 切西紅柿
  3. 雞蛋打散
  4. 坐鍋放油燒熱,倒入雞蛋
  5. 大火快速滑炒後裝起
  6. 如果有餘油
  7. 用餘油開始炒番茄
  8. 如果沒有餘油
  9. 向鍋內加油,執行7
  10. 要壹直炒至出湯,出湯後再加小半碗水進去
  11. 等到湯汁漸濃之後把雞蛋和蔥花倒進去
  12. 炒勻,放少許白糖及鹽調味即可

我們從中也可以看到循環的結構,比如翻炒和觀察,翻炒就是廚師重複做幾個動作,通常循環必須和選擇一起出現,不然就會無線循環下去。菜譜可以這麼寫:

主料:西紅柿,雞蛋
輔料:小蔥
配料:油,鹽,糖
步驟:

  1. 洗西紅柿
  2. 切西紅柿
  3. 雞蛋打散
  4. 坐鍋放油
  5. 循環觀察油煙這個動作
  6. 如果冒煙,說明油已經熱了
  7. 停止觀察動作的循環
  8. 倒入雞蛋
  9. 大火快速滑炒後裝起
  10. 如果有餘油
  11. 用餘油開始炒番茄
  12. 如果沒有餘油
  13. 向鍋內加油,執行7
  14. 循環翻炒
  15. 循環觀察
  16. 如果出湯,加半碗水
  17. 停止觀察
  18. 停止翻炒
  19. 等到湯汁漸濃之後把雞蛋和蔥花倒進去
  20. 炒勻,放少許白糖及鹽調味即可

其實還有很多可以判斷,重複動作的描述,但是篇幅有限,就不再累述,編程本來就是一種細緻思考的過程,哈哈,有可能容易變得婆婆媽媽哦。

總結,順序、循環、條件選擇構成工序的基本特性。

計算機是執行力超強但是不知變通的執行者,你不能指望它和廚師一樣現場憑借經驗把主料,配料,輔料的用量搞清楚,但是計算機也不會像不合格的廚師那麼說好鹽10g,但是手一抖倒進去50g,把客人齁死。

所以定量很重要,一開始就要說明好需要處理的食材和配料到底多少。新的食譜如下:

主料:西紅柿400g,雞蛋2個
輔料:小蔥10g
配料:油70g,鹽10g,糖20g
步驟:

  1. 洗西紅柿
  2. 切西紅柿
  3. 雞蛋打散
  4. 坐鍋放油
  5. 循環觀察油煙這個動作
  6. 如果冒煙,說明油已經熱了
  7. 停止觀察動作的循環
  8. 倒入雞蛋
  9. 大火快速滑炒後裝起
  10. 用餘油開始炒番茄(事先定了量之後,就不需要判斷是否有餘油了)
  11. 循環翻炒
  12. 循環觀察
  13. 如果出湯,加半碗水
  14. 停止觀察
  15. 停止翻炒
  16. 等到湯汁漸濃之後把雞蛋和蔥花倒進去
  17. 炒勻,放白糖20g及鹽10g即可

這樣還有一個問題,有些數量不是事先能夠規定的,而是執行工序的過程中產生並且不斷變化的,比如湯汁濃稠度我們把事先能夠把握和規定的叫做常量,工序中產生的叫做變量。新的食譜如下:

主料:西紅柿400g,雞蛋2個
輔料:小蔥10g
配料:油70g,鹽10g,糖20g
步驟:

  1. 洗西紅柿
  2. 切西紅柿
  3. 雞蛋打散
  4. 坐鍋放油
  5. 循環觀察油煙這個動作
  6. 如果冒煙,說明油已經熱了
  7. 停止觀察動作的循環
  8. 倒入雞蛋
  9. 大火快速滑炒後裝起
  10. 用餘油開始炒番茄(事先定了量之後,就不需要判斷是否有餘油了)
  11. 循環翻炒
  12. 循環觀察
  13. 如果出湯,加半碗水
  14. 停止觀察
  15. 停止翻炒
  16. 開始記錄湯的濃稠度,初始爲0(不必糾結這個數字,就是一個標示程度的)
  17. 循環觀察湯的濃稠度
  18. 如果湯汁濃稠度到了100, 倒入雞蛋和蔥花
  19. 循環觀察結束
  20. 炒勻,放白糖20g及鹽10g即可

至此,我們已經明白了順序(實際編程中,語句一般用‘;’號間隔),選擇/判斷(if),常量(const),變量(variable)

說了這麼多概念,你該如何開始學習一門新的語言呢?我們已經瞭解編程語言不過是表達工序的工具,所以,在得到一門語言的學習書籍的時候,首先要搞清楚自己使用什麼文本編輯器來寫工序,然後瞭解使用什麼語言編譯器來翻譯你的工序給計算機執行,這門編程語言的常量和變量是怎麼定義的,這門語言順序,循環和選擇的邏輯結構是如何表達,也許一天你就能夠入門了。

既然概念如此容易,編程到底難在什麼地方呢?答案在編程之外的能力,設計良好的數據結構(你如何安排好你的廚房的擺設)可以方便工序操作提高執行效率,精巧的算法(比如多個廚師流水分工,或者同時做不同的事情的協調)。

此外,很多時候判斷語句是很難的,比如上面菜譜中湯汁的濃稠度,這就需要數據建模對湯汁濃稠度給出準確定義。而複雜判斷,比如以下命題:

A說B說謊,B說C說謊,C說AB說謊,那麽誰說的是真話誰說的是假話。

系統地邏輯學學習和訓練可以保障你的程序不會有業務性錯誤。

好的程序員一定是博聞強識的,其他的就是代碼搬運工。

與君共勉。