大学为何从C语言学起,C++为何没讲STL

【来信】
  我是一名普通的大学生,来自(  )大学。很抱歉这么晚打扰您,刚做完几个计算几何学的题目,还没来得及整理,看到您C++课堂系列的博客,想着,酝酿已久的邮件也该写了。
  我有两个疑问,为什么学校不以C++作为入门语言?我现在正在搞ACM,知道C++在很多情况下不如C语言灵活,尤其是stl等工具的使用上,不能随心所欲编写想要的算法。但是,C++作为C语言的超集,面向对象的思想等等都是C语言不可及的。它兼具其他面向对象语言的特性,并向下兼容C语言,在我看来应该拿它作为入门语言。当然,初读C++ Primer这类书的时候很难啃下来,但是如果结合上课讲解的知识,对C++有个大致的了解是没有问题的。像我们学校,仍旧拿C语言作为入门计算机语言,C++课程名字直接就是面向对象,有些不可思议。
  我的第二个疑问是,为什么学校不会介绍一个重要的工具——STL?它的正确性、稳定性和高效性已经被无数次验证,为什么学校不介绍它。我相信STL在真正的软件设计里面应用十分广泛的。

【回信】
  来信收到。你问了一个非常好的问题。不过我的回答也许让你失望,我今年1月去过你们学校调研交流,对你们学校在程序设计教学中的做法还是认可,并且作为一段时间以来要学习的。在我所在的学校,尽管第一门程序设计课称为程序设计基础或C++程序设计,在这个为时两学期的课中,第一个学期基本还是C的内容,讲C++中面向过程的程序设计,第二个学期是面向对象的部分。你们学校的分两门课的教学,中间还要插入一个以实践能力提高为主的短学时课程,其好处是明显的。
  要回答你的问题,必须明确,在大学里第一门程序设计课程中要解决的主要问题是:学会编程序。因此名为XX语言程序设计,重点在于程序设计方法,然而现实的考虑中也不得不将很大的精力投入到语言本身中来。学习第一门语言,首先在于能设计程序,至于用这个语言解决工程中实际问题的方案,倒是要放在其次了。在我的教学中,STL也只是会提及,并不作为要求。
  大学的课程是一个体系,想要实现的某一个目标常体现在多门课程中,并且各门课程之间能够形成承接关系。举一个例子,排序在学科中很重要,数据结构中有专门的内容,在程序设计入门课程中,也要初次尝试。这些尝试要比学会用STL中的sort算法更有意义,更应该放在优先的地位。再如,你正在做的计算几何问题,以及图形学课程中将要学习的算法,不是也有现成的图形包可以直接使用吗?实际上,大学的课程从用的角度有两方面的兼顾,一是能够直接用,二是要通过这种体系,为你将来进一步地理解STL、图形包之类的机制、工具提供支持。而后者,你应该意识到,这是专业人员,无论在思维方式上,还是对适应行业变化,甚至是引领行业变化的资本所在。
  有一句大家相传甚广的话你没有说出来:大学,有用的不教,尽教没有用的。从某种意义上这句话对,但是,在“用”的层次上多加区分之后,你会发现,直接用于工程,以及直接用于学习能力提高与思维方式改变,间接用于形成终身学习能力,适应技术的可能变化,这都是大学之用。在此当中,“直接用于工程”没有太多的突出,也不见怪。学习计算机的另外一些路子,市场用什么就学什么,想转做另外一个方向的工作,必须接受培训,他们所学的全部就是直接用于工程的知识。
  做了如上的解释,我不能回避学校教育中的缺失。我们正处在这个时期,其实真实的世界中,补上这个缺失,又会在新的发展阶段遇到新的不足。其中还有一个缺失是,没有让同学们体会到直接用和间接用之间的关系。我当老师多年,也深知在“读高中是为了考大学”,“上大学是为了找工作”这样的直接思维甚浓的条件下,大学在改变学生的学习方面,不只是只坚持目前该有的做法就算可以的了。C++课中是需要有STL的内容的,但在有限学时,以及不少学生在学习上的投入问题,其中的取舍,作为老师是有纠结的,当学生的,不同的人,根据情况,可以有不同的应对。
  意识到这一点,也就知道了,大学的教学计划只是一个公共的要求,是一个获得毕业证的最低标准,要知道除了老师教的,课外必须要有自己额外加的。这一部分是可以有充分的自主性的。你另加STL就是一个很好的做法。参加ACM竞赛要额外做大量练习,这也是一个超越教学计划的做法。在某个时期,需要,也可在应用能力提高上投入了,自行安排学习即是。如果届时选择用的语言是C++,把STL用熟,那是不可回避的事。上过了大学,就要有准备,也要练出自学能力,需要学的东西,并不一定需要人教。如果不去摆脱总让人教的思维,结果就是当技术发展了,你将不能主动地站到前沿,在等人教的过程中,面临无情的淘汰。
  回到你问的问题上,在工程中用哪种语言,根据需要去定。而实际上,在大学中程序设计入门,选用哪种语言,是可以有多种选择的。比如还有的学校用Java,国外开始有用Python的。这都是多种选择中的一种,各有利弊。作为学生,你的选择是,照你的学校安排的路线去执行。其中的不足,还要有课外的学习作为补足。上课只造就所有同学共性的地方,课外却使你拥有了自己的精彩。不同的同学在课外有了不同的选择,于是分出了水平上的阶梯,以及出现了各具特色的人才。

  用好你当前的教学计划中提供给你的帮助,开创出自己有效的自学,让你的大学更精彩。  


    

==================== 迂者 贺利坚 CSDN博客专栏=================

|==  IT学子成长指导专栏  专栏文章分类目录(不定期更新)    ==|

|== C++ 课堂在线专栏   贺利坚课程教学链接(分课程年级)   ==|

======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======

  
上一篇:07 聚类算法 - 代码案例三 - K-Means算法和Mini Batch K-Means算法效果评估


下一篇:C语言入门基础学习函数?来看我就告诉你!