Archives
-
封闭笔记——第十八天,收官
2010-03-18 晴 今天应该是封闭的最后一天,我们要在最后一天把这次封闭的成果上线展示出来。这次封闭其实更多的是一个练兵,是让兄弟姐妹们能够学习和提高。 今天是我们的收官之战,同志们还在前沿阵地奋战。一拨人公司配合上线的,另外一拨人测试这次开发的功能,还有继续改代码的,还有我这样记录的。 今天大家都很辛苦,几拨人都是到了中午下午才把代码全部搞定提测。需要上线的有两部分,一部分人是这次封闭做的新的小的任务,我们姑且叫做团队A。一部分是和公司一起搞的一个大版本升级,我们不妨叫做团队B。两个任务同时上线,刚刚好可以做一个不是那么精准的比较。 人员组成 A组是一个中级程序员和三个初级程序员组成的团队,每人认领几个指令任务进行开发。 B组是一个半高级程序员,而那一个全人的水平是很不错的。 任务类型 A组是一个组合指令的任务,可以明确的拆分任务,而且B组的负责人前期已经制作好了一个框架。 B组是一个现有系统的升级,牵扯到新老平台的切换,而且要修改的代码很难界定范围。 开发模式 A组采用的是这次封闭尝到的单元测试先行的开发模式。 B组由于是修改现有系统,而且以前没有任何的测试类代码,所以还是传统的开发模式。 任务难度 A组的每一个细分的任务都不是很难,但是比较庞杂,想要做好了必须完全吃透需求和无数的场景。 B组的难度比较大,是公司的一个重点项目,牵扯的系统都很多。 任务强度 A组是这次封闭的主要项目。 B组时间非常紧张,本周才开始。 测试人员数量 A组一个半人,最后这半个测试人员也并入到B组的测试中。 B组的专职测试人员4+人,还有很多不明真相的志愿者。 测试时间 A组采用单元测试,从第一天可以说就在测试,从全部提测到测试结束大约3天。 B组由于任务重,所以测试时间并不多,但是从开发开始没多长时间就开始测试了。 Bug A组的Bug不能算少,但是严重的bug并不多,只是几个。大多数的bug集中在类似文案调整的类型。 B组的Bug并不是很多,但是每一个bug都很纠结。 Bug的修复 A组的Bug由于存在测试用例,所以很容易定位,基本上每一个Bug修复的时间都不长。 B组由于没有测试用例,加之系统复杂,所以每一个bug都无法快速定位,必须依靠经验和对代码的熟悉程度。而且中间还出现了相关人员集中在白板前思索可能的坑在哪的问题。 上面是一个比较不靠谱的比较,也许并不公平。但是我们从中还是能看到一些问题的。比如有了测试用例可以快速的定位bug,比如如果没有我们会很纠结。比如我们每次修改的系统如果牵扯的非常多我们就很抓狂(应该把系统隔离的更好)。 现在已经早上6点了,我们还在准备上线。两个组都还纠结,但是看到曙光了。凡是我们用例定义的好的,测试覆盖的好的,很快就过了,否则都很缓慢。我们还有很长的路要走。 记得第一天我说,行百里者半九十,我们现在还远没有走到九十里。前面的路还很长。 前方的路不知是洒满阳光还是布满荆棘,我都会掸掸身上的土,继续走下去。
-
封闭笔记——第十六天,感悟
2010-03-16 晴 今天大家的工作非常紧张,都进入了冲刺阶段。 今天的感悟非常多。 程序开发,吃透需求非常重要 前天晚上,我在写基础代码的时候,有一个相关的兄弟一直围观。我边写边讲,说根据需求为什么要有这个方法,为什么要这样使用。他一边听一边跟我熬夜,很是辛苦。而且,在昨天拆分需求的时候,他的问题是最多,稍有不明白的就马上询问,对需求的理解也是最清晰的。 结果今天的进度,他是最快的,而且很多看起来可能比较绕的流程也顺利听过。加之TestCase辅助,晚上就已经写得七七八八了。赞一个。 反观另外两个童鞋,这里不得不批评一下。他们的进度主要被耽误在对场景的不理解,不能整体理解需求、把握场景,导致途中频频趟雷。速度起不来,情绪也起不来。 程序开发,从更高的层次思考很重要 我们为了需求,写了一个很小的算是框架的东西,其实就是一个分发器。分发器接收请求,然后轮询问注册进来的指令类是否需要处理,如果需要则分发下去,否则询问下一个。这是一个非常简单和标准的做法,但是我发现很多工程师并不能理解这个模式。甚至到现在,已经基于这个结构作了一些东西之后还是不能完全理解。所以导致很多东西写起来很慢。 程序员要提高自己,其中很重要的一点就是越发的从高一层的角度来看待自己的工作。如果能够高屋建瓴,那么再脚踏实地会事半功倍,而且出错少很多。哪怕我们不能站上去,我们也要吃透自己涉及的相关的代码。 团队遇到的问题是隐藏在平稳下的 最大的感受,其实还是在团队。分配了任务之后,每个人都按照认领的任务开始了工作,一切平静。但是往往是危机四伏,如果此时跟进不及时,往往会出问题。因为我们总是有一些问题是无法预计的,碰到了是想凭自己死磕过去的,或者是根本没意识到这时一个问题的。如果这时候作为一个协调者和后勤人员,及时的在每个人遇到困难时候就跟进,能够在过程中解决大量的问题,节省很多时间。 我觉得,管理对我的要求就是对每个人,每个环节的了解,预判哪里可能出现什么困难,然后第一时间赶过去把问题消灭,让团队顺利的前进。 我的职责是预判可能的问题,并主动的去想办法帮助解决(潜在的)问题,让团队更好的去继续进行任务。
-
封闭笔记——第十五天,开始冲刺
2010-03-15 晴 其实现在都16号了,昨天忙忙碌碌一天,一直到现在还有空写下笔记。 昨天一直在忙准备上线的东西。不是我们封闭的这些人的上线,而是另外的一个大的系统要上线,需要我这里进行配合,而且集中在一个兄弟身上。一下午都是在考虑如何在人员、进度、任务当中纠结。 当任务一多,就发现想平衡多个项目,各自达到一个比较理想的结果,整体获得一个比较理想的结果是一个非常考验智力的事情。这也是管理的难度和挑战。 在拆分和调整的过程中,再一次发现团队合理性的重要。现在由于一些关键路径、关键节点上都卡在同一个人身上,导致很多的任务安排起来很纠结。团队的组建,不同的层次的人的成长是一个很挑战也很容易感到有成就感的事情。我觉得我开始入门了。 晚上重新拆分了一个重要的需求,把任务分了下去,还是让大家理解需求,理解用例,通过用例覆盖场景的顺序。我自己则亲自动手,为大家做一个基础的数据类。算是第一次在写PHP,被大家围观了,还好没丢脸。 开始冲刺了,最后一周,一定要从全局把握好,争取一个好结果。
Mar 16th, 2010 | Filed under 项目管理Tags: 项目管理 -
封闭笔记——第十四天,上线
2010-03-14 大雪 难道真的2012?现在还下雪,还是鹅毛大雪。娘列~~ 今天重温了一下进度,感觉还是有点紧张的,实在不行就只能砍掉一些需求了。现在给兄弟们的压力太大了,工作很辛苦。不过按照我的说法第三周效率会有一定的提高,因为测试用例大家已经熟悉一些了。不过这个还有观后效。 中午围观了一下上线流程,真是帅呆,累呆。 上线应该是包含哪些呢? 各小组把代码提交到自己的分支 把不同分支的代码(不同小组的代码)合并到上线分支(有些是从分支上线,在此并不讨论,这两种方式没有好坏之分) 把上线分支的代码同步到线上环境 把上线分支的代码合并到其他的分支 这里面说起来挺简单的,而且第三步我们已经有了上线工具可以做到,按道理应该是不难的。但是我们却花了至少一个小时才完成。真是杯具啊。 说起来我们在哪里费时间了呢? 各小组代码提交到自己分支,很快。 把不同分支的代码合并到上线分支,这个费时间很长。 原因是上次的第四步没做好。而且我们每次都做这两步都是基于文件的(而不是基于提交或者 ChangeSet),每次挑选到底哪个文件(甚至哪个部分)要上到上线代码是一项人类体力与智力的考验。如果没有拜过春哥或者你不是从娜美克星来的你可得小心。 使用上线工具,很快。问题也是基于文件的,但是现在还没有遇到问题。 貌似这次又忘了? 这里面最耽误时间的是第二步。今天的花销其中95%以上都是消耗在这里。 个人觉得这里面的问题并不容易解决。比如我们总有一些文件不得不提交,但是这些文件却不需要上线。 这里如何解决呢? 最简单的办法当然是一次性用新的代码合并上去最好,但是如何保证合并后的代码没有问题呢?尤其是一些比如负责分发判断等代码,贸然的合并一定出现问题。而其一些常量定义的文件在多团队开发下,也一定会出现冲突的情况。 根本上我觉得现在上线和多团队开发还不是那么的爽,还需要大量的人力参与,可能还是开发模式的一些有待提高的地方。试想,如果linux也有我们这样的问题,那就真的没法混了。 这个我会好好的考虑一下如何推进。既要让效率提升,又要每次改动都让现行的开发人员平滑的升级,这并不简单。 程序开发是一个团队作战,我们需要明星战士,但是我们更需要一个能捏合整体的有效的方法。而且还要考虑到产品和运营的需求,在市场、产品、研发、积累等等方面做到平衡。管理,则应该是这个粘合剂,我也应该是这个粘合剂。
-
封闭笔记——第十三天,配合
2010-03-13 晴,转暖 今天的事情并不多,昨天两个哥们一直到今天早上7点才去睡觉,一直在重构和单元测试。厉害。不过还得说一句保重身体。 下午得到公司的消息,新的系统测试的非常牛掰,每秒可以推送10万消息,很是振奋。我们这边也是配合修改前端的调用方式。代码修改量并不大,但是我承认开始并没有对此有一个足够的估计,本以为修改量很大。 这也就给了我另一个提醒,如何平衡多个项目之间的进度关系,如何让某些任务提前某些滞后。从一个大的项目来看,这些任务是不分先后的,但是从一些需要配合的场景来看,则必须。这就是关键路径的问题。 今天晚上强制休息,没干活,还好,大家玩的挺痛快。虽然有人惦记着工作。
Tags: 项目管理 -
封闭笔记——第十二天,强制休息
2010-03-12 晴,大风大风 今天是值得纪念的日子,我组里的小童鞋第一次把做的东西投入生产环境,加油加油!! 今天的上线又被延误了,原因是整个这片地区整个断网,从早上不到11点到下午4点多,最好的时间什么都干不了。也好,强制休息了,很多童鞋选择了睡觉,晚上大家精神明显好很多。 印象很深的一刻是网络连通的哪一个时刻,所有人几乎是同时的奔回自己的作为开始干活,而且楼上的童鞋也是收到消息第一时间就回来了,进入工作状态时间之短令人振奋。可见这是一个有战斗力的团队。 晚上吃饭的时候,盘算了一下进度,到现在大约延期了一天半。其中大约一天是环境的问题。今天是无法上网半天,上次是新开发的上线系统不熟悉,连带git-svn合并代码半天。这些都是最开始没有料到的,这是我的问题,以后要记下来。 这其实也是一个工欲善其事必先利其emacs的事情。我们总是在打造自己顺手的工具,提升每个人的生产效率。但是我们往往不是那么的关注团队的顺手的工具。余以为,这个工具是流程,是配合的环境,是统一的方法。 简言之是两个方面,流程工作方法是一个方面。我们发现很多的程序员都在抵制流程,但是在这几天没发现这里的人抵制单元测试,而且也看到大家从中获益良多。那么是不是以前我们的流程有问题呢?是定位的问题?还是推广的方式有问题? 我们不能为了流程而流程,如果一个流程是为了让领导看,让领导觉得我们没闲着,那么这就是扯淡的事情。 另一个方面是标准化,前几天我说过部署环境的标准化,现在看来在每个人的开发工具上提倡标准化也是有必要的,尤其是在梯队建设中的时候。很多时候我们要做CodeReview,还有结对编程,这时候如果大家的工作习惯不同,对效率的影响还是很大的。 现在的团队基本上在主推vim等开发工具,我这个emacs党只能不明真相的围观了。
Mar 13th, 2010 | Filed under 项目管理Tags: 项目管理 -
封闭笔记——第十一天,团队
2010-03-11 晴,开始暖和 今天大家已经开始进入到一种稍微憋闷的状态了。有些兄弟开始出现了身体不适的反应,我很担忧。早上没有叫大家,让大家自然地醒来。工作中也第一次允许开放音乐了,必须开始调整气氛了,已经近乎癫狂了。 某个哥们也开始说像他这样不爱说话的人也开始有想见人就拉住聊天的冲动了。 现在我已经开始轰人回去睡觉了。 状态的调整是一个很重要的事情,如何让团队保证一个持续的战斗力是一个很高深的话题。 今天也第一次透彻的感觉到团队的力量。以往看到很多的人说,在一切的资源中,团队是最重要的,但是从来没有过这么直接和透彻的感受。 一个合理的团队搭配是保证高质量战斗力的前提条件。这个团队必须有教练的角色,也必须有核心队员和明星队员。但是最重要的则是梯队的合理。试想,当年风头最劲的黄色潜水艇就是因为其他球员太弱,就算里克尔梅赔上老命也无法杀入欧冠决赛。 现在我的团队就是梯队有些不合理,导致几个兄弟十分疲劳但是任务其他人也无法分担,看得我心焦又心疼。 兄弟们,快快成长起来吧。 晚上和组里的一个童鞋一起看他的测试用例和代码,写的还算不错。和他一起又探讨了一些关于TDD、重构的思维方式以及最佳实践。一次可能灌得有点多了,慢慢来,成长也是一个过程的。 我准备在这几天单独给他开小灶了,必须拔苗助长了,会很辛苦,但是也会很有收获。 有这样的一个机会,我能够近距离的,透彻的观察我的团队,思考团队应该如何进行人员配比、如何建设、团队的弱点、团队的潜力等。这是一个最佳的实践机会,也让我自身提高去更好地履行教练的职责。 知难行易,任重道远。加油。
-
封闭笔记——第十天,平稳
2010-03-10 晴,升温 雪停了,终于也开始升温了,寒冷的冬天会过去了吧。 今天的一切都很平稳,除了网络。本来安排今天要上线一些东西的,一点一点的迭代的更新,但是都准备好了的时候,网络却罢工了,连到服务器打字都要等半天的。结果到现在都没有搞定。 下午和昨天那个哥们一起写了新的功能的测试用例。算是我盯着他手把手做的。发现了现在的很多的工程师对这个还是知其然不知其所以然。他写的代码都是测试功能性的,而不是测试场景的。这样的代码对于场景是没有意义的。手把手的和他一起写了几个用例,感觉他明白了一些。还需要加强。 今天大家休息了一下,但是还是有很多人痴迷工作。看来有必要继续强制休息了。这种癫狂的工作状态,是既想引入回公司,又感觉有点害怕的。 晚上review了一些新的代码部署的结构,准备采用rpm,并且架设自己的yum源。我们终于逐渐的走上标准化的路线了,这个值得欣慰。
Mar 10th, 2010 | Filed under 项目管理Tags: 项目管理 -
封闭笔记——第九天,测试用例反复
2010-03-09 昨天雪,今天冷 昨天已经有童鞋提测了,今天测试MM开始了基于单元测试的测试流程,明天我们就可以拿到一个对比的报告了,很期待。第一个完整流程指日可待。 今天遇到的一个情况是测试驱动开发的反复。 有童鞋对测试用例有了一些疑问 有童鞋恢复到了以前的模式,先写功能性代码,然后用用例才测试 疑问是这样的,他在开发中,遇到了大量的遗留代码的问题,这时候在对已有代码的信任度上已经产生了质疑,他总是觉得要覆盖更多的内容才放心,但是这样却觉得UnitTest写起来没完没了了。 我对这个的回答是从两个方面进行的 因为这次是第一次采用UnitTest,所以一定会出现大量的以前藏着的雷被踩到。 已有的代码,我们这次假定是信任的,如果真的有问题,我们暂时绕过去,并告知测试和原有代码维护人员。因为如果不这样我们是无法定义用例覆盖的边界的。而遗留代码的问题,是应该相关的维护者补充对应的测试用例来覆盖的。 测试驱动开发是一个循环的事情,坚持住了,往前走就是良性循环,被遗漏的代码越来越少,雷区越来越少,代码质量提升。但是如果往后走,总觉得没时间写,总是有大量的不可覆盖不可测试的代码,每写一点就趟雷,会严重的打击士气,然后就不写了,然后就恶性循环了。 让我觉得非常受打击的一个事情是有些童鞋回到以往的开发模式了。先写功能代码,然后用用例开覆盖功能代码,起到测试的作用。 我记得我多次提过这样的危害,但是还有童鞋跑了回去,晚上只好那他开刀进行CodeReview。结果发现了一些设计和场景层面没有照顾到的地方。在此,我再说一次用 UnitTest 会带来的好处,当然这里只是说了一些对于开发者最明显的好处 用用例覆盖场景,因为我们考虑的是场景并且有测试人员配合,所以我们不容易遗漏场景 写TestCase是在进行设计,从使用者的角度,从API设计者的角度去看代码,会让设计更加自然 用功能性代码覆盖用例,功能性代码有保障 测试时期发生Bug容易定位 为测试节省时间,比如边界测试等都可以通过TestCase来进行,而无需每次都人肉 等 我决定他下一个任务我和他结对编程。 行百里者半九十,古人诚不欺我。
-
封闭笔记——第八天,第一次全员思想碰撞
2010-03-08 鹅毛中雪 今天早上中午还都是平平淡淡的过去的,没有波澜,只有不惊。唯一的不同时窗外白茫茫的世界。从夜里开始下雪,周围已经都白了,天气也冷了,这是什么天啊。2012? 下午吃饭前1小时的时候,我们决定提前进行CodeReview,按照某些人的说法就是“爽一下,然后去吃饭”。 今天上战场的小哥是一个测试开发人员,我已经单独的给他Review过至少三次代码,代码的质量已经好了很多了,让他上去游街我还是比较放心的。 不明真相的群众纷纷前来围观,我们又开始激烈的讨论,今天的讨论让人为之一振。 今天我们没有过多的纠缠在编码风格等地方,究其原因应该是: 经过一周的训练,小哥的编码已经没有太大的问题了 经过一周的围观,群众的见识已经大大的不一样了 取而代之的是,我们花了很大的篇幅来讨论 TestCase 应该怎么写;测试断言应该到什么粒度;测试时候是否相信(一个)函数的功能;重构时候函数抽取到底应该包含那些;等等,不一而足。讨论非常激烈,而且也第一次出现了双方的论述都有道理,都无法彻底的说服对方的情况。这是一个好的现象,说明我们已经上升到了一个思辨的层面,也说明我们已经开始有能力站在稍微高一点的层次来看待开发这点事儿了。 今天分歧最大的一点在于几个开发人员认为用例覆盖的太过于细致,被抽象出来的一个创建对象的方法里面进行了大量的检查,这是没必要的。而负责写用例的童鞋是测试人员,他认为是非常有必要的。从而展开了一场声势浩大的拉歌比赛。 我个人从如下三点来理解这个问题和分歧的: 要考虑代码是经过多次重构长起来的 今天大家看到的代码其实是重构了多次,一点点的生长起来的。在重构的过程中,一定会出现为了几个地方差不多,略有不同但是本质上可以放在一起的情况,这时候把他们重构到一个方法中不能说不合适。而这时候造成的结果可能就是这个方法只能上稍微有一些臃肿。这时候我们可以选择职能继续拆分,或者是忍。可是忍了,这些(逻辑上可能)多余的代码怎么办? TestCase 中无副作用的多余的代码如何处理 我个人写 TestCase 的习惯是这样的。写好的断言,如果不是非要删除不可,一般我都会留下。因为这不是功能性代码,这地方稍微罗嗦一点没关系,而且说不准哪天会用上。而最重要的理由则是,这些代码没有副作用。当然了,如果某些断言耗时很长,那就属于有副作用了,如果没用,坚决干掉。 每个人的职责不同,看问题的角度不同 还有一个问题就是大家看到的问题的角度是不同的,开发看的是用例应该体现设计思路、单一职能,要简洁。而测试人员看到的是我不相信一切,我要覆盖到一切可以覆盖的地方。而引申出来则是开发童鞋看到的用例应该测试单元,而测试童鞋的用例则是为了覆盖场景。 这个思辨的过程是我第一次想到的,也是我觉得收获最大的一点。如果我们认为测试和开发是站两边,现在团队已经开始在朝着中间靠拢了。我记得我说过一句话,就是开发的单元测试用熟练以后是应该朝着覆盖场景前进的。这也算是我们为了以后更大规模的自动测试前进了一小步吧。 随着测试驱动开发的锻炼,我相信开发人员都会有一颗测试的心。 还有,期间有童鞋说,写断言没错,但是如果是多个断言,可能会打断正常的思路。 这里面我给出的答案是“采用占位方法”。说起来很简单,就是在需要写大量代码的地方,给出一个占位的方法,这个方法的职责就是去完成那需要多行代码组合起来的功能。这时候就不怕思绪被打乱了,而且这个方法还没有,编译/运行肯定不过,也不怕回来忘了。 今日Milestone,测试人员已经开始测试了。给出了一个任务,要求测试的MM和功能开发的兄弟明天一起给出一个报告。这个报告是要对比使用 TestCase 前后的不同的。其中应该包括Bug的数量、回归的时间、问题的定位等。 完成了这一步,我们的测试驱动开发才能算是完成了一个完整的循环。