关于程序员的职业操守,从《匠艺整洁之道》谈起
《匠艺整洁之道》是鲍勃大叔的整洁系列新书。这本书主要从纪律、标准、操守三个方面阐述了软件从业者应该如何要求自己,提升研发质量、效率、道德水准,本文主要围绕《匠艺整洁之道》的第三部分 -- 操守,聊一聊我们程序员该如何自我约束、自我提升。
▐ 行业的壮大
在这期间,整个软件行业有了巨大的发展:
从业人员已经过亿
计算机/电子设备的数量超过人类数量
软件监控和协调着全社会的运转
大众对计算机及软件的认知,从早年的以机器为主,到现在以机器背后的程序员为主。早期《星际迷航》、《太空奥德赛》等以机器 / 计算机作为重要角色。而随着个人计算机的出现,《黑客帝国》、《战争游戏》等电影逐渐以程序员作为救世主,程序员正脱去神秘的面纱,被社会所了解和接纳。
▐ 影响面扩大
科研:地面软件出错,使用了错误的单位,导致火星气候探测者号在火星大气层中下降太深,被撕成了碎片。 医疗:Therac-25 放射治疗机事故。由于进程冲突,Therac-25 用高能电子束导致 3 人丧生,还烧伤了另外 3 人。 商业:因为用错标识符,遗留在系统中的死代码被激活,导致骑士资本集团在 45 分钟内损失了 4.6 亿美元。 交通:丰田汽车的堆栈溢出漏洞,可能导致汽车加速失控,最终可能导致多达 89 人遇难。
▐ 职业操守的定义
WIKI 里对职业操守的定义是 指人们在从事职业活动中必须遵从的最低道德底线和行业规范。
在职业活动中,有一些公认的职业操守,如:
诚信的价值观
诚实地制作工作报告
不要泄密给竞争对手
同时,各个行业也有各自细分的职业操守,如:
医生:救死扶伤,爱岗敬业
魔术师:不公开魔术的秘密
公安干警:重视调查研究,处理案件不捕风捉影,主观臆断
法律工作者:忠于宪法和法律,坚持以事实为根据
教师:为人师表,关爱学生
...
在 《匠艺整洁之道》 里,鲍勃大叔 提出了 10 条软件开发人员的职业操守。
▐ 软件开发人员的职业操守
为捍卫和维护计算机程序员职业的荣誉,我承诺,尽我的能力和判断力:
我不写有害的代码。
我生产的代码将永远是我最好的作品。我不会故意让那些在行为或结构上有缺陷的代码累积起来。
我将在每次发布时提供快速、确定和可重复的证据,证明代码的每个元素都能正常工作。
我将经常进行小规模的发布,不妨碍其他人的进展。
我将无畏地、毫不留情地利用一切机会改进我的创作。我绝不让它变更差。
我将尽我所能尽可能地提高自己和他人的生产力。我不会做任何降低生产力的事。
我将一直确保其他人能够补上我的位置,我也能够为其他人补位。
我将给出在数量级和精确度上都靠谱的预估。我不会做出没有把握的承诺。
如果我的程序员同事拥有足够的操守、标准、纪律和技能,就能赢得我的尊重。任何其他的属性或特征都不会成为我尊重程序员同事的因素。
我永远不会停止学习和改进我的技艺。
鲍勃大叔提出的这 10 条誓言可以分为三个类型:伤害、集成、团队合作,我们针对这三个类型分别展开聊聊。
▐ 关于伤害
我不写有害的代码。
我生产的代码将永远是我最好的作品。我不会故意让那些在行为或结构上有缺陷的代码累积起来。
我将在每次发布时提供快速、确定和可重复的证据,证明代码的每个元素都能正常工作。
何谓伤害
我们编写的软件每时每刻都在对这个社会产生着影响。我们任何无意中的行为,都可能会给这个社会带来意想不到的伤害。
例如 人们发现大众汽车公司的程序员写了一些代码,故意阻挠 EPA 排放测试,影响有关部门对环境危害的评估,损害了这些汽车驾驶地所有人的健康。
如果我们放任自己,就会对自己,或者身边的人,甚至整个社会造成危害,包括:
对社会造成的伤害
对你的同行造成的伤害
对未来的程序员造成的伤害
对功能/结构造成的伤害
直面伤害
思考:以下两种系统,哪个系统的价值更高?
工作完美,但不可修改
不能正确地做任何事情,但却容易修改
上述的两个系统,分别体现了软件的两个价值:
行为价值:让程序能够正确工作
结构价值:让程序易于调整
一个软件系统如果无法被改变,即使它能够正确工作,最终也摆脱不了被淘汰的命运:
一个软件系统要想能够提供长期价值,它就必须能够响应需求的变化。因此,除了最紧急的情况之外(对人、对公司、对社会造成灾难的情况),我们应该优先选用第二种系统。即使我们需要一点时间和金钱的投入,但在那之后,它就将可以永远继续工作。
坚持好结构,它与我们利益相关
为了能使软件能够提供长期价值,不对当下的同事、未来的同事造成伤害,就要求我们写出来的软件要有一个好的结构,一个好结构带来的价值有:
容易测试
容易修改
容易重用
要写出一个好的结构,往往要花我们更多的时间。我们经常会遇到这样的场景:
一个紧急的需求过来,要求我们在指定时间内完成并上线,但这些时间往往只够我们完成需求,同时你的老板也要求你尽快完成这个紧急需求。如果是你,会如何应对这种情况呢?
首先要记住的一点是:一个项目/软件的成功,对我们的事业、声誉有着直接的影响,它与我们的利益息息相关。因此,作为利益关联者,我们对系统的开发和结构有发言权;同时,我们也是工程师,公司雇佣我们,是因为我们知道如何构建软件系统,如何搭建这些系统的结构,并使其能够提供长期价值,我们需要确保系统不会因为坏行为和坏结构而遭到破坏。
回过头再来看这个问题,我们的老板了解结构吗?或者老板的理解仅限于行为吗?如果老板明确告诉你不要理会结构,应完全关注行为,我们该怎么办?
我们得拒绝,因为我们是工程师,是利益相关者。也许会有争斗、对抗,但我们的专业不允许我们退缩。也许你认为拒绝就会被解雇,但大多数情况下不会。因为大多数经理也期望为他们需要和相信的东西而奋斗,而且他们尊重那些愿意做同样事情的人(否则还会有那么多的技术沙龙、技术分享交流会吗?)。
▐ 关于集成
我将经常进行小规模的发布,不妨碍其他人的进展。
我将无畏地、毫不留情地利用一切机会改进我的创作。我绝不让它变更差。
我将尽我所能尽可能地提高自己和他人的生产力。我不会做任何降低生产力的事。
为什么需要关注集成
持续集成
软件行业经过这么多年的发展,已经有了不少解决方案。其中,持续集成就是一个很好的手段。
持续集成能够带来以下好处:
快速发现错误
防止分支大幅度偏离主干
持续集成并不能让我们消除Bug,但是能让它们非常容易被发现和改正;它可以让我们的软件在快速迭代的同时,仍能保持高质量,不阻碍别人进度。
随机善意行为
鲍勃大叔在《代码整洁之道》里提到过的童子军军规:代码签入时要比签出时更整洁。
如果每次代码签入时,代码都比签出时干净,那么代码就不会腐坏。我们可以通过在每次检查代码时,对其进行随机善意行为来做到。任何善意的行为,无论多么微小,都不会被浪费。
我们可以通过增加测试的覆盖率(但不应该变为管理指标),来协助我们改进代码,协助我们写出更加健壮的代码。
另一个有效的随机善意行为是简单的清理--以改进为目的的重构。我们可以从一些简单的手段入手,如:
优化字段的命名,让代码可读性更强
清理无用代码,减少理解成本
调整代码结构,保持代码的灵活性
▐ 关于团队合作
我将一直确保其他人能够补上我的位置,我也能够为其他人补位。
我将给出在数量级和精确度上都靠谱的预估。我不会做出没有把握的承诺。
如果我的程序员同事拥有足够的操守、标准、纪律和技能,就能赢得我的尊重。任何其他的属性或特征都不会成为我尊重程序员同事的因素。
我永远不会停止学习和改进我的技艺。
有团队精神,能够被补位,避免团队因知识断层而陷入瘫痪 诚实合理地预估,不轻易承诺 只尊重职业技能、纪律、标准和操守,不因其他因素彼此歧视 永不停止学习,跟上行业的变化是对职业的尊重,也是对自己的事业负责
诚实合理地预估,不轻易承诺
系一双鞋带需要多久?也许你可以很快地说出:20秒左右。因为系鞋带这件事几乎天天都在做,你可以相当快速、准确地给出合理的预估。
那如果要你写一个系鞋带的教程,需要多久?你是否没有办法快速准确地做出一个预估?你需要考虑这个教程的受众、是否需要图文并茂、篇幅限制 ……
这正是我们作为程序员经常会遇到的问题:预估工时。我们面临的用户可能都是计算机新手,他们对软件可能一窍不通,我们必须要写出使用要足够简单软件,并拥有足够详细的使用说明……
当一位经理来找你说:“我在星期二之前需要这个。” 你被这个问题困住了,因为你不知道你是否能在星期二之前完成这件事。也许你做过类似的事情,花个两三天就搞定了;也许这里面藏着一个跟你之前做过的都不一样的技术难点,你不知道能否按时完成。
所以当你被要求估计某件事时,你不能给出一个具体的时间,因为那是谎言,你不知道你是否能够在特定的时间完成它,你需要考虑到最好和最坏的情况。如果你确实给了一个精确的时间,那最好能咬牙完成它。因为你在做出承诺,所以你最好准时完成它,不要有任何借口。
要给出一个合理的预估,可以这么做:
不要轻易给出一个具体时间,诚实地保持诚实
对项目的预估不能只是一个交付日期,而是一个时间范围
进行工作项拆解,找出隐藏在里面的模糊因子(不确定因素)
与经理交流,花更多时间细化模糊因子,如此来回递归式操作
针对最好情况、最坏情况、普通情况,分别估计其可能发生的概率,再针对这3种情况预估日期范围
永不停止学习
“The simplest way to describe craftsmanship is pride of workmanship. It is the mindset that you are working on something important and you are going to do it well."
参考内容
团队介绍
欢迎加入淘宝移动技术中台,团队成员大牛云集,有阿里移动中间件的创始人员、鹰眼全链路追踪平台核心成员、更有一群热爱技术,期望用技术推动业务的小伙伴。
淘宝移动技术中台,推进淘系(淘宝、天猫等)架构升级,致力于为淘系、整个集团提供基础核心能力、产品与解决方案:
业务高可用的解决方案与核心能力(应用高可用:为业务提供自适应限流、隔离与熔断的柔性高可用解决方案,站点高可用:故障自愈、多机房与异地容灾与快速切流恢复);
新一代的业务研发模式FaaS(一站式函数研发Gaia平台);
下一代网络协议QUIC实现与落地;
移动中间件(API网关MTop、域名调度AMDC、消息/推送、文件上传AUS、移动配置推送Orange 等等)。
期待一起参与加入淘系基础平台的建设~简历投至方式 :zebin.xuzb@alibaba-inc.com