友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
代码之道-第3部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
。如果通过这种方式没有发现Bug,他们就会把视线转到正在被分诊讨论的那些Bug上,挑一个有趣一点的,然后开始研究它。在你知道之前,他们可能已经有了一个修复方案,并且正伺机悄悄地把代码签入进去呢……这就是抢修Bug!一个有自尊的开发者不应该做这样的事情。
作者注:在软件工程中,Bug通常是指代码中的错误。然而,微软内部使用“Bug”这个词泛指跟产品相关的所有增加、删除或者修改。但大家对外一般称这些为“工作条款”,其中有一些也可能是代码错误。我更喜欢“工作条款”的说法,这样就能把那些真正的Bug区分出来。
谁知道分诊团队是否会决定修复那个Bug呢?谁知道那个Bug是否被正确地修复了,并且也不会引起相关的另一个更大的或者小一点的Bug呢?对于潜在的重大问题投入一点调研是可以的,但绝对不要抢先去修复!
? 修复尚未报出来的Bug。现在有一个Bug通过了分诊,你正在进行修复。这时你注意到,在你修改的代码附近有其他更多的Bug(通常这些Bug是由以前的修复引起的)。但不知怎么搞的,这些Bug还没有被人报出来。你看到了这些代码,而其中的错误也尽收你眼底。为什么不一起把它们都修复了呢?喂!就此打住!!!
开发团队通过代码复审来避免这种可怕的事情。在“可信计算”时代,团队应该在整个项目周期内复审每一次代码签入。当团队处于“禁闭”状态时,要保证有3双眼睛(即代码改动者本人和另外两个开发者)同时审查每一次的代码改动。至于开发人员在修复一个Bug时发现的其他Bug,则要通过如下方式来跟踪:先把它报出来、登记到Bug数据库中,然后再分诊……
作者注:《凯文与霍布斯》连环漫画系列中有这么一个故事:凯文对一只苍蝇慈悲为怀,打开前门让它飞出去。结果呢?这只苍蝇非但没有飞出去,反而另外3只苍蝇飞了进来。这就是为什么你必须在项目逼近尾声时,要对每一个Bug进行研究和分诊的原因了。我的团队曾经在我们的产品发布前一个月的时候改变了一个参数的值,结果一周之后,全公司的测试人员都发现:只要打开CD托盘,所有的应用程序都会停止响应。最后,我们往回追踪到那个看起来无关紧要的参数,并把那个改动撤销了才解决问题。这种事情真实地发生在我们的周围,只是你未必知道而已。 。。
宝宝做了件极坏的事情(2)
? 修复标为“延期”的Bug。大家知道,被标为“延期”的Bug在产品发布给制造商(RTM,Release To Manufacturing)之前是不能去修复的。那么,是不是应该在计划下一版产品的时候去修复它们呢?不对!当初在项目的进行过程中,产品的相关团队对“哪些Bug对我们的客户影响最大,因此必须在发布之前修复”作了判断,但这种判断在产品没有真正发布之前是无法验证的。当产品发布之后,你就没必要再去猜了。“产品支持服务”(PSS,Product Support Services)、Watson和“微软咨询服务”(MCS,Microsoft Consulting Services)会告诉你的,而且它们非常坦诚。那些标为“延期”的Bug只具有参考价值,用于理解为什么这些Bug当初没有要求去修复。注意,你不要再一次去猜测已经真实存在的客户。你要做的是,关注用户反馈,修复真正影响用户的那些Bug。
? 重写“丑陋”的代码。开发人员讨厌“丑陋”的代码。这些代码常常麻烦不断,可读性差,难以维护。因此,当开发人员手头有空的时候,他们经常自言自语:“哈,我手头没有规范书,因此不能开发新的东西。我为什么不趁此机会重写那些讨厌的丑陋代码呢?”他们知道,如果给第二次机会的话,他们能够做得更好。他们也的确可以做到。他们可以在第二次的时候,重写出漂亮得多、清晰得多的代码,而且比第一次写的时候少了很多Bug。
令人遗憾的是,重写的代码实际上将比当前的丑陋代码带来更多的Bug。因为当前的丑陋代码是在第一次编写的基础上,经过了几个月甚至是几年的测试和修复之后才达到的质量水准。
有时候重写是必要的。重写可以提高代码的性能、扩展性、可靠性、安全性、或者对于新技术的适应能力。在这些情况下,应该把重写当作一个功能来对待;像处理其他功能一样,写一份规范书,然后为它制定时间表。否则,不要做代码重写这种愚蠢的事情,它只会重新引入一大堆令人讨厌的Bug,而且还对客户价值没有丝毫的贡献。
作者注:我的上述观点同样适用于“重构”(Refactoring),尽管我很讨厌提到它。哪怕重构是在你毫无察觉的情况下由电脑自动完成的。这并不是说你不应该进行定期的代码重构或复审,而是说,你不应该随意地做这些事情。做不做都应该由团队来做决定,并且要保证手头有足够的“单元测试”来防止引入大量的新Bug。如何正确地做这些事情才是关键。
? 在编码风格上争论不休。谈到最消耗开发团队时间的事情,在空格、括号、匈牙利命名法等问题上的争论必定在前5名之列。请记住:使用一种一致的编码风格对你代码库的质量和可维护性大有裨益,而你的团队具体使用哪种风格一点都不重要。你是开发经理,你来选一个并坚持使用它。谁说这也需要民主?!
txt小说上传分享
告诉我该做什么
关于闲散时间的阴暗面我已经说得够多的了。在这个清静时期,你的开发团队可以做些什么有建设性的事情呢?
很自然,测试团队会坚持说,在产品发布给制造商之前的这段时间里,开发人员应该帮着找Bug。而项目管理团队会坚持说,在产品发布给制造商之后,开发人员应该花时间去阅读和复审规范书。不过,这些事情对开发团队来说没有太多实际的工作量、不具有吸引力、也无法让他们开心。
那么,开发人员在“工作淡季”到底可以做些什么呢?下面是我的一些想法:
? 分析Bug。分析团队在过去的一个产品开发周期中修复过的所有Bug,找出其中的规律。哪些是个人常犯的错误?哪些是团队犯的错误?团队中的每个成员下次需要注意点什么,才能开发出更好的产品?
? 为部门开发一些工具。尽管开发人员通常不擅长发现Bug,但他们在开发用于帮助发现Bug的工具方面的能力却是超强的。他们还能开发一些工具用于使过程更加顺畅,比如源代码签入、安装、建造和支持。给源代码插桩或者开发一个好的测试用具,能够大大地促进开发与测试团队之间的关系。当然,你应该先到工具箱网站上去查一查,看看满足你需要的工具是否早已存在了。
? 讨好项目经理,把他们的设计思想变成原型程序。开发原型程序是个好主意,只是不要在常规代码库上去做。尝试用另一种语言来写,或者至少要有独立的建造。在常规代码库上开发原型程序的最大问题是,项目经理和高层管理者会很自然地认为,代码已经到了差不多可以发布的程度,而事实上,原型程序通常存在着本地化、平台依赖、徽标、漫游、性能、安全、兼容性等各种各样的问题。混淆原型程序和产品代码会把产品计划和期望搞得一团糟。相反,用另一种语言来开发原型程序却是一个极好的学习机会。再说还能……
作者注:虽然以前已经说过了,但我还要再强调一下,“不要把原型程序当作产品来发布。”这么做不会节省时间,而只会花更多的时间。千万不要这么做!原型程序是用于学习和沟通的,它的用途就是这么单纯。除了用另一种语言开发原型程序外,我以前常常把Esc按键处理为异常结束。这样的话,如果我的上司在观看演示时表现得异常兴奋,我会敲一下Esc键,让程序崩溃,然后解释说,“很显然,我们的程序还没到发布的时候。”
? 学习新技术或技能。人们总是抱怨他们没有足够的时间去学习新技术或技能,抱怨得不到培训机会使他们自身得到提高。好吧,为什么不好好利用项目的这个清静时期呢?不要让机会在你身边溜过!
? 跟研究人员交谈。在零Bug反弹之后是跟研究团队交谈的最好时机。这时候你有足够的时间去采用某个新技术,花时间去学习它,并且了解你能用到哪些东西。到你的产品发布、并且开始计划下一个版本的时候,你可能已经把原型程序准备好了,并且解决了所有的风险,着实让你的团队惊喜不已。另外,你和研究人员也可以为未来的产品策划新的研究领域。这非常有价值,而且做起来很容易。
? 撰写专利申明或白皮书。其他还有更好的时间,用来反思和记录你已经做过的事情吗?如果你团队中的一位开发人员在项目过程中想出了一个新颖的点子,产品因此增加了不错甚至是重大的价值,那么务必叫他撰写一个专利申明。这做起来很容易,很快,还能极大地鼓舞士气。请访问专利组织的网站,以便了解更多的细节。如果你想把一些信息文档化,或者与其他团队分享某个想法,那就写一个白皮书。相对来说,这做起来也很容易,但能给作者和你的团队带来尊敬和影响力。
? 反思职业生涯。最后但并非最不重要的一点,项目的这个清静时期是你审视职业生涯现状的最理想时机。你现在处在你理想中的位置吗?你的职业生涯在向正确的方向前进吗?你准备好迎接新的挑战了吗?你需要做些什么,以使自己忙碌并并能富有激情?如果通过上述反思,你觉得必须改变一下,那么,越早采取行动越好。
俭则不匮
差不多已经司空见惯了:产品的两个版本之间的时间被不必要地浪费了。而实际在这段时间内做的事情常常还是有害的。其实,只需要一点点的想法和思考,你的开发团队就可以在不带来任何伤害的前提下,提高他们自身的能力,提高产品,提高他们的见解,乃至提高整个组织的效力。为你的“停工期”好好计划一下吧,开足马力勇往直前!
txt电子书分享平台
为什么我们会在这里?
2004年6月1日:“我们开会的时候”
别浪费我的时间。拜托,请你不要浪费我的时间。也许我翻过桌子去用胶带封住你的嘴,我才能避免眼睁睁地看着你浪费我生命中宝贵的60分钟。召集一次会议怎么能给人以权利去浪费别人的生命?如果时间是金钱的话,大部分会议都是不景气的市场。我很厌烦那些可以把车快速开下悬崖、却开不好一个会议的人。
我不想再参加这种会议了。如果你逼着我去一个会议室,请为我准备好,因为我会质问你想上演的任何“绝技”。你浪费我的时间,那我也要让你的时间像火把一样燃烧。不喜欢这样吗?别考验我!我会质问你什么呢?听好了,因为下面就是……
我用来打断你的自助式“聚会”的第一个问题是,“为什么我们会在这里?”我们聚在一起到底想干什么?有理由吗?如果你没有让所有人清楚这个理由,大家可能会各有所想,并且像狗一样追着自己的尾巴,结果自然是一无所获。我不知道——也许你应该预先发一个议程,或者一些我们将要讨论的文档?拜托你做点什么!
如果你把会议的主旨作了通告,我可能还会提醒你,一定要坚持这个主旨!我不关心是否还有另外50个会议,去做另外的50个决定、讨论另外的50个话题或者更多的信息共享。我现在参加这个会议,我就只想专注于这个会议。如果有人想要谈论其他的什么事情,让他在我们结束之后再上演他自己的秀吧!
作者注:如果有人试图转移话题,你该如何不失礼貌地打断他呢?我喜欢的方法是,对他说:“让我们先把这个话题讨论完,然后再谈你的话题。”通常情况下,当你结束了第一个话题之后,所有人都想离开了。那个会议干扰者将不得不另外安排一个会议,并且邀请合适的人参加(这样要好得多)。如果那个干扰者坚持认为应该先讨论他的话题,那么首先讨论他要这么做的理由(这时候会议实际上仍然聚焦在原先的话题上)。如果理由很充分,那么是你的会议时机还不成熟,因而是你的会议需要另行安排。在这种情况下,没人会介意离开当前的这个会议。
我们正在试图做什么?
接下去,我的问题是,“我们正在试图做什么?”
? 我们是在试图做出一个决定吗?很好,就让我们做个决定,其他的像头脑风暴、状态检查、流言澄清等统统跳过。
? 我们是在试图共享信息吗(比如一个状态汇报会议)?很好,把信息列表上的内容过一遍,但不要试图去做什么决定或者解决什么问题。
? 我们是在试图收集想法吗?很好,捕捉每个人的想法,无论它们有多荒诞都不要作出批评或论断。最后,挑出其中最好的一个即可作为会议的成果了。
这里的要点是,混合会议是低效的,常常会徒劳无功。大家都知道了为什么会聚到一起来,也知道了会议正在试图达成什么目标。如果你必须中途改变这些前提,那你要深思熟虑之后,让每个人都意识到,现在规则已经变了。否则,你会浪费所有与会者的时间,永无止境地纠缠不清,最后还不得不重新召开会议。如果你要这么做,麻烦你不要邀请我。我不会参加的!
作者注:有个典型案例,就是在Scrum会议上提出设计问题来讨论。Scrum会议是用于共享信息的,不是用于收集想法或做决定的。没什么像设计讨论一样,不经意间就能让Scrum会议脱离轨道。然而,因为设计讨论是很值得做的,我们在Scrum会议上会把讨论的话题在白板上列出一个清单。等Scrum会议结束之后,那些想讨论这些话题的人可以留下来,参与接下去的设计会议。
为什么他们会在这里?
很好,我们已经知道了开会的理由,也知道了我们正在做什么。现在的问题是,为什么他们会在这里?我指那些不该在这里的人。这些人在问一些多余的问题,他们只是在重复别人的观点,他们只需在必要的时候表示一下同意。那么,为什么这些人会在这里呢?
会议的持续时间跟参加会议的人数是直接成比例的,说不定它们的关系还是线性的。你应该只邀请那些必须出现在会议上的人。
? 试图做一个决定?邀请可以做决定的人。其他所有人都可以在会议之后、通过e…mail了解到会议的情况。不是所有必要的、需要做决定的人都能参加吗?那就取消会议。立即取消!否则,你将不得不在所有人都能参加的时候重新召###议。
? 状态汇报会议?邀请那些将要汇报状态的人。其他所有人都可以在会议之后、通过e…mail了解到会议的情况。有一些需要汇报状态的人不能参加吗?我猜他们肯定是懒鬼。
? 头脑风暴会议?邀请一些有创意的、思想开明的人,他们是会议成功的关键。其他所有人都可以在会议之后、通过e…mail了解到会议的情况。
有时候,你必须邀请一些其他人来参加会议,他们对会议是否成功起着至关重要的作用,比如主持人、协调员、啦啦队队长等。但也就这些人了。如果太多其他人登记要参加会议的话,你最好取消会议。(你可以预先判断出将有多少人参加会议,因为当有人接受一个转发的会议邀请时,你
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!