重剑无锋、大巧不工
第一次软件危机激发了对“面向过程”程序设计思想的重视,第二次软件危机造就了“面向对象”程序设计思想的崛起。实际上,这两种思想,都是旨在解决将现实世界问题转化成计算机世界问题的过程中,人们不断反复、逐步深化的认知表达和冯·诺依曼计算机存储程序、顺序执行的实现过程之间的巨大鸿沟。
这两种程序设计的思想反映了我们的世界观。面向对象的思想能够能更好处理大局,而面向过程则能更好处理细节,两种思维相辅相成,不可或缺。譬如写文章,只有框架,没有内容情节的修饰,文章空洞无物;而只懂得文句秀美,没有文章的清晰脉络,也是让人费解。不可能每个人都是编程高手,但每个人都要学会更好地生活、工作,两种思维于工作、生活不可或缺,我们需要从大处着眼,从小处着手。
有了思想,接下来必须要有表现思想的方法、手段和途径,科学合理地步骤有助于我们去认识问题、分析问题、解决问题。不要幻想有一个好的思想就能做出好事情,做出好事是要讲科学的方法,不管事情大小,都需要用科学的方法结构行为、规范步骤。就如要盖一座精美绝伦的大厦,除构思的巧妙外,还需要平面图、立体图、结构图、电气图等建模图支撑,程序设计也是如此,整体环境和局部细节的建模为我们认识问题、分析问题提供了一个思维递进的平台,此平台可更清楚看到事件的流程,更准确地把握事物之间的联系,更灵活地协调沟通,更及时地调整结构,从而为解决问题提供了一条走向成功可能性的途径。
诚然,与世界观、思想、方法途径相比,一门具体的编程语言并不是最重要的,但我们还是在众多的程序设计语言里选择了C/C++,这两种有强烈关联的计算机程序设计语言从创建之初,在各种权威的程序设计语言统计中几乎都排名前两位。奇妙来源于这两种语言本身共同的特质:指针。这是一种别的语言没有,或者有但很少直接呈现的技术,正是这种技术让我们能够清晰而真实地目睹和享受面向过程和面向对象的思想在逐步展示的过程。
有了思想、方法、仍然找不到感觉,仍然不知道学习计算机语言到底有何用?其原因只有一个,你缺乏对实际生活的经验和认识。解决办法也只有一个,热爱生活,投入工作,交流进取、充分表达、总结得失。不要为了学语言才学语言,语言就是一个工具,语言就是一套语法规则,解决问题、提高认识,增加效率,为人类创造价值才是你的最终目的,而不是为了一张什么样级别的证书。
中国的程序员很聪明,但大师级的架构师很少,缺少的是对准则的坚韧遵守,事物理解、观察的耐心和仔细,对生活平和的心境、乐观向上的改进态度和对工作的精益求精和追求完美的理想。我们需要思想,我们需要哲学,需要坚持,需要不浮躁、不放弃、不抛弃。
二.课程的设计理念
本课程目标是充分体现最基本编程思想,面向过程和面向对象不是噱头,而是课程的核心。课程从头至尾秉承“自顶而下、逐步求精、模块设计、结构编程”面向过程思想和“封装继承、关联合作、精化抽象”的面向对象思想。
为体现思想,本课程设计了认识问题、分析问题、解决问题的“模型模块设计”建模方案,并在所有案例中运用这种途径,以期通过明晰思路和可控步骤达到目的。
另外,课程将C/C++结合讲解,不仅因为这两种语言的应用环境不同决定了学习的必要性,还由于这两种语言的语法共性决定了可融,尤其重要的是,据此可更加清晰地展示不同的程序世界观、方法论,以及它们之间更完美地结合。
综上,反复地剖析思想,并将思想、方法以科学的步骤表达出来是本课程教学的最大主旨,课程学习的目的是编写规范易懂的程序帮助我们认识世界,解构世界,而非手工作坊式的求新求异;不是让你掌握多少精妙的技巧编写优美的程序,而是让你能够编写出程序,能够编写规范的程序,能够解决基本问题,不是求巧,而是求真、求实、求拙。
基于本课程的设计理念,编写教材《C/C++规范设计简明教程》,从开始酝酿、设计、调整至现在的出版已过7年,期间进行了7轮以国内知名教材与本书同步教学实验对比,成效显著,不同学生在不同程度上提升编程能力,证明本书的结构设计是科学且人性的。
三.课程内容安排
基于以上设计理念,本课程确定以“思想方法和途径”为核心、以“函数和指针”为主线,以“规范”为前提,以“解决实际问题”为目标安排教学内容。所有案例均设计建模,通过规范、明晰、可控步骤,切实体现和落实“思想方法和途径”;其中“函数”并不独立成章,而是分散在各章,以期在不同知识背景和应用环境不断揭示函数本质和变换应用,逐步切实有效地认识编程思想和培养编程能力;而“指针”由于其原子类型特性,安排在基础类型之后,不仅可客观从内外两个方面认识变量(对象),还避免传统教材安排在数组之后,无法准确理解数组传递地尴尬;“规范”不仅仅指命名方式、书写格式,更重要是指问题分析与解决的整套流程规范规律;书中大多案例的出现,不是概念的体现,而是基于“实际问题”的需要,比如储蓄问题、城市气温统计、声音处理、单片机信号处理、智能IC卡处理、成绩管理系统等,尤其是成绩管理系统,在不断的应用要求下,反复提升实现内涵。
教学内容总体分两部分:面向过程和面向对象。面向过程包括3个单元:模型模块和基本数据(共4章),结构编程(共2章),构造类型(共4章)。面向对象用1个单元介绍,包括:封装、继承、多态(共3章),前10章的面向过程是面向对象的必不可少的基础。具体章节的主要学习内容及相互联系如下:
(1)解决问题的思路与最基本的程序设计(结构化编程思想,模型模块,函数的封闭性)。
(2)程序调试技术(函数的使用环境,出错调试处理,函数间的联系)。
(3)基本的数据类型(如整型数,从内部看最单纯的数据及其保存,函数的基本使用)。
(4)低级的数据类型(如指针,从外部看最单纯的数据及其保存,函数的基本使用)。
(5)(6)结构化程序设计的三种结构(基本和低级数据类型应用,函数的较熟练使用)。
(7)构造的数据类型:数组(函数的高级使用,传递数组与数组指针)。
(8)构造的数据类型:字符串(函数的高级使用,传递字符串与字符串列表)。
(9)构造的数据类型:结构体(函数的高级使用,传递结构体与结构体数组)。
(10)构造的数据类型:文件(函数的高级使用,函数的本质及可用函数资源)。
(11)(12)(13)类、继承、多态(函数的高级使用,动态对象指针, 动态转型对象指针)。
说明,上述具体教学内容的选择应依据教学计划而定:如主旨是面向过程教学,则教学前10章;如主旨是面向对象教学,则教学13章。特别指出:若教学计划中,面向过程和面向对象单独设课,可将前10章作为面向过程课程学习内容,而将后3章作为面向对象课程的主要研究内容,本书的设计结构、内容呈现将最大程度地保证两种编程思想过渡的连续性,同时富余更多的学习时间,更好地夯实基础、研究*拓展部分、有效开展思维训练及实验。
另外,与理论课程教学书配套的“思维训练和实验训练”是基于本课程教学模式的一个探索,思维训练教学环节是理论教学和上机实验的一个重要过渡,是学生发挥主观能动性主动参与,以及与教师双向交流的一个平台,训练手册中提供大量图形题、同型题、变式题、综合题等。
李 祎2015.1.1
liyi@hfuu.edu.cn