作者:范德成
链接:https://www.zhihu.com/question/19705160/answer/164490969
我想过这个问题多年了。我家娃长大以后,我会这样教她:首先,计算机的本质是有限状态自动机。所以先教有限状态自动机。为了有趣,做一个C语言字面量字符串解析器,也就是能解析"Hello\tWorld\x21\x20What's\x0020up?\040\n"这样的一个状态机。然后,介绍冯·诺依曼计算模型。主要概念是分别存储程序和数据。程序不再只是放在ROM中的,而是可以加载进RAM里执行的。
再接下来学习BASICA/GWBASIC。看起来有点老古董,但实际上它们能做的事情也不少,比如用来做一个简单的财务处理程序,或者画一个饼图,做一个汉诺塔小游戏等等。内存只有64KB可用,还可以读写文件,可以让孩子学到内存和文件大小的概念。BASICA/GWBASIC学到了非结构化编程。
接下来学QBASIC,它带来了结构化编程的概念。包括函数调用。学函数调用时要教一下栈的概念。QBASIC教的时候还要着重学一下内存池。因为直到QBASIC为止还没有malloc的功能。要教一下用内存池怎样分配和释放对象。
QBASIC可以学到初二。然后教C语言初步,这个讲究程序效率和汇编对应性的中级语言。内存分配、未初始化内存、读写越界、野指针、内存泄漏、重复释放、general protection fault等等都要讲一下,并教一下怎样做错误处理。结构体的内存布局、对齐。汇编代码一览。然后用函数指针来实现一下接口和多态。
初三估计可以讲http://VB.NET和C#了。强类型、内存安全并带垃圾回收的编程语言的好处。泛型的优势。用http://VB.NET8.0以上,或者C# 2.0以上,可以用它们的state machine功能教一下协程coroutine的概念。同时以回顾历史的方式教一下Windows 3.x协作式多任务。用C#模拟一下Windows的消息循环。它们和Windows 95的抢占式多任务的不同。并且,如果在语言没有提供协程功能的情况,怎样手动展开栈来实现协程。
C#和http://VB.NET的面向对象编程必然是要教的。这是一个好时机。
然后教Python和JavaScript。这两门动态类型语言最好和TDD一起教。这是因为TDD可以避免动态语言运行时再确定类型而让人容易犯的类型错误。TDD中可以随时添加有关类型的断言,以避免类型错误。而且,动态语言本来就写起来比较简洁,加上TDD既保证了质量,又不会像静态类型语言那样繁琐。
Python和JavaScript的面向对象编程也必然是要教的。
接下来,估计是在高一吧。要深入C语言了,并结合操作系统和应用程序环境,用它来做几个生产用的程序。话说高中课业压力大,如果学不完,放到大学再学也是可以的。
然后学C++。学C语言的时候我觉得C89标准就行,但C++我觉得不必学太老的,因为在我看来,C++ 98本身就是一个不成熟的版本。应该学C++ 11/14等新标准。直接啃@vczh大侠审校的C++ Primer 5th Edition就行。
数据库学两个,Python/C#访问sqlite和C#访问SQL Server。
多线程编程。先教有锁数据结构。等到有锁数据结构学好了以后,再教互锁(interlocked)操作。完了以后再介绍一下无锁多线程编程,它的优势和劣势。
最后要讨论一下如何把多线程程序手动转换为协程以让它变得可以做单元测试。基本的数据结构和算法。其他主题,随需要而学,包括计算机体系结构、数据结构和算法、网络、操作系统、数据库、编译原理(包括垃圾收集)、图形学、图像处理、音频处理、函数式编程、机器学习等。
所有这些教学都以双语进行,特别是语言规范等都直接看英文原版。