记得来TW之前看到过一个论坛上有人对TW的一条评价:这是一个奇怪的公司,非常强调代码风格。
现在已经在TW工作半年多了,回想起这句话,发现自己已经完全融入到这种“奇怪的”代码风格了。简言之,就是要把程序写的清晰易懂,易维护。具体如何达到这种目的。可以参看下面thoughtworks文集中的一篇,对象健身操,中所阐述的“编程规范”。
- 方法只使用一级缩进
- 拒绝else关键字
- 封装所有的原生类型和字符串
- 一行代码只有一个"."运算符
- 不要使用缩写
- 保持实体对象简单清晰
- 任何类中的实例变量都不要超过两个
- 使用一流的集合
- 不使用任何Getter/Setter/Property
以上的这些标题如果感觉不是很能表意,不妨去网上搜下或者买本thoughtworks文集看看。其中第一条中的具体内容提到“把函数控制在5行”。其他条目中也有一些具体的“变态的”要求。
我在开头把“编程规范”打上引号的意思是:这不是真正要严格遵守的规范,而是一个方向。以此为方向写出来的程序能够在一定程度上符合前面提到的“清晰易懂,易维护”。我一直认为,标准一定是要定高一些的,这样即使不能完全达到标准的要求,也会为此为努力。比如你的标准是60分,你可以轻松的达到而自我满足;而我的标准是101分,虽然永远都达不到,可是我可以保持在饥饿的状态,从而不断的进步。
工作的前4,5个月,大部分时候写的是一些新代码。可以开心的按照上述的原则去编码。事实上写出来的代码也能够让自己觉得满意:短方法,表意的名字,测试,清晰简单的结构。并且感觉现代IDE对这种代码风格也是比较支持的。直到从TWU回来,回到原来的项目。项目进入support阶段。其实就是给人家修修bug。关键这些bug不是我们之前做的新功能引入的,而是他们的陈年老bug,两三年前的都有。所以这个阶段写的新代码少,多数是先读懂之前的代码,然后做少许修改。不得不说看这些老代码看起来真是恨痛苦,很慢。很多超过一屏甚至两屏的长函数,在我们24寸的大显示器下。
在抱怨老代码写的像一坨的同时,突然觉得,还是自己看代码的能力有欠缺。一直工作在相对来说比较简单易懂的代码库上,然后去看这些一坨的代码就好像一个人很整洁很爱卫生的人突然被扔到垃圾堆里,异常难受。而对于常年在垃圾堆里生活的人们早已久闻不觉其臭,甚至还对垃圾堆中的那些病菌产生了抗体。世界没有那么美好,工作中总是会遇到不尽如人意的代码库,无论是做交付还是做咨询。所以除了要有写出清晰漂亮代码的能力外,还要有读复杂,凌乱的代码的能力和改造复杂凌乱代码的能力,也就是我们常说的重构。
复杂代码可以分成两种:
一种是受到语言,平台,库的限制,使得代码无法写的非常简短和易懂。比如使用纯c,没有很好的语言特性和可用的sdk,使得实现复杂逻辑的时候不可避免的要写出很长很复杂的代码。有时短的代码也不一定清楚,比如在代码中大量使用组合表达式或者是位运算符,在让代码变短的同时,变得更难懂。这些时候通常是处于效率的考虑。
一种是我们有了更高级的语言和其上的大量的框架。如java+spring+struts+hibernate,或者是直接用Ruby on rails,Django等更易用的工具。通常在这些框架下写程序,是很容易遵循上面提到的让程序清晰简单的原则的。如果在这样的基础上写出了让人摸不着头脑的代码,那就完全是程序员的责任了。
现在有种感觉,在层层叠叠的框架下写程序,就像是搭积木,越来越简单。底层封装的越来越严实,程序员都像白痴一样机械的在框架中填写你想实现的业务逻辑。发明框架的原因是为了让程序员不再重新创造轮子。但是长期在框架上工作的结果是,大家都不会做轮子了,真正有一天需要你做点不太一样的轮子的时候,就sb了。
程序员写代码的能力是凌驾于语言之上的,是思考问题,抽象问题和用另外一种语言简洁,有效,清晰地描述问题的能力。我相信一个能写出优秀c代码的人通过一段时间对java及其上的一些框架的学习,也能写出优秀的java代码。
目前我正在学习各种各样的框架,平时的工作也是在这些框架上工作,越来越感觉,学习这些新知识的同时,做为一个程序员的基本功也不能放下。框架是很好的东西,在提高生产力方面,但是框架让写程序变得简单的同时也会降低对程序员的要求,久而久之,基本功就被荒废了。如何锻炼这些基本功?个人认为用最简单的语言,如c,去做一些算法题是一个不错的主意;或者不甘做玩积木的小孩儿,看看框架的源码。其实做为一个计算机专业的学生,这些锻炼应该是当学生的时候都好好练习过的东西。如果现在发现有所欠缺了,就赶紧补补吧。