张淞(@阅千人而惜知己),毕业于牛津大学,目前就职于网易研究院(杭州),著有《Haskell函数式编程》一书。水瓶男。专业黑莓玩家,电子控,业余Haskell,业余Java,业余Linux,酱油C#,酱油C,酱油MIPS。
1. 可以介绍一下你在网易研究院正在做的事情吗?
我在网易研究院做的主要是开发一款数据可视化的产品,我们目前已经完成了数据的收集、数据的存储,而当我们想要更好的理解数据的时候,需要把数据更好的呈现出来。所以说,“呈现数据”是数据分析的最后一步。如何把数据更好的呈现出来,也是一个非常重要的研究方向。我在的这个组主要就是做这个方向,叫做“有数”。现在有一些公司内部在用,我们打算未来推向外部商业化应用。我呢,主要就是负责其中一个模块的开发工作。
2. 你觉得在网易的工作氛围怎么样?
我觉得很不错,大家都很友好,没有什么办公室政治或是勾心斗角类似的事情。团队成员都是从各个部门抽调过来的比较厉害的人,所以说我的压力也比较大,因为团队成员不会拖你的后腿,只有可能你拖人家的后腿。我之前没有搞过一个工程项目,所以说自己给自己的压力还是蛮大的。但是有比较好的队友,感觉还不错~ 另外,跟我有直接工作接触的队友是我的学长,他是因为我的推荐过来的。网易有着比较轻松自由的文化,也没有人强迫你去做事情,相对来说有比较宽松的氛围,你有时间去做自己的事情,公司也不会用所谓的企业文化给你洗脑,比较轻松自由和开放。
3. 在牛津读书是一种怎样的体验?
累,特别的累。我一个学期有三门课,共三个学期,基本上算是压得人喘不过气来。要完成作业,要准备考试。作业每个星期都会有,而且需要思考很长的时间才能大致知道该怎么去做,当我做完交了以后,另外一科的事情马上又出来了。实际上,一周学三门课的话,每门课花上两天的时间,其实就已经没有什么自己的时间了。
有几门课程,来自同学的压力比较大,比如有一门范畴论,是要跟好多数学系的研究生和博士一起上课,明显感觉他们的背景是我没有的,所以在上课听讲的时候,老师讲的东西我听不太懂,但是其他同学都在点头。我特别想去学这门课,因为跟编程有一点关系,所以就选了这门课,不过学起来确实很吃力。另外一门课叫做λ验算与类型,教这门课的老师是牛津最好的教授。他对于这件事情的理解已经达到了非常透彻的程度,因此讲的也特别好,很清楚,他的助教也非常好。老师是个大师级别的人物,所以当老师在白板上写字突然笔没有水了,我就恨不得到处给他找笔,仿佛他少写几个字,我就会有很大的损失。所以说压力还是很大的,虽然一学期只有三门课。我选的这三门课属于比较困难的课程,我的personal tutor也说过,不推荐我这样选课,但是,我比较任性嘛(笑)。
4. 你在英国的诺丁汉完成了本科学业后,为什么选择去牛津继续学习呢?
一方面是因为我对于高考的结果不是很甘心,因为我数学物理非常好,我认为我并不比那些考清华北大的人的数学和物理差,最终没有想去自己想去的大学,还是挺不甘心的。另外就是,我在英国读书时,网上公开课已经开始冒出苗头,比如MIT将算法导论的课程放到网上公开给大家学习,《计算机的构造与解释》的作者也有一些公开课视频,听了以后我很明显地感觉到顶级学校的老师讲课的清晰度,以及对于内容呈现方式的不同。
虽然我们学校也不错,但是像算法这方面的课,跟MIT比起来,差距还是太大了。人家的课对于本科生非常友好,讲的很清楚,板书、笔记等等,没什么可以让人挑剔的地方。另一方面,我也一直有上名校的梦想,其他学校跟名校相比,确实存在很大差距,我的家人也非常支持我,最终就只申请了牛津,也顺利地拿到了牛津的offer。
5. 你说过Haskell是一个非常严谨、有条理的语言,你为什么这么喜欢钻研Haskell呢?
首先,我的第一门语言学的是Java,可能还是自己的编程经验不太足,那时候我还是学生,就会犯各种各样奇奇怪怪的错误,比如说把<写成≤,或者本来应该写i减1,我只写了i啊之类的,类似这种琐碎的错误。我还是学生的时候,想把排序一次性写对,但是发现很困难。开始学了Haskell的时候还并没有觉得它有多好,但是随着我学的越来越深入,就觉得,很多东西我有能力去一次性写对了。由于Haskell的代码语法设计的比较好,我能看到我自己写的代码逻辑特别清楚,我想表达的意思能通过Haskell完美地表达出来,不用再去关心设一个临时变量,再搞个循环什么的。虽然现在的工作没有直接用到Haskell的地方,但是很多思想都是来自Haskell,是通用的。
我工作的时候会用到Clojure,也是一门函数式语言,但是它是基于Lisp的方言。我之前在网易之前是不会Clojure的,但是因为我之前会Haskell,所以我用Clojure的门槛就变得特别低,直接拿起来就能用,这是我学Haskell函数式编程的一个好处。一个新语言出来了,我可能大概看一下,就大约知道是怎么回事了,然后就直接可以用了。有一些代码的优化,在纯函数式编程里面是通用的,比如说有一些固定的规则、等式的优化。这个在我做开发的工作中遇到过几次,有一些代码要写两次,我当时觉得这两段代码肯定是可以合并的,但是没想的特别清楚。后来就在一个特别聪明的同事的帮助下,我就把这段代码直接合并了。
6. 函数式编程相比面向对象编程有哪些优势?
首先需要明确的是,它们之间的关系是,你能干的事情,我也可以干。两者在理论层面上是没有太大差别的。但是在具体实施的时候,面向对象编程可能要顾虑一大堆的东西,比如说这个东西怎么设计、对象之间怎么继承、要采用什么设计模式、怎么样可以让软件的架构比较合理等等,要写一大堆非常啰嗦的东西。比如java就会这样,这么说可能会让写java的人不高兴。但是如果他们愿意去尝试一下带函数式特性的语言,比如说Scala, Clojure, Haskell, 就会发现这些语言写出来的东西会大幅度缩减代码量。可能之前需要十句话写出来的东西,用Clojure只需要写一行,就可以把这个事情做好,这样就不用加班了,这是最直接的好处,如果现在的项目用java来写我是无法想象的。函数式编程表达内容的能力是非常强大的。
7. 现在正在写的书主要是什么关于什么?
现在正在写的也是关于Haskell的,已经写了七百多页了,这本书把我上一本书给囊括进来了,第一本书是从2011年开始动笔的, 2014年出版,中间因为工作原因休息了一段时间,但是工作期间我也在筹划第二本接下来要加进去的内容,把整本书的内容写的更加全面,易懂,章节安排更加合理一些。全书将分为基础篇、初级篇、入门篇、中级篇、进阶篇、工程篇与理论篇几块,整个的过程并不是线性的,而是螺旋式上升式地对Haskell进行一个相对比较系统的学习,有的概念我会反复地介绍,但是每次介绍都会有不一样的深度,一方面是想让读者能把Haskell比较理论的部分理解好,比如类型系统、编程语言原理以及范畴论,因为很多理论性的指导正是在我们的编程过程中需要的;另一方面也是希望读者可以在工程实践中真正用到Haskell,希望这本书能尽快和大家见面。
8. 一般都是什么时间写书?写书对你来说是怎样的一个过程?
现在写书一般是下班或者周末。有的时候,写书是学习的过程。有的东西我觉得我已经懂了,但是真正要把它写到书里面,非常清晰地让别人也弄懂,这是两个层级的东西。另外,背后还是会有很多细节,是我在写书之前不知道的,现在为了写书,我就得去把这些东西全部搞清楚,所以说这是一个学习的过程。另外,还是一个蛮享受的过程。因为有些东西背后的理论特别的精妙,会让我觉得,让值得写了,会有文思如泉涌的感觉,这个时候是比较享受的,比较爽的。但是有些时候,我会发现,这个东西不管怎么写好像都不对,放在这里不对,放在那里也不太对,就会陷入很纠结的状态,这个时候就比较郁闷。所以说,写书像五味杂瓶一样,各种感觉、感受都会经历到。
9. 你在知乎上说,学了Haskell五六年,也没敢说有多精通,为什么?
当我看到国外那些人,比如有PhD的人,微软研究院的首席研究员,还有美国的教授,还有一些Haskell库的作者,当我看到这些人写的论文、源代码和工具,就觉得自己想要达到他们的水平还有一定的距离,难以想象要付出怎样的努力。我自己甚至也没有想出一个路径,一个规划,去达到他们那样的水平。我现在也是在摸索的阶段,不敢说自己在这方面是精通的,只能说,我比别人走的快一点,但是真的拿到国外去跟他们比,是不在一个级别上的。
10. 为什么叫“阅千人而惜知己”这么沧桑的网名?
首先是想避免跟别人重名,在网上辨识度太低了。这个名字的灵感来源于古文“操千曲而后晓声,观千剑而后识器。”是一个人生经历积累的过程。于是我就写了一句话来表达我的人生感悟:“览群书始觉自愚,阅千人而惜知己。”从小学到大学,再到工作,认识了起码小一千个人了,这些人中能跟我有日常交流的,并且互相认同的,都是很难得。
11. 你是个电子设备迷?
我对所有电子设备都蛮感兴趣的,愿意去尝试。上学的时候喜欢淘黑莓手机,比如国外的合约机。后来自己赚钱了,意识到自己之前花爸妈的钱买了那么多手机,还挺败家的(笑),经常换。感觉现在反而玩够了,apple watch, iPad Pro出来了以后,没有特别新奇的感觉,我现在用的是坚果手机(此处求锤子广告费),因为我觉得现在的手机性能是过剩的,每天就聊聊微信,刷个微博,看个网页和知乎,再就是用滴滴打个车。我真的需要很好的CPU吗?并没有。我也不打手游。
黑莓全家福合影:黑莓8900、黑莓9000,黑莓9700,黑莓DevAlpha C,黑莓9900,黑莓Z10
12. 你平时关注哪些国内外的博客和论坛吗?
国外的论坛主要是会看一下reddit,上面经常会有Haskell的讨论。另外就是Youtube,国外虽然不是特别流行Haskell,但是肯定比中国要好一点,国外经常会有一些Haskell的会议,会有课程的视频记录和分享,所以我会在Youtube上关注一下。另外就是关注英国微软剑桥研究院里有个教授,他写的论文和研究方向。还有一个美国宾夕法尼亚大学要毕业的一个博士,他在写如何改进Haskell的编译器,加了一些新功能,我在等着看他的PhD的论文。