论道WP(三):应用程序栏
作者通过具体翔实的例子介绍了Winodws Phone 7中应用程序栏的使用方式。
该内容已经被标记书签!
标记书签错误,请重试!

作者 Shane Hastie 译者 郑柯 发布于 2011年3月17日
“不做计划的人注定要失败。” ——匿名
“今天把计划做好,胜过明天把计划做完美。” ——匿名
“你的计划没做好,不会让我的工作变糟糕。” ——匿名
“当机会遇上计划,就会变成好运气。” ——发明家 托马斯·爱迪生
“计划只有马上变成努力工作,才能算是好想法。” ——管理学大师 彼得·德鲁克
“正确的准备,产生出众的表现。” ——著名橄榄球四分卫 Charlie Batch 【译注1】 “你永远无法根据过去规划未来。” ——爱尔兰政治家 埃德蒙·博克 【译注2】
“响应变化重于遵循计划”,这是敏捷的核心价值观之一,可是它有时会被人错误诠释为敏捷项目中不需要规划。然而,真实情况根本并非如此。在适应性敏捷项目中,规划的次数要远多于在预先规定好计划的(predictive)【原注1】项目中做规划的次数,因为我们要将必然会出现的诸多变化纳入到考虑之中。适应性项目的特点就是不确定性,主要存在于以下领域:
适应性项目需要对应的适应性的方法,这样一来,在项目的生命周期中,我们对于项目的理解不断加深,产品也会逐步演变。敏捷项目中采取迭代和增量式的工作方法,就能提供必要的反馈机制【原注2】,以此交付适应性项目。
尽管敏捷项目的本质是适应性,管理层还是希望了解“项目成本如何?需要多少时间?”这样的要求合理而现实。要向项目中分配组织资源,要完成哪些工作也需要相关决策。这就意味着我们要在某些层面上提供反馈,以回答项目开始时的一些问题,并定期提供相关信息,确保我们可以利用组织的投资交付最好的价值。
要达到这个目标,我们需要在多个层面规划。
以下是规划会发生的两个宽泛层面:
这里的流程主要是要选择出投资哪些项目,可以看下面的幻灯片:

所有组织都需要一种鼓励机制,鼓励大家产生各种好主意、发现问题。在开始的主意和问题辨识阶段,应该尽量不做过滤,组织的所有成员都可以指出某个未处于最佳效率的工作环节,识别组织需要解决的问题(比如市场中的某些变化或是新颁布了某条组织必须遵守的法律),或是提出某种能够完成的全新事物。
当很多主意提出之后,需要有一种粗略的过滤机制——想想这个想法是否值得深入考虑。很多时候,可以对这些主意进行成本-收益分析和可行性评估。有些主意会自动通过第一次过滤(比如:为了符合某条法规的变化,某个项目必须要完成),有些很快就被抛弃了(成本不允许,或是与组织的战略目标完全不符),有些还需要深入研讨。
得到自动通过和值得深入研讨的主意将会进入“项目组合规划”流程。
“项目组合规划”是监管层面的活动,其目的是要选出组织应该投入资源完成的项目组和项目。毫无疑问,希望完成的项目要多于能够投入的项目,项目组合管理流程就是要选出可以投入资源的项目。
判断要完成哪些工作,应该依据组织的使命和目标:只有交付物符合组织最高战略层面要求的项目和工作,才能得到投资。项目组合规划是基于风险-回报的活动,组织的风险管理策略有助于选择投资哪些项目。
“项目组合规划”应该在公司的职能层面的组织架构之上进行,以确保端到端的影响,并且选择出来的工作的价值也得到分析。在这个组织架构层面之上,项目将会影响多个职能领域,还要避免发生“争地盘”的情况,这一点很重要。这个层面上,任何重大的工作还会要求组织中多个职能领域提供资源(比如:全新客户自服务系统的上线不仅仅是IT项目,是会有IT方面的工作,不过市场部要宣传提倡大家使用自服务系统网站,服务部门要给知识引擎提供内容,等等)。
各个组织的“项目组合规划”流程各自不同,但是都应该遵循理解透彻的流程,还要为下列步骤提供指导方针【原注3】:
当工作需要跨越组织的多个职能领域进行时,可将其拆分为相关但是独立的、合理的工作活动流,并将这一系列项目作为项目组管理。
要对项目组做更多协调工作,以保证互相关联的工作流程得以同步。当软件完成时,广告营销活动要准备好对外发布;在广告营销活动启动前,呼叫中心的人员要雇佣到位,而且完成培训;在广告营销活动启动前,软件要部署在生产环境服务器上。诸如此类工作要保证完成。
项目组经理是专有职位,此人对于所有的相关工作项目有战略视角,以确保整体的项目组得以顺利交付。项目组经理为不同项目团队提供统一的愿景,这些团队会完成不同的工作项目。
项目组经理是所有项目团队最终的客户,并设置整体的优先级和里程碑。
项目组管理是适应性流程,其中各个项目要响应组织不断变化的现实,以及其他项目团队的产出和交付物。
应该制定出整体的项目组规划,当事情发生变化时,还要调整该规划。项目组规划的关键要素包括(【译注3】):
项目组管理需要为各个子项目提供方向。理想情况下,“产品愿景”要提供这方面信息,而且所有团队都要对其完全理解,并做出承诺。
这是说:要确保团队要交付的产品符合产品愿景。就是在这个过程中,适应性敏捷团队基于迭代和增量的方式来交付业务价值。
下图展示了规划活动如何在越来越详细的层面上进行。

在产品愿景中,我们从监管和组织级战略决策层面转向战术上的产品交付层面,并改变组织中人们的工作方式。
产品愿景是至关重要的工具,向团队传达为什么要工作,他们的工作方向,以及他们的工作要服从的关键约束条件。
产品愿景常常以项目章程文档的方式传递。
理想状况下,项目章程准备活动应该由整个团队以协作式工作组的方式完成。项目出资人和产品负责人应该出席该工作组,他们负责阐述清楚:为什么项目对组织非常重要,以及衡量产品是否成功交付的关键标准。
Sanjiv Augustine提出项目愿景要回答的关键问题:“我们希望该项目为组织达成什么目标?”【原注4】
这个问题的答案会指导团队在项目中的所有工作,也能告诉团队何时停止工作。产品愿景中要传达出项目整体层面上“完成”的定义。
典型的项目章程包括:
有不少简单的工具可以在愿景工作组中使用,帮助参与者明确阐述和表达产品愿景。接下来列出一些,以资参考。
用一、两句话说明项目的目标和方向。
“电梯说明”能让任何团队成员在乘电梯过程中把项目的意图说清楚(想象一下你和公司的CEO一起进入电梯,对方请你说明你现在正在做的项目,而且你要在对方到达目的楼层前说清楚)。
在工作组里面,这是应该最先产出的东西,而且要写出来,让所有人都能看到——工作组接下来的活动要围绕它开展。
“愿景盒子”展示项目的特性及其带来的好处,可以用一个麦片盒子说明:盒子前面有名字和品牌,还有要传达给购买者的主要好处列表(这里的购买者是最终将会使用产品的人,可能是组织内部人员,也可能是真正的付费用户)。盒子背后包括操作指南(大致的设计决策),还有产品将会提供的关键特性列表。
构建愿景盒子是创造性活动,能帮助团队明确表述他们的想法。分成多个小组的方法更有效,各个小组可以各自构建一个愿景盒子,然后他们可以把盒子“卖”给团队其他人。各个小组展示完成后,应该可以产生一个共享的愿景盒子,并传达出整个团队的想法。
使用简单的矩阵,把产品希望提供的战略价值表述出来。该矩阵类似下表:
|
首要 |
次要 |
第三 |
|
|
增加收入 |
在上线12个月后增加25%收入 |
||
|
降低或避免产生成本 |
不可行 |
||
|
改进服务 |
在每季度的满意度调查结果中,将客户满意度评分提升20% |
||
|
其他 |
由于客户满意度提升,降低呼叫中心人员流失率 |
根据战略驱动因素,项目的目标得以表述。只能有一个首要驱动因素,也许会有多个次要或第三目标。如果某列中有多于一个目标,那么就要对他们排序,以避免“所有的都很重要”之类的冲突。
以小组形式准备该矩阵,团队能从中深入理解项目清晰明确的中心目标。
从多个维度向团队展示优先级的工具。
滑动器的范围从“ON”到“OFF”。如果某个因素处于“ON”一侧,那么它就是最强有力的因素,推动项目前行时的决策制定过程。任意两个滑动器不能处于同样水平。处于“ON”一侧的滑动器越多,项目发生灾难性失败的风险就越大。当项目滑动器所展示出的活动余地越少,这个项目就会面临“要么交付一切,要么交付空白”的境地。更多的活动余地能够允许部分交付,这有助于达成组织目标。

Rob Thomsett在他的《Radical Project Management》一书中描述了滑动器工具。Mike Cohn也在他的网站上提供了设置滑动器的在线工具。
“功能进出列表(in/out list)”是简单的工具,能够清晰说明当前项目要完成的工作,哪些不需要在当前项目完成,以及可交付物存在哪些不确定性。
|
议题 |
进 |
出(责任) |
|
(接听服务电话) |
X |
|
|
(将服务电话转给技术支持人员) |
X |
|
|
(通过服务中心推广新产品) |
X |
|
|
(债权人通过服务台跟进) |
X |
|
|
未确定 |
||
|
(基于Web的自服务能力) |
如果议题处于“进”这一列,项目团队就要负责交付相关组件。如果某些功能明显超出范围,团队就根本不会花费时间或精力在其之上。如果“出”这一列中的议题是大项目组依赖的功能,那么必须明确定义谁负责完成相关工作,定义其属于哪个项目和负责人,确保该议题相关功能得到交付。
范围不确定的议题进入“未确定”区域。团队不会开发这样的功能,产品负责人或是项目经理要深入调查,以确定该工作是否属于项目范围。
Rob Thomsett在他的《Radical Project Management》一书中也描述了该工具。
对于组织为当前项目付出的成本和得到的收益,我们会有一个估算。该工具会告诉大家:这个估算的不确定性程度如何。在项目早期,成本会有一个不确定性圆锥【原注5】,随着项目推进,该圆锥的顶角会越变越窄。收益的不确定性也很大。只要估算范围正确,在成本和收益方面的不确定性算不上大问题。成本和收益都应该展示出三个水平:乐观情况、最可能发生情况、悲观情况。例如:

表格中每个单元格的数字是收益减去成本之净差。
该项目应该被视为高风险项目,因为有明显的风险表明组织可能在上面赔钱。如果一切顺利的话,也许有其他驱动因素能够保障投资和回报。
对项目进行成本/收集分析主要是管理层的责任,但是在财务方面的目标和驱动因素应该分享给团队。
借助这些工具,团队可以明确了解项目的目标和方向,知道为什么要展开当前项目的工作。
准备产品愿景,是一个项目非常重要的起点,并为团队在项目进行中保持正确的方向和重点提供保障。之前工作组讨论中产生的墙件(wallware)【原注6】应该出现在团队的工作环境中,为项目工作的任何人只要一抬眼就可以看到项目的驱动因素和目标。撰写正式的文档来综述产品愿景,这样做也很有价值。要知道:文档只有一部分价值,另一部分价值来自于团队在产生愿景的过程中对产品和项目的共同理解。
如果开发产品的团队分散多地,应该在产生产品愿景时,把他们聚在一起。这可以塑造出“一个团队”的文化,并对他们分开之后的沟通有帮助。
如果有成员在愿景产生之后加入团队,必须要有人带着他们把项目章程过一遍,这个人还得是参加过工作组讨论的。唯其如此,新成员才能理解工作背后的驱动因素。
产品愿景的管理是产品负责人的责任,他负责将业务需求带给项目团队。如果在项目执行过程中,环境发生变化,愿景无法达到,或者组织的目标和驱动因素发生作用,使得项目无法在其基础上交付,项目应该停下来,并重新评估。产品愿景的变化,常常是组织生态系统发生重大变化的证明。
产品路线路是一个列表,列出为了达到产品愿景需要交付的关键功能和特性。当项目需要延伸到产品的多个版本发布时,产品路线图是非常重要的。如果只需发布一个版本,那么产品路线图和发布规划就没有区别。
产品路线图基于时间的视角,来看产品的预期交付周期。它是高层面的规划,由产品负责人和项目经理维护,并随时间发生变化。
产品路线图要定期与产品愿景互相验证,并让团队和其他人知道产品各个组件可能的发布日程。
产品路线图处于特性和“史诗故事(epic)”的层面,用户故事不包括在内。
产品路线图要通过可见大图标来展示重要的里程碑、功能特性和目标发布日期。发生变化时,可以从路线图中加入、移动或是移除一些条目。
下图是一个真实项目的路线图实例,展示出六周之内的两个版本发布周期:

(图片来源:新西兰,Livestock Improvement Corporation)
该路线图位于团队环境的过道中,起到信息辐射器作用,让所有工作在同一个项目组的团队们都能看到,其他任何对项目感兴趣的人也可以参考。产品路线图为从事同一个版本发布的各个团队们提供上下文。
版本发布计划展示出产品当前发布版本要交付的特性,其中包括当前大家达成一致意见的、经过排序的史诗故事和用户故事。版本发布计划基于预期的团队速度,并告诉大家当前版本中包括哪些对产品的共同理解。
最初的产品规划活动要由团队和产品负责人共同完成,产品负责人要提供当前版本的目标。一个版本发布包括一系列迭代,团队在这些迭代中完成工作,交付一系列特性,为组织提供可度量的价值。一个迭代中要完成的一系列功能特性构成了版本发布的条件,并且是当前发布版本要交付的产品整体功能特性的子集。
故事和史诗的大小应该使用故事点数【原注7】或是理想工作日估算出来,并按优先级排序,这样工作就可以分配到各个迭代之中。版本发布规划活动以产品负责人解释待发布版本的目标开始。团队讨论在这样的目标下,需要交付哪些东西,并表明在交付时需要考虑哪些因素。其他要考虑的因素包括风险,以及史诗和故事之间的依赖。高风险、高价值的功能特性应该排高优先级,以早日交付,这样项目就可以调整,以应对风险是否会演化成严重问题(比如,我们掌握的技术无法做到我们期望的结果)。依赖关系也许会影响交付的顺序(如果我们先完成这一块,那一块后面做起来就容易了)。
版本发布规划活动从团队的速度开始,如果这是第一次版本发布,就需要估算团队速度,对于后续的版本发布,此前版本发布时的实际速度就可以用来作为参考(除非团队在版本发布之间发生巨大变动)。
刚开始只能猜测估算速度,要想得到更为准确的猜测,就要花更长时间来得到结果。最简单的方式是:询问团队,让他们估计自己能够在一个迭代内完成多少个故事点数,并在这个数字上做计划。结果可能不准确,但是已经可以作为好的起点。
要对团队的交付能力有更好的估算,就得使用更彻底的估算技巧,要知道想得到更准确的结果,就得付出更多成本,而且付出的成本不一定能够提供更多价值。James King在自己的网站上提供了一个有用的估算工具包,可供下载。
得到估算速度之后,就可用其规划迭代,步骤如下:
这个流程可以通过下图展示:

版本发布规划是一个具备适应性、可调整的计划,它将会随着项目推进而改变。一旦版本发布规划完成,而且大家对之达成共识,它就可以用来指导迭代中的工作。版本发布规划也可以用来制作项目的最初目标速度图。
在每个迭代的开始,团队根据从已完成工作中得到的经验教训、以及项目所处的更大环境,可以重新规划项目剩余的工作。迭代规划会议有两个主要活动。
第一个活动中,可以检查当前的版本发布规划,并根据自上次更新来发生的任何变化,更新当前版本发布规划。迭代的开始,就是敏捷项目调整的时候,基于项目环境的实际情况,可以改变规划。
有可能影响、修正版本发布规划的事情包括:
迭代规划会议的首要任务,是要发现当前最重要的故事和史诗,团队将会在当前迭代中针对它们开展工作。产品负责人会说明当前的优先级,还有发生改变的原因,确保整个团队对于优先级为什么要改变有明确认识。
当史诗和故事的列表重新排序完成,而且所有团队成员都已经了解了修正后的发布规划之后,团队就会制定当前迭代中需完成工作的详细迭代规划。
团队会基于“昨天的天气”(很可能他们在当前迭代完成的工作量与上一个迭代相同,除非工作环境或是团队构成发生重大变化)和常识,估算自己能够在当前迭代中完成多少工作。然后团队就会基于自己的工作交付能力,选择当前迭代要开发的工作。
选定故事和史诗之后,团队就会把工作拆分成特定的任务,并分配给每个团队成员。理想状况下,任务分配会以“拉”的形式完成,团队成员根据自己的工作能力,选择自己要做的任务。任务应该非常小,从几个小时到1天不等,而且要是分散的、可度量的活动。迭代经理(Scrum中就是Scrum Master)确定所有的工作任务都有人领取,而且会对承诺完成的工作做健全性检查(sanity check):根据项目的环境现状,团队是否有能力交付他们承诺完成的任务?
当任务都被识别完成后,团队成员会对其排序和估算。估算现在基于完成某项任务需要的小时数。这些任务应该写在任务卡片上,并在故事墙上跟踪这些任务卡。
任务与故事连在一起,在故事墙上跟踪某个故事的状态迁移,要与其所包含任务的完成状况相联系。
迭代中的任务,包括为了完成故事需要完成的所有工作,还有为下个迭代的准备工作。
迭代Backlog列出了当前迭代中在故事墙上要跟踪的故事和史诗。
下面展示了一个任务列表的部分示例。
|
故事ID |
任务 |
负责人 |
估算小时数 |
剩余小时数 |
实际小时数 |
|
S123 |
将故事分解为验收条件 |
Bob, Mary, Peter, Steve |
4 |
4 |
|
|
S123 |
从验收条件构建测试用例 |
Mary |
2 |
2 |
|
|
S123 |
UI设计 |
Peter, Steve, Bob |
2 |
2 |
|
|
S123 |
UI编码 |
Peter, Steve |
4 |
4 |
|
|
S123 |
中间件编码 |
Peter, Steve |
4 |
4 |
|
|
S123 |
数据库编码 |
Peter, Steve |
4 |
4 |
|
|
S123 |
编写Furblesplong系统接口 |
Garth |
8 |
8 |
|
|
S123 |
将Furblesplong接口整合到代码库中 |
Peter, Steve, Garth |
2 |
2 |
|
|
S123 |
执行系统测试 |
Mary |
4 |
4 |
|
|
S123 |
系统探索测试 |
Mary |
6 |
6 |
|
|
S123 |
设计验收测试 |
Bob, Mary |
2 |
2 |
|
|
S123 |
编写版本说明 |
Peter |
1 |
1 |
|
|
S123 |
执行验收测试 |
Bob |
4 |
4 |
|
|
S123 |
故事编写工作组,将史诗拆分成下个迭代要开发的故事 |
Bob, Mary, Peter, Steve |
2 |
2 |
在迭代中,团队成员要根据任务来报告和跟踪他们的工作进度。这是他们个人每天做出的承诺。
燃尽图能够展示出初始的估算和迭代剩余的工作。每个任务实际花费的时间会得到跟踪,并用来帮助团队在下次迭代规划会议中的改进估算效果。
团队成员就是在这时候监控他们的进度,并根据他们承诺要完成的任务报告进度。
在迭代内,每日立会是团队沟通进度的首要沟通工具。在项目的每个工作日里,团队聚在一起,并向彼此报告各自承诺要完成的任务进度状况。每日立会有一些简单的规则:
敏捷项目必须提供能够“安全失败”的环境,团队成员不会因为没有达成任务承诺遭受惩罚。大家要能够安全说出任务状态的真实情况,并且了解项目环境的现实情况。有时,我们的估算可能很糟糕(只是估算而已,又不是报价),又或者某些事情的发生让某些成员无法完成任务,整体环境必须让他们能够说出真实情况,这样团队成员就能调整他们的日程表,将任务排序,并调整适应项目的现实。
当一个故事所有的任务都已经完成后,故事就会移动到“完成”状态,而且这部分工作的故事点数会算到团队速度中。
“在准备战役的过程中,我常常发现:计划是没有用的,但是计划的过程却必不可少。” 艾森豪威尔
下表总结了规划的多个层面,还有各个层面规划流程中的活动:
|
个人 |
团队 |
扩展团队 |
项目出资人 |
PMO |
战略组织 |
|
|
每日承诺 |
个人任务规划 |
|||||
|
迭代规划 |
为迭代规划任务和工作 |
影响 |
||||
|
版本发布规划 |
定义版本发布里程碑 |
影响 |
||||
|
产品愿景 |
定义并明确表述愿景 |
|||||
|
项目组复审 |
整体项目组结构和集成 |
|||||
|
项目组合复审 |
根据战略目标,选择开发哪些项目 |
影响 |
||||
|
战略复审 |
提供整体方向 |
计划活动遍布敏捷项目之中,简单的工具和安全的环境能够支持适应性的规划和真实的报告,这意味着进度能够得到真实了解,管理层也因此能够获得他们需要的信息,来做出优秀决策,为组织、团队和项目交付出最有价值的成果。
系统开发常常在复杂和难以预测的环境中进行,敏捷规划需要考虑到这一点,而且要知道灵活性和响应变化的能力无与伦比。
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中对于锁的性能优化,以及锁的存储结构及升级过程。
本次分享将首先介绍现代富文本编辑器的组成和实现,然后结合UEditor的开发过程,与参会者分享UEditor在设计和实现的过程中,所涉及到的核心功能的细节实现。
本次演讲视频录制于百度技术沙龙。
我们所开发的应用程序大多都需要提供一个图形用户界面(GUI)。关于GUI应用的架构设计,已经有了Form & Control、MVC,、MVP、 Passive View等多种模式。模式可以帮助我们建立优雅的架构,但前提是弄清楚模式的应用场景。弄清楚GUI应用面临的设计上的问题,有助于我们正确的挑选设计方案。
MongoDB是一种非常易用的NoSQL方案,Brian C. Dilley在这篇文章里介绍了MongoDB的优劣势,并介绍了MJORM项目。MJORM用于MongoDB,是一个没有注解的Java ORM库。
随着网络基础设施的逐步成熟,从RPC进化到Web Service,并在业界开始普遍推行SOA,再到后来的RESTful平台以及云计算中的PaaS与SaaS概念的推广,分布式架构在企业应用中开始呈现出不同的风貌,然而殊途同归,这些分布式架构的目标仍然是希望回到建造巴别塔的时代,系统之间的交流不再为不同语言与平台的隔阂而产生障碍。
精益软件开发方法因其对市场和交付的重视和在各种场景下体现出的适应能力正在获得广泛的关注。特别是在精益创业(Lean Startup)渐渐兴起和技术日新月异的今天,其"极端"的思想也变得越来越必要和可行。 InfoQ就此主题对他做了深入的采访。
没有回复
关注此讨论 回复