常言道,“好的开始是成功的一半。”无论是之前有丰富经验的小黑客,还是对电脑一无所知希望探索未知领域的小学霸、正式开始AP计算机的学习都是可能长达一生,充满激动与挑战的职业道路的一个重要里程碑。勉强作为一名前辈,在此容我道一声“恭喜!”
前些年,我有幸和来自北京各知名高中和国际部的几位优秀学员合作。在留学规划项目的过程之中,我了解到他们在学习计算机科学时面临的诸多困难,也尽量利用自己的专业背景给了一些力所能及的帮助。AP Computer Science本身的难度其实并不太高,仅相当于美国普通大学计算机科学的前半学期内容(加强版的AP Computer Science AB因为大多数美国本土中学都无法找到合适的师资,早已停办),但是国内非常缺乏相关的师资和学习资源。即便对于有条件聘请外教开设课程的国际部,外教本人的经验往往也比较有限,通常是教龄不超过三年的新毕业生。具体而言,我之前学员们遇到的困难大致有如下三条:
第一,学生基础参差不齐,而老师则基于课本或讲义照本宣科。因为我国国情所限,本身在中小学阶段没有在国家层面设立计算机或编程相关的教学大纲。对于一部分具有得天独厚条件或者自己有兴趣钻研的孩子,标准的AP计算机课程可能稍显容易。孩子们往往在上课时会有些心不在焉,感觉和自己之前零散学的C或者C++区别不大,结果忽视了一些可能是非常重要的内容或方法论。另外一方面,对于第一次“触电”的学生,全英文的统一教学往往又会让他们望而生畏。与同学之间的暗暗比较往往更加剧了这种挫折感,让他们得出了“写代码不适合自己”这种错误看法。
第二,课程缺乏必要配套实践活动支持,上机实验和/或项目流于形式。我们都知道光说不练是假把式,对于计算机这种实践学科尤其是如此。目前即便对于国内已经正式开设AP计算机的项目,往往也缺乏必要的条件按照美国大学理事会(College Board)的要求开设至少20小时的配套实验。更多的时候,老师会布置一些作业或者项目,让学生自行在家上机完成。但这样一来,孩子们在实际编程中遇到的困难往往很难在第一时间解决,一些错误的编程习惯也无法及时被纠正。于此同时,面对巨大的课业压力,部分孩子有时会选择从网上或者同学处不求甚解的拿来一些代码,觉得把“正确”的结果弄出来就算大功告成。但这样一来,对课本知识的理解以及分析解决问题能力的提升就极为有限了。
第三,教学与大学基础课程不能很好衔接,也与实际软件开发脱节。限于教材和课纲,以及教师本人的经验,我们得承认AP计算机并不是一门能够学以致用的课程。即便是对于那些非常认真的学习了一整年,并在最后的考试中取得5分的好成绩的孩子,也往往无法独立开发出一个实用的程序或者应用以解决身边的问题。他们对更本质的计算机理论基础会缺乏直观认识,也不明白在现实世界里一个软件是如何开发出来的。欠下的这一课,往往需要等到大学第一年甚至更往后才能有机会补上。
现实的说,对于家境优渥但没有自己产业,孩子逻辑思维强也有兴趣入行的话,留美学习相关专业并在之后以程序员身份加盟世界一流的软件公司是中短期回报最高的选择之一。我自己因为当年做学生时相关的创业经历,也有很深刻的体会,认可这无论是在物质上还是精神上都是回报率极高的职业选择。虽然当时因为签证相关的细节原因最终没能把这个事业继续下去,在今天我也非常自豪能够把之前积累的一些经验和技能分享给我们AADPS的学员们。具体而言,我们的服务针对性解决了上面说到的三个困难:
在课程规划方面,我们采用因材施教的一对一服务。在每周两小时左右(北京地区可面授,外地和国外学生通过微信语音视频的形式)的指导中,我会根据学生的水平动态调整内容,确保学生能够感觉稍有挑战,但也不会因为难度过大而失去兴趣。作为对之后考试和美国大学阶段学习的准备,教材和授课内容全部采用英文原版。对于之前没有基础的学员,我在美国大学理事会官方推荐的教材中比较选择了Blue Pelican Java这一本。对于已经有编程经验的学员,则采用我自主编撰的英文讲义,在涵盖课纲内容的前提下根据学员的兴趣有所扩展,并联系其他编程语言和重要的计算机科学概念。当然,对于正式在学校里选修AP计算机的学员,项目亦可以转用学校采用的课本。
在实验方面,我们严格按照课纲要求,指导实施Elevens(单人纸牌)、Magpie(聊天机器人)和Picture(图像处理)三个标准实验。相对于获得结果,我更注重于鼓励学员识别编程过程中遇到的挑战,并鼓励他们利用各种资源积极的解决这些困难。我要求并且帮助学员明白自己写的每一行代码背后的含义。无论如何,最终希望达到的效果是希望学员不会把编程当成是一种“只可远观不可亵玩”的抽象概念,而是要将其内化为一种很生活化的技能。当然,对于学有余力的学员,我还自主设计了Maze(迷宫行走)、Calc(计算器)和Tone(音乐合成)三个高级实验,既帮助巩固面向对象程序设计(object-oriented design)、控制流语句(control flow statement)、字符串(string)以及数组(array)等基本内容,也涉猎图形用户界面(graphical user interface)、异常处理(exception handling)、线程(thread)和算法实现(algorithm implementation)等实用的超纲内容。
在实践方面,我们项目指导内容中涵盖程序调试(debugging)、测试(testing)、版本控制(version control)、Github/开源软件使用及开发等现代软件工程师必备技能。我们的服务也与AADPS在美本高端留学申请方面的丰富经验紧密结合,让学到的知识能最大化的转化为之后申请美国大学的优势,甚至是实用的职业技能。