EDA365电子论坛网

标题: 平台研发的一些想法 [打印本页]

作者: 小小鲁班    时间: 2020-8-17 15:10
标题: 平台研发的一些想法
最近公司研发部门提出了公司级技术平台的建设规划(下文以ABC平台指代),我将个人想法笼统地归结为七个问题,以自问自答的方式表述了对平台研发的一些个人见解,现分享出来供大家参考,欢迎讨论,欢迎拍砖。
1 G9 q$ I. u7 h: _" {" j
/ O$ C; J3 \2 \) o2 p: \* t- {首先列举出七个问题(欢迎大家分享自己的想法):
  A9 I5 }: K" g, q: H  w2 E: T' d3 R) z/ E' V
•ABC平台是什么?近期、远期目标是什么?) E6 G0 [- _% {; r  y# K9 M
•如何保证研发方向不偏离预定轨道?
' {8 N% i* m, y: ]4 g- p" v  Y0 @4 e•架构风格、技术选型等方面的倾向性指导意见有哪些?
0 r( q; a2 h# |6 m4 Z•平台选用迭代的方式开发,模块的优先级应如何定义?
! o5 z3 w8 R3 R* i1 [* |! n: E6 t•针对平台模块,可否抽象出统一的作业指导说明书?
( h$ t1 V! `" Z•平台模块可否委托研发?如何施行?
+ K( v/ B2 X. _2 \. v6 V•ABC平台研发的产出是什么?除了平台本身还应该有什么?& U* W2 C0 I4 z8 L

% v! m' r$ J# A0 O; J* H# W- h; z' B+ p7 F4 ?
下面我将依次作答,表述近期的思考结果并归纳为一个关键词。
7 M: e0 w6 a, d( p4 g$ n5 }* C0 k0 c* b6 E
$ y: f: ?8 {! {- S; o

% N8 n) T) M8 F# v1 n0 V9 k9 F问题一:ABC平台是什么?近期、远期目标是什么?
# }+ H, e" }) k针对第一个问题,我提取“定位”作为关键词。8 b: p" f" q9 G' x( k$ D* Z
/ c! T2 W( d! [+ V' W3 P
+ B% E+ ]$ y% `4 e: f7 b4 J

% H3 X$ H6 M( p9 G5 P
; O8 [9 h6 D/ C# C首先,ABC平台处于操作系统和基础环境之上,这里基础环境是Java、.NET、PHP或其它;其次,ABC平台(Platform)应该包含一个通用的技术框架(Framework)和一些通用模块(Component);ABC平台与特定的业务领域相结合可以形成应用平台(例:针对“人力资源”进行领域建模,然后在ABC平台的基础上进行外延开发,最终形成人力资源应用平台);应用平台提供二次开发支持(继承自ABC平台,可能包含泛化的成分),具体项目按现场要求扩展后形成应用系统。8 K1 C/ }2 P) H9 U- p
" W6 S( j1 ]! X; _" o+ \
在理想的情况下,业务部门只配备实施工程师不承担开发工作,因而ABC平台应该是“一组隐含层级继承关系的应用平台集合”,实施工程师在项目现场主要承担系统初始化相关的配置工作,其次是有限的二次开发定制。但现实和理想之间还有相当大的差距,所以ABC平台在近期只是“一个技术型的开发框架和一组可供自由装配的通用模块”,业务部门选用ABC平台可以节省相当一部分开发成本,但开发资源的投入仍是必不可少的。/ E$ z- h, f  W8 [) G' J; S
4 D5 j* u( b1 U4 u# t
8 N9 `, a. F% k. r0 X

5 T4 H1 Y# C* B6 t; ^问题二:如何保证研发方向不偏离预定轨道?
+ }' r9 {, m, g2 g设当前位置为点A,近期目标为点B,远期目标为点C,两个箭头连起来即为我们的预定轨道。; g' _- z8 {6 C' k) P3 C  i; g

% l; }! Z# p5 W! x3 S( A" c4 \/ G' A1 g0 Z) `
" }; z& S/ U: q6 F/ M! X
, Y: `. j, u8 W& l2 X/ g- ]7 K
我将箭头视作一条水渠,我们当中绝大多数人的任务在微观上看就是挖坑,按照点动成线的规则,坑挖够了渠也就修好了。前提条件是不能乱挖,乱挖一气莫说修渠,即便别人修好了也可能会挖断。
6 U9 D) Y/ c$ D, a* _6 b  K& A) q
迄今为止,我们一直都在兢兢业业地“挖坑”,每个“坑”都挖得眉清目秀,可惜若以“渠”的标准衡量就惨不忍睹了,“眉清目秀的坑,惨不忍睹的渠”原因何在?我个人认为根本原因是大家眼里“只有坑而没有渠”,“坑”首先应该是“渠”的一部分,如果不符合“渠”的要求,再漂亮的“坑”也不是好“坑”。我们需要定义一个标准,说明什么样的“坑”是好的,每个挖“坑”的人在开挖之前不但要拿“坑的标准”严格要求自己,并且要把自己的“挖坑”规划拿出来集体评价,甚至是在“开挖”之后也随时展示“坑的进度”,看是否跑偏了(水渠要求坑深1米宽2米,当前状态是深2米宽1米,下一步还要计划深挖显然是不合适的)。
- p0 J7 j5 s# q+ B3 s1 l1 n7 C/ ~  C2 D; Z* J) m
说了半天挖坑问题,再次回到ABC平台开发,我觉得保证研发方向的关键是“协作”,我们需要引入一套行之有效的协作模式并切实有效地贯彻执行(标准是死的,人是活的,标准可以变,执行是关键),这里的协作模式可以是业界流行的标准开发模式的变种(例如我们选择敏捷开发中的Scrum进行适度调整),具体如何尚需开发团队集体探讨。% }. s; q6 S& L! x2 Z& B$ {

  h' C; P1 ^% `$ e+ m
7 B/ u* y$ t+ C# h
- K" k) u. x$ Z! T7 \+ J问题三:架构风格、技术选型等方面的倾向性指导意见有哪些?$ o4 a5 M6 y2 K) _# A$ V3 Y
这里继续沿用问题二中“挖坑”的理念,我们需要明确“什么样的坑是好坑”,因而我选择“标准”用作问题三的关键词。0 K6 K4 }$ l9 y, a( m

" }( _! U9 ^* H* L! @& N7 Z架构风格是描述某一特定应用领域中系统组织方式的惯用模式,附加上技术选型,我将其理解为倾向性的指导意见,具体条目仍需集体讨论,这里列举我个人的部分观点用作示例。6 K  N- h" L5 H
) Y2 v) E. S) ?; |" ]4 ?& s" `6 p0 V, ]

5 n! w" r* Z: ]0 s# d  x' l# w+ u! `5 W

( c# d  E5 k2 h3 q- I. p  q规约方面的倾向性意见:
% g# J! C3 [* b1 t4 h- V6 N4 A2 q2 R/ }: ?/ H
1) 平台整体基于SOA设计,引入企业服务总线(ESB);
* I! S9 \6 ^6 H8 c6 f2 ?
4 X- ~/ J- {; v/ N2) 针对具体应用系统,采用分层架构风格;( L0 ~  x, d4 }" _
, a% d, p0 i; d7 h
3) 层次之间通过接口进行协作;2 p1 z8 N( ?! O9 f; G1 D

- o& Y5 R: p7 G6 r8 x  W4) 层间传递的对象是为实体类,在规约层定义;
& {# {, g" F2 f' k6 R! O! ]3 M, e$ H: m' O3 A: T* F- x
5) 实现层依赖于规约层,业务逻辑层的具体实现依赖于本模块相关数据层接口、实体类,与关联模块的业务逻辑层接口、实体类也可能存在依赖关系,不引用其数据访问层接口;0 m. [& m+ K$ A% e; G
0 w4 K% e. H# Q& j
6) 作为消费者引用外部模块时,须在内部定义提供者接口(归属于业务逻辑层),然后针对外部模块按提供者接口标准设计专用适配器完成数据转换;
3 m/ a" S2 }$ j8 v! z' q9 C. Y# ]( A* L7 W$ T+ V& x1 x
7) 层次之间采用IoC的方式实现整合;" B, V0 @: ^7 ], o$ Q1 s# v3 K  Z
2 V4 A  ]( r4 E5 R$ F
8) 作为生产者对外提供服务时,须将服务接口封装形成应用支持SDK。2 Y6 t2 [' e" c5 y* G: {, |

) G0 I2 V! d* G实现方面的倾向性意见:: u) N4 E; M* K0 ?

. ]$ I" y( a2 q9 J1 ~a) 技术路线选择java,提供.NET应用支持;. k; W" u) `& S, l; U2 W) m" [% E

8 s  f% Q1 x6 S4 Db) IoC框架选用Spring;
. d  B, a! @/ I; Y( f
- O2 b! m- ]2 C% y, o" rc) 数据库以Oracle和Sql Server为主,预留扩展接口;
. Y. z2 o8 w9 Z# Q
$ ?) j5 N4 ]( V( g+ Y: Ad) 数据访问层以Hibernate为基础进行封装实现;& h+ e+ p) Q0 L8 H" W( |4 a

  {: C( i8 v# L+ be) 基于Web的前端展现以Extjs为核心,允许引入Jquery;
0 D, k6 a, M5 w; b5 O* @2 E3 i1 i* O" T( W' s8 W8 n* |' W  K
f) 浏览器和web服务器端的ajax交互以extjs的direct为主;
$ [( j  P* d) K4 f0 f; w
( k5 e( `) i# w& x0 w4 \g) 为了增强用户体验,需统一界面风格和配色标准。2 D3 g6 m6 f& H( a8 K6 P/ S

* }8 |% k" B2 y; S/ |* {  M: M. K4 y; x/ y( s; I6 s( b  S, x

* h4 g. e( A- \  S3 A此外,诸如“分页查询的适用场景”、“存储过程的引入原则”、“事务控制的指导意见”、“安全通讯的备选方案”之类的指导意见库也需要不断的完善和丰富。
' H+ ?- p8 w( x
( A0 t* h: n* q! ?+ }4 y8 _/ v" y# w6 h! P
+ r/ [" M8 p$ E( K$ Z+ r% j) h3 v
问题四:平台选用迭代的方式开发,模块的优先级应如何定义?
. p3 c4 L' |6 d- }( QABC平台的用户是业务部门,基于ABC平台开发的应用系统才会面对真正的终端用户,为了“在达成最终用户要求的基础上降低个人工作强度”,实施工程师必然会综合考虑最终用户的“应用级”需求,传递到平台研发这里,形成了平台开发要求。这里我没有使用“需求”,因为用户提出的永远都是要求,需求是由项目组相关人员分析获得的(个人观点),提交用户确认的需求分析报告中已经包含了功能优先级的定义。
$ G- @5 y, t' E$ T2 U% C' R- o" M' ]- I4 U7 Q
由于着眼点的不同,开发团队和用户理想中的功能模块优先级很难获得统一。用户采用“哪个先上线带给我的好处最多”来判断,而开发团队则用“如何安排次序最能节约研发成本”来评判,最终的选择结果一般是二者相互妥协的折中。
1 \1 ~; n' x! ]  |7 c8 R/ z( Z4 @7 b( _4 T
对于ABC平台的研发,我觉得可以尝试考虑“最小可用版本包含什么功能”、“再扩大一下范围呢”、“先不做aa,直接做bb,能否满足可用要求”这几个问题来定义模块优先级。显而易见,业务部门眼里的“最小可用版本”应该不会包括系统服务总线,这就是冲突,需要讨论,需要权衡。
. s1 L5 f. X9 G9 r" v; m+ d, Z) L* G7 m3 R$ n' F
本节关键词:权衡。' x" K" L+ q3 A3 ~

7 A% S& w4 \! @; H9 k
  u0 z) M% [; y! B
3 ^! j! A- m$ M问题五:针对平台模块,可否抽象出统一的作业指导说明书?2 _8 p! d% I. J5 m0 k! G# O
作为具备多年实践经验的软件工程师,我们都熟悉软件工程中定义的开发方法和开发流程,然而直接用作平台模块的作业指导却显得过于遥远,虽然我们理应遵循软件工程的各项原则,但我觉得依然需要一个可行性较强的作业指导说明书作为补充,或称之为操作指南。
4 q/ d3 T1 }0 `$ m, _: g# f# [9 ~% w$ i. T* o4 u
我尝试着为这个操作指南罗列了如下条目(当然,若真的施行,还是需要研发团队集体的力量):
( T- z3 k$ F. A! |& j5 [/ o( s; k1 Y; P& j: {3 ~
1) 模块需设置“产品经理”之类的岗位角色,对整体功能和研发路线负责;
& Z+ R8 k. X1 y/ J- s2 H
' o: W+ m4 u2 M2) 产品经理主导需求调研和分析过程,是需求规格说明书的责任人;" Y& R! u% c! v5 q+ C
: ?1 Z$ q/ H# c4 m2 N+ t6 a
3) 模块的技术架构遵循统一的平台标准;
% y- H- L- U9 D- n8 @3 s4 t: W: f& l- ^0 V7 v- M) s
4) 模块首先确定其功能定位和设计目标;
$ c% d' C' E( _/ t" {
  _$ b, u5 p; X. S5) 模块第二步要明确的是关联系统和交互接口;
: g6 F$ m' ~% t  V0 S0 z
  H8 t8 C/ D8 k4 f8 [) Z1 `6) 将模块需求分类,为非通用需求设置辅助工具单独设计;
! n4 P6 O; @5 {* \2 z2 \# j* I. o+ P: g) R, r5 d$ s. j
7) 模块内部功能细分形成逻辑独立的子模块,按实际需要提供剥离支持;1 d$ S# M/ W7 y- K" @) y* n
* M) z. s9 s* `, c
8) 外部接口的定义和伪装实现优先于内部设计;
5 |2 N  E) w1 D% E! `2 [
0 v+ W, `" R# `4 ?( f  P本节关键词:指南。
: k+ N( o+ h0 f  h9 S- m! W6 I
( e0 G3 c+ f2 [$ N4 W3 r4 l5 r0 y7 B: e$ m5 w
2 P9 }9 N1 ^3 T) V: D7 `
问题六:平台模块可否委托研发?如何施行?. \) M3 W7 k$ C4 E
对于不能直接产出利润的平台研发,公司的资源总是紧张的,人手总是不足的,除了补充人员之外,我们可否选择委托研发呢?这里我没有使用“外包”,因为委托研发除了外包,还有“交由业务部门自行设计开发”的一层意思,而且我个人认为编码实现外包是可以的,而系统设计最好在公司内部实现,至于具体模块的产品经理(Product Owner)必须是内部人员。* G. ^. U  L( ]0 P) i: ~
* f# S; `7 _; Z% r' _7 U, n
委托研发的核心思想是研发任务“分流”,而工作“分出去”的重点在于如何“收回来”,这就需要制定一套评价体系(就是问题三的输出结果)用作任务回收时的验收标准,向业务部门分派任务时申明验收标准(他们无须理解水渠的规划,只需保证挖的坑符合特定要求即可)并附带作业指导说明书(诸如“如何挖坑更省力”、“论铁铲和䦆头在挖坑工作中的效用”之类的东西),只要业务部门遵循这些规范进行开发,最终就可以顺利地纳入ABC平台达到“水到渠成”的效果。
+ E6 \, [! Z- D' K9 c; E9 t5 H9 b6 p8 ^- Y0 u
本节关键词:分流。
& i# z6 `5 l9 F8 H% Q# D- S1 {& g+ ^' o% W& h1 r! K, L0 R: F

0 L2 j) t. z. p' k/ C' e  Z+ h% C; i. R* A! R
问题七:ABC平台研发的产出是什么?除了平台本身还应该有什么?
) N+ G2 U7 j. [+ B  g5 \+ b# X虽然我们当前的主要任务是研发一个切实可用的优秀平台,但本着效用最大化的原则,还应当考虑一下平台研发的附带产出。对于这个问题,我首先想到的是“锻炼队伍”,后来又归纳出了“求渔”一词。
+ [8 B, Q# o1 \2 L: c& s& q' A! m( ^6 E, m3 M. k
话说“授人以鱼不如授人以渔”,这是从赠予方的角度解读的,假设我们是接受方呢?于是想到了“求渔”一词,然后ABC平台在我眼里就成了一条鱼,如果通过这次捕鱼(不挖坑修渠,改结网捕鱼了)的经历进行有意识地总结,提升到渔的境界岂不更好?我们总结一套适合公司现状的行之有效的系统开发规范,新成员加入时首先参加流程培训,而后即可以最快的速度融入团队开发,虽然这些已经超出了ABC平台的范畴,但我还是觉得非常有必要分析讨论一下。
. B" Y  f/ C( l: d% r$ v; {4 G' }& l  z- ^' `- O
本节关键词:求渔。0 A+ m* [4 y) V0 R
8 \- }) P) D/ l  n4 A; C/ T' [1 O. E
$ d7 {5 M! c: \2 c2 S& t

1 r) x6 S8 g/ H9 C8 B- O- R. Q最后总结一下,我对平台研发的个人想法主要集中在“定位”、“协作”,“标准”、“权衡”,“指南”、“分流”,“求渔”七个关键词上,或有词不达意之处,仅供参考,欢迎拍砖。! c/ G- J4 Z: |, q2 r! ^( x0 E

作者: zaiyiaaaa    时间: 2020-8-17 15:31
“定位”、“协作”,“标准”、“权衡”,“指南”、“分流”




欢迎光临 EDA365电子论坛网 (https://www.eda365.com/) Powered by Discuz! X3.2