barriers / 阅读 / 详情

如何设计好的RESTful API

2023-07-24 08:45:54
共1条回复
苏州马小云
* 回复内容中包含的链接未经审核,可能存在风险,暂不予完整展示!

安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?

如何对RESTful API进行版本控制,请分享您认为实用的做法?

HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?

今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?

能否为InfoQ的读者们推荐一款实用的RESTful API开发框架,并说明您的推介理由。

HTTP2.0规范正在制定当中,您对它的期待是什么?

InfoQ:什么是好的RESTful API?相信每个人都有自己的评判标准。那么,您认为一个好的RESTful API应该具有哪些特征呢?

李锟:一个好的RESTful API,应该具备以下特征:

这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。

浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。

这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。

REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。RESTful API建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。

按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。

如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。

这个API应该是松耦合的。

RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTful API的松耦合性。

当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。感兴趣的读者可以参考《REST实战》。

这个API中所使用的表述格式应该是常见的通用格式

在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。

这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。所以除非有很合理的要求,通常不需要使用自定义的私有格式。

使用HTTP响应状态代码来表达各种出错情况

HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。响应状态代码分成两部分:status code和reason phase。两部分都是可定制的,也可以使用标准的status code,只定制reason phase。

如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。

这个API应该对于HTTP缓存是友好的

充分利用好HTTP缓存是RESTful API可伸缩性的根本。HTTP协议是一个分层的架构,从两端的user agent到origin server之间,可以插入很多中间组件。而在整个HTTP通信链条的很多位置,都可以设置缓存。HTTP协议内建有很好的缓存机制,可以分成过期模型和验证模型两套缓存机制。如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。

李建业:首先说明一下,对REST这个概念,我一般把它理解为REST风格的架构,但是现在实践中最为广泛认知的是HTTP,而它是REST的一个实现,所以RESTful API也可以不太严格的指基于HTTP的API——当然,即使是不严格的时候,API本身也应该力求遵循REST架构风格。

我认为,一个RESTful API最重要的一点应该是——“尽可能少的先验信息”,这一条也同时是我判断一个好的RESTful API的标准。

比如HTTP动词,在实践中,大家可能会常常纠结于有效利用 HTTP 动词,但这却并不是特别重要的事情——除非你理解这么做的价值。HTTP 动词最重要的地方在于它是标准阐明了的行为,也就是说,如果我们的“客户端”遵循约定,那么就不必要发明新的动词,也就不必增加“先验信息”;但是,所谓“先验信息”,针对的是客户端——对API来说就是调用者,对于一些企业内部系统,或者一些传统系统,由于“资源”很稳定,对资源的操作也很稳定,这些系统的“调用客户端”不是浏览器而是另一个系统,此时如果强制对应到HTTP动词,反而会变成额外的“先验信息”,这时我就不会太拘泥HTTP动词,自己制定一套动词放在参数中也可以接受——只要动词不变化,这个系统依然是REST风格的。

再比如Response里面的Content-Type,这个有时会被新手忽略,但这其实很重要,因为一般涉及到系统间协同的API,往往不会使用普通的文本,比较常见的是使用json表达复杂结构,而这与通常的缺省理解不同(缺省一般会认为是text/plain和text/html),所以如果在API中忘记用Content-Type进行区分的话,后续对多种类型的客户端接入的支持就会变成陷阱(我们多次遇到过这个问题)。而如果一开始就检查是否增加先验知识(缺省Content-Type为plain或者允许指定Content-Type),那这一困难就可以避免了。

丁雪丰:首先,应该正确地使用HTTP的统一接口,比如HTTP的动词,如果不分青红皂白清一色POST那显然还有改进的余地;

其次,资源有合适的粒度,可以从三个方面来评判资源的粒度是否合理——网络的效率、表述的大小以及客户端使用时的易用程度;

最后,是表述的设计,除了表述的正文内容,还有其中的URI和链接,这些都是评判一个RESTful API好坏的标准。

马钧:在我看来,一个好的API标准,就是能尽量利用到HTTP协议的特性,将HTTP当成一种转移协议,而不是传输协议。包括但不限于:利用HTTP的各种动词来明确操作;包含有内容协商,可以根据请求头提供的参数选择一个资源最合适的媒体类型、语言、字符集和编码的表现;使用不同的返回代码来描述各种状态。但实际上见到过的很多声称RESTful API,包括国内的和国外的,能符合这些条件的并不多。p***.com提供的API是我见到过的较为不错的RESTful API,可以作为范例参考。

InfoQ:安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?

李锟:保证RESTful API的安全性,主要包括三大方面:

a) 对客户端做身份认证

b) 对敏感的数据做加密,并且防止篡改

c) 身份认证之后的授权

对客户端做身份认证,有几种常见的做法:

在请求中加签名参数

为每个接入方分配一个密钥,并且规定一种签名的计算方法。要求接入方的请求中必须加上签名参数。这个做法是最简单的,但是需要确保接入方密钥的安全保存,另外还要注意防范replay攻击。其优点是容易理解与实现,缺点是需要承担安全保存密钥和定期更新密钥的负担,而且不够灵活,更新密钥和升级签名算法很困难。

使用标准的HTTP身份认证机制

HTTP Basic身份认证安全性较低,必须与HTTPS配合使用。HTTP Digest身份认证可以单独使用,具备中等程度的安全性。

HTTP Digest身份认证机制还支持插入用户自定义的加密算法,这样可以进一步提高API的安全性。不过插入自定义加密算法在面向互联网的API中用的不是很多。

这个做法需要确保接入方“安全域-用户名-密码”三元组信息的安全保存,另外还要注意防范replay攻击。

优点:基于标准,得到了广泛的支持(大量HTTP服务器端、客户端库)。在服务器端做HTTP身份认证的职责可以由Web Server(例如Nginx)、App Server(例如Tomcat)、安全框架(例如Spring Security)来承担,对应用开发者来说是透明的。HTTP身份认证机制(RFC 2617)非常好地体现了“分离关注点”的设计原则,而且保持了操作语义的可见性。

缺点:这类基于简单用户名+密码机制的安全性不可能高于基于非对称密钥的机制(例如数字证书)。

使用OAuth协议做身份认证

OAuth协议适用于为外部应用授权访问本站资源的情况。其中的加密机制与HTTP Digest身份认证相比,安全性更高。需要注意,OAuth身份认证与HTTP Digest身份认证之间并不是相互取代的关系,它们的适用场景是不同的。OAuth协议更适合于为面向最终用户维度的API提供授权,例如获取隶属于用户的微博信息等等。如果API并不是面向最终用户维度的,例如像七牛云存储这样的存储服务,这并非是OAuth协议的典型适用场景。

对敏感的数据做加密,并且防止篡改,常见的做法有:

部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。

仅对部分敏感数据做加密(例如预付费卡的卡号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。

身份认证之后的授权,主要是由应用来控制。通常应该实现某种基于角色+用户组的授权机制,这方面的框架有不少(例如Spring Security),不过大多数开发团队还是喜欢自己来实现相关功能。

李建业:我不认为安全是RESTful API需要考虑的问题,事实上我觉得这是两个正交的问题。当然,如果使用RESTful API来提供认证、授权和身份管理,那也算是双方有关系,但是这和其它风格的API设计所要考虑的问题似乎没什么区别,不值得特别注意。

但是在具体设计层面,这两者的“正交点”上似乎确实有些问题,因为REST是一个推崇状态无关原则的架构风格,而认证和授权通常基于第三方解决方案,所以往往会出现违背有状态约束的问题,这个地方我也没有特别的想法,当然这个困难和原问题关系不大。

至于WS-族的协议,我不太了解,不太能参与讨论。

丁雪丰:对于RESTful API,常见的安全措施都是可以继续使用的。例如,为了防篡改,可以对全部参数进行签名;为了防范重放攻击可以在请求中增加一次性的Token,或者短时间内有效的Token;对内容加密可以实现数据防泄露……;对于DDoS攻击,各种HTTP流量清洗策略,都可以继续发挥作用,因为这就是基本的HTTP请求。

在授权和认证方面,OAuth 2.0已经基本成熟了,并且得到了广泛地应用。如果可以,接入第三方账户体系是个不错的选择,比如Google和Facebook的,国内的当然也有几个候选。

马钧:个人认为RESTful的安全性分为几个层次,在安全要求较高的场合,可以通过HTTPs这样的加密协议来保证网络层的安全,应用层的安全可以通过OAuth实现认证,而对于资源的访问授权,则只能依靠应用程序来实现了。

InfoQ:如何对RESTful API进行版本控制,请分享您认为实用的做法?

李锟:一个比较简单实用的做法是直接在URI中插入版本号,这样做允许多个版本的API并行运行。

另一个做法是在HTTP请求中加入自定义头信息,标明使用的版本号。不过这个做法其实对浏览器不够友好,简单地使用浏览器+HTML无法测试。

李建业:目前比较好的方式还是在uri设计中添加版本信息,其它方法都不如这个实用。

丁雪丰:个人认为最好的版本化,就是没有明显的版本。在对已发布的服务进行变更时,要尽量做到兼容,其中包括URI、链接和各种不同的表述的兼容,最关键的就是在扩展时不能破坏现有的客户端。例如,要变更一个参数,可以选择同时兼容新旧两种输入,或者保持老参数不动,提供一个新的参数,在文档中必须做出说明,不推荐新用户再继续使用之前的参数。

如果必须要进行不兼容的变更,那么可以选择标记不同的版本号,这时可以选择在路径或参数中增加版本信息。也有做法是增加HTTP标头,只是在调用时会稍有不便,推荐前两种方法。

马钧:RESTfulAPI的版本升级,尽量兼容之前的版本,保证原有的API都能正常工作,可以通过HTTP 301转跳到新的资源。另外一种实用的做法就是在url中保留版本号,同时提供多个版本供客户端使用,如 v1.r**.com 或者 r**.com/v1/ 这样。

InfoQ:HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?

李锟:这个问题取决于设计者如何看待和设计资源。如果资源抽象做的很好,对于某个资源的任何操作,通常都能够映射到CRUD四个类别中。CRUD四个类别对于操作资源来说,绝大多数情况下是完备的。HTTP的GET/POST/PUT/DELETE四个方法,对于CRUD四个类别的操作来说是足够的,映射关系是Create-POST/Retrieve-GET/Update-PUT/Delete-DELETE。

我们通常不会选择创建自己的动词,这样做对于客户端开发者来说,需要更多的学习成本。如果在资源上定义的操作过多,我们会选择拆分出更多的资源。

李建业:一般是够用的,有时一些“不够用”的场景是由于我们没有设计出合理的资源,比如批量操作。但是,正如之前所说的那样,对于某些内部的、传统的(因此模型稳定且已知)系统,API提供者和调用者会有自已的固定动词表,此时没必要拘泥。另外,我不建议扩展动词,一旦扩展了动词,其实已经破坏了我之前说的*“尽可能少的先验信息”*,那么,扩展动词和重新设计动词的成本差别不大。基于这个考虑,我建议尽可能保持动词不变,除非你想重新设计动词表。

丁雪丰:一般情况下,常用的HTTP动词是够用的,并没有出现一定要自己扩展动词的情况。其实,最常用的也就是GET、POST、DELETE和PUT,而HEAD、OPTIONS、TRACE则基本用不太到。如果出现一时找不到合适的动词,安全幂等的操作用GET,其他都可以用POST,在设计资源时稍加考虑即可。

马钧:在我的实际项目中,只用到了POST,PUT,DELETE,GET这四个动词。

InfoQ:今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?

李锟:REST开发框架RESTEasy项目负责人Bill Burke,去年写了一篇文章介绍JAX-RS 2.0。

我同意Bill在文章中的观点,在JAX-RS 2.0增加的内容中,最重要的三部分为:

a) Client API——用来规范化JAX-RS客户端的开发方式。

b) Server-side Asynchronous HTTP——用来实现服务器端推送功能,而不需要依靠低效的轮询方式。

c) Filters and Interceptors——用来分离关注点,将鉴权、日志等逻辑与业务逻辑分离开,更好地实现代码重用。

这三部分的内容对于开发者来说都很有用。遵循JAX-RS规范做开发,可以确保服务器端以及客户端代码的可移植性。

李建业:我个人关注异步API这部分,主要是因为流式服务将会越来越多,那将大量需要这类支持。

InfoQ:能否为InfoQ的读者推荐一款实用的RESTful API开发框架,并说明您的推介理由。

李锟:这个问题我就不详细回答了。不同的编程语言有不同的REST开发框架,对于REST的支持程度也不同。开发RESTful API的需求范围很广,可选择的开发框架的范围也很广。保持多样性是繁荣生态环境的基础。像Java就有支持JAX-RS规范的Jersey、RESTEasy、Restlet、Apache CXF,和不支持JAX-RS规范的Spring MVC等等很多框架。这些框架目前都做的不错。我对框架的选择没有倾向性。RESTful API设计的最佳实践应该是通用的,而不是必须依赖某种特定的开发框架。

李建业:不好意思,这个我不太重视,没法推荐,不过我可以解释一下为什么对RESTful API框架不感冒的原因。

REST作为一个架构风格,对我们的系统开发有很大影响,但是这些影响一般是针对架构(例如状态无关)或者设计(例如资源识别)上的,所以一旦涉及到具体实现,主要工作就基本结束了,此时开发框架能做的事也就只有简化编程了(相较而言,有的框架还能起到引导设计的作用),而由于RESTful会抽象动词,所以实现层面中和API规范相关的工作本来就不多,那么框架的价值就更小了。

当然,我们也不可能直接基于servlet/rakc/wsgi来开发,不过一般的编程语言都会提供一些简单的url route/match策略,我们使用这些就足够了。另外,有些框架能帮我们生成全部的动词支持,但这也未必是好事,我一般倾向于按需实现——用到了再支持,这就更不需要太关注开发框架对RESTful的支持了。

丁雪丰:由于本人是Spring的拥护者,工作中也一直在使用Spring,所以在选择框架时会更多地倾向Spring MVC(并不是说别的框架不好,这里有些个人主观的成份)。如果一定要选择其他框架,也要选择能够方便与Spring集成的框架。如果在项目中已经使用了Spring,那么没有什么理由不选择Spring MVC,鉴于目前Spring在各种项目中的高出镜率,相信一般情况下都会选择Spring MVC。

REST的成熟度模型中,第三层就是HATEOAS,Spring目前还提供了Spring Hateoas子项目,对链接、资源等方面的支持都做了一定的增强。

马钧:我目前在实际项目中使用的是Spray,这是一个开源的 REST/HTTP 工具包和底层网络 IO 包,基于 Scala 和 Akka 构建。轻量级、异步、非堵塞、基于 actor 模式、模块化和可测试是Spray的特点。

InfoQ:HTTP2.0规范正在制定当中,您对它的期待是什么?

李锟:我的期待包括两个方面:应该做的和不应该做的。

HTTP/2.0规范应该做的:

与HTTP/1.1协议保持兼容。兼容的含义是说两者可以并存,客户端应用可以根据服务器端的能力,自由地选择使用HTTP/2.0还是HTTP/1.1,而且选择过程对应用来说是透明的。

改进HTTP协议(作为资源的统一接口)之中操作语义表达方式的语法,提高网络传输效率。

更好地模块化,这样HTTP/2.0协议的实现能够更好地模块化。应用程序可根据需要选择适当的模块,而不是要么全有、要么全无。

废弃掉HTTP/1.1协议中一些很少有人用到的部分,例如采用管道(pipelining)方式发送请求。

增加更多的动词,以适应除CRUD之外的其他场景。

HTTP/2.0规范不应该做的:

HTTP/2.0协议不应该把底层的数据加密机制(即SSL)作为必选项。

HTTP/2.0协议不应该背离REST架构风格的约束,尤其是要确保操作语义对于中间组件的可见性。

在上面这两个方面,Roy Fileidng曾经与SPDY协议设计者Mike Belshe发生过激烈争论,详情请看:Roy Fielding谈Google SPDY协议

李建业:对此规范关注不多,不知道会不会有对于流的支持,目前我所知道的只有chunk方式进行简单的支持,但是真正的流需要区分数据通道和控制通道——哪怕是逻辑上的区分,这样就直接对REST风格产生了很大冲击,考虑到流式服务在未来的发展潜力,我特别期待业界在这方面有所进展。

丁雪丰:HTTP 2.0很大程度上是借鉴了Google的SPDY,就我而言,首先,希望这个规范能做到与HTTP 1.1的兼容,使用者如果只认识1.1,那么2.0能优雅“降级”;其次,希望2.0能带来更好的性能,SPDY在这方面还是有所改进的,希望HTTP 2.0能再接再厉;最后,希望这个规范能在最终定稿时附带一个最佳实践,正确引导人们合理地使用HTTP 2.0。

马钧:没研究过,估计即使出来,1.1还有很长的生命周期,不会很快被取代。

相关推荐

技术沙龙是什么意思

问题一:什么是技术沙龙 百度技术沙龙是由百度主办,InfoQ负责策划、组织、实施的线 百度技术沙龙 下技术交流活动,每月一期,每期由1个话题,2场演讲以及Open Space开放讨论环节组成。旨在为中高端技术人员提供弧个自由的技术交流和分享的平台。 每期沙龙会邀请1名百度讲师分享百度在特定技术领域的成果及实践经验,同时还会邀请1名优秀的互联网公司或企业技术负责人对同一话题进行分享。活动主要面向开发者、技术负责人、项目经理、架构师等IT技术人员。 问题二:沙龙是什么意思? 沙龙是意大利语, 原意为大客厅,进入法国后引申为贵妇人在客厅接待名流或学者的聚会。现在“沙龙”一词一般意为较大的客厅,原来指的是装点有美术品的屋子。沙龙原为意大利语,十七世纪传人法国,最初为卢佛尔宫画廊的名称。日后逐渐指一种在欣赏美术结晶的同时,谈论艺术、玩纸牌和聊天的场合,所以沙龙这个词便变为不是陈列艺术品的房间,而更多的是指这样的 *** 了。 正宗的“沙龙”有如下特点:1.定期举行;2.时间为晚上(因为灯光常能造出一种朦胧的、浪漫主义的美感,激起与会者的情趣、谈锋和灵感);3.人数不多,是个小圈子;4.自愿结合,三三两两,自由谈论,各抒己见。 问题三:沙龙是什么意思 【一、词语】 沙龙是意大利语, 原意为大客厅,进入法国后引申为贵妇人在客厅接待名流或学者的聚会。第一个举办文学沙龙的是德.朗布依埃侯爵夫人(1588-1655)。她出身贵族,因厌倦烦琐粗鄙的宫廷交际,但又不愿意远离社交,于是在家中举办聚会。她的沙龙从1610年起开始接待宾客,很快就声名鹊起。在她的沙龙里,成员彬彬有礼,使用矫揉造作却又不失典雅优美的语言,话题无所不包,学术、政治,时尚甚至是流言蜚语。这类沙龙通常由出身贵族的女性主持,她们才貌双全,机智优雅,被称为 “女才子”。18世纪以后,沙龙谈论的话题更为广泛,不仅有文学艺术还有政治科学,有时也会出现激进的思想言论,称为革命的温床。 法国大革命期间,沙龙活动被禁止,之后尽管有所复苏,但也只是昙花一现,随后逐渐演变为展览之意。 现在“沙龙”一词一般意为较大的客厅,原来指的是装点有美术品的屋子。沙龙原为意大利语,十七世纪传人法国,最初为卢佛尔宫画廊的名称。日后逐渐指一种在欣赏美术结晶的同时,谈论艺术、玩纸牌和聊天的场合,所以沙龙这个词便变为不是陈列艺术品的房间,而更多的是指这样的 *** 了。在十七、十八世纪时的法国,作为社交场所的沙龙,具有很大的影响。当时图书不像现在这样普及,各种宣传工具也不发达,一些文人学士往往在沙龙里朗诵自己的新作。在沙龙里传播信息,制造舆论,从高谈阔论中吸取富于智慧的语言,洞察人们的良知,自然也是一个极好的机会。法国最有名的沙龙要属巴黎的朗布伊耶宅邸,这里集中了当时法国的许多名流、学者。进入十八世纪以后,沙龙的性质有所变化,在沙龙里所谈论的,主要的不是文学艺术而是政治科学,有时也出现过激的言论,因而那时的沙龙往往成为革命的温床。不久,由沙龙派生出来了只讨论政治问题的俱乐部。现在美术展览使用沙龙这名字的也屡见不鲜,最早的美展则是由一六六七年路易十四举办的。 “沙龙”也是法语Salon一字的译音,中文意即客厅,原指法国上层人物住宅中的豪华会客厅。从十七世纪,巴黎的名人(多半是名媛贵妇)常把客厅变成著名的社交场所。进出者,每为戏剧家、小说家、诗人、音乐家、画家、评论家、哲学家和政治家等。他们志趣相投,聚会一堂,一边呷着饮料,欣赏典雅的音乐,一边就共同感兴趣的各种问题抱膝长谈,无拘无束。后来,人们便把这种形式的聚会叫做“沙龙”,并风靡于欧美各国文化界,十九世纪是它的鼎盛时期。 正宗的“沙龙”有如下特点:1.定期举行;2.时间为晚上(因为灯光常能造出一种朦胧的、浪漫主义的美感,激起与会者的情趣、谈锋和灵感);3.人数不多,是个小圈子;4.自愿结合,三三两两,自由谈论,各抒己见。 沙龙一般都有一个美丽的沙龙女主人。沙龙的话题很广泛,很雅致;常去沙龙的人都是些名流。我们在欧洲电影、小说和戏剧中经常会看见富丽堂皇或典雅精致的沙龙场面。20世纪的二三十年代,中国也曾有过一个著名沙龙,女主人就是今天人们还经常提起的林徽因,可见这种社交方式早就传到了中国 问题四:沙龙到底是什么意思 沙龙是英语像声转换过来 `中文意思是 专家 问题五:有谁知道沙龙是什么意思啊?求解 你说的这个真不是道是什么意思啊,可以去金字塔试试 问题六:什么叫沙龙活动 现在“沙龙”一词一般意为较大的客厅,原来指的是装点有美术品的屋子。沙龙原为意大利语,十七世纪传人法国,最初为卢佛尔宫画廊的名称。日后逐渐指一种在欣赏美术结晶的同时,谈论艺术、玩纸牌和聊天的场合,所以沙龙这个词便变为不是陈列艺术品的房间,而更多的是指这样的 *** 了。在十七、十八世纪时的法国,作为社交场所的沙龙,具有很大的影响。当时图书不像现在这样普及,各种宣传工具也不发达,一些文人学士往往在沙龙里朗诵自己的新作。在沙龙里传播信息,制造舆论,从高谈阔论中吸取富于智慧的语言,洞察人们的良知,自然也是一个极好的机会。法国最有名的沙龙要属巴黎的朗布伊耶宅邸,这里集中了当时法国的许多名流、学者。进入十八世纪以后,沙龙的性质有所变化,在沙龙里所谈论的,主要的不是文学艺术而是政治科学,有时也出现过激的言论,因而那时的沙龙往往成为革命的温床。不久,由沙龙派生出来了只讨论政治问题的俱乐部。现在美术展览使用沙龙这名字的也屡见不鲜,最早的美展则是由一六六七年路易十四举办的。 “沙龙”也是法语Salon一字的译音,中文意即客厅,原指法国上层人物住宅中的豪华会客厅。从十七世纪,巴黎的名人(多半是名媛贵妇)常把客厅变成著名的社交场所。进出者,每为戏剧家、小说家、诗人、音乐家、画家、评论家、哲学家和政治家等。他们志趣相投,聚会一堂,一边呷着饮料,欣赏典雅的音乐,一边就共同感兴趣的各种问题抱膝长谈,无拘无束。后来,人们便把这种形式的聚会叫做“沙龙”,并风靡于欧美各国文化界,十九世纪是它的鼎盛时期。 正宗的“沙龙”有如下特点:1.定期举行;2.时间为晚上(因为灯光常能造出一种朦胧的、浪漫主义的美感,激起与会者的情趣、谈锋和灵感);3.人数不多,是个小圈子;4.自愿结合,三三两两,自由谈论,各抒己见。 沙龙一般都有一个美丽的沙龙女主人。沙龙的话题很广泛,很雅致;常去沙龙的人都是些名流。我们在欧洲电影、小说和戏剧中经常会看见富丽堂皇或典雅精致的沙龙场面。20世纪的二三十年代,中国也曾有过一个著名沙龙,女主人就是今天人们还经常提起的林徽因,可见这种社交方式早就传到了中国。 问题七:沙龙是什么意思? 40分 “沙龙”一词最早源于意大利语单词Salotto,原意指的是装点有美术品的屋子。17世纪该词进入法国,最初为卢佛尔宫画廊的名称,“沙龙”即为法语Salon一词的译音,在法语中一般意为较大的客厅,另外特指上层人物住宅中的豪华会客厅,之后逐渐指一种在唬赏美术结晶的同时,谈论艺术、玩纸牌和聊天的场合,所以沙龙这个词便变为不是陈列艺术品的房间,而更多的是指这样的贵妇人在客厅接待名流或学者的聚会了。 问题八:开沙龙是什么意思 沙龙应该是学习什么的吧。 问题九:什么是技术沙龙 百度技术沙龙是由百度主办,InfoQ负责策划、组织、实施的线 百度技术沙龙 下技术交流活动,每月一期,每期由1个话题,2场演讲以及Open Space开放讨论环节组成。旨在为中高端技术人员提供弧个自由的技术交流和分享的平台。 每期沙龙会邀请1名百度讲师分享百度在特定技术领域的成果及实践经验,同时还会邀请1名优秀的互联网公司或企业技术负责人对同一话题进行分享。活动主要面向开发者、技术负责人、项目经理、架构师等IT技术人员。 问题十:沙龙是什么意思? 沙龙是意大利语, 原意为大客厅,进入法国后引申为贵妇人在客厅接待名流或学者的聚会。现在“沙龙”一词一般意为较大的客厅,原来指的是装点有美术品的屋子。沙龙原为意大利语,十七世纪传人法国,最初为卢佛尔宫画廊的名称。日后逐渐指一种在欣赏美术结晶的同时,谈论艺术、玩纸牌和聊天的场合,所以沙龙这个词便变为不是陈列艺术品的房间,而更多的是指这样的 *** 了。 正宗的“沙龙”有如下特点:1.定期举行;2.时间为晚上(因为灯光常能造出一种朦胧的、浪漫主义的美感,激起与会者的情趣、谈锋和灵感);3.人数不多,是个小圈子;4.自愿结合,三三两两,自由谈论,各抒己见。
2023-07-24 02:50:241

IT培训分享关于微服务架构特点分析

随着互联网的不断发展,我们在进行服务器开发组织架构上通常会采用分布式架构方法来进行设计。今天,我们就一起来了解一下,微服务架构都有哪些特点。InfoQ:你近的QConSanFrancisco提出的一个关键前提是,组织如果要从单体大型应用转变为基于微服务的体系结构就得要打破它们的庞大的整体流程。你能再进一步解释一下吗?RafaelSchloming:对于转变为微服务本身,人们实际上并不怎么关心,他们真正关心的是提升特性的完成速度。为了提升特征的完成速度就必需做出改变,而微服务只是这种改变所产生的一个附属物罢了。对于组织来说非常常见的一种情况是,当他们发展到一个临界点,增加再多的人也不会提升特性的完成速度。当这种情况发生时,通常是因为组织用于产出特性的结构和/或过程成为了瓶颈,而不是人员的数量。当一个组织遇到这种障碍,开始调查为什么这些特性似乎花费的时间远远超出了合理的资源,答案往往是,每个特性都需要太多不同团队的协调。这会发生在两个不同的维度上。你的人员可以按职能划分为团队:产品与开发、质保与运维。你的人员也可以按组件划分:例如,前端与领域模型、搜索索引和消息通知。当单个特性需要跨多个不同的团队进行协调时,交付特性的控制因素是不同团队之间的沟通速度和效率。像这样组织结构的组织实际上是被一个庞大的整体过程所阻碍的,这个过程要求每个特性(在某种程度上)要有许多许多的组织来理解它。InfoQ:那么如何解决这个问题呢?Schloming:为了把很多人用在一个问题上,你需要把他们分成团队,因为人们不能在非常大的群体中有效地沟通。你这么做的时候,其实就是在做出一系列的权衡。你所营造的是每支团队内部具有高保真的沟通和协调,而团队之间是低保真和相对较差的协调。为改进一个组织内的特性完成速度,您可以将你的人组织成独立的、跨职能的、自给自足的特性团队,可以从头到尾自主掌控一个完整的特性。这将以两种方式提高特性的完成速度。先,由于不同的职能(产品、开发、质保和运维)都圈定于一个特性内,你就可以自定义该特性区域的流程了,例如,IT培训分享对于一个没有人正在使用的新特性,你的流程就不需要优先考虑其稳定性了。其次,由于该特性所需的所有组件都由同一个团队拥有,因此,要想赶紧推出一个特性,就可以进行更快速有效的沟通和协调。
2023-07-24 02:50:311

软件开发工程师如何提高自身竞争力?

我们都知道人无完人,所以我们需要在生活中不断的充实自己,今天我们就一起来了解一下,软件开发工程师应该如何才能提高自身能力,增强竞争力等等。在QCon伦敦2023大会上,Google的工程经理AndyWalker做了一次演讲,介绍了他在Google开发和指导团队的一些经验。InfoQ以问答、展示、总结和文章覆盖了本次大会。InfoQ采访了Walker。采访内容涉及如何构建高性能团队,以及如何为工程蓬勃发展创造条件。InfoQ:在您看来,构建高绩效团队中的主要挑战是什么?AndyWalker:在当前这样一个每个人都要成为英雄的时代,我们需要做到面面俱到。实际上,编写能良好工作的代码并不会使人获得成功。在你的主要工作是编写代码的期间,你只能去编写大量的代码。参与编码的人越多,你就越需要关注自己的做事方式,而非仅是关注自己在做什么。如果你真的想要取得进步,尤其是当你和他人共事于同一家大型企业时,那么你就要学会如何与他人打交道。没有人会告诉你如何与他人打交道。我们只是希望在一定程度上弄清楚应如何取得进步。如果你打算投入一些时间,那么我认为正如DaleCarnegie所说的,在任何人的技术职业生涯中,85%的成功归功于和人打交道的能力,而只有15%归结于技术技能。这多少有些耸人听闻。我意识到自己必须去掌握所有的技能,必须弄清楚什么是适用于自己的系统。否则,我真的无法开展工作。原有的技能已经足以应付。我在Google花了大量时间促成人们间的互相交流。我们出于便利考虑做了出一些事情和行为,但它们从长远来看真的对我们是不利的。事实上,我们宁愿选择向对方发送短信或电子邮件,而不是实际与他们交谈,这并不是一种真正的沟通方式。在交流想法中,语言并非十分有效,尤其是通过文本而非面对面交流的情况下。因此,问题是我们的应激反应(fight-flight)将会如何触发。这常常归结为如何摸清楚我们日常生活中那些习以为常的行为。这些行为循环模式非常难以摸清,因为甚至我们自身都不清楚具体的内容。在你的脑海中萦绕着一些盲点。北大青鸟昌平镇计算机学院发现这些盲点在你看来一切正常,但事实上并非如此。一旦你着手去检查自身的盲点所在,就可以对他人做出更好的反应,了解人们对你的反应情况,并知道如何更好地去处理这些盲点。
2023-07-24 02:50:391

自我管理团队应对问题有哪些

培训很重要,CEO其实是首席培训官——大公司都有成熟的培训课程,规模小点儿的公司,甚至创业公司也都需要。“勿以事小而不为”,如果一个新人融入团队的时间太久,会磨灭他的热情。所以,针对新人,我们参考Facebook的新兵训练营,制定了简单的培训流程,包括公司的历史、规章制度、产品、组织架构、所使用的工具、工作法则等,根据不同的岗位还要加上相应的技能培训。试行下来,效果还不错。精进学堂,每日精进——这个算是我自己玩票的一个东西,看着别人玩微信公众账号,自己眼热,又想到平时总有一些话要和同事分享,于是就开设了“精进学堂”这么一个公众账号。分享一些自己对工作、生活的感悟,貌似大部分同事都订阅了。InfoQ的核心价值观之一就是“每日精进”,其目的就是让大家在每天的工作过程中都能有思考,有进步,不要固步自封。后来还从线上移到线下,每周分享会也做成精进学堂了。管理还是要靠盯——不是每个人都很自觉,即使很自觉的人也不一定完全理解你的意思从事。所以,管理者不时的提醒是非常重要的。InfoQ采取的是一种SOHO的方式,这种提醒显得就更加重要,一方面可以了解项目的进度,另外一方面也防止工作中的惰性。这也要求每个部门经理/项目经理的嘴巴比以往更加勤快。完全的自觉不可靠,有时候更是一种Leader逃避责任的借口。沟通永远是防止误解的利器——但凡工作中出现误解,90%以上应该是和沟通不畅相关的。记得在今年赴美的时候,同事很积极地帮助定了住宿的地方,但我发现有些贵,就请其再去找找有没有更合适的。其实同事找的已经是最佳的选择,但是在整个过程中,我没有得到任何讯息,就想当然地认为这是没有货比三家后的结果。如果一开始就信息共享,就没有后来的误解。所以“公开透明”是团队和谐的另一个法宝。别敲那么多字了,拿起你的电话——相比于QQ、微信等沟通方式,电话依然是面对面沟通之外的最佳沟通方式。在QQ、邮件里面解释了那么多,花了几十分钟甚至数小时去争论,不如直接一个5分钟的电话解决问题。可能是互联网让大家宅的太久了,不爱说话了,但大部分时候面对面和电话真的是最有效的沟通方式。所以,我经常提醒大家,直接给客户或者某某打个电话吧,然后问题就解决了。公司的优势不是品牌和资金,而是速度和执行力——不知道在哪儿看到的一句话,很认同。再好的品牌也可能一日间土崩瓦解,总有更多的资金超过你。
2023-07-24 02:51:121

QCon参会的四点感受

这次算是第二次参加QCon了,不过第一次是以媒体,这次是以主办方的身份参加。 说起来,来InfoQ之前我也一直在技术媒体,不过在之前思考的是如何更好的为读者服务,来到InfoQ之后,舞台更大更好了,思考的东西也更长远,想的是如何推动技术的发展和普及。带着这样的思考参加QCon,有四点小收获与大家分享。 最近参加组织和主持了两次这样的活动,活动的形式是先确定一个主题,然后找10个左右相关领域的专家和技术人,就这个主题进行分享和讨论。虽然这两次活动从流程上来看还有种种瑕疵,但最终的效果还是很好的,参与者的反馈也都还不错。在组织这样的活动之前,我担心大家聚在一起没什么可说的,可能出现冷场,或者讨论失去控制拉不回来了。结果发现是过虑了。大家都是有料可以分享的,也许够不上在一次大会上做分享,但拿来和人交流已足够;大家在工作中也遇到很多问题,平时只能网上找资料或者自己解决,能和一群水平差不多的人来集思广益,在平时是很难遇到的,即使在网上认识一两个好基友,但不一定总能覆盖你遇到的问题,在QQ群微信群的讨论效果更差,大家都有自己的事情,你也不能期待别人一直在线帮你解决问题。 从这个角度来说,我非常看好EGO的发展,它的小组活动其实和这个差不多,但会更加正规,并且由技术人自己来组织和主持,也比我这样的不太懂的人来主持要好。不过,要想做好,极强的运营和执行是必不可少的。 几天听下来,我的感触是国内的技术人技术很厉害,但在表达自己上还是不太给力,善于做不一定善于教。有些讲师在讲的时候语气平淡没有起伏,对于PPT翻页的节奏也掌握的不是太好,跟观众没有互动,甚至还由于紧张而口吃。 虽然说观众都是对演讲的内容感兴趣所以对不好的细节都忍了,但这不意味着不追求演讲的效果,可能现场听的人还能理解,但后续的视频可能价值就要大打折扣。 把一个东西讲得深入浅出、引人入胜是一件很难的事情,并不是说只要前期准备做好了就行,国内做技术布道的有不少,但到现在比较有名的也只有阮一峰、陈皓老师等寥寥数人。这里面有很多技巧值得学习,InfoQ之前专门有给讲师传授演讲技巧的分享,我觉得是很好的东西,不但要做下去,而且要做好。 另外,我们也要注意发掘有好老师潜力的技术人,对他们进行培养和包装,更好的进行技术的普及。 作为主办方,总是会想会议质量怎样,参会者收获如何,有些患得患失。这些天看了一些反馈和吐槽,以及和参会者的交流,有一些想法。 一般而言,参加技术大会首先是希望学习点东西,所以,要有比较前沿和高端的技术分享供大家学习。另外,在工作中遇到问题,希望看看别人是怎么做的,所以,要有成功经验和踩坑教训分享。 另外,要加强交流环节,本次的讲师见面会环节给讲师和参会者一个相对充裕的时间进行交流,受到参会者的欢迎,不过貌似利用率还不是很高,有些细节也没考虑完善(比如中午下午最后一场完后大家都去吃饭了就没交流),这是区别参会者和非参会者的重要环节,以后可以重点推广。 另外,和React专栏的作者王沛老师交流,他对技术大会的看法是一个团队在某个技术点上取得突破,并经受实践检验,因此来分享成功经验。这个可以看做是技术发布会的形式,本次其实郭虹宇老师的Samurai Native是首次对外分享,算是这种形式,但内容需要稍作修改来匹配。 我基本上完整的听了移动开发最佳实践这个专场。我觉得这场还有可以提升和改进的地方,但也基本代表了移动开发的前沿和热点内容。 前沿要数鬼道老师以及郭虹宇老师的slide,自从Facebook发布React Native以来,关于它的讨论就不绝于耳,鬼道的天猫前端是国内最早将React Native用于实践的团队,它们使用在天猫iPad版“猜你喜欢”项目上使用了RN,并且已经上线,这次分享也很有价值。郭虹宇老师在semi-hybrid方面耕耘多年,思考非常深入,这次他的分享梳理了Native向Web标准靠拢的过程,并且分析了React Native和Samurai Native背后的技术方案。他们在这个领域的研究已经走在了前面,我相信这仅仅是一个开始,关于Native与Web融合以及semi-hybrid方案将会是近几年的移动开发热点话题。 热点方面,轻应用,Hybrid质量保证、网络性能优化、用户端问题诊断,以及一直都很热的App架构都很符合热点。好的地方也就不多说了,说说我觉得不太到位的地方。 轻应用讲的是后端架构,但移动开发者可能对这部分不是很关心,我更希望看到的是,如何统一轻应用API,将微信公众号的轻应用作为一种标准,一种能力开放出来。百度的Clouda+ Runtime其实有这个意思,你只需要针对百度轻应用进行开发,即可在不同的App里面使用Clouda+所提供的能力。微信如果能将轻应用(包括公众号API)剥离出来做成Runtime,让别人集成到自己的App里,这样我们不用打开微信就能使用微信定义的轻应用,这对于轻应用的标准化是很有帮助的。另外这貌似也是近来的一个趋势,将自己的能力开放出来,除了百度,触控的Cocos Play针对的是游戏,但也有这个意思。 Hybrid质量保证这个我没什么意见,Hybrid开发已经好几年了,凡是大公司开发的App里几乎都会有一部分内容是用Hybrid方式进行开发,因此如何保证其质量就成为痛点,这个演讲可以说非常应景,也的确是当前的热点。不过我觉得还可以讲讲 Hybrid开发的最佳实践,分享一下在大公司里是如何进行开发的,这个和专场主题也比较切合。 网络性能优化、用户端问题诊断,在各大公司组建移动开发团队已经有几年的情况下,这个也的确是热点。目前对于移动App性能管理、测试也是技术创业的热点。这里听的不是很仔细,也没什么可说的。 App架构则是出品人陈晓亮老师的分享,他不仅在组织、审核本场其它讲师slide方面尽心尽力,在自己的演讲方面也准备的很好,据我所看到的,这是本场唯一一个和观众有互动并调动观众情绪的演讲了。内容方面也很棒,就是导入部有点多,在架构的演变上介绍的不够,不过也不是什么大的缺点。 最后,在QCon已经成国内最好的综合性技术大会的现在,它的对手只有自己(当然还有国外的技术大会可以做标杆),如何超越自己,越做越好,这也将是我们今后所要思考的问题。
2023-07-24 02:51:201

什么是敏捷软件测试

【编者按】敏捷的理念已经深入人心,开发过程已经渐入佳境,测试的处境却稍显尴尬。测试从业者应该何去何从,怎样才能拥抱敏捷,体现出自己新的价值呢?InfoQ特地邀请了来自Google的敏捷测试专家段念,为读者答疑解惑,希望所有测试从业者可以从中得到自己的答案。更多关于敏捷测试的内容,请访问InfoQ中文站敏捷测试相关内容。 在与不少测试从业人员讨论到敏捷的时候,被问得最多的大约是两个问题:到底?,敏捷软件开发还需要测试工程师吗?。前一个问题是对于敏捷测试本身定义的疑问,第二个问题则是对敏捷开发将测试工程师排除在外的担心。其实,在探寻这两个问题答案的过程中,我们可以更清晰的了解敏捷软件开发中测试的工作定义,测试价值观,以及敏捷开发中开发与测试工程师的配合。鉴于这两个问题的意义,在本敏捷测试专栏的第一篇文章中,本人尝试从自己的实践出发,尽可能清楚的回答这两个问题。 确实,相对于敏捷开发红遍大江南北的状况而言,对敏捷测试的讨论则低调得多。敏捷联盟定义了敏捷的4个价值声明,以及伴随的12条支持原则,这12条原则中没有一条单独提到测试。这是不是意味着测试在敏捷开发中并不重要呢?实际上,如果仔细研读敏捷的12个原则,以及各种不同的敏捷实践,就会发现,测试在敏捷开发中占有非常重要的地位。无论是原则中的频繁交付,还是对可工作的软件的度量,或是敏捷开发实践中的测试驱动开发,行为驱动开发,都离不开测试的支持。在本人看来,敏捷开发中不把测试单独拿出来描述的原因,恰恰是因为在敏捷开发中,测试不再是一个单独的、和开发独立的过程,而是变成了驱动开发、衡量产出的主要的手段,成为了敏捷开发中所有工程师在工作时必须时刻考虑和实践的一个部分。简而言之,敏捷软件测试更多的是一种理念,而非过程。 既然是这样,为什么我们还要在这个专栏中专门来讨论敏捷软件测试?本人接触过不少软件开发和测试工程师,他们所处的组织有的正在努力向敏捷开发转型,有的已经实践了一段实践的敏捷开发,但由于由来已久的工作习惯,他们中的绝大多数并不能自觉的认识到测试在敏捷开发中的关键作用,而是有意无意的将测试仍然看作是与开发截然分开的下一个阶段,导致在实践敏捷开发的过程中遇到种种问题:要么是忽略了代码质量,导致在频繁的迭代过程中,每一个迭代的问题层出不穷;或是沿用原有的方法安排对系统的系统测试,导致测试团队疲于奔命,却总也赶不上开发所要求的进度。在这种情况下,专门来讨论敏捷软件开发中的测试,也就是敏捷软件测试的话题,对这些工程师应该会有一些帮助。 那么,到底?很难给敏捷测试下一个精确、完善的定义,在本人看来,接纳了敏捷的核心价值观(沟通,简单,反馈,勇气,尊重),在敏捷软件开发过程中开展的测试就可以被称作是敏捷软件测试。因此,敏捷软件测试并不是一个与敏捷软件开发同一层次的划分,而是敏捷软件开发中的一部分,与传统的测试不同,敏捷软件测试并不是一个独立的过程,相反,它与整个敏捷开发中的其他活动交织在一起,处处都能看到它的影子。由于敏捷软件测试并不倾向于一个单独的过程定义,本人拟从敏捷软件测试与传统测试观点的比较、敏捷软件测试中采用的方法、测试工程师在敏捷软件测试过程中的工作等方面来阐述之。在这篇文章中,我们主要从宏观的角度来描述敏捷软件测试,而在本专栏的后续文章中,我们将对敏捷软件测试中采用的方法、工程师在敏捷软件测试中的工作内容等进行进一步的描述。 使用Dashboard、燃尽图等方式展示当前工作与可交付产品之间的距离 建立单元测试覆盖率等度量指标 共享质量目标意味着质量责任由所有工程师共同承担 开发测试应该建立一定的测试覆盖率标准,例如,在单元测试这个级别上,建立60%或80%的覆盖率要求 通过使用TDD、BDD等技术,保证产品和代码的可测试性 建立足够多的自动化测试,保证测试能够满足快速迭代的要求 检查表提到了团队、反馈、质量文化和开发测试四个方面的内容,在本人看来,这四个方面体现的就是敏捷软件测试与传统软件测试的最大的不同。传统软件测试关注的是通过尽可能完备的覆盖去发现尽可能多的问题,把测试和开发当成是两个独立的过程,测试是对开发阶段产生成果的验证 。而敏捷软件测试则建立了一种不同的质量文化:测试的目的是为了保证产品快速发布,也就是对生产率本身的提高。基于验证的出发点必然会要求测试与开发的独立,以及尽可能客观和完备的度量产品质量;而基于生产率的出发点则要求建立敏捷的团队,要求测试与开发尽可能紧密,要求建立具有高度可测试性的软件,以及基于这些的高度自动化测试。 在检查表列出的所有项目中,质量文化是基础,团队是敏捷软件测试得以实施的条件,反馈和开发测试则是敏捷软件测试的具体方法。当然,你可以可以从敏捷的核心价值观来阶段这些项目:团队关注的是沟通与尊重;反馈直接对应于反馈;质量文化基于勇气(承担质量责任的勇气)与尊重;而开发测试则是反馈与简单的具体体现。 另一个在本文最初提出来的问题是:敏捷软件开发还需要测试工程师吗?,对这个问题,业界有不同的观点。有人认为需要,因为总有一些是需要测试工程师的技能完成的工作;当然,也有人认为不需要,因为敏捷开发中的测试注重开发测试与自动化测试,开发工程师就可以自己搞定与测试相关的工作。在实践中,那些大规模实践敏捷开发的公司(例如Google),倾向于在组织中设置数量较少的测试工程师,在项目中分配较少的测试资源,甚至对某些项目,完全不使用测试工程师。 就我的个人实践经验,对大部分的项目,尤其是为明确的客户开发的项目,需要在敏捷开发团队中设置专职的测试工程师,因为: 测试与开发具有不同的思维方式:测试更注重全面的验证和检查一个系统,而开发工程师往往很难在大的范围内建立这样的思维方式。因此,无论是从系统的层面验证产品,或是从应用系统的角度发现值得测试和验证的点(access point),专职的测试工程师都更有效。 专职的测试工程师能够更关注于测试基础,建立测试需要的基础架构:由于测试工程师具有更好的对测试的理解,通常他们能够更多的考虑测试的需求而开发适合项目的测试基础架构(自动化测试框架),而开发工程师可以使用这些框架来建立面向功能或代码的测试。 但是,不得不说的是,敏捷开发对开发和测试工程师都提出了更要的要求,尤其是对测试工程师而言,传统的只能精确模拟用户操作的测试工程师,因为不能为产品带来生产率的提升,在敏捷开发的团队中,很难有所作为。在本专栏的后续文章中,我们会进一步讨论测试工程师在敏捷软件开发中的工作和任务。 关于作者段念:Google中国高级测试经理,毕业于华中科技大学,先后在通讯、嵌入式软件、互联网等多个行业的国内外知名公司中从事软件开发与测试工作。对软件测试中的技术和管理工作有独到见解,对软件测试团队管理、自动化测试、性能测试与开发测试有较多研究。
2023-07-24 02:51:281

京东商城网站是什么语言开发的

SQL
2023-07-24 02:51:385

如何设计好的RESTful API

安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?如何对RESTful API进行版本控制,请分享您认为实用的做法?HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?能否为InfoQ的读者们推荐一款实用的RESTful API开发框架,并说明您的推介理由。HTTP2.0规范正在制定当中,您对它的期待是什么?InfoQ:什么是好的RESTful API?相信每个人都有自己的评判标准。那么,您认为一个好的RESTful API应该具有哪些特征呢?李锟:一个好的RESTful API,应该具备以下特征:这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。RESTful API建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。这个API应该是松耦合的。RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTful API的松耦合性。当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。感兴趣的读者可以参考《REST实战》。这个API中所使用的表述格式应该是常见的通用格式在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。所以除非有很合理的要求,通常不需要使用自定义的私有格式。使用HTTP响应状态代码来表达各种出错情况HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。响应状态代码分成两部分:status code和reason phase。两部分都是可定制的,也可以使用标准的status code,只定制reason phase。如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。这个API应该对于HTTP缓存是友好的充分利用好HTTP缓存是RESTful API可伸缩性的根本。HTTP协议是一个分层的架构,从两端的user agent到origin server之间,可以插入很多中间组件。而在整个HTTP通信链条的很多位置,都可以设置缓存。HTTP协议内建有很好的缓存机制,可以分成过期模型和验证模型两套缓存机制。如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。李建业:首先说明一下,对REST这个概念,我一般把它理解为REST风格的架构,但是现在实践中最为广泛认知的是HTTP,而它是REST的一个实现,所以RESTful API也可以不太严格的指基于HTTP的API——当然,即使是不严格的时候,API本身也应该力求遵循REST架构风格。我认为,一个RESTful API最重要的一点应该是——“尽可能少的先验信息”,这一条也同时是我判断一个好的RESTful API的标准。比如HTTP动词,在实践中,大家可能会常常纠结于有效利用 HTTP 动词,但这却并不是特别重要的事情——除非你理解这么做的价值。HTTP 动词最重要的地方在于它是标准阐明了的行为,也就是说,如果我们的“客户端”遵循约定,那么就不必要发明新的动词,也就不必增加“先验信息”;但是,所谓“先验信息”,针对的是客户端——对API来说就是调用者,对于一些企业内部系统,或者一些传统系统,由于“资源”很稳定,对资源的操作也很稳定,这些系统的“调用客户端”不是浏览器而是另一个系统,此时如果强制对应到HTTP动词,反而会变成额外的“先验信息”,这时我就不会太拘泥HTTP动词,自己制定一套动词放在参数中也可以接受——只要动词不变化,这个系统依然是REST风格的。再比如Response里面的Content-Type,这个有时会被新手忽略,但这其实很重要,因为一般涉及到系统间协同的API,往往不会使用普通的文本,比较常见的是使用json表达复杂结构,而这与通常的缺省理解不同(缺省一般会认为是text/plain和text/html),所以如果在API中忘记用Content-Type进行区分的话,后续对多种类型的客户端接入的支持就会变成陷阱(我们多次遇到过这个问题)。而如果一开始就检查是否增加先验知识(缺省Content-Type为plain或者允许指定Content-Type),那这一困难就可以避免了。丁雪丰:首先,应该正确地使用HTTP的统一接口,比如HTTP的动词,如果不分青红皂白清一色POST那显然还有改进的余地;其次,资源有合适的粒度,可以从三个方面来评判资源的粒度是否合理——网络的效率、表述的大小以及客户端使用时的易用程度;最后,是表述的设计,除了表述的正文内容,还有其中的URI和链接,这些都是评判一个RESTful API好坏的标准。马钧:在我看来,一个好的API标准,就是能尽量利用到HTTP协议的特性,将HTTP当成一种转移协议,而不是传输协议。包括但不限于:利用HTTP的各种动词来明确操作;包含有内容协商,可以根据请求头提供的参数选择一个资源最合适的媒体类型、语言、字符集和编码的表现;使用不同的返回代码来描述各种状态。但实际上见到过的很多声称RESTful API,包括国内的和国外的,能符合这些条件的并不多。parse.com提供的API是我见到过的较为不错的RESTful API,可以作为范例参考。InfoQ:安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?李锟:保证RESTful API的安全性,主要包括三大方面:a) 对客户端做身份认证b) 对敏感的数据做加密,并且防止篡改c) 身份认证之后的授权对客户端做身份认证,有几种常见的做法:在请求中加签名参数为每个接入方分配一个密钥,并且规定一种签名的计算方法。要求接入方的请求中必须加上签名参数。这个做法是最简单的,但是需要确保接入方密钥的安全保存,另外还要注意防范replay攻击。其优点是容易理解与实现,缺点是需要承担安全保存密钥和定期更新密钥的负担,而且不够灵活,更新密钥和升级签名算法很困难。使用标准的HTTP身份认证机制HTTP Basic身份认证安全性较低,必须与HTTPS配合使用。HTTP Digest身份认证可以单独使用,具备中等程度的安全性。HTTP Digest身份认证机制还支持插入用户自定义的加密算法,这样可以进一步提高API的安全性。不过插入自定义加密算法在面向互联网的API中用的不是很多。这个做法需要确保接入方“安全域-用户名-密码”三元组信息的安全保存,另外还要注意防范replay攻击。优点:基于标准,得到了广泛的支持(大量HTTP服务器端、客户端库)。在服务器端做HTTP身份认证的职责可以由Web Server(例如Nginx)、App Server(例如Tomcat)、安全框架(例如Spring Security)来承担,对应用开发者来说是透明的。HTTP身份认证机制(RFC 2617)非常好地体现了“分离关注点”的设计原则,而且保持了操作语义的可见性。缺点:这类基于简单用户名+密码机制的安全性不可能高于基于非对称密钥的机制(例如数字证书)。使用OAuth协议做身份认证OAuth协议适用于为外部应用授权访问本站资源的情况。其中的加密机制与HTTP Digest身份认证相比,安全性更高。需要注意,OAuth身份认证与HTTP Digest身份认证之间并不是相互取代的关系,它们的适用场景是不同的。OAuth协议更适合于为面向最终用户维度的API提供授权,例如获取隶属于用户的微博信息等等。如果API并不是面向最终用户维度的,例如像七牛云存储这样的存储服务,这并非是OAuth协议的典型适用场景。对敏感的数据做加密,并且防止篡改,常见的做法有:部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。仅对部分敏感数据做加密(例如预付费卡的卡号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。身份认证之后的授权,主要是由应用来控制。通常应该实现某种基于角色+用户组的授权机制,这方面的框架有不少(例如Spring Security),不过大多数开发团队还是喜欢自己来实现相关功能。李建业:我不认为安全是RESTful API需要考虑的问题,事实上我觉得这是两个正交的问题。当然,如果使用RESTful API来提供认证、授权和身份管理,那也算是双方有关系,但是这和其它风格的API设计所要考虑的问题似乎没什么区别,不值得特别注意。但是在具体设计层面,这两者的“正交点”上似乎确实有些问题,因为REST是一个推崇状态无关原则的架构风格,而认证和授权通常基于第三方解决方案,所以往往会出现违背有状态约束的问题,这个地方我也没有特别的想法,当然这个困难和原问题关系不大。至于WS-族的协议,我不太了解,不太能参与讨论。丁雪丰:对于RESTful API,常见的安全措施都是可以继续使用的。例如,为了防篡改,可以对全部参数进行签名;为了防范重放攻击可以在请求中增加一次性的Token,或者短时间内有效的Token;对内容加密可以实现数据防泄露……;对于DDoS攻击,各种HTTP流量清洗策略,都可以继续发挥作用,因为这就是基本的HTTP请求。在授权和认证方面,OAuth 2.0已经基本成熟了,并且得到了广泛地应用。如果可以,接入第三方账户体系是个不错的选择,比如Google和Facebook的,国内的当然也有几个候选。马钧:个人认为RESTful的安全性分为几个层次,在安全要求较高的场合,可以通过HTTPs这样的加密协议来保证网络层的安全,应用层的安全可以通过OAuth实现认证,而对于资源的访问授权,则只能依靠应用程序来实现了。InfoQ:如何对RESTful API进行版本控制,请分享您认为实用的做法?李锟:一个比较简单实用的做法是直接在URI中插入版本号,这样做允许多个版本的API并行运行。另一个做法是在HTTP请求中加入自定义头信息,标明使用的版本号。不过这个做法其实对浏览器不够友好,简单地使用浏览器+HTML无法测试。李建业:目前比较好的方式还是在uri设计中添加版本信息,其它方法都不如这个实用。丁雪丰:个人认为最好的版本化,就是没有明显的版本。在对已发布的服务进行变更时,要尽量做到兼容,其中包括URI、链接和各种不同的表述的兼容,最关键的就是在扩展时不能破坏现有的客户端。例如,要变更一个参数,可以选择同时兼容新旧两种输入,或者保持老参数不动,提供一个新的参数,在文档中必须做出说明,不推荐新用户再继续使用之前的参数。如果必须要进行不兼容的变更,那么可以选择标记不同的版本号,这时可以选择在路径或参数中增加版本信息。也有做法是增加HTTP标头,只是在调用时会稍有不便,推荐前两种方法。马钧:RESTfulAPI的版本升级,尽量兼容之前的版本,保证原有的API都能正常工作,可以通过HTTP 301转跳到新的资源。另外一种实用的做法就是在url中保留版本号,同时提供多个版本供客户端使用,如 v1.rest.com 或者 rest.com/v1/ 这样。InfoQ:HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?李锟:这个问题取决于设计者如何看待和设计资源。如果资源抽象做的很好,对于某个资源的任何操作,通常都能够映射到CRUD四个类别中。CRUD四个类别对于操作资源来说,绝大多数情况下是完备的。HTTP的GET/POST/PUT/DELETE四个方法,对于CRUD四个类别的操作来说是足够的,映射关系是Create-POST/Retrieve-GET/Update-PUT/Delete-DELETE。我们通常不会选择创建自己的动词,这样做对于客户端开发者来说,需要更多的学习成本。如果在资源上定义的操作过多,我们会选择拆分出更多的资源。李建业:一般是够用的,有时一些“不够用”的场景是由于我们没有设计出合理的资源,比如批量操作。但是,正如之前所说的那样,对于某些内部的、传统的(因此模型稳定且已知)系统,API提供者和调用者会有自已的固定动词表,此时没必要拘泥。另外,我不建议扩展动词,一旦扩展了动词,其实已经破坏了我之前说的*“尽可能少的先验信息”*,那么,扩展动词和重新设计动词的成本差别不大。基于这个考虑,我建议尽可能保持动词不变,除非你想重新设计动词表。丁雪丰:一般情况下,常用的HTTP动词是够用的,并没有出现一定要自己扩展动词的情况。其实,最常用的也就是GET、POST、DELETE和PUT,而HEAD、OPTIONS、TRACE则基本用不太到。如果出现一时找不到合适的动词,安全幂等的操作用GET,其他都可以用POST,在设计资源时稍加考虑即可。马钧:在我的实际项目中,只用到了POST,PUT,DELETE,GET这四个动词。InfoQ:今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?李锟:REST开发框架RESTEasy项目负责人Bill Burke,去年写了一篇文章介绍JAX-RS 2.0。我同意Bill在文章中的观点,在JAX-RS 2.0增加的内容中,最重要的三部分为:a) Client API——用来规范化JAX-RS客户端的开发方式。b) Server-side Asynchronous HTTP——用来实现服务器端推送功能,而不需要依靠低效的轮询方式。c) Filters and Interceptors——用来分离关注点,将鉴权、日志等逻辑与业务逻辑分离开,更好地实现代码重用。这三部分的内容对于开发者来说都很有用。遵循JAX-RS规范做开发,可以确保服务器端以及客户端代码的可移植性。李建业:我个人关注异步API这部分,主要是因为流式服务将会越来越多,那将大量需要这类支持。InfoQ:能否为InfoQ的读者推荐一款实用的RESTful API开发框架,并说明您的推介理由。李锟:这个问题我就不详细回答了。不同的编程语言有不同的REST开发框架,对于REST的支持程度也不同。开发RESTful API的需求范围很广,可选择的开发框架的范围也很广。保持多样性是繁荣生态环境的基础。像Java就有支持JAX-RS规范的Jersey、RESTEasy、Restlet、Apache CXF,和不支持JAX-RS规范的Spring MVC等等很多框架。这些框架目前都做的不错。我对框架的选择没有倾向性。RESTful API设计的最佳实践应该是通用的,而不是必须依赖某种特定的开发框架。李建业:不好意思,这个我不太重视,没法推荐,不过我可以解释一下为什么对RESTful API框架不感冒的原因。REST作为一个架构风格,对我们的系统开发有很大影响,但是这些影响一般是针对架构(例如状态无关)或者设计(例如资源识别)上的,所以一旦涉及到具体实现,主要工作就基本结束了,此时开发框架能做的事也就只有简化编程了(相较而言,有的框架还能起到引导设计的作用),而由于RESTful会抽象动词,所以实现层面中和API规范相关的工作本来就不多,那么框架的价值就更小了。当然,我们也不可能直接基于servlet/rakc/wsgi来开发,不过一般的编程语言都会提供一些简单的url route/match策略,我们使用这些就足够了。另外,有些框架能帮我们生成全部的动词支持,但这也未必是好事,我一般倾向于按需实现——用到了再支持,这就更不需要太关注开发框架对RESTful的支持了。丁雪丰:由于本人是Spring的拥护者,工作中也一直在使用Spring,所以在选择框架时会更多地倾向Spring MVC(并不是说别的框架不好,这里有些个人主观的成份)。如果一定要选择其他框架,也要选择能够方便与Spring集成的框架。如果在项目中已经使用了Spring,那么没有什么理由不选择Spring MVC,鉴于目前Spring在各种项目中的高出镜率,相信一般情况下都会选择Spring MVC。REST的成熟度模型中,第三层就是HATEOAS,Spring目前还提供了Spring Hateoas子项目,对链接、资源等方面的支持都做了一定的增强。马钧:我目前在实际项目中使用的是Spray,这是一个开源的 REST/HTTP 工具包和底层网络 IO 包,基于 Scala 和 Akka 构建。轻量级、异步、非堵塞、基于 actor 模式、模块化和可测试是Spray的特点。InfoQ:HTTP2.0规范正在制定当中,您对它的期待是什么?李锟:我的期待包括两个方面:应该做的和不应该做的。HTTP/2.0规范应该做的:与HTTP/1.1协议保持兼容。兼容的含义是说两者可以并存,客户端应用可以根据服务器端的能力,自由地选择使用HTTP/2.0还是HTTP/1.1,而且选择过程对应用来说是透明的。改进HTTP协议(作为资源的统一接口)之中操作语义表达方式的语法,提高网络传输效率。更好地模块化,这样HTTP/2.0协议的实现能够更好地模块化。应用程序可根据需要选择适当的模块,而不是要么全有、要么全无。废弃掉HTTP/1.1协议中一些很少有人用到的部分,例如采用管道(pipelining)方式发送请求。增加更多的动词,以适应除CRUD之外的其他场景。HTTP/2.0规范不应该做的:HTTP/2.0协议不应该把底层的数据加密机制(即SSL)作为必选项。HTTP/2.0协议不应该背离REST架构风格的约束,尤其是要确保操作语义对于中间组件的可见性。在上面这两个方面,Roy Fileidng曾经与SPDY协议设计者Mike Belshe发生过激烈争论,详情请看:Roy Fielding谈Google SPDY协议李建业:对此规范关注不多,不知道会不会有对于流的支持,目前我所知道的只有chunk方式进行简单的支持,但是真正的流需要区分数据通道和控制通道——哪怕是逻辑上的区分,这样就直接对REST风格产生了很大冲击,考虑到流式服务在未来的发展潜力,我特别期待业界在这方面有所进展。丁雪丰:HTTP 2.0很大程度上是借鉴了Google的SPDY,就我而言,首先,希望这个规范能做到与HTTP 1.1的兼容,使用者如果只认识1.1,那么2.0能优雅“降级”;其次,希望2.0能带来更好的性能,SPDY在这方面还是有所改进的,希望HTTP 2.0能再接再厉;最后,希望这个规范能在最终定稿时附带一个最佳实践,正确引导人们合理地使用HTTP 2.0。马钧:没研究过,估计即使出来,1.1还有很长的生命周期,不会很快被取代。
2023-07-24 02:52:061

IT技术大牛们,都喜欢去什么网站或论坛

国内的有 极分享 高质量技术分享社区csdn 国内比较大的中文IT社区 segmentfault IT 问答社区杭州这边的有码互联也是一个很不错的平台,你可以看看,希望对你能够有帮助!
2023-07-24 02:52:383

华为安装东西的时候会弹出签名不一致,就不让安装怎么关闭这个功能?

这是你在华为市场里安装的结果,要知道有些应用华为市场不支持安装,这样的话你可以在别的应用里下载安装就可以了,比如在应用宝里搜索下载安装就可以了。
2023-07-24 02:52:484

有哪些值得关注的互联网科技类微信公众号

成都奋斗讲堂
2023-07-24 02:53:307

币圈媒体有哪些?

区块链媒体一览A: B:比特财经,币世界,芭比财经,巴比特,博链财经,本聪区块链,冰糖财经,币圈邦德,币报道,币看财经 ,币姥爷,鞭牛士BiaNews,币圈早知道,币赚联盟,币圈必读,币圈动向,白话区块链,币圈八卦,币计,币圈肆无忌惮的少主,币知财经,币友会,比特吴,币知道,币盼盼,币盟主,币响财经,比特评级BitRating,比特快讯bitnews,比特街,币优财经,比特头条 C:财链社 D:大炮评级,舵舟 E:耳朵财经,EOS引力区 F:FN财经,烽火财经,芬果财经 G:共享财经,果味财经, H:火星财经,火讯财经,哈希财经,核财经,虎尔财经,海豚区块链,海外币圈,洪荒财经,虎经财经 I: J:金色财经,九个亿财经,金钱报,金牛财经,节点财经旗下金牛区块链,金币财经,今日币圈,甲子光年,金塔 K:块连线,快知区块链 L:链接财经,链虎财经,链得得,链博士,链金财经,雷鹿财经,链英雄,链之财经,蓝狐笔记,链观天下,链条,链路财经,链白条,链天下,老金金融笔记 M:每日币读,猫说,魔都区块, N:牛金财经,女侠区块链 O:OneTV P:扑克财经,派链财经 Q:区块之家,区块链时代,区币神探,区块链铅笔Blockchain,区块链官微,区块链早餐,区块链大本营,区块链投资内参,七彩区块,起风财经,区块链前哨(InfoQ),铨链财经 R:数字货币倍增学,数字资产技术分析,荣格财经,区块链睡前故事,区块链领域,区块律动BlockBeats,区块链逍遥子 S:三言财经,三点钟财经,世链财经,数字货币趋势狂人,数字资产资讯网,数字资产V,水灵之家,深链财经,蒜媒体 T:陀螺财经,鸵鸟区块链 U: V: W:未来财经,未来财经资讯,王团长区块链日记,吴解区块链 X:嘻哈财经,虚拟货币I,虚拟货币商机,小猴看区块链,犀牛区块链 Y:蚁块财经,一本财经,要发车 Z:中欧区块链观察,早评财经,真传财经 #:31区,8MIN区块链
2023-07-24 02:53:571

深圳除了华为、腾讯、百 度、阿里还有什么大的科技企业在招聘吗?

那华为,腾讯,百度,阿里的话,大的科技公司招聘的话,当然也有,但是我觉得能够进这些公司的话,不是更好吗?
2023-07-24 02:54:077

软件设计中系统架构设计包括哪些内容

软件设计中系统架构设计包括哪些内容 架构师的职责主要有如下4条: 1、确认需求 在项目开发过程中,架构师是在需求规格说明书完成后介入的,需求规格说明书必须得到架构师的认可。架构师需要和分析人员反复交流,以保证自己完整并准确地理解用户需求。 2、系统分解 依据用户需求,架 面向对象的设计中,系统架构设计的内容有哪些 面向对象程序设计中的概念主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。通过这些概念面向对象的思想得到了具体的体现。 1)对象(Object) 可以对其做事情的一些东西。一个对象有状态、行为和标识三种属性。 2)类(class) 一个共享相同结构和行为的对象的集合。 类(Class)定义了一件事物的抽象特点。通常来说,类定义了事物的属性和它可以做到的(它的行为)。举例来说,“狗”这个类会包含狗的一切基础特征,例如它的孕育、毛皮颜色和吠叫的能力。类可以为程序提供模版和结构。一个类的方法和属性被称为“成员”。 系统架构设计师,难考吗 系统架构师属于软考的高级,考试肯定是有有一定的难度的,但是如果自身基础好,通过考试自然是没问题;如果自身基础较为薄弱,参加培训通过系统的学习架构的知识体系,再做相关的试题,想要通过考试也是不难的。 系统架构设计师应学哪些书籍 《软件体系结构原理、方法与实践》 《系统架构设计师教程(第2版)》 《系统架构设计师考试全程指导》 《系统架构设计师考试试题分类精解与题型练习》 《系统架构设计师考试串讲视频教程》 《新技术与新方法串讲视频教程(3课时)》 《数学与经济管理视频教程(7课时)》 《系统分析师技术指南(2009版)》 《系统分析师考试培训视频教程(88课时)》 《Beautiful Architecture》? 《Beautiful Code》的姐妹作,里面有三成的架构是自己感兴趣的,已经有国内出版社拿下了,架构师的唐诗三百首------O"reilly新书Beautiful Architecture(InfoQ)?。 《97 Things Every Sofare Architect Should Know 》? 一个开放的wiki?,O"Reilly 将它发布成书,不知道有没人在翻,架构公理的书(InfoQ)?。 《Pattern-Oriented Sofare Architecture, Volume 4 - A Pattern Language forDistributed Computing》? 架构模式的集大成者,号称有人在翻但等了一年中文版还是没翻出来啊,面向模式软件架构第4、5卷出版(InfoQ)?。 架构技术类 云计算已经开始代替SOA成为新一代Buz Word,回顾一下整个SOA出版风潮,自己觉得值得一读不忽悠的居然只有一本《SOA in Practic - SOA实践指南-分布式系统设计的艺术》?。 在热潮彻底退却前,SOA的书还在继续出着,OSGI与SCA的书也开始出现: 《SOA Design Patterns》? 又是Thomas Erl的书,很奇怪的连电子版都找不到,SOA设计模式出版啦(InfoQ)?。 还 没出版的呀一大堆 --《SOA Patterns》、《ESB Architecture for SOA》、《SOA with Java》、《Open Source SOA》、《OSGi in Action》、《SpringSource dm Server in Action》、《Modular Java: Creating Flexible Applications with OSGi and Spring》、《Understanding SCA》、《Apache Tuscany in Action》... 编程匠师类 立志做一个匠师的人今年比较幸福,可以看的书很多: 《Beautiful Code - 代码之美》 ? 很有经典潜质的一本,去年没有读完今年继续,《代码之美》的精选版(InfoQ)?。 《Produtive Programmer - 卓有成效的程序员》? Thoughorks中国翻译的,看了下样章,熊节(透明)的翻译依然是这么好, 《卓有成效的程序员》推荐序:做一个懒人(InfoQ)?。 《Clean Code: A Handbook of Agile Sofare Craft *** anship》? Rober。C大叔的书,不知道谁在翻,应该很容易翻啊,到后面大段大段都是代码。 《Effective Java中文版(第2版)》? 怎么理解"软件概要设计是系统总体结构设计或系统架构设计 概要设计的目标是描述软件模块的外观以及处理逻辑.模块对外暴露的服务接口,以及需要引用的接口,接口标识,接口的访问协议,接口描述都属于模块的外观,其他的模块通过这些接口和模块打交道,自然需要在概要设计阶段对接口做细致的刻画,初此之外,对于关键的模块,外观还应该说明模块的非功能属性,比如并发处理能力,数据吞吐量以及接口调用的反馈时长等等.处理逻辑是指模块从输入到输出的转换过程,描述其转换算法.无论通过何种图例和表现形式,只要能够清晰地说明模块外观和处理逻辑描述,就是好的概要设计. 系统架构设计师怎么复习比较好?系统架构设计师含金量。 系统架构设计师含金量。考了两次系统分析师都没有通过,下半年没开考,所以想考系统架构设计师,考了几次都没通过,着实没太多信心了,不知道怎么办才好。 满意答案颠沛流离德小0级2011-07-13系统架构设计师,既然是架构设计,其实质是偏软,走的是纯技术专家路线。当然此处的偏软并非程序的设计,而是整个软件的体系架构的设计,架构设计的好坏将直接影响到软件的质量,从这点看,其技术含量是非常高的,其职业定位应该是纯软件技术专家的角度,职业选择可以主要是企业内的高级软件设计者或IT公司技术经理或技术总监一类的职位。 系统架构设计师考试 武汉不报考le 系统架构设计师复习哪些重点? 既然你男朋友要考的话,应该他自己是知道这个证是有说明作用。像系统架构设计设考的重点是数据库系统、嵌入式系统、数据通信与计算机网络、系统配置与性能评价、企业信息化与电子商务、分布式系统设计具体我建议你去看一些考试大纲,希赛教育的网站上就有关于系统架构设计师的考纲,复习的资料希赛的网站上也有,你去那里看就全明白了。 系统架构设计师能挂靠吗 系统架构设计师属于软考高级工程师级别, 完全可以挂靠,一年8000以上,这要看是哪些城市。
2023-07-24 02:54:441

什么是敏捷开发模式

简单的说,敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
2023-07-24 02:55:043

无人驾驶的汽车什么时候可以做到大范围的量产?

无人驾驶汽车大规模量产预计要到2060年。我国在人工智能领域的水平还无法与美国并驾齐驱,人工智能基础研究和核心技术落后于美国,但与此同时,我们拥有自己的特色,在人工智能的应用技术和商业模式方面的发展快于美国,因此,中美对比而言,各有优势。自动驾驶量产既是产业的无人区,又具有溢出带动性很强u2019头雁u2019效应,将成为我国智能产业的顶梁柱。 从1984年~2018年,无人驾驶汽车已经走过了0~1的阶段,即科研探索期,直到2025年之前,我们都将处于产品孵化期,完成从1~10的过程,届时预计无人驾驶汽车的规模能达到万辆级别,但如果要完成从10~10的n次方这一阶段,恐怕最终的时间点是2060年。
2023-07-24 02:55:424

国内或国外最好的IT技术论坛有哪些?

学优IT技术论坛。不可否认,网上的确有许多知名的大型论坛,但是今天我只谈谈我自己亲身经历参与的论坛,我办理了一个学优IT技术论坛的终身会员,当然,在这之前,我也办理过不少其它IT技术方面的论坛会员,要么费用贵的惊人,几十节课程要价数百元甚至上千元,要么费用非常便宜几十元百把元左右,但进去后才返现许多课程要么过时,要么一机一码加密,问管理员要密钥,刚开始还给,后来就爱理不理,直到完全不搭理,终于体会到一个人给我的一句话了,服务质量决定价值,最便宜的也是最贵的。直到后来,我办理了学优IT培训的终身会员,感觉算是找到了真正的性价比IT学习服务了。资源每周多批次更新,而且非常有良心,无须任何密码和专门播放器,还有一对一解答辅导及售后服务,全站资源任意下载无任何限制。当然了,我说的这些不算,百闻不如一见,建议还是去实地看看,自己独立判断,不用听别人怎么说,只需听从自己内心的感受和想法。
2023-07-24 02:56:424

桌面支付离不开浏览器,市面上有很多浏览器,那浏览器的安全性是一样的吗

浏览器的安全性都是一样的,你在浏览器上使用支付是需要用支付宝安全控件的,所以再浏览器支付是安全的。浏览器安全可分为:Web 页面安全:同源策略、XSS 攻击、CSRF 攻击浏览器网络安全:HTTPS浏览器系统安全:安全沙箱在没有安全保障的 Web 世界中,我们是没有隐私的,因此需要安全策略来保障我们的隐私和数据的安全。基础概念如果两个 URL 的协议、域名和端口都相同,我们就称这两个 URL 同源。浏览器默认两个相同的源之间是可以相互访问资源和操作 DOM 的。两个不同的源之间若想要相互访问资源或者操作 DOM,那么会有一套基础的安全策略的制约,我们把这称为同源策略。同源策略会隔离不同源的 DOM、页面数据和网络通信,进而实现 Web 页面的安全性。同源策略具体主要表现在 Dom、Web 数据和网络这三个层面。第一个,DOM 层面。同源策略限制了来自不同源的 JavaScript 脚本对当前 DOM 对象读和写的操作。比如:从极客时间官网打开任意一个专栏,然后在控制台输入:{//对象 opener 就是指向第一个页面的 window 对象,我们可以通过操作 opener 来控制第一个页面中的 DOM。let pdom = opener.documentpdom.body.style.display = "none"}。第一个页面将被隐藏,因为两者同源。如果从极客时间打开比如 InfoQ 的页面,因为两者不同源,在 InfoQ 的页面访问极客时间页面的 DOM 是,页面抛出异常,这就是同源策略发挥的作用,Blocked a frame with origin "https://www.infoq.cn" from accessing a cross-origin frame。第二个,数据层面。同源策略限制了不同源的站点读取当前站点的 Cookie、IndexDB、LocalStorage 等数据。第三个,网络层面。同源策略限制了通过 XMLHttpRequest 等方式将站点的数据发送给不同源的站点。同源策略的安全和便利性的权衡。安全性和便利性是相互对立的,让不同的源之间绝对隔离,无疑是最安全的措施,但这也会使得 Web 项目难以开发和使用。因此我们就要在这之间做出权衡,出让一些安全性来满足灵活性;而出让安全性又带来了很多安全问题,最典型的是 XSS 攻击和 CSRF 攻击。
2023-07-24 02:57:571

netty与vert.x的区别和联系

Vert.x是一个用于下一代异步、可伸缩、并发应用的框架,旨在为JVM提供一个Node.js的替代方案。开发者可以通过它使用JavaScript、Ruby、Groovy、Java、甚至是混合语言来编写应用。在内部,一个vert.x实例会管理着一个小的线程集合,每个线程针对服务器上的一个可用内核。基本上每个线程都实现了一个事件循环。当部署一个vert.x应用实例(又叫做verticle)时,服务器会选择一个事件循环分配给该实例。接下来针对该实例的任务都会通过该线程进行分配。由于在某一时刻可能会有成千上万个verticle在运行,因此在同一时刻会将单个事件循环指定给多个verticle。Verticle可与运行在相同或不同vert.x实例中的其他verticle进行通信,这是通过消息事件总线实现的,它类似于Erlang的actor模型。消息传递旨在让系统能够在多个可用核心上进行扩展而无需以多线程的方式来执行verticle代码。事件总线是分布式的,并不只会跨越服务器,还会渗透进客户端的JavaScript以处理“实时”的Web应用。除了并发与消息传递外,vert.x还具有如下特性:TCP/SSL服务器与客户端HTTP/HTTPS服务器与客户端WebSockets/SockJS支持InfoQ有幸采访到了VMWare的高级工程师Tim Fox以了解vert.x:InfoQ:能否从架构上介绍一下vert.x及其构建方式?Tim:vert.x的核心是用Java编写的,接下来我们为每一种支持的JVM语言编写了一个薄薄的API层,这样每种语言都有一个适合于该语言的API了。我们并没有向这些语言直接公开Java API。这意味着Ruby用户会通过Ruby的方式编写代码,JS用户会通过JS的方式编写代码。InfoQ:能否描述一下在vert.x上典型的开发流程么,特别是与开发者使用Node.js的体验进行一下对比?我觉得这与node.js是非常类似的。实际的工作流程取决于你是在本地还是云中运行应用。但这并非vert.x所特有的。InfoQ:就调试、监控与运维来看,在JVM与Node.js上运行实时应用有何差别?我想说监控与运维实际上与部署vert.x的环境之间的关系更为密切而非vert.x本身。比如说,如果将vert.x部署到云中,那么云提供商可能就会为你提供监控。顺便说一下,社区成员目前已经在OpenShift与Heroku上运行了Vert.x。我们希望不久之后CloudFoundry支持就会到来。InfoQ:vert.x与Node.js有什么基准比较么?我们尚未发布任何的官方基准。但我自己已经完成了一些,在我所做的测试中,vert.x的性能与可伸缩性都远远超越了node.js。我希望在不久之后能够发布一些基准。InfoQ:vert.x与Netty相比如何呢?Netty是个很棒的底层IO库。Vert.x实际上使用了Netty。但vert.x是个用于编写异步应用的完整。Vert.x还提供了一个组件模型、文件IO及各种Netty所没有的东西。我要说的是,在JVM世界中,Vert.x是更类似于Akka(也使用了Netty)之类的完整框架。
2023-07-24 02:58:051

IT技术交流论坛或是微信群有哪些?

IT技术交流群有很多,作为软件开发从业者,会经常去的一些国内社区网站及论坛,关于程序员的交流社区或者论坛,这里收集一些比较好的开发者社区:1、快速开发平台社区 -天翎论坛,主要是以Java低代码开发平台为主的技术性论坛社区,目前低代码平台商用授权对外开放;2、CSDN -专业开发者社区 IT技术交流平台;3、IT圈,圈圈精彩 - 原软媒论坛、IT之家,国内最人气的科技社交圈层,继软媒论坛、IT之家社区演变而来;4、51CTO技术论坛-中国领先的IT技术社区 国内主流IT技术社区,论坛拥有大批IT技术人/IT专家;5、ITPUB技术论坛-中国专业的IT技术社区。
2023-07-24 02:58:151

互联网圈子的技术大会都有哪些?分别有什么不同呢?

QCon是为团队领导者、架构师、项目经理和高级软件开发人员量身打造的企业软件开发大会,其所覆盖的主题内容与InfoQ网站相同,关注架构与设计、真实案例分析等等。从2007年3月,QCon已经在英国伦敦、美国旧金山等举办了4次会议,得到业界的广泛好评。2009年,这一高品质的技术大会将来到亚洲,在中国北京和日本东京举行。QCon全球企业开发大会北京站由C4media传媒集团和InfoQ中文站共同举办。2011年4月8日,QCon北京2011全球企业开发大会将在京举办。会议历时三天,共十二个主题。邀请国内外业内知名专家组成最强国际讲师阵容。会前,还将提供两天的会前培训课程,由国内行业当中富有影响力的专家学者为大家授课。
2023-07-24 02:58:221

php 系统架构

路过真心也不会
2023-07-24 02:58:334

Mojito怎么读?读莫黑托还是莫吉托?

莫吉托吧???
2023-07-24 02:59:065

一个IT时代的终结:109岁的IBM将分拆为两家公司

作者 | 核子可乐、晓旭 策划 | 钰莹 1 IBM:剥离托管基础设施部门成为新的公司 根据最新报道,IBM 正着手将自身拆分为两家上市企业。此举无疑是在回应自己多年以来的云技术发展,希望从传统业务中剥离出来,把主要精力集中在利润更为丰厚的云计算领域。 IBM 此次拆分对象为旗下 IT 基础设施服务部门,拆分完成后,该部门将以独立厂商的角度继续为全球 115 个国家和地区的 4600 家客户提供技术支持、完成总额高达 600 亿美元的积压订单,并于 2021 年年底之前正式完成更名。 IBM 公司首席财务官 James Kavanaugh 在采访中表示,新的上市公司将以全球第一大托管基础设施服务提供商的身份启动,这家新公司将拥有 9 万名员工,领导结构计划在未来几个月内确定。IBM 目前的员工总数超过 35 万 2 千名,预计此次剥离与运营变更将带来近 50 亿美元的操作支出。 IBM 现任首席执行官 Arvind Krishna 正是去年以 340 亿美元收购红帽公司的关键策划者,这笔收购也在投资市场上获得广泛认同,帮助公司股价上涨达 7%。IBM 方面表示,预计其今年第三季度收入可达 176 亿美元,调整后每股收益为 2.58 美元,与华尔街方面的预估大致相符。 Krishna 在一次分析师电话会议上表示,“我们在上世纪九十年代剥离了网络业务,在新世纪的前十年剥离了 PC 业务,并在约 5 年前剥离了半导体业务,这一切都是为了帮助 IBM 拥有始终统一的价值主张。” 在一篇博文中,Krishna 将此次拆分称为 IBM 公司 109 年发展历程中的一场“重大商业模式转变”。 Wedbush Securities 公司分析师 Moshe Katri 评论称,“考虑到自动化与云业务对于市场的快速蚕食,IBM 公司将借此举基本摆脱持续萎缩且利润空间有限的运营范畴,着力强调高增长业务的强劲表现。” 为了弥补软件销售增长放缓与大型机服务器业务明确的季节性需求波动,IBM 方面表示将把注意力集中在开放混合云与 AI 解决方案层面,着力提升这部分占其经常性收入达半数以上的业务。 2 高层大变动、分拆上市:混合云的道路能走通吗? 今年 4 月份, IBM 内部高层发生变动,原 Red Hat CEO Jim Whitehurst 成为 IBM 新任总裁,领导 IBM 战略以及云计算和认知软件业务部门,负责监督推动客户数字化转型的基础技术;Howard Boville 成为 IBM 云业务负责人,此前任职美国银行;IBM 新任 CEO Arvind Krishna 之前是 IBM 云计算和认知软件部门负责人。不难看出,IBM 这次的高层变动情况表明其十分看重混合云业务。 事实上,无论是 Ginni Rometty,还是 Arvind Krishna,都认为混合云是 IBM 的第二个机会。Ginni Rometty 曾表示:“云计算发展已经进入第二时期。到 2020 年,混合云将有 1 万亿美元的市场需求,但至今仍有 80% 的企业数据尚未迁移到云上,究其原因主要就是欠缺了一套一致性和高安全性的云管理机制,这也是 IBM 看好混合云的原因。” 而 Arvind Krishna 为了发展混合云业务,也在上任之后采取了多个举措。首先,点名混合云业务是 IBM 业务的重中之重,并称“现在是时候打造混合云这第四个平台了”;其次,为 Red Hat 布置了新作业;最后,请来了强力外援执掌云业务部门。 Arvind Krishna 上任第一天,给 IBM 全体员工发送了电子邮件,在邮件中,Arvind Krishna 特意强调了混合云业务是整个 IBM 公司的重中之重: IBM 已经在主机、服务和中间件领域建立了持久的平台,这三大平台继续服务我们的客户。我相信现在是时候打造混合云这第四个平台了。我们的客户将依赖这个必不可少、无处不在的混合云平台来完成本世纪最关键的工作。这是一个比其他平台更持久的平台。 根据市场调研机构 Canalys 公布的 2018 年全球公有云市场数据来看,IBM 落后明显,市场份额不到 4%。很多人认为 IBM 在云业务不仅错失先机,甚至都没有想明白到底应该怎么玩?直到 340 亿美元收购了 Red Hat,IBM 似乎才想明白,混合云或许是弯道超车的机会。 有人总结了目前云计算领域主要玩家对云计算的理解:“亚马逊的云业务致力于满足电商商家的托管需求;微软的云计算路线走的是“软件 + 服务”;谷歌更多强调的是通过云计算对用户提供优质的服务;阿里云计算的价值在于通过移动化与云计算的结合来实现 IT 服务的“在线化”。” 相比之下,IBM 的主营业务是硬件,在云计算的理解方面并不占优势。而收购 Red Hat 则是一招比较妙的棋,Red Hat 在企业级市场的积累,为 IBM 的市场和业务扩展带来了现成的好处,同时也给 IBM 提供了与其它云服务商对抗的核心竞争价值。 分拆过后,由其托管基础部门组成的新公司将继续拥有《财富》100 强中超过 75% 的客户,以及 600 亿美元的积压订单,这家公司未来也将是 IBM 的合作伙伴,并与所有云提供商合作。 未来,IBM 将由一家半数以上销售额来自服务的公司变为半数以上收入来自于混合云和 AI 等解决方案收入的企业,不得不感叹一句:一个 IT 时代走向终结。 参考阅读: https://www.infoq.cn/article/QgV4IQfpJ8GwzCjjQiRQ https://newsroom.ibm.com/2020-10-08-IBM-To-Accelerate-Hybrid-Cloud-Growth-Strategy-And-Execute-Spin-Off-Of-Market-Leading-Managed-Infrastructure-Services-Unit
2023-07-24 02:59:221

国内外java知名论坛有哪些?

国内:1. cnblogs:博客园Java社区2. CSDN:Java开发社区3. 开源中国:Java开源社区4. 程序员客栈:Java技术专栏5. Java论坛:Java编程社区国外:1. Reddit:Java编程社区2. Oracle Community:Java技术社区3. Stack Overflow:Java问题解答社区4. JavaRanch:Java开发社区5. CodeRanch:Java编程社区
2023-07-24 02:59:292

京东是用什么语言?

问题一:京东商城网站是什么语言开发的 HPH,JAVA语言加MYSQL后台开发!希望我的回答能够帮助到你,如果满意,望采纳! 问题二:)(京东)(淘宝)是用什么编程语言开发的 Php C Java 多种语言 问题三:京东商城网站是什么语言开发的? 和java 问题四:京东商城网站是什么语言编写的 .aspx 问题五:京东和天猫 用什么语言开发的? 天猫主要是品牌商入驻为主,天猫只作为一个公开的平台,通过广告、入驻、提成这种方式来获利吧.!.京东与当当之前采用的模式都是商品自采自营,京东是以3C类商品起步,当当是以图书类商品起步,不过,最近为了扩大销售规模与销售品类,京东与当当也逐步通过品牌商家入驻的方式,以满足商城用户的多样产品的一站式购买需求。 问题六:百度,京东,淘宝这些大型网站是用什么语言进行编写的 10分 淘宝刚开始是用php,后来改成java了。你可以看看,淘宝技术这10年 问题七:淘宝,京东,天猫 的前后台都是用哪些编程语言写的?回答的具体点,谢谢 infoq/...global 官方回答,从C语言转成了java 淘宝天猫应该类似,但是没有明确官网回复。 问题八:请问淘宝,京东,天猫,阿里巴巴这样的网站都用什么语言遍写的? 开发一个这样的大型网站大约需 计算机的语言。。。编程的那种语言我都看不懂,只能打出来的,大型网站都是从小型做起的,毕竟就算你做了个大型的没有知名度没有声誉也没人会来的 问题九:用一句话概括京东是做什么的 打着正品的旗号卖淘宝档次的商品 问题十:京东商城网址 开发网址用的是什么语言 和数据库的呢? 数据库估计是hbase之类的东西
2023-07-24 02:59:501

有哪些质量上乘的程序员必关注的网站或论坛

一、程序员进行技术学习需要收藏的网站有:(1)IT技术通用类学习网站1、GitHub这个我想大多数开发者都知道就不多说了,作为开源代码库以及版本控制系统,Github拥有140多万开发者用户。2、Hack.pledge()这是一个开发者社区,其中聚集了一些知名度比较高的开发者,如Bram Cohen,BitTorrent的创始人。在那里,你可以从一些大牛那里学习到一些编程技巧。3、CodecademyCodecademy是非常受欢迎的免费编程学习网站之一。4、Stack over flowStack http://overflow.com 可能是编程界中非常流行的网站了 , 是一个与程序相关的 IT 技术问答网站,用户可以在网站免费提交问题,浏览问题,索相关内容。5、CSDN国内非常大的技术交流平台,很多大牛的博客都有一定的参考价值,可以在上面找一些自己需要的技术文档。6、简书也是一个技术交流网站,很多人都会在上面发表自己的技术文章,还有一些书籍推荐等等,平时没事的时候,可以自己浏览一下。7、掘金掘金是一个帮助开发者成长的社区,我近期在逛的的一个网站,很多技术文章还是值得学习的,大家可以也看一下!8、Code AvengersCode Avengers提供了很多有趣的和互动性的程序设计课程,教你如何编写游戏,应用程序,以及如何使用JavaScript,HTML和CSS创建网站9、IT eBooks - Free Download可以下载IT电子书籍的网站,英文。10、博客园博客园是一个面向开发者的知识分享社区。在博客园里,有新手,也有专家,他们会分享各种的编程技术。(2)前端、UI设计学习类网站1、UIparade:灵感UI设计目录网设计师UI设计作品分享的网站,提供世界有才华的设计师们的优秀作品,帮助设计师们获得UI方面的设计灵感,提供丰富的设计参考案例,同时还提供收费版的在线设计工具。2、Mantia:苹果UI设计网是一个苹果手机UI设计站点,网站提供免费的icon图片和桌面以及UI设计下载和使用。3、Android Design:安卓UI设计网该网站上有很多资料,其中包括一般风格指南、设计样式,以及Android的部分默认UI 构件 — “Building Blocks”。4、GetUIcolors:在线UI颜色分享网在线UI颜色分享网是一个帮助设计师发现最佳颜色搭配的网站5、CodePenCodePen 一直是盛产想法与创意的圣地。它不仅能够以在线形式,将前端代码编辑与展示,而且你还可以与全球众多的开发者们交流想法、分享你的作品。6、UpLabs除了 Dribbble 外,小狮将为大家推荐的是 UpLabs ,它也是专注为设计师和开发者打造的每日资源推荐社区。7、Collect UICollect UI 是一个基于 Dribbble 的每日 UI 资源推荐社区。8、SiteInspireSiteInspire 可以说是网页设计师必备灵感来源网站,因为这个网站收集了互联网上优秀的网站交互设计作品。二、业余放松类网站(这个好像是适用于好多人)1、v2ex2、10243、b站4、知乎(可娱乐,可学习)分享完毕,如果有没有说到的点,欢迎补充!
2023-07-24 03:00:004

Devops概述

目前在国外,互联网巨头如Google、Facebook、Amazon、LinkedIn、Netflix、Airbnb,传统软件公司如Adobe、IBM、Microsoft、SAP等,亦或是网络业务非核心企业如苹果、沃尔玛、索尼影视娱乐、星巴克等都在采用DevOps或提供相关支持产品。那么DevOps究竟是怎样一回事? DevOps一次词的来自于Development和Operations的组合,突出重视软件开发人员和运维人员的沟通合作,通过自动化流程来使得软件构建、测试、发布更加快捷、频繁和可靠。 DevOps概念早先升温于2009年的欧洲,因传统模式的运维之痛而生。 DevOps是为了填补开发端和运维端之间的信息鸿沟,改善团队之间的协作关系。不过需要澄清的一点是,从开发到运维,中间还有测试环节。DevOps其实包含了三个部分:开发、测试和运维。 换句话说,DevOps希望做到的是软件产品交付过程中IT工具链的打通,使得各个团队减少时间损耗,更加高效地协同工作。专家们总结出了下面这个DevOps能力图,良好的闭环可以大大增加整体的产出。 由上所述,相信大家对DevOps有了一定的了解。但是除了触及工具链之外,作为文化和技术的方法论,DevOps还需要公司在组织文化上的变革。回顾软件行业的研发模式,可以发现大致有三个阶段:瀑布式开发、敏捷开发、DevOps。 DevOps早在九年前就有人提出来,但是,为什么这两年才开始受到越来越多的企业重视和时间呢?因为DevOps的发展是独木不成林的,现在有越来越多的技术支撑。微服务架构理念、容器技术使得DevOps的实施变得更加容易,计算能力提升和云环境的发展使得快速开发的产品可以立刻获得更广泛的使用。 当今世界改变的速度已与过去不同,而每当经历一个颠覆性的技术革命时,都给这个世界带来了深刻的变化,大数据、云计算、人工智能、VR/AR和区块链等新兴技术推动着世界不断变化,如何应对这样一个VUCA时代,让我们能够在环境变化的时候快速响应呢? 在些我引用了圣贤王阳明的一句名言,他提倡“知行合一”,通俗的讲就是做事情要理论与实践相结合。我们在实现DevOps落地时也一定要遵循“理论与实践相结合”的方式进行,理论就是我们做事的指导思想,而实践就是具体做事的方法,接下来我就从我在公司中是如何按照理论与实践相结合来推动DevOps落实地。 首先我们还是要回到什么是DevOps,如果大家忘记了可以回到之前再温故一下,包括我总结的DevOps公式。 其实DevOps核心思想就是:“快速交付价值,灵活响应变化”。其基本原则如下: DevOps的一个巨大好处就是可以高效交付,这也正好是它的初衷。Puppet和DevOps Research and Assessment (DORA) 主办了2016年DevOps调查报告中,根据全球4600位各IT公司的技术工作者的提交数据统计,得出高效公司可以完成平均每年1460次部署。与低效组织相比,高效组织的部署频繁200倍,产品投入使用速度快2555倍,服务恢复速度快24倍。在工作内容的时间分配上,低效者要多花22%的时间用在为规划好或者重复工作上,而高效者却可以多花29%的时间用在新的工作上。所以这里的高效不仅仅指公司产出的效率提高,还指员工的工作质量得到提升。 DevOps另外一个好处就是会改善公司组织文化、提高员工的参与感。员工们变得更高效,也更有满足和成就感;调查显示高效员工的雇员净推荐值(eNPS:employee Net Promoter Score)更高,即对公司更加认同。 快速的部署其实可以帮助更快地发现问题,产品被更快地交付到用户手中,团队可以更快地得到用户的反馈,从而进行更快地相应。而且,DevOps小步快跑的形式带来的变化是比较小的,出现问题的偏差每次都不会太大,修复起来也会相对容易一些。 因此,认为速度就意味着危险是一种偏见。此外,滞后软件服务的发布也并不一定会完全地避免问题,在竞争日益激烈的IT行业,这反而可能错失了软件的发布时机。 技术的发展使得DevOps有了更多的配合。早期时,大家虽然意识到了这个问题的,但是苦于当时没有完善丰富的技术工具,是一种“理想很丰满,但是现实很骨感”的情况。DevOps的实现可以基于新兴的容器技术;也可以在自动化运维工具Puppet、SaltStack, Ansible之后的延伸;还可以构建在传统的Cloud Foundry、OpenShift等PaaS厂商之上。 IT行业已经越来越于市场的经济发展紧密挂钩,专家们认为IT将会有支持中心变成利润驱动中心。事实上,这个变化已经开始了,这不仅体现在Google、苹果这些大企业中,而且也发生在传统行业中,比如出租车业务中的Uber、酒店连锁行业中的Airbnb、图书经销商Amazon等等。能否让公司的IT配套方案及时跟上市场需求的步伐,在今天显得至关重要。 DevOps 2016年度报告给出了一个运维成本的计算公式: 而对于工程师而言,他们也是DevOps的受益者。微软资深工程师Scott Hanselman说过“对于开发者而言,最有力的工具就是自动化工具”(The most powerful tool we have as developers is automation)。工具链的打通使得开发者们在交付软件时可以完成生产环境的构建、测试和运行;正如Amazon的VP兼CTO Werner Vogels那句让人印象深刻的话:“谁开发谁运行”。(You build it, you run it) 上文提到了工具链的打通,那么工具自然就需要做好准备。现将工具类型及对应的不完全列举整理如下: 在工具的选择上,需要结合公司业务需求和技术团队情况而定。(注:更多关于工具的详细介绍可以参见此文: 51 Best DevOps Tools for #DevOps Engineers ) DevOps成功与否,公司组织是否利于协作是关键。开发人员和运维人员可以良好沟通互相学习,从而拥有高生产力。并且协作也存在在业务人员与开发人员之间。出席了ITV公司在2012年就开始落地DevOps,其通用平台主管Clark在2016年伦敦企业级DevOps峰会接受InfoQ了采访,在谈及成功时表示,业务人员非常清楚他们希望在最小化可行产品中实现什么,工程师们就按需交付,不做多余工作。这样,工程师们使用通用的平台(即打通的工具链)得到更好的一致性和更高的质量。此外,DevOps对工程师个人的要求也提高了,很多专家也认为招募到优秀的人才也是一个挑战。 DevOps正在增长,尤其是在大企业中:调查发现,DevOps的接受度有了显著提高。74%的受访者已经接受了DevOps,而去年这一比例为66%。目前,在81%的大企业开始接受DevOps,中小企业的接受度仅为70%。 那么具体而言都有些公司在采用DevOps呢?Adobe、Amazon、Apple、Airbnb、Ebay、Etsy、Facebook、LinkedIn、Netflix、NASA、Starbucks、Target(泛欧实时全额自动清算系统)、Walmart、Sony等等。 首先,大企业正在自下而上接受DevOps,其中业务单位或部门(31%)以及项目和团队(29%)已经实施DevOps。不过,只有21%的大企业在整个公司范围内采用了DevOps。 其次,在工具层面上,DevOps工具的用量大幅激增。Chef和Puppet依然是最常用的DevOps工具,使用率均为32%。Docker是年增长率最快的工具,用量增长一倍以上。Ansible的用量也有显著增加,使用率从10%翻倍至20%。 并且调查还发现不到半数(43%)的公司在使用诸如Chef、Puppet、Ansible或Salt等配置工具;然而使用配置工具的公司更有可能同时使用多个工具。25%的受访者使用两种或更多配置工具,只使用一种工具的比例为18%。其中Chef和Puppet是最常用的组合:使用Chef的组织中有67%同时也使用Puppet,类似的,使用Puppet的组织中也有67%同时使用了Chef。 https://mp.weixin.qq.com/s/WDS5NO3AcWxpwyIJKWlOEA
2023-07-24 03:01:061

关于微服务架构特点分析?

随着互联网的不断发展,我们在进行服务器开发组织架构上通常会采用分布式架构方法来进行设计。今天,我们就一起来了解一下,微服务架构都有哪些特点。InfoQ:你近的QConSanFrancisco提出的一个关键前提是,组织如果要从单体大型应用转变为基于微服务的体系结构就得要打破它们的庞大的整体流程。你能再进一步解释一下吗?RafaelSchloming:对于转变为微服务本身,人们实际上并不怎么关心,他们真正关心的是提升特性的完成速度。为了提升特征的完成速度就必需做出改变,而微服务只是这种改变所产生的一个附属物罢了。对于组织来说非常常见的一种情况是,当他们发展到一个临界点,增加再多的人也不会提升特性的完成速度。当这种情况发生时,通常是因为组织用于产出特性的结构和/或过程成为了瓶颈,而不是人员的数量。当一个组织遇到这种障碍,开始调查为什么这些特性似乎花费的时间远远超出了合理的资源,答案往往是,每个特性都需要太多不同团队的协调。这会发生在两个不同的维度上。你的人员可以按职能划分为团队:产品与开发、质保与运维。你的人员也可以按组件划分:例如,前端与领域模型、搜索索引和消息通知。当单个特性需要跨多个不同的团队进行协调时,交付特性的控制因素是不同团队之间的沟通速度和效率。像这样组织结构的组织实际上是被一个庞大的整体过程所阻碍的,这个过程要求每个特性(在某种程度上)要有许多许多的组织来理解它。InfoQ:那么如何解决这个问题呢?Schloming:为了把很多人用在一个问题上,你需要把他们分成团队,因为人们不能在非常大的群体中有效地沟通。你这么做的时候,其实就是在做出一系列的权衡。你所营造的是每支团队内部具有高保真的沟通和协调,而团队之间是低保真和相对较差的协调。为改进一个组织内的特性完成速度,您可以将你的人组织成独立的、跨职能的、自给自足的特性团队,可以从头到尾自主掌控一个完整的特性。这将以两种方式提高特性的完成速度。先,由于不同的职能(产品、开发、质保和运维)都圈定于一个特性内,你就可以自定义该特性区域的流程了,例如,IT培训http://www.kmbdqn.cn/分享对于一个没有人正在使用的新特性,你的流程就不需要优先考虑其稳定性了。其次,由于该特性所需的所有组件都由同一个团队拥有,因此,要想赶紧推出一个特性,就可以进行更快速有效的沟通和协调。
2023-07-24 03:01:251

关于微服务架构特点分析?

随着互联网的不断发展,我们在进行服务器开发组织架构上通常会采用分布式架构方法来进行设计。今天,我们就一起来了解一下,微服务架构都有哪些特点。InfoQ:你近的QConSanFrancisco提出的一个关键前提是,组织如果要从单体大型应用转变为基于微服务的体系结构就得要打破它们的庞大的整体流程。你能再进一步解释一下吗?RafaelSchloming:对于转变为微服务本身,人们实际上并不怎么关心,他们真正关心的是提升特性的完成速度。为了提升特征的完成速度就必需做出改变,而微服务只是这种改变所产生的一个附属物罢了。对于组织来说非常常见的一种情况是,当他们发展到一个临界点,增加再多的人也不会提升特性的完成速度。当这种情况发生时,通常是因为组织用于产出特性的结构和/或过程成为了瓶颈,而不是人员的数量。当一个组织遇到这种障碍,开始调查为什么这些特性似乎花费的时间远远超出了合理的资源,答案往往是,每个特性都需要太多不同团队的协调。这会发生在两个不同的维度上。你的人员可以按职能划分为团队:产品与开发、质保与运维。你的人员也可以按组件划分:例如,前端与领域模型、搜索索引和消息通知。当单个特性需要跨多个不同的团队进行协调时,交付特性的控制因素是不同团队之间的沟通速度和效率。像这样组织结构的组织实际上是被一个庞大的整体过程所阻碍的,这个过程要求每个特性(在某种程度上)要有许多许多的组织来理解它。InfoQ:那么如何解决这个问题呢?Schloming:为了把很多人用在一个问题上,你需要把他们分成团队,因为人们不能在非常大的群体中有效地沟通。你这么做的时候,其实就是在做出一系列的权衡。你所营造的是每支团队内部具有高保真的沟通和协调,而团队之间是低保真和相对较差的协调。为改进一个组织内的特性完成速度,您可以将你的人组织成独立的、跨职能的、自给自足的特性团队,可以从头到尾自主掌控一个完整的特性。这将以两种方式提高特性的完成速度。先,由于不同的职能(产品、开发、质保和运维)都圈定于一个特性内,你就可以自定义该特性区域的流程了,例如,IT培训分享对于一个没有人正在使用的新特性,你的流程就不需要优先考虑其稳定性了。其次,由于该特性所需的所有组件都由同一个团队拥有,因此,要想赶紧推出一个特性,就可以进行更快速有效的沟通和协调。
2023-07-24 03:01:321

netty与vert.x的区别和联系

Vert.x是一个用于下一代异步、可伸缩、并发应用的框架,旨在为JVM提供一个Node.js的替代方案。开发者可以通过它使用JavaScript、Ruby、Groovy、Java、甚至是混合语言来编写应用。在内部,一个vert.x实例会管理着一个小的线程集合,每个线程针对服务器上的一个可用内核。基本上每个线程都实现了一个事件循环。当部署一个vert.x应用实例(又叫做verticle)时,服务器会选择一个事件循环分配给该实例。接下来针对该实例的任务都会通过该线程进行分配。由于在某一时刻可能会有成千上万个verticle在运行,因此在同一时刻会将单个事件循环指定给多个verticle。Verticle可与运行在相同或不同vert.x实例中的其他verticle进行通信,这是通过消息事件总线实现的,它类似于Erlang的actor模型。消息传递旨在让系统能够在多个可用核心上进行扩展而无需以多线程的方式来执行verticle代码。事件总线是分布式的,并不只会跨越服务器,还会渗透进客户端的JavaScript以处理“实时”的Web应用。除了并发与消息传递外,vert.x还具有如下特性:TCP/SSL服务器与客户端HTTP/HTTPS服务器与客户端WebSockets/SockJS支持InfoQ有幸采访到了VMWare的高级工程师Tim Fox以了解vert.x:InfoQ:能否从架构上介绍一下vert.x及其构建方式?Tim:vert.x的核心是用Java编写的,接下来我们为每一种支持的JVM语言编写了一个薄薄的API层,这样每种语言都有一个适合于该语言的API了。我们并没有向这些语言直接公开Java API。这意味着Ruby用户会通过Ruby的方式编写代码,JS用户会通过JS的方式编写代码。InfoQ:能否描述一下在vert.x上典型的开发流程么,特别是与开发者使用Node.js的体验进行一下对比?我觉得这与node.js是非常类似的。实际的工作流程取决于你是在本地还是云中运行应用。但这并非vert.x所特有的。InfoQ:就调试、监控与运维来看,在JVM与Node.js上运行实时应用有何差别?我想说监控与运维实际上与部署vert.x的环境之间的关系更为密切而非vert.x本身。比如说,如果将vert.x部署到云中,那么云提供商可能就会为你提供监控。顺便说一下,社区成员目前已经在OpenShift与Heroku上运行了Vert.x。我们希望不久之后CloudFoundry支持就会到来。InfoQ:vert.x与Node.js有什么基准比较么?我们尚未发布任何的官方基准。但我自己已经完成了一些,在我所做的测试中,vert.x的性能与可伸缩性都远远超越了node.js。我希望在不久之后能够发布一些基准。InfoQ:vert.x与Netty相比如何呢?Netty是个很棒的底层IO库。Vert.x实际上使用了Netty。但vert.x是个用于编写异步应用的完整。Vert.x还提供了一个组件模型、文件IO及各种Netty所没有的东西。我要说的是,在JVM世界中,Vert.x是更类似于Akka(也使用了Netty)之类的完整框架。
2023-07-24 03:01:401

淘宝,京东,天猫 的前后台都是用哪些编程语言写的?回答的具体点,谢谢

http://www.infoq.com/cn/interviews/Jingdong-trading-platform-system-structure?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global官方回答,从C语言转成了java淘宝天猫应该类似,但是没有明确官网回复。
2023-07-24 03:01:562

《Java并发编程的艺术》epub下载在线阅读,求百度网盘云资源

《Java并发编程的艺术》(方腾飞)电子书网盘下载免费在线阅读资源链接:链接: https://pan.baidu.com/s/1WUZl6mu4QtMdtaO0Et17gA 提取码: 37t6书名:Java并发编程的艺术作者:方腾飞豆瓣评分:7.4出版社:机械工业出版社出版年份:2015-7-1页数:240内容简介:并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,《Java并发编程的艺术》是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java并发编程网和InfoQ等技术社区,得到了非常高的评价。它选取了Java并发编程中最核心的技术进行讲解,从JDK源码、JVM、CPU等多角度全面剖析和讲解了Java并发编程的框架、工具、原理和方法,对Java并发编程进行了最为深入和透彻的阐述。《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时通过实例介绍了如何应用这些技术。作者简介:方腾飞(花名清英,英文名kiral),蚂蚁金服集团技术专家,从事Java开发近10年。5年以上的团队管理、项目管理和敏捷开发经验,崇尚团队合作。曾参与CMS、电子海图、SOC、ITIL、电子商务网站和信贷管理系统等项目。目前在蚂蚁金服网商银行贷款管理团队负责数据采集平台开发工作。与同事合作开发了tala code Review插件,深受阿里数千名工程师拥趸,并开发过开源工具jdbcutil(https://github.com/kiral/utils)。创办了并发编程网,组织翻译了百余篇国外优秀技术文章,并曾为InfoQ撰写“聊聊并发”专栏,在《程序员》杂志撰写敏捷实践系列文章魏 鹏,阿里巴巴集团技术专家,在阿里巴巴中国网站技术部工作多年,曾担任中国网站交易平台架构师,主导了交易系统服务化工作,设计实现的数据迁移系统高效地完成了阿里巴巴中国网站交易数据到阿里巴巴集团的迁移工作。目前在阿里巴巴共享业务事业部从事Java应用容器Pandora和服务框架HSF的相关工作,其中Java应用容器Pandora是阿里巴巴中间件运行的基础,而服务框架HSF则是阿里巴巴集团实现服务化的主要解决方案,二者在阿里巴巴拥有最为广泛的使用量。个人平时喜欢阅读技术书籍,翻译一些国外优秀文档,喜欢总结、乐于分享,对Java应用容器、多线程编程以及分布式系统感兴趣。程晓明,1号店资深架构师,从事1号店交易平台系统的开发,技术上关注并发与NIO。因5年前遇到的一个线上故障,解决过程中对Java并发编程产生了浓厚的兴趣,从此开始了漫长的探索之旅:从底层实现机制、内存模型到Java同步。纵观我自己对Java并发的学习过程,是一个从高层到底层再到高层的一个反复迭代的过程,我估计很多读者的学习过程应该与我类似。文章多见诸《IBM developerWorks》、InfoQ和《程序员》杂志。
2023-07-24 03:02:031

为什么要使用NoSQL?NOSQL的优势

非常荣幸能受邀在InfoQ开辟这样一个关于NoSQL的专栏,InfoQ是我非常尊重的一家技术媒体,同时我也希望借助InfoQ,在国内推动NoSQL的发展,希望跟我一样有兴趣的朋友加入进来。这次的NoSQL专栏系列将先整体介绍NoSQL,然后介绍如何把NoSQL运用到自己的项目中合适的场景中,还会适当地分析一些成功案例,希望有成功使用NoSQL经验的朋友给我提供一些线索和信息。 NoSQL概念随着web2.0的快速发展,非关系型、分布式数据存储得到了快速的发展,它们不保证关系数据的ACID特性。NoSQL概念在2009年被提了出来。NoSQL最常见的解释是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一词最早于1998年被用于一个轻量级的关系数据库的名字。) NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。在NoSQL概念提出之前,这些数据库就被用于各种系统当中,但是却很少用于web互联网应用。比如cdb、qdbm、bdb数据库。 传统关系数据库的瓶颈 传统的关系数据库具有不错的性能,高稳定型,久经历史考验,而且使用简单,功能强大,同时也积累了大量的成功案例。在互联网领域,MySQL成为了绝对靠前的王者,毫不夸张的说,MySQL为互联网的发展做出了卓越的贡献。 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。 到了最近10年,网站开始快速发展。火爆的论坛、博客、sns、微博逐渐引领web领域的潮流。在初期,论坛的流量其实也不大,如果你接触网络比较早,你可能还记得那个时候还有文本型存储的论坛程序,可以想象一般的论坛的流量有多大。 Memcached+MySQL 后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached就自然的成为一个非常时尚的技术产品。 Memcached作为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据hash算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性hash来解决增加或减少缓存服务器导致重新hash带来的大量缓存失效的弊端。当时,如果你去面试,你说你有Memcached经验,肯定会加分的。 Mysql主从读写分离 由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。 分表分库随着web2.0的继续高速发展,在Memcached的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL推出了MySQL Cluster集群,但是由于在互联网几乎没有成功案例,性能也不能满足互联网的要求,只是在高可靠性上提供了非常大的保证。 MySQL的扩展性瓶颈 在互联网,大部分的MySQL都应该是IO密集型的,事实上,如果你的MySQL是个CPU密集型的话,那么很可能你的MySQL设计得有性能问题,需要优化了。大数据量高并发环境下的MySQL应用开发越来越复杂,也越来越具有技术挑战性。分表分库的规则把握都是需要经验的。虽然有像淘宝这样技术实力强大的公司开发了透明的中间件层来屏蔽开发者的复杂性,但是避免不了整个架构的复杂性。分库分表的子库到一定阶段又面临扩展问题。还有就是需求的变更,可能又需要一种新的分库方式。 MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。 关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。 NOSQL的优势易扩展NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。 大数据量,高性能 NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。 灵活的数据模型 NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的web2.0时代尤其明显。 高可用NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过复制模型也能实现高可用。 总结NoSQL数据库的出现,弥补了关系数据(比如MySQL)在某些方面的不足,在某些方面能极大的节省开发成本和维护成本。 MySQL和NoSQL都有各自的特点和使用的应用场景,两者的紧密结合将会给web2.0的数据库发展带来新的思路。让关系数据库关注在关系上,NoSQL关注在存储上。
2023-07-24 03:02:231

对比jQuery和AngularJS的不同思维模式

jQuery是dom驱动,AngularJS是数据驱动。不要先设计页面,然后再使用DOM操作来改变它的展现,不要用AngularJS来加强jQuery。
2023-07-24 03:02:343

什么是好的API与设计流程和设计原则

安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?如何对RESTful API进行版本控制,请分享您认为实用的做法?HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?能否为InfoQ的读者们推荐一款实用的RESTful API开发框架,并说明您的推介理由。HTTP2.0规范正在制定当中,您对它的期待是什么?InfoQ:什么是好的RESTful API?相信每个人都有自己的评判标准。那么,您认为一个好的RESTful API应该具有哪些特征呢?李锟:一个好的RESTful API,应该具备以下特征:这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。RESTful API建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。这个API应该是松耦合的。RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTful API的松耦合性。当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。感兴趣的读者可以参考《REST实战》。这个API中所使用的表述格式应该是常见的通用格式在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。所以除非有很合理的要求,通常不需要使用自定义的私有格式。使用HTTP响应状态代码来表达各种出错情况HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。响应状态代码分成两部分:status code和reason phase。两部分都是可定制的,也可以使用标准的status code,只定制reason phase。如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。这个API应该对于HTTP缓存是友好的充分利用好HTTP缓存是RESTful API可伸缩性的根本。HTTP协议是一个分层的架构,从两端的user agent到origin server之间,可以插入很多中间组件。而在整个HTTP通信链条的很多位置,都可以设置缓存。HTTP协议内建有很好的缓存机制,可以分成过期模型和验证模型两套缓存机制。如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。李建业:首先说明一下,对REST这个概念,我一般把它理解为REST风格的架构,但是现在实践中最为广泛认知的是HTTP,而它是REST的一个实现,所以RESTful API也可以不太严格的指基于HTTP的API——当然,即使是不严格的时候,API本身也应该力求遵循REST架构风格。我认为,一个RESTful API最重要的一点应该是——“尽可能少的先验信息”,这一条也同时是我判断一个好的RESTful API的标准。比如HTTP动词,在实践中,大家可能会常常纠结于有效利用 HTTP 动词,但这却并不是特别重要的事情——除非你理解这么做的价值。HTTP 动词最重要的地方在于它是标准阐明了的行为,也就是说,如果我们的“客户端”遵循约定,那么就不必要发明新的动词,也就不必增加“先验信息”;但是,所谓“先验信息”,针对的是客户端——对API来说就是调用者,对于一些企业内部系统,或者一些传统系统,由于“资源”很稳定,对资源的操作也很稳定,这些系统的“调用客户端”不是浏览器而是另一个系统,此时如果强制对应到HTTP动词,反而会变成额外的“先验信息”,这时我就不会太拘泥HTTP动词,自己制定一套动词放在参数中也可以接受——只要动词不变化,这个系统依然是REST风格的。再比如Response里面的Content-Type,这个有时会被新手忽略,但这其实很重要,因为一般涉及到系统间协同的API,往往不会使用普通的文本,比较常见的是使用json表达复杂结构,而这与通常的缺省理解不同(缺省一般会认为是text/plain和text/html),所以如果在API中忘记用Content-Type进行区分的话,后续对多种类型的客户端接入的支持就会变成陷阱(我们多次遇到过这个问题)。而如果一开始就检查是否增加先验知识(缺省Content-Type为plain或者允许指定Content-Type),那这一困难就可以避免了。丁雪丰:首先,应该正确地使用HTTP的统一接口,比如HTTP的动词,如果不分青红皂白清一色POST那显然还有改进的余地;其次,资源有合适的粒度,可以从三个方面来评判资源的粒度是否合理——网络的效率、表述的大小以及客户端使用时的易用程度;最后,是表述的设计,除了表述的正文内容,还有其中的URI和链接,这些都是评判一个RESTful API好坏的标准。马钧:在我看来,一个好的API标准,就是能尽量利用到HTTP协议的特性,将HTTP当成一种转移协议,而不是传输协议。包括但不限于:利用HTTP的各种动词来明确操作;包含有内容协商,可以根据请求头提供的参数选择一个资源最合适的媒体类型、语言、字符集和编码的表现;使用不同的返回代码来描述各种状态。但实际上见到过的很多声称RESTful API,包括国内的和国外的,能符合这些条件的并不多。parse.com提供的API是我见到过的较为不错的RESTful API,可以作为范例参考。InfoQ:安全是恒久的话题,对于基于WSDL和SOAP的Web Service,我们有WS-Security这样的安全规范来指导实现认证、授权、身份管理等安全需求。那么,RESTful API有无成熟可用规范或实现框架呢?如何保证RESTful API的安全性呢?李锟:保证RESTful API的安全性,主要包括三大方面:a) 对客户端做身份认证b) 对敏感的数据做加密,并且防止篡改c) 身份认证之后的授权对客户端做身份认证,有几种常见的做法:在请求中加签名参数为每个接入方分配一个密钥,并且规定一种签名的计算方法。要求接入方的请求中必须加上签名参数。这个做法是最简单的,但是需要确保接入方密钥的安全保存,另外还要注意防范replay攻击。其优点是容易理解与实现,缺点是需要承担安全保存密钥和定期更新密钥的负担,而且不够灵活,更新密钥和升级签名算法很困难。使用标准的HTTP身份认证机制HTTP Basic身份认证安全性较低,必须与HTTPS配合使用。HTTP Digest身份认证可以单独使用,具备中等程度的安全性。HTTP Digest身份认证机制还支持插入用户自定义的加密算法,这样可以进一步提高API的安全性。不过插入自定义加密算法在面向互联网的API中用的不是很多。这个做法需要确保接入方“安全域-用户名-密码”三元组信息的安全保存,另外还要注意防范replay攻击。优点:基于标准,得到了广泛的支持(大量HTTP服务器端、客户端库)。在服务器端做HTTP身份认证的职责可以由Web Server(例如Nginx)、App Server(例如Tomcat)、安全框架(例如Spring Security)来承担,对应用开发者来说是透明的。HTTP身份认证机制(RFC 2617)非常好地体现了“分离关注点”的设计原则,而且保持了操作语义的可见性。缺点:这类基于简单用户名+密码机制的安全性不可能高于基于非对称密钥的机制(例如数字证书)。使用OAuth协议做身份认证OAuth协议适用于为外部应用授权访问本站资源的情况。其中的加密机制与HTTP Digest身份认证相比,安全性更高。需要注意,OAuth身份认证与HTTP Digest身份认证之间并不是相互取代的关系,它们的适用场景是不同的。OAuth协议更适合于为面向最终用户维度的API提供授权,例如获取隶属于用户的微博信息等等。如果API并不是面向最终用户维度的,例如像七牛云存储这样的存储服务,这并非是OAuth协议的典型适用场景。对敏感的数据做加密,并且防止篡改,常见的做法有:部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。仅对部分敏感数据做加密(例如预付费卡的卡号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。身份认证之后的授权,主要是由应用来控制。通常应该实现某种基于角色+用户组的授权机制,这方面的框架有不少(例如Spring Security),不过大多数开发团队还是喜欢自己来实现相关功能。李建业:我不认为安全是RESTful API需要考虑的问题,事实上我觉得这是两个正交的问题。当然,如果使用RESTful API来提供认证、授权和身份管理,那也算是双方有关系,但是这和其它风格的API设计所要考虑的问题似乎没什么区别,不值得特别注意。但是在具体设计层面,这两者的“正交点”上似乎确实有些问题,因为REST是一个推崇状态无关原则的架构风格,而认证和授权通常基于第三方解决方案,所以往往会出现违背有状态约束的问题,这个地方我也没有特别的想法,当然这个困难和原问题关系不大。至于WS-族的协议,我不太了解,不太能参与讨论。丁雪丰:对于RESTful API,常见的安全措施都是可以继续使用的。例如,为了防篡改,可以对全部参数进行签名;为了防范重放攻击可以在请求中增加一次性的Token,或者短时间内有效的Token;对内容加密可以实现数据防泄露……;对于DDoS攻击,各种HTTP流量清洗策略,都可以继续发挥作用,因为这就是基本的HTTP请求。在授权和认证方面,OAuth 2.0已经基本成熟了,并且得到了广泛地应用。如果可以,接入第三方账户体系是个不错的选择,比如Google和Facebook的,国内的当然也有几个候选。马钧:个人认为RESTful的安全性分为几个层次,在安全要求较高的场合,可以通过HTTPs这样的加密协议来保证网络层的安全,应用层的安全可以通过OAuth实现认证,而对于资源的访问授权,则只能依靠应用程序来实现了。InfoQ:如何对RESTful API进行版本控制,请分享您认为实用的做法?李锟:一个比较简单实用的做法是直接在URI中插入版本号,这样做允许多个版本的API并行运行。另一个做法是在HTTP请求中加入自定义头信息,标明使用的版本号。不过这个做法其实对浏览器不够友好,简单地使用浏览器+HTML无法测试。李建业:目前比较好的方式还是在uri设计中添加版本信息,其它方法都不如这个实用。丁雪丰:个人认为最好的版本化,就是没有明显的版本。在对已发布的服务进行变更时,要尽量做到兼容,其中包括URI、链接和各种不同的表述的兼容,最关键的就是在扩展时不能破坏现有的客户端。例如,要变更一个参数,可以选择同时兼容新旧两种输入,或者保持老参数不动,提供一个新的参数,在文档中必须做出说明,不推荐新用户再继续使用之前的参数。如果必须要进行不兼容的变更,那么可以选择标记不同的版本号,这时可以选择在路径或参数中增加版本信息。也有做法是增加HTTP标头,只是在调用时会稍有不便,推荐前两种方法。马钧:RESTfulAPI的版本升级,尽量兼容之前的版本,保证原有的API都能正常工作,可以通过HTTP 301转跳到新的资源。另外一种实用的做法就是在url中保留版本号,同时提供多个版本供客户端使用,如 v1.rest.com 或者 rest.com/v1/ 这样。InfoQ:HTTP1.1规范中给出的动词对于设计RESTful API够用吗?您在实际项目中会扩展自己的动词吗?在什么情况下需要扩展?李锟:这个问题取决于设计者如何看待和设计资源。如果资源抽象做的很好,对于某个资源的任何操作,通常都能够映射到CRUD四个类别中。CRUD四个类别对于操作资源来说,绝大多数情况下是完备的。HTTP的GET/POST/PUT/DELETE四个方法,对于CRUD四个类别的操作来说是足够的,映射关系是Create-POST/Retrieve-GET/Update-PUT/Delete-DELETE。我们通常不会选择创建自己的动词,这样做对于客户端开发者来说,需要更多的学习成本。如果在资源上定义的操作过多,我们会选择拆分出更多的资源。李建业:一般是够用的,有时一些“不够用”的场景是由于我们没有设计出合理的资源,比如批量操作。但是,正如之前所说的那样,对于某些内部的、传统的(因此模型稳定且已知)系统,API提供者和调用者会有自已的固定动词表,此时没必要拘泥。另外,我不建议扩展动词,一旦扩展了动词,其实已经破坏了我之前说的*“尽可能少的先验信息”*,那么,扩展动词和重新设计动词的成本差别不大。基于这个考虑,我建议尽可能保持动词不变,除非你想重新设计动词表。丁雪丰:一般情况下,常用的HTTP动词是够用的,并没有出现一定要自己扩展动词的情况。其实,最常用的也就是GET、POST、DELETE和PUT,而HEAD、OPTIONS、TRACE则基本用不太到。如果出现一时找不到合适的动词,安全幂等的操作用GET,其他都可以用POST,在设计资源时稍加考虑即可。马钧:在我的实际项目中,只用到了POST,PUT,DELETE,GET这四个动词。InfoQ:今年5月份发布的JAX-RS 2.0规范对于RSTfulAPI的设计最有价值的特性是哪个(些)? 它(们)用于解决什么问题?李锟:REST开发框架RESTEasy项目负责人Bill Burke,去年写了一篇文章介绍JAX-RS 2.0。我同意Bill在文章中的观点,在JAX-RS 2.0增加的内容中,最重要的三部分为:a) Client API——用来规范化JAX-RS客户端的开发方式。b) Server-side Asynchronous HTTP——用来实现服务器端推送功能,而不需要依靠低效的轮询方式。c) Filters and Interceptors——用来分离关注点,将鉴权、日志等逻辑与业务逻辑分离开,更好地实现代码重用。这三部分的内容对于开发者来说都很有用。遵循JAX-RS规范做开发,可以确保服务器端以及客户端代码的可移植性。李建业:我个人关注异步API这部分,主要是因为流式服务将会越来越多,那将大量需要这类支持。InfoQ:能否为InfoQ的读者推荐一款实用的RESTful API开发框架,并说明您的推介理由。李锟:这个问题我就不详细回答了。不同的编程语言有不同的REST开发框架,对于REST的支持程度也不同。开发RESTful API的需求范围很广,可选择的开发框架的范围也很广。保持多样性是繁荣生态环境的基础。像Java就有支持JAX-RS规范的Jersey、RESTEasy、Restlet、Apache CXF,和不支持JAX-RS规范的Spring MVC等等很多框架。这些框架目前都做的不错。我对框架的选择没有倾向性。RESTful API设计的最佳实践应该是通用的,而不是必须依赖某种特定的开发框架。李建业:不好意思,这个我不太重视,没法推荐,不过我可以解释一下为什么对RESTful API框架不感冒的原因。REST作为一个架构风格,对我们的系统开发有很大影响,但是这些影响一般是针对架构(例如状态无关)或者设计(例如资源识别)上的,所以一旦涉及到具体实现,主要工作就基本结束了,此时开发框架能做的事也就只有简化编程了(相较而言,有的框架还能起到引导设计的作用),而由于RESTful会抽象动词,所以实现层面中和API规范相关的工作本来就不多,那么框架的价值就更小了。当然,我们也不可能直接基于servlet/rakc/wsgi来开发,不过一般的编程语言都会提供一些简单的url route/match策略,我们使用这些就足够了。另外,有些框架能帮我们生成全部的动词支持,但这也未必是好事,我一般倾向于按需实现——用到了再支持,这就更不需要太关注开发框架对RESTful的支持了。丁雪丰:由于本人是Spring的拥护者,工作中也一直在使用Spring,所以在选择框架时会更多地倾向Spring MVC(并不是说别的框架不好,这里有些个人主观的成份)。如果一定要选择其他框架,也要选择能够方便与Spring集成的框架。如果在项目中已经使用了Spring,那么没有什么理由不选择Spring MVC,鉴于目前Spring在各种项目中的高出镜率,相信一般情况下都会选择Spring MVC。REST的成熟度模型中,第三层就是HATEOAS,Spring目前还提供了Spring Hateoas子项目,对链接、资源等方面的支持都做了一定的增强。马钧:我目前在实际项目中使用的是Spray,这是一个开源的 REST/HTTP 工具包和底层网络 IO 包,基于 Scala 和 Akka 构建。轻量级、异步、非堵塞、基于 actor 模式、模块化和可测试是Spray的特点。InfoQ:HTTP2.0规范正在制定当中,您对它的期待是什么?李锟:我的期待包括两个方面:应该做的和不应该做的。HTTP/2.0规范应该做的:与HTTP/1.1协议保持兼容。兼容的含义是说两者可以并存,客户端应用可以根据服务器端的能力,自由地选择使用HTTP/2.0还是HTTP/1.1,而且选择过程对应用来说是透明的。改进HTTP协议(作为资源的统一接口)之中操作语义表达方式的语法,提高网络传输效率。更好地模块化,这样HTTP/2.0协议的实现能够更好地模块化。应用程序可根据需要选择适当的模块,而不是要么全有、要么全无。废弃掉HTTP/1.1协议中一些很少有人用到的部分,例如采用管道(pipelining)方式发送请求。增加更多的动词,以适应除CRUD之外的其他场景。HTTP/2.0规范不应该做的:HTTP/2.0协议不应该把底层的数据加密机制(即SSL)作为必选项。HTTP/2.0协议不应该背离REST架构风格的约束,尤其是要确保操作语义对于中间组件的可见性。在上面这两个方面,Roy Fileidng曾经与SPDY协议设计者Mike Belshe发生过激烈争论,详情请看:Roy Fielding谈Google SPDY协议李建业:对此规范关注不多,不知道会不会有对于流的支持,目前我所知道的只有chunk方式进行简单的支持,但是真正的流需要区分数据通道和控制通道——哪怕是逻辑上的区分,这样就直接对REST风格产生了很大冲击,考虑到流式服务在未来的发展潜力,我特别期待业界在这方面有所进展。丁雪丰:HTTP 2.0很大程度上是借鉴了Google的SPDY,就我而言,首先,希望这个规范能做到与HTTP 1.1的兼容,使用者如果只认识1.1,那么2.0能优雅“降级”;其次,希望2.0能带来更好的性能,SPDY在这方面还是有所改进的,希望HTTP 2.0能再接再厉;最后,希望这个规范能在最终定稿时附带一个最佳实践,正确引导人们合理地使用HTTP 2.0。马钧:没研究过,估计即使出来,1.1还有很长的生命周期,不会很快被取代。
2023-07-24 03:02:441

《Java并发编程的艺术》epub下载在线阅读全文,求百度网盘云资源

《Java并发编程的艺术》(方腾飞)电子书网盘下载免费在线阅读链接:https://pan.baidu.com/s/1wDcPdMWWNMZjnYEp91-4sg 提取码:MLDP书名:Java并发编程的艺术作者:方腾飞豆瓣评分:7.4出版社:机械工业出版社出版年份:2015-7-1页数:240内容简介:并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,《Java并发编程的艺术》是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java并发编程网和InfoQ等技术社区,得到了非常高的评价。它选取了Java并发编程中最核心的技术进行讲解,从JDK源码、JVM、CPU等多角度全面剖析和讲解了Java并发编程的框架、工具、原理和方法,对Java并发编程进行了最为深入和透彻的阐述。《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时通过实例介绍了如何应用这些技术。作者简介:方腾飞(花名清英,英文名kiral),蚂蚁金服集团技术专家,从事Java开发近10年。5年以上的团队管理、项目管理和敏捷开发经验,崇尚团队合作。曾参与CMS、电子海图、SOC、ITIL、电子商务网站和信贷管理系统等项目。目前在蚂蚁金服网商银行贷款管理团队负责数据采集平台开发工作。与同事合作开发了tala code Review插件,深受阿里数千名工程师拥趸,并开发过开源工具jdbcutil(https://github.com/kiral/utils)。创办了并发编程网,组织翻译了百余篇国外优秀技术文章,并曾为InfoQ撰写“聊聊并发”专栏,在《程序员》杂志撰写敏捷实践系列文章魏 鹏,阿里巴巴集团技术专家,在阿里巴巴中国网站技术部工作多年,曾担任中国网站交易平台架构师,主导了交易系统服务化工作,设计实现的数据迁移系统高效地完成了阿里巴巴中国网站交易数据到阿里巴巴集团的迁移工作。目前在阿里巴巴共享业务事业部从事Java应用容器Pandora和服务框架HSF的相关工作,其中Java应用容器Pandora是阿里巴巴中间件运行的基础,而服务框架HSF则是阿里巴巴集团实现服务化的主要解决方案,二者在阿里巴巴拥有最为广泛的使用量。个人平时喜欢阅读技术书籍,翻译一些国外优秀文档,喜欢总结、乐于分享,对Java应用容器、多线程编程以及分布式系统感兴趣。程晓明,1号店资深架构师,从事1号店交易平台系统的开发,技术上关注并发与NIO。因5年前遇到的一个线上故障,解决过程中对Java并发编程产生了浓厚的兴趣,从此开始了漫长的探索之旅:从底层实现机制、内存模型到Java同步。纵观我自己对Java并发的学习过程,是一个从高层到底层再到高层的一个反复迭代的过程,我估计很多读者的学习过程应该与我类似。文章多见诸《IBM developerWorks》、InfoQ和《程序员》杂志。
2023-07-24 03:03:031

《Java并发编程的艺术》epub下载在线阅读全文,求百度网盘云资源

《Java并发编程的艺术》(方腾飞)电子书网盘下载免费在线阅读链接:https://pan.baidu.com/s/1v1MVj5E6ESwtE31wY-G7PQ 提取码:ZEXL书名:Java并发编程的艺术作者:方腾飞豆瓣评分:7.4出版社:机械工业出版社出版年份:2015-7-1页数:240内容简介:并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,《Java并发编程的艺术》是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java并发编程网和InfoQ等技术社区,得到了非常高的评价。它选取了Java并发编程中最核心的技术进行讲解,从JDK源码、JVM、CPU等多角度全面剖析和讲解了Java并发编程的框架、工具、原理和方法,对Java并发编程进行了最为深入和透彻的阐述。《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时通过实例介绍了如何应用这些技术。作者简介:方腾飞(花名清英,英文名kiral),蚂蚁金服集团技术专家,从事Java开发近10年。5年以上的团队管理、项目管理和敏捷开发经验,崇尚团队合作。曾参与CMS、电子海图、SOC、ITIL、电子商务网站和信贷管理系统等项目。目前在蚂蚁金服网商银行贷款管理团队负责数据采集平台开发工作。与同事合作开发了tala code Review插件,深受阿里数千名工程师拥趸,并开发过开源工具jdbcutil(https://github.com/kiral/utils)。创办了并发编程网,组织翻译了百余篇国外优秀技术文章,并曾为InfoQ撰写“聊聊并发”专栏,在《程序员》杂志撰写敏捷实践系列文章魏 鹏,阿里巴巴集团技术专家,在阿里巴巴中国网站技术部工作多年,曾担任中国网站交易平台架构师,主导了交易系统服务化工作,设计实现的数据迁移系统高效地完成了阿里巴巴中国网站交易数据到阿里巴巴集团的迁移工作。目前在阿里巴巴共享业务事业部从事Java应用容器Pandora和服务框架HSF的相关工作,其中Java应用容器Pandora是阿里巴巴中间件运行的基础,而服务框架HSF则是阿里巴巴集团实现服务化的主要解决方案,二者在阿里巴巴拥有最为广泛的使用量。个人平时喜欢阅读技术书籍,翻译一些国外优秀文档,喜欢总结、乐于分享,对Java应用容器、多线程编程以及分布式系统感兴趣。程晓明,1号店资深架构师,从事1号店交易平台系统的开发,技术上关注并发与NIO。因5年前遇到的一个线上故障,解决过程中对Java并发编程产生了浓厚的兴趣,从此开始了漫长的探索之旅:从底层实现机制、内存模型到Java同步。纵观我自己对Java并发的学习过程,是一个从高层到底层再到高层的一个反复迭代的过程,我估计很多读者的学习过程应该与我类似。文章多见诸《IBM developerWorks》、InfoQ和《程序员》杂志。
2023-07-24 03:03:151

JavaScript 能嵌入到 C++ 中作为脚本语言使用吗

不能的~~~~~
2023-07-24 03:03:314

unity3D用什么语言开发好?

unity中用c#最好用。
2023-07-24 03:03:436

docker和k8s的关系

概念: 官方定义1: Docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化。 官方定义2: k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。 docker一般是和传统的虚拟技术对比 传统的虚拟技术:将物理硬件虚拟成多套硬件后,需要在每套硬件上都部署一个操作系统,接着在这些操作系统上运行相应的应用程序,非常重。 docker:Docker容器内的应用程序进程直接运行在宿主机(真实物理机)的内核上,Docker引擎将一些各自独立的应用程序和它们各自的依赖打包,相互独立直接运行于未经虚拟化的宿主机硬件上,同时各个容器也没有自己的内核,显然比传统虚拟机更轻便。 K8s:每个集群有多个节点,每个节点可创建多个容器,kuberbete就是管理这些应用程序所在的小运行环境(container)而生。 在一般的认知中,Kubernetes 和 Docker 是互补关系: Docker 源于 Linux Container,可以将一台机器的资源分成 N 份容器,做到资源的隔离,并将可运行的程序定义为标准的 docker image;Kubernetes 则可以把不同机器的每份容器进行编排、调度,组成分布式系统。 近几年,Kubernetes 已经成为自有机房、云上广泛使用的容器编排方案,最广泛的使用方式是 Kubernetes+Docker。从 DevOps 人员的角度,一面用 kubectl 命令、k8s API 来操作集群,一面在单机用 docker 命令来管理镜像、运行镜像。 单独用 docker 的情况,在一些公司的场景里面也是有的。一种场景是“只分不合”,把一台机器用 docker 做资源隔离,但是不需要将多容器“编排”。 [1] https://xie.infoq.cn/article/3b9f38da1d4bf49d56d1d1938 [2] https://www.cnblogs.com/softidea/p/12803655.html [3] https://zhuanlan.zhihu.com/p/87186261 [4] https://cloud.tencent.com/developer/article/1688212
2023-07-24 03:04:171

用短语cut off 造句

用短语cut off 造句 He cut off a *** all piece of bread and gave it to me. 他切下一小片面包递给了我。 用短语造句 I"m next week going to buy a book in the bookstore. I"m next saturday going to read a ic book in the library. I"m sunday afternoon going to watch TV together. I"m next weekend going to the supermarket with my mother. Oh,I"s summer holiday. I"m next weekend going to buy a book in the bookstore. The winter vacation ! I go to school this monday . That will be fun if we go to the amusement park. We tried to knock some sense into his head. 我们试着给他灌输一点常识 用短语造句,一个短语造2句 1.want *** to do sth I want you to clean my house. She wants him to kiss him. 2.want to do sth I want to do my homework. He wants to kiss her. 3.like doing sth I like playing football. She likes dancing. 4.like to do sth She likes to eat hot food. I don"t like to play games. 5.teach *** to do sth I will teach you to study English. She will teach me to do exercise. 6.be busy doing sth I am busy doing homework. She is busy at cooking. 7.enjoy doing sth I enjoy doing this job. 8.give sth to *** I will give apples to you. She will give apples to me. 9.get sth from *** You can get help from him if you are in trouble. She get apples from her mother. 10.be good at doing sth I am good at playing puter games. She is good at dancing. 11.be good with *** I am good with my friends. She is good with her friends, too. 用短语avarityof造句 The department store carries a variety of leather shoes. 这家百货商店经售各种皮鞋。 This can happen for a variety of reasons, and these reasons can be unintended as well asdeliberate. 这一情况可能是由多种原因造成的,这些原因可能是无意的,也可能是故意的。 用短语‘be linked to"造句 The authorities insist that the discussions must not be linked to any other issue 当局坚持此次讨论不得涉及其他任何问题。 《柯林斯高阶英汉双解学习词典》 2 Pensions are linked to inflation, whereas they should be linked to the cost of living 养老金与通货膨胀挂钩,然而它们其实应该和生活费用挂钩。 《柯林斯高阶英汉双解学习词典》 3 Aid to individual countries would be linked to progress towards democracy 对个别国家的援助会与其民主程序相挂钩。 《柯林斯高阶英汉双解学习词典》 4 Doctors have been told not to sedate children with an anaesthetic that may belinked to five deaths. 医生们已被告知不要给儿童使用麻醉剂,因为它可能与5起死亡病例有关。 《柯林斯高阶英汉双解学习词典》 5 He said that he and I should not be linked to one of the links. 他说他为了我和不该联络的人都不联络了。 danci.911cha. 6 Can content be split into multiple parts, or can it be linked to other content? 可以将内容分为多个部分吗?或者,可以将其与其他内容进行连结吗? ibm. 7 This property can then be linked to actions on other ponents. 然后,可以将该属性连结到其他元件上的动作。 ibm. 8 The decision criteria should be linked to the anization"s business strategy andobjectives. 决策标准应当同组织的商业策略和目标联络起来。 ibm. 9 You will be linked to a greater scheme of existence than you imagine at present. 你将连线到一个超越你目前想象的,更大的存在规划。 blog.sina.. 10 Since this block is a source, it may be linked to other target or propagation blocks. 由于传播块也是源,因此它可以连结到其他目标或是传播块上。 infoq. 11 The budget and schedule would likewise be linked to corresponding expectations. 预算和进度将同样关联到相应的期望上。 ibm. 12 Work items can be linked to records that are not change management-related andcan be used to assign and track work. 工作项可以与和变更管理不相关的记录联络起来,并且可以用于分配和追踪工作。 ibm. 13 This could be linked to existing national systems that monitor other hazards, such asfood poisoning. 它可以与监测其他风险(如食物中毒)的国家体系连线起来。 scidev. 14 In the second system, they would be linked to sequential files. 在第二个系统中,这两个程式应连结到顺序档案上。 dictall. 15 Each of the created entries can be linked to others. 建立的每个条目都能够连结到其他条目。 ibm. 16 Not surprisingly, soon more than half of all approved initiatives appeared to belinked to this business goal. 很正常的,很快超过半数的被批准的主动性工作和实现这一商业目标有关。 ibm. 17 Many types of media that you find in a hypermedia document can be linked to otherhypermedia documents. 你在超媒体文件中看到的很多种媒体都可以连结到其它的超媒体文件中去。 iask.sina.. 18 However going without can be linked to obesity and a greater risk of depression. 但是,睡眠不足可能导致肥胖和存在患上抑郁症的更大风险。 iask.sina.. 19 All our environmental concerns can be linked to increasing demands from anexpanding population. 我们所有环境方面的顾虑都可以和人口增长引发的需求增长联络起来。 okread.info 20 Thus, its implementation will not be linked to business critical projects or functions. 因此,不要用它去实现关键的业务专案或功能。 ibm. 21 Now, a study shows it might also be linked to infertility in women. 而今,一项研究表明反式脂肪也可能与妇女不孕有关。 news.dxy. 22 For Chinese panies, engagements are most likely to be linked to growth viainternational expansion and globalisation. 对中国企业而言,其咨询需求最有可能是关于通过国际扩张和全球化来实现增长。 ftchinese. 23 They found that loneliness seemed to be linked to changes in the activity of a groupof 209 genes. 他们发现,孤独感似乎与一组209种基因的活动变化有关。 ftchinese. 24 Next, Kohler"s lab is investigating whether the dark state can be linked to DNAdamage. 下一步,康研究室将研究黑暗状态是否和DNA破坏有关。 dictall. 25 In a world where scholarship must be linked to practice; 这个世界学术必须与实践相结合; web.worldbank. 26 Test cases can be linked to requirements. 测试用例可以连结到需求。 ibm. 27 The crimes were found to be linked to gang activities. 发现这些犯罪行为和帮派活动有关。 edu.sina.. 28 These can then be linked to other selected Amazon friends. 这些页面还可以连线到经选择的其它亚马逊网友的页面上。 ftchinese. 29 That budget should in turn be linked to pany strategy. 预算应该进一步与公司战略联络起来。 ftchinese. 30 All input-output devices will be linked to them via neorks. 所有的输人一输出装置都将通过网路与智慧随机储存器们连线。 用短语beimportantfor造句 用短语be important for造句: From this level, the more you can raise this angle of view, the more you will beimportant for the society. 从这个水平,你的视角提得愈高,你对社会就愈重要。 用短语look for造句 He is looking for his book. 他正在找书。 用短语in total 造句 how much are the bread? 2 yuan how much are the meat? 10yuan a kilo then how much are they in total? 12 yuan in total,please
2023-07-24 03:04:391

Linux内存,PageFault与SwapOut

“内存并不一定总是快” Linux 中内存主要有匿名内存和 Page Cache 两种。 Linux操作系统内存管理策略是会尽可能的利用内存来做各种缓存,所以一般来说服务器所谓的free内存都会较少,当应用alloc申请内存的时候,如果free内存不足就会引发内存回收,这就是所谓的PageFault缺页,这时候系统会先使用异步方式的后台回收来提高应用申请内存这个操作的响应速度。但是如果应用申请内存的速度大于系统后台回收的速度的话,就会进入所谓直接回收(Direct Reclaim)模式,这是一个同步的过程,应用会自旋等待内存回收完毕,产生比较大的延迟。见下图: 另一方面,内核会回收匿名内存页,并将其置换到磁盘里(这是Linux所谓虚拟内存的管理方式,磁盘上的这部分用来跟内存做交换的空间称为swap空间),匿名内存页一旦被换出然后再次被访问的时候,就会产生文件IO了(要从swap空间里把页加载回内存里),这也会导致比较大的延迟。见下图: vm.extra_free_kbytes 和 vm.swappiness 两个内核参数可以针对PageFault和SwapOut两种内存访问延迟做调优。mlock 系统调用可以让应用程序“锁定”一块内存空间而不被内核swap出去。 万亿级数据洪峰下的分布式消息引擎-InfoQ 后记: 这篇小文来自于学习RocketMQ开发团队的技术分享文章(见参考),里边的“内存没那么快”观点笔者认为更确切说法应该是“内存并不总是那么快”,里边的Linux内存管理的一小段说明加深了笔者对之前了解的概念的理解,这些东西可能平时工作未必有什么用,但了解底层的东西总是会让人产生求知求所得的愉悦感受。看了阿里褚霸的个人背景简介,“14年c开发经验, 12年网络开发经验, 3年Linux内核开发”,他也遇到过“底层 IO(Input/Output) 技术。IO 技术涉及面非常广,驱动,块设备,文件系统,内存关系等等” ,做专家终归是要走入底层,到最后考验的是对系统、对计算机的理解。本文很水,而脚下这条路不知能走多远,但是想想不为什么就算只为求知的喜悦我也是愿意走下去的啊。这也是我为什么要建“系统底层”这个专题
2023-07-24 03:04:461

IT行业知名网站有哪些

太多了,会累死的。。。
2023-07-24 03:04:562

python为啥运行效率不高

1.Python是动态语言动态语言是一类在运行时可以改变其结构的语言,如新的函数、对象、代码可以被引入,已有的函数可以被删除或其他结构上的变化等,该类语言更具有活性,但是不可避免的因为运行时的不确定性也影响运行效率。2.Python是解释执行相比于C语言编译性语言编写的程序,Python是解释执行语言,其运行过程是Python运行文件程序时,Python解释器将源代码转换为字节码,然后再由Python解释器来执行这些字节码。其每次运行都要进行转换成字节码,然后再由虚拟机把字节码转换成机器语言,最后才能在硬件上运行,与编译性语言相比,其过程更复杂,性能肯定会受影响。3.Python中一切都是对象Python是一门面向对象的编程语言,其设计理念是一切皆是对象,如数字、字符串、元组、列表、字典、函数、方法、类、模块等都是对象,包括代码,每个对象都需要维护引用计数,因此,增加了额外工作,影响了性能。4.Python GILGIL是Python最为诟病的一点,因为GIL,Python中的多线程并不能真正的并发,即使在单线程,GIL也会带来很大的性能影响,因为python每执行100个opcode就会尝试线程的切换,因此,影响Python运行效率。5.垃圾回收Python采用标记和分代的垃圾回收策略,每次垃圾回收的时候都会中断正在执行的程序,造成所谓的顿卡,影响运行效率。
2023-07-24 03:05:111

文明之光的内容简介

作者凭借难得的史料厚度和知识底蕴,常能道出超越同侪的见识,由科学家向作家成功转型,带领读者了解文明的过去,知晓现在的文明,猜测明天的世界。 在内容的安排上,本书基本上是按照时间顺序来组织的。第一册讲述从人类文明开始到近代大航海共八个专题;第二册讲述了从近代科学兴起到原子能的应用的另外八个专题。谈到本书的主旨,吴军博士在前言中说,人总是要有些理想和信仰。即使今天不完美,将来终究会变得美好,而实现这一切则是要依靠文明的力量。希望广大读者能从吴军博士著书立说的本意,看看一位计算机科学家兼工程师写的文明故事,相信一定会有新的收获。据悉,6月25日吴军博士将专程从美国来京参加新书《文明之光》的发布仪式,并在随后几天的时间里马不停蹄地参加若干场新书分享、交流活动,其中包括在北京大学、清华大学与高校学子、教师交流分享的两场讲座,以及分别由正略钧策、InfoQ举办的两场产业界人士沟通分享会。 本书获得“2014中国好书”荣誉。
2023-07-24 03:05:181

新互联网网站用Java还靠谱么?对比Php,Python,Ruby的话

本文从RoR对Ruby的影响、Ruby的优势等多个角度分析了Ruby比Python成功的原因。 伴随着RoR的风行,Ruby语言受到越来越多的开发者的关注,同为脚本语言,Python的地位却略显尴尬,什么样的原因,造成了这样的局面? 笔者认为有以下几个方面: 一、 RoR的推波助澜 笔者认为,Ruby的成功,很大一部分是由于RoR的带动。 几年前,如果你没听过RoR倒是情有可原,但如果今天,RoR对你来说,还是一个陌生词汇的话,那你就有点危险了。:) 什么是RoR呢? 全称,Ruby on Rails,简称,RoR或者Rails。 它是个全栈的(full-stack)web应用框架,它为开发者提供了构建一个web应用所需的完整基础结构,并且严格按照MVC(模型-视图-控制器)架构进行开发。 RoR致力于提高开发者的开发效率,希望通过尽量少的代码,完成尽可能多的功能。基于这样的考虑,RoR有两大设计原则,一是,不要重复自己 (Don""t Repeat Yourself);二是,惯例优于配置(Convention Over Configuration)。 使用RoR,你甚至可以通过简单的几条命令行、几行代码,就完成一个功能强大的web应用程序,这极大地提高了开发者的开发效率。 2004年7月,RoR一经发布,在短期内,便受到很多开发者的追捧。时至今日,RoR已经被全世界的开发者们所关注,它带给开发者的效率提升,是前所未有的;它带给业界关于软件开发的思考,也是意义深远的。 在RoR如此风行的大背景下,Ruby on Rails,这个需要使用Ruby进行开发的web框架,也自然地带动了Ruby语言的发展。 在下面的“Ruby语言受关注程度趋势图”上,可以清晰地看出,Ruby语言在RoR发布也就是2004年7月后,进入了高速发展期。Ruby因为有了RoR这样的“杀手级”应用,变得春风得意,那么Python呢? 在《浅谈Python语言》一文中,我们提到了Python具有丰富的API库,在web开发方面,也有Django、Turbogears这样的一些框架,就运行速度而言,Python比Ruby快;就社区而言,Python也比Ruby成熟,可是为什么Python没有产生一个像RoR这样的“杀手级”应用呢? Python语言的创始人Guido在接受InfoQ采访时,是这样解释的: “我不喜欢KillerApplication,因为那会让多数人或者社区将精力集中于一个地方。Python是一个应用广泛的语言,基于Python已经产生了很多好用的Web框架,比如Django等。但是Python不KillerApplication,至少目前是这样,而且我相信随着Python社区的发展,会有很多KillerApplications自然出现。我喜欢多样化的应用。” 通过这个观点,我们可以看出Python在其发展道路上,追求的是一种均衡,一种“大而全”。 “会有很多Killer Applications自然出现”,这点,我想我们需要拭目以待。单就“均衡”而言,笔者认为这很危险,作为一门脚本语言,试图做Java之类传统语言做的事情,不太可取。 以Java为例,在web应用上,有太多的框架可供选择,不错,“在不同的场景用不同的框架”,这想法很好。可是,在实际应用中,有多少开发者可以根据项目特点,正确、合理地选择框架? 与其到最后,用户还不知道该如何选择,还不如一开始就替用户做出一个选择。 作为Python的使用者,我更愿看到有个Python的“杀手级”应用出现,进而带动Python更快速地发展。 你可以说RoR成就了Ruby,可是Rails为什么偏偏选择了Ruby?!Ruby优势何在? 二、 Ruby的优势 1. 比Perl更强大,比Python更面向对象 “比Perl更强大,比Python更面向对象”,这是Ruby创始人Matz设计Ruby的初衷。 Python既支持面向过程的编程也支持面向对象的编程,而Ruby则是完全面向对象。 在Ruby中,任何东西都是对象,包括Python中的基本数据类型;每个过程或函数都是方法。 例如,取-3的绝对值,在Python中,是这样的:abs(-3)。 而在Ruby中,则是这样的:-3.abs。这种OO的方式,显得更加直观。 2. 强大的语法功能 单就语法的简单性而言,Ruby不及Python。但解决一些较复杂的问题,Ruby强大的语法功能,有助于降低问题的复杂度。 例如: Ruby以“块”的方式来实现列表内的条件、循环语句,比Python的更灵活、更具通用性。 Ruby具有类似Lisp的彻底的函数方式的条件、循环语句等。 Ruby的迭代器功能可以将流程控制结构抽象化。 3. 强大的字符串处理、正则表达式功能 Matz认为:Ruby > (Smalltalk + Perl) / 2。 Ruby类库是对Perl语言功能的面向对象方式的重组,因为借鉴了很多Perl的东西,使得字符串处理、正则表达式这块,Ruby同样强大。 4. 不会僵住的“胶水语言” 同样是“胶水语言”,Ruby比Python更灵活。 使用过一段时间的Python,你会发现,Python比较依赖第三方的东西。相比较,Ruby则更依赖自身。例如,Ruby可以使用(UNIX的)绝大部分的系统调用,单独使用Ruby也可以进行系统编程等。 有优势,Ruby就一定可以成功了?Python同样也有很多优势!对,还得看当时所处的环境。 三、 时势造英雄 这点还得回到RoR的崛起。 Ruby,1995年12月正式发布,2000年进入美国;2004年7月,RoR正式发布。 RoR的出现时间,值得玩味。 在下面的“Java语言受关注程度趋势图”上,可以看到,2004年7月前后,Java处于一个相对“衰退期”。提到Java,大家应该都会想到J2EE。 J2EE应用程序的广泛实现是从1999、2000年开始的,它的出现带来了诸如事务管理之类的核心中间层概念的标准化,但是因其开发效率、学习难度和实 际性能的问题,在实践中没有获得完全的成功。作为J2EE核心技术的EJB(2.x),更是因其高昂的学习代价、极低的开发效率和极高的资源消耗,备受指 责。 在这样一个大背景下,2003年,Spring框架诞生了。 Spring的设计思想在于“使J2EE开发更加简单”。这个设计思想,在包括Java领域在内的众多软件开发领域引起了广泛关注。软件开发者们开始思考,如何让开发向着一个更简单的方向发展。 RoR在这一时期出现,无疑是顺应了这样一个潮流。 可以这么说,是历史选择了RoR,当然也选择了Ruby。 遇到合适的机遇,还不够,俗话说得好:“众人拾柴火焰高”。 四、 众星捧月 Ruby的出现,受到了两大主流平台Java和.NET的极力追捧。 2006年9月,SUN雇佣了JRuby的主要开发者Charles Nutter和Thomas Enebo;一年不到,2007年6月14号,JRuby 1.0正式发布。SUN在其Java IDE NetBeans 6.0 M10中,更是集成了对Ruby/JRuby的支持。反观Python的Java实现——Jython,则没有这么幸运,发展至今,它并没有得到SUN的 支持。 而Microsoft,也在2007年7月,推出了Ruby的.NET实现——IronRuby的预览版。 相信SUN和Microsoft对Ruby的竞相推崇,必然推动Ruby的进一步发展。 基于以上几点,笔者认为Ruby的成功不是偶然,并且相信这样的成功还会持续下去。对于Python的未来,我们也将拭目以待。
2023-07-24 03:05:581

敏捷开发模式用的测试是什么模型

【编者按】敏捷的理念已经深入人心,开发过程已经渐入佳境,测试的处境却稍显尴尬。测试从业者应该何去何从,怎样才能拥抱敏捷,体现出自己新的价值呢?InfoQ特地邀请了来自Google的敏捷测试专家段念,为读者答疑解惑,希望所有测试从业者可以从中得到自己的答案。更多关于敏捷测试的内容,请访问InfoQ中文站敏捷测试相关内容。在与不少测试从业人员讨论到敏捷的时候,被问得最多的大约是两个问题:到底?,敏捷软件开发还需要测试工程师吗?。前一个问题是对于敏捷测试本身定义的疑问,第二个问题则是对敏捷开发将测试工程师排除在外的担心。其实,在探寻这两个问题答案的过程中,我们可以更清晰的了解敏捷软件开发中测试的工作定义,测试价值观,以及敏捷开发中开发与测试工程师的配合。鉴于这两个问题的意义,在本敏捷测试专栏的第一篇文章中,本人尝试从自己的实践出发,尽可能清楚的回答这两个问题。确实,相对于敏捷开发红遍大江南北的状况而言,对敏捷测试的讨论则低调得多。敏捷联盟定义了敏捷的4个价值声明,以及伴随的12条支持原则,这12条原则中没有一条单独提到测试。这是不是意味着测试在敏捷开发中并不重要呢?实际上,如果仔细研读敏捷的12个原则,以及各种不同的敏捷实践,就会发现,测试在敏捷开发中占有非常重要的地位。无论是原则中的频繁交付,还是对可工作的软件的度量,或是敏捷开发实践中的测试驱动开发,行为驱动开发,都离不开测试的支持。在本人看来,敏捷开发中不把测试单独拿出来描述的原因,恰恰是因为在敏捷开发中,测试不再是一个单独的、和开发独立的过程,而是变成了驱动开发、衡量产出的主要的手段,成为了敏捷开发中所有工程师在工作时必须时刻考虑和实践的一个部分。简而言之,敏捷软件测试更多的是一种理念,而非过程。既然是这样,为什么我们还要在这个专栏中专门来讨论敏捷软件测试?本人接触过不少软件开发和测试工程师,他们所处的组织有的正在努力向敏捷开发转型,有的已经实践了一段实践的敏捷开发,但由于由来已久的工作习惯,他们中的绝大多数并不能自觉的认识到测试在敏捷开发中的关键作用,而是有意无意的将测试仍然看作是与开发截然分开的下一个阶段,导致在实践敏捷开发的过程中遇到种种问题:要么是忽略了代码质量,导致在频繁的迭代过程中,每一个迭代的问题层出不穷;或是沿用原有的方法安排对系统的系统测试,导致测试团队疲于奔命,却总也赶不上开发所要求的进度。在这种情况下,专门来讨论敏捷软件开发中的测试,也就是敏捷软件测试的话题,对这些工程师应该会有一些帮助。那么,到底?很难给敏捷测试下一个精确、完善的定义,在本人看来,接纳了敏捷的核心价值观(沟通,简单,反馈,勇气,尊重),在敏捷软件开发过程中开展的测试就可以被称作是敏捷软件测试。因此,敏捷软件测试并不是一个与敏捷软件开发同一层次的划分,而是敏捷软件开发中的一部分,与传统的测试不同,敏捷软件测试并不是一个独立的过程,相反,它与整个敏捷开发中的其他活动交织在一起,处处都能看到它的影子。由于敏捷软件测试并不倾向于一个单独的过程定义,本人拟从敏捷软件测试与传统测试观点的比较、敏捷软件测试中采用的方法、测试工程师在敏捷软件测试过程中的工作等方面来阐述之。在这篇文章中,我们主要从宏观的角度来描述敏捷软件测试,而在本专栏的后续文章中,我们将对敏捷软件测试中采用的方法、工程师在敏捷软件测试中的工作内容等进行进一步的描述。使用Dashboard、燃尽图等方式展示当前工作与可交付产品之间的距离建立单元测试覆盖率等度量指标共享质量目标意味着质量责任由所有工程师共同承担开发测试应该建立一定的测试覆盖率标准,例如,在单元测试这个级别上,建立60%或80%的覆盖率要求通过使用TDD、BDD等技术,保证产品和代码的可测试性建立足够多的自动化测试,保证测试能够满足快速迭代的要求检查表提到了团队、反馈、质量文化和开发测试四个方面的内容,在本人看来,这四个方面体现的就是敏捷软件测试与传统软件测试的最大的不同。传统软件测试关注的是通过尽可能完备的覆盖去发现尽可能多的问题,把测试和开发当成是两个独立的过程,测试是对开发阶段产生成果的验证。而敏捷软件测试则建立了一种不同的质量文化:测试的目的是为了保证产品快速发布,也就是对生产率本身的提高。基于验证的出发点必然会要求测试与开发的独立,以及尽可能客观和完备的度量产品质量;而基于生产率的出发点则要求建立敏捷的团队,要求测试与开发尽可能紧密,要求建立具有高度可测试性的软件,以及基于这些的高度自动化测试。在检查表列出的所有项目中,质量文化是基础,团队是敏捷软件测试得以实施的条件,反馈和开发测试则是敏捷软件测试的具体方法。当然,你可以可以从敏捷的核心价值观来阶段这些项目:团队关注的是沟通与尊重;反馈直接对应于反馈;质量文化基于勇气(承担质量责任的勇气)与尊重;而开发测试则是反馈与简单的具体体现。另一个在本文最初提出来的问题是:敏捷软件开发还需要测试工程师吗?,对这个问题,业界有不同的观点。有人认为需要,因为总有一些是需要测试工程师的技能完成的工作;当然,也有人认为不需要,因为敏捷开发中的测试注重开发测试与自动化测试,开发工程师就可以自己搞定与测试相关的工作。在实践中,那些大规模实践敏捷开发的公司(例如Google),倾向于在组织中设置数量较少的测试工程师,在项目中分配较少的测试资源,甚至对某些项目,完全不使用测试工程师。就我的个人实践经验,对大部分的项目,尤其是为明确的客户开发的项目,需要在敏捷开发团队中设置专职的测试工程师,因为:测试与开发具有不同的思维方式:测试更注重全面的验证和检查一个系统,而开发工程师往往很难在大的范围内建立这样的思维方式。因此,无论是从系统的层面验证产品,或是从应用系统的角度发现值得测试和验证的点(access point),专职的测试工程师都更有效。专职的测试工程师能够更关注于测试基础,建立测试需要的基础架构:由于测试工程师具有更好的对测试的理解,通常他们能够更多的考虑测试的需求而开发适合项目的测试基础架构(自动化测试框架),而开发工程师可以使用这些框架来建立面向功能或代码的测试。但是,不得不说的是,敏捷开发对开发和测试工程师都提出了更要的要求,尤其是对测试工程师而言,传统的只能精确模拟用户操作的测试工程师,因为不能为产品带来生产率的提升,在敏捷开发的团队中,很难有所作为。在本专栏的后续文章中,我们会进一步讨论测试工程师在敏捷软件开发中的工作和任务。关于作者段念:Google中国高级测试经理,毕业于华中科技大学,先后在通讯、嵌入式软件、互联网等多个行业的国内外知名公司中从事软件开发与测试工作。对软件测试中的技术和管理工作有独到见解,对软件测试团队管理、自动化测试、性能测试与开发测试有较多研究。
2023-07-24 03:06:081

unity3d引擎是用什么语言写的

底层的东西尤其是对执行效率有要求的,一般只能用C++开发,你可以用petotal之类软件检查一下它的dll就知道了。
2023-07-24 03:06:172

在jquery中想要实现通过运程hettp get请求载入信息功能的是下面哪个事件

jQuery是dom驱动,AngularJS是数据驱动,这里有一篇文章阐述的非常好,建议看看本文来自StackOverFlow上How do I “think in AngularJS” if I have a jQuery background?一题中得票最高的回答。该回答得票超过3000次,回答者Josh David Miller是活跃于开源社区的开发者,也是Emergenesis公司的联合创始人。该答案最初由数云架构师韩铮翻译并发布在自己的博客上,在征得Josh同意后由韩铮本人推荐给 InfoQ进行分享,并在经过InfoQ社区编辑崔康审校后发布在此。1. 不要先设计页面,然后再使用DOM操作来改变它的展现在jQuery中,你通常会设计一个页面,然后再给它动态效果。这是因为jQuery的设计就是为了扩充DOM并在这个简单的前提下疯狂的生长的。但是在AngularJS里,必须从头开始就在头脑中思考架构。必须从你想要完成的功能开始,然后设计应用程序,最后来设计视图,而非“我有这么一个DOM片段,我想让他可以实现XXX效果”。2. 不要用AngularJS来加强jQuery类似的,不要以这样的思维开始:用jQuery来做X,Y和Z,然后只需要把AngularJS的models和controllers加在这上面。这在刚开始的时候显得非常诱人,这也是为什么我总是建议AngularJS的新手完全不使用jQuery,至少不要在习惯使用“Angular Way”开发之前这么做。我在邮件列表里看到很多开发者使用150或200行代码的jQuery插件创造出这些复杂的解决方案,然后使用一堆callback函数以及$apply把它粘合到AngularJS里,看起来复杂难懂;但是他们最终还是把它搞定了!问题是在大多数情况下这些jQuery插件可以使用很少的AngularJS代码重写,而且所有的一切都很简单直接容易理解。这里的底线是:当你选择解决方案时,首先“think in AngularJS”;如果想不出一个解决方案,去社区求助;如果还是没有简单的解决方案,再考虑使用jQuery。但是不要让jQuery成为你的拐杖,导致你永远无法真正掌握AngularJS。3. 总是以架构的角度思考首先要知道Single-page应用是应用,不是网页。所以我们除了像一个客户端开发者般思考外,还需要像一个服务器端开发者一样思考。我们必须考虑如何把我们的应用分割成独立的,可扩展且可测试的组件。那么如何做到呢?如何“think in AngularJS”?这里有一些基本原则,对比jQuery。视图是“Official Record”在jQuery里,我们编程改变视图。我们会将一个下拉菜单定义为一个ul :<ul class="main-menu"> <li class="active"> <a href="#/home">Home</a> </li> <li> <a href="#/menu1">Menu 1</a> <ul> <li><a href="#/sm1">Submenu 1</a></li> <li><a href="#/sm2">Submenu 2</a></li> <li><a href="#/sm3">Submenu 3</a></li> </ul> </li> <li> <a href="#/home">Menu 2</a> </li></ul>在jQuery里,我们会在应用逻辑里这样启用这个下拉菜单:$(".main-menu").dropdownMenu();当我们只关注视图,这里不会立即明显的体现出任何(业务)功能。对于小型应用,这没什么不妥。但是在规模较大的应用中,事情就会变得难以理解且难以维护。而在AngularJS里,视图是基于视图的功能。ul声明就会像这样:<ul class="main-menu" dropdown-menu> ... </ul>这两种方式做了同样的东西,但是在AngularJS的版本里任何人看到这个模版都可以知道将会发生什么事。不论何时一个新成员加入开发团队,他看到这个就会知道有一个叫做dropdownMenu的directive作用在这个标签上;他不需要靠直觉去猜测代码的功能或者去看任何代码。视图本身告诉我们会发生什么事。清晰多了。首次接触AngularJS的开发者通常会问这样一个问题:如何找到所有的某类元素然后给它们加上一个directive。但当我们告诉他:别这么做时,他总会显得非常的惊愕。而不这么做的原因是这是一种半jQuery半AngularJS的方式,这么做不好。这里的问题在于开发者尝试在 AngularJS的环境里“do jQuery”。这么做总会有一些问题。视图是official record(译者注:作者可能想表达视图是一等公民)。在一个directive外,绝不要改变DOM。所有的directive都应用在试图上,意图非常清晰。记住:不要设计,然后写标签。你需要架构,然后设计。数据绑定这是到现在为止最酷的AngularJS特性。这个特性使得前面提到的很多DOM操作都显得不再需要。AngularJS会自动更新视图,所以你自己不用这么做!在jQuery里,我们响应事件然后更新内容,就像这样:$.ajax({ url: "/myEndpoint.json", success: function ( data, status ) { $("ul#log").append("<li>Data Received!</li>"); } });对应的视图:<ul class="messages" id="log"> </ul>除了要考虑多个方面,我们也会遇到前面视图中的问题。但是更重要的是,需要手动引用并更新一个DOM节点。如果我们想要删除一个log条目,也需要针对DOM编码。那么如何脱离DOM来测试这个逻辑?如果想要改变展现形式怎么办?这有一点凌乱琐碎。但是在AngularJS里,可以这样来实现:$http("/myEndpoint.json").then(function (response) { $scope.log.push({ msg: "Data Received!" });});视图看起来是这个样子的:<ul class="messages"> <li ng-repeat="entry in log"></li> </ul>但是其实还可以这样来做:<div class="messages"> <div class="alert" ng-repeat="entry in log"> </div> </div>现在如果我们想使用Bootstrap的alert boxes,而不是一个无序列表,根本不需要改变任何的controller代码!更重要的是,不论log在何处或如何被更新,视图便会随之更新。自动的。巧妙!尽管我没有在这里展示,数据绑定其实是双向的。所以这些log信息在视图里也可以是可编辑的。只需要这么做:<input ng-model="entry.msg" />。简单快乐。清晰的模型(Model)层在jQuery里,DOM在一定程度上扮演了模型的角色。但在AngularJS中,我们有一个独立的模型层可以灵活的管理。完全与视图独立。这有助于上述的数据绑定,维护了关注点的分离(独立的考虑视图和模型),并且引入了更好的可测性。后面还会提到这点。关注点分离上面所有的内容都与这个愿景相关:保持你的关注点分离。视图负责展现将要发生的事情;模型表现数据;有一个service层来实现可复用的任务;在 directive里面进行DOM操作和扩展;使用controller来把上面的东西粘合起来。这在其他的答案里也有叙述,我在这里只增加关于可测试性的内容,在后面的一个段落里详述。依赖注入依赖注入帮我们实现了关注点分离。如果你来自一个服务器语言(java或php),可能对这个概念已经非常熟悉,但是如果你是一个来自jQuery的客户端开发者,这个概念可能看起来有点傻而多余。但其实不是的。。。大体来讲,DI意味着可以非常自由的声明组件,然后在另一个组件里,只需要请求一个该组件的实例,就可以得到它。不需要知道(关心)加载顺序,或者文件位置,或类似的事情。这种强大可能不会立刻显现,但是我只提供一个(常见。。)的例子:测试。就说在你的应用里,我们需要一个服务通过REST API来实现服务器端存储,并且根据不同的应用状态,也有可能使用(客户端)本地存储。当我们运行controller的测试时,不希望必须和服务器交互 —— 毕竟是在测试controller逻辑。我们可以只添加一个与本来使用的service同名的mock service,injector会确保controller自动得到假的那个service —— controller不会也不需要知道有什么不同。说起测试……4. 总是 —— 测试驱动开发这其实是关于架构的第3节。但是它太重要了,所以我把它单独拿出来作为一个顶级段落。在所有那些你见过,用过或写过的jQuery插件中,有多少是有测试集的?不多,因为jQuery经不起测试的考验。但是AngularJS可以。在jQuery中,唯一的测试方式通常是独立地创建附带sample/demo页面的组件,然后我们的测试在这个页面上做DOM操作。所以我们必须独立的开发一个组件,然后集成到应用里。多不方便!在使用jQuery开发时,太多的时间,我们挑选迭代而非测试驱动开发。谁又能责怪我们呢?但是因为有了关注点分离,我们可以在AngularJS中迭代地做测试驱动开发!例如,想要一个超级简单的directive来展现我们的当前路径。可以在视图里声明:<a href="/hello" when-active>Hello</a>OK,现在可以写一个测试:it("should add "active" when the route changes", inject(function () { var elm = $compile("<a href="/hello" when-active>Hello</a>")($scope); $location.path("/not-matching"); expect(elm.hasClass("active")).toBeFalsey(); $location.path("/hello"); expect(elm.hasClass("active")).toBeTruthy();}));执行这个测试来确认它是失败的。然后我们可以开始写这个directive了:.directive("whenActive", function ($location) { return { scope: true, link: function (scope, element, attrs) { scope.$on("$routeChangeSuccess", function () { if ($location.path() == element.attr("href")) { element.addClass("active"); } else { element.removeClass("active"); } }); } };});测试现在通过了,然后我们的menu按照请求的方式执行。开发过程既是迭代的也是测试驱动的。太酷了。5. 概念上,Directives并不是打包的jQuery你经常会听到“只在directive里做DOM操作”。这是必需的。请给它应有的尊重!但让我们再深入一点……一些directive仅仅装饰了视图中已经存在的东西(想想ngClass)并且因此有时候仅仅直接做完DOM操作然后就完事了。但是如果一个 directive像一个“widget”并且有一个模版,那么它也要做到关注点分离。也就是说,模版本身也应该很大程度上与其link和 controller实现保持独立。AngularJS拥有一整套工具使这个过程非常简单;有了ngClass我们可以动态地更新class;ngBind使得我们可以做双向数据绑定。ngShow和ngHide可编程地展示和隐藏一个元素;以及更多地 —— 包括那些我们自己写的。换句话说,我们可以做到任何DOM操作能实现的特性。DOM操作越少,directive就越容易测试,也越容易给它们添加样式,在未来也越容易拥抱变化,并且更加的可复用和发布。我见过很多AngularJS新手,把一堆jQuery扔到directive里。换句话说,他们认为“因为不能在controller里做DOM操作,就把那些代码弄到directive里好了”。虽然这么做确实好一些,但是依然是错误的。回想一下我们在第3节里写的那个logger。即使要把它放在一个directive里,我们依然希望用“Angular Way”来做。它依然没有任何DOM操作!有很多时候DOM操作是必要的,但其实比你想的要少得多!在应用里的任何地方做DOM操作之前,问问你自己是不是真的需要这么做。有可能有更好的方式。这里有一个示例,展示出了我见过最多的一种模式。我们想做一个可以toggle的按钮。(注意:这个例子有一点牵强、啰嗦,这是为了表达出使用同样方式处理问题的更复杂的情况。).directive("myDirective", function () { return { template: "<a class="btn">Toggle me!</a>", link: function (scope, element, attrs) { var on = false; $(element).click(function () { if (on) { $(element).removeClass("active"); } else { $(element).addClass("active"); } on = !on; }); } };});这里有一些错误的地方。首先,jQeury根本没必要出现。我们在这里做的事情都根本用不着jQuery!其次,即使已经将jQuery用在了页面上,也没有理由用在这里。第三,即使假设这个directive依赖jQuery来工作,jqLite(angular.element)在加载后总会使用jQuery!所以我们没必要使用$ —— 用angular.element就够了。第四,和第三条紧密关联,jqLite元素不需要被$封装 —— 传到link里的元素本来就会是一个jQuery元素!第五,我们在前面段落中说过,为什么要把模版的东西混到逻辑里?这个directive可以(即使是更复杂的情况下!)写得更简单:.directive("myDirective", function () { return { scope: true, template: "<a class="btn" ng-class="{active: on}" ng-click="toggle()">Toggle me!</a>", link: function (scope, element, attrs) { scope.on = false; scope.toggle = function () { scope.on = !$scope.on; }; } };});再一次地,模版就在模版里,当有样式需求时,你(或你的用户)可以轻松的换掉它,不用去碰逻辑。重用性 —— boom!当然还有其他的好处,像测试 —— 很简单!不论模版中有什么,directive的内部API从来不会被碰到,所以重构也很容易。可以不碰directive就做到任意改变模版。不论你怎么改,测试总是通过的。所以如果directive不仅仅是一组类似jQuery的函数,那他们是什么?Directive实际是HTML的扩展。如果HTML没有做你需要它做的事情,你就写一个directive来实现,然后就像使用HTML一样使用它。换句话说,如果AngularJS库没有做的一些事情,想想开发团队会如何完成它来配合ngClick,ngClass等。总结不要用jQuery。连include也不要。它会让你停滞不前。如果遇到一个你认为已经知道如何使用jQuery来解决的问题,在使用$之前,试试想想如何在AngularJS的限制下解决它。如果你不知道,问!20次中的19次,最好的方式不需要jQuery。如果尝试使用jQuery会增加你的工作量。这是我目前最长的Stack Overflow回答。事实上,这个答案太长了,我都要填一个Captcha了。但是就如我常说的:能说多时候说的少其实就是懒。希望这个答案对你有用。
2023-07-24 03:06:251