讀張越的《如何學(xué)編程?》
什么是編程辖佣?
現(xiàn)代計算機的起點是萊布尼茨的一個夢想霹抛,將理性還原為計算,用強大的機器執(zhí)行這些計算卷谈。//讓我想起來一句話“這不是情懷杯拐,不是素養(yǎng),而是冷冰冰的計算”
這需要兩個前提世蔗,一切都可以計算端逼,可以執(zhí)行一切計算的機器。
為了達到這個目的污淋,17世紀以來的數(shù)學(xué)家和哲學(xué)家就圍繞上面兩個問題展開了自己的研究顶滩。數(shù)學(xué)領(lǐng)域人類發(fā)明出來了一套統(tǒng)一符號來處理代數(shù)表達式,并不斷嘗試用符號來表征全世界所有的概念和事物寸爆。//事實證明這樣做的結(jié)果是礁鲁,符號比較混亂,不能統(tǒng)一起來赁豆。常常是一個x代表的好幾個意思救氯。
像笛卡爾,飛馬通過論證講集合通過某種方式轉(zhuǎn)換成了代數(shù)歌憨,那個時代的頂尖數(shù)學(xué)叫嘗試做下面的事情:1將全世界的只是歸納起來着憨,2針對上述的全集用一套符號體系進行表征,3用萊布尼茨所述的“推理演算“對這些符號進行運算务嫡。
在那個偉大的時代產(chǎn)生了大量的優(yōu)秀人才和成果甲抖,希爾伯特、康托爾心铃、哥德爾等人都作出了重大的貢獻准谚。其中布爾在《思維的法則》中證明了邏輯問題可以演變?yōu)閿?shù)學(xué)問題,從而奠定了現(xiàn)代編程語言的運算邏輯去扣。而現(xiàn)代編程學(xué)語言的概念就源自佛雷格在《該你那文字》所描述的:所有演繹推理都可以歸納在一個邏輯體系內(nèi)柱衔。
這段時間,哲學(xué)家也為編程語言和計算機的產(chǎn)生做出了重大貢獻:維特根斯坦在《邏輯哲學(xué)論》中為現(xiàn)代編程語言的面向?qū)ο笏枷氲於思碌幕A(chǔ):
”“對象包含了事物的全部狀態(tài)的可能性愉棱,......唆铐,這種固定不變的模式有對象組成。
在數(shù)學(xué)家和哲學(xué)家講一切均可計算的夢想逐漸實現(xiàn)的時候奔滑,圖靈描述了一種通用的計算機模型艾岂,圖靈機由此誕生。馮諾依曼等人用電子管實現(xiàn)了這種模型朋其,”可以執(zhí)行計算的機器“發(fā)明出來了
直到今天王浴,現(xiàn)代編程語言依然沿著當(dāng)年的套路發(fā)展脆炎,而硬件形態(tài)不管變化多大,圖靈機的基本原理和夢諾依曼體系始終沒有本質(zhì)變化氓辣。
因此簡單說秒裕,現(xiàn)代編程語言(更準確的說法是,一種”圖靈完備“編程語言)钞啸,應(yīng)該能夠完整的描述某一個現(xiàn)實領(lǐng)域的問題簇爆,并通過運算規(guī)則,操作計算設(shè)備獲得分析過程和結(jié)果爽撒。
所謂學(xué)習(xí)編程,就是學(xué)習(xí)使用一種特定的語言响蓉,來描述現(xiàn)實世界的一個問題硕勿,再將這個問題用過計算機的運算,給出分析和解答枫甲。
進入程序的思維邏輯
編程難是因為沒有具備”編程思維“源武。變成四位,需要用一種新的語言形式來描述世界想幻。
那個著名的笑話:
老婆給當(dāng)程序員的老公打電話:”下班順路買一斤豹子帶回來粱栖,如果看到賣西瓜的,買一個脏毯∧志浚“
當(dāng)晚,程序員老公手捧著一個豹子進了家門......老婆怒道:”你怎么就買了一個豹子食店?渣淤!“
老公答曰:”因為看到了賣西瓜的〖郏“
這個笑話充分表達了程序思維和生活思維的不同价认,這里的差異在于:
人類常用表達方式和邏輯習(xí)慣是不吻合的,很多信息存在模棱兩可的描述中自娩,而編程語言是完備和精確的用踩,機器的代碼一個符號都不能錯。
第二忙迁,”圖靈機“的思維模式是一種機械的脐彩,線性邏輯。它符合機械流程姊扔。而人類的邏輯丁屎,本質(zhì)上是一個非線性的反饋系統(tǒng),所以思維決策模型上的差異導(dǎo)致編程的邏輯過程必然與人腦思維過程不同旱眯。
因此晨川,學(xué)習(xí)編程需要讓自己養(yǎng)成線性思維证九,或者說是理性的反饋系統(tǒng)。//其實大自然的很多事情都不是線性的共虑,更多是非線性的愧怜,我要注意的是這兩種思維之間的轉(zhuǎn)換。
只有這樣才能從所學(xué)知識中舉一反三妈拌,建立自己的只是系統(tǒng)拥坛。因此學(xué)習(xí)時,經(jīng)常畫流程圖尘分,和時間順序圖猜惋,是一個號的習(xí)慣,用圖表將自己的思維表達清楚能有助于用機械邏輯來表述自然思維培愁。另一個方式是寫偽代碼著摔。
了解你所寫的代碼
只有了解你所寫的代碼,你才能漸變成一個專家級程序員定续。
比如隨便最簡單的移行代碼:
var a = 1;
如果你只是一個普通的程序員谍咆,你應(yīng)該知道這行代碼解決了什么問題,但如果你是專家級程序員私股,你應(yīng)該知道:
1系統(tǒng)是如何執(zhí)行這行代買的摹察?
2系統(tǒng)因為執(zhí)行了這行大媽,發(fā)生了那些改變倡鲸?
要做到這兩點供嚎,你需要對一下內(nèi)容有比較深刻的理解:
1深刻掌握你所使用的編程語言;
2了解和掌握你的程序所運行的操作系統(tǒng)峭状;
3在某些情況下查坪,需要了解硬件的一些特性和限制,以及操作系統(tǒng)在這些硬件上的影響宁炫。
因為你寫的代碼偿曙,作用與一臺圖靈機(可以執(zhí)行計算的機器),中間需要有操作系統(tǒng)羔巢,可能還有你所使用的編程語言所使用的運行時(如:Java Runtime)望忆。
如果你立志成為一名優(yōu)秀的程序員,你需要從一行程序出發(fā)竿秆,一步步的追蹤到硬件的執(zhí)行启摄。這時候,你會發(fā)現(xiàn)很多隱藏在程序之下的東西幽钢。
優(yōu)雅的控制機器
很多不懂程序的人歉备,都會發(fā)現(xiàn)一個現(xiàn)象:凡是會寫代碼的,都會修電腦匪燕,修手機蕾羊,修一切的電子產(chǎn)品......
寫程序與修電腦之間有什么必然聯(lián)系嗎喧笔?
真的有聯(lián)系。修手機的能力龟再,來源于對手機的理解和對手機的控制力书闸。這種控制力,包括輸入輸出的各種設(shè)備(攝像頭利凑,傳感器浆劲,藍牙),包括操作系統(tǒng)哀澈,包括工具類的應(yīng)用軟件牌借。
一個程序員希望自己的代碼能夠在一臺設(shè)備上運行良好。他確實要關(guān)注以上這些東西割按,一個程序是否可以合理的使用外設(shè)膨报,是否在操作系統(tǒng)中兼容性良好,是否與駐留軟件不沖突哲虾,都是一個程序員需要考慮的問題。
因此择示,一個合格的程序員束凑,確實要習(xí)慣性的稻谷自己的手機、自己的電腦栅盲。
一個幸福的事實是汪诉,現(xiàn)在的可穿戴設(shè)備和只能加劇設(shè)備的逐步普及,更多的傳統(tǒng)設(shè)備配備了操作系統(tǒng)谈秫,成了可編程的涉筆扒寄。
比如,一個程序員懂得Android開發(fā)拟烫,口可以使用程序控制電視定時播放该编,智能手表表針的顯示樣式,空調(diào)的出風(fēng)溫度硕淑,手機和門禁鏈接课竣,在汽車中年中控臺上部署一個程序和手機共享音樂等等
長靴長信,吐故納新
技術(shù)日新月異置媳,永無止境于樟。
所有高階程序員呢,具備的一個基本能力和素質(zhì)拇囊,就是不斷的嘗試新鮮事物迂曲,不斷閱讀新的項目代碼。也會主動改進之前做過的項目寥袭,哪怕他們當(dāng)前運行良好路捧。
每一個新技術(shù)的掌握关霸,都建立在對現(xiàn)有技術(shù)的充分理解智商,因此鬓长,學(xué)好當(dāng)下谒拴,恰恰是掌握未來的最佳方式。
以用帶學(xué)
設(shè)立一個學(xué)習(xí)的目標涉波,比如學(xué)習(xí)JS可以建一個自己的博客英上。
有一個明確的目標,就會有明確的學(xué)習(xí)路徑啤覆,解決問題時苍日,就不容易發(fā)散。更有助于提升效率窗声,衡量學(xué)習(xí)效果相恃。