做者:zooboole
英文原文: 《Learning programming is different from learning a programming language》
咱們都是程序員,也是學習者。使人驚訝的是,如此多的人覺得本身在學習編程,卻已經步入歧途。php
你們都知道計算機科學不是研究計算機,它反卻是利用計算機研究自動解決問題的。問題解決是計算機科學,不是編程。這就許多計算機科學專業的學生彷佛不理解他們爲何要學習算法或數學的緣由。程序員
若是你之前上過計算機科學課,你就應該知道我在說什麼。由於你會注意到編程與編程語言幾乎沒有關係。問問本身爲何僞代碼在這些課程中如此常見。算法
可是,大多數自覺得是的程序員老是落入陷阱。在乎識到進行編程時到底什麼是應該要作的以前,咱們學習了幾十年的編程語言。我本身也是受害者。編程
我花了十多年的時間一點一點地學習各類編程語言。我學的越多,就越難以簡單的方式解決問題。我覺得是沒有找到合適的工具。但問題是,當我甚至還不知道這個工做要作什麼時,就去尋找合適的工具,而忘記了找出真正的工做是該作什麼。segmentfault
編程語言的奇怪之處在於它們老是在不斷髮展。編程語言幾乎天天都在變化,跟進很難。而大多數優秀的程序只使用了編程語言的一小部分。設計模式
首先,學習編程語言的問題就像在學習木工以前學習如何使用木工鋸,錘子和各類切割機器。木工須要注意:想法,可行性分析,測量,測試,客戶行爲。資深木匠感興趣的事物不止於錘子和釘子。在他對這項工做的研究中,還須要時間來檢查釘子、着色劑、木材等的質量。框架
編程是經過一次下達指令來設置一個系統自動運行。咱們天天都這樣作。咱們教咱們的孩子,命令咱們的士兵,服務咱們的客戶。咱們給予或收到指示,以自由/獨立的方式生活。父母不須要跟隨並指導你在生活中所作的每個動做。他們可能已經在生活的許多方面爲你編程了。編程語言
大多數學校和教學網站都會教授編程語言的語法。他們能夠添加一些設計模式(當你忽略到底是什麼設計時)、一些算術計算。教你如何聲明變量以及如何使用它們;教你如何聲明數據類型以及建立它們。工具
這並不能教你推理。但後來,您將會碰見推理方法。使用那些方法來學習,會讓你以爲是浪費生命或者花了不少時間來學習編程。學習
咱們用編程來解決問題,編程語言是幫助咱們達到目的工具。
它們就象工具箱,咱們稱之爲框架,幫助你組織你的思惟。
若是你正在學習編程且仍然沒法設計和編寫真實應用程序,那麼這就意味着你正在學習編程語言而不是編程。
咱們常常會遇到想知道如何建立程序的學習者。對於程序員來講,程序是一個問題求解。在使用任何編程語言以前,他經過關鍵分析解決了問題。當你解決任何問題時,你能夠用任何編程語言來編碼。咱們來看看平方求解的案例。爲了求解平方,咱們將它與本身相乘。咱們能夠用各類語言實現它,例如:
C語言
function square(int * x) { return x * x; }
PHP語言
function square ($x){ return $x * $x; }
Javascript語言
function square(x){ return x * x }
Scheme(a Lisp dialect)語言
(define (square x) (* x x))
您應該注意到實現中只有語法是不同的,解決方案是同樣的。這也是你幾乎可使用任何編程語言的主要緣由之一,在這種語言中你能夠更輕鬆地構建任何類型的軟件。
一般,問題出在人類語言,它充滿了侷限和錯誤。人類語言不能用來指令機器,由於它們不理解。
你學習編程時,是在學習一種新術語和工具,來幫助你以計算機或其餘程序員能夠理解和贊成的方式編寫邏輯。
一般,你將從簡單且相似人類語言的符號--僞代碼開始。它是從人類語言到計算機編程語言的良好過渡工具。這一般是爲了不浪費時間在具體的編程語言上,這樣你能夠徹底專一於推理。經過它,你將發現構成良好編程工具(語言)的核心部分。你知道了真正須要的是什麼、掌握了編程語言的核心目標。在編程實踐過程當中,你會不知不覺地就學會了這門編程語言。