2009年9月29日星期二
准备再研究一下JIRA+CONFLUENCE
项目管理软件选择陷入僵局!
| Jira+Confluence | dotProject+PmWiki | Redmine+instiki | |
| 优势 | 灵活的ISSUE管理和自定义的过滤器 | 管理领域全面 | 功能适中 |
| 基于登录的WIKI和完善的权限控制 | 内置讨论区 | 分项目的WIKI | |
| 插件丰富 | 条目分类清楚(任务,时间,问题,风险,机构,部门,联系人) | 插件丰富 | |
| 劣势 | 没有分项目的WIKI | 没有分项目的WIKI | instiki功能简单 |
| 商业版,目前可以破解 | 缺乏自定义过滤器 | 任务分层必须使用插件实现,但是插件安装失败 | |
| 没有事件管理 | 插件少,缺少图表 | 插件安装困难,版本混乱 |
2009年9月28日星期一
2009年9月27日星期日
准备放弃redmine了
2009年9月25日星期五
新公司的工作内容
- 工程部门和软件部门的项目现状的调研,其中包括多次参加各个项目的诊断会议,然后给出诊断报告。
- 制定一个初步的软件开发项目管理过程指导书,同时给出相应的各种文档模板。
- 制定项目办未来大约两年的工作内容规划,在规划中给出项目办的工作职责以及8个阶段的工作内容和预期效果。
- 制定公司级别的项目管理团队绩效考核办法。
- 另外的一个重要的任务,是老板吩咐了需要在公司建立项目管理信息系统。
关于PMIS (Project Management Information System)的选择,目前决定使用版本控制软件+项目管理系统+维基(作为门户)的组合。
- 版本控制软件选择了''Subversion''而不是目前公司通用的Visual Sourcesafe。
- 主要是考虑到为了以后能够更方便的配合项目管理系统。因为多数流行的低费用的项目管理系统都能够对Subversion或者CVS进行集成,而支持VSS的很少。
- 项目管理系统选择了''Redmine''而不是Jira或者dotProject。
- dotProject虽然功能非常强大,基于PHP部署方便,但是其定制能力有限,而且想要扩展的话也是源代码级别的。考虑到可能的功能的灵活性的要求,只能放弃了。(使用过程中发现~PHP5.3下面有无法解决的问题,总是显示错误提示,之后换用~PHP5.2.X,一切正常。好在基于WAMP进行试用,切换PHP的版本非常方便。)
- Jira其实是非常适合的产品。系统稳定,功能强大。可定制能力非常强!而且功能扩展也非常方便,有现成的N多插件可以选择,足以满足需要。而且可以和Confluence进行集成也很诱人。缺点是商业软件,破解繁琐。基于JAVA平台,因此试用时部署非常方便,但是在生产环境下的部署却比较麻烦。
- Redmine基于~RoR平台,部署非常方便。有插件机制因此也可以方便的进行扩展。Open Source所以实在不行也可以自己编写扩展。功能还算灵活,相比Jira配置简单,内置了WIKI和新闻发布。目前的问题是:功能不够复杂(呵呵,给老板看的时候需要更像一个庞大的系统),缺乏企业级的管理功能,不过通过插件应该可以弥补。性能如何目前还不肯定。
- 维基系统选择了''instiki''而不是~PmWIKI或者Confluence.
- Confluence应该是最适合企业应用的WIKI软件,况且能够和Jira完美配合。无奈是商业产品,破解困难。另外基于JAVA,生产环境下和Jira一同部署也比较麻烦。
- ~PmWIKI基于PHP系统,部署非常方便。另外自身功能也很不错,权限控制也比较灵活,能够应付企业应用。有非常丰富的插件可以选择,可扩展能力很强!
- instiki功能简洁,勉强满足需求。不过它也是基于~RoR平台的,因此在和Redmine同时部署的时候比较方便。
2009年9月1日星期二
何时应该使用用例进行建模
- 系统有功能性需求所主导。
- 系统具有很多类型的用户,系统对他们提供不同的功能(有很多参与者)。
- 系统具有很多接口(有很多参与者)。(我的理解:如果针对业务应用系统而言,意味着有很多操作界面。)
- 系统由非功能性需求所主导。
- 系统具有很少的用户。
- 系统具有很少的接口。(例如嵌入式系统或者算法复杂但接口很少的系统)
- 用例建模的基本原则是保持捕获到得信息量是必要的、最小的。这意味着,很多次要场景可能根本就没有说明——用例中的一行有关它们的描述可能让人足以理解系统的功能。
2009年7月10日星期五
月盈则亏,水满则溢
2009年7月7日星期二
今天下午的测试培训会议
看见一个口齿不太清楚的人正在演示ppt。听了听内容,基本事实幼儿园级别的入门培训。从测试的一些基本概念到测试管理,简单讲了讲td的使用等等。
老板和测试人员们正在很崇拜的请教。
(下周就要进行UAT测试了,现在临时抱佛脚。)
中间讲到了目前应该怎么测试流程,专家建议仅仅找一个最主要的流程走通。(专家把物流系统当作简单的网上购物了。)
讲到目前测试人员太少,只有两个。专家说50多个开发人员起码需要有五六个测试人员嘛。现在需要将开发人员调入参与测试执行。(目前项目的状况,开发人员还都在满负荷地进行开发呢……五六个测试人员就够了吗?)
讲到测试人员目前介入得太晚了,不了解需求。专家说:这说明项目经理一开始就没有重视这件事情。现在需求人员应该没有什么事情了吧,也需要参与测试。(现在需求人员已经忙得不可开交了,天天在应对客户方面的各种各样的要求。项目刚刚立项的时候我就正式的和老板要求了:一定要在需求期间测试人员参与,一定要保证测试人员的数量和质量。结果呢?先后进入项目的6个测试人员迅速离职或者辞退了。然后老板说不要指望测试人员测试了,开发人员自己来吧。然后真正需要有经验的测试人员出具测试方案了,老板指派项目管理中心的专职SQA人员进行负责。)
讲到目前还有需求变更的情况出现,专家说项目经理对需求变更没有很好的进行控制。(专家知不知道项目组面对的是什么样的客户?)
可以看出,老板还是对测试一点概念也没有,进而发现老板对项目管理的内容实在是理解得太初级了。所以现在对这个山寨专家非常崇拜。
我私下问了问这个专家什么来历?据说:这位姓束的专家是IBM的高级项目管理顾问。原来也是联创的员工,是老板的老同事。而且据称也是位天才级人物。原来如彼。
总之,我晕!
2009年6月17日星期三
面向对象设计背后的数据库设计(摘自"The Object Primer")
- 把对象映射到关系数据库
首先,类的属性将会映射成关系数据库中的0列或多列(最好使用相似的命名规范)。
对象的有些属性本身就是对象,它真实地反映了两个类之间的关联。
并非所有的属性都是持久的,有一些被用来进行临时计算。
- 影子信息
影子信息(shadow information)是除了普通领域数据之外,对象需要维护的任何用于将它们自己持久化的数据。
一般如主键信息,特别是没有业务含义的代理主键。并发控制标记、时间戳、增量计数器。
- 映射继承结构
将继承映射进关系数据库中,有3种主要的方法:
- 把整个类层次映射到单张表中。
- 把每个具体类映射成自己的表。
- 把每个类映射成自己的表。
3种技术的对比
| 技术 | 优点 | 缺点 |
| 单表 |
|
|
| 每个具体类一张表 |
|
|
| 每个类一张表 |
|
|
- 映射关系
对象模式中的关系是通过对象引用和操作的组合来实现的。而在RDB中,他们通过外键来维护。
映射关系的方式依赖于他的多重性:
- 一对一关系
如果每个类都有一张表对应,那么这两张表之一需要实现一个外键。
第二种策略是简单的在单张表中存储两个类的数据。
- 一对多关系
它的实现方式是在关系中多的那方面使用Hashset等集合,在一的这方面使用对象引用。
在数据库中,他是在关系中多的一方通过外键来实现。
- 多对多关系
两个类之间的多对多的关系被映射成数据库内的关联表。
- 迭代关系
也称为自反关系,它是指关系的两侧都是相同的实体。
我们可以使用非迭代关系相同的方式来映射它们。
功能驱动与用例驱动(关于用例、用户故事和特征的解释)
软件开发过程中,描述并分析需求会同时采用不同的角度和方式。例如功能分析和场景分析。
其中功能分析是指描述系统所应该具有的功能。场景分析是指在特定场景中用户的操作步骤以及系统给出的相应的反应。
功能分析文档所列出的清单一般会叫做“软件需求”或者“系统特征”。
场景分析文档所列出的内容一般就是“用例文档”
由此可见,RUP中所使用的用例驱动开发,XP中所使用的用户故事驱动开发以及特征驱动开发,表面上看起来是以其分割粒度的不同进行排列下来的。其实我们可以看出,用户故事和特征都是从功能分析的角度对系统的需求进行的描述。其与RUP所说的用例驱动完全使用了不同的分析方法。
这样我们就可以更好的理解XX驱动开发之间的区别在那里。
下面是功能驱动与用例驱动之间的对比表格:
| 功能驱动 | 用例驱动 |
|
|
在实际需求分析的过程中,两种分析方式相辅相成,都有其独到的贡献,最好能够结合使用。
我理解,互联网类型的项目更适合功能驱动开发,而企业业务系统类型的项目更适合用例驱动的开发。
2009年5月18日星期一
芜湖项目现场需求调研阶段总结
芜湖项目现场需求调研阶段,工作效率高,工作成果的质量也很好,现在总结如下:
- 需求分析团队人员要尽量少,减少沟通成本。尽量只允许业务核心人员参与,这样能够以最快速度对业务流程进行确认。
反观现在大平台的项目,需求分析阶段有30多个人参加,包括了国家局的人员和各省市的人员。分成了6个分析小组。诸多问题无法现场进行确认,因为参加的人多,因此大家都不作结论,只能会后通过EMAIL来回来去。由于分组很多,因此涉及到很多跨小组的问题进一步增加了沟通成本。 - 需求讨论会议现场形成文档,由于文档形式上是共同创作完成,因此可以省略客户确认文档的过程。
反观现在大平台的项目,会议之后,需求分析人员晚上加班形成需求访谈报告,需要客户确认,然后再形成需求规格说明书,再要求客户确认,这样效率非常差。 - 关于需求分析的团队构成,建议如下:
- 客户业务人员
- 客户IT人员
- 主力业务分析人员:主要负责需求分析工作,引导大家使用正确的方式和正确的方向进行需求分析工作。
- 业务分析助理:主要使用合适的工具,现场进行文档撰写工作。也可以提出自己的建议。因此该人员也需要有一定的需求分析能力和文档撰写经验。
- 项目助理:负责对会议中的各种未定事项以及决议进行跟踪,并且进行其他的一些辅助性工作。
- 解决方案顾问团队:辅助角色,可以离线支持。主要对相关业务领域或者IT技术领域进行咨询工作。
- 开发组组长以及主要设计人员
- 系统实施负责人 - 使用的工具建议如下:
- 业务流程分析工具,以便团队成员能够在早期对业务流程有全貌的认识,如BPMN, EPC图等等
- 快速互动原型工具,以便快速形成可以进行互动的动态系统原型,给客户良好的感受。推荐serena prototype composer或者axure rp等。
- Sparx Enterprise architect,全面的项目模型管理,在此阶段主要使用到:用例分析,领域模型,需求条目管理等等。(在用例中需要填写senario条目,并且需要与需求条目进行关联)
- Balsamiq Mockups,对操作页面进行设计。 - 对目前的大平台,现在能想到的建议如下:
- 分组尽量少,1~2各组,人员尽量少,减少沟通成本。
- 现场形成文档。
- 在早期需要有总体业务流程分析过程,然后在进入细节系统需求分析过程。
- 使用上述的工具
- 使用上述的团队组织结构
综上,发现上述经验并不太符合敏捷过程,反而与《人月神话》中的理论非常相似。起码,可以总结出来两点:1.架构(需求分析)是贵族专有的工作内容。2.需要组成外科手术型的团队结构。
2009年5月17日星期日
芜湖出差,巡回取货项目的一些心得
出差两周,其中需求调研工作大约占用了6个工作日的时间。另外有2个工作日大约是各种各样的汇报。
工作进行的比较顺利。体验也很好,主要是可以按照自己比较推荐的方法来进行项目工作,大家都比较轻松,工作效率也很高。客户方也反映工作效率很高,工作很有成效。
开始的几天,使用serena prototype composer工具,项目组成员在同一个会议室中,主要讨论工作流程(与系统无关)。然后同样使用这个工具,讨论大致的系统操作流程,同时画出初步的系统界面。这个阶段成果效果非常好:大家对系统的总体概念已经形成,基本确认了系统范围。并且形成了可以进行互动的系统界面原型。
然后开始使用EA和Balsamiq Mockups配合进行用例分析与界面设计。在EA中复制了serena prototype composer中的工作流程,然后进行用例分析,在用例中进行场景senario步骤描述。针对每一个用例,至少使用Mockups软件绘制一张界面设计图。另外在EA中进行领域模型的设计。
综上,提供出一份真正对开发有帮助的需求文档。
经估算,这两周的需求分析工作定义出的系统需求大约需要5人团队开发3个月的时间的工作量。开起来也非常符合比例。当然这仅仅是估算的合理值,估计和客户方面进行协商之后,时间上又会变得非常不合理。
客户非常高兴的从我这里拿到了上述的三款设计工具。不过,真正重要的是需要会使用这些工具啊。
在出差期间,抽时间学习“Head First OOAD”,有如下收获:
终于对需求和用例明确的区分开了。需求大约总是以“系统应该可以xxx”这样的格式描述,主要描述系统所具有的功能和能力。用例侧重于描述某某场景senario下面的操作步骤。因此大约会是包括正常路径/可选路径/替代路径等等。
不过,在出差期间,本计划使用类似极限编程方式的增量开发,结果未遂。最终变成了类似ICONIX方式的过程。
另外,意外的发现,原公司上班时,结识的MOTO客户,现在正在作为甲方折磨着现在我的客户。现在我的客户天天折磨我们,同时他们也在被MOTO客户折磨着。……
2009年4月2日星期四
软件开发过程DRY
我们的现实情况是:需要满足客户以及老板和项目管理中心所谓正规软件工程所需要的标准过程,还有标准过程所要求的文档。所以,通常来讲,我们会按照这样的过程进行工作:
考虑以下一些方法:- 利用用例分析或者用户故事,来讲需求分析与需求传递和培训两个过程合并。
- 考虑需求文档中的用例分析部分可以是主力需求分析人员带领开发团队共同完成。
- 需求文档的工作量很大,并且变更之后的维护也是问题。因此考虑需求文档与测试用例进行结合,减少需求文档中的内容。
- 使用某种形式的工具来自动生成规范格式的需求说明书。
- 概要设计说明书中仅包含系统架构层面的设计工作。
- 系统设计过程与测试案例编写过程融合(参考XP过程)。
- 实用工具(例如javadoc)来自动由编码生成详细设计文档。
- 现实存在详细设计过程,但是并不正规,仅仅产生一些中间产物文档,如界面草图、UML顺序图等等。
2009年3月30日星期一
关于敏捷软件开发新的理解
对于敏捷软件开发,目前理解期最重要的目的是识别软件过程中没有必要的任务或者是性能低下的任务,然后去除之或者改进之。基于这个出发点回顾一下目前的情况:
- 需求分析。唯一不变的就是变化。项目的早期集中时间进行需求分析然后确认基线,再等到真正动手开发某一模块的时候可能已经过去了一段时间,并且需求已经发生了变化。这样还需要对新的需求进行再次分析。在这样的情况下,前后的需求分析则存在工作量的浪费。
- 敏捷过程则是需求分析存在与整个项目的始终。细节的需求分析工作尽在真正开始代码之前才进行。虽然以后仍然有可能发生变化,但起码针对上面的情况做了优化。
- 软件设计。目前的项目,设计阶段需要的交付物有:架构设计,概要设计,详细设计,物理模型设计,接口设计等等。设计的目的当然是为了能够知道开发。这一部分工作显然是必须的,但是能否优化呢?敏捷过程典型的对策是1.仅仅做足够的设计;2.测试驱动开发。
- 系统的架构设计是需要的。但是针对某一功能来讲,仅仅在开发之前才做相应的详细设计。设计仅仅做到能够指导开发的程度,对文档的格式要求比较宽松。
- 传 统的UML设计包括类图、顺序图、协作图、活动图、状态图等等。这个敏捷过程一般没有强制要求。XP过程中推荐以TDD和CRC分析来代替。其中CRC分 析基本上是UML协作图的替代物,但是更加强调团队共同完成。而TDD则是在保证了测试自动化的同时还能够对软件设计进行指导,做一件事达到两个效果,体 现其高效率。
- 界面原型。我前面说过,希望能够在需求分析阶段就能够对系统的界面进行确认,还找了一些专业做页面原 型的辅助工具。现在看来,其实也存在浪费。其实更高效的做法是以最快的速度拿出开发出的成品或者半成品让用户进行确认(这样一来,唯一的问题是你能有多 快?;-) )。界面草图有的时候是需要的,但是它变成了非常不正式的中间产物,不必要进行存档。
- 重构。仔细想想,其实重构的工作对于任何一个项目来讲都是必须的。而现实是,如果没有采取全面的自动化测试的话,传统的软件开发项目没有能力也不敢进行深度的重构。而相反基于TDD的XP团队则更有勇气对软件进行彻底重构。
- 集成。集成的工作量无法节省。敏捷过程的做法是持续集成——将工作量分散到整个软件生命周期。这样能够及时发现问题,并从感受上减少工作量。
在软件开发领域,其实我们也正在处于我的朋友的搭档的水平。经历的项目越多,越会发现业内大师的很多理论的精妙之处。很多情况是:如果大师们的理论你认为有很大问题的话,其实是因为你的层次还不够。
2009年3月15日星期日
2009年2月5日星期四
考虑使用UberNote代替Google Notebook
- 展现方式同Google Notebook非常相似
- 采用了不分层的Tag方式进行管理
- 可以对Note进行所见即所得的富文本编辑
- 可以多人合作共享Note
- 有浏览器插件,可以直接抓取网页。而且插件很丰富:Toolbar, Clip, Bookmark, Snap
- 居然能够直接从Atom导入现有的Google Notebook内容。
- 缺点是对于每一个Note不能折叠显示。
另一个可选的替代方案是:TiddlyWiki + Clipmarks,只是Clipmarks的速度比较慢。
2009年2月4日星期三
Google Notebook的备选替代品
替代品列表:
- Office OneNote 2007:非常好的产品,文字编辑非常灵活方便,支持表格。分类清晰,功能强大,能够直接抓取网页。不能支持在线同步,但是只需要配合Dropbox就可以完美解决。唯一的问题是商业产品,需要收费。另外只能基于Windows平台。
- Evernote:也是业界很出名的产品。Tag方式的管理,支持全文搜索,能够直接抓取网页。有在线同步功能,同时还有桌面客户端。
缺点是:体积庞大,免费版本每月有数据量的限制。并且不支持表格,编辑功能稍弱,不够灵活。 - TiddlyWiki:体积小巧,功能灵活。基于Tag方式管理,可以安装第三方插件。开源。支持UBB方式的自定义格式,非常方便。配合Dropbox可以实现在线同步。单一的HTML文件,所以跨平台。
缺点是:不支持直接抓取网页。
对面向对象以及极限编程新的理解
而面向对象的开发是自底向上的过程。在这样的过程中,往往是先实现已经了解的局部。逐渐的随着过程的推进,系统的全貌浮出水面。而基于面向对象开发的特点,在这个过程中,前面的工作成果往往能够很好的进行复用,重构的成本也很低。自然而然的,开发的过程会形成多次的迭代。但是,在这个过程中,最重要的是需要按照面向对象的思维方式进行设计与开发。
基于上面的认识,在回顾XP的各项原则会发现,以前认为不现实的内容其实都是顺理成章的事情了。唯一的问题仅仅是现场客户的问题,不过这个在一定的程度上 面也能够克服。由此可见,当深入了解了面向对象的开发的精髓之后,XP的各项原则实际上都是面向对象过程的一些内在的需求而已。
极限编程的12个原则:
- 计划的制定
- 小版本
- 简单设计
- 测试驱动
- 持续整合
- 重构
- 配对编程
- 代码共享
- 每周只工作40小时
- 现场客户
- 隐喻
- 编码标准
2009年1月22日星期四
关于OOD的一点点总结
简单的讲,过程内容会分为需求分析和设计。
需求驱动是最根本的,所以在需求阶段,所谓的各种驱动方法其实都是对需求的功能分解,以便日后进行分治的设计以及管理跟踪。
由Use Case -> User Story -> Feature其实是由粗到细对需求分解的不同粒度。
有了需求条目之后,针对每一个条目可以继续进行设计工作。
设计过程的目标其实很简单:
- 类的识别
- 类的结构(例如:继承、关联、聚合、依赖等等)
- 类的属性
- 类的方法
- 系统运行是类之间的消息传递关系。
后两项则是通过模拟每一个需求条目所描述的场景来设计类之间的消息传递关系。在这个过程中,自然的完成对类分配方法。主要使用的工具如顺序图、协作图或者CRC分析。
对于MDD, AMDD以及DDD来讲,感觉上是针对非常熟悉的业务需求或者非常有经验的分析设计人员,因此采用了更新颖的设计路径。
而TDD应该理解为一种辅助设计手段。