Jon Skeet,谷歌软件工程师,微软资深C# MVP,拥有10余年C#项目开发经验。自2002年来,他一直是C#社区、新闻组、国际会议的活跃技术专家和Stack Overflow总排名第一的用户,回答了数以万计的C#和.NET相关问题,他还建立了Joda Time的.NET版本Noda Time。Jon著有《深入理解C#》,他常年维护博客Coding Blog。外国程序员们调侃他的段子"Jon Skeet Facts"也很有趣。

图灵访谈:毫无疑问你是一位C#方面的专家,撰写了3版的《深入理解C#》,你有计划为你熟知的其他语言或工具写书吗?

Jon:很遗憾,除此之外我很少有熟悉的工具或语言了。我在Java方面还算比较专业,但是我感觉讲Java的书已经很多了。

这几年,我一直想让自己学习一下F#,Go或者Ruby……我觉得我真应该从某个时候开始学起来。我觉得在我学习F#的时候截个屏感觉应该很棒,这时候要是再有一个具体的学习目标就更好了。我希望让其他人看到我的学习过程会对他们产生帮助。

图灵访谈:你每周花在回答问题上的时间有多少?对你来说最大的收获是什么?

Jon:要弄明白我每周花在Stack Overflow上的时间非常困难——这不是件我想弄明白的事儿,因为我可能并不喜欢这个答案。回答问题会为我带来各种各样的收获,我最喜欢的事儿就是在回答一个问题的同时学到新的知识。另外,有时候我很多年前回答的问题会突然收到新的评论,这个评论来自于现在仍需要面对这个问题的人,他们用我的答案解决了问题,这样的事我也很喜欢。

图灵访谈:很多你的读者很好奇你在Google的工作。Google内部有用C#写的项目吗?是什么项目?

Jon:对于我在Google的工作我不能说太多,但是我可以告诉大家我在Google已经写了两个C#的项目:我的针对C#的协议缓冲(Protocol Buffers)端口(20%的时间)以及Windows Phone 7上Google搜索应用的第一个版本。

还有一些关于访问Google API的C#项目,.NET的Google APIs Client Library是这些项目的根。

图灵访谈:你Google软件工程师的身份和微软MVP的身份之间有冲突吗?如果有,你是如何做到在Google提升你的技术能力的?

Jon:我只是个名义上的MVP,事实上——我并没有在保密协议(NDA)下,我也没有从微软那里得到什么礼物,比如MSDN(微软开发者网络)的免费订阅之类的。但是作为MVP我还是很高兴的,这证明了微软已经认可了我对.NET社区做出的贡献。

要想在Google提升技术能力和在别的公司决然不同,在Google编程的挑战和在其他地方遇到的挑战有着天壤之别。为了要在C#方面跟得上,我都得在自己个人的时间里学习——比如我在Noda Time上花的时间也是我的业余时间。

图灵访谈:确实,C#是一种优雅、便捷、规范化的语言,但是,你认为C#最大的问题是什么?有什么已经存在的语言已经解决了这个问题?

Jon:还是那个问题,我对其他语言知之甚少——所以让我来说哪个语言解决了C#没有解决的问题还是挺难的。比如,虽然以前也被告知过,但是在我习惯于在C# 2里以匿名方法闭包之前,我都不太喜欢这样的用法。这是一个关于Blub困境的例子。我很喜欢C#让处理数据(通过LINQ)和异步代码变得更简单,但是,我不喜欢在C#里大量使用动态类型,虽然我很欣赏C#把这部分加入到语言中。我怀疑未来的语言可能会混合使用动态类型和静态类型,但是要从头开始就这么做——这样就可以避免这两种类型偶尔在C#里产生的矛盾了。

C#曾经有个问题(虽然已经在C# 6中得以解决了)是执行不可变类型时所需要的样板代码的数量。长时间以来我一直都很喜欢不可变性,但是C#在几年来的众多改进中(比如对象初始化设置)都只是帮助提高了可变类型。能看到主构造函数和只读自动执行属性开始解决这方面的问题我很高兴。

图灵访谈:你希望看到C#在未来有什么样的新特性?Go的并行执行goroutines?或者是像F#或Scala那样的模式匹配?

Jon:我认为模式匹配是很有可能的,但是对于goroutines我并不确定……我感觉C#已经选择了异步这条路线,如果混搭上goroutines会显得很奇怪。

说到其他特性——C#最好的特性永远是那些让我产生惊喜的特性。我觉得这样的特性对于我来说就必须要有CLR改变,当然,我的意思并不是它们已经毫无可能。如果代码能明确显示出与之工作的数据类型的话,我就会比较欣赏,这样就可以很好地阻止你在上面执行不合适的操作了。在这样的一些原则下,我更愿意看到可以允许让单一实现分享到多种类型的类型系统,每个类型只能显示底层API的有限子集。在某些情况下,可能会出现在同一个API下的多重类型,但是它们仍旧会是完全不同的类型——可能之间还会有一些显式转换。当然,F#的“测量单位(Units of Measure)”的概念可能也是出于这样的考虑。

图灵访谈:C#或者说.NET似乎只能运行在Windows或者Linux下的Mono上,C#的发展前景对于C#程序员来说似乎也不是很明朗。你认为.NET应该扩展跨平台的兼容性吗?

Jon:我非常高兴能看到像Xamarin这样的工具,它可以让C#代码运行在iOS和Android上,而且,我还买了一台iPad和一台Mac Mini,就是为了探索代码的运行情况。到时候你也可以让C#代码运行在所有主流的移动平台上,还包括Mac,Linux以及Windows,我感觉这还不算是很受限制吧。Mono的边边角角上还是有点糙,这是当我研究Noda Time国际化的极端案例时发现的——但是它的工作性能还是好得让人惊叹。Roslyn现在已经开源,而且已经能被Mono所用也是很振奋人心的事儿。

图灵访谈:微软现在将9寸以下wp授权费降为0。你认为这会增加C#开发者的数量吗?你对WP有什么样的期待?

Jon:因为Windows Phone和Android之间的利益冲突,我觉得我最好还是不要回答这个问题。

图灵访谈:作为一位C#高手,你对C#初学者们有什么建议吗?对于有编程经验的人来说,你想提醒他们在学习过程中要注意哪些事?

Jon:如果是我的话,我会首先关注语言的核心方面。很多写给初学者的书(在我看来)从开始的时候就用GUI和数据库的沟通作为第一章的内容,读者们还不知道他们敲下的代码是什么意思呢!这样做就是欲速而不达。我认为应该先要确保你理解这个语言,之后再去学习一堆关于函数库的知识……如果这样,就算你不知道具体某个调用是干什么的,至少你可以理解你面前代码的运行机制,然后你可以通过查看相关的文档来理解剩下的。

最经常被人误解的C#(以及Java)的方面似乎就是各种变量、对象、以及索引的区别——如果你可以百分之百地确定你理解了其中的区别,那你就已经上路了。

图灵访谈:在中国很多程序员随着年龄增大会转换角色,变成经理,你对这些程序员有什么样的建议?

Jon:从软件工程师到经理的转换在西方也非常常见,我怀疑虽然这有时是个好事,但很多时候也不是。我经常会看到很多经理在私底下都极想要做自己手下工作范围内的编程工作。我是想说,一个好的经理应该有能力用他们的经验来帮助初级工程师变得更有效率,他们可以分享自己的经验,在管理的同时也能指导他们。

从个人角度上说,我很高兴这两样我都有所涉及——我不想把自己和编程隔离,但是肩负一定的管理责任也是一件好事。


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