软件产品部门设计:背景分析

即使现在,仍然有些公司采用软件研发部这一名字,而非软件产品部。既有历史原因,也有现实管理和成本考虑的原因。本文将对两者都进行论述。

虽然我们可以提出一种抽象而理想的软件研发相关部门设计构思,但作为一个实际的拥有软件部门的公司,如果缺少具有可行性的转化线路以及能够带来超额实际利益的转化目标,大概没有动力去大规模地改动现有部门设计框架。所以本文对路线和实际利益将进行重点论述。

首先,软件产品部和软件研发部是完全不同的两种部门构思。在理想的状态下,两者可以共存在企业中。软件产品与其他产品的相似之处,在于都得进行产品的全生命周期管理。软件产品与其他产品的差别之处,在于软件开发与其他产品开发过程的不同。一个软件产品的经营,如果不能把软件开发这一特征充分考虑进来,在市场上就难以有足够的竞争力。

软件开发入手很简单,一般稍有数学基础的爱好者,经过几周的集中学习,就可以独立进行软件开发。但对于企业开发真正商业化的软件产品来说,有更多的能力因素影响着软件的开发。比如需求分析的能力,架构设计能力,开发人员管理能力,文档管理能力,应变能力,进度控制能力,成本控制能力,等等,项目能力。此外,当然还有产品定位、市场推广、售后服务,等等产品能力。若想软件这样一个快速发展的行业中长期立足,最好还能配备技术储备能力、新技术跟进能力、持续自动化改造能力,等等战略能力。相比起来,具体的软件实现的代码部分,只不过是冰山之一角。

这众多能力的相对权重,根据社会人力资源的状态、市场竞争的状态,紧紧跟随时代在不断地变化。如五行循环,往复无端。

1、早在前信息时代,软件开发人才匮乏,最基本的编程能力(能够使用某种计算机语言进行软件开发)一度都曾经成为软件公司的关键竞争力。

2、很快,随着软件开发能力普及,很多以程序员思维做出的软件无法满足客户需求,需求分析能力的地位很快提升,客户应用顾问的能力对于很多软件公司来说成为产品成功与否的关键。

3、软件产品在手机和移动互联时代,能够被低成本快速模仿。整个产品的运营能力越来越成为企业的竞争重点。

4、当越来越多的公司可以开发出符合客户需求的软件,一系列软件项目管理能力的高低就足以影响软件开发的成本因素,进而直接影响公司的市场竞争力。

5、软件行业技术发展飞快,很多新兴的企业借助新技术的应用赶超前辈,对于很多企业来说,对新技术的跟进能力是让自己保持竞争力的关键能力。

6、本文借此预言,在即将到来的人工智能时代,软件开发中的大部分工作必将由人工智能来完成,届时,掌握与人工智能的对话能力,就如同早年的基本编程能力一般,将再次成为新兴企业的竞争关键。新的一轮循环又将开始。

以本文发布的时间点来看,产品运营能力仍是企业竞争的核心,但内部管理能力的强弱在三年之内就会成为企业竞争的重点。所以,软件产品部门的设计,将以此两点为主进行讨论。当然,具体到各个的地方、行业、企业,其竞争特点又会有各种细小的差异。所以其他几个方面,也将会涉及。

软件产品部门设计:能力点

企业的结构类似细胞,在社会这盆原始汤之中生存着。与外界环境进行着持续地物质、能量、信息的交互。企业内的部门结构也有些类似细胞中的细胞器,它们不能直接接触原始汤,只能在企业为其创造的小环境中生存。同样,部门与企业内部小环境之间也持续地进行着物质、能量、信息的交互。软件产品部,为企业提供的是其附着价值所用的工具——产品,企业借此产品提供社会服务,实现自身存在的价值。

软件产品部的核心,即产品运营能力;为了支持此运营能力,必须具备相当灵活的软件项目管理能力,而为管理能力提供支持的,则是软件研发能力;需求分析能力超越了软件产品部门的界限,一直延续到整个企业的边界,企业必须在与外界的交互过程中把握不断变化的客户需求,而软件产品部门必须有足够灵活的应变能力以对应支撑企业的需求管理能力;新技术的出现,对于现有企业来说,随时都是颠覆性的力量,不但软件产品部门,整个企业的结构都不得不做出相应的调整,以适应这种颠覆性变革,作为软件产品部门,应该对新技术保持敏锐的感知,尽量做到主动应变而非被动应变。

首先谈一下软的研发能力。一般意义上的软件的研发能力是个人能力,不是企业能力。企业自身的框架、中间件、知识库的积累,才是软件研发方面的企业能力。在当今大潮之下,软件行业技术发展极为迅速,很多以前企业必须进行的自我积累,都被整合到了新的开发工具和新的框架理念之中。形成的效果是以前企业需集体力量经过几年积累而形成的优势,现在一个普通程序员可以在几个月之内就完全掌握。在这种格局下,单从企业角度来看,继续在研发能力上做投入,其产出效率是相当低的。其价值和作用类似于买保险。考虑到软件行业的技术更新速度实际超过个人的技术更新速度,所以企业招聘软件研发人才属于短期的战术行为,而非战略行为。软件研发能力的另一个方面,现在并不为人重视:即超越具体语言的抽象表达能力,这一能力,将在二十年后才能见到其价值,这里也不必详述。

择重点来说,当今的形势下,软件研发能力的外包能力已经是任何一个以软件产品为主的企业所不得不掌握的基本技能。这一基本技能,又可以分为以下几个方面:

1、与软件开发人员社群相交往沟通的能力

2、拆解需求,形成开发任务的能力

3、开发进度管理的能力

4、确保产品得到持续维护的能力

5、文档管理的能力

软件的项目管理能力和具体研发形式有着紧密的关系,在研发外包的基础上,更加强调的是软件项目进行的平稳性和有效控制程度。这其中的平衡度必须仔细拿捏,太过强调控制度则耗费成本太多,而控制度不足又会带来隐患。这正是现阶段研发部门的设计重点所在。对于一副桥牌来说,叫牌阶段我们就知道大牌可以对定约提供某种程度的保证,但具体怎样运用这些大牌,则必须在首攻之后进行仔细的设计。对于一个公司的项目来说,公司所配置的内部职工,即如那些大牌,如何使他们充分发挥作用完成项目目标,则是规划的重点。

应当了解部门人员配置情况,拆解项目重点工作并根据不同人的才能分配到人。考虑到每个人都具有离职的可能,应该设计出一定的冗余,以确保工作可以持续。

公司内部职工的优势在于交流便利,并且工作职责相对较宽。所以凡是需较多口头交流、多边交流的工作、责任边际模糊的工作,尽量留给公司内部职工来做,而将容易用文档描述的、双边交流即可解决问题的、边际清晰的工作,尽可能交给外包人员来做,以降低部门内部整体工作压力,加快进度。对于外包工作,如果有可能,凡是能够细分的工作尽量交给不同的人来做,以减少过于依赖某个具体外包者的风险。

外包应当使用大众常用的工具,方便换人维护。而对于用户很少的新的工具和技术,如果必须使用,则宁可让内部职工来学习和操作。

大的原则即是充分发挥内部人员和外包开发的优势,并且尽量避免其危害,具体运用时应当灵活掌握,从能力点说来,应该包括:

1、人才的能力和需求的辨识

2、项目职责调整和内外部沟通的能力

接下来说需求分析能力。需求分析是一个无限期的工作,所以它在项目管理之上,是需求分析在操纵项目的推进,所以把需求分析角色设在项目经理的管理之下就显得不甚合理。在现代企业中它经常是产品经理的一个职能,设在项目经理之上。对于一个无限期工作,需求管理的第一个重点就是需求截断。我们不可能在一个产品中包含全部用户需求,究竟这一版本的软件产品将包括哪些具体的客户需求,这必须结合市场、技术,综合分析时效、成本、人力等多方面因素而决策。

需求分析的另一个重点是快速应变,这必须在研发能力的配合下才能做到。纵观现代的软件思想的演进,不断提高重用能力与应变能力,一直最基本的推动力。

如果能够对企业需求进行更高程度的建模,设计出更加稳定的需求表达语言,对于需求管理的意义将极为重大。但这一点处在当今发展变革的时代下,其投入产出比并不是最高的。

择重点来说,在当今形势下,需求分析能力在软件部门中的体现,包括如下几个方面:

1、企业软件研发能力的通报能力,让企业产品级决策者随时了解企业的研发能力,以做出最好的产品决策。

2、产品逻辑架构的通报能力,让企业产品级决策者随时了解产品可以在何种程度上做出快速而低成本的变革。

3、设计灵活架构的能力,尽量使产品在需求改变、开发人员变动时受到最小的冲击。

软件产品的运营能力,已经大大超出了软件研发本身。从软件角度来说,确保产品的稳定、确保售后服务和支持,可以算是对产品运营能力的体现。大致包括如下几个方面:

1、系统测试的能力

2、优化配置,确保产品稳定运行的能力

3、快速响应的售后支持能力

新技术的采用,有时可以极大提高生产效率。在这种情况下,新工具的作用绝不仅仅是一个战术作用,而是战略作用。革命性的新工具的出现甚至可能会直接改变整个企业的经营思路。考虑到软件行业的加速发展的现状,考虑到每个公司希望解决的问题大致都是相同的,所以随时关注软件行业的最新发展动态,对于解决企业在软件开发方面所面临的问题往往会有直接的帮助。当然,对于这种新技术的掌握,不能是泛泛地,必须是深刻地。

新技术的运用,有时普通技术的新用法,经常可以带来企业运营效率的提高。软件产品部应当了解当前企业工作的瓶颈何在,并随时准备用新的技术来改善它的效率。

对于软件企业来说,有几个方面应该考虑:

1、持续关注和尝试新技术的能力。对于小公司来说,这或许是一种冗余能力,因为它不能直接带来生产力,经常被忽视。但一个公司若想成长,这个能力就是不可或缺的。

2、不断实践新技术的能力。在新的项目中继续使用当前公司已经验证过的主流技术固然带来直接的效率,但同时也减少了一次尝试新技术的机会。新成立的小公司没有这样的经验积累,反而有很大的积极性采用新技术。这正是新企业打败现有企业的原因之一。

3、快速的重组能力。具有这种能力的企业,才能真正使用新技术的核心。计算机的出现、互联网的出现,企业想借助它们的力量,都必须进行大的变革。而对于想从人工智能中获益的企业来说,更必须经历复杂而深刻的改变。

软件产品部门设计:实现路线

对于软件产品部来说,前文所述对外的基本能力的实现,须依赖内部结构中相应的能力持有者。但正如所有脊椎动物都有五脏六腑,其具体结构和功能的重点仍然有很大的差异。对于不同的软件企业来说,具有不同的需求,有不同的起点。它们无须设计同样的软件产品部结构。同一种能力可以被多人持有,不同能力的持有者也可以是同一个人,能力持有者彼此之间的关系也可以各异,这就形成了千姿百态的部门结构。

归结起来,以下这些内部能力持有者角色,对于部门功能的实现通常都是必不可少的:

技术能力的掌握者。一个软件产品的实现,由一系列技术能力所组成。他们并不一定是实际的开发人员,但他们必须了解这种技术的能力范围和实践效果。一般是技术总工承担,但也经常由具体开发者承担。

需求分析者。他们是系统建设的枢纽,负责把用户需求转化为技术人员可以理解的界面和功能。各色人员承担此职能都很常见。

架构师。设计系统的整体架构。包括软件部署模式、数据持久化方案、接口规范等核心部分。一般是资深开发人员承担。

研发能力构筑者。他们可以是具体的开发人员,或者是负责外包的技术管理者。其作用即是实现架构师的设计。开发人员和外包管理者。

任务委托链管理者。任务的级别是多层次的,对于软件产品部来说,高级别的任务可以是完成一个产品,低级别的任务可以是实现一个函数。高级别的任务必须经过层层拆解,最终落实到每个研发能力构筑者身上。任务委托者对发出的任务负责,并通过验收者来检查任务的完成情况。必须有人确保整个链条工作顺畅。一般是项目经理承担,但也常见由其他利益相关人承担。

验收者。他们执行测试的职能。一般有专门的测试,但也常见由其他各色人员承担。

新技术引入者。一个企业的技术很容易落后,行业的发展速度飞快。持续地将稳定成熟的新技术引入企业,必须有人负责。一般应当是技术总工承担,但也常见由资深开发人员承担。

沟通者。负责使众多参与角色互相了解那些对于自己不熟悉且应当知道的信息。一般由项目经理承担,但也常见通过各种非官方渠道自由实现。

知识管理者。知识包括行业知识、技术知识、本项目及相关项目的文档。常见的是各种非官方渠道自由实现,但若能有专人承担效率会更高。

售后服务者。负责产品的实施和维护。一般有专门的售后团队,但也常见由开发人员承担。

项目团队设计者。当不同实际人员承担着不同能力者的时候,一个产品开发项目的组织结构可能具有不同的特征,如果能够进行针对性的设计,对于提高效率有很大帮助。当项目开发过程中出现人员变动后应对做怎样的调整,也属于此项职能范畴。理应由部门经理、产品经理甚至是高层技术主管来承担,但自发组织的情况也很常见。

对于小企业的开发团队,或者管理不完善的大企业中的小的产品开发团队,一人充当多个职能角色的情况很常见。角色职能不能充分实现的情况也很常见。对于角色职能不能充分实现的时候,整个软件产品的开发就会出现某种不健康的现象。在很多情况下,这种不健康是可以容忍的,因为之所以出现这种情况本来就是经过成本效益平衡而做出的取舍,我们预见到这种不健康会出现,但不会危及我们的最终目标。

但在有些情况下,我们并不了解这种取舍之的后果,打算重新调整投入,以改变现状。在另外一些情况下,我们实际上做了充足的投入,并未期待系统会向不健康的方向发展。那么通过对照本文,就可以看到这种不健康现象背后的原因,找到未能充分实现的职能角色,分析原因,对应加强它,即可解决问题。

这种做法,从医学的角度来看,已经是治本了(治标的方法很多不值一提)。但从更高的角度来看,这种解决问题的方法仍然是表面的和暂时的,还未见到能从长期根本解决(几乎所有)问题的方法。医学对人类的帮助也是有限的,这大概也就是鲁迅弃医从文时所想到的道理。