订阅软件研发RSS CSDN首页> 软件研发

专访冯耀明:Rust具有C的速度且不用担心内存泄露

发表于2015-08-20 19:57| 次阅读| 来源CSDN| 0 条评论| 作者钱曙光

摘要:人生能有几个十年,何况在宝贵的青春年华里,创业者冯耀明在毕业十年后重新回顾自己的一路走来,总结自己的技术之路、创业之路,以及仍然在不断探索的路上——对现代编程语言Rust也有研究。

冯耀明(博客),广州人,2005年本科毕业于浙江大学自动化控制专业,先后在华为、汇丰软件、爱立信等跨国企业从事开发工作,最近一年在创业公司为客户提供企业Web和App解决方案的设计者和开发者,目前关注服务器分布式架构领域。


另外,冯耀明将于8月24日在CSDN Rust微信学习交流群中进行分享:《用Rust实现一个典型的生产者和消费者的题目》,课程提纲、报名、时间、地点等,请点击这里,精彩不容错过>>>


以下为采访正文:

十年的技术之路,遗憾的是没有更早加入互联网公司

CSDN:请和大家介绍下你和目前所从事的工作。

冯耀明:我是一名Java程序员,做过几年服务器方面的开发,也以技术合伙人参与过创业。兴趣比较广,除了写程序的工作,平时还喜欢篮球、游泳、书法、钢琴、小说、dota。目前刚刚离职,所以也在寻找下一个机会,希望能够从事分布式技术开发,技术上我永远觉得自己还在学习路上。

CSDN:2005年本科毕业于浙江大学自动化控制专业,已然过去十年,能够总结下自己的十年?

冯耀明:这十年参与过各种不同类型不同规模的行业和项目,有70年代的大型机系统,也有当今最火热的Web和移动开发,还有曾经红极一时的电信,中间还夹杂着一些小项目。就像一名穿着一对草鞋的流浪者,走过世界上的几个不同地方,却依然没有找到一个可以安居的地方。

这十年,遗憾的是没有更早加入互联网公司,庆幸的是能够进入一些传统的跨国大企业,接触到风格各异的企业文化和软件开发流程。

CSDN:你如何定义如今自己的身份,是技术人员、程序员、软件开发者,还是创业者?或者说不通的阶段有着不同的感悟。

冯耀明:技术人员、程序员、软件开发者有什么不一样吗?从过往的经验来看,我应该是一个技术人员,解决问题理应是我擅长的,这些问题包括写程序,调试bug,学习并应用新技术新架构等等。另外,我在做喜欢的事情时会非常专注和有激情,这种特质也比较适合创业。

CSDN:你是如何成为一名开发者的?有什么故事可分享?

冯耀明:这也是阴差阳错,高中时有自己的第一台电脑,当时还是98年的时候,我跟当时一位好友请教,如果我要学电脑的话应该怎么选,他告诉我有三个,一个是搞懂Windows注册表,一个是学习VB,另外一个好像是Photoshop。然后我就去买了一本厚厚的VB教程,就开始折腾窗口按钮那些东西,弄了一个月觉得有点无聊就没继续了。到了大学就选了一个偏工科的自动化专业。我想如果当时买的是《算法导论》,可能我大学选的专业就是计算机软件了,很多东西都不一样了。

如果说我第一个开发的项目,那应该是我大学时用魔兽编辑器修改3c地图,把我们寝室和隔壁的好哥们以及联谊寝室几个MM加入到地图的NPC里,配上各种我自认为很搞笑的对白给大家娱乐,后来还和其中一个MM走到了一起。这算是我最成功的一个项目了。

CSDN:你的日常生活中必不可少的软件是什么?

冯耀明:现在电脑除了做开发的工具,都很少装软件,很多都有毒有捆绑,想试什么都装在虚拟机上了。有几个是重装系统后会第一时间装上的,像搜狗浏览器,打开最近被关闭的网页功能比较好用。Evernote,用来记录点点滴滴的技术心得。App的话有noisli,模拟自然声音,有助睡眠。网易云音乐,对于听歌是很好的体验。

创业的每一天都令人兴奋

CSDN:你最近一年作为联合创始人参与创立了广州兰泽信息科技有限公司,期间负责需求分析、原型设计、架构设计、开发维护、项目和团队管理工作。公司项目为Web和App移动端整套解决方案,均按时高质量交付。当初,你为什么选择创业这条路?又为何选择这个项目?

冯耀明:我们几个创始人都是在工作时已认识的同事,在公司部门重组之后,大家都希望能出来做些什么,把自己一直以来想实现又没有机会做的想法做出来。这些想法都是可以通过移动App做出来的,所以我们就决定出来试一下。

CSDN:第一次创业的结果如何?过程中遇到过什么困难?

冯耀明:最大的困难是如何培养一支优秀的团队。现在还没有到讨论结果的时候。不过公司从初创到我离开时,的确经历了一些困难,从初期的产品失利,到中期通过几个创始人的忘我付出,完成项目的订单,持续获得客户的良好反馈,原始积累又帮助扩大了团队,目前公司有稳定的客户,逐渐成熟的团队,在金融方面也有一定的积累,我相信现在公司正朝着正确的方向在前进。

CSDN:通过此次创业,有什么心得和体会可分享?

冯耀明:太多了。创业过程中会遇到各种各样的问题,你必须要去解决它而不能回避它,无论是技术上的还是关于人的,而这些问题你之前是没想到过的。譬如之前我对Java,J2ee和Android等所知不多,但只要需要,就要短时间内去快速掌握它并且能够做一个像样的东西出来。可以说创业的每一天都在学习和达成成就感,这是最令人感到兴奋的点。而一直以来广泛的技术积累又能帮助我对新事物能够快速地吸纳。

CSDN:你是一名技术人创业者,你认为技术人创业有哪些利弊?以及在面临创业机会时,技术人该如何考量?

冯耀明:我觉得创业就是赌博,是否愿意放弃稳定的收入和未来的几年时间投资团队领导人和团队方向。很难说需要考量什么,因为每个人想要的可能都不一样,有的要投资回报,有的是要共同实现梦想,考量的因素自然不一样。在加入创业前,需要和各位创始人互相了解价值观和做事风格,需要有契约精神,明确职责,股权构成和退出机制。对于技术人,特别需要了解团队对自己职责的期望和自己的期望是否一致。

编程语言

CSDN:你是从什么时候开始编程的?

冯耀明:高中用VB写过一些很简单的UI程序。

CSDN:现在,你掌握着那些编程语言?对这些语言有着怎样的评价?

冯耀明:我用过的语言大概是这样:

  • 我第一份工作用的是C++,当时看了《Effective C++》,觉得C++的坑太多了,我必须要了解这个语言的很多细节,才能保证它按照你想的方向跑,太多的String类,而且编译非常慢。
  • C#在06年的时候也做过,那时觉得挺新鲜的,特别是可以运行过程中改代码调试,这是Java做不到的,缺点就是挺吃资源。
  • 然后在银行里写过JCL和Easytrieve,一种类似Cobol的古老语言,做一些数据挖掘,越底层语言总是有越强大的控制力,但是代码量也会多很多,编辑器比较原始,调试也不容易。
  • 也用过Protel,这是以前北电专门为电信设备设计的语言,类似C++但更古老,一种强类型有类继承的语言,配合平台支持热更新,编辑器原始,调试需要通过汇编语言找到变量对应的寄存器或者内存地址打印值,调试和问题定位都非常麻烦,对程序员要求比较高。
  • 目前Java和SQL是相对擅长的。跟C++相比,Java语法简单,容易理解,有成熟的库和社区支持,不需要把精神分散在语法细节上,跟C++比,比较吃内存,跟动态语言比,部署又稍麻烦。但我觉得这些缺点都不足以影响Java未来在应用服务器的主流地位。
  • SQL写得好不好也会体现一个程序员的水平,现在有ORM的支持,程序员不需要频繁接触SQL了,不过在出报表的时候还是需要写的。
  • 此外每一份工作中我都用过的语言是VBA,通过VBA和Excel能方便的处理常见的Excel数据,曾经用VBA针对Easytrieve写过文件定义解析器,能够在Excel上用方块图形的形式呈现Union式的数据结构,使各个字段的位置和偏移都直观显示而不用每次都重新计算,大大节省了调试程序的脑力。

CSDN:你用什么编辑器或者 IDE?

冯耀明:写Java时用Eclipse,目前也在尝试IntelliJ IDEA。Ultra edit来查看编辑数据文件,beyond compare来作对比。

CSDN:你对很多新的语言和技术都很关注,比如Rust,请问你个人都是通过什么方式学习和考察新技术的?

冯耀明:平时会关注一些CSDN的博客,也会在微信里关注一些公众号,多看看不同的人对同一样东西的评价就有个大概了。我喜欢在阅读技术文章时应用一种类似深度优先搜素算法的习惯,譬如在一篇技术文章中我看到了一个不懂的名词A,我就会去查,然后又会在这个A里面又看到了另外一个不懂的名词B,然后又去查B。直到我觉得没必要下去了。所以一篇文章下来会了解到很多不同的东西,同时如果在不同的地方你都遇到过曾经了解过的东西时,会加深印象。但当需要对一项技术作深入了解时,就需要专门阅读相关的经典书籍和官方资料了。

CSDN:你是如何接触到Rust的?

冯耀明:具体我也忘了,应该是在某篇技术文章里提到了Rust,然后我就有意的查了一下,发现居然还有语言能够有C的速度又不会担心内存泄露,就非常好奇要了解一下到底是怎么做到的。

CSDN:你认为Rust是一种怎样的编程语言?

冯耀明:

  • 首先Rust里面的ownership和lifetime概念真的很酷,就因为这个概念实现无内存泄露,野指针和安全并发。
  • 其次,Rust的语法不简单,也是有不少坑的,据说Rust的潜在用户应该是现在的C和C++程序员,他们可能会觉得比较习惯,说不定还觉得更简单。由于ownership机制,一些在其他语言能够跑通的程序在Rust下就要调整实现了,它会改变你写程序的思维方式。据说一些写Rust超过半年的程序员已经爱上它了!

我感受较深的是下面几点:

  1. 初学者不熟悉ownership机制,会无数次编译失败。但一旦编译成功,那么程序只剩下逻辑错误了。同样,由于ownership机制,将来在项目里修改Rust代码将可能是痛苦的过程,因为原来编译通过的代码可能加入新功能就编译不过了,这是我的猜测。
  2. Rust编译速度慢,不过据说最近每一个Rust新发布的版本编译速度都比之前的版本提高了30%。
  3. Rust没有类,有的是结构体加方法,我喜欢这种简单的概念。
  4. Rust没有类继承,只有接口,虽然接口可以提供默认的实现。这样一来,在大型项目里原来类继承来重用代码的效果是否就要用成员变量实例来完成呢?
  5. Rust没有null,取而代之的是None和Option<T>,也因此,结构体在初始化的时候必须初始化所有字段。
  6. Rust有我一直很想要的错误值返回机制,而不必通过抛异常或者需要每每定义包含结果和错误体实现。
  7. Rust用send和sync两个接口来处理多线程并发,其中Arc<T>和Mutex<T>分别实现了这两个接口,简单易用。
  8. Rust目前没有一个强大的IDE,支持断点调试,变量监控等。

它跟现在动态语言是两个截然不同的方向,它适合一些资深的程序员,我倒是觉得有必要有这么一本书,叫《从C++到Rust,你需要改善的20个编程习惯》,能从实践上告诉开发者Rust里我们应该遵从什么样的编程习惯。Rust未来是否像C那样流行开来成为新一代的主流语言没有人能够知道,但它绝对是值得你去了解和关注的语言。

"优秀的软件开发者不但需要有自己擅长的技术,而且要具备快速学习和解决问题的能力。"

CSDN:你曾表示,「优秀的软件开发者不但需要有自己擅长的技术,而且要具备快速学习和解决问题的能力。」这或许就是和普通软件开发者的区别,那还有其它方面的能力吗?又如何培养这些能力?

冯耀明:还有会判断,会权衡取舍,一个东西我有很多种做法,不同做法有不同的利弊,没有什么通用的法则。就像数据库设计三范式,有时候为了速度就要加冗余数据,而不会去严格遵从它。但是我必须知道有这个三范式,因为它是我考虑问题的依据。譬如代码重用,是否重复出现的代码一定要抽出来做一个统一的接口,也未必,因为有可能将来逻辑更改的话,我就需要考虑到谁调用过这个接口,修改的话有影响了多少其他代码,所以就需要考虑将来这种可能性有多大。又譬如上级坚持要我改变一个我深信很合理的做法,这时候有可能的话我就会多写一部分代码,为将来对方反悔留有余地的同时也不影响当前实现,而很多时候实践过后对方的确会反悔。这种经验除了平时多了解别人的做法,也需要对自己工作不断地反思。

CSDN:当开发者成为技术主管,如何领导团队?

冯耀明:在大公司,充足的资源和成熟的体制能够保证合理的分工职责。而在初创公司里,技术主管需要编写核心代码,通常兼职项目经理保证整个项目的质量,在人手短缺的时候,还需要亲自带新人,责任不可谓不重。

我做团队领导的时间并不长,我的体会是:

  • 技术主管首先自己业务知识要硬;
  • 其次技术面要广;
  • 再次是熟悉开发团队中每一个人的特点和专长,信任他们的同时也要及时提供帮助。

在《人月神话》里,Brooks把首席程序员比喻为外科医生, 需要天分、经验、数学、业务以及大量的系统和应用知识。我们未必都能全做到,但至少它为我们提供了一个努力的方向。

CSDN:对于如今身在大学的学习者,你有什么建议?

冯耀明:我不好给什么建议,毕竟不同的年代有不同的背景,现在时代发展太快速。如果我现在还在念大学,我会利用现在丰富的互联网资源,多接触学校不会提供给我们的知识,开拓自己的视野,多动手尝试,最终会证明付出是有回报的。

>>>【微信群活动报名】用Rust实现一个典型的生产者和消费者的题目


编辑推荐本站 Rust 资源:

0
0