前段时间看到一篇文章是关于软件技术人员发展的问题,文章中的一个观点就是软件技术人员的技术经验无法进行升级,让我有很大的感慨,于是就产生了写出一些个人对软件技术人员升级的一些想法.因为是第一次写,所以比较杂乱,有兴趣的朋友请看完全文,其实很短.^_^
软件是一个抽象的产品,软件价值的评估标准不同的公司有不同的标准,但是按照马克思的价值论,商品的价值是凝结在商品自身的无差别的人类的脑力和体力劳动.软件的价值就应该是凝结在软件上面的软件人员的脑力劳动和体力劳动.这就带出了一个问题,软件人员的价值的问题.实际上软件人员有很多不同的层次,有项目管理人员,系统分析人员,系统架构师,软件设计师,软件工程师,软件编码人员也就是常说的代码工人等,这里面最容易混淆的是软件设计师,软件工程师和软件编码人员,相当多的企业是把三者当作一个岗位来实行了,统称为软件开发人员,于是就造成了三者价格的差别不大,这也是目前中国软件业发展最大的弊端.无差别的劳动收益会最大的打击人员的积极性,这是无须讨论的事实,但是在软件行业上软件设计师,软件工程师和软件编码人员三者却是混淆的使用,于是所谓的软件开发人员做着一部份软件设计师的工作,做着一部份软件工程师的工作又做着一部份软件编码人员的工作.可能拿着软件工程师的工资,也可能拿着软件编码人员的工资(当然也有可能拿着软件设计师的工资,但是这种可能性很低,因为工作价值决定了劳动价格).这样就无法从性质上确定出人员的价值,而人员价值的不确定性必然影响人员的工作质量和工作激情,也就必然影响了软件的质量.这就是中国软件质量无法保证的根源.而从另一个层次上说,三者混淆带来的更大问题是人员无法得到提升,一个进入软件行业的编码人员在经过若干年的工作后,依然感觉不到自已的提升,因为他只感觉到他就是开发人员.没有本质上的区别,就产生了所谓的30岁问题,于是纷纷的进行转行.这样就使得整个软件的水平一直都是青黄不接.也是中国软件业无法得到整体升级的关键.
问题的解决方案就是当然区别出三者的不同,制定出不同的岗位和待遇要求.那么现在的问题就是如何区分三者呢,三者之所以会混淆很大程度上就是因为没有标准来区分.笔者认为,三者的区分可以参照软件生命周期来分别,在软件的生命周期中有几个主要的阶段,项目立项和可行性分析,需求分析,概要设计,详要设计,编码,单元测试,集成测试,功能测试,压力测试到用户测试等.其中所谓的软件开发人员常需要参与的阶段是,概要设计,详要设计,编码,单元测试以及其它测试阶段的支持等.但是实际上概要设计和详要设计的工作主要应该是设计人员的工作范围,而编码和单元测试主要就是编码人员的工作范围,而软件工程师最主要的工作范围应该就是帮助设计人员实现模块设计,同时指导编码人员进行开发.之所以需要这样是因为经常性的软件的设计根本无法和具体的编码结合在一起.而程序的编码也无法反映设计,一但需求发生改变,设计人员无法知道程序更改的影响范围,而编码人员对程序的改变也无法从整体上有很好的把握,于是代码的问题就出现了.而软件工程师因为参与设计的同时又参与了编码.所以可以很好的体会设计上的整体要求.这里说的设计最终结果不仅仅只是产生设计文档,有可能是直接产生接口代码和模块框架.而这些代码的编码应该主要是依靠软件工程师,同时软件工程师也需要负责Code Review工作,因为这一角色一般是有几年的编码经验,代码质量较高,对系统的了解也比较熟悉,可以更好保证程序质量.设计人员的另一个任务是设计出测试的测试用例和测试数据,而软件工程师则需要准备出具体的测试用例和测试数据并指导编码人员进行单位测试.这样从职责上进行的区别可以使人员更多的关注于自身的任务,同时也可以感觉到不断的提升,编码人员在经过技术的积累和编程经验的提升可以成长为软件工程师,而软件工程师在加深对软件设计知识和系统业务知识的积累也可以成长为软件设计师,同时也可以向着管理角色成长,成为一个团队的Team Leader,这里插入一句,笔者认为的Team leader应该是一个管理职位而非技术职位.他应该是向项目经理负责,对团队中人力资源,任务安排,风险控制,环境配置以及团队内外的沟通进行管理.笔者认为软件设计师和Team leader的待遇不应该有太大的区别.两者的区别有点类似于军队的政委和连长的区别一样.呵呵
回到人员提升的话题,软件设计师可以向着两个方向转型,其中一个是系统架构师,这应该是负责整个系统上面的框架的设计,关注点是系统的非功能性需求(如性能,质量,架框升级等)即技术需求,另一个方向则是系统分析员,这则更多的关注在系统的功能性需求.而项目经理,系统分析师,系统架构师是整个软件项目在三个不同层次上的分工.三者只有工作职责的区别而不应该有等级的区别.当然如果有些公司有更好的职业设计的话,其实应该还可以加上技术专家,和资深顾问等.这两个职位是跨项目的,前者是对项目出现的技术难点负责解决,后者则是对项目的业务知识进行分解,培训人员的业务知识.当然这两个职位也应该有渠道让编码人员可以一步步成长起来.
以上是本人从事软件开发几年来的一些想法,可能存在着很多不成熟的地方,但是希望能够与各位分享,更重要的是希望更多的软件企业管理者能够对企业内的人员提供职业规划,这样才能留住更多的软件人才,使整个中国软件水平能够得到更大的提升.
软件是一个抽象的产品,软件价值的评估标准不同的公司有不同的标准,但是按照马克思的价值论,商品的价值是凝结在商品自身的无差别的人类的脑力和体力劳动.软件的价值就应该是凝结在软件上面的软件人员的脑力劳动和体力劳动.这就带出了一个问题,软件人员的价值的问题.实际上软件人员有很多不同的层次,有项目管理人员,系统分析人员,系统架构师,软件设计师,软件工程师,软件编码人员也就是常说的代码工人等,这里面最容易混淆的是软件设计师,软件工程师和软件编码人员,相当多的企业是把三者当作一个岗位来实行了,统称为软件开发人员,于是就造成了三者价格的差别不大,这也是目前中国软件业发展最大的弊端.无差别的劳动收益会最大的打击人员的积极性,这是无须讨论的事实,但是在软件行业上软件设计师,软件工程师和软件编码人员三者却是混淆的使用,于是所谓的软件开发人员做着一部份软件设计师的工作,做着一部份软件工程师的工作又做着一部份软件编码人员的工作.可能拿着软件工程师的工资,也可能拿着软件编码人员的工资(当然也有可能拿着软件设计师的工资,但是这种可能性很低,因为工作价值决定了劳动价格).这样就无法从性质上确定出人员的价值,而人员价值的不确定性必然影响人员的工作质量和工作激情,也就必然影响了软件的质量.这就是中国软件质量无法保证的根源.而从另一个层次上说,三者混淆带来的更大问题是人员无法得到提升,一个进入软件行业的编码人员在经过若干年的工作后,依然感觉不到自已的提升,因为他只感觉到他就是开发人员.没有本质上的区别,就产生了所谓的30岁问题,于是纷纷的进行转行.这样就使得整个软件的水平一直都是青黄不接.也是中国软件业无法得到整体升级的关键.
问题的解决方案就是当然区别出三者的不同,制定出不同的岗位和待遇要求.那么现在的问题就是如何区分三者呢,三者之所以会混淆很大程度上就是因为没有标准来区分.笔者认为,三者的区分可以参照软件生命周期来分别,在软件的生命周期中有几个主要的阶段,项目立项和可行性分析,需求分析,概要设计,详要设计,编码,单元测试,集成测试,功能测试,压力测试到用户测试等.其中所谓的软件开发人员常需要参与的阶段是,概要设计,详要设计,编码,单元测试以及其它测试阶段的支持等.但是实际上概要设计和详要设计的工作主要应该是设计人员的工作范围,而编码和单元测试主要就是编码人员的工作范围,而软件工程师最主要的工作范围应该就是帮助设计人员实现模块设计,同时指导编码人员进行开发.之所以需要这样是因为经常性的软件的设计根本无法和具体的编码结合在一起.而程序的编码也无法反映设计,一但需求发生改变,设计人员无法知道程序更改的影响范围,而编码人员对程序的改变也无法从整体上有很好的把握,于是代码的问题就出现了.而软件工程师因为参与设计的同时又参与了编码.所以可以很好的体会设计上的整体要求.这里说的设计最终结果不仅仅只是产生设计文档,有可能是直接产生接口代码和模块框架.而这些代码的编码应该主要是依靠软件工程师,同时软件工程师也需要负责Code Review工作,因为这一角色一般是有几年的编码经验,代码质量较高,对系统的了解也比较熟悉,可以更好保证程序质量.设计人员的另一个任务是设计出测试的测试用例和测试数据,而软件工程师则需要准备出具体的测试用例和测试数据并指导编码人员进行单位测试.这样从职责上进行的区别可以使人员更多的关注于自身的任务,同时也可以感觉到不断的提升,编码人员在经过技术的积累和编程经验的提升可以成长为软件工程师,而软件工程师在加深对软件设计知识和系统业务知识的积累也可以成长为软件设计师,同时也可以向着管理角色成长,成为一个团队的Team Leader,这里插入一句,笔者认为的Team leader应该是一个管理职位而非技术职位.他应该是向项目经理负责,对团队中人力资源,任务安排,风险控制,环境配置以及团队内外的沟通进行管理.笔者认为软件设计师和Team leader的待遇不应该有太大的区别.两者的区别有点类似于军队的政委和连长的区别一样.呵呵
回到人员提升的话题,软件设计师可以向着两个方向转型,其中一个是系统架构师,这应该是负责整个系统上面的框架的设计,关注点是系统的非功能性需求(如性能,质量,架框升级等)即技术需求,另一个方向则是系统分析员,这则更多的关注在系统的功能性需求.而项目经理,系统分析师,系统架构师是整个软件项目在三个不同层次上的分工.三者只有工作职责的区别而不应该有等级的区别.当然如果有些公司有更好的职业设计的话,其实应该还可以加上技术专家,和资深顾问等.这两个职位是跨项目的,前者是对项目出现的技术难点负责解决,后者则是对项目的业务知识进行分解,培训人员的业务知识.当然这两个职位也应该有渠道让编码人员可以一步步成长起来.
以上是本人从事软件开发几年来的一些想法,可能存在着很多不成熟的地方,但是希望能够与各位分享,更重要的是希望更多的软件企业管理者能够对企业内的人员提供职业规划,这样才能留住更多的软件人才,使整个中国软件水平能够得到更大的提升.