三十年河东三十年河西,无论什么新鲜事物都有变陈变旧的时候,而人们似乎对陈旧的事物有天生的厌恶感,也许正因此,这个社会在很多领域也是呈一种螺旋上升的态势:以往新鲜的事物渐渐变得陈旧,最后被遗忘在角落,人们开始接纳了另外一个看起来似乎更好的新鲜事物,然后这一新鲜事物也仍有变得陈旧的一天,很可能最终臃肿不堪,而取代它的另一新鲜事物,有时也可能自上一个被人们遗忘的事物那里有所传承。闪烁着新思想的事物最初问世的时候都是那么的精巧凝练,不带一丝芜杂,当人们开始采纳它的时候,大概是因为人的需求总是多种多样的,总是有更多的人开始向它附加各种各样为了满足自己需求的负累,也许仅仅是为了方便。当时间流逝,它不再像以前那么新颖的时候,大家看到的它是一副臃肿不堪的德行,我需要这部分,你需要那部分,但无论怎样似乎都永远有裁剪不掉的不需要的部分,没有人需要那硕大无朋的整体,好像有无穷多的无聊的东西被强加给自己。如果恰巧某个时候又有人发现了新的解决办法,看起来是那么的精炼,大家审视一番后通常又会欣喜地接受这个新的东西,开始新一轮的你添我加。不过好在聪明人总是有的,虽然思想上可能类似,但是后来者几乎总是更全面地超越了先辈。 单说设计模式,并非是种发明创造,而更多的是从工程方面总结出一些经典的有效的实践。如何有效地让程序开发工程化一直以来都是业界一个不小的问题,而一旦程序开发被当作(简单)工程化的过程,参与这个过程中的程序员都难免要面临泯灭个性而化身螺丝钉的不快,就好像我们从来都很反感自己被某些不长进的人力资源部门的同僚们抽象为“资源”。牛人们自然不屑于一辈子当个螺丝钉,计算机这行也不缺牛人以及自以为牛人的人们,所以软件开发工程化大多数时候是被憎恨的,至少在我们国家,十几年前,一边说印度的IT行业如何强大如何赚钱一边又蔑视阿三那些螺丝钉程序员的同胞们是不在少数的。 而Java其实也很类似。任何一个写过一段时间Java程序的人应该都有体会,这门语言几乎就是照顾脑残的一门语言,无论什么地方都是啰嗦得不行,什么东西都是显式声明出来写在那里的,除了些奇技淫巧以外,所有的东西自编译起就固定了,而所有的可以操作的类都是继承自同一个根源,没有多重继承,设计一个框架和类库时就可以少考虑一些类型系统可能带来的问题;而说到类,这门号称面向对象的编程语言,实则就是面向类嘛;又因为语言允许的灵活性很低,所以IDE就可以干很多很多事情,于是开发效率似乎还不错。找个有计算机操作基础的人来稍微培训培训就能来编码干活,再找些有经验的熟手设计一个框架和相应的开发规范和流程出来,菜鸟们在自家的框架、类库的圈子内很难搞出太不容易收拾的破坏,hmmmm,这样一个容易工程化推广的语言和平台,简直是老板们的梦想照进现实。 当然,任何不屑于做螺丝钉的牛人,任何觉得自己不脑残的自封牛人,任何屁股决定脑袋的站在某些特殊立场的人,都会讨厌这样的语言和平台。 开篇说到几个月之前我的惆怅和惭愧,其实也多半是因为受这些人的影响所致。 惆怅,因为我们平时打交道的事情距离真实的OS和机器来说,真是太远。除了无聊地调各种API,现成的也好,不现成的也罢,稍微“底层”一些的事情确实不常见,不过有虚拟机这个平台横亘始终,我们也会看java字节码、javap的反汇编代码,会用ASM库操着java的“汇编”在运行期修改掉一个个的java方法,也会在少数没有办法的情况下劳烦JNI做本地调用,甚至在后来出现了android平台的时候,去看dalvik opcode,可是这又能怎么样呢?就算出现了一种机器可以让java字节码直接运行在CPU上,仍然有内存、I/O、网络这方面的细节被虚拟机妥善地封装掉了;即使无数次操着tcpdump和wireshark排查网络问题,挂着各种*trace观察JVM行为调查问题, 好在现在也算想开了。