许憬
计算机学科里的结构化是通过界定、提炼、约简和形式化,从混沌的信息中抽取核心内容,将复杂、模糊的劣构问题,转化成简单、清晰的良构问题,并以适当的计算结构来表述问题解决中各要素之间的逻辑关系,最终达到计算模型的自动化实现。结构化方法源于结构化程序设计语言,但又超越了算法,它提供的不仅是一项具体的学科知识、学科方法,更是一种问题解决的全新思维方式。计算思维下的结构化,体现了计算机算法形式的本质特征,它贯穿于问题解决的全过程,包括数据的结构化、分析的结构化、设计的结构化和编码的结构化。本文结合实践从计算机解决问题的四个方面阐述结构化的实施。
从劣构到良构,实现数据的结构化
数据是构成数字世界的基石,是计算机处理的对象。算法选择的重要依据是数据结构。构造数据使之结构化是问題解决的开始,也是计算机自动化的起点。
1.数据抽象使之结构化,让计算机信息可识别
计算机能进行数值、逻辑和字符等数据的运算,所以对客观事物和问题的描述只有抽象为数据才能计算。如一所学校的师生信息管理系统,师生的信息将被映射成一个个数据,在计算机世界里被结构成符号化、能识别、能计算的数据。客观世界中的对象是综合的,并赋予了诸多属性,我们筛选出其中若干条关键性、有价值、能量化的要素,这个过程称之为结构化,其他无足轻重的信息将在结构化的过程中自动被忽略。数据是客观事物的符号表示,数据的编码过程也是信息的结构化、数字化过程,也只有抽象并赋予信息价值后的数才能称为数据。
2.数据清洗使之结构化,让计算机工作更高效
大型问题的决策和计算机解决依赖于数据仓库,库内的海量数据是面向某一主题的数据集合,但这些数据源自多人、多渠道、多工具的原始采集,其中不乏不规范的、无关的、不完整的、错误的、重复的数据,这不适宜被计算机直接拿来使用。我们可根据问题求解的需要提取数据,并按一定规则把这些“脏数据”洗掉,数据清洗的任务就是过滤无效数据,使进库的数据都符合一定标准和基本规格,便于计算机后续的数据建构和操作。
【案例1】第6届全国高中信息技术优质课评比中,广东彭丽欧老师在《数据选房:腾冲市房源数据的分析和可视化表达》一课中创设了“父亲的换房之路”虚拟情境,用大数据技术为换房提供决策参考。在数据采集环节,师生用网络爬虫设定了决策规则,循环抓取网上参数与字段,形成了最初的2591条原始数据仓库,然后老师用Python程序对库存内空值、异常值、重复值等进行了数据清洗,预处理后形成了二次数据集1997条记录。结构化后的数据库方便计算机更有效率地进行信息检索与整理。
3.数据整理使之结构化,让计算机处理更清晰
抽象后的数据可直接被计算机调用,但它仅仅是分离的元素、数据的孤岛。数据与数据只有经历整理形成一定意义关联和逻辑连接,经此结构化后的数据才能真正发挥其价值。
“数据结构+算法=程序”。好程序,不但需要高效率的算法,更依赖于结构化的数据材料,一定程度上数据结构影响着算法选择。数据结构是计算世界特有的数据存储形式,其模型也极其丰富,有表达点状关系的集合,表达线性关系的数组、栈、队列、链式,有表达层次关系或分支关系的树形、图(网)状等,这些结构化后的数据,便于计算机的自动化处理。数据整理的价值在于实现数据形式的结构化,使呈现更清晰;数据逻辑的结构化,使关系更有条理。在数据关系中行列式结构——表格,依然是最易理解、最有效率的数据存储方式,也最宜用二维数组实现,从二维表里我们很容易挖掘出数据元素之间的关联、数据发展的趋势和背后隐藏的信息。
从模糊到清晰,实现分析的结构化
分解是问题分析的基本方法。不管在什么领域,当人们面对一个大型项目或复杂问题需要求解时,都应优先考虑怎样对问题进行合理分解。问题求解时计算机采用惯用思维方式是按照树形结构自顶向下、逐步求精的方法,层层分解,去除非核心问题,剪枝冗余分杈,列出需要解决的最主要的子问题,如此类推及至每个子问题都控制在人们容易理解和处理的范围内,最后通过逐一解决每个子问题来解决初始的问题(图1)。
逐步求精的结构分解法,源自技术领域的经验。将问题的分析与分解,细化至每个明确可控、可操作、可处理的步骤,这是计算机自动化实现的可计算原则。这种思想不仅适用于技术领域,也适用于人类生活。在人的思维习惯里,大脑总是通过已有经验和模式识别来存储新信息、认知新问题。结构化分解是分析问题最有效的方法,按功能进行结构分解,把一个复杂问题拆解成若干个更简单、更可执行、更为熟悉的小步骤微算法,毕竟解决一个复杂度较小的问题所需的工作量相比一个复杂度较大的问题总是要少得多,也容易得多。结构化的分解分析,可帮助我们快速寻找到解决问题的焦点、难点、关键点、着力点。长期进行结构化的分解训练,恰似庖丁解牛,可帮助我们养成聚焦问题核心的能力。
【案例2】第6届全国高中信息技术优质课评比中,江苏金婧老师在教学完成“快速制作大量邀请函”的项目时,通过分析先把这项大工程解构成三个子问题。问题一:邀请函模板如何制作?问题二:人员信息表如何建立?问题三:信息表中的姓名如何依次并入邀请函模板中?经过师生讨论,大家发现前两个问题的解决只需原有的Word、Excel技术经验便可达成,问题三跨域的合并才是工程解决的钥匙所在,也是课时的技术难点。随后师生共同探究新技术,再细化问题三,梳理出信息“合并”的算法:(1)选择“收信人”数据库;(2)在邀请函指定位置“插入合并域”项目;(3)“邮件合并”实现姓名、邀请函的合并输出。本课时解决问题中就采用了结构化的分解方法,将复杂问题层层解构,最终直抵问题的关键。
从解构到重构,实现设计的结构化
模块化设计是将一个大程序按照功能结构划分为若干小程序模块,每个模块承担完成一个确定的功能,我们在这些功能模块之间建立必要的联系,然后通过模块的互动协作完成整体系统功能。好的模块图不仅能勾勒出算法的大致结构,更能反映出主要模块之间的逻辑关系。模块化设计从问题的宏观总目标开始,抽象底层的微观细节,专心构造高层的结构,使设计者能高屋建瓴把握主题,避免一开始便陷入繁复的细节中。
整个模块化设计包含解构与重构两个过程。解构是从系统到模块的分割。根据模块化思维,系统设计时可将整个工程分解成几个模块,每组只负责其中一个模块。我们需要保持每个模块的独立性,一个理想的模块应当只做单一任务,只赋予单一功能。重构是从模块到系统的集成。采用搭积木的方法把完成的若干独立功能模块进行重组,组合过程遵循系统论原则,重点进行模块之间的整体关联、接口耦合。模块化不意味着无限分解,随着模块数量的增长,模块之间耦合的复杂度和设计所需的工作量也会随之增加。解构和重构是模块化设计中的两个串行进程。
模块化设计与结构化分解都是我们用计算机视野看问题的一种方式,但两者分的程度不同。在任务树里,分解会细分到叶,而模块只需分割到结点。分解适用于问题分析阶段,思维方向是从顶向下;模块化适用于问题解决阶段,其思考方向既有纵向,也有横向的功能模块联系。
从自然到规范,实现编码的结构化
一个问题求解算法的逐步求精,就是对用自然语言等描述的算法逐步细致化、精确化和形式化的过程,算法的描述经历了从非形式的自然语言到形式化程序语言的发展,编码形式也实现了从非结构化到结构化的历程。随着计算机计算能力的增强,现在衡量程序质量的标准,已从过去的效率第一转为清晰第一。构造以自动化为目标的结构化,体现了计算机形式的最本质特征。
从自然语言的算法描述到结构化的代码实现,背后支撑的是两种不同语言系统,而两种语言之间缺乏通道,学生还存在着经验断裂带。高中算法课上教师往往采取直接代码复制的方法来实施讲解,回避了结构化、形式化过程中理解与编码难点,这种简化方式对算法习惯的形成和计算思维的培育是非常不利的。打通口头描述和代码實现之间的最后一公里,可采用“三步走”方式来推进。
第一步,自然语言的算法描述。算法的形成会经历一个从模糊到清晰的渐变过程,“说”可以加速这个进程。算法教学要重视“自然说”的过程,让学生将解决问题的方法通过人们日常使用的语言进行表述,只有让学生亲身经历过自述、讨论、互述等环节,并能通过数学语言、口头语言等自然语言对解题步骤进行详尽描述,头脑中的算法框架已经形成并逐步完善、清晰、具体化时,那么编码也就水到渠成了。
第二步,结构化的语言描述。用自然语言描述算法通俗易懂。但自然语言的歧义性、冗长、非结构化等特征在一定程度上阻碍了计算思维的准确表达。我们倡导算法的结构化描述,虽仍以自然语言为语言载体,但它以结构性词汇作为算法描述和逻辑转化的关联词(先……后……、如果……就……、重复执行……),并把问题的解决步骤化归在顺序、选择和循环三种基本结构框架内。
自然语言的结构化描述能清晰地反映算法的基本结构,又不与某种特定的编程语言发生联系,它不拘束于苛刻的语法规则,易于编写与理解,利于构造与转换。结构化描述可以帮助孩子在正式编码之前准确表达程序的逻辑,经自然语言结构化描述的算法也比较容易转化为任何一种高级语言程序。
【案例3】浙摄版小学六年级“Scratch创编游戏”
师:刚才玩了走迷宫游戏,没有限制的游戏是无趣的,为了让游戏更具挑战性,我们可以给机器猫添加哪些游戏的规则呢?
生1:走进草地便返回至起点;生2:遇见滑梯便快速滑到终点;生3:走到沼泽地,原地停留3秒钟,并发出“喵”的一声。
情境分析与游戏创新设计,学生用自然语言来描述抽象出来的规则。
师:返回原点的情况一定会发生吗?可用什么关联句式来表述呢?(“如果……就……”)生:(机器猫)如果走进草坪,就会返回起点。
师:机器猫怎样自动识别是否走进草坪?又怎么才能听话乖乖地返回起点?生:走进草坪,可以看是否碰到绿色的区域。
师:(提示)机器猫具备自动侦测的功能,它能对碰到的颜色、角色进行(Y/N)判断。生:返回原点就是移动至最初起点。
师:请用学科特有的表达格式再来描述一下?(提示)原点坐标:(-200,150)。生:如果侦测到了绿色,(机器猫)就移动至(-200,150)位置。
用“如果……就……”关联句式对游戏规则进行算法改造和描述,以实现结构化;教师通过增设的结构化描述环节,搭建了从自然语言到程序语言之间的算法桥梁,如果算法描述的结构化顺利完成,则程序脚本的实现也水到渠成。
第三步,程序代码的结构化实现。所谓编码的结构化就是算法最终的代码必须遵循计算机语言规范,严格用顺序、选择和循环三种基本程序结构的组合构建结构化的算法。结构化的编码有利于代码实现、代码维护,有利于程序阅读、程序监测。也只有被结构化了的编码,才能被计算机有效地模式识别,被计算机高效地执行,并最终实现自动化。
不仅是程序算法,我们的教案设计也可以尝试着使用顺序、分支、循环三种结构组合的流程图方式来描述解决问题的关键步骤。
结构化方法的本质就是逻辑。它将零散的思维、知识、信息、数据等,用一种特定的逻辑框架实现聚合。它让繁复的问题简约化,并获得一种分析的方法、量化的工具。结构化方法使我们透过现象看本质,长期进行结构化思维训练,可以提高我们系统分析问题、高效解决问题以及统筹规划工作的能力,它使我们的思维及表达更加缜密、有条理。结构化作为计算思维、工程思维、系统思维的一种方法,体现在问题解决的全过程,其价值也不局限于计算机科学,运用其思想可以指导我们更高效地实现系统设计和理解人类行为。
参考文献
王荣良. 中小学计算思维教育实践[M]. 上海:上海科技教育出版社,2019.
冯超,白珍,李欣. 结构化方法在信息技术教学中的应用实践[J]. 中小学信息技术教育,2019(9).