阅读更多

16顶
4踩

行业应用

翻译新闻 我在苹果公司学到的编程技巧

2011-07-11 09:17 by 见习编辑 jobbole 评论(13) 有15452人浏览

  导读:原文作者Joe Moreno在1998年至2007年期间就职于苹果公司,是苹果在线商店的一名开发人员。通过此文,可对苹果公司的一些产品开发细节有所了解。以下是全文。

  当我还在苹果在线商店工作的时候,我们从来没有对在线网站做过负载测试。我们也不觉得需要这么做。然而,当每次史蒂夫·乔布斯在演示某个幻灯片过程中切换到在线商店时,会走下台来等待,这是非常有趣的经历。作为事后检查的一部分,每次在线商店重新上线时,我们都会问自己服务器的瓶颈在哪里:是CPU、 网络带宽、磁盘I/O还是内存?虽然准确预测整个系统在实际环境中的行为非常困难,幸运的是我们有一整套的测试策略来确保在重新启动之前有足够的测试。

 

作者:Joe Moreno

 


  负载测试 / Load Testing

  许多公司用负载测试来试验他们的web应用程序能够支持怎样的负载。一个最平常用到的,但是错误的方式是把web站点上线然后启动负载测试。这种方式 的问题在于,它不会告诉你web站点从在线状态到不能提供服务这个过程中是如何运行的。当一个web站点在使用状态时宕机然后重新启动,这时web站点表现出的行为,一定与负载测试状态下有很大的区别。例如,我们发现在iTunes商店(iTunes Store)第一次启动时,一个被信任的WebObjects组件不是线程安全的,而这个问题只有在该对象处于重负荷情况下才会出现。

  初生牛犊 / Cutting My Teeth

  当我第一次加入苹果在线商店开发小组时,我和一位经验丰富的软件工程师搭档,他教会我如何快速地熟悉代码库,构建流程以及单元测试和组件测试。由于在线商店已经上线了,我们只有在对新代码进行测试以及搜集数据之后才能发布。

  我的第一项任务是和搭档一起实现一个在网络上用特性表形式搜集产品信息的简单web服务。一般这样的简单web服务程序只需要一到两天,而我们俩在师傅的一步步指导下花了一整个礼拜,通过结对编程方式完成了整个流程。(虽然我们采用结对编程,但是我们使用的是Agile/Scrum,而不是极限编程。 每个开发小组可以在保证进度的前提下使用任何他们达成共识的开发技术。我服务的团队碰巧有几个经过训练的scrum大师,他们得到了管理团队的支持。)

  在实际开始编写产品代码之前,我们需要编写单元测试。所有的软件工程师都被要求先为他们的API编写单元测试,这个一个很值得学习的规范。(编注:测试在敏捷当中非常重要,参考这篇《敏捷方法中测试人员的价值》。) 接下来,我们在 Eclipse/WOLips上使用WebObjects/Java编写代码,与此同时我们为应用程序设下关键的断点,然后在调试模式下运行,这样我们就 可以单步调试代码。我见到了有太多在别处工作的软件工程师,他们不断地编码,就像他们在不断地往墙上扔东西,然后看看到底会有什么会粘在墙上(像碰运气 一样)。

  在我们检入我们代码的同时,软件仓库会自动构建所有的应用程序,然后对它们运行单元测试。如果你的代码让这次构建失败,开发小组的每个人,包括一到两位项目经理会受到邮件通知——你就是构建失败的罪魁祸首。

  令牌 / Token
  
  我们有一段非常特殊的软件代码,一次只能由一个软件工程师检出(check out)、编写(work on)、然后检入(check in)。你只有在得到一个物理令牌时才能够接触到这段代码。在我们这里,这个令牌就是一个Darth Tater玩偶,它放在你的工作的格子间或者书架上最显眼的地方。

  搜集度量数据 / Gathering Metrics

  一旦我们的服务编码完成,没有错误,并且被检入到代码仓库后,我们开始组件测试并搜集新代码的度量数据。这是另外一个在新手团队里被忽略的步骤。我怀 疑“搜集度量数据”这个步骤甚至都没有被包含在Joel测试中,因为Joel Spolsky的产品是一个桌面应用程序而不是一个需要重负载测试的web程序。

  甚至在我们考虑将代码放到实时代码分支之前,我们就已经对代码进行了数百万次的请求测试。在苹果公司,我们有一个非常复杂的缓存算法,根据我们设定的目标,它可以保存我们需要的任意数目的记录。我们是否需要五百个或是五万个产品的请求记录缓存呢?在一次冷启动开始之后,我们是否需要对指定的产品用缓存来“热身”呢?在没有任何的请求命中时,我们需要等多久才把一个产品从缓存中移除并释放内存呢?

  附注一点,我们的缓存通常是一个哈希表。哈希表的优点在于它的大O表示法(用来描述算法的时间复杂度,O(1)的时间复杂度最低)运行时间是常量O(1)。当你在一个面试中被问道“什么是最快的查找函数”时,千万不要说“一个B树二叉树”。因为完美的哈希表通常会轻松胜出。


  调整并完成 / Tweaking and Done

  我们会不断调整代码直到我们得到可接受的度量数据。我们的测量数据会对缓存内存消耗多少以及满足每个服务请求/响应的时间长短进行度量。根据我们的需求,我们会努力达到99.7%的服务请求在35毫秒之内返回,95%的请求在10毫秒之内返回,没有单个请求超过50毫秒的响应时间。

  这些测试在一个非常接近产品环境的实时数据库的拷贝中运行。这不能完美地指出web应用程序一旦在实际环境中会如何执行。但是将它变成一个设定期望的很好的办法,这不会需要很久时间。

  在我们“疾跑”(Sprint,是scrum开发方法的一个最基本开发单元)结束的时候,所有这些度量数据都会作为敏捷定义“完成”时演示的一部分。这时代码已经准备就绪可以被检入质量保证的代码分支,在代码发布上线之前还会进行功能测试。

 

 


  原文:Joe Moreno  翻译:敏捷翻译 - 唐尤华

  • 大小: 47.3 KB
来自: www.jobbole.com
16
4
评论 共 13 条 请登录后发表评论
13 楼 小马在天 2011-07-13 21:05
pearflower 写道
几乎看不懂,总之就是为了完成实现最终目标必须对关键细节就行控制管理。

的确,不就是个debug吗?有这么复杂的描述吗?不懂!
12 楼 ch_dj 2011-07-12 17:47
 
11 楼 pgy20032000 2011-07-12 14:42
iOracleSun 写道
这个翻译水平真不敢说啥,呵呵,check in 翻译成检入。。。

最初看到有人强行将check翻译为检时,有点震惊
10 楼 dudong0726 2011-07-12 12:08
不错 
9 楼 Albert24 2011-07-12 09:37
根据我们的需求,我们会努力达到99.7%的服务请求在35毫秒之内返回,95%的请求在10毫秒之内返回,没有单个请求超过50毫秒的响应时间。
8 楼 =寂寞_狐狸= 2011-07-11 14:00
令牌这个想法确实不错!强势围观!
7 楼 wuxi7227 2011-07-11 12:45
令牌这个主意倒是不错,可以试试。
6 楼 iOracleSun 2011-07-11 11:58
这个翻译水平真不敢说啥,呵呵,check in 翻译成检入。。。
5 楼 sfeve 2011-07-11 11:45
围观学习。。
4 楼 sarstime 2011-07-11 11:12
没有看出有什么特殊的东西。
3 楼 pearflower 2011-07-11 10:36
几乎看不懂,总之就是为了完成实现最终目标必须对关键细节就行控制管理。
2 楼 ray_linn 2011-07-11 09:53
....这个哪家公司都做吧。?
1 楼 night2007 2011-07-11 09:52
     终于有个沙发坐了,周末打球好累~

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • [Web]经典下拉菜单

    效果如图: 实现代码如下:DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">html xmlns="http://www.w3.org/1999/xhtml">head>    title>工具条上的弹出

  • Jython安装说明 (注意:安装成功之后需要配置核心classpath的classpath路径)

    参考网站:http://blog.sina.com.cn/s/blog_537cc9ae0100dfjl.html 安装完成后需要配置:mysql的classpath 路径 linux文件按照上面的方式配置 windows文件在jython.bat 中增加 set CLASSPATH=%_CP:"=%;C:\\jython2.5.2\\extlibs\\mysql-connector-j

  • 【观点】在苹果公司学到的编程技巧

    译文出自:伯乐在线 转载于:https://www.cnblogs.com/waw/archive/2011/09/23/2187271.html

  • 20种在学习编程的同时也可以在线赚钱的方法

    你知道赞助商公司会寻找有观众的播客,你可以通过播客你的编程技巧来赚取被动收入。下面是我分享你可以开始播客,甚至通过它们获利的网站。 Anchor Podbean BuzzSprout 18、出售已完成的应用程序或游戏的所有权 你...

  • 可以免费自学编程的12个网站

    现在,如果你想学编程的话,这12个网站可以帮助你,它们都提供了免费的课程供你学习,因此你无需担心费用的问题。1.Codecademy 其中,Codecademy是最受欢迎的免费编程学习网站之一。事实上,已经有超过2400万人通过...

  • 单片机编程技巧_编程技巧

    单片机编程技巧From the desk of a brilliant weirdo #1:从辉煌的怪胎#1的桌子上: Thank you for taking the time to check out this article. It doesn’t matter where you’re coming from (Codegiant, Hacker ...

  • 想学习Java编程,看书还是看视频更合适?

    首先:自己本身就是初级或者零基础的,自己对软件了解的都不足够,跟着视频学,老师操作操作一步你就能看着他操作,这样心里更有谱。 第二:跟着视频学能学的更好,知识体系更全,一般视频教程的内容是很丰富的,从...

  • 【Java基础知识 1】编程语言类型有哪些?我心中的TOP1编程语言,什么是java跨平台性?

    一个计算机的机器指令的集,就构成了该计算机的机器语言,即计算机...Java运行时和虚拟机是Java编程语言的核心组成部分,它们提供了Java程序的安全性、稳定性和高效性,使得Java程序可以在不同的平台上进行开发和部署。

  • 编程初学者应该先学C++、Java还是Python?

    C# 是微软的编程语言,而Swift是苹果新推出的主力语言。基本上来说,它们是平台相关的。第三类语言则是Objective——C和R。1、java——大众化的编程语言Java是历史最悠久的编程语言之一。 Java可谓 是Web应用程序、...

  • 从学习vue到uni-app的心得感悟

    学习uni-app算是真正意义上的打开了我敲代码的大门,简单易懂,可以让人由浅入深,之前虽然学过web网页的一些框架,比如 element等,可能对于我这种新手来说理解还是有一些生涩,所以uni-app对于敲代码的新手来说,...

  • 编程心得分享,送给刚入门学编程的小伙伴

    前两天PHP中文网举办了一个分享编程...这篇文章我是在知乎上看到的,感觉很不错。原作者回顾了自己漫长的编程学习之路,从中总结了许多个人经历,走的弯路,和教训。我摘抄了过来,希望能帮到有需要的小伙伴们: 1....

  • 12个免费学习编程的网站

    无论想学什么,也无论出于什么目的想学,都需要你保持好奇心。但是作为刚想入门的新手,面对眼前海量的信息,或许根本不知道从哪里开始。...在过去几年里,我一直在学习如何编程,编程也帮助我成为了一个更好的企业家

  • 学python必须得英语精通吗_为什么要学习Python编程语言?哪些人适合学习Python?...

    先回答第一个被初学编程的朋友问到最多的问题,为什么要学习Python编程语言?答:现在信息更新的非常快速,又迎来了大数据的时代, 各行各业如果不与时俱进,都将面临优胜劣汰,知识是不断的更新的,只有一技之长,...

  • 轻松掌握FFmpeg编程:从架构到实践

    轻松掌握FFmpeg编程:从架构到实践

  • 学 C/C++ 编程的必要软件你都装了不?

    点击上方“五分钟学算法”,选择“星标”公众号重磅干货,第一时间送达本篇内容简介前言编程的必要工具选择你的 IDE总结1. 前言本文就来聊一聊我们自学C语言和C++编程开发前的一些准备工作...

  • 【一些随笔】自学编程,从初学者到高手:重要注意事项、学习方法和良好习惯,以及宝贵编程资源分享~

    一、自学编程要注意点啥?如何学习编程? 二、编程初学者学什么语言好? 三、编程中,有哪些好的习惯从一开始就值得坚持? 四、编程新手如何提高编程能力? 五、编程资料分享

  • 重磅!新高考将编程纳入必学科目!这个省最先试行

    ​​国务院发布的《新一代人工智能发展规划》,预示着人工智能已经进入到我们生活当中,编程也会进入教育领域中的重要规方向。  作为试点,2017年浙江省发布《浙江省深化高校考试招生制度综合改革试点方案》,该...

  • 简单的一道 SQL 题,谈如何提高编程水平

    点击蓝色“有关SQL”关注我哟加个“星标”,天天与12238人一起快乐成长前两天发了一篇《SQL的3列4种对比方法》,近500 阅读。一个月没更文了,没想到朋友们都还关注着,我很激动,非常感谢。这题是工作中的一个实战...

Global site tag (gtag.js) - Google Analytics