2006-09-17

完美主义

昨天吃饭聊起人的性格类型,有人分析说我是完美主义者,我自己倒没有意识到,应该是他们看错了。毕业找工作前做过学校的一套性格测试,我只记得内向方面得分很高,是个超级内向的人,至于是否完美主义倒不记得了,应该得分不高,否则肯定能记住。

这么一说,倒想起两件事。
大概四五岁的时候,有件事情很困惑,就是湿毛巾怎么也拧不干,怎么拧都还是有水,于是要拧很多下,还是认为拧得不干。而看大人们一下就拧干挂起来了。这事很是烦恼了一阵子,某天和一个大我一岁的表姐一块洗脸,看她也和大人们一样拧一下子就挂起来了,于是便问她怎样才能拧干,她说她以前也有同样的烦恼,具体说怎么学会的忘了,记得最后说我再大一岁就会了。于是这个问题便放下了。随着慢慢长大,这个问题也不成为问题了,慢慢地也和其他人一样拧一下就算干了。也逐渐明白,没有人会因为毛巾还有点水就不停地拧,除了那个傻小子:( 如果说现在的我是完美主义者,那四五岁的我便是完美主义者中的完美主义者了。

本科的时候有一个学期利用周末在外面做专利申请文档翻译,找这个工作当然是为了挣钱,敢找这个工作是自认为自己的英语还不错,但是在翻译的过程中还是比较痛苦的,痛苦的不在于累,而在于老怀疑自己翻译的不正确,因为专利文档为了描述上的严密,一句话写的很长,往往一段就是一句,中间嵌套了好几个which、that,所以翻译起来很痛苦,很怕断错位置,把意思翻译错了。另外就是读英文容易理解,但是要翻译过来,用合适的词汇表达出来又困难了,总是不确信用词是否恰当。当然我翻译过后还有人校验,每次的结果都不错,没有啥问题。但自我怀疑的痛苦始终没有去除。

其实现在工作,偶尔还是有这个痛苦,不确信设计的构架是否考虑了所有情况,程序里的异常是否都捕捉完了,等等......好在有review机制,可以缓解一下这个压力与痛苦。

上面所说的这些烦恼有一个共同的特点,那就是这些事没有一个完成的标准,准确地说烦恼的我不知道完成的标准,因此总是怀疑自己是否完成,希望做得更好。极端一点,就变成完美主义了。自我怀疑、多疑也是他们判断我是完美主义的一个证据。其实,毛巾是否拧干了、用词是否准确、断句是否正确、设计是否考虑了所有情况、程序是否清除了所有bug等等都不可能有彻底的完成,所有的只是完成到什么程度。定义下这个完成的标准,判断是否完成就相对简单了,痛苦也会减轻。

有可能我没有意识到我潜意识里还是完美主义者,但是我认为完美主义是要不得的。尤其在软件开发中,永远做不到零bug,所能做到的就是控制bug的多少、影响程度等。软件开发的复杂性决定了bug的存在,需求的不断变化决定了enhancement的存在,资源(时间、人员、人员的技能)的有限决定了不可能清除完所有的bug、实现所有的功能。因此,完美主义者做软件是痛苦的,在产品设计的时候会因为需要抛弃很多功能而痛苦,在方案设计的时候会因为没有一个解决所有问题的完美方案而痛苦,在编码的时候会因为无穷无尽的exception、bug而痛苦,在准备发布的时候会因为系统还存在bug而痛苦。而现实是残酷的,从来就没有人开发过完美的软件。事实上也不需要完美的软件,需要的仅仅是好用的软件,在特点用户群中使用的软件,由于针对的是不同的用户群,软件的完成标准自然也不同(Five Worlds)。因此,软件开发不需要完美主义者。

不需要完美主义者,不代表我们可以没有目标,相反,需要的是明确的目标,为了达到目标,需要在各种因素中做平衡,即balance & trade off。目标明确了,才能在需要的时候迅速作决策,不至于等到“黄花菜都凉了”。比如写一个只自己用一次的工具,则可读性、可维护性这些重要指标是可以放弃的,用来换时间。

但是,作为一个合格的职业程序员,即使是做一个只自己用一次的工具,也不会在可读性、可维护性上差到哪儿去,因为这些已经成为习惯、成为品质,是很自然的事,而不是通过完美主义者的追求才能得到的。

因此,对单独的软件开发来说,不能追求完美。但是作为软件开发者,可以把完美作为一种持续的追求,以便沉积为内在的品质。就像手艺好的工匠一样,手艺是平时练成的,而完成一件作品时需要考虑这件作品的用途,再决定怎么做。

没有评论: