不知道大家有没有这样的感受,经常看到别人写的一两个语句,感到赏心悦目,拍案叫绝!MS的创始人之一 Bill Gates 曾说过一句话“好的程序员就像艺术家”。是啊程序开发者一直是在创造艺术,用着他们自己的思想与理念。一种极限编程思想是,在办公室里让有经验者与新手一起共事,一起提高——因为经验者能提高效率却难以保持较高的工作热情,而新来的员工则正好相反,它们有高昂的工作积极性。问题接着就出现了,也许你会时常看到这样的景象:当新手完成一个语句时,“啪”一记耳光就从有经验的人士那里打下来了。——引自桂素伟的一次演说。
随着编程实践的增多,我们越来越多地接触优美的程序,我们也越来越会写优美的程序。当我们一写程序就是优美的,那我们离停止写代码也许就不久了。那时我们做什么?我们做技术前瞻领袖吗?也许不是每一个人都适合做领袖,那么如果你能写一手优美的程序,却不能做领袖的话,我只能说,你当前最适合的工作也就是回家种地了。因为不能从事管理工作,永远只能做编码者(一些人自讽为“代码民工”),却不能做设计者——企业不会容忍。
话题有点儿扯远了,接下来,我们看一下令人拍案叫绝的程序是如何写出来的。
例如这样一个语句组:
int i = 0;
while (++i < commandText.Length && char.IsLetterOrDigit(commandText[i])) ;
那天真的令我高兴了好一阵。且不要说我的技术低下,即使事实着实如此。但不管怎么样,看到这样搜索一个特殊符号,比一个 for 或 foreach 语句绝对要优雅不少。
在C语言环境里,可以猜想,队列与栈等基本数据结构在出现之初肯定会是令人拍案叫绝的;
在非托管程序时代,一个 COM 操作接口也可以令人欣喜若狂;
在托管时代呢?如果再有令我们为之起舞喝彩的,恐怕就是更人性化的新的框架类库的出现吧!
昨天晚上在群里不少人谈到日常编程工作从 .Net 2.0 向高版本的迁移。在我们国家,我想事实是,确实还有众多的企业在使用低版本的 .Net 进行开发,使用旧的组件做着各种复杂的支持,然后忍受着自己撰写各种类库的麻烦,还不时会有各种意想不到的麻烦(例如组件软件厂商服务停止、安全漏洞等)。
我要说的是新的技术的出现的目的是什么呢?引用马克思大神的一句话:“为了提高和解放生产力”!
为什么不愿意迁移呢?技术不够吗?可以学。硬件不够吗?我们要升级的是软件,不是硬件。客户不支持吗?客户一般随着我们软件的要求来安排支持平台才是真正的现实。
再回到令人拍案叫绝的程序这个话题上来。
什么样的程序可以令人拍案叫绝?简明扼要、效率突出、安全过硬,都是很棒的卖点。
什么是生产力呢?也正被上面三点所体现。
于是乎,生产力与令人拍案叫绝的程序,它们是吻合的!
看一段程序,从一个集合中查找有指定属性值的特定对象,在C# 3.0中,它们至少有下面的五种实现方法。
方法一:使用 for 循环遍历,对每一个被遍历的对象的指定属性与值做比较,找到后使用 break 跳出。程序略。
方法二:使用 foreach 迭代循环,对每一个被遍历的对象的指定属性与值做比较,找到后使用 break 跳出,程序略。要支持 foreach,则需要集合支持 IEnumerable 或者 IEnumerable
方法三:使用委托,伪代码如下:
object Item = objectCollection.Find(delegate(object objectItem) {return objectItem.SpecifiedProperty == SpecifiedValue;});
可以看到,这方法只有一个语句!
方法四:使用 Lambda 表达式,伪代码如下:
object Item = objectCollection.Find(objectItem =>objectItem.SpecifiedProperty == SpecifiedValue);
方法五:使用 LINQ,伪代码:
object Item = from ObjectCollection select objectItem where objectItem.SpecifiedProperty == SpecifiedValue;
可以看到,方法三、四、五均只有一句代码,而方法一、二则需要一整个语句块。哪里有效率?
如果要谈运行效率的话,或许方法三、四、五的运行效率确实尚不能与方法一、二相比。但那又如何,现如今硬件配置早已不成问题。纵使“越高级的语言运行效率就越低”是真理,然而不可能每一个 Windows 程序员都从 Window 内核开始写代码。
相信我的态度已经叙述清楚:在必要时,是时候向新的技术迁移了。
题外话,昨晚看到一句 jQuery 代码,也让我高兴了好一阵:
$(”
This is a division created by jQuery Scripting Engine
作用是向 DOM 树的ID为 divWrapper 的对象中添加两个 div,且为第一个 div 添加单击事件。