BU AAOO 第四单元作业总结

🤗🤗第四单元总结

架构设计

此次作业的架构采用层次化设计模式,划分层次的原则按照UML逻辑,

即总交互类MyGeneralInteraction下分类图交互类MyClassModelInteraction、顺序图交互类MyCollaborationInteraction和状态图交互类MyStateChartInteraction

而以类图交互类为例,管理了MyClass类,MyInterface类。这二者除了继承MyElement类外还额外实现了MyClassModel接口,具有一些类和接口的共性方法,如添加新方法、添加新属性等。

作业中要求的各项任务都逐级下方到底层实现,并采取了大面积的缓存机制以防止第三单元的超时现象发生(不过好像多虑了)坦诚来讲,我缓存了一切我认为能缓存的东西,所有的非dfs操作能缓存我坚决不让他多跑一遍,于是我最后dfs忘做标记了。。。

总的来说还是对时间复杂度把握不准确,不能准确判断哪些该做缓存哪些不该。

四次架构设计与OO理解演进

通过反思,我认为这四次作业反映出我对面向对象架构的理解都停留在通过”语义“做设计的层面。

第一次多项式求导在设计时就按照多项式的组成层次进行架构,虽然已经运用了工厂模式,但仍有很多地方输入、处理、求导、化简、输出等模块并没有做好低耦合。

第二次多线程电梯引入“生产者——消费者”模式,但是出现了一个线程”控制“另一个线程的不良设计,究其原因也是在架构思考方面仍更多地依据如“电梯”、“乘客”、“队列”等现实生活中有真实意义的事物进行功能的拆分,没有对OO有深入的理解。

第三次作业在架构设计方面是一个倒退,完全没有进行架构设计。

第四次作业如上所述也主要是按照UML的层次进行架构,可能会存在一些繁琐之处。

综上所述我认为我离真正的面向对象还有一定距离,还需要不断学习才能真正领会“面向对象思想”这种“只可意会不可言传”的东西。

四次测试理解与实践演进

坦诚来讲,总体上四次作业我做的测试越来越少,这和很多因素有关。

第一次作业我学习了批处理、学习了sympy库,写测试比写代码付出的时间还多,掌握了基本的黑盒测试的写法。

第二次作业初探多线程黑盒测试,关键点在于如何实时输入,如何进行正确性检测(采用没有错就认为是对的逻辑)。此次作业并没有很积极地写测试,最后写完也没有很积极地去测,最后出了很显然的bug,追悔莫及呜呜呜。

第三次作业经历了JML测试从入门到放弃。一开始为了追求覆盖率我给每个方法的大部分情况都写了测试,累掉了我半条命,意识到了大面积进行这种测试实在是性价比很低。后来几次作业主要依靠同学写的对拍代码进行测试(感谢神仙们捞我),体会到了对拍在测试中的神奇之处。

第四次作业肉眼+徒手测试,每次写完靠通读代码debug,最后一次作业自己画了几个可能的情况测试,然后图的遍历又翻车了。

总结以上经历,得出以下几条教训:

  1. 要做测试,偷懒肯定完蛋
  2. 黑盒为主,白盒为辅。用白盒去覆盖核心要求,用黑盒去覆盖白盒覆盖不到的部分
  3. 验证结果可以借助python生成正确期望输出进行比对、可以采用“没错就是对”检验方法、也可以抓个同学对拍

课程收获

  1. 在吐槽OO的过程中收获了真挚的友情

  2. 学会了写一点JAVA

  3. 熟练掌握了如何在CSDN和博客园上自学

  4. 抗打击能力显著提升了!

  5. 开课前很好奇怎么做测试,结课后会做基本的自动化测试了

  6. 初始多线程,对周围很多事物一下子有了新的观察视角,坐电梯的时候也开始忐忑不安

  7. 复习了数据结构和离散数学和高中数学,熟练掌握了如何求导、如何写bfs和dfs

  8. 认识到了一个用心负责的课程组可以带给学生们多么新奇的课程体验

  9. 对“设计”有了更切身的体会

  10. 认识到了不好的工具链是真的不好

  11. 好像还学习了面向对象的思想吧?

温馨建议

本人第三单元博客写了一些算不上建议的建议,稍加修改搬运至此。

  • 关于课程组引入JML

    按照课程组的设计,第一单元训练面向对象思想以及层次化设计,第二单元训练并发、多线程,第三单元训练规格化的面向对象设计,第四单元训练模型化设计与管理。

    在网上搜索规格化面向对象,能看到的基本上都是学长学姐的博客。我不清楚是只有北航在教这样的东西还是在教这些的学校中只有北航选择让学生进行博客总结。不管怎么样,我的直观感受是课程组很用心的在进行课程设计,选择了“少有人走的路”。

    诸彤宇老师在研讨课上提到,以后和面试官可以吹,我是北航毕业的,我可以给程序做形式化验证(大概意思我没记错吧)。

    OO课无疑是一门精品课程,规格化面向对象设计或者是JML都是别的地方不一定会教的。OO课,而不是基于JAVA的面向对象程序设计课,向我们展示了各个维度的面向对象设计思想,但我觉得还有很多地方需要改进。

    其实在计算机组成原理课上高小鹏院长就像我们初步讲授了“工程化”相关的知识,但和OO课不一样在于计组没有单开一个单元去让大家理解(计组课不是由不同单元组成的,而是迭代式的),而是在用verilog写CPU后提出了这种方法。最典型的是给出用表格做设计的示范,并且要求每个人实验报告中都附上表格,结果是大部分人都确实觉得”工程化“确实是一种降低难度、减少错误、提高效率的方法。

    我觉得OO的规格化思想某种程度上其实也差不多,其功效可能更多地体现在便于测试从而减少错误、为合作提供可能从而提高效率。但如果从实现到测试都由一个人完成,JML的功效似乎并不能发挥出来。

    课程组一直在鼓励我们使用JUnit测试,但是本次作业中错误主要为两类:规格理解出错、算法超时。

    如果是规格理解出错,那写出的测试也是错的。就好比交卷前自己再审一遍题检查一遍,可以找出错吗,当然可以,但效率是在很低。如果读JML写代码的和读JML做测试的不是一个人,效率应该会更高。或许课程组可以考虑加入合作的成分,否则JML显得很多余,远远没有对拍效率高。

    如果是算法超时,那跟JML关系就微乎其微了,JML不管这一点,这也是让我很迷惑的一点,这单元对算法的要求是不是有点跑题了,关于此我下文会再述。

    与此同时,面向对象思想应该是贯穿整个课程始终的,在这个单元大部分同学似乎都在翻译JML,很少去思考这种工具在面向对象方面起到的作用。一切设计和编写JML都是课程组完成的,很好地训练了助教的相关能力,而同学们就是翻译翻译JML,研究研究算法。可以说是课程组完成了大脑的工作,我们大多数人都扮演了躯干的角色。

    可能课程组会说,我们强调过了要自己思考架构,不要一味的照着规格写代码。

    首先,我不怎么记得在第三次作业结束前,有针对作业强调过我们的作业本意是让你自己去设计规格的(可能我听漏了吧)

    其次,我觉得更好的课程设计是用某种方法引导学生走合理的路,而不是告诉学生有这条路。毕竟现在资源如此之多,谁都可以拿到,而课程组存在的意义就是推我们一把,不知道我理解的对不对。

  • 关于JML工具链

    我觉得课程组选择JML挺好的,并没有因为它存在感低而放弃这样一个适合上手的工具,也说明是用心找过的,而不是“拿来主义”。但是JML工具链的生态圈实在是太差啦,为什么还一定要求使用呢。

    本身用JUnit测试在此次作业中就显得很多余(如上文所述),还一定要用不好用的工具做多余的事情,太痛苦啦。课程组或许可以考虑自己开发开发(站着说话不腰疼)。计组选了MIPS,提供了够用的MARS;OS继承着使用了MIPS,照着JOS改成了我们BUAA的OS,建议OO课要么不强r制使用工具链,要么抄一抄做个能用的工具链

  • 关于课时

    我觉得前两个单元不是说三次作业写完就能彻底领会面向对象思想的,而JML写三次作业却显得有些多了,或许可以调一下。好像往届这单元就有不是三次作业的,课程组可能有自己的考虑吧。

  • 关于互测

    互测其实可以实现写代码和写测试分离的效果,或许可以要求每个人有不同的实现且编写自己的JML。互测时通过阅读别人的JML来测试。但是如果不管怎么设计最终都有个标答的话,黑盒评测姬还是效率更高,不需要都别人的JML都能hack。但如果没有标答,而且还不是多线程那种,而是正确与否只取决于此人写的JML,就又太不现实了。或许可以让数人合作完成整个程序,每个人根据JML进行一部分实现,之后以小组为单位进行对抗。但这使得给分又是一个难题,而且听起来很像软件工程。但是我个人理解JML就是很工程化的东西,不放在工程化的场景里就显得有些小才大用。

    以上都是我的胡思乱想,缺乏细致、整体的考量,如果有人看到的话,就当看个乐子吧~

希望OO越来越棒~

线上体会

自制力在肉眼可见的在流失

第一次作业:学习热情高涨,把路上通勤时间都用在了debug上。当时在想,如果是在学校,我肯定没有这么多时间来写代码。

第二次作业:学习热情开始流失,有点不想写测试,但是还是写了。有较认真地研究电梯算法。

第三次作业:对学习完全没有了热情,迫于ddl还能按时完成作业。但是测试代码部分都是靠大佬对拍捞的。

第四次作业:在彻底丧失学习热情的基础上几乎丧失学习能力,注意力难以集中超过10分钟,每次作业都是卡着ddl完成的。

除此之外,和同学们交流都改成了线上,微信群成为了不可或缺的信息获取地,但是难以判断消息的准确性。比如大家都说自己在摸鱼,但是谁知道是不是只有我一个人在摸鱼呜呜呜。

同时也难以一睹诸彤宇老师的真容,但我相信诸老师真人应该是很帅的👍

总的来说我觉得有点可惜。一学期下来少见了很多面孔,少了很多形式,一切都被压缩到一个屏幕上展开。虽然居家学习本身也是一件很特别的事情,但是总觉得缺少了一些生机和色彩。大学生活应该是时人生中少有的自由自在的时间段了,但是这学期能够浓缩入回忆的画面实在是很少。我还没见过学院路的春天呢,这一切本来是要在春意盎然的校园中发生的啊😂

posted @ 2020-06-18 10:40  熊猫熬夜不伤神  阅读(136)  评论(0)    收藏  举报