首页 文章 精选 留言 我的

精选列表

搜索[最权威安装],共10000篇文章
优秀的个人博客,低调大师

ALink协议是简单的通信协议

物联网全栈教程-从云端到设备(六) 关注零妖的微信公众号,获取第一手物联网的技术干货:LINGYAOIOT 一 物联网项目在开发初期,需要云端和设备端两个工种的工程师一起谈谈实现的技术细节。有一个叫作ALink协议的语言,成功解决了两个物种之间交流困难的世纪难题! ALink协议是针对物联网开发领域设计的一种数据交换规范。设备端按照这个简单的规范把数据组织一下发送给云端,云端工程师也懂这个简单的规范,可以直接拿这个数据进行处理。同时还解决了调试困难的痛点:云端工程师使用一个叫做MQTT客户端的电脑工具,就可以发送符合ALink协议的测试数据调试云端产品的代码;设备端工程师就可以在给单片机写代码的时候直接组织一个符合ALink协议的测试数据,从而不用依赖云端下发。 二 物联网将物理世界的万物接入网络并通过整合各类服务实现智能化。“物”(T

优秀的个人博客,低调大师

史上详细!阿里云办公快速上手教程

钉钉,是一款免费沟通和协同的多端平台,上线以来,已有超过 300万企业组织正在使用,阿里云市场作为国内知名的软件服务交易平台,为解决企业通讯,销售管理以及协同办公等需求,阿里云面向中小企业推出一款企业办公套件——" 阿里云办公"。 下面我们主要从阿里云办公的 套件组成,功能及应用场景,使用建议3方面做分析介绍。 阿里云办公介绍 阿里云办公:是阿里云为企业用户打造的一款基于“钉钉”的移动办公平台,可以一站式提供企业即时通讯、协同办公和销售管理的办公套件,用户可随意搭配企业邮箱、OA、CRM、等多种应用组件以满足不同业务场景的个性化办公需求。随着智能手机改变人们的习惯,以及移动应用的普及,办公可不再局限在办公室。 阿里云办公,属于钉钉上第三方应用,同时支持PC端和手机端,主要包含了 OA(考勤打卡,流程管理,流程审批)、CRM,可以结合钉钉的自带的

优秀的个人博客,低调大师

React Native-目前火的前端技术

做为一名产品经理,你是否遇到过这样的窘境,“帮我把字体调成 16号呗,颜色变成 #FFFF00FF,老大说这里最好改一下”,作为一名 app 的开发只能无奈但心里窃喜的告诉你,“只能等下个版本了,必须要重新发布才能改”,如果你问为什么不能改了就生效啊,那说明你对技术的理解要么真的很差,要么你就是知道这项 React-Native 新技术所爆发出来的力量。 React Native 是 Facebook 推出的一个用 JavaScript 语言就能同时编写 ios,android,以及后台的一项技术,今年9月 发布了 android 版本,又在程序员里面掀起了一波小高潮,不断有喜欢尝鲜的程序员投入到这个领域。 用大白话说,就是从此一名程序员自己就可以创业了,他只用这一门技术,就可以同时写出 androidapp,ios app,以及后台应用程序,并且,请注意这里,它可以做到实时热更新(就像网页一样,改了一个字体,随时可上线),app 也能做到随时都能更新了,第一段讲的那个需求可以分分钟秒杀解决,不用新发版本,只需在服务器改动一下代码即可,是不是很牛逼,是不是很牛逼,是不是很牛逼,真的很牛逼。 到这里,你只需要理解一句话,就是 Facebook 提供了一套解决方案,它利用 JavaScript 作为开发语言,可以同时来编写前端,移动终端,后台应用程序。 我们再来讲讲,为什么 React Native 受到了如此大的关注,以及它的优越性到底在什么地方。 目前,一个成熟的互联网产品基本囊括了:移动终端和网页两种主要形态。在移动终端 app 和网页的开发历程中,涉及了很多技术角色:前端开发(俗名叫做网站的),移动终端开发(android 和 ios 开发,现在满大街都是),后台开发(他们的程序大多没有界面,主要是为网页和 app 提供数据和保障服务的稳定性),每个角色各司其职,分别需要不同的技能,比如前端开发需要精通 html,css,javascript 这些基本的 web 语言知识。Android 开发用 Java(这个词读 “扎瓦”,别读成了 “加瓦”,读成这样很 Low B 的)语言编写,ios 开发用 Objective-c(把他想象成当年过计算机二级的那个 C 语言就可以了)编写。后台开发,有的公司用 Java,有的公司用 C++,用啥的都有,能满足性能需要就可以了。 已经看崩溃了吧,对于一个非计算机专业的人,根本不会理解他妈的为什么要存在这么多语言,为什么这里要用 C 语言,那里要用 C++,有的地方要用 Python,而又有很大的一个人群对你高呼:“PHP 才是世界最好的语言”。其实他们每种语言都有不同的使用场景,有的语言效率高,有的语言语法更简洁漂亮,有的是专为后台而生,有的是特定场景下的唯一选择。如果你还听不懂,我们就用大白话做个比喻,为什么避孕套有的是螺纹的,有的是颗粒的,有的是延时的,有的是超薄的,还有一个品牌号称一只手就可以打开的,它们也都是依据个人身体状态,以及不同场景分别发挥各自的强项。你随便类比,任何一个领域,都有很多不同的工具来满足不同的场景,是需求决定了当前状态。 现在好了,React 整套解决方案完成了江湖统一,FaceBook 也号称这们技术是 “Learn Once,Write AnyWhere”,学习成本只有一次,却完成了所有开发角色的统一。 这意味着: app 将来都是可像网页一样热更新,随时发布。 对于一名开发人员,将再也没有前端,终端,后台的区分,他所关注的就是做一整套应用程序,人力将得到最大幅度的整合与释放。 代码复用将会是主旋律,因为是一种语言,大家重复造轮子的成本会越来越节省。 目前,React Native 也还是有一些缺点的,比如他的 sdk 组件包 size 还比较大,crash 还比较多,在 ios 上支持的内容已经相当不错,android 还属于初级阶段,但是目前最新的版本也才是 0.16,相信再过一年, 一定会牛逼闪闪。 作者:给产品经理讲技术 来源:51CTO

优秀的个人博客,低调大师

OpenStack并不是便宜的云方案

据分析公司451集团的研究结果,目前部署OpenStack的成本要高于从VMware、Red Hat或微软购买云服务的成本。该公司指出,这主要是因为需要为OpenStack工程师支付更高的工资。 451集团对云计算的成本进行了分析,研究了私有云和公有云通常较为复杂的定价模型。这项调查指出:“……熟练的OpenStack工程师成本高,且这种人才数量有限;相比之下,商业软件供应商提供的解决方案在总体拥有成本(TCO)方面更具有优势。” 该报告还指出,对于一般的小规模的企业部署来说,OpenStack比自助(DIY)的方式更具有TCO优势,但只能节省45%的人力成本。 “找到OpenStack工程师是一件困难,且成本昂贵的事情,这正在影响目前的云采购决策,”451 Research集团资深分析师Owen Rogers博士说道。“商用产品、OpenStack部署和管理服务各自拥有自己的长处和短处,但重要的是它们的功能特点、企业部署的准备情况、以及确保部署系统可运营性的专家的可获得性。买方需要从长期的战略角度权衡所有这些方面以及TCO ,并确保采取最佳行动路线,以满足他们的需求。 “决策还需要考虑在价格上涨、支持力度下降、以及功能特性移除后,锁定某个供应商所带来的风险,”Rogers 补充道。“随着OpenStack日益成熟,以及工程技术人员供给的增加,购买者有望看到部署OpenStack的总体拥有成本得到改善。” OpenStack理念有什么创新? 这并不是新的理念,问题核心很可能是对OpenStack是什么,以及它可以干什么的认识,而不是专注于它的“弱点”。 OpenStack先驱Randy Bias在其博文中解释道:“目前,OpenStack最大的一个失败是在期望值设定方面。OpenStack新的潜在用户和客户在接触到OpenStack的时候,会有以下期望: 统一的大型云操作系统(如Linux); 拥有一套实现较好整合,且可交互操作的组件; 与他们自己选择的硬件、软件和共有云供应商实现较好的交互操作 不幸的是,以上这些期待都不是现实。由于OpenStack永远不会成为统一的云操作系统,人们甚至都不应该有以上任何期待。这个问题可以用我经常从客户听到的一个请求来概括,“我想拥有‘vanilla’OpenStack。事实是,vanilla OpenStack并不存在,并且从来没有存在过,未来也不会存在。” Bias 继续说道:“我试图让一个非常具有挑战性的问题变得实际一点:你如何构建下一代数据中心?我们都相信OpenStack是实现这个目标的基石。不幸的是,OpenStack本身并不是单一的大型交钥匙系统。这是一系列相互关联,然而并非总是相互依赖的项目。这是一系列快速增长的项目,而您自己的企业可能只需要开展所有这些项目的子项目,至少在最初阶段是如此。 这意味着对能够完成什么,以及什么是“白日梦”的问题持有务实的看法。遵循这些准则,你就会到达那里。但是,不管你做什么,不要问vanilla OpenStack的问题。 通往OpenStack的道路,就像通往其他新数据中心架构的道路一样,走得都不轻松。 本文作者:佚名 来源:51CTO

优秀的个人博客,低调大师

Base封装(一)--我的简MVP架构

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/73471270 绪论 最近懒癌症犯了,好久都没写博客了,当然也在做一些东西,也在整理自己一直以来使用的一些技术点,从Retrofit到OkGO,从ListView到RecycleView,从Java到Kotlin….总之一直在尝试新的技术,今天分享一下自己一直所用的MVP,整理完了分享给大家,有不合适或者不正确的地方还希望大家多多指正,共同交流。 对了 打一波广告 我的新的个人博客 http://hankkin.cn/ 好了接下来开始我们的MVP 背景 众所周知 MVP这种架构模式已经出现很久了,大体时间应该是2014年吧,现在网上的关于MVP的文章也很多,各式各样的关于MVP的架构知识都涌现出来,可想而知现在这种架构有多么火,还有目前风头正劲的MVVM,当然我并不觉得我现在写MVP有些晚,因为每个人都有每个人的架构,每个人都可以根据自己的逻辑封装出来自己的架构模式,今天我介绍的便是我自己通过项目总结出来的MVP 什么是MVP MVP知识点 MVP - Model-View-Presenter MVP和MVC的区别仅仅在于P和Control,MVC中View和Model是互通的可以互相通信,在Android中View一般代表着我们的xml进行界面的描述,而对于模型Model部分则大多对应于本地的数据文件或网络获取的数据体,很多情况下我们对这些数据的处理也会在这一层中进行,最后的控制器Controller则当之无愧的是右Activity承担。 而MVP中view通过presenter访问model,大大的减小了耦合性,业务逻辑都交给P处理,通过P访问V层更改UI。MVP模式可以分离显示层与逻辑层,它们之间通过接口进行通信,降低耦合。理想化的MVP模式可以实现同一份逻辑代码搭配不同的显示界面,因为它们之间并不依赖与具体,而是依赖于抽象。这使得Presenter可以运用于任何实现了View逻辑接口的UI,使之具有更广泛的适用性,保证了灵活度。 这里不多介绍MVC了,相信大家都很熟悉 MVP的优缺点 优点: 降低耦合度,实现了M层和V层的完全分离,可以修改V层不影响M层 模块职责划分明显,层次清晰 P层可以复用,一个P可以对应多个V,不需要修改P的逻辑 单元测试更加简单方便 代码灵活度高 缺点: V层和P层交互频繁 代码量多,类变多了 总结 M层负责存储、检索、操纵数据,代表着一类组件或者类,这些组件或类可以向外部提供数据,同时也能从外部获取数据将数据存储起来 V层负责将数据UI呈现给用户。一般的视图UI只包含界面,并不包含界面逻辑,V层收P层控制,在Android中一般是Activity、Fragment、View、ViewGroup。。。 P层作为V层和M层的中间枢纽,处理用户交互的业务逻辑 MVP实现 1.基本实现 我们都知道一般MVP架构一共需要以下四步: 定义一个interface接口XView,对应的Activity,Fragment实现这个interface 编写Molde,里面的业务逻辑主要包括网络请求获取数据,数据库读取等耗时操作,通过M层回调给P层通知V层更新UI 编写Presenter,P层持有V和M的引用,实现P层的回调,并且回调给V层更新 Activity中调用P执行业务逻辑,更新UI 具体代码就不贴了,相信了解过MVP的都会写基本的代码 但是问题也就出来了,由于P层需要和V层进行通信,更新UI时需要持有V层的view对象,那么我们每个P里面一般都用构造去初始化这个View,类多了之后感觉很烦,而View层里的一些常用的方法我们也可以封到base里面,比如loading的显示隐藏,空布局和错误布局的显示… 2.Base封装 1.BaseView package com.hankkin.xlibrary.mvp; import android.view.View; /** * Created by hankkin on 2017/3/29. */ public interface BaseView { /** * 显示loading框 */ void showProgress(); /** * 隐藏loading框 */ void hideProgress(); void toast(CharSequence s); void toast(int id); void toastLong(CharSequence s); void toastLong(int id); /** * 显示空数据布局 */ void showNullLayout(); /** * 隐藏空数据布局 */ void hideNullLayout(); /** * 显示异常布局 * @param listener */ void showErrorLayout(View.OnClickListener listener); void hideErrorLayout(); } 2.BasePresenter package com.hankkin.xlibrary.mvp; /** * Created by hankkin on 2017/3/29. */ public abstract class BasePresent<T>{ public T view; public void attach(T view){ this.view = view; } public void detach(){ this.view = null; } } 我们在BasePresenter里面去初始化View对象,同时提供释放View对象以防止内存溢出 3.MvpActivity package com.hankkin.hlibrary.base; import android.os.Bundle; import android.support.annotation.Nullable; import com.lzy.okgo.OkGo; /** * Created by hankkin on 2017/3/29. */ public abstract class MvpActivity<V,P extends BasePresent<V>> extends BaseAcitvity{ protected P presenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); presenter = initPresenter(); } @Override protected void onResume() { super.onResume(); presenter.attach((V) this); } @Override protected void onDestroy() { presenter.detach(); OkGo.getInstance().cancelTag(this); super.onDestroy(); } public abstract P initPresenter(); } 这样我们在Activity中初始化P,并且连接V,在onDestroy()生命周期中释放P中引用的V。 Example 我们按照功能模块来构造我们的MVP,可能大家注意到了没有M层啊,是的,这里我把M层舍弃掉了,把业务逻辑、网络请求直接放在了P层,大大减少了类的数量,这样我们每个功能模块只需要新建一个View和一个Presenter就可以满足了,特殊的需求再通过特殊方法来处理,下面我们举一个简单的例子: 网络请求我用的 jeasonlzy 大神的OKGo3,刚出锅没几天,尝试一下,个人认为封装的非常非常好,继承了Rx,Retrofit,相信你会喜欢的。 https://github.com/jeasonlzy/okhttp-OkGo 好了下面看我们的例子吧: 项目结构 看一下项目结构 HomeView 我用的Gank.io里面的一个接口获取数据,首先我们定义我们的HomeView,里面有两个方法获取数据成功和获取失败 package com.hankkin.mvpdemo.home; import com.hankkin.hlibrary.BaseView; /** * Created by hankkin on 2017/6/19. */ public interface HomeView extends BaseView{ void getDataHttp(String data); void getDataHttpFail(String msg); } HomePresenter 然后我们定义HomePresenter,里面只有我们的网络请求,因为我们的BasePresenter持有View对象,所以在回调中直接调用HomeView的两个成功失败的方法 package com.hankkin.mvpdemo.home; import com.hankkin.hlibrary.BasePresent; import com.lzy.okgo.OkGo; import com.lzy.okgo.callback.StringCallback; import com.lzy.okgo.model.Response; /** * Created by hankkin on 2017/6/19. */ public class HomePresenter extends BasePresent<HomeView> { public void getGankData(){ OkGo.<String>get("http://gank.io/api/data/Android/10/1") .tag(this) .execute(new StringCallback() { @Override public void onSuccess(Response<String> response) { view.getDataHttp(response.body()); } @Override public void onError(Response<String> response) { super.onError(response); view.getDataHttpFail(response.message()); } }); } } Activity 最后看一下Activity,我们的Activity继承了MVPActivity并实现了HomeView,同时将泛型对象设为我们的HomeView和HomePresenter,这样我们就可以直接调用P层的网络请求方法,同时也能回调更新UI package com.hankkin.mvpdemo; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.hankkin.hlibrary.MvpActivity; import com.hankkin.mvpdemo.home.HomePresenter; import com.hankkin.mvpdemo.home.HomeView; import static com.hankkin.mvpdemo.R.id.btn_get; public class MainActivity extends MvpActivity<HomeView,HomePresenter> implements HomeView{ private TextView mTextMessage; private Button btnGet; private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.navigation_home: mTextMessage.setText(R.string.home); return true; case R.id.navigation_dashboard: mTextMessage.setText(R.string.control); return true; case R.id.navigation_notifications: mTextMessage.setText(R.string.notification); return true; } return false; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextMessage = (TextView) findViewById(R.id.message); btnGet = (Button) findViewById(btn_get); BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); btnGet.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showProgress(); presenter.getGankData(); } }); } @Override public HomePresenter initPresenter() { return new HomePresenter(); } @Override public void getDataHttp(String data) { mTextMessage.setText(data); hideProgress(); } @Override public void getDataHttpFail(String msg) { toast(msg); } @Override public void toast(CharSequence s) { toast("获取成功"); } } 结论 对于BaseActivity我在之前的文章里面已经介绍了,还不了解的请看 Android谈谈封装那些事–BaseActivity和BaseFragment(一) Android谈谈封装那些事–BaseActivity和BaseFragment(二) 也已经优化过了相关的封装逻辑,也会在接下来的文章继续介绍的。 下一篇文章我会继续介绍我的封装之路,近期会将我的HLibrary提到我的Github上,大家可以star一下我的Github。 代码已经上传到我的Github https://github.com/Hankkin/MvpDemo 好了是不是很简单呢?小伙伴们如果有啥好的建议或者觉得不妥的地方希望及时指正,共同交流,谢谢。 其实MVP有好多种,这里给大家推荐几个我觉得比较好的 http://www.jianshu.com/p/3a17382d44de# http://www.jianshu.com/p/9a6845b26856 https://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653577546&idx=1&sn=e10be159645a3aa8f6d6f209420fb412&scene=23&srcid=0803PcjVpHmC7UOJHjpcQTdD#rd

优秀的个人博客,低调大师

【译闻】史上完整版DevOps介绍

以下内容摘自TNS的贡献者 Ritesh Modi的新书《DevOps with Windows Server 2016》。 如今,业内还并未对DevOps的定义达成共识。几乎每个行业机构和组织都制定了一套自己的DevOps实践。他们以为只要进行自动化、配置管理和敏捷开发,就算是真正意义上了解并实践了DevOps。 然而并没有那么简单。 DevOps与软件系统的发布机制是密切有关的。DevOps涉及到建立协作互通的开发团队,并朝着一个可预见的目标一起工作,也同时涉及到协作中的责任制和管理制度。它还涉及到实践过程中的集体性和服务心态。DevOps确保实现了团队组织中一种敏捷而灵活的传输机制。与大众观念相左的是,DevOps其实和工具、技术以及自动化无关。自动化实际扮演的是实现敏捷开发,减少了团队内部的合作并辅助更快交付的角色。 DevOps的定义 网上有很多关于DevOps的定义,但它们大多数并不够完整。为什么这么说? 首先,DevOps并不提供框架和方法,当它应用到团队和项目中的时候,它其实是DevOps和企业共同实现既定目标的一系列原理和实践经验。其次,这些原理和实践经验并不执行任何特殊的程序、工具和技术,甚至环境。最后,即便有的技术和流程本身确实可能对实现DevOps的目标和愿景比较适用 ,但事实上,DevOps能在应用实践这些工具、技术和流程的过程中提供指导。 任何直接面向用户并为用户提供产品和服务的企业都可以实践DevOps,作为本书的目标,我们将通过剖析企业的开发和运维团队了解到真正的DevOps。 所以,DevOps到底是什么?我认为: • DevOps是一系列原理和实践经验的总和。 • DevOps从一开始便将开发和运维团队放到同一个系统开发中。 • DevOps提供了一种快速、有效的方式,能不断地以端到端的传播形式向用户端传递价值,而且这种方式具备一致性和可行性。 • DevOps缩短业务上线时间,并保障了业务的市场竞争力。 如果你仔细揣摩过以上DevOps的定义,你就会发现它并未对任何特殊的流程、工具和技术有偏好,也并未规定任何特殊的方法和环境。 DevOps的实践 任何企业的DevOps实践,其最终目标都是确保相关人员(包括用户)的期望和需求能有效、快速地开展起来。 DevOps满足用户以下需求和期望: • 获得他们想要的功能; • 在任何需要时都能获得他们想要的功能; • 能更快地更新功能; • 发布的新版本的质量够高。 只有当企业能满足这些用户需求,用户的忠诚度才会高,反过来企业的市场竞争力便得到了提升,并最终增强企业的品牌和市场价值。DevOps对企业的顶线和底线带去直接影响,因而企业可以在创新和客户反馈上投入更多,从而持续改变其系统和服务,以保持和用户之间的黏性。 而任何企业在实践DevOps的过程中都会受其所处的行业和领域的影响,所以要把握住DevOps实践的核心原则和核心做法。 DevOps实践的核心原则: • 协作机制和沟通机制; • 响应变化的敏捷度; • 软件设计能力 • 快速试错 • 持续学习和创新; • 自动化流程和工具。 DevOps实践的核心做法: • 持续集成 • 配置管理 • 持续部署 • 持续发布 • 持续学习 虽然DevOps并不是新词,但近几年却受到越来越多的普及和关注。到目前为止,采取DevOps已是最高优先级,且越来越多的公司正在实践它。而DevOps的实践中又有着不同优先级的考虑:以成功实施持续部署和持续交付的优先级最高,以采用源代码控制和敏捷开发的优先级最低。 DevOps定义的解析 DevOps谈到的第一个问题是如何打破开发团队和运维团队之间的隔阂,以及如何实现多团队之间的亲密协作。DevOps打破了以往开发团队只负责写代码并提交代码给运维团队来进行部署,而运维团队不参与开发过程的观念。事实上,运维团队应该对产品的上线计划产生影响,也应该对即将发布的功能有更多关注,他们还应该持续向开发部门反馈运维上的任何问题以便在后续版本中予以修正。运维团队的工作实际上最终能为提升整体功能特性的系统设计产生影响。相对应地,开发团队应该辅助运维部门成功交付系统和解决问题。 DevOps的定义中还谈到了系统端到端的交付效率是快速、高效的,但并未谈到底有多高效。发布的效率取决于企业的行业、领域和细分用户等,有的企业以季度为交付周期,有的则按周计算交付周期。 这两种类型从DevOps的角度来看都是有效的,他们可以部署任何相关的流程和技术来实现其特定的目标。但DevOps不会决定该目标,企业应根据其整体项目和愿景来确定DevOps的最佳实施。 这个定义还谈到了端到端的交付。这意味着从系统的规划和交付到服务和运维都应该是DevOps实践的一部分。这些过程应该在应用程序开发生命周期中具备更大的灵活性、模块化和敏捷性。虽然企业可以自由地使用最好的进程,如瀑布、敏捷、看板等,但通常企业都倾向于通过基于迭代的交付方式来支持敏捷开发流程。这便意味着在更小的单元拥有更快的交付,与大体量交付相比是更好测试也更好管理。 DevOps谈到在不断地向终端客户提供软件系统的时候要保证一致性和可预测性,这意味着企业应该使用自动化向用户提供更新和功能升级。在不使用自动化的情况下,我们无法实现一致性和可预测性。为避免失误,自动化也应该要求是端对端,这也表明系统设计应该是模块化的,才可能保证更快交付的同时又能保持系统的可靠性、可用性和可扩展性。自动化测试便在这类交付中起着至关重要的作用。 结语 实施上述做法和原则的结果是企业可以满足其客户的期望和要求。相比竞争对手,这样的组织发展得更快,同时,也更能不断进行创新和改进,从而进一步提升产品和服务的质量。 本文为翻译文章,文章观点归原作者所有 原文链接:https://thenewstack.io/what-is-devops/ 关于作者Ritesh Modi 高级技术布道者,现就职于微软,负责保障开发者、创业者和企业的技术学习和实践。曾作为架构师就职于Accenture和eFORCE,热衷开源技术,是行业有名的领导者和作家,同时,他还是T-hub和IIIT Hyderabad创业孵化器的导师,微软认证培训师,并拥有超20种相关培训证书。 关于译者Ghostcloud Ghostcloud(中文名:精灵云)是成都精灵云科技有限公司旗下的基于Docker的PaaS/CaaS平台品牌,核心团队由来自EMC、Veritas、华为、IBM、Microsoft的核心技术主管和架构师组成。国内首批从事容器虚拟化研发的企业,为企业级行业客户提供针对互联网化、私有云管理平台、大数据业务基础架构的平台服务。在国内Docker社区贡献排名前三,主创团队曾参与Beego开源项目研发,并主导发布《Docker容器实战:原理、架构与应用》一书。Ghostcloud因容器技术而生,致力于为多个领域的“互联网+”转型企业提供服务,是一流的企业级容器云服务专家。 推荐阅读: 基于Docker的DevOps实现 法拉利与DevOps:比你想象中有更多类似 大话DevOps解决方案的变迁

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。