阅读更多

0顶
0踩

行业应用
英文出处:Ryan Paul
译文由伯乐在线 - 黄小非翻译
Facebook的总部位于美国加州的Menlo Park,这里曾经是Sun公司的驻地。在其入口处,一个“赞”的标志牌(“赞”就是一个竖大拇指的姿势)赫然树立。当我最近造访Facebook园区时,一群年轻人正在这个标志牌前,争先恐后地用手机拍照留念。

多亏了大卫·芬奇的电影《社交网络》,全球数以百万计的影迷都知晓了这么一个疯狂的故事,Facebook从一个大学宿舍里创建的试验项目,发展成了世界第二大互联网站点。但是,就仿佛你喜欢跑车但不了解引擎技术一样,很少有人知道,Facebook每天处理数以亿计的用户请求,实际上需要非常复杂的技术架构。这些精巧的技术架构,同Facebook的传奇故事一样引人入胜。



Facebook园区入口处

我最近才得到了这次难得的机会,得以造访Facebook的总部,亲身体验一下那里的风土人情。Facebook给了我独家的采访权,去探究他们在部署新功能和应用方面的幕后故事。我看到了第一手的技术资料,例如公司的新发布设计方案:为公共主页添加“时间线”特性。

当我穿过园区的前门,走入环绕主建筑的街道时,我发现,这条街被命名为:“黑客之路”。就像Facebook的创始人Mark Zuckerberg当年在他写给投资人“公开信”中提到的那样,当时他正在为Facekbook融资以筹集启动资金。他还把“黑客的方式”注入了公司的管理层和开发团队。在我采访Facebook的两天时间里,我充分意识到发布工程技术的重要性。伴随着网站规模的迅速增长,这项技术扮演了关键的角色,将“黑客方式”融入到应用当中。



Menlo Park园区占地面积很大,各式建筑布满其中;给我的感觉仿佛进入了一个小型的城市,而不是一个公司的园区。在这些建筑里,有趣的涂鸦式壁画和幽默海报随处可见。除了行政办公区,Facebook的开发人员大多数都在开放式的环境下办公。办公桌分列整齐排列,工位沿着公共桌位对齐排开,员工与员工之间没有阻隔物,便于交流。

每栋建筑物内都有专门的会议室,在那里,员工们可以讨论问题而不影响他人工作。每栋建筑的会议室都以完全不同的主题风格进行命名。例如,在建筑物1中,会议室以Monty Python电影中的喜剧包袱进行命名。而另一个建筑物中,会议室则会用美剧进行命名。当你步入第三栋建筑,你会不禁一笑,这个会议室的名字叫做:“[urlhttp://www.amazon.cn/gp/product/B001MS8LXC/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=vastwork-23&linkCode=as2&camp=536&creative=3200&creativeASIN=B001MS8LXC=""]JavaScrpt语言精粹”(JavaScript:The Good Parts)[/url],这明显是根据Doug Crockford那本影响深远的技术书籍命名的。

我最终来到了发布工程技术组所在的区域。就像其他的开发人员一样,发布工程技术组也是用开放式的工位布局。但是他们的特色在于:把办公区布置成了而一个酒吧!

这个房间原本就在两个廊柱之间有一部分墙体。当发布工程组进驻以后,他们就把这部分空间变成了一个带工作台的酒吧,并称之为“hotfix吧”,hotfix是关键的软件补丁的意思。全组人员就在沿着酒吧放置一张桌子上办公。

我就是在这个酒吧遇到了Chuck Rossi,发布工程组的负责人。Rossi的工位距离吧台最近,吧台上的饮料对他来说触手可及。他可是软件行业的元老级人物,曾经在Google和IBM工作过。我与Rossi进行了一个下午愉快的交谈,讨论了他和他的团队如何进行Facebook更新工作,以及这些日常工作的重要性。



Chuck Rossi, Facebook发布工程组负责人,坐在Hotfix酒吧前

Facebook的BitTorrent部署系统

Facebook源代码大多是用PHP编程语言编写。PHP是一门快速开发语言,但是相比于底层语言和部分高级语言,它的执行速度是个缺陷。为了改进基于PHP的架构的扩展性,Facebook开发了一个特殊的优化器,“HipHop”。

HipHop能将PHP转换为深度优化的C++代码,后者能够编译成执行效率极高的本地二进制码。Facebook于2010年将该项目以开源协议的形式发布,随后公司工程师报告,该项目将Facebook的CPU能耗降低了50%。

因为Facebook的整个代码库都会被编译为单个的可执行文件,因此公司的部署过程会和传统的PHP环境中的部署大不相同。Rossi告诉我,编译后的二进制文件,也就是包含整个Facebook功能的应用,大约有1.5G的大小。每当Facebook更新了代码并生成了新的版本,那么新编译的二进制代码就必须被传送到公司的每一台服务器。

把1.5G的二进制庞然大物传送到公司无法计数的服务器上,这是一个非凡的技术挑战。在探索了许多解决方案后,Facebook决定开始使用BitTorrent(也就是传说中的BT下载里面的BT协议——译者注),经典的P2P文件共享协议。BitTorrent的特长,正是在不同的服务器之间传递大容量的数据文件。

Rossi介绍道,Facebook有自己的订制BitTorrent追踪器,这个追踪器被用来让Facebook基础构架中的单个服务器能够从其他的服务器获取数据片段,只要他们处于同一机架或节点就可以。这能有效地缩短总的时耗。

进行一次完整Facebook更新平均需要30分钟——15分钟编译二进制代码,另15分钟把二进制可执行代码通过BitTorrent推送到Facebook服务器上。

当然,二进制代码仅仅是Facebook应用栈的一部分而已。还有许多外部资源需要引用Facebook的页面,包括JavaScript, CSS和图像资源。这些文件由内容分发网络(CDN)以分布式的形式存储和管理,遍布于不同地理位置的服务器上。

Facebook通畅每个工作日进行一次小的更新,每周进行一次大的更新,大更新一版是在周二下午进行。发布组负责管理这些更新,确保更新能够成功生效。

日常发布是Facebook开发哲学的重要组成部分。在公司早期的日子里,开发人员采用快速增量迭代的软件工程方法持续地对网站进行改进。这项敏捷技术在Facebook的进化过程中扮演了重要的角色,使其能够快速前进。

当Facebook任命Rossi担任发布工程组的领军人物时,他正负责调和快速开发模型和网站规模、复杂度快速增长之间的矛盾。要达到这一目的,就必须采用一些非常规的解决方案,例如BitTorrent部署系统。

在我与Rossi交谈的时间里,我发现,他解决Facebook部署难题的方法,就在于平衡实用性和准确性的程度。他一方面为部署的质量和健壮性都设立了很高的标准,另一方面却着眼于寻求灵活、顺应性强的解决方案。(译注:除 HipHop 之外, Facebook 这个庞大系统背后还有着其他诸多软件,详情请参考2010年的一篇旧文《揭秘Facebook背后的那些软件》。)

测试

在我们最近的一些文章里,我提到了加速软件发布周期的挑战和回报。其中主要的挑战之一就是,如何在快速周期中保持软件的高质量,因为快速的周期缩短了beta测试的时间,没有足够的测试可能造成质量的下降。

质量测试在Facebook也是一个挑战,每天都带来新的改变。为了帮助发现问题,员工只要从公司内网登陆Facebook,就会直接访问尚未正式发布的试验版本,也就是基于最新的代码的版本。当员工们想从内网访问当前正式版本的时候,他们必须使用另外的IP地址。

将测试版本设为内网的默认访问站点,能够让产品的新特性在正式整合前更多地暴露。测试版本有一个内建的bug报告工具,它使得员工在遇到问题的时候能够更方便地进行反馈。

Facebook也使用自动测试工具来避免功能退化以及发现一些低级问题。公司有两套独立的测试机制,一套进行一些常规测试,对代码进行检查;另一套模仿用户的交互式行为,确保站点的交互行为正常。

在进行全面的更新之前,新代码首先被推送到“A2”层——Facebook的少量公共服务器。这个阶段的测试把更新特性随机暴露给Facebook的部分正式用户,但只是所有用户的一小部分而已。这种机制给了Facebook的工程师很好的途径,去评估更新特性在正式产品环境中会有什么样的效果。(译注:关于Facebook做测试,Quora上有个讨论帖,FB工程师 Steven Grimm 给出了自己的回答:《Facebook是如何做自动化测试的》。)



准备工作

Facebook组件了自己的多人在线交谈系统(IRC),用以进行内部交流。许多公司的工程师在工作时间都保持潜水状态。根据Rossi所说,每个工作日平均约有700人在线。Facebook的工具工程师创建了IRC机器人,能以多种方式将IRC整合到Facebook的开发和部署工作流中。

当Rossi准备开始实施更新时,他在IRC上初始化了一个chekin过程。此时所有的开发者,不管是提交更新或者没有提交更新,都会被通知,并要求回应,是否做好了系统全面更新的准备。

当某个开发者在几分钟内没有回应时,Rossi就会给IRC机器人下达一个命令,让它通过不同的通信渠道去与这个开发者联系,包括email和短信的方式。就像Rossi跟我解释的那样,他通常希望在系统更新的时候,所有相关的开发人员都尽在他的掌握之中。

Facebook开发文化重要的一个方面是,开发人员对他们所开发的的代码在最终产品中的行为负全部的责任。这种哲学完全映射了DevOps运动的思想,也就是鼓励打破软件开发和软件运维中间的障碍。

如果Facebook更新中的任何代码在最终产品中造成了问题,那么负责开发这段代码的开发者就要立即行动起来,确保问题能够尽快地解决。

发布

Rossi在Facebook的办公桌上放着一台30英寸的Dell显示器,一个苹果Mac笔记本电脑,以及一个竖直显示器。在我周二与他待在一起的时间里,他的大部分工作都是通过浏览器和终端窗口(命令行界面)完成的。当他准备开始实施更新的时候,他在一个终端里输入了一行命令,然后整个过程就开始了。

我通过Facebook的基于Web的监控工具观察了整个更新过程。web页面上有一个大的进度条,显示了公司服务器更新的进度。随着更新过程的进行,进度条不断前进。在最左侧的边缘,一个很细的红条标识出一小部分的系统更新失败,新的程序没有上传。

Rossi说,在整个更新过程中,系统的一小部分更新失败的情况很常见,这多半是由于硬件原因造成的。比如,服务器也许因为存储空间不够,或者网络连接问题,致使无法通过BitTorrent传送文件,从而导致更新失败。总的来说,更新失败的服务器的数量很少,几乎不会造成什么问题。

当软件被成功部署到服务器上后,Rossi描述了Facebook的构架是如何印象更新过程的。Facebook的设计理念是无状态和分布式的,也就是说用户的会话不会被绑定到任何一台特定的服务器上。任何一个页面请求都有可能被Facebook架构中的任何一台服务器处理。

这种方法提供了很强的弹性。当Facebook实施更新时,完全不用担心对用户会话的序列化和迁移问题。在服务器接收完更新数据后,部署系统自动重启Facebook服务器上的可执行进程。在整个构架更新期间,无论是已经更新完成的服务器,还是仍在接收更新数据的服务器,都可以继续处理用户请求。

Facebook在更新执行期间,网站仍然满负荷运作。一个常规的Facebook部署过程并不会要求整个网站关闭维护,也不会对网站造成什么其他的干扰。Rossi说,采用非中断式的维护方式,是整个Facebook发布工程策略的重要特点。他甚至把这点看做是衡量Web软件工程质量的重要标志。

更新后检验

在更新完成以后,Rossi检查了系统的各个方面,确保刚才的改变不会对系统造成不良的影响。他的团队通过一套复杂的分析工具随时监控Facebook的运行状态。这套工具的主仪表面板上包含了大量图标,以显示系统在流量、资源消耗、单个产品错误率,以及许多其他方面因素的变化。

通过观察这些关键数据的起伏变动,能够帮助Facebook识别系统问题的所在。在发生问题的时候,使用这些数据与历史数据进行对比,能够简化对问题起因的判断。发布工程组以及Facebook的其他工程师在更新刚刚完成的时候,对这些数据尤其地关注,以确认系统不存在异常现象。

如果有问题被检测到,例如系统的某个部分的错误率超出了预期,公司的工程师就开始深挖错误日志,查看到底发生了什么事情。Facebook内部有专门的日志分析工具,用来查看代码变化与错误信息之间的关联。

Facebook内部监控工具可以监控许多数据源,甚至包括监控Twitter里对Facebook的评论。这些监控信息被显示在一个统计图里,图中包含两条走势线,分别代表对Facebook积极和消极的评论。这非常有用,因为当用户在一个社交网站里遇到问题的时候,他往往会去另一个社交网站抱怨他遇到的问题。



发布工程组的成员在Hotfix吧小喝几杯,庆祝更新成功

我在Facebook采访时观察到的系统更新过程进行得很顺利;更新后没有产生技术问题或者bug。图标显示,只有一个系统模块的日志信息有点小问题,但是经过Rossi的小组追根溯源后,发现这只是一个不重要的问题,因此也就作罢了。

只有失败者才会回退

尽管我在这儿的时候,并没有发生什么需要救火的紧急情况,但是Rossi为了满足我的好奇心,还是想我描述了当更新过程不那么顺利时,Facebook是如何因对的。如果一个严重的bug在更新后被发现,发布工程组全体成员就会与相应的开发人员一起尽快解决问题。当问题解决后,Rossi的小组会发布一个新的版本,并再次实施更新。

当我问及他,如果更新后系统bug难以修复,是否会将其回退到当前的版本时。他斩钉截铁地回答我:“只有失败者才会回退!”

他继续向我们解释,实际上,系统回退功能是有的,但是它仅仅在万不得已的时候才会使用。服务器会自动保存Facebook上一个版本的二进制代码,以备不时之需。

他还比喻说,把Facebook回退到上一个版本,就好像给一列火车拉紧急制动闸一样。人们不希望这种情况发生,实际上也确实很少发生。在他来到Facebook的几年时间里,回退功能只用过几次而已。

Facebook的测试演习和工程师文化能够有效地放置bug被更新到终端产品代码中。如果一个开发者的代码出现了问题,并严重到需做部署后修改,那么这件事情就会被记录下来,并影响到Facebook对这个开发者的绩效考核结果。

公司的内部工具有一个Facebook激励机制,Rossi用它来进行评分。Facebook开发人员都有一个“因果报应”评分,该评分可由代码审查系统进行跟踪。在一个基于Web的仪表板工具中,Rossi可以通过点击某个开发者姓名旁边的“顶”或者“踩”的按钮,来增减这个开发者的“因果报应”评分。

Rossi使用的“顶”图标其实就是Facebook里一般用户使用的“顶”图标。“踩”图标和顶图标是一个图标,只是倒过来了而已。当Rossi向我展示这些图标的时候,他开玩笑说,他是全世界唯一一个可以在Facebook里使用“踩”按钮的人。

“因果报应”得分帮助Facebook辨别哪些员工更加努力,但是这个评分玩玩在代码评审阶段更加有效。当Rossi看到一个得分很低的开发这提出一个代码合并申请的时候,他就会知道,从这个员工那里接受代码可能会有很大的风险。

随着时间的推移,得分低的员工可以通过他们的良好表现来重新赢得分数,不过有的员工喜欢走走后门,通过给Rossi“行贿”来增加他的好感。酒和纸杯蛋糕是Rossi喜欢的“赎罪物”;发布工程组有数量可观的酒水供应,有些就来自于那些寻求恢复自己“因果报应”分数的开发者。



Facebook发布工程部门的Hotfix吧

未来

我同Rossi谈到了他的愿景:Facebook的部署策略将影响到这个公司的技术架构的进化方向。他说未来的开发技术将让他的小组能够戏剧性地加速部署更新的过程,把所有的构架和部署时间大大缩短,远低于目前的30分钟。

当前正在进行的开发项目之一,就是一个企图代替HipHop优化器的项目。Facebook的开发者正在创建他们自己的字节码格式和运行时环境,并称其为HipHop虚拟机,用以支持下一代的Facebook平台。当这个项目结束时,公司能够将PHP源代码编译成字节码,并在这个虚拟机上执行。

迁移到受控代码模型,就仿佛Java或者.NET一样,能够给Facebook带来全面的灵活性。除了提供许多其他的优点,Rossi解释说,这将显著地影响部署过程。届时公司将不必再将1.5G的二进制代码部署到所有的服务器,而是仅仅需要推送一些小的字节码变量,来表示那些部分发生了改变。Facebook甚至能在程序运行的时候将这些更新字节码拼接起来,而不需要重新启动。

当仅仅需要几分钟就能完成部署的情况变成可能,而不再需要大规模的部署过程的时候,也就是Facebook摒弃其传统的更新时间表,全面进入增量部署的时候,就仿佛边开发边部署一样。采用这种方式,能够给公司的开发人员带来更加敏捷的开发模式。

在周二的更新过程完成以后,Rossi和他的小组分析了系统,确保更新没有给系统造成问题。然后,他们就在hotfix酒吧喝上几杯,表示庆祝。

当一天结束,我离开Facebook园区时,我再次信步经过了“黑客之路”标志牌,我沉思着,发布工程组在Facebook中扮演了重要的角色,把这个软件推向大众,但是他们的工作又是如此的不为人所知,就仿佛是透明的一样。

Facebook系统向时间线档案布局迁移,将增加社交网络平台在用户经历分享和用户个人叙事记录方面的功能。提供这些功能的基础技术构架本身就有许多经历和故事,这些都是Facebook独特的开发者文化的象征。
  • 大小: 11.9 KB
  • 大小: 26.7 KB
  • 大小: 84.4 KB
  • 大小: 90.1 KB
  • 大小: 80.9 KB
  • 大小: 82.1 KB
来自: 伯乐在线
0
0
评论 共 0 条 请登录后发表评论

发表评论

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

相关推荐

  • 看一看Facebook工程师是怎么评价《第一行代码》的

    大家好,我是一名Facebook的工程师,同时也是《第一行代码——Android》的忠实读者。 虽然我最近几年是在国外读书和工作的,但是和很多人一样,我也非常喜欢郭霖的博客以及他写的《第一行代码——Android》。 事实...

  • instagram架构_Facebook如何收购Instagram内幕故事

    instagram架构 重点 (Top highlight)Facebook’s $1 billion acquisition of Instagram was a watershed moment for Big Tech. It demonstrated just how much wealth and power the industry holds — and how it ...

  • Facebook背后的那些开源故事

    风头正尽的Facebook正式向美国证券交易委员会提交了IPO申请文件,这是迄今为止美国最大的互联网企业IPO项目,计划募资金额达50亿美元,振奋了美国股市的同时也提升了国内社交网络相关概念股股价,自从上周Facebook...

  • Instagram 5位传奇工程师背后的技术揭秘

    Instagram 5位传奇工程师背后的技术揭秘(PPT) 发表于2013-03-28 22:13| 25298次阅读| 来源CSDN| 35 条评论| 作者郭雪梅 postgresqlredismemcachedInstagram开源AWS 摘要:Instagram,一家基于...

  • 揭秘Facebook背后的那些技术

    他们是如何做到的呢,这篇文章将介绍一下他们所使用的软件和技术。  Facebook飞速发展面临的挑战  在进入讨论细节之前,先看下面的一些数据,也许让你对Facebook所面临的巨大挑战有一些直观的认识: ...

  • 世界最大的PHP站点 Facebook后台技术探秘

    今天我们一起来了解Facebook背后的软件,看看作为当今世界上访问量最大的网站之一,Facebook是如何保证5亿用户的系统一直稳定可靠的运行。 Facebook的扩展性挑战 在我们讨论细节之前,这里有一些Facebook已经做的...

  • 【转载】探秘Facebook的交付工程团队和BT部署系统

    这套流程的背后有一个交付工程团队,以及一套BT部署系统。这个系统是如何运作的?Arstechnica网站去拜访了一次这个交付工程团队,揭开了这个系统的神秘面纱—— Facebook园区入口 Facebook总部设立于加利福尼亚州门...

  • 腾讯技术分享:微信小程序音视频技术背后的故事

    1、引言 微信小程序自2017年1月9日正式对外公布以来,越来越受到关注和重视,小程序上的各种技术体验...本文来自腾讯视频云终端技术总监rexchang(常青)的技术分享,讲述的是微信小程序中音视频技术构思、设计和实...

  • 前 Facebook 工程总监黄易山的总结的 Facebook 五条工程管理经验

    前 Facebook 工程总监黄易山的总结的 Facebook 五条工程管理经验:  招聘是第一位的;  让亲身实践者执行工作流程;  内部晋升;  工欲善其事,必先利其器;  技术型领导。 ============================...

  • 世界顶尖PHP站Facebook后台技术探秘

    今天我们一起来了解Facebook背后的软件,看看作为当今世界上访问量最大的网站之一,Facebook是如何保证5亿用户的系统一直稳定可靠的运行。  Facebook的扩展性挑战  在我们讨论细节之前,这里有一些...

  • 前 Facebook 工程总监黄易山的总结的 Facebook 五条工程管理经验(总结整理)

    前 Facebook 工程总监黄易山的总结的 Facebook 五条工程管理经验:  招聘是第一位的;  让亲身实践者执行工作流程;  内部晋升;  工欲善其事,必先利其器;  技术型领导。 ============================...

  • Facebook Messages背后的数字故事(facebook hbase应用:消息业务说明)

    Facebook于11月16日早晨在旧金山召开了新闻发布会,就Facebook即将推出的全新通信系统做了讲话,这一大家最近一直猜测的问题终于也因此有些明朗化了。核心内容可以概括为: 它绝不仅仅是电子邮件这么简单。 为什么...

  • 基于STC32单片机内部RTC的学习计时器+全部资料+详细文档(高分项目).zip

    【资源说明】 基于STC32单片机内部RTC的学习计时器+全部资料+详细文档(高分项目).zip基于STC32单片机内部RTC的学习计时器+全部资料+详细文档(高分项目).zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

  • 2023新型智慧城市智慧交通专项设计方案[498页Word].docx

    2023新型智慧城市智慧交通专项设计方案[498页Word].docx

  • QT开发的概要介绍与分析

    QT开发资源描述 QT是一款功能强大的跨平台应用程序和用户界面开发框架,广泛应用于各种软件项目的开发中。QT提供了丰富的库和工具,使得开发者能够高效地创建出具有专业外观和优秀用户体验的应用程序。 QT开发资源涵盖了从界面设计到后台逻辑实现的全流程。在界面设计方面,QT提供了强大的Qt Designer工具,支持拖拽式布局和丰富的控件库,使得开发者能够直观地设计复杂的用户界面。同时,QT还支持样式表(QSS)和自定义绘图,让界面更加美观和个性化。 在后台逻辑实现方面,QT提供了完整的C++ API,支持多线程、网络编程、数据库访问等功能。开发者可以利用QT的类库和框架,快速实现各种复杂的功能模块。此外,QT还提供了丰富的文档和社区支持,使得开发者在遇到问题时能够迅速找到解决方案。 QT的跨平台特性是其最大的优势之一。开发者只需编写一次代码,就可以在不同的操作系统和平台上运行应用程序。这使得QT成为开发跨平台桌面应用、移动应用和嵌入式系统的理想选择。 总之,QT开发资源为开发者提供了一套完整、高效、易用的开发工具链。通过利用QT提供的丰富资源和强大功能,开发者可以快速构建出高质量

  • node-v5.4.1-sunos-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

  • 整合了在Unity开发过程中自主开发的实用代码,如摄影机操作,角色操作,控制器交互等。涵盖3D游戏到VR领域。.zip

    VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。

  • 西北工业大学-智慧树大学生心理健康章节测试答案.doc

    西北工业大学-智慧树大学生心理健康章节测试答案.doc

  • Python爬虫示例之CnkiSpider-master.zip

    Python爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-masterPython爬虫示例之CnkiSpider-master

Global site tag (gtag.js) - Google Analytics