The Kollected Kode Vicious

Kode Vicious - @kode_vicious

  下载本文的PDF版本 PDF

Kode Vicious

代码囤积

提交到提交,以及总结图表的妙处


尊敬的KV:

为什么开源项目的这么多有用的功能都隐藏在晦涩的配置选项下,这意味着它们几乎或根本不会被使用?这仅仅是典型的糟糕的文档和推广,还是有什么原因让这些开发者隐藏他们的代码?这代码看起来也不像是坏了。当我在最近遇到的一些代码中开启这些功能时,系统在测试和生产环境中都保持了稳定。我认为代码要么应该被使用,要么应该从系统中移除。如果代码在源代码仓库中,那么它并没有真正丢失,但它也不会弄乱系统的其他部分。

用它或失去它

尊敬的用它:

暴露或隐藏代码的原因和程序员的数量一样多。换句话说,源代码仓库中隐藏的代码比你梦想的还要多……好吧,你明白我的意思。

当我处理任何代码时,不仅仅是开源代码,我遇到的最常见的代码隐藏形式之一是已提交但开发者自身并未完全投入的代码。有时这是支持销售或市场部门要求的功能的代码,但开发者要么不相信这些功能,要么认为这些功能对系统有害。

“我想要一个停止按钮。”

“停止按钮如果被使用,将会破坏我们所有的数据。”

“没关系,我就想要一个停止按钮,而且我想要它是红色的。”

这些类型的功能通常被埋藏在系统中,只有在点击通过带有越来越可怕警告的对话框后才能开启。

更令人恼火的埋藏代码形式来自不愿对某个功能做出承诺的开发者,通常是因为他们对代码缺乏理解。在长期运行的项目中,开发者来来往往是很常见的,而较新的开发者可能会害怕他们没有花时间去理解或衡量的现有代码。会有一大堆借口被用来反对启用代码——因为它太慢、太旧或有太多错误。问题常常因大多数开发者固执的本性而加剧,他们除非被压倒性的证据击中,否则拒绝相信任何与他们的世界观不符的东西。我不能合法地建议真的去打开发者,但我会说我发现我的精装笔记本在会议室的桌子上往往会发出非常悦耳的砰砰声。

如果你正在一个项目上工作,并且遇到了这种顽固不化的情况,那么有更好和更坏的方法来处理它。与开发者进行零敲碎打的争论既耗时,又像教猪跳舞一样,只会激怒猪。处理这个话题的一种方法是政治性的,我意识到“政治”这个词对于很多听众来说是可憎的。向其他开发者说明你的理由,以建立关于处理某个功能的正确方式的共识。令人惊讶的是,这是一个值得做的练习,对项目有长期的好处。事实证明,当其他你信任的人都在说同样的事情时,有时更容易说服某人。

进行测量并收集证据来支持开启某个功能也是处理开发者顽固不化的有效方法。作为一个附带的好处,你生成的任何测试代码和结果都可以在以后代码不可避免地发生变化时再次用作测试代码。如果你把证据放在漂亮的厚纸上,正如前面指出的,它可以更直接地用来支持你的论点。

KV

 

尊敬的KV:

我有一个同事,他在过去的几个月里一直在他的私有分支中对我们的软件进行大规模的修改。虽然其中一些修改是简单的错误修复,会被放回开发主分支中,但其中很多是与性能相关的工作,他每隔一两周就会通过电子邮件发送相关信息。这些电子邮件包含几乎无休止的数字页面,这些数字只被简要解释或根本没有解释。我想问他是否听说过图表,但又担心这可能会让他认为我想审阅更多他的长篇电子邮件。有没有更好的方法向他解释我们需要的是摘要而不是所有的数据?

柱状图和折线图

尊敬的柱状图:

让我持续感到惊讶的是,大多数人从未在高中科学课上写过实验报告。我不知道你怎么样,但那是我学习总结数据和从课堂上进行的实验中创建数据图表的地方。我对图表用途最喜欢的说法来自罗伯特·沃森,他在剑桥大学教授操作系统研究的研究生课程

“图表在实验报告中有很多功能——最重要的是,直观地呈现大量数据,使数据中的趋势易于识别(例如,拐点),并且允许在不同组结果之间进行视觉比较。因此,如果我们建立两组数据之间的实验比较(例如,静态与动态性能),将它们放在同一张图表上将使它们易于比较。”

这是给研究生的指示,他们被要求在他的课程的实验报告中总结他们的数据。如果你删除第一句话中的“实验报告”一词,你可以简单地从那里开始向你的同事解释为什么没有人阅读他充满数据的电子邮件。

一旦你说服他图表是好的,你可能就不得不帮助制作好的图表。与我们过去在课堂上用纸、铅笔和直尺制作图表不同,现在有大量的软件可用,可以代表你获取原始数据并绘制图表。问题是你仍然需要知道你试图回答哪个问题,以及摘要是在帮助还是阻碍你对底层问题的理解。

绘制一组数字的图表不仅仅是将它们转储到程序中并看到一张漂亮的图片;它还涉及到获取一组数据并制作一个易于理解的表示,该表示可以在一群人之间共享,以便对系统做出判断。为了做出任何形式的判断,你需要知道你试图衡量什么。

你试图绘制图表的所有测量都需要共享一个共同的特征;否则,你就有可能比较苹果和橘子。例如,重复测量的网络带宽,随着时间的推移,是在某个采样期间(例如,“每五分钟”)看到的每单位时间(通常是秒)的比特数的测量。只要所有要比较的测量都共享这些属性,一切都很好,但如果两组之间的采样周期不同——例如,如果一个是每小时,另一个是每五分钟——那将是一个错误的比较。

在绘制数据以进行比较时,重要的是确保你的轴对齐。使用自动调整图表大小以包含所有数据的软件生成五个图表会得到无法比较的结果。首先找到所有数据的最大 X 和 Y 范围,并使用这些最大值来指示所有图表的长度和标记,以便可以进行视觉比较。如果一组数据有明显的异常值,它可能会使整组图表变得无用。例如,一个以微秒为单位测量的网络延迟的时间序列图表,会被一个以毫秒为单位的测量变得无法使用,因为你只会看到一条略微加粗的线沿着 Y 轴或时间轴,以及图表中间的某个位置的单个尖峰。不能正确处理异常值的图表是完全无用的。

大多数绘图软件在标记数据方面做得不好,然而标记是故事的重要组成部分。那条细蓝线真正表示什么?它正在向上和向右移动。这好吗?还是未关闭的错误报告的数量?为你的数据选择合理的颜色和标签可能听起来工作量太大,但就像注释你的代码一样,最终会得到回报。如果你不记得哪些点来自哪个数据集,因此甚至不明白图表的含义,那么图表就是无用的。

最后,关于总结数据的快速说明。一个经常被忽视或误解的重要区别是平均值和中位数之间的区别。平均值是一组数字的简单平均值,是最常用——也是最被误用——的数据摘要类型。使用平均值来总结一组数据的问题在于,数据必须是正态分布的,平均值才有意义。当我说“正态”时,我并不是要暗示它有一个快乐的童年。正态数据均匀分布在钟形曲线上,这并不能描述许多数据集。如果数据严重倾斜或有明显的异常值,则首选中位数。中位数手工计算起来更难,但我听说这些风靡一时的计算机玩意儿可以为你计算出来。

虽然有很多大型开源和商业软件包可以绘制你的数据,但我更喜欢从简单开始,因此,我向你推荐 ministat (https://freebsd.ac.cn/cgi/man.cgi?query=ministat),这是一个由 acmqueue 的专栏作家 Poul-Henning Kamp 编写的程序,它包含在 FreeBSD 操作系统中。它根据数据列生成简单的文本图表,并将完成所有告诉你关于平均值、中位数和统计显着性的工作。如果在某个时候,你的数据必须传达给那些来自另一个世界的人,正如你在问题中指出的那样,你可以用 R (https://r-project.org.cn) 绘制它,但那是另一个故事了。

KV

Kode Vicious,在凡人中被称为 George V. Neville-Neil,为乐趣和利润从事网络和操作系统代码工作。他还教授各种与编程相关的科目课程。他的兴趣领域是代码探险、操作系统以及重写你的糟糕代码(好吧,也许不是最后一个)。他获得了马萨诸塞州波士顿东北大学的计算机科学学士学位,并且是 、Usenix 协会和 IEEE 的成员。Neville-Neil 与 Marshall Kirk McKusick 和 Robert N. M. Watson 合著了FreeBSD 操作系统设计与实现(第二版)。他是一位狂热的自行车爱好者和旅行家,目前居住在纽约市。

版权 © 2015 由所有者/作者持有。出版权已授权给 。

acmqueue

最初发表于 Queue 第 13 卷,第 9 期
数字图书馆 中评论本文








© 保留所有权利。

© . All rights reserved.