回望来时的路:构建之法 东北师大站 2016春季学期
1. 前因
微软邹欣老师著有《构建之法:现代软件工程》[https://book.douban.com/subject/26577755/]。第一版首版以前,我还不知道邹老师是哪一位,就在网上曾经看到过有人转引他的观点,感到说得太有道理了,一拍大腿的感觉。比如他提到教师和学生之间应该是健身教练和学员间的关系,不是教师带领学生参观浏览,也不是狱警和囚徒的关系。比如他批评没有代码量的软件工程教学。《构建之法》到手,第一遍粗读我花了一周的时间,酣畅淋漓。很多处让你再拍大腿,"对啊,这正是问题的症结,他的招儿没准好使呐。"在那以后向我的好几位学生极力推荐阅读。似乎亮哥看了,别的同学也没有怎么重视,虽然我极少推荐读哪本书,怕推荐多就不值钱了。
邹欣老师本人是微软首席研发经理,北大、清华、北航等采用过《构建之法》作为教材。一方面权威,另一方面也令我等小校望而胆怯。有次在叶卡编辑的群中得知,他有意图促进《构建之法》和"learning by doing"的软件工程教学理念在不那么特别好的学校里推广,顿时心向往之。我想起不少小说里描写到的文革时期随便那么几个主人公小青年,就能懂副歌,能关起门来讨论伏尔泰和卢梭。时代之进步,让我们有机会偏居一隅而能与世界对话,应该充分享受比那时更幸运的条件。但是那个学期我排课程失败了。邹欣老师后来招募远程助教参与别的学校的教学,我也非常也申请,但是估计自己的时间和精力不足以做出工作量的承诺,只好放弃,非常可惜了很久。
本学期有机会开设课程《软件项目管理》,赶紧求同学们选我选我选我,达到限额,终于开课。
2. 课程的一些数据
2016年3月4日13:30:00计算机楼320教室,夏一鸣同学[http://www.cnblogs.com/xiaym896/]在他最后一篇技术博客里清楚地回忆起时间地点。事实上,他回忆错了,第一堂课因为排课冲突,临时改到了二楼的微格教室,以后的课程都是在320教室,不过时间没有错。
3月4日起,课程教学持续12周。
选课时间注册XX位同学。这个数量并不重要,仅为超过开课人数限制。这里有些同学根本不打算要成绩和学分,只是助我开课。感谢。
实际参加21位同学,坚持到结束17人。放弃的同学,有的是在第一次课程以后就发邮件通知我了,只要成绩,不想参加项目实践;也有同学尝试了开设博客这一步,然后放弃;也有同学比这还努力稍多一些,发了一两篇博客。鸡汤名言说: 所以的失败都有一个共同点,就是坚持的不够久。也许我们所能直接看到的利益太少,也许我们能够做出的选择太多,也许如刘伟硕同学说,缺乏强制措施。还有同学在学期末的感言中提到,如果能够再有一次机会,如果可以重开此课,诸如此类。说实话,今生放手的人,我不怎么相信来生会更珍惜。
这17位坚持到底的同学中,有三位旁听生。他们没有注册,也不会有学分,但是成绩优秀。其中一位是我以前的学生,她现在本人也是教师,同时作为邹欣老师本学期某校的远程助教,名郑蕊;一位是现在的研究生,但是他没有选课,名亮哥;一位是本科三年级同学,名冉华,他曾经一度参与亮哥的项目。郑蕊和亮哥的成绩属最优秀的之列,冉华同学独立完成了一个持续10天计累计46.05小时的小项目《H3C汇聚层交换机认证在线人数展示系统》。这告诉我们人的主观意愿和追随内心的力量。
全体同学发布技术博客共254篇,人均超过每周1篇。教师发布21篇,每周约2篇,其中一篇是这一周作业重点提示及更新点评,另一篇是这一周作业的成绩。
在第3周开始,全体同学结成4个团队,每组约4位同学。其中3个团队站到最后,1个团队在alpha发布后开始解体。解体的团队,有1位同学加入其他团队,另2位同学保持游离态。
以团队为单位发布项目,学期末发布共5个共3种。3种项目是 抢答器、记账本、四则运算在线,分别源于耐撕团队、OneZero团队、爆打团队。在学期中真beta版发布后由每个团队选择fork其他团队的一个项目,并在两周内增加功能,与源出的团队竞争开发,即要求每个团队最终发布2个项目。学期末,抢答器、记账本有2个团队分别发布branch,四则运算在线1个branch,共计5个。这样做教学上的原因是东北师大北前没有积累可供训练 维护 阶段的代码,以fork其他团队来部分贯彻邹欣老师提到的:写一万行代码,在别人的十万行代码中愉快的运行。
所有的技术博客和代码可以通过教师博客[http://www.cnblogs.com/younggift/]找到。
在第2周课程的时候郑蕊同学建立了 东师软件工程 微信群。不过与《构建之法》其他高校的群不同的,东北师大的群里基本没有人说话,教师临时修改增加作业或点评,也不太有响应。我本人不喜欢在"群"里被集体通知或告之,然后自己选择是否与自己有关。这种被组织的感觉不好。我担心同学们是这样感受的,进而进入 狱警囚徒模式,所以对群里一片安静听之任之。东北师大的群最后大家选择了实名(而且人数这么少很容易人肉出来吧),据说有的高校的群是匿名的,有同学发表了对教师和/或助教的不满。这也是个大家不吱声的原因吧。还有,可能由于就业太容易,似乎无论什么对就业都没有什么正面或负面影响,东北师大的同学似乎历来高冷……我习惯了。
3. 历程
第1周和第2周,基础知识及鸡汤。知识不是重要的部分,更不用说对于研究生阶段的同学。往往是,我们知道,但是不做。更重要的,猛灌鸡汤。同学们通常并无强烈的动机想进修软件工程。他们的热情一般止于热烈的表达愿望,或者言不由衷地对科目重要性的认识,有时还有对教师的表扬。但是,也仅止于此。第一轮工作量就会把他们貌似熊熊燃烧的小火苗烧熄,然后他们会说,"其实也那么重要,其实也没那么渴望",用那么二字这一程度副词否定自己的"初心"当真是好借口。鸡汤是药,不能停。在真beta发布前后,教师说,以后不会再有鸡汤了。那个时候,同学们疲于应对从没见过那么多的工作量。同时,教师对同学们不能甚至消极地响应很失望,邹欣老师和叶卡编辑的鸡汤也不足以补足元气,对每周的截止时间周三晚24点守岁般度过然后你没有提交作业很失望。我觉得,你们并不像你们所声称的那样希望我们共同所做的事,而你们没有想到我会坚守承诺,并且对你没有坚守承诺愤慨和绝望。我就是在这个时候放弃的,当你用行动宣布放弃的时候。好多年前我用更激烈的措辞给学生们写过一封信,大意是,我们不是因为情感走到一起,而是因为共同的目的,你不坚持,就是背叛,我绝不挽留。我现在会微笑着对全班同学说,"我爱你们,同学们,发自内心,而且你们真的与以往每届都如此不同"。不过,我没有什么不同。
从第3周开始,分团队,团队项目立项介绍。两周SCRUM,要求每天站立会议及会议报告作为技术博客,每个团队共10篇。不过这只是要求和愿望。不少同学们在这时还没有意识到我在第一堂课的鸡汤,"刚工作的同学往往以为有60分这一档,其实那是不存在的,工作上只有0分或及格。"只要你有一点不符合要求,就触碰了底线,0分。超过截止日期,要求的项目有没有完成的,指标达不到要求的,要求结对没做的,要求互评不评的,都是0分差评。在工作中,我们就是这样一步步失去信任的,如果偶有错误,时机不定;也是这样一步步赢得信任的,如果你每一次都符合要求。有同学问我,在工作中如果做得不好,是不是就会挨批啊。不会的,成熟的上级从来不批评你,只会减少你的工作量,越来越少,直到转岗开除。而干的好的,会不停地挨批要求改正要求更好,然后升职,去承担更重要更可怕的工作。
两周SCRUM后,alpha发布发期进行。此前亮哥创造性地给了一个发布剧透,介绍发布时将会发布的事情,简述功能。此后,剧透成要标准要求。alpha发布后,每组有1位同学离开原组,加入新的团队。alpha要求有真实用户评论,4组团队只有2个用户评论,并不详细和认真。达不到要求,和教师不敢于认真要求,都是一步步的,如同腐烂,是缓慢开始的。有一整天不呼吸,以后就不能呼吸了,有一年不联系老友,他就不再是老友了,有一次不遵循规则超过要求,以后就不再是完美实现了—不少人就此放弃,虽然不完美也比一次次放弃要强。
东北师大的SCRIM及alpha早于《构建之法》16周的教学计划,是因为考虑到课时少,可能会早于16周结束,另外假设学生有更好的软件工程课程基础,因此理论教学减量。
alpha发布如同《构建之法》其他高校及邹欣老师的预料(通常总是如此),同学们高估自己可能输出的工作量,有太大的雄心壮志,然而无能实现。所以alpha发布后,同学们都趋向现实和保守,每周只肯实现一两个工作量不大的功能,我甚至怀疑大家开始降低投入时间了。
4周已过的时候,颁发领跑衫两件,奖给当时成绩最突出的两位同学。分别是郑蕊和刘伟硕[http://www.cnblogs.com/younggift/p/5352171.html]。
又两周SCRUM,每天站立会议及报告,然后beta发布。在这两周中也包括对alpha发布的review。考虑到研究生同学有更自由的时间可供支配,此处比《构建之法》减少一周专门的alpha回顾。这两周SCRUM之后原计划是beta发布,但是各团队并未做到beta的应有之意"公测",没有真正用户,并且功能也并不大的进展。
教师称此次发布伪beta发布(因为没有真用户),要求再两周SCRUM,增加功能找真用户,然后真beta发布。这期间教师按学校要求出差1.5周,在网上看了作业,但是由于视力原因不能点评,真beta发布由亮哥主持。在此期间郑蕊提到有一周的工作状态是"失控",其他同学虽然没有提到,教师以为这是普遍的现象。同学们开始痛恨或者无视课程要求,工作量压得喘不过气,并且维护既有代码并增加功能带来更大的压力。虽然各位在学期末的回顾中很享受的样子,我深以为有多半是军训般的斯德哥尔摩效应。我们不应该喜欢训练带来的痛苦,我们只是喜欢训练带来的结果。之所以如此痛苦,是因为以前的积累太差了—像网上的段子说的,期末的突击学习的难度,取决于你是复习还是预习。在这样一门课程中,又要积累编程经验,又要学习工程理论,又要实践。恩,既然贵族需要三代能积累出来,那么我们还是继续做奴仆好了。
第12周期末final发布。要求所有需要成绩的同学参加,本学期唯一不接受请假的一天。有同学电话我了,确实有非常之理由需要缺习,我表达了我的理解,也请他理解我不能接受请假的理由。
在final发布时,又颁发4件领跑黄衫,分别奖给
特别能作战 齐嘉亮[http://www.cnblogs.com/dendroaspis-polylepis/p/5534847.html]、
敬业福 夏一鸣[http://www.cnblogs.com/xiaym896/p/5536226.html]、
可以托付靠谱 濮成林[http://www.cnblogs.com/charliePU/p/5537734.html]、
力挽狂澜 高鑫[http://www.cnblogs.com/gaolzzxin/p/5515451.html]。
成绩核算,需要按学校的要求,作业和期末论文都要交纸质品。具体的我要求为技术博客打印,期末论文打印,代码我折衷了一下,给出代码片断及下载地址。
最后,进入邹欣老师所说的"诸葛亮会议"时间,会团队review,教师也review。在此期间以前的毕业生正在上海工作的李暘发来对耐撕团队代码的review,使本已沉寂的耐撕团队队员内心又起波澜。课程有结束之日,求索没有停止之时;常回望来时路,才能进步。
4. 外援
邹欣老师拿出自己的稿费征募远程助教,为各高校提供帮助。这样一门实践不瘸腿,代码量和写作工作量很大的课程,需要助教给学生及时和充分的反馈才能得以进行,而高校机制决定难以实施。邹欣老师自掏腰包,以及课程本身的吸引力,颇有一些实践经验丰富的工程师承担了助教工作。助教无疑也付出了非常多的时间,要知道,几乎每一行代码、每一行文字,助教都是审核过的。只是,也许能力,也许精力,更重要的是时机,助教没有指出学生每一个细节的失误。我本学期没有申请助教协助,因为知道成绩核算方法和教学水平都不一定能保证满足邹欣老师的设计意图,所以由我一个人兼作教师和助教。从我的学生仅17人计,仍然感觉工作量非常大。我最初每次回复和点评技术博客,需要1至2小时。后来只好拆分成几段,挑空闲时间而且有PC机的时候处理。很多个小时,一般是一整个下午,多半个晚上。牛宝乐老师和郑蕊老师分别做过助教,他们也都提到工作量巨大。我知道承担助教工作的还有幻飞龙博士。虽然我没有申请助教,但是也从助教群中收获不少,包括不限于 工具、方法、学生的现状。谢谢各位助教。
邹欣老师和叶卡编辑提供的领跑黄衫,着实让同学们兴奋了一把。来自"官方"的看得见的肯定,仍然是同学们追求的重要目标和强大动力。
很多学生的技术博客,邹欣老师也给也点评或者建议。他的点评和建议从来不是泛泛的,而是切中肯綮。一方面,我感慨邹欣老师同时点评这么多高校和学生,作为教师我也能学到不少,心存感激。另一方面,我和郑蕊私下交流过,我们点评一篇需要半小时以上,而邹老师只需要八九分钟,质量却是比我们更高。所谓高手和菜鸟的差别,他们少犯错,他们效率更高。能让我们亲眼看到高山仰止,也是幸运。
除了邹欣老师以外,还有几位专家也参与了点评。他们是maverick@柳园 (余晟), 李暘,无效的昵称(来自阿里的曾同学)。几位共同指出一个特别重要的问题,代码规范和文档规范。这不仅是学生的问题,也是教师的问题。如果有下一次课程,我会注意改进。谢谢。maverick@柳园就规范问题还给出过具体的建议,文档模板。这一点我心尚存疑,对于学生的主动性培养和适当引导,我仍然在犹豫之间,此时就以邹欣老师提供的教辅助材料为准。谢谢各位。
为了能得到来自校外的专家的点评,我在助教和构建之法微信群中,每一周都发布广告,恳请指导和鼓励。后来我不敢再继续发布消息了,因为同学们做得实在令我汗颜。如同我在课堂上说的,所有的一切都是公开的,代码袒露在所有人的面前,东北师大和你个人的能力如何,是不是会被别人藐视,无论你多么爱国和爱校,事实也就是这样。尊重不是靠恳求和隐瞒得到的,而是靠实力。
在教学中,我还得到了牛宝乐老师的帮助,他向我推荐和提供了幻飞龙博士开发的工具,把EXCEL格式的文件转换成Markdown格式。我用这一工具处理每周发布的成绩,以及成绩计算的依据。非常有效,节省了不少时间。谢谢二位。
两位旁听生,郑蕊和齐嘉亮,成为整个班级和团队的中坚力量,在带动别的同学上面起到了极大的作用,让我放心不少。谢谢。
5. 教学内容
工程。从第2次课程开始,教师持续地强调 这是工程课程,不是编程课程。编程的经验对于 项目的结果 起到了非常关键的作用,这一点从亮哥在耐撕团队的作用、刘伟硕换组以后立即突破OneZero团队的关键技术问题(数据库连接和操作)、高鑫加盟暴打团队以后团队起死回生 可以旁证。但是超越编程经验的工程思想,才是本课程教学的重点。不少同学在学期中或学期末的时候表达了理解 工程控制 的重要性,不过教师并不确认这种表达到底多少真诚,有多少可实施的愿望。
为了强化工程的体会(以及降低技术风险),教师强制要求,不得采用需要探索的技术,只能使用现在已经熟练掌握的技术。直接要求而不讨论,禁止了在统计文本的词频中使用 Hadoop、禁止了使用某种框架。教师也有过担心,万一同学们只会做console程序,连GUI和web前端都做不出,那么产品的效果得多么惨不忍睹。邹欣老师教导我(大意如此)说,那就是愿望和能力间的差距太大,还是能出来啥就做啥 — 做出不来的,光想也是没用,发布才是硬道理。
还是为了强化工程的体会,教师特别若干次强调 边界,并在需求分析、功能列表、SCRUM中再次援引边界。边界是一个系统与外界的分隔也是连接,是允许调用的接口规范,支持的功能的集合,use case driven指定的整个工程的开始端,也是拒绝服务的依据。
估算和度量。对时间(PSP)、工作量(技术博客字数累积、代码行数累积、进度条)的度量要求,对时间的(预计)估算要求。冉华同学的项目在时间和工作量估算上受到教师的直接指导,他的进步(至少体会上)非常明显。工程思想要求所有的效果都是可观测的,所有的猜测(模型)是可验证的。计算机系的同学实验经验还远远不足,"我猜"而不验证仍然经常出现。
以上两点,是不限于软件范围的一般性工程思想,是教学中的重点。教师相信中国软件工程学科教程[https://book.douban.com/subject/1653554/]中的观点(大意),软件工程与一般工程间的区别远比我们通常认为的要小得多,应该首先注意到它是 工程,其次才是软件相关。
结对编程。一定程度上解决了某些同学编程基础薄弱的问题,但是实施不持久。实施了一段以后,同学们以 时间、地点、导师部署的工作量大 等理由开始搪塞。关于同学们对于知识的尊重和对训练的轻视,后面会再谈。由于此时团队项目开始出现团体reciew和团体一起编程的情况,教师对于结对报告没再坚持。
规范,文档排版,用词和造句,变量命名。这些在前期有提及,并且安排了作业,但是在时间驱动团队项目的压力之下,教师和学生都放弃了这对规范的要求。
版本控制。要求使用github。同学们在团队项目开始后,抱怨网络现状和响应速度,纷纷放弃使用github,不过版本控制的习惯保留了下来。
技术博客。要求发表在 cnblogs 上。有同学抱怨但是全都服从了。遵循虽然不见得最优但是并不明显愚蠢的上级要求,也是成为工程师的一课。希望同学们在此能有收获。
版权。我们提到了文字复制粘贴的侵权问题,也讨论到图片引用。从同学们发布的技术博客文字和课堂争论来看,并未就版权的界定(比如引用图片是否算以"学习"为目的,不营利是不是就可以盗版)达成一致意见。在本课程中,教师视引起争论为达到效果,不在教学中作更深入的探讨。
6. 缺憾及体会
1)知识和训练。同学们普遍而长期地忽视训练。
同学们普遍而长期地忽视训练,如果我们认可他们相对地更重视一些知识的话,虽然他们最重视的是感受("这个老师真和蔼,全心全意地爱学生,这样的才是好老师")和态度("我反对我赞同,不转不是中国人")。决定成败决定效果的,直接地不是感受和态度,而是技术。现在比较普遍地能够接受的,即使在人民战争中,人民的认可如此重要,但是在最终和敌人刺刀相见的时候,意志远不如技术重要。打架是个技术活,工程也是。头缠红带如果只发生在临期末了,改变不了战局。
在课堂中,教师也屡次提到,知识是可以传授的,告诉你你就知道,而技能是不能传授,只能通过训练习得。游泳、骑自行车、弹琴、编程,这些技能只能通过训练获得,你仅仅知道也是白扯。邹欣老师在《构建之法》中有生动的比喻,一个在健身房里参观的学员,是不会自动长出一身肌肉来的,只要你不*主动*运动,亲自克服阻力,无论教练对其他学员的教学方法有多么地好,教练多么地帅和态度友善,你的愿望有多么热切。
例如,在本学期实际的教学中,同学们对于结对编程最初表现出强烈的轻视,觉得明白道理就行了。在工程实践中,也倾向于乐于观摩,而不希望投入时间;在课堂中,倾向于听教师讲单口相声,"啊"地一拍大腿或者频频点头,而不希望做作业。在课余的项目中,我也注意到学生们普遍地具有这种估向,希望真项目、有实际用途的项目、有好的效果的项目,同时希望工作量要少,希望多学知识,而不是实践知识。针对这一点,在课堂中,教师多次提到,资本家不会因为你会什么知识而付你钱,只会因为你做了什么而付钱。
对于训练的否定态度,以前也经常有项目组的同学对我说,"老师,我还得学习呢。"也就是说在同学们的心目中,项目研发,不过是业余的爱好,并不是学习的一部分,读书考试才是真正的学习。下意识中,掌握了知识,或者把某书的电子版搞到手了,就完事大吉。其实这只是开始,甚至远未开始。知识,从写出代码第一行时,在实践中,才真正开始掌握。知乎中有人问,"编译原理和算法导论是不是屠龙技 有技而无龙可屠?"我在回答中说,"除非真正屠龙过,否则不能确定掌握了技术--做习题是不够的。因此"有技(而无龙可屠)"是个伪命题。"道理是一样的。
当然,我能够理解,同学们经常看到世界充满欺骗和吹嘘,甚至我们已经习惯。说一套做一套,理论和实践毫不相关,要求别人的道德准则和自己亲自实践的泾渭分明。不过,如果我们所做的和我们宣称所相信的如此不同,我们得是多么精神分裂啊。所以,试一试,按单一的原则生活,实践你相信的原则。拒绝你不相信的。
知识与实践(及训练)应该是统一的。
2)主动地参与世界。积极性。同学们普遍高冷。
本学期有一个抢跑项目(把 [http://www.cnblogs.com/xinz/p/3852177.html] 的量表做成APP或网上调查问卷,并发布在微信朋友圈中),有三个名额,但应者寥寥,最终只有两位同学参与,并且有一位是教师单独动员的。
这个抢跑项目初看很简单,简单到同学们不屑于抬起手指。这种傲慢在学习工作中也是普遍的,"显然啊"是不少人的口头语,颇有一种"你怎么这么笨就是不明白呢",即使后来深入了解发现并不简单甚至"显然"自己错了的时候,也气势不减。
简单的项目不做,复杂的项目做不来。在课堂上也常这样,显而易见的问题不吱声,稍微难的问题不敢吱声。所以,沉默的大多数,寂静的春天。假装大人,掩饰自己的不足,故作淡定,不参与不表现,不评论不反对不支持。
第一次第二要求结对,很多同学不做;再三强调推动,终于做了,但是体会不乐意写或不乐意多写。要求互评效果更差,只有一两位同学参与并保持。教师提供了"他山之玉",转引邹欣老师整理的其他高校的技术博客汇总,似乎没有几位同学看,从在课堂中对作业要求的表现可以猜测。
"主动地参与世界"是世界不放弃的前提。还是在知乎上看到的一个吐槽,某高校几位女同学在大雨天被浇到了,而路上所有独自撑着伞的男同学都静静地看着她们在雨里走。有位回答得与我们刚刚提到的主题正相关,他说,你如果有求于人,要主动提出,否则别人会以为你享受雨中的散步;没有人有闲工夫看你,所以我们根本不知道你在雨里。"主动地参与世界",不要期待世界来求你。绝大多数同学的技术远没有达到可以隐居的程度,不过作法上已经很有大师的样子了。
3)主动地参与世界。人类语言和代码写作。
课程要求同学们每周发布技术博客,课程还要求期末交课程论文。从技术博客和现已看到的课程论文来看,篇幅都短得可怜。课程论文谈体会,还没有教师的体会一半儿长的同学,不觉得惭愧么,或者教师该为这一学期让你收获如此地少而说声抱歉?
不少同学可能会说,"没有什么好说的。"
抛掉我们课程中提到的,错误的承前省和代词使用,是网络贴子主要的错误来源,认为读者知道你所知道的信息,是一个错误的假设。如果读者已经知道你所知道的一切,那么心有灵犀的情况下,沟通就毫无必要—也许你确实认为报告、技术博客、论文,只是形式化的仪式而已。向别人解释自己的动机、技术路线,在毕业论文和项目答辩中阐述你所认为的重点难点,不仅是使得别人了解你,也是评定专家确认你了解你所说的内容的重要手段。对于从北京到走向世界的途径如果你说,"靠脚"或者"没有必要,最好的我们都已经有了",那么别人至少了解你的方法论或者价值观,而你说"那不显然么",除了傲慢的态度,别人对你没有任何新增的了解。
有个心理学或教育学故事告诉我们,不了解别人不是自私,而是幼稚。故事说,令孩子A观察孩子B的行为,并回答问题。有个人对被观察者孩子B展示糖果并放在抽屉里,然后在孩子B短暂离开时把糖果从抽屉里拿出来放到口袋里。问孩子A,孩子B回来以后会到哪里找糖果。有一些孩子A回答,孩子B会在口袋里找糖果。这些孩子A并不知道,孩子B不知道糖果转移这一信息。
代码、文档、报告、技术博客,都是告之另一些人,他们所不知道的信息。主动地参与世界,在代码和人类语言写作中充分预估别人可能不知道,展示自己的友善,而不是展示自己的聪明。
如果你不知道应该如何表达,或者表达哪些信息,那么 多读书,多读别人的经验之谈,多读代码,多看看别人是怎么写的。不要沉浸在自己的小世界里,你不注意别人,就不知道别人需要什么信息,期待阅读什么。多想到别人期待什么,而不是你意图展示什么。这样,能避免写作和代码词不达意。你的个性和态度,没有人乐于为此付钱。帮助别人,别人才会付钱给你;请我们欣赏你的个性和态度,你需要付钱给我们。
4)时间。快节奏,短迭代。时间驱动。对时间的估算和度量。
课程每周一次。也就是说,如果师生在此中间没有任何沟通,那么学生在此时所犯的错误,可能要7天之后才能得以纠正;学生是否理解纠正,需要再一个7天老师才能观察到效果。如此往复,我们在一个学期16周中也不能交流多少东西。所以,提高工作节奏,以尽可能短的迭代来完成任务非常必要。这也是Agile/Xp方法论的核心之一,也是RUP接受的理念。
齐嘉亮、刘伟硕、濮成林和夏一鸣都采用过短迭代完成作业。在作业部置的第二天,就已经提交一个版本,教师(和邹欣老师)给出的修改意见、增补的工作要求,在接下来本周过完以前再提交一次,可能根据修改意见再提交一次。这样,别人一次作业,他们不仅多了两三次的工作量(也即收获),而且远超这些,因为后面的几次作业是在教师针对性的指导之下的。
相比之下,有些同学采取了等、靠、拖的策略。在作业截止时间最后几分钟提交,其中一个借口是"我希望尽可能完美"――但是不会比教师直接指导下的修改更完美,并且展示完美不是我们学习的目的。教师给出修改意见以后,不少同学说"我会在下次/以后的作业中改正",这基本等价于"老师,我已经给你留了面子,表达了充分的尊重,请不要逼我太甚"或者"我以后会改的,请不要再烦了我好咩"。如果那是错误,为什么不在本次改正?如果这是你期待的希望的"真正的"项目,不改正的错误会导致你白做,甚至可能赔偿损失。这种态度让我想起郭大侠的女儿郭芙,她砍了杨过的右臂,然后哭闹说,"我的确砍了你的胳膊,可是我被爹爹骂也骂了,对你道歉也道了,你还想怎么样啊。"郭芙之娇横可能连你也不能接受,不过那毕竟不是她本人的胳膊,而这是你本人的问题。
也有的同学会说,我改你指出的毛病已经够费劲了,"你还想怎么样啊"。笑话又说,期末的突击学习的难度,取决于你是复习还是预习。学生费劲、教师频繁地提出修改要求,改了一个毛病又整出一个来,一方面是因为不改完第一个,第二个毛病无从改起;另一方面,实在是因为某些同学的基础太差啊。好吧,那不全是你的责任,而是以前你的学校、学院、教师的责任,让我们一起抱怨吧。然后静等这个世界变得更美好…和宽容。
关于时间,邹欣老师还提到发布要求 时间驱动。没有截止时间的压力,同学们不定哪天才能完成—一般是最后一天开始动手。夏一鸣同学在期末总结时感叹,学期初的愿望有两个,其一是 题目难道能循序渐进,其二是 如果太难,希望能放宽时限。一个也没有实现,不过他大大地成熟了,已经进步到不再有这两个愿望,而是"老师是不是可以分配给我下一个任务了。"
时间要求是个硬线,在教学中,宁可缩小功能范围、降低质量,也不能超时。就在要求的那个时间,无论如何,程序要发布要可执行。我喜欢说的一句不太动听的话,在规定的时间规定的任务必须交付,如果做得像屎一样,就交付屎一样的工作,并接受别人对我们屎一样的评价。下次更努力一些,不要在这一次就求饶。
与时间相关的最后一个问题,同学们普遍缺乏对时间的估算和度量的意识,如果说对代码量的估算和度量还有那么一点意识的话。时间是工程中最重要的资源(没有之一,因为时间直接地就是生命,别的都不是),所以对于自己做类似项目的能力的度量应该持续进行,这也应该成为事后review诸葛亮会议的重要内容,并根据这种度量一次次在新项目开始前估算时间,在项目结束后对比事前估算与事后度量,增强下次的估算能力。自动控制中常用的PID方法、机器学习中各种基于经验的方法、读者故事里鲨鱼怕疼不敢撞玻璃那样的浪漫的基本原理也大抵如此。我们怎么能在工程中有时重视估算和度量,而对最重要的时间却如此忽略。多么精分啊。
5)规范
规范不止是代码规范,还有作业要求,用人类语言表述的作业要求的条目。
为什么没有一再地强调规范,因为同学们普遍地达不到更低的要求,所以教师放弃了规范这样更高的要求。时间、工作量、工作报告质量、视频,很多不能达到最低要求,有不少同学直接忽略部分作业条目,当没看见。同学们根据工作量和时间调整要求,而不是根据要求调整投入的工作量和工作时间。
还是在知乎编译原理是否屠龙技一问中,我这样回答,"能找到的活儿太差的时候,觉察不到技术的必要。成天跟小孩打架,不用练力量敏捷抗打击;成天盖狗窝,不需要图纸和水泥标号。如果理想就是这样,龙只是传说,屠龙技当然毫无用处。"如果你满足于这样的生活,不希望精益求精成为一个更优秀的工程师,我又有什么法子。我当然知道优秀的教师能够"有教无类","没有差生,只有差教师",可是,偏偏我不是优秀的教师,咱们可怎么办呢。
对于不完成作业的全部这一点,教师考虑过以更详细和严厉的规则来应对:作业应该针对小项倒扣分,而不是全部作业都不完成才倒扣分。不过,教师担心这会开启 狱警-囚徒模式,尤其学生是研究生阶段的 成年人,理应获得这样程度的尊重。
说起尊重,我想起一个故事。据说侵略者为了瓦解印弟安人,对战士说,"你在部落里有什么样的权力?"战士回答,"我有冲锋在前的权力。"冲锋在前,是一种权力,这是尊重的来源。我尊重你是成年人,作法就是像对待成年人一定对待你,绝不称你为"孩子""那个孩子""那些孩子",绝不轻拍你的高贵的头以示亲昵;我尊重女性,作法就是像对待男性一样对待女性,尊重她们冲锋在前的权力,所有的爱护都无声地宣布"你是弱者,自觉承认"。
我尊重你,尊重你按约定完成任务的自觉和按规范完成的能力。你按约定和规范完成任务,是对我的尊重的尊重,也是对你自己冲锋在前的权力的尊重。你之所以能看到的我的愤怒和失望,是因为你放弃了权利,你没有侮辱了你自己也侮辱了我,也是因为我对自己的无能的认可和恐惧。
6)学生观摩。现实,外界的限制。
邹欣老师希望学生能够观摩final发布和各次发布,他希望退课的同学能回来看看,看看失去了什么;他希望本科生也能来看看,看看可能在将来学到什么。邹欣老师还希望成绩能够严格执行平时作业的标准,并且平时作业应该占到应该的比重。
这些期待,我很惭愧,没能全部实现。作为主讲教师,我切身体会其中的难处,有些超过了时间花费、知识结构和技能,进入了我们所隶属的单位的组织结构(和课程体系)。课程教学只是上级(我不是在讨论赞同或反对高校行政化)要求的诸多工作的一部分,还有很多别的工作,这并不是最主要的原因。更重要的原因是,如果那么做,所付出的代价。不是克服困难所付出的努力,而是克服困难所需要承担的后果。所以,所谓"尽我所能""不惜一切代价"我从来也没有脸去说,也不能以此要求我的同学们。
7. 总结
回望来时的路。构建之法 东北师大站 2016春季学期,终于结束了。
第4周的时候,我曾经写过鸡汤如下,赞扬2位领跑同学和当时尚未放弃的18位同学。其实情形一直这样艰难,从来也没有改变。
他们的成绩反映的是这样的场景下的胜利:
你是一位将军,
部队弹尽粮绝,而且很饿;
战士战术技能很差,装备落后;
行军在敌国的沼泽里,风声鹤唳;
敌人有空中支援,有坦克,有热的饭菜和热水;
上级是没脑的杨贵福,战略垃圾,脾气暴躁,
他决定此刻立即开始,进攻前方的碉堡,既没有迫击炮也没有照明弹,
只有炸-药-包。
你的下级准备解散部队,准备撤出战场,准备起义反对你。
你说,不惜一切代价,16周突袭。
这就是4周以来的战况,我们还活着。
我们还有12周战斗。
继续冲锋。
此刻,继续冲锋。
如果你为感想和收获还不到教师的一半长度而惭愧,此刻,继续冲锋,不要等到下一次作业再改进。没有下一次。