文章摘要: 作為一名數學系的優秀畢業生,超模君也曾沒日沒夜地擼程式碼,夢想成為像Allen Zhang一樣的高階程式設計師,但後來因為體力不支,就改碼字了。
我曾經也想
成為一個碼農
作為一名數學系的優秀畢業生,超模君也曾沒日沒夜地擼程式碼,夢想成為像Allen Zhang一樣的高階程式設計師,但後來因為體力不支,就改碼字了。
也因為有這樣的一段經歷,讓我對程式設計和程式設計師有不一樣的認知,或許,程式設計思維會成為解決問題的一種思考方式。
還記得有一年,在全球程式設計師圈子最有名的黑客社交網站 HackerRank舉辦了一場屬於程式設計師的「奧運會」,沒想到,中國一不小心拿了個第一名……
中國程式設計師的能力在國際上確實得到了認可,在網際網路燥熱的中國,無論哪個行業,有「網際網路+」這個名詞在,似乎就能吸金無數。
因此,中國程式設計師的薪水也是蹭蹭蹭地往上漲,程式設計師這個方向成為大熱門。
人,總是選擇趨利避害。看著水漲船高的程式設計師薪水,很多家長就開始讓孩子學習程式設計,但這裏面到底真正熱愛開發的人有多少?要是,網際網路的熱潮退下,還會有那麼多人想當程式設計師嗎?
那問題就來了,那到底該不該學習程式設計?
超模君認為:程式設計是一種思考方式,更是一種全新的教育模式。
為解決心中的疑惑,超模君請教了我心中的Geek大神,也是從事少兒程式設計教育的好朋友——開發者肖恩。
肖恩老師
EUMlab&西瓜創客創始人
肖恩老師精通各種程式語言(C/C++//JAVA/Ruby/Python/Javascript/ Verilog/VHDL等),大學時代就拿下國際程式設計大獎 Intel杯亞太區第一名。他在德國創業期間,開發了明星產品Pro Metronome (音樂節拍器App),全球使用者已逾3000萬,連續5年在蘋果應用商店同類排名第一。
回國後他創辦了「西瓜創客」(一個線上少兒程式設計教育品牌),發展也十分迅速,目前他教過的孩子已近10萬,分佈在全球40多個不同國家,西瓜創客也已藉此獲紅杉資本、經緯中國的A輪投資。
Q1:少兒程式設計,選擇哪種語言好?
這個提問就像有人在問你 「是穿婚紗好、正裝好還是休閒裝比較好?」
這是一個無法回答的問題,因為問題缺少了重要的前提:「選什麼樣的衣服,取決於我們的目的」。
婚禮時穿婚紗很好,但是如果每天都穿著婚紗上班就很奇怪了。
每件衣服都有適用於它應有的場景。
程式語言也是一樣的,每種程式語言都有屬於它的應用場景。要回答 「少兒程式設計,選擇哪種語言比較好?」
我的簡單版答案是:Scratch!
作為從7歲開始做電子設計,讀過Linux 原始碼,寫過RTOS(實時作業系統),做過晶片程式設計FPGA/DSP,有20年程式設計齡,能熟練使用匯編/C/C++/C#/Perl/Objective-C/JAVA/Ruby/Python/Javascript/HTML/CSS 等大家熟悉的程式語言和大家不熟悉的設計晶片程式語言 Verilog 和 VHDL的我,推薦使用Scratch 。
那為什麼是 Scratch 呢? 我在和西瓜創客教的近 10 萬孩子的家長溝通過程中總結了家長們的常見困惑,詳細解釋如下:
Q2:Scratch 是低階語言,太幼稚,什麼時候可以轉學高階語言(例如 C 和 Java)?
這是一個常見誤區,主要是受「高階」二字翻譯不準確的影響產生的誤區。 高階語言的英文原文叫做 High-level programming language ,更準確的翻譯應該是高層級程式語言。層級的高低不是語言的高階與否的劃分,而是指語言離硬體指令的遠近。
越接近人類的自然語言的程式語言越叫高階語言(越容易讀懂),越接近計算機指令的叫做低階語言(越難讀懂)。
舉個例子,組合語言是離 CPU 指令最近的人還能勉強能讀懂的語言。 用匯編來表達 1 + 2,是這樣的:
在其他語言裡是這樣表達的:
顯而易見,其他的語言更接近人更好理解的自然語言。
更令人髮指的是,不同架構型別的 CPU,控制它的指令是不一樣的。 也就是說,同樣的是 1 + 2,不同的 CPU 上需要用不同的寫法。
而所有的程式語言設計者,都在致力於做一件事情:
讓人們可以用人類能讀懂的語言,優雅地程式設計,只需要把自己的想法告訴電腦,電腦就能自動把語言翻譯成他能自己能執行的命令。
也就是說,無論我們用哪種高階語言寫出來的程式碼,都有,也都需要一個翻譯官,去編譯(Compiler)或者解釋(Interpreter)我們寫的程式碼讓電腦可以執行。
BTW,從定義上來說,Scratch 是比 C 和 Java 更高階的語言。
那既然程式語言的設計者都有同樣的目標,那哪個語言是最好的程式語言呢?
這個問題就和「什麼樣的衣服是最好的衣服」類似了。 答案是在不同的場景和目標下,選擇對應的程式語言,沒有哪一種語言是最好的語言。
例如,C 語言更接近計算機硬體,程式設計語法中有很多莫名其妙的操作學習起來十分困難。 但它的優點恰好也是它特別接近硬體,對記憶體的申請和釋放都得開發者自己來寫,程式的執行效率能特別的高。(這裏之所以說「能特別高」,而不是「會特別高」,是因為是否能執行高效,還取決於開發者的演算法能力以及對 CPU 的指令是否熟悉)
但是如果誰想要用 C 語言來做網站,也許用 Javascript + CSS + HTML 組合起來花 5 分鐘做出來的網頁,用 C 語言可能 1 個月也寫不出來。
那為什麼程式語言會有排行變化呢?
這個完全是和工作和市場機會有關的。
例如,在網際網路大爆發的時候,做網站的人是最稀缺的,於是推動了JAVA、C# 和 Javascript + CSS + HTML 等語言的發展。那個時候,另一種叫做Objective-C 的語言就特別的冷門。
直到蘋果的 iPhone 出來後,移動網際網路的春天來臨,當時誰能做 App,誰的工作機會就比別人多呀。於是這種冷門的Objective-C 語言就迎來了他的春天。由於網際網路和移動網際網路的快速發展,大量的資料產生,機器學習和人工智慧在坐了多年的冷板凳後,終於有了用武之地。大量的資料科學家使用 Python 來編寫機器學習的程式(因為 Python 和 Python 大量的資料分析和處理相關的功能庫是開源免費的),於是 Python 又成為近年的新寵。
所以如果選程式語言是爲了讓孩子未來好找工作的話,你確定現在選擇的語言會在 15 年後還不衰落?
“如果我給你一支高階鋼筆…
oh,不不不,你給我一支高階鋼筆。
我能成為作家嗎?”
「不能」
沒錯。 決定我是否能成為作家的,不是因為使用的是什麼樣的鋼筆;決定是否能成為攝影師的,也不是昂貴的鏡頭和相機;
決定是否能成為好的開發者,也不是選擇的語言,而是他是否能發現生活中的問題,找到解決問題的辦法,然後用程式設計把解決方案做出來。
表達我們的情感和洞見、凝固時間記錄故事、發現並解決問題 是我們的目標,用一支好的鋼筆,好的相機,和選擇一種程式語言是實現目標的手段。我們不應該錯把手段當目標。
在文章剛開始,我提到了我能熟練使用匯編/C/C++/C#/Perl/Objective-C/JAVA/Ruby/Python/Javascript/HTML/CSS 等程式語言,這並非吹噓。 事實上,一個成熟的開發者,基本都掌握多種程式語言,並且可以快速地學習和適應新的語言。這是因為程式語言是有規律可尋的。
舉個例子,如果我們要用程式設計編寫,如果天下雨,就帶傘,否則就不帶傘。 用不同的語言寫出來是這樣的
我們可以看到,無論是哪種語言,他們都有一個類似的結構:
這就是程式設計中不變的部分,他們只是表達方式(程式設計的語法)有一點區別罷了。 這就像目前主流音樂,都是由 12 平均律切分的 12 個音(do 升do re 降mi mi fa….)構成的。
但是如果我們用葫蘆絲吹婚禮進行曲,就總會覺得有一點過橋米線的感覺。 這是因為每個樂器有它獨特的特性。程式語言也是一樣的。 每種語言都有一些它十分獨特的特性。例如,我們想判斷選單中是否包含宮保雞丁,如果包含就輸出「找到了」。C 語言, Python 和 Scratch 的寫法分別如下。
你會發現,這時,Python 和 Scratch 的寫法就比 C 語言直觀多了。 這部分就是不同語言的特性部分。
也就是說,當精通了一種程式語言後,想學習另一種程式語言,只需要瞭解它的語法就能上手,會熟練使用它的特性就可以精通。程式設計的核心不在於語法,而是解決問題的思路和方法(演算法)。
而 Scratch 中包含了幾乎所有程式語言共通的部分。無論未來語言如何變化,最基本的邏輯是不會變化的。而這些訓練在 Scratch 中都能完成。
Q4:聽你這樣說,也就是說學習其他語言也是一樣的,因為只要精通一門,再學另一門語言就容易了?
是的,沒錯。和學好了 Scratch 轉 C,Java 和 Python 是容易的類似。 學好了 C 轉 Python 也是不難的。但是為什麼依然還是推薦孩子學習 Scratch 而不是 C 的原因不是因為程式設計,而是因為認知科學。
在認知科學中,人們是否能快速學習一樣東西或者堅持學習一樣東西和自我效能感(Self-efficacy )息息相關。自我效能感是指人們是否相信自己能達到一個目標,當相信的時候就會覺得做起來很帶勁,一點也不枯燥;當不相信的時候就覺得自己在飽受煎熬。簡單地理解就是成就感是讓人學習產生快樂並且堅持學習的重要原因。
如果在學習任何一樣東西的時候,例如數學,一旦我們意識到自己學起來有困難,就開始不相信自己能學好,並且給自己各種理由證明自己不能學好,甚至是讓自己學不好合理化。
例如會說 「學這個有什麼用呀,買菜又不需要微積分」,或者說「我就是一個學文科的,這種理科的東西我不需要學」 甚至會說 「我就是一個學文科的料,理科在我的基因裡就寫著‘不擅長’三個字」 。
類似的,如果我們希望孩子不會說自己「就不是一個程式設計的料」,最好的辦法就是讓孩子從第一步就產生成就感,從而產生自我效能感,也就是相信自己可以有能力達到目標,學好程式設計。
在這樣的前提下,你還會讓孩子從學習例如 C 或者 Java 這樣的工業級程式設計開始嗎?
這樣,他可能會面臨的困難不僅僅是程式設計的困難,他還會遇到打字的困難,標點是否使用正確的困難,程式語言語法的困難,編譯錯誤時莫名其妙的困難等等。 這些困難會消磨掉孩子學習程式設計的興趣,自己找理由說
「我不喜歡程式設計」,就和很多人找到無數理由說自己「不喜歡數學」一樣。 這就是在沒有形成自我效能感的情況下拔苗助長的結果。
這個就很像我在德國期間看到的德國音樂學習和中國的區別。德國在小時候學習音樂首先是學習鑑賞,再是學會玩,最後纔是學音樂。
例如,首先老師會給孩子們彈音樂,並且音樂是配合特定故事和場景,讓孩子們能把聲音和場景對應起來;然後讓孩子們可以玩樂器,就是不計較指法是否正確,姿勢是否正確的情況下,先和樂器做朋友,不恐懼音樂和樂器;最後纔是學習如何駕馭一種樂器,纔開始學習指法等等所謂的基本工。
而國內學習樂器恰好相反,首先讓孩子練習的是指法,而忽略了讓孩子對音樂的熱愛。
這就是為什麼西瓜創客以及我肖恩老師還是會推薦學習 Scratch 的原因: 先讓孩子可以不恐懼程式設計,產生興趣,並且用程式設計表達自己。 等到孩子們已經產生了自信和成就感,再提高難度。如果都要選擇一門語言進入程式設計的世界,一定是選擇能讓孩子快速找到自信,找到成就感的語言。 那這種語言目前最好的就是 Scratch。
Q4:那要是我的孩子就是想學除了 Scratch 外的語言,我應該怎麼為他選擇?
首先,讓我們把程式語言分為兩大類,一類是興趣類程式設計,以圖形化程式設計為主,目的是用程式設計實現自己的想法,不用擔心程式執行效率不高,也不用考慮使用者的使用場景和平臺。
另一類是工業類程式設計,以原始碼程式設計為主,除了考慮用程式設計來解決生活生產中的問題外,還需要考慮到使用者會在什麼樣的場景下使用此軟體,以及產品的易用性。
如果是青少年學習程式設計,依然不推薦從工業類程式設計入手。 目前 Scratch 語言也在進化,能支援的功能已經遠遠大於把一個圖形從這裏移動到那裏。 Scratch 現在已經可以對特定硬體進行程式設計了。和 Scratch 類似的圖形化語言 Blocky ,已經可以完成很多很多遠超過 Scratch 的功能了。
例如同是 Scratch 3 基於的 Blockly 開發的 App Inventor,已經可以讓孩子用圖形化程式設計製作一個手機 App。事實上,並不是圖形化程式設計就弱雞,現在西瓜創客的員工工資公式已經是用 Blocky 寫的了,西瓜創客的後臺各種工作流程規則也都是用圖形化語言來寫的。
如果非要選擇工業級程式語言,我們還是可以按目標來劃分。
如果目標是應試,首選是 Python,目前浙江等地區已經把 Python 列爲了高考科目。 如果想通過 NOIP 加分的話,其次選擇是 C/C++ 語言。(注,在應試層面上,選擇 C 和選擇 C++ 是一樣的,因為 C++ 是基於 C 擴充套件增加了一些例如物件導向程式設計的特性,而在 NOIP 的賽題裡,不會用到這些高階特性)
如果目標是編寫控制硬體的程式,推薦語言是 Python 和 C。C 的原因是主流的硬體程式設計都是支援 C 的。而非工業級的硬體程式設計,例如,樹莓派支援用 Python 程式設計。
如果目標是製作 App, 可以選擇的語言是 Scratch 類似的 App Inventor、 Java(用於編寫安卓的 App)或者 Objective-C/Swift (用於編寫蘋果系統 iOS 的 App)。另外 Java Script 也是一個不錯的跨平臺選擇。現在大多數程式都是蘋果安卓系統通用的。這類程式基本是基於某個框架,最常用的框架是 React Native,而 React Native 使用的就是 Javascript 語言。(注,Java 語言和 Javascript 是兩個語言,類似但不相同)
如果目標是製作網頁,可以選擇的語言是 Javascript + CSS + HTML。其中 CSS 和 HTML 是決定網頁長成什麼樣的。這兩種語言學習起來很簡單。推薦 Javascript 的原因是,網頁程式設計的前端(使用者能看到的部分)基本都是用 Javascript 來控制的。而且現在的 Node.JS 也是基於 Javascript 的語法來做的後端程式(也就是使用者看不到的伺服器部分)。也就是說,只要會 Javascript前端後端都能寫。
如果目標是做資料分析,首推的是 Python 語言。Python 語言裡有大量關於數據處理的公共庫可以使用。讓我們可以站在巨人的肩膀上繼續深入研究,而不是重造車輪。
綜合各種因素,如果是針對 7-12歲的孩子學習程式設計,語言的推薦順序為 Scratch > Python > Javascript > C 。
其他問題Q1:我想讓孩子參加信奧賽NOIP,聽說只有C語言可以參加,那學Scratch還有用麼?
這些都是十分好的問題,十分值得我們再開一篇文章來詳細講解。請關注西瓜創客公眾號,我會在未來和大家分享這些話題。
以上。
肖恩老師
20年前,學英語不是爲了成為翻譯員
10年前,學習電腦不是爲了成為打字員
今天學習程式設計
不是爲了讓孩子們都成為程式設計師
而是為他們開啟一扇門
走進更廣闊的未來世界