每一滴雨水里,都有海洋的气息;每一颗石子里,都有沙漠的影子。所以诗人才说:一支三叶草,再加上我的想象,便是一片广阔的草原。走在秋日的田野上,我想起一位诗人对老托尔斯泰的叩问:一切成熟了的都必须低垂着头么?

转眼三个月过去了,大熊在公司工作表现得非常好。干好本职工作之外还经常帮其他同事解决技术问题,并且经常在业余时间主动帮助项目经理整理文档,很用心地研究项目需求的每一个细节。大熊从锐哥那里学习到的知识每次都总结在自己的一个小本子里,抽时间就温习一遍,尤其锐哥讲过的“上善若水”水的特性对大熊的影响尤为深刻,每看一次都领悟到很多新东西。几个月下来大熊长进和成熟了很多,并且技术也提高得很快,又得到了同事的好评。

软件公司里程序员流动性非常大,由于项目组小组长责任心不够,编码质量差,更没有一个好的编写架构,以至于项目第一阶段上线出现很多严重Bug,给客户造成非常大损失,所以项目没做完就离职了。大熊竟然被项目经理提拔为项目小组长,带领3个新人继续做项目。这使他心里忐忑不安,不知怎样做才能更好地、保质保量地完成项目,才不至于重蹈覆辙?

时间:11月01日 08点 星期六 地点:锐哥家 人物:锐哥、小蔡、大熊

周末一大早,大熊又风风火火地跑到锐哥家,一进门就扯着嗓子喊开了:“锐哥,小蔡在不?”“嘘~小点声儿,小蔡还没起床呢,让他多睡一会儿,这几周复习功课把他累坏了,前几天刚考完清华大学的工程硕士。”“哦~看,锐哥我给你带什么来了?”大熊拿出一个卷轴,从里面取出一幅画。“啊~~郑板桥四季竹碑拓!太好了,大熊你从哪儿搞到的?”锐哥情不自禁地兴奋起来。“锐哥真厉害,一眼就认出是郑板桥四季竹。是我父亲出差到陕西,办完事后绕道到北京来看我,我看到他带了这幅画,知道锐哥喜欢书画,我就慢慢地磨叽,终于从老爸那里‘磨’过来了。”

“太好了,非常感谢你。听说郑板桥的‘四季竹碑’在道教祖庭楼观台,是陕西非常著名的名胜地,还有老子炼丹炉、上善池和老子亲手种的银杏树什么的,都很有名!可惜没亲身去过。”

小蔡被锐哥的惊呼吵醒,晃晃悠悠地从屋子里走出来。一脸还没睡醒的样,揉了揉眼睛道:“大熊拿来的这幅画真不错,我就知道中国水墨画比西方画有生命力,但说不出来为什么,似乎水墨与所画之物有很大的联系?”

锐哥:“呵呵~何止是有联系,是联系得非常密切。记得在情商里提过,老子的‘上善若水’。最好的东西是莫过于水了,水的品质非常高尚,它可以居卑处危。低下的地位,一个小河沟它都可以过去;又能容百川,有巨大的力量,天下之至柔,驰骋天下之至坚。中国画是用水墨,水蘸了墨,虽然没有涂颜色,它会使你感到春天的绿、秋天的黄、冬天的白。只有黑白,从宇宙角度来讲,它也逃脱不了黑与白。

“当欣赏画的时候,你也不能只看到黑,更要注意它的白。老子哲学里有,知其雄而守其雌,知其白而守其黑,笔墨加上宣纸就是黑和白,笔墨到纸上它的渗透过程,是水在起作用,这个水是中国画的生命,而这个水墨,又渗透到宣纸的后面。而油画,你拿个油画笔在那儿画,它能渗透到油画布后面去吗?油画笔是化工产品,它没有那种生命的联系,而中国的笔墨纸,存在着生命的内在联系,它到了纸上,水墨是那样的融洽,升华出那么多美的东西,那种独特游离的意境,使你能体味一种精神力量,所以说中国画也是哲学的,了解大自然才能了解中国画。”

大熊:“锐哥说得很好。郑板桥的画看上去是不错,不过我却不清楚它到底好在哪儿?”

锐哥笑道:“你看他画的竹子生动、有感染力、清新、俊逸。他画竹经过了认识和体现的三阶段:看竹、体会竹、写竹。意思是说在画竹过程中,心中之竹已经不是眼中之竹,笔下之竹又不是心中之竹。这与西方很大的不同。比如说,你如果叫西方人画个西瓜,眼中是西瓜,和心中西瓜一模一样,画出来的西瓜和西瓜一模一样,光线都没差。眼中之瓜即心中之瓜,即笔下之瓜。他画的西瓜会产生食欲。

“而中国人徐渭画的葡萄,你会产生食欲吗?不会。他以饱含水分的泼墨写意法,几个叶子,潇洒跌宕,水墨酣畅,葡萄珠的晶莹透彻之感,显得淋漓酣畅,非常有神韵,可不会产生食欲。能够引起人们食欲的画有可能不是太好的画,能够引起人们精神感发的绘画才真正有意味。中国画有一种游离,它非关乎理,都要和理有所游离才是高手。你看水墨间寥寥几笔便承载出非常丰富的内容,再看中国的诗词(诗中有画)和文字(象形,文字类像)无不都包含了很大的深意,因为‘简易’才有承载了大量的信息!它反映的是事物存在的本质,这是一种高度抽象的境界,直接反映所对应对象的本质。这是西方文化所不能及的。”

听着锐哥慷慨激昂的解说,小蔡和大熊也感到非常兴奋,都有一种对中国传统文化的无比自豪感。

锐哥话锋一转继续说:“这种抽象能力是认识事物从现象到本质的能力。就像上面绘画所说的那样,如果你只是停留在‘见西瓜是西瓜,见葡萄是葡萄’的层次,客户说什么,你就做什么,在设计上让你怎么做你就怎么实现,代码质量和结构也就很难得到保障,从来不过问为什么,也不去想是否满足了用户哪些方面的需求。这样可能只能解决了表面问题,可能会引起返工。

“认识到本质,才能让你的程序具备更大的灵活性和扩展性。在软件开发中,抽象能力体现为对问题域的理解能力,对领域模型的抽象。合理的抽象也是代码重构的前提,每一次重构,都是向更好的抽象迈进了一步。这是一个优秀高级程序员所应该具备的能力。”

小蔡:“我知道抽象是从众多的事物中抽取出共同的本质特征,而舍弃其非本质的特征。例如苹果、香蕉、葡萄、西瓜等,它们共同的特性就是水果。得出概念的过程,就是一个抽象的过程。在C#语言中也有抽象(abstract)类和接口(interface)。”

锐哥:“是的,人对世界的认识,实际上就是一个不断‘抽象’的过程。这种抽象思维就是在不同中找相同,在变化中找不变。把这些相同的和不变的东西理解为共性。而共性的东西是能够共用的。

“提高抽象思维的能力就是提高抽取不同事物的共性的能力,不同的事物不仅仅是包括现实中具体的事物。引入到编程语言里:抽象类是一类事物的高度聚合,而接口是定义行为规范。聚合(抽象abstract)<——>分解(接口interface)。例如,狗是牧羊犬、黑贝等所有狗类的抽象;而对于“叫”的动作,狗也可以叫,鸟也可以叫,这便是行为需要按照接口来完成。合格的高级程序员应该具备很强的设计能力,而设计能力是结合了数据抽象和代码抽象以及语言映射能力到现实问题的解法的能力。

程序员的技术能力模型

“编程语言30% +抽象能力(数据结构50% + 对现实事实的抽象理解能力10% + 设计模式能力10%)70% = 100%。”

大熊:“技术能力模型?太棒了,听锐哥这么一讲,让我有了技术提升的方向,感觉抽象能力太重要了,那么具体体现在哪里呢?”

锐哥:“抽象能力就是发现事物之间相同点或隐含联系的能力。抽象能力具体体现为设计能力:

“将用户的需求提炼抽象为计算机描述→设计一个高效扩展的系统架构→应用设计模式等去实现代码级的抽象→得到更高的复用性。

“数据结构能力(逻辑能力)则具体体现在代码的实现上:高质量的代码需要很强的逻辑性,逻辑严谨,Bug就少;在一些对代码执行效率要求严格的应用上,好的算法实现更需要好的数据抽象能力,数据结构就是对数据逻辑的一种抽象。抽象能力本身是一种思维能力,也就是说,你只有不断地进行思维锻炼才能获得。具备了这种基本的抽象能力才能写出高质量的代码,从而设计出好的软件系统。

“相反,如果不具备这种能力,或者能力较弱,写出来的代码、设计出来的系统肯定是问题百出。数据结构正是前人在思索问题的过程中所想出的解决方法。打个比方,如果每个人都懂得英语的语法与基本类型,但是对于同样的题目,每个人写出的作文水平却高低不一。程序设计也和写英语作文一样,虽然程序员都懂得语言的语法与语义,但是对于同样的问题,程序员写出来的程序不一样。有的人写出来的程序效率很高,有的人却用复杂的方法来解决一个简单的问题。”

小蔡思索了一会儿说:“我们是否可以这样理解:抽象使高层置为顶端,面向对象就是一种抽象,这种抽象使我们看不到我们不想用到的事物的一些方面,而把那些我们能用到的事物的方面用来作为描述此对象的全部,接口是关于如何应用对象提供的服务的全部抽象。如果说面向对象是代码级复用的机制,那么接口是二进制级真正的复用机制,接口把一个系统的可用部分按不同的形式透露给复用者,抽象使高层置为顶端。”

锐哥笑道:“不错,孺子可教也。没想到小蔡领悟得这么快。”

大熊:“那为什么在软件公司很少人提起过数据结构呢?听锐哥这么一说,我才知道数据结构的应用真是太重要了。我们该怎样才能学好它呢?”

锐哥:“这也是国内软件行业的普遍存在的一个误区,绝大多数程序员都很浮躁,认为数据结构离自己很遥远,工作中用不上,实际上这种数据抽象能力才决定技术将来达到的高度。如果没有很好的心态面对自己的职业,把这种心态问题提升到编程,提升到认识论的高度,就只能达到养家糊口的状态如果着眼点放在生存上,也许就永远停留在维持生存的状态。

“所以,很多程序员基本功不扎实,以为能写一些代码,实现了几个数据库的存储过程能跑起来就是编程了,实际上与国际化软件质量与标准化有很大差距。但在国外知名公司,如微软亚洲研究院选人才就非常注重数据结构方面的能力。另外,我发现很多程序员都不清楚程序员技术能力模型是什么,所以缺少发展技术的方向。

“学习数据结构其实很简单:多练、多学、多看,不要被数据结构吓倒认为它有多难?我们通常用到的数据结构有:线性表、栈和队列、串和数组、树和二叉树、网状结构图、排序(Sort)、查找等数据结构等,除此之外,还有很多其他数据结构实例,需要大家不断总结。我们平时也应该经常锻炼抽象思维能力,经常把现实生活中的东西用计算机语言描述,例如:数据结构里经常提到的“抽象数据类型”,以时钟为例:时钟都有什么特点?可以显示时间;可以调时间。那么可以用这样的类型来抽象这个时钟:

class Clock

{

int hour; //表示时针

int minute; //表示分针

int second; //表示秒针

getTime(); //显示时间

setTime(hour,mimute,second); //调时间

}

“这样抽象化就结束了。实际上,很多事务的抽象比这个复杂得多,其实数据结构就是指抽象。另外要注意的是,在进行程序设计时,先确定相应的数据结构,然后再根据数据结构和问题的需要设计相应的算法。另外,我们无论选择哪一种语言,算法才是根本,掌控了算法,就掌控了任何语言的根本,以不变应万变。”

小蔡:“OK,我明白了。另外,抽象能力中的‘现实事实的抽象理解能力’和‘设计模式能力’分别占抽象能力模型中的10%,那么,它们分别都有哪些体现?如何应用到我们现实工作中呢?”

锐哥:“在软件工程学里有比较成熟的OOAD(Object Orient Analysis & Design,面向对象的分析和设计)软件开发方法。OOAD科学分析法体现的是‘现实事实的抽象理解能力’,以业务为中心来分析解决问题,不涉及求解方案。分析阶段所做的主要工作是理解问题和需求构模,将现实世界中的问题映射到问题域。OOAD包括‘设计模式能力’,反映计算机世界来体现现实世界。

 分析阶段主要是明确用户的功能需求,满足用户所需的系统部件及其结构。

 设计阶段则主要是确定实现用户需求的方法,即怎样做才能满足用户需求,并构造出系统的实现蓝图。

“OOAD方法要求在设计中要映射现实世界中(指问题域,如图5.3所示)的对象和实体,如程序员、汽车、项目实施人员等。这就需要在设计中尽可能地接近现实世界,以最自然的方式表述实体。所以,面向对象技术的优点就是能够构建与现实世界相对应的问题模型(桥梁),并保持它们的结构关系和行为模式。

“比如说,我们通常做的系统分析是在假定需求不变的情况下进行的,这样可以把企业的资源配置到最优的程度,但是企业的需求是变化、不稳定的,那么以变化的需求为基础建立起来的软件系统当然也就不稳定了。需求是项目的根本,既然需求都是不稳定的,那么何以建立起稳定的企业信息系统呢?”

小蔡:“我记得有一句经典名言:‘没有不变的需求,世上的软件都改动过3次以上,唯一一个只改动过两次的软件拥有者已经死了,死在去修改需求的路上。’用OOAD方法如何能解决这种需求不断变化的情况呢?”

锐哥:“我打个比方,采用OOAD开发的方法时需求不稳定,可分析出这不稳定的东西就是对象。世界都是由对象组成的,而对象都是持久的,例如动物、植物已经有相当长的时间。虽然对象也在变化,动物、植物也在不断进化。但对象在一个相当长的时期内都存在,动植物的存在时间肯定比任何一家企业长久。面向对象开发方法的精髓就是从企业的不稳定需求中分析出企业的稳定对象,以企业对象为基础来组织需求、构架系统。这样得出的系统就会比传统的系统要稳定得多,因为企业的模式一旦变化,只需将稳定的企业对象重新组织就行了。”

大熊:“锐哥的这一番话太及时了,让我有一种恍然大悟的感觉。记得荀子说过‘吾尝终日而思焉,不如须臾之所学也。’目前我正在负责项目一部分模块的需求分析和设计工作,正好借机会修炼修炼,技术能力模型给我指引了技术提升的方向,现在看来我与优秀的程序员有很大的一段距离,必须用功好好学习一下OOAD科学的软件开发理论,并注意锻炼自己的抽象能力。”

小蔡:“哈哈~大熊现在也能拽了,有意思。看来我们确实离‘优秀’二字相差甚远,有一句话说得好,‘给我一个支点,我可以撬起整个地球;给我一个目标,我可以撬起整个人生。’目标有了,需要我们一点一滴地去努力实现。我以前也看过经典GOF 23种设计模式,但是看着有些犯晕,‘设计模式能力’这10%的分数如果想拿到手貌似很难呀。”大熊在一边嘿嘿得意地笑。

锐哥笑道:“其实也不难,记得我以前跟你们说过学习任何东西就是抓本质,上面也提到过OOAD方法。其实,设计模式的本质就是使你的代码设计适应变化;精髓就是利用了面向对象的多态;宗旨就是要让你的程序尽可能重用。软件设计的一个最重要的指标就是‘高内聚、低耦合’,解耦也就成了软件设计的一个基本指导思想,目标就是将不变的封装易变的开放,其根本也是为了适应变化。所以设计模式中几乎所有的编程原则的根本目的就是适应变化。就程序员技术能力模型来说,GOF的设计模式是编程语言(30%)和软件框架之间的一座隐性桥梁。例如,如果采用敏捷开发,开发人员不会对一个庞大的预先设计应用那些原则和模式。相反,这些原则和模式应用在一次一次的迭代中,力图使代码及代码所表达的设计保持干净。”

大熊:“我听项目经理提到过GOF这23种设计模式,说它涵盖了很多软件架构师和设计师前辈们的经验,是将最常用的设计方法和模式都‘抽取’出来成为精华的核心代码,就像数学里面的公式一样。随后我也看了一下,但是随着里面代码和传递参数的方法绕来绕去,差点把我绕到火星去,比坐驴车还犯晕,有什么方法可以让我们较容易地学习它呢?”

锐哥:“你们可以先掌握OOAD思想和UML(如图5.4所示)的使用,要用功学习。另外,我发现在现实当中一直徘徊在语言层面的程序员不在少数,真正掌握比如.NET中接口或者抽象类应用的不是很多,经常以那些技术只适合大型项目为由避开或者忽略它们,实际当中.NET的接口或抽象类是真正体现.NET思想的核心所在。”

图5.4 UML表述示意图

锐哥说到这,随手写了一段代码说:“我们使用抽象能力模型找到这些设计模式的一些共同之处。

class Programmer

{

static void Main(string[] args)

{

ProjectManager s1 = new SeniorEngineer ();

ProjectManager s2 = new Engineer ();

s1.Export ();

s2.Export ();

Console.ReadKey ();

}

}

public abstract class ProjectManager

{

public virtual void Export()

{

Console.WriteLine("调用ProjectManager类中的方法!");

}

}

class SeniorEngineer : ProjectManager

{

public override void Export()

{

Console.WriteLine("调用SeniorEngineer类中的方法!");

}

}

class Engineer : ProjectManager

{

public new void Export()

{

Console.WriteLine("调用Engineer类中的方法!");

}

}

“你们看执行的结果是:调用SeniorEngineer类中的方法。调用ProjectManager类中的方法。

“当父类(通常为抽象类)对象ProjectManager引用子类对象SeniorEngineer,然后用ProjectManager去调用父类中的方法的时候,子类中从父类继承而来的虚方法如果采用覆盖(new去修饰)方式,实际执行的是父类的方法;如果采用重写(override修饰)的方式时,则实际执行的是子类的方法。这个是设计模式抽象的关键,如果不能理解这个原则,那么设计模式是很难看下去的,同时它也是组建多态的关键。

“因为我们常常要利用抽象类去引用子类来实现多态。当然,这只是设计模式中的一个小小应用而已,传递参数在设计模式中还比较常见,如int,string型参数,但在实际大型软件运用中这远远不够,有时候一个类、对象、属性都可以作为参数来传递。”

大熊:“哈哈~这真是太好了,真想快点回去试试,看看这招好不好使。锐哥说的那些真是太确切了,像是在说我似的,我就是接口和抽象类基本不用。”

小蔡:“设计模式像数学公式,大熊比喻得挺有新意,这让我想起上次锐哥讲的‘无为’之境界和编程之道。武功套路是习武的门径。新手要一招一式地练习套路,烂熟于心之后,熟能生巧,在实战之中即可见招拆招、运用自如,此时习武之人已从‘菜鸟’成长为‘大鸟’。‘老鸟’则没有套路,实战之中只有自然反应,然而一招一式浑然天成、恰到好处,似有似无、无中生有、无招胜有招。

“设计模式应用于设计,就好比武功套路。‘菜鸟’要一个接一个地学习模式,‘大鸟’能够活用模式,‘老鸟’则没有模式。设计模式的‘内功’是面向对象的基本原则。这些原则是‘神’,模式是‘形’。高手拼的是‘内功’,只有对面向对象基本原则有了深刻的领悟,才能用好设计模式,避免‘走火入魔’。这可能就是设计模式之道吧。”

锐哥哈哈大笑道:“小蔡比喻得很好,这确实很像修炼‘武功’之七层境界(设计模式步骤):能看懂设计模式的文章→能写一个设计模式的骨架→能编一个新的运用设计模式的例子→能在写代码的时候想到似乎有设计模式适合,在翻阅资料后找到了这种设计模式→在理解项目的需求后就能意识到哪里可以使用哪种设计模式进行优化→完全掌握了设计模式的精髓,灵活使用各种设计模式以及其变种→‘忘’掉全部设计模式,达到运用设计模式成为随心所欲,全是下意识的自然反应的境界,无变之变,这就是设计之道。”

小蔡:“锐哥总结得非常好。我们是否可以这样理解:抽象能力模型中设计模式也是一种抽象。在使用OOAD(包括设计模式)软件开发过程中,识别稳定的需求、识别核心的需求、识别概念性的需求、设计系统的架构、定义系统中构件之间的接口关系等都是抽象的过程,都是反应系统本质特征的过程。抽象的,才是稳定的,才是永恒的。抽象的反义词是具体,在.NET开发语言中,有抽象类、有具体类,具体类可以继承自抽象类,可以实例化;抽象类可以派生出众多的不同的具体类。所谓‘一生二,二生三,三生万物’。系统的稳定性体现在抽象类,系统的变化体现在具体类。抽象类的层次要高于具体类。系统因抽象而稳定,因抽象而生动。”

锐哥笑道:“小蔡总结得很具体!所提到的派生具体类的含义与《易经》中一阴一阳之谓道,道生一,一生二,二生三,三生万物的原理很相似。你们看‘简易、变易、不易’可以看做是《易经》对易理的高度抽象→易理对宇宙的高度抽象→‘简易’指变与不变都是‘道’的体现,自然而然而非刻意求变,万事万物都只是按其本性生生不息而已。

“所以,简易之理是对大自然万事万物高度的抽象;‘变易’是指‘变化’,任何‘生生不息’都是处在不断的变化之中,没有停止过,宇宙中的万物没有一样东西是不变的;‘不易’是指万事万物的变化都有其不变的本性,同时又有当变则变、不当变则不变的含义。宇宙中万事万物虽然不断变化着,但是却有一项永远不变的‘东西’存在,就是能变出万事万物的那个‘东西’,是永恒存在的,中国传统哲学里称之为‘道’。”

小蔡思索了一会儿说:“简易之理是对大自然万事万物高度的抽象?听锐哥讲过的编程之道似乎与《易经》有很大的联系,是否能说得再具体点?”

锐哥笑道:“恩~比如说,‘简易’表述的象都是宇宙万物变化的法则,如乾为天,天体运行,为最健之象,为金……;坤为地,为静,为土……;为厚德载物;离为火,为光明远大之意;震为雷,雷为动,为成才之木……;巽为风,风为无所不入,为弱木非成才之木……;艮为山,为停止,为阻碍,为土……;坎为水,为险……;兑为泽,为软金,为白,为口,为缺损……,所以,《易经》里包括高度的抽象力,抽象万物!

“其易数更为简易,《易经》中只讲一位数,而其诸数都是由1递增而来的。其计算方法只有两种,即加法和减法,因为万物的变化,不是增加就是减少。再说八卦和六十四卦演绎出了宇宙,社会和人生的无穷变化,而表现这些变化的仅仅是两个简单的符号;阳爻和阴爻,即今天计算机中的脉冲二进位,0和1,科学家用0、1两个符号,演变出无穷的信息数据。这正是愈是简单愈有变化的功能,愈是复杂的变化,其法则愈是简单。你们看看,是不是很像我们现代的计算机原理?0与1、阳与阴;一个是演变出无穷的信息数据,另一个是演变出万事万物!这种东西方科学的高度抽象性的不谋而合多么神奇!”

小蔡:“如果是这样,我们是否也可以把《易经》的八卦也当成一种计算机呢?具体怎么用我还没想好,既然原理是一样的,应该能行。”

锐哥哈哈大笑:“能想到这一点就很不错了!我们中华民族几千年的文化不是你很短时间就能想清楚的。我打个比方,5分钟后小丫会打电话找你,电脑出了问题,想让你帮她修电脑。”锐哥看到小蔡手里拿着一个U盘,同时有擦嘴的动作,顺口说了出来。

小蔡和大熊一阵狐疑,不知锐哥说的是什么意思。锐哥从果盘中取出两个苹果抛给他们俩笑呵呵地对他们说:“接好了,一会儿小丫还会让你们俩去中关村帮着买新电脑!”话音还没落,还没等小蔡和大熊反应过来,电话果然响了……

小蔡马上拿起电话,果然是小丫让小蔡去学校寝室帮她看看电脑。小蔡和大熊都感到太不可思议了,黏着锐哥非得让他解释清楚原因不可?

锐哥笑道:“我刚才已经把原理说得很明白了。小蔡当时问问题的时候,手里拿着U盘,《易经》里承载信息的东西为离卦,离为火,为电话,为信息;同时有擦嘴的动作,为动,嘴为兑卦,为说话;当然就是有来电话之象;离为美丽,兑为女孩,此像断定是小丫;兑为喜悦被离火所克,就是说小丫此时不高兴,兑为缺损,离又为计算机(与电和信息相关),现在又是阴历十月,为亥月,亥为水月克制离火,擦嘴也有修理兑缺损之象;所以说,我判定是计算机有问题了;离卦为三,兑卦为二(易经先天八卦数),加起来为5数,此时你手运动着,故而我判定大概5分钟后会来电话,综合起来这些信息判断:就是小丫5分钟后来电话,找小蔡修理电脑!”

大熊:“那为什么说,我也得去呢?小丫电话里没说呀?”

锐哥哈哈大笑道:“因为我刚才‘下意识’地拿了两个苹果抛给你们,你们俩‘下意识’地接到了,这种下意识也就是符合自然而然之道呀,这里就有数理,天人合一!苹果为圆形,所以为乾卦,两个苹果就为兑卦,合起来就是易经的《天泽履》卦,履着,行也。所以,你们两个人谁也跑不了,都有份!呵呵~你们说是西方的(阳)计算机厉害呢?还是我们东方的(阴)计算机厉害???”

小蔡和大熊二人惊呼:“晕了,这样也行!也太神奇了!”

时间:11月01日 13点 星期六 地点:小丫寝室 人物:小丫、小蔡、大熊

大熊:“小蔡,小丫的电脑是什么问题?你说锐哥提到的设计模式原则是什么?我一路上就想这个问题?”

小蔡:“好像是内存和显卡出了问题,我正在用‘排除’法进行测试。锐哥送了我一本书,你可以先看看,书上提到设计模式的原则:单一职责、开放封闭、里氏替换、依赖倒置和接口隔离等原则,设计模式都是围绕这些原则进行设计的,也是对设计模式抽象出来的原则。”

大熊:“这些原则你能给我简单介绍一下吗?”

小蔡:“你看我们现在修电脑比修电视简单多了。电脑坏了,更换一个板卡什么的即可,原因是电脑中的各部分都是基于相对稳定的接口,而且部件各有各的职责,不会相互影响,电脑本身就是非常符合设计模式的产品。电视机的修理没有这么简单了,没有什么部件是插件式的,会修电视机的人肯定明白其中每一个部件的原理。”

小丫在一旁笑着说:“你们俩呀学习都学迂腐了,连修电脑还不忘记编程。”

大熊:“哦,平时聚在一起的机会少嘛。呵呵!小蔡瓜技术功底比我好,多让他帮忙才是!”

小蔡心里暗笑,你个大熊,还挺识相,在小丫面前帮我码牌,冲着这点我就给你多讲点。

小蔡:“行啊,我就把我平时理解的简单讲一下,我们现在不是正在修电脑嘛!打个比方,单一职责(SRP)原则就是一个类应该仅有一个引起它变化的原因。你不希望因为电脑内存损坏而更换CPU吧,同样也不应该让一个类有多种修改的理由。

“开放封闭(OCP)原则就是类模块,对扩展开放,对更改封闭。你一定不希望电脑只有一个内存槽,加内存就要换主板吧,程序也应该能在不修改原先程序的情况下就能扩展功能。

“里氏替换(LSP)原则就是任何基类可以出现的地方,子类也可以出现。如果你买的DX10显卡不支持DX10特性,那么这个显卡一定没法用。如果父类的方法在子类中没有实现那就晕了。在程序的世界中千万别认为是鸟都会飞,先考虑清楚将会有哪些鸟吧。

“依赖倒置(DIP)原则就是要依赖抽象,而不要依赖具体的高层模块,也不应该依赖于底层模块,二者都应该依赖抽象。抽象不应该依赖于实现细节,实现细节应该依赖于抽象。针对接口编程,这样即使实现有变也不需要修改外部代码。其实,现在电脑的硬件、网络通信等都符合这个原则,比如USB接口、内存接口(SIMM、DIMM和RIMM等)、显卡接口(PCI、AGP、PCI Express等)、TCP/IP。

“接口隔离(ISP)原则就是不应该强迫客户程序依赖于它们不用的方法。花3000元买一个带拍照、听MP3功能的手机还是花1000元买一个手机、1000元买一个MP5、1000元买一个数码相机呢?买了前者的话手机动不动就要修,而且还不一定是因为不能打电话而修,买了后面三样的话,即使修也不影响其他设备使用,你说买哪个?”

“小程序就好像修电视机,一个人做自己就搞定了,即使重新做也用不了多少时间。几十个人以上的大项目如果要改一个需求需要牵涉所有人来修改,那么这个项目用不了多少时间就会因为维护成本太大,Bug太多而报废。”

大熊大乐:“小蔡比喻得挺形象,我明白了!Thank you!”

小蔡:“小丫的电脑显卡和内存坏了,得换了!”

小丫:“呵呵~不用换部件了,也不用什么模式,我就直接重新换一个新的电脑算啦!”

“倒~”小蔡和大熊顿时晕了,真让锐哥猜中了。

总结与提升

抽象类是一类事物的高度聚合,而接口是定义行为规范。聚合(抽象abstract)<——>分解(接口interface)。

程序员的技术能力模型:

编程语言30% +抽象能力(数据结构50% + 对现实事实的抽象理解能力10% + 设计模式能力10%)70% = 100%。

每个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动,核心是提供了相关问题的解决方案。

高级程序员应具备的素质技能

需求分析能力

需求分析是软件开发流程中非常重要的一个环节。对于研发项目的组织和管理者来说,他们不但要理解客户需求,还要具备把用户需求转化为系统设计的能力。

系统设计能力

高级程序员者必须能够掌握不少于两到三种的项目设计方法(比如自顶至下、快速原型法等设计方法),并能够根据项目需求和资源搭配来选择合适的设计方法进行项目的整体设计。

模块抽象能力和分解能力

高级程序员要有能够把整体系统进行模块化分解的能力,同时还要对分解产生模块的抽象能力的复用性进行考虑。

整体项目评估能力

作为高级程序员,必须能够从全局出发,对项目有整体的清醒认识,包括评估项目整体和各个模块的工作量、评估项目所需的资源等。

项目组织能力

包括工作的量化和分配能力、团队协调能力。没有量化就很难做到合适的绩效考核,而程序量化又不是简单的代码行数可以计算的,因此要求高级程序员能真正评估一个模块的复杂性和工作量。项目组内程序员的水平是有差距的,同时用户需求又在不断变化,高级程序员要有动态调整责权和成员工作状况的能力。一个技术水平高的人,未必能成为一个合格的项目研发主管,这方面的能力欠缺往往是容易被忽视的。

小蔡逗小丫玩(原来电脑是这样搞坏地^_^):小丫与黑客

一日黑客入侵了小丫电脑:“我控制了你的电脑!”小丫:“啊~怎么控制的?”黑客:“用木马呀!”小丫:“……在哪里?我怎么看不见啊?”黑客:“打开你的任务管理器。”小丫:“……任务管理器在哪?”黑客:……你的电脑下面!!”小丫:“‘我的电脑’里面没有啊?”黑客:“算了,当我什么也没做过。”“我已经控制了你的电脑!”小丫:“哦!”“害怕了吧?!嘿嘿~”

小丫:“来得正好,帮我杀杀毒吧,最近我的机子毛病很多耶!”黑客:“……”小丫:“你怎么总是在我电脑里随便进进出出的?”黑客:“你可以装防火墙呀!”“装防火墙,你就不能进入了吗?”黑客:“不啊,我只是想增加点趣味性,这样控制你的电脑让我觉得很没成就感耶。”“听说你会制造‘病毒’?!”“嗯!”“你还可以控制别人的电脑?!”“一般是的。”“那你可以黑掉那些网站吗?”黑客:“当然,没听到人家叫我‘黑客’吗?”“……哦~~~`我还以为那是因为你长得很黑……”“咣~~”

小丫:“你天天进来,不觉得很烦吗?”黑客:“是很烦,你的机子是我见过的最烂的一台了。”“不是吧,这可是名牌。”“我是说你的机子里除了弱智游戏就只有病毒了。”“哦~~那你看到我的‘连连看’了吗?不记得装在哪了,找了好久了耶。”黑客:“晕了~…再见!”

三天后,黑客:“嗨~~~我来了!”小丫:“好几天不见你,被我的防火墙挡住啦?”“哈哈,笑话,上你的机子比我自己的还容易,不是想我了吧?”“我是想请你帮一个忙?”“什么事?”“你能不能进入电力系统修改一点数据!”“你想干嘛!!”小丫:“求求你,帮我把我家这个月的电费消了吧……”黑客:“晕死!!”

一周后,黑客:“你死哪去了?!!!”小丫:“出去玩了几天啊,找我干嘛?”“我要找点东西?”“在我这儿找什么东西?”黑客:“病毒,找一条前几年的老病毒,只有你的机子上病毒保存得最全啦!”“怎么不说话?”小丫:“心情不好!”“谁欺负你了?”“我的一个Q号搞丢了,里面有我的网上初恋!”“这个简单,我帮你拿回来。”“拿不回来了!”黑客:“不可能,告诉我,多少号?”“呜~~~~就是不记得了。”黑客:“%……¥#@&*。”

小丫:“你是高手吗?”黑客“可以说是吧。”“高到什么程度?”“嗯,我无聊的时候就自己黑自己。”“哈,这个我也会!”黑客:“#¥%!你也可以?!”“是啊,一关机它就黑了……”黑客:“倒,你快要把我折磨死了!以后你自己玩吧~从此不相往来!”

小丫:“哼!不往来就不往来吧!小样,看明白谁玩谁了吧?”

高级程序员之抽象能力模型相关推荐

  1. 高级程序员到底长什么样子?

    我们的中国文化,对"面子"看得特别重,所以你会发现身边到处都是高级 XXX,听着倍儿有面子,程序员也不例外. 但是你真要问每个人,你认为的高级 XXX 是什么样子的,估计每个人都有 ...

  2. 高级程序员和低级程序员

    低级程序员或许一辈子就是打杂,一辈子写着数据库的增加删除修改,一辈子写着分页界面,简单jsp或者html,简单配置一些配置文件. 稍微高层次的就是了解tomact,nginx,发布相关web项目,中级 ...

  3. 计算机技术与软件专业技术资格 高级程序员,计算机技术与软件专业技术资格名称及岗位基本任职条件...

    超越梦想: 计算机技术与软件 专业技术资格名称及岗位基本任职条件 专业资格名称对应专业技术职务等级学位或学历 要求资历要求 信息系统项目管理师.系统分析师.系统架构设计师.网络规划设计师.系统规划与管 ...

  4. 从高级程序员到 CTO 的 4 次能力跃迁!

    见字如面,我是军哥! 常常会被问到这样的问题,CTO.架构师.技术经理和高级程序员到底有什么区别呢?多大规模的技术团队应该配备什么级别的技术负责人呢?被问多了就想梳理思路写下来,另外文末有今天晚上直播 ...

  5. 高级程序员要有动态调整责权和成员工作状况的能力

    没有量化就很难做到合适的绩效考核,而程序量化又不是简单的代码行数可以计算的,因此要求高级程序员能真正评估一个模块的复杂性和工作量.项目组内程序员的水平是有差距的,同时用户需求又在不断变化,高级程序员要 ...

  6. 初级,中级,高级程序员需要具备的能力

    1:团队精神和协作能力 把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备的最基本的,也是最重要的安身立命之本.把高水平程序员说成独行侠的都是在呓语,任何个人的力量都是有限的,即便如linu ...

  7. 大家在寻找的高级程序员到底是什么样子的?

    你好,我是Z哥. 这篇文章主题很简单,就是一个很常见的话题"什么是高级程序员?". 文章稍微长了些,但是很容易阅读. 我们的中国文化,对"面子"看的特别重,所以 ...

  8. 为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要1...

    为什么80%的码农都做不了架构师?>>>    为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要10k的薪水?   由于目前国内嵌入 ...

  9. 做为一名java高级程序员,需要了解哪些岗位?

    一.Java高级程序员 要想成为JAVA(高级)程序员也称Java高级工程师,肯定要学习JAVA.一般的程序员或许只需知道一些JAVA的语法结构就可以应付了.但要成为JAVA高级程序员,您要对JAVA ...

最新文章

  1. git svn 疯子随想,续
  2. 并发编程之Synchronized原理
  3. Flink中的window知识体系与scala完整案例
  4. python中@staticmethod_Python中的@staticmethod和@classmethod的区别
  5. mysql查询时间提前五天_mysql选择月份查询该月有付款的数据(间隔x月并提前5天付款)...
  6. 消费者反映鸡蛋难吃后的37种回答方法
  7. C语言库函数的哈希表使用方法
  8. CFS三层靶机搭建及其内网渗透
  9. android RN开发环境搭建
  10. java newtonsoft.json_(转载)Newtonsoft.Json使用总结
  11. 推荐使用的JS日期时间格式化的方法
  12. 技术分享:印制插头侧面包镍金加工工艺研究
  13. poco for android,POCO桌面(com.mi.android.globallauncher) - 2.6.8.25 - 应用 - 酷安
  14. 摄像头之自动驾驶中的应用
  15. magic2怎样升级HarmonyOS,鸿蒙2.0怎么升级 华为鸿蒙新系统升级方法步骤
  16. 吉吉拍——线上线下购物的数字化抢拍平台
  17. 第二十章 使用系统监视器 - 定义系统监视器组件
  18. 谷歌浏览器查看token
  19. .NET Web Services服务
  20. Linux下应用进程消失原因分析

热门文章

  1. android 手绘地图,发现一款新App:「Pott」能一键制作你的手绘足迹地图,爱旅行的你别错过...
  2. python-flask(二)集成bootstrap、集成web表单、集成邮件发送
  3. 基于深度表征学习特征的抗癌肽预测
  4. java xmap_XML和Java Bean的互相转换攻略 【XMAP】
  5. 排序评估指标——NDCG和MAP
  6. 【容斥原理】【推导】【树状数组】Gym - 101485G - Guessing Camels
  7. java二维码生成 使用SSM框架 搭建属于自己的APP二维码合成、解析、下载
  8. 教你用matlab低版本打开版本simulink文件
  9. 科学论文1-软件缺陷预测中基于聚类分析的特征选择方法
  10. [原创]-数据仓库ETL开发