“软件教育中亟待改变的是什么?”这是《高级软件工程》课程开设之前,微软亚洲研究院首席研发经理邹欣向几位已毕业的软件专业同学抛出的问题。
“实践”是答案中的关键词。
“没有真实的需求,没有软件的增量开发,没有团队合作,程序设计和软件工程中的大部分理论都沦为空谈。”其中一条回答如此说道。
《高级软件工程》课程应运而生。这是微软亚洲研究院为创新人才学院定制的一门课,自 2010 年开课起,课程一直根据反馈进行着改进优化。有别于传统的软件教育,创新人才学院倡导创新、鼓励实践,从全方位“模拟实战”。对这些从合作高校招收的优秀大四学生来说,这无异于一场“走出象牙塔”之旅。
创新人才学院高级软件工程课程全员合影
天生的 PM
“你是天生的 PM。”在结课答辩中,微软亚洲研究院副院长周明盛赞了银大成的表现。
来自中国科学技术大学的银大成是 Poetic Image 组的 PM。PM 是 Product Manager 的简称,也被称为“产品经理”,可以说, 他是做 “除了写代码和测试之外所有工作”的人。
除了写代码和测试,一个软件团队还需要做什么呢?成功的秘密,可能就散落在这些零散的地方。 邹欣老师认为,“一个优秀的 PM,能把一群人团结起来高效地完成目标,是整个项目的灵魂。”
回忆起这句夸赞,大成有些不好意思,“其实大家都很强“。因为在之前的“结队编程”项目中取得了第一名的好成绩,大成被同伴们推举成为 PM。
Poetic Image 组 PM 银大成在创新人才学院结课仪式上展示产品 demo
Poetic Image 的工作很快步入正轨。确定了“图片转对联“的主题后,小组以纸上模型的方式确定了产品的主要功能。根据课上讲授的产品开发流程,大成还带领小组成员在班级里做了一次调研,“有人期待产品有表情包、斗图的功能,我们就把这个功能放进了计划里。”
看中了微信小程序后台丰富的自动统计数据,组内一致同意以微信小程序来作为产品载体。“有了这些数据,我们不仅可以研究用户的年龄和地域分布,还可以了解用户对产品的重复使用情况,”大成解释道。
预想的“便利”和“不知天高地厚“都有代价。小程序需要的域名备案,多种功能一起开发的压力,这些都成了产品开发初期的难题和考验。在课程的第一个考核节点——Alpha 阶段答辩时,Poetic Image 组的成果并未得到认可。
“胡晓武老师认为我们‘大而不精’。”大成说,“确实,我们只有一个功能和写对联有关。“
此时,Poetic Image 的“竞争对手“、同做一个主题的诗景(PoemScape)已经交出了更为成熟的作品。
“在 alpha 阶段,诗景就实现了所有基础功能,以及用户编辑修改功能。” 来自中国科学技术大学、在 alpha 阶段担任诗景组 PM 的齐炜桢说。在项目开始前,炜桢翻遍了所有能找到的关于对联生成的论文,找到了适合用于古诗生成的论文和代码。
诗景组阿尔法阶段 PM 齐炜桢在结课仪式上展示产品,根据导师们提出的问题进行答辩
除了完善的功能,诗景组更有相对精致的UI设计加持,在各组中一枝独秀,摘得评分第一。
“从任何角度上看,我们当时拿出的东西都是一个半成品。” 大成的语气中不无遗憾。当时的 Poetic Image 组仅列第三名 。
后发优势
Alpha 阶段失利后,如何转寰局面,是摆在眼下的难题。
邹欣老师曾在课上讲述过“先发优势”和“后发优势”的故事:世界上第一台 VCD 诞生于中国安徽的万燕公司,它的产品惊艳亮相之后,很多企业快速进入市场,以低价竞争,万燕没有进行持续改进和创新的能力,最后从“先驱”成为“先烈”。
这个故事让大成印象深刻,“所谓‘后发优势’,就是要吸取教训,然后不断改变。”他说。
他们也的确做到了后发制人。基于 alpha 阶段的教训和导师的反馈,Poetic Image 组开始调整方向。来自西安交通大学的组员杨涛提出“应该砍掉一些功能”,经过组内民主投票,Poetic Image 组最终迈出了“断舍离”的第一步。
舍弃功能并不意味着无事可做,相反,“凌晨派对”成为了 Poetic Image 组的日常。由于项目需要前后端联合进行调试,组员们常常在大成的寝室里一起奋战。来自中国科学技术大学、主要负责项目后端工作的苏伟杰记得当时的场景,“大概就是两三个人在桌子上,其他人坐在床上。”有一晚遇见肯德基促销,大家还一起“点了夜宵”。
“那可能是我吃得最香的一顿肯德基。”伟杰笑着说。
为了弥补 UI 过于简陋的短板,来自中国科学技术大学的组员冷燚冲找来了外援——Outreach 组实习生潘帆,她帮助 Poetic Image 与“半成品”的过去式作了告别。
潘帆为 Poetic Image 组设计的UI界面 demo
同时,组员们也发现 Poetic Image 在 alpha 阶段的解决方案稳定性很差,“经常导致前端无法从服务器正常下载图片”。为了解决这一问题,大成找来在 beta 阶段转入诗景组的王子博帮忙。“子博友情向我们提供了一个二级域名,非常感谢他。”伟杰说。
微软亚洲研究院常务副院长张冬梅在结课仪式上对同学们的项目作品提出建议
成员们的共同付出取得了回报。小程序发布仅 3 天后,其累计用户量就达到了 12 00,总访问次数约为 8 千次。在结课答辩中,微软亚洲研究院常务副院长张冬梅赞赏道:“通过做这个项目,你们探讨了如何在短时间内聚集人气并改进服务,这是一个 ambitious goal。”
Poetic Image 最终获得“最佳项目奖”。
Poetic Image 组成员获得了邹欣老师赠送的纪念衫
(从左至右依次为:杨涛、冷燚冲、银大成、邹欣、周晓强、张贺)
虽然最后惜败于 Poetic Image 组,诗景也在很多方面做得很出色。“我们更聚焦于技术,在架构和算法的设计上都很棒。”炜桢说。
不论是用 text rank 的算法来对已存在的诗句和对联提取关键词、后续改进的词性分析和关键词的拓展算法,还是对联古诗在平仄、对仗和读音等方面的处理,诗景都显得更为智能。但在用户体验上,炜桢坦言诗景有所欠缺:“大家都把更多精力放在了更好的技术上,而忘记了作为一个软件,用户体验和评价才应当是放在第一位的。”
实际上,在软件工程课的团队项目阶段, 各个团队都在互相启发中共同进步。邹欣老师授课时, 并未苦口婆心地“教”学生如何发奋,课堂气氛十分轻松。但在课程进行过程中, 各个团队愉快地展示各种才能,用实际的产品比拼, 就已是一个很好的 “教学” 过程。
同学们课程分数的“千帆竞发图”。在整个学期中,除了中途退课的两位同学,没有一位同学与大部队脱节
IT 教育,不仅仅是代码
《高级软件工程》课让第一次走出象牙塔的同学们感到惊讶:
不沿着“经典的瀑布模型”讲授课程,而是面向实战,强调“做中学”(learning by doing),试图在 16 周内跑完软件工程技术的基本内容;
在编程实战过程中,所有项目都对外公开,用户数量和反馈成为项目重要的评价指标;
与许多大学中仅有空洞的 PPT、没有能实际运行代码的“软工大作业”不同,这里的作业既涵盖编程,又囊获了阅读、分析、团队合作和技能评估等各个方面。
这也意味着,如果你将软件工程课定义为一门空洞乏味的课,并且在课上放空自我、课后不全力投身实践,那么,你无法在邹欣老师的课程中蒙混过关。
邹欣老师在结课仪式上做总结发言,点评各组产品成果
作为该门课程的负责人,邹欣老师不希望同学们只做“跟随者”。
当他发现 Julia 语言尚无 debugger 时,便找到 Judy 组成员,“如果你们做出来,就是世界上第一个。”这个提议也让同学们兴奋,他们经过调研后觉得“项目有可行性”,将选题进行了更换。
虽然在开发 Judy 的过程中,第一个 Julia debugger 悄然上架,但 Judy 与之相比并不逊色,不仅有其尚无的图形界面,而且在未经特别推广的情况下,已在 VS 应用市场上收获了 466 的下载量。对于一个课程产品而言,这已是莫大的肯定。
截至 2 月 16 日,Judy 在 Visual Studio Marketplace 已经获得 466 次下载和 426 次安装
“我们做的东西是有意义的,不是重复别人做过的东西。”在谈及亲手开发的 Judy 时,来自中国科学技术大学的王越琛颇为自豪。
同样以 Julia 语言为选题的 JuJu 组,完成了基于 Julia 语言的实体命名识别工作。他们不仅用 Julia 语言完成了 bi-LSTM 等层,还用 Julia 语言完成了 CoNLL 2003 数据集的数据下载器,最后训练得到的 NER model 在 CoNLL 2003 test 数据集上达到了 78% 的准确度。
Julia 尚未成为一种成熟的计算机语言,“我们的意义在于做出这样一个产品,后来者可以借助它更多地了解Julia 语言。” 中国科学技术大学学生、JuJu 组 PM 陈灿说。
除了注重实践、鼓励创新,课程还尝试将软件教育与人文社科构连,培养学生对这个领域的兴趣、热情和敏感。同学们对任课老师援引过的案例印象深刻,譬如邹欣老师如数家珍的寓言故事,胡晓武老师例举的《易经》,资深项目经理郑春蕾老师以图片为辅助进行的生动讲解,等等。
资深项目经理郑春蕾在课程上举例:又好又快又便宜,为什么不可行?
“让学生做‘一鸣惊人’的项目”并不属于课程教学计划的范畴,反之,计划要求同学们从个人项目、结对项目到团队项目循序渐进;同时,课程还会布置两次 “项目反思和改进” 作业和 “阅读软件文献” 作业 ,让同学们从实践中学习,运用软件工程的原理和工具不断改进自己的项目。
结课答辩中,微软亚洲研究院副院长周明特别强调了团队协作的重要性。“PM 作为团队的领导者,首先需要观察每个人的优点,让每个成员的长处都能得到充分发挥,同时又能找到合适的人与他配合,弥补各自的短处。”他提出团队应设置“有限目标”,“做完一件事一定要举杯相庆,然后再反思、进步。”
周明副院长也表示,软件开发不可能达到用户的所有需求。软件开发者能做的,就是“在目前的局限情况下,回到技术能力和用户需求,在实现最好的用户体验上下功夫。”
微软亚洲研究院副院长周明在结课仪式上点评同学们的项目作品
走出象牙塔之路并非坦途,面对前方的诸多未知,微软亚洲研究院资深学术合作经理、创新人才学院的班主任孙丽君说:“通过这门课,同学们走通了开发软件的整个过程。在以后的实际工作或科研中遇到困难时,他们脑海中闪现的解决方案,可能与这里收获的宝贵经验分不开。”