导语:本期采访对象李雨来@Blacktear ,86年生人,是云计算创业公司迅达云成的架构师,提供云计算领域的IaaS服务。毕业于北工大机械专业的他,曾有过长达两年半的技术编辑生涯,对编程的热爱支持着他成长,出版社的工作也拓展了他的技术视野。在云计算刚进入中国的时候,成功地把握住了职业转型的机会,在实践中成长为优秀的架构师。除了个人的成长经历,他还谈到在云计算领域的实践经验和感悟,强调开发要站在运维的角度看问题,在云计算时代,开发和运维的结合将变得越来越重要。
技术编辑到开发
“搞编程这行如果不是兴趣驱动的话,永远会觉得它只是一个工具,如果非常有兴趣,就会发现很多乐趣。计算机行业更新这么快,如果只是上班工作,下班回家什么也不想,那么用不了几年就会被淘汰。”
- 技术人攻略:你从什么时候开始接触编程?
我从小学就开始接触电脑,通过Basic对编程建立了一些感性的认识,高中开始学计算机二级C语言的书。可是考大学由于分数不够,进了机械工程及自动化专业。但还是很喜欢计算机,就一直泡图书馆看相关的书,通过一些小项目积累经验。计算机这个领域很偏实践,看书上的理论是一回事,真正动手做了之后再反思自己做的东西,会对理论有更深的理解。
* 技术人攻略:为什么毕业的时候没有找开发的工作,而是进了出版社做技术编辑?
因为不是计算机专业出身的,HR那关就过不了,那会儿也没有人脉可以推荐工作,就去了电子工业出版社的博文视点,做了两年多的技术编辑,工作主要是跟踪一些技术趋势,联系作者做一些书。
也写了一些程序,根据书的销售的数据,做一些类似大数据处理的工作。当时出版社的电脑都是很普通的台式机,计算能力有限,所以用了分布式的方式来实现计算。还有就是从各个网站上抓一些帖子做数据分析。出版社离书比较近,对视野的开阔有帮助,所以感觉这段时间跟读了个研究生似的。
* 技术人攻略:后来什么时候开始真正的做开发?
在出版社的工作毕竟不是自己最喜欢做的,2010年云计算刚开始进入中国,正好有机会可以去一家美国的云计算公司做开发,于是就辞职加入了。很多人都感觉我跳槽的这个跨度很大,我自己却觉得还行,在出版社出书也是教别人怎么做Coding,如果你想把一个事儿给大家说明白的话,你自己得先明白。
搞编程这行如果不是兴趣驱动的话,永远会觉得它只是一个工具,如果非常有兴趣,就会发现很多乐趣。计算机行业更新这么快,如果只是上班工作,下班回家什么也不想,那么用不了几年就会被淘汰。我是学机械的,机械这个行业发展了几百年已经很成熟了,搞机械的人都知道本叫做机械设计手册的书,基本上你想要做的设计,所有的能拿到的标准件的尺寸,能承受的强度,查手册都能查出来。而计算机这行发展才几十年,没有这样固定的模式,如果没有很强兴趣驱动,很快就会落后。
云时代的开发和运维
“云计算这块遇到的主要问题不是编程,而是运维上的问题,更多考虑的不仅仅是性能,还包括如何保证稳定性。”
- 技术人攻略:在工作中遇到最大的挑战是什么?做云计算的难点在什么地方?
挑战最大的是在China Cache工作的时候,要从头到尾搭一套以KVM为基础的云计算平台。当时考虑过OpenStack,但当时OpenStack的架构还不够成熟,在跨数据中心部署的情况下会有一些安全性的问题。所以后来完全重新写了一套,通过这个挑战在技术上成长得很快。
云计算这块遇到的主要问题不是编程,而是运维上的问题,更多考虑的不仅仅是性能,还包括如何保证稳定性。为客户提供服务,程序要写得很严谨,系统在应用一些配置的时候,要设计如果失败的话回退怎么办;另外要考虑稳定性的因素,因为中国的网络环境不是太好,在公网上跑一些东西的时候,大网抖动一下,或者某个数据中心到一个核心节点的链路不是很好,导致一些数据连接的中断,怎么能重建连接,怎么自动做一些重置,怎么保证集群的稳定性,程序必须具备自动诊断、自动恢复的功能。纯Hadoop那套东西全在内网,不用考虑网络环境的问题,云计算的服务器都在公网上,怎么向服务器发送一些消息,服务器怎么保证消息能收到,这些是需要积累经验的,好多经验也都是四处碰壁碰来的。
另外一个难点就是对知识面的要求很高,做IaaS****要让整个数据中心实现自动化,需要了解包括服务器、交换机、网络、存储,并且这几部分如何整合起来,作为一个服务对外提供。云计算的运维不是简单的会用Linux,不仅是做一些维护性的操作,还要和开发一起讨论整个系统的物理架构是什么样的,交换机的配置是怎么做的,网络是怎么搭的。因为牵扯到太多的系统,所以对于运维的要求非常高,出问题原因有可能是系统的bug,也有可能是数据中心的网络等,怎么去快速的定位、解决问题,有很高的技术含量。对于一个复杂系统来说,想了解哪儿出了问题,复杂度不亚于给人看病,而且有时候并不简简单单是一个问题,可能是好几个地方的故障引发的导致严重问题。
* 技术人攻略:云计算时代的开发和运维工作是不是会更紧密的融合?
我自己很喜欢学习一些运维自动化的东西,可以开拓视野。做后台系统的工程师很有必要多了解一些运维知识,因为做出来的系统一方面是给业务人员用,另外一个潜在的客户就是运维团队的同事。如果运维在部署系统的时候觉得吃力,可想而知这个系统写得有多糟,如果运维不部署你的系统,系统一点意义都没有。开发在搭测试环境的时候,其实相当于做了一部分运维的事儿,这个过程中开发工程师可以想想用什么方式让它变得更简单。还有就是自动化部署,用自动化工具来做重复性的工作,这样可以保证持续Release,增强工程师的满足感,另外也可以降低出错的几率。如果能达到Devops的效果更好,就是开发运维化、运维开发化,这两个团队其实是一个团队了。
运维其实挺苦逼的,干好了没人说你好,稍微出点错就挨骂。越牛的运维越是拿钱砸出来的,如果没摔过跟头,就不可能知道地上哪儿有坑。有的公司对于运维犯错这个事儿的思路不太对,运维捅一大篓子,就把人开了招新人,但新人更有可能犯错,而老人不太会犯同样的错误。运维对于产品来说很重要,能不能让系统不出大问题,出了问题之后能不能很快恢复。就跟军队一样,养兵千日用兵一时,但是很多公司没有把运维当军队,就当扫地的使。
* 技术人攻略:你现在所在的这家公司是云计算领域的创业公司,你对现在云计算创业的市场环境怎么看?
现在云计算创业这块创业的人多了,快到了当年大批量上团购的阶段。技术含量也已经被压了下来,因为OpenStack的开源架构已经很成熟,很方便就能搭出一套云平台,整个行业对云计算的接受程度也越来越高。
不过我们公司的系统完全是自己搭的,一方面因为之前在云计算这块积累过很多经验,另一方面,如果完全搭在OpenStack的环境下,会受限制,并且二次开发的工作量也不小。OpenStack****像一个大而全的东西,用起来比较复杂,如果自己做,基于自身的业务特点做技术选型,可以把事情做得更专业,运维起来也更容易。OpenStack的UI界面做得不够好,需要二次开发,做跟自己业务相关的一套东西。如果不用社区做的一键化部署工具的话,OpenStack对运维也很不友好,需要配置的东西太多。
我们公司提供的服务目前还是主要是基于IaaS这层,主要面向游戏客户,对他们来说采用IaaS更灵活,因为已经积累了一些规则、业务运营模式和系统,用PaaS的方式他们也不一定能接受。
学语言像周游世界
“打个比方,如果你了解的语言特别多,等于是在周游世界;如果对某个语言了解得很深,就类似于把北京城每一个角落都去了一遍。因此,当见识过很多东西,对其他语言设计的理念有了解之后,你的视野就变得更开阔了。”
- 技术人攻略:在开发语言的选择上你有什么倾向和建议吗?
语言我用得挺杂的。在语言选择这块,我倾向于会得越多越好。打个比方,如果你了解的语言特别多,等于是在周游世界;如果对某个语言了解得很深,就类似于把北京城每一个角落都去了一遍。因此,当见识过很多东西,对其他语言设计的理念有了解之后,你的视野就变得更开阔了。当然对初学者来说,还是应该先对某一门语言了解到一定程度之后,再拓展到其他编程语言会比较好。不同的语言在处理一些特殊的情况下,有不同的做法,例如同样实现一个根据配置调用不同代码处理数据的功能,Java和Python的实现方式就会不一样,Java会用到接口和工厂类,动态语言则可以直接根据配置拼出一个函数名调函数。不管用什么语言,目标就是把问题解决了,根据不同的情况选择适合的语言。对创业企业来说,用Java搭一套Web界面的人力成本和时间成本远高于用ROR,所以语言选择不在于技术本身,跟时间、成本都有关系。
* 技术人攻略:如果不考虑工作的话,你想开发什么东西?
比较感兴趣的还是做一些智能家居的东西,搞一些软件和硬件结合的事儿,例如可以通过iPad控制家里的洗衣机、冰箱等。我个人对硬件还是有点兴趣,计算机不能只停留在一个方盒子里,得让他出来。有的人担心技术的发展会带来更多的问题,我举个航空工业的例子,飞机的自动驾驶系统发明以前,空难的问题主要是人犯的错误所带来的,自动驾驶系统发明之后虽然有时候会失灵,但可以在有问题的时候切换回手动,技术很多时候是有两面性的,不能因此否定自动驾驶系统对航空工业发展所起到的作用。
* 技术人攻略:有没有你特别欣赏的人或者公司?
每个人都有他自己的优点,闻道有先后,术业有专攻,在一线做Coding的人应该保持谦虚的心态。
* 技术人攻略:你做技术编辑的时候看了不少书,能不能推荐一些有价值的书?
我觉得看书是一个过程,不是说看了几本书,就能把计算机领域的东西弄得很清楚了。而且计算机有很多不同的领域,不是你都看过一遍就行了,这几个领域之间有先后的顺序,如果不了解最初的CPU长什么样,直接看Intel的CPU手册就跟看天书差不多。任何东西都是循序渐进演化过来的,最重要的是本质上的那些东西,例如CPU再怎么演化也不会逃出冯诺依曼的架构。
很多学计算机的人对单片机了解不多,单片机可以理解为x86架构的一个鼻祖设计。如果你写一个程序,用现在的编程语言足够解决问题的话,没必要看硬件的东西,但如果想提升你的知识,了解操作系统到底怎么干活、硬件总线之间的寻址是怎么工作的,那么推荐有精力的人看看8051和数字电路。计算机是以数字电路为基础的一门学科,逐渐发展过来,****CPU****看似很复杂,但还是从门电路演化过来的,如果学过数字电路,了解怎么设计加法器、单片机,用单片机做一些小的设备,对你了解计算机会有很大帮助。
编程方面的书,推荐《Java编程思想》,看了这本书之后,会提升对面向对象和java类库的了解。看书应该边看边做,做得差不多的时候再去想,想完之后回来再去看一些东西,在这么一个闭环的过程中逐渐进步。
技术人攻略访谈是关于技术人生活和成长的系列访问,欢迎和我们有共同价值观的你关注“技术人攻略”,邮箱 [email protected],新浪微博 @devlevelup,希望能成为技术人成长的精神家园。
欢迎通过微信公众账号关注技术人攻略