预计阅读本页时间:-
7.懂得丢失
“那就是你一贯的工作方法,并且是有原因的,这个方法也很好地为你所用。开始你就掌握了这个方法,很明显它是最好的方法,真的,从那以后就不要再改变了。”
敏捷的根本之一就是拥抱变化。既然变化时永恒的,你有可能一直相同的技术和工具吗?
不,不可能。我们一直在本章说要学习新技术和进方法。但是记住,你也需要学会如何丢弃。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
随着科技进步,曾经非常有用的东西往往会靠边站。它们不再有用了,它们还会降低你的效率。当Andy第一次编程的时候,内存占用时一个大问题。你通常无法再主存储器(大约48KB)中一次装载整个程序,所以必须把程序切分成块。当一个程序块交换进去的时候,其他一些程序必须出来,并且你无法再一个块中调用另一个块中的函数。
正是这个实际约束,极大地影响了你的设计和编程技术。
想想在过去,面对处理器之外的循环操作,你必须花费很大的精力去手动调整汇编语言的编译输出。可以想象,如是是使用JavaScript或者J2EE代码,你还需要这么干吗?
对于大多数的商业应用,技术已经有了巨大的变化,不再像以前那样,处处考虑内存占用、手动的重复占位及手工调整汇编语言。但我们仍然看到很多开发者从未丢弃这些习惯。
Andy曾经看到过这样一段C语言代码:一个大的for循环,循环里面的代码一共输出了60页。那个作者“不相信”编译器的优化,所以决定自己手动实现循环体展开和其他一些技巧。我们只能祝愿维护那一大堆代码的人好运。
在过去,这段的挨骂也许可以勉强接受。但是,现在绝对不可以了。电脑和 CPU曾经非常昂贵,而现在它们就是日用品。现在,开发者的时间才是紧缺和昂贵的资源。
这样的转变在缓慢地进行着,但是人们也真正认清了这个事实。我们看到,需要耗费10人年开发的J2EE项目已经从辉煌走向下坡路。使用PHP,一个月的时间就可以完成,并能交付大部分的功能。想PHP这样的语言或Ruby on Rails 这样的框架越来越受关注(参见[TH05]),这表明了开发者已经意识到旧的技术再也行不通了。
但丢弃已经会的东西并不容易。很多团队在犹豫,是因为管理者拒绝用500美元购买一台构建爱你机器(build machine),却宁愿花费好几万美元的人工费,让程序员花时间找出问题。而实际上,买一台构建机器就可以解决这些问题。如果购买机器需要花费500 000美元,那样做还情有可原,但现在早已时过境迁了。
在学习一门新技术的时候,多问问自己,是否把太多旧的态度和方法用在了新技术上。学习面向对象编程和学习面向对象过程是截然不同的。很容易会发现有人用C语言的方式编写Java代码,用VB的方式编写C#的代码(或者用Fortran的方式做任何事情)。这样,你辛苦地转向一门新的语言,却失去了期望获得的益处。
打破旧习惯很难,更难的是自己还没有意识到这个问题。丢弃的第一步,就是要意识到你还在使用过时的方法,这也是很难的部分。另一个难点就是要做到真正地丢弃旧习惯。思维定式是经过多年摸爬滚打才构建成型的,已经根深蒂固,没有人可以很容易就丢弃它们。
这也不是说你真的要完全丢弃它们。前面那个内存重复占位的例子,只是在稍大缓存中用手工维护一组工件的特殊案例。尽管实现方式不同了,但以前的技术还在你的大脑中。你不可能撬开大脑,把这一段极易神经剪掉。其实,根据具体情况还可以运用旧知识。如果环境合适,可以举一反三地灵活应用,但一定要保证不是习惯性地落入旧习惯。
应该力求尽可能完全转入新的开发环境。例如,学习一门新的编程语言时,应使用推荐的集成开发环境,而不是你过去开发时用的工具插件。用这个工具编写一个和过去完全不同类型的项目。转换的时候,完全不要使用过去的语言开发工具。只有更少被旧习惯牵绊,才更容易养成新习惯。
学习新的东西,丢弃旧的东西。在学习一门新技术的时候,要丢弃会阻止你前进的旧习惯。毕竟,汽车要比马车车厢强得多。
切身感受
新技术会让人感到有一点恐惧。你确实需要学习很多东西。已有的技能和习惯为你打下很好的基础,但不能依赖它们。
平衡的艺术
□沉舟侧畔千帆过,病树前头万木春。要果断丢弃旧习惯,一味遵循过时的旧习惯会危害你的职业生涯。
□不是完全忘记旧的习惯,而是只在使用适当的技术时才使用它。
□对于所使用的语言,要总结熟悉的语言特性,并且比较这些特性在新语言或新版本中有什么不同。