此文最早發(fā)布在新生大學(xué)平臺率寡,是為在新生大學(xué)學(xué)習(xí)編程的初學(xué)者而寫
詳情參見[xinshengdaxue.com]
凡是可以被思考的,都可以被清楚地思考倚搬;
凡是可以被言說的冶共,都可以被清楚地言說;
----維特根斯坦
什么是編程每界?
現(xiàn)代計算機的起點是源于萊布尼茨的一個夢想:將人的理性還原為計算捅僵,并且有強大的機器能夠執(zhí)行這些計算。這就需要兩個前提:
- 一切都可以被計算眨层;
- 可以執(zhí)行一切計算的機器庙楚;
從十七世紀以來,數(shù)學(xué)家和哲學(xué)家主要就是在圍繞上面兩個問題展開自己的研究趴樱。
在數(shù)學(xué)領(lǐng)域馒闷,人類已經(jīng)可以用一套統(tǒng)一的符號來處理代數(shù)表達式,并不斷嘗試用符號來表征全世界所有的概念和事物叁征。另一方面纳账,另外一些科學(xué)家,例如笛卡爾和費馬捺疼,已經(jīng)論證了疏虫,可以將幾何通過某種方式轉(zhuǎn)換為代數(shù)。因此啤呼,那個時代最頂尖的數(shù)學(xué)家在嘗試下面的步驟:
- 將全世界的知識歸納起來卧秘;
- 針對上述的全集用一套符號體系進行表征;
- 用萊布尼茨所述的“推理演算”針對這些符號進行運算官扣。
這一艱苦但充滿挑戰(zhàn)的過程翅敌,在那個偉大時代也產(chǎn)生了大量優(yōu)秀的人才和成果,希爾伯特醇锚、康托爾哼御、哥德爾等人都做出了重大的貢獻坯临。其中布爾在《思維的法則》中證明了邏輯問題可以演變?yōu)閿?shù)學(xué)問題焊唬,現(xiàn)代編程語言的運算邏輯由此奠定恋昼。而現(xiàn)代編程語言的概念就源自弗雷格在《概念文字》所描述的:所有演繹推理都可以歸納在一個邏輯體系內(nèi)。
這段時間內(nèi)赶促,哲學(xué)家也為編程語言和計算機的產(chǎn)生做出了重大貢獻:維特根斯坦在邏輯哲學(xué)論中為現(xiàn)代編程語言的面向?qū)ο笏枷氲於藞詫嵉幕A(chǔ):
“對象包含了事務(wù)的全部狀態(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í)慣的是不完備的砍鸠,很多信息包含在模棱兩可的描述中扩氢,而用編程的方式來描述問題,必須做到完備和精確爷辱,因為截止到目前录豺,機器的寬容度在很大程度上還遠不如一個低年齡的兒童。不管多么厲害的代碼托嚣,一個逗號都不能出錯巩检。
第二,“圖靈機”的思維模式示启,是一種機械方式兢哭,因此,當(dāng)前的編程語言夫嗓,難免需要符合機械流程迟螺,也就是一種線性邏輯。而人的邏輯舍咖,本質(zhì)上是一個非線性的反饋系統(tǒng)矩父。所以在思維決策模型上的差異,導(dǎo)致編程的邏輯過程必然與人腦思維過程不同排霉。
因此窍株,學(xué)習(xí)編程,需要讓自己養(yǎng)成這種線性思維攻柠,或者說是一種理性的反饋系統(tǒng)球订。否則,很難從所學(xué)的知識中舉一反三瑰钮,并建立自己的知識體系冒滩。因此,在學(xué)習(xí)時浪谴,經(jīng)常的畫流程圖和時序圖是一個好的習(xí)慣开睡。用一些圖表將自己的思維表達清楚能夠有助于用機械邏輯來表述自然思維因苹。另一個方式是寫偽代碼。有興趣的同學(xué)可以搜索一下篇恒。
了解你所寫的代碼
不可否認扶檐,現(xiàn)在寫代碼已經(jīng)變得越來越容易,老一輩程序員執(zhí)念的很多東西已經(jīng)不再被年輕人提及婚度。隨著技術(shù)的演進蘸秘,越來越多的普通人官卡,只需要簡單的訓(xùn)練蝗茁,就可以完成業(yè)務(wù)邏輯的編碼工作,這是技術(shù)的進步寻咒,是生產(chǎn)效率提高的標(biāo)志哮翘。
但是對于立志成為偉大程序員的人而言,解決業(yè)務(wù)問題并非其終極目標(biāo)毛秘。在這個世界中饭寺,能夠?qū)懸恍┐a的人不少,但能成為優(yōu)秀程序員的人卻并不多叫挟。這導(dǎo)致
了一方面很多學(xué)編程的人找不到工作艰匙,另一方面,很多高薪的工作卻無人應(yīng)征抹恳。
怎樣才能從一個普通碼農(nóng)演變成一個專家級程序員员凝?上網(wǎng)搜一下會有很多分析,我在這里只想提一個很基本的觀點:“了解你所寫的代碼”奋献。
比如隨便一行最簡單的代碼:
var a = 1;
如果你是一個普通的程序員健霹,你應(yīng)該知道這行代碼解決了什么問題。如果你是一個專家級的程序員瓶蚂,你應(yīng)該知道這些:
- 系統(tǒng)是如何執(zhí)行這行代碼的糖埋?
- 系統(tǒng)因為執(zhí)行了這行代碼,發(fā)生了哪些改變窃这?
如果要做到這兩點瞳别,你需要對以下內(nèi)容有比較深刻的理解:
- 深刻的掌握你所使用的編程語言;
- 了解和掌握你的程序所運行的操作系統(tǒng)杭攻;
- 在某些情況下祟敛,需要了解硬件的一些特性和限制,以及操作系統(tǒng)在這些硬件上的影響朴上。
因為你寫的代碼垒棋,作用于一臺圖靈機,中間需要有操作系統(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í)慣性的搗鼓自己的手機屯断、自己的電腦文虏。
對程序員而言,一個幸福的事實是殖演,隨著可穿戴設(shè)備和智能家居設(shè)備的逐步普及氧秘,越來越多的傳統(tǒng)設(shè)備配備了操作系統(tǒng),成為了可編程設(shè)備趴久。
如今丸相,一個程序員懂得Android開發(fā),就可以使用程序控制電視定時播放彼棍,可以控制智能手表表針的顯示樣式灭忠,可以控制空調(diào)的出風(fēng)溫度膳算,可以將手機和門禁連接,可以在汽車的中控臺上部署一個程序和手機共享音樂……
身為一個當(dāng)代程序員弛作,有太多的機會掌握一個以前只有專業(yè)人員才能掌握的設(shè)備涕蜂,可以將不同的硬件和服務(wù)連接在一起創(chuàng)造出新的使用場景,在這個機器拼接的世界中自由發(fā)揮自己的智慧映琳。
常學(xué)常新机隙,吐故納新
學(xué)習(xí)編程是一件無止境的事業(yè),其一是編程語言和相關(guān)的知識技能如浩瀚星河萨西,無窮無盡有鹿,其二是新技術(shù),新思路層出不窮原杂,日新月異印颤。因此您机,僅僅是能在一個領(lǐng)域跟上時代的發(fā)展穿肄,都需要付出相當(dāng)?shù)臅r間和精力。但這種快速的變化也為程序員帶來了無窮的機遇际看,隨著新技術(shù)的引進咸产,一些傳統(tǒng)的問題可以有新的解決方案,更高的效率仲闽。作為一個優(yōu)秀的程序員脑溢,理應(yīng)不斷的自我革新,用新知識和新技能自我革新赖欣。事實上屑彻,所有的高階程序員,具備的一個基本能力和素質(zhì)顶吮,就是不斷的嘗試新鮮事物社牲,不斷的閱讀新的項目代碼。也會主動的改進之前做過的項目悴了,那怕它們當(dāng)前運行良好搏恤。
同時,也不必因為新技術(shù)太多而產(chǎn)生恐慌湃交,任何技術(shù)都有其特定的價值和適用范圍熟空。不必因為出現(xiàn)了新東西就急于否定手頭正在學(xué)習(xí)和使用的技術(shù)。每一個新技術(shù)的掌握搞莺,都建立在對現(xiàn)有技術(shù)的充分理解之上息罗,因此,學(xué)好當(dāng)下才沧,恰恰是掌握未來的最佳方式迈喉。
學(xué)到不如做到
學(xué)習(xí)編程的最佳方式俏扩,就是把它做到可以運行。在學(xué)習(xí)任何一門語言或技術(shù)之前弊添,都可以給自己設(shè)定一個目標(biāo)录淡,例如學(xué)習(xí)JavaScript,可以要求自己做一個博客油坝;學(xué)習(xí)Android嫉戚,可以要求自己做一個日歷App。一個可以運行的程序澈圈,不管多簡陋彬檀,都具備必要的完整性和穩(wěn)定性,在完成一個可運行程序的過程中瞬女,必然涉及到諸多方面的問題和陷阱窍帝。解決這些問題的過程,正是學(xué)習(xí)的最佳路徑诽偷。在學(xué)習(xí)過程中坤学,將各種新知識和新技能應(yīng)用于一個自創(chuàng)項目,使之不斷完善报慕,是一個非常好的辦法深浮,它天然的幫助學(xué)習(xí)者制定了學(xué)習(xí)規(guī)劃和進度。有一個明確的目標(biāo)眠冈,就會有明確的學(xué)習(xí)路徑飞苇,解決問題時就不容易發(fā)散。更有助于提升效率蜗顽,也更容易衡量學(xué)習(xí)效果布卡。