【十问十答】深度对话C++天才Andrei Alexandrescu

导读:国外技术网站ServerSideMagazine对Andrei Alexandrescu进行专访,CSDN软件研发频道对此文进行编译。Andrei Alexandrescu是罗马尼亚人,现担任Facebook资深工程师一职,2001年撰写了一部经典名著《Modern C++ Design》,被认为新一代C++天才的代表人物,书中由于对Template技术的精湛运用,该书震撼了整个C++社群,开辟了C++编程领域的“Modern C++”新时代。本文以Q&A问答形式呈现,深度探讨技术界的热点话题

文章内容如下:

1.请您先自我介绍一下,来自哪里以及在哪儿工作?

Andrei Alexandrescu:我是一名黑客,来自罗马利亚,现居住在美国。2001年撰写了一部经典名著《Modern C++ Design》。这使我相信我能做成任何事,我不再被人们称之为“C++ guy”。我不想被别人称为“XYZ guy”,为此我付出了很大的努力,我花了8年的时间攻读机器学习(Machine Learning)方面的博士学位,专门研究部分自然语言处理结构,又利用5年时间钻研编程语言D。

 

注:机器学习(Machine Learning)是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。

 

目前,我在Facebook任职,一个很高的称谓 “Research Scientist”(资深科学家),涵盖了各种工作职责,幸运的是,我有着相当大的自由选择权。随便抽取我某一周的工作记录,你可以看到,我在应对Script攻击、审查代码、处理一个off-by-one错误,或者甩着头发跟别人谈论Bug。

目前我的工作分为三线,其一,我们的核心工作C++库(typecast!)目前还处在基础阶段,我们正在考虑把部分资源开源。其二,优化配置Hive,Facebook正在使用分布式数据库系统;其三,大部分研究工作是在延续我的论文。

我正在做Machine Learning关于图形学方面的研究。探索Universe中最大的和最有趣的图形。Machine learning社交图中可以给你提供多种应用,比如在垃圾邮件检测、网站的完整性等等。

2.您使用哪些开发工具?

Andrei Alexandrescu:我们将重点关注Windows和Unix两大平台。

Facebook简直就是一个Unix“商店”,Unix工具(技术)无处不在。在Facebook每一位工程师可自由选择MacBook或者Windows笔记本,搭配固定的30寸显示器(yum)。但是开发者们却不在笔记本上进行任何一项工作,他们往往在基于各种协议(普通终端、NX、VNC等)情况下远程连接到Linux服务器(每位工程师都会分配到)。

开发者们可以任意的选择编辑器,Emacs和Vim颇为流行。Eclipse和其他的一些编辑器也是不错的选择,而我个人比较倾向于Emacs和NX,我认为这两者组合起来使用非常完美。

当然,我们还其他有许多组合工具(很多已开发但并未被推出),这似乎听起来有点NIHish,但我们尝试去开发一套属于自己的开发工具,尽管结果失败了。这一点我们应该好好反思下。

我们会用自己的开发套件以便于我们平时工作。如果有人不喜欢,他们可以重新组合。(指邮件和日志软件是现成的)。通过这个工具,我们会有一些“专业”人士发出会议邀请,当然,这还需要有特殊的专业知识以便解决bug问题。

回到我们的工具链来说,一旦某一位工程师通过unit testslint修改代码,代码会通过Phabricator系统自动提交审查,显示所谓的“差异性”,这就是我们的开源。代码审查分为手动部分、自动部分,几乎每一行代码至少会被一个(或多个)工程师检查。Phabricator系统非常好,可以让你填写差异分析,交换意见并修订更新,使用起来非常方便。

一旦“差异性”被获批,就会上传到我们的Git中心数据库。我们非常热爱Git,自我加入Facebook两年前,我们才开始从Svn迁移至Git,直到今天我们依然在使用它。我们会通过编写一些Git流行的脚本,把它融合到工作流程中。

我们使用自己的构建系统来编译C++代码。从始至终我没接触过此方面的工作,所以许多细节方面我不是很了解。我们使用的是最近发布的HHVM(HipHop Virtual Machine)虚拟机和HipHop静态编译器。

我们有不少基于浏览器的工具来提高工作流程,比如:任务管理,讨论、Wiki、同行评审、招聘和面试、分析系统、系统管理等等。几乎满足任何一个典型的“应用程序”需求。如果没有,我们有会提供大量的基础设施,让您可以快速构建。

3.您是在什么情况下开始C++编码?

Andrei Alexandrescu:开始一门编程语言有许多的偶然连带关系,就像挑选一支喜爱的球队或者是迷恋上某人。对我而言,其中大部分是大学时接触到的buzz语言,Pascal是普遍存在的语言,但我仍然记得jocks在谈论“C语言是真实的东西”。C++更像C,但C++支持objects,encapsulation。如果你想构建一个大型的应用程序,它是个不错的选择。

有趣的是,作为一名程序员我从罗马利亚移居到美国前,我对C++理解能力充其量算是一般。而令我吃惊的是,我在美国的第一份工作,我被他们认为是C++方面的行家,正如我之前提到的,这就是我驱使一定要成功的原因。

4.Facebook最初使用PHP,后来用HipHop For PHP这个项目将PHP转为C++,您是如何看待PHP这门语言?使用C++与PHP相比有哪些优缺点?

Andrei Alexandrescu:首先,我得澄清下HipHop For PHP这个项目,是PHP转为C++的转换程序,一个重新实现的PHP运行库。但是生成代码不是意味着供人们使用,它只是编译,我们仍然可以用PHP编写我们的前端开发。

我并不认为PHP是一门被精心设计的语言,它有很多经典错误。Rasmus Ledorf自认为是一名语言设计的爱好者,但是,别忘了,Rasmus是一名知名的黑客,他只做自己喜欢的事情。

于是,他连接和整合了PHP上一切值得连接和整合的东西,并且将网页设计中的每一个典型任务都与黑客相关。我认为这就是PHP就是能力所在。比如,D语言是一门设计比较好的语言,我主要将它与Apache整合在一起。

Facebook对于PHP向来是缺乏热情的,因为工程师认为PHP还远不够完善,还有人会指责它或者展示一些WTF(不好的)的代码示例。尽管如此,在Facebook我们也喜欢做很酷的事情,PHP只是达到目的一种方式,利用丰富的框架和库,这通常也是一种最为简单的方式。

同样的,我们对PHP增加了重要的改进,贡献不少。作为是PHP的一个扩展——XHP,用PHP编写可嵌入XML。我们的前端、后端工程师推荐使用它。同时,我们还增加了Python。是否加入“real”数列组这个主题已经被我们讨论了好多次,PHP的数组很奇怪,无法满足我们的需求。

HPHP是Facebook一个主要的项目,有很多工程师参与,当然,我们还有个新的项目HHVM一个快速的虚拟机。这极大的提高了我们的测试和调试周期,因为它,为我们转投C++省掉了很多步骤。

同样的,我们没有C++开发基础,用C++开发主要是依赖我们的后端系统,实际上,现在C++可视的领域应该与两年前Facebook的PHP相比。

C++与PHP相比,在某种程度上,我是比较倾向于编写好的C++代码胜过编写好的PHP。这是因为:C++典型的Bug要比PHP难以修复,后端开发问题比前段开发要大的多,所以,我们有一个更好的c++代码库只是因为生存的需要。

编译时间(一般管理的依赖性和物理设计)对于C++仍然是个大问题,我们建立了一个专门的场所用以区分复杂的软件,从而降低问题的难度。Deployment系统规模过于庞大, 但现在我们将其很好的控制。我们有并行哈希表带有数百万甚至是数十亿的元素。因此,我们非常小心哈希函数,

我们知道排序和稳定排序之间的区别,我们注重内存分配的成本,locking和atomic increment。C++可以很好的控制这些,而PHP和大部分语言却无法做到。

5. 目前,您在Facebook从事哪方面的研究?(这是机密吗?)

Andrei Alexandrescu:我很幸运能继续从事我的论文工作。其实这种带有很大的风险——PhD毕业生有一个普遍的错误常识,他们让论文随处可见。在我看来,我不赞成此做法,我来解释下。

我研究的课题是Machine Learning运用相似的图形学。简单的说,你有很多的数据信息(用户、服务器、职位、点击、命名),你想弄清楚他们中的一些有趣的特质。基于图形你可以将所有的数据区分开并且链接到相似的边缘,之后,你观看他们如何集群在一起。

例如,我们想弄清楚一个公开状态更新是meme(模仿),还是原创内容,在这种情况下,你需要弄清楚两者职位之间的“相似性”。这并不难,其实有许多参考标准。

那么,meme有什么用途呢?它具备多种用途。它可以将好的内容进行分组,这样在新闻提要里,你便看不到相似的内容;它还提供识别chaff功能,垃圾邮件,甚至是一些恶意的内容。(注:这只是我们一个假设性项目,该项目已引起我们的关注)

在Facebook从事Machine learning研究,是因为它有着庞大的数据库。大部分研究人员乐意将图形上成千上万的节点放在一起。我们几个人花了很长一段时间才弄清楚如何区分许多机器上的图形数据处理,最终我们成功了,不久后,我们会将方法公布出来。

6.D语言与C,PHP,Ruby和其他语言的区别在哪些里?哪些领域可以使用D语言?(主要是研究/科学应用,Web环境)

Andrei Alexandrescu:D语言是一种通用的系统和应用编程语言。它是比C++更高级的语言,同时还保持了生成高效代码以及直接访问操作系统API和硬件的能力。集内置同步机制、内建运行时信息于一身的系统级语言。与当今出现的其他高级语言不同,D语言的定位是系统编程语言,它的目标是既要C语言的强大威力,又要Python和Ruby的开发效率。

在Web特定领域里,D语言可以做的很好,但不利于粗放型库和框架就像Ruby或PHP。

  1. <?d writeln("Hello, world!"); ?> 

可以插入到网页中。

考虑到Vladimir Panteleev的NNTP-HTTP代理协议。它涵盖了一个Usenet newsgroup可将HTML格式实时转换,只能编写在D语言中。不像与之类似的服务端开发可以编译在其他的编程语言中。

7.您对于服务器端开发的初学者有什么建议?以及对开源作者/贡献者有什么建议?

Andrei Alexandrescu:学习如何学习,坚持原则,掌握一门个人技术。

要做技术的主人,莫做技术的奴隶。(Technology is a great servant but a terrible master)

成为某个特定领域的专家。

8.一些开发者想进入Facebook,对此您有什么建议?Facebook在招聘新人时关注哪方面的技能?成为一名CS研究生真的很重要吗?Facebook大部分员具备什么样的技能?

Andrei Alexandrescu:首先,最重要的,Facebook理想中的工程师应聘者应该善于编码。在我们的面试中注重的是他们的编码能力而不是注重掌握特定语言或是技术上。我们希望能找到好的开发者,全能型人才,他们可以在公司组织架构上随意调动。

在面试的时候选择最爱的编程语言。Facebook面试官会接受3-6种语言的选择,他们会根据编码能力进行评估。

我曾亲自面试过一名应聘者,他使用了Java,C,C++,C#,Javascript,Python,Ruby,PHP,Pascal甚至是伪代码(pseudo-code)。

 

注:伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。介于自然语言与编程语言之间。

 

当时,我便建议录用这个会用伪代码的家伙。

我很注重一个人的编码能力。编码是我们的精髓,是工程师从前端至后端系统配置的一项研究。同样是编码,而有的人能让你看到通过简单的算法即可实现。

利用简洁的方法。典型的解决方案类似这个:

  1. char* strstr(char* haystack,char* needle){  
  2.  
  3. for(;;++haystack){  
  4.  
  5. char* h = haystack;  
  6.  
  7. for(char* n = needle;;++n,++h){  
  8.  
  9. if(!*n)return haystack;  
  10.  
  11. if(*h !=*n)break;  
  12.  
  13. }  
  14.  
  15. if(!*h)return NULL;  
  16.  
  17. }  
  18.  
  19. }  
  20.  

使用索引是很好的方法,无须有过多的替代品。或许10个人有11种解决方案,那么哪种才是最好的呢?要避免太多的复杂化或者纯粹的破坏性。

以上这个代码是个很好的标准,因为它非常简洁。空串是任何字符串包括空串本身的子串,较长的字符串不可能是较短字符串的子串。更多的解决方案可参考http://goo.gl/U4poN

关于Facebook的面试题,可以查看http://goo.gl/glnAz。在面试过程中我通常会问一些复杂的问题(有时,甚至连我也不知道答案),但主要是考量应聘者能否提到strstr或是与之相似的层面。遗憾的是,很多人都因此而失败了。

我会把重点放在编码上,因为它是一块敲门砖。当然,我们还有其他的一些考核标准。比如文化适应和设计学/建筑学等各方面能力。即使是专家,除了专业外,他们的编码能力和其他技能方面(比如Machine Learning领域专家)也必须给人留下深刻的印象。

Facebook理想中的工程师是一名伟大的黑客,一个通才(或者在某些领域有卓越成就的人),并且是一个适应能力比较强,能够在不断变换的团队中工作的人。

9. 今年您将出席哪些场合?

Andrei Alexandrescu:2012年2月2-3日,在微软即将召开的GoingNative会议上,我将有两场讲座和一场座谈会议。

随后,还有今年的8月5-8号,Asheville将举办一场C++ and Beyond 会议和NC and at the LASERSummer School on Software Engineering。

我已经在Strange Loop ConferenceOSCON上提交建议书,随后我将在我的网站上公布结果。我们的一组成员计划从事Machine Learning研究工作,届时我们将提交给NIPS

最后,我希望大家能参加Facebook的技术论坛会议,我非常期待志同道合的人员加入。

10.您愿意与我们分享下您未来计划的项目吗?

Andrei Alexandrescu:在Facebook我们将研究对Hadoop Hive性能改进方案。从某种意义说,这项工作不完全是“服务器端”,它更倾向于离线存储和检索方面,而不是传统的线上服务器端数据访问。我希望在今年的某个时候将这个项目开源。

今年还将看到Facebook推出的核心项目C++ library code。我们非常期待,其中大部分是针对高性能计算服务器。

除此之外,我在业余时间研究D语言,我认为D语言是与服务器端开发技术非常密切,同时也越来越重要。

我们并不急于将不同的库(例如MySQL,Apache,CGI等)完全集成在一起,而是更致力于建设标准库。

(注:本文由夏梦竹编译,转载请注明出处)

原文出自:ServerSideMagazine

你可能感兴趣的:(C++)