Joel说软件--漏洞抽象定律(摘要)

    这章文章再次说明,当想学任何一门技术时都要从正反两个方面学,要知道它好,那在哪里,有缺点,缺到什么程序。

    但说实话,这篇文章到现在,读的还不是特别懂,总觉得是译的有问题。

 

    Internet的不可思议之处——它以不可靠传输为基础建立了可靠的传输,它就是计算机科学家喜欢称之的抽象化的那种东西:将极其复杂的事物进行简化,而使之不在表面上浮现出来。(而不是没有)。

 

    尽管TCP试图对底层的不可靠进行完整的抽象,但是网络不时地从抽象思行为中漏掉了。

        

         在某种程序上讲,所有发挥作用的抽象都是有漏洞的。

 

    抽象会陷入失败(是什么失败?),有时候这种失败只是一点点,而有时候是大量出现的。漏洞客观存在,事情总会遇到麻烦。只要你用到抽象思维机制,这样的情形就会无一例外的发生,例如:

 

    1.  SQL语言意味着把查询数据库所需要的过程步骤抽象化了,它只是让用户定义所需要的内容而让数据库自己的去弄清楚实际查询所设计的过程步骤。不过,在有些情况下,某种SQL查询会比其他逻辑查询方式慢上成千上万倍。有一个著名的例子:“where a=b and b=c and a=c”子句形式的SQL查询时的性能,比执行包含“where a=b and b=c”子句形式的SQL查询要快得出奇,尽管所得到的结果是一样的。

    注:抽象机制认定你所关注的不是过程,而是需求方面的描述。不过有时这种抽象的漏洞会导致可怕的性能损失。

 

    2.  C++中字符串类称可以让你将字符串当做一类数据来处理。它们试图掩盖字符串难以处理这一事实,而使你像操作整数一样容易处理。几乎所有的C++字符串类都重载了+运算符,以便你可以写出s+”bar” 形式的语句来实现字符串的连接。但实际上C++字符串常量总是char *s形式的,而不是真正的字符串,这种抽象机制暴露出来的一个漏洞是,该语言不允许在串中插入内容。

 

    3.  汇编与C++Jave比较,C++Jave可以使用语法规则减少程序员无意中犯的逻辑错误,但却是以丧失或削弱对底层数据的访问能力为代价的,如Java不允许访问特定的内存地址,程序员能够使用JNI(Java本地接口类)调用一个C过程绕过这个限制,但这可能会使程序难以维护。与此相反,汇编语言可访问任意内存地址。

 

    抽象行为并不像它们看起来的那样使人们的生活真正得到了简化。

 

    漏洞抽象法则意味着,不管什么时候有人弄出一个据说可以让我们的工作变得一劳永逸的新式代码生成工具,我们总会听到许多人说:“首先学会如何手工使用它,然后再去使用这件订报式武器去节省时间。”表面上将某些东西抽象掉的代码生成工具就像所的的抽象方式一样丰硕漏洞,而有效处理这些漏洞的惟一途径就是:弄清楚抽象机制是如何工作的,以及它将什么东西抽象掉了。所认说,抽象机制虽然节省我们的工作时间,但它并不节省我们的学习时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值