原文:The Developer Insight Series, Part 3: The Process of Writing Code
作者:Janice J. Heiss
出处:http://java.sun.com/developer/technicalArticles/Interviews/devinsight_3/
历年来,我曾听过开发者讨论他们最喜欢的代码、最有趣的代码、最酷的代码,以及如何编写代码,如何避免编写代码,编写好代码的障碍,以及与编写代码相关的爱恨情仇等等,在采访过程中,我收获了许多值得分享的真知灼见。
这一文章系列的第1和第2部分提供了关于如何编写好的代码的建议,在第3部分中,开发者就编写代码的实际步骤做了思考,过程是如何开始的,有什么样的感觉,以及他们是如何进行这一过程的。
目录
- Adam Bien:这几乎可说是神秘莫测的
- Kohsuke Kawaguchi:我就这么让代码从我的指尖流出
- Chet Haase:我采用了原型方法
- Arun Gupta:设计是第一步也是最重要的一步
- Kelly O'Hair:启动NetBeans,创建测试用例,创建模板,填写模板
- Josh Marinacci:很像是在雕塑或者是在绘画
- Masood Mortazavi:需求、设计、实现
- Shannon Hickey:汇聚方法,然后创建原型
- Richard Gabriel:把开发者训练得像诗人和艺术家一样
- Tor Norbye:首先很快地给出一个基础框架,然后逐步填补空缺的地方
- Romain Guy:以编写原型作为开始
- Éamonn McManus:泉涌状态
- Alan Williamson:大量的白板讨论和方框图
- 其他参考
- 评论
Adam Bien:这几乎可说是神秘莫测的
Adam Bien是一位Java Champion,致力于Java EE平台,他是一位自雇顾问、讲师、软件架构师,且是位于德国的企业级Java部门的开发者,他实现各种各样丰富的Java技术。他还是几本书的作者,一些关于Java和J2EE技术,以及分布式Java编程的文章的撰稿者。
这几乎是一个神秘的过程,难以形容。如果你真的极具动力的话,你能够在最短的时间内开发出任何你想要的东西,天空才是极限。
为了编写出好的代码,你首先必须要理解相关领域和实际的问题,不过,最好的了解领域的方式是编写代码,因此会面临着在自底向上的方法和自顶向下的方法之间保持平衡这一挑战。
我尽量是分析问题,接着编写一些代码,校验解决方案,在与客户的交流过程中有时会调整代码存在的问题,所以,编写代码的自然的方式是有着很短的瀑布阶段的短期迭代和反馈周期。
可参阅对Adam Bien所作的完整访谈。
Kohsuke Kawaguchi:我就这么让代码从我的指尖流出
Kohsuke Kawaguchi是Sun Microsystems的主管级工程师(staff engineer),从2001年起一直在从事XML和XML模式语言方面的工作,特别是在RELAX NG、W3C XML模式、JAXB以及JAXP等方面。他还主持了多个与java.net相关的项目,最近更多的精力则是放在web service上。
大部分情况下,我就只是在IDE中开始键入,然后让那个代码从我的指尖流淌出来。有时我会停下来,在心里或者纸上画画图,这有助于我决定如何继续。
如果问题过于复杂,我会列出解决方案的大纲,并开始记下方法的优缺点,一旦我完成了代码编写,我就会检查这些笔记,然后开始写修正方案的大纲。我会一直重复这一过程直到感觉满意为止。
我发现最适合在普通的旧纸上做这样的事情,当我还是学生的时候,这一做法就得到了相当的发挥,因为在上历史、英语等课时我会这样做,在那种地方是不会有一台计算机放在我的面前的。
可查阅对Kohsuke Kawaquchi所作的完整访谈。
Chet Haase:我采用了原型方法
Chet Haase是Adobe的Flex SDK团队的一位资深计算机科学家,致力于图像方面的问题及功能。其之前的生涯,即在接受以下采访时,是Sun Microsystems的桌面Java组的一位客户端架构师。他与Romain Guy合著了Filthy Rich Clients: Developing Animated and Graphical Effects for Desktop Java Applications一书,他还是一本很幽默的书When I am King的作者。
这一过程于不同人来说是不同的,我所知道的是,有些人(特别是那些有写著软件开发书籍的人)在开始编码之前就写出了完整的设计,有些人则以编码为开始,并且自始至终都在编写代码。
我采用了原型方法,也许这是不稳定的做法,或者是出于快速满足某种需要,不过我从来没有对哪种特定的方法有过信心,除非我已经先获得了一些以某种简单方式工作的主要元素,因此我以编写仅仅能够发挥基本效用的难看粗糙的代码为开始。
一旦我说服了自己这一方法是行之有效的话,我会回退一步,进行设计,然后编写更好的代码。我在Steve McConell的书Code Complete中读到了这一过程的一个有趣的做法。原型过程的窍门是扔掉最初的代码,重新开始,以避免那任何来自最初的难看的原型代码的剩余部分。
我会为看到在屏幕上出现最初的结果而雀跃不已,我之所以是一个图像极客的原因之一是因为我发现,看到由我的代码中的数学函数和算法产生的像素在屏幕上显示出来是多么令人满足的一件事。当看到这些像素的时候,你就会知道有些代码已经起作用了,而当你看到这些像素出现在错误的地方或是颜色不对时,就知道有些代码没有在工作。
很容易因看到那来自原型的最初输出告诉我:“这将是行之有效的!”而高兴不已,当然,原型只花费了半天的时间,而真正的解决方案则有可能需要另外一整个月,但最佳之处正是确定了这一方法最终是行得通的。
可参阅对Chet Haase所作的完整访谈。
Arun Gupta:设计是第一步也是最重要的一步
Arun Gupta是Sun的web service和Web 2.0应用的技术传道士,他是Java平台的API的规范带头人,多个开源项目的成员,某些标准组织的参与者,以及Java EE和Java SE发布版本的贡献者。他拥有印度Delhi大学的电子学学士学位和计算机科学硕士学位。
我坚信在编写任何代码时,设计都是第一个步骤也是最重要的一个步骤。根据项目的大小,我会准备一份可选的单页文档,用以描述项目的顶层需求。该单页文档随后会被通过使用UML(Unified Modeling Language,统一建模语言)建模工具或是Javadoc格式的注解来转换成类图和序列图,这些UML视图随后基于扩展设计评审的目的而与更大的团队共享。
如果团队买账,认可的话,这些视图随后就被翻译成接口,可使用UML工具的功能或是手工编码来实现这一步。一旦所有接口都准备好了,我就一个接一个地实现他们。把接口和实际的实现分离可保持代码的模块化和可移植。
测试、性能以及文档通常是附加的部分,我把他们保留下来作为我的开发周期的一部分,同样希望其他的每个人都这样做。
可参阅对Arun Gupta所作的完整访谈。
Kelly O'Hair:启动NetBeans,创建测试用例,创建模板,填写模板
关于Kelly O'Hair:
Kelly O’Hair是Sun Microsystems的一位资深主管级工程师(senior staff engineer),从1993年起加入该公司,从事Java Development Kit(JDK)核心适用性这一方面的工作,目前致力于改进JDK的版本构建。
启动NetBeans,创建测试用例,创建模板,填写模板,运行测试用例,调试代码,运行测试用例;写更多的测试用例,运行测试用例,调试代码,运行测试用例;编写更多的测试用例,运行测试用例,调试代码;编写更多的测试用例,运行测试用例,调试代码;编写更多的测试用例,花些时间休息,然后回来自动化构建和测试过程。
可参阅对Kelly O’Hair所作的完整访谈。
Josh Marinacci:很像是在雕塑或者是在绘画
Josh Marinacci把过去的十年用在了为无线、web和桌面平台编写基于Java技术的用户界面(UI)方面,在厌倦了为一家家居装修零售中心、一家无线运营商和一家文档管理公司编写web程序之后,他加入了Sun的Swing工具包团队,重返高品质UI领域。他最近致力于JavaFX方面的工作。
对我来说,编写代码就好像是在雕刻或者在绘画。我先开始勾勒出我想要做的东西的纲要,有时这是一个功能列表,有时则是用纸和笔画的一个真正有形的草图。在涂画上了我的想法之后,我会使用NetBeans IDE中的Matisse一类的快速开发工具来构建一个初始版本,通常是植入持久化或是网络访问一类的功能。
一旦我把基本概念放进去了之后,我就有条不紊地实现各个功能并修正某些bug,不断地检查接口,查找有缺陷的地方;过后不久,我就会把这一实现展示给别人看以获得反馈,然后再返回来,进入到代码中做修改。
迭代式的开发是关键,甚至在我修改Java SE 6中的bug的时候,在那里我不会去创建新的软件,我会先重现该bug,然后做出快速地修改,最后提炼修改方法以解决与向后或是向前兼容性相关的问题,如此反复地达到修正bug的目的。
可参阅对Josh Marinacci所作的完整访谈。
Masood Mortazavi:需求、设计、实现
Masood Mortazavi是Sun公司的软件工程经理,开始时他加入公司的Java EE开发团队工作,后来成为持续可用性问题以及电信与Java软件组合作方面的专家;近年来,他管理多个工程师团队,致力于多种开源数据库如Apache Derby、PostgreSQL以及MySQL等。他拥有许多学位,其中包括加州大学戴维斯分校的计算流体动力学博士学位。
从正规的角度来看,很容易描述:需求、设计以及实现。而从非正规的角度来看的话,则更微妙一些:解释、概念和想象力,约束的创造性汇合。
我们用到的那些间接获得的、且不好彩还处于编写实现过程中的工具或系统,他们通常会带来阻碍,因为很难用来工作。在一个新的环境中创建并运行你的第一个“hell world”程序比在同一个环境中编写最大的一块代码还要难得多。
在如何编程方面的创造性发明能够给编写好的程序带来巨大的好处。在编写代码时,我过去会想象出一个3D开发环境,在那里我能够通过使用了我的手和一个语音感应系统的大量动作来逐字逐句地连接并处理用颜色区分编码的对象。
可参阅对Masood Mortazavi所作的完整访谈:第1部分和第2部分