普通人學編程應該學到什麼程度?

比爾蓋茨說編程應該成為21世紀人人必備的技能。在現在來看,一般人懂一些編程技能對生活很有幫助。現在這麼多編程語言,那麼普通人應該學習那些內容、學到什麼程度呢?


請為了解決特定問題而學編程,不要為了學而學,謝謝。


/**
* 感謝題主的提問,讓我又重燃了回答問題的慾望…
* 感謝 @張一弘 先生認真的回答,想在他的基礎上補充一些關於編程語言和其它的內容。
*/

  首先贊同並感謝一下 @張一弘 先生的答案,Markdown確實是一個很好的語言(我覺得應該作為一種標準…),Processing並未接觸過,所以不好在此論述。因此,我想在張先生的答案的基礎上進行一些補充,補充的內容針對問題主要涉及以下幾個方面:

1. 編程對生活有什麼幫助

  1.1. 鍛煉抽象思維能力

  1.2. 鍛煉邏輯思維能力

  1.3. 應用程序解決實際問題

  1.4. 學習電腦知識和英語

2. 應該學習哪些編程知識

  2.1. HTML/CSS、JS

  2.2. PHP

  2.3. C

  2.4. bat

3. 應該學到什麼程度

  其間解釋了一些原理性的東西,希望能夠幫助大家理解。但非常抱歉的是,這篇回答會變得比較長,不關心的人或者已經知道了的人就請直接跳過,直接看粗體和下劃線的文字就好了。謝謝!

1. 編程對生活有什麼幫助?

  編程對生活的幫助很多,具體體現也因人而異。一個傳統的程序員接受到的訓練,從高等數學到數字邏輯,到程序設計語言語法,到數據結構與演算法,帶來的將是一整套的系統的收益。而針對題中的前提,作為無法投入那麼多學習成本的普通人,學習編程的收益主要有以下4點:

  1.1. 鍛煉抽象思維能力

    此處的抽象思維能力,我暫且把它定義成一種「將現實生活中的事或物,通過抽象,轉化成一種模型的能力」,不知是否準確。通過將存在問題的事或物抽象成某種模型,我們可以更加輕鬆地透過現象看本質,從而解決問題。

    高級程序設計語言可以分為 面向過程(link: 程序編程) 和 面向對象(link: 面向對象程序設計) 等。其中面向過程的思想,善於將一個事情抽象成若干個過程,如:「我的一天」大致可以抽象成: 起床(); -&> 吃早飯(); -&> 坐車(); -&> 工作(); -&> 吃午飯(); -&> 工作(); -&> 吃晚飯(); -&> 加班(); -&> 坐車(); -&> 睡覺(); 。而一個稍微複雜一些的例子則可以用如下的流程圖來表示:

    而面向對象的思想,則是將一件事物抽象成對象。一個對象可以有自己的屬性和方法(如「我」作為一個對象,具有「姓名」、「性別」等屬性,也具有「刷知乎」這個方法。)。一個對象也可以由一個類來構造,並繼承這個類的屬性和方法(如「我」作為一個「人類」,繼承了「人類」所共有的屬性,如「能直立行走」、「會使用工具」等)。如:使用javascript構造「小A」和「小B」,繼承於其超類「人類」。

var personXiaoA = new person ({
name: 小A,
gender: 男
});
var personXiaoB = new person ({
name: 小B,
gender: 女
});
personXiaoA.ooxx(personXiaoB);

    在這裡,我們基於「人類」(person)創建了小A(personXiaoA)和小B(personXiaoB),並讓他們做了一些事情…什麼的…嗯,總之,其中,name屬性和gender屬性,都是創建對象的時候賦予給被創建的人(對象)的,而ooxx方法在這裡沒有被再次定義,因為它是繼承於「人類」這個超類,即:所有人類生來就會ooxx,無需教他。(當然我們也可以給小A重複定義一下ooxx方法,以增強他的ooxx水平。)

    那麼,有這種能力有什麼用呢?簡單來說就是將一個複雜問題抽象化,從而可以進行定性定量地分析。這種事情如果做大做強,我覺得可以參考 數學建模 …當然我們不需要做到數學建模的地步,我們只需要能夠抽象出一個事物中,我們關心的相關項,然後進行比對或分析,可能就能夠更簡單地解決問題。

  1.2. 鍛煉邏輯思維能力

    邏輯思維能力是生活中一項重要的能力。(我覺得也是一些人所缺少,或者說需要鍛煉的一種能力。)

    一個簡單邏輯笑話(也可以當成文字遊戲…):

    事實上,我們的生活中充斥著邏輯的謬誤。沒發現?看看這篇wiki就知道了:謬誤列表 。通過邏輯思考,我們能夠辨別生活中的各種謬誤,以做出正確地判斷。如下面一句很常見的論述:

  如果你買J國的車,J國的公司就會盈利,J國就會更有錢,J國就能夠製造更多武器設備。因此你每買一量J國的車,就是在為J國造一輛坦克。

    此句為典型地滑坡謬誤。滑坡謬誤的特點是如果A則B、B則C、C則D,從而推出如果A則D。但是實際上,A到B、B到C、C到D之間並非必然的因果聯繫,可能只是概率事件,甚至某些聯繫是未知的,因此無法從A一路推到D。

    那麼擁有邏輯思維能力有什麼用呢?通過養成良好的邏輯思考能力,通過合理地觀察和分析事物間的特徵和聯繫,我們更有可能避免這種詭辯的誤導,從而能夠對問題做出更理性和正確地判斷,或者能夠更合適和恰當地表達出自己的觀點。

/* 什麼?你說女朋友提出的問題如何通過邏輯解決?
程序員從不思考這個,因為程序員通常沒有女朋友。 */

    當然,上面那段注釋里的內容也存在邏輯問題。如果你說你什麼都沒看到?那麼恭喜你…

  1.3. 應用程序解決實際問題

    以上兩點主要是在學習編程的過程中培養的。而當學會一門語言後,用來解決實際問題又是另外一回事兒了。

學習編程語言,能夠解決什麼實際問題呢?很多,以至於我不能展開寫,只能簡單地說一下。因為能解決哪些實際問題,主要取決於我們學習的是哪種語言…所謂「術業有專攻」,不同的編程語言所能達到的效果,也是各不相同的。具體的應用我將在下面舉例說明。

  1.4. 學習電腦知識和英語

    在學習編程的時候,勢必會接觸到各種電腦知識,也會涉及到英語問題。以後電腦可以自己修了,不用麻煩身邊計算機學院的同學了對不對?

// 如果你是女神,請忽略這一段話。

// 我會告訴你學了編程以後還能看懂知乎上的程序員笑話嗎?媽媽再也不擔心我笑點高了!

2. 應該學習哪些編程知識

  首先應該學習抽象和邏輯的能力,不用刻意去看書,因為在學習編程語言時,這兩個問題幾乎是無法規避的,只要學習語言的過程中多想一想就可以了。

  那麼應該學習哪門編程語言呢?我認為,沒有哪門編程語言是應該學習的(別抽我…),因為幾乎每門語言都有他的實際用途。所以這裡我只能把問題改成,我推薦學習哪門編程語言。

  這裡又要插一句,之前與張先生探討過Markdown不算編程語言,但是這種標記語言也確實是計算機中不可組成的一部分。此外,一些腳本語言也不該歸到程序設計語言里,但是也是很重要的一部分,因此這裡我想將編程語言不僅僅局限於程序設計語言中,而是拓展到包含標記語言和腳本語言的範圍。

  這裡還需要再插一句,這部分內容只是個人觀點,並不一定是正確的,也不一定是適合你的。至於為什麼如此選擇,我會寫下原因,以下內容只能起一些參考作用。

  總之,我推薦學習的語言是下面這些:

  2.1. HTML/CSS、JS

    沒錯,我就是苦逼的前端工程師,所以推薦web開發的這一套(請不要呵呵我)。原因是:應用廣泛,上手簡單,不需要搭環境,不需要編譯,僅僅藉助notepad就可以寫出屬於你的網頁應用。下面來詳細解釋一下這些都是什麼。

    HTML,超文本標記語言。開發者通過編寫HTML語言,交由瀏覽器處理,以呈現各種網頁。

    一個典型的HTML:

&
&
&網頁標題&
&

&
&文章標題& &文章內容& &

&

    每一套相互匹配的尖括弧,叫做一個標籤。可以看到,所有的標籤都(應該)是閉合的,有層級關係的。如最外層是& ... &,代表該html的開始和結束。&標籤里定義了一些不會被直接顯示到頁面,但是會影響頁面的內容。如裡面的&標籤定義了文檔的標題,也就是在瀏覽器窗口或標籤上顯示的文本。我們現在看到的頁面的&應該就是「普通人學編程應該學到什麼程度? - 知乎」。&標籤代表頁面內容的開始和結束,裡面有一個&標題和&塊,均是頁面的內容。我們可以打開記事本,把這段代碼放到記事本里,保存成*.html格式文件,再用瀏覽器打開,我們就能看到你的第一個網頁————

    ………

    ……

    …

    丑!對,沒錯,丑爆了有木有!為了解決這個問題,我們接下來介紹CSS。

    CSS,層疊樣式表。用來定義HTML元素是應該如何被瀏覽器呈現出來的。什麼叫如何被呈現出來的?就是用來定義一個元素的諸如位置、尺寸、顏色等信息。CSS通常用&標籤進行定義,如:

&
&
&網頁標題&

&
&