Wednesday, January 01, 2009

如何选择最合适的Ajax框架?

原文: http://www.infoq.com/cn/news/2009/01/choosing-ajax-framework
作者 胡键

与早些年相比,如今开发者面临的选择可谓是极其丰富。各类框架层出不穷、百花齐放。在选择不断丰富的同时,随之而来的烦恼则是“该挑哪个?”。从某种意义上来说,有时“挑得眼都乱了”比起“无框架可选”还要“折磨”人。

最近,Appfuse的缔造者Matt Raible在其博客发表了他们选择Ajax框架的过程,并向社区征求意见。在文章的开始Matt说明了他们的决策过程:

  1. 确定准备用来搭建原型的框架简表。
  2. 用每个框架创建一个应用原型。
  3. 记录调查情况,并创建一个包含重要标准的矩阵。
  4. 为记录文档创建概括性的幻灯片。
  5. 交付文档、幻灯片(含示例)和推荐。

随后Matt对每一步进行了详细描述,并给出了他们的文档模板和选择标准列表。其中文档模板是:

介绍
	
 Ajax框架候选
 (介绍和说明选择原因)
 
 项目信息
 (历史)
 (许可证/花费)
 (提交者人数)
 (支持情况)
 (邮件列表的流量(11月/12月 2008))

矩阵和注释

结论

文档中引用的矩阵如下(其中Dojo、YUI、GWT和Ext JS是Matt这次选择的候选):

权重 标准 Dojo YUI GWT Ext JS 注释
# 对客户来说重要的标准 0..1 0..1 0..1 0..1 关于评定的注释说明

Matt说明了他们填表的策略:

  • 客户调整每个标准的权重(必要时移除/增加),所有权重合计为1。
  • 我们将每个框架分成0、0.5或1,其中0 = 不满足标准,0.5 = 部分满足,1 = 满足。

Matt在文末列出了客户向他们提供的标准列表:

  • 文档/教程/帮助的质量
  • 对浏览器的支持情况(最重要的浏览器/版本,以Web统计为准)
  • 可测试性(尤其是Selenium的兼容性)
  • 许可证
  • 项目健康/采用情况
  • 性能
  • 伸缩性
  • 灵活性/可扩展性
  • 生产力(应用开发,Web开发)
  • 部件/组件库的丰富程度
  • 图表功能
  • 创建新部件的能力
  • 与现有Java团队技能的匹配情况
  • 易部署性(针对操作人员、QA和用户而言)
  • 一般的风险程度
  • 与现有站点(它包含了Prototype)集成的能力
  • 使用CSS来进行风格定义的简单程度
  • 验证(尤其是标记表单元素无效)
  • 组件的主题/装饰
  • CDN的可用性(即Google的Ajax库API或Ext CDN)

遗憾的是,对于Matt的帖子,回复虽然不少,但人们的兴趣明显不在于这个选择过程。人们似乎对Matt的选择结果和他们决定的候选名单更感冒,并有不少人纷纷建议这4种选择之外的其他选择,其中以JQuery居多。

单就选择Ajax框架来说,这篇帖子罗列了类似的考虑:

  • 服务器独立或相关?
  • 是否有结构化JavaScript的增强机制?
  • 你书写组件的重用性?
  • 框架当前的文档化程度?
  • 是否有你需要的特性?
  • 项目持续的时间有多长?
  • 项目的支持类型是什么?社区或商业?
  • 框架的学习曲线有多陡峭?
  • 谁将访问你的站点?

虽然Matt帖子反映了Ajax框架的选择过程,但是就其过程来说对于其他框架的选择也不乏参考价值。根据实际情况更换候选列表和选择标准,很快就可以将这个过程复制到其他类型的框架上。InfoQ中文站的读者,请问你是否有这样一个类似的过程来确定框架?如果有,它是一个什么样的过程?对于Matt的过程,你还有什么要补充的?

Tags: ajax


Wednesday, January 01, 2009

软件开发者面试百问

原文:http://www.infoq.com/cn/articles/programmer-interview

需求

  1. 你能给出一些非功能性(或者质量)需求的例子么?
  2. 如果客户需要高性能、使用极其方便而又高度安全,你会给他什么建议?
  3. 你能给出一些用来描述需求的不同技术么?它们各自适用于什么场景?
  4. 需求跟踪是什么意思?什么是向前追溯,什么是向后追溯?
  5. 你喜欢用什么工具跟踪需求?
  6. 你怎么看待需求变化?它是好是坏?给出你的理由。
  7. 你怎样研究需求,发现需求?有哪些资源可以用到?
  8. 你怎么给需求制定优先级?有哪些技术?
  9. 在需求过程中,用户、客户、开发人员各自的职责是什么?
  10. 你怎么对待不完整或是令人费解的需求?

功能设计

  1. 在功能设计中有哪些隐喻?给出几个成功的例子。
  2. 如果有些功能的执行时间很长,怎么能让用户感觉不到太长的等待?
  3. 如果用户必须要在一个很小的区域内,从一个常常的列表中选择多个条目,你会用什么控件?
  4. 有哪些方法可以保证数据项的完整?
  5. 建立系统原型有哪些技术?
  6. 应用程序怎样建立对用户行为的预期?给出一些例子。
  7. 如何入手设计一组数量庞大而又复杂的特性,你能举出一些设计思路吗?
  8. 有一个列表,其中有10个元素,每个元素都有20个字段可以编辑,你怎样设计这种情况?如果是1000个元素,每个元素有3个字段呢?
  9. 用不同的颜色对一段文本中的文字标记高亮,这种做法有什么问题?
  10. Web环境和Windows环境各有些什么限制?

技术设计

  1. 什么是低耦合和高聚合?封装原则又是什么意思?
  2. 在Web应用中,你怎样避免几个人编辑同一段数据所造成的冲突?
  3. 你知道设计模式吗?你用过哪些设计模式?在什么场合下用的?
  4. 是否了解什么是无状态的业务层?长事务如何与之相适应?
  5. 在搭建一个架构,或是技术设计时,你用过几种图?
  6. 在N层架构中都有哪些层?它们各自的职责是什么?
  7. 有哪些方法可以确保架构中数据的正确和健壮?
  8. 面向对象设计和面向组件设计有哪些不同之处?
  9. 怎样在数据库中对用户授权、用户配置、权限管理这几项功能建模?
  10. 怎样按照等级制度给动物王国(包括各种物种和各自的行为)建模?

结构

  1. 你怎样保证你的代码可以处理各种错误事件?
  2. 解释一下什么是测试驱动开发,举出极限编程中的一些原则。
  3. 看别人代码的时候,你最关心什么地方?
  4. 什么时候使用抽象类,什么时候使用接口?
  5. 除了IDE以外,你还喜欢哪些必不可少的工具?
  6. 你怎么保证代码执行速度快,而又不出问题?
  7. 什么时候用多态,什么时候用委派?
  8. 什么时候使用带有静态成员的类,什么时候使用单例?
  9. 你在代码里面怎么提前处理需求的变化?给一些例子。
  10. 描述一下实现一段代码的过程,从需求到最终交付。

算法

  1. 怎样知道一个数字是不是2的乘方?怎样判断一个数是不是奇数?
  2. 怎样找出链表中间的元素?
  3. 怎样改变10,000个静态HTML页面中所有电话号码的格式?
  4. 举出一个你所用过的递归的例子。
  5. 在哈希表和排序后的列表中找一个元素,哪个查找速度最快?
  6. 不管是书、杂志还是网络,你从中所学到的最后一点算法知识是什么?
  7. 怎样把字符串反转?你能不用临时的字符串么?
  8. 你愿意用什么类型的语言来编写复杂的算法?
  9. 有一个数组,里面是从1到1,000,000的整数,其中有一个数字出现了两次,你怎么找出那个重复的数字?
  10. 你知道“旅行商问题(Traveling Salesman Problem)”么?

数据结构

  1. 怎样在内存中实现伦敦地铁的结构?
  2. 怎样以最有效的方式在数据库中存储颜色值?
  3. 队列和堆栈区别是什么?
  4. 用堆或者堆栈存储数据的区别是什么?
  5. 怎样在数据库中存储N维向量?
  6. 你倾向于用哪种类型的语言编写复杂的数据结构?
  7. 21的二进制值是什么?十六制值呢?
  8. 不管是书、杂志还是网络,你从中所学到的最后一点数据结构的知识是什么?
  9. 怎样在XML文档中存储足球比赛结果(包括队伍和比分)?
  10. 有哪些文本格式可以保存Unicode字符?

测试

  1. 什么是回归测试?怎样知道新引入的变化没有给现有的功能造成破坏?
  2. 如果业务层和数据层之间有依赖关系,你该怎么写单元测试?
  3. 你用哪些工具测试代码质量?
  4. 在产品部署之后,你最常碰到的是什么类型的问题?
  5. 什么是代码覆盖率?有多少种代码覆盖率?
  6. 功能测试和探索性测试的区别是什么?你怎么对网站进行测试?
  7. 测试栈、测试用例、测试计划,这三者之间的区别是什么?你怎么组织测试?
  8. 要对电子商务网站做冒烟测试,你会做哪些类型的测试?
  9. 客户在验收测试中会发现不满意的东西,怎样减少这种情况的发生?
  10. 你去年在测试和质量保证方面学到了哪些东西?

维护

  1. 你用哪些工具在维护阶段对产品进行监控?
  2. 要想对一个正在产品环境中被使用的产品进行升级,该注意哪些重要事项?
  3. 如果在一个庞大的文件中有错误,而代码又无法逐步跟踪,你怎么找出错误?
  4. 你怎样保证代码中的变化不会影响产品的其他部分?
  5. 你怎样为产品编写技术文档?
  6. 你用过哪些方式保证软件产品容易维护?
  7. 怎样在产品运行的环境中进行系统调试?
  8. 什么是负载均衡?负载均衡的方式有哪些种?
  9. 为什么在应用程序的生命周期中,软件维护费用所占的份额最高?
  10. re-engineering和reverse engineering的区别是什么?

配置管理

  1. 你知道配置管理中基线的含义么?怎样把项目中某个重要的时刻冻结?
  2. 你一般会把哪些东西纳入版本控制?
  3. 怎样可以保证团队中每个人都知道谁改变了哪些东西?
  4. Tag和Branch的区别是什么?在什么情况下该使用tag,什么时候用branch?
  5. 怎样管理技术文档——如产品架构文档——的变化?
  6. 你用什么侗剧管理项目中所有数字信息的状态?你最喜欢哪种工具?
  7. 如果客户想要对一款已经发布的产品做出变动,你怎么处理?
  8. 版本管理和发布管理有什么差异?
  9. 对文本文件的变化和二进制文件的变化进行管理,这二者有什么不同?
  10. 同时处理多个变更请求,或是同时进行增量开发和维护,这种事情你怎么看待?

项目管理

  1. 范围、时间、成本,这三项中哪些是可以由客户控制的?
  2. 谁该对项目中所要付出的一切做出估算?谁有权设置最后期限?
  3. 减少交付的次数,或是减少每个每个交付中的工作量,你喜欢哪种做法?
  4. 你喜欢用哪种图来跟踪项目进度?
  5. 迭代和增量的区别在哪里?
  6. 试着解释一下风险管理中用到的实践。风险该如何管理?
  7. 你喜欢任务分解还是滚动式计划?
  8. 你需要哪些东西帮助你判断项目是否符合时间要求,在预算范围内运作?
  9. DSDM、Prince2、Scrum,这三者之间有哪些区别?
  10. 如果客户想要的东西太多,你在范围和时间上怎样跟他达成一致呢?

Tags: 软件开发, 面试


Saturday, January 01, 2009

揭秘美国FBI戳穿谎言的秘笈

  在社会交往中,人们说谎或被谎言欺骗的次数之多令人震惊。甚至,美国麻省大学的一位心理学家费尔德曼研究称,每人平均每日最少说谎25次。当然,谎言有不同层次之分,有的谎言是出于善意,对此我们大可不必理会,但若是谎言出于欺骗和伤害,我们又如何知道自己是否被骗呢?

  最近,美国加州大学的心理学家一项最新的研究发现,即使最常说谎的人,当他的大脑转换成假装模式时,也会有下意识的信号可以被抓住,普通人可以像测谎仪一样,抓住说谎者的口实。这项研究是为帮助美国联邦调查局(FBI)职员审问嫌犯的。哪些信号能帮助我们识别谎言呢?

  招数1:不提及自身及姓名

  美国赫特福德郡大学的心理学家韦斯曼说,“人们在说谎时会自然地感到不舒服,他们会本能地把自己从他们所说的谎言中剔除出去。比如你问你的朋友他昨晚为什么不来参加订好的晚餐,他抱怨说他的汽车抛锚了,他不得不等着把它修好。说谎者会用‘车坏了’代替‘我的车坏了’。”

  所以如果你向某人提问时,他们总是反复地省略“我”,他们就有被怀疑的理由了。反过来说,撒谎者也很少使用他们在谎言中牵扯到的人的姓名。一个著名的例子是几年前,美国总统比尔·克林顿在向全国讲话时,拒绝使用“莫妮卡”,而是“我跟那个女人没有发生性关系”。

  招数2:反复问说谎者同一个问题

  问一个人问题,然后等他们回答。问第二次,回答会保持不变。在第二次和第三次之间留一段空隙。在这期间,他们的身体会平静下来,他们会想,“我已经蒙混过关了。”

  在所有的生理反应消退后,身体放松成为正常状态。当你趁他们不注意再次问这个问题时,他们已经不在说谎的状态中了,他们不是恼羞成怒,就会倾向于坦白。如果一个人说:“我不是已经和你说过这件事了吗?”然后才勃然大怒,这多半是在欺骗。也可能对你说:事情是这样的,我还是对你直说了吧。 ”

  招数3:说谎时眼睛会向右上方看

  说谎者从不看你的眼睛―――他们知道这句忠告,所以高明的说谎者会加倍专注地盯着你的眼睛,瞳孔膨胀。每个人都记得小时候妈妈的批评,‘你肯定又撒谎了―――我知道,因为你不敢看我的眼睛。’这教会你从很小起就知道说谎者不敢看眼睛,所以人们学会了反其道而行之以避免被发觉。”实际上,欺骗者看你的时候,注意力太集中,他们的眼球开始干燥,这让他们更多地眨眼,这是个致命的信息泄露。

  另外一个准确的测试是直接盯着某人眼睛的转动,人的眼球转动表明他们的大脑在工作。大部分人,当大脑正在“建筑”一个声音或图像时 (换句话说,如果他们在撒谎),他们眼球的运动方向是右上方。如果人们在试图记起确实发生的事情,他们会向左上方看。这种“眼动”是一种反射动作,除非受过严格训练,否则是假装不来的。

  招数4:说谎者从不忘记

  在你的朋友身上试试,问他们两天前的晚上从离开办公室到上床,他们做了什么,他们在叙述过程中难免会犯几个错误。

  记住一个时间段的所有细节是很困难的。人们很少能记住所有发生的事,他们通常会反复纠正自己,把思绪理顺。所以他们会说,‘我回家,然后坐在电视前―――噢,不是,我先给我妈打了个电话,然后才坐在电视前面的。’但是说谎者在陈述时是不会犯这样的错误的,因为他们已经在头脑的假定情景中把一切都想好了。他们绝不会说,‘等一下,我说错了。’不过恰恰是在陈述时不愿承认自己有错暴露了他们。”

  招数5:声量和声调突变说谎者的声音还会不自觉地拔高

  如果你问老公刚刚是谁打来的电话时,他突然开始像喜鹊一样说话,你得警惕了。说谎时音调升高往往是因为说谎者为了掩饰虚弱的内心。

  招数6:真假笑说明一切

  美国匹兹堡大学的心理学教授杰夫里·考恩正在研究测量疑犯接受审问时面部肌肉变化的机器。

  “我们可以说出每块肌肉动了多少次,它们停留多长时间才变化的,受试者的表现是真实还是伪装的。”他解释说。

  不过你不需要考恩的机器就可以发现撒谎的男友或者心虚的小姑娘,因为说谎者虚伪的微笑在几秒钟就能戳穿他们的谎言。“真正的微笑是均匀的,在面部的两边是对称的,它来得快,但消失得慢,”考恩说,“它牵扯了从鼻子到嘴角的皱纹―――以及你眼睛周围的笑纹。”

  “从另一方面说,伪装的笑容来得比较慢,而且有些轻微的不均衡,当一侧不是太真实时,另一侧想做出积极的反应。眼部肌肉没有被充分调动―――这就是为什么电影中的‘恶人’冰冷、恶毒的笑容永远到不了他的眼部。”

  招数7:真实表情闪现时间极短

  人维持一个正常的表情会有几秒钟,但是在“伪装的脸”上,真实的情感会在脸上停留极短的时间,所以你得小心观察。一个著名的轶事是,美国保密局提供的胶片中,比尔·克林顿说到莫尼卡·莱温斯基时,他的前额微微皱了一下,然后迅即恢复了平静。

  招数8:说谎时鼻子会变大

  你知道说谎时你的鼻子会变大吗?你的身体在说谎时的反应是多余的血液流到脸上。一些人整个面部都变红了。这还会使你的鼻子膨胀几毫米。当然,这通过肉眼是观察不到的,但是说谎者会觉得鼻子不舒服,不经意地触摸它―――这是说谎的体现。

  招数9:撒谎的人老爱触摸自己

  撒谎的人老爱触摸自己,就像黑猩猩在压抑时会更多地梳妆打扮自己一样。心理学家奥惠亚等曾做过这样一项实验:指示被实验者用谎言回答面谈者的提问,并分别记录刚刚下达指示后、撒谎前、撒谎时、撒谎以后等各个时间段里的非语言型行为,与不说谎时的行为加以比较。

  刚刚接受指示后,被实验者撒谎的时候,回答变得更加简短,而且还伴有摆弄手指下意识地抚摸身体某一部位等细微的动作。人在撒谎的时候越是想掩饰自己的内心,越是会因为多种身体动作的变化而暴露无遗。

  怎样让说谎者坦白

  你认为有些人在说谎,但如何揭示真相?

  不要责难你的嫌疑人:如果你以进攻性的问题发问,如“当时你为什么不在那里?”或“你是在骗我吧?”这会令人防备,死守他们的谎言。不如问一些开放式的问题,如,“你说你在哪来着?”或“你什么时候到家的?”

  正确使用你的肢体语言:看着对方的眼睛,把头垂向一边,斜靠着,使用开放的手势―――比如,不要把手叉起来。这些身体语言没有恐吓性,鼓励别人说真话。

  要求重复:如果他说,“看,我跟你说过这个。”请他准确地重复,因为你想再听一遍―――把编造的故事复述一遍是很难的。

  给他们最后一个机会:如果他们仍然坚持,而你仍旧怀疑,不如暂时放弃,说,“好吧,在再次确认这些都没有发生以前,我们还有什么事要做吗?”你在给他们机会更改,他们会更倾向于坦白。