软件平台化开发项目实践

news2024/11/25 16:25:18

汉捷咨询有40多位来自多家著名企业(华为、中兴、三星等)的咨询顾问和讲师,资深顾问/项目经理均有华为、中兴等领先企业高管及咨询实践15年以上经验,本文为汉捷一IPD资深顾问的行业实践总结,与各位同仁分享!

起源

对于电信行业而言,这是一个沸腾的岁月——VOIP、小灵通、宽带上网、短消息、预付费等等业务,一股脑的推到百姓面前,让“上帝”们顿时感觉眼花缭乱;而我们,作为电信运营支撑系统(主要功能是计费、营帐)的开发公司,也终于有了用武之地。

面对忽然出现的市场需求,我们迅速做出了本能的反应:尽我们所能满足电信局用户的要求,抢占运营支撑系统的市场份额。本来我们已经拥有了一个针对市级电信客户的小型计费系统,经过不断维护增强而相当成熟;面对一下子冒出来的不同运营商在长话、市话、IP电话计费营帐以及相互之间结算的系统需求,我们将开发人员分成不同的项目组,在原有基础上分别为不同的客户进行定制开发,并全权负责系统的集成和交付。随着所交付应用的系统数量不断增加,成功的喜悦被一种焦虑和疲惫所代替——客户需求增加/变更和产品缺陷处理。项目团队成员像救火队一样奔赴现场,解决客户的问题。我们就像《人月神话》的描述一样,表面上看起来好像没有任何一个单独的问题会导致困难,每个都能被解决,但是当它们相互纠缠和累积在一起的时候,我们的行动就会变得越来越慢。对问题的麻烦程度,每个人似乎都会感到惊讶,并且很难看清问题的本质,一个接一个淹没在了焦油坑中。

尽管大家鲜有机会当面交流,但是仍然会通过邮件交流一下现场解决问题的进度和方式:我们发现很多用户的需求是相同或是类似的,由于原有系统缺乏该功能,我们不得不针对不同用户去重复开发相同的特性,我们甚至私下提供代码以相互参考。我们有时隐隐觉得该作些什么使开发效率提高一些,但是这种念头在现场用户焦灼而严厉的目光下转瞬间就消失了。

公司总部也发现了这个问题,为我们空投了一位技术总监。其实我们对他并不陌生,他曾经在硬件和嵌入式系统的项目中从事过管理工作,一个认为系统开发都是类似的、拥有莫名优越感的项目经理。从他参加了一系列昂贵的培训经历来看,总部仿佛期望将他培养成未来的管理明星,而我们这里就好比这位明星的起跳板和出场秀。

刚刚上任,他就为大家灌输了“平台化”开发的重要意义和方法,声称要将系统开发的像KFC配餐一样方便快捷。他要求项目组把各个系统的特性列出清单,然后将这些特性汇总为一张总表,又加上了一些颇为时尚的定语:跨数据库、跨操作系统、三层结构等等。当我们解释跨数据库在技术实现上是多么困难时,得到的答复是你们可以自行开发一个高效的数据库来彻底解决这个麻烦。在饱受现场客户的抱怨后,我们长久以来被压抑的情绪终于在这种无知和傲慢面前得到了发泄:在一次重要的产品规划会议上,我们将异常乐观的里程碑计划、“乱点鸳鸯谱”般的特性分配进行了彻底的否决,甚至将这个梦想中的“平台产品”戏称为“杀死你三千”(周星驰的一部电影中将各种炸药放在一个篮子里,声称是精心研制出的超级武器,实际上却是派不上用场的废物)。那位曾经踌躇滿志的技术总监在“千夫所指”下黯然离去。

闹剧收场了,尽管我们在心里上得到了暂时的宣泄,但是在业务上却是一筹莫展。我们也认同这种平台化开发是解决目前困境的有效手段,但是仅仅有理念是远远不够的,我们缺乏一个真正能够将理念付诸实践的人物,否则仍然要在黑暗中不断碰壁。更糟糕的,我们已经没有时间来挥霍:来自用户的压力渐渐将我们逼到了墙角却无力扭转;公司总部在核算我们部门的财务状况,如果无法盈利将来就会被拆分或是裁员。

我们将何去何从?

转机

有时候你不得不承认一个人可以带来转机。

作为一家开发电信支撑系统的公司,Z公司是我们的竞争对手,其产品质量和研发效率强于我们,我们一直也不明白其中的奥秘。Z公司的一位资深项目经理被我们“挖”了过来,准确的说不是我们“挖”的,而是这位心直口快的业务牛人得罪了公司高层,居然越俎代庖的妄想染指Z公司的产品规划活动,震怒的Z公司高层于是将他“推”到了我们面前。我们就将这位业务牛人称为“小马”吧。

在困境中的人们往往期望奇迹的发生,我们就将这个奇迹寄托在小马身上了——小马被任命为我们的技术总监。

由于曾经是竞争对手,小马对我们的产品现状一清二楚,甚至可以说得出各个产品的特点和缺陷。他对我们各自为战的局面感到困惑,明确提出当务之急是必须采取平台化开发方式,开发出能够支撑未来整个产品系列的平台框架,同时针对不同的电信客户进行少量定制开发,在质量和进度方面获得突破。他也指出平台化开发会暂时影响我们对市场的响应,就是说会丢掉一些机会;我们在研发组织、工程师技能等方面也会有很大的调整。

大家对目前糟糕的状况感到深深的厌恶,都希望能够拿出有力的产品去整顿混乱的市场,当然前提是赶在市场机会窗关闭之前。我们已经没有退路,所以也没有犹豫就投入了这场日后看来颇具风险的“赌博”中了。

重整

小马不像他的前任,没有谈论什么高深的理论,而是直接触及了问题的核心——什么是我们的平台产品,里面包括了什么。平台对于我们的开发人员来讲并不陌生——我们每天都在和各式各样的平台打交道:开发平台、信息平台、管理平台。但看似简单的问题着实难以回答,似乎每个人都知道一点,有无法达成共识。多数人心目中的理想平台是无所不能的利器,可以定制成所有的产品:小到市县级的简单市话计费、大到省级漫游计费、也要包括营业帐务系统,还要支撑不断出现的新业务,这样我们就可以“一劳永逸”了。

从实际情况看,我们实在过于天真。基于原有系统不断的修修补补已经将问题暴露出来了——原有的成熟的小型系统的架构根本无法支持全系列的产品,我们未来设计的平台恐怕同样无法包打天下。关键问题是,面对如此庞大的市场,我们到底如何规划产品进而确定平台的范围。

这就是产品规划的问题,对于我们这些技术出身的工程师来讲,实在是“不专业”。都知道在“市场导向”与“技术导向”的PK中,无疑前者胜出,关键是如何操作。

小马把我们公司负责计费产品的销售人员、客户经理请来共商大计。从这群平日巧舌如簧的人们口中,我们惊讶的发现了许多非常珍贵的信息:南北电信即将拆分,网间结算系统市场增大;移动公司准备出台新的系统规范,其中会有很多新业务描述等等。当我们问他们为什么不将这些有价值的信息早点告诉我们时,他们说以前提供过很多信息后没有反馈,所以现在也懒的说了;开发人员都挺忙,也没有必要多此一举。我们忽然感觉自己就像铁路上玩耍的小孩,只注意了脚下的石子,却没有意识到即将呼啸而来的列车。

好在现在还不算晚。经过几次会议,我们对整个运营支撑系统的市场才算有了大致清晰的看法:

l 小型系统属于底端市场,用户对系统的质量要求相对不高,尽管数量较大,但是进入门槛不高且价格战激烈,后期维护成本相对较高;

l CDMA、PHS网络正在建设,支撑系统的市场需求旺盛,用户对系统要求很高,并且重视系统的维护和增强,具有非常理想的业务利润;

l 针对国内终端用户的现状,预付费业务需求很大,关键是系统要提供实时处理的能力,这方面我们与很多竞争对手都是空白;

l 运营商之间竞争加剧,互联互通屡屡出现问题,因此网间结算系统的需求也很大,我公司在交换产品上强大的竞争力可以很好的支持这项业务;

l ……

经过对各个细分市场的全面评估,我们终于决定将产品定位在中高端运营支撑系统和网间结算系统,放弃了苦苦支撑的底端市场——尽管有些留恋,但还是对未来充满期望。

我们成立了包括销售经理、客户经理、开发工程师的联合调查小组,几个小组分别针对事先锁定的目标客户,专门了解客户的需求。这样一来,客户反倒奇怪了——原来是遇到问题后叫你们过来,现在倒是不请自到了。由于之前维系得良好的客户关系和现场表现出来的积极认真态度,用户非常的配合——原来用户很乐于将新业务的发展方向共享给我们,当然也乐于有机会倾诉一些对产品的抱怨,我们的调查小组都进行了详细的记录。为期半个月的调查活动确实收获不小,我们甚至了解到很多竞争对手的产品信息。

在公司内部,我们也要求开发人员、技术支持人员将需求和建议都提交上来,我们甚至将公司热线电话的记录都进行了搜索以获取有益的信息。我们从行业报告、电信业务规范等文档中了解业务发展趋势,邀请相关国际优秀公司进行交流(名义上是与人家探讨合作意向,实际上是刺探情报,做法有点卑鄙)。

当无法确定某项特性是否必要时,我们就会考虑既然我们无法代表客户,为什么不去直接问问客户的感觉呢?所幸的是我们的问题几乎都在用户那里得到确认。

总而言之,我们从各种渠道收集系统的需求。

根据我们已经确定的目标市场及其关键业务特性,我们进行了整个产品线的开发规划;相比原来的规划,现在多出了一个“平台产品”,这个并不向外正式出售的产品却是我们全系列产品的基础。下面就是产品开发路标的示意图:

一般来讲,我们对于产品进行版本划分是考虑基础版本用于快速推出并抢占市场份额,通过不断推出后续版本来增加产品特性,巩固、增加市场。平台产品的规划也采取了这一策略。我们根据预期的市场发展确定了市场目标,考虑不同产品的版本划分和特性分配、平台产品对应的配套版本,特性实现的优先次序、可用的研发资源等信息,初步规划了整个平台产品系列的开发里程碑计划。

尽管我们已经耗费了很多时间进行产品规划而没有发布一款新的产品,但仍然对未来充满信心,原因是我们努力的目标逐渐清晰了。不过我们却低估了后续开发的难度。

痛并快乐着

我们把研发人员分成若干小组,其中最为重要的就是总体方案设计的小组和平台产品研发的小组,还有针对不同产品进行定制研发的小组。

总体方案设计小组负责更为详细的产品规划、产品特性分配、平台产品的技术方案和架构设计。最为关键和困难的就是确定平台产品和最终产品的需求界限:如果定义得过于宽泛,平台就会过于臃肿和低效,成了四不像的怪物;如果过于简陋,最终产品的开发工作量增加,平台的收益就会大打折扣。原有系统架构的局限性使我们要设计出更为健壮的产品平台。这些在技术和业务方面都颇有造诣的工程师就像在实验室里使用天平一样进行着精心的设计,他们深知其结果对这个产品线意味着什么。

一旦确定了技术路线和总体架构,我们就能够制定出更为准确的研发计划。为了降低风险,在小马的提议下,在一个可发布版本内部,我们进行了增量式开发——在平台产品的一个“小版本”开发并验证完成后,我们就可以进行集成,观察“最终产品”的运行情况,将问题不断反馈到下一个“小版本”的开发计划中,而不是像以前那样直到最后才进行确认。

平台产品研发的小组和定制研发的小组主要是根据方案小组的设计进行实现并验证。在系统实现过程中,我们才发现平台式开发要比想象的困难得多。由于需要考虑模块的重用、兼容、处理效率、容错等问题,相比原来纯粹项目式开发,现在的开发效率大为下降。经验的不足使得总体方案的设计出现变更,引起了后续的连锁不良反应,前面几个“小版本”的验证结果简直是惨不忍睹。大家有些沮丧了。

由于我们把主要资源都投入了平台产品的开发中,已经没有什么精力估计新的市场机会了,现在竞争对手已经抢到了我们的前头。公司高层有些坐不住了:要求我们的研发资源优先考虑市场机会,将平台的开发工作推后。这时候,小马忽然变得异常强硬,说服领导坚持优先进行平台开发,暂时放弃面前诱人的市场机会。在其一番软硬兼施下,公司高层决定让我们放手一搏。

大家对现状都很清楚,事实上我们已经没有退路了。利用一个晚上,我们奢侈地享受了一次视觉盛宴:项目组成员集体观看史诗巨片《TROY》。我们现在的处境好比阿基硫斯率领的勇士们刚刚登上特洛依城外的海滩,只能为了自己的未来和荣耀而孤注一掷。

在管理方面,我们采取了更加灵活的方式:平台开发小组实施更为严格的过程管理制度,主要体现在输出件的配置管理、变更控制、正规检视;而对于定制开发的小组则允许相对宽松的管理方式。这种方法可以最大限度的保证核心系统的质量,加快开发速度。

吸取了以前版本混乱的教训,从编码阶段开始,我们对于文档和代码进行了更加严格的配置管理,要求在每个小版本验证之前必须提交各自完成的代码,其后的变更遵循流程的控制。有一位屡教不改的资深工程师,被恼火的小马直接“派去人力资源部报到”了。

原来我们有一个“潜规则”:升任项目经理后就拥有了不亲自编程的特权。对此,小马认为项目经理会逐渐失去对项目的“嗅觉”,他要求每个项目经理都要从事文档设计、编码和检视工作,没有例外。起初,几个项目经理都是颇为不屑——哪有教授还参加考试的道理,但是发现小马并非光说不练的“嘴把式”的时候,再也没有人行使“特权”了。

如果说,我们的开发进程在开始阶段是跌跌撞撞的话,在历经了三次内部小版本的验证后,就已经步入了顺利的快车道:例行的小组沟通会变得不再劳神,项目进度偏差可控,没有人怀疑会重现以前无法按时发布的情况,最为重要的是小版本验证的通过树立起了必胜的信心。

随着项目完成过半,我们决定再多做些事情:我们提前为销售人员介绍了产品的特性,将部分完成的系统展示给他们,使他们在用户面前拥有更多的“炮弹”;我们要求资料撰写人员提前介入,先期充分的产品规划工作为用户文档撰写带来了极大方便;在进行内部验证时,我们要求技术支持人员使用这个系统,以了解是否符合用户的习惯;由于用户对于系统运行的硬件环境有不同要求,我们搭建仿真环境以验证系统的处理能力和硬件的兼容性;我们要求各个定制小组开发系统迁移计划和实施方案,以应对未来系统部署时可能遇到的问题。

项目在有条不紊的进行着,市场上的竞争日趋白热。为了验证用户对我们产品的看法,销售人员选择了典型客户进行产品试用。从试用反馈情况来看,用户比较认同新开发的产品,同时也对运行界面、部分特性提出了建议,我们都进行了记录和分析。例如原来数据文件的采集都是采用FTP方式,现在有用户提出在网络质量不高情况下,FTP方式可能导致大文件重复传递或者传递失败,建议增加对MQ传输方式的支持。我们将这个需求增加到平台产品中,这意味着相关产品都具备了这个功能。

我们的努力终于得到了回报,同时发布了全系列产品。由于平台产品具备系统健壮、便于扩展、接口灵活等优势,使我们在不同的细分市场竞争中取得了领先。我们可以在合同中明确承诺产品交付延期的惩罚措施,而竞争对手在这方面几乎都是遮遮掩掩——这源于我们对产品的信心。

尾声

没有什么系统能够“一劳永逸”,平台产品也是一样,但是它的升级却可以最大限度的延长产品的生命周期。我们现在正在开发下一代的运营支撑系统平台,重点增强对软交换、3G、内容服务的业务支持。从当初的一片空白到现在的驾轻就熟,确实走过了异常艰辛的历程,所幸的是我们坚持下来并迎来了胜利。

有人想知道我们在困难的时候如何坚持下来,小马只是淡淡的说:当时没想什么,只是“我等这个机会等了半年,我不是要证明我比别人了不起,而是要证明我失去的东西我一定要亲手拿回来。”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1962645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPF用户登录界面设计-使用SQLite数据库进行存储

一、SQLite数据库介绍 SQLite是一款轻量级的关系型数据库,它小巧高效,无需服务器配置,仅需单一文件即可存储数据。SQLite跨平台支持,易于集成到各种应用程序中,并支持SQL语言进行数据操作。它保证了数据的完整性、一致…

Java数据结构和算法中文版(第2版)详细教程

前言 数据结构是指数据在计算机存储空间中(或磁盘中)的安排方式。算法是指软件程序用来操作这些结构中的数据的过程。几乎所有的计算机程序都使用数据结构和算法,即使最简单的程序也不例外。比如设想一个打印地址标签的程序,这个程序使用一个数组来存储…

整理几个常用的Linux命令(Centos发行版)

如果工作中需要经常整理一些文档,需要汇总一下,现有的服务器资源信息,那么这篇文章适合你; 如果你是一名开发者,需要经常登录服务器,排查应用的出现的一些问题,那么这篇文章适合你;…

使用java判断字符串中是否包含中文汉字

1.导入huool工具的maven依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>2.复制一下代码直接运行 import cn.hutool.core.lang.Validator;public …

面向对象 - 概述、类的创建、 实例化与内存解析

一、学习面向对象的三条主线 Java类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类面向对象的特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09;其他关键字的使用&#xff1a;…

机械学习—零基础学习日志(高数16——函数极限性质)

零基础为了学人工智能&#xff0c;真的开始复习高数 这里我们继续学习函数极限的性质。 局部有界性 充分条件与必要条件 极限存在是函数局部有界的充分条件。什么是充分条件&#xff0c;什么是必要条件呢&#xff1f;我这里做了一点小思考&#xff0c;和大家分享&#xff0c…

alibaba cloud linux+JDK+TOMCAT+NGINX+PHP+MYSQL配置实践

CentOs要停止维护了&#xff0c;一直在服务器上用的CentOs7也最迟到2024年6月了&#xff0c;这次给公司新购一台备用服务器&#xff0c;在选择操作系统的时候&#xff0c;考虑了一下&#xff0c;决定试用一下阿里云的alibaba cloud linux。 alibaba cloud linux分为2和3版本&am…

创客项目秀 | 基于xiao的光剑

在《星球大战》宇宙中&#xff0c;光剑不仅仅是武器;它们是持有者与原力的桥梁&#xff0c;制造一把光剑几乎是每个创客的梦想&#xff0c;今天给大家带来的是国外大学生团队制作的可伸缩光剑项目。 材料清单&#xff1a; 电机驱动模块1:90减速电机套装MP3模块、喇叭Xiao RP2…

ingress使用HostNetwork部署

1.三种常用的部署模式 1.1 DeploymentLoadBalancer模式的service 用Deployment部署igress-controller&#xff0c;创建一个type为LoadBalancer的service关联这组pod。大部分公有云&#xff0c;都会为LoadBalancer的service自动创建一个负载均衡器&#xff0c;通常还绑定了公网…

Java面试八股之Spring如何解决循环依赖

Spring如何解决循环依赖 在Spring框架中&#xff0c;循环依赖问题通常发生在两个或多个Bean相互依赖的情况下。Spring为了解决循环依赖问题&#xff0c;采用了不同的策略&#xff0c;这些策略主要取决于Bean的作用域以及依赖注入的方式。下面是一些关键点&#xff1a; 单例Be…

护眼灯真的有用吗?护眼灯到底该不该买?

护眼灯真的有用吗&#xff1f;随着科技的发展&#xff0c;生活质量水平的不断提升&#xff0c;大家对于生活的要求也在不断拔高。护眼台灯进入众多家庭里面&#xff0c;成为不可或缺的产品。然而&#xff0c;护眼台灯在市面上&#xff0c;种类颇多&#xff0c;其质量也是参差不…

力扣高频SQL 50题(基础版)第三十三题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第三十三题610.判断三角形题目说明实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第三十三题 610.判断三角形 题目说明 表: Triangle ----------------- | Column Name | Typ…

Python入门宝藏《看漫画学Python》,495页漫画带你弄清python知识点!简单易懂 | 附PDF全彩版

华为出品的《看漫画学Python》全彩PDF教程是一本适合Python初学者的学习资料&#xff0c;通过漫画的形式将复杂的Python技术问题简单化&#xff0c;使学习过程更加生动有趣。以下是对该教程的内容简介、本书概要及本书目录的详细解析&#xff1a; 内容简介 《看漫画学Python》…

无线领夹麦哪个品牌音质最好?无线领夹麦克风怎么挑选

在直播行业中&#xff0c;声音质量直接影响着观众的观看体验。一款优质的无线领夹麦克风&#xff0c;能够确保你的声音在直播过程中始终保持清晰、稳定&#xff0c;减少背景噪音的干扰。它不仅方便佩戴&#xff0c;还能让你在移动中自由发挥&#xff0c;无需担心线缆束缚。对于…

数说故事 | 社媒聆听“顶流”红山动物园UGC声量

7月&#xff0c;CASETiFY和南京红山森林动物园联名啦&#xff0c;一个号称“手机壳中的爱马仕”&#xff0c;一个是“动物园顶流”&#xff0c;两大IP梦幻联动&#xff0c;推出了“明星动物”系列手机壳&#xff0c;CASETiFY还解锁“饲养员”身份&#xff0c;认养了酷酷的美洲豹…

某土地市场网JS逆向:debugger脚本限制秒退和webpack hash参数加密

&#x1f50d;某土地市场网逆向思路 &#x1f6ab; 解决网页反debugger &#x1f50d; 网页禁止打开开发者工具 在访问中国土地市场网时&#xff0c;我们会发现网页禁止了开发者工具的使用&#xff0c;包括F12和右键调试。 &#x1f50d;强制进入开发者工具 窗口关闭并回退 …

IDEA对线上项目远程debug

1、在启动脚本上添加以下配置内容 -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 nohup java -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 -jar test.jar > misc.out & 2、在IDEA中进行配置 &#xff08;1&#xff09;选择远程…

我们的网站被狗爬了!

大家好&#xff0c;我是程序员鱼皮。 世风日下&#xff0c;人心不古。我们的程序员面试刷题网站 《面试鸭》 才刚刚上线了一个多月&#xff0c;就由于过于火爆&#xff0c;被不少同行和小人发起网络攻击。 而且因为我们已经有 4500 多道人工整理的企业高频面试题、100 多个各…

不得不安利的程序员开发神器,太赞了!!

作为一名程序员&#xff0c;你是否常常为繁琐的后端服务而感到头疼&#xff1f;是否希望有一种工具可以帮你简化开发流程&#xff0c;让你专注于创意和功能开发&#xff1f;今天&#xff0c;我要向大家隆重推荐一款绝佳的开发神器——MemFire Cloud。它专为懒人开发者准备&…

【前端】(仅思路)如何在前端实现一个fc手柄,将手机作为游戏手柄设备。

文章目录 背景界面demo原型图&#xff08;没错&#xff0c;就是它&#xff0c;童年回忆&#xff09; 遇到的问题最终后端demo(甚至比前端逻辑更简单) 背景 突发奇想&#xff0c;想要在前端实现一个fc游戏手柄&#xff0c;然后控制电脑的nes模拟器玩玩魂斗罗。 思路很简单&…