《A++ 敏捷开发》- 16 评审与结对编程

客户:我们的客户以银行为主,他们很注重质量,所以一直很注重评审。他们对需求评审、代码走查等也很赞同,也能找到缺陷,对提升质量有作用。但他们最困惑的是通过设计评审很难发现缺陷。
我:你听说过敏捷的结对编程吗?
客户:听过,也给客户做过培训,但是一般管理层都接受不了用两个人干一个人的活,所以几乎都没有团队在实际工作中使用。
我:单做培训确实难以推动并持续,必须按3步走,按部就班才有效果,让我分享一下。

背景

4月

现场结对编程培训之前8个月,首次见这家客户的总监。他们想用一年时间改进软件开发质量。事后知道原来他们有个超过12月的大型项目,因为验收时质量不达标,不能通过风险的验收测试,被拒收。因为公司是老字号,不想影响声誉,请求客户给机会让他们重头再做,客户同意但估计产生的损失超过100万,所以高层下定决心必须改进软件质量,避免类似情况再发生。

7月

与客户签了CMMI服务合同后首先做差距分析, 首先收集各领导的关注点。
某部门经理最担心的是系统维护:如果有人员离职,新人要花很长时间才能上手。
技术总监更担心是有些交付后的缺陷会很花工作量:如某系统交付后开始使用的时候很正常,但过了9个月,用户量和数据量都增加了,偶尔会出现有些报表出错,我们架构师、工程师等,花了3个半月才发现其中某接口的参数有问题。
另外发现开发人员水平参差,也没有做好单元测试和代码评审,代码可读性低,其他程序员难以理解,在分析后的汇报里,建议利用TDD和面向对象的设计原则改善编码规范,并加强培训,推行结对编程培训,提高代码的可读性,方便日后维护。
最后发现很多项目资源不足,没有充分的时间确保代码的质量。

给管理层汇报
因缺陷绝大部分都是后期测试才发现、缺陷修改的总工作量很大(估计占项目总工作量30%),建议加强开发单元测试。
因代码都是个别程序员负责,建议团队用结对编程,除了能提高质量也防止一人离开其他人无法跟进的风险。
也预警管理层开始时要预留15-25%时间给开发团队,当后面返工量减少,以后的总工作量会降低(生产率提升)。

2天培训课

第一天讲面向对象设计原理,设计模式,测试驱动开发;
第二天讲结对编程:

Interview Parnas Screenshot 2025-01-21 162541.jpg

问:在软件工程常被忽略的最大风险是什么?

答:不称职的开发人员。据估计,美国需要的程序员数量超过20万。这完全是误导。这不是数量问题。我们有质量问题:一位糟糕的程序员一年内便很容易就会产生两个新岗位(的工作量)。如果我们有更多优秀的程序员,并且能够轻松识别他们,我们需要的就会减少,而不是增多。

“也有人说:“卓越的程序员比优秀的程序员,不仅是好一些,而是倍数级的差异。”
请问你们觉得团队里程序员的水平也存在很大的差异?”
培训开始,对应以上幻灯片,我问大家。

你们是否觉得:

  • 交付后的软件难以维护
  • 其他人难以读懂其他人的代码,员工离职后其他成员难以跟进和维护
  • 代码总体设计不好,如缺乏良好架构,不灵活
  • 系统交付后,有些缺陷需要很长时间才能修复好

如大家希望提高代码质量,必须从人入手。

如果你们团队也有同样问题,有什么好的解决办法呢?培训?
编码的最佳学习方式并非读书,而是动手做,所以单靠搞内部培训效果有限。有什么好方法帮助开发人员提升?

代码评审

就算评审规范做得很好能帮助初级程序员提升吗? 很难,因为代码都已经写完了。
比如我跟另一位老师看团队的代码,他们都写了起码几千行。我们的结论就是:虽然代码的设计很有问题,但已经到了这个地步,除非重写,否则单靠修正部分代码并没有帮助。这也是代码评审常常难以做好的主要原因。而且大家都要面子,如果在评审里,直接说他设计有问题,也可能会影响到大家的关系,所以在设计评审时难以找出缺陷,这很正常。
团队主管看程序员代码 只能把关防止严重错误,对程序员提升没有作用,所以评审不能有效保证代码质量,也不能帮助团队能力提升。
当写完了几千行代码后,就很难在评审时要求开发改动。程序员会觉得又不是不对,测试也跑得通,为什么要改。所以代码的质量问题应在写的时候就避免,这是结对编程的原理。你可以把结对编程看成是提高团队之间互相交流的培训方法。因为结对编程是在编码时针对具体问题集思广益进行解决,很容易落地,效果会比培训或评审好。
两个人互相讨论写代码才就是有效的培训,不能单挑单靠设计和编码规范和指南。

培训设计

有些人误以为:

  • 结对编程必须要找一位合适的搭档,人与人之间是否合得来最重要
  • 结对时只是在旁边看
  • 以为仅仅是教同伴应怎么做
  • 以为只是看,作为人手编译器,只看代码是否写对,能否通过编译

我们针对这些重点设计一天培训。

培训重点

要培训有效,必须利用练习,让学员动手动脑筋。

结对编程和实践说明

练习#1和讨论:代码阅读
结对编程说明

练习#2和讨论:设计和结对编程
练习#3和讨论:Code Review和Pair Programming
练习#4 怎样开始结对编程:10分钟结对编程
讨论:10分钟正确结对编程
练习#5:队伍结对编程
Pair-Solo Programming

练习一:用10条代码实例,每一条分A与B两种方式写,问学员那种更容易读懂,说明代码应怎样写才能让一般人容易读懂
练习二:先自己按面向对象做总体设计 然后两人结对分享设计做出最终设计学员讨论结对是否有效
然后解释若要持久,必须轮流替换伙伴,也介绍各类结对方式的利弊,例如:

Public-private pair programming ; pair - solo programming

练习四:先2人试试结对
练习五:六人为一队,轮流合作写程序,让学生体验交换。(详见附件)

经验分享

结对编程需要2人对话沟通,例如某人写代码时,另外一个人提问题,有些不习惯编写代码边说话沟通,培训时,预先写好台词。如果想多了解结对编程如何沟通,可参考书的实例。
有些程序员比较内向,不想说话,我们会用角色扮演: 先写好台词,让他们展示在结对编程时如何沟通。 帮助他们先打出一步,鼓励尝试。
注:如果想了解结对编程如何沟通,可以参照Robert MARTIN先生的保龄球游戏实例(参考书里第6章),了解两个人如何从需求、总体类设计、按TDD写单元测试用例、然后写代码,让它通过,一步一步最终完成整个程序。

总结

培训开始时用例子说明结对编程除了能帮助团队知识分享和提高团队精神以外,更能:

  • 提高代码质量和可读性(编码规范)
  • 提高代码复用
  • 加强测试驱动开发

利用互动练习让学员亲身体验结对编程的原则:

  1. 一边写代码一边说
  2. 提问,如:这方法是否归为这个类
  3. 每人带纸和笔(最好铅笔)
  4. 不断想复用

--- *** === *** ---

客户:我猜你说的3步是:
第一步,高层认同软件质量问题的严重性,为此交过学费,知道损失多大
第二步,管理层不仅了解软件的质量问题和改善措施,更需要内部立项做培训和投入资源(人力),做过程改进
第三步才是具体的培训课。因为缺乏第一步和第二步,所以之前做完了结对编程培训后,没有效果
我:厉害,完全对。结对编程只是改进的一种方法,如果高层不关注、不立项、不投入资源,不会有改进效果。
结对编程这方法在70年代已经开始,与TDD、代码重构已经都经过验证能有效改善质量减少返工。所以结对编程本身没问题,要解决的问题是总体质量改进。
若要成功推行结对编程,必须先说服管理层,投入时间和资源,但投资会有好回报。
结对只是一种有效的改进方法,团队必须有每个迭代回顾,持续提升的好习惯,不可能单靠管理层下命令来推行,更好是团队自己有改进的动力,选择使用结对编程来提升质量,减少返工。


本章最佳实践对应

  • CMMI
    • 单元测试:PR 2.X 3.X 所有实践
  • XP
    • 结对编程,代码共同拥有 都是XP里的实践

附件

Ex 5

时间组一组二组三
1A 和 B 结对并打开信封XC和D结对并打开信封YE和F结对并打开信封Z
看清楚需求,然后把X掉了看清楚需求,然后把Y掉了看清楚需求,然后把Z掉了
A和B 开始结对编程,A写B看C和D开始结对编程,C写D看E和F开始结对编程,E写F看
2过了4分钟转换
3F和A结对编程X ,F写A看B和C结对编程Y ,B写C看D 和E结对编程Z ,D写E看
4过了4分钟转换
5E和F结对编程X,E写F看A和B结对编程Y,A写B看C和D结对编程Z,C写D看
6过了4分钟转换
7……
……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973648.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP房屋出租出售高效预约系统小程序源码

🏠 房屋出租出售高效预约系统 —— 您的智能找房新选择 💡 这是一款集智慧与匠心于一体的房屋出租出售预约系统,它巧妙地融合了ThinkPHP与Uniapp两大先进框架,精心打造而成。无论是小程序、H5网页,还是APP端&#xff…

给老系统做个安全检查——Burp SqlMap扫描注入漏洞

背景 在AI技术突飞猛进的今天,类似Cursor之类的工具已经能写出堪比大部分程序员水平的代码了。然而,在我们的代码世界里,仍然有不少"老骥伏枥"的系统在兢兢业业地发光发热。这些祖传系统的代码可能早已过时,架构可能岌…

Repeated Sequence

记suma[1]a[2]a[3]...a[n]。 该序列以a[1],a[2],a[3]....a[n]为循环节,明显的,问题可转化为:s%sum是否为该序列的某个连续子序列和。 断环为链。将a复制一份。 枚举a[i]为左端点的所有区间的和。再查找s是否存在。二分O&#x…

【DeepSeek】Mac m1电脑部署DeepSeek

一、电脑配置 个人电脑配置 二、安装ollama 简介:Ollama 是一个强大的开源框架,是一个为本地运行大型语言模型而设计的工具,它帮助用户快速在本地运行大模型,通过简单的安装指令,可以让用户执行一条命令就在本地运…

dockerfile 使用环境变量

ARG: Defining build-time variables ARG指令允许您定义在构建阶段可以访问但在构建映像之后不可用的变量。例如,我们将使用这个Dockerfile来构建一个映像,我们在构建过程中使用ARG指令指定的变量。 FROM ubuntu:latest ARG THEARG"fo…

基于WebGIS技术的校园地图导航系统架构与核心功能设计

本文专为IT技术人员、地理信息系统(GIS)开发者、智慧校园解决方案架构师及相关领域的专业人士撰写。本文提出了一套基于WebGIS技术的校园地图导航系统构建与优化方案,旨在为用户提供高效、智能、个性化的导航体验。如需获取校园地图导航系统技…

idea连接gitee(使用idea远程兼容gitee)

文章目录 先登录你的gitee拿到你的邮箱找到idea的设置选择密码方式登录填写你的邮箱和密码登录成功 先登录你的gitee拿到你的邮箱 具体位置在gitee–>设置–>邮箱管理 找到idea的设置 选择密码方式登录 填写你的邮箱和密码 登录成功

【从0做项目】Java音缘心动(3)———加密算法 MD5 BCrypt

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 零:项目结果展示 一:音乐播放器Web网页介绍 二:加密算法介绍 1&…

新数据结构(12)——代理

什么是代理 在进行操作时有时不希望用户直接接触到目标,这时需要使用代理让用户间接接触到目标 给目标对象提供一个代理对象,并且由代理对象控制着对目标对象的引用 图解: 代理的目的 控制访问:通过代理对象的方式间接的访问目…

基于大语言模型的推荐系统(1)

推荐系统(recommendation system)非常重要。事实上,搜索引擎,电子商务,视频,音乐平台,社交网络等等,几乎所有互联网应用的核心就是向用户推荐内容,商品,电影&…

学习threejs,使用MeshBasicMaterial基本网格材质

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshBasicMaterial 二…

Selenium实战案例2:东方财富网股吧评论爬取

上一篇文章,我们使用Selenium完成了网页内文件的自动下载,本文我们将使用Selenium来爬取东方财富网股吧内笔记的评论数据。 网页内容分析 网页内容的分析是web自动化中的关键一步。通过分析网页结构,我们可以确定需要抓取的数据位置以及操作元素的方式。…

零基础学python--------第三节:Python的流程控制语法

Python,浮点数 11.345(单:4个字节, 双:8个字节) 。 十进制的数字25 ---> 11001 讲一个小数转化为二进制: 不断的乘以2 。取整数部分。 十进制的0.625 ----> 二进制: 0, 101 。 0.3 ---…

MKS SERVO42E57E 闭环步进电机_系列10 STM32_脉冲和串口例程

文章目录 第1部分 产品介绍第2部分 相关资料下载2.1 MKS E系列闭环步进驱动资料2.2 源代码下载2.3 上位机下载 第3部分 脉冲控制电机运行示例第4部分 读取参数示例4.1 读取电机实时位置4.2 读取电机实时转速4.3 读取电机输入脉冲数4.4 读取电机位置误差4.5 读取电机IO端口状态 …

小米路由器 AX3000T 降级后无法正常使用,解决办法

问题描述 买了个 AX3000T 路由器,想安装 OpenWRT 或者 安装 Clash 使用,看教程说是需要降级到 v1.0.47 版本。 结果刷机之后路由器无法打开了,一直黄灯亮,中间灭一下,又是黄灯长亮,没有 WIFI 没有连接。以…

强化学习-GAE方法

2016-ICLR-HIGH-DIMENSIONAL CONTINUOUS CONTROL USING GENERALIZED ADVANTAGE ESTIMATION 解决问题 强化学习的目标为最大化策略的预期总回报,其中一个主要困难为 行为对reward的影响存在一个长时间的延迟(credit assignment problem)。价…

写大论文的word版本格式整理,实现自动生成目录、参考文献序号、公式序号、图表序号

前情提要:最近开始写大论文,发现由于内容很多导致用老方法一个一个改的话超级麻烦,需要批量自动化处理,尤其是序号,在不断有增添删减的情况时序号手动调整很慢也容易出错,所以搞一个格式总结,记…

清华大学deepseek教程第四版 DeepSeek+DeepResearch 让科研像聊天一样简单(附下载)

deepseek使用教程系列 DeepSeekDeepResearch 让科研像聊天一样简单(附下载) https://pan.baidu.com/s/1VMgRmCSEzNvhLZQc8mu6iQ?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/f3d4511b790a

面阵工业相机提高餐饮业生产效率

餐饮行业是一个快节奏、高要求的领域,该领域对生产过程中每一个阶段的效率和准确性都有很高的要求。在食品加工、包装、质量控制和库存管理等不同生产阶段实现生产效率的优化是取得成功的关键步骤。面阵工业相机能够一次性捕捉对象的二维区域图像,并支持…

Linux基础开发工具的使用(apt、vim、gcc、g++、gdb、make、makefile)

Linux软件包管理器–apt Linux安装软件的方式 在Linux下安装软件的方法有以下三种: 下载到程序的源代码,自己编译出可执行程序获取deb安装包、然后使用dpkg命令安装。(不解决依赖关系)通过apt进行安装软件。 小知识点&#xf…