要提高设计能力首先需要对软件设计有着精神上的追求,即在软件开发的过程中追求设计的完美性。梦想之所以有可能成为现实,是因为我们会去“想”并为之努力,软件设计能力的获得也不例外。设计能力的获得并不会因为不去追求而“不小心”获得且水平很高。具备软件设计追求的人,会在设计的第一时间积极思考以试图找到更优实现,也会随着产品的演变而反思是否存在更好的设计,或者在必要的时候会选择接受挑战去通过改善设计帮助团队走出困境。
     提高设计能力的另一个途径是实践加模仿。作者小时候很喜欢武术,在高中时经常看有关散打方面的书,看过之后还在头脑中想什么样的场景应当用什么样的招式,而且还经常拿自己的弟弟、堂弟和表弟作为演练对象(可苦了他们!)。在高中期间的一次与邻居同龄小孩的打架中,作者快速地将对方巧妙地摔倒在地上取得了胜利。站在一旁观战的表哥后来问了一个问题,“你如何快速地将他打倒在地?我没有搞明白!”。“因为我经常在头脑中假想格斗的场景以及操练”,作者当时是这么回答的。有了那次经历以后,作者也明白了为什么部队里面要有军体拳(简单地说就是武术操),也改变了军体拳只是个花架子的观念。什么东西只有对之熟悉了以后才能运用自如,而要熟悉它就得实践,且一开始是模仿性的实践。作者小时候打架能快速地制胜,正是因为看了书中的散打招式后,通过一定的假想和操练去训练大脑的反应,一旦在现实场景中出现了以前训练时的场景,就会本能地运用相应的招式。设计能力的提高也有相似之处,一开始要看别人的设计,且看出其中巧妙的地方,如果看懂了往往会在大脑中留下一定的印象。以后碰到类似设计主题时就会想起曾经在某一个项目中存在类似的设计,如果还完全记得那一好的设计是如何实现的,那就依样画葫芦地做。当然,如果不记得也没有关系,可以再查看那个项目的设计并模仿它。类似的模范多了几次的话,后面就很容易想到用它,且领悟其中的精髓并把握各种设计方法的本质,乃至最后自己也能创造性地思考出更优的设计方法。这种学习方法,对于学习面向对象开发更是重要,因为面向对象的设计思想更抽象。作者曾经的一个项目组长是如此评价面向对向设计的 ——“我觉得它很绕”。是的,在还没有完全掌握面向对象开发时就是这种感觉,但一旦掌握了就会觉得它是那样的自然和直接了当。
     实践和模仿的目的是为了最终形成自己的设计思想,设计思想的形成需要通过思考去做到。设计思想是什么?是设计时所遵守的各条原则。为什么有的设计一看就觉得好呢?是因为它符合某些设计原则。而思考的目的就是从各种好的设计中,找出藏在背后的原则。如何从一个好的设计中找出隐藏在后的设计原则呢?作者在高中时购买过一本武术书 —— 《截拳道》,这本书讲解了李小龙创立的截拳道。截拳道更加注重搏击效率,因此,它的招式都是以实用、直接打击对手为目的。诚然,在格斗的过程中,没有人会优先考虑自己的招式是如何的“酷”,否则就是找打,而应注重如何在格斗过程中占上风乃至最后取胜。李小龙的截拳道也正是从纷繁复杂的招式中发现最为简练的那些,通过对招式的简化来提高搏击效率。李小龙创立截拳道的过程或许与我们从好的设计中找出隐藏在背后的设计原则很相似,需要什么样的能力呢?洞察力!想一想,李小龙能创立截拳道是不是也正因为他对于武术招式独到的洞察力呢?他通过运用洞察力去去除那些在博击中没有打击效用的部分,以达到简化并提高博击效率的目的。洞察力不只对于找出设计背后所隐藏的设计原则有用,其实在整个软件开发乃至人生中都有着十分重要的作用。良好的洞察力有助于发现表象背后的本质,或寻找出问题的根源。软件行业的洞察力也可以理解为技术敏感度,或职业本能。
     设计能力的提高意味着将掌握更多的设计原则,能力的提高过程也是对设计原则进行精化的过程,理论上,应尽可能让各设计原则所涵盖的内容是正交的。设计不是简单地运用每一个原则,有时需要在各种原则中进行平衡。一个设计在两个原则之间存在一定程度的冲突时,是先满足其中的哪一个呢?还是两者都需要进行一定的折衷妥协?这些都需要有很好的平衡能力。平衡能力的获得同样需要通过思考,或者平衡能力也可以通过定义适当的原则进行掌控。
     追求设计之美是提升设计能力的原动力,实践和模仿起到的是熟悉各种“零星”的好设计,而思考则是帮助领悟各种“零星”的好设计并找出隐藏在其背后的设计原则,进而形成自己完整的设计思想体系。