acm-header
登录

ACM通信

Kode恶性

数字是计算机的,字符串是人类的


手握琴弦,插图

图片来源:Hurca / Shutterstock

回到顶部

亲爱的KV,

在调试一组似乎不按预期顺序执行操作的网络系统时,我发现了该应用程序使用的协议的一个有趣特性。这个系统相当旧了,我没有参与它的创建,但我被要求找出为什么大约10%的事务被标记为顺序错误。所有应用程序通信都使用TCP进行。由于TCP保证消息的顺序,我对两个系统之间的事务如何无序到达感到困惑。通过使用wireshark,我发现TCP流和预期的一样是有序的,但是TCP上使用的应用程序协议有一些相当奇怪的属性。

特别是,所有的信息,包括时间,都是用字符串来传递的。错误被证明是将时间从字符串转换为容易比较的值的错误。虽然邮件的发送顺序是正确的,但系统读取了时间,认为它们是错误的,并大声抱怨。当我最终找到编写代码的开发人员时,他说他使用字符串使协议更容易调试,并使查看日志文件的人更容易知道系统中发生了什么。我的感觉是他对这个概念的理解是错误的,我想知道你会怎么想,就像你在过去写的那样。

受到字符串

亲爱的刺痛,

这让我有什么感觉?好吧,就像几乎所有关于软件和技术的问题一样,这让我很生气,但是,还有什么不会让我生气呢?当你只演奏一个音符时,你可能会演奏得非常好,即使你的乐器是一个锤子和铁砧。

正如你所指出的,开发者至少有两个原因完全误解了这一点:第一是关于如何传达与时间同等重要的价值;另一个则与软件如何以及在何处将数据转换成人类可读的形式有关。

一般来说,计算机系统,特别是联网系统,经常依赖于时间和时间戳来维护或重建事件的顺序,而这种顺序通常必须维护,以便系统作为一个整体能够正常工作。有些系统可以在不知道时间的情况下运行;相反,它们依赖于事件的总排序,正如美国计算机协会授予莱斯利·兰波特(Leslie lamporter)图灵奖的那样,兰波特费心解决了那个小问题https://amturing.acm.org/award_winners/lamport_1205376.cfm).

仍然有一类系统确实关心一天中非常人性化的时间,例如信用卡处理。如果你向银行付款的时间戳不合适(例如,每月第一天的午夜),那么你将受到利息和罚金的支付,这可能会让你比KV更生气。时间在许多非银行安全协议中也扮演着重要的角色。如果向后比较,或者让它滚到0或负值,系统的安全性就会被破坏。基于时间的系统攻击的数量填补了大量关于计算机安全的论文和书籍。

应该指出的是,计算机喜欢与数字打交道。字符串是为人类准备的,所以把时间这样完整的东西存储在字符串里的想法从表面上看是荒谬的。要知道X是否比Y具有字符串格式的时间,唯一的方法是将时间转换为容易比较的值(即整数),然后让计算机通过数学进行比较,这是计算机非常擅长的。

人类为了进行相同的比较而观察这些数据的次数是微乎其微的,这就是几乎所有计算机语言都有时间数据结构的全部原因,它既可以很容易地进行比较,又可以避免误解。这并不是说我们不能把时间写成整数;我们可以,但当存储为字符串并在数学运算发生之前进行转换时,出错的可能性要小得多。找到你的语言提供的时间类型并使用它,并在每次比较中检查错误。

随着计算机变得越来越强大,编写软件的第二个谬误也变得越来越普遍,这个谬误就是计算能力应该总是用来给人类最好的体验。当计算机运行缓慢且价格昂贵时,程序员可以通过指出以紧凑的数值形式存储数据可以提高效率并使用昂贵的资源,从而避免处理人类的问题。随着计算机变得便宜和普及,许多人指出,这些效率不再像过去那样必不可少。

我们这些继续在裸金属附近编程的人从来没有真正放弃这一宝贵的正统观念,但KV必须,勉强地,非常勉强地,承认另一个阵营可能有一点。这里有几个字节,那里有几个指令,它们确实累加起来,但通常不值得为节省它们而努力,除非它导致不正确的结果或增加复杂性,这通常会导致不正确的结果(请参阅本专栏的前一节)。

除非您正在处理、存储或传输的是来自并打算展示给人类的字符串,否则应该避免将这些数据作为字符串处理、存储或传输。记住,数字是计算机的,字符串是人类的。让电脑把你的数据以人类可能会喜欢的形式呈现给他们。这就是那些额外的字节和指令应该使用的地方,而不是相反。

KV

ACM队列的q戳相关文章
queue.acm.org

时间是一种幻觉
乔治Neville-Neil
https://queue.acm.org/detail.cfm?id=2878574

时间,但是快
西奥Schlossnagle, Circonus
https://queue.acm.org/detail.cfm?id=3036398

没有现在
贾斯汀Sheehy
https://queue.acm.org/detail.cfm?id=2745385

回到顶部

作者

乔治诉Neville-Neilkv@acm.org)是内维尔-尼尔咨询公司的所有人,也是ACM队列编辑委员会。他从事网络和操作系统的代码编写工作,从中获得乐趣和利润,教授各种与编程相关的课程,并鼓励您发表与他有关的评论、妙语和代码片段通信列。


版权归作者所有。
向所有者/作者请求(重新)发布许可

数字图书馆是由计算机协会出版的。版权所有©2020 ACM股份有限公司


没有发现记录

登录为完全访问
»忘记密码? *创建ACM Web帐户
文章内容:
Baidu
map