Archive for 03月, 2009
30个必须知道的可用性问题
原文作者:www.smashingmagazine.com
原文链接:30 usability issues to be aware of
译者:shelafly
你不必在每件事情上取得别人的同意。作为一个专业的Web开发人,你是你访客爱好和需求的倡导者;你必须坚持你对良好的用户体验的理解,确保在复杂的网站架构下你的访客仍可能找到他们的路径。这意味着在与用户和同事讨论时,你必须能够坚持你的立场,有效地传达自己的想法。事实上,你的工作就是妥协处理错误的思想和误导的概念,而不是盲从它们。
在这种境况下,没有任何东西可以帮助你,除了和你工作中根本问题相关的深刻知识。但是,即使你知道这些知识,重要的是你还要知道如何称呼这些概念,如何在讨论中用到它们。此外,准备一些你可能需要的准确术语在手边作为论据,对你的讨论也是有帮助的。
在这篇文章,我们陈述了30个通常被遗忘、忽略和误解的重要的可用性问题、术语、规则和原则。可读性(readability)和易读性(legibility)有什么区别?究竟80/20和帕累托原则是什么意思?扫雷与满意度是什么意思?逐步强化和优雅降级又是什么?OK,是时候深入了。
可用性:规则和原则
7±2 原则
由于人类大脑处理信息的能力有限,它会将复杂信息划分成块和小的单元。根据乔治A米勒(George A. Miller)的研究,人类短期记忆一般一次只能记住5-9个事物。这一事实经常被用来作为限制导航菜单选项到7个的论据;然而关于神奇的“7,加2或者减2”还是引起了激烈的讨论。因此目前还不清楚是否7±2原则能、可能或应该应用到web中。米勒的研究
2秒原则
一个松散的原则,即用户没有必要对某些系统响应等待2秒以上的时间,比如应用程序转换和开始的响应时间。选择2秒有点武断,但确是一个合理的数量级。可靠的原则就是:用户等待时间越少,用户体验越好。[可用性优先]
3次点击原则
根 据这个原则,如果用户在3次点击中无法找到信息和完成网站功能时,用户就会停止使用这个网站。换句话说,这个原则强调明确的导航,逻辑架构和后续站点的层 次结构。在大多数情况下,点击的次数是无关紧要的;真正重要的是,游客总是能知道他们现在在哪,他们去过哪,他们接着将会去哪。如果用户感觉他们对该系统 如何运作有个充分的了解的话,甚至10次点击,用户都会觉得OK。
80/20原则(帕累托原则)
帕 累托原则(也被称为重要少数法则和因素稀疏原则)指出,80%的效应来自20%的原因。这是商业中的基本经验法则(“80%的销售额来自20%的顾客 ”),但也可以应用于设计和可用性。举例来说,我们可以通过确定那些贡献80%利润的20 %的用户、客户、活动、产品或程序,并最大限度地注意对他们适用,来显著提高效应。[帕累托原则在维基百科]
8个接口设计的金科玉律
作为接口设计研究的成果, Ben Shneiderman提出并收集了一些从经验中启发而来,适用于大多数交互系统的原则。这些原则适用于用户接口设计,也适用于网页设计。
1. 争取保持一致性
2. 为老用户提供可用的快捷方式
3. 提供有益的反馈
4. 设计结束功能的对话框
5. 提供简单的错误处理
6. 允许简单的逆转功能
7. 提供控制感。支持内部控制点
8. 减少短期记忆
您可以在维基百科: Shneiderman的规则设计中了解更多关于设计中的Shneiderman规则。
费茨定律
由 保罗费茨(Paul Fitts)发表于1954年,费茨定律模拟了人类活动,以目标距离和目标规模大小为函数,预测了迅速移动到目标区所需时间。该法通常应用到鼠标的移动, 访客就必须从A点移动到B点。例如,这个规则对于如何放置内容区域,以更实用的方式,最大化内容可及性和提高内容点击率,是非常重要的。
倒金字塔
倒 金字塔是一种在文章开头表达总结文字的写作风格。这种方式使用了新闻业中著名的“瀑布效应”,新闻作者试图让他们的读者即时知道他们的报道的主题。文章以 总结开头,接着是关键点,最后那些次要的细节,如背景资料。由于网络用户需要即时的满足,这种倒金字塔写作风格,对于网络写作和更好的用户体验是非常重要 的。就像尼尔森的支持
满意
网 络用户不喜欢用最佳方式找到他们寻找的信息。他们对最合理和最健全的解决问题方案不感兴趣。相反,他们永远扫描他们认为“足够好”的 quick’n’dirty解决方案。在网络中,这种方式准确地描述了用户的满意:用户使用一个“足够好”的方案解决问题——即时在长远看来一些替代方案 能够更好地满足他们的要求。[界面设计]
可用性背后的心理学
婴儿鸭综合症
婴 儿鸭综合症描述了游客倾向忠于他们记住的最初设计,并且通过与最初设计的相似度来判断其他的设计。其结果是,用户通常倾向于那些与他们记住的最初设计相类 似的设计,不喜欢陌生的系统。这些可用性问题是很多系统重新设计时存在的:用户,习惯了以前的设计,对新的网站架构会感到不舒服,他们必须找到自己的方式 去使用网站。
无视广告
网络用户具有忽视一切看起来像广告的东西,有趣的是,他们非常擅于这。虽然广告是被注意到了,但几乎一直是被忽略的。由于用户已经为网站上不同的任务构建了相关联的图式,在网站上搜索特定的信息时,他们只将注意力集中在网页的部分区域,就是那些他们认为可能是相关信息的地方,也就是,小文本和超链接。在这个例子中,大的色彩缤纷的地方或动画横幅广告和其他的图形是被忽略的。
来源:无视广告:一些发现和一些新发现
扣人心弦效应(蔡加尼克效应)
人 类无法忍受不确定性。我们倾向于对感兴趣的、未回答的问题尽快找到答案。扣人心弦效应就是基于这一事实的;扣人心弦的电影,文章和情节总是有出其不意的结 果,往往总是以一个突然的震惊启示或者困难的局面离开。这种效应经常用在广告上:广告主往往通过要求游客解答刺激的问题,来迫使他们阅读广告,点击横幅广 告或者跟进一个链接。
扣人心弦效应由布鲁玛 W. 蔡加尼克(Bluma W.Zeigarnik)在1927年发现,这个效应在读者间建立了情感联系,在营销学中极其有影响力。游客们可以更好地记住是什么广告,甚至是最小的细 节都能记得更清晰确切。在web写作中,扣人心弦效应也被用来吸引游客进入网站。(如“抓取我们的RSS-Feed,以确保您不会错过文章的第二部 分!”)。
视知觉的格式塔原则
这些原则是人机交互设计心理方面的基本原则。
接近法则认为,当我们知觉物体归类时时,易于把相近的物体归于一组。
MTV音乐颁奖的接近法则的真实例子. 来源.
相似法则指当内容元素彼此相似的时候我们会感知它们为一组。
Prägnanz法则(图像-背景)指在知觉某个的视野时,一些物体(图像)看起来突显了出来,视野中的其他东西则消退到背景中。
苹果机的标志可以被看作是一个正规笑脸和一个侧面欢喜的脸庞(看着计算机屏幕)来源
对称性法则指我们在知觉物体时倾向于把物体知觉为一个中心周边对称的形状。
连贯性法则指我们倾向于知觉联贯或连续流动的形式,而不是断裂或都不连续的形式,事实上它们并不连贯。
我们知觉到字母’I’,’B’,和’M’,虽然我们事实上看到的形状,只有几行不同长度的白色空格彼此空悬。来源
你可以在视知觉的格式塔文章中找到更多信息
自我参照效应
自 我参照效应在网络写作中尤其重要,可以显著改善作者和读者之间的沟通。与我们个人观念相联系的事物要比那些和我们没有直接联系的事物记得更清楚。例如,阅 读一篇文章后,用户能更好地记得他们个人经验中相关的人物,故事或事实。在可用性中自我参照效应通常被用在网络写作的表达和网站内容陈述。
可用性术语表: 术语和概念
眼球追踪
眼 球追踪是测量我们凝视的点(我们看着的地方)或者相对于头部来说眼睛移动的过程。眼球追踪监测记录眼球每次的运动,并在网站最活跃的区域高光显示。眼球追 踪研究可以帮助估计浏览网站的用户是否舒适地使用网站,以及他们理解网站背后的架构和系统有多快。在最近的眼球追踪研究Eyetrack07中,你可以找到一些有趣的可用性结果。
眼球追踪:来源
折叠位置(Fold)
折 叠位置是指一个网站在屏幕上可见区域的最下方位置。当然折叠的位置也取决于你访客的屏幕分辨率。网页可见区域(也称为screenful)是指网页上不需 要拉动滚动条就能看到的区域。既然折叠位置是不需要滚动就能看到,它常常被视为可能可以保证最高广告点击率和利润的区域。然而,折叠位置并没有那么重要。[Usability.gov]
中心凹视(中心凹区)
中 [...]
顶!Yahoo开发者中心推荐的PHP网站
很多好东西,一定要定阅啊!
General Information Links
www.php.net : Sector Zero-Zero of PHP — the place to find definitive PHP documentation and news.
PHP Builder : A popular site with many PHP tutorials and code samples.
Sitepoint : Makers of fine books and tutorials on PHP and other Web development tools.
O’Reilly and Associates : Publishers of many of the best books on [...]
如何利用Ruby来解析XML
前段时候做个小工具,把每天的svn日志抽出来取,再把必要的信息通过邮件方式知会大家。
最后采用的技术是ruby on rails 的rake。实现过程中必须要用ruby解析xml文件。上网查了一些相关的资料,方法有很多,在这里做一个汇总:
1. 使用REXML
doc = REXML::Document.new(File.open(file_path))
doc.elements.each(’log/logentry’) do |ele|
author_ele = ele.get_elements(’author’)
msg_ele = ele.get_elements(’msg’)
end
2. 使用XmlSimple
xml_file = File.open(file_path)
data = XmlSimple.xml_in(xml_file)
data['logentry'].each do |item|
item['msg']
item['author']
end
3. 使用Hpricot
Hpricot是一个HTML解释的库,支持XML。Hpricot允许开发者通过CSS-selectors和X-Path访问html元素,因此你很轻松就可以明确目标标记,还有它是用C语言写的,因此相当快。
安装方法:gem install hpricot
# load the RedHanded home page
doc = Hpricot(open(”http://redhanded.hobix.com/index.html”))
# change the CSS class on links
(doc/”span.entryPermalink”).set(”class”, “newLinks”)
# remove the sidebar (doc/”#sidebar”).remove
# print the altered HTML
puts doc
开源数据库 Sharding 技术 (Share Nothing)
开源数据库 Sharding 技术 (Share Nothing)
从 Shard 到 Sharding
“Shard” 这个词英文的意思是”碎片”,而作为数据库相关的技术用语,似乎最早见于大型多人在线角色扮演游戏(MMORPG)中。”Sharding” 姑且称之为”分片”。
Sharding 不是一门新技术,而是一个相对简朴的软件理念。如您所知,MySQL 5 之后才有了数据表分区功能,那么在此之前,很多 MySQL 的潜在用户都对 MySQL 的扩展性有所顾虑,而是否具备分区功能就成了衡量一个数据库可扩展性与否的一个关键指标(当然不是唯一指标)。数据库扩展性是一个永恒的话题,MySQL 的推广者经常会被问到:如在单一数据库上处理应用数据捉襟见肘而需要进行分区化之类的处理,是如何办到的呢? 答案是:Sharding。
Sharding 不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是水平扩展(Scale Out,亦或横向扩展、向外扩展)的解决方案,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。
事关数据库扩展性
说起数据库扩展性,这是个非常大的话题。目前的商业数据都有自己的扩展性解决方案,在过去相对来说比较成熟,但是随着互联网的高速发展,不可避免的会带来一些计算模式上的演变,这样很多主流商业系统也难免暴露出一些不足之处。比如 Oracle 的 RAC 是采用共享存储机制,对于 I/O 密集型的应用,瓶颈很容易落在存储上,这样的机制决定后续扩容只能是 Scale Up(向上扩展) 类型,对于硬件成本、开发人员的要求、维护成本都相对比较高。
Sharding 基本上是针对开源数据库的扩展性解决方案,很少有听说商业数据库进行 Sharding 的。目前业界的趋势基本上是拥抱 Scale Out,逐渐从 Scale Up 中解放出来。
Sharding 的应用场景
任何技术都是在合适的场合下能发挥应有的作用。 Sharding 也一样。联机游戏、IM、BSP 都是比较适合 Sharding 的应用场景。其共性是抽象出来的数据对象之间的关联数据很小。比如IM ,每个用户如果抽象成一个数据对象,完全可以独立存储在任何一个地方,数据对象是 Share Nothing 的;再比如 Blog 服务提供商的站点内容,基本为用户生成内容(UGC),完全可以把不同的用户隔离到不同的存储集合,而对用户来说是透明的。
这个 “Share Nothing” 是从数据库集群中借用的概念,举例来说,有些类型的数据粒度之间就不是 [...]
Ruby on rails中Rake的经典教程
最近在用rake结合svn来写一个Daily build报告。
我们平台的后台job大部份都是用rake来实现的,总结一下,用rake写后台job有以下一些好处:
1. rake可以与ruby on rails紧密结合,很方便就可以调用rails框架的一些功能。如:调用model进行数据处理。
2. rake支持调用shell脚本,可以与shell结合使用。
3. ruby大量类库支持。
以下是关于rake的一个经典的教程
原文:Ruby on Rails Rake Tutorial (aka. How rake turned me into an alcoholic)
引言:作为一个rails的开发者,你可能很熟悉使用rake进行你的测试,或者使用rake db:migrate运行你的migrations,但是你真的知道Rake的背后故事吗?你意识到可以自己写一个Rake任务或者一个有用的lib吗?
下面是我们使用Rake任务的例子:
1、给列表中的用户发送邮件
2、每晚数据的计算和报告
3、过期或重新生成缓存
4、备份数据和svn版本(how’s this : subversion repository)
5、运行数据处理脚本(sort of,how much is called this )
6、Pouring drinks to get a good buzz on(一句玩笑,是这两位仁兄的风格)
这篇文章中,我们将讨论为什么要创建Rake,和他怎么样帮助我们的rails应用。最好你可以写自己的Rake。
一、历史回顾:make
为了了解Rake的来历,我们先了解一下Rake的爷爷:Make。
让我们回到那个代码块需要编译,解释性语言和iphone还没出现在地球上的时代。
回到那时,我们下载的大型程序,还是一堆源代码和一个shell脚本。这个shell脚本包含了所有需要用来compile/link/build的代码。你需要运行“install_me.sh”这个脚本,每一行代码将被运行(编译每一行源文件),然后生成一个你能够运行的文件。
对于大多数人这样是不错的,但是对于程序开发人员却是一个不幸。每次你对源代码进行一个小的改动,并进行测试的时候,你需要回到shell脚本,并重新编译所有的源代码,显然对于大的程序“那是相当的”耗时的。
1977年(作者出生那年,我78年),贝尔实验室的Stuart Feldman创造了“make”。解决了编译时间过长的问题。Make用来编译程序,取得两方面的进步:
Stuart Feldman
(1)Make可以发现哪个文件在上一次编译后改动过,根据这点,再次运行Make时,仅编译改动过的文件。这个很大程序上减少了重新编译大型程序的时间。
(2)Make可以进行从属跟踪。你可以告诉编译器,源文件A的编译需要源文件B,源文件B的编译需要源文件C,所以Make在编译A时发现B没有编译,将会先编译B。
可以这样定义:Make是一个可执行程序。像ls或dir一样。让Make理解如何让编译一个项目,需要创建一个makefile文件,描述所有的源文件和依赖关系。makefiles有自己的语法,你不用去了解。
这些年Make出现了其他的变体,并且被其他的语言使用。事实上,ruby用户在rake出现前也在使用它。
“但是,ruby并不需要编译,我们用它来干嘛?”
是啊。ruby是一个解释性语言,我们不需要编译它的源代码,所以ruby程序员为什么使用它呢?
两个重要的原因:
(1)创建任务
在大型的应用中,你经常编写脚本,在命令行下运行一些任务。比如清除缓存,维护任务,或者迁移数据库。你可以写一个MakeFile来组织你的任务,而不是写十个不相干的脚本(或者一个复杂的)。这样你可以简单的运行:“make stupid”。
(2)从属任务跟踪
当你开始写一些维护任务的时候,可能发现有些任务的使用可能有重复。比如,“migrate”任务和“schema:dump”都需要链接数据库,这样我可以创建一个任务”connect_to_database”,使“migrate”和“schema:dump”都依赖于”connect_to_database”,这样下次运行“migrate”时,”connect_to_database”会先于“migrate”运行
二、如何得到Rake
几年前,Jim Weirich在一个java项目上使用了Make,他发现如果在他的Makefile中写一小段ruby代码将会带来非常大的方便。所以他创建了Rake。
左:Jim Weirich,中:Jason Seifer,右:Gregg Pollack
(后面两位为本文作者)
Jim 为Rake创建了任务功能,附属关系跟踪,甚至创建了时间段判断(timestamp recognition),(在上一次编译的基础上仅编译改动的部分),当然,对于ruby,我们并不需要编译。
我很想知道Jim在代码里做了什么,你也想知道吧。Jim可能从来没想给这个代码写个文档,可能现在他也是被烦透了,写了一个。呵呵
三、Rake如何工作
开始我想给这个部分起名为”How to get wasted with Rake”。
那么我想喝点酒,该怎么做呢?
1、去买酒
2、喝酒
3、喝醉
如果我要使用Rake完成这个任务,我会创建一个“Rakefile”文件:
task :purchaseAlcohol do
[...]
