“多语言者”是什么?我听到你这么问了……嗯,按字典的说法,就是掌握多门语言的能力!那怎样才能成为“多语言者”呢?去跟 Erik Schierboom 聊聊,一探究竟吧!
Jonathan:大家好,欢迎来到 Exercism 播客,也就是我们的直播。我叫 Jonathan,很荣幸能担任今天的主持人。今天和我一起的是 Eric,他是 Exercism 团队的一员,已经参与了好几年。如果你在过去几年里接触过 Exercism 的生态,那你多半在某个环节遇见过 Eric。Eric,非常高兴能邀请你参加今天的节目。我很期待多了解一些你的故事,你是怎么进入科技行业的,以及你对科技领域各种话题的一些看法。不过在深入聊这些之前,我想先请你做个自我介绍,讲讲你的背景,也讲讲你是怎么走到今天这一步的。
Erik:好的。非常感谢,很高兴能来这里。就像你刚才说的,我叫 Eric。我住在荷兰,也是在那里出生的,所以我一辈子都生活在这里。我想想自己是什么时候第一次真正用电脑做点什么的。我想应该是 NES 游戏机吧,玩 Mario。然后我就迷上了。真的很棒。不过也很让人抓狂,因为那时候的游戏一点都不留情。
Jonathan:那时候也没有存档点之类的,只能从头再来一遍。
Erik:嗯,这要看你是住在美国还是世界其他地方,因为其实有两个不同的版本。不过没错,我记得是打开前面的插槽,然后把光盘或者卡带放进去。我特别特别喜欢那个。我们家没有 NES,但我有几个朋友有,所以我经常去他们那儿玩,玩过好多很棒的游戏,也有让人抓狂的游戏。但那真的是特别棒的经历。然后我就这么迷上了。我觉得很多程序员都是这样入坑的,就因为想做一款游戏,才想成为程序员。我也想过。剧透一下,我从来没做成,我不是游戏开发者。好了好了。不过那正是我开始喜欢上电脑的原因。还有,我父亲在我出生前出过一次意外,肩膀以下瘫痪了,所以他坐轮椅,但他一直在家里,这很好。所以我有个全天 24 小时都在家的爸爸,放学回家总是很开心。他也喜欢电脑。所以我大概 10 岁的时候,他弄来一台很不怎么样的电脑,我想是 X286,黑白的,装了 MS-DOS。上面能玩游戏,游戏特别多。我还从朋友那里弄到了一些游戏,他们得把所有带密码的纸页打印出来,按顺序输入才能启动游戏,因为那时候有密码保护,就跟说明书一样。现在可没法这么搞了,但那时候可以。我很喜欢玩那些游戏,但我也很喜欢试着弄明白它是怎么运作的。我弄坏过电脑,都数不清多少次了。我有个“求助台”,是我一个朋友的父亲,他电脑特别厉害。每次我把系统弄坏,我就打电话给他,他都特别好心,过来帮我修好。但我还记得,当我发现自己没法从这个麻烦里脱身时,那种惊慌失措的样子。不过我从中学到了很多。
Jonathan:这个麻烦。不过我从中学到了很多。那时候游戏是装在软盘上的,我记得我攒了好几年钱买这个东西,然后放进去,结果它就是用那些小软盘怎么也加载不出来。那是让我特别挫败的一件事。我觉得我一直没能真正弄明白怎么修好它。不过那时候游戏是装在软盘上,你得把它放进一个小卡盒里,再导进去,诸如此类,是这样吗?
Erik:从来没有。
Jonathan:是的。
Erik:是的,有时候你得用好几张软盘。所以,那其实是一段很棒的时期。我很喜欢 MS-DOS,喜欢去摸索自己能做什么,然后又发现自己做不了什么。所以,真的很酷。
Jonathan:是啊,真的很酷。那你妈妈是全职上班吗?你爸爸就待在家里?
Erik:不是,我妈妈全职照顾我爸爸。他需要很多照料。一开始他还能用手挪动,后来手开始没那么灵活了,控制力下降了,他就改用下巴操作。但我妈妈一直全职照顾他。所以我父母总是在家。对我来说,去别人家看到他们的父母要上班,感觉特别奇怪。一天都过去了,他们的父母还没回家,我真的很不习惯。不过,情况不一样嘛。
Jonathan:对我来说真的很奇怪。就你一个孩子吗?
Erik:我有个妹妹,比我小三岁。谁都看不出来我们是兄妹,我们太不一样了。我小时候经常跟她打架,不过现在我们关系很好,结局还不错。她不喜欢电脑,所以不会来抢我用电脑的时间。
Jonathan:不过我们经常为了电脑吵架。她想玩 Sims,我想玩 SimCity 之类的。所以在这方面我们总是针锋相对。
Erik:当然是 SimCity 好得多。不过她其实一直对电脑没兴趣。唯一能让她感兴趣的,是我有一台 SNES,也就是 Super Nintendo,上面有 Mario Kart。她确实喜欢 Mario Kart,所以我们一起玩了很多。当然,总是我赢,因为我练得多得多,但她还是很喜欢。
Jonathan:所以你还是很喜欢折腾?MS-DOS,如果我没弄错的话,算是挺底层的那种。所以那大概挺底层的。对,绝对底层。那你玩那套系统的时候是几岁?
Erik:好。确实挺底层的,对,绝对底层。那时候我大概 10 岁。后来我有个朋友,他跟我一个足球队的,应该说就是足球(英式足球)队的。他已经是个不错的程序员了,真的能编写游戏,用的是 Visual Basic。我完全惊呆了。他会到我的电脑前,演示打字,我什么都看不懂。但半小时后,他就在屏幕上做出了一个会走动的东西,对我来说简直像魔法一样。我当时完全看呆了。但那时候我从没真正尝试过编程,我还是觉得太难了,连试都不敢试。所以我没去做,只是瞎折腾、玩游戏。
Jonathan:我……我插一句。
Erik:然后等我再大一点。
Jonathan:你是怎么把那层联系建立起来的,就是“哦,我可以编程做游戏,我可以把这当成一件正经事”,如果你明白我的意思,或者我可以更认真地把它做下去。
Erik:对,那是后来的事。我大概 17 岁的时候,基本上就得选择走哪条路了。我脑子里有两个选项:一个是学历史,另一个是学 IT。最后这个选择其实挺简单的,因为我觉得 IT 比学历史更让我喜欢一点。历史里可能有很多很无聊的部分,我当时以为计算机科学里不会有无聊的部分,但当然还是有的。所以我错了。是的。这个我们可以以后再说。确实有无聊的部分。但我当时做了这个选择。那时候一切都在蓬勃发展,正是互联网泡沫时期。我去参观高中要升学的学校,那是一所应用科技大学。所以我可以在应用科技大学和大学之间选择。但我喜欢应用科技大学,因为我想动手做东西。我不是什么理论家,我不知道该怎么说,反正我不擅长理论。我喜欢做东西,我很实际。所以我从实用的部分开始,我很喜欢。那时候各家公司在赚大钱,他们会说,嘿,你一毕业就能有车,有这个有那个。结果等我毕业的时候,互联网泡沫破了,一切都乱七八糟,找工作其实挺难的。那时候我想,也许我干脆试试上大学吧,因为应用科技大学那段经历很有意思,而且我其实是在那里学会编程的。但我想,也许我把职业生涯往后推一推,看看我能不能读大学。所以挺不错的。
Jonathan:据我了解,欧洲的教育体系很快就给人分流,一部分走偏实践技能的路,一部分去上大学,可能更偏学术路线。荷兰也是这样吗?他们是不是也很擅长对学生说“嘿,你特别适合这条路”?我知道在瑞士,那是我比较熟悉的参照,如果你手很巧,你可以说,好,去当学徒,用那种方式学一门手艺。而且这并不比上大学更差或更好,只是更符合你的偏好。荷兰也是这样吗?你成长过程中经历过这种分流吗?
Erik:我不会说它被看作同等。人们还是觉得,上大学、而不是读应用科技大学,更好、更难,至少更有面子。你还能拿到不同的学位头衔。但对我来说这没什么吸引力,太偏理论了。我想学编程,因为我还没学会编程。我知道自己大概会喜欢。我见过一些 HTML 的片段,但从没真正写过一行代码。但我相当确定我会很喜欢。等我开始学的时候,第一年我基本上一行代码都没写,只是跟着几个同学一起混,因为其中一个人是特别厉害的程序员,什么都懂,什么都他做,我根本没机会做什么。但到了第二年,我下定了决心:这样下去不行,我永远学不会编程。于是我全力投入,拼命写代码。那是一次深耕。我从 C 语言开始,用它入门真是糟透了。我不打算细说我怎么看 C 这门语言本身,但作为入门语言,它非常难。第二三课就让人做链表,如果你没有任何基础,作为学生你肯定不会喜欢。但我还是写出来了,而且特别喜欢,于是我开始大量利用业余时间编程。我几乎是自学的,因为学校教得真的很差,我的办法是先找一个自己想用的东西,然后把它做出来,至少试着做出来,因为一开始你就是瞎扑腾,做不出什么有用的东西。但最终,就是练习、练习、再练习。我发现编程是一门靠动手才能掌握的技能。你可以学一堆理论,看上一千万个视频,但如果你不真正花时间去做,我觉得你永远成不了好程序员。你必须动手。这是一个很大的跨越。我还记得自己能读懂代码时的样子,挺得意的。但接下来要自己写代码,那才是巨大的一步。
Jonathan:挺得意的,然后要自己写代码,那真是巨大的一步。过去几期节目里,我都会问人们是什么时候对编程开窍的,对你来说有没有那么一个瞬间,就是你突然恍然大悟,心想“哇,这一切都讲得通了”?是你之前一直在瞎扑腾,努力去理解理论,还是有一个瞬间让你觉得“好吧,这个其实挺直接的”?
Erik:我觉得我没有哪一次是单独的顿悟,而是有好几次。它是分阶段来的。我记得我写的第一个真正的程序是猜词游戏。就像现在很火的那个……嗯,有点像 Hangman,那就叫它 Hangman 吧。但那是用 C 写的,而且我真的让它跑起来了,能玩自己做的游戏。于是我稍微明白了一点其中的原理,然后你又进步一点。我还做过一个跟互斥锁有关的东西。就是有一些火车,它们不能相撞。当它们交叉的时候,你可以用一个互斥锁。互斥锁基本上就像一个“停”或“行”的标志。那特别有意思,我挺满意的。于是我把它交给教授。他对我说,但如果我想要四列火车呢?我当时就想,哦,哦,哇,我没考虑到这个。这就点醒了我,而它只是一句话而已。我想,哦,我本该考虑到他可能会问这种问题。于是我花了一个周末,试着把代码参数化,好让你能有多列火车,我做到了。我是硬塞进去的,写得不漂亮,但确实能用。那又是一个让我觉得“这真的太酷了,我能做这类事情”的时刻。
Jonathan:酷,我懂你能做这类事。从认识你我就知道。而且从学编程的过程来看,有一个流程就是先随便写下来,让它跑起来,然后再去完善。你也是这样吗?就是先把它写下来、让它能用,别的都不管,然后再打磨。
Erik:是啊,我第一年左右就是,只要它能跑起来,我就特别特别开心。根本没有什么美观不美观的概念,能跑就是好的。我在给代码加注释方面完全走火入魔了,因为我的教授说,你必须给代码加注释。代码和注释的比例大概是一比十,非常夸张。对了,我最老的那个项目现在还在网上,那是我第一个开源项目。你记得 MSN Messenger 吗,就是可以发消息那个?
Jonathan:嗯,有点印象,但不熟。
Erik:你记得 Winamp 吗?
Jonathan:记得。
Erik:对,Winamp 是个媒体播放器。那是在 Napster 时代。你下载 MP3,然后用 Winamp 播放。我当时想做的是,如果我在放一首歌,我希望它自动附加到我在 MSN Messenger 里的昵称上。那时候我很热衷于做 Windows 编程,也就是 Win32。它非常老派,跟我们现在用的完全不一样,但很底层,也很酷。所以我用 C++ 写了一个插件,C++ 是我当时最喜欢的语言,不过我那时也就懂三门语言,所以这也没什么说服力。反正我做了个插件:如果 Winamp 在播放,它就通过那些花哨的 Win32 API 获取歌名,然后更新你在 MSN 窗口里的昵称。这样所有人都能看到我在听哪首歌。我真的把它放到网上了,因为我想也许别人会喜欢。我记得是在 SourceForge 上,现在没人用了,因为他们好像出过隐私之类的问题。但世界上真的有别人在用,我特别惊讶。我能看到下载量,大概几百次下载,别人在用我写的软件。那感觉简直太棒了。那是我第一个开源程序。我从来没怎么有过冒名顶替综合征。我觉得这就是我的代码,如果有人觉得它不好,那也没关系。它能用,我就满意了。我也能从别人的评论里学习。我从来不是会犯冒名顶替综合征的人,认识我的人对此不会感到意外。
Jonathan:我不会觉得意外。说说你在大学里对教授和老师的体验吧,有没有哪位老师特别让你印象深刻,他们的教学方式加速了你的学习,或者对你的编程理解产生了巨大影响?他们具体做了什么,让你能把理论和实际实现之间的鸿沟填上?这个问题有点大,你可以随便拆成多少块来讲。好。
Erik:好。我得把应用科技大学和大学分开来说。先说后者,在大学里,我觉得教课的人的整体水平非常非常低,门槛很低。我的感觉是,大学里很多教课的人之所以教,是因为不得不教,而不是因为想教。在大学里,你很多时候想做研究,但你得花一定的小时数去教学生。这也是工作的一部分,但他们其实并不喜欢。我学会编程之后,本来还想再多学一些,于是在那里选了编程方向,但实在太差了。我几乎有点生气,因为他们想传授给我的编程知识水平那么糟糕,于是我干脆转去学安全。我其实并不真的喜欢安全,但编程那部分实在太差了。我总说,我的大学生涯里,真正学到的唯一东西,是怎么正确地写文章,怎么做规范的文献研究,让你清楚自己的来源,而不是随便什么来源都接受。这些我那些年是学到了,但关于编程,我什么都没学到。
Jonathan:这听起来也很像历史学,比如你怎么审视一个来源,怎么确保你的论证站得住脚,诸如此类。那历史和它的乐趣,这些技能……
Erik:很多都有关。
Jonathan:它们是怎样体现在你的编程和学编程里的,如果有的话?有哪些相通之处?
Erik:这是个难回答的问题。嗯,两者都涉及大量阅读。历史就是阅读。而编程也是阅读代码。你真正写代码的次数,远远少于你读代码的次数。所以它也很像阅读。如果你换了一份新工作,一开始要面对一套古老的遗留系统,得摸索出它的门道,那感觉有点像当考古学家。就像你在各个角落和缝隙里窥探,看看里面藏着什么,有时候还会从柜子里翻出尸体之类的。所以感觉有点像探险。嗯,那你到底喜欢它哪一点?我不知道还有没有别的,乐趣究竟在哪里。
Jonathan:谢谢。那你在这个行业里的乐趣在哪里?
Erik:主要是,老师讲的那些故事。比如海盗,他们会讲有人被绳子拖到船底之类的,讲得画面感十足。我就喜欢这些,真的很喜欢。我也很喜欢罗马人和他们的文化,喜欢他们如何扩张。当然还有政治,勾心斗角之类的,我特别喜欢。我高中还学过拉丁语。我一点都不喜欢拉丁语,但我很喜欢要翻译的那些故事。所以我不喜欢被迫学拉丁语,但我们得翻译的那些故事,我倒是喜欢。不过两年后我就放弃了。
Jonathan:那些我倒是喜欢。不,我问这个,是关于历史,是因为……
Erik:是的,我知道你想说什么。
Jonathan:我见过一些人喜欢偏文艺或偏社会的学科,怎么说呢?也许在英式框架里叫 arts,就是艺术和历史这一类。我越来越多地看到,喜欢这类领域的人转而学起了编程。我之所以感兴趣,是因为两者显然有……相通之处,而尝试把这一点梳理清楚,是我和不同人聊天中特别有意思的一部分。感觉上,如果你能把握全局,又能把所学的不同领域的多学科方法带进来,这对编程大有好处,因为你能把不同的技能应用到编程里。我觉得,嗯,我就想说这一点。所以很有意思,你喜欢历史,现在你又积累了 30 多种编程语言的经验,还维护着其中很多。嗯,也不一定叫维护,但你在 Exercism 上深度参与管理所有这些语言,那是你的……好,你说吧。
Erik:多少是你的?我能稍微回到你刚才说的那点吗?你提到有很多不同类型、不同兴趣的人在做编程。但我认为之所以如此,一个原因是编程同时吸引两类人。它吸引很有技术头脑的人,因为它有严格的规则,语言非常固定,有语法,有句法。这些东西很符合那些喜欢事物按某种方式排列的人,比如如果你是物理学家,你喜欢规则、喜欢定律之类的。编程里也有这类东西。但它也像一门艺术。所以有时人们把它比作写书,我到现在还是觉得……那大概是比较好的一个比喻。我不喜欢盖房子那个比方,因为如果照我们写软件的方式去盖房子,那谁都盖不出房子来。但我觉得它确实既是科学又是艺术。Jeremy 最近在 Dig Deeper 的内容里提到过这一点:一个很简单的练习,人们能想出几百种不同的解法,哪怕你觉得“嘿,这应该只有一种解法”。但解法永远不止一种。这正是我喜欢编程的地方:你可以先做出一个能用的东西,然后还能去探索另外 20 种可能,你写出来一看,嘿,这个也能用。就是这种既是艺术又是科学的结合,我特别喜欢,因为我觉得这也是我唯一能真正发挥创造力的地方。我根本不是一个有创造力的人。我有左手也有右手,但你看得出来,如果让我做家务、做木工之类的活儿,你根本看不出我会这个。我不擅长那些,部分也是因为我父亲没法教我。真有意思。
Jonathan:不过话说回来,我对那些也完全不感兴趣。我上学时学过艺术,学过音乐,弹过吉他之类的。所以对我来说,创造力的框架一直都在绘画或音乐这些东西里。我从来没真正考虑过代码的创造性。既然你提到这个,那你是怎么体现的?比如你弹乐器吗?你喜欢音乐,我知道你喜欢音乐,我只是想把这两者联系起来。
Erik:嗯……我确实弹,我确实弹。对,我试过学吉他。这可苦了我妻子,因为我们当时住在她的学生公寓里,大概 20 平方米。我一边学吉他,我们俩又离得那么近。我到现在还很惊讶她居然忍了下来。但我没有……
Jonathan:就是……
Erik:我对乐器没有任何天赋。我得非常非常非常努力才能勉强达到某个水平,而那水平其实还是很低。节奏速度什么的,我还行。但有一次,我的吉他老师让我即兴演奏,然后独奏,我完全懵了。我怎么都做不到。我身上就是没有一点音乐创造力。
Jonathan:我身上没有一点音乐创造力。那编程呢?跟这个不一样吧。当你接到一个新的编程任务,比如 Jeremy 给你一份需求简报,或者 Exercism 里有个功能请求,说我们要做 X、Y 或 Z,这会让你在精神上很振奋吗?你会不会觉得“哇,好,咱们好好探索一下”,并且享受这个过程?你是不是在某种意义上就在这上面“活”过来了?
Erik:跟我不一样。好。对。就是,编程就是有个想法,然后把它变成某种东西,你几乎像个小造物主,对吧,从一无所有开始,你有了一个想法,然后就有了东西。这太神奇了。我到现在写脚本时还会特别特别兴奋。所有这些一行一行的文本,然后你看到它真的在做事。看到计算机按照你说的去做事,太有意思了。我还是很喜欢。所以创造力这方面,也体现在你去探索要用哪种方式搭建某个东西。而等你把它搭好之后,你大概听说过重构的循环:你先有一个能用的东西,然后开始迭代,看能不能把它做得更好。我特别钟爱重构。有一本书,在哪儿呢?哦,我看不到,它放得离镜头太远了。就是 Martin Fowler 写的 Refactoring。那是我阅读软件相关书籍中体验最好的一次。我特别爱重构。就是这样一个过程:你有个能用的东西,但你可以让它更好、更漂亮、更快,看你的标准是什么。这也是我特别喜欢 Exercism 的原因,它就是为这个而生的:你通过测试,然后有个测试框架,你可以随意处理你的代码,只要它是绿色的,就说明还能用。所以。
Jonathan:我很喜欢这点。那我继续把话题拉回到不同的时间线上。现在你读完了大学,学会了编程,你真的算是下了决心,说“好,我要投入这个学习过程,要深入钻研”。那从你真正投入之后,接下来发生了什么?你大概开始考虑职业了,而上大学总有一大部分是这样的:我余生要做什么?结果如何?你当时是怎么想的?你面前打开了什么样的路?
Erik:好。我其实从来没考虑过自己的职业。我觉得我这辈子都没这么做过。我唯一真正在乎的,就是做自己喜欢做的事,而且最好离家近一点,这样不用开很久的车。我不喜欢长时间开车。不过不,我真的从没考虑过职业。而且我也一直特别幸运。我基本上从没需要投简历找工作,也许就一两次吧。我总是有朋友,或者认识我的人。Exercism 也是这样。Jeremy 认识我,我不用去申请、去经历,我不知道,像你那样四五轮不同的面试。顺便说,你可能还要更多轮。但……不,不,我知道。但我一轮都没有。我找工作也是这样。我上学的时候一直都在打工,甚至高中的时候,我总在想办法挣点钱,因为我父母没什么钱,我得挣自己的那份。但我喜欢工作。我想我上大学的时候,大概花 20 个小时做编程的工作,因为我们在大学里实际要待的时间很少,所以我能挣不少钱,我还用这些钱买了一大堆 DVD。
Jonathan:这个我们就不细说了。
Erik:这个我们就不细说了。对,抱歉,其实我把大部分都送人了,只留下那些我有特别特别美好回忆的。大部分都送出去了。我一度有 400 到 500 张 DVD。
Jonathan:一度有 400 到 500 张 DVD。哦,有意思。
Erik:差不多是这个数,差不多。对。我上大学的时候,有个朋友,就是我 10 岁左右时那个会编程的朋友。他跟我一起上大学。他当时有份工作,就问我:“嘿,你想不想加入这家公司挣点外快?”我就去了。然后我基本上就一直待在那儿。等我大学毕业,他们问我要不要读博。但我把那理解为:你想读博是因为你发现了什么有意思的东西,顺便说一句,那纯粹是运气,我是做了工作,但也是运气。我把他们的话理解成:我们想在你写的东西上署名,这样我们就能有篇论文发表。所以我不想干。我不想花四年做理论的东西。整个学术界也不怎么吸引我。我在公司里做实际的东西要自在得多。所以我就留在了当时工作的地方。我用的是 PHP,我们团队很棒。我想,除了现在这个团队,我从没在这么多元、这么有能力的团队里工作过。但我们的管理层特别差。那里的技术氛围特别怨气冲天。就是不太好,但我还是玩得很开心。不过 PHP 不是我喜欢的语言。我很喜欢 C#。从它还叫 C# 1.0 的时候起,我就是它的粉丝。那时候它还挺粗糙的。我从美国订书,还得多交税,最后挺贵的,但我到现在还经常用那本书。后来我说,我想把 C# 当工作来做,而不只是业余爱好。于是我去应聘了。其实也是为了大学,但不是做研究之类的,而是为大学的各个部门提供支持。我做 C# 大概做了七年。
Jonathan:我做 C# 大概做了七年。跟我讲讲那段的经过吧。因为你是从志愿者或者说贡献者开始的,对吧?然后你一步步做起来了。
Erik:对。我在大学工作的时候,学校在让你学习东西、去参加会议之类的事情上非常宽松。有一次,我听说了“函数式编程”这个东西。我想,嘿,我不太了解这个。我知道大学里教过一节选修课,但我没真正碰过它。我想,也许我该学学函数式编程,也许会很有意思。我还拉了一个同事一起。于是我们在 Coursera 上上了一门免费的 Scala 课程,现在做得付钱,但那时候不用。课程是 Martin Odersky 教的,他是 Scala 的作者,Scala 是一种函数式语言,Exercism 上也有。学函数式编程我特别开心,但有时候在脑子里的确挺费劲的,因为那是一种完全不同的思考方式。不过我还是坚持了下来,也很喜欢。课程有个论坛,你可以和其他学生讨论,比如你解不出来的练习。但有人问,如果我想更深入地学 Scala,可以用哪些资料?有人就提到,嘿,试试 Exercism,上面有很棒的东西,你能做很多不同的练习,就像小谜题。我想,嘿,这听起来不错。于是我加入了,做了 Scala 路线。我真的学到了很多。那是我第一次涉足函数式编程的世界。我想,也许该深入一点。于是我转向了 Haskell。对我来说,那在当时是一次真正的深耕。不过那时候 Exercism 还是 V1,就是别人给你的代码评论,没有什么正式的导师系统之类的。但 Haskell 那帮人特别棒。我基本上是从他们那里学会 Haskell 的。我大量地用谷歌搜索,找到一些非常古怪的解法,我自己也写出一些古怪的解法,但他们总会试着把我引向地道而优雅的 Haskell 写法。那是一次特别棒的体验,让我想,嘿,我也应该对别人做同样的事,也许我也能帮上忙。我一直喜欢帮助别人。所以我想,我来做 C# 吧,给别人的 C# 代码写评论。我挺喜欢的。后来我发现,嘿,C# 路线有,我不知道,40 个练习,而 Haskell 更多。为什么?于是我想弄清楚原因。然后发现,嘿,你可以给 Exercism 提交 PR,添加新练习。这就是让我着迷的东西。后来每个周末我都在做练习,往里加。等我把 C# 做完,我想,嘿,F#,来做 F# 吧。F# 是函数式的,又属于微软生态,这两样我都喜欢,那就把我最喜欢的东西结合起来。于是我做了 F#,也是同样的事。我成了 F# 的维护者,构建练习,我特别特别喜欢。
Jonathan:你真的特别喜欢。你学一门语言,比如你说“好,我要试试 Scala”,然后你就钻进去了,之后又深入钻研。那每门语言从入门到理解所需的时间,是不是随着时间推移在缩短?因为现在你已经掌握了好几门。这是怎么个情况?
Erik:对。这跟自然语言是一个道理。如果你学法语并且很精通,那么再学西班牙语就会容易得多,因为有大量共通的知识,比如共通的词汇,几乎像方言一样。编程语言也是这样。如果你会 C,然后转去学 C++,会有很多新概念,但也有很多东西完全一样。整个 C 系家族都是这样。这也是我喜欢编程的一点,就是有像家谱一样的东西。有 Lisp 这一支,有 ML 这一支,有 C 系这一支。这几乎就像历史学,有家谱树之类的谱系。我刚才说太大声了。是的,那是 Haskell 或者 Prolog。但我也喜欢那些异类,因为它们有独特的想法。我通常就想试试那些。找一门做法不同的语言,尽管所有编程语言都共享很多相同的知识。它们都有布尔逻辑,而布尔逻辑是固定的,是给定的。所以它在哪儿都一样。你可能得写两个 &,或者写 and 这个词,但基础还是一样的。所以一旦你掌握了这些基础,熟悉了它们,就能更容易地迁移到其他语言。
Jonathan:这几乎就像历史学,有家谱树之类的谱系,更容易掌握别的语言。你学编程,也会结合自己的经验。人们学编程时会有什么样的行为、做哪些事?我相信很多不同学科之间都有相通之处。你提到你就是下定决心,深入钻研,一直和它较劲,直到弄懂为止。还有没有别的行为或做法,是你见过哪些人这么做,让你觉得“对,他们把自己摆到了能学会的位置上”?嗯,很好。
Erik:嗯,我一直试着鼓励人们去做自己想做的项目。比如我学 PHP 的时候,我做了个东西,用来记录我看过的 IMDB 前 250 部电影。我当时看了很多电影,想一部一部地标记出来。光靠做这个我想做的东西,我就学到了很多 PHP 和 MySQL。因为这样你才能咬牙坚持下去:遇到瓶颈时,你不想停下来,你想继续,想把它修好,想让它跑起来。我把这个建议给过好几个刚开始学编程的人,对他们都挺管用。现在跟我当年不一样了,那时候得靠 Stack Overflow 之类的。现在网上能找到那么多知识,但找到对的资源也不容易。所以我觉得 Exercism 能在这方面大放异彩,因为我们某种程度上像守门人,社区里有知道哪些资源好的人。这是我看到新手常常纠结的一点。还有一点。你几乎找不到那种真正从零开始的资源。Exercism 的受众通常至少会一门语言。然后你再去学别的语言,或者深入地钻研那门语言。但它不适合那些……完全没有编程背景的人。你不知道 for 循环是什么,不知道变量是什么。字符串在你脑子里完全是另一回事。对,我妻子看到我谈论字符串时,总会露出奇怪的表情。在荷兰,这个词是另一个意思。
Jonathan:好。我在这里要做一些概括。过去几年里,越来越多人开始了解编程,这大概是真的。以前,懂得怎么在这个领域里摸索的人可能比较少。显然,随着这个行业飞速发展,肯定有很多不同的观点,人们也还在摸索,想弄清自己在某些事情、某些话题上的立场。所谓“你愿意为之死守的山头”,本质上就是问你持有哪种观点,会真正为之争取、为之捍卫,当然是以健康的方式。但如果你要挑一件事来捍卫,想把它钉死,说“这一点我绝不退让”,非得捍卫它,那会是什么?好。
Erik:我有很多这类观点,但我想在这里讲的一点是:你应该去学比你已知更多的语言。去尝试你不认识的新语言,尝试那些跟你已知语言差别很大的语言。这很容易。比如你会 C#,就待在 C# 里,也没问题。但如果你能找到时间和意愿去尝试别的东西,比如 F#,或者,我不知道,试试 Kotlin,去做点不一样的,看看有什么区别。你会成为好得多的程序员。我百分之百确信,学 F# 让我成了更好的 C# 程序员,尽管它们是不同的语言,有不同的哲学。但如今语言之间有太多重叠了。在语言还很年轻的时候,比如 Lisp 跟 C 完全不像。所以函数式语言和命令式语言差别很大。但像 C#、Java、Kotlin,还有 Rust 这样的现代语言,它们也从其他语言,包括函数式语言里汲取灵感。我上大学时,有个老笑话是这么说的:函数式编程很棒,但没人在用。但现在已经不是这样了。所以哪怕你不在函数式语言里工作,函数式语言也无处不在。JavaScript 有很多函数式的概念。C# 里有高级的模式匹配,有 LINQ,有好多函数式的东西。你会看到,各种语言都在到处借鉴概念。所以现在很难说清哪种语言是函数式语言,哪种只是命令式语言,现在更像是大杂烩。但我仍然认为,开始学一门新语言会收获很多。有人说每年学一门新语言。我也试着这么做。我能想象这会让人烦,也会让人吃不消。但至少试着学一门不同的语言,而且最好是稍微超出你舒适区的那种。我向你保证,你会学到东西,会学到很多,总体上成为更好的程序员,对你已经在用的语言也更有帮助。
Jonathan:对你已经在用的语言也更有帮助。显然,人们创造新语言是为了满足特定的需求。所以你是说,命令式和函数式这两者正在互相融合一点。你有没有想过会出现这样的情况:各种语言逐渐消失,我们只剩下几门核心语言?还是说这种想法太天真了?
Erik:不,不,我觉得人们太固执己见了,不会这样。所以永远会有新语言,每天都冒出新语言,这也没关系。但会有大浪淘沙。流行的那几门,最终大概会留下来。所以我不觉得 Java 或 C# 会很快消失。不过,比如 C 或 C++ 一直是很庞大的语言。但我们现在看到 Rust,它像是一种新的尝试,去解决同样的问题,但更安全,内置了安全性。它是一门很棒的语言,我其实应该多学一学。有意思的是,Rust 现在正慢慢进入同样的领域,人们开始用它取代 C 或 C++,我个人觉得这是件好事。比如在 Linux 里,你现在可以用 Rust 写驱动了。以前一直是 C++,但他们现在支持用 Rust 写驱动。这是很大的一步。所以我认为语言还会继续存在,因为你没法造出一门适合所有用途的语言。这也是我认为你应该学多门语言的原因之一,因为不同的情况需要不同的语言。你可以试试,就像把一个,那叫什么来着?把锤子当成锯子使。我不知道那个说法是什么。
Jonathan:那个说法?就像,好,你需要一把锯子,但你只有一把锤子,你怎么办?好。
Erik:对对,差不多是那个意思。好像是跟钉子和锤子有关的,差不多是这样,我不太擅长英语的谚语,就不拿荷兰语版本烦你了。但它基本上是说,如果你只会 C#,可能就会有一种诱惑,什么都用 C# 来做,但做系统编程,或者,我不知道,AI,可能有更合适的语言。哪怕你在 C# 里也能做,也不代表你就应该这么做。所以如果你懂更多语言,你大概就更有能力做出好选择,选出更适合你所在领域的那一门。
Jonathan:好,所以它既有趣又美好。说到 Exercism 社区,这周你想给社区一个什么推荐,是你强烈建议他们去试试的?可以来自任何方面,你知道,可以去散散步,试着倒立,我也不知道。好,如果你想的话,可以给不止一个,可以给,我已经知道你要说什么了,所以你可以给三个推荐。
Erik:它既有趣又有用。我已经知道我要说什么了。好。好,我脑子里第一个蹦出来的是去看看我们现在有的 Dig Deeper 标签页。我们刚开始加的这个新功能 Dig Deeper,你解完一道练习,或者至少在它上面迭代过之后,就能看到各种 approach,也就是一道练习可以有哪些不同的解法。这基本上就是 Exercism V1 时代大家学习的方式,就是看别人的代码,看他们怎么解的,再加上那些评论。我学 Haskell 很大程度上就是这么学的,除了那些给我的评论之外。就是看到,哦,原来可以这么写。然后你自己试一下,说,嘿,这个真优雅,我还能用它做更多事,然后把它应用到别的练习上。所以能发现这些不同的做法,几乎就回到了编程的艺术本身,回到你能用不同方式解决问题的那个层面。于是就有了这些不同的 approach。我写过关于字符串反转的文章和 approach。那是 IT 面试里最常见的基础题之一:你怎么反转一个字符串?在 C# 里有几种不同的地道写法,但它们各不相同,性能特征也不一样,其中一种非常注重性能,但可读性差一些。我喜欢的一点是,在网站上,你一旦用某种方式解出来了,你可以说,嘿,还有别的办法。这样做有这样的好处,也有这样的取舍。不只是让你看到不同的 approach,我们还会写一篇介绍文档,帮你在它们之间做选择。IT 里总是有取舍。几乎没有哪个解法是绝对最好的。所以你总能用不同的方式写东西。所以常常是,对,最易读的解法不一定性能最好。帮你做出取舍、理解取舍、在不同的 approach 之间做选择,这也是我们想用 Dig Deeper 标签页做到的。我最近业余时间一直在写这些。写这些内容、分享给大家,我特别开心。所以我真的鼓励大家要么去写,要么就去读一读 approach。我知道不是每道练习都有。这个功能我们一周前才刚上线,所以暂时只会限于少数几道 C# 练习,但我们会大大扩展。这类东西我们也接受社区的 PR。我很乐意帮你把它写出来、推上线,让你分享自己对那门语言的知识。我觉得这是大家一直喜欢的一件事。如果他们喜欢一门语言,也会希望别人喜欢。所以 approach 是展示你的语言能做什么的很好方式。去看看。对。
Jonathan:去看看。这周还有别的推荐吗?
Erik:嗯,我可能会显得特别像个 Exercism 的人,不过我真的喜欢 Exercism 论坛。我在职业生涯里发现的一件事是,很难找到一个有技术头脑的社群,一个几乎像安全区一样的地方,你可以在那里讨论事情,而不会有人让你觉得自己很蠢,或者把你卷进争吵、变得好斗。所以我特别喜欢我们论坛想做的事:把它变成一个对大家来说既安全又愉快的地方,同时也是一个你能遇到很优秀程序员的地方。那些人技术很好,对他们的语言或编程领域有很深刻的见解。我真的很喜欢读别人写的东西。有一个帖子是问大家最喜欢的编程书。我已经把几本书列进了我要读的书单,因为就是,对,你不可能什么书都遇到,但别人读过,你就能用上群体的智慧。大概就是这样。
Jonathan:对,那个帖子,我们基本上能用上群体的智慧,我相信里面肯定能挖出一些真金。不过你看,那真的很酷,Eric。我觉得如果你还想再给一个推荐,随时欢迎,不然我们就要稍微收一收了。但如果你还有什么想法或评论,好,我们继续分享。
Erik:嗯,这个会被录进视频里。不,其实没有。我刚在努力找第三个。
Jonathan:我总是想再找一个。那样就太多了。不过 Eric,非常感谢你抽出时间。听你讲故事,听你讲这些怎么延伸到科技领域,真的很酷。我特别喜欢听你讲了一点历史的东西,也许你可以考虑以后再多分享一些历史和编程是怎么重叠的。但真的非常感谢你。你能加入团队太棒了,我肯定已经、并且还会继续从你身上学到很多东西。要特别为你喝彩,因为你在 Exercism 网站上的声望值已经突破 10 万了。我知道你会说,你能做到是因为你作弊了,但那依然,我们就把它当成一个了不起的成就吧。所以非常感谢你。还有,如果你正在听这段,却还没接触过 Exercism,去看看 Exercism 吧,我相信你一定会在那里某个地方遇到 Eric。不过 Eric,谢谢你。我真的很感激。我要暂停这段录音了,之后我们可以私下再聊聊。谢谢你抽时间。希望你也和我一样享受这次对话。这次真的很棒。
Erik:那我就不客气了。太棒了。我确实享受到了,确实。非常感谢。
倾听、学习,并从我们的社区成员那里获得启发。