47、软件开发专业技能与教学方法解析

软件开发专业技能与教学方法解析

1. 引言

早期,软件开发研究主要关注专业程序员面临的问题,教学与学习仅占一小部分。1980 年后,学习成为软件心理学的核心话题,这源于众多人首次接触编程和交互式应用,带来了广泛的兴趣和巨大的培训挑战。然而,初期进展并不理想,一方面早期研究缺乏理论支撑,多关注具体特征对学习的影响,结果难以推广;另一方面,研究与软件开发技术和工作设计结合不紧密,常聚焦于衰退的技术和实践,忽视了软件技术所支持的应用问题。

2. 编程的认知分析
2.1 图式知识

在编程领域,计划是一种广泛采用和发展的结构。计划是描述特定情境中典型概念和事件的图式结构,是实现程序或程序段功能所需目标和子目标的抽象表示,最详细的层面包含子目标与实现它们的具体计算结构之间的联系。许多早期研究证实了编程计划的心理有效性,例如专家的程序理解更容易受到偏离计划结构的干扰,专家在代码排序任务中更倾向于使用计划结构进行分组。

近年来的分析对编程计划的概念进行了细化。Rist 提出计划具有非线性结构,其中有一条线是核心或“焦点”。Davies 认为计划知识的学习不是简单的积累和调整,而是一个重组过程,形成围绕焦点元素的层次结构。Brooks 提出专家程序理解涉及假设生成和测试过程,专家会搜索计划“信标”来验证或完善假设。此外,专家还拥有更高层次的图式知识,指导他们规划整体解决方案结构,如设计模式等。

以下是一个 Pascal 程序片段,展示了两个交错的计划结构:

Count := 0;
Total := 0;
READLN(Score);
WHILE Score <> 9999 DO
BEGIN
    Total := Total + Score;
    Count := Count + 1;
    READLN(Score);
END;
2.2 战略知识

编程计划知识的应用需要战略知识,即知道如何以及何时运用编程计划。早期 Rist 认为专家能线性地检索和输出计划,而新手则以问题解决的方式生成代码。但 Green 等人的研究发现,有经验的程序员在代码生成过程中也会出现非线性情况,他们提出了“解析 - 反向解析”模型来解释这种现象。Davies 认为专家比新手更有可能生成并扩展焦点行,代码生成的非线性程度取决于专业知识和任务特征。

Rist 对编程计划使用中的非线性情况进行了综合解释,区分了计划的“基本”对象、动作、结果和信标在不同情况下的认知显著性。此外,专家编程策略还包括采用系统测试策略、切换多种理解策略以及协调问题信息与程序结构等能力。Petre 和 Winder 的研究表明,专家拥有高度精炼的编程结构库,能根据问题灵活应用。

3. 从编程到设计

传统的编程专业技能研究主要关注小程序或模块的生产和理解,“设计”通常指代码级别的规划。然而,软件开发系统和应用的开发远不止代码生成,前期的问题分析和设计阶段更为重要,但这些阶段结构不明确、复杂且难以实证研究。因此,认知科学家和教育工作者迫切需要对设计技能进行特征描述和教学。

3.1 设计中的机会主义

Simon 认为设计是一个结构不良的问题,传统的结构化方法鼓励采用自上而下、层次化的分解方式。早期的实证研究也观察到设计师采用自上而下的分解策略,但专家和新手在广度优先方法的应用上存在差异。然而,后续研究发现,专家的设计行为并非完全遵循结构化方法,而是具有机会主义特征,他们会根据具体情况灵活调整策略。

例如,Visser 观察到专家在设计过程中会频繁中断计划中的分解活动,以处理其他层面的问题,她认为专家的设计问题解决受特定设计活动的认知成本和重要性的指导。Guindon 等人在研究电梯控制问题时也发现,专家会根据突然发现的部分解决方案或新需求在不同层次之间切换。Ball 和 Ormerod 对“机会主义”这一术语提出了质疑,认为许多偏离传统设计的行为仍可视为结构化问题解决过程的一部分,专家会根据认知有效性灵活选择广度优先和深度优先的处理模式。

以下是专家设计问题解决策略的流程图:

graph LR
    A[开始设计] --> B{问题熟悉度}
    B -- 熟悉 --> C[广度优先处理]
    B -- 不熟悉 --> D{子目标重要性}
    D -- 重要 --> E[深度优先处理]
    D -- 不重要 --> C
    C --> F{是否遇到新情况}
    F -- 是 --> D
    F -- 否 --> G[完成设计]
    E --> F
3.2 面向对象设计

面向对象(OO)范例的出现增加了对设计问题解决的兴趣。在面向对象系统的开发中,设计至关重要,包括定义对象抽象、赋予责任和指定协作关系。与传统的过程式设计相比,面向对象设计可以减少设计问题与解决它所需的软件构造之间的认知距离,支持功能需求与软件实现之间更直接的映射。

例如,Rosson 和 Gold 的研究发现,面向对象设计专家更关注问题对象及其软件表示,而过程式设计专家则先列出需求,再讨论通用工具。Pennington 等人的研究进一步表明,面向对象设计专家在问题分析上花费的时间较少,但在定义数据和过程抽象上花费的时间较多,能够产生更完整的解决方案。

此外,面向对象设计的封装特性有助于管理复杂的解决方案结构,提高设计的模块化程度。同时,面向对象设计强调软件重用,专家需要具备定位和应用不熟悉但合适组件的技能。然而,目前对于专家设计重用策略的分析还很缺乏。

4. 领域知识与团队合作

认知科学对编程和设计专业技能的分析主要集中在个体程序员,但实际编程通常涉及不同复杂程度的团队。团队编程活动是分布式认知的一个案例,项目结果是程序员、他们的内部心理活动和共享的外部任务表示的复杂系统的结果。

4.1 应用知识

Curtis 等人的实地研究发现,团队成员拥有的应用专业知识对项目成功至关重要。幸运的团队中会有一个或多个杰出的设计师或项目专家,他们不一定是高绩效的程序员,但能够整合多方面的知识,为项目创造和维护整体愿景,并对团队动态产生影响。

4.2 沟通与协调

尽管拥有优秀的人员,特别是具有深厚应用领域知识的人员对项目成功至关重要,但沟通和协调技能同样关键。项目专家不仅要控制团队方向,还要花费大量精力在团队内外沟通他们的应用知识和设计愿景。在处理波动和冲突的需求时,沟通和协调过程尤为重要。

研究还发现,文档和正式沟通流程在项目规模和复杂性增加时效果不佳,项目成员更依赖非正式的口头沟通和建立合适的沟通网络。边界跨越者的出现对于大型项目至关重要,他们能够将一个团队的关注点和建议转化为另一个团队能够理解的语言。

以下是团队编程沟通效果对比表:
| 沟通方式 | 效果 |
| ---- | ---- |
| 文档和正式沟通 | 随着项目规模和复杂性增加,效果相对较差 |
| 非正式口头沟通 | 更有效,依赖沟通网络 |
| 边界跨越者 | 关键,促进团队间理解 |

5. 软件开发教学

软件开发技能教学是软件开发专业技能理论和分析的重要应用,旨在培养更多高素质的软件开发人员。目前,研究涉及多种教育环境和方法,包括直接针对编程专业技能元素的教学、将学习和技能获取理论融入智能辅导系统以及关注更高层次的设计技能教学。然而,对于实际软件开发工作所需的协作技能教学关注较少,但大学课程正逐渐向这方面发展。

5.1 计划教学

基于计划知识在专家编程中的重要性,一些研究致力于直接进行计划教学。例如,BridgeTalk 环境通过图形化方式向新手介绍 Pascal 计划,让他们通过组合计划元素来构建小程序。MoleHill 的 Goalposter 组件则通过层次化的目标分解树,推断学习者的目标并提供解释和建议。Rist 尝试将编程计划的研究与现代面向对象语言的教学相结合,认为对象和计划是正交的,新手可以先制定具体计划,再应用设计规则添加对象结构。此外,结构化编辑器也可用于教授编程语言结构,但需要注意避免给新手带来困惑。

5.2 智能辅导系统

智能辅导系统是认知科学理论在教学中的具体应用,它通过监控学生的活动,在精细层面上指导问题解决。以 LISP 辅导系统为例,它采用模型跟踪技术,逐步跟踪学生的学习进度,识别错误并提供即时反馈。实证研究表明,模型跟踪方法能够提高学生学习正确编程计划的效率,同时对新手的动机有积极影响。然而,智能辅导系统面临的一个关键问题是如何选择合适的时机提供帮助,一些系统尝试给予学习者更多的控制权,如 MoleHill 辅导系统提供多种帮助和建议供学习者选择。

5.3 通过主动学习进行设计教学

随着软件开发教育重点从编程问题扩展到设计问题,研究人员开始探索通过主动学习来教授软件设计。主动学习强调支持学生的学习活动,让学生承担更多的控制和责任。例如,Minimalist Tutorial and Tools for Smalltalk(MiTI’S)应用简约教学模型,帮助学习者分析一个典型的 Smalltalk 应用程序,通过提供应用浏览器和 View Matcher 工具,引导学习者分析应用程序的设计和运行时结构,并设计和实现增强功能。Scenario Browser 则直接关注面向对象设计,通过一系列应用场景引导学习者发现设计和编程结构。Object Design Exploratorium(ODE)利用示例设计为学习者提供反馈,帮助他们进行面向对象设计。

5.4 课堂学习

传统的编程教学主要关注编程语言的语法特征和实现小算法或数据结构,而现在研究人员开始关注培养学生设计实际规模软件系统的技能。这涉及到课堂教学技术和课程结构两个方面。

在建模设计过程方面,Linn 和 Clancy 认为可以通过提供专家案例研究来教授设计技能,这些案例研究包括问题陈述、专家解决方案的叙述、实际解决方案、学习问题和测试问题,能够帮助学生更全面地理解软件开发过程。然而,专家和新手对教学内容的期望可能存在差异,需要注意确保专家案例的内容符合学习者的需求。Lalonde 则通过大量的现场程序设计演示,包括计划中的错误和错误恢复策略,向学生传达设计过程信息,培养“能做”的学生。

在设计导向的课程方面,ACM/IEEE Computing Curricula ‘91 报告强调设计是学生应接受培训的三个基本过程之一,并提倡早期关注软件工程方法和问题。许多教育工作者开始进行课程改革,一些人将团队项目和社会伦理问题纳入前两年的教学中,另一些人则让学生早期参与大规模应用开发项目。对象导向范式的出现为课程改革提供了支持,它强调软件设计的抽象和重用,丰富的可重用组件库为学生提供了学习和实践的机会。

以下是部分教学方法及其特点总结:
| 教学方法 | 特点 |
| ---- | ---- |
| BridgeTalk | 图标式计划语言,通过组合编程 |
| System structure charts | 程序计划与对象分析的整合 |
| Struedi | 填充模板传达程序结构 |
| Molehill | 目标树指导编程活动 |
| LISP Tutor | 模型跟踪支持即时反馈 |
| MiTI’S | 协调多个视图分析范例应用 |
| Scenario Browser | 从场景逐步细化到设计 |
| ODE | 示例设计提供进度反馈 |
| 专家案例研究 | 考虑设计替代方案和原理 |
| 现场编程演示 | 关注过程,培养“能做”态度 |
| 累积设计和重用项目 | 注重设计产品的维护和长期有用性 |
| 角色扮演设计项目 | 实践社交和沟通技能 |

6. 未来方向

目前,软件开发技能教学已经有了多种基于理论框架的方法,但仍然面临诸多挑战。软件开发专业技能是多方面的,涵盖了复杂的知识结构、策略和技能,如编程计划和策略、灵活的设计问题解决启发式、对应用语义和语用的理解以及协作和沟通能力。因此,教学和学习软件开发技能是一个重大且开放的技术挑战。

尽管面临挑战,但过去十年的研究和开发工作还是很有前景的。认知科学理论在编程和软件设计知识结构与策略分析中的应用,为更有效的教学方法、支持工具和环境的开发奠定了科学基础。当前,有三个问题尤其值得在近期取得进展。

6.1 集成设计教学

在设计实践和设计教学中,自上而下的系统设计与交互式快速原型设计之间的矛盾尚未得到很好的解决。我们既需要易于理解和维护的结构良好的软件系统,也需要支持灵活和创造性的设计问题解决。优秀的设计师能够隐式地将两者结合起来,我们需要对这种战略知识进行特征描述和教学。这可能涉及认知科学对设计知识的研究,以及开发实验性课程和工具来传达和支持混合设计策略。例如,可以将快速原型设计工具与智能设计辅导系统或其他评估功能集成。

以下是集成设计教学可能的流程:

graph LR
    A[开始教学] --> B[教授系统设计理论]
    B --> C[引入快速原型设计方法]
    C --> D{实践项目}
    D -- 进行中 --> E[智能辅导系统评估]
    E --> F{结果反馈}
    F -- 需要改进 --> D
    F -- 达到标准 --> G[完成教学]
6.2 现实学习

学生需要有处理实际规模和复杂度项目的经验,同时也需要学习沟通、团队合作和应用知识管理等技能。许多大学已经有“合作教育”项目,让学生在学习期间到企业工作一个或两个学期。然而,这些项目与学术课程的协调不足,可能无法充分发挥其学习效果。可以通过让学生创建“经验教训”档案来改进合作教育项目,更雄心勃勃的做法是在大学和社区内组织大型软件开发项目,持续多个学期,让学生担任不同角色。

以下是现实学习改进措施的列表:
1. 让学生创建“经验教训”档案,总结在合作教育项目中的收获。
2. 在大学和社区组织大型软件开发项目,涵盖多个学期,让学生参与不同角色。
3. 加强合作教育项目与学术课程的协调,确保学习内容的连贯性。

6.3 终身学习

软件开发中的教学和学习通常被视为短期的技术教育或培训。但现在有迹象表明,一种新的模式正在出现,软件组织开始将自己重新构想为学习社区,教育贯穿始终。目前,人们对将设计原理的创建和共享作为日常工作活动很感兴趣,这就需要支持记录、整合和积累共享知识的工具。

随着软件技术的不断发展,其多样性和复杂性不断增加,应用范围也不断扩大,需要培训和教育的人数也越来越多。在未来十年,我们必须预计这种趋势将持续下去,因此,持续改进软件开发技能的教学和学习方法至关重要。

总结

软件开发专业技能涵盖了编程、设计、团队合作等多个方面,每个方面都有其独特的知识结构和策略。早期的研究为我们理解这些专业技能提供了基础,但随着技术的发展,我们需要不断探索新的教学方法和策略。

在编程方面,图式知识和战略知识是专家编程的关键,计划作为一种重要的图式结构,其应用和发展对编程学习有重要影响。从编程到设计的转变,让我们认识到设计技能的复杂性和重要性,尤其是面向对象设计和设计中的机会主义策略。团队合作中的领域知识和沟通协调技能也是项目成功的关键因素。

在教学方面,目前已经有多种方法和工具,如计划教学、智能辅导系统、主动学习和课堂学习等,但仍需要进一步改进和完善。未来,集成设计教学、现实学习和终身学习将是软件开发教学的重要发展方向,我们需要不断努力,以适应软件技术的快速发展和社会对软件开发人才的需求。

希望本文能够为对软件开发专业技能和教学方法感兴趣的读者提供有价值的参考,帮助他们更好地理解和掌握软件开发的相关知识和技能。

内容概要:本文介绍了一个基于Matlab的综合能源系统优化调度仿真资源,重点实现了含光热电站、有机朗肯循环(ORC)和电含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)转气(P2G)技术的冷、热、电多能互补系统的优化调度模型。该模型充分考虑多种能源形式的协同转换利用,通过Matlab代码构建系统架构、设定约束条件并求解优化目标,旨在提升综合能源系统的运行效率经济性,同时兼顾灵活性供需不确定性下的储能优化配置问题。文中还提到了相关仿真技术支持,如YALMIP工具包的应用,适用于复杂能源系统的建模求解。; 适合人群:具备一定Matlab编程基础和能源系统背景知识的科研人员、研究生及工程技术人员,尤其适合从事综合能源系统、可再生能源利用、电力系统优化等方向的研究者。; 使用场景及目标:①研究含光热、ORC和P2G的多能系统协调调度机制;②开展考虑不确定性的储能优化配置经济调度仿真;③学习Matlab在能源系统优化中的建模求解方法,复现高水平论文(如EI期刊)中的算法案例。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码和案例文件,按照目录顺序逐步学习,重点关注模型构建逻辑、约束设置求解器调用方式,并通过修改参数进行仿真实验,加深对综合能源系统优化调度的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值