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


教育心理学里面有提到“最近发展区”这个概念,这个概念是前苏联发展心理学家维果茨基(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(2017第6期) 最近发展区/脚手架的更多相关文章

  1. 软工+C(2017第5期) 工具和结构化

    // 上一篇:Alpha/Beta换人 // 下一篇:最近发展区/脚手架 工具/轮子 软件工程/计算机相关专业的一个特点是会使用到众多的工具,工具的使用是从程序猿进化到程序员的一个关键要素.软件工程师 ...

  2. 软工+C(2017第7期) 野生程序员

    // 上一篇:最近发展区/脚手架 // 下一篇:提问和回复 怎样做足够好的软件?我们就差一个程序员! 没有什么软件工程的理论的时候,程序员们凭借自己对编程的热爱,凭借着:"这是一个可以自动化 ...

  3. 软工+C(2017第1期) 题目设计、点评和评分

    // 下一篇:分数和checklist 如何设计题目 教学中的一个问题是老师出题太简单了,题目设计一开始上来就不紧凑,我认为一个好的课程应该上来就给你紧凑感,而不是先上来"轻松2-3周&qu ...

  4. 软工+C(2017第2期) 分数和checklist

    // 上一篇:题目设计.点评和评分 // 下一篇:超链接 教学里,建立清晰明确的评分规则并且一开始就公布,对于教师.助教.学生都是重要的. 公布时机 在课程开始的时候,就需要确定并公布评分机制,随着课 ...

  5. 软工+C(2017第3期) 超链接

    // 上一篇:分数和checklist // 下一篇:Alpha/Beta换人 注:平常看文章,总有能和构建之法,软件工程相关的链接,增量记录,也可以通过在其他人博客的交流中使用相关的超链接,在使用中 ...

  6. 软工+C(2017第4期) Alpha/Beta换人

    // 上一篇:超链接 // 下一篇:工具和结构化 注:在一次软件工程讨论课程进度设计的过程中,出现了这个关于 Alpha/Beta换人机制的讨论,这个机制在不同学校有不同的实施,本篇积累各方观点,持续 ...

  7. 软工+C(2017第8期) 提问与回复

    // 上一篇:野生程序员 // 下一篇:助教指南 在线上博客教学里引入了第三方助教,助教在每次作业期间尽力完成"消灭零点评"的目标.然而紧接而来的问题是:学生对博客作业点评的回复率 ...

  8. 软工+C(2017第9期) 助教指南

    //上一篇:提问与回复 [备注]:请优先阅读 Handshake/点评/评分 三部分. 0x00 Handshake 了解<构建之法>作者参与软件工程改革的一些背景: http://www ...

  9. [2017BUAA软工助教]第0次作业小结

    BUAA软工第0次作业小结 零.题目 作业链接: This is a hyperlink 一.评分规则 本次作业满分10分: 按时提交有分 一周内补交得0分 超过一周不交或抄袭倒扣全部分数 评分规则如 ...

随机推荐

  1. Java restful web service 开发入门

    可用的框架有不少,我用的是jersey. 直接上代码,其实,如果你会web service 这个restful的就很好理解了,自己跑一遍就OK了 用到的类 User.java package demo ...

  2. js实时获取input数据

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. sublime text3 配置使用

    前言 sublime text3 是一款优秀的代码编辑器,很多好用的功能让我成为其忠实用户. 流程 1.安装完成后首先配置package control,把下面的代码复制到sublime 的控制台: ...

  4. Java 特殊字符的String.split的分割(. \ * | \\)

    特殊字符 分割的时候使用: 关于点的问题是用 : String.split("[.]");   String..split("\\.") ; 关于竖线的问题用 ...

  5. noip普及组2007 Hanoi双塔问题

    Hanoi双塔问题 描述 给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的.现要将这些圆盘移到C柱上,在移动 ...

  6. Python 可迭代的对象、迭代器和生成器

    迭代是数据处理的基石.扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,即按需一次获取一个数据项.这就是迭代器模式(Iterator pattern). p.p1 { margin: 0 ...

  7. 【Ubuntu 16】安装net-snmp

    使用tar.gz压缩包安装mongodb时报错,没有库文件 libnetsnmpmibs.so.3o cannot open file or directory 在网上找了一篇文章 需要安装net-s ...

  8. IT类非开发面试总结--1

    面试总结.. ================================= 第一部分.. -------------2. 电脑开机时风扇转, 但是屏幕没有任何显示, 此现象可能是哪些方面所导致? ...

  9. Django配置mysql

    我的环境为windows10+pyhton3.6+Django1.11.4 由于mysqldb不支持python3,所以django连接MySQL就不能再使用mysqldb了.故而选择了mysqlcl ...

  10. Spring Web MVC(三)之注解

    [toc] spring web mvc 基于注解的优化 我写的注解是按照spring web的部件分类写的,这样的话比较方便查看,大家感觉有用的话可以分享个别人,希望对对更多的人有帮助.毕竟零基础开 ...