分类:
2008-02-22 18:05:26
今天在CSDN上看到这样一篇文章,正文如下:
“毕业工作后接触和参与了实际的商用软件开发,才切身体会到学生时期学习和实践的所谓的程序,幼稚得几乎不能算真正的程序,距离实用和可复用的程序要求相差很远。”清华大学博士、语音和语言技术中心资源与标准实验室主任邬晓钧如是说道。
就题解题的编程
本科及研究生均就读于清华大学计算机应用专业的邬晓钧坦言,在他学习程序设计的时候,没有接触到那些语言大师关于程序设计的精辟讲解,而书本例题及课后习题多是就题解题,主要是演习一下语法。
参与实际的项目开发后,他也感受了教研组积累下来视为珍宝的若干届学长代码的痛苦累累:“总似鸡肋一般,弃之可惜,但用之艰难。”没有办法直接利用程序中的任何算法,只能花无数时间细读代码,猜测设计者的意图,修改其中的若干处来尝试。如果问题有些许改变,或者处理方案有些改动,则重复这一过程。找全所有几处要修改的代码,并修改正确不是一件容易的事,所以有人宁愿按自己的想法重写程序,所花总时间也差不多,但是感觉上要可靠得多。不过戏剧性的是,半年或更长时间之后,当需要在重写的程序基础上做进一步的工作时,发现自己重写的程序与以前的程序一样如同鸡肋。
实际上这并不是清华这所学校和邬晓钧单个人的现象,几乎从所有校园走入编程领域的开发者们都有着与此类似的经历和相同的感受。同时还担任清华大学计算机系本科生《C++程序设计与训练》课程老师的邬晓钧就说,“现在接触到一些学生和程序员新手编写的程序,感觉像是见到了过去所写所看到的一些代码,离好程序的标准依旧是那么远。” 温伯格《理解专业程序员》一书的第一篇文章中有两段FORTRAN语言的代码,分别是程序设计初学者和专业程序员可能写出的代码,差异不就十分明显嘛。
同时作为《程序员》杂志 “算法擂台”栏目主持人的他,从收到的问题回答中也发现了类似的现象:很多开发者对于解决问题的思路和想法很好,但具体到代码上,有时候会比较乱,逻辑含浑不清,代码实现的时空复杂度不合理。
教育存问题
学生以及初级程序员中就题解题编程现象的普遍存在,教育和教学方法难辞其咎。邬晓钧表示,当前的程序设计教学多以教授语法为主,没有引导学生如何合理优美地使用语言。“如果只交给学生一套英语语法和一本英文词典,学生是写不出漂亮的英文文章的,编写程序也是这样,语言运用本身是有思维和技巧的。”邬晓钧说,同时程序实现中的很多技巧被公认为是标准的实现方法,但学生很少在教学过程中接触到,很少被提醒注意并领悟吸收。而最重要的一点,学生往往没有学习到程序设计的一些原理,没有判断程序实现优劣的正确标准,这会妨碍他们今后不断提高程序设计水平。
邬晓钧说“这不是一个教育制度的问题,而是教育理念和教育水平的问题。”程序设计是一门实践性很强的课程,从某种意义上讲,和体育课、美术课是一样的,只有理论没有实践是不行的,而且理论水平也要在分析对比不同实践的基础上才能积累和提高。认为只要讲解了语法就算教授了该门语言的程序设计,连理论的边恐怕都没沾上。此外,也确实有一些老师自身的程序设计水平有限,自己也只知道一些语法,只会写应付书本习题的代码,难以引导学生认识和追求真正的程序设计。
但存在问题归存在问题,教育和教学体系、方式等的改变非一人之力也绝非朝夕所为之事。面对这样的现状,编程入门者和初学者如何才能避免“非专业”上文所述的现象呢?邬晓钧给出了以下两大建议。
一,多学大师 领会思想
编程入门者和初学者应当花一些时间在网上搜一搜,或者去论坛找一找,当前哪些程序设计的入门书籍被大家推崇,找这些书来仔细读一读,印证自己的认识和想法。要注意领会与语言无关的设计思想,学习这种设计思想在特定语言中的实现方案。比如,邬晓钧在讲解C++语言构造函数时,主要花时间来讲解初始化的必要性并探讨实现自动初始化的可能方案,至于C++语言中构造函数语法究竟如何,其实是最无需讲的,每个学生都很容易在任何一本C++语言的入门书中找到。
“那些好书中的代码,也要仔细地读一读,既巩固所学,又开阔眼界,从中汲取经验。”邬晓钧说。
当然,除了看书还要编程,而且要写一些有规模的程序。有可能的话,让其它人来用一用你的程序。那些有研究或工作任务的,平时还可以注意积累一些自己的程序库,设计应用并经常审视和改进它们,一举两得。
对于“多学大师,领会思想”,邬晓钧感触很深:工作后,随着越来越多语言大师的精品书籍被引入国内,我阅读到一些饱含程序设计思维精要的内容,确实有拨云见日的感觉,开始认识程序设计语言在语法背后的东西,对判断程序优劣逐渐形成一定的标准,在工作过程中也自觉地运用新的认识来指导程序设计。
二,重视基础多实践
许多编程学习者或者新手为图好玩或者时髦一味追逐时髦技术,这本无可厚非,但如果没有厚实的编程基础,这种做法无疑是丢西瓜捡芝麻。邬晓钧认为追逐时髦技术没什么不好,计算机相关行业注定要不断学习新的东西,但建议不要忽视了程序设计相关理论和技术的积累,在此基础上,对于新的技术分析它对于特定问题的解决思路和实现手段,分析它与其它方案相比较的优缺点。把对于不同方案的思考和比较,作为自己的经验积累下来,当碰到实际问题时,自觉地运用它们,寻找最佳的解决方案,用最好的设计和代码实现。在这一过程中,程序设计水平就逐渐提升了。
而且邬晓钧注意到很多学生在初学程序设计的时候,不能足够重视编程实践,容易在看懂了书上例题做了几道习题后,就以为掌握了相关知识。其实对于程序设计入门来说,最重要的是逐步培养算法思维,培养用程序设计语言思考和表达的能力。这些当时看不到的素质必将在以后的教学或实践中暴露出来并产生两极分化:一些人能够得心应手地进行程序设计,另一些人则举步维艰最终放弃程序设计的进一步学习