CategoryResourceRepost/极客时间专栏/研发效率破局之道/工程方法/20 | 答疑篇:如何平衡短期收益和长期收益?.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

122 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<audio id="audio" title="20 | 答疑篇:如何平衡短期收益和长期收益?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/0d/bf/0d5527ebd1097ff2881c125285f5cfbf.mp3"></audio>
你好,我是葛俊。今天,我来针对“工程方法”模块的留言问题,做一次集中解答与扩展吧。
针对“工程方法”模块的文章,很多同学留下了精彩的留言,阐述了自己对研发效能的认识、遇到的问题以及解决方案。
虽说我已经一一回复过你们的留言了但有些问题在我看来非常有价值值得再扩展一下。所以我今天挑选了3个典型问题进行详细回答并对每一个问题延展出一个话题和你讨论希望能帮助你加深对这些问题的理解切实帮助你提高你或者你团队的研发效能。
## 问题一:因为赶进度就慢慢不做代码审查了
@john_zhang同学在[第13篇文章](https://time.geekbang.org/column/article/138389)中,提出了这样一个问题:
>
我们推行过一段时间的代码审查,因为团队只有三五个人,所以采用的是团队审查,每天半个小时左右,可惜后来赶开发进度,慢慢就没做了。现在开发同事总是以赶进度为由,不太认同代码审查,怎么破?
这条留言下有好几位同学都点赞了,看来这是一个常见的情况。所以,我再和你分享下针对这个问题的具体解决办法吧。
1. 团队统一思想,代码审查是有效工作的一部分,应该计算到工作量里面。
1. 减少团队审查,更多地使用工具进行一对一的代码审查。因为团队审查很难做到效率高,所以应该只是针对一些重点的提交才采用这种方式。
1. 培训团队,统一认识,让大家看到代码审查的长期收益,比如考虑代码的可维护性以及后续添加新功能的速度,而不只是盯住当前的开发进度这个短期收益。甚至,我们可以把代码审查这个操作,作为团队的制度要求大家执行。
**说到这里,又涉及了长期收益和短期收益的冲突要怎么权衡,这也是我们普遍关注的一个问题。接下来,我再和你扩展下这个问题吧。**
比如,不止一个同学提到“公司连给研发人员配置好一点的电脑的意识都没有,何谈研发效能?” 的确,使用配置低的电脑能够节省当前的开支,但是会损害长期的开发效率。这里的短期利益便是当前开支,而长期利益就是公司的长期产出。
又比如,我在[第14篇文章](https://time.geekbang.org/column/article/138916)中与你讨论的技术债问题,借债是考虑短期利益,而还债考虑的就是长期利益。
从这些例子可以看到,**短期利益和长期利益往往会存在冲突,我们必须做好取舍,才能最大程度地提高研发效能**。在我看来,短期利益和长期利益的权衡,可以重点考虑以下两个方面。
第一,寻找两者最佳的平衡点。比如,在一条线段上,最左边的端点是只关注短期利益,最右边则是只关注长期利益,两个极端情况都不好。但是,我见到的大部分情况是,团队做的选择会特别靠近最左边。虽然说有些选择是出于业务压力情非得已,但有相当一部分情况,是因为短视造成的。**由于太追逐眼前利益,而造成长期的生产力下降、研发人员积极性下降、产出降低的例子比比皆是**。
为了避免后劲不足的情况,我们必须往中间移动,找到最佳平衡点。
<img src="https://static001.geekbang.org/resource/image/4b/f9/4b78ec355ba10aa352ce87ad63f77cf9.jpg" alt="">
第二随着时间推移这个最佳平衡点也会有变动。比如在第14篇文章末尾我给你举的A、B、C三个公司对待技术债的案例。C公司在不同的时间分别选择了最合适的平衡点很好地平衡了借债与还债从而获得了竞争优势。这里我建议你结合长期利益与短期利益的权衡再返回[第14篇文章](https://time.geekbang.org/column/article/138916),回顾下这个案例。
## 问题二:截屏上传工具链的实现
在[第11篇文章](https://time.geekbang.org/column/article/136070)中我与你介绍了一个截屏工作链具体步骤包括截屏、上传图片、获取URL、缩短URL、保存到系统剪贴板。这样一来我们使用快捷键触发截屏流程之后就可以直接用Cmd+V把图片的短URL粘贴到Commit Message或者聊天工具中了。
有许多同学对这个工具很感兴趣询问我如何实现以及是否有对应的开源产品。不过遗憾的是我没有找到对应的开源产品和方法。所以我再和你说说我之前在Stand公司时是如何实现的吧
- 图像存储用的是Google Drive
- 截屏上传工具是[Share Bucket](https://fiplab.com/apps/sharebucket-for-mac)。它支持上传到指定的Google Drive同时还支持存储URL到剪贴板。还有一个类似的工具是[MonoSnap](https://monosnap.com/welcome)。
至于URL缩短服务我们当时并没有使用。如果你考虑使用的话可以看一看开源的[YOURLS](https://github.com/YOURLS/YOURLS)。
这里,感谢@日拱一卒同学,和我们分享了他们公司的实现方法:
>
我们的解决方案和你说的差不多,涉及到不同的工具,处理方式不太一样。
<ol>
- 如果工具本身支持图片存储例如ZenHub或者JIRA我们用工具本身来存储图片。
- 如果工具本身不支持图片存储,就用公司提供的网盘来存储图片,在工具中引用相关的链接。
</ol>
在我看来,第二种方法会更好一点。因为有一个统一存储图片文件的地方,不同的工具都可以指向同一张图片。
其实在Facebook还有另外一个类似的工具链只不过它针对的不是截屏而是拷贝文本。
我们在工作中常常会针对一段文本进行讨论,但如果这段文本特别长的话,把它拷贝到讨论工具中,就会占用很大的空间。所以,我们就用了一个工具链来解决这个问题。使用步骤也类似:
1. 拷贝要讨论的文本。
1. 用快捷键触发工具链。这些工具会自动把文本上传到一个服务器然后把URL缩短并把缩短后的URL保存到系统剪贴板里。
1. 使用快捷键Cmd+v把短URL粘贴到讨论工具比如Commit Message其他人点击这个URL就可以到文本服务器上查看具体的文本内容。
这个工具链涉及了文本存储服务,[PasteBin](https://pastebin.com/)是目前最流行的工具不过它并没有开源而且只提供SaaS服务。而我们日常工作中拷贝的文本通常是不能放到公网上的。所以PasteBin很可能不适合你。这里我推荐一个类似的开源工具[HasteBin](https://github.com/seejohnrun/haste-server),你可以安装到公司内网使用。
关于这个截屏工具流,**我想扩展的一个话题是,研发效能的提高带来的量变会产生质变**,也就是说研发效能的提高,可能看起来只是做事情快了一些,产出高了一些,甚至有人会认为这并没有什么太大的作用。但实际上,效能提高累积到一定阈值之后,就可以带来质变。
以截屏工具链为例。在没有类似工具链的情况下虽说可以手动实现上面的工作但因为操作步骤太繁琐所以我们在Commit Message里很少使用截屏。而这个工具链将这些繁琐的操作简单化了由此带来的效率提升让绝大多数开发者都乐于在Commit Message中使用截屏去讨论问题。也就是说这个工作流带来的效能提升累积到了一定的阈值之后引发了质变。
提升研发效能的量变带来的质变,另一个表现是,效能的提升增强了公司整体的竞争力。当效能提高到一定程度的时候,就可以在公司竞争中起到重要作用甚至是决定性作用。
在我看来,这并不是夸大之词,尤其是在软件开发行业逐步成熟,需要比拼研发效能的今天。
## 问题三Facebook的SEV系统是做什么用的
@Geek_f0179a同学在[第4篇文章](https://time.geekbang.org/column/article/128867)中问到Facebook有一个SEV复盘系统这个系统的主要功能是什么会记录哪些关键信息呢
SEV系统是一个事故响应及根因分析系统SEV是严重性“Severity”的前三个字母。这个系统会根据事故的严重性为其分配一个数字大概是1~4SEV1最严重SEV4最轻。每次发生事故除了记录严重性之外还要按时间顺序记录事故发生、发现、定位、解决、确认解决过程的每一步的时长和具体操作细节。
每周公司都会定时举行SEV讨论会基本只讨论严重的问题比如SEV1和SEV2的事故。会议由高层管理者主持事故责任人轮流进入会议室对事故进行描述和讨论。
这个会议的主要目的是对事故进行回溯分析根因以及如何避免再次出现类似问题。也就是说SEV系统的目的重在总结提高不要多次重复同一个错误如果重复犯错要惩罚。
SEV系统的效果很好在避免问题重复出现的同时我们也比较敢于试错至少从我的经验看是这样的。
**针对这个事故复盘系统,我想扩展的话题是:出现问题之后,到底应不应该追责,应该怎样追责?**
在我看来,考虑这个问题应该从最终目的出发。复盘的目的是最大程度地减少以后再出现同一个问题的概率。那我们应该怎样处理呢?
如果每个错误都要惩罚,就会有以下几个问题:
- 因为害怕惩罚,尽量去掩盖问题而不是暴露问题、分析问题,或者尽量撇清责任甩锅。
- 惧怕闯祸,团队成员开始信奉“多做不如少做”。
- 因为担心指出别人的问题,会让他受罚,结果就是不愿意得罪人,导致问题被隐藏。
而另一个极端,如果犯错没有任何惩罚的话,又会造成以下问题:
- 同样的错误一犯再犯。
- 没有奖惩造成不公平。这就会让原本认真工作的员工失去认真做事的动力,降低对代码质量、产品质量的关注,提高质量的工程措施(比如,单元测试、开发自测等)更是难以推广。
所以,在我看来,针对错误更有效的处理方法应该是,以保持团队的主动性、责任感和执行力为原则,具体措施包括:
- 追究责任,但不是惩罚。知其然并知其所以然,搞清楚前因后果,避免重复犯同一个错误。
- 重复犯错一定要惩罚。
- 反复问为什么,找到根本原因。
## 小结
好了,以上就是今天的主要内容了。如果有哪些你希望深入了解还未涉及的话题,那就直接给我留言吧。
接下来我们就会开启新的模块了进入个人效能的讨论了希望这个模块能够帮助你提升个人效能持续成长成为10x开发者提升个人竞争力。
感谢你的收听,欢迎你在评论区给我留言分享你的观点,也欢迎你把这篇文章分享给更多的朋友一起阅读。我们下期再见!