以下内容摘自Chian-pub上该书译者对网友评论的回复
《C陷阱与缺陷》价值所在——兼答两位网友(上)
高巍(w-gao@263.net)
openlinux与flier两位网友对《C陷阱与缺陷》一书提出了个人的宝贵见解。对译者来说,读者应该是自己的老师和朋友,老师的指教与朋友的批评,自然值得聆听。
openlinux网友认为该书“在书店翻了一下,感觉没什么深度,看这本书的人应该属于,刚读完《C语言程序设计》的初学者。对从事C开发工作一年以上的人来说,会觉得太简单。”
flier网友的意见则可以归为两点:
(1)“过于经典”
“大量篇幅论述的都是大概几年前就已经不再是问题的问题。十年前看此书,应该会大有裨益,不过今天来看,只能作为瞻仰传说中的C编译器的途径”
(2)层次不高
“此书是以C语言角度来看问题,不如后来者使用C++角度看来的实际。”“仅仅停留在语言层面,过多细节、过于琐碎。”
两位网友的意见都非常中肯,不过,译者还想就着两位的观点作些发挥和补充。毕竟,这本书译者费了近50天的时间来翻译、校核,而openlinux网友只是“在书店翻了一下”,flier网友也仅仅是“这两天抽空把《C陷阱与缺陷》一书速读了一遍”。
1.
每本书都有自己的定位和目标读者群体。一本书无法做到One Size Fits All,只能选择一个特定的角度来下笔。从C++角度来看,Addison-Wesley有一本C++ Gotchas: Avoiding Common Problems in Coding and Design的新书即出。超越语言层面,Code Complete与Writing Clean Code确实不错,《C陷阱与缺陷》也无意与二者相争。众口难调,如果《C陷阱与缺陷》写成了Writing Clean Code的风格,难保不会受到临空蹈虚、不切实际之类的批评。
《C陷阱与缺陷》确实不是《C++陷阱与缺陷》。如果各位朋友关注C++陷阱与缺陷,可以参阅《C++批判》(《C++?? A Critique of C++ and Programming and Language Trends of the 1990s》,3rd Edition,Ian Joyner 。《程序员》杂志上有介绍),以及《The darker side of C++》。另外,《Effective C++》、《More Effective C++》、《Exceptional C++》、《More Exceptional C++》都可以参考。现在还有大量的编程任务,需要用到“纯C”即ANSI C、标准C来完成。而且,C++并不是C的超集,译者实在无法认同,从C++的角度来看就要更实际一些。
《C陷阱与缺陷》确实不是《程序代码书写的陷阱与缺陷》。清华出版社最近出版了一本《凌波微步——软件开发警戒案例集》,文笔风趣生动,在技术作品中确实别开生面,感兴趣的朋友可以一读。
《C陷阱与缺陷》就是《C陷阱与缺陷》,总结了C语言编程中常见的陷阱和易犯的错误。作者在致谢中至少提到近二十人,其中包括Dennis Ritchie,他们也指出了一些C陷阱。即使是这些顶尖的程序员,也在flier网友们所不屑的“细节”、“琐碎”处,跌过跟头、吃过苦头。我们常常听到这样的话,魔鬼常常隐身于细节之中。译者不希望说一通大道理,但我得承认,至少我本人就犯过书中指出的一些错误。在翻译这本书的时候,我常常有抑制不住的念头——如果能早一点读到这本书就好了。正如作者Andrew Koenig提到的,即使是experienced programmer,读到这本书时,也会发出感叹,“that bug bit me just last week”。
《C陷阱与缺陷》价值所在——兼答两位网友(中)
高巍(w-gao@263.net)
2.
《C陷阱与缺陷》的许多内容,确实在其他C语言的书中也有提及,但Andrew Koenig的贡献在于系统地整理、收集了这些原本零乱的内容。用一个恶俗无朋的比喻,就是把散乱的珍珠串了起来。这些C语言编程的宝贵经验教训,原来只能是从不同的读物中sporadic地学习,东捡一点、西捡一点,今天在哪里看到一个,明天又在哪里看到一个。
《C陷阱与缺陷》中的内容,可能确实“没什么深度”。感兴趣的朋友可以参考Feuer: The C Puzzle Book, Prentice-Hall出版社,1982。那里面有许多匪夷所思的、真不知道作者怎么想出来的东东。如果感兴趣的朋友还想进一步钻牛角尖,可以参加Obfuscated C的竞赛,那些把C语言用到炉火纯青、出神入化的高手,写出的晦涩难懂、几近天书的代码,应该会让您瞠目结舌的。
不过,译者还是喜欢《C陷阱与缺陷》的程度,正如鲁迅先生对刘半农的评价,“浅”未尝不是好事,何况《C陷阱与缺陷》未必就那么“浅”。
3.
“过于经典”,恰恰是我与flier网友分歧最大之处,愿意与您坦率地交换意见。
这个问题的实质是,历史值不值得学习,抱什么样的态度来学习历史。
在书店经常听到这样的对话,“Delphi7都出来了,这些书都是讲Delphi6的”。侯捷先生就批评过那些盲目追新、天天忙着软件版本升级的初学者。
《C陷阱与缺陷》确实讲了一些不再是问题的问题,也确实涉及到一些值得瞻仰的传说中的C编译器的特性。对待这部分内容,译者的建议是,不需要记住具体的结论,而应该关注问题的背景,沿革的思路,解决方案是如何演进的。
《C陷阱与缺陷》价值所在——兼答两位网友(下)
高巍(w-gao@263.net)
例如,在第7章第8节“7.8 随机数的大小”中,作者提到:
最早的C语言实现运行于PDP-11计算机,它提供了一个rand函数,PDP-11计算机上的整数长度为16位,因此rand函数返回值介于0到2^15-1。当在VAX-11计算机上实现C语言时,该机型上整数的长度为32位。当时有两组人员同时分别在VAX-11计算机上实现C语言:一组人员在加州大学伯克利分校,他们认为rand函数的返回值范围应该包括该机型上所有可能的整数取值,因此他们设计的C语言实现上rand函数返回一个介于0到2^31-1的整数。另一组人员在AT&T,他们认为如果VAX-11计算机上的rand函数返回值范围与PDP-11计算机上的一样,即介于0到2^15-1之间的整数,那么在PDP-11计算机上所写的程序就能够较为容易移植到VAX-11计算机上。
这样造成的后果是,如果我们的程序中用到了rand函数,在移植时就必须根据特定的C语言实现作出“剪裁”。ANSI C标准中定义了一个常数RAND_MAX,它的值等于随机数的最大取值,但是早期的C实现通常都没有包含。
对于这样的内容,我们应该把阅读重点放在:学院派与工业派思考问题的不同重心,如何在各种选择之间作出trade off(权衡),不同的选择各有什么问题,如何解决这些问题,各个时期的解决方案如何演变等。译者对60年代大型机时代程序员的工作情况比较感兴趣,业余在网络上也收集到许多文章,深感对个人极有裨益。最近,读到机械工业出版社的新书《虚拟机设计与C++实现》,作者也提到对程序设计历史了解的重要。
译者个人观点,这些内容的精髓在于——它为我们提供了一个个极佳的案例。通过这些案例,我们了解了当时问题提出的背景,限制和约束条件,先辈程序员如何权衡决策的。程序员在编程时,经常要面对各种两难境地,需要满足一对对看上去相互矛盾的条件,在其间作出决策。程序员的能力,很大程度上就体现在这种面对crisis dilema时decision making的能力上。
译者对围棋非常爱好,世界上没有两盘一模一样的棋局。可是,几千年前的名谱,还是有人在研习。打谱的意义,重在理解如何在种种情势下作出决策。而不是企望在实战对局中,会出现雷同的棋局。例如,了解Unix的两种流派在技术实现上的不同特点,琢磨当时各方是如何作出决策的,琢磨当时的决策对后来的影响,非常有助于提升技术素养。
至于两位网友都提到的书价问题,则属于出版社的内部业务运作,译者就不便置喙了。
关于《C陷阱与缺陷》译注的一些说明
高巍
各位朋友对《C陷阱与缺陷》(原书名:C Traps and Pitfalls)译注的意见值得重视。笔者正在“变译理论”的提出者黄忠廉老师指导下,探索“变译”在科技翻译中的实践应用,对大家的意见格外乐意听闻。
《C陷阱与缺陷》中的译注,大致包括以下几类:
(1)原书作者笔误
原书虽历经18次印刷,仍白璧微瑕,存在诸多typo。大部分此类印刷错误,译者在译文中直接改过。某些地方,一时难于确定,恐原作者另有深意,故以译注形式体现。
例,P22页有关条件运算符的说明即为此类。
(2)历史遗留问题
原书成书年代较早,书中的某些具体论断在现在的编程环境中不尽正确。译者在翻译时,对原书的例程以及具体结论都在尽可能多的编译器下作了测试。
例,P12页的第1个译注。P12页的第2个译注,针对原书的某个抽象论断,具体阐释了在不同编译器中是如何实现的。
(3)C99标准
在翻译该书时,译者将原书的各个具体论断与最新的C99标准作了必要的核对检查。如有较大出入之处,则以译注形式指出。
例,P34页和P44页的译注即为此类。
(4)补充相关知识
原书作者建议,该书可以作为C语言编程学习者的参考阅读材料。考虑到C语言编程初学者可能不熟悉原书某些概念,因此在译注中作了说明。
例,P118页关于One's Complement 和 Two's Complement的说明,即为此类。
例,P138页关于Big Endian 和 Little Endian的说明,也为此类。
另外,还需要说明的是,本书没有任何“译序”、“译者说明”之类。某些读者抱怨,“长篇大论,竟然都是译者的看法”,可能是把审校者的介绍文字张冠李戴了。译者认为,优秀的作品本身的说服力就胜过任何译序。
还有朋友对“心智模式”的译注颇有微词,“这根本对理解本书无甚意义”。译者的观点恰好相反,而且认为这一点的重要性对全书而言无论如何强调都不为过分。
作者在前言中首先说明,“本书所要集中讨论的是第二类问题,也就是程序并没有按照程序员所期待的方式执行。”然后,作者十分精辟地揭示了程序错误的本质,即“程序”与“程序员对该程序的心智模式”两者之间的相异之处。
《C 陷阱与缺陷》整本书讲的都是程序员如果“想当然”,将会遇到哪些错误。在该书的最后一章,作者认为,要规避C语言中的这些问题,最重要的就是“知道自己在做什么”。
作为译者,我强烈建议各位读者朋友阅读《第5项修炼》(彼得.圣吉,上海三联书店,1998年第2版)。彼得.圣吉先生在《第5项修炼》中用了整整一章(第10章,章名就是“心智模式”)的篇幅来讲述,特别是心智模式如何影响到我们正确认识这个世界,如何阻碍我们真正的进步。
不理解“心智模式”,阅读《C陷阱与缺陷》,可能记下了一鳞半爪的一招半式,但无异买椟还珠。
某些朋友认为该书译注过多,可能是该书的排版使得译注与作者原注的区分不甚明显,这本书中其实还包括了很大部分的作者原注。
译注直接出现在上下文中,是译者根据个人读书体验而向出版社提出的建议,也是采纳了侯捷老师《深度探索C++对象模型》译注的排版形式。译者个人认为此种排版优于传统排版形式,不免推己及人,如果让某些读者朋友感到了不便,译者深表歉意。
从经济上说,译者的报酬固定,是按每千字计算,与该书的定价、销量都无关。之所以絮絮叨叨、不惮烦琐的写了这些文字,实在是觉得如果因为译者的原因而使各位朋友错过这本好书,那真是罪莫大焉。
《C陷阱与缺陷》价值所在——兼答两位网友(上)
高巍(w-gao@263.net)
openlinux与flier两位网友对《C陷阱与缺陷》一书提出了个人的宝贵见解。对译者来说,读者应该是自己的老师和朋友,老师的指教与朋友的批评,自然值得聆听。
openlinux网友认为该书“在书店翻了一下,感觉没什么深度,看这本书的人应该属于,刚读完《C语言程序设计》的初学者。对从事C开发工作一年以上的人来说,会觉得太简单。”
flier网友的意见则可以归为两点:
(1)“过于经典”
“大量篇幅论述的都是大概几年前就已经不再是问题的问题。十年前看此书,应该会大有裨益,不过今天来看,只能作为瞻仰传说中的C编译器的途径”
(2)层次不高
“此书是以C语言角度来看问题,不如后来者使用C++角度看来的实际。”“仅仅停留在语言层面,过多细节、过于琐碎。”
两位网友的意见都非常中肯,不过,译者还想就着两位的观点作些发挥和补充。毕竟,这本书译者费了近50天的时间来翻译、校核,而openlinux网友只是“在书店翻了一下”,flier网友也仅仅是“这两天抽空把《C陷阱与缺陷》一书速读了一遍”。
1.
每本书都有自己的定位和目标读者群体。一本书无法做到One Size Fits All,只能选择一个特定的角度来下笔。从C++角度来看,Addison-Wesley有一本C++ Gotchas: Avoiding Common Problems in Coding and Design的新书即出。超越语言层面,Code Complete与Writing Clean Code确实不错,《C陷阱与缺陷》也无意与二者相争。众口难调,如果《C陷阱与缺陷》写成了Writing Clean Code的风格,难保不会受到临空蹈虚、不切实际之类的批评。
《C陷阱与缺陷》确实不是《C++陷阱与缺陷》。如果各位朋友关注C++陷阱与缺陷,可以参阅《C++批判》(《C++?? A Critique of C++ and Programming and Language Trends of the 1990s》,3rd Edition,Ian Joyner 。《程序员》杂志上有介绍),以及《The darker side of C++》。另外,《Effective C++》、《More Effective C++》、《Exceptional C++》、《More Exceptional C++》都可以参考。现在还有大量的编程任务,需要用到“纯C”即ANSI C、标准C来完成。而且,C++并不是C的超集,译者实在无法认同,从C++的角度来看就要更实际一些。
《C陷阱与缺陷》确实不是《程序代码书写的陷阱与缺陷》。清华出版社最近出版了一本《凌波微步——软件开发警戒案例集》,文笔风趣生动,在技术作品中确实别开生面,感兴趣的朋友可以一读。
《C陷阱与缺陷》就是《C陷阱与缺陷》,总结了C语言编程中常见的陷阱和易犯的错误。作者在致谢中至少提到近二十人,其中包括Dennis Ritchie,他们也指出了一些C陷阱。即使是这些顶尖的程序员,也在flier网友们所不屑的“细节”、“琐碎”处,跌过跟头、吃过苦头。我们常常听到这样的话,魔鬼常常隐身于细节之中。译者不希望说一通大道理,但我得承认,至少我本人就犯过书中指出的一些错误。在翻译这本书的时候,我常常有抑制不住的念头——如果能早一点读到这本书就好了。正如作者Andrew Koenig提到的,即使是experienced programmer,读到这本书时,也会发出感叹,“that bug bit me just last week”。
《C陷阱与缺陷》价值所在——兼答两位网友(中)
高巍(w-gao@263.net)
2.
《C陷阱与缺陷》的许多内容,确实在其他C语言的书中也有提及,但Andrew Koenig的贡献在于系统地整理、收集了这些原本零乱的内容。用一个恶俗无朋的比喻,就是把散乱的珍珠串了起来。这些C语言编程的宝贵经验教训,原来只能是从不同的读物中sporadic地学习,东捡一点、西捡一点,今天在哪里看到一个,明天又在哪里看到一个。
《C陷阱与缺陷》中的内容,可能确实“没什么深度”。感兴趣的朋友可以参考Feuer: The C Puzzle Book, Prentice-Hall出版社,1982。那里面有许多匪夷所思的、真不知道作者怎么想出来的东东。如果感兴趣的朋友还想进一步钻牛角尖,可以参加Obfuscated C的竞赛,那些把C语言用到炉火纯青、出神入化的高手,写出的晦涩难懂、几近天书的代码,应该会让您瞠目结舌的。
不过,译者还是喜欢《C陷阱与缺陷》的程度,正如鲁迅先生对刘半农的评价,“浅”未尝不是好事,何况《C陷阱与缺陷》未必就那么“浅”。
3.
“过于经典”,恰恰是我与flier网友分歧最大之处,愿意与您坦率地交换意见。
这个问题的实质是,历史值不值得学习,抱什么样的态度来学习历史。
在书店经常听到这样的对话,“Delphi7都出来了,这些书都是讲Delphi6的”。侯捷先生就批评过那些盲目追新、天天忙着软件版本升级的初学者。
《C陷阱与缺陷》确实讲了一些不再是问题的问题,也确实涉及到一些值得瞻仰的传说中的C编译器的特性。对待这部分内容,译者的建议是,不需要记住具体的结论,而应该关注问题的背景,沿革的思路,解决方案是如何演进的。
《C陷阱与缺陷》价值所在——兼答两位网友(下)
高巍(w-gao@263.net)
例如,在第7章第8节“7.8 随机数的大小”中,作者提到:
最早的C语言实现运行于PDP-11计算机,它提供了一个rand函数,PDP-11计算机上的整数长度为16位,因此rand函数返回值介于0到2^15-1。当在VAX-11计算机上实现C语言时,该机型上整数的长度为32位。当时有两组人员同时分别在VAX-11计算机上实现C语言:一组人员在加州大学伯克利分校,他们认为rand函数的返回值范围应该包括该机型上所有可能的整数取值,因此他们设计的C语言实现上rand函数返回一个介于0到2^31-1的整数。另一组人员在AT&T,他们认为如果VAX-11计算机上的rand函数返回值范围与PDP-11计算机上的一样,即介于0到2^15-1之间的整数,那么在PDP-11计算机上所写的程序就能够较为容易移植到VAX-11计算机上。
这样造成的后果是,如果我们的程序中用到了rand函数,在移植时就必须根据特定的C语言实现作出“剪裁”。ANSI C标准中定义了一个常数RAND_MAX,它的值等于随机数的最大取值,但是早期的C实现通常都没有包含。
对于这样的内容,我们应该把阅读重点放在:学院派与工业派思考问题的不同重心,如何在各种选择之间作出trade off(权衡),不同的选择各有什么问题,如何解决这些问题,各个时期的解决方案如何演变等。译者对60年代大型机时代程序员的工作情况比较感兴趣,业余在网络上也收集到许多文章,深感对个人极有裨益。最近,读到机械工业出版社的新书《虚拟机设计与C++实现》,作者也提到对程序设计历史了解的重要。
译者个人观点,这些内容的精髓在于——它为我们提供了一个个极佳的案例。通过这些案例,我们了解了当时问题提出的背景,限制和约束条件,先辈程序员如何权衡决策的。程序员在编程时,经常要面对各种两难境地,需要满足一对对看上去相互矛盾的条件,在其间作出决策。程序员的能力,很大程度上就体现在这种面对crisis dilema时decision making的能力上。
译者对围棋非常爱好,世界上没有两盘一模一样的棋局。可是,几千年前的名谱,还是有人在研习。打谱的意义,重在理解如何在种种情势下作出决策。而不是企望在实战对局中,会出现雷同的棋局。例如,了解Unix的两种流派在技术实现上的不同特点,琢磨当时各方是如何作出决策的,琢磨当时的决策对后来的影响,非常有助于提升技术素养。
至于两位网友都提到的书价问题,则属于出版社的内部业务运作,译者就不便置喙了。
关于《C陷阱与缺陷》译注的一些说明
高巍
各位朋友对《C陷阱与缺陷》(原书名:C Traps and Pitfalls)译注的意见值得重视。笔者正在“变译理论”的提出者黄忠廉老师指导下,探索“变译”在科技翻译中的实践应用,对大家的意见格外乐意听闻。
《C陷阱与缺陷》中的译注,大致包括以下几类:
(1)原书作者笔误
原书虽历经18次印刷,仍白璧微瑕,存在诸多typo。大部分此类印刷错误,译者在译文中直接改过。某些地方,一时难于确定,恐原作者另有深意,故以译注形式体现。
例,P22页有关条件运算符的说明即为此类。
(2)历史遗留问题
原书成书年代较早,书中的某些具体论断在现在的编程环境中不尽正确。译者在翻译时,对原书的例程以及具体结论都在尽可能多的编译器下作了测试。
例,P12页的第1个译注。P12页的第2个译注,针对原书的某个抽象论断,具体阐释了在不同编译器中是如何实现的。
(3)C99标准
在翻译该书时,译者将原书的各个具体论断与最新的C99标准作了必要的核对检查。如有较大出入之处,则以译注形式指出。
例,P34页和P44页的译注即为此类。
(4)补充相关知识
原书作者建议,该书可以作为C语言编程学习者的参考阅读材料。考虑到C语言编程初学者可能不熟悉原书某些概念,因此在译注中作了说明。
例,P118页关于One's Complement 和 Two's Complement的说明,即为此类。
例,P138页关于Big Endian 和 Little Endian的说明,也为此类。
另外,还需要说明的是,本书没有任何“译序”、“译者说明”之类。某些读者抱怨,“长篇大论,竟然都是译者的看法”,可能是把审校者的介绍文字张冠李戴了。译者认为,优秀的作品本身的说服力就胜过任何译序。
还有朋友对“心智模式”的译注颇有微词,“这根本对理解本书无甚意义”。译者的观点恰好相反,而且认为这一点的重要性对全书而言无论如何强调都不为过分。
作者在前言中首先说明,“本书所要集中讨论的是第二类问题,也就是程序并没有按照程序员所期待的方式执行。”然后,作者十分精辟地揭示了程序错误的本质,即“程序”与“程序员对该程序的心智模式”两者之间的相异之处。
《C 陷阱与缺陷》整本书讲的都是程序员如果“想当然”,将会遇到哪些错误。在该书的最后一章,作者认为,要规避C语言中的这些问题,最重要的就是“知道自己在做什么”。
作为译者,我强烈建议各位读者朋友阅读《第5项修炼》(彼得.圣吉,上海三联书店,1998年第2版)。彼得.圣吉先生在《第5项修炼》中用了整整一章(第10章,章名就是“心智模式”)的篇幅来讲述,特别是心智模式如何影响到我们正确认识这个世界,如何阻碍我们真正的进步。
不理解“心智模式”,阅读《C陷阱与缺陷》,可能记下了一鳞半爪的一招半式,但无异买椟还珠。
某些朋友认为该书译注过多,可能是该书的排版使得译注与作者原注的区分不甚明显,这本书中其实还包括了很大部分的作者原注。
译注直接出现在上下文中,是译者根据个人读书体验而向出版社提出的建议,也是采纳了侯捷老师《深度探索C++对象模型》译注的排版形式。译者个人认为此种排版优于传统排版形式,不免推己及人,如果让某些读者朋友感到了不便,译者深表歉意。
从经济上说,译者的报酬固定,是按每千字计算,与该书的定价、销量都无关。之所以絮絮叨叨、不惮烦琐的写了这些文字,实在是觉得如果因为译者的原因而使各位朋友错过这本好书,那真是罪莫大焉。