程序员的自我修养

      虽然自己做了程序员快3年了,可是对于程序员的技术能力和成长实际上依然没有一个清醒的认识。有幸看到一些高手的指点,摘录了一部分,在这里和大家分享:

 

程序员的技术能力模型

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

 

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

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

 

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

 

学习数据结构其实很简单:多练、多学、多看,不要被数据结构吓倒认为它有多难?我们通常用到的数据结构有:线性表、栈和队列、串和数组、树和二叉树、网状结构图、排序(Sort)、查找等数据结构等,除此之外,还有很多其他数据结构实例,需要大家不断总结。我们平时也应该经常锻炼抽象思维能力,经常把现实生活中的东西用计算机语言描述。

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

 

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

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

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

 

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

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

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

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

 

 

面向对象开发方法的精髓就是从企业的不稳定需求中分析出企业的稳定对象,以企业对象为基础来组织需求、构架系统。这样得出的系统就会比传统的系统要稳定得多,因为企业的模式一旦变化,只需将稳定的企业对象重新组织就行了。”

 

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

学习之:经典GOF 23种设计模式

 

 

 

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修饰)的方式时,则实际执行的是子类的方法。这个是设计模式抽象的关键,如果不能理解这个原则,那么设计模式是很难看下去的,同时它也是组建多态的关键。

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

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

 

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

 

-----------------------------

设计模式的原则:单一职责、开放封闭、里氏替换、依赖倒置和接口隔离等原则

单一职责(SRP)原则就是一个类应该仅有一个引起它变化的原因。你不希望因为电脑内存损坏而更换CPU吧,同样也不应该让一个类有多种修改的理由。

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

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

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

 

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

 

总结与提升

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

程序员的技术能力模型:

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

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

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

需求分析能力

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

系统设计能力

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

模块抽象能力和分解能力

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

整体项目评估能力

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

项目组织能力

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值