云巴创始人张虎:一个优秀的软件工程师必然是全栈工程师

张虎,云巴 (yunba.io) 创始人兼CEO,致力于为开发者提供优质云后端服务。他有十几年的软件研发经验,精通嵌入式系统、服务器端架构、虚拟化等。张虎曾就任于华为、Oracle,他是Oracle VM 的创始团队成员。离开Oracle后,他创立了极光推送,曾任CTO,他创意并主导开发的系统为过万开发者、过亿终端用户提供推送服务。张虎长期关注业界新技术、新实践,并持续引入到团队实践验证。前端

图片描述

问:你是从何时开始编程的?程序员

高中开始用学习机时就对学习机产生兴趣,当时玩过一点BASIC。正式学习编程是从大学阶段开始的。面试

问:关于计算机和软件的知识是经过什么渠道得到的?对于大学的计算机教育你有什么见解?数据库

大学学的是数学和机械方面的专业,计算机的基础知识都是靠自学。大学期间,有段时间个人全部活动不是编程就是踢球,或者是在上课时看计算机相关书籍。每当看到好玩的游戏、好用的软件,第一时间想到的都是我本身可否也写一个相似的出来。刚开始工做时,我对操做系统痴迷到了一种几乎狂热的地步,连续花了几年时间研究了不少系统的源代码。编程

我我的不太赞同目前的大学计算机教育方式,这几年面试了来自各类学校的大学生,广泛的感受就是基础知识不够牢固。不少大学的计算机教育的核心就是编程,以教授C++,Java这些高级语言为主。可是,高级语言掩盖了太多的细节。虽然它确实有利于你快速编写出可用的软件、提升生产力,但在学习阶段,却不利于基础知识的累积。后端

问:你是如何加入Oracle的?又是如何成为Oracle VM创始团队成员的?服务器

我是2006年离开华为后加入Oracle的,那时候基于Xen的虚拟化刚开始有一些影响力。Oracle在深圳和北京的一个团队开始启动开发Oracle VM。我当时对虚拟化特别感兴趣,就申请加入了团队。微信

问:在Oracle工做的经历对你来讲最大的收获是什么?网络

在Oracle的工做经历让我意识到一个软件产品的开发不只仅须要在技术上到位,还须要有匹配的品牌包装和市场宣传。在产品开发的过程当中根据产品需求,咱们须要不断地对产品的方向和定位作一些调整。好的产品除了在技术上要有创新以外,还必定要很好地为市场需求服务。前端工程师

问:做为国内第三方推送的发起者,你在创立极光推送的时候国内尚未相似的服务,请问你当时是怎么想到从这个角度开始创业的?

我当时比较关注Android在中国的发展,也有不少朋友聊过关于推送方面的问题。当时面临的问题是Google的 C2DM(如今的GCM)在国内由于种种缘由不能使用,而国内的Android厂商各作各的推送系统,对开发者来讲没有一个统一的解决方案,我感受市场须要有一个面向开发者,独立于厂商的第三方推送产品。正好,当时有个前同事,创业即将失败,帐户上还有一点钱,通过沟通,咱们就启动了这个产品,也就是后来的极光推送(JPush)。

问:请问你离开极光推送的缘由是什么?

由于当初我是以加入一家现有公司的形式启动极光推送这个产品的,当时在股权结构上就有不合理的隐患。后来,公司以前的产品彻底放弃,全面投入作极光推送,其结果是团队里不少原来的创始人实际没参与过极光推送。

我做为极光推送的发起人和创始人,却对公司运做的实际控制权有限,管理团队成员之间不免会产生问题,影响了产品和公司的发展,最终促使我作出了离开的决定。

问:在第一次创业过程当中遇到过什么困难?这些经历帮助你在如今的创业路上作出了哪些不一样的选择?

极光推送能够说是个人第一次创业。如今回头看,当时对创业能够说不是很了解。我只是对产品、服务、技术有本身的认识,知道怎么去作,知道方向是什么,可是对整个创业过程,好比怎么跟团队谈股份,怎么分配你们角色,怎么跟资本沟通,却经验有限。因此经常以为若是当时能有一个导师指引就行了,这样整个团队的发展可能会到一个更高的层面。

通过这件事以后,我对于在公司初创、发展,以及取得成绩以后的各个阶段中的人员协调、利益保障都有了比较清楚的认识,也所以将这些经验运用到了建立和管理云巴上面。

问:如何想到要创立云巴这个平台?如今的发展方向和最初的想法是否有一些不一样?

计算机的网络,除了计算、存储的功能之外,还有个重要的功能就是信息的交换,换句话说就是通信。随着网络和硬件的发展,通信逐渐被划分为人与人之间的通信、人与机器之间的通信,以及机器和机器之间的通信。

人与人之间的通信已经有不少企业在作了,好比QQ、微信还有企业内部通信工具这些。每每被人们忽略的是人与机器以及机器和机器之间的通信,这比人与人之间的通信量大得多,并且通讯的方式存在较大的区别。

机器之间发消息,作不到“他没理我,我再给他打个电话”。目前我想作的就是找到两个传统领域的结合点,从人们认为没有太大联系的二者中找到结合的机会,而不是盲目地进入已经成熟的领域。目前国内市场并无一个真正适合的产品。

目前公司发展的方向和当初的设定基本一致,但在宣传和市场开发的侧重点上略有调整。之前的想法仍是以移动互联网App为主,结合智能硬件、物联网。通过过去一年的验证,咱们发现如今不少产品实际都是以智能硬件为中心,手机上的App管理智能硬件,因此咱们如今对智能硬件、物联网开发者的支持度不断增强

另外,价格策略咱们也在不断微调中。咱们但愿为开发者提供起步门槛足够低,按使用量付费,体验良好,而且可靠、可持续发展的产品。

问:云巴的用户案例中展现了掌阅、Yo、以及云巴小车的案例,这些案例是否表明了云巴提供的主要产品类型?来自各类用户的不一样需求是否也对云巴的产品产生了影响?

几个不一样的案例展现了咱们产品在不一样场景不一样需求下的使用。包括手机App、智能硬件。另外还有一些智能家居的产品,也在使用云巴服务。

咱们在跟不一样的用户沟通的过程当中,发现用户对服务的极低延迟、可靠性、机房的本地化部署都很是关注,这也直接影响了咱们对云巴系统设计的调整,甚至是开发语言的选择。目前,咱们产品绝大部分模块的集群管理、业务逻辑代码都用Erlang改写。

问:如今云巴面临的最大挑战是什么?(新产品开发、性能提高、或者技术转型?)

天天,不一样的手机App、智能硬件、服务器经过云巴系统进行数千万的实时消息通讯。如何为全部的平台提供实时、可靠、高效的服务,是云巴面临的最大挑战。

围绕这些挑战,具体来讲咱们目前在攻克几个技术点,包括:

  • 高可用、高并发、极低延迟,而且支持复杂数据类型的内存数据库系统;
  • 多机房多活的部署方案。

问:在创业之初,大家在团队的分工问题上(开发、测试、运维各司其职)走过弯路,后来用Devops的方式解决了这个问题。请问Devops是值得推荐给全部初创团队的工做方式吗?

DevOps是开发和运维这二者的有机结合,我认为初创团队均可以尝试一下这种联合开发模式。目前的互联网创业最重要的是要快速响应市场的需求,而在传统的开发模式下技术部门和运维部门是脱节的,他们有不一样的目标需求。一款产品须要知足市场上的现有需求,开发部花了很大的心思和精力,完善功能,用了很厉害的新技术,以后一股脑的丢给运维部门。这时运维部门是很慌的,可能这款优秀的产品根本就没法运行,或者他们彻底不了解这个产品的新功能,这样运维部门会不断地给开发部门提出改进需求。这样一去一来等产品真正完成了,早已通过了产品上线的黄金时间。有很牛的开发者,有很牛的运维人员,更须要协调统一这二者的步调和目标,而DevOps正好提供了这个方法。

虽然DevOps对产品开发的过程很重要,但团队更须要在乎的是整个项目方向的正确性。

问:你对不少新的语言和技术都很关注,好比Rust和Elixir,请问你我的和你的团队都是经过什么方式学习和考察新技术的?

咱们团队过去一年(2014)从零基础开始学习 Erlang,而且把咱们系统大部分模块用 Erlang 改写。

最初期,从我本身开始,调研了现有使用Erlang的产品,特别是实时高并发的产品,我阅读他们的博客和发表的文章,了解他们的心得。后来我开始写一些产品的原型,团队部分红员开始尝试解决一些小bug,慢慢开始写一些小模块。这段时间我会review全部代码,引导团队学习正确的方法。通过一段时间的积累,部分红员就慢慢能独立编码,再发展就有人能参与review代码了。

咱们对于编程语言的选择首先从稳定性、分布式,以及可以长期运行等方面去考虑,不能只一味地跟风现有最“时尚”的语言或者使用人数最多的语言,由于咱们的产品须要面向海量并发服务,合适的才是最好的。

另外,咱们团队也在持续关注新的语言和平台,好比 Rust、Golang 这些最近新出现的语言。Elixir 这种在现有平台上产生、对开发者更友好的语言,咱们也在尝试准备引入。

问:在云巴的招聘要求中,对于全栈软件工程师和前端工程师的要求是最高的,请问云巴的前端工程师和全栈工程师是如何合做的?

云巴的全栈工程师主要负责对后端功能的实现,后端系统的成熟度直接影响整个产品的成熟度。

前端工程师的工做目标是把咱们的产品优雅地呈现给咱们的用户。视觉、交互体验,直接影响用户对咱们产品的喜爱,因此咱们也很是重视。

在咱们团队内部,咱们常常说前端就是咱们系统的一个HTML5 App,后端的工做就是提供友好的接口,帮助这个App达到良好的用户体验。

问:有一种流行的说法是掌握了Node.js的前端工程师就是全栈工程师,而云巴的全栈工程师彷佛更像是传统意义上的后端工程师。请问对你来讲,全栈工程师意味着什么?

咱们定义的全栈工程师,更强调对一个完整系统的各个环节原理的理解,包括操做系统、网络、编译系统,还包括问题定位、性能测量、性能调优等方面的动手能力。而不像咱们常常看到的传统后端工程师,每每强调对某种特定语言的掌握。咱们的全栈工程师实际上都掌握多种语言,以知足不一样方向上的工做须要。

从某种意义上来讲,一个优秀的软件工程师必然是一个全栈工程师。在一个以技术为导向的公司,顶级工程师的能力直接决定了整个公司的能力。

问:你喜欢“玩”操做系统和各类编程语言,你在招人的时候也会以这样的标准来要求程序员吗?

刚开始工做时,我连续花了几年的时间研究 Linux Kernal、uCOS、Nucleus、vxWorks 等系统的源代码,尝试几乎全部的编程语言,包括汇编在内。

“玩”这些东西除了是我本身的兴趣外,也是工做须要。可是不必定每一个人都有机会在工做中接触到这些东西,因此咱们对工程师也没有这样的硬性要求。

可是,就像任何代码都运行在 CPU 上同样,几乎任何软件也都是依赖操做系统的,软件开发工程师对操做系统的深刻理解,几乎是成为一个高手必须具有的能力。另外,学习操做系统的编写,也是提高能力的一个颇有效的方法。

除了很底层的几个编程语言外,几乎全部的编程语言都是为特定领域发明的,学习一个领域的新语言,实际是学习了一个新的思惟方式,能够帮助工程师从各个不一样的角度思考问题。因此我我的以为多花一点时间去多了解一门编程语言是很值得的。


更多精彩,加入图灵访谈微信!

图片描述

相关文章
相关标签/搜索