软件工程M1/M2总结及阅读作业总结
一、软件工程M1/M2总结
写下这篇总结的时候,我们的软件项目尚未完工。虽然尝试申请了延期答辩,但最终未能成功。这意味着,我们的项目能否正常发布已经处于了一个微妙的状态。可能可以,也可能不可以。只能尽力而为了。
整个一学期的开发下来,我在软件工程方面体会最深的是成本问题以及技术债。以前写的项目往往没有特别严格的deadline,很多是个人的随兴而写的东西,写不动了就不写了。又或者是作业,最多也就那么一千行,怎么都是可以写完的。而软件工程这门课的团队项目,7个人,一个完整的网站,特别是对于我们这个由4个组合作的大家伙,和以往写的东西完全不是一个概念。因此,就需要团队管理,需要设计,需要每一个人的努力。
先说说成本问题吧。我们的项目从一接手就做出了一个非常“大胆”的决定,我们决心完整地重写这个项目。原因我们自认为很充分:学长代码里坑多,分析代码需要很多时间,技术栈太老等等。现在看来,这个决定有些初生牛犊不怕虎的感觉。当时没怎么纠结就定下来了,我们并没有觉得重写的成本有多高,而且对于自身团队的力量极度自信。如果现在要我重新来做这个决定,我肯定不会再像当初那样轻率,虽然,我依旧可能倾向于用全新的技术栈重构整个项目。迁移方案,如何与其他组兼容协调,开发能力,团队组织能力等等,各方面因素都应当考虑进去。而当时,仅仅考虑了很少的几个点,就决定了重写整个项目。直到后来才慢慢地理解到,有些东西的成本和代价是相当高的。
另外,除了开发成本之外,我还亲身体会到了软件的修改成本以及技术债。我们的第二个阶段几乎重构了所有的代码,原有的HTML和部分Python代码大多都迁移成了JS/JSX代码,换句话说,我们的M2阶段几乎把所有功能又都重写了一遍。之所以会产生这样一个结果,是为了解决第一个阶段所遗留下来的一个问题:四个组之间的衔接。在最初设计时,我们没能及早地意识到组间连接的复杂性。在M1阶段,当我们真正遇到衔接问题时,并且被这一问题卡住了以后,才发现这个问题的严重性。虽然靠着团队的努力,顽强地完成了第一阶段的开发,但也为第二阶段留下了很大的问题:我们必须在第二阶段完成组间衔接。作为架构师,在重新做设计地时候才发现,想要修正最初在设计阶段犯下的错误,成本相当地高。为了和APP组共用后端,我们需要将整个基于Django模版的网站迁移为基于ReactJS的单页应用,同时,将之前的搜索和数据部分大部分改为和Solr衔接。这样才能和其它组完全衔接上。这一方案对于四个组来说是相对改动较小的方案,前两个组只需将结果插入到Solr中即可,但前端,也就是APP和网页前端都需要做大幅的变动,以适应一个统一的后端。而其中,又以网页端的改动幅度最大。
其实,也并非没有简单地衔接方案:比如直接开发段小程序,把第二组的数据库的模型转换下插入到我们的数据库中。这样,开发成本能够小很多。但手头满满变成个大泥球的代码,特别是混乱地HTML和JS,都在告诉我,如果就这样写下去了,那么,以后会越来越没法维护的。也许是处于所谓的情怀或者一些说不清楚地情感,最终,我们还是决定采用一个大胆而完美地解决方案。也许代价很高,但是架构的可扩展性以及可维护性都很好,技术栈也很新很漂亮。这样,当下一届接手的时候,就不必再为如何完美地接上,如何扩展现有功能而苦恼了。而且,我们希望,数年之内,这一架构可以很好地适应新的需求以及技术热点:分布式、云、前端模式的变化等等。
最后,我想总结的是团队。M2阶段对于团队是一个巨大的考验。M2阶段由于时间严重不足,对于团队的压力非常大。有些团队甚至就集体放弃了。或者只剩下一两个人还在顽强地支撑着团队。我们的团队能够顺利地将页面重构成单页应用,与我们这个团队的特点也很有关系。我们团队的所有人都非常靠谱,这种靠谱不光是态度上的,同时也是能力上的。团队成员在能力上很强,能够应对新技术的挑战。另外,每个团队成员都很负责人,交予的任务都能尽全力去完成。所以,团队能够接受一些新的技术。这次软工的经历使我深深意识到,有怎样的团队,就做怎样的事情。如果团队本身的能力有限,那么在最初设计方案的时候就应当考虑到团队能力的问题。
二、阅读作业
提问博客链接:http://www.cnblogs.com/fzyz999/p/4831068.html
请说明哪些问题现在自己已经清楚了,请阐明一下,是如何通过看书,实践,或者讨论弄清楚的。
1. 软件工程是否是更为正确、可靠的软件的正确方向?软件工程的目标是使得通过工程化的方法,可以在合理的时间内,以足够高的质量完成相应的目标。但 最近函数式语言的重新流行也使人不得不思考这样一个问题:构建正确的软件能否存在其他的方式?目前的一些纯函数式语言甚至可以采用一些工具进行机器辅助证 明。我们如果能用形式化的方法描述该软件的行为和特性,之后便可以让机器辅助证明软件是正确的。例如seL4这个微内核就是采用这种方式证明其正确性的。 相较于单纯的测试而言,这样的方式得到的程序更为可靠。那么这是否是未来发展的一种主流方向呢?软件开发是否会逐渐由手工艺转向一种更为工业化的模式?我 们不仅可以创建“足够好”的软件,更能创建完全正确的程序?
未弄清。感觉这个问题很大。经过软件工程的学习,感觉会的东西更多了,理解的知识也更多了,但软件未来的发展方向如何,还是没法给出自己的观点。也许随着学习的进一步深入,理解的东西更多一些以后,就能够看清这个问题的答案了。
2. 在个人软件开发流程中,代码复审的意义究竟有多大?代码本身就是我们自己写出来的,很多在我们设计时就存在的逻辑错误,通过复审并不见得可以发现。毕竟,我们一度认为那些逻辑是正确的。个人的复审仅仅能够处理手误或者是一时的疏忽,但对于一些根本性的设计问题,也许无从下手。那么如果我们直接进 入单元测试等阶段,直接通过调试错误来定位代码中的逻辑问题,是否比复审更具有性价比呢?
这个问题助教在评论中给了一个答案,我觉得这个答案很合理。过一段时间重新审视一下自己的代码是很重要的。经过软件工程以后也有这个体会,项目最初的时候很多东西不太会用,后面慢慢用得熟了,理解得也多了,再看之前的代码,确实会感觉自己之前的代码有些不好。因此,个人软件开发流程中,代码复审也是有意义的。
3. 针对最近频频爆发的信息安全问题,我们能否从软件工程的角度提出一些应对措施?比如在设计、复审等阶段是否存在一些方法可以大幅提高软件的安全性?
如果安全是一种必须的需求,那么我们在最初设计的时候,就应当将安全作为一种需求。在设计和分析阶段需要进行相应的设计。另外,老师在评论区的回答也很值得借鉴。特别是最近XCode Ghost爆发以后,我们确实应当尽量从官方网站下载相应的工具软件。
4. 在《构建之法》中,我们关注的主要是一个一般的开发团队所面临的一些问题。那么对于像开源社区这种与传统的商业软件团队有明显区别的团队,在某些方面是否会有不同、乃至完全相反的情况发生?开源项目中的质量控制、bug修复、用户体验等等各方面是否会有截然不同的一些样貌或方法?
这个问题依旧没有弄明白。个人虽然很热爱开源,但未能参与过大型的开源软件社区中的开发。对于开源社区的模式缺乏了解,所以这个问题依旧没有得出答案。
5. 用户需求往往是在不断变化的。我们应当如何把握软件在哪些方面因留有扩展的余地?或者说,怎样的设计是合理的?怎样就会引发过度设计?如何把握好扩展性的度?
对于有需求变化的,我们也许应当采用快速原型的方法。先快速地将软件做出来,然后让用户自己发现问题和需求,之后,根据用户的建议,来决定哪些部分可扩展,那些地方不需要扩展。
请问你们在项目的 需求/设计/实现/测试/发布/维护
阶段(一共6 个阶段)中都学到了什么 “知识点”, 每个阶段只要说明一个知识点就可以。
需求阶段:需求分析需要完整地分析出来哪些功能是重点的,哪些功能是可以砍掉的,用户真正的需求是什么。
设计阶段:设计阶段尤为重要!设计阶段尤为重要!设计阶段尤为重要!重要的要说三遍。特别是接口设计,架构设计等等,一旦出错后面将会面临极大的改动。
实现阶段:实现阶段重点在于控制进度。如果进度控制不好,可能最后项目就会崩溃或者跳票。
测试阶段:测试阶段重点在于自动化。自动测试等等很重要。
发布阶段:发布阶段发布的产品必须经过严格的测试,否则给用户的体验会非常不好。
维护阶段:维护阶段其实极度依赖测试,必须通过严格测试保证维护后的代码不退化。
软件工程M1/M2总结及阅读作业总结的更多相关文章
- 个人阅读作业 --软件工程M1/M2总结
软件工程M1/M2总结 写在前面的话: 这学期的软件工程伴着考期的展开逐渐落下帷幕,回顾这学期的软件工程,我感觉我的热情在一次又一次的失落中逐步消耗殆尽,每个人对于这门课的体验都会有所不同吧,可以确定 ...
- 【个人阅读】软件工程M1/M2阶段总结
这次作业是好久以前布置的,由于学期末课程设计任务比较重,我在完善M2阶段的代码的同时又忙于数据库的实现和编译器的实现,一度感觉忙得透不过气来....到这些都基本完成的时候,会看自己以前的阅读心得,觉得 ...
- 【个人阅读】软件工程M1/M2做一个总结
1.以前博客链接 http://www.cnblogs.com/penglinjiang/p/4027850.html http://www.cnblogs.com/penglinjiang/p/40 ...
- 软件工程M1/M2总结
也不分M1/M2了,就从头到尾的梳理一下这学期的软工课吧. 第一节课,老师就稀里哗啦说了一下这学期要怎么搞,什么个人项目啦,结对项目啦,团队项目一二啦,还要组队啊什么的,然后风风火火的组队. 个人项目 ...
- 【个人总结】软件工程M1/M2总结
个人博客连接: http://www.cnblogs.com/lwq12061168/p/4094252.html http://www.cnblogs.com/lwq12061168/p/40284 ...
- 个人阅读作业——软件工程M1/M2的总结
临近学期末,本学期的软件工程课也已经结束了,在此我对软件工程课中,我们团队M1和M2开发阶段中,我做的工作做一个总结 我是DEV,主要工作是等着上级给我分配任务,但是很多时候如果这个活我不干,其他人就 ...
- 【个人阅读作业】软件工程M1/M2总结
链接:”看<快速软件开发>的五个问题“ http://www.cnblogs.com/leiyy/p/4027759.html 一.较为明白的问题 1. 在文章的第一个关于Square_T ...
- 个人阅读作业 The Last
对于软件工程M1/M2的总结: 假象-MO 在团队开发的前期,我感觉自己其实给了自己很多的期待,因为一直希望着自己可以在团队中担任一个角色,用自己的力量为团队多做事情,也给了其他人一些假象,那就是看起 ...
- final个人阅读作业
一.软件工程M1/M2总结 1.M1阶段总结: 我们团队的软件工程开发是按照前后端来分别开发的,我是负责后端的.我们的项目是做一个北航的社团平台,是一个网站.在后端我们使用的是ruby on rail ...
随机推荐
- January 18th, 2018 Week 03rd Thursday
To strive, to seek, to find, and not to yield. 去奋斗,去寻觅,去探索,但绝不屈服. Strive for our dreams, seek the ve ...
- [TJOI2018]教科书般的亵渎
嘟嘟嘟 题面挺迷的,拿第一个样例说一下: 放第一次亵渎,对答案产生了\(\sum_{i = 1} ^ {10} i ^ {m + 1} - 5 ^ {m + 1}\)的贡献,第二次亵渎产生了\(\su ...
- linux 的常用命令---------第十一阶段
软件管理rpm.yum 在 windows 与 linux 之间 实现小文件传输(仅支持在 X shell 中完成文件传输,虚拟机中不可实现): # yum install lrzsz -y ...
- sw-stream
https://github.com/kumavis/sw-stream ServiceWorkerStream and ServiceWorkerGlobalListener This a util ...
- day10,11练习
1.执行Python脚本两种方式? 略 2.简述位.字节关系? 8位一个字节 3.简述ASCII,Unicode,utf-8,gbk关系? ascii unicode utf8 4.请写出李杰分别用u ...
- nginx反向代理与Real-IP和X-Forwarded-For.txt
本文作者张开涛.为保障<亿级流量网站架构核心技术>一书内容的连续性,有些需要读者了解的内容,或者书的补充和引申内容,会通过二维码嵌入的方式引导读者阅读学习.大家可以关注作者公众号“开涛的博 ...
- rac添加新节点的步骤与方法
[转载] https://www.cnblogs.com/hankyoon/p/5174465.html OS: [root@rac ~]# more /etc/oracle-releaseOracl ...
- Oracle 11g中的snapshot standby特性
在Oracle 11g中,data guard最吸引人的,除了active data guard的实时查询特性(即可以以只读方式打开物理standby数据库的同时MRP进程能继续做recover),快 ...
- 动态分析Android程序
快速定位程序关键点 代码注入法 插入log函数,输出调试信息. const-string v0,"TAG" const-string v1,"info" inv ...
- Echo团队Alpha冲刺随笔集合
班级:软件工程1916|W 作业:项目Alpha冲刺(团队) 团队名称:Echo 作业目标:完成项目Alpha冲刺 代码规范.冲刺任务与计划 Day 0: 代码规范.任务及计划 冲刺随笔 Day 1: ...