有这么一句古老的箴言:

如果你手里有一把锤子,所有东西看上去都像钉子。

其实这句话已经是老调中的老调重弹了,我们程序员有很多锤子:OO、设计模式、语言(C, C++, Java, Python, Ruby, etc.)、各种各样的架构tricks&workarounds,以及一堆软件过程方法论(Agile, XP, Scrum, etc.)、等等。

几则故事:

1. 阿朱的(《走出软件作坊》):

我过去领导过架构组。架构组的人在2002年的时候,疯狂迷上了UML和设计模式,人手一本《COM本质论》和《设计模式》。我手下有一个新手,就处处是类,处处是抽象,处处是封装,处处是分离,尽量使代码高内聚低耦合。但是这样的的代码太麻烦,他花费了大量的时间,他看自己的代码赏心悦目,别人看他的代码云里雾里,不阅读懂《设计模式》就按照常规理解业务的思路去阅读他的代码根本阅读不懂,不知道他为什么这样写代码,怪异的很。本来,这位想达到可维护性,可阅读性,却真正的失去了可维护性、可阅读性。这和我前几天看我的朋友周爱民写的《大道至简》中写到:有人希望拿UML去统一用户和软件设计者。殊不知UML有多难理解,而UML设计者却认为UML可以描述一切。就这个道理,要理解你的代码还要去读懂《设计模式》,这要求太高了吧。

所幸这位新手自己都每次写的累,慢慢的也就懒了,觉得确实需要分离的时候就分离,觉得没什么必要的就懒得做了。用他自嘲的话说就是:被磨平了。其实,依我看,他现在这个代码状态才是刚刚好,即照顾了设计扩展,又照顾了实用。真正的纯OO,纯设计模式,可能只存在于教学和科学,而不在于我们的商业软件开发。我们作为商业开发,强调的是叫座的基础上叫好,所以折中方案是必须的,客户和我们自己两相宜就OK,是否符合正宗,就不在我们的商业开发管理范畴了。

这位新手还写了大量的注释。在每个源代码文件头都写上几月几号,XX创建的,这个原代码文件主要是干什么的,还画蛇添足的写上版权所有,公司名称。好像这个代码要开源,或者可能会被其他公司窃取了好表明公司版权。甚至每个函数都写了注释,每个参数是什么意思,每个参数可能出现的值代表什么意思,都写的一清二楚。久而久之,也懒的维护了。代码改动了,参数扩展了,参数状态值有了变化,注释说明却没有跟着改动,让后来看代码的人老误解,还不如不写这些注释。

我告诉他:做事不能走极端。要么全写注释,要么不写注释,都是不对的。我只在我认为要小心的地方,或者我自己都觉得很难理解懂的地方我才写注释。否则,我自己都可能会过段时间理解错了。如果某段代码我看看就能看懂,我就不写注释了。咱们做企业管理软件,深入技术又没有,只要代码能把复杂的业务处理描述的逻辑思路清晰就OK。虽然说理解能力不同,我能快速理解了的未必有新手能够理解,但是你看看我的代码你就明白了。(摘自 《走出软件作坊:代码那些事儿》)

再来一段:

有一部分所谓的架构师,技术超深厚,框架堪比Spring之类,但自己一个人闷头写框架不断优化,力竭使用最先进的技术思想,希望把最豪华的设计模式融进去,希望把OSGi融进去,希望把AOP融进去,全无视那些想利用框架减轻自己工作量提高自己工作效率的应用功能开发同事。这是在用公司工资玩技术呢,还是在满足个人技术幻想呢,还是在实验呢?到底在干吗?价值在哪里?

还有的人不会推广自己的框架。不善言辞,就幻想着技术总监能够通过行政命令让大家必须用框架,能不自己写代码就不自己写代码,能交给框架做的就交给框架做。但技术总监号召完了,大家仍然我行我素,各自开发为政,让框架开发者很孤单。

还有的人也不会推广自己的框架,沉迷在自己的理想世界。好不容易技术总监召集大家让大家来听听框架如何应用,但自说自话,满口自己最得意的词汇,听得业务功能开发人云山雾罩。大家问些问题,如这样的业务开发难题,框架怎么解决?于是,框架开发员就和业务开发员争论了起来。框架开发员觉得这根本就不能答应客户这种变态的需求,而业务开发员说这就是现状。框架开发员说你可以这样这样,业务开发员说这样太麻烦,框架开发员立刻还口这还麻烦?于是双方各执一词,框架也没推广成功。

我手底下有个框架开发员。他的技术渴望很强烈,为了技术难题攻克,可以不吃不睡。并且技术敏感度很强,学习也快。所以当时我感觉他是个程序员的料,就把他拉到我的手下。

但是有个问题,他写出的框架代码,在平时开发业务功能的时候挺麻烦。大家可能需要的是一把铁锹,但是他却给大家N根不同长度不同粗细不同材质的木棍,N个不同形状不同用途的铁锹头。大家会有N种组合。不仅导致他写代码老超任务期,而且也让使用人感觉没多大帮助。使用起来复杂,而且还得配置这个配置哪个,需要注意的地方太多。业务开发组的同事就不愿意用,还不如把代码自己直接写死了得了。超期还会影响业务功能开发组的使用。本来人家是为了想加快自己的工作效率。你答应好这个星期给业务开发组提供一个功能,但你没有拿出来。就耽误人家进度。你多次拿不出来,人家业务开发组还不如自己开发一个呢,求人不如求己。

我最后警告他:如果你认为自己技术够牛,那么你必须证明你能很快做出来。如果你认为自己技术够牛,最好能牛到,只提供一个函数就解决了他们的问题。别这个代理类,那个聚合类,这个唯一实例类。最好连参数也没有,大家调用一下写一句代码就OK。甚至你做的好,大家都不用调用你的代码,你可以包含在基础框架中,你自己去判断什么时候什么应用需要执行这个动作。如果你认为自己技术够牛,那么在业务功能需求发生变化的时候,你能够保证接口不变的情况下还能适合变化,这才你够牛。别让业务开发组的人跟着你也得改他们自己的代码,那样的设计就很烂了。

小伙听了我的话。进度保证,代码接口简洁。(摘自《走出软件作坊:走钢索的人》)

2. 坊间流传的大家耳熟能详的小故事:

话说联合利华新换了一批自动香皂包装机以后,经常出现香皂盒子是空的没有香皂的情况,而在装配线一头用人工检查因为效率问题不太可能而且不保险。这不,一个由自动化,机械,机电一体化等专业的博士组成的Solution队伍来解决这个问题,没多久他们在装配线的头上开发了全自动的X光透射检查线,透射检查所有的装配线尽头等待装箱的香皂盒,如果有空的就用机械臂取走。

不巧,中国一乡镇企业生产香皂也遇到类似问题,老板吩咐线上小工务必想出对策决之,小工拿了一个电风扇放在装配线的头上,对着最后的成品吹之,空盒子被吹走,问题解决之。(摘自 TopLanguage 上的讨论。)

因此,

  • 心中有锤,就容易为其奴役:在遇到问题的时候不是具体问题具体分析,而是屁股决定脑袋,不管三七二十一先上黄金大锤再说,而且往往还颇有成就感,却将自己真正原本要解决的问题抛在脑后了。始终莫要忘记提醒自己,“问题是什么?”
  • 但毫无疑问,没有锤子是万万不行的,没有谁会傻到徒手钉钉。重点是选择合适你的工具。这又要求在学习工具的时候始终别忘记它的适用范围。

正确的态度应该是:

手中有锤,心中无锤。

容我具体解释一下这句话:任何工具都有其适用范畴和前提。然而,我们在学习工具的时候由于投入很多的时间,往往在情绪上面对工具产生了太强的感情,我们既投入了时间,当然内心希望能够用上这些工具,所以就容易忘掉其适用前提,欣欣然地不管三七二十一就把黄金大锤亮出来,以显示自己的厉害。但如果我们换一个态度,仅仅将它看作我们工具箱中的又一件工具,就可以客观地评估它,视具体情况而使用了——始终别忘记自己要解决的问题是什么。Why 永远在 How 之前。

与上面对应的还有另一句话(实际上这是我杜撰的:D):

如果你想钉一个钉子,所有东西看上去都像是锤子。

用大白话来说就是:如果你心中专注于你想要解决的问题,那么你所看到的东西就会呈现出以往你没有看到的一面。

例子:

1. 阿基米德洗了一辈子的澡,然而,只有那一次,当他想要解决皇冠密度问题的时候,想到可以利用排水体积来测量不规则物体体积(Eureka是希腊文,意为:我找到了,我发现了)。

2. 如果你也喜欢看 《Monk》 ,就会体会到把问题装在心中,甚至把自己变成问题,问题即自己的作用——当 Monk 的潜意识里面始终在寻思 How, Why, Who did it 这几个问题时,周遭环境中的一切信息都会显出另一番面目,一个平常情况下根本不会注意到的细节也能成为破案的关键,看似不相干的信息也能带来出乎意料的启发。

3. BentObjects

如果你也像我一样,习惯于经常把疑问装在大脑中酝酿好几天,你肯定会有 eureka 的体验。

或者,如果你喜欢在一段时间之内关注某个主题,你在阅读书籍资料的时候就会带着问题的眼镜,看到平常看不到的东西,作出与平常不一样的思考。

把自己变成钉子,这就是 eureka 的奥秘。

Eureka的故事,专注能让你看到别人看不到的事情的更多相关文章

  1. 生活沉思录 via 哲理小故事

    本文转载:http://www.cnblogs.com/willick/p/3174803.html 1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛, ...

  2. 原来Java世界里也有这么多精彩的故事,学Java真有趣!

    大千世界,无所不有.这世上不光有人类世界,还有咱们的java世界.今天就由我这个实习导游带领你们了解了解咱们的java世界奇妙之处.   有一种暖男叫catch,有一种真爱叫try---catch,世 ...

  3. Web发展简史(精编故事版,贤来给你讲故事)

    Web发展简史 一. Web发展简史之隔壁老王的故事 有一个人叫隔壁老王,老王有一个爱好就是爱看电影.有一天,这个隔壁老王想看一部电影,可是电脑里面存储的电影太多了,他费了老大劲才从里面找到,觉得很不 ...

  4. 蚂蚁金服研发的金融级分布式中间件SOFA背后的故事

    导读:GIAC大会期间,蚂蚁金服杨冰,黄挺等讲师面向华南技术社区做了<数字金融时代的云原生架构转型路径>和<从传统服务化走向Service Mesh>等演讲,就此机会,高可用架 ...

  5. asp.net core microservices 架构之eureka服务发现

    一 简介 微服务将需多的功能拆分为许多的轻量级的子应用,这些子应用相互调度.好处就是轻量级,完全符合了敏捷开发的精神.我们知道ut(单元测试),不仅仅提高我们的程序的健壮性,而且可以强制将类和方法的设 ...

  6. 【一起学源码-微服务】Netflix Eureka 源码一:Netflix Eureka 源码初探,我们为什么要读源码?

    前言 最近发现 网上好多自己的博客,很多朋友转载了文章却不加下 原载地址,本文欢迎转载一起学习,请在目录出加上原出处,感谢.转载来自:博客(一枝花算不算浪漫) 看了前面几篇文章的小伙伴知道,前几天在学 ...

  7. 【一起学源码-微服务】Nexflix Eureka 源码五:EurekaClient启动要经历哪些艰难险阻?

    前言 在源码分析三.四都有提及到EurekaClient启动的一些过程.因为EurekaServer在集群模式下 自己本身就是一个client,所以之前初始化eurekaServerContext就有 ...

  8. SpringCloud(二) - Eureka注册中心,feign远程调用,hystrix降级和熔断

    1.项目模块介绍 2. 父项目 主要依赖 spring-cloud 的 版本控制 <properties> <!-- springCloud 版本 --> <scd.ve ...

  9. iteye上总结的编程精华资源

    原文:http://www.iteye.com/magazines/130 博客是记录学习历程.分享经验的最佳平台,多年以来,各路技术大牛在ITeye网站上产生了大量优质的技术文章,并将系列文章集结成 ...

随机推荐

  1. Linux下的mongodb分片部署

    前提: 分片服务器不设置从服务和均衡服务,只有主服务器;当前测试为所有服务器均在同一台物理机上. 1.测试环境:192.168.1.55. 2.测试模式:单机.3.服务:分片服务器1:192.168. ...

  2. 高德地图API应用

    高德地图官网:http://api.amap.com/javascript/ 输入关键字,搜索地址功能的网页: 1.引用远程Map Api(js)网址形式(注册后获取) 2.定义个<div> ...

  3. Block的简单使用

    代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数,并得到返回值. 代码块本质上是变量,只不过它存储的数据是一个函数体,因此名字 ...

  4. javax.management.NotCompliantMBeanException

    public interface QueueMBean { } 假如接口名叫 XMBean ,那么实现名就必须一定是X,而且是大小写敏感的. public class Queue implements ...

  5. 【Java 基础篇】【第八课】package包

    学习Java以来,第一次感觉稍微有点不好理解的,下面说说吧. 存在意义: 包的存在就是为更好的组织结构 包的创建: 只要在程序的最前面加入 Package ******,就可以了,一般都喜欢写 com ...

  6. key_value 类型配置文件的解析

    #include <iostream> #include <string> #include <stdint.h> #include <map> #in ...

  7. 设计模式:抽象工厂模式(Abstract Factory)

    定   义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 结构图: 示例结构图: 实体类: class User { public int Id { get; set; } p ...

  8. 遍历ModelState中存储的错误信息

    在服务器端验证中,有时我们添加了一个ModelError,然后还需要将该信息以JS的形式返回到客户端.如: [HttpPost] public ActionResult Index(LogOnMode ...

  9. Macro and SQL

    If you’ve developed anything in the supply chain area, you’ve most probably come across InventDimJoi ...

  10. Linux 性能检测 - CentOS 安装 paramon

    简介 paramon是一款性能检测工具. 数据发送:cnt 数据接收:svr Continue...