翻译 :邹永胜程序员
欢迎访问网易云社区,了解更多网易技术产品运营经验。 正则表达式
互联网上有一个很关键的部分,你天天都依赖于它,它处于TCP协议中,它是互联网的基本组成部分之一。
TCP协议是可信赖的传输层协议。这就意味着你采用TCP去发送数据,不会存在数据混乱或丢失的状况。
咱们平常中的不少事情都在使用TCP协议,例如浏览网页或者发送邮件。每一封邮件可以稳定的到达正是因为TCP的可靠性。尽管其中有许多垃圾邮件。
做为比较,另一个不可靠的传输数据的协议称为 `IP`。没有人可以保证你发送的数据可以达到,即便到达了,数据也许已经混乱了。若是你采用IP协议去发送一批数据,若是只有一半数据到达了,千万别惊讶。即便是达到的数据中,也不能保证数据正确。
可是有个神奇现象:TCP是在IP协议之上的,TCP有义务采用一种不可信赖的方式去传输数据。
为了解释这个神奇的现象,在真实的世界中以道德的角度来思考这个问题:
想象咱们要从百老汇运送一批演员到好莱坞,咱们采用汽车运输的方式,横跨几个州。运输过程当中,有些车辆坠毁了,可怜的演员就这样挂了。有些演员或醉酒、剪了头发、纹了鼻子等,形象变化了,以致于好莱坞再也不接受他们演出。与此同时,因为每辆车的行驶路线不一样,致使每一个演员的到达时间不同。如今假设有一种服务叫作好莱坞速递,它能快速安全有序的运送演员到好莱坞,每一个演员的到达顺序和出发顺序完美地保持一致。神奇的部分在于好莱坞速运除了把演员塞进车里,而后横跨几个州运输外,没有其余办法运输。好莱坞速运会检验每一个演员确保是否无缺无损的到达,若是出现问题,就会请求总部,从新下发送一个与损坏的那个演员如出一辙的演员过来。若是到达后演员顺序出错,速运公司会从新给他们排序。若是有不明飞行物撞击损坏了内华达州的道路,那么全部的运输车辆都会从新选择亚利桑那州的道路。当到达目的地后,速运公司不会告知加州的好莱坞导演们中途发生了什么,对于导演来说,他的演员们仅仅是比以前慢一点而已,至于中午的UFO撞击事件他们压根不知道。
也就是说,TCP的神奇之处就是计算机科学家们喜欢称之为抽象的东西:掩盖复杂的流程达到简化的目的。事实证实,不少计算机编程都是由抽象构成的。什么是字符串库?这是一种使计算机能像操纵数字同样容易操做字符串的方法。什么是文件系统?这是一种伪装硬盘驱动器不是一堆能够在特定位置存储二进制数据位的旋转磁盘,而是一个文件夹内文件夹的分层系统,其中包含单个文件,这些文件又由一个或多个字节串组成。
回到以前的TCP。早些时候,为了简单起见,我撒了个小谎,有些人如今耳中已经涌出了怒气,由于谎话使得你疯狂。以前我说TCP保证你的消息会到达。 实际上并不是如此。 若是您的宠物蛇将链接计算机之间的网线咬断了,那么没有任何IP数据包能够经过,天然经过TCP方式传输的任何数据都到达不了,天然你的消息没法到达。 与此同时若是公司中的系统管理员惩罚你,将你的网络分配到一条过载的集线器上,只有部分IP数据包可以经过,尽管此时TCP能够工做,可是一切都会变得很是慢。
这就是我所称作的*抽象漏洞(leaky abstraction)*。TCP尝试在一条极不稳定的网络线路上提供稳定的服务,可是因为网路漏洞的限制,致使这种抽象并不能平稳的保护你的数据。这仅仅是我为了阐述抽象漏洞所阐述的一个例子:
> 某种意义上任何有意义的抽象都是由漏洞的
> - All non-trivial abstractions, to some degree, are leaky.
抽象失败。有时比较少,有时却不少。有存在漏洞的。有出错的。当你有抽象的时候,漏洞总会。下面是一些例子。
- 有时就像在大型二维数组上迭代,纯水平、垂直方向操做可能具备彻底不一样的性能,单纯的一个方向所产生的错误可能会大于操做另一个方向。即便程序员伪装他们拥有一个大的平面地址空间(实际上也是真是内存的一个抽象),当出现错误时,肯定的物理空间提取数据比其余空间更耗时。
- SQL语言旨在抽象出查询数据库所需的过程性步骤,而只容许您定义所需的内容,并让数据库肯定查询数据库的过程性步骤。但在某些状况下,某些SQL查询比其余等价查询查询慢数千倍。一个著名的例子是,即便结果集相同,若是指定“where a=b and b=c and a=c”,那么一些SQL服务器的速度要比只指定“where a=b and b=c”快得多。你没必要关心程序,只须要规范。可是有时候抽象会泄露并致使糟糕的性能,你须要跳出查询计划分析器,研究它作错了什么,并找出如何使查询运行得更快。
- 即便像NFS和SMB这样的网络库容许您将远程机器上的文件“看成本地的”来对待,但有时链接变得很是慢或中断,文件中止工做就像本地同样,而且做为程序员,你必须编写代码来处理这个问题。“远程文件与本地文件相同”的抽象就泄露。这里是UNIX系统管理员的一个具体例子。若是您将用户的主目录放在NFS挂载的驱动器上(一个抽象),而且你的用户建立.forward文件以将其全部电子邮件转发到其余地方(另外一个抽象),此时NFS服务器在新电子邮件到达时关闭,则不会转发消息,由于.forward文件找不到。抽象中的漏洞实际上引发了一些消息被抛弃。
- C++字符串类应该让你以为字符串是一流的数据。他们试图抽象出字符串并让你其表现像整数同样简单。几乎全部C++字符串类都重载+运算符,所以能够编写S+“bar”来链接。可是你知道吗?无论他们怎么努力,在地球上没有C++字符串类,可让你键入“foo”+“bar”,由于C++中的字符串文字老是char *,历来没有字符串。抽象出现了一个漏洞,语言不容许你插入。(有趣的是,随着时间的推移,C++演进的历史能够被描述为试图在字符串抽象中插入漏洞的历史。为何他们不能只给语言添加一个本地字符串类)
- 下雨的时候你不能开得那么快,尽管你的车有挡风玻璃的雨刷、前灯、车顶和加热器,这些都是起到保护你的做用,让你不要担忧下雨的事实,可是你仍旧得担忧水上滑行。在英国,有时雨很大,你看不见前面很远的地方,因此在雨中须要放慢速度,由于天气永远不可能彻底被抽象出来,由于抽象法则有漏洞。
抽象漏洞法则有问题的一个缘由是,抽象并无真正简化咱们的生活。当我培训某人成为C++程序员时,若是我历来没有教过他们关于字符型指针和指针算法的话,而是能直接进入STL字符串,那就很好了。可是有一天他们会编写字符串拼接的时候,“foo”+“bar”,真正奇怪的事情就会发生,不管如何,我必须停下来教他们关于字符指针的全部知识。或者有一天,他们没法调用具备具备OUT LPTSTR参数的Windows API函数,直到他们了解了char*、指针、Unicode、wchar_t、TCHAR头文件。
在向某人教授COM编程时,若是我能教他们如何使用Visual Studio向导和全部代码生成特性就行了,可是若是出了什么问题,他们就不知道为何以及怎么调试它、修复它。所以我要教他们全部关于IUnknown、CLSID、ProgIDS...,天哪,还有好多细节要讲!
在教授有关ASP.NET编程的知识时,若是我能教给他们,他们能够双击一些东西,而后在用户单击这些东西时编写在服务器上运行的代码,那就太好了。可是实际上,ASP.NET抽象了编写HTML代码以处理对超连接(<a>)的单击事件和处理对按钮的点击的具体细节。问题:ASP.NET设计者须要隐藏的细节是,没法从HTML的超连接提交表单。他们的作法是,经过编写几行JavaScript并将之附加到超连接来实现这一点。很明显,会有抽象的漏洞,若是最终端用户禁用了JavaScript,ASP.NET应用程序就不能正常工做,而且若是程序员不理解ASP.NET在这个行为背后抽象了什么,他们就不会知道什么地方出错了。
抽象漏洞法则意味着,每当有人提出一个全新的使人眼花缭乱的代码生成工具,它使咱们工做变得高效,您就会听到不少人说“首先学习如何手动完成,而后使用自动化工具来节省时间。代码生成工具就是人们尝试去抽象一些工做,进行包装。这仅仅可以节省咱们的工做时间,却不能节省咱们的学习成本。
矛盾的是全部的这些都意味着,编程工具变得愈来愈高级,愈来愈抽象,可是这使得咱们成为一个熟练的程序员变得更加困难。
在我第一次微软实习期间,我编写了在Macintosh上运行的字符串库。一个典型的任务:编写一个Strcat版本,执行结果会返回指向新字符串结尾的指针。几行C代码。这是正确的作法,这些是从K&R(一本关于C语言的很薄的书)中学习的。
今天,为了在CityDesk工做,我须要去了解Visual Basic、COM、ATL、C++、InnoSetup、Internet Explorer内部结构、正则表达式、DOM、HTML、CSS和XML。
十年前,咱们可能已经想象到,新的编程范式将使编程变得更容易。事实上,这些年来咱们建立的抽象确实使得咱们处理软件开发中的复杂性变得简单,这些复杂性在10或15年前咱们没必要处理,好比GUI编程和网络编程。虽然这些很优秀的工具,像现代的面向对象的编程范式,让咱们快速完成许多工做。可是忽然有一天咱们发现一个问题,是该种范式的抽象漏洞,修复它须要2周。而且当你须要雇佣一个程序员来使用VB编程时,很明显VB程序员是不够的,由于每次发现VB抽象漏洞时,他们都会彻底陷入焦虑中。
抽象法则正在拖累咱们。
本文章翻译自 Joel Spolsky 的 [The Law of Leaky Abstractions](https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/) 算法
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
数据库
更多网易技术、产品、运营经验分享请点击。 编程
相关文章:
【推荐】 6月第5周业务风控关注 | 《网络安全等级保护条例(征求意见稿)》本周正式发布
【推荐】 如何让你产品的用户拥有一流的上传体验
【推荐】 网易宝系统架构之我见:高可用篇
数组