关于代码托管的始末,程序员应该知道这些真相 | 雷锋网公开课

今年8月,雷锋网(公众号:雷锋网)将在深圳举办一场盛况空前,且有全球影响力的人工智能与机器人创新大会。届时雷锋网将发布“人工智能&机器人Top25创新企业榜”榜单。目前,雷锋网正在拜访人工智能、机器人领域的相关公司,从中筛选最终入选榜单的公司名单。如果你也想加入我们的榜单之中,请联系:2020@leiphone.com。

关于代码托管的始末,程序员应该知道这些真相 | 雷锋网公开课

孙宇聪:Coding.net CTO,  曾任 Google Senior Site Reliblity Engineer(2007-2014) 就职于Moutain View 总部, 曾参与设计维护YouTube 视频转码/存储/直播管理系统(系统吞吐量超过1Peta bytes/月), 参与研发管理全球 Youtube CDN 网络 (峰值流量~10Tbps) , 后就职于Google 内部云计算部门开发维护全球百万台服务器生命周期管理系统及任务管理系统。

程序员的日常工作离不开代码,有逼格的程序员都有过将代码托管到第三方平台的经验,例如国外的Github几乎成为了全球程序员的社交平台。不过,国内这几年也不断涌现出一批优秀的代码托管平台,2014年成立的Coding就是其中之一,本期硬创公开课我们邀请到了Coding CTO孙宇聪为大家带来有关代码托管以及云服务的分享。

Coding是什么?

Coding 成立于2014年,是一家面向广大程序员服务的公司,其中包括好用的项目管理工具,代码托管平台,社区以及靠技能变现的外包交易平台(码市)。

代码托管到底解决了哪些问题?

代码版本管理工具(VCS系统或者称之为 SCM 系统)是软件开发项目中不可缺少的一项重要生产力工具,主要作用就是使得项目成员可以用他来管理项目中的代码,跟踪某个文件的历史信息。VCS/SCM系统也是代码评审工具,自动化持续集成工具等等的主要集成点,是敏捷式开发,快速迭代,持续集成等等一切的基础。

目前最为流行的代码管理系统包括SVN和GIT,还有一些较为小众的如Mercurial(Hg),Bazar(bzr) 。这些代码管理工具操作方式等各有不同,但是大都能实现一样的目的,也就是跟踪一个项目中代码演进的历史。

大家都知道在项目开发过程中,需求总是变来变去的, 甚至在需求制作中,代码也总是会不停地改变。用好一套版本管理系统可以使得每次测试,发布的时候清楚的知道发布了什么东西,更好的跟踪代码的改变。GIT与SVN的实现各有优缺点,这里就不赘述了。目前,Coding同时支持 SVN 与 GIT 协议访问代码仓库,同时提供了丰富的代码评审,持续集成等功能,以及完善的项目管理功能。

总而言之,代码托管平台的最大意义不在于托管代码,而是在于方便集成。

团队协作和代码生产是怎样一种关系?

先来看看这样的场景:传统的企业运作方式是部门制,各管各的,产品经理一套流程, 设计一套,项目经理一套流程,程序员一套流程,互相不会打通。每次一开会,相关任务的背景资料都要靠口头传递,甚至是用纸条来传递,这样的效率非常低。

高效的软件开发流程离不开一个完整的闭环系统。什么是敏捷,什么是DevOps? 什么是IT和商业紧密结合?这就是所谓的闭环。

软件开发项目中的所有角色:包括程序员 ,项目经理,甚至设计师,运营人员,当然还有领导都迫切需要一个集成化的项目管理环境,使得需求、设计、代码、上线以及运营可以紧密的结合起来。一个想法的产生,到实现,到最后运营,有据可查,有理可依,这样的生产力肯定会提高。

如何评价云服务的好坏?

这个问题好难回答, 所以我自己也经常问自己这个问题, 我们怎么敢帮人托管这么贵重的资料呢?要回答这个问题, 首先我们要先定义“好”和“坏“。我认为有几点:

一、可用性( Availability), 一个云服务如果不能做到随时24x7可用,那么就不会有人使用,那就谈不上好了,毕竟用户存了东西,必须能够随时取走。

可用性的定义是服务的在线时间比率,这个比率越高,用户体验当然就越好,具体可以看看下面这张图。

关于代码托管的始末,程序员应该知道这些真相 | 雷锋网公开课

一般来说,互联网机房常见的可用性目标是99%,也就是一年有3天的不可用时间,甚至还有更低的,这种情况下供应商通常会给客户返现补贴。显然,这样的标准对云服务而言太低了,云服务的基础线是99.9%,也就是说云服务至少要达到上述表格中的第三等级以上才算合格。第四个等级每年只有52.6分钟的不可用时间,这非常考验技术能力,运维能力。仅凭人力这几乎是不可完成的任务,所以运维自动化、无人化运维等词就应运而生了。

至于如何提高可用性,以下三点是必备工作:

1.尽量做到无状态微服务,去掉系统中的单点故障。


2.做好容量规划, 实现N+2, 或者N+1 , (做压力测试,性能分析) 冗余。


3.生产管理上要做好监控,报警,灰度发布等等运维手段,减少人工干预。

二、可控性(Access Control)。很多用户更倾向于把重要的资料放在本地,这是因为大家觉得这个环境比较可控,设置完密码后如果还不放心,可以买个锁把机房的门锁起来。 

但是, 放到云上这样的方式就行不通了,因此,即便云服务有访问上的便利性,但客户对存在云端的数据是否安全仍持怀疑态度,好的云服务必须解决这样的问题。

可控性是一个多层次的话题,这个层次和你每天上班经过无数道门一样, 访问控制也应该由很多层组成,而且每层防御的目标都不一样,大体上可以分为三层。

第一层是物理安全也是最重要的一环,任何逻辑安全都要以这个为前提。在云时代,物理安全很大程度上是靠选择靠谱的合作伙伴来决定的,但作为一个云服务也要对此有所了解,知道自己用的云服务的物理限制,系统设计等等,这样有的放矢的设计自己的权限控制系统、网络隔离、加密等等高级访问控制层。

第二层是有关协议层的安全,全站TLS加密属于基础。

第三层是对 ”秘密“的管理,每个云服务背后都有很多很多的秘密(可以是ssh密钥,可以是服务器密码,也可以是数据库帐号)需要管理,这个管理做得越好,可控性越强。很多公司管理秘密的方式,就是一个本子,而且不更新这种做法的安全隐患很大。除此之外,关于可控性还有很多很多其他的话题,比如说 角色型权限管理,身份传递,应用数据加密等等,这些都是提高安全性必不可少的话题。

三、灾难恢复或者说是灾备,这是云服务优势最大的地方。因为不管代码托管在哪里,都有出现灾难的可能,而灾难一发生就会导致数据丢失,这是很多企业选择云服务的原因。

云服务必须有一套常驻热备灾难恢复系统,也就是说必须有一套一模一样的系统同步运行,生产系统宕机后,就可以自动切换到备用系统上,不管是雷击还是挖缆云服务都能保证数据的安全。很多云服务商并没有这样一套稳定的系统,不是因为技术上不可能,而是因为平时不投入。

大量的用户数据对于运维提出了哪些要求?

我们可以从两个方面讨论,即数据持久性(Durability)和数据可访问性。

要保证数据持久性,就需要对数据进行备份,校验, 必要时候进行修复。需要注意的是,备份的数据必须是可恢复的,如果平时不经常测试自己的备份数据,你会发现要用的时候备份数据也有可能完全不能用。

在数据不丢失的前提下,还要保证数据的可访问性,否则和丢失没有什么区别。这两点都需要持续不断的工程投入,包括与第三方服务的接入。

群友问答:

Q:Coding是一个集成化的项目管理环境,关于这块,我们公司使用禅道+SVN来实现的,GIT有什么优势吗?

A:首先,代码评审的环节我认为是必不可少的。 SVN实现起来相对更困难一些,不过要注意的是 SVN和GIT 其实和这个没什么关系,SVN系统只是因为时间太久了,和其他系统的集成做的不能够很好;GIT相对较新,比如说我们可以做到代码与任务互相引用等更深度的集成,这样一来效果就会好一些。

Q:Coding有没有代码质量检查模块,是怎么做的?

A:有的,Coding 目前的质量分析模块是集成了Sonar Cube,这一项目是去年完成的,目前还有一个新的框架在内部使用中,基于shipshape 制作,可以接入任意质量分析模块,各种语言如java, js, php等等全部都可以接入,这个我们会在下半年推出。

关于代码托管的始末,程序员应该知道这些真相 | 雷锋网公开课

雷锋网原创文章,未经授权禁止转载。详情见转载须知

关于代码托管的始末,程序员应该知道这些真相 | 雷锋网公开课

(完)