您的位置:首頁>正文

程式猿:不要學習代碼,要學會思考

這是一個人人都在學習程式設計的時代:Code.org請了比爾·蓋茨, 馬克·紮克伯格和克裡斯·波什等這些名人, 來告訴你, 每個人都可以程式設計;CoderDojo’s在各個國家悄然興起;在英國, 程式設計已經是各個年級學生的正式課程。

我認為這裡有個誤區。 別誤會我——如果每個人都會一些程式設計知識, 這個世界當然會變得更好——但是學會寫代碼不應該是我們的目標。 電腦和程式只是一個工具, 是一種達到某種目的的方法。

真正的目標應該是學會思考的方式。 換句話說, 我們應該嘗試教授電腦科學, 而不是教著寫代碼。 在本文中, 我將介紹兩者的不同, 以及為什麼後者是當下學程式設計浪潮成功的關鍵。

如果你喜歡視頻的解釋, 我強烈推薦Simon Peyton Jones的TED, Teaching Creative Computer Science。 這和本文的觀點不謀而合。

看完之後, 依然想看文字的版本麼?好的。 讓我們先從一個關鍵的問題開始吧:為什麼你要學習程式設計或電腦科學呢?

回答這個問題之前, 我們先賣個關子。

歡迎來到真實的世界

現在, 你可能正在用Chrome或者Firefox流覽器在看這篇文章, 運行在Windows或者OS X作業系統上, 用的一台筆記本或者桌上型電腦。 我猜你今天還花了一些時間查看電子郵件, 刷Facebook, 或者在Youtube上看視頻了。 如今, 人們的生活越來越依賴於電腦:醫療記錄存放在了資料庫中;簡歷放在LinkedIn上;使用Google或者Facebook來推銷你的產品;用Amazon來買東西;在網上報稅;線上管理你銀行的帳戶;甚至還涉足了比特幣。

現在, 從螢幕上移開你的眼睛:在你的口袋, 包包, 或者旁邊的桌子上, 可能就有一部智慧手機。 它裝有GPS, 攝像頭, 觸控式螢幕, 還有成千上萬的應用。 如果你現在在客廳, 你可能還有一台聯網的LCD電視,

一台DVR, DVD播放機, 蘋果TV, XBox, 或者PlayStation。 你每天看的電影, 聽的音樂, 玩的遊戲, 就封裝在這些設備顯卡和音效卡中。

軟體正在佔領這個世界, 但這還只是個開始。 不知不覺中, 你就穿著各種可穿戴設備, 用電腦來鎖門, 用機器人來運貨, 打掃房間。 擁有你自己的電子技術, 經營自己的生產廠, 生活在虛擬的世界中, 乘自動駕駛的汽車去旅行, 甚至飛向太空。

代碼無處不在

毫無疑問, 以上我所描述的技術的源動力是軟體。 你生活的每一個方面, 都被代碼所包圍。 大量的代碼會讓未來變得美好。

但是, 僅僅是一項技術非常普遍不能成為你在學校學習它的理由。 就像我們乘坐飛機, 但是考飛機駕照並不在從幼稚園到12年級的課程中。

然而,

飛行的原理卻是課程的一部分:

物理學和數學讓你明白重力、彈性元件、壓力、速度、摩擦和攀升等方面的知識。

生物學讓你明白人體在高海拔、低氧、極端寒冷等情況下的反應。

歷史解釋了飛機的發明, 進化, 以及其在旅行、商業和戰爭中扮演的角色。

從中學畢業的時候, 你就已經知道了飛機是什麼, 它是如何工作的, 如何安全乘坐飛機。 通識類課程, 像物理學, 數學, 歷史, 教會你如何思考各種各樣的問題, 包括飛機;與之形成對比的是教會你是用工具的課程, 像教你如何駕駛一種特定類型的飛機。

什麼是電腦科學?

電腦科學是一門研究計算的學科:就是說, 如何表述和處理資訊。 以下是一些你會學到的概念:

解決問題:你將會學習演算法——就是通用的一些方法,

像是分治演算法、遞迴、遺傳演算法、貪心演算法——説明你建模, 分解, 解決各種各樣的問題。

邏輯:你將開始使用精密又正式的方法思考問題, 像是抽象, 邏輯代數, 數論和集合論, 來用嚴密的邏輯解決問題。

數據:你將會接觸到資訊理論, 並開始思考什麼是資訊?如何表述?如何對真實的世界建模?

系統:如何設計與構建複雜的系統, 來實現一系列的需求?系統工程是一個幾乎在各個領域都涉及到的重要的主題。

思考:瞭解人類大腦最好的方式, 是試著去複製它。 像人工智慧、機器學習、電腦視覺、自然語言處理這些話題, 不僅僅在電腦科學領域, 同時在數學, 生物, 物理, 哲學等方面都是最前沿的科學。

注意,上面的清單中並沒有提到代碼或者程式設計,因為它們只是實現計算的工具:它們本身並不是電腦科學。

電腦科學並不是關於電腦的科學,就像天文學不是關於望遠鏡的科學,生物學不是關於顯微鏡的,化學不是關於燒杯和試管。科學並不是研究工具的。——Michael Fellows和Parberry

什麼是程式設計?

程式設計,或寫代碼,就是指示電腦來執行哪一些指令。如果你從未寫過代碼,也可能通過操作應用程式來和電腦交互。其實在內部,這個應用程式也是通過代碼來告訴電腦顯示什麼,在哪裡檢索資料,以及對於你的點擊操作做出什麼回應。

所有的程式設計都是建立在我們上面討論的電腦科學的原理上的。值得注意的是,同一組概念——邏輯、演算法、資料、系統工程——可以用來構建任何軟體,小到你現在閱讀這篇文章用的這個流覽器,大到飛機上的自動駕駛軟體。儘管會涉及到一些數學和架構的知識,但這卻是極富創造性的活動:你將想法變成現實,一次一行代碼。

將程式設計作為學習電腦科學的一部分有以下的好處:

DIY:如果你會程式設計了,你就可以製作一些東西。可以從最簡單的開始:做一個能給旅遊照片批量重命名的腳本,或者寫一個Excel公式幫自己計算稅務;然後,開始發燒級別的:給你自己的檔案系統寫一個流覽器;給你們公司做一個app;或者寫一個能夠和朋友一起玩的遊戲。

解決問題:一旦你親手做了幾個app,弄清楚其他的就簡單多了。一旦你不再害怕電腦——未知的領域——你就會成為技術達人。隨著技術已經關係到我們生活的每個部分,掌握它們就會變得和學會閱讀一樣重要。

事業:我們學習電腦科學的目標不是成為職業的程式師。我們都學了數學,物理,化學,但是我們並沒有都成為這方面的專家。然而,如果你對這方面有激情的話,軟體工程師也是一份評價高,薪資高,進步快的職業。

綜合考慮

簡要重述:

電腦科學是一種新的思考方式。在這個技術時代,其中的概念對每一個人都很有幫助。

程式設計是學習電腦科學重要的一部分,以實現這些新的思考方式。然而,程式設計本身並不是目標。

混淆這兩個觀點,就導致了現在學習程式設計熱潮的圈子的一些問題。Slate 發佈了一篇文章,《也許並不是每一個人都需要學程式設計》;Atlantic寫了一篇《新聞學院應該要求記者寫代碼嗎?不》;Jeff Atwood寫了《請不要學習寫代碼》,其中提出了一個精闢的問題:

“如果邁克爾·布隆伯格(紐約市市長,譯者注)是一個專業的java程式師,他能更好的領導一個美國的大城市麼?”

當然,這個問法是錯誤的。這就表示這些活動的目標是學習代碼,而不是學習思考的方式。如果連Jeff Atwood這樣經驗豐富的程式師都搞錯了,那麼普通人更分不清楚了。問題應該這樣問:

如果通過學習解決問題的方法,訓練嚴密的邏輯來提高自己的能力,那麼邁克爾·布隆伯格(或者其他人)能工作的更好嗎?

我相信,答案是顯而易見的。而且隨著科技的發展,答案會越來越清晰。這就是為什麼,我們要把教學重點放在電腦科學上,而不是代碼。

注意,上面的清單中並沒有提到代碼或者程式設計,因為它們只是實現計算的工具:它們本身並不是電腦科學。

電腦科學並不是關於電腦的科學,就像天文學不是關於望遠鏡的科學,生物學不是關於顯微鏡的,化學不是關於燒杯和試管。科學並不是研究工具的。——Michael Fellows和Parberry

什麼是程式設計?

程式設計,或寫代碼,就是指示電腦來執行哪一些指令。如果你從未寫過代碼,也可能通過操作應用程式來和電腦交互。其實在內部,這個應用程式也是通過代碼來告訴電腦顯示什麼,在哪裡檢索資料,以及對於你的點擊操作做出什麼回應。

所有的程式設計都是建立在我們上面討論的電腦科學的原理上的。值得注意的是,同一組概念——邏輯、演算法、資料、系統工程——可以用來構建任何軟體,小到你現在閱讀這篇文章用的這個流覽器,大到飛機上的自動駕駛軟體。儘管會涉及到一些數學和架構的知識,但這卻是極富創造性的活動:你將想法變成現實,一次一行代碼。

將程式設計作為學習電腦科學的一部分有以下的好處:

DIY:如果你會程式設計了,你就可以製作一些東西。可以從最簡單的開始:做一個能給旅遊照片批量重命名的腳本,或者寫一個Excel公式幫自己計算稅務;然後,開始發燒級別的:給你自己的檔案系統寫一個流覽器;給你們公司做一個app;或者寫一個能夠和朋友一起玩的遊戲。

解決問題:一旦你親手做了幾個app,弄清楚其他的就簡單多了。一旦你不再害怕電腦——未知的領域——你就會成為技術達人。隨著技術已經關係到我們生活的每個部分,掌握它們就會變得和學會閱讀一樣重要。

事業:我們學習電腦科學的目標不是成為職業的程式師。我們都學了數學,物理,化學,但是我們並沒有都成為這方面的專家。然而,如果你對這方面有激情的話,軟體工程師也是一份評價高,薪資高,進步快的職業。

綜合考慮

簡要重述:

電腦科學是一種新的思考方式。在這個技術時代,其中的概念對每一個人都很有幫助。

程式設計是學習電腦科學重要的一部分,以實現這些新的思考方式。然而,程式設計本身並不是目標。

混淆這兩個觀點,就導致了現在學習程式設計熱潮的圈子的一些問題。Slate 發佈了一篇文章,《也許並不是每一個人都需要學程式設計》;Atlantic寫了一篇《新聞學院應該要求記者寫代碼嗎?不》;Jeff Atwood寫了《請不要學習寫代碼》,其中提出了一個精闢的問題:

“如果邁克爾·布隆伯格(紐約市市長,譯者注)是一個專業的java程式師,他能更好的領導一個美國的大城市麼?”

當然,這個問法是錯誤的。這就表示這些活動的目標是學習代碼,而不是學習思考的方式。如果連Jeff Atwood這樣經驗豐富的程式師都搞錯了,那麼普通人更分不清楚了。問題應該這樣問:

如果通過學習解決問題的方法,訓練嚴密的邏輯來提高自己的能力,那麼邁克爾·布隆伯格(或者其他人)能工作的更好嗎?

我相信,答案是顯而易見的。而且隨著科技的發展,答案會越來越清晰。這就是為什麼,我們要把教學重點放在電腦科學上,而不是代碼。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示