日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
非科班出身的人學(xué)習(xí)編程不負(fù)責(zé)任指南

為何要寫(xiě)這樣一篇文章

成都創(chuàng)新互聯(lián)公司專注于通州企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站開(kāi)發(fā)。通州網(wǎng)站建設(shè)公司,為通州等地區(qū)提供建站服務(wù)。全流程定制開(kāi)發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

來(lái)我們這個(gè)實(shí)驗(yàn)室里讀研的學(xué)生可能自從來(lái)到這里的第一天就覺(jué)得自己的命運(yùn)很苦逼。他們讀本科時(shí)主修的是機(jī)械設(shè)計(jì)、制造以及自動(dòng)化之類的專業(yè),畢業(yè)時(shí) 的簡(jiǎn)歷上也頂多是寫(xiě)寫(xiě)擅長(zhǎng) MS Word、PowerPoint、UGNX、AutoCAD 之類的應(yīng)用軟件。他們有限的學(xué)習(xí)生涯里,怎么也不會(huì)想到來(lái)到這里竟然要首先重新學(xué)習(xí) C 語(yǔ)言,然后還要學(xué) C++,接下來(lái)還要學(xué)習(xí) Python 或 Lua 什么的,而且竟然還不讓用 Windows,只能用連個(gè) QQ 都沒(méi)有并且經(jīng)常出故障的 Linux……

在他們心里,編程似乎并不是多么有趣的事,所以他們就覺(jué)得編程很難。對(duì)此我有同感,大家都會(huì)玩的 Windows 里的挖雷與紙牌那樣的小游戲,還有很多人會(huì)打的麻將,還有圍棋,這些事我覺(jué)得也挺難的。

我曾經(jīng)告訴他們,如果不會(huì)編程,那么他們就很難解決自己的研究方向上的那些問(wèn)題,因此也就不可能寫(xiě)出有價(jià)值的論文,不可能順利的畢業(yè)拿到學(xué)位,不可 能找到很好的工作……這種功利性的『威脅』,對(duì)于有些人會(huì)有點(diǎn)效用,但是如果沒(méi)有能力讓他們自發(fā)的對(duì)編程產(chǎn)生足夠的興趣,這對(duì)于任何一個(gè)『好為人師』的人 而言都是一種莫名其妙的羞辱。

現(xiàn)在我試著去告訴他們,編程不僅不難,而且會(huì)很有趣,其中充滿著值得深思的東西,而這些深思對(duì)于我們?nèi)松矔?huì)產(chǎn)生許多增益。于是,就有了這篇文章。

編程是什么

無(wú)論你是不是程序猿,每一天你都在編程,每一天你都被編程。編程,就是設(shè)計(jì)一些步驟,組織這些步驟,讓這些步驟在當(dāng)前環(huán)境中正確的運(yùn)行,最終得出自己想要的結(jié)果。

你的每一天都是在起床、喝水、吃飯、工作、上廁所、娛樂(lè)、睡覺(jué)等步驟的有序組織下運(yùn)轉(zhuǎn)的,你活在這個(gè)程序中,同時(shí)你在這個(gè)程序中為改善自己的生活而制定各種計(jì)劃并努力去實(shí)現(xiàn)。

機(jī)械設(shè)計(jì),其實(shí)比編程還要編程。所謂的機(jī)械零件,就是數(shù)據(jù)結(jié)構(gòu)。所謂的傳動(dòng)機(jī)制,就是應(yīng)用程序接口(API)。所謂發(fā)動(dòng)機(jī),就是程序的內(nèi)核。你將零件裝配好,通過(guò)傳動(dòng)機(jī)制將它們接駁到發(fā)動(dòng)機(jī)上,于是你就創(chuàng)造出來(lái)一部機(jī)器,通上電或者打著火,就可以讓它運(yùn)轉(zhuǎn)起來(lái)。

編程比機(jī)械設(shè)計(jì)來(lái)的更為簡(jiǎn)單,你不需要經(jīng)常給自己所編寫(xiě)的程序添加潤(rùn)滑油,也不需要去對(duì)每個(gè)數(shù)據(jù)結(jié)構(gòu)進(jìn)行復(fù)雜的力學(xué)分析,更不需要關(guān)注這些數(shù)據(jù)結(jié)構(gòu) 是否嚴(yán)絲合縫的相互配合,至少目前的計(jì)算機(jī)軟件工程是這個(gè)樣子的,它不像機(jī)械工程學(xué)科那樣以堅(jiān)實(shí)的物理定律為基礎(chǔ)。機(jī)械的結(jié)構(gòu)與運(yùn)行規(guī)律總是可計(jì)算、可分 析的,而軟件的結(jié)構(gòu)與運(yùn)行過(guò)程卻充滿著太多不嚴(yán)格的環(huán)節(jié)。這種不嚴(yán)格,卻給我們營(yíng)造了一個(gè)可以發(fā)揮天賦或工科實(shí)踐經(jīng)驗(yàn)的空間。顯然,即使軟件工程存在著各 種不嚴(yán)格,但是我們卻能夠通過(guò)編程模擬出機(jī)械工程的一切。事實(shí)上也是如此,現(xiàn)代的機(jī)械工程領(lǐng)域,軟件已經(jīng)無(wú)處不在。

機(jī)械設(shè)計(jì)有很多精妙的『算法』,像縫紉機(jī)、槍械、發(fā)動(dòng)機(jī)之類的機(jī)構(gòu),設(shè)計(jì)它們其實(shí)要比計(jì)算機(jī)世界里的算法設(shè)計(jì)難得多,而且這些機(jī)構(gòu)對(duì)人類文明的發(fā)展 往往能夠產(chǎn)生巨大的推動(dòng)作用。希望你不要因此愛(ài)上機(jī)械設(shè)計(jì)……學(xué)會(huì)編程,你會(huì)對(duì)機(jī)械設(shè)計(jì)的理解更為深刻。因?yàn)榫幊淌菍ⅰ涸O(shè)計(jì)』本身作為一種智力活動(dòng)而對(duì)待 的。你可以將機(jī)械工程領(lǐng)域的那些智力活動(dòng)應(yīng)用于編程,也可以將編程中的智力活動(dòng)應(yīng)用到任何設(shè)計(jì)之中

正如 SICP 一書(shū)的序言所言,教育者、將軍、營(yíng)養(yǎng)學(xué)家、心理學(xué)家以及父母?jìng)?,他們做?guī)劃,而士兵、學(xué)生以及某些社群則被規(guī)劃。克服大型的問(wèn)題,要經(jīng)過(guò)一系列的規(guī)劃,其 中大部分規(guī)劃會(huì)運(yùn)作于現(xiàn)實(shí)之中,因?yàn)檫@些規(guī)劃總是與迫切處理的問(wèn)題息息相關(guān)。若將規(guī)劃這件事情本身作為一項(xiàng)智力活動(dòng)來(lái)欣賞或研究,那么就必須轉(zhuǎn)到計(jì)算機(jī)編 程上面來(lái)。你需要閱讀與編寫(xiě)計(jì)算機(jī)程序,而且要大量的做。程序是怎樣的,它們的功能是什么,這些不太重要,重要的是它們的性能如何,它們之間能否精巧的相 互配合從而構(gòu)造更大規(guī)模的程序。

入門(mén)書(shū)

學(xué)習(xí)編程之前,應(yīng)該先問(wèn)自己一個(gè)問(wèn)題:我為什么要學(xué)習(xí)編程?不要打我……我知道你們是被逼著去學(xué)習(xí)編程的,那就不妨被逼著思考『我為什么要學(xué)習(xí)編程?』。

如果不知道答案,也沒(méi)有關(guān)系。反正這個(gè)問(wèn)題與學(xué)習(xí)編程也沒(méi)有太大關(guān)系。其實(shí),我們已經(jīng)做了非常多的不需要回答為什么的事了。我們連『我們?yōu)楹味嬖凇贿@樣的問(wèn)題都不知道答案,卻依然糊里糊涂的活到了現(xiàn)在。

先推薦幾本入門(mén)書(shū)以及閱讀它們的方法。對(duì)于我們而言,選對(duì)書(shū)很重要。國(guó)內(nèi)科班出身的人所用的教科書(shū)對(duì)于我們來(lái)說(shuō) 往往不合適,因?yàn)檫@些教科書(shū)可能比較適合在課堂上使用,課堂上總是會(huì)有一個(gè)能讀懂這些寫(xiě)的挺糟糕的教科書(shū)的老師,他極有可能不會(huì)按照教科書(shū)里的套路來(lái)講 課,而教科書(shū)卻可以扮演課堂筆記的角色。也就是說(shuō),大部分國(guó)產(chǎn)的編程書(shū),它們比學(xué)生的課堂筆記強(qiáng)不了多少。非科班出身的人,沒(méi)有課堂,沒(méi)有老師,所以也就 看不懂『課堂筆記』。好在,國(guó)外有一批優(yōu)秀的書(shū)籍,課堂中的老師就在書(shū)中。

閱讀方法也挺重要,因?yàn)閷W(xué)習(xí)編程最不需要就是將一本講編程的書(shū)從頭讀到尾……對(duì)于非科班出身的人而言,編程不是考試,沒(méi)必要讓自己所掌握的知識(shí)去覆 蓋所有的編程問(wèn)題。人的精力極為有限,大部分人終其一生,能在一兩個(gè)方向上有所建樹(shù)已經(jīng)很對(duì)得起自己了,因此幾乎任何一本編程的書(shū)里總會(huì)有些東西是你沒(méi)必 要去看的??偸遣灰?,我們是非科班出身,沒(méi)那么多的時(shí)間去揮霍,而節(jié)省時(shí)間的最好的辦法就是只取自己所需,前提是你的方向與目標(biāo)是明確的。所以在讀書(shū) 的過(guò)程中,不要停下問(wèn)自己,為什么要學(xué)習(xí)編程?

我推薦的第一本書(shū)是《計(jì)算機(jī)程序的構(gòu)造和解釋》,英文名是《Structure and Interpretation of Computer Programs》,簡(jiǎn)稱 SICP。英語(yǔ)閱讀能力好的同學(xué),可以看英文版。中文閱讀能力好的同學(xué),可以看中文譯本,裘宗燕老師的文字素養(yǎng)與翻譯的嚴(yán)謹(jǐn)程度是可贊的。這本書(shū)的閱讀,建議分以下三個(gè)階段:

  1. 閱讀前兩章,第一章是講計(jì)算過(guò)程的抽象方法,第二章是將基本的數(shù)據(jù)的抽象方法。這兩章的內(nèi)容涵蓋了軟件世界的『九年制義務(wù)教育』的全部?jī)?nèi)容,所用的教學(xué)語(yǔ)言也是非常成熟且設(shè)計(jì)精巧的 Scheme 語(yǔ)言的一個(gè)很小的子集。學(xué)習(xí)這兩章內(nèi)容的過(guò)程中,可以穿插著閱讀《Teach Yourself Scheme in Fixnum Days》的前 10 章,這份 Scheme 教程也有一份中文譯本。SICP 的習(xí)題,即使不去做,也應(yīng)該把題目看一下,動(dòng)腦子想一想,判斷一下能不能做得出來(lái)。這些習(xí)題,在網(wǎng)絡(luò)上很容易找到答案。

  2. 復(fù)習(xí) C 語(yǔ)言,教材用 Kernighan 與 C 語(yǔ)言之父 Ritchie 合寫(xiě)的那本《C 程序設(shè)計(jì)語(yǔ)言》 即可。這個(gè)階段的設(shè)置,主要是面向我們實(shí)驗(yàn)室內(nèi)部。因?yàn)槲覀儗?shí)驗(yàn)室里的同學(xué)在本科階段通常是要修 C 語(yǔ)言這門(mén)課的,但是當(dāng)時(shí)他們可能并未真正從學(xué)習(xí)編程的角度去學(xué)習(xí),現(xiàn)在可以通過(guò)第一階段基于 Scheme 語(yǔ)言建立的編程觀念去重新認(rèn)識(shí)一下 C 語(yǔ)言,只有這樣方能理解 C 語(yǔ)言的優(yōu)點(diǎn)與缺點(diǎn),并且去思考如何充分發(fā)揮 C 的優(yōu)勢(shì),然后用 Scheme 來(lái)彌補(bǔ) C 的不足。借助 GNU Guile 2,很容易實(shí)現(xiàn) C 與 Scheme 復(fù)合編程。這個(gè)過(guò)程可以穿插閱讀 Kernighan 寫(xiě)的《程序設(shè)計(jì)實(shí)踐》。

  3. 閱讀 SICP 的第 3 章,然后再找一本講 C++ 的書(shū),比如 C++ 世界中非常有名但我不以為然的磚書(shū)《C++ Primer》,只學(xué)習(xí)基于類的數(shù)據(jù)抽象以及面向?qū)ο缶幊滩糠旨纯?/strong>。這個(gè)階段,SICP 的第三章闡述了面向?qū)ο缶幊膛c函數(shù)式編程兩種方法。從 SICP 中獲得的面向?qū)ο缶幊?,可以?C++ 的學(xué)習(xí)中得到一些強(qiáng)化,至于函數(shù)式編程方法,可以假裝自己已經(jīng)知悉,留待日后需要時(shí)再作打算。最后,記得將《Teach Yourself Scheme in Fixnum Days》剩下的內(nèi)容看完。

C++ 的入門(mén)書(shū),我更推薦《C++ Without Fear》,中文譯本叫《好學(xué)的 C++》, 現(xiàn)在應(yīng)該是第 2 版。之所以不推薦大家認(rèn)為是 C++ 四書(shū)五經(jīng)之一的《C++ Primer》,是因?yàn)槲铱傆X(jué)得它像一本事無(wú)巨細(xì)的案頭手冊(cè),比較適合那些已經(jīng)有了編程經(jīng)驗(yàn)甚至 C++ 經(jīng)驗(yàn)的程序猿閱讀。我心目中真正好的教材應(yīng)該像小說(shuō)那樣,由一條或多條邏輯主線延展而成,這種教材對(duì)于非科班出身的人尤為重要。

對(duì)于大部分編程任務(wù)而言,上述書(shū)所涉及的知識(shí)已經(jīng)足夠用了,而且上面的這幾本書(shū)也是非常耐讀的書(shū),只要你不是那么著急的將它們讀完,它們總是很有趣。我很喜歡 SICP 與《程序設(shè)計(jì)實(shí)踐》這兩本書(shū),因?yàn)樘矚g了,所以一直都不舍得把它們讀完。

讓實(shí)踐有些難度

書(shū)是要看的,但是看書(shū)的過(guò)程中最好開(kāi)動(dòng)你的雙手。所以,你不應(yīng)該停下來(lái)問(wèn)自己:為何要學(xué)習(xí)編程?

我希望總有一天,你能給自己找到一個(gè)答案,那就是你想寫(xiě)一個(gè) XXX 程序。這個(gè)程序至少應(yīng)該對(duì)你是有用,亦即它的主要功能不與你的系統(tǒng)里的其他程序存在著重復(fù)。如果你能明確這一點(diǎn),那么你所創(chuàng)造的程序就有了意義,你的學(xué)習(xí)就有了意義。

為何要學(xué)習(xí)編程?因?yàn)槟阋獎(jiǎng)?chuàng)造一些從來(lái)沒(méi)有的軟件,而且它能夠幫助你做一些你認(rèn)為是很重要的事!凡是你認(rèn)為重要的事,對(duì)于很多人而言,很有可能也是很重要的,因此你所創(chuàng)造的東西就可以幫助更多的人,這意味著會(huì)有一些你可能不認(rèn)識(shí)的人需要你,這就是你的價(jià)值所在。

編程是基于現(xiàn)實(shí)生活的創(chuàng)造。這種創(chuàng)造是漸進(jìn)的,你在創(chuàng)造之初可能也無(wú)法預(yù)料到結(jié)果會(huì)是如何,這是任何創(chuàng)造性活動(dòng)的基本屬性。編程的實(shí)踐,應(yīng)該將它作 為探索未知世界的智力活動(dòng),應(yīng)該從書(shū)中跳出來(lái),將自己從那些示例中獲得的經(jīng)驗(yàn)用于解決現(xiàn)實(shí)中的問(wèn)題。如果你覺(jué)得,現(xiàn)實(shí)中根本不存在什么問(wèn)題需要你去解決。 那么……請(qǐng)你回答一下『你為何而存在』這個(gè)問(wèn)題吧。

看書(shū),是從前人正確的經(jīng)驗(yàn)中學(xué)習(xí)。實(shí)踐,是從自己的失敗中學(xué)習(xí)。既然決定要實(shí)踐了,所以還是給自己找一些比較難走的路走走看吧,讓失敗多一些,讓失敗早一些。

以我個(gè)人比較感興趣的幾個(gè)東西為例,可以寫(xiě)一個(gè)基于 TeX 的現(xiàn)代文學(xué)編程語(yǔ) 言,通過(guò)它不僅可以歷練編程能力,也會(huì)對(duì)編譯原理中的語(yǔ)法分析環(huán)節(jié)有一些實(shí)際的認(rèn)識(shí)。也可以嘗試去寫(xiě)一個(gè)三維幾何庫(kù),能夠完成凸包、Delaunay剖分 以及 Voronoi 圖等計(jì)算,不求大而全,只求小而精,以后漫長(zhǎng)的時(shí)間里可以慢慢的去改進(jìn)它。還可以去找一個(gè)自己喜歡的開(kāi)源項(xiàng)目,去閱讀它的源代碼,了解它所用的項(xiàng)目構(gòu)建系 統(tǒng),分析項(xiàng)目結(jié)構(gòu),試著去修改它的代碼……我現(xiàn)在最感興趣的是 LuaTeX。

問(wèn)題是最重要的

假如你已經(jīng)有了非常多次的實(shí)踐上的失敗,并且你已經(jīng)大致掌握了 Scheme 與 C/C++ 這樣的語(yǔ)言,那么每年學(xué)一門(mén)新的語(yǔ)言,這并非難事。可能你會(huì)對(duì)網(wǎng)絡(luò)上經(jīng)常發(fā)生的語(yǔ)言之戰(zhàn)覺(jué)得奇怪。

是問(wèn)題決定了語(yǔ)言,是問(wèn)題決定了編程范式,是問(wèn)題決定了信仰。如果你能很明確的認(rèn)識(shí)到這些,那么你就不會(huì)陷入某種語(yǔ)言宗教的泥淖之中。對(duì)于許多事都是如此……搞機(jī)械的人,也經(jīng)常信仰 UGNX,CATIA,PROE 這些『宗教』的……

如果非要給自己找一種信仰,那么我信仰我的存在就是為了解決問(wèn)題的。

如果在我用的 Linux 系統(tǒng)上做一些自動(dòng)化程度高一些的維護(hù)任務(wù),我不會(huì)厭憎佶屈聱牙的 Bash 腳本,而是非常欣賞它像膠水一樣快速的將幾個(gè)本來(lái)是獨(dú)立運(yùn)行的程序連接起來(lái)替我完成復(fù)雜的任務(wù)。

如果我要臨時(shí)的做一些文本處理工作,我可以用 python 3,因?yàn)樗鼘?duì) UTF-8 支持的挺好,而且字符串庫(kù)功能齊備。如果只是進(jìn)行一些文本的替換,emacs 或 sed 之類現(xiàn)成的工具也夠用了。

如果我要寫(xiě)一個(gè)嚴(yán)肅的程序,嚴(yán)肅到了它的生命可能要很久,那我會(huì)選擇一門(mén)成熟穩(wěn)定的語(yǔ)言來(lái)實(shí)現(xiàn)它,即使用 C,我也不會(huì)煩棄它的繁瑣的代碼,我會(huì)盡力凝練程序中要實(shí)現(xiàn)的功能。

人生中本來(lái)就面臨著許多選擇,但是非常多的人在選擇之前并未認(rèn)真的去考察自己面對(duì)的問(wèn)題。

不過(guò),對(duì)問(wèn)題本身的考察,需要一套基本的工具集。沒(méi)有聽(tīng)診器、手術(shù)刀或 X 光,再厲害的醫(yī)生也無(wú)法分析人體的內(nèi)部發(fā)生了什么。對(duì)于編程而言,我認(rèn)為上述我推薦的書(shū)中所涉及的知識(shí)已經(jīng)足夠用來(lái)洞察軟件世界的各種問(wèn)題了,以此為基 礎(chǔ),我們只需再保持心態(tài)的開(kāi)放,隨時(shí)汲取所需的知識(shí)就可以了。例如,雖然上述幾本書(shū)沒(méi)有一本是講 Web 開(kāi)發(fā)的,但是如果你熟悉 Scheme,就可以發(fā)現(xiàn) JavaScript、HTML 5、CSS 3 之類的語(yǔ)言并沒(méi)有超出 Scheme 的范疇,你可以很快的就掌握它們。

算法

解決問(wèn)題需要算法。既然編程無(wú)處不在,那么算法也是無(wú)處不在的。但是,如果隨便拿起一本講算法的書(shū),隨便一本,可能都會(huì)讓你覺(jué)得頭昏腦脹。也許你會(huì)擔(dān)心,連算法的書(shū)都看不懂,還怎么寫(xiě)程序?

當(dāng)初我剛學(xué)習(xí)編程的時(shí)候,寫(xiě)過(guò)二十四點(diǎn)、漢諾塔、八皇后、俄羅斯方塊之類的小程序。后來(lái),在現(xiàn)實(shí)的項(xiàng)目里,也寫(xiě)過(guò)堆排序、快速排序、矩陣的 LU 與 SVD 分解、無(wú)向連通圖的最小生成樹(shù)及最短路徑之類的程序。但是現(xiàn)在,隨便拿一個(gè)讓我去實(shí)現(xiàn),我還是不得不去翻書(shū)看懂算法,然后再去寫(xiě)程序……

我想說(shuō)的是,如果你正在閱讀一本講算法的書(shū),書(shū)里有些算法或它的示例是你一時(shí)無(wú)法看懂的,可以跳過(guò)去。很多專門(mén)講算法的書(shū)里,充斥著心智游戲。如果 你無(wú)法將自己代入到這些游戲的情境中,這個(gè)游戲的玩法自然就是不明了的?,F(xiàn)在看起來(lái),這是很自然的事,然而當(dāng)初我卻一遍又一遍的懷疑自己的智商,特別是看 到網(wǎng)絡(luò)上很多人像喝白開(kāi)水一樣的談?wù)撝@些心智游戲,我一度懷疑,我不適合做編程方面的事。

幸好,這個(gè)世界足夠穩(wěn)定,以至于我們不需要了解相對(duì)論與量子力學(xué)也能夠很好的生活下去。大部分人,連牛頓力學(xué)都不需要了解……算法也是這樣,特別是 現(xiàn)在已經(jīng)存在了相當(dāng)多的實(shí)現(xiàn),例如幾乎任何一種編程語(yǔ)言的標(biāo)準(zhǔn)庫(kù)中都提供一維數(shù)據(jù)的快速排序算法的實(shí)現(xiàn)?;旧希灰菍?duì)現(xiàn)實(shí)中的問(wèn)題非常重要的算法,你 總是能夠找到它們的既有實(shí)現(xiàn),取而用之。

當(dāng)你走在街上,那些高高矗立恢宏建筑,建筑工人建造它們的過(guò)程中可曾用了極高心智的技術(shù)?編程,本質(zhì)上也是如此,工程經(jīng)驗(yàn)的重要性大于心智。甚至在編程中,過(guò)多的運(yùn)用心智,反而會(huì)適得其反。

我不是說(shuō)學(xué)習(xí)算法沒(méi)有必要,我只是強(qiáng)調(diào)不要被一時(shí)難以理解的算法擋住你。你天生就擁有一些無(wú)比強(qiáng)大的算法,它們是窮舉、貪婪與分治,還有最強(qiáng)大的 『演化』與『神經(jīng)網(wǎng)絡(luò)』。那些專門(mén)講算法的書(shū),只不過(guò)是是了很蹩腳的語(yǔ)言、符號(hào)以及示例將你天生的直覺(jué)刻畫(huà)出來(lái)而已。只要你在現(xiàn)實(shí)中遇到問(wèn)題,你總是能夠 找到求解這個(gè)問(wèn)題的方法,而不是只有讀懂了某本講算法的書(shū)你才能解決這個(gè)問(wèn)題。

很多算法書(shū),都是我看不懂的。它們的第一章就是讓我復(fù)習(xí)數(shù)學(xué)歸納法,第二章就是讓我學(xué)習(xí)算法的時(shí)間與空間復(fù)雜度分析……而我屬于對(duì)數(shù)學(xué)缺乏直覺(jué)的 人,對(duì)我而言,這些書(shū)的唯一價(jià)值就是故意不讓我去讀它。即使是我心目中的大神 Knuth 的傳世之作《計(jì)算機(jī)編程藝術(shù)》,它唯一的目的似乎就是讓我覺(jué)得我不是搞藝術(shù)的。

很久之后,我在學(xué)校圖書(shū)館閑逛的時(shí)候,發(fā)現(xiàn)了《如何求解問(wèn)題:現(xiàn)代啟發(fā)式方法》這本書(shū),翻了翻,就開(kāi)始嘆息,為什么一開(kāi)始不知道這本書(shū)?

增強(qiáng)對(duì)計(jì)算機(jī)的理解

有時(shí)間與精力可以閱讀一些專業(yè)性強(qiáng)一些的計(jì)算機(jī)理論的書(shū)籍,譬如操作系統(tǒng)原理、編譯原理、算法與數(shù)據(jù)結(jié)構(gòu)之類??床欢珜I(yè)的書(shū),或者沒(méi)那么多時(shí)間和精力,可以看看計(jì)算機(jī)科學(xué)的一些科普著作。有本《通靈芯片》值得一看,薄薄的小冊(cè)子,三五天的業(yè)余時(shí)間就可以看完。有本《編碼:隱匿在計(jì)算機(jī)軟硬件背后的語(yǔ)言》,算是《通靈芯片》的加強(qiáng)版,也值得一看。有一本《深入理解計(jì)算機(jī)系統(tǒng)》,以程序員的視角來(lái)看計(jì)算機(jī)的軟硬件系統(tǒng),也是一本很好的書(shū),不過(guò)就是要讀完它,需要一些耐心與時(shí)間,所以沒(méi)必要一次性看完。也可以繼續(xù)將 SICP 的第四、五章看完。

雖然你的編程技能不會(huì)因?yàn)樽x了這些講述計(jì)算機(jī)原理的書(shū)而突飛猛進(jìn),但是這些書(shū)可以讓你理解你的程序是在一個(gè)什么樣的世界里運(yùn)行的。雖然你不知道自己 為何而存在,但是你知道這個(gè)程序?yàn)楹味嬖凇D悴粌H知道它為何而存在,還知道它怎樣存在,并且也知道怎樣讓它更好的存在。這樣,也就沒(méi)必要在那些所謂的 『XXX 箴言』、『XXX 之道』、『XXX 之禪』的書(shū)籍上浪費(fèi)你有限的生命。

有時(shí)間,也可以復(fù)習(xí)一下《黑客帝國(guó)》,它的導(dǎo)演雖然不是程序猿,但勝似程序猿??赐旰诳偷蹏?guó),也可以看看 Steven Levy 寫(xiě)的《黑客:計(jì)算機(jī)革命的英雄》。從技術(shù)層面躍遷到人文層面,也許那時(shí)你會(huì)對(duì)自己的人生有著更為深刻的認(rèn)識(shí)。計(jì)算機(jī),是人類為自己創(chuàng)造出來(lái)的最好的一面鏡子。我們現(xiàn)在沒(méi)有能力了解自身,但是我們可以制造與發(fā)展計(jì)算機(jī)來(lái)逐步了解自己。

思考生命

懂編程就像懂其他任何一門(mén)技藝一樣,沒(méi)什么了不起,因?yàn)槿魏渭妓嚩疾粫?huì)比你的生命更復(fù)雜,它甚至不如路邊已經(jīng)被你視而不見(jiàn)的野草復(fù)雜。生命,本身就 是一個(gè)非常奇妙的東西,它的誕生即偶然又必然。整個(gè)生命體系只要略微有一點(diǎn)點(diǎn)誤差,我可能就不會(huì)誕生于世。當(dāng)我確認(rèn)我已經(jīng)存在于這個(gè)世上了,但是我又不知 道我為何而存在。

如果每個(gè)人都思考過(guò)『我為何而存在』這個(gè)問(wèn)題,那么就意味著對(duì)于這個(gè)問(wèn)題的思考,我們不是自發(fā)的,而是被迫的。這個(gè)問(wèn)題,自我們誕生以來(lái)就像烙印一樣存在于每個(gè)人的思想里。這個(gè)問(wèn)題是人類的終極問(wèn)題,我們所解決的一切問(wèn)題最終都會(huì)指向它。我們?yōu)檫@個(gè)問(wèn)題而生。不僅僅是為了自己去回答這個(gè)問(wèn)題而生,還要為他人回答這個(gè)問(wèn)題而創(chuàng)造生存條件。他人,包括我們的家人,也包括我們的朋友以及那些我們不認(rèn)識(shí)的人。

我們努力賺錢(qián),是為了過(guò)更好的生活么?似乎并非如此,生活條件的富足,似乎僅僅是為了我們?nèi)ニ伎肌何覀優(yōu)楹味嬖凇欢鴦?chuàng)造一個(gè)更好的環(huán)境。即使是世 界上最窮的人,也會(huì)自問(wèn),我為何而存在,上蒼為何如此待我之類的問(wèn)題。在這個(gè)問(wèn)題面前,富人與窮人是絕對(duì)平等的。我們看見(jiàn)美女,可能會(huì)怦然心動(dòng),追而娶 之,是為了一段美好的愛(ài)情么?也許美色是一種誘惑,用于保證人類能夠繼續(xù)繁衍生息,以便繼續(xù)思考那個(gè)終極問(wèn)題;即使是出于愛(ài)情,也極有可能是因?yàn)槟銗?ài)的人 對(duì)于你回答『我為何而存在』這個(gè)問(wèn)題具有增益作用。

一切的生物,皆為命而生,這就是生命。生,是一種可變并且可自我繁衍的狀態(tài)。只要有一種事物,它的狀態(tài)是可變的,而且這種狀態(tài)在保持自身變化的過(guò)程 中能夠產(chǎn)生新的可變且可繁衍的狀態(tài),那么它就有『生』。那么命是什么?漢字的『命』,字形上有點(diǎn)兒『一個(gè)人一生都在叩問(wèn)』的意思……我們?cè)谶祮?wèn)什么,或許 正是『我為何而存在』這個(gè)問(wèn)題。

蘇格拉底說(shuō)他的存在是為了『認(rèn)識(shí)自己』,但這似乎不是答案,只是一個(gè)過(guò)程。在『泛型與閉包』, 我之所以感慨『每一個(gè)人,都像是一個(gè)閉包』,是覺(jué)得如果我們是程序里的一個(gè)函數(shù),我們自身似乎永遠(yuǎn)也無(wú)法知道自己的運(yùn)行結(jié)果是什么。這種想法有點(diǎn)宿命論的 意味,但是每個(gè)人的誕生又充滿著偶然,我們的生存活動(dòng)似乎并不受創(chuàng)造者的影響,或者創(chuàng)造者無(wú)意于去干擾我們的活動(dòng),因此在生活中我們經(jīng)常覺(jué)得自己有自由意 志。

如果我們即是被創(chuàng)造的,又有一定的自由意志,那么蘇格拉底或許就是對(duì)的,創(chuàng)造者試圖創(chuàng)造我們的目的就是讓我們?nèi)ァ赫J(rèn)識(shí)自己』。我們雖然并不知道我們 的生命終止之時(shí)會(huì)產(chǎn)生什么樣的『計(jì)算結(jié)果』,但是興許創(chuàng)造者可以理解這些結(jié)果。同時(shí),我們有積極生活的自由,也有消極頹廢的自由,我們可以將認(rèn)識(shí)自己作為 終極問(wèn)題去探索的自由,也有完全不配合這位創(chuàng)造者而自殺的自由。還有一種可能,創(chuàng)造者已經(jīng)不存在,整個(gè)宇宙系統(tǒng)也許只是一個(gè)被遺棄的廢墟,或者他只是在機(jī) 器之前打了個(gè)盹……

很容易發(fā)現(xiàn),將問(wèn)題上溯到原點(diǎn),再?gòu)脑c(diǎn)演化到現(xiàn)在,不難得出蘇格拉底式的結(jié)論。既然我們還活著,既然我們?cè)趩?wèn)自己存在的意義,那么答案就自然指向 了『認(rèn)識(shí)自己』。生命對(duì)我而言只是個(gè)過(guò)程。在這個(gè)過(guò)程中,我唯一能觀測(cè)的并非世界的變化,而是我自身的變化。至于我自身的狀態(tài)的變化是已經(jīng)發(fā)生過(guò)了,現(xiàn)在 只是回放,還是正在發(fā)生,這顯得非常的不重要,因?yàn)槲覀儫o(wú)法跳出這種狀態(tài)的變化。這可能也是為什么 OOP 比 FP 更容易理解的根本原因。

這個(gè)世界有許許多多的工作,似乎沒(méi)有任何一種工作能像編程這樣激發(fā)我對(duì)生命開(kāi)始思考。

從其他領(lǐng)域?qū)ふ掖鸢?/p>

為了尋找終極問(wèn)題的答案,有必要閱讀一些哲學(xué)、物理、生物之類的書(shū)籍。人類數(shù)千年的文明,『我為何而存在』這個(gè)問(wèn)題也已經(jīng)被思考了數(shù)千年。既然我們 此刻所處的系統(tǒng)還在運(yùn)行著,那就說(shuō)明答案并未真正出現(xiàn)。但是,在決定自己去思考這個(gè)問(wèn)題之前,看看過(guò)去的時(shí)代里的有智慧的人是如何思考的,這是一個(gè)必須的 過(guò)程。人類對(duì)這個(gè)問(wèn)題的所有思考過(guò)程是伴隨著自身的繁衍生息不斷的傳遞下去的。

也許你該看點(diǎn)哲學(xué)類的書(shū)。如果從未想過(guò)去看哲學(xué)的書(shū),我推薦一本 14 歲的少男少女就應(yīng)該閱讀的《蘇菲的世界》,你不要打我。羅素的那本《西方哲學(xué)史》雖然出自他個(gè)人的視角,但是顯然我們對(duì)哲學(xué)的理解也很難達(dá)到他那樣的高度,鑒于我們也不是打算去在哲學(xué)上有所成就,《西方哲學(xué)史》足夠我們看的了。我不認(rèn)為這個(gè)世界上真正存在『正確』的哲學(xué)。

復(fù)習(xí)物理?!?strong>費(fèi)恩曼物理學(xué)講義》第一卷就很好,人類所能感知到的這個(gè)世界,費(fèi)恩曼像講故事一樣的差不多一網(wǎng)打盡了。如果連費(fèi)曼的書(shū)都看不懂,不妨看看《時(shí)間的形狀》+《量子物理史話》,它們是近年來(lái)在相對(duì)論及其之后的物理學(xué)方面中國(guó)人寫(xiě)的非常優(yōu)秀的科普書(shū)。還有一本是我大學(xué)時(shí)經(jīng)??吹摹?strong>從一到無(wú)窮大》,雖然年代已頗為久遠(yuǎn),但依然不失為極好的物理科普著作。

生物學(xué),這門(mén)課在中學(xué)時(shí)是我最討厭的課程之一。因?yàn)槲覍?shí)在是看不懂書(shū)里的插圖,鄉(xiāng)村中學(xué)連個(gè)顯微鏡與真實(shí)的標(biāo)本都沒(méi)有,所以長(zhǎng)期以來(lái),我一直都是個(gè) 生物盲。很多常見(jiàn)的花草樹(shù)木鳥(niǎo)獸蟲(chóng)魚(yú),我連它們的名字都叫不上來(lái),更不要說(shuō)它們具體屬于哪個(gè)門(mén)綱目科屬種了。但是有一本生物學(xué)的書(shū)我還是能看懂的——《漫畫(huà)玩轉(zhuǎn)遺傳學(xué)》,這是本非常好的遺傳學(xué)科普書(shū)。當(dāng)時(shí)我是因?yàn)閷W(xué)習(xí)遺傳算法而買(mǎi)來(lái)的,結(jié)果從它從第一頁(yè)開(kāi)始就把我的眼睛抓住了。

但是,很誠(chéng)懇的說(shuō),這些書(shū)都讀完,我還是不知道『我為何而存在』這個(gè)問(wèn)題的答案,但是我對(duì)編程和人生有了更多的思考,這樣我距離答案很有可能會(huì)更近了一些。

這些書(shū)你都看過(guò)么?

都看過(guò),但是有一些沒(méi)有看完。有些書(shū)是看完了,但是時(shí)間久了,有些遺忘,一直想找點(diǎn)時(shí)間再重讀一遍。

有些書(shū)是因?yàn)閷?shí)在太好,不忍心一下都看完。這樣說(shuō),有些矯情,但事實(shí)就是如此。像《費(fèi)恩曼物理學(xué)講義》,雖然有著物理學(xué)界小飛俠之稱的費(fèi)恩曼已經(jīng)將 深邃的物理學(xué)變成了我能夠讀懂的人類語(yǔ)言,但是一方面我不是專業(yè)研究物理學(xué)的人,我沒(méi)有必要趕進(jìn)度似的將他的書(shū)徹底讀完,另一方面是一旦讀完了,我就會(huì)惋 惜,它不會(huì)再有第二季……我打算將費(fèi)恩曼的這三卷物理學(xué)講義留給我今后的時(shí)間里慢慢的去看,我也可以把這些知識(shí)講給我的兒子聽(tīng)。

有些書(shū)對(duì)我而言是因?yàn)樘y,即使我覺(jué)得已經(jīng)看完了,但過(guò)一段時(shí)間發(fā)現(xiàn),跟沒(méi)看過(guò)是一樣的。這些書(shū),我也只能歸類為沒(méi)有看完的書(shū)。

凡是我看的書(shū),都是我認(rèn)為在書(shū)中所涉及的方向上,作者比我走的更為深遠(yuǎn)。但是我也不會(huì)自卑,因?yàn)樗麄儸F(xiàn)在已經(jīng)沒(méi)法走了……

后記

本文寫(xiě)于一個(gè)深秋又寂寞的下午,目的只是為我的小伙伴們學(xué)習(xí)編程指出一條道路。從 SICP 開(kāi)始,可能有許多人覺(jué)得不靠譜,但是考慮到這些小伙伴一個(gè)一個(gè)都是研究生,考研期間經(jīng)過(guò)了高數(shù)、線代、概率以及英語(yǔ)的『洗禮』,研一也會(huì)修數(shù)值分析與矩陣 分析這兩門(mén)數(shù)學(xué)課。即使他們以前從未接觸過(guò)編程,但是他們的情況,SICP 還是挺適合他們的。如果他們連 SICP 的前三章都搞不定,這只能說(shuō)明他們連 MIT 大一的學(xué)生都不如了……這或許不是他們的悲哀,而是這個(gè)國(guó)家的悲哀。

對(duì)于我不知道底細(xì)又打算學(xué)編程的同學(xué),這篇文章可能不會(huì)太靠譜,所以我只能在題目中寫(xiě)上『不負(fù)責(zé)任』。不過(guò),文章中出現(xiàn)的這些書(shū),我覺(jué)得還都是挺不錯(cuò)的,有時(shí)間看一下,應(yīng)該不是浪費(fèi)時(shí)間。


網(wǎng)站題目:非科班出身的人學(xué)習(xí)編程不負(fù)責(zé)任指南
URL鏈接:http://m.5511xx.com/article/cdidghc.html