如何更好地给同事讲代码?

  我们技术团队有两个习惯:一是程序员写好一个新的比较重要的系统,或是引入了一个第三方框架或库后,主程会要求程序员做一个ppt,在会议室里给所有程序与QC做一次团队分享;二是程序员写好一个新系统,或做了比较大的或比较重要的修改后,要知会相关QC,并把QC叫到电脑前,一对一把相关代码给QC讲一遍。

  我认为做ppt团队分享可以起到两个重要作用:一是让团队成员之间时常互通有无,避免各人只了解自己手头负责的一小块内容;长期保持这种习惯,可以很好地增进技术团队的凝聚力,也可以帮助技术团队保持敏捷。二是分享用的ppt同时也可作为开发文档,留在版本库中供日后查阅。

  不过在会议上给大家讲代码时,经常会遇到一个问题:代码讲太细太深入了,大家就容易听不懂,因为大部分人毕竟没有具体关注过我做的这块业务。听众一旦不懂,就容易走神,精力不是很好的还会犯困,甚至睡着都有可能。所以我觉得,至少对我们团队现阶段来讲,直接在会议上让众人集体做代码审查是不合适的,会比较浪费时间。

  那么如何让这种分享真正发挥出它的价值呢?我想关键还是把握住“互通有无”这个目的,把握好度。ppt分享的目的是让大家知道我的业务流程与数据结构长什么样,代码框架如何,其中每个模块的主要职责是什么,有什么重要接口;日后如果某位同事的工作涉及到我这个系统,他在开工前能想起我的系统是相关的,我的分享目的就基本达到了。如果他需要再深入了解我的系统,当他找回我的ppt,能迅速找到这个系统的代码,并且阅读ppt和代码的过程中能想起一点我讲的东西,加快他理解代码的速度,那我的分享目的就完美达成了。ppt分享的目的不是让大家对着我的代码查bug,更不是让大家当小黄鸭(见小黄鸭调试法),因为大家的时间都很宝贵。

  因此我打算采用以下思路做ppt分享:

  1、首先预估好分享用的时间,一开始就要告诉自己时间有限,要讲重点,不要事无巨细。人的平均连续专注时间据说只有40多分钟,大约是一节课时间。在我们平常紧张的开发节奏之下,大家可能会更容易疲倦,因此时间应该更短点。最好控制在20分钟以内,再不够就半小时,别超了。

  只要一开始定好量定好时间,整个ppt分享的调调就基本定下来了,后面做ppt就容易把握重点,讲ppt时也不会一开始就很悠闲,后来就越来越悠闲(让听众想睡),或者反过来发现时间不够用。如果觉得系统太大内容太多,那就将内容再压缩,讲的粒度再粗点。任何系统任何内容都可以有针对性地以任何粒度表述给别人听,这是我读研究生那几年做学术报告的一个重要体会。

  2、ppt开头,先告诉大家我做的这块东西是为了解决什么问题,实现什么功能。比如我最近做的随机名字搬到服务端的工作,是为了保证玩家申请到一个随机名字后,一定可以用这个名字创建新角色,而不会出现“名字被占用”的情况。另外,一个新的游戏系统的目的可能最好还从策划的角度做一点阐述(顺便帮助拉近程序与策划之间的距离)。

  3、如果系统涉及服务器间、进程间的交互与架构,接下来就给出涉及的服务器架构图,这样就让大家知道我负责的系统在架构中处于哪个位置。比如我做登录的ppt分享,会通过架构图告诉大家,玩家看到的每个游戏服在技术上包含了哪些进程哪些数据库,游戏服和游戏服之间怎么划分,大区和大区之间又如何划分,游戏服和游戏服之间的交互是通过哪个进程。之所以会有这一步是因为我负责的工作经常会涉及框架搭建和进程间交互的事情,比如在老东家负责的集群后台管理与监控、补丁机制;还有现在负责的登录、跨服和gm工具的搭建。大部分系统应该不涉及这一步。

  4、接着阐述主要业务流程。这时可以用流程图,也可以用时序图。我倾向用时序图,因为这更便于展现进程与进程之间、类与类之间、模块与模块之间的交互。注意只要阐述主要流程、关键步骤就可以了,不要每个细节每个点都讲出来。流程中的异常处理和保护逻辑统统忽略。如果有比较了解的同事问到异常处理的问题,可以一两句简单介绍一下处理方案,并告诉他ppt最后会专门讲。如果流程时序比较复杂,可以先出一个简化的时序图,然后再出一个更详细的版本。详细版本的时序图不一定要当场讲(视乎同事的掌握程度和兴趣),留在ppt中可供以后查阅。另外,在阐述流程的过程中,顺带介绍每个相关类、模块的职责。重要的协议、接口也在这一步给出。

  5、介绍主要数据结构。我现在越来越有一种感觉,就是实际产品开发中,甚少有精妙复杂的算法需要我们操心,但相对而言数据结构却重要得多关键得多。采用什么样的数据结构在很大程度上可以决定你的代码长什么样子、性能如何。对其他同事而言,他们知道了我的系统的数据结构,心里对这个系统也会更有底。尤其我们做游戏的,基本上都是在操纵玩家身上的数据,了解清楚玩家身上带了什么样的数据非常重要。数据结构的描述,能画图就尽量画图;然后用开发语言写出数据结构的示例,比如我们用lua,我可能会这样描述玩家已经学会的职业技能:

job_skills_ =

{

[技能1的ID] = 技能1的等级,

[技能2的ID] = 技能2的等级,

...

}

  一目了然。

  6、如果系统涉及数据库存储,则阐述数据库表结构,并从数据库中查询几条实际记录,贴在ppt中,如果记录太长就现场演示。不要将建表用的sql语句直接贴在ppt里。我尝试过,即便表里只有一个字段,当我看见ppt上密密麻麻的一连串字母时,心里都会有点抗拒厌烦。用表格来描述数据库表结构会清晰得多,大学里的数据库课程应该都这么干。

  7、ppt最后,阐述开发过程中遇到的一些容易出bug的点,以及异常处理与保护逻辑。这时可以适当贴一些代码。但也不要全贴上来。每页ppt讲一个点,把相关函数贴上来;函数名和文件名保留,方便日后查找;函数中和这一页要讲的异常点无关的代码都删掉,用省略号代替;关键的那一两句用高亮颜色标出。大家在前面对流程和数据结构都有了解了,对这里的细节问题就更容易理解,更能听进去。到这一步,了解比较多的同事会问些更深的问题,这时就可以打开原始代码给大家看。

  于是ppt到这里就讲完了。整个过程中,除非同事要求,否则只有到最后一步才展示原始代码。记得有一次主程用ppt讲单机版战斗的做法,整个过程中也是没展示什么代码,但后来当我的工作涉及到这部分时,我能回想起他讲的内容,并通过他的ppt快速理解相关代码,应该说那次分享的目的是完美达到了。

  给QC一对一讲代码的思路也大致如此。不同的地方在于:给QC讲代码不会事先准备ppt,所以涉及架构、流程的东西最好在纸上画。不要一开始就直接对着代码讲流程,从这个函数跳到另一个函数,跳来跳去,那样虽然自己讲得很投入,但QC看着屏幕上翻来翻去的代码也会晕——这是我亲身体会,我就这样听过别人讲代码。虽然这时QC可以充当一部分小黄鸭的作用,但毕竟人家的时间也宝贵,所以还是让人家听懂掌握为好。另外,因为这时是一对一讲,而且QC对我做的东西一般也比较了解,所以有的地方可以讲得比较细。但最好也是放到最后讲,先在口头上或纸上把大致流程过一遍,然后再对着代码把流程更具体地过一遍。

时间: 2024-08-06 14:44:35

如何更好地给同事讲代码?的相关文章

听同事讲 Bayesian statistics: Part 2 - Bayesian inference

听同事讲 Bayesian statistics: Part 2 - Bayesian inference 摘要:每天坐地铁上班是一件很辛苦的事,需要早起不说,如果早上开会又赶上地铁晚点,更是让人火烧眉毛.在城市里工作的人,很多是需要搭乘地铁上下班的,也包括同事M. 有一次M早上来得比较晚,进办公室以后就开始抱怨地铁又晚点了,而且同一周不只发生了一次.我说,作为 statistician,你就不能 predict 一下地铁会不会晚点吗?她说,"This is a very tricky prob

听同事讲 Bayesian statistics: Part 1 - Bayesian vs. Frequentist

听同事讲 Bayesian statistics: Part 1 - Bayesian vs. Frequentist 摘要:某一天与同事下班一同做地铁,刚到地铁站,同事遇到一熟人正从地铁站出来.俩人见面都特别高兴,聊了许久.过后我问她这人是谁,她说是她的朋友,伯克利的教授Michael Jordan.啊!原来他就是鼎鼎大名的Michael Jordan啊! 同事中牛人众多,姑且先称这位同事为M吧.M美国博士毕业后到英国剑桥又深造了几年,研究方向一直是 Bayesian statistics.说

还看不懂同事的代码?超强的 Stream 流操作姿势还不学习一下

Java 8 新特性系列文章索引. Jdk14都要出了,还不能使用 Optional优雅的处理空指针? Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下? 还看不懂同事的代码?Lambda 表达式.函数接口了解一下 前言 我们都知道 Lambda 和 Stream 是 Java 8 的两大亮点功能,在前面的文章里已经介绍过 Lambda 相关知识,这次介绍下 Java 8 的 Stream 流操作.它完全不同于 java.io 包的 Input/Output Stream ,也不是大数

如何更方便的查看Linux内核代码的更新记录【转】

转自:http://blog.csdn.net/lee244868149/article/details/44302819 Linux内核的更新非常的快,如何快速的了解这些更新呢?最一般的办法就是把新旧版本的内核源码下载下来,然后利用BCompare或别的什么工具进行源码对比,但这明显比较费力耗时,而本文将介绍一种更快捷简单的方法. 在官方http://git.kernel.org/网站可以找到linux的各种git更新记录,比如virt/kvm/kvm.git,通过这个链接,可以看到kvm的各

记录一下好听的音乐,,靡靡之音,听着更本不愿意想写代码..

歌名                                       歌手                        备注 一见钟情                                兰心湄 Jar of  Love                           曲婉婷                   是不是想到了jar包 Astro Teemo Music                  --                          LOL 原

【基于Puppeteer前端自动化框架】【二】PO模式,断言(如何更简便逻辑的写测试代码)

一.概要 前面介绍了Puppeteer+jest+TypeScript做UI自动化,但是这知识基础的,我们实现自动化要考虑的很多,比如PO模式,比如配置文件,比如断言等等.下面就来一一实现我是怎么用puppeteer 做UI自动化的 二.断言 (一)需要依赖的安装包 依赖包 命令 Jest npm install jest --save-dev @types/jest npm install @types/jest --save-dev expect-puppeteer npm install

编写更好的C#代码

引言 开发人员总是喜欢就编码规范进行争论,但更重要的是如何能够在项目中自始至终地遵循编码规范,以保证项目代码的一致性.并且团队中的所有人都需要明确编码规范所起到的作用.在这篇文章中,我会介绍一些在我多年的从业过程中所学习和总结的一些较好的实践. 举例为先 我们先来看一个 FizzBuzz 示例.FizzBuzz 要求编写一个程序,遍历从 1 到 100 的数字.其中如果某数字是 3 的倍数,则程序输出 “Fizz”.如果某数字是 5 的倍数,则输出 “Buzz”.如果某数字即是 3 的倍数也是

【转载】关于烂代码的那些事

http://kb.cnblogs.com/page/526768/ ============上篇============ 1. 摘要 最近写了不少代码,review了不少代码,也做了不少重构,总之是对着烂代码工作了几周.为了抒发一下这几周里好几次到达崩溃边缘的情绪,我决定写一篇文章谈一谈烂代码的那些事.这里是上篇,谈一谈烂代码产生的原因和现象. 2. 写烂代码很容易 刚入程序员这行的时候经常听到一个观点:你要把精力放在ABCD(需求文档/功能设计/架构设计/理解原理)上,写代码只是把想法翻译成

接手别人的代码,死的心有吗?

团队里的程序员张三丰要离职,领导让你接手他的工作,叮嘱你一定要尽快掌握张三丰的代码.你的心儿扑通扑通地跳动,你的脑海里萦绕着三个选择:是拒绝呢,还是拒绝呢,还是拒绝呢?你强颜欢笑但实际上心烦意乱怨气纵横--接手别人的代码,那可是程序员要面对的最痛苦最可怕的事啊. 你记起江湖前辈黄药师说过的一句话:如果你恨他,就让他去接手别人的代码. 你的内心是拒绝的,可是你却不由自主地说出了"可以啊"三个字,于是你悲催的旅程拉开了序幕. 这,就是程序员的工作啊~~~~你有什么办法--你特别担心自己会被