经验交流:继续提高,读什么书?

Q: 

我目前的想法是,创建一个自己的asp.net开发框架。刚看了《人月神话》,《head first设计模式》2本书,而现在正缺少一个给我的框架分层和数据流动的思想,最近了解了一些DDD的概念,可能对我最近的想法有些帮助,所以想找本书看看。可惜当今世界,书是烂大街,而一本好书却是不好找,所以烦请推荐一本相关的书。 

另外,不限于DDD领域,只要对我的思想有提高的书本,都期望推荐。

A:

DDD的话,把那本DDD提出者写的读了就好了。事实上我只读了PDF的版本,因为觉得不值得买(:P,因为我不认同作者的很多观念)。设计模式如果你感兴趣的话,必须读GoF的原版。读书一定要从源头去读(虽然原作者的著作一般都有点枯燥,但是入了门的话会逐渐找到兴趣的),其它的书就是再权威、再流行,也绝对不能避免歪曲、过度解读或损失信息。

面向对象的学习和实践

由于问题内容很大程度上和面向对象有关,先讨论一下这方面(感觉叨叨这事快赶上祥林嫂了^^)。

读面向对象方面的书一定注意有所保留,这样有助于形成你自己的看待事物的方法而避免偏颇;当我们有了自己的观念的时候,就可以和书中的内容相互参照了。强调读面向对象的书应该这样,是因为面向对象的书哪怕经典也总是泥沙俱下,很多作者的主观想法也掺杂其中。这从根本上讲,是因为面向对象的基础理论及各个子领域中的内容都缺乏严谨的论证。

(我不否认面向对象的学习,很大程度上是因为作为一名开发者,我们要时时刻刻接触和使用面向对象相关的内容,换句话说就是世界已经这样了,作为普通的从业者我们找不出一条更好的学习道路。)

举个例子,也许你看过类似的文字:23种模式看起来都像策略模式,策略模式是核心的模式。事实上这话大有问题:每个模式都有自己的目的和具体应用场合,所以都会有其特殊性。我们要掌握的正是这些特殊性,明白不同模式的使用场合和使用技巧;如果不是这些特殊性,所有的设计模式著作将毫无价值!

之所以每个模式都有点像策略模式,仅仅是因为它们都或多或少的体现了相同的原则(比如组合比继承好之类);而策略模式因为内容较少,所以更加清晰罢了。(题外话,如果让我来说,面向对象各层次的理论或实践,从编程技巧的角度来看其实质就是用好回调函数,而面向对象提供了一些结构化的办法去对一群回调函数用一些形式进行划分、规范和查询)
对于各种构筑在面向对象上面的设计理论也是这样,他们的作者往往有一定的来自于具体场景的经验,这些经验决定了他们如何看待软件设计和开发的视角。这往往带有很重的个人口味和局限性。所谓局限性就是说,这些“思想”的使用一定要明确识别其适用范围,并灵活的加以变通。
个人开发者使用各种方法论,其主要目的一定要明确,既至少要在某个方面上方便了自己、提高了工作效率,或者切合了某种需求(当然,不排除为了研习进行的实践);而合作开发中除了目的明确这一点,那个主要发挥决策作用的,要知道自己的任务中有很重要的一点是通过具体化某种思路去约束其它程序员,让大家可以很自然的使用相同的方式去工作(公开框架和公开类库提供者属于此类而且任务更重:因为“其它程序员”是谁他都不知道)。

如果不能做到这些,很大程度上方法论及其结果(一个模型、框架或类库,等等)就是无用的;甚至作为一种交换,引入某种方法论或者其某种形式的结果所付出的代价(比如它们成型时也许根本忽视了你将要碰到的问题)会让我们得不偿失。“如无必要,勿增实体”。

另外,如果你有一个自己的开发框架,你应该有自己的思想(真正的特殊性),而不要借别人的。不然一定会重复造车轮子,而且最后也就我们自己觉得有一些顺手之处,别人用不起来的。

怪怪本人的阅读经验

回头说看书学习帮助自己提高,这个说实话很难有一个明确的回答。具体地,对于面向对象爱好者,也许SICP可以作为一个平衡;对于FP爱好者,开玩笑的说很可能除了多参与些繁琐(而不是深奥)的项目之外已经无药可救了(或者可以好好看看计算机基础理论中偏向于图灵机的这部分?)。
我不能说我有资格推荐什么书,只能说一说我曾经最喜欢的书,依时间顺序是:《设计模式》(GoF)、《C++设计新思维》、SICP、《自动机理论、语言、算法导论》。

《设计模式》和SICP对当前我们接触的这个编程的世界很重要:前者能很好的提高对面向对象的理解和技巧,它也展现了如何以较严谨的研究方式对待不严谨的研究目标;后者则会给我们新的视角看待熟悉的一切。而自动机那本也许很多人会觉得没劲,但它会让大家明白自己面对的到底是个什么东西;而且至少,它能够看懂 :)。
着重要说的是《C++设计新思维》:表面上是讲解C++语言提供的某种设计技巧,但它带来的印象是震撼的、影响是长时间的;虽然我很久没用过C++了,但这本书以后,我真正开始走上了认知和思考“软件应该如何组织”的道路,而不再盲目的四处寻找可以依附跟随的权威。这本书并不特别针对其它“思想”、也没有如何抬高自己;但阅读和随后的实践这样一个经历,却改变了我很多。

现在读得最多的一些花边类的书,如一堆大师或者至少是实践者的想法集(《代码之美》、《设计之美》之流),而且对各种观念的学习总是有所保留;更多的是从各类代码和实践中体悟(Linux之类,无论是正面的还是反面的启发;如何实践?举个例子,比如你可以在Android里找找你最看不上的部分,然后试着重构一下)。

另外一些值得肯定的书,面向对象类的有Bob大叔的《敏捷软件开发》,在这类书里算比较踏实的;《代码大全》,检查下有什么我们还没留意过的问题;《如何求解问题 - 现代启发式算法》,这本不在于算法而在于思路的启发;《深入理解计算机系统》,无论工作在哪一层次我们还是应该了解些基本知识;《软件估算》,如果我们曾经是、现在是、未来可能是一个负责人,这个书很值得一看。
更多的,我鼓励大家看一些入门性质的科普尤其是哲学趣味性书籍。对于一些低年龄倾向的入门书,不要不好意思看:) 比如《苏菲的世界》一类的书,虽然我本人是小时候看的,不过现在也偶尔会拿出来温习一番。如果不从这些书入门,我保证那些更严肃的书,没有一本能看得下去的。等真入了门了,我们会根据自己面对的具体需求找到合适的著作,我自己就有这类的感受。

至于《时间简史》一类涉及到比较多的数学物理的,像我这样没天赋的就不要费劲了,真有兴趣的话简单浏览一下能看得懂的部分就行。提到这个不是为了讽刺什么社会现象,而是如果硬要读又看不懂,对我们的学习自信心损害是非常大的。我个人很想能流畅的看懂这类书,不过我的规划是有空就补补数学物理课和其它科学常识,总有一天会达到目标的。

为什么在最后提到这些乱七八糟的书?干我们这行的,说白了就是理解和表达。

理解是理解我们的目标,人的世界和人所观察的世界这部分;表达虽然是表达给电脑和同行的,但量大了复杂度高了,就有一个如何组织的问题。这在一定程度上和哲学家、科学家、数学家所关心的内容是重合的;如果说做《Quake》这样的东西侧重于高超的编程技巧【1】,那么做项目及做“做项目”相关的东西则更多的依赖于我们看问题的角度和组织事物的方式了。

 

注【1】:事实上Quake系列在当时也是系统级设计的典范,比如高可配置性,比如扩展和Mod,比如脚本化,比如引擎的概念,等等。更多的,我们应该思考这样一个问题,为什么John Carmack这样的家伙并没有鼓捣这篇文章涉及的东西,却可以设计和实现远比我们日常面对的情况复杂的东西?

这个问题在我已经不止问了一次了,想必它的答案也是见仁见智。如果完全否定常规的学习途径,我想那是有失偏颇的;但把他们这些例子和我们周围的热衷于追随各种理念的例子相比较,我们应该更深的体会“尽信书不如无书”的老理。真正的思想,无论它和书里一样还是不一样,永远、而且也只能通过自己获得。

如果说我们的现状让我们不得不通过读书去获得启发,那么有一点是我绝不吝啬多唠叨几遍的,就是永远带着怀疑的态度。毕竟,我们人类现有的大多数知识中即便是那些最严谨的,如果放到未来某一时刻去看,即便不是完全错误也绝对存在着很多谬误;更何况那些似是而非的立论呢。

posted on 2010-12-28 03:36  怪怪  阅读(1013)  评论(4编辑  收藏  举报

导航