- 浏览: 144228 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
邪恶八进制:
译的还不错,其实简单说、JPA三种继承映射体系如下:1.参照父 ...
[译文]JPA的实施模式:映射继承的层次体系 -
mondayw:
卓越上有售,地址:http://www.amazon.cn/m ...
翻译的第一本书出版了 -
黑暗浪子:
哪里有订?
翻译的第一本书出版了 -
mondayw:
不好意思,没有测试过,我以为这只是示范性的代码而已。
[译文]Java EE 6中的依赖注入——第1部分(二) -
jimmy.shine:
不知道你有无测试过这范例程序,在JBoss 6.0M2中,程序 ...
[译文]Java EE 6中的依赖注入——第1部分(二)
原文:The Developer Insight Series, Part 2: Code Talk
作者:Janice J. Heiss
出处:http://java.sun.com/developer/technicalArticles/Interviews/devinsight_2/
历年来,我听到过开发者讨论他们最喜欢的代码、最有趣的代码、最酷的代码,以及如何编写代码,如何避免编写代码,编写好代码的障碍,以及与编写代码相关的爱恨情仇等等,在开发者见解系列的第一部分中,三位Java Champion就Brian Goetz的关于编写“傻瓜式”代码的建议给予了积极的响应。
在第二部分中,我们会听到来自五位杰出的开发者的编码建议:Joshua Bloch和Masood Mortazavi响应Goetz的保持代码简单的建议,Jaron Lanier和Victoria Livschitz想从根本上改变创建代码的方式,而著名的错误修复专家Brian Harry在强调过程能教给我们什么的同时提供了一些关于错误修复的贴士。
目录
- Joshua Bloch:谨防盲目乐观
- Masood Mortazavi:最好的代码所做的假设最少
- Jaron Lanier:我们思考软件的方式是错误的
- Victoria Livschitz:编程语言不仅仅是面向对象那么简单
- Brian Harry:在修正错误时,查明平台的较早版本
- 其他参考
- 评论
Joshua Bloch:谨防盲目乐观
关于Joshua Bloch:
Joshua Bloch是Google的首席Java架构师,他作为Effective Java(现在已出第二版)和Java Puzzlers(与Neal Gafter合著)两书的作者而为人所知。在之前作为Sun Microsystems高级职员的生涯中,他是一位工程师,并且是核心Java平台组的架构师,他设计并实现了获奖的Java Collections Framework,参与java.math包的工作,并为该平台的其他许多部分做出了贡献。
Bloch拥有Carnegie Mellon大学的计算机科学博士学位,他的书Effective Java是Java开发者中大受欢迎的经典。
您说过Java开发者中的一个常见毛病就是不自觉地要去进行代码优化,结果则是得到不必要的复杂化了的更慢的代码。为什么开发者会错误地去优化代码呢?
要成为一个软件开发者,你就必须是一个乐观主义者——否则,就会像是在进行一场失败的战争。通常情况下,这是好事,但它也有不好的一面:乐观主义可能会导致过度自信,容易觉得那些关于过早优化的常规警告并不是针对你而言的,因为你会知道哪些代码是时间关键的,并且知道如何让它快速运行。不过,在没有对每一项企图优化进行测量前后的对比的情况下,是没有人能够确定这一点的。
您提到的另一个毛病是,在有相当好的代码库存在时,开发者还在编写他们自己的代码,为什么开发者会这样做呢?
有两个原因,到目前为止最常见的原因是,开发者不知道代码库的存在,就开发者来说,我觉得现在外面有那么多的代码库,是不可能都知道他们的存在的,就是说,很难搞清楚这样的一些便利性,即是否值得花精力去弄清楚是否有这样的代码库存在。特别是对于涉及到并发的地方来说更是这样,专家们花上整整几个月的时间来编写显然是很普通的一些并发工具这种情况并不少见。
当面对这一类功能的需要时,聪明的开发者会尽一切努力来寻找某个适当的代码库,但总是容易碰到不容忽视的并发代码错误,且由此产生的错误几乎不太可能被检测到。
第二个原因是,开发者倾向于推倒重来,重新去发明轮胎,这也是他们倾向于过早优化的原因。为了尽量明智一些,大多数的开发者都保持着我能做这样一种态度,但有些人则做得太多了,他们对自己说:“是的,是有一个代码库,但我能做得更好。”也许你可以,但并非意味着你就应该做,除非确实是非常地不适合你的需要,否则就使用标准的代码库吧。
是否是思考问题的方式把开发者带入困境中的呢?
我觉得最常使开发者陷入困境的思考方式是盲目的乐观,自然而然地认为程序只会做正确的事情,但机器并不能读懂你的想法,大部分系统提供的设施都有相当的局限性,这一点你是应该要知道的。例如,int和integer并不是一回事——可以有无限多个整数,但只有232个int值,这意味你需要担心溢出,举例来说,你可能会认为这个循环恰好只遍历每个int值一次:
for (int i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++)
doSomething(i);
但不是,这是一个无限循环,因为每个int值都小于或者等于Integer.MAX_VALUE,一旦循环到了Integer.MAX_VALUE的话,int值就返回到Integer.MIN_VALUE并重新开始另一遍循环。这仅是这种思考方式的一个简单例子,但应用到语言和类库的各个方面的话,都会带来同样令人不快的结果。
可参阅对Josh Bloch所作的两个完整访谈:更有效的Java和Java解惑。
Masood Mortazavi:最好的代码所做的假设最少
关于Masood Mortazavi:
Masood Mortazavi是Sun公司的软件工程经理,开始时他加入公司的Java EE开发团队工作,后来成为持续可用性问题以及电信与Java软件组合作方面的专家;近年来,他管理多个工程师团队,致力于多种开源数据库如Apache Derby、PostgreSQL以及MySQL等。
他拥有应用和化学工程方面的B.S.(加州大学圣地亚哥分校)学位和M.S.(加州大学戴维斯分校)学位,以及计算流体动力学(加州大学伯克利分校)方面的Ph.D.学位,另外,他还拥有新闻专业(加州大学伯克利分校)硕士学位和M.B.A(加州大学伯克利分校)学位。后来他花了数年时间来获取第二个Ph.D.学位,这是加州大学伯克利分校科学逻辑学和方法论研究生部的博士学位,致力于数学、计算理论和哲学的基础研究。
在编写代码的时候,我常常不得不把重点放在逻辑结构、具体的算法和程序动态方面,既然我们是在创建系统行为并为其编码,我通常感觉就像是正在写某种类型的法律论证似的,因此,即便要做假设的话,那么最好的代码也是做了最少假设并且只做了绝对必需的假设的代码。
对逻辑学家来说,把程序看成有约束变量和自由变量的谓词结构是很有帮助的,所谓Java中的好“方法”或者其他传统的编程语言中的好“函数”是避免了局部变量的方法或函数,他们只为内部的簿记功能服务。我们做了越多的内部簿记,我们的程序就越详细,这就意味着代码开始要求我们把它拆分成更多的类和方法。
可参阅对Masood Mortazavi所作的完整访谈的第1部分和第2部分。
Jaron Lanier:我们思考软件的方式是错误的
关于Jaron Lanier:
Jaron Lanier以他在虚拟现实方面的工作而为人所知,虚拟现实是他在1980年代创造的一个术语,作为一个著名的作曲家、音乐家和艺术家,他曾任教于美国各地多所大学的计算机科学系,其中包括耶鲁大学、达特茅斯学院、哥伦比亚大学以及佩恩大学等。他曾作为National Tele-Immersion Initiative(NTII)的首席科学家工作,NITT致力于在其他事物中使用计算机来使得不同城市中的人们体验他们的身体位于同一地的那种幻觉。2001年到2004年,他曾是Silicon Graphics Inc.的访问科学家,在那里他开发了临场感和远程沉浸核心问题的解决方案。Lanier在2006年获得了New Jersey Institute of Technology的荣誉博士学位,他是2001年Carnegie Mellon大学的沃森奖的获得者,并且是2005年第一届Edge of Computation Award的最终角逐者。
他最近的工作是在研究其所称的“phenotropic计算”,在这一研究中,作为现有协议遵守的软件模型被作为软件系统连接组件的方式的模式识别所取代。他目前是加州大学伯克利分校的Entrepreneurship & Technology中心的跨学科驻校学者。
我认为我们编写和思考软件的整套方法都是错误的,如果你了解一下现有事物是如何工作的话,就会发现一个奇怪的现象:没有人——我的意思是没有人——能够真正以可靠的方式创造出大的程序。如果我们不找出另一种不同的方法来思考和创造软件的话,我们将不能写出大于大约二到三千万行代码的程序,无论我们的处理器变得有多快。
目前这种可扩展性的缺乏是一种全球性的负担,我们的行业存在着垄断,因为对于任何个人来说都是如此难于参与竞争,编写大型软件应用是如此的不容易。不过这对我来说很奇怪,如果你看看人们创建的其他事物,例如炼油厂或是商业飞机等,我们能够有效处理的复杂性是远远超过软件的复杂性的。
软件存在的问题是,我们从来没有学会如何控制选择的副效应,我们称之为bug,我们不应该满足于这一现状,我仍然相信,有一些想法等着我们去创建,总有一天我们会有一些新的编写软件的想法是克服了这些问题的,这是我的主要专业兴趣,我想贡献一些力量来使bug消失。
难道bug不是只不过是人的思维局限吗?
不不,他们不是,bug和变异或缺陷之间的区别是什么?如果你考虑到这一点的话,如果你对某个程序做了一个小改动,它会在程序的行为方面导致巨大的变化。如果自然以那样的方式运作的话,宇宙时时都会崩溃,当然就不会有任何进化或生命。方法复杂性的事物在自然中逐步建立了起来,这样的话,如果你有一些小改变的话,它只导致足够小的结果,它可能会有逐渐的演变。
现在,我们有了一点——不是全部——只是一点基因型和表型之间的线性连接,如果你想用这些术语来表达的话。但在软件中,在源代码(“基因型”)和观察到的程序效果——你可能会称之为程序的“表型”,在他们之间存在着混乱无序的关系。
而这一混乱真正地困住了我们,我不知道我到底会不会有个解决该问题的好主意,我正在研究一些事物,不过你知道,最能引起我关注的问题是,在程序员中缺乏该问题最终能够被解决这一信心会意味着什么。在过去的几十年中,一直存在着一种陷入自满情绪的状况,随着新的几代程序员的出现,越来越多的人接受了事情就是这样的并且将会永远这样的想法,也许这是真的,也许这无法避免,但这不是已知的,对我来说,对bug的那种自满情绪就是编程顶上的一片乌云。
可参阅对Jaron Lanier所作的完整访谈:第1部分和第2部分。
发表评论
-
[译文]技巧:防范代码的终结器漏洞
2011-08-02 11:11 769你的Java代码有可能会因终结操作带来的漏洞而易受到攻击,了解 ... -
[译文] 一种减少多线程Java应用的工作队列中的竞争和开销的方法
2011-06-21 10:08 1021许多的服务器应用,比如说Web服务器、应用服务器、数据库服务器 ... -
[译文]Java SE 7带来更好的资源管理:不仅仅是语法糖
2011-06-18 19:55 796本文介绍了Java Platform, Standard Ed ... -
[译文]双重检查锁定和单件模式
2011-05-06 11:50 871所有的编程语言都会有分享一些它们的惯用技法,其中的 ... -
RJC501:为周转期付出的代价有多大?
2011-04-18 16:43 839通过重载Java类(Reloading Java ... -
RJC401:HotSwap和JRebel——幕后的故事
2011-04-11 16:31 1047在本文中,我们会回顾类在没有动态类加载器情况下的重载方式;我们 ... -
RJC301:Web开发——Tomcat、GlassFish、OSGi、Tapestry等服务器和框架中的Classloader
2011-04-04 15:26 983在本文中,我们会回顾真实的服务器、容器和框架是如何使用动态的类 ... -
RJC201:ClassLoader的泄漏是如何发生的?
2011-03-28 19:58 893你如果使用Java编程已有一段时间的话,那么你就会知道内存泄漏 ... -
jQuery的.bind()、.live()和.delegate()之间的区别
2011-03-19 22:01 859.bind()、.live()和.delegate()之间的 ... -
示例:JavaScript中的后续传递风格
2011-03-19 21:57 862本文介绍了CPS所扮演的两种角色——作为JavaScript中 ... -
[译文]开发者见解系列,第3部分:编写代码的步骤(下)
2010-07-27 22:11 915原文:The Developer Insight ... -
[译文]开发者见解系列,第3部分:编写代码的步骤(上)
2010-07-27 22:05 1144原文:The Developer Insight Series ... -
[译文]开发者见解系列,第2部分:谈谈编码(下)
2010-07-14 22:31 884原文:The Developer Insight Series ... -
[译文]开发者见解系列,第1部分:编写傻瓜代码——来自四位首席Java开发者的建议(下)
2010-06-28 12:32 861原文:The Developer Insight Series ... -
[译文]开发者见解系列,第1部分:编写傻瓜代码——来自四位首席Java开发者的建议(上)
2010-06-28 12:25 1452原文:The Developer Insight Series ... -
[译文] Java EE 6中的DataSource资源的定义
2010-05-20 12:29 1964原文:DataSource Resource Definiti ... -
[译文] Java Applets和ASP.net——你可让他们玩到一起吗?
2010-05-13 18:01 1725原文:Java Applets, ASP.net - Can ... -
[译文]使用Java编写你的第一个Google Wave机器人(下)
2010-01-25 21:03 1086原文:Write Your First Google Wave ... -
[译文]使用Java编写你的第一个Google Wave机器人(上)
2010-01-25 21:02 1355原文:Write Your First Google Wave ... -
[译文]一些Java并发技巧
2009-12-20 18:25 1052原文:Some Java Concurrency Tips ...
相关推荐
EN 15085-2_ 2020 中文版(译文)铁路应用-铁路车辆及部件的焊接-第2部分: 对焊接制造商的要求.pdf
ISO 17294-2 2023 水质电感耦合等离子体质谱法(ICP-MS)的应用第2部分:包括铀同位素在内的选定元素的测定.pdf
( Nutch,第1部分:爬行(译文) ( Nutch,第1部分:爬行(译文)
《EN 15085-2_2020 中文版(译文)铁路应用-铁路车辆及部件的焊接-第2部分:对焊接制造商的要求》是针对铁路行业中焊接工艺的重要标准,旨在确保铁路车辆及部件的安全性和可靠性。这份文档详细规定了焊接制造商在...
EN1279标准分为多个部分,本部分(EN1279-2)关注的是透湿性,即中空玻璃防止水汽透过的能力。标准旨在确保中空玻璃在使用过程中能保持稳定的节能性能(如U值和遮阳系数)、健康维护(如隔声和透光性能)以及安全...
学习SDN控制器之一floodlight的中文文档。
SDN开发:Floodlight开发文档的译文 SDN(Software Defined Networking,软件定义网络)是当前网络架构的主要发展方向之一,它通过将控制平面和数据平面分离,实现了网络架构的軟件化和自动化管理。Floodlight是...
标题中的“Microsoft Access 2000: Choosing between MSDE and Jet”指的是在使用Access 2000时,开发者面临的一个关键决策:选择使用改进版的Jet引擎还是微软数据引擎(MSDE)。这两个数据引擎都是用于存储和管理...
这次分享的是系列教程的第三部分,涵盖了第11节至第13节,内容包括45度角瓷砖地图、物理引擎以及弹球游戏的实现。 第11章:45度角瓷砖地图(Isometric Tilemaps) 在这一章节中,我们将深入学习如何构建和管理45度...
Linux内核编码风格指的是在编写Linux内核代码时应遵循的一系列约定和格式规范。由于Linux内核是用C语言编写的,其编码风格遵循了C语言社区的传统习惯,同时根据性能和可读性的需要做了一些调整。这些规则被Linux内核...
此函数的第一个参数实际上是传入DriverEntry函数的`pDriverObject`参数(即驱动对象),第二个参数通常是传递给DriverEntry的第二个参数`RegistryPath`。 在迷你小端口驱动中,除了使用以`VideoPort`开头的API之外...
总结来说,Linux内核的编码风格注重代码的清晰度、一致性及可维护性,通过严格的规则确保所有开发者遵循统一的标准,从而提高整个项目的质量和效率。理解和遵循这些规范,对于任何参与Linux内核开发或希望提升代码...
《ApacheCN 大数据译文集》是一份包含大量关于数据采集、处理和展示相关源码及工具的压缩包资源。这份资料集由ApacheCN社区精心整理,旨在为中文用户提供高质量的大数据技术学习材料。主要涵盖了大数据领域的核心...
本文将基于《倍加福ENA58IL-R-ProfiNET手册(译文)》的内容,详细介绍该系列编码器如何与PROFINET网络进行整合。 #### 二、产品概述 根据描述,本手册涵盖了以下几种类型的绝对旋转编码器: - Exx58N-...PN... - ...
"计算机英语第二版译文及答案"提供了学习者深入理解和掌握专业术语的重要资源。 这份资料包含两部分:译文和答案。译文部分是对计算机英语原文的中文解释,有助于非英语母语的学习者理解复杂的IT概念和技术用词。...
Huffman编码是一种高效的数据压缩算法,它基于字符出现频率构建最优前缀树,以此来为每个字符分配一个唯一的二进制编码。这个编码方法在文本压缩、数据存储和传输等领域有着广泛的应用。在这个主题中,我们将深入...
《ApacheCN 数据结构与算法译文集》是一个包含丰富的数据结构和算法学习资源的压缩包。这个集合旨在帮助程序员和计算机科学爱好者深入理解这些基础知识,从而提升编程技能和解决复杂问题的能力。数据结构和算法是...