56
下面,我们再来理解一下,软件架构包括哪些内容?
现在我们知道架构是一个基础设想,是环境里面系统的一个基础设想。我们已经接受了这样一个概念,这个设想是靠它的元素,元素之间的关系,元素跟环境之间的关系,以及指导这些元素设计和演化的这些原则,注意是指导系统的设计,而不是元素的设计。
是指导系统的设计和演化的一些原则,构成了我们的架构的内容。那么,一个架构有什么,一般来说,要从十个角度来讲述了架构的内容。
1,架构定义结构2,架构定义行为3,架构聚集要素4,架构平衡涉众需要5,一个架构体现基于准则的决策6,架构可以符合一种架构风格7,架构被其环境所影响8,架构影响团队的结构9,架构呈现在每一个系统中 10,架构拥有一个特定的范围
大家知道理解一个概念的时候,我们要从两个角度,架构是什么,它不是什么来谈论。因此,有必要,从这十个角度,来谈一谈。
57
1,架构定义结构
一个架构,定义了一个结构,一个架构体现了一个结构,因为我们每次一想到的架构就是一个结构。
理解完了这个之后,我们来考虑一个词。在很多年以前,C++程序设计语言被引进中国的时候,构造函数是一个重要的概念,那一个函数有什么重要的标志?
它一定要有返回值,但是构造函数没有返回值。如果我说构造函数的时候,我们说它首先是一个函数,它的功用是用来干什么?构造的。
我们再来看看架构,在中国也被称为体系结构。如果把其中的一个词“体系”给它砍掉,剩下只有结构,我们刚才的理解架构就是一个结构,这就不对了,因为它不仅仅是结构,所以,我为什么讨厌用“体系结构”的这个词,原因就在这里。
大家都知道,在设计模式里,有一个最关键的概念。比如说这里面,“重载“这个概念最重要的本质是什么?重载是这样一种,两份儿是一样的,那参数列表是不一样的,就是重载,绝大多数都是这么理解的,其实在设计模式里讲得非常清楚了,这个是不对的。
因为我们能举出来一个反例。
函数名是一样的,参数列表也是一样的,但它还是一个重载。如果这个概念能成立,就是说如果你认为重载是方法名是一样的,参数列表是不一样的,是重载。你认为它是重载唯一的区分标志,我给你举出来一个反例是,如果这俩方法名或者两函数名是一样的,参数列表也是一样的。那答案是就不对了,有没有这样的例子?有的,大家都知道,因为有些返回值是不一样,这也是重载,或者同样的方法,我放在不同的类下面或不同的名字空间下面。
重载的本质是什么?重载一定要发生在同一个作用域上,它一定要在同一个类里面才能存在重载。
所以说重载的本质要不能像你理解的方法名是一样的词,重载要是在一个类型里面,首先它的主语是要一样的,这个主语怎么决定是一回事,重载一定是与参数紧密连在一起的。
一个类型定了一个作用域,我跟你讲这些概念,目的是什么?
只是让大家意识到很多词,本来人家在英文里面挺好的,翻译到中文的书里面的话,狗屁不通,乱七八糟,胡乱一气,所以我们只是说在中国的教育里面,把它翻译成体系结构了,反正你就去想对还是不对,我们现在不能叫它是体系结构,你就跟着我一块叫软件架构,这就是国际标准。
这个“架构”很妙,它能够作名词讲,也能做动词讲。你那个体系结构,你怎么也不能作动词讲吧?妙就是妙在这里。只要是一个动作,它就有行为,这样我们就理解了一个架构,定义了一个结构。
58
2,架构定义行为
好不容易,理解了一个静态方面的概念,然后还要定义行为。这个行为是怎么定义?不同元素之间通过协作所产生的行为,一些更加细节的东西交互上都有,就是要怎么画交互图去表示它。
这是第二条,就是架构,现在我们得到的结果是架构定义了结构,定了行为。
后面我们还会讲架构不是什么,或者说我们在这个里面,要给大家建立另外一个重要的概念,是所有的教科书里面它不直接提出来的,但是我们要明确的告诉的,架构不是扁平的。架构不是扁平的,不是Flat的。
架构是一个什么?
架构是一个多维的,所以这是我们的核心。你理解了这个概念之后,就会理解一个更深刻的概念,要有蓝图,只有一个蓝图是不可能描述一个复杂系统的架构的,一个狗窝肯定弄一个图就能描述清楚,但是我们要建一个国际水平的高楼大厦,比如一个复杂系统的架构,是绝对不可能靠一张蓝图描述清楚的,否则你就像某些人一样,在这张蓝图里面把所有的东西全部给塞进去,到最后,以至于大家都搞不清楚自己想要的东西在哪里了。
那么,架构的核心是什么?
一定是围绕一个涉众关心的东西,把这个关注点,放在了一个核心的位置上。所以,首先要明晰的是,我想要的所有东西都在这了,如果一开始上面弄一堆不是我们要的东西,那就坏了。
59
3,架构聚集要素
另外一个我们要看到,架构它要聚焦在系统里面的重要的元素上。
给大家举的那个例子,某一个经理,是一个架构上重要的要素,虽然他只是一个经理,不是一个副总经理,但是他很重要。所以说,每次做任何一个决策的时候,先拿来套一套,看一下它符合不符合,他会不会坚决的抵制这个决策,如果要抵制我们就要考量一下,是违背他的心愿就干了,还是让他心情愉快点再干,这当然要考虑的。
这是我们的架构要聚焦在一些重要的元素上,怎么聚焦,怎么理解呢?
两种方式去理解,首先要找到架构上的重要元素,后面会通过用例的分析,通过边界类控制类实体类,这样的版型,来找到了这个元素。我们还会再去给它引进一些机制,机制来体现架构级别、设计级别,以及实施级别上,在每个不同级别的时候,它的内容是不一样的。
在分析级别上我们要给它附加一个分析机制,设计机制,以及实施机制把它合在一块,这就是架构上元素的架构机制。
那,究竟什么叫做架构机制?
我自己都开始晕了。我们举一个例子来理解一下。比如说,你找到了岗位这个类,那你一定会把它持久化,就是它的状态一定要保存起来。我们已经知道我们整个软件设计的核心是先找到这个元素的值,让它先担任部门的职责,找完这个部门职责就是定义元素的职责,再找一个交互图里面去平衡它的职责,我们建立了这样的一套软件设计方法,这就叫职责驱动的软件设计。
60
所有的面向对象的软件设计,说白了都是把这个思想具体化了一下,就是说设计师先有一个业务流程,业务流程里面画出来一些部门,并且定义部门的职责,那,这个部门可以把它当成一个分析类,定义它的职责,把它的职责再细化到其它的元素上去。
是先有职责,而不是先有整个的业务流程,业务流程上面的每个环节上都有一些职责,把它放在一个元素里面去,元素的职责多了还是少了,再把它放在一个交互图里面去平衡一下。职责确定下来之后,它要干什么了?它干这个东西的时候又依赖哪些东西呢?
整个软件设计,本质上来说是先解决功能性问题,然后再有一些非功能性的问题要解决,比如持续化等等,非功能性的东西怎么解决的?
我们的方式就是定义它的职责,平衡它的职责,在它上面给它加个机制,比如说元素要持续化。
把它的职责什么东西都给它分配好了,架构需要持续化是一个分析机制,它的状态需要保存,仅此而已。那如何持续化,从我们的思维方式来说,就是通过数据库这样的一种持续化方式。放到数据库里面就行了,而这就是实施机制。
我们做决策也是这样,先是在一个功能的基础上,它还有一些非功能性的需求要附着在上面。那状态保存,我用关系来持续化。第二步第三步就直接用数据如何持续化了。这就是我们架构分析的三个级别,架构机制分析了三个层级,我们叫分析机制,在设计基本上它就对应着设计机制,以及实施机制,实现机制。
61
注意我们刚才的区别,需要持续化,就意味着下面是用关系型数据库还是对象型的数据库,这就要做一个决策,对象型的和关系型的都是不一样的,最后直接进入数据库了,叫实施机制。我们整个的核心,会用真正而具体的方法论来演绎,使用分析和设计这套方法论,和架构有机地融合在一块。
为什么,我们需要理解架构的机制里面的关键概念?
比如说,当你跟人开会的时候,你要整明白是什么人跟你在开会,你就应该说什么样的话,我们知道很多人最常犯的毛病,一上来全是细节,对领导来说他时间有限,最关心的并不是那些细节,最关键的是那些核心的概念,还有最后一句话,可能才是领导想要的,结果领导听了你一大堆没用的东西,领导已经火冒三丈了,你说你不挨骂谁挨骂?
我们要抓住要点,因为我经常听到一些文科毕业的下属,汇报给我的方式把这个现象描述完了,我很累听到最后,发现没有重点,他只是在描述一个现象,这个人怎么样,那个人如何?最终我听完了,我得出了结论,那就是三个字。
你说我火不火,我的意思是你先告诉我这个结论,如果我没这兴趣,你后面就不用告诉我了,咱们交流沟通就结束了,我说你该再提炼一下,处理一下就完了。当然了,尤其是你在开一个重要的会议,你在手下有个重要的事,他也不好意思不向你请示,于是他帮给你打一个电话,就是在开重要会议的时候,接电话被发现会被扣300元钱的,但是呢,我也不知道紧急不紧急,所以,我只有冒着300块钱的风险,偷偷在桌子下来接听,有些人说了半天,三分钟之后,也没听明白你在说什么?
所以,很多时候学会沟通是一个很重要的本领。
那,什么叫分析?什么叫设计?架构要做的是什么?说白了设计要做什么?
架构是要做正确的事。设计需要正确地做事。
62
做正确的事和正确地做事,这是两个不同的概念,架构,就是要让你首先做正确的事,设计是再去正确地做事,实际上是借助于某个程序,设计语言,正确地做这件事情。
一个是要做正确的事,一个要正确的做这个事,我们要区分清楚这个概念,现在我们是在讨论怎么做正确的事情,我真不蒙你,很多技术人员,特别是刚从一个技术人员升级到部门经理上去了,就会遇到很多这类的问题,你可能会更多的讨论如何做这件事情,老板其实关心的是,需要什么投入一些关键性的东西,老板根本不太care如何做这东西。
你给老板列一堆堆的细节,有什么技术困难,老板不看这个东西的。比如,我们知道,事业部的总经理是真正的总经理,他关心的东西,肯定和我们关心东西显然是不一样的。
总经理它会关心什么?
他根本不关心整个什么设想,他只关心你要干什么,以及要干成的效果是什么,比如估计一下能赚多少钱,那,你需要哪些人物财力去支持。
架构,它要聚集这些要素上,要聚焦它的职责,聚焦它的关键性的机制。这个机制我们要分几个层级去考虑,你要意识到你在跟谁沟通这个问题,你就要相应的提高抽象度。
架构它的核心就是要通过提高抽象度,来简化整个复杂性。要均匀平衡这两个原则,就是说要提高抽象度,分层次的进行一些关注点的分割。
63
因此,架构,它一定是一个平衡了不同涉众需要的一个结果。
我就问你们一个问题,需要和需求有什么区别?
很多人都把软件需求课学完了,我说你学完了这个,请用你学到的关键性的思想来概括它的区别。比如,你学完整个软件需求之后,能不能用几句话概括一下这门课,帮你解决了哪些关键性的问题?
绝大多数人是说不出来的,因此,沟通的时候,实际上有一个最重要的问题,就是对方这个人是谁,他有什么性格,大家怎么去理解?中国的名著里面,把中国人的性格研究达到了顶端,有一个最大名著之一的《西游记》。
大家想唐僧等这四人也是四人帮,四人帮就代表了四种性格。你们看这个唐僧是什么型的?孙悟空是什么型的?这四种性格,有人也把它怎么分呢?
四种性格对应的西游记人物,比如,猪八戒——活泼型,唐三藏——完美型,孙悟空——力量型,沙僧——和平型。其实,你要了解到,人和人是不一样的,不了解对方是谁,怎么沟通?
四种性格对应的西游记人物:
1猪八戒——活泼型
活泼型性格的人热情、奔放、豪迈、幽默、健谈、能言善辩,他们富于浪漫主义情怀,善于与人交际,惹人喜爱的个性使大家自然而然愿意跟随他们。但是他们通常容易以自我为中心,情绪化,总是叽叽喳喳说个不停,记忆力不好,经常丢三落四,变化无常,很难真正成功。
在西游记人物性格中,猪八戒是活泼型性格的典型,他是团队中的开心果,让团队有活力,给大家带来快乐,起着一种催化剂、调节者的作用。在团队中,活泼型性格的人可以在看似枯燥的工作中寻觅到自己的快乐,给团队带来活跃的氛围。
2唐三藏——完美型
完美型性格的人与活泼型性格的人形成两个极端,他们不会像活泼型的人一样情感外露,相反,他们深思熟虑,善于分析,对自己和别人都有着很高的要求,注重生活细节,追求完美,坚持不懈。但是他们通常让人觉得阴沉,没有活力,消极,很容易受到伤害,没有安全感也缺乏幽默感,总是给身边的人造成很大的压力,敏感并且多疑。
在西游记人物性格中,唐三藏是完美型性格的典型,他是团队中的领导者,是团队凝聚力和号召力的核心,也是团队目标的始终贯彻者。在职场中,这一性格的人执着于自己选择的事业,能够切实地做好规划,有目标有方向,是一个团队的领头人物。
完美型和活泼型既是最佳搭档也是天生的宿敌,他们能相互弥补也会相互指责,互相看不顺眼,如果能相互磨合到融洽相处的时候那是最完美的一对,此法亦用于婚姻,他们会在人群中相互吸引,到一定程度又会相互排拆,如果一个人同时拥有第一性格为完美第二性格为活泼,称为纠结型人格,他(她)会在完美与活泼中相互转换,性格无比变化无常。
3孙悟空——力量型
具有力量型性格的人在工作上他们总是显得很有活力,富于冒险精神,充满信心,他们意志坚决、果断,一旦认准目标就绝不放弃,他们是天生的工作狂,设定目标后,就行动迅速地全身心投入到工作中,同时力量型性格的人善于管理,能纵观全局,知人善任,能合理地委派工作,寻求最实际、最适合解决问题的方法。
但是他们有很强的控制欲,固执地认为自己总是对的,不能容忍别人的缺点,不会主动道歉,霸道,控制欲强,骄傲而自负,自以为是,人际关系处理不佳,易发火。在西游记人物性格中,孙悟空是力量型性格的典型,他是在团队中执行能力强,富于创新精神,能够推进团队的建设和发展。
4沙僧——和平型
和平型性格的人善良、忠厚、随和、镇静,善于分析,富有韧性,坦然自若,对任何事情都有耐心,他们很细心,做任何事情都面面俱到,不会让别人感到被冷落,他们不喜欢张扬,不爱唠叨,其他性格的人都愿意找和平型性的人作朋友。
但是他们容易墨守成规,不喜欢改变,没有主见,多愁善感,优柔寡断,懒惰,不会对身边的人说“不”,他们不喜欢行动,不善于争取机会,自信心缺乏,创造力不强。
所以,我们和别人沟通,还是要先看别人是谁,有什么样的性格,他所坚持的思想观念(三观等)是什么?
只有了解了这个,你才能谈得上有效沟通,否则,更多时候是各说各话,公说公的理,婆说婆的理,对于一些问题,纯粹是浪费时间。
当然,也有人说《西游记》中这四位人物,孙悟空:绝对值较高的单老虎,猪八戒:孔雀+一点点孔雀,沙僧:考拉+一点点猫头鹰,唐僧:老虎+考拉。
老虎型的,考拉型的,还有一个还有猫头鹰型的,就说最后一个是孔雀型的,这里面有什么区别?
如果你的总经理是一个孔雀型的,算你倒霉,它经常是跳跃性的思维,今天布了一个任务,你把它干了半天,老板说咱们先看干干看再说,他不管能不能干,先干了再说,当你干得差不多了,他这事早忘了,然后还怪你不干正事,因为他就是随口说说,早就不想这事了。
孔雀型的人去做了市场部的经理,全部都被它害死了。全部门都法没带了。今天刚执行了一个计划,执行了半天不执行了,咱们现在换一个计划,咱们再去干嘛,干着干着,又换了,全部都害死了,公司非被他搞倒闭不行。
64
所以说这个沟通,至少要注意两点,你和谁沟通,然后你要谈的是什么?
你首先要注意一下你的谈话对象,这家伙是什么性格的,再搞清楚它什么风格型的,是个完美性格的,还是个知识型风格等等之类的,你就知道跟他说什么话了,拍人马屁的,你要拍也要拍到马腿上了。
要拍到谁的腿上?至少得是那个孔雀的翅膀上。
这种孔雀型的人就喜欢拍马屁,拍它,你真行,你真能干,你真牛,你要鼓励它,这种人是需要别人赞美的,她才有信心去把事能干好,比如你老婆,时不时的给她来点浪漫的,她就屁颠屁颠的,心甘情愿的,全心全意的去为你干活了。
男人的秘诀,现在你老婆在干活的时候,天天不停在旁边鼓励你真行,你真能干,你真漂亮,不管真心还是虚心假意,反正我敢保证,你的家庭肯定和睦得不得了。你这样搞,任何女人都受不了,把你爱得死去活来的,当然了,也有一些冷血女人也不要怕,一团烈火,总归会把寒冰,融化、气化的!
唉,这也许是马屁能量的威力之处吧,但,这只是针对孔雀型的人格有效,如果是其它性格的人,恐怕人家要做呕了,如果只拍马屁,一味奉承,一味压低自己人格,把自己当成一条哈巴啥,只会匍匐在地上跪舔,那恐怕也是一幅小人状了,这样就没意思了,要拍也得拍到点子上,不然,人家就会把你当成一个虚伪的人了。
因此,还是要看对象的,这只为了有效沟通,和什么正能量负能量无关,人人性格不同,层次不同,因此,他们看世界的眼光不同。我们只是看菜吃饭,这也谈不上正直,善良,什么高尚低下的人格,而是说,你要和人家交流,要明白对方是谁,他的性格是什么,这样才能更好的交流沟通下去。