If all you have is a hammer, everything looks like a nail

以前常常看到这句英文,一直不是太清楚它的含义。我曾经一度理解为”只要掌握好了一个工具,任何问题都能迎刃而解“,并把这个奉为自己的一个原则加以实践。但现在想来自己不但想的过于简单,而且是错会了这句话的意思(毕竟从google的结果来看,这句话也带有一些贬义色彩)。有些地方我们可能需要掌握一个工具,把它用精用好,而有时候我们则应该学会不同的武器,能针对不同的问题采用不同方式解决。这句话看似模棱两可,但它本身也说明了我们不能把所有的东西都当作“钉子”来对待,必须去进行区分才能找到对应的最好或最合适的做法。

对很多事而言,我们确实需要专用“一把锤子”来解决;我想这往往是迫于意识到自己时间、精力有限。比如作为一个程序员,我们日常使用的开发工具或语言就属于此。就编程语言,我并不是说一个程序员一生就用那么一个语言,而是说在一个时间段,可能就某一个语言是他最精通的,从而应该成为他手中的那把“锤子”。原因很简单,众多的程序设计语言各有千秋,没有一个人能在同一个时间段能做到精通所有的程序设计语言(实际上,我各人对那些现在经常看到的号称同时精通C++和Java的人都已经疑为天人了)。但即便是在这种情况下,我们也应该意识到我们手中的“锤子”是由局限性的:有些时候做某类应用用某个语言更好,有些时候则应该选择另外一个语言;迫于种种条件限制,我们可以尝试用自己手中的“锤子”解决这些本该属于其它“锤子”解决的问题, 但更合理更高效的做法是换一个使用合适“锤子”的人来做。

但在我们(程序员)日常生活中,往往碰到的更多的问题不是这类类似工具、语言选择的问题,而是我们在写程序时,大到框架,小到函数应该怎么去实现的问题,即所谓的设计问题。在这类问题上如果我们还是只有一把锤子,并不论由于什么原因都尝试这把锤子应用到所有碰到的问题那就未免胶柱鼓瑟,大错特错了。不同于编程语言,设计更多的是体现为一种思维和抽象的能力,我们没有理由说自己没有足够的时间和精力来发展自己思维、抽象的能力。

设计的方法有许多种,流行的比如面向过程,面向对象,面向方面(aspect)以及泛型变成等等。每一种方法或许都能解决我们所面临的问题,但其代价是完全不同的,最终产品的可维护可扩展性也完全不同。我们应该学会在不同的问题上采用不同的方法,甚至在同意个问题的不同层面上采用不同的方法。和设计能力紧紧相关的是对我们一个系统进行抽象和建模的能力。我们可以采用基于类的方式对系统进行抽象,也可以通过关系抽(Relational Modeling)象来理解系统;我们甚至可以采用XML或者简单的key-value某型来抽象系统;显然没哪一个可以说是最完美的能抽象所有系统的方法。

那么我们应该怎么做到不被一种“锤子”所限呢?我想无非不过两点,第一要尽可能知道更多的“锤子”种类,只有你知道某种方法你才可能想到去使用它。第二则是在我们日常工作中不断总结、提高,充分开拓自己的思路、充分借鉴别人的经验来并使用我们手中的各种“锤子”。对各种方法的选择因人而异,只有通过不断的实践才能知道什么情况下改使用什么样方法,但这并不是一个容易的过程:掌握十八般武器是一件好事,但如果不懂得如何利用这些武器,那后果可能还不如你只知道是用一种武器。

总之作为一个程序员,既然是在从事有史以来最复杂的工作,我们应该时刻提醒自己不忘学习和总结。只有不断丰富自己的武器库并熟知每种武器的性能我们才能写出更好的代码,设计出更完美的系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值