- 原文地址:Learning programming is different from learning a programming language
- 原文作者:zooboole
- 譯者:HelloGitHub-galois
- 校對:HelloGitHub-削微寒
- 翻譯工具:breword
大多數程式設計師、初學者都以為自己正在學習程式設計,其實並不是,而是在走彎路。
你可能正在學習一門程式語言,而不是程式設計本身
電腦科學不是學習計算機,很震驚吧。相反,它是關於藉助計算機來自動解決問題的一門學問。解決問題才是電腦科學,而不是寫程式碼。這就是許多電腦科學專業的學生,似乎不理解他們為什麼學習演算法和數學的原因。
如果你以前上過電腦科學的課,那麼你不會對此感到驚訝。因為你會注意到程式設計與程式語言幾乎沒有關係。 思考一下,為什麼虛擬碼在這些課程中如此常見。
但大多數程式設計師總是會落入陷阱。我們學了十幾年程式語言,才意識到自己真正需要學的是程式設計,而我本身就是受害者。
我花了十多年的時間來學習各種程式語言。我學的程式語言越多,構建簡單的東西就越困難,我感覺找不到正確的工具。但問題是,當我不知道如何下手時,我忘記了應該去探索要做什麼,而不是尋找正確的工具。
程式語言的奇怪之處在於它們總是在變化。程式語言幾乎每天都在變化,跟進非常困難。而且大多數優秀的程式僅用到了程式語言的一小部分。
優先學習程式語言的問題就像在學習木工之前學習如何使用木工鋸、錘子和各種切割機。木工需要注意:想法、可行性分析、度量、測試、使用者使用習慣,老木匠更關注這些。而不是錘子和釘子這些東西。在對工作進行科學研究期間,他還將花時間檢查釘子、著色劑、木材等的質量。
學習程式設計和學習程式語言有什麼區別?
“程式設計” 通過給出一條指令來使系統自動執行。我們每天都這樣做,我們教我們的孩子、士兵、客戶。我們發出或收到指令,要求自由或獨立地按照規定的方式進行。你的父母不需要一直跟著你,並指導你生活中的每一步,他們已經在之前生活中的許多方面對你給予過指導(指令)。
大多數學校和教育網站都會教授程式語言的語法。他們還會新增一些設計模式(而你可能恰好忽略了設計模式是什麼)、一些數學計算、如何宣告變數以及如何使用它們,資料型別以及如何宣告和建立它們。
上面說的那些程式語言的知識不會教你程式設計。當你發現時,你會覺得學習程式設計實在浪費時間,大把的時間。
我們用程式設計來解決問題,而程式語言是幫助我們解決問題的工具。
它們就像工具箱,我們稱之為框架。它們可以讓你的想法更有條理。
如果你正在學習程式設計,但仍無法設計和編寫一個實際的應用程式,這意味著你要花更多的時間去學習程式設計而不是程式語言。
我們遇到過很多人,他們仍然不知道如何設計一個程式。對於程式設計師來說,一個程式是一個需要解決的問題。在涉及任何程式語言之前,需要先認真思考、理解問題。當你無論要解決什麼問題時,其實都可以使用任何一種程式語言進行編碼(重要的是思考要解決的問題)。
讓我們以計算平方為例。計算一個數的平方,對自身進行多次乘法計算。我們可以用多種語言來實現它,例如:
用 C 語言
function square(int * x) {
return x * x;
}
用 PHP
function square ($x){
return $x * $x;
}
用 JavaScript
function square(x){
return x * x
}
用 Scheme(一種 Lisp 方言)
(define (square x) (* x x))
你會注意到,語法只決定具體實現,而解決問題的方法是相同的。這就是你幾乎可以使用任何你願意使用的語言,構建任何型別的軟體的主要原因之一。
通過程式設計更容易理解一門語言
人類語言是個問題,因為人類語言充滿侷限和錯誤,所以機器無法直接理解。
在學習程式設計時,你將學習新的術語和新的工具來編寫邏輯,這樣計算機或其他程式設計師也可以理解並達成共識。
通常,你將從一個簡單的、類似人類語言,被稱作虛擬碼的語言開始。它是從人類語言到計算機程式語言的很好的過渡工具,這樣做是為了防止你在程式語言上浪費時間。如此,你就可以完全專注於問題的本身和解決的邏輯。通過這一過程,你將發現一個好的程式設計工具(語言)的核心部分,你就知道那些是重要的、你所需要的(如果你需要用到錘子砸東西,就先學砸東西,釘釘子暫時用不到就先不學)。這樣一來,你就會在不知不覺間就學會一門程式語言(完全掌握錘子的用法)。
關注 HelloGitHub 公眾號
歡迎熱愛技術和開源的小夥伴加入 HG 推出的譯文亦舞系列的翻譯中來,可新增微訊號:HelloGitHub(備註:翻譯)。