测试是软件开发的工程严谨性
Testing Is the Engineering Rigor of Software Development
当开发者尝试向家人、配偶及非技术人员解释它们是做什么的时,喜欢用象征性比喻。我们经常(将其)诉诸为桥梁建造或者其它“硬核”工程学科。但是,当你试着把它们说得太难时,这些隐喻是经不住考验的。事实证明,软件开发在很多方面并不像那些“硬核”工程学科。
Testing Is the Engineering Rigor of Software Development
当开发者尝试向家人、配偶及非技术人员解释它们是做什么的时,喜欢用象征性比喻。我们经常(将其)诉诸为桥梁建造或者其它“硬核”工程学科。但是,当你试着把它们说得太难时,这些隐喻是经不住考验的。事实证明,软件开发在很多方面并不像那些“硬核”工程学科。
似乎每个人都认为货币贬值是一种社会发展的自然规律。也不知道什么时候开始,我们对“钱”产生了认知偏差,混淆了钱与资本的概念,分不清价格与价值。大概也就是从那个时候起,我们手中的钱就开始贬值了。
首先要强调一个众所周知但视而不见的道理,那就是钱仅仅是资本交换时的媒介,一个国家的经济水平应该取决于它资本的总量,而非有多少钱。否则政府干嘛不拼命印钱,每户人家发它一个亿,这不就共同富裕了么?
那么,资本(或者说一件商品)它应该值多少钱呢?主要取决供需关系,估计这连小学生都知道。供需关系的不平衡会导致两种现象:通货膨胀和通货紧缩。(由于现在对这两种经济现象还没有统一的认识,我们姑且这么理解:通货膨胀就是指物价上涨;通货紧缩就是指物价下跌)
很多国家政府偏爱通货膨胀,甚至认为这是经济向好的标志。你想,物价为什么上涨?说明供不应求呀,说明老百姓手里有钱了呀,这样企业就得扩大产能,创造更多岗位,大家又能挣更多的钱,良性循环,多好呀!
反之,如果通货紧缩,意味着老百姓买不起东西,需求下降,企业倒闭,失业率增高,经济萎靡。所以政府机构讨厌它,甚至妖魔化它。
可惜这种认识忽略了最根本的一点:有没有促进资本的增长?
所以通胀和通缩没有绝对的好与坏,我们最好透过现象看本质,看看它是如何发生的,以及这到底是好是坏。
1. 我们贪婪与投机哄抬了物价
住在一线城市的朋友估计都有个感觉,小时候啥啥都便宜,啥啥都方便。如今,连去医院挂个号都要找关系。这是必然的,大城市意味着人口仅流入,地儿就那么大,人是越来越多,以前人均享有的资源配比肯定不如现在——这是真的供不应求。
对此,抱怨两句就可以了,要不是那么多外来人口,哪儿来的美丽城市呀?换句话说,人口增加虽然导致教育、居住、交通、医疗等资源短缺,但却让城市的很多产业得到发展,财富得以积累,人们也享受了更多发展的好处,虽然生活成本增加,但总的来说是好事。
此外,我们对品质的追求也在提升。以前几户村民有个公厕就不错了,现在的人,别说两厅两卫双阳,恨不得给他家狗都配个独立卫生间;以前每人每月二两肉,现在顿顿的少不了;以前一个家庭一部固定电话,现在一个人就两部手机,工作生活两不误!你说,这钱还够花么?
当然,最绕不开的就是房子了,由于思维习惯,大家总觉得房价肯定会涨,现在不买就亏了!结果一拥而上,造成房源匮乏的假象,进一步抬高房价。每个人似乎都很喜欢这种“钱生钱”的游戏,可本质上并没有积累任何资本财富,所以它不是一件好事。
2. 政府行为稀释了货币
人们非理性哄抢行为是显而易见,我们也习惯于把物价上涨归咎于房地产开发商。但这只是原因之一,还有个原因非常隐性——印钞机!
一个国家是不能随意发行货币的,最理想的情况当然是发行的货币恰好够兑该国的全部家当。如果超发,就意味着市面上流通的钱会贬值。可是!如果我只超发一点点呢?
比如该国实际有100万亿的财富,作为政府的我发行了101万亿的货币,也就超发了1%而已,什么概念呢?你原本100块钱能买到的东西,现在要101块才能买到,你会对此抓狂么?
可对于政府来说,那可是1万亿啊!可以用于支付公务员工资,财政拨款,或者还债。什么都不用做就有钱拿,好爽!
还是那句话,资本和钱不是一回事,这种行为并没有为社会创造实际价值,相反,其代价会转嫁到每个人头上。
每年多印一点点钱,久而久之,感觉就很明显了。
3. 国际金融关系
由于国际关系过于复杂,为了便于理解,我们把这种关系浓缩在“地球村”里,每个国家都是一户村民。不用怀疑,美国就是这个村的村长。主要得益于他爷爷辈的勤劳,创造了很大的家业,在村里树立了极高的威信。所以大家有事没有都会和美国往来,一是增进感情,二是多少想分一杯羹。
地球村很大,每户人家相互之间有生意来往,用米换油,鸡蛋换布料。长此以往也不是办法,村民需要一种统一的货币。显然,美国家大业大最靠谱,在村长的撮合下,大家一致同意以“美券”作为统一结算货币。以后的生意就方便多了。
到了孙子辈的美国并没有传承老一辈的吃苦耐劳精神,他不愿干农活,也不想干工人,又脏又累。好在后来这些脏活累活都被中国给包了,村民的温饱问题得以保障。美国则守着自家的银行和印钞机,想着如何用钱赚更多的钱。
中国倒是勤勤恳恳,田里和工地里来回跑,没日没夜的干,挨家挨户的卖,赚了很多美券。可随着时间推移,他发现美券有些猫腻,以前两张券可以买一桶油,现在要花四张券。其他村民也同样注意到这个问题。
2008年,美国家的屋顶被大风掀开,吹散了一捆又一捆的借条、赊账,还有开足马力印着美券的机器。大家惊恐万分地看着美国,他不在是那个为美国梦而自豪的美国了,现在的他为了贪图享乐,偷奸耍滑,不顾他人死活。
可环顾四周,除了美国貌似别无他选,加之碍于情面,还是继续用美券吧。就这样,美国接着执行他“印券还债”的计划,小日子还算舒坦。但远方的中国不乐意了。
“妈的,老子汗滴禾下土,被你空手套白狼,滚蛋!”
为避免手中的美券一夜成废纸,中国三管齐下,开始采取应对措施:
美国见状一脸懵逼,以前的穷小子竞会如此猖狂,还有枉法吗!就这样,双方明争暗斗,你来我往,关系愈演愈烈…
结语
金融系统太复杂了,很感谢《小岛经济学》这本书,钱这玩意儿三两句话根本说不清楚,但本书还是大体讲明白了,受益匪浅!
经济学家总喜欢在自由市场经济和政府在其中的角色争论不休,书中对美国经济的现状以及政府接二连三的昏招是较为悲观的,我不懂这其中的道道。但我想,不论手中的钱是增值还是贬值,不论政府的经济刺激政策有多么高明,它都不应该背离一个原则:勤勤恳恳劳动,实实在在创造价值。
Test While You Sleep (and over Weekends)
放松。我指的不是离岸开发中心,周末加班或夜班,我是想让你注意我们有多少计算资源。尤其是,有多少本可以让程序员生活更轻松一些的方式,而我们却没有利用起来的。你有没有发现工作日想要有足够的计算资源是很困难的?如果是,那你的测试服务器在平时工作以外的时间又在做什么呢?大多时候,测试服务器在夜间和周末基本是闲置的。其实你可以这么做来获益。
你可能听过这样的言论:“别用KPI了,现在大公司都流行OKR”。这主要源于我们太了解KPI以及太不了解OKR了。
说白了,OKR是给团队做目标管理用的,KPI是给团队“分赃”用的,压根不是一回事。
《OKR工作法:谷歌、领英等公司的高绩效秘籍》一书详述了OKR这种目标管理方法。当然,其叙述内容比较特别——是以小说的形式,所以读起来不那么枯燥乏味。
OKR笔记一:如何制定目标
如果按照OKR的标准,“目标”这两字可能很多人都会理解错,我们先来看几个“坏目标”:
再来看几个“好目标”:
你可能会觉得,好的目标就是那种宏大、遥不可及、含糊其辞的说法。而那些结果明确且具体的说法反而是坏目标。其实不然!不要混淆目标和指标,这是OKR要注意的第一点,否则就真成了KPI了。
上面几个好目标是公司层级的(你也可以把它叫做使命愿景),如果是小团队或部门级的目标,诸如“项目交付让甲方爸爸点赞”、“开发快乐又有意义的游戏”。
目标是面向整个团队的,所以应该是直指人心的,挑逗人的肾上腺素,每个人对它的理解不同,但大方向是一致的。此外,小团队的目标不必太正式,可以根据团队的语言风格确定目标的措辞。
OKR笔记二:什么是关键结果
空有目标是不够的,你还得想办法推进它。这就要靠关键结果指标。但是要注意,和KPI不同的是,这里的指标是用于评价目标推进的情况,以及团队整体的士气,而不是判定个人的业绩好坏。
和项目管理中的“事无巨细”恰好相反,关键结果应该聚焦那些影响目标存亡的部分,一般来说不会超过三条。比如“开发快乐又有意义的游戏”,可以这样制定第一季度关键结果:
注意,每个关键结果后边括号内的分值表示:如果要完成该项指标,团队的把握有几成,我把它叫做“团队信心值”。它可以反向衡量你的这个目标设置是否合理,一般来说,评估结果在50%是最为理想的——有挑战,但加把劲儿也能完成。
OKR笔记三:四象限法
找一张A4纸,把它对折两次(或者直接画个十字),然后分别在1、2、3、4象限内写入OKR目标和关键结果、状态、本周事物、未来一个月的计划。如下图:

四象限法是为了让目标和指标具备可执行性,并像念经一样灌到每个团队成员的脑子里。也就是说,这张纸每周一开例会都要用,都要更新,到周五的时候大家在拿着这张纸复盘一下。如果达成了目标,最好组织个简单庆祝。
OKR最怕的就是:信誓旦旦立个flag,然后,就没有然后了。
OKR笔记四:坑
第一次使用OKR大概率会失败,因为团队会掉入一些常见陷阱:
总结
如果你个人、团队、公司不知所措的时候,OKR可能会适用。它的作用是目标管理,组织中的每个人都知道:我们想做什么,我们将做什么,我们正在做什么。让进度可见,让参与者获得成就感。
OKR的初衷是确立目标并逐步推进,如果把它沦为单纯的考核工具,那就太不值了。
PS:以下内容纯属娱乐
看完了OKR,内心汹涌澎湃,想要实操一把…
我本来想假设自己是一个传销头目,为团队制定OKR,连愿景我都想好了,叫人人皆下线。后面感觉容易进小黑屋就放弃了。
我又把自己假想成一个负责熟人社交网络的产品经理,表演开始:
目标:朋友,不止于点赞(干翻微信)
关键结果1: 用户好评率70%(6/10)
关键结果2: 线下聚会订单数超过5000(4/10)
关键结果3:城市日活用户10w+ (5/10)
本周工作:
P1:雇佣1000号水军制造舆论
P1:调研90、00后线下聚会习惯
P1:准备内测朋友圈“好物交换”功能
P2:拿下“XXX桌游吧”合作渠道
P2:与“XXX电竞宿舍”老板洽谈
本月计划:
成功炮制微信聊天要收费谣言
培养用户线上租借闲置物品给朋友的习惯
完成1000笔线上预约线下聚会的订单
😂😂😂😂
对于测试而言,重要的是代码单元的规定行为,而非特定实施下的附带行为。对于含糊的测试,不应作为接受或报错的借口。测试需要严谨且精确。
Test for Required Behavior, not Incidental Behavior
测试的一个常见陷阱就是假设你所测试的恰好都是实现的。第一眼看上去,这种观点像是一种美德而非陷阱。然而,换一种说法后,问题就凸显出来了:测试的一种常见陷阱就是将测试硬性地结合到实现的具体细节上,这些细节是附带条件的,与功能预期无关。
Take Advantage of Code Analysis Tools
测试的价值时从软件开发者职业生涯的早期就被灌注的。近些年,单元测试、测试驱动开发(TDD)、以及敏捷方法的兴起证明,在开发周期的所有阶段充分利用测试的兴趣正在激增。然而,测试仅仅是你改善代码质量所采用的众多工具之一。
Step Back and Automate, Automate, Automate
我和某一群程序员工作过,当被要求给出一个模块的代码行数时,就是将文件粘贴到word编辑器里并利用它的“行数统计”功能。他们下一周也是这么干的。再下一周还是这样。真是太糟糕了。
还有一次我参与到一个部署流程繁琐的项目,需要将代码签名并将结果移交到一台服务器中,需要点击很多次鼠标。有的人就把这个过程自动化了,该脚本被执行了上百次,一直经受着考验,效果远超预期。真是太棒了。
所以,为什么有的人愿意一遍又一遍做着重复的事,而不会退一步花点时间把它自动化呢。
常见误区#1:自动化只适合测试用
当然,自动化测试事伟大的,但就止于此了?重复的任务会存在于任何项目中:版本控制、编译、构建JAR文件、文档生成、部署、以及报告。对于这些任务,脚本要比鼠标强大多了好么。执行起单调乏味的任务也更快更可靠。
常见误区#2:我有一个IDE,所以我不需要自动化
你有没有和你队友发生过类似“你在我电脑上(签出、构建、测试)过它么?”的争论呢?现代IDE有数以千计的潜在配置,本质上是不可能保证团队中所有人都采用了完全相同配置。诸如Ant或Autotools的构建自动化系统可以为你提供可控性与重复性。
常见误区#3:为了自动化我还得学习新语言
纯正的shell语言(如bash或powershell)都能助你一臂之力来构建自动化系统。如果你需要通过网页交互,可以采用像是iMacros或Selenium等工具。
常见误区#4:我不能自动化这些任务,因为我无法处理这些文件格式
如果你必须处理word文档、表格或图片部分,对自动化来说确实是挑战。但这真的有必要吗?你可以用纯文本吗?逗号分隔符?XML?一个可以在文本文件里生成绘画的工具?通常,略微调整这份处理就能产生好的结果,并极大地减少枯燥乏味。
常见误区#5:我没空去想办法
你无需学会所有的bash或Ant才能上手。边走边学。当你认为某个任务可以也应该被自动化时,只需要把工具学到足够它能工作即可。在项目中越是早点这么干,就越容易发现这一点。一旦你成功了,你(和你的老板)就能看到对自动化投资的意义。
最近,我到杂果店里买“毛豆”(我对蔬菜种类只是大概了解)。我也无法确定这玩意是在蔬菜区,还是冷藏区,或者罐头区。我放弃了,找了个店员来帮我。结果她也不知道。
这个店员本可以给我其他答复。比如她可以让我一脸懵逼的去别处看看,或者给我个模糊的区域,甚至干脆告诉我他们不卖这个。但她没有,她想抓住机遇一样对待这次询问,争取找出答案帮助顾客。她找来了其他店员并在很短时间内给了我可靠选项——在冷藏区。
在这种情况下,店员看了下请求,然后基于“我们能解决问题并给予满意答复”的前提开始行动的。她从yes开始,而非no。
当我头一次当上技术主管角色的时候,我觉得我的工作就是将那些来自产品经理和商业分析的可笑需求挡在门外,以保护我美丽的软件。我发起的很多谈话,都是将请求视作否定,而非允许。
某一刻,我突然顿悟,或许有不同的方式来工作,只需要把我的观念从no倒转为从yes开始。事实上,我开始相信,从yes开始是一个技术领导者的基本素养。
这个简单的变化彻底改变了我的工作方式。事实证明,有非常多的机会说出yes。当某个人和你说:“呐,如果我们将所有的窗口都做成半透明的,那这app确实就想蜜蜂的膝盖一样!”,你肯定会把它当个笑话给驳回了。当它通常用“为什么?”来开头更好。通常情况下,由于某些必然的原因,人们会要求圆形、半透明的窗口放在第一眼的位置。例如,你可能和一个新的大客户签订了圆形半透明窗口的委托书。
通常,你会发现当你了解的请求的前因后果,新世界的大门就打开了。常见的就是以其他方式利用现有产品来完成请求,不用干活就可以说yes:“事实上,在用户偏好设置里,你可以下载并切换到圆形半透明窗口的皮肤”。
有时候其他人会有一些简单的想法与你的产品视角不同。我发现通常这对于转过来问自己“为什么?”会有帮助。有时候说出原因的行为会清楚的表明你的第一反应是没有道理的。否则,你需要提高一下格局来引导关键决策者。记住,这一切的目标是为了对他人说出yes并使其正常运转,不仅仅对他有利,对你和你的团队也是如此。
如果你能对功能请求与现有产品的冲突给出强有力的解释,那么你很可能对是否构建正确的产品进行高效的谈话。不论谈话是否结束,每个人关注的都是哪些是产品的本质,哪些不是。
从yes开始意味着和同事一起工作,而不是与他们为敌。
2020年的春节,一场战“疫”把大量人员扣留家中,无数公司启动居家办公模式,梦寐以求的好日子终于来啦!于是…上班族们崩溃了,根本不习惯,毫无效率可言。看来事实证明,远程工作终归是痴人说梦。那么,真是这样么?
我倒是觉得,主要是思维习惯停留在集中式办公模式,不论管理层还是普通员工,都不可能做到短期内立即切换到远程办公的思维模式。就好像一个吃惯鲜甜口味的上海人,突然带他去吃一顿麻辣火锅,他并大可能感受到其中的美味。
可以这么说,大部分坐在写字楼里所谓的白领阶层都具备远程工作的条件,因为他们工作中90%的活动和产出都是在电脑上完成的。换句话说,这群人,打开电脑,就能工作。
远程办公有太多好处,最突出的莫过于不用把生命浪费在通勤路上,工作时间和环境都有巨大的弹性。但一个从小受集中式办公影响的人,如果他想切换到远程办公,我觉得至少要有以下三方面的认识。
效率:异步协作与沟通
就拿“讨论问题”来说。我们会习惯于当面讨论,你一言我一语,这样会很快得出结论,然后投入干活,这是我们认为这很“高效”。反之,通过邮件或聊天软件的沟通,不及时,半天得不到结果,所以它很“低效”。
但这根本是两码事!当面讨论是同步的,邮件讨论是异步的。而且,直接用同步和异步来衡量效率也是种愚蠢的错误。评判效率要以事情的结果为标准,而非过程。
面对面沟通时,双方都会进入口语化状态,因为要及时回复,思维就比较跳跃,想到什么说什么。一个未经缜密思考的决策,你能说的很完善?
邮件或聊天软件的沟通则相对会正式些,而且人们在发送之前拥有充足的思考时间(吵架时除外😂),此时他对某个决策的观点会有一定的想法,这种讨论的结果更有说服力,并且可作为双方的备忘纪要。
再者,我们认为集中办公“高效”的原因还有一点——及时性。我有一个想法,立刻就能召集人过来讨论,马上就能论证结果。反之,如果我把自己的想法发到聊天群里,半天没人理,如果我是领导,那多半只能得到几个敷衍的“赞”。
可事实呢,诸如视频编辑、程序员、设计师、文案这种知识创作型人才,他们需要足够安静的环境和时间来思考。在办公室里,打断一个人的成本太低了,屁大的事情也会被拉去开个短会,等你回来后会发现,自己的思路全被打乱了。
此外,我们往往会觉得那些重要且复杂的事情只有聚在一起才能完成。可事实上呢?普及数十亿设备的Linux操作系统,mysql数据库…伟大的开源软件大多了数不过来。但它们都是汇集了全球成千上万个程序员的思想,讽刺的是这些程序员分布在不同时区,素未谋面,仅仅靠“留言板”式的交流一起工作,而且大多不要工资。
你还觉得异步协作与沟通的效率低吗?
人才:自律牛人的胜利
相比于集中式办公,远程办公在招揽人才方面似乎有天然的优势,因为它不受地域的限制。换句话说,如果你住在一个三线城市,同样能雇佣一线城市的众多人才。反之,如果你相中的某个大牛就喜欢“隐居”,你也犯不着三顾茅庐。
但,远程办公对人才是极为敏感的。远程办公的员工必须具备两个基本素质:自驱力和较好的协作能力。
我们都知道,在办公室里总会有一堆“闲人”和一堆“看起来很忙的人”。不论他们人缘有多么好,这些人不适合远程,他们是低效的,在公司被监督着也能划水摸鱼,你还指望他在家的时候兢兢业业?
但还会有一帮人,他们属于没事找事型,可以自发地完成工作,给自己制定学习任务并真的完成。说白了,这群人可以从工作中找到快乐,就像为Linux开源做贡献的程序员一样。
一个自律的人,你不需要话太多精力去盯着他,直接给他需求目标,然后等着拿结果,这样的合作关系不好么?
管理:老毛病与新问题
远程办公时代,我们必须摒弃很多旧观念和习惯。比如上下班要打卡,事情必须当面聊,审批要有领导签字,要是不盯着员工他们就会偷懒,坐办公室里才叫工作…其实,这些都是工业时代初期管理流水线的思维模式。它是面向过程的监督式管理。用这种观念去管一帮知识创作的人,搞不好会适得其反。
事实上已经有非常多的软件工具可以把这些任务从线下搬到线上,但这也仅仅是一些方法而已。棘手的是我们的观念——总觉得员工会偷懒,必须监控着。
这种对员工不放心不信任的想法,让管理者即使用上新工具后产生了很多滑稽的现象。比如让员工在家打卡,动不动开个视频会议,写工作汇报,想法设法找点无关紧要的小事给他们做。这种行为并不是为了工作本身,而是为了宣扬权利。说到底就一句话:“我付了工资,又看不见他,不能让他闲着!”
然而呢,远程办公应该是以结果为导向,充分发挥异步协作与沟通的积极面,让员工用自己喜欢的方式施展才华。只要他把活干得漂亮,你管他是坐着还是躺着!再有,如果以事情的结果来评价员工的能力,那群“小白”和“忙人”也会很快浮出水面。
凡事都有两面性
不过我们也要清楚,远程办公会带来很多弊端:
最近看到大家激烈地吐槽远程办公,所以想深入了解这个新鲜的老玩意儿。便读了《重来2:更为简单高效的远程工作方式》。由衷地感叹,未来是个体的时代,未来是创意的时代,未来是信息的时代。或者说,未来已来。
我们所看到的远程工作没有那么美好,那是因为我们早已习惯了现实世界的生活。但,趋势来了,你难道就打算这么看着?