返回社区

靠解决问题成为 Tech Lead

Gabriel Nelle 住在德国南部巴登-巴登附近。他和女友以及两只猫住在一套公寓里。他在锡根大学攻读数学和德语师范专业,2008 年毕业。

在 Youtube 上观看
时长 52分钟

Jonathan: 大家好。我叫 Jonathan,很高兴今晚由我来主持。今天的节目请到一位嘉宾,我感到非常荣幸。我想向大家介绍 Gabriel Nelle。Gabriel 是 Exercism 的核心贡献者之一,尤其深度参与了 Go 赛道。稍后我会请他更详细地自我介绍。不过先说一句,Gabriel,非常高兴能请到你,谢谢你来参加我们的节目。希望你今晚和我们所有听众一样玩得开心。那么,Gabriel,把话筒交给你。跟我说说你是哪里人,又是怎么走到今天这一步的?

Gabriel: 嗯,你好。我是 Gabriel,谢谢你的邀请。我是德国南部人,在那儿长大,现在也还在那儿,虽然不是同一个地方,但还是在德国南部。嗯,我算是个八十年代初出生的人,出生于 81 年。我想我的故事要从八十年代末说起,那时我父亲把第一台电脑带回了家。我觉得故事就是从这里开始的,至少文字上的故事是这样。

Jonathan: 嗯。

Gabriel: 那台电脑上装的是 MS-DOS,具体是哪个版本我记不清了。我想应该是比较老的版本,因为如果我没记错,我父亲能把它带回家,是因为那家公司在淘汰旧电脑、换新电脑,所以他就把那一台带回去了。那是我对电脑的第一印象。MS-DOS。挺有意思,也挺奇怪。

Jonathan: 就是黑屏幕上的那些线条,那些彩色的线条吗?那是不是挺……

Gabriel: 嗯,其实就是白字黑底,基本上就是这样。最初我接触的主要是命令行。后来,大概在 1991 年前后,我父亲教我们写了人生中第一个 for循环,用的是 QBasic。那时我大概 10 岁。再后来还有背单词。我父亲买了一个背单词的软件,是基于某个平台做的,我记得好像可以用鼠标点击,但我不太确定,也许是更晚的事了。总之,我就是从那时候开始摆弄电脑的,还弄坏过好几次,我父亲不得不修了好几次。我当时确实对学这些东西很感兴趣,但并不是那种坐下来对自己说“我得学这个”的感兴趣。我真正感兴趣的是弄明白能用它做什么,这一点让我着迷。

Jonathan: 那,那你父亲……他是专门做计算机相关工作的,还是只是碰巧把电脑带回了家?他把它带回家,是出于工作的原因,还是技术上的原因?

Gabriel: 嗯,他其实是电工出身,那是他学的专业。不过他当时在 Bosch 工作,在电子部门,负责新芯片、汽车新部件之类的开发。那儿当然离不开电脑,他其实很早就负责所有跟电脑有关的事情,比如网络打印机之类的。他就是这样入门的。基本上,让那里的事情运转起来的一切杂活都是他在做。因为他没有博士学位,而他部门里大多数人都有,所以这类事情就由他来管,他也因此学到了很多关于电脑的东西。嗯。

Jonathan: 嗯,好的,不错。抱歉,我刚才插了一句。你刚才说,你那时候就在瞎折腾,弄坏过好几次,那就是你接触电脑、硬件之类东西的开端。那之后呢?从那时候起又发生了什么?你是怎么一步步走过来的?

Gabriel: 我想下一步大概是有了我自己的电脑,那应该是五六年之后吧,那会儿我还年轻。我对电脑的兴趣更浓了,学校里也有相关的课程。我开始用电脑写作业之类的。那时候已经有 Word 了,MS Word 那个年代的产品。后来有一天……我父亲一直在为我们的教会做一些文献方面的工作。我们是在一个很小的教会长大的,平时会用到那些文献,我父亲就在做数字化,或者说帮忙把那些文献数字化。一开始这只是个副业,数据量也不大。后来它真的成了我的第一份全职工作,为……那个,你能看看那个吗?为美国那家负责这些文献的出版社工作。

Jonathan: 嗯。

Gabriel: 大致情况是,我父亲问我:“我这有一堆宏,是用一种基于某个 Word 版本的脚本语言写的,算是前 Word 时代的。现在我想换到 Word 上,需要把我所有的宏都移植过去。”我就说好吧,好吧。我就是这样开始给 Word 编程的。用的是 Visual Basic for Applications,你可以先把宏录下来,再看看代码,了解它在做什么,然后改进它。我们把宏改进到……以前的宏是:你把光标放到这里,按一个键,它就在下面几行做点什么。到最后,它能把整份 Word 文档从头到尾处理一遍,完全自动化。这基本上就是我写大量宏的起点。这些宏引起了一些不小的反响,那些把这项业余时间的工作交给我父亲的人说:“哇,这太棒了。我们要做更多,把它越来越多地自动化。”嗯,我就是这样入门的……

Jonathan: 你给你父亲省了好多时间。

Gabriel: 嗯。

Jonathan: 从这个意义上说……年纪还那么小。

Gabriel: 可以这么说。后来我在 Word 里写宏,再后来是 Excel。我用 Excel 给一家小店写过一个……怎么说呢,商店系统。那是一家卖有机食品之类的小店,他们一开始就是把所有价格记下来,然后心算或者用纸笔算。起初就是这么运作的。我给它们写了一套系统,有条码扫描,还有一台秤:你把东西放上去称一下,打出小票,结账时再扫一下就行了,诸如此类。整套东西基本上是围绕 Excel 做的。嗯,不过我现在肯定会换个做法。Excel 既是数据库,又是打印程序。我会在 Excel 工作表里把一切排好版,然后直接打印到小票打印机上,就是这样。当然,我觉得那就是我职业生涯的起点吧。

Jonathan: 你做这些的时候多大?后来又从那儿走向了哪里?是在上大学之前,还是高中期间?那段经历是不是在很大程度上影响了你的职业道路?

Gabriel: 嗯,这些都是上大学之前的事。商店那套系统,是我大概 20、21 岁的时候做的;差不多同一时期我在服民役。

Jonathan: 嗯?

Gabriel: 写宏的时候我大概 16 岁。这中间我还写过一个基于 Access 的系统,用来打印寄信用的标签,地址之类的。然后是上大学,结果出人意料的是,我学的不是计算机。

Jonathan: 好的。

Gabriel: 我其实学的是数学和德语教师专业,面向的年龄段……让我算算,是 10 到 20 岁,或者说 19 岁。就是这些年龄段。也就是五……

Jonathan: 那你……

Gabriel: 到十三年级。

Jonathan: 你的职业道路就这样开始定下来了,那……那个决定是基于什么呢?

Gabriel: 其实我很可能本来会走编程这条路。不过在服民役期间,我学到的东西远不止技术方面的。我当时属于一个小团队,负责一家养老院。可以说里面有 5、6 个房间,住着不同的人,我主要负责其中一位。她大概 55、60 岁,患有阿尔茨海默病。那件事给我留下了很深的印象,因为在那个年纪就面对这种情况……你可以说,60 岁对当时 20 岁的我来说听起来已经很老了,但我清楚地意识到,这种事可能发生在任何人身上,也可能发生在我身上。这让我对生活中社会性的领域产生了更大的兴趣,也……

Jonathan: 真有意思。

Gabriel: ……以及社会性的职业道路。事情就是这样。这基本上就是我当时选择当老师的原因。我本来想写代码,但我很擅长教学,或者说很擅长帮助同学,尤其在学校里,还有数学。数学是我最强的领域,我也一直很喜欢。嗯,我一直喜欢帮助别人提升能力。我特别喜欢他们突然弄懂的那一刻,看到他们眼睛一亮。就是这样。所以我后来真的成了一名老师。

Jonathan: 哦,这挺好的。跟我说说,你刚提到民役。在德国,这是每个学生或者孩子在上大学之前都必须做的吗?这在德国文化里是怎么回事?

Gabriel: 那时候它是兵役的替代选择。你要么服 9 个月兵役,要么服 11 个月的民役,就是这么规定的。

Jonathan: 好的。

Gabriel: 只针对男性,不针对女性。

Jonathan: 德国现在还是这样吗?

Gabriel: 不,现在不是了。不,不是了。

Jonathan: 好的。我知道瑞士还是这样,我妻子就是从那儿来的。所以那个安排现在还挺普遍的。好,那么你做的是数学,学的又是当老师,而编程显然在你的生活里占了相当重要的位置。它是从什么时候开始……有没有那么一个时刻,你觉得自己虽然身在教学岗位、也挺享受,但心里还惦记着编程这一块,还是活跃的、投入的?教学和编程这两件事,是怎么平衡的?

Gabriel: 我是怎么回到编程上来的?嗯。

Jonathan: 嗯。

Gabriel: 嗯。我上学那段时间,课余主要做两件事。一件是教学:我在一家辅导机构教课,也在大学里教低年级的课,主要是数学,大多在第一、第二学期。同时我在一家科技公司打工,他们那边的东西主要是基于 Access 的。

Jonathan: 嗯。

Gabriel: 那是一家做软硬件的公司,业务是汽车共享,还有那些有很多车、要租给员工的公司。我在那儿一开始是做文档,后来他们发现我也会编程,于是我很快就转到编程这块了。嗯。后来,事情的变化主要发生在……学习的最后几个阶段,那期间你得到学校去实习,要求去六周、四周之类的。我想,通过和那些经验非常丰富、非常投入的老师交谈,有一点对我来说越来越清楚,也越来越亲切:时代变了很多,学生也变了很多。有一位老师,她一直教五、六年级,她跟我说,五年前她班上只有一个学生算得上“问题孩子”,比如家庭不完整、父母离异或者家里有各种麻烦。而现在,这样的学生超过一半。

Jonathan: 是啊。

Gabriel: 而那是 10 年还是 15 年前的事了。2006 还是 2007 年,那肯定是 15 年前了。这说明变化有多大。我也很清楚地看到,现在的很多学生根本不想学习了。而老师永远是最……基本上老师总是最后的那一个。整件事的尾巴。嗯。家长、校长、学生,他们基本上都是老师的“老板”。老师总是排在最后的那一根稻草,可以这么说吧,我不太确定英语里该怎么表达。他总是那个要承担所有责任、却基本上没有任何权利的人。

Jonathan: 没有权力去……嗯,去行动。对。

Gabriel: 嗯。

Jonathan: 那你的决定……哦抱歉,我打断你了。你继续,继续。

Gabriel: 这些事至少让我想了很多。大学读完之后,我又很自然地滑回了编程,因为我有个朋友,就是当初把那份文献工作交给我父亲的人。他问我能不能帮他做一个项目。那个项目原以为只要四到六周,结果变成了两年半,或者三年半。嗯,三年半的项目。

Jonathan: 这就是典型的需求蔓延。需求蔓延是真的。

Gabriel: 嗯。他先是让我帮他做点东西。他一直和那家出版社的一个人保持联系,而出版社那边总说:我想要一个公开展示这些文献的主页,我想让人们能在网上读完整的书。

Jonathan: 哇。

Gabriel: 有一次,我朋友正跟那边打电话,我就对他说:这事我倒是可以想象自己去做,反正我现在也没什么事。他就说:“哦,Gabriel 来做吧。”事情就是这么开始的。

Jonathan: 哇。

Gabriel: 于是我就有了一个项目。嗯,然后我为这个项目干了三年半,把几千本书搬到了网上,整个内容库……

Jonathan: 哇。

Gabriel: ……还有索引,不同语言之间互相链接。嗯,那个网站现在还在线,是 egwwritings.org。如果有人感兴趣可以去看看,它换了新设计,我去年 12 月左右看到他们改了版,不过底下的代码……

Jonathan: 还是老样子。

Gabriel: 基本上还是我写的那套,我看得出来,因为它主要是用 JavaScript 写的。代码看起来非常……文件组织方式不一样了,但各种风格还是老样子。

Jonathan: 你得把链接发给我,我们会在合适的时候放到节目笔记里。那么,这个项目你做了三年半,差不多三年。你把这些东西都编了索引。那时候你的主力语言是 JavaScript 吗?你的技术栈是什么样的?可以说,你当时主要在做哪方面?

Gabriel: 那基本上是从基于 Windows 的软件转向 Web 的一大步。之前是 Visual Basic 和 Visual Basic .NET,现在前台只有 jQuery 和 JavaScript,后台是 PHP。

Jonathan: 好的。

Gabriel: 我们还有一个约定:只要我是在做调研,时薪就要低一些。

Jonathan: 嗯。

Gabriel: 只有真正写代码时的三分之一。嗯,这也给了我一边工作一边学习的自由。

Jonathan: 厉害。那后来……Exercism。现在你做很多事。我说 Go 是你主要做的东西之一,对吗?你指导了很多人,也一直在 Exercism 里参与 Go 相关的工作,帮着把那一块做起来。这是什么时候进入你的视野的?为什么它对你有吸引力?你说吧。

Gabriel: 嗯,2016 年,那是我做完那个大项目之后的第一份工作。其实在项目快结束的时候,我就开始转向 Go 了。那份工作里我主要写一些 PHP 和 Python。Go 很快就成了我最喜欢的语言,因为它有一种简洁。它基本上是想从那个越来越疯狂的世界里抽身出来,那个世界不断加功能、加语言特性,让一切越来越复杂,给开发者带来大量额外的负担,因为他得选:这条路还是那条路?还得理解别人用的所有其他做法。而 Go 突然带来了这种安静和简化的空间。它很快就成了我的头号选择。我在那家公司还做了个原型,大概是我离职前半年吧,因为他们想转用 Go。当然,一开始总有些磕磕绊绊:你碰到语言里做不了的事,然后你明白为什么那样做没意义,或者为什么另一种做法更好。我当时特别想学会做这些事。也就是从那时候起,我开始听 Go Time 播客,那是 Changelog 出的。

Jonathan: 好的。

Gabriel: 我记得 Katrina Owen 上过那个播客,大概上过两次吧,至少我听过她两次。嗯。我就是这样开始关注 Exercism 的。我想我是在 2017 年注册的 Exercism,不过我不是百分之百确定,得查一下。

Jonathan: 我想也是。这样说得通吧?

Gabriel: 嗯,我想那甚至可能还是第一版的时候,因为一开始根本没有……我并没有真的拿到过任何反馈。我做了几个练习,但从来没收到反馈;我也能给别人反馈,而且确实给了。可我自己从来收不到反馈。当时根本没有一套真正能获取反馈的机制。做不做全凭自愿,不想做就算了,可以这么说。嗯,我觉得那应该是第一版,对吧?

Jonathan: 我想是的。我是说,从第一版到第三版,变化应该挺大的。

Gabriel: 嗯,嗯。

Jonathan: 第一版反馈很少,第二版要求大量反馈,到第三版就差不多落在中间,也许偏少一点。不过,你有没有参与第三版的搭建?你是怎么……嗯,你在里面的参与是什么样的?我其实不太清楚,很想了解一下。

Gabriel: 也许我该先往回退一步。我是在听了 Katrina 的第二次访谈之后回来的,就是在 Exercism 上听到的那次。

Jonathan: 好的。

Gabriel: 那时候第二版已经存在了。有很多活儿要干,也需要大量反馈。我就一头扎了进去,而且我很喜欢给反馈。

Jonathan: 嗯。

Gabriel: 基本上,我开始琢磨怎么把它做得更快。因为我很快发现,尤其是在最初的几个练习里,我给的是同样的回答,一遍又一遍又一遍。

Jonathan: 嗯。

Gabriel: 另一方面,当然有时候会碰到这两类问题,有时候是这个,有时候是那个。于是我开始动手优化。我写了一个小的 Go 程序,用静态分析,因为我想入门分析这一块。我以前从没做过,很想了解它。反正我也一直想试试,看起来是个好主意。因为那些代码总是非常常见、非常相似。同一个练习的提交的解答,尤其是最初那几个,彼此都很像。我就是这样开始做静态分析的:在代码里找出各种模式,然后自动把回答块或者预先写好的段落加到回复里。我一开始是在本地做的,就这样一周能做 100 个左右,一周 102 个。而且我压根没全职做,这都是工作之余干的。嗯。后来这事开始……我记得 Pitfield 是第一个,John Arun,我想那是他的真名。他大概是第一个说“哇,这太棒了,太厉害了”的人。我做的事,连同静态分析,就是这么慢慢为人所知的。

Jonathan: 嗯。说起来挺有意思,我记得 Jeremy 前几天说,在所有提交的解答里,大概有 75% 是完全独一无二的,这点我也觉得很有意思。你想,比如 Hello World 这种练习,明明非常简单,按理说总该有个大家都在用的标准写法吧,可他说,人们会尝试各种各样不同的做法。这种交错挺有趣的,因为随着编程越来越流行、越来越多人开始做开发和编程,你会忍不住想:自动化要从哪里开始取代开发者的角色?我不知道会不会真的发生,我觉得需要人做的事还太多。但就……我不知道你怎么看。不过最近 Exercism 在指导这块下了很大的功夫,这确实很吸引人,因为就像你说的,它把那些你不得不一遍又一遍重复讲的道理,变成了大家可以应付得来的形式。同时,它会不会又走向另一个极端,变成你其实需要真人互动、需要真人来处理内容?不知道你对这方面有什么想法,我觉得现在这是个很有意思的领域。

Gabriel: 嗯,我不觉得开发者很快就会被取代,那还早得很。无论是开发、一般意义上的应用,还是指导,我觉得静态分析和自动指导、总体上 Exercism 上的自动指导能提供很大帮助。但真正的指导还是需要导师,我会这么说。嗯。比如我有一个人,我大概每两三个月和他通一次电话,有时候更频繁。可以说,我是在指导他的职业发展。当然技术上也谈得很深,但这种指导方式和“看一眼提交的解答,告诉你哪里可以改进”完全不同。我觉得现有的导师正是为此而需要的,而且以后也一定需要,我觉得这是我们可以着力的地方。另一方面,我想我们没法在提交的解答上完全取代导师,我也不认为应该这么做。很多事可以自动化,但导师依然是那个能给你指出方向的人。他能看到你卡在哪些问题上,然后告诉你:去弄懂这个和这个,而不只是“你的代码这里需要这样改”。

Jonathan: 对,对。

Gabriel: 说实话,我希望练习能重新有更多指导。所以我在想,我们是不是应该……

Jonathan: 你是说面对面的互动?

Gabriel: 嗯。我在想我们是不是应该……我们以前有过这样一条路径:先是 10 个练习,至少是 10 个,你必须做完,而且只有经过指导才能往下走。

Jonathan: 嗯。

Gabriel: 我觉得以我们现在已有的自动化,其实可以把它重新开启。也许不是现在,但将来可以。我会希望这样。

Jonathan: 我们当然可以……这事应该在社区电话会议上提出来,因为我觉得把这个重新拿出来讨论会很不错。那么 Gabriel,我们经常问的一个问题,这不是我之前跟你聊的那个,但我很喜欢问,因为它总是很有意思,答案也各不相同,那就是:编程对你来说有没有那种“开窍”的时刻?有人会说,某一刻一切突然都讲得通了。我经常讲自己的故事。我拿学校举个例子,那时我在英国上学,学化学。那边有那种大考,考前三年的一切都是在为大考做准备。你学三年,最后汇成一场期末考试,所有科目都一样。其中一门当然是化学。我有大概三年时间对化学一窍不通。我就是……弄不明白。然后在考前一周,就像硬币突然落下,那东西一下子讲得通了。我想:天哪,原来元素周期表能解释一切。只要我知道周期表上的数字,就能理解这个、那个。事情一下子变得特别简单。那么,编程对你来说有没有类似的时刻?还是说你自然而然就觉得它讲得通?如果有的话,那是什么时候?

Gabriel: 我不确定自己有没有那么明确的一刻。我觉得宏录制帮了我很多,让我很早就能对着 Visual Basic for Applications 的代码看。我不知道现在还有没有这种东西,我想在 Word 里应该还是可以录的。但这样的机会并不常见:能录下来,然后看代码,用那种方式学习。我觉得这让我轻松了不少,因为一开始我挣扎得很厉害。要说有某个时刻的话,也不是说我突然懂了什么,而是我意识到自己做事到底是对还是错。那是在我学生时期加入那家公司的时候,那基本上是我第一次和别人一起工作,和其他开发者协作。在那之前,我一直都是单打独斗,什么都得自己来。而且我心里总有个大大的疑问:大家平时是这么做的吗?感觉有点怪。感觉挺复杂。感觉它能跑,可是这样对吗?这些问题在我加入那家公司、开始在那儿工作之后,某种程度上得到了解答。当然,我有很多要学的东西,也确实学到了很多。比如 Access 的记录集,我以前一直没真正弄懂。我用过它们,但……

Jonathan: 嗯。

Gabriel: 嗯,它能跑。

Jonathan: 是啊。有些东西……

Gabriel: 后来我才真正开始理解它们。所以那也许就是让我开窍的事情之一,因为我有个同事,她给我讲解,某天我突然就明白了它们是怎么运作的……

Jonathan: 嗯。

Gabriel: ……它们本该怎么运作,以及怎么正确使用,等等。所以,嗯,那也许就是那种时刻之一。不过我觉得,在工作中这种时刻经常出现。我不认为只有那一个点,也许那只是最初的一个点。就拿 Go 来说,也有很多地方会让我豁然开朗,明白某个设计为什么是这样、该怎么用。比如 context。嗯,比如 context。

Jonathan: 嗯。

Gabriel: 嗯。比如说,context 大概是……我不确定,也许是一点六还是一点七版本加进来的。那段时间我并没有去研究它们。说实话,一开始我并不真的需要它们。后来我参加了一次,好像是个聚会,有人做了关于 context 的分享,讲怎么用它们之类的。我当时想……

Jonathan: 嗯。

Gabriel: ……我应该去看看。不过又过了好几个月,我才真正去研究它们,明白了它们为什么存在。比如关闭 channel 这件事,不知道你注意到没有,网上还有很多人提议说,要关闭一个 goroutine 就得关闭一个 channel,其实不该这么做。这正是 context 的用途。你用 context,取消这个 context,然后就能用它关掉 goroutine。如果你用关闭 channel 的方式,那基本上就是在手动做 context 内部自动做的事,而且有太多容易踩的坑、太多问题要避免。正因为如此,人们通常都会做错。

Jonathan: 我确定你做过直播,在直播里提到过这个。我确实记得你说过,就用 context 吧,因为……

Gabriel: 嗯。

Jonathan: 很有道理。

Gabriel: 记得我提过那一点。

Jonathan: 嗯。不过话说回来,你以前指导过那么多人,能不能看出一些规律?那些很快就掌握东西的人,他们有什么做法或行为?他们做了什么,让自己能更快、更有效地学习?还是说你指导过的人大多天生就是这样投入的?或者有没有那种让你觉得“哇,他们做的事让他们加速成长”的人?

Gabriel: 我不好说别人是不是这样,但我可以说我自己。我觉得我是从父母那儿学来的。他们自学了很多东西,我也从他们身上学到了自学。所以我的编程完全是自学的。一开始有我父亲在,学校里也学过一些。不过在学校高年级的时候,其实我们大多数人懂得都比老师多,所以那算不上学习,更多是互相学习。但总的来说,我的一切都是自学的。我觉得这是编程必须具备的能力,因为你总要钻研以前没见过的东西。你不了解它们,就得去查资料。那个词怎么说来着?这种……能力。对,就是能自己钻研、自己学会一样东西的能力,我觉得这在编程学习中是关键。当然,如果能找到人给你讲解,你可以学得快得多。所以我不是说你不该找导师、不该上 Exercism 之类的。那些能帮你成长得更快,但话虽如此,我还是这么认为。

Jonathan: 我感觉你的学习是靠实际解决问题来完成的。不管是写宏让事情更高效,还是别的什么,给我的印象是,这像是贯穿你一生的一个核心主题,就是通过实践来学习。我想这也和 Exercism 大体上在做的事情很契合,就是帮人们动手做东西。

Gabriel: 对,就这么一路走来。

Jonathan: 是这样。那太好了。那么 Gabriel,我们的时间不多了,最后我还有两件事,都算不上问题。一件是个问题,我想请你分享一个你的观点;另一件也算观点吧,我想请你给社区提一个本周值得一试的建议。先说第一件。我们采访过很多人,如果你听过这个播客或者直播有一段时间了,就会知道我们通常会在直播快结束时问一个大问题:在技术领域,什么是你愿意为之“战死”的那座山?也就是你非常坚持的一个观点,你愿意为它站台。记住,你得给出充分的理由,不能只说“这是我的观点”就完了,你得能为自己辩护。那个观点会是什么?它可以非常激烈,也可以微不足道,由你决定。你会说什么?

Gabriel: 我想说是一句谚语,是 Go 社区里的一个说法:无聊的代码胜过聪明的代码。

Jonathan: 我喜欢这句。它是什么意思?

Gabriel: 它是什么意思呢?基本上,它概括了 Go 的哲学中围绕简洁和可读性的一大部分。所以在 Go 代码里,如果你看到一段代码心想“哇,这真巧妙”,那其实是糟糕的代码。哪怕写它的人非常聪明,用的办法也很巧妙。有时我觉得,如果你真的遵循 Go 的简洁和惯用法,你整个代码库里其实没有哪一段是你会想要指出来、或者能够指着说“看这段代码多好”的,因为你所有的代码实际上都很无聊、很简单,任何人看到都会说:“这有什么特别的?”对,但关键在于:你之所以能达到这种简洁,是因为你是个优秀的程序员,而且这是一个不断迭代的过程。写复杂的代码很容易,写简单的代码却很难。因为你先得在脑子里把问题变简单,然后正确地写出代码,再反复迭代让它变简单。这是一个长得多的过程,需要比写复杂代码优秀得多的开发者。复杂代码你一看就知道:难懂、难读、难维护、难修改。

Jonathan: 这说到底就是不断做取舍,对吧?我在技术圈里还比较年轻,才三年,而且我不是做开发出身,我更多是从产品那边过来的,偏商业的角度。可以说,有件事很有意思:我越来越明显地感觉到,一切都关乎取舍。比如这里,取舍就是简单代码对复杂代码:复杂代码往后可能更笨重、更麻烦,简单代码则可能前期要花更多时间、更多精力。人们就是在不断做这种取舍。这就是其中一点。不知道你怎么看,但我觉得,真正打动我的是简洁那一面。我记得我妈在大学有个朋友,他每次写作业文章都只写两页,因为他能把所有内容压缩进两页,而且还能拿最高分。所以我觉得这和“简洁”这个概念是一回事。而写简单的代码真的很难,因为它需要清晰的思考,而不只是会写代码。所以我觉得这是一座值得站的山,而且你把它讲得很好。好,那么 Gabriel,本周的最后一个问题。现在轮到你给 Exercism 社区提点建议了。什么都可以,健康建议、饮食建议都行。这是你给社区分享一条建议的机会,内容随你。那么,你本周想给 Exercism 社区什么建议?你最想让他们去尝试或做的一件事是什么?

Gabriel: 哦,这可有点难。好吧,既然你说什么都可以,我能给你两条吗?

Jonathan: 可以,那就两条。

Gabriel: 好。第一条建议。我其实是个素食者,从小吃素,从没吃过肉,而且在我童年和青少年时期的大部分时间里,我其实是纯素食。所以,试着一个星期不吃任何奶制品。这是第一条。第二条是……我不确定一周内能不能做完,但如果你是个不错的开发者,应该可以。有件事非常有意思,也非常值得一试:构建共享内存,多个服务之间共享,或者说同一个服务内部共享。试着用 Raft 协议实现一个共享内存。你可以用现成的库,不用自己实现 Raft,但是……

Jonathan: Raft……你得把链接发给我,我好把它贴上去。这就是 Gabriel 的挑……嗯,也许该叫“Gabriel 的本周挑战”,不太算是建议。也许我们该……

Gabriel: 嗯,更像是值得一试的事情。

Jonathan: 你就发一个挑战出来,那应该挺有意思的。好,那就是一整周完全不吃肉制品,看看效果如何,再搭一个共享内存服务器。你觉得怎么叫好?服务、共享……

Gabriel: 嗯,可以叫它内存里的键值……

Jonathan: 好的。

Gabriel: 就是多个服务、一个数据库,或者一个服务。嗯。

Jonathan: 好,那就是……

Gabriel: 因为它能让你学到很多关于数据库底层运作的知识。尤其是那些分布式的、共享的……嗯,不太确定。比如 Cassandra、Scylla,不知道你知不知道 Scylla。它有点像 Cassandra,但用 C++ 写的,现在它们正转向 Raft 协议。或者,它是键值数据库。共享的那个是 etcd,不对,它不是数据库,是一种……管理工具。嗯,还有 Be degraff、Degraf Beja。所以那一个我想底层也是用 Raft 来分发数据的,不过我不太确定,得再查一下。我们用的很多数据库都是这样,分布式系统。所以分布式系统可以说是我们这个时代的一大挑战。我们正在解决它的过程中,但还有很多难题要克服。嗯,能在那个层面上思考总是好的,因为如果你能做到,就会打开很多可能性。

Jonathan: 嗯。

Gabriel: 如果你需要的话……在我上一家公司,我其实就在往这个方向走:让多个服务同时共享同一块内存。嗯。

Jonathan: 也许我们该把它安排成一场大师课,给大家几周时间去试试。那么 Gabriel……

Gabriel: 那……那就是大师课的内容。

Jonathan: 嗯。

Gabriel: 等你把 Exercism 上的东西都做完了,所有练习都做完了……

Jonathan: 那就是最大的一个挑战,最大的。它把所有东西都串起来了。Gabriel,非常感谢你抽出时间,今晚能跟你聊天真的很愉快。录制结束之后你可以先别走,就一小会儿。不过我想先真诚地谢谢你,非常感谢你为 Exercism 所做的一切,不只是为我们,还有你在更广的范围内做的所有指导工作,帮助大家写出更好的代码。我相信大家对此都心怀感激。谢谢你抽出时间。也欢迎大家联系 Gabriel。如果你在 Exercism 上,给他发条消息、申请一次指导,我相信你会和 Gabriel 聊得很愉快。好。

Gabriel: 非常感谢。

Jonathan: 录制结束。嗯,不,谢谢你,谢谢你来参加,我们很快会在某个平台上再见到你。

Gabriel: 谢谢。

来自我们社区的更多故事

倾听、学习,并从我们的社区成员那里获得启发。