别让我打开话匣子

不成文规定

David Platt

David Platt软件行业总体来说就如现代社会,是由许多不成文规定引导的,并且这些不成文规定日渐积累。 但是我越是上了年纪,越是愚蠢地感到愤世嫉俗,我就越能看到事实上社会和软件行业都越来越多地被不成文规定统治而非成文的规定。

成文的规定说:“你不能这样做!”不成文规定说:“是的,在特定的情况下,你可以这么做。 为了完成工作你不得不这么做。”前者应对的是拟定规则的人理想中的世界,后者应对的才是真实的世界。

复杂吗? 好。 很微妙? 当然。 麻烦? 经常有。 但是下次请观察飞行员和护士工会进行合法怠工而不是罢工的情形。 没有这些不成文规定的润滑,他们的工作场所将很快陷入拥堵停顿的状态。 如果我们不遵守不成文规定(不是成文规定),我们的社会也会出现一样的情况。

设想一下,纽约洋基队的投球手 Michael Pineda 四月份因为在自己的手指上涂了松焦油以更好地抓住棒球而被禁赛 10 场。 成文的规定命令禁止投球手使用松焦油或任何其他物质。 不成文的规定却说在寒冷天气下使用一点松焦油是可以的,只要慎重使用即可。 Pineda 被禁赛的原因不在于使用松焦油,而在于过于明目张胆以致裁判员不得不加以注意(可从以下链接阅读相关内容:foxs.pt/1i3R3fz)。

对于我们的行业,面向对象的程序员将长期以来宣称的全局变量作为禁忌。 想到这些您就震惊了,是吗? 另一方面,除了是一个在包装器包装使其具有政治正确性的全局类之外,静态类还是什么? 程序员通常将其挂在一个名为“Globals”的对象类上。当一个程序中的某一项目只有一个实例,并且为整数时,您想让我对多少个抽象层、管理层和服务层进行包装以让您觉得符合道德呢? 在您读完上面那句话之后血压飞升的当口,我将复述此问题:当您可以把钱花在其他地方的情况下,您会为多少层向我支付报酬? 确认您的答案。 这可能与您在这两句话之前的第一反应有所不同。

有时,之前已存在的不成文规定会成为成文的规定。 将一个字符串(如文件名)直接硬连线至您的代码通常是一个糟糕的主意,但有时您不得不这样做。 给那种结构贴上听似道德的标签,您就可以高枕无忧了。

“我们遵循了‘已知名称’设计模式,”极客说。 “很好,很好,”不懂技术的老板说。 “我很高兴您使用了设计模式而不是我听说的什么牛仔编码之类的东西。”

伙计们,你们正在一个字符串中硬连线。 在需要的时候那样做,睁大你们的双眼,当你们已经过深思熟虑并且知道利益大于成本的情况下这样做吧。 欺骗自己将来有时间的时候您会回头修复它,这样可以安抚您的不安情绪。 但是不要认为您修改了它的名称,您就更改了它的功能。 一个 bug 对用户造成的痛苦和气恼不比您所称的“问题”要少(请参阅 msdn.microsoft.com/magazine/ff955613)。

从雷区中开辟一条路线,知道何时遵守成文规定及何时需要忽略它们而遵循不成文规定,这就是软件工程的要义所在。 这一行业中几乎没有绝对的“不应该”规则(尽管“不要在浏览器状态栏中滚动字幕字符串”已经很接近了)。 我总是告诉我的客户和学生的一点是“你要思考。 如果那很困难的话,你应该付我钱帮助你思考。“

我很期待听听你们最喜欢的软件开发的不成文规定或与此相关的其他事项。 请通过以下邮箱发送给我:dave@rollthunder.com

我相信一些学究的极客们现在会说,因为我已在此写下了一些规定,它们不再是不成文的规定了。 对此,我回复道:您正在违背我的“不要对浮夸的末页专栏作家挑刺”的不成文规定。 这足以禁赛 10 场了,您认为呢?


David S. Platt 在哈佛大学拓展学院以及世界各地的公司讲授 .NET 编程。他著有 11 本编程书籍,包括“Why Software Sucks”(Addison-Wesley Professional,2006)和“Introducing Microsoft .NET”(Microsoft Press,2002 年)。Microsoft 在 2002 年授予他“软件传奇人物”称号。他想知道是不是应该绑住女儿的两根手指,以便她学习八进制算法。您可以通过 rollthunder.com 与他联系。