普通人學編程應該學到什麼程度?
比爾蓋茨說編程應該成為21世紀人人必備的技能。在現在來看,一般人懂一些編程技能對生活很有幫助。現在這麼多編程語言,那麼普通人應該學習那些內容、學到什麼程度呢?
請為了解決特定問題而學編程,不要為了學而學,謝謝。
/**
* 感謝題主的提問,讓我又重燃了回答問題的慾望…
* 感謝 @張一弘 先生認真的回答,想在他的基礎上補充一些關於編程語言和其它的內容。
*/
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通常用& &&
&
&
文章標題&
&文章內容&&
請注意找到CSS的位置。如此修改後,再打開剛剛的網頁,你且再看————
……… …… … 還是很醜對不對!沒錯,但是已經比起第一版已經有些許不同了,而這就是CSS的功勞。但是這個網頁還什麼都不能做耶!怎麼辦?這時候我們就要祭出JS了。 JavaScript。是一種瀏覽器腳本語言,用於給HTML文件定義交互行為。其實到了JS這一步,才算做「編程」,不過我們編出來的結果實際上也不是程,而是一個網頁,或者說是一個web應用。JS腳本通常用&&
&
&
&
&
&
&
&
&
這是一個網頁表&
&&
現在時間: &-- : -- : --&&
&&&
&&
&
&
&
&
再把這段融合了HTML/CSS、JS的代碼放到我們剛剛的文檔中,運行結果就是一個簡單的網頁電子錶。(為什麼不做指針表?當然是因為指針表比較複雜…)
總的來說,HTML就相當於一個人的骨架,定義了這個人的結構,如哪裡是頭,哪裡是腿。CSS就相當於一個人的外觀,如高矮胖瘦,好不好看。JS定義了一個人的行為,如行走、吃飯。學會了這3個技巧,就能製作出有模有樣的網頁了。在日常瀏覽網頁的時候,也可以通過這些知識,提高自己的瀏覽體驗。 舉例來說,小B用bilibili看○酷視頻時,經常無法載入。她只會到評論區翻黑科技鏈接。而小A可能會這麼做:/* 這段代碼是被壓縮過然後剛剛又格式化回來的,所以變數名什麼的就請不要在意了 */
javascript: (function() {
var c = document.getElementById("bofqi");
if (c == null) {
alert("u672au627eu5230u5339u914du7684u64adu653eu5668")
} else {
var a = c.innerHTML.match(/cid=[d]*/g);
if (a == null) {
alert("u672au627eu5230cid")
} else {
var d = "https://secure.bilibili.tv/secure," + a[0];
var b = prompt("u5df2u63d0u53d6u76eeu6807URLuff0cu70b9u51fbOKu76f4u63a5u8df3u8f6c", d);
if (b != null) {
window.location.href = b
}
}
}
})();
把(除去注釋外的)這段代碼,添加到網頁收藏夾里,每次點擊收藏夾,黑科技就會出來了。小A欣喜地告訴了小B,然後
personXiaoA.ooxx(personXiaoB);
當然了,這種事情並沒有發生,這裡只是舉一個JS應用的例子嗯。
另一個用處的例子是,我們可以發現更多的招聘機會,如: 此外,Chrome的插件、和PhotoShop的腳本(如果我沒記錯的話),也是可以用JS寫的。2.2. PHP
為什麼要推薦PHP?因為它免費,因為我接觸的PHP比其它伺服器端語言多。PHP是不是最好的?…不告訴你,因為這並不是一個好問題…
PHP是一種伺服器端腳本語言。什麼是伺服器端腳本語言?JS是在我們的電腦上運行的,而PHP是在我們訪問的網頁所在的機器上運行的。舉個例子,當我們在訪問一個博客的時候,我們的評論、贊等行為,往往是JS控制,運行在我們的機器上。而這篇博客的內容是什麼,評論有哪些,贊了這篇博客的人有誰,這些內容就可能是PHP(從資料庫中)向我們返回的了。因此,我們可能還需要學資料庫的相關知識,如SQL語言等。 伺服器腳本語言有什麼用?如剛剛的電子錶頁面,如果僅僅用瀏覽器腳本(JS)寫,我們獲得到的將是自己機器(運行JS的機器)上的本地時間。由於本地時間不同,或時區不同,可能導致不同機器上的時間不一致。而如果用伺服器語言來獲取伺服器時間,當作初始值,再進行處理,那麼無論時區或本地時間如何不同,得到的結果都應該是準確的。 請原諒我這部分沒有舉例。因為如果要舉例的話,篇幅可能會受不了…總之,如果掌握了這些知識,恭喜你,你基本上已經可以建立一個自己的網站了。或者一些數據關聯的web應用(如:停車場管理系統)。2.3. C
有名的C語言。C語言是一種面向過程的高級程序設計語言。如果你開發的是C程序,你就可以自豪(或不自豪地)宣稱自己是個程序員了。 為什麼是C,不是C這C那,不是java?因為C可以很基礎,可以漸進到C++和C#的面向對象,可以跳到java等其他語言,也可以就停在C語言了。而且有很多的演算法書也是用C語言解釋的。 如果真的要學習這種真正意義上的程序設計語言,我們就需要付出更多的時間,來學習 數據結構 和 演算法 ,以及其基礎知識。而我們得到的收穫也會很多。 (什麼收穫?再學下去你馬上就要成為真正的程序員了!入行吧少年!)但是我覺得對於「普通人」,學習真正的程序設計語言的成本還是過大了。 2.4. bat bat也不是程序設計語言,而是批處理命令。在windows系統中,bat會依序調用我們寫好的程序。簡單來說就是我們把將要做的事情都寫在*.bat文件內,然後讓它一口氣運行,從而節省我們的操作。bat可以做很多事情,如創建/刪除/修改目錄、文件,控制計算機網路連接/斷開,甚至關機等。
創建bat及其簡單,用記事本寫好後,保存後綴為bat,再運行即可。一個簡單的例子:@echo off
echo 正在清除系統垃圾文件,請稍等......
del /f /s /q %systemdrive%*.tmp
del /f /s /q %systemdrive%*._mp
del /f /s /q %systemdrive%*.log
del /f /s /q %systemdrive%*.gid
del /f /s /q %systemdrive%*.chk
del /f /s /q %systemdrive%*.old
del /f /s /q %systemdrive%
ecycled*.*
del /f /s /q %windir%*.bak
del /f /s /q %windir%prefetch*.*
rd /s /q %windir% emp md %windir% emp
del /f /q %userprofile%cookies*.*
del /f /q %userprofile%
ecent*.*
del /f /s /q "%userprofile%Local SettingsTemporary Internet Files*.*"
del /f /s /q "%userprofile%Local SettingsTemp*.*"
del /f /s /q "%userprofile%
ecent*.*"
echo 清除系統LJ完成!
echo. pause
這就是大名鼎鼎,經久不衰的清除系統lj,用於刪除你系統目錄下的各種臨時文件。
另一個例子:shutdown /r /t 60 /c "您的計算機發生致命錯誤,將於1分鐘後重啟。"
沒錯,運行它就會調用關機程序,參數依次是重啟(/r)、計時60秒(/t 60),提示「您的計算機發生致命錯誤,將於1分鐘後重啟。」(/c "comment")。如果我們把這個文件放到系統的 「啟動」 文件夾內,那麼理論上每次開機,它都是會被執行的…
此外,bat還可以用來做很多其他事情,比如批量修改文件名等等。記得以前有一陣,我們學校上網要裝撥號器,裝之前有一個號段的所有帳號,密碼都統一修改為0123456789,這時候寫一個bat文件跑那個號段,測試哪些帳號是開通了的,然後記在一個txt里當作字典。下次再從裡面選著連接就可以…嗯…3. 應該學到什麼程度
同問題2,其實這裡也沒有應該學到什麼程度。我也只能回答建議你學到什麼程度。這個程度對於不同的語言是不一樣的,但是我認為標準應該是:既讓你獲得了收益,又不會厭煩繼續學習的程度。 什麼意思? * 如果你「了解了一下,或者還沒有了解編程,就已經厭煩了。」我建議你先看看,但是這種情況下也不能勉強對吧。 * 如果你「看了一些編程知識,但是還沒獲得收益。」我建議你再看看,因為你離成功不遠了。 * 如果你「獲得了收益,而且還想看。」…入行吧少年!程序員們需要你! * 如果你「獲得了收益,再看就要吐了。」那麼停止吧,編程只能幫你這麼多了!總的來說,就是既對你有幫助,又沒有太多不利影響的時候。
至此,我關於這個問題的看法,以及相關信息(大部分是相關信息)都說完了,因為說了很多補充內容,所以請大家一定要有所取捨的看!而且,這些內容全部是個人觀點,並不代表是正確的,也不代表適合你,只是參考,或者最好能起到拋磚引玉的作用。希望能對大家有所幫助,非常感謝!
分享一些學習編程的網站:
* 《Learn to code》 通過交互學習JavaScript,以及編程思想。
* 《首頁 - Mozilla Webmaker》 通過交互學習HTML/CSS、JavaScript。* 《w3school 在線教程》 一個傳統的學習web開發的地方。還有各路大神的博客,在這裡就不一一推薦了…/**
* 最後,感謝大家看到這裡(或者沒看到這裡)。
* 以上內容一定有很多疏漏或者錯誤,煩請大家幫忙在評論里指出,我會進行修改。
* 如果大家有疑問或異議,也歡迎在評論里討論,共同學習。
* 希望能對大家有所幫助,再次感謝!
*/
寫一個程序給自己老媽用,讓她可以查詢就知道家裡東西放在哪裡,親戚電話號碼多少就可以了。
假如編完這個程序,你還繼續有濃厚興趣,再寫一個按照老爸需要的小程序,做一個解決問題的人,程序能做的是幫人過得更懶。以生活實用性來說我建議掌握幾個最有用的工具和小技巧,比如
windows下的基本快捷鍵(能用鍵盤的就不用滑鼠)批量重命名工具,推薦Bulk Rename Utility文件名搜索工具,推薦Everything文本內容搜索工具,推薦grepWin文件/目錄 比較工具,推薦WinMerge版本控制工具,推薦git(掌握基本提交和恢復就夠用了)。在生活中能養成習慣使用版本控制的話,不只生活質量檔次大大地提高,在關鍵時刻你會非常的感激自己能堅持有版本控制的習慣文件同步工具,這個兩類情況使用 一類是重要文件一定要定期備份,硬碟是電腦中損壞概率最大且最令人心痛的部件了,推薦有一個專門的備份硬碟(有條件的話就不要把備份放在同硬碟中),工具推薦FreeFileSync 另一類是方便多台電腦,手機,平板間的網路同步。這個沒有非常好的推薦,如果文件不多就推薦堅果雲,如果文件多就推薦金山快盤。基本上都不能讓人很滿意最後一個不是工具,而是一種強迫症,把你的硬碟整理整齊,文件名寫清楚會死嗎!!
關於編程語言的學習,我建議了解主流語言主要處理的問題和應用場景。比如HTML張什麼樣子,在哪裡會運用到。CSS主要是為了處理什麼問題。SQL運行得到怎樣的結果。。。具體的學習過程,看看簡介,學習一個120分鐘入門,寫幾個DEMO就好了。基本上是一個了解的過程,有點像你花2個小時學會一種最簡單的還原魔方的套路。這樣已非常小的時間代價了解一個技能。遇到具體問題的時候再深入學習。如果真的有興趣我推薦學習前端HTML CSS JS知識,每天都會看到他們的應用,而且通過簡單修改也許你會看到很多有意思的東西,比如 某些論壇的回復顯示其實是不用回復的 某些5分鐘不動就會被強制退出的網站你是可以把這個定時器刪除的普通人也就上上網,又不靠編程賺錢養家,所以能看懂主流的網頁語言,比如HTML和JSP這樣的就可以了。或者能用好excel的VBA就相當不錯了,對日常工作幫助很大,立馬讓同事覺得你高大上。
不要把注意力放在技術上,要放在思維上。編程思想有很多都達到了哲學和方法論高度,有很強的實用性。通過寫程序領悟哲理,提高邏輯思考能力,提高認知能力(認知心理學、NLP和編程都有交集)。這些是非專業人士學編程的作用。
學習永遠是圍繞需求進行的,需要多少就學多少。未來人應該會點編程,就像現在應該會用鎚子,扳手一樣
我覺得普通人了解一些原理就好了,能知道那些事情技術可以做,那些事情是技術做不到的。不過對普通人來說這個好像也不容易。
我覺得學會C就可以了,不是說C可以讓你做很多事情,但它可以讓你入門,以後不論你碰到工作中的excel函數或者一些小的腳本,你會覺得:啊,這種東西有點像C,好多機制都類似。C是一種基礎,讓你學其他東西的基礎
推薦閱讀:
※關於更好地工作四個可行建議
※初生牛犢不怕虎和老當益壯將會越來越突出
※震驚短短三個月她怎麼就能從助理升為總監
※非線性事件應該怎麼處理?
※喬布斯、張小龍、馬化騰、周鴻禕、俞軍:告訴你產品經理的核心能力