设计心得——粒度

一、思想的基础

大千世界,纷繁复杂。同样,计算机世界中,各种问题和解决方案等也是层出不穷。自古以来,有矛必有盾,只是矛和盾可能不是同期出现的罢了。那么在前面反复提到的,要形成自己的思想,怎么形成?这玩意不会从天而降,更不会啥都不干的突然就知道了。思想一定是从实践中来的,然后一定要到实践中去,二者缺少任何一个步骤,那么这个思想就不能说是正确的。
那么怎么从实践中来呢?就需要从实际的问题,实际解决的方法来。而如何看待问题,解决问题,就产生了一个新的问题。如何确定问题?问题确定后,如何解决问题?解决问题的思路是什么?如何正确的解决问题?最终形成什么样的解决方案?得到什么样的解决问题的经验等等。
最朴素的想法告诉我们,一个小问题,是可以很轻松的解决的。比如写一封信,做一顿饭。即使不会怎么做,也可以轻松的看别人怎么做或跟别人学习一下,就简单的解决了。这种经验型的实践问题非常容易被解决。但站到更宏观的视角,如果让你给一万人写信,给一万人做饭呢?这就需要抽象问题成为模型的能力。而难点就在此出现了,最基础的问题就是如何确定基础的抽象单元,也就是提到的粒度!
学过算法的朋友,一定会自觉的想起分治法,分而治之,分而求解,综合解决。对,这是一种非常典型的解决问题的方法,也是抽象的一种很好的思路。方法很好,但应用起来,问题多多。

二、粒度

粒度(颗粒度),在不同的维度上有不同的定义。在设计中,粒度指的基础设计单元的大小,或者说关心的基本单元的大小。一如它的名字,是小米粒大还是玉米粒大还是大米粒大小。粒度可以是一个层级的概念,一个设计的角度的颗粒度中,可能有另外一个颗粒度的概念。举一个例子,从分布式系统设计看,每个容器(或服务器)是一个颗粒度大小,而具体到这个系统的服务实现,可能一个功能就是一个粒度大小。当然,在更加具体的内容中,设计关心的颗粒度会不断的变化。

三、粒度的大小

正如上面的分析和定义,如何来确定粒度的大小?先扯开来,我们在现实的世界中经常会遇到这样的现象。一个人可以管理一个班,成为了班长,然后被提拔成排长,后来又提拔到连长,营长,团长。但大多数人会在师长的位置前停止前进。除开其它原因,一个重要的原因就是,管理的人数不是简单的加法,它会因为人数外溢增长到一定程度后,产生一种质变,而这种质变不是所有人能轻易掌握的。同理,管理一个公司也是一样,一个几人的小公司,说句难听的,是个正常人都能管理,而实际情况可能你不管理,它也没啥大问题。
所以,很多人设计一些小的程序时为什么得心应手,而到了大的程序,发现老的办法不灵了,原因就在于此。设计的思想没有跟上,其最根本的一点就是对设计的基础单元——粒度,以及粒度间的依赖,无法正确的进行处理。

四、如何确定粒度

在不同的情况下,粒度大小的选择是不同的;同样,不同的应用场景下粒度的选择也不同的;进而考虑,不同的时间后,可能同样的需求,粒度的选择也有所不同。所以粒度的选择是一个动态的、发展的不断变化的过程。这就需要设计者不断的去实践、探索和总结经验。不断的反思在实践中的得失并进一步的打破自己的知识蚕茧。
前面例子已经说明,对大多数的中小型项目,粒度选择并不是一种多么重要的问题,它只是一种解决问题的辅助方法。而且,即使选择不是多好,仍然不会对整个项目有多大的影响。但反过来,当面对一个大项目或面对多个团队共同协作的项目,粒度的处理就变得复杂。
所以,在一定量之下,粒度是一个辅助更优的手段;而一定量以上,粒度是一个成败的基础因素。
那么如何确定粒度的大小呢?整体可以考虑以下的情况:
1、理解实际的需求。特别是不熟悉不明白的业务需求,也即与技术不相关的业务,一定要吃透。这点在DDD设计中非常清楚的表明了它的重要性。比如,某项业务是以每笔交易为单元还是以每天的交易笔数为单元,这和实际的业务密切相关。另外,非技术以外的需求相当重要,明白的都明白。
2、考虑成本。这个非常重要,如果精细化管理的成本和批量管理的成本差不多,相信大多数人愿意进行前者的处理方式。但实际情况往往二者是成反比的,这就需要根据实际情况确定一个可以接受的成本线。当然,这个成本包括时间成本、人力成本等,不过最终转化仍然是资金成本。
3、考虑性能。性能其实是项目的根本,用户拿到首先看到的就是性能,如果用起来慢吞吞的,估计没人愿意使用。粒度的大小,对性能的影响非常大,这个有过开发经验的都知道,一条一条的存储数据和一次存储一百条甚至上千条,效率不是同日而语。
4、考虑关联和依赖。尽量把高度关联和依赖的相关实现确定在同一个粒度内。这个还是比较容易为设计者理解和接受的。但需要提醒的是,在技术层面好理解,不代表在业务层面好理解。如果二者混合在一起呢?这就需要根据实际情况来做取舍。
5、考虑易实现和易扩展、维护。项目的开发,其实就是一个整体的平衡,在某一方面的强需求,就一定意味着另一方面的弱需求。举一个大家熟悉的例子,苹果的大哥乔布斯,在发布前一夜要求重新设计和修改项目,这就是强需求,但发布日期和成本就变成了弱需求。粒度的控制也是如此。
6、根据实际情况,可以考虑实行多重粒度,即不同的模块中采用不同的粒度。这就需要设计者有着更好的抽象能力的设计实践能力。“桔生淮南则为桔”,做事情,一定不要僵化教条,死扣书本不会成功。
7、动态的调整粒度。在实际的设计过程中,可以根据实际情况,动态的调整初期的设计粒度。这个就相对来说好理解不好实现,毕竟调整就意味着成本甚至可能会出现意想不到的东西。自己根据实际情况来决定吧。

五、总结

学习设计就是从这些小的基础的东西一步步走过去的,不要妄想着上来就指挥千军万马并且打胜仗。甘罗八岁拜相,不谈真假,但几千年出不来几个。回头看看世界军事史,有名的军事家都是一枪一枪打出来的。没有人天生就是元帅。
软件设计亦是如此,实践出真知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值