一、起緣
2017年9月,我以前一個同事問我能不能教他小孩Theo學習編程,因為以前在同一家公司時,我那同事經(jīng)常帶Theo去公司,我和Theo也認識,所以我答應了。
二、編程語言
那個時候Theo 8歲,英語很棒,口語和老外差不多;數(shù)學也還可以。我認為可以直接教他C語言。于是從C語言開始。
C語言學了兩個月之后,基礎就打下來了。Theo學得很好,多數(shù)知識都能很好地領會,當然我的教程也寫得極為詳細–對于8歲的小朋友,你不得不寫得詳細。
當時也碰到了不少困難,困難的一次無疑是遞歸,遞歸是程序獨有的思維,數(shù)學里面沒有,跟日常生活的思維差別也很大。當時用的是漢諾塔的例子,我和Theo從晚9點開始學,一直學到12點多,學了三個多小時,Theo才搞懂遞歸的思維。后來Theo將遞歸掌握得爐火純青后,數(shù)次感嘆到:遞歸如此簡單,當時我為何學了三個多小時,學到12點多才學明白呢?
C語言學完之后,自然是學C++。因為C++就是在C的基礎上設計的,基本語法基本上是一樣的,但是二者還是有根本的區(qū)別。把一些基本的知識點,比如繼承、封裝、多態(tài)、私有、保護、公有、構造函數(shù)、析構函數(shù)、this指針、內聯(lián)函數(shù)、引用、模板、標準庫講完之后,就結束了。
考慮到Java長期霸占著全球編程語言排行榜的頭把交椅。C++教完之后,就教Theo學習Java。
Java語言比C/C++簡單。Theo有了C和C++的基礎之后,學習Java自然就比較快。
關于主流編程語言的難度排行,我認為是這樣的:
再接下來是學Python語言。計算機(信息學)會進入高考科目已是一個趨勢,目前一些試點省份比如浙江、天津等,計算機課程使用的編程語言就是Python。Python語言比Java更簡單,教完了Python語法之后,再教他編程實現(xiàn)計算器。計算器很簡單,教Theo編寫計算器主要是為了讓他理解軟件的開發(fā)過程。
這四門編程語言學完之后,就不需要再學語言了。因為編程語言有成百上千種,沒必要也沒時間全部都學。把這四種主流的語言學熟悉,以后即使碰見沒見過的語言,兩三個禮拜也可以學會。
按原本的計劃,接下來想教他編寫一些簡單的游戲,比如掃雷、貪食蛇、俄羅斯方塊,再教他做一個他的個人網(wǎng)站。
三、數(shù)據(jù)結構
后來我想數(shù)據(jù)結構更加重要。數(shù)據(jù)結構比較難,多少科班的大學生掛了數(shù)據(jù)結構。所以就決定暫時不教Theo編小游戲,先學數(shù)據(jù)結構。
起初我不確定能否教明白,畢竟一來數(shù)據(jù)結構較難,二來他才9歲(這個時候已經(jīng)是2018年的春天了),只能是抱著嘗試的心態(tài)。
之前的四門語言的教材,我都是自己編寫的。數(shù)據(jù)結構我用的是比較適合入門的《大話數(shù)據(jù)結構》??紤]到《大話數(shù)據(jù)結構》雖然寫的很清晰,但是小朋友不一定看得懂,我自己也寫了一部分教程,主要是對《大話數(shù)據(jù)結構》進行進一步細化和補充。
四、信息學奧賽
數(shù)據(jù)結構學了一小部分后,時間已經(jīng)到了2018年4月底。我那同事提起是不是可以考慮讓Theo走信息學奧林匹克競賽的道路。
于是開始制定計劃:
(1)數(shù)據(jù)結構一定要學好
(2)要做OJ題
(3)要做NOIP真題
當然,如果初就規(guī)劃好要走信息學奧賽的路,那么之前學的內容其實是過多了。Java可以先不用學,Python可以先不用學,計算器可以先不用做。這些可以等以后有時間了慢慢學。
但是沒辦法。人生,注定是一場不斷走彎路的旅程。
到了這個國慶節(jié),NOIP初賽已經(jīng)迫在眉捷了。
數(shù)據(jù)結構學習的容包括了《大話數(shù)據(jù)結構》中的90%的內容:算法時間復雜度和空間復雜度、鏈表、棧、隊列、字符串、二叉樹、圖、哈希表、8種排序方法、五種查找方法。暫時還沒講到的內容有:KMP、赫夫曼樹、短路徑、拓補排序、平衡二叉樹、多路查找樹。這些內容NOIP不考,等NOIP競賽結束后會繼續(xù)教。
OJ題則做了181道,這個量其實太少了,至少要上千題的量才會有比較好的效果。
NOIP真題亦只能做幾套,沒把全部的真題做完也很遺憾。
五、辭職
我本人,大學畢業(yè)后一直做的是計算機方面的研發(fā)和管理工作,至今十余載。初做iOS開發(fā),后來做數(shù)據(jù)庫,做Java后臺,管理方面則當過技術經(jīng)理、技術總監(jiān)、副總裁和CTO。
今年主要是從事人工智能方面的研發(fā)。
信息學奧賽和人工智能都是算法方面的內容。但是兩者既有很大的區(qū)別又有聯(lián)系。信息學奧賽是考基礎算法,而人工智能則是應用領域的算法。基礎算法如果比較強,對人工智能算法或其他任何領域的算法都會有很大的幫助。
先前我一邊上班一邊帶Theo小朋友學編程語言,感覺還是很輕松的。但是后來開始帶小朋友學信息學奧賽的內容,加上上班研發(fā)人工智能,相當于是做了兩份需要深度研究的工作,讓我苦不堪言。
到了2018年9月初,我決定辭掉工作,暫停對人工智能的研究,先專心帶小朋友學習信奧,。
以我目前的算法積累,教小朋友學習NOIP普及組的內容感覺綽綽有余。但是后面還有NOIP提高組、NOI、IOI(國際信息學奧林匹克競賽),終的目標是希望小朋友能拿到IOI。所以我自己也要經(jīng)常參加在線算法比賽以不斷提升自己的算法水平
至于人工智能算法,也是一個有趣且有用的方向,但只能等我在NOI方面的能力提高了之后才能繼續(xù)研究,這估計至少是一年之后的事情了。
六、后
是的,你沒有看錯,我走上輔導小朋友參加信息學奧林匹克競賽這條路,不是當初職業(yè)規(guī)劃的結果,而是偶然的結果。學編程來酷叮貓少兒編程大連校區(qū)。學編程來看酷叮貓少兒編程大連校區(qū)。