软工课让我们体验了软件开发的全过程。这句话有对的部分也有不对的地方,应该是“软工课让我们体验了软件开发的大致过程”。其中“体验”两个字非常准确,即便说我们小组最后做了一个可以勉强上线的项目,但其实跟那些软件公司(无论是大公司还是小公司)实际发布的软件都差得很远。我们的开发经验十分缺乏,开发过程仍旧比较混乱,对产品和用户的理解还很浅薄,做出来的软件功能不算多但却还不大可靠——感觉总的来说这个项目的开发和最终的结果都带着浓浓的“学生”气息,十分的稚嫩,而且相比于称之为一个上线的项目,实际上其实也就是一群大三学生的大作业。
可是,有了这次的经验,我们确实比一个学期前更加了解软件的开发过程,也体会到了做一个实际的项目有多么不容易,会遇到各种各样的问题,需要经历大量大量的测试却还是会有漏网之鱼,而用户们对软件的感受不一,无论是界面设计还是交互设计都是极为辛苦的——呈现给人看到的是美观、舒适的界面,简单、直观的操作,但背后却是“又脏又累”的活,这个形容词一点没用错。如果问我这次软工课我们得到的最宝贵的东西是什么,我会说不是我们做出来的那个产品,也不是最后得到的评价,而是我们成长了,就好像做了半个学期的实习(实际上也确实3学分的课花了远超6学分的时间,特别是课下和周末),我们可以骄傲地说自己不仅只是学生,起码是实际“做过软件的学生”了。(实际上还是学生嘛)
从学期初开始,我们就从头“模拟”软件开发过程,从用户需求的调研开始(十分粗糙和调研不足);也与“用户”做了反复“痛苦”的沟通,了解到了用户说不清需求也说不清软件怎么改好等等的特性;后来就从工程原型设计开始做起,制定了一些开发计划;也发现实际开发中会遇到很多意外情况,打乱原有的计划甚至做重大转变;也进行了小型的“敏捷开发”,不停地与用户交流该如何把工程做好(虽然后来还是有很多不令用户满意的地方);至于编程实现的过程,我觉得虽从代码质量和项目可维护性来说跟实际工程差了十万八千里,但从时间上来说倒是跟那些大公司基本相似,都是玩命似的要加班加点,与上线deadline做顽强斗争,但到了最后还是只能发布一个满是BUG的版本(想起了微软蓝屏…);测试自以为很充分,其实不堪一击,BUG修好了一个又会滋生一堆,感觉永远都改不完,而由于一个工程的逻辑分支和子功能太多,再怎么测也没办法用测试保证所有情况都不出问题;我们也走过了艰难的合并、部署与上线过程,原来的作业都是一人奋战或者组内小规模协作,而这学期两门软工课都恰好有小组集成的模块,而我们这次是进行了三方的共同协作,真正体会到不同模块之间合成的困难,如果不设计好接口和低耦合的交接方式,那么合并时痛苦的就是自己,而且一出现问题或一需要改动就得每组都变动,混乱不已,但是如果要精心设计好接口又要花很多精力来研究,总之比起实现,莫模块合并才是最费神的;最后就是我们没有体验到的“维护”过程,实际上做完这个项目后我们都快要吐了,都想尽快脱手(哈哈这是我们的真心话,学生就是这么不负责任),最后写完都不大想继续管了,更别说烦心地重构和维护了。
实际上也正是因为我们的学生身份,还得做很多门的大作业,上课、复习、考试,各种社工、实验室、准备英语出国,所以让我们从根本上来说无法全心全意地投入到一个项目中来,自然比不过全职的软件开发人员,还会对做出来的项目没有多大的维护激情,一点都不像对待自己“亲儿子”的感觉哈。刘老师迭代一后经常对我说,我还是把这个事情看成作业多于看成项目,而实际上也是这些客观实际让我不得不有这样的想法——一个人要做好一件事,必须得拥有高度的集中力,要集中精力、专心致志地研究它并全力为它奋战,而我们这个学期基本每个时刻都手握3、4个大作业任务,每星期还要去写2、3个繁琐的小作业,这些任务,每个对于很多入门计算机才2年的我们都不轻松,课上没有讲python、java、android、node,没有清楚操作系统底层驱动怎么写,我们都得一点一点靠网上资源、靠看教程学过来,没有专业的老师,而且同时还得学多样东西,这样就导致我们花了很多时间,但最后不仅学得不系统也不深入,感觉就是用到了什么组件就去查网上别人怎么用这个组件,这种用什么学什么的方式久而久之就会体现出基础的薄弱,学得一点都不扎实。(最后我发现这个学期我们作为学生却不是在学东西,而是做一堆杂七杂八的项目,然后为了做这些项目而学各种编程语言和实现方法,感觉有违我对本科生该做的事情的理解)
所以我确实很感谢软工课给我带来的成长和项目开发经验,但同时也对软院的这种多并发大作业+加作业主导的自学的课程模式感到深深的疑惑。其它年级就不说,但感觉课改之后,给大三年级的压力就更大了,真正有认真做大作业的人,其实这学期都没有周末,也没有白天和黑夜的区分,时间都花在课程和作业上,要么就是没有精力做自己想做的有意义的事情,要么就是强行在课程之余还做多件事情,最后把自己活活累死,身体和精神状态都比学期初有极大的下滑(几个典型的人有XZR、LTT、GZL等等)。而且课改后我们比上一届的大作业并发情况更加严重,原来还有的软工课虽然有两个大作业,但大致还是“串行”的,而且刘璘老师的课堂只集中于文档的编写,而这学期就变成并发了,软工被拆成了两门课,两门都有文档也都有编程大作业,而且两个大作业每一个都不轻松,不仅要求挺高,检查也挺严,都要付出很多精力;另外,本学期的计算机原理的实验作业提交日期也比去年提早了一个多月,再加上课改后软基2的Haskell每周都有繁琐的编程作业,时不时还有一次包含“恶性竞争”的小型大作业——总感觉我们并发量有点高得hold不住了,而并发量一高就经常要中断,要在不同的作业中切换,根本无法好好集中精力做好任何一个任务。我觉得这就是我们这一届做课程作业普遍做得哀鸿遍野的一个重要原因。
我一向有话直说,所以上面的这些真实感受也许对老师来说会比较刺耳,但确实是我们这届的普遍情况,我不想把这些真实的感受藏着掖着尘封在腹中。课改不易,就像前端一样,怎么改都有人不满意,说不定还事与愿违,越改越糟,但总觉得课改并没有在我们这一届得到成功,这种重压模式或许是我们学院,或说清华大学的特色,但也正是这样,扼杀了我们很多其它的可能性,为什么说清华大学是国内名牌大学却没法出现比尔盖茨与乔布斯?为什么有时候我们清华软院的同学也比不过别的学校的一些学生的编程水平?这个复杂的问题真的需要深思一下,我想“束缚”与“自由”应该是两个必须提到的关键字,这把双刃剑的使用确实要好好考究。
感觉扯得有点远了,最后还是回到软工上来——虽然一个学期基本都是在“紧张”和“痛苦”中度过的哈哈,但说归说,还是非常感谢刘强老师的指导(以及请吃的3顿饭哈),如果没有您,我们可能连接触一个真实的小型软件项目的机会都没有,我知道我们累,老师您更累,也心烦,也会经常想“以后再也不像这学期那么折腾了,费了大量心力来给我们找来实际项目的机会,还煞费苦心做了那么多协调工作,最后不仅项目做得很不完美,让人羞愧得不怎么拿得出手,而且还吃力不讨好,受到那么多学生的非议,学生意见还挺大的,以后再也不拿实际项目到课堂来做了”。我想,或许拿不拿实际项目到课堂来,拿什么项目来,该抱着怎样的期望等问题,确实值得进一步推敲,但是这学期老师做的工作之多、之辛苦、之意义,是绝对无法否认的,我们最后的成长,老师您真的功不可没——所以您不仅是经常用分数来吓唬威胁我们、push我们的大Boss,更是我们在编程上经验丰富的导师,开发上重要的指导顾问,更是项目中的亲密战友~我在这学期的两次展示中“哗众取宠”,黑了老师您一遍又一遍(都是展示需要,玩笑话不是真心的,求别揍我~),也算是跟您结下了很深的“梁子”,希望日后我们回想起这一学期,不只有没日没夜的编程和殚精竭虑的协调,老师您回想起我时也不仅只记得我这张“厉害”的嘴巴,我更希望这段经历能成为我们共同的、手把手走过的一段重要的人生道路。
期待以后还有机会跟老师您(以及助教们和我可靠的小伙伴们)进行愉快的合作,到时还请老师手下留情啊~
2014年12月29日
钟仰新笔
以此纪念我们逝去的软工课^^