“智商平平”学软件
金旭亮
前几天收到了一个在职普通程序员的邮件,在邮件中他说两次报考我们学校计算机专业研究生,但总是惨败而回,第1年总分考了250,砸在易做图和数学上,努力复习了一年,又是砸在数学上,总分才285……。我几乎能真切地体会到他那种沮丧和不甘心——为什么我经过一年的辛苦努力,却还是原地踏步并在同一个地方跌倒两次?同样的疑问我也曾经问过自己无数遍,因为我也是连续考研三次才通过的。
我是一个“智商平平”的人,但还算比较努力,有幸“混入”高校,成了一名讲授软件开发技术的普通教师。任教8年多以来,接触到了相当数量的学生,有了一些教学经验,同时我还阅读了一些有关教育学心理学方面的书籍和文章,一直在思索这样的一个问题:
“智商平平”的人应该如何自学软件技术,而我又应该如何教“智商平平”的人学会软件开发技术?
我觉得“学”与“教”其实是同一个问题的两个不同侧面,都遵循类似的学习与认知规律。
这里首先要对“智商平平”作个界定。
国外比较重视智商测定,并已发展出了比较成熟的智商测试机制,往往能给某人以一个比较准确的智商测试成绩,这些成绩可被用于高校招生、企业录用员工、军队征兵等。但我们中国这一前提就不存在,比如笔者就从未做过智商测试。
尽管无法用数字精确地说明,但我们还是可以凭感觉和观察来得出一些结论——某些人很聪明,某些人则比较笨……,比如在同样一所高中里学习的学生,有的能在全国数学、物理等竞赛中屡屡得奖,不用参加高考就能保送到名校,之后顺理成章地继续攻读研究生,甚至能到国外名校去继续深造,考试对于他们来说实在是小菜一碟,想得个低分都不容易……,而许多普通学生,哪怕每天只睡几个小时,日以继夜地做题,高考也得不了几分。
记得我高考那年有位兄弟就是个典型例子,当我等正在题海中挣扎的时候,这位老兄却捧着本《神雕侠侣》畅游武侠世界,末了人家高考总分还是名列前茅。更有趣的是这位哥们后来学的是经济管理方面专业,毕业后工作没多久突然决定要考研,仅复习半年,就跨专业成为了一名计算机专业研究生……
还有我的一位师兄,在微软研究院“混”,他读博的几年,易做图文就象我等编写几个小程序业似的,拿博士学位如探囊取物,这位兄弟给我印象最深的地方在于他曾经想出国准备GRE,一天背300多个单词。我的神啊,我一天能记100个就不错了,而且第2天还没准会忘了80个!
只要留心一下,会发现我们可以在身边找到许多类似的例子,这些例子说明了一点:人与人之间是存在着差异的,各有所长,也各有所短。我觉得大家公认为聪明的人,其智商应该都属于比较高的,可以合理地假设此人的智商属于人群中最高的10%(即十里选一)那一群体,那么正常情况下,他进入重点大学学习深造应该不成问题,如果是百里选一,那么他进入名校应该问题不大。
除了智商偏低的人(应该也有10%),中间约占80%的应该是“不笨也不聪明”的普通人,而我也属于这个群体,所以我最关注的也就是“普通人”的学习问题。
软件行业从业人员中有两种典型的类型:科研人员与软件工程师。个人感觉,从事科研工作并取得相应成就的人,应该是属于人群中那10%的智商最高的群体,而软件工程师这一工作,则80%的普通人经过训练都可以胜任,但要达到一流的水平,对其智商的要求也是相当高的。
科研领域取得成就的人,还有那些优秀的软件工程师,突出的一点是他们的抽象思维能力较高,而体现抽象思维能力水平最直接的标志,就是数学。我发现计算机科学研究弄到后头,来来易做图摆弄的都是数学;另一方面,对于高水平的软件系统开发,与数学有很密切联系的计算机算法、数据结构、编译原理等比较抽象复杂的计算机科学理论的作用也开始突显。
前段时间,机械工业出版社送给我了一本《深入计算机系统(第2版)》,这本书以程序员的视角从底向上地介绍计算机系统的各个方面,许多人说这是本好书。有趣的是,在新浪微博上我看到有网友说:“这本书太枯燥了,根本看不下去”。我为此也发了一条微博和他一起交流:
觉得技术书枯燥与没兴趣,可能关键在于你实际开发经验不多,所以缺乏理解这些书所需的一些基础。个人体会,当某本书大多数人说好,而自己觉得很枯燥的,日后很有可能会发现原因在于自己第一次阅读时还没有具备看懂它的基础,无法引发共鸣……
这的确是我亲身体会。许多复杂抽象的计算机科学理论,在自己还没有具备相应的基础前,别去碰它,否则,收获的将只有挫折与失望。
举个例子:还没有使用编程语言亲自编程的体验,《编译原理》是学不会的;有的人高中数学其实都没掌握好,却想通过阅读《算法导论》来成长为一名算法高手,似乎也没这可能;同样的,如果没有足够的开发设计经验,却抱本《设计原本》(The Design of Design: Essays from A Computer Scientist)来啃,我只能对着你长长地叹息一声……
大家都急,想迅速成功,想迅速达到自己的目标,都等不了了,我也一样,但世界自有其规律,主观归主观,客观归客观,客观世界不会“听从”人的主观愿望,“人有多大胆,地有多大产”注定是一个神话……
很明显,每个人都应该想办法弄清楚自己的“家底”,然后选择最适合自己的学习方式。
时间倒推30年,那时只有很少数的人可以上大学,这些人绝大多数属于人群中较聪明的那一族,所以,整个大学教育体制其实偏向于“精英教育”,其主要目的是培养精英和栋梁之才。而21世纪以后,大批的普通智商的学生进入校园,从总体上来说,除了少数名校,大学教育应该转向“平民教育”。 而中国教育最大的问题也在这:由于众所周知的原因,很多大学属于“反应迟缓”并“拒绝改变”的“恐龙”,仍然采用“精英”教育的传统方式方法教学,这本质上就是将原来只针对少数优秀学生的教育方式与方法给“人为放大”,具体现象之一就是原先的十几人的小班变成了几十人甚至是上百人的大班。要知道,近十多年以来中国高等教育的重大变化不仅仅体现在学生规模的激增上,还体现在学生平均智商与素质的“普通化”。
用“放大”的精英模式教育大批的“普通人”,正如没有刘翔的身体素质,却按照刘翔的训练方法训练,用脚思索都会发现这是不太对头的。
拿计算机专业来说,近些年来虽然在不断的调整,但目前仍然是“理论”重于“实践”。前面也说过,复杂抽象的计算机理论课,绝不是那么好学与好理解好掌握的,有些课程,真的应该只针对那些比较聪明的学生来讲,而即使是所有学生都要学的同一门必修课程,针对不同层次的学生,也应该有不同的易做图。
好了,就软件这个领域,“智商平平”的普通人应该如何有效地学习?
我觉得,“智商平平”的普通人学软件,在一开始应该避开那些复杂抽象的要求有较高学习能力的计算机科学理论课程,特别是那些要求有实践作基础的课,应从能“即时反馈”并能“立即用于开发实践”的专业课程与开发技术入手。
举个例子,是否学生要学的第一门编程语言必须要是C语言?这个问题就可以讨论。我个人觉得,尽管从C入手是经典途径,已经多年的实践检验,但这并不排斥可以采用其他的方式。比如,能否一开始就直接学Python?诸如Python这类的动态编程语言,具有语法简单、反馈迅速的特点,很有助于学生理解编程语言,培养软件开发的思维方式。我还尝试过一开始就直接让学生学习面向对象的编程语言(比如C#),哪怕他们没学过C,但使用Visual Studio这种高度智能化的开发环境,以可视化的方式设计软件,最终能开发出真正可以在日常使用的软件,对学生还是有着很强的吸引力,不象C,学了一个学期,学生还只是编写几个“黑底白字”的小程序,根本就不知道现在的可视化软件是怎么写出来的,太有挫败感了。特别是C++,我觉得通过它来给刚学完C的学生讲面向对象编程,实在是个杯具,有几个学生真能在短短的一学期课程中搞得掂C++这么复杂的编程语言,而且还要求他们理解面向对象的思想并能用它写出真正可用的软件?我觉得,学完C之后,用Java或C#课程来帮助学生掌握面向对象的编程语言与思想,要比C++好得多。而且学生通过Java或C#掌握面向对象的基本思想与理论之后,再去学C++就好多了。计算机科学与技术有很多个子领域,学习顺序其实是很重要的。
我个人认为,计算机专业的学生应该在大一,最晚不要拖到大二,就掌握一门主流的编程语言和开发工具,Java和C#是两个好的选择,为什么要这么做?道理很简单,你掌握了它们,就可以迅速地投身于软件开发实践,并且有助于掌握后继的计算机专业课程理论。
举个例子,在大一大二就使用Java或C#写过多线程程序的学生,在学习《操作系统》这门课程时将要轻松得多,而能在大学低年级就开始编写游戏的学生,往往会对《数据结构》、《人工智能》、《图形图像处理》等理论课程感兴趣,他就会主动地去学习相关的游戏开发平台与工具,学习C++这种复杂的编程语言就会有强大的动力,因为许多游戏引擎是采用C++编写的……
补充:综合编程 , 其他综合 ,