// 上一篇:工具和结构化
// 下一篇:野生程序员


教育心理学里面有提到“最近发展区”这个概念,这个概念是前苏联发展心理学家维果茨基(Vygotsky)提出的,英文名词是Zone of proximal development,摘录维基百科上的介绍如下:

The zone of proximal development, often abbreviated as ZPD, is the difference between what a learner can do without help and what he or she can do with help.

该理论认为学生的发展有两种水平:一种是学生的现有水平,指独立活动时所能达到的解决问题的水平;另一种是学生可能的发展水平,也就是通过教学所获得的潜力。两者之间的差异就是最近发展区。教学应着眼于学生的最近发展区,为学生提供带有难度的内容,调动学生的积极性,发挥其潜能,超越其最近发展区而达到下一发展阶段的水平,然后在此基础上进行下一个发展区的发展。

为什么要提到最近发展区呢?这就要说到在班级博客教学中的一个重要的方面:点评。点评一般由教师/助教 构成,足够的点评覆盖率,持续跟进及时反馈对学生来说是重要的,反馈让学生处于一种diff状态,diff状态带来学习中的“发展区”:已有知识、做法和新知识、做法之间的边界,此时学生会review这个边界。

既然点评是重要的,教师/助教应该做到持续跟进及时反馈,但怎样做到这两点在实际中会遇到一些具体的问题。例如,软件工程的结对编程项目的一次作业周期是一周,如果大家都在截止日期最后1天才去点评,也许等发现问题的时候已经没有足够的时间及时发现题目设计上的问题,学生实践中的困难等。而且堆积到最后一天点评,也会有量大的问题。因此,我认为从环节发布开始,就可以每天固定一些时刻去做增量点评,并且在前1/2天及时发现环节设计上需要做设计变更的地方,教师/助教需要有意识的实施这个过程。

发现具体问题,就可以和相关的知识、方法联系上来。让学生在反馈中再次强化对知识、方法具体落地的认识。例如,助教发现git提交代码的编码规范、文件组织等工程问题:

“强烈建议大家在自己的代码中写明readme,介绍一下自己的这个工程中哪些是有用的代码,哪些是自己用来测试的代码,哪些文件夹都干什么的,大家也要将自己的文件命名为有意义的文件名,否则大家提交了很多代码,而我需要找来找去,也并不知道我想找的文件在哪里。不知道你们过了两周时间再看自己的代码,是否也会和我有同样的感受[微笑]。”

此时就可以顺手引入“编码规范/风格”的问题,事实上,无论是软件工程的学生,还是有经验的工程师,都会经常陷入:先写出一堆随意的代码,命名了一堆随意文件夹名字之后,再去review编码规范,此时才跟根据编码规范做整理(refactor),经过多次磨合后,一个团队的成员对这点都形成习惯后,才内化成一种肌肉记忆,上来就相对规范。

发现具体问题,可以通过设计/建立新的环节来落地。根据我个人目前的点评经验,及时的博客点评可以大概收获30%左右回复率,对有回复的博客给予恰当的改进意见,有较大比率会有改进行动。之所以说是要有恰当的改进意见/环节设计,是因为学生在很多地方存在对需求的理解误区,因此需要把误解/模糊的地方通过改进意见/环节设计 去具体化。

例如,在一次结对编程单元测试这个环节,虽然题目经过设计,助教也做了单元测试模版,但是在沟通中还是出现了漏洞,大家在四则运算计算模块的单元测试应该针对:add/sub/multi/div, 还是针对:calc(string exp)这点上出现理解不一致,在点评中只有少部分学生改进了实现,实现并针对calc做了单元测试。

在这个例子中,单元测试处于课程的第四次:

  • 四则运算初步(个人)
  • 四则运算模块化(结对)
  • 词典案例分析(个人)
  • 四则运算单元测试(结对)

经过分析,其实当时主要是模块化的那次没有直接要求做成支持混合四则运算的,担心学生没有解析混合四则运算的算法基础,到了单元测试的时候,学生就默认以上一次为基础做单元测试,教师/助教在设计单元测试模版的时候也忽视了这个潜在的风险点。

这个问题在之前其他学校采用四则运算这个题目的时候也出现过,我觉的可以在第2次的时候就要求实现calc(string exp)的接口,算法的话,如果学生基础缺失,可以直接在题目里提示会用到的算法,理由是软件工程的课程不是算法课程,在实际开发中,如果一个方面的算法问题有现成的方案,也会至少大家是直接去看相关算法来写做为第一个版本。并且在四则运算这个个人项目环节不是要求大家能自己发明基础的算法,而是能在知道大概用哪些算法的基础上开发版本后,能在后续需求变更中持续满足新的需求,此时实际上才会有创造解决新问题的“算法”部分的事情。

软件工程课程的学生会发现,软件工程课程不会有专门的时间教编程语言/数据结构/算法/数据库这些前置或者后置课程。但是实际开发中,这些又是程序的重要构成部分,我们说软件=程序+软件工程,程序的部分又分核心模块/应用模块。实际开发中,核心模块使用的算法一般也都是从已有的开始做第一个版本来迭代,因此,我们可以遵循两个原则:

  1. 保持核心模块的接口要求,不做降级要求。
  2. 提供实现核心模块所需要知道的上下文,关键词,例如可能会用到的数据结构/算法。

对四则运算的算法模块,可以增加:

在软件开发中经常需要创造和寻找越来越好用的轮子,而在教学环节中需要常常造梯子,搭建好足够支撑学生在自己水平上往前几步练习知识和技能的脚手架,然后在过程中逐渐减少脚手架的支撑,最后达成独立完成的能力。

Instructional scaffolding is a learning process designed to promote a deeper level of learning. Scaffolding is the support given during the learning process which is tailored to the needs of the student with the intention of helping the student achieve his/her learning goals.

梯子/脚手架理论(scaffolding)是由认知心理学家Jerome Bruner受最近发展区的概念启发提出的,当学习一个新概念的时候,脚手架需要考虑设计合适的任务/模版/指南/建议/训练。有时候,我们会在某个环节里欠考虑一些因素,导致提供的任务/模版/指南/建议/训练一定带有某种“壁垒”,如果我们观察/记录/分析,找出这些壁垒,在迭代中改进设计,可以有效消除这些壁垒。

软工+C(6): 最近发展区/脚手架的更多相关文章

  1. 软工读书笔记 week 9 ——《构建之法》

    软工读书笔记  week 9                 ——<构建之法> 最近的三周我们正式开始我们的项目.然后我也把<构建之法>中的相关章节再拿出来读了一番.以下是一些 ...

  2. 软工实践——github文件整理

    软工实践中,整理github上文件遇到的一些问题 先扔github链接Transcend/ActivityHelper 1.原来呢我们团队的github上的文件的安排十分凌乱,没有归档.把说明文档.源 ...

  3. 关于软工项目beta版本

    项目总结 项目成员: 黄丰润 031302307 王旭銮 031302320 张家俊 031302329 张晓燕 031302343 项目完成度:实现了专业信息填写.查看,教师信息填写,报课和查看课表 ...

  4. 2017春季 JMU 1414软工助教 链接汇总

    助教自我介绍 学生博客链接和coding链接 [1414软工助教]团队博客汇总 助教总结 评分 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 团队作业1: ...

  5. 【2017集美大学1412软工实践_助教博客】团队作业10——项目复审与事后分析(Beta版本)

    写在前面的话 转眼轰轰烈烈本学期的软工实践就结束了,这个过程中想必在熬夜敲代码,激烈讨论中留下诸多回忆的同时,也收获了不少.恭喜所有团队完成了本阶段冲刺,此外,由于大家的贡献分给的都很平均,将个人贡献 ...

  6. [2017BUAA软工助教]第0次个人作业

    学习别人的经验和体会 零.前言 我认为人生就是一次次地从<存在>到<光明>. 一.软件工程师的成长 0.这是一个博客索引 同学们在上这门课的时候基本都是大三,觉得在大学里,到教 ...

  7. 福州大学软工 1715 | K 班 - 启航

    福州大学软工 1715 | K 班 - 启航 愉快的暑假已经接近尾声了,我猜很多同学的暑假都过得轻松,毕竟是夏天(空调/WiFi/西瓜).不过呢,暑假期间的老师.助教们可没有闲着,都在为接下来的软工实 ...

  8. [2017BUAA软工助教]博客格式的详细说明

    一.为什么要强调博客格式 可以对比粗读一下这几篇博客然后自己感受一下博客格式对博客阅读体验的影响: MarkDown流:    [schaepher]2017春季 JMU 1414软工助教 链接汇总 ...

  9. [2017BUAA软工助教]收集个人信息

    如题 我们要收集三个东西 1.学号 2.Github地址 ① 3.博客园博客地址 ② 请各位同学自行创建,并按照如下的格式评论在这篇博客下 "14061195+https://github. ...

随机推荐

  1. [转]Chrome 错误代码:ERR_UNSAFE_PORT

    本文转自:https://blog.csdn.net/testcs_dn/article/details/39186225 最近在用Nginx发布多个站点测试,使用了87.88端口, 88端口访问正常 ...

  2. Docker安装nginx

    直切正题: 一.安装nginx docker pull nginx 二.启动nginx容器 docker run --name mynginx -d -p : nginx 命令说明: -p 80:80 ...

  3. Java开发笔记(三十二)字符型与整型相互转化

    前面提到字符类型是一种新的变量类型,然而编码实践的过程中却发现,某个具体的字符值居然可以赋值给整型变量!就像下面的例子代码那样,把字符值赋给整型变量,编译器不但没报错,而且还能正常运行! // 字符允 ...

  4. nginx系列2:搭建nginx环境

    我们选择编译安装nginx. 1,下载nginx 进入nginx的官网下载页面:http://nginx.org/en/download.html 找到稳定版本Stable version的下载入口开 ...

  5. C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就是对某个对象的状态进行保 ...

  6. Windows中通过命令行新建文件夹、新建文件,和一些常用命令

    新建文件 和Linux不太一样,Linux中的touch和vi命令创建新文件的方法都不能用了,在windows命令行下得用type nul>文件名.后缀名来创建: F:\study\vue\wo ...

  7. 2-SAT速成

    本文只做总结性说明 2-SAT 2-SAT是k-SAT问题的一种,k-SAT问题在\(k>=3\)时已经被证明是NP完全问题 2-SAT问题定义比较简单 有n个布尔变量\(x_1-x_n\).给 ...

  8. 快速傅里叶变换(FFT)详解

    本文只讨论FFT在信息学奥赛中的应用 文中内容均为个人理解,如有错误请指出,不胜感激 前言 先解释几个比较容易混淆的缩写吧 DFT:离散傅里叶变换—>$O(n^2)$计算多项式乘法 FFT:快速 ...

  9. Dynamics 365的审核日志分区删除超时报错怎么办?

    摘要: 本人微信公众号:微软动态CRM专家罗勇 ,回复296或者20190112可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me ...

  10. Class.isAssignableFrom与instanceof的区别

    isAssignableFrom 假设有两个类Class1和Class2.Class1.isAssignableFrom(Class2)表示: 类Class1和Class2是否相同. Class1是否 ...