我今天才知道:學(xué)習(xí)編程和學(xué)習(xí)編程語(yǔ)言是兩碼事
關(guān)注▲?W3Cschool▲?,每天一篇文章,與你共同成長(zhǎng)

作者丨zooboole
譯者丨galois
校對(duì)丨削微寒
大多數(shù)程序員、初學(xué)者都以為自己正在學(xué)習(xí)編程,其實(shí)并不是,而是在走彎路。
你可能正在學(xué)習(xí)一門(mén)編程語(yǔ)言,而不是編程本身
計(jì)算機(jī)科學(xué)不是學(xué)習(xí)計(jì)算機(jī),很震驚吧。相反,它是關(guān)于借助計(jì)算機(jī)來(lái)自動(dòng)解決問(wèn)題的一門(mén)學(xué)問(wèn)。解決問(wèn)題才是計(jì)算機(jī)科學(xué),而不是寫(xiě)代碼。這就是許多計(jì)算機(jī)科學(xué)專(zhuān)業(yè)的學(xué)生,似乎不理解他們?yōu)槭裁磳W(xué)習(xí)算法和數(shù)學(xué)的原因。
如果你以前上過(guò)計(jì)算機(jī)科學(xué)的課,那么你不會(huì)對(duì)此感到驚訝。因?yàn)槟銜?huì)注意到編程與編程語(yǔ)言幾乎沒(méi)有關(guān)系。思考一下,為什么偽代碼在這些課程中如此常見(jiàn)。
但大多數(shù)程序員總是會(huì)落入陷阱。我們學(xué)了十幾年編程語(yǔ)言,才意識(shí)到自己真正需要學(xué)的是編程,而我本身就是受害者。
我花了十多年的時(shí)間來(lái)學(xué)習(xí)各種編程語(yǔ)言。我學(xué)的編程語(yǔ)言越多,構(gòu)建簡(jiǎn)單的東西就越困難,我感覺(jué)找不到正確的工具。但問(wèn)題是,當(dāng)我不知道如何下手時(shí),我忘記了應(yīng)該去探索要做什么,而不是尋找正確的工具。
編程語(yǔ)言的奇怪之處在于它們總是在變化。編程語(yǔ)言幾乎每天都在變化,跟進(jìn)非常困難。而且大多數(shù)優(yōu)秀的程序僅用到了編程語(yǔ)言的一小部分。
優(yōu)先學(xué)習(xí)編程語(yǔ)言的問(wèn)題就像在學(xué)習(xí)木工之前學(xué)習(xí)如何使用木工鋸、錘子和各種切割機(jī)。木工需要注意:想法、可行性分析、度量、測(cè)試、用戶(hù)使用習(xí)慣,老木匠更關(guān)注這些。而不是錘子和釘子這些東西。在對(duì)工作進(jìn)行科學(xué)研究期間,他還將花時(shí)間檢查釘子、著色劑、木材等的質(zhì)量。
學(xué)習(xí)編程和學(xué)習(xí)編程語(yǔ)言有什么區(qū)別?
“編程” 通過(guò)給出一條指令來(lái)使系統(tǒng)自動(dòng)運(yùn)行。我們每天都這樣做,我們教我們的孩子、士兵、客戶(hù)。我們發(fā)出或收到指令,要求自由或獨(dú)立地按照規(guī)定的方式進(jìn)行。你的父母不需要一直跟著你,并指導(dǎo)你生活中的每一步,他們已經(jīng)在之前生活中的許多方面對(duì)你給予過(guò)指導(dǎo)(指令)。
大多數(shù)學(xué)校和教育網(wǎng)站都會(huì)教授編程語(yǔ)言的語(yǔ)法。他們還會(huì)添加一些設(shè)計(jì)模式(而你可能恰好忽略了設(shè)計(jì)模式是什么)、一些數(shù)學(xué)計(jì)算、如何聲明變量以及如何使用它們,數(shù)據(jù)類(lèi)型以及如何聲明和創(chuàng)建它們。
上面說(shuō)的那些編程語(yǔ)言的知識(shí)不會(huì)教你編程。當(dāng)你發(fā)現(xiàn)時(shí),你會(huì)覺(jué)得學(xué)習(xí)編程實(shí)在浪費(fèi)時(shí)間,大把的時(shí)間。
我們用編程來(lái)解決問(wèn)題,而編程語(yǔ)言是幫助我們解決問(wèn)題的工具。
它們就像工具箱,我們稱(chēng)之為框架。它們可以讓你的想法更有條理。
如果你正在學(xué)習(xí)編程,但仍無(wú)法設(shè)計(jì)和編寫(xiě)一個(gè)實(shí)際的應(yīng)用程序,這意味著你要花更多的時(shí)間去學(xué)習(xí)編程而不是編程語(yǔ)言。
我們遇到過(guò)很多人,他們?nèi)匀徊恢廊绾卧O(shè)計(jì)一個(gè)程序。對(duì)于程序員來(lái)說(shuō),一個(gè)程序是一個(gè)需要解決的問(wèn)題。在涉及任何編程語(yǔ)言之前,需要先認(rèn)真思考、理解問(wèn)題。當(dāng)你無(wú)論要解決什么問(wèn)題時(shí),其實(shí)都可以使用任何一種編程語(yǔ)言進(jìn)行編碼(重要的是思考要解決的問(wèn)題)。
讓我們以計(jì)算平方為例。計(jì)算一個(gè)數(shù)的平方,對(duì)自身進(jìn)行多次乘法計(jì)算。我們可以用多種語(yǔ)言來(lái)實(shí)現(xiàn)它,例如:
用 C 語(yǔ)言
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))
你會(huì)注意到,語(yǔ)法只決定具體實(shí)現(xiàn),而解決問(wèn)題的方法是相同的。這就是你幾乎可以使用任何你愿意使用的語(yǔ)言,構(gòu)建任何類(lèi)型的軟件的主要原因之一。
通過(guò)編程更容易理解一門(mén)語(yǔ)言
人類(lèi)語(yǔ)言是個(gè)問(wèn)題,因?yàn)槿祟?lèi)語(yǔ)言充滿(mǎn)局限和錯(cuò)誤,所以機(jī)器無(wú)法直接理解。
在學(xué)習(xí)編程時(shí),你將學(xué)習(xí)新的術(shù)語(yǔ)和新的工具來(lái)編寫(xiě)邏輯,這樣計(jì)算機(jī)或其他程序員也可以理解并達(dá)成共識(shí)。
通常,你將從一個(gè)簡(jiǎn)單的、類(lèi)似人類(lèi)語(yǔ)言,被稱(chēng)作偽代碼的語(yǔ)言開(kāi)始。它是從人類(lèi)語(yǔ)言到計(jì)算機(jī)編程語(yǔ)言的很好的過(guò)渡工具,這樣做是為了防止你在編程語(yǔ)言上浪費(fèi)時(shí)間。如此,你就可以完全專(zhuān)注于問(wèn)題的本身和解決的邏輯。通過(guò)這一過(guò)程,你將發(fā)現(xiàn)一個(gè)好的編程工具(語(yǔ)言)的核心部分,你就知道那些是重要的、你所需要的(如果你需要用錘子砸東西,就先學(xué)砸東西,釘釘子暫時(shí)用不到就先不學(xué))。
這樣一來(lái),你就會(huì)在不知不覺(jué)間就學(xué)會(huì)一門(mén)編程語(yǔ)言(完全掌握錘子的用法)。
參考資料
Learning programming is different from learning a programming language: https://phpocean.com/blog/article/learning-programming-is-different-from-learning-a-programming-language/80
-End-
編程獅(W3Cschool)
學(xué)編程,從W3Cschool開(kāi)始
微信掃描二維碼,關(guān)注公眾號(hào)
