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

简介:   最近有不少朋友写信问我一些关于团队开发的问题,由于这段时间有些忙,没有回复.今天写一篇这方面的文章向大家介绍一下我是如何带领团队开发工作流项目的   关于团队建设,项目管理的文章网上已经有很多了,在这里我就不谈这些理论了,直接给大家展示一个我在 项目开发方,后台服务开发方式,前台UI开发方式,...

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

  关于团队建设,项目管理的文章网上已经有很多了,在这里我就不谈这些理论了,直接给大家展示一个我在 项目开发方,后台服务开发方式,前台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 

 

B 

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

执行状态

目录
相关文章
|
测试技术 项目管理
艾伟也谈项目管理,关于项目管理的一点体会
  这段时间,一直在负责一个项目的管理与开发。在时间短、任务紧,而团队人员又大部分是没有经验的菜鸟的恶劣情况下,我带领接近40人的团队,终于在客户规定的时间范围内如期交付产品。这其中,经历了需求变更、人员变动(因为其它任务,先后有近10人离开团队)等诸多问题,项目仍然取得成功了,不能不说有几分侥幸,但此外也有一些经验与教训可以与大家分享。
990 0
|
项目管理 开发者
艾伟也谈项目管理,项目的故事
  这是关于一个项目的故事,与其它项目相比,既不非常复杂,也不是很简单: 一个应用程序与数据库以及其它两个系统通信。这在技术和架构角度都是主流,而在管理角度则是标准情况: 所有工作都应该在昨天完成,但还有很多没有完成的。
1225 0
|
测试技术 项目管理
艾伟也谈项目管理,项目做完了,总结一下
  在连续封闭N个月以及再后来的N个月的加班后,项目终于以延期N个月的结果结束了。不管曾经发生过什么,不管项目是否延期,重要的是项目结束了,所有的项目成员都可以松一口气了。曾经和同事开玩笑说:在我经过过的失败项目中多了一个项目,以后就能避免同样类型的失败了。
1023 0
|
测试技术 项目管理
艾伟也谈项目管理,大项目的思考
  引言:进入现在这个我们内部号称“豪门”的项目已经两个多月了。现在回想起进入项目前一位前辈的话:“大项目有大项目的问题,但大项目也有很多东西可学“,自己此时深表赞同。两个月的时间,自己从刚来前两周的观察学习,到现在的基本融入,在这个过程中自己有了很多的想法和思考。
952 0
|
测试技术 项目管理
艾伟也谈项目管理,成功软件项目管理的奥秘
  如何入门并设定软件成功的目标    1、如何开始项目管理(如何入门) 实践技能建议 要点说明 1.设定优先级 1)         为团队成员提供服务 2)         满足组织客户的需求 3)         从事自己相关的项目 2.分析自我能力差距 人员管理(人际关系、解决冲突、推销想法) 聆听技巧 锻炼演讲表达能力 3.
1210 0
|
程序员 项目管理 数据库
艾伟也谈项目管理,微型项目实践感悟
1. 什么是微型项目 微型项目是指绝大部分工作由一个人员负责的项目,这个核心成员负责项目的系统分析、构架、及绝大部分的编码工作。项目的持续时间一般不会超过一个月。项目的参与人员除了核心的程序员外还可能一部分辅助人员,包括第二程序员(负责一部分编码工作)、美工(负责界面设计)等。
1533 0
|
运维 监控 安全
艾伟也谈项目管理,我眼中的DevOps
  相关文章:DevOps,不是一个传说!   过去一年以来,一批来自欧美的、不墨守陈规的系统管理员和开发人员一直在谈论一个新概念:DevOps。DevOps 就是开发(Development) 和运维(Operations)这两个领域的合并。
2071 0
|
Java PHP 项目管理
艾伟也谈项目管理,创业公司技术选型参考
  java推荐框架  web项目来说,spring、struts是必选,当然有更加好用的,推荐来自疱丁分词作者王志亮在人人网的rose框架,使用上手快,配置少,是创业公司java必备。   php框架推荐  zend framework,或者直接写个简单的框架,php的框架更加倾向去规范代码,让所有项目在新人加入时快速上手。
1334 0
|
测试技术 项目管理
艾伟也谈项目管理,敏捷个人:内容框架之执行力
  执行力是敏捷个人需要学习的一个内容,本篇主要介绍执行力相关的内容,大家在读后可以采用介绍的一些指南开始行动。 执行力的三个层面 按照命令和规则做事的过程,简单讲就是能够听话照做 按照预定的计划行为的过程,简单讲就是做事章法 将想法变成现实的过程,简单讲就是规划实现   对第一个层面来说,要做的事情是片段的、非连贯的,但对第二个层面来说是连续的、整体的。
1012 0
|
架构师 测试技术 项目管理
艾伟也谈项目管理,给敏捷团队中的架构师的10个建议
  微软澳大利亚的解决方案架构师Tom Hollander,在TechEd Australia大会上举行了一场题为“敏捷团队中的架构师角色”的演讲。在演讲中,他讨论了他作为领导敏捷团队的架构师所做的工作。
1151 0
下一篇
无影云桌面