代码中的善意
软件开发很容易被看作纯粹的技术活动,人类无关紧要,一切只关乎计算机。然而,事实恰恰相反。软件工程从根本上是一门人的学科。
多年来,在尝试修复软件开发过程中犯下的许多错误,都是因为只关注系统的技术方面,而没有考虑到编写代码的是人类。当你看到有人更关心优化而不是代码的可读性,当你看到有人不写注释却花一整天调整 shell 脚本以减少行数,当你看到有人无法沟通却崇拜小二进制文件时,你看到的是这个问题的各种症状。
实际上,软件系统是由人编写的。它们被人阅读,被人修改,被人理解或不理解。它们代表了编写它们的开发者的思想。它们是地球上最接近原始思想表达的东西。它们本身不是人,没有生命、智能、情感、邪恶或善良。拥有这些品质的是人。软件完全且仅用于服务人。它们是人的产物,通常是一群人必须合作、沟通、相互理解和有效协作的产物。因此,关于与一群软件工程师合作,有一个重要观点:在开发社区中对他人残忍毫无价值。
对与你共事的人粗鲁无益。愤怒地告诉他们错了,不应该做他们正在做的事情,也无济于事。确保应用软件设计法则,让人们遵循一条好的路径,制作易于阅读、理解和维护的系统,是有帮助的。然而,这并不要求你残忍。有时你确实必须告诉人们他们没有做对的事情。但你可以实事求是地表达——你不必当面指责或人身攻击。
例如,假设有人写了一段糟糕的代码。你有两种方式可以评论:“我不敢相信你认为这是个好主意。你读过软件设计的书吗?显然你不该这么做。”这是粗鲁的方式——是对人本身的攻击。另一种告诉他们问题的方式是:“这行代码很难理解,这看起来像代码重复。你能重构一下让它更清晰吗?”
在某些方面,关键点在于你是在评论代码,而不是开发者。但同样,关键点在于你不是在做一个混蛋。我的意思是,拜托。第一种回应显然是粗鲁的。它会让那个人想和你一起工作、想贡献更多代码、或想变得更好吗?不会。另一方面,第二种回应让那个人知道他们走错了路,而你不会让那段糟糕的代码进入代码库。
你阻止那个程序员提交糟糕代码的整个原因首先与人有关。要么是关于你的用户,要么是关于其他必须阅读系统的开发者。通常,两者兼有,因为制作一个更可维护的系统完全是为了你能继续有效地帮助用户。但无论如何,你作为软件工程师的工作与人有关。
是的,很多人会阅读代码和使用程序,而你审查代码的那个人只是一个人。所以可能会认为,你可以为了让这个系统对每个人都好而牺牲一些善意。也许你是对的。但为什么在不必粗鲁或残忍的时候要这样做呢?为什么在你的团队中创造那种让人们害怕做错事的环境,而不是让他们为做对事而高兴呢?
这不仅仅限于代码审查。其他软件工程师有话说。你应该倾听他们,无论你是否同意。礼貌地承认他们的陈述。以某种建设性的方式与他们沟通你的想法。
而且,看,有时人们会生气。要理解。有时你也会生气,你可能希望你的队友在你生气时也能理解。
这一切可能听起来有些空灵,像某种不重要的心理废话。但看,我不是在说“每个人总是对的!你应该一直同意每个人!永远不要告诉任何人他们错了!没有人做过任何坏事!”不,人们经常犯错,世界上和软件工程中有许多坏事你必须说不。世界并不总是一个好地方。它充满了愚蠢的人。其中一些愚蠢的人是你的同事。但即便如此,通过粗鲁对待那些愚蠢的人,你也不会做任何有效的事情。他们不需要你的仇恨——他们需要你的同情和帮助。而你的大多数同事可能不是愚蠢的人。他们可能是聪明、善意的个体,有时会犯错,就像你一样。给他们怀疑的好处。与他们合作,保持善意,从而制作更好的软件。
-Max
评论
Nemo 说: 2017年8月12日下午1:27
你的推理有一个明显的缺陷。你在电梯里遇到某人,你礼貌而友善。这个人踩了你的脚一次,你礼貌而友善。当这个人第三次踩你的脚时会发生什么?第五次?情况a.你是个圣人,死时礼貌而友善,情况b.你只是普通人,在某个时候你不再礼貌而友善。因为你知道,有人一直踩你的脚没有很多原因,实际上只有两个,这家伙是愚蠢或坏,在这两种情况下他都是危险的。是的,你可能也有异常长的脚,所以这家伙不动就会踩到一只。我猜在这种情况下你不能和任何人一起在电梯里,所以推理再次不适用。
Max Kanat-Alexander 说: 2017年8月12日下午2:50
不。这里的评论似乎没有抓住重点。首先,你的 fellow 开发者没有踩你的脚。他们没有造成你身体疼痛甚至攻击你。没有理由你会对糟糕代码或困难的技术讨论做出像对实际身体攻击你的人那样的反应。其次,再读最后几段,意识到我说了你应该阻止人们做坏事。我不知道你在这里提议做什么能实际解决问题,除了比如,在某个时候报警?我看不出这些如何证明对同事粗鲁是合理的。-Max
Nemo 说: 2017年8月13日凌晨1:04
我和许多“fellow”开发者共事过,他们踩了我的脚。根据我的经验,这是因为除了人们常见的所有问题外,开发者平均而言在与他人关系和扭曲人格方面有严重困难。有无数的例子。相对有趣的比如你向客户演示一个新产品,你激活某个功能,却得到经典的“演示灾难性错误”,但 instead of 看到“lorem ipsum”文本,你在屏幕上显示一串漂亮的脏话。真正糟糕的比如客户打电话因为服务器宕机或软件以某种方式崩溃,而你不在办公桌,你的“fellow”开发者在那里玩纸牌或看色情内容,不接电话。或者你必须协调在同一软件的不同部分工作,而你的“fellow”开发者故意拒绝同意如何做事,反而努力让你的部分尽可能困难,直到整个项目失败,只是为了享受。更不用说你的“fellow”开发者从雇佣你们俩的公司偷东西,一直说谎,伪造分析,试图偷你的工作或试图为你的成就邀功等等。此外,这不仅仅是关于工作,当你看看整个“开源”生态系统,Linux 之类,你可以很容易地看到人们一直互相踩脚,没有其他原因,只是因为许多人要么愚蠢要么坏(你可以两者兼是并且仍然能编码)。伙计,你生活在拉拉之地。
Max Kanat-Alexander 说: 2017年8月13日凌晨4:17
我明白你说的 everything,Nemo。听起来你只是在说人们经常坏。也许这是真的。但这不需要粗鲁来修复。你甚至不必在解雇某人或向HR和管理层写关于他们行为的报告时粗鲁。注意,听起来你一直在一个人们一直坏的环境,所以也许你到目前为止所做的关于它的事情实际上没有奏效。你考虑过那种可能性吗?-Max
Joe G 说: 2019年9月30日下午3:33
Max – 你的思维与我共鸣,一直是我在软件开发中的座右铭。阅读评论 though 很明显不是每个人都同意。我的观点已经转向“开明的自利”观点,即对他人友善而不是故意伤害他们符合你自己的最佳利益。有很多方式我们无意中造成伤害,比如犯简单错误,别人必须花小时修复。对我们行为的正念,对我们编码宇宙中的人的 empathy,以及 just plain 关心我们所做的事情——很重要——并以善意回报我们。
Max Kanat-Alexander 说: 2019年9月30日下午4:16
太棒了,Joe。我认为说得很好。-Max
Darren S 说: 2017年8月28日下午3:15
我认为作者试图表达的观点是,你对坏/负面事件的反应应该引导互动/环境向积极方向。如果有人踩了你的脚,积极反应会像“对不起,但你踩我的脚很痛,我不确定它有什么目的,你能解释一下吗?”。我也和难相处的开发者共事过,我曾经有这种“我不是负面,我是诚实”的态度。但那仍然是负面,我最终 learned 如果我想让其他人改变他们的态度,我能做的 all 是成为一个积极的影响,period。相信我,我有过初级人员犯一些严重错误,让公司损失金钱。非常令人沮丧, especially after 你事先解释了如何避免那些错误。但指责人们触发负面反应, always,即使他们不立即显示。你似乎专注于事情的负面 side, without offering any kind of solution。那正是我提到的初级开发人员作为高级开发人员难相处的原因。一旦我以开放对话反应,而不是指责,我开始看到他的反应变化,我们开始讨论而不是争论。我认为这是作者的观点 here,有毒环境中的积极变化必须从积极(或至少建设性)对话开始。指出失败而不提供解决方案 accomplish nothing。如果有的话,它有负面效果,使初始问题更糟。
Mike W. 说: 2017年10月30日下午3:47
留在你的例子/类比中,你不必粗鲁对待他以防止他踩你的脚。Period。事实上,粗鲁对待他 will not 防止或劝阻他踩你的脚。这是“惩罚驱动心理学家”犯的错误:如果你真的非常用力踩他的脚,它会“教”他坏事情发生当他踩你的脚,然后他不会再做了。或者如果你对他尖叫他是 a-hole 因为他踩了你的脚,然后他会通过惩罚“学习”并且再也不踩你的脚。理论不奏效。(如果你不相信我,你可以下次有人推挤你或踩你的脚时试试。对他们尖叫 enough 你可能得到一拳在牙齿上。)Instead, exactly as described in the last paragraph of this post,你可能会(冷静地)说话,说,“嘿伙计,你能 please 看更 closely 你走路的地方吗?你刚踩了我的脚。”这比粗鲁更可能有效。你设置了一个完全错误的二分法, stating that either the person is stupid or bad。Has it occurred to you that when you treat other people with that belief, they will naturally react to you badly?而他们对你 irritated or resentful 行为 then 可以被你解释为 proof that they are stupid or bad:一个自我确认的假设。Try to treat others as you would want them to treat you and you may find their behavior toward you improving also。
1 – Kindness and Code 说: 2017年8月14日上午7:42
[…] Source:http://www.codesimplicity.com/post/kindness-and-code/ […]
Failure | Software Development with Jeff 说: 2017年8月22日晚上8:30
[…] is a mistake. Take a page from the Taylor Swift playbook and shake it off. You need a degree of kindness and forgiveness for others as well as for yourself to even allow actual teamwork to […]
Nadav Naor 说: 2017年9月12日上午7:43
我相信文章的最后陈述“与他们合作,保持善意,从而制作更好的软件”是这里最重要的陈述之一。在一天结束时,你希望你的团队成功,你希望你的产品/服务成功,你希望花时间做有影响力的事情,而不是仅因为现在太复杂而无法添加更多功能而重构/重新设计旧代码。如果你看到你的一个同行在代码审查中需要纠正,无论是设计方面、可读性还是其他任何方面,你反应越理智和逻辑(而不是情感),你的同行接受你的审查的机会就越大。此外,有时对方有比你更多的上下文。所以即使某些东西可能看起来不对,它实际上是正确的事情。通过粗鲁,你以后可能会让自己出丑。Try to understand if there is a good reason why the other person wrote the code that way。Anyway, thanks for the good post。
Aleksandra Reszotnik (https://www.statlook.com) 说: 2017年9月14日凌晨1:55
Thanks for the article, I appreciate it a lot! Frankly, I would like to live in a world where articles about keeping to some cultural standards would not get any popularity as something pretty much obvious。 Unfortunately, we are not; I cannot think about any kind of explanation of being simply rude toward other people。 Anyhow, the tendency happens to change, also due to voices like yours – and I am glad to witness that。
9/18/17 Software Design – My Blog 说: 2017年9月18日下午5:21
[…] Kindness and Code […]
Nexle 说: 2017年10月3日晚上8:10
我同意作者的观点。See how the software works instead of criticizing its code。
Toxicity and Community – CS Mikes Way 说: 2017年10月9日晚上6:04
[…] http://www.codesimplicity.com/post/kindness-and-code/#more-1673 […]
Saim Aksr 说: 2017年10月19日下午5:30
我也同意,团队成员应该总是互相帮助和友善,帮助其他开发者,让其他帮助你。它使成功更容易实现。
Roland Askew 说: 2017年10月29日凌晨1:21
完全同意。重要的是要外交、支持性和开放。软件工程可能是一个要求高的职业,支持的同事有助于韧性。这是一条双向街道。我认为很多它归结为每个参与者的态度和情感/自我支持技能。不是一个简单的个性 measure – 我 over time 遇到过几个刻板印象的内向、逻辑学家、系统思考者类型,他们像每个人一样有各种风味。我注意到的导致“残忍”情况的趋势可以包括过度膨胀的虚假信心(见 dunning-krueger 效应),对障碍或错误的糟糕反应,高自我 chastisement 与错误,强烈的 ego-defending(保全面子是一个例子),“被动优势”效应借此其他开发者习惯于更高 performer 拉动更高工作量并抵抗受影响的同事寻求的变化(一种边界 crossing),差的人际成熟度和技能包括 crossing boundaries, bringing unprofessional habits into the workplace, and more。人们可以选择职业 because of what they avoid as much as what they offer。花时间在只有机器的后室的刻板印象仍然存在 to a degree, and unfortunately for the foreseeable time the profession will still attract, and allow in, people who only want to do that and avoid human relations, or even people who are technically brilliant but have no measure of people soft skills。我要补充的一件事是,人们有 limits, and sometimes the reserves are emptied by stress or demand of the profession。礼貌仍然重要 especially with the customer, but otherwise a little understanding and forgiveness goes a long way with over-stressed team members。 To that end companies do better with good employee enhancement, support and retention programs。 Apparently some existing companies still believe to not be their responsibility。
Mike W. 说: 2017年10月30日下午3:35
坦率地说,如果你没有以“完全同意”开始你的评论,我会不知道你在这个文章主题上的立场, though 我读了你的评论四遍。似乎 psychological 术语的 sprinkling 没有 aid 有效 relay of understanding or information to your audience。Personally, I prefer clear-cut engineering style statements with precise and particular meanings, even when discussing subjects that relate to the human rather than the technical side of our profession。 For example, the author’s statement: “There is no value to being cruel to other people in the development community。” This is a statement with an exact meaning, requiring nothing but an understanding of the plain sense of the English words used。 (And note I am not a proponent of the notion that all statements must be reducible to numerical meaning as in mathematics in order to have logical validity。 Symbolic logic is a far weaker tool than well-written English for expressing precise ideas without losing nuance。) His is also a statement I believe is literally true and quite meaningful。Having read your comment three times further, it seems its intent would be preserved, enhanced and clarified(much like program code when Code Simplicity principles are applied) if one were to refactor it to simply state, “Kindness is among the most important qualities to preserve in oneself, despite the many difficulties and discouragements one may encounter in trying to do so。”This also avoids the rat’s nest of undefined “psychobabble BS” which so often hinders effective communication about the human side of our profession—and which actively turns away those technical people who prefer their data in a more orderly format。
Eshwar Yaddanapudi 说: 2017年11月11日上午10:06
我几乎几个月前在我的博客 http://www.yesprasad.com/2016/10/passion-and-compassion-your-companions.html 写了同样的主题。它谈论每个人在办公桌需要的 passion and compassion。