从为何“万事开头难”谈大型网站应用设计——运用冥想
古语说:“万事开头难”。为何大多数人在经历过某件事后,都会更多的认可这个观点?
思考的方式分为两类,Positive Thinking和Negative Thinking。
做事的员工分为两类,By Mouth和By Hand。
万事开头难,运用28法则,通常是因为我们对于某件事的20%关注不足。比如说我们想做个小生意,就拿开个小饭馆为例,首先映入脑海的是这个地段开一个这样的小饭馆,每天能有多少客人。但是如何能开起来呢?租房、黑道白道都打点、原材料来源、大厨等等等等,这些都是“开头”的东西。只所以我们认为难,其实更多的是我们都下过馆子,但是却没有看到后厨里和柜台里需要干的事,更多的看到的是服务员上菜和把好吃抑或不好吃的东西塞进嘴里最后掏钱付账自己再核算一下到底这顿饭吃的实惠不实惠。所以,万事开头难往往是没有做足够的Negative Thinking。
到了coding阶段呢?情况就不同了,尤其是在互联网领域。常坐企业级开发的,需求是跟着客户变;而互联网产品,往往需求是随着自己变。所以做互联网应用架构和系统架构的第一步,往往是大量的Negative Thinking了。担心这里会有扩展,那里可能会出现性能瓶颈。所以一个看似简单,产品经理几句话就能描述清楚的功能,却需要一人月的开发时间。在软件开发界里donald说过“Premature optimization is the root of all evil”,这话怎么听怎么都有哲理,但是放在互联网领域,有没有人思考过这话的准确性?互联网产品hang掉2天,损失多少用户?相信有些经验的人很容易意识到。所以在互联网领域里,一个新产品的架构,又让如何迈出第一步变的更为艰难。是否在架构开始阶段,我们就很少或者根本没有去尝试过Positive Thinking呢?
换一个角度,看中国的软件产业。30+的仍在单纯的敲着代码奋斗在实战第一线的programmer,在国内有互联网领域有多少?答案是很多的:每一个成功的互联网公司背后,都有一大批的这样的人。这就是By Hand类型的。而中国更有多如牛毛的本来有希望冲击Top Ten企业的,总觉得自己潜力无限,却总感觉有劲使不上,为何?仔细观察一下,By Mouth的比By Hand的更受尊重、更具势力。
换言之,动嘴的比动手的,往往多的是编码和系统级的经验,不具备的是对问题的多维思考能力。从本质上分析,动嘴的在公司里,要背负着比programmer更多的精神压力——哪还有那么多精力把问题分析全面?
我见过很多动嘴很强悍,但是到了真强实干的时候,确实不咋滴的人。一步步的蚕食着每一个programmer的激情。当然,本文不在于批判这些,继续本文的题目,如何解决问题。
解决“万事开头难”有两个途径:第一个就是“把书读薄了,再把书读厚了”;第二个就是“去他娘的,爷不管这么多,就这样了!”
第一个途径主席也用过,就是啥时候蔑视敌人,啥时候重视敌人。先把产品功能看透——基本的IO瓶颈、CPU瓶颈、Storage瓶颈分析到,重要程度一排,差不多技术相关的选型就出来了,比如用什么样的DB(绝大多数互联网产品系统架构的第一步吧)、用什么样的存储、是否要用缓存、是否要做缓冲等等。然后倒过来,看那些点需要重点做——HA在哪些环节需要应用哪种方式做到什么程度,类似产品的成长趋势在预计情况下如何(运用72法则结合其他网站类似产品的演变速度再乘一个系数)做某几个环节的负载能力提升等等。
第二个途径,是个法宝,这是纯以人为本的,有点像赌博。但其实,这个赌博的成功率往往很高——原因也很简单,作出赌博这个action的出发点不是“完全没有头绪”,而是已经深入思考过,陷入了几种方案的抉择之中。这时候,人的因素体现的淋漓尽致,不同的人作出不同的选择迈出不同的第一步,之后的事,要么是对这个人的成长起了巨大的促进作用(可能是几个月后),要么就是对公司起了巨大的作用(互联网竞争要求最先占领制高点)。
那么这两个途径达到一个相对较好的结果的一个有利方式,根据我的经验,我认为是“冥想”。
冥想是清空脑子里所有其他的东西,从头到尾的把事情静下心来想个4,5遍的过程。每一个环节,它的内部细节,它的外部关系,全都考虑一遍。思维导图,这个东西最不好的一面就是它是单线程的,你无法从多个纬度顺着事态的发展快速的画出这个图来。而人的脑子,是可以并行的,从存储、IO、计算、编码、运维、运营、产品等多个角度对每一个环节都考虑一遍,一次性得到一张最终的图。
冥想,感觉用语言不是很好描述清楚。但是Positive Thinking和Negative Thinking,确实是能帮助思考问题的一个方式。
不要盲目的遵从负责技术的上级对技术方案提出的要求,不要盲目追寻书里、blog里、google里看到的“知识”,就像这篇blog里上面这些文字所讲的那样。