李小波——新加坡 SmartTokenLabs技术总监、极限编程教练。CSP-SM,CSPO,CSD,DevOps Master,Scrum@Scale,前 ThoughtWorks 高级咨询师,首席培训师。前UPerform资深敏捷教练,首席工程教练。
▼
叮~
叮~
咻~
IM 消息和邮件,把我们的时间切得稀碎。
而写代码,需要一段比较长的时间才能进入状态,所以我们往往在白天根本写不了什么代码,只能等晚上测试同事,业务同事,客户都下班后,静静地挽起袖子撸点代码。
然而,经过一天的碎片化信息和多任务切换后,我们的精力已经消耗殆尽,Bug 就会趁虚而入,很难说写出的功能多些还是 Bug 多些。白天来临,业务同事,测试同事回到工作岗位后,就会发现我们用心写出的这些 Bug,给我们发消息确认,准备数据,配合重现和确认,修改代码,再次验证。
如果 Bug 流入生产环境,一旦客户发现,马上上升到最高等级,不管你正在做什么,必须停下手里的工作去救火。我们本就破碎的时间碎的更加彻底了,更不能专心写好代码了呀。
聪明如你,肯定看出来了,这是一个恶性循环呀。
你说那我不回消息可以吗?
不行,如果没有及时回复别人,在绩效沟通时可能就会得到一个「不善于团队合作」的评价。别说升职加薪了,不被「优化」就谢天谢地了。
我也一直有这样的苦恼,但是最近我加入的一个团队,却颠覆了我的认知。
我以 Android 技术负责人的身份加入团队,因为刚入职,很多「杂事」还没有交接到我手上,所以我现在可以说是一名普通的开发。
这两个月简直是我13年职业生涯中最享受的一段时光,所以一定要跟你聊聊。
典型的一天是这样的:
1、上午,写 3 个小时代码
2、下午,写 3 个小时代码
3、代码写完后,发 Pull Request
4、查看 GitHub Issues,看看有哪些需求和 Bug,挑选优先级最高的,分析理解,需要明确的就在对应的 Issue 里留言 @同事
5、看一下之前的PR,有没有什么问题需要解决的
6、看一下其他人的PR,Review 写反馈
7、下班前查看和回复邮件,简要总结当天完了哪些工作,文字发到 Discord 站会频道里。
每周仅有半个小时全员会议,COO 分享公司的大事,跨团队提问和信息共享,需要详聊的再单独约小会。
每月一次回顾会议,联络感情和改进协作方式。
这个团队里,几乎没有点对点的即时消息,几乎没有邮件。
你说,这样的工作方式,是不是最适合程序员的工作方式?!
>异步工作
我在 2012 年拥抱敏捷开发,后来又做了几年「敏捷教练」,这几年看到敏捷正在被广泛接受,敏捷 12 条原则的第六条,一直是我非常认可和鼓励的:
不论团队内外,传递信息效果最好效率也最高的方式是面对面的交谈。
但是我加入的这个新团队,却采用「异步工作」的方式,并且运作良好,这有点颠覆我的认知了。一开始我也觉得,这能行吗?
两个月体验下来,发现「异步工作」真香。
我们这一代,大部分人英语的读写能力高于听说能力。面对面沟通的时候,老让对方「Pardon」,双方都难受,效率不高,还伤感情。
但是我们大部分程序员,看文档写邮件都没有问题,实在有问题用翻译软件加持一下也能蒙混过关。
所以在这种情况下,面对面沟通真的不一定是最高效的方式。
从另一个角度讲,如果我们工作中80% 的内容是传递信息,我们肯定不能忍受低效的沟通方式。但如果我们工作中的80% 甚至90% 都是独自创造,只有一小部分是需要信息交换,那么就算沟通效率低一点,影响也不会很大。
那我们来看一下,程序员这个工种,大部分时间是在独自创造还是传递信息呢。我认为没有绝对的答案,但有一些规律可循。开发底层的东西,前者的比重可能会更大一些,开发面向用户的东西,沟通协作的工作就会多一些。不管是底层框架还是业务团队,在团队内也有分工,有些人擅长干「大活儿」,领导就会把大活儿给他,把其他琐碎的活儿给别人,让他能专注地干好大活儿。
不管是什么业务,我认为:
软件团队的健康状态,应该大部分人的大部分时间是用于独自创造,少部分时间用于沟通协作。
如果我们期望高质量,高效率,高价值,就需要「深度工作」的状态。干「大活儿」,就需要进入「深度工作」。回 IM,邮件都是属于「肤浅工作」,很难带来极大的成就感和满足感。
所以你才会觉得一天忙得上厕所都要小跑,等到了下班的点儿,却感到无尽的空虚和焦虑,然后就会不由自主地通过加班来弥补。
想从工作中创造更大价值,获得更多成就感,《深度工作》这本书值得一读。
>为什么异步工作有效
其实我们不难发现,再好的方法,在某些人身上也不管用,再烂的方法,在某些人身上也有管用的时候。在探究「为什么管用」时,其实真正值得关注的是「怎么让它管用」。
通过我的观察和实践,我觉得下面这几点很重要:
• 结构化表达
• 高度透明
• 开发者测试
• 鼓励全栈
我们一个个展开聊聊。
>结构化沟通
首先,这是一个成员分布在9个时区的团队,你上班给人家发消息,人家可能还在温柔乡里呢。所以要是一来一回的发消息,那可能三天都还没做完自我介绍。
很久很久以前,没有电话和微信,我们只能通过写信跟远方的朋友联系,没有人会傻到一次只写一句话,或者不超过140 字吧。
沟通成本越高,单次沟通的信息量越大。沟通的成本越低,单次沟通的信息量越少。
所以想要减少低效的碎片化沟通,可以尝试增加沟通成本。
程序员的工作中主要打交道的无非产品经理,业务分析师,客户,测试工程师,还有其他程序员,比如前后端联调,系统间联调等。
沟通场景主要有几类:
• 需求获取,澄清和验收
• Bug 重现,确认和验收
• 接口定义,联调
不管是书面沟通还是面对面沟通,文字和声音都只是传递信息的一种媒介而已。
真正决定沟通效率的,是沟通的内容本身的质量。
就好比外卖时效性很高,但送过来的是一坨翔,你会给他点五星好评吗?
所以你看优秀的开源项目,在提需求和缺陷的时候,都要遵循一定的格式。这里吐槽下国内的工具厂商,他们为了满足所有人的需求(也可能是搞复杂才好卖钱),往往做的大而全,几十上百个字段,一看就头大了,导致填的时候都很敷衍,重要的信息都靠 IM 一问一答一点点挤出来,真的还不如一个消息模板好用。
比如一个缺陷要包含:重现步骤,期望行为,实际行为,截图,版本号,错误消息等。而不是「你这里好像有点问题」,「这个按钮点不动啊」,「那个功能好像挂了」。
还有的公司考核缺陷率,为了维护良好的同事关系,测试人员也不会直接上系统给开发人员提缺陷,而是先用 IM 沟通,这也导致很多低效的一来一回的对话。这又是另一个话题,感兴趣再聊。
>高度透明
还记得前面提到的第六条敏捷原则吗?
不论团队内外,传递信息效果最好效率也最高的方式是面对面的交谈。
在我看来,传递信息更有效的方式,是把信息放在人人都能轻松获取的地方。
这就是为什么 Trello 类的看板工具,飞书/Slack/Discord 之类的工具这么火爆的原因。还要有 Confluence,Notion这样的团队共享知识空间,重视知识积累和更新。
我入职第二天,体验设计师就发给我 3 个他录制的视频,讲解他在 Zeplin (国外的蓝湖)上是如何组织设计图的。要怎么找到布局,图片,字体和颜色等参数。这样就不用每来一个新人都去问他了。
但也要小心知识爆炸,给团队带来不必要的压力。
创造和管理知识的时候,要尽量让知识只在需要的时机出现。通过标题,标签等手段使其容易被检索到。这点我们会在周三晚的直播中更深入地聊(文章最后有链接)。
>开发者测试
测试代码就是产品代码的使用说明书,并且是自动化的回归测试。开发者在编写测试代码时,对业务的理解会更加清晰,代码质量会更高,其他人在使用到别人的代码时,可以通过阅读测试代码来更好地理解每个方法的输入输出,在需要修改时,也有信心去修改,因为只要修改后测试还能运行通过就基本没有问题,测试不通过就去修复测试就好了。
你看开源项目几乎都是「异步工作」,优秀的开源项目测试代码写得都很不错。
所以国内有些大厂做开源也好,「内部开源」也好,都没啥人用,别说测试代码没有了,可能连 README 都是一片空白。
>鼓励全栈
程序员中存在一个很不好的现象,用 Mac 的鄙视用 Windows 的,用 Terminal 的鄙视用 GUI,用 Vim 的鄙视用 IDE,甚至用外接键盘的鄙视用自带键盘的。
前端说后端不就是增删改查吗?后端说前端不就是堆堆页面吗?
但是出了问题,总觉得自己这块没问题,问题在对方那边?这很不合逻辑啊,问题不是应该更容易出在比较复杂的那边吗?你可能会说,我这边是更复杂,但是我聪明又细心啊。
那就更可怕了,你跟不聪明又不细心的人一起工作,你确定只是一个巧合吗?
更有可能的是,你拥有的一切,都是因为你「值得」拥有,说难听点就是你「只配」拥有这样的。
所以,停止抱怨,去提高自己,你才会拥有更好的。
如果你是前端,你去精进前端技术,你就会遇到更好的后端。因为精进了之后你可能会拿到更好的 Offer,或内部转岗到更优秀的团队,你遇到好人的几率就会更大一些。
另一个方向是,反正你都觉得很简单,干脆去学习一下,去做全栈,前后端都一个人做了,这样就不用跟别人扯皮了。如果项目中前后端都用现成的框架,比如前端用 React,后端用 SpringBoot,那真的不难学。甚至你用 React 都不应该称自己为前端工程师,真正的前端工程师是开发 React 的人,真正的后端工程师是开发 SpringBoot 的人,我们都是业务开发工程师而已。
>怎么开始尝试
团队约定一个静默时段,比如每天上午的三个小时,不要开会,不要发消息回消息。那你说要是团队外有紧急的事怎么办?可以轮流值班,每周有一个人来处理对外沟通的事。
关于知识管理,异步工作,远程工作等话题,欢迎来今晚的直播留言互动,也欢迎来 K+ 深圳峰会现场交流。