记一次失败的项目经验

2022-07-11

项目内容

对内部员工使用的 OA(Office Automation 办公自动化) 系统进行为期一个月(2022-06 ~ 2022-07)的样式调整,统一样式,两周用于测试。

项目人数三人,一个跟着当前项目工作了一年的后端开发(bt),一个刚转正两个月的萌新(我),一个刚招来的前端开发(sd)。

项目样式调整前工作,几个复杂界面的 UI 设计图以及一个开发进度安排。

系统概述

当前系统使用 SpringBoot + Thymeleaf+ Bootstrap4 + jQuery 打造而成。HTML 页面中充斥着对 DOM 节点的操作,各种难以维护的代码逻辑,随处可见的复制粘贴原封不动的代码,没有封装,没有模块化,没有抽离成单独的 JS 文件或单独的 HTML 文件或 CSS 文件。CSS 大多内嵌在 DOM 上,大量重复的 CSS 样式堆叠在页面最上方显得单个文件行数格外的多。没有统一的代码风格,没有统一的模块使用,例如表格控件使用了 jQuery DataTable 和 Bootstrap DateTable,弹框更多,整个代码框架显得非常凌乱。

简而言之,这是一个老旧项目,维护起来有一定的困难。

项目开发

由于前期根本没有做系统的整体框架调研,直接开始埋头改代码,因此在第一周的时间里面只简单改了列表页和编辑页,边改边调,问题非常地多。个人认为在修改之前应该面对现有的问题(即样式统一调整)给出多个解决方案(例如表格、弹窗、消息统一使用哪个库,哪种修改策略能使风险降低 —— 风险评估) —— 往往第一个解决方案不是最好的。

刚好前一个月读完了代码大全,因此第一周一直就是一个心态,不要急着写代码不要急着写代码不要急着写代码。事实证明确实如此,由于没有统一就开始修改,导致反复多次进行修改,拉长了战线,也降低了成员的积极性。先想好了怎么做再去做往往比边做边想更有效率。

第一周结束之后,稍微有了一个统一的修改模板。第二周我开始了修改框架源码的道路,由于模态框使用了 artDialog 也有 bootstrap 的 modal,统一为 bootstrap 的,因此我修改了 artDialog 渲染弹窗的模板,它使用的是 table 布局,自定义类名只能加在原有类名最前面,因为内部使用 split 来获取 DOM 的映射关系,放在后面就会更改 DOM 的名字导致不起作用。

第二周结束,我们大致修改了两三个大菜单下的页面,组长检查了修改的页面提了很多问题,因此我们边改边继续着接下来的大菜单。这一周我研究了 jQuery DataTable 的 fixColumns 插件的源码,原因就是当前表格在固定最后一列的时候表头在 x 轴滚动条滑动的同时会跟着滑动,急需解决。然后我查看官网发现官网已经给出了解决办法,因此我提议更新当前插件的版本,并且修改了源码(读取表格的滚动条,并在表头最后生成一个滚动条宽度一致的块)。这周分给我系统管理菜单下的用户管理、部门管理和岗位管理。树结构用的 zTree,研究了半天发现简直就是个垃圾,不如自己写一个,可以这么说,我觉得我实习写的树结构都比它好使。这一周的开发效率挺高的,因为有了前两周的修改经验,而且修改的模板也逐渐趋于统一。每一周结束检查的时候,组长都会提一些修改建议,点也是越来越细,需要修改的问题也越来越多。PS:有些页面表格使用 td 拼接,与逻辑交织在一起导致无法修改,修改风险 max,因此会选择最小侵入式修改(简单改改类名和 CSS)。

最后一周,我写了两个工具类,一个是计算表格高度使得适配整个页面而不出现滚动条。第二个是在 AdminLTE3 IFrame 插件基础上,添加新增 tab 栏,关闭 tab 栏等方法,这样子在 iframe 内也能支持点击新建 tab 栏了。还写了一个公共方法,在搜索栏太高的情况下,添加收起和展开搜索框的功能,成就感还是蛮大的。

还有一个重要的事情,那就是代码合并,由于我们进行样式调整的同时,仍然在开发新功能,导致代码合并冲突非常多,而且这次采用的合并策略是最后进行一次合并而不是持续集成。不过最后组长一个人进行这个事项,降低了我们的工作复杂度,但是一个人真的太难了,最后我们也是在合并好的代码后检查,不对的和新开发的地方进行修改调整。

还有两周测试时间,测试提交问题,我们进行修改。

总结与展望

In my opinion,本次主要的问题有:

  1. 没有做系统调研就评估了工作量,显然评估错误,页面过多有些过于复杂,导致不能在保证项目完成的前提下,照顾到每一处细节。
  2. 在代码修改之间没有提出统一的调整模板而是边改边统一,导致进度缓慢以及提高了复杂度。
  3. 没有做风险评估,修改过程全靠开发者来评估风险以及承担风险,或许能引入代码审查和结对编程来降低复杂度,但是这样提高了成本。
  4. 代码集成策略不应是最后一次进行集成,而应在每周上线,合并 master 分支代码,降低复杂度

软件工程的目的就是降低复杂度。一个好的管理者或是领头羊对于一个团队来说真的非常重要。最近在读《Software-Engineering-at-Google》,感觉很多都还不是很懂。好好学习,天天向上,将来我也要有自己的团队。