艾伟也谈项目管理,我是如何带领团队开发项目的

  最近有不少朋友写信问我一些关于团队开发的问题,由于这段时间有些忙,没有回复.今天写一篇这方面的文章向大家介绍一下我是如何带领团队开发工作流项目的

  关于团队建设,项目管理的文章网上已经有很多了,在这里我就不谈这些理论了,直接给大家展示一个我在 项目开发方,后台服务开发方式,前台UI开发方式,后台服务与前台UI对接方式,代码文档,页面的开发文档,源码管理,单元测试,以及单元测试文档,实现思路设计文档,数据库文档,数据库设计规范,编码规范,操做数据的方法命名规则 方面的一些片断,这是一个为期6个月的工作流平台开发项目,是今年3月份启动的,现在已完成,比计划时间多出25天.核心开发人员(不包括美工,需求,黑盒测试)共有12人(编号从114到125)

  补充一点:在UI草图设计上,这次想用绘图板,但最后还是使用铅笔绘制+扫描的方式制做的.

项目开发方式说明图

 

后台服务开发方式说明图

 

前台UI开发方式说明图

后台服务与前台UI对接方式说明图

 

代码文档(片断节选)



方法签名


public int? addBaseEnumeration(string powerID, List list)



返回值

  • [0]:方法未完成
  • [null]:操作成功
  • [401]:参数[powerID]没通过[security.checkPowerID方法]验证
  • [-1]:参数[list]为[null]
  • [-2]:参数[list]中的[baseEnumeration.rowID]为[Guid.Empty]
  • [-3]:参数[list]中的[baseEnumeration.entity]为[null]或[string.Empty]
  • [-4]:参数[list]中的[baseEnumeration.field]为[null]或[string.Empty]
  • [-5]:参数[list]中的[baseEnumeration.entityType]为[null]或[string.Empty]
  • [-6]:参数[list]中的[baseEnumeration.title]为[null]或[string.Empty]
  • [-7]:参数[list]中的[baseEnumeration.value]为[null]或[string.Empty]
  • [-8]:参数[list]中存在[rowID]重复的记录
  • [-9]:参数[list]中存在[Entity][field][value]重复的记录
  • [3] :参数[list]中的[baseEnumeration.rowID]在数据库中已存在
  • [4] :联合唯一索引[Entity][field][value]在数据库中已存在
  • [5] :参数[entityType]的传入值不是枚举表[entitytype]的基础枚举数据
  • [6] :插入时数据库异常
  • [7] :不能插入[entity]为["insertBaseEnumeration"],[field]为["entitytype"]的数据


参数

  • [powerID]: 权限参数
  • [list]: 多条baseEnumeration表记录,的泛型集合


约束


<1> 调用[security.checkPowerID方法]判断[powerID],如果[security.checkPowerID方法]返回[false],返回[401]

<2> 如果参数[list]为[null],返回[-1]

<3> 如果参数[list]中的[baseEnumeration.rowID]为[Guid.Empty],返回[-2]

<4> 如果参数[list]中的[baseEnumeration.entity]为[null]或[string.Empty], 返回[-3]

<5> 如果参数[list]中的[baseEnumeration.field]为[null]或[string.Empty], 返回[-4]

<6> 如果参数[list]中的[baseEnumeration.entityType]为[null]或[string.Empty], 返回[-5]

<7> 如果参数[list]中的[baseEnumeration.title]为[null]或[string.Empty], 返回[-6]

<8> 如果参数[list]中的[baseEnumeration.value]为[null]或[string.Empty], 返回[-7]

<9> 如果参数[list]中存在[rowID]重复的记录,返回[-8]

<10>如果参数[list]中存在[entity][field][value]重复的记录,返回[-9]

<11>如果参数[list]中的[baseEnumeration.rowID]在数据库中已存在, 返回[3]

<12>如果联合唯一索引[entity][field][value]在数据库中已存在, 返回[4]

<13>如果参数[entity]为["baseEnumeration"],[field]为[entitytype]的数据,返回[7]

<14>如果参数[entityType]的传入值不是枚举表[entitytype]的基础枚举数据, 返回[5]

<15>如果插入时数据库异常, 返回[6]



说明


[Entity][field][value] 联合唯一索引

<14>获取[Entitytype]基础枚举数据时,使用[23 selectBaseEnumerationTypeName]得到枚举类型名称



单元测试


(组合测试),(自动判断返回状态),(自动判断返回结果)

WFServiceTestProject. manageServiceTest. addBaseEnumerationTest()

 


//[26] 批量添加枚举

public int? addBaseEnumeration(string powerID, List list)

{

//<1>

if (!security.checkPowerID(powerID))

{

return 401;

}

//<2>

if (list == null)

{

return -1;

}

using (wxwinterDBDataContext db = new wxwinterDBDataContext())

{

//<3>

if (list.Count(p => p.rowID == Guid.Empty) > 0)

{

return -2;

}

//<4>

if (list.Count(p => string.IsNullOrEmpty(p.entity)) > 0)

{

return -3;

}

//<5>

if (list.Count(p => string.IsNullOrEmpty(p.field)) > 0)

{

return -4;

}

//<6>

if (list.Count(p => string.IsNullOrEmpty(p.entityType)) > 0)

{

return -5;

}

...............................

页面的开发文档(片断节选)


模块编号


Wxwinter.Index.Power.manageDutyControl


模块需要调用的其它UI模块列表


Wxwinter.Index.Power.insertDutyControl

Wxwinter.Index.Power.changeDutyControl


模块的调用入口UI


Wxwinter.Index.Power.navigationOrganizationControl


UI类型


[ V ] 中控件 700 * 500


工具栏按钮的调用路径


[ V ] 无工具栏


模块调用方式


[ V ] 模式化弹出框


action说明


不需要action



 

源码管理

 

单元测试,以及单元测试文档(片断节选)

文档


×


方法签名


public int? transactComplete(string powerID , Guid instanceID , Guid stateID , string transactResult , status status)


×


返回值

  • [0]:方法未完成
  • [null]:操作成功
  • [401]:参数[powerID]没通过[security.checkPowerID方法]验证
  • [-1]:[instanceID]为[Guid.empty]
  • [-2]:[stateID]为[Guid.empty]
  • [1]:[wfStateTransactTask]表中没有指定完成的办理任务
  • [2]:所指定的办理任务处在非等待状态
  • [3]:数据库提交失败

×


参数

  • [powerID]: 权限参数
  • [instanceID]:实例编号
  • [stateID]:状态编号
  • [transactResult]:办理结果
  • [status]:身份


×


约束


<1>调用[security.checkPowerID方法]判断[powerID],如果[security.checkPowerID方法]返回[false],返回[401]

<2>调用[checkInstanceState()]方法对[instanceID][stateID]指定的实例状态进行验证,返回值不为[null],返回[checkInstanceState()]的返回值

<3>调用[checkStatus()]方法对[status]进行验证,返回值不为[null],返回[checkStatus()]的返回值

<4>得到[wfStateTransactTask]表中

[

wfStateTransactTask.instanceID = instanceID

&& wfStateTransactTask.stateID = stateID

&& wfStateTransactTask.departmentNo = status.departmentNo

&& wfStateTransactTask.dutyNo = status.dutyNo

&& wfStateTransactTask.personNo = status.personNo

]

的记录并赋给变量[taskInfo],如果不存在,返回[1]

<5>如果[taskInfo.runState != runState.wait],返回[2]

<6>修改

[

taskInfo.runState=runState.end

taskInfo.completeTime=System.DateTime.Now

taskInfo.transactResult=transactResult

]

用[taskInfo]修改[wfStateTransactTask]表中记录

<7>向[wfStepList]中插入数据

[

flowID = taskInfo.flowID

flowName = taskInfo.flowName

nodeID = taskInfo.nodeID

nodeName = taskInfo.nodeName

departmentNo = status.departmentNo

departmentName = status.departmentName

dutyNo = status.dutyNo

dutyName = status.dutyName

personNo = status.personNo

personName = status.personName

instanceID = taskInfo.instanceID

stateID = taskInfo.stateID

processID = taskInfo.processID

processName = taskInfo.processName

stepAction = stepAction.办理

stepTime = System.DateTime.Now

taskID = stepAction.办理

]

<8>如果数据库提交失败,返回[3],成功,返回[null]


×


说明


调用[checkInstanceState()]方法对实例状态进行验证


×


单元测试

 

 

单元测试选项


范围


判断


影响


(无)

 

(不需要)

 

(全路径)

 

(正常路径)

 

(简单调用)

 

(组合测试)

 

(已在外部调试通过)


(自动判断返回状态)

 

(自动判断返回结果)

 

(人工判断返回结果,结果控制台输出)

 

(人工判断返回结果,结果存入磁盘)

 

(自动判断操作结果)

 

(人工判断操作结果,结果存入数据库)

 

(人工判断操作结果,结果存入数据库)

 

(不出异常即可)

 

(说明…)


(操作数据库,完成测试后已复原)

 

(操作数据库,已做state标记)

 

(操作数据库,需要手工复原)

 

(操作临时数据库)

实现思路设计文档(片断节选)

例1:工作流结构的解析

例2:删除部门职能人员的约束

 

例3:查询用户的模块权限

public List<viewRelationModel> searchModelPowerOfPerson(string powerID,string personNo)

searchModelPowerOfPerson("","user1")


step1


使用 searchStatusList("", "user1") 得到[得到身份列表]


departmentNo 


dutyNo 


personNo 




user1 




user1 




user1 


step2


用得到的身份与[powerRelationModel]对比,并返回如下算法的集合


departmentNo 


dutyNo 


modelNo 


action 


scope 


all 



m1 


see 

 


all 


m2 


see 

 

all 


all 


m3 


see 

 



m4 


see 

 

 

数据库文档

wfFlow 流程表

表说明:存储流程模板的属性信息,该表内容是将xoml存入时,解析xoml后一次性生成的,不能修改


flowID


流程编号


f1


来自iFlow


flowName


流程名称


f2


flowType


流程类型


f3


flowDescription


流程说明


f4


businessType


业务类型


f5


startWindow


启动窗体


f6


dataFormList


表单列表


f7


startDataForm


启动时填写的表单


f8


inputFormItems


传入表单


f9


inputFormItemsExpandData


传入表单扩展数据


f10


commandOption


命令选项


f11


commandOptionExpandData


命令选项扩展数据


f12


ownedType


流程归属类型


f13


timelimitUnit


时限单位


l1


来自iTimelimit


timelimit


时限


l2


overtimeOperate


超时操作


l3


calendar 


日历


l4


residualTimelimit


剩余时限


l5


createDepartmentNo


创建部门编号


创建该流程模板的人员所在部门的编号


createDepartmentName


创建部门名称

 

createDutyNo


创建职能编号


创建该流程模板的人员所担任的职能的编号


createDutyName


创建职能名称

 

createPersonNo


创建人员编号


创建该流程模板的人员的编号


createPersonName


创建人员名称

 

createTime


创建时间

 

isCheckout


是否签出


如果为真,签出人可以对流程模板进行修改,非签出人不能再将该模板签出进行修改,如果为假,就可以将该流程签出进行修改


checkoutPersonNo


签出人员编号

 

checkoutPersonName


签出人员名称

 

checkoutTime


签出时间

 

checkinTime


签入时间

 

isFreeze


是否冻结


如果为真,流程模板处于冻结状态,不能被启动

如果为假,流程模板可以正常启动


wfFlow 流程表 表结构

数据库设计规范(片断节选)


SQL Server 类型


C# 类型


说明


nvarchar(50)


string

  • 字符类的[唯一索引]
  • 标识类信息,如用户名,口令,性别
  • 标签类信息
  • 标记类信息
  • 状态标识 :如:[成功],[失败],[运行中]

对应的UI为单行行文本框,标签,提示文字


nvarchar(255)


string

  • 小量的描述信息,两行以上
  • 磁盘文件的路径信息

对应的UI为垂直滚动条的多行文本框,或多段的标签


nvarchar(MAX)


string

  • 文章
  • 二进制串行化信息
  • XML数据
  • 大字符数据

对应的UI为双滚动条的多行文本框

编码规范(片断节选)

操做数据的方法命名规则


前缀


含义


传入


返回


get


得到单条记录


rowID


单条记录对象


唯一键


search


查询多条记录


唯一键


List<记录对象>


非唯一键


多个参数, [and/or]关系组合


select


查询多条记录


唯一键,[字段名]


List

字段名所对应的[表.字段.ToString()]


非唯一键,[字段名]


多个参数, [and/or]关系组合,[字段名]


change


修改单条


记录对像


执行状态


stringResult.state 执行状态

stringResult.value 出问题的字段


set


修改单条


唯一键,[字段名],[值]


执行状态


rowID,[字段名],[值]


update


修改多条

(事物)


List<记录对象>


执行状态


modify


修改多条

(无事物)


List<记录对象>


无法完成修改的List<记录对象>


insert


添加单条


记录对象


执行状态


add


批量添加

(事物)


List<记录对象>


执行状态


stringResult.state 执行状态

stringResult.value 出问题的字段


append


批量添加

(无事物)


List<记录对象>


无法完成添加的List<记录对象>


remove


删除单条


rowID


执行状态


唯一键


delete


删除多条

(事物)


List<记录对象>


执行状态


clear


删除多条

(事物)


多个参数, [and/or]关系组合


执行状态


wipe


删除多条

(无事物)


List<记录对象>


无法完成删除的List<记录对象>


execute


执行sql


SQL 字串

 

存储过程


执行状态


stringResult.state 执行状态

stringResult.value 问题


stringResult.state 执行状态

stringResult.value 返回对象的XML


binding


添加单条(关系表)


记录对象


执行状态


unbinding


删除单条(关系表)


rowID


执行状态

时间: 2024-09-16 05:11:50

艾伟也谈项目管理,我是如何带领团队开发项目的的相关文章

艾伟也谈项目管理,给敏捷软件开发的26条建议

我经常收集各种各样的至理名言,最近我重温敏捷软件开发:真正的问题是什么?下面是一份26条关键原则的清单,以指引敏捷软件开发团队. 1.完整地干完一件事后在开始另一件事:用厨房比喻来说就是:"先上这道菜,再开始做下一道".软件开发的最大问题就是同时开始几件事情,这将不可避免的造成某些工作被废弃,从而造成浪费.专注于一件事:完整地实现其功能:运行测试:编写文档:签入所有,把这当做一项工作完成,然后再开始下一件事. 2.不要破坏构建:非常明显,但必须被包含在任何软件开发建议清单中.程序员在签

艾伟也谈项目管理,关于项目管理的一点体会

这段时间,一直在负责一个项目的管理与开发.在时间短.任务紧,而团队人员又大部分是没有经验的菜鸟的恶劣情况下,我带领接近40人的团队,终于在客户规定的时间范围内如期交付产品.这其中,经历了需求变更.人员变动(因为其它任务,先后有近10人离开团队)等诸多问题,项目仍然取得成功了,不能不说有几分侥幸,但此外也有一些经验与教训可以与大家分享. 一.项目开发方面 需求 项目应以需求为核心.一个项目是否能够成功,对需求的准确把握在成功因素中要占上60%的比例.不管系统的架构设计.团队管理有多么的成功,如果需

艾伟也谈项目管理,个人管理:写书之前应该回答的几个问题

我在06年和一个同事写过一本Delphi入门的示例书籍Delphi数据库通用模块及典型系统开发,当时体会到了写书不像想象中的简单,基本上业余时间都没了,所以我之后就不想出书了,其中更重要的一个原因是,我还没有找到一本真正想与大家分享并且自己能写出来的书籍. 博客是个好东东,只要你愿意与人分享交流,你的行为就可以赢得大家的认可,如果你的观点或者文章写的又好,那么就会有更多形式与大家分享,例如最近我们可以看到的很多人都由于blog而出书了.同样,我这两年对博客的投入也赢得了一些人的信任,也收到过好几

艾伟也谈项目管理,项目管理一些体会

项目管理需要的知识,是一个体系的知识,包括项目管理本身的知识体系,以及项目管理要应用到的领域所需要的知识体系,然后就是管理的技能,当时最重要的,是软技能,也就是人际关系技能. 管理的核心:人. 管理的四大要素: 1. 选择正确的人 2. 为他们分配正确的工作 3. 保持他们的积极性 4. 帮助团队凝聚起来并保持团队的凝聚力. 1. 选择正确的人 首先要学会看人.虽然我不是人力资源专家,但是我清楚一个软件项目的成功所需要的成员素质,主要就是沟通能力和责任心. 由于工作需要,我面试过一些人,有毕业生

艾伟也谈项目管理,软件架构引言之项目管理的问题

软件架构引言之项目管理的问题   很多朋友都有过或者正在管理一个或者多个软件项目,那么我的文章就从这个问题开始:如果单纯从表象来说,软件项目管理过程中暴露的最大问题是什么?   不同的人的会有不同的答案,但是大致这样的答案我想大部分人都是会认可的,那就是"进度拖延".进度拖延当然是表象之一了,其他诸如质量不过关.功能不完整等等,我觉得都是和进度拖延密切相关的.很多项目经理都想去做那些认为是十分必要的事情,比如计划.测试等,但是"没有时间".为什么会没有时间?等到项目

艾伟也谈项目管理,基层管理杂谈

几乎每种行业都有基层主管(或基层管理人员),而软件行业的基层主管一般是项目经理.技术经理.开发经理.组长等.其职责是资源协调.风险预估.项目管控.团队建设,说白一点大多数的企业现状就是项目负责人带领团队攻下一个又一个项目的过程.很多公司以项目成败作为项目负责人考核的唯一标准,因为项目规模.成本.客户满意度等容易量化,并且是直接跟公司的利润有很大关系:而相反团队建设却难以衡量,如何衡量一个普通技工晋升成高级技工到底是基层主管的培养还是原员工本身就具备高级技工的技能.因此,难免出现以项目额度论英雄的

艾伟也谈项目管理,利用简单的一元线性回归分析估计软件项目开发时间

引言       前两天一个朋友给我打电话,问我如何估计项目开发时间.对此我很诧异,问他以前他们是怎么估计的,他说以前基本都是大家开个会,大约都说说自己意见,最后负责人一拍脑袋,给出一个时间.不过这次遇到一个非常认真的客户,要求不但要估计出项目开发时间,还要明确说明具体的依据和估算方法,这下我这朋友有点犯难,才询问我.后来我翻阅了一些数理统计和项目估算方面的资料,告诉了他利用一元线性回归分析估计软件项目开发时间的方法.想到这种估算需要在一些开发团队很常见,所以在这里整理成文. 问题的定义及数学模

艾伟也谈项目管理,BUG平台应该是一个知识库

我很喜欢看各个产品的Bug追踪系统,比如jQuery的Bug Tracker,因为在Bug系统中总能发现一些非常细节的问题,补充自己的知识,慢慢地自己的代码的兼容性会有很大的提高. 但是,在各个Bug系统之中,包括现在公司使用的Trace系统,无一例外地存在一些让我不满意之处,其中最大的原因就是很多Bug系统仅仅是作为Bug的记录系统存在,而没有试图去让一个Bug成为一个知识的积累,让整个Bug系统变成一个丰富充实的知识库.这样的Bug系统,永远都只是提供一个简单的业务流程,不会变成干完人员.产

艾伟也谈项目管理,多任务让你走得更慢

现代商务依靠多任务来完成工作.评价员工也基于的他们多任务能力.IT业人员会被例行指派到多个项目中去.我们是经常在这样做吗?多任务起作用吗?多任务的真正影响是什么?有别的选择吗? 这里老词重提一下"单任务",它代表了我们在多任务之前所习惯的软件工作方式.在这里的"多任务",指的是"工作在很多项目上".现代商务把它称作"多任务",认为它是一种更有效提高工作输出的策略.其实,不止工作,我们在日常生活中也会小规模地多任务.这两者在做法