敏捷开发“松结对编程”实践之四:日常工作篇(大型研发团队,学习型团队,139团队,师徒制度,检查点,代码审查,每日立会)

2023-11-06

转载自: http://blog.csdn.net/cheny_com/article/details/6590360


本文是“松结对编程”系列的第四篇。(之一之二之三之四之五之六之七之八,此系列之九及之后文章请见栏目总目录。)

团队中常见的一种情况计划、估算、设计的时候大家还在一起,但编程的时候就会分开。分开看似是安全的,但是却充满隐患。

2001年,一位招聘考试前三名(一共120员工)的程序员的两个月的成果被彻底放弃重写,原因是里边包含3000多个常数,而且很难修改(码流参数),重写的人座位距离他只有4米,重写也只花费了2周;2002年,一位月薪7000(那时候北京房价才3000多)的程序员编写了一个月的4000多行代码,在一个下午被重写为50多行,座位距离他只有5米的项目经理疑惑加惊讶地问:“你真的没学过c++ template?”。

这就是团队的距离,即使是高薪聘请来的程序员也难免犯错。难道我们只能避免下一次问题发生,而不能避免这次问题发生?

-----------------------------------------

前检查点

前检查点就是在做某功能的最初一段时间,师傅与徒弟结对编程,完成最初最重要的设计。

“开始做X功能的时候叫我一声,咱们敲定一下具体怎么做。”这个是师傅的前检查点标准语法。尽管在共同估算的时候大家还是略有共识,但是限于计划会的有限时间,徒弟未必真的知道怎么做。在刚开始的一两个小时里边,师傅带领徒弟一起把基本的结构理清楚,最好写上一些基本代码,让徒弟有一个直观的概念。

在上面提到的2周的重写工作中,重写者和被重写者一起工作了1.5天,重新设计了打包类、递归函数等最难缠的部分;被重写者在剩下的两周里边完成了工作,而且很出色。倘若这一切发生在两个月前该多好。那次事故之后,我们订立了更严格的代码审查制度,所有代码均由部门技术最好的人审查后才进代码库;之后再来的新人,均指派师傅,并由师傅保证其代码质量;将人员划分为需指导的/免于指导的/可指导的/可培训的四级(10年后我在NEC参观交流时发现了几乎完全相同的分级制度)。

前检查点的工作作用是打下设计的基础,保证工作顺利进行。如果一切按照前检查点的设计进行,徒弟可以继续独立工作,如果有偏离,要询问师傅。

前检查点的学习作用是显而易见的,师傅平时工作的精华都展示在徒弟面前。而且这种展示是动态的,在结对编程的状态下,徒弟可以完整地看到师傅是怎样入手工作,怎样思考,怎样解决问题的。

后检查点

后检查点就是某事做完后,师傅检查一下徒弟的结果,保证达到验收标准。

曾经分配给我一个刚毕业半年的组员,刚来没多久就经常看到他上网玩,过去一问,原来工作做完了(真的非常快),惊奇之余赶紧看看结果:功能是有了而且实现得也很好,就是总有点瑕疵:要么按钮不正,要么界面上有错字。后来就改成每次任务完成都赶紧喊我去看看,修正后继续下一个。他后来能力超群,在此公司作为“台柱子”10年,现在还在。

其实多数新人在大学中都形成了“能运行就行”的概念,并不懂商业软件开发的标准。本人也一样,毕业5年还不知道delete内存(C++),每次都是多预留点C盘空间,这样程序就能多运行一段时间,下班之后关机重启就可以了……这样的软件肯定无法在服务器上长期运行的。

在后检查点,师傅可以提出改进要求,也可以当场改动。徒弟在此过程中会发现自己和师傅的差距,并因此而得到改进机会。

后检查点的工作作用是可用来进行代码审查,以确保软件产品的质量,之后会提到。

后检查点的学习作用是帮助新人学习商业软件的开发标准,逐步养成好的习惯。

日常工作

除了在任务前后的时间点外,日常8小时也应该保持良好的沟通。在一次极端的环境中,我们曾经将其发挥到极致。

当时我们以很高的日薪临时聘用了两个不错的程序员。他们技术虽然很好,但是却对业务一无所知,也没有提前看过文档。因为总共也没有多少天,当然不能把任何一分钟花费在熟悉业务上,所以……

1. 每天早上(包括第一天)

整个软件被大致分为三类功能区,互相关联。组长(我)也自己编程,负责其中一类功能。

有20分钟的晨会,组长会把一个简单的设计文档的一部分拿出来讲解给两个人,同时指出今天要做的工作要给予其中的哪些内容,他们提问我回答。散会前我们会就每人的工作做一个简单的估算(当年还不会扑克牌估算,太可惜了),确保当日是可以完成的。

晨会会提到技术问题,而不是每日立会中说的只说进度。但技术问题一般只涉及到要求,比如“做分段计价模型的时候,不要在C++里边做For循环,看能不能在SQL里边解决,如果解决不了来找我”“好,我试试。(或)这可能吗?”凡是有问题的就会稍微深入一点;凡是“我试试”的,都放过,但如果试验的结果不通就必须找组长讨论而不能自行解决。

小组加组长只有3个人,所以所有人都参加这个20分钟会,包括肯定不做某任务的人,也听组长和别人的讨论。

2. 每天下午1:30点左右

就是吃饱饭犯困的时候,组长会分别和大家在计算机前碰头一下,主要是看当日的工作是否可能在下班前完成(坚持不加班);另外就是看是否和晨会上预想的一样。

其实就算是短短的半天时间,事情就可能有变。有一次其中一个程序员在一上午写了大约4屏幕的代码(一般每天才写这么多),而功能却遥遥无期。原来他不知道有个函数可以快速实现这些功能,正在自己造轮子,他本应该告诉组长所遇到的困难。

程序员很少在这个时候求助,他们总是相信自己能最终解决问题……因此在转型为自组织团队的时候,担心程序员会偷懒的想法整体上是多余的,更需要预防的是蛮干/过于乐观/激进/需求镀金/消息闭塞/无法互相学习等问题。

3. 每天下午下班前

当时6点钟有《七龙珠》(工作场所有台电视),两位对此都很着迷,所以我们基本到点就看片,看完后散伙回家。

因为也不能让电视台调整播出时间,基本上下午5点就要开始打扫战场:组长分别找两位,看最终结果是否完成,并做一下修改。同时还要做代码审查(请看下一篇详述)。

由于估算不会太准确,我们专门把所有三不管的小功能梳理出来,谁提前做完了,谁就找其中一个把剩下的闲工夫占上,结果其中一位几乎包揽了全部。

4. 晚上

对,组长晚上还要工作。在他们走后组长会在晚上做个集成,把几个人做的功能合成在一起运行。当时也没有持续集成工具,所以只能手工。

在正常项目的正常团队中,这个工作应该在工作时间完成,也就是说或者找专人(或轮流),或者让组长做,或者让自动工具做最好。推荐小组内轮流负责此事,因此可以让大家理解别人的工作、整体的工作,乃至与组外人员的集成工作等内容,为组员成长为组长打下基础。

5. 随时

可能已经注意到我们没有“每日立会”,一则当年还不知道Scrum,二则感觉一个3~5人的团队还要靠开会交流实在迂腐。比如在篇首提到的两次事故中,团队都没有少开会,但都因为缺少随时的沟通而导致大错。

其实任何伸伸懒腰的时间都可以进行沟通。不过一般不要“太随时”,应该以师傅的时间为主,也就是如果徒弟遇到了问题,但可以绕过去先走着,就先来一句“我这有问题,有空帮忙看看”+“好,再过15分钟”。这样既不会让徒弟被卡住,也不会让师傅因为经常被打断而导致无法工作。但师傅可以随时发起交流,因为他们是去帮助徒弟的,聊的也是徒弟的事情,不存在打扰的说法。

在多数情况下无论徒弟学得多好,小组的主要产出仍然可能一大半来自师傅。因此不能把师徒团队变成一个简单的学习团队,而要通过保证师傅的时间,来保证其首先是一个工作团队。

这个工作习惯一直保持到后来我管理一个市场/销售/支持团队的时候:我选择坐在开放空间的最中央的一张大桌上(各部门经理也都在中央桌上而非独立办公室里),如果有人有事来找,都会问:“有空么?”答案是有空,或者某个时间之后。尤其是每天有10个以上不同的人会找你的时候,时间管理方法是很关键的。

注:上述部分内容仅限于特定环境中,但思路很多时候都是可取的。

-------------------------------------------------------

前检查点的基本作用是保证后续工作有大致的方向,而且徒弟能从师傅的设计过程中受益。

后检查点的基本作用是保证完成的工作符合要求,而且徒弟能从师傅做出的改进中受益。

在日常工作中,师傅要经常过问徒弟的工作,但以保证自己的产出为前提。不能因为已经进行了共同设计和估算,或开了例会就放弃日常跟踪,问题往往出在小处。

下一篇,将就代码审查做一些探讨,也就是师傅怎么帮助徒弟改进自己代码的过程。

 

点击下载免费的敏捷开发教材:《火星人敏捷开发手册

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

敏捷开发“松结对编程”实践之四:日常工作篇(大型研发团队,学习型团队,139团队,师徒制度,检查点,代码审查,每日立会) 的相关文章

随机推荐

  • IDEA tomcat8.5 控制台打印中文内容乱码

    运行SpringMVC项目时发现后台获取到的中文数据输出在控制台上是乱码 已经设置了字符编码过滤器 解决 方法1 修改D apache tomcat 8 5 70 bin目录下catlina bat文件 追加 Dfile encoding
  • 【C语言】字符串排序

    文章目录 前言 一 需要的相关知识 二 代码实现 1 指针数组指向的字符串常量 2 使用二维数组存放字符串 前言 在理解二维数组和数组指针的结合使用 指针数组相关内容后 会更易于理解 一 需要的相关知识 指针数组存放常量字符串和二维数组结构
  • echarts字变大_在echarts中如何调整lable的字体大小?

    series i pie data i label normal textStyle fontSize 透過設定 fontSize 就可以調整大小了 你可以參考 官網的範例 手動修改左側欄 label 的 fontSize 看看 是可以調整
  • TLS中PSK的简要介绍

    PSK的目的 我们都知道TLS需要依赖非对称算法 RSK EC DS DH 完成秘钥交换 身份认证的功能 但是非对称算法的耗时和耗计算资源的特性在对资源或者耗时敏感的场景下 你就想把他优化掉 本文我们就简绍一种TLS标准本身提供的优化方式
  • C++11新特性——时间操作chrono库

    此课件及源代码来自B站up主 码农论坛 该文章仅作为本人学习笔记使用 C 11提供了chrono模版库 实现了一系列时间相关的操作 时间长度 系统时间和计时器 头文件 include
  • Python从入门到放弃

    第一篇 markdown编辑器 001 markdown基本语法 第二篇 计算机基础 002 计算机基础之编程 003 计算机组成原理 004 计算机操作系统 005 编程语言分类 006 网络的瓶颈效应 007 计算机基础小结 第三篇 P
  • go语言日志收集系统

    0 项目地址 完整项目的GitHub地址 https github com taw19960426 learning go language tree main go log collect 一 日志收集系统背景 1 项目背景 a 每个系统
  • 如何在CentOS上安装Java

    Java是一种免费的开放源代码 并且是专门设计用于Internet的分布式环境的最流行的编程语言之一 Java有两种不同的实现 Oracle Java和OpenJDK Oracle Java具有一些其他商业功能 而OpenJDK是Java平
  • spring boot常见注解

    目录 1 EasyPoi基础功能常见的五个注解 2 Component 3 在mybatis映射接口的配置中 resultType和parameterType的用法 4 EqualsAndHashCode callSuper false 5
  • stm32定时器实现60秒定时秒表

    include led h include delay h include key h include sys h include lcd h include usart h include timer h include beep h e
  • games101,lecture11(obj文件)

    OBJ 这里的obj是一个文本文件 和编译生成的obj文件是不一样的 更多详解 https blog csdn net shenshen211 article details 51740988 添加链接描述 https www jiansh
  • MySql,SQLServer,SQLite性能比较

    工作任务 测试三个数据库的性能 测试方法 C 编写工具 对数据库进行大量数据Insert和Selectc测试 测试结果 Insert测试 Select测试 测试结果 SQLServer 和 MySql性能相差不大 Sqlite则数据多大几万
  • Java中局部变量、静态变量、静态方法的有效范围与调用

    1 局部变量 定义 在成员方法中定义的变量称为局部变量 方法中的形参也可以作为局部变量 例 public void method1 n i均为局部变量 int n for int i 0 i lt 5 i System out printl
  • C++获取其他程序内信息

    1 根据程序名称获取程序窗口句柄 一个程序获取另一个程序Edit控件的内容 char temp 256 strTest clear 根据指定程序的标题名获取改程序窗口的句柄 HWND hWnd FindWindow NULL L Test
  • v-if和v-show的区别

    v if是动态的向DOM树内添加或者删除DOM元素 v show是通过设置DOM元素的dispaly样式的显示或隐藏 编译过程 v if切换有一个局部编译 卸载的过程 切换过程中合适的销毁和重建内部的事件监听和子组件 v show只是简单的
  • Linux程序设计 学习笔记 第八章 MySQL(部分)

    用C语言连接MySQL包含两个步骤 1 初始化一个连接句柄结构 2 实际进行连接 初始化连接句柄 通常传递NULL给此例程 它返回一个指向新分配的连接句柄结构的指针 如果传递一个已有的结构 它将被重新初始化 mysql init函数出错时返
  • java logging u g_java.util.logging 类 Level - Java 中文参考手册

    java lang Object java util logging Level 所有已实现的接口 Serializable public class Levelextends Objectimplements Serializable L
  • Hyperledger Fabric Node.js开发中如何使用日志

    Hyperledger Fabric Node js开发中如何使用日志 本教程就来演示下如何使用hyperledgefabric node js客户端日志记录功能 概述 hyperledger fabric node js客户端日志记录使用
  • Ubuntu20.04,samba服务器搭建。

    0 前言 推荐个电视剧吧 百看不厌 雍正王朝 这篇博客没什么技术含量 纯粹的表现一下我的勤劳 1 Ubuntu 安装 终端输入 sudo apt install samba samba common 配置需要共享的目录 新建目录 自定义 用
  • 敏捷开发“松结对编程”实践之四:日常工作篇(大型研发团队,学习型团队,139团队,师徒制度,检查点,代码审查,每日立会)

    转载自 http blog csdn net cheny com article details 6590360 本文是 松结对编程 系列的第四篇 之一 之二 之三 之四 之五 之六 之七 之八 此系列之九及之后文章请见栏目总目录 团队中常