不管是在现实中还是网上,总遇到一些人再问一些奇怪的问题。很多问题让大牛
们哭笑不得,总是推荐这些人看一些经典的书籍。结果过了一段时间,其他人的
知识已经沧海桑田,不少人成了大牛,大牛们已经成了大大牛。这些人还在重复
着类似的问题。本人不是大牛,但是觉得大牛们在技术上帮助别人的同时还应该
更多的传播思维方法。如果大牛们没有时间,那么小弟只好抛砖引玉,谈一些不
成熟的见解,同时希望大牛们多提意见,我再把你们的经验总结起来一齐奉献给
大家。
1)分层思考
在我的同学中有一个人算是经典案例,他学习起来很用功,但似乎不管长时间也
没有气色。并且常问一些让人哭笑不得的问题。我花可长时间也无法让他明白学
校开的课程到底和实际的开发有什么联系。有一天我突然发现,我用如何处理以
太网侦来举例子来说明如何是用C语言的struct的使用他居然就轻易的弄懂了。之
后我总结出来的结论是:他在学习的时候总是尝试一次弄清楚涉及的每一个细节,
结果就陷入了无穷个疑问中,每次都把自己弄的晕头转向。
这里引出了一个对于学习者最终要也是最基本的思考方法:分层。可以说99%论
坛上的哭笑不得的问题是因为没有分层思考造成的。遇到这样的人只能先教他们
学会如何的进行分层思考,再向他们推荐学习资料。
练习分层思考其实非常简单,你考虑拓扑时,就不要考虑数据流程,考虑数据流
程时就不要考虑存储,考虑网络间的协议时,就不要考虑一台机器上的数据是如
何处理的。只要忽略具体的细节,每次只弄懂和问题相关的最小的部分。等你全
部弄懂之后,再考虑层次之间的联系。经常假设“它就是那个样子”,跳过一些问
题也是好的方法,当你发现跳过一些问题会加速自己的理解时,这些跳过的问题
往往就是处于不同层次下的,甚至当你发现一些问题是属于其他层次的时候,问
题本身不复存在了。
分层思考在读书的时候是很容易掌握的,因为大牛们的书本来就会用科学的方法
向你表述他的思想。难在读代码,或者在hacking几乎没有教材的技术的时候,需
要灵活掌握。
2)从整体到局部,从局部到整体
当学会了分层思考后,掌握2)就变得十分简单了。在每个层次上,很多的问题是
相互独立的,将他们归纳出来,如果有必要了解,逐个击破。很多人会抱怨某某
东西很难,其实加上分层再划分之后,逐个解决起来就容易多了。分层是为了获
得综览,划分局部是实际解决问题的必要的步骤。
整体到局部的另一个好处是,实际上你获得了某个技术的最小单位。这些最小单
位通常也会被其他的技术所采纳。举个例子,你了解LDAP时熟悉的FQDN、OID、
realm、BNF等等,在了解电子邮件,HTTP,Keberos的时候也会有用。事实上划分
是再自然不过的方法,只是对于初学者,也许需要特别强调一下。
此外,有些局部的技术可能是不需要了解的,比如说UPnP,可能你只有在解决实
际环境的问题的时候才需要考虑,虽然它哪里都可以见到,但是你绝大部分情况
可以忽略它,无论是在考虑拓扑时,还是在分析代码时。
3)创造和发现问题
创造和发现问题并不一定在你完全掌握了某个技术之后。而是在1)、2)的前提
下,能够在学习的过程中提出建设性的问题。这些问题绝大多数会在学习的过程
中自然的获得答案,少数会在论坛的讨论中得到结论。如果还有剩下的,那么可
能你发现了技术本身存在的缺陷,恭喜你。
事实上创造和发现问题的人很少出现“迷惘”,或者找不到“实践的途径和方法”的
情况。如果出现了这种情况,很可能1)、2)的条件都没有具备。如果1)、2)
都具备了的话,才有下面的方法训练:
多问“如果”。典型的就是在1)时,先问自己,如果是自己会怎样设计?把这个问
题从开始保留到结束。
多问“为什么”。配合“如果”,多问别人为什么这么设计,并且把让这个问题贯穿
到整个的学习过程。
多问“哪些”,哪些东西是可以替换的?通常配合2),这样可以发现实现同一目
的不同方法,很容易发现当前协议的不足之处以及更好的解决办法。
总结
事实上通篇的内容可以归纳为:不断的问下面5个问题:What(1)、Which(2、
3)、What if(3)和Why(3)。仅仅是自己的一点不成熟的经验,而且也写的比
较匆忙,漏洞很多。希望大家指正,也希望真正牛人们多多介绍自己的经验,我
会抽出时间来帮助你们整理,然后奉献给大家。