十年的编程经历带给了我什么

CSDN 2022-05-20 08:48 发表于江苏

图片

【CSDN 编者按】所谓十年磨一剑,今年是Sourcegraph的软件工程师Thorsten Ball从事编程行业的第十年,这篇文章中他对于过去十年甚至更长时间的编程之旅做了一个回顾,或许能给新手一些启发。

原文链接:https://thorstenball.com/blog/2022/05/17/professional-programming-the-first-10-years/

本文由CSDN翻译,未经授权,禁止转载。

译者 | 章雨铭       责编 | 屠敏
出品 | CSDN(ID:CSDNnews)

2022年4月,也就是上个月,是我成为程序员的十周年纪念日。

其实我在更久以前就开始编程了(只不过那时候还没成为职业的),但没有薪水。在我十几岁的时候,就建立了网站,制造了IRC机器人(IRC机器人是一组脚本或一个独立的程序连接到互联网中继聊天作为一个客户端,所以出现对其他IRC用户以其他用户),还编写了一些Python脚本,但是规模不大。后来的几年,我专心地学了几年吉他,暂时放下了编程。到了二十多岁,在机缘巧合下,我需要重新开始建立一个网站,再次开始编程后,我发现我对编程是那么热爱,并且感叹Web已经发生了天翻地覆的变化。(现在已经是HTML 5了!)

这让我有些动摇,编程是否是个比继续学习哲学(大学专业)更好的选择呢?我的一个程序员朋友替我回答了这个问题,并且慷慨地为我提供了带薪实习的机会。

成为程序员到现在已经十年了,说实话,时间的长短并不是我作为程序员成长的重要标志,也不是我职业生涯的重要标准。但时间的流逝是真实的,这让我停下来反思。

以下是我的回顾过去十年产生的一些想法,比如我所学到的、所遗忘的、所改变的一些事情。

这些经验成为了我进行软件开发的助力,从实习生到软件开发人员,再从高级软件开发人员到工程师。但是以下观点仅代表我个人,如果和我经历大不相同的人可能想法会不尽相同。

无畏者无敌

大多数我所崇拜的和学习的程序员都有一个很少被谈论的特质:无所畏惧

他们可以毫无畏惧地潜入一个代码库,打开一个可能有风险的依赖代码,即使不知道如何完成,也能毫无顾虑的开始。

他们一往无前,无所畏惧的精神十分鼓舞人心,我发现让自己变得无所畏惧是最好的学习加速器之一。

未来不可测

没有人能预测未来,这一点是无容置疑的。

但当我真正把这一点带入到编程时,我有了一些思考。

在我职业生涯的前三分之一的时间里,我会这样想:我们需要,所以开始创造。

之后的三分之一时间里,我想:我们可能需要,所以要开始为其做准备。

而现在:我们不知道我们是否需要,只是存在这种可能性,看起来我们可能需要,但世事无常,所以不如创建我们当下所需的东西。

编写的代码用于测试

我的代码不仅仅用于让计算机执行一些操作,我还会为了其他事来编写代码,比如方便阅读和理解、易于删除和修改,或者是为了便于审查等等。

为客户带来价值是唯一的意义

我们的目标是什么?实现类型安全?达到100%的测试覆盖率?创造完美的开发工具?······不,这些都不是我们的目标。

我们的目标是:通过不断提交能够解决其问题的软件,为客户创造价值。

编写软件通常比交付软件更容易,但交付才是意义所在。

不可能完美

我不确定我过去是否追求过完美,但现在我现在改变了想法。

你永远不可能事事都尽善尽美,100%的完美是不可能的,当你认为达到完美时,很快你就会想起你忽略了一些东西。

现在我已经不再追求完美了,我认为即使有缺陷但是成功的程序就是好的。

不必太在意

为了便于每个人理解并且易于拓展,你重构并清理了代码库,但如果这个代码库四个月后被删除,那么你做不做这些就显得无关紧要了。

你可能会花费几周时间在你编写的所有代码中添加跟踪和可观察性,结果发现没有人会看它。

不必太在意,你可以把时间花费在这些技术活上,但接受它可能不上用场。

弄清规则背后的意义

如果你在5年前问我,TDD、清理代码、软件工艺以及一些其他思想是否教条主义,我会坚定的回答:“不是!整洁的代码非常重要!

但现在我不这么想了,因为这与规则无关,重要的是规则试图要防止发生的问题,如果你所做的不会产生这些问题,或者你有方法解决这些问题,那么你就不需要这些规则。

编写测试

不必担心测试是集成测试还是端到端测试,单元测试还是功能测试。不要和别人争论你是否应该测试私有方法。不要再担心是否应该在测试中命中数据库。

相反,编写测试就可以告诉你系统是否正在正常工作。理想情况下,只需 3 次点击,不到 1 秒即可完成。

最佳实践来源于目标清晰

最佳实践的前提往往是你知道代码应该做什么。

但是如果你还不知道计划的目标,或者一段时间后计划的内容是否会改变,那么一些最佳实践反而会变成绊脚石。

有的方式在用于重写时可能最好的,但如果你还在探索中,那么最好的也可能变成最坏的。

别人的代码不一定好

我的职业生涯刚开始时,我使用的是Ruby和JavaScript,可以用包管理器。但是“难道没有一个包可以做到这一点吗?”这个问题一直未解。

如果可以,就使用库而不是自己写。尽可能多重用代码。不要重新发明轮子。不要复制和粘贴。这些都是常识,也是我多年来深信不疑的。

但这样做也有缺点,有时,自己编写一个函数实际上可能比添加依赖项更好。

投资反馈循环绝不是浪费精力

我从来都不会后悔改善反馈循环。更快的测试,更好的测试输出,更快的部署,让手动反馈循环通过一个键就能为我提供反馈。

不过,一旦你看到了开发具有真正快速和高信号反馈循环的软件的曙光,你就会永远的渴望能够得到它。

总有未完成的工作

一个失败的测试,一个编译器错误,一个半成品的句子 ——用其中一个结束你的一天,第二天早上你可以坐下来,继续你离开的地方,而不是花时间思考今天应该做些什么。

这是一个快速开始一天工作的好办法——完成昨天没做完的工作。

磨好你的刀

用心钻研工具(比如Vim,git,shell...)让我收获了很多。

不光要会使用你的工具,还要学习如何更好地配置和使用它们。

招聘困难

经过数百次的面试,我的感受是,招聘真的太难了。很多随机的因素会影响面试的判断,在特别好和特别差之间的那些人中很难做出抉择。

卷起袖子干

我喜欢合作的人都有个共同点:他们知道这项工作并不有趣,但是他们有种“我不入地狱谁入地狱”的使命感。

和他人合作

多年来,我一直在同一个代码库上和其他人一起工作,这让我在软件工程方面更进一步。

和其他人一起工作,你会看到决策是如何发挥作用的。你会发现什么对最终结果重要,什么不值一提。你会后悔写了一些代码,但是总有些你写的代码让你欣喜······

了解整个堆栈

对我来说,很少有事情能像听到“你真的不需要知道它是如何工作的······”那样让我兴奋。

当然,可能有的东西我真的不需要弄懂,但是如果我没有尝试弄清楚GC、Unix、多线程···是怎么工作的,没有弄清数据库是如何存储数据、解释器和编译器是如何工作的,那么我就干不了我现在能完成的事情。

弄清楚这些也能够让我更好的工作,通过更准确的权衡,弄清到底发生了什么,才能更好的做出技术决策。

代码审查并非万无一失

在很长一段时间里,如果一个错误通过了我的代码审查,我就会陷入自责中。但后来我发现,其他人也会犯这种错误,而且他们很轻松且自由的谈论代码审查可能会有遗漏。

这改变了我对代码审查的看法:作为不完美的人,我们需要借助一些其他方法来验证代码。

并非每次代码审查都值得付出努力

并非每个代码都需要真正彻底审查。有时,如果风险是可以接受的,那么快速删除“LGTM!”是可以的。这样能减少对同事的束缚,并且有利于建立同事间的信任。

病毒式消极情绪

你越是屈服,那么你得到的消极情绪就越多。

它就像病毒一样,让一切黯然失色。事实上,人们很容易就产生消极情绪。困难的是看清事物的本身,看到其美好之处。鼓励一些看起来不可行的想法,培养和创造快乐是件很有挑战性的事。

代码具有质量

代码是有质量的。你不需要的每一行额外的代码都是压舱物。它把你的代码库压得很重,这样在你需要时会更难转向和改变方向。你需要的代码越少越好。

代码必须被阅读、测试、保持兼容、保持安全、能够继续运行。即使它没有做任何有用的工作。所以删除它并继续前进。如果有必要,再从版本控制中恢复。

对测试来说也是如此。

编程是我生活的一部分

自从我开始实习,除了进行编程工作,我还额外花了很多时间来做一些和编程相关的事情,比如阅读技术书籍、写书、干些副业、写博客、发表演讲、学习新语言和工具等等。

如果你能够证明你编程真的很厉害,那么一些公司就不会在乎你的大学学位是什么。

在工作之余,我也喜欢编程。虽然有的事也像是在工作,但是你不必做得很好。

如果我仅仅只在日常工作中编程和学习,那我的职业生涯将完全不同。

计算机速度很快

构建Web应用程序时,我认为100ms已经很快了,50ms可以说是非常快了。但编写编译器让我明白,对于现代计算机来说,1ms才是永恒。

我仍然喜欢编程

虽然完美是无法实现的,但是这并不代表我不在乎是否完美。我纠结的事情变少,我仍然热爱编程。