优秀编程的“艺术”

  优秀的代码是一件艺术品?或者软件工艺宣言言过其实了?成为一名”优秀“的程序员,有什么要求?

  设想你雇佣了一名水管工,让他更换地下室的旧管道。这个家伙在工作之前、之中、之后,他就没有停止过谈论他的管道工艺的艺术美。

”看看那根管道的角度。看看它与墙壁对齐是多么地美?如果你问我,那么它就是一件艺术品。“

  这和程序员没什么区别。没有什么比不可一世的程序员把他或她自己的代码看做是艺术品更糟糕的了。这个类推借用了”敏捷麻烦制造者”和 BDD【注1】创立者 Dan North 的一篇广受赞誉的文章,Dan North 激烈地批判了软件工艺宣言,论证了“编程不是艺术”。

  软件工艺宣言

  宣言的作者 Kevlin Henney、Bob Martin、Corey Haine 和 Glenn Vanderburg 揭示了下面几项将通往软件工艺的大门:

  • 不仅是可运行的软件,而且是精心设计的软件。
  • 不仅响应变化,而且稳步增加价值。
  • 不仅个体与交互(Individuals and Interactions),而且是专家社区。
  • 不仅仅是客户协作,而且是有生产力的合作伙伴。

  North 的问题在于,软件开发者的自尊经常妨碍其成为优秀的软件项目。North 谈到,用“精心设计的软件”这种荣耀的概念进一步加压到自尊上,是达不到预期的。Webservice 和 J2EE 就是最近的项目例子,软件艺术性的崇高诠释部分地导致了项目的失败。

  优秀的编程

  你或许已经知道了来自于小型 IT 项目的这种问题。某个开发者主张使用特定技术是因为审美(而非务实)的原因。从此就每况愈下了。

  根据 North 的观点,代码优美是因为它能有效地运行,而不是因为审美上有吸引力。不应该太计较代码看起来怎么样,而是看代码在从A点到B点带来的一段信息是多么可靠、高效。

“一个技术娴熟的编程团队可以在非常短的时间里交付让人惊奇的业务结果。一名真正的专家——真正的工匠——将理解埋葬在、比如我们把企业软件称作的杂乱里的、优雅的简单,并整理清楚。” ——Dan North

  但是悲哀的是,甚至那些优秀的程序员经常忘记优秀软件的核心职能——软件工艺宣言的过分强调往往是祸因。

“软件从业者—特别具有讽刺意味的是优秀的软件从业者—经常忘记这一点。他们爱上了软件本身,开始把他们自己看做软件工匠。”——Dan North

  开发者需要多大的才能?

  这里有个引起整个争论的问题:软件工程是一种艺术形式吗?焦点集中在对他们的工作充满激情的有热情的专家和只为薪水工作的程序员之间的挣扎上。

  据说性能和效率在软件行业的差异正在缩小,但是就成为优秀开发者的条件定义而言,没有达成一致或被认可的方法。Dan North 说,“一名真正伟大的程序员胜过数百个为钱做事的程序员,在数小时或数天就可以交付,而普通程序员要用数周或数月。”

“做为软件解决方案的买家,难道你不想知道你的系统是被大师级工匠而非拿薪水的人开发的?你支付了钱,你有权保持某种信心。让我们搞清楚怎样提供这种软件。”——Dan North

  North 声称,“架构之美”无助于我们区别好坏。任何程序员都能把他或她自己称作软件工匠,滔滔不绝、高谈阔论软件架构的“美”。North 对我们说,他将“乐于看到有人根据结果导向和取悦客户来重写软件工艺宣言。”

  地下室与代码

  房主不关心他们的水管看起来如何,只要它们不漏水就行。软件同样如此。客户和用户都不关心它是如何运转的,尤其不关心它内部看起来是否“美”。

  “同样,我想让专家级电工而非新手给我的屋子布线,我想让专家级程序员涉足我的业务,”North 对我们说。“然而,我不想要一个坚持谈论管道系统优雅与审美的、恃才傲物的管道工。”

时间: 2024-11-05 12:34:39

优秀编程的“艺术”的相关文章

[转]优秀编程的“艺术”

优秀的代码是一件艺术品?或者软件工艺宣言言过其实了?成为一名“优秀”的程序员,有什么要求? 设想你雇佣了一名水管工,让他更换地下室的旧管道.这个家伙在工作之前.之中.之后,他就没有停止过谈论他的管道工艺的艺术美. “看看那根管道的角度.看看它与墙壁对齐是多么地美?如果你问我,那么它就是一件艺术品.” 这和程序员没什么区别.没有什么比 不可一世的程序员把他或她自己的代码看做是艺术品 更糟糕的了.这个类推借用了”敏捷麻烦制造者”和BDD[注1]创立者Dan North的一篇广受赞誉的文章,Dan N

Java并发编程的艺术下载 𦄭

下载地址: http://www.gqylpy.com/di/11 <Java并发编程的艺术>PDF高清完整版-下载 内容简介 并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,<Java并发编程的艺术>是他们多年一线开发经验的结晶.本书的部分内容在出版早期发表在Java并发编程网和InfoQ等技术社区,得到了非常高的评价.它选取了Java并发编程中核心的技术进行讲解,从JDK源码.JVM.CPU等多角度全面剖析和讲解了Java并发编程的

读《Java并发编程的艺术》(一)

离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督促自己要不断的学习,不断的进步. 最近在进一步学习Java并发编程,不言而喻,这部分内容是很重要的.现在就以<并发编程的艺术>一书为主导线,开始新一轮的学习. 进程和线程 进程是一个应用程序在处理机上的一次执行过程,线程是进程的最小基本单位(个人理解).一个进程可以包含多个线程. 上下文切换 我们

Java并发编程的艺术(六)——线程间的通信

多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java并发编程的艺术(三)--volatile 1.1 如何实现通信? 这两种方式都采用了同步机制实现多条线程间的数据通信.与其说是"通信",倒不如说是"共享变量"来的恰当.当一个共享变量被volatile修饰 或 被同步块包裹后,他们的读写操作都会直接操作共享内存,从而各个

转载:每一个程序员要遵守的一些优秀编程风格

无论你是业余的还是专业的程序员,正确的编程风格,不但有助于提升软件产品的功能,还可以明显减少软件灾难的产生.今天,我们就来探讨一下有助于我们获取更佳编程风格的一些最好的规则. 每一个程序员要遵守的一些优秀编程风格 代码的可读性至上 代码要能可阅读和可理解,就需要格式化成一致的方式.对函数和变量的命名应有意义,注释的表达应该简洁而准确.并且,准确地记录代码中所有棘手的部分是十分重要的.你必须清楚软件程序为什么能工作以及为什么能在所有可能的情况下顺利工作的原因. 遵循正确的命名约定是必须的 当需要给

编程的艺术门槛

编程是门艺术,这个说法由来已久.最近在朱赟的公众号(嘀嗒嘀嗒)读到一篇文章<设计是门逻辑学,然后才是美学>,文中作者漂洋过海追寻艺术,老师却说:"设计不是艺术!".如果设计都不是艺术,那么编程还能是艺术么? 艺术 那么艺术到底是什么?我一下懵了,发现从来没有想过这个问题,只好求助于 Google.Wikipedia 上的定义是:「艺术是具有智能思考能力的动物(目前其实只有人类吧),借由各种形式及工具借以表达其情感与意识形态,所产生的形态泛称之为艺术.」 而上面那篇文章中老师

《java并发编程的艺术》读书笔记-第三章Java内存模型(二)

一概述 本文属于<java并发编程的艺术>读书笔记系列,第三章java内存模型第二部分. 二final的内存语义 final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.可以参照之前整理的关键字final.这里作者主要介绍final域的内存语义. 对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序. 初次读一个包含final域的对象的引用,与随后初次读这

基于CAS线程安全的计算方法 java并发编程的艺术上的一个案例

package thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /**  * @author  changxiangxiang  * @date 2014年8月6日 下午3:25:12  * @description  * @since  sprint2  */ public class Counter {     privat

&lt;java并发编程的艺术&gt;读书笔记-第三章java内存模型(一)

一概述 本文属于<java并发编程的艺术>读书笔记系列,继续第三章java内存模型. 二重排序 2.1数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性.数据依赖分下列三种类型: 名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之后,再读这个位置. 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量. 读后写 a = b;b = 1; 读一个变量之后,再写这个变量. 上面三种情况,只要重排序两个操作的执行顺序,