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