当我们写一个软件的时候, 都知道要为用户考虑, 但是用户在哪里?  有同学写 “图书馆管理系统” - 说来图书馆的同学都是我的用户, 但是他们有没有区别呢?  有同学写“自动柜员机系统”, 那到底有多少类型的用户来到柜员机前呢?   这些都是团队成员在需求分析和设计阶段要反复琢磨的问题。

 

有同学说, 我把用户的愿望百分之百地实现了, 这不就行了么?  不要搞那么多分析啊, 故事啊, 心理啊, 讨论啊, 文档啊…  请看这个笑话:

现代软件工程讲义 7 设计阶段 典型用户 - 故事 - 任务 - 具体工作_管理系统

现代软件工程讲义 7 设计阶段 典型用户 - 故事 - 任务 - 具体工作_管理系统_02

 

在长时间一丝不苟的实现之后…

现代软件工程讲义 7 设计阶段 典型用户 - 故事 - 任务 - 具体工作_文章_03

 

得到了和用户要求一模一样的产品!

现代软件工程讲义 7 设计阶段 典型用户 - 故事 - 任务 - 具体工作_文章_04

但是用户满意吗?

 

 

光看用户的表面语言或行动还是不够的。我们还要找到用户语言行动背后的动机

现代软件工程讲义 7 设计阶段 典型用户 - 故事 - 任务 - 具体工作_管理系统_05 (图像来源: http://www.weibo.com/funnyshoelace)

 

有同学会说, 我只要把产品做得可扩展性特别好, 一般用户到超级用户都能搞定就行了! 且不论这是否能覆盖所有用户, 一味追求“最大的扩展性”也有很多副作用。

几年前有一款www 浏览器有不少安全性的问题,  安全专家在忙于补救各种安全漏洞之时, 发现它的 “网站地址栏”允许的最长输入是 4兆个字符! 4百万个字符啊, 多适合做缓冲区溢出的攻击啊!  但是有哪个正常的网站或用户要输入这么长的网址呢? 

 

 

 

[讨论]

Visual Studio 是一个非常成功的软件开发集成环境 (IDE), 它支持VB/C/C++/C#/ASP.net/WPF/… 等等不同的开发语言和套件, 用户可以写几行的 hello world 程序, 也可以写几万行的多线程软件,  它还支持项目管理, 测试工具, 以及第三方的插件… 它的众多用户分布在全世界大大小小的国家,  各行各业的公司, 大大小小的团队,  有些是业余爱好编程, 有些是老师和学生, 有些是专业开发人员…  很多用户对它也有很多改进意见,  那我们到底为哪些用户服务呢?  同时, VS 的微软团队也有很多开发人员, 他们也是用户, 只听取他们的意见是不是就够了呢?  在开发一个新版本的Visual Studio 时候,如果你来主持需求分析工作, 你的工作结果会指导上千名工程师, UI 设计师, PM, 市场推广人员未来两年的工作。  你怎么办?

 

[给大家10分钟讨论]

 

下面是微软在Visual Studio 2005 设计阶段使用的几个 典型用户 (persona): 

典型用户造型Persona details特点
Mort现代软件工程讲义 7 设计阶段 典型用户 - 故事 - 任务 - 具体工作_文章_06Mort, the opportunistic developer, likes to create quick-working solutions for immediate problems and focuses on productivity and learn as needed. 

 Mort is someone who doesn't consider programming their main job. Maybe they are a statistician, biologist, or construction estimator, who also knows quite a bit about programming. They are opportunistic, using whatever tool comes to hand that will get the job done. 

不一定是专业出身的程序员,  他们有自己的主业,  编程只是一个工具, 他们的主要目的就是用工具把事情搞定就行了。他们很喜欢代码示例, 也不特别关心程序效能。   (例如许多 VB 用户, 偶尔用VS 写程序处理数据的研究人员等)
Elvis现代软件工程讲义 7 设计阶段 典型用户 - 故事 - 任务 - 具体工作_管理系统_07Elvis the pragmatic programmer, likes to create long-lasting solutions addressing the problem domain, and learning while working on the solution. 
Elvis:  journeyman developer. 
You can scope out a job and give it to them, and the job will get done. In general, Morts don't become Elvises. Morts want to do their main job; they don't WANT to become a professional developer.  Elvises go to school and get CS degrees.
 
以编程为生的程序员,  他们大多是CS 专业出身。 各种IT 公司的开发人员应该是在这一类中。 
Einstein现代软件工程讲义 7 设计阶段 典型用户 - 故事 - 任务 - 具体工作_文章_08Einstein, the paranoid programmer, likes to create the most efficient solution to a given problem, and typically learn in advance before working on the solution. 
Einstein is a smart Elvis who has lots of experience. 
Einstein can see the big picture. An Einstein often is in a position of responsibility, choosing technologies and designing large software systems.
在行业里战斗了很多年的程序员, 架构师, 项目经理。 他们能决定项目用什么样的技术以及发展路线。 

这里有一些网上关于VS 各种典型用户的评论

 

我在移山之道里也举了一些和中国程序员较接近的例子 [移山之道 第14章]

14.1  典型用户

大牛和小飞在讨论网站界面的时候吵了起来。

大牛:这个界面对于一般用户来说太复杂了。一般人根本搞不懂。

小飞:我们这个界面是针对有很多经验的用户,就像卖石头的吴石头,他搞石头生意有那么些年了,他应该对我们用的术语比较熟悉,而且会用电脑,我们并不针对初次使用我们系统的用户,或者对奇石生意有了解,但是对电脑一窍不通的人,就像石头他爹。

大牛:不对,我们要针对那些对奇石生意有了解,但是对电脑一窍不通的人,我们有一些功能是为这些用户设计的。

小飞:不对,我们主要的用户是对石头生意很了解,并且对电脑的使用很熟悉的人。而且这也符合所谓“Persona”的要求。

大牛:我不管你的“Person-a”,我们要分析用户的需求,在把需求搞清楚之前,管他“Person-a”还是“Person-b”,都没有用。我们还是不要用这些名词忽悠我们自己。

他们俩一起来到阿超面前,把事情原委说了一遍。

 

阿超:所谓“Persona”,就是典型用户,吴石头/石头他爹就是我们系统的两个典型用户。我们的确要了解我们软件系统的用户(不是公司的商业客户),那么,什么是典型用户?

 

在产品开发的过程中,我们经常需要描述一组典型的用户。以前大家通常是以一些抽象的名词来表示,如“家用电脑初学者”,“经验丰富的系统管理员”,现在我们建议用一个“典型用户”来代表。典型用户不再是一个抽象的概念,而应该是一个活生生的人物。

典型用户有哪些特性?

一个典型用户描述了一组用户的典型技巧、能力、需要、想法、工作习惯和工作环境。

 

大牛:以前我们管台风叫1号、2号,现在都起了名字,叫云娜、海棠、卡特丽娜、桑迪,等等,是不是跟MSF-Agile学的?

阿超:这你得问气象部门,至少台风“海棠”比单纯的数字好记。但是我们的Persona还包括了更多的特性,不光光只是一个代号,一个典型用户描述了一组用户的典型技巧、能力、需要、想法、工作习惯和工作环境。

在别的行业中可以用到Persona的设计方法。我今天去银行开账户。开完账户后,服务生在窗口后低着头,过一会看我还坐着,就说,没事了,你可以走了。我还想了解一些其他的服务,比如信用卡/理财账户,等等,她好像对此没有兴趣。看起来银行把我的“开户”处理成一个单独的事件,开了账户就完了。如果银行分析开户人的Persona,它可能了解一些典型用户的典型心理,比如小企业主崔大智来开户,他就是来开个户就完了?当然不是!他有不少钱,可能申请信用卡、建立理财计划、贷款、联系代发工资,等等。如果银行仅仅帮他开个户就把他打发走了,那样失去了多少商机?!

 

在设计软件的过程中,我们(设计/开发者)往往会以我们使用产品的习惯和我们对产品的熟悉程度出发设计,忘了我们的软件是给千千万万个不那么会用电脑的人使用的。在这种情况下,搞一个“典型用户”会强迫我们在考虑问题时从用户的角度出发。

 

大牛:阿超刚才提到别的行业,我想起一个例子,两年前俺们村接待了国外的投资参观团,我临时被抓过去作翻译。村长和支书兴冲冲地带领他们参观了王屋村的产值大户——小化工厂和×××爆竹厂。他们带领客人穿过粉尘弥漫的化工厂车间,弄得老外咳嗽不止。在车间外,大家看到没有处理的污水直接排放到王屋河中;到了×××爆竹厂,大家看到数十名没有任何安全保护的女工在安装各式×××,空气中不用说有硫磺和其他化合物的味道。参观团的团员们发出了介于惊讶和恐惧之间的评价,我很难翻译成中文。参观团走后就杳无音信了。

如果分析客户的情况,从客户角度出发,就会发现他们是想来开发这一带的以历史传说为背景的人文旅游资源,他们想看到的是未被污染的风景——王屋河的上游有不少,还有淳朴农家的生活方式,我们也有,当然支书家的生活方式已经不能用“淳朴”来形容。可惜我们没有让客户看到他们想要的东西。

小飞:对呀,去支书家可以看到资产阶级的生活方式,我目前没有搞懂的是他家是小资还是大资。


 

14.1.1  怎样定义典型用户

怎样才能定义典型用户呢?我们首先要定义用户的角色。正如戏剧中有正面和反面的角色,软件系统中也有受欢迎的和不受欢迎的典型用户。如果用户有不同的安全需求,切记要定义不同的角色来适应这些需求。如下面的例子:

  受欢迎的典型用户—指那些按设计者的期望使用系统的用户,如网站的购物者

  不受欢迎的典型用户—指那些有不正当目的的用户,如在一个房地产业主论坛中滥发房屋中介广告的用户—这些用户也许在别的系统中(如房屋中介论坛)是受欢迎的。

Persona可以包括以下内容:

1)名字(越自然越好)。2)年龄(不同年龄和收入的用户有不同的需求)。3)收入。

4)代表的用户在市场上的比例和重要性(比例大不等同于重要性高,如付费的用户比例较少,但是影响大,所以更重要)。

5)使用这个软件的典型场景。6)使用本软件/服务的环境 (在办公室/家里/沙发/床上/公共汽车/地铁…)。

7)生活/工作情况。8)知识层次和能力(教育程度,对电脑、万维网的熟悉程度)。

9)用户的动机、目的和困难(困难 = 需要解决的问题)。 10)用户的偏好。

 

我们的软件不是为所有人服务的。

 

   问:那这样不就是损失了大量潜在的用户,我们至少得争取一下为所有人服务,如果不行,再回到少部分用户?

答:不妥,我们宁可从小部分人出发,要非常明确地定义谁是我们的用户。

回过头来看,Stone 网站有什么基本角色呢?大家杂曰——

1)商户:在网站上出售货物的用户。

2)买家:在网站上购买货物的用户。

3)浏览者:在网站上浏览,并比较货物,并不购买。

4)广告商:在网上卖广告,这些角色可能不会直接使用网站的用户界面。

5)管理员:管理网站。

6)捣乱者:想入侵网站,窃取资料,在留言中发未经许可的广告,搞人身攻击等