一, 起缘
2017 年 9 月, 我以前一个同事问我能不能教他小孩 Theo 学习编程, 因为以前在同一家公司时, 我那同事经常带 Theo 去公司, 我和 Theo 也认识, 所以我答应了.
二, 编程语言
那个时候 Theo 8 岁, 英语很棒, 口语和老外差不多; 数学也还可以. 我认为可以直接教他 C 语言. 于是从 C 语言开始.
C 语言学了两个月之后, 基础就打下来了. Theo 学得很好, 多数知识都能很好地领会, 当然我的教程也写得极为详细 -- 对于 8 岁的小朋友, 你不得不写得详细.
当时也碰到了不少困难, 最困难的一次无疑是递归, 递归是程序独有的思维, 数学里面没有, 跟日常生活的思维差别也很大. 当时用的是汉诺塔的例子, 我和 Theo 从晚 9 点开始学, 一直学到 12 点多, 学了三个多小时, Theo 才搞懂递归的思维. 后来 Theo 将递归掌握得炉火纯青后, 数次感叹到: 递归如此简单, 当时我为何学了三个多小时, 学到 12 点多才学明白呢?
C 语言学完之后, 自然是学 C++. 因为 C++ 就是在 C 的基础上设计的, 基本语法基本上是一样的, 但是二者还是有根本的区别. 把一些基本的知识点, 比如继承, 封装, 多态, 私有, 保护, 公有, 构造函数, 析构函数, this 指针, 内联函数, 引用, 模板, 标准库讲完之后, 就结束了.
考虑到 Java 长期霸占着全球编程语言排行榜的头把交椅. C++ 教完之后, 就教 Theo 学习 Java.
图(1) TIOBE 2018 年 9 月编程语言排行榜. PNG
Java 语言比 C/C++ 简单. Theo 有了 C 和 C++ 的基础之后, 学习 Java 自然就比较快.
关于主流编程语言的难度排行, 我认为是这样的:
Assembly> C> C++> Java ≈ Objective-C> PHP> Python
再接下来是学 Python 语言. 计算机 (信息学) 会进入高考科目已是一个趋势, 目前一些试点省份比如浙江, 天津等, 计算机课程使用的编程语言就是 Python.Python 语言比 Java 更简单, 教完了 Python 语法之后, 再教他编程实现计算器. 计算器很简单, 教 Theo 编写计算器主要是为了让他理解软件的开发过程.
图(2) 简易计算器. PNG
这四门编程语言学完之后, 就不需要再学语言了. 因为编程语言有成百上千种, 没必要也没时间全部都学. 把这四种最主流的语言学熟悉, 以后即使碰见没见过的语言, 两三个礼拜也可以学会.
按原本的计划, 接下来想教他编写一些简单的游戏, 比如扫雷, 贪食蛇, 俄罗斯方块, 再教他做一个他的个人网站.
三, 数据结构
后来我想数据结构更加重要. 数据结构比较难, 多少科班的大学生挂了数据结构. 所以就决定暂时不教 Theo 编小游戏, 先学数据结构.
起初我不确定能否教明白, 毕竟一来数据结构较难, 二来他才 9 岁(这个时候已经是 2018 年的春天了), 只能是抱着尝试的心态.
之前的四门语言的教材, 我都是自己编写的. 数据结构我用的是比较适合入门的《大话数据结构》. 考虑到《大话数据结构》虽然写的很清晰, 但是小朋友不一定看得懂, 我自己也写了一部分教程, 主要是对《大话数据结构》进行进一步细化和补充.
让我惊喜的是, Theo 能听得懂.
四, 信息学奥赛
数据结构学了一小部分后, 时间已经到了 2018 年 4 月底. 我那同事提起是不是可以考虑让 Theo 走信息学奥林匹克竞赛的道路.
说来惭愧, 我是那时才知道 NOIP(全国青少年信息学奥林匹克联赛)和 NOI(全国青少年信息学奥林匹克竞赛), 具体请参考: https://www.jianshu.com/p/04bf0fa1b920
于是开始制定计划:
(1)数据结构一定要学好
(2)要做 OJ 题
(3)要做 NOIP 真题
当然, 如果最初就规划好要走信息学奥赛的路, 那么之前学的内容其实是过多了. Java 可以先不用学, Python 可以先不用学, 计算器可以先不用做. 这些可以等以后有时间了慢慢学.
但是没办法. 人生, 注定是一场不断走弯路的旅程.
到了这个国庆节, NOIP 初赛已经迫在眉捷了.
数据结构学习的容包括了《大话数据结构》中的 90% 的内容: 算法时间复杂度和空间复杂度, 链表, 栈, 队列, 字符串, 二叉树, 图, 哈希表, 8 种排序方法, 五种查找方法. 暂时还没讲到的内容有: KMP, 赫夫曼树, 最短路径, 拓补排序, 平衡二叉树, 多路查找树. 这些内容 NOIP 不考, 等 NOIP 竞赛结束后会继续教.
OJ 题则做了 181 道, 这个量其实太少了, 至少要上千题的量才会有比较好的效果.
图(3) 做题记录. PNG
NOIP 真题亦只能做几套, 没把全部的真题做完也很遗憾.
五, 辞职
我本人, 大学毕业后一直做的是计算机方面的研发和管理工作, 至今十余载. 最初做 iOS 开发, 后来做数据库, 做 Java 后台, 管理方面则当过技术经理, 技术总监, 副总裁和 CTO.
今年主要是从事人工智能方面的研发.
信息学奥赛和人工智能都是算法方面的内容. 但是两者既有很大的区别又有联系. 信息学奥赛是考基础算法, 而人工智能则是应用领域的算法. 基础算法如果比较强, 对人工智能算法或其他任何领域的算法都会有很大的帮助.
先前我一边上班一边带 Theo 小朋友学编程语言, 感觉还是很轻松的. 但是后来开始带小朋友学信息学奥赛的内容, 加上上班研发人工智能, 相当于是做了两份需要深度研究的工作, 让我苦不堪言.
到了 2018 年 9 月初, 我决定辞掉工作, 暂停对人工智能的研究, 先专心带小朋友学习信奥,.
以我目前的算法积累, 教小朋友学习 NOIP 普及组的内容感觉绰绰有余. 但是后面还有 NOIP 提高组, NOI,IOI(国际信息学奥林匹克竞赛), 最终的目标是希望小朋友能拿到 IOI 金牌. 所以我自己也要经常参加在线算法比赛以不断提升自己的算法水平
至于人工智能算法, 也是一个有趣且有用的方向, 但只能等我在 NOI 方面的能力提高了之后才能继续研究, 这估计至少是一年之后的事情了.
六, 最后
是的, 你没有看错, 我走上辅导小朋友参加信息学奥林匹克竞赛这条路, 不是当初职业规划的结果, 而是偶然的结果.
这跟因特网的产生一样, 因特网当初也不是精心规划的结果, 而是偶然的结果(这是某年 NOIP 的考题哈).
来源: http://www.jianshu.com/p/4d126cf8ba96