
建立“泄漏抽象定律”的文本写于2002年。为什么将近20年后才翻译?它仍然没有失去其相关性,值得一读。 TCP尚未收到更好的选择,泄漏抽象定律仅根深蒂固于开发人员的生活中,并且有成为公理的危险。我还要补充一点,我没有计算文本中指示的所有时间范围,因此请考虑一些“时间偏移”。
它是我们每天依赖的互联网工程魔力的关键要素。 TCP是Internet的基本组成部分之一,它具有魔力。
使用TCP是可靠传输数据的一种方式。明确地说,在通过网络发送消息时使用TCP可以确保它以原始形式到达。
我们将此协议用于多种任务,例如加载网页和发送电子邮件。由于TCP的可靠性,电子邮件在发送时即到达。即使这是没用的垃圾邮件。
相比之下,还有另一个不可靠的,称为IP的数据传输协议。没有人能保证数据将被传递。如果您使用IP发送一系列消息,那么当一半的消息将不会传递而另一半的消息将以随机顺序发送时,请不要感到惊讶。而且,某些消息有可能会变成小猴子的图像,或者更有可能的是,消息将变成不可读的垃圾。
这就是真正的魔术发生的地方:TCP基于IP。换句话说,仅使用不可靠的工具就需要TCP可靠地传递数据。 为了更清楚地说明为什么这是魔术,请考虑一个现实的,尽管有些荒谬的生活场景。
想象一下,我们正在将演员从百老汇派到好莱坞,而我们的职责包括在全国各地运送演员。一些汽车撞毁,演员死亡。演员可能会在旅途中喝醉,理发或在鼻子上刺青,这就是为什么他不再被好莱坞所接受。最重要的是:我们按照严格定义的顺序派遣演员,而且他们以随机顺序出现,因为他们每个人都沿着自己的路线旅行。
现在想象一下好莱坞快递提供的服务,该服务可以保证:(a)交付; (b)以正确的顺序; (c)状况良好。奇迹是好莱坞快车没有其他方法可以转移演员,除了不可靠的汽车外。好莱坞快车会检查每位来的演员,如果状况不理想,服务人员会呼叫该演员的故乡,并要求派出同卵双胞胎。如果演员以随机顺序到达,好莱坞快车将恢复原始顺序。即使一艘大型外星船在驶向51区的途中坠毁并使内华达州的高速公路瘫痪,演员们也只会改变路线并穿越亚利桑那州,而好莱坞快车公司也不会将事件告知加利福尼亚的制片人。对于生产者,一切都会像这样好像演员开车的时间比平常多了一点,而且没有UFO坠毁。
TCP的工作方式大致相同。这就是计算机科学专家所说的抽象-简化了一些复杂的事情。大部分编程都与构建抽象有关。什么是字符串库?这是一种使处理字符串与处理数字一样容易和方便的方法。什么是文件系统?这是一种将硬盘驱动器视为不是一组在特定位置存储位的旋转磁盘的方法,而是一种具有包含数据的文件的目录的层次结构。
但是回到TCP。我做了一些修饰,以使其更容易理解TCP的工作原理。而且我意识到这种简化会带来一些白热化。我说过,TCP保证消息传递。好吧,不是。如果宠物计算机的网络电缆,则IP数据包将停止到达它。不管TCP是否付出努力,都不会传递该消息。如果您对公司的系统管理员不礼貌,并决定通过连接到过载的集线器来惩罚您,那么仅部分IP数据包会到达,在这种情况下,TCP会起作用,但速度非常慢。
这就是我所说的泄漏抽象。... TCP试图从不可信的网络中抽象出我们,但有时网络仍会“流过”抽象,您会遇到抽象无法挽救您的情况。这只是所谓的泄漏抽象定律的一个示例:
任何非平凡的抽象都有些泄漏。抽象分解。有时一点,有时很多。这称为孔,泄漏。事情没有按计划进行。这发生在使用抽象的整个地方。这里有些例子:
- : . « », — . , . , , , , .
- SQL , . , , , . SQL- , . , «where a=b and b=c and a=c» , «where a=b and b=c» . , , . , . , , .
- NFS SMB , . , . « , ”. . ( ), .forward ( ), .forward . , .
- , ++ . , , , . ++ +, s + “bar” . ? , , , “foo” + “bar”, ++ char*. , . (, ++ . — .)
- , , , , , . . , , . .
从泄漏抽象定律得出的结论是,抽象并没有像我们想要的那样简化我们的生活。当我教C ++时,我想避免谈论char *数据类型和指针算术。马上谈论STL真是太好了,但是有一天,学生会写“ foo” +“ bar”而感到害怕,我必须告诉您有关char *的信息。或者有一天,他们尝试使用OUT LPTSTR参数调用Windows API函数,并且他们仍然必须了解char *,指针,unicode和wchar_t,TCHAR以及通过抽象泄漏的所有内容。
使用COM(组件对象模型-大约翻译)进行编程时,立即学习Visual Studio帮助器和代码生成的所有魔力将是一件很不错的事情。但是,如果至少有什么地方出了问题,那么程序员将不会丝毫知道发生了什么,在哪里寻找错误以及如何修复错误。我将不得不谈论IUnknown,CLSID和ProgIDS,以及……哦,人类!
在教授ASP.NET时,最好教如何双击对象并编写当用户单击对象时将在服务器上运行的代码。从本质上说,ASP.NET消除(超链接处理的点击之间的差异的一个)并点击按钮。但这是问题所在:在HTML中,您无法通过单击超链接来提交表单,而ASP.NET开发人员必须隐藏此问题。他们通过在onclick超链接处理程序中生成多行JavaScript代码解决了该问题。但是,尽管如此,这是抽象的一个漏洞。如果为最终用户禁用了JavaScript,则ASP.NET将无法正常工作,并且应用程序程序员在未意识到ASP.NET所抽象的内容的情况下,将无法理解发生了什么。
泄漏抽象定律说,当有人提出了一个伟大的新代码生成片段,应该可以极大地提高我们的效率时,您会听到:“首先自己学习如何做,然后使用此工具节省时间。”代码生成工具以一种或另一种方式使用抽象,这当然充满了漏洞。处理所有漏洞的唯一方法是知道如何应用抽象以及它们究竟隐藏了什么。因此,抽象为我们节省了工作时间,但没有节省学习时间。
这是自相矛盾的,但是每当我们发明具有更好抽象的高级工具时,要成为一名专业程序员就变得更加困难。
在Microsoft的第一次实习期间,我开发了用于在Macintosh上处理字符串的库。这是一个典型作业的示例:编写一个strcat版本,该版本返回一个指向换行符末尾的指针。仅几行C代码。我所做的一切都直接来自K&R,这是一本有关C编程语言的精简书,
然后我在CityDesk工作(该公司于2016年关闭,大约是Transl 。)。现在,我需要了解Visual Basic,COM,ATL,C ++,InnoSetup,Internet Explorer内部,正则表达式,DOM,HTML,CSS和XML。与K&R资料相比,这些都是高级工具,但是我仍然需要了解所有K&R资料。
十年前,我们可以想象到新的编程范例将使我们现在更容易开发。实际上,几十年来我们创建的抽象使我们能够轻松地适应10-15年前不曾屈服的新级别的复杂性,例如GUI开发或联网。现在,我们拥有许多出色的工具,例如面向对象的表单感知语言,这些工具使我们能够快速完成工作。直到一天,我们都面临一个抽象“泄漏”的问题,我们需要两个星期来解决。当您需要雇用Visual Basic程序员仅执行VB代码时,这不是最好的主意。因为这样的程序员每次偶然发现Visual Basic抽象中的一个漏洞,都会陷入困境。
泄漏抽象定律使我们陷入困境。