Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2014-01-08) 项目困境

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

今天又是饿着肚子在公司加班到九点多才回去,情绪非常低落。感觉当前的项目已经陷入了困境,不知道如何是好,对目前这种状态也非常的无奈。

从七月份过来,在这个项目上已经快半年了,也许年后就会撤离。我以前没有参与过像现在这种状况的项目,所以迷茫过,思考过,努力过,但是到了现在,更多的是一种无奈感。

大概从两个月前开始,我们这几个派到这个项目的成员就进入了每日加班的状态。八点离开算是比较早的,通常都会在九点左右,而在每个sprint快结束的两天,基本都是11点多才走。更郁闷的是,因为客户公司位置比较偏,四周连快餐店也没有,所以都是饿着肚子,吃点小东西垫一下。

如果加班是在爽快的写代码,但是没什么可抱怨的,但实际情况却是把时间和精力花在了各种让人心情不爽的事情上。

一、本地编译和测试,实在太漫长了

每个人在把代码push到git repo前,都需要先在本地跑一遍测试,都通过了才能提交:

./gradlew clean build

需要10分钟!如果中间再出个错修一下,再来一次,半个小时就进去了。最郁闷的就是,好不容易跑完了,git push,结果发现被人抢先了,只能重新pull,再merge,再跑测试,再提交,超级浪费时间。

另外,在一个有十多人提交的团队里,如果你不尽快push,就只能在本地攒着很多commit,等到push的时候merge是少不了的,一个不小心就把代码搞坏了,再一点点的修真让人欲哭无泪。但如果尽快push,那就意味着要经常在本地跑clean build,而那每次10分钟左右的时间是跑不了的。

这10分钟花在哪些方面了呢?

  1. 项目由十多个module组成,每次clean build,都需要先删除所有临时文件,然后处理资源文件、编译代码、跑单元测试、集成测试、打包等。module越多,意味着步骤越多,时间越长
  2. 集成测试需要连接到远在国外的数据库和存储服务器上操作,有时间一个测试要跑半分多钟
  3. 有一个测试专用的module,里面有几千个文件,需要打包,要花不少时间
  4. 程序运行于windows xp上的cygwin中,超慢

项目一开始用的是maven,后来改成了gradle,但运行时间并没有多少改善,只是代码灵活可读一些。

二、每个人的测试都可能受别人的影响

如果每个人的环境是确定的,10分钟到也不是不能接受,更大的问题是:每个人的测试都可能因为别人的操作而失败!

因为测试中依赖于外部的jms server,数据库。对于jms,每个人都有自己独立的帐号,但也难避免有人误操作把自己的数据误发送到别人的broker里,导致别人的测试失败。数据库更惨了,大家用的都是同一个帐号(因为客户公司的限制)。如果有两人同时在跑,很可能就会有人失败。所以整天经常能听到有人在吼:“是不是有人在跑本地测试?!”

对于数据库的问题,我们早已申请多套帐户了,但直到现在也没有下文。我们还申请在本地安装数据库,在长久的等待之后,IT们终于在今天装上了,但好像装的不对(只管装,不管对),没法用。

这只能再催那些IT老爷们了。要知道,在这里提出一个请求,合理的响应时间是按周算的。

三、CI灯一红一整天,不敢提交

我们安装了CI灯来监视Jenkins上的pipeline,如果失败灯就是红的。现在的情况是,一天中有大半天是红的。

原因很简单,在本地跑测试实在太浪费时间,而每天的任务又很多,所以不少人偷懒,觉得自己改的没问题,直接就提交了,红了之后再修。

还有就是有些测试太费时间,所以在本地跑测试时就把它们跳过了,结果到Jenkins上跑全套时才发现问题。

修的时候要现场分析原因,看是自己改错了,还是别人跑测试影响了自己。修完之后自然就要老老实实的跑完全套测试才敢提交,又要花不少时间。这样一来一回,平均红一次要修一个小时,还没绿一会儿又红了。

今天我好几次想提交代码,发现灯都是红的,只好等,一直到下班攒了十几个commit才有机会提交。然而出现了merge上的问题,再加上多次跑测试,一共花了我一个多小时,才把代码提交上去。

注:由于红光太刺眼,我们拿白纸给它做了一个套子罩着。

四、坑爹的sign off测试

客户要求,对我们完成的每一个story,在当前迭代结束时,都要进行验收,达到他们的认可才给sign off签字。而他们的验收测试,是“自动化的端对端测试”,即写一套测试工具,通过脚本启动产品系统,然后模拟外部系统向产品发数据,再到数据库、存储服务器中检查产品是否写入了正确的数据。

这种测试非常脆弱,因为每一个sign off过的story中的代码,在做其它story时都可能修改。另外外部依赖的数据库,jms server等,很容易受影响出错。一旦出错,麻烦事就来了。因为测试人员需要从四个方面考虑出错的原因:

  1. 产品代码有误
  2. 测试工具的代码有误
  3. 提供的测试数据有误
  4. 测试环境被人影响

然后打开长长的各log文件,根据错误日志去跟踪代码的处理流程,一点点排查。往往解决一个问题就花一天,然后第二天又伤心地看着它又出错了。

哦,我还忘了说,测试人员一下子提供了2000多种不同的测试数据,一条条测,一次下来需要一个半小时。所以test pipeline基本上都没见绿过。

这还是在项目的开头,就把三个测试人员忙得不行了。而马上还会有基于页面元素的模拟手动操作的测试,而且每个迭代过后,都会多出几十上百条新的测试。。。

我只想说,测试人员,你们实在太命苦了。(我会告诉你,在两周之前,所有的测试工作都是我做的吗?!好在现在被新加入的测试小组接手了)

五、奇慢无比的cygwin和git

我们的工作机是windows xp,上面装了cygwin,cygwin上装了git。可怜的git,现在被拖累得有多么慢知道吗?

  1. git stash 超过1分钟
  2. git pull -rebase 每个commit要花1分钟
  3. git commit 每个commit要花1分钟

这些每天要运行无数次的命令,实在是让人等得吐血。要知道我们都换了SSD了,但还是这么慢!

客户的IT部门有严格的管理政策。不开放管理权限,不允许自己装软件。连git都是通过cygwin装上的。

而当我们想装什么软件时,只能在IT提供的一套看着就不像是技术人员提供的软件清单中找,然后提申请,等他们在以周为单位的“合理时间”内回应。

由于我们不能自己装软件,所以我们无法在自己的电脑上部署一套适合开发的环境,并选择适合自己的开发工具,所以才会在测试里去连国外的服务器,才会多人共用帐号,才会有各种冲突,才会奇慢无比。

无能的IT部门提拖累整个开发团队的重要原因。

六、只挑刺不干活的manager们

在国内办公室的这群开发人员都是干活的,而国外那边的各manager们都是只挑刺不干事的。比如项目经理,总是高高在上的问我们进度,或者开会,却几乎不为我们分担压力;比如拥有sign off权限的测试经理,只会布置测试任务,然后挑代码让这边解释为什么这么写。你又不写代码,管这些干什么?!有这功夫把你们提供的测试数据写对先。每次给的测试数据都有各种问题,还要让这边的测试组和开发人员花大量的时间找原因,告诉你们哪里有误。还有这个坑爹的端对端测试,你们省事了,这边被你们累死了。从来都是看到你们准点下班。

那一帮拥有管理权限但不干事的manager们,布置了各种听起来很有道理很有必要的任务,实际上只是一帮只动嘴不做事的人。

七、代码

最后不能不说的就是代码了。我们进入的有点晚,来的时候客户已经写了不少有各种问题的代码了。从过来的第一周,客户就在准备“下周”的上线,所以我们不好尽早参与到代码的改进中。结果这个“下周”,在推迟了8次以后,终于上线了。而我们失去了在一开始改进代码的宝贵机会。因为上线的代码是不允许随便改的(特别是客户的代码基本上没有测试),而后来的任务越来越多,并且都要基于第一次上线的代码,我们只能想各种办法把新代码与原来的代码隔离开,用了各种别扭的手段。结果终于在一个月前,我们不能不承认,第一次上线的代码是绕不开的,这才下定决定进行重构。可惜的是,我们已经在它的基本上写了更多的代码,重构时困难重重,因为现在的测试跑一次可是要十分钟以上,并且很容易跟其它人冲突,导致更多的问题。

今天有点晚了,就写这么多,可能还漏掉了不少关键的东西。这些东西看起来像是抱怨,就当作是无可奈何的一种发泄吧。现在我们几个的生活已经简化为:“上班->加班->睡觉” 这样的循环了。

上面说的这些问题,我们几个私下也讨论了很多次,也想过很多办法解决,但是看现在的情况,都不报多少信心了。我们这两周正在重构那些代码,经常一干就干到夜里三点(辛苦恒恒同学了),但能起到多少作用,都不抱希望,只能当做是在做一些对得起自己内心的事情了。

comments powered by Disqus