1

40 岁程序员会有哪些肺腑之言?这篇文章告诉你

 1 year ago
source link: https://blog.51cto.com/yuzhou1su/5714456
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

目前作为一个在计算机科学领域摸爬滚打 8 年的人(本科 4 年 + 研究生 3 年 + 工作 1 年),很好奇自己究竟有没有能力在写代码或者这个行业 30 年。

作者介绍

作者 Noah Gibbs ,是一位专业软件开发人员,在过去的职业生涯中,从来没有做过真正的非编程工作。

作者在他主页的自我介绍中有个很有意思的点,他把自己比较修理房屋的老家伙——能够在适合的时候告诉你房屋修缮的正确方法,而他解决的是软件的房子

40 岁程序员会有哪些肺腑之言?这篇文章告诉你_软件开发

他已经成为程序员 38 年了,到 2024 就将成为一名 40 年工作经验的程序员了。然后他发了 YouTube 回顾自己的职业生涯,并给出了文字版——​ ​The Forty-Year Programmer​​。

以下是全文翻译(文章很长,建议收藏):

四十岁的程序员

2024 年,我将成为一名 40 岁的程序员。虽然现在我还没到那一步,但我总会到达的。这件事情的意义与开发软件能赚多少钱,或着手创办一家软件公司不同。我确实赚了很多钱。但这并不是我表达这一切的目的。

我在想你可能也想长期成为一个软件开发者,就像长期做音乐家、艺术家或长期屋顶工人一样。如果不是,你可以在浏览器中点击“返回”键。这很合理,无伤大雅。但如果你选择继续看下去,或许你也想成为一个工作二十年的程序员,或者四十年,甚至更久。

我不会告诉你要学什么语言或框架。如果你擅长基础知识,你可以学习任何你想要的东西。在那之前,你想学哪种就哪种,你可以不擅长其中任何一种。总之,我就是那么做的。

相反,我将谈论那些在我开始时没有意义的事情,而现在它们是我人生天空中的启明星。这意味着我将谈论的就不是关于具体的技术。技术来来去去,语言冒出来又过时,它们都不可能是你的天空。(Technologies come and go. Languages come and go. They can’t be your sky.)

40 岁程序员会有哪些肺腑之言?这篇文章告诉你_职业生涯_02

让我们从这个话题开始:软件是年轻的。

软件开发行业是年轻的

计算机语言 Fortran 可以追溯到 1957 年。还有其他与之年龄相仿的语言(LISP 和 Algol: 1958 年,COBOL: 1959 年)和一些奇怪的竞争者(Konrad Zuse 的 Plankalkül,1942 年左右)。

比方说,大约从 1957 年起就有了程序员。至今过去 65 年了。如果我从 1998 年开始做全职程序员(24 年),从 1984 年开始做程序员(38 年),我很有经验。Alan Kay,Smalltalk 编程语言的发明者,大约从 1963 年开始成为程序 -- 59 年。他是我发现这个领域活跃时间最长的人之一。

相比之下,马友友今年 66 岁,从 4 岁半就开始拉大提琴。他远远不是世界上演奏时间最长的音乐大师。吉尼斯书上说 Kasper“Stranger”Malone 有连续八十年的专业音乐发表。而这只是专业音乐人和为赚钱而出售的歌曲。它不包括现场表演或任何他们不收费的东西。因此,让我们说一个真正有经验的音乐家已经工作了 15 年,比我们整个学科存在的时间还长。

因此,我们的领域是年轻的。

Wiki:

  1. 阿伦·科提斯·凯伊(英语:Alan Curtis Kay,1940年5月17日-),美国计算机科学家,在面向对象编程和窗口式图形用户界面方面作出了先驱性贡献,他是 Smalltalk 的最初设计者。2003 年获得图灵奖。担任 Viewpoints 研究院(Viewpoints Research Institute)院长到2018年,加州大学洛杉矶分校兼职教授。曾任苹果公司院士,惠普公司资深院士。
  2. 马友友(Yo-Yo Ma,1955年10月7日-),美籍华裔大提琴演奏家,祖籍浙江鄞县,生于法国巴黎。他录制了90多张专辑并获得了18项格莱美奖。
  3. Kasper Delmar "Stranger" Malone,美国音乐家,马龙作为唱片艺术家的职业生涯跨越了77年,根据他的传记作者乔治-金(George King)的说法,他被吉尼斯世界纪录认定为是最长的。

你不需要年轻的时候开始

那么,如果我在 8 岁开始学(大提琴),马友友在 4 岁半开始(学大提琴),对你来说是不是太晚了?

我 45 岁时开始认真弹钢琴,大约一年前。我认为我真的在进步了。如果我能够坚持下去,当我 60 岁的时候,我就会变得非常出色。我已经可以演奏一些像样的歌曲了。当你已经有一些背景知识和一些观点时,你会变得更好,你知道吗?你已经练习了几十年,或者超过几十年的技能。

假设你 50 岁了。作为一个软件开发人员,你或多或少可以有 30 年的最佳时光。如果你从 50 岁开始,你在 60 岁时(也就是 10 年后),会比我在 18 岁时好得多。

我遇到的优秀程序员都是从 20 岁、30 岁甚至 40 岁开始的。我不知道你有什么理由不能从 50 或 60 岁开始。这需要时间和工作。但你不一定要年轻。

不过,这是否意味着你不会那么好?算是吧。我弹钢琴不会像马友友弹大提琴那样好。我不会像艾伦-凯伊那样擅长编程,尽管我开始编程时比较年轻。

你知道还有谁比不上马友友吗?基本上所有其他拉大提琴的人。这些人不会因为比不上前辈和大拿而阻止自己的学习。反而他们中的很多人也都擅长大提琴。而我喜欢弹钢琴,即使我从来没有达到世界前十名。

我仍然喜欢写软件。我成为下一个艾伦-凯伊的几率基本上是零。他在我这个年龄已经写出了 Smalltalk 。如果你从事软件工作,明白“成为不了艾伦-凯伊也没关系 ”的道理是很有必要的。即使年轻的艾伦-凯伊也不是现在的 Alan Kay 。他也必须接受这一点。

顺序先后不是决定性的

如果你想有一个长期的编程生涯,而你刚刚开始,我经常说 "只要写一些软件,任何软件,什么都不重要"。你将需要学习很多不同的东西。你以什么顺序学习它们并不是什么大问题。

40 年里,很多趋势来了又走:

  • 桌面应用程序?完成了
  • 手机?写了
  • 操作系统和系统?是的
  • 网络编程?完全是

你自己的清单将是不同的,但它将横跨许多种编程。只要你尝试不同的事情,你做这些事情的顺序并不重要。

当然,"尝试不同的事情 "才是关键所在。你在四个不同领域各工作十年,会比你写 40 年的网络 socket 服务器要好得多。这并不是说 40 年的深度没有价值。深度绝对有价值。所以你不应该在四十个不同的领域各只做一年。

但你必须小心,不要变得死板。事实证明,几乎任何学科都有东西可以教你。如果你太死脑筋而不去学习,你就会失去机会。

尝试不同类型的编程。以任何顺序尝试它们。但你应该在某些方面深耕,并变得更好。

如果你研究的东西是无用的呢?呃,无用是相对的。我把多年的业余时间投入到一种叫做 DGD 的旧 MUD 编程语言中。这当然不是为了实用价值。几乎所有关于它的东西都是奇怪的、非标准的,而且很少有真正实用的东西。然而,因为它很奇怪,所以它教会了我很多东西。它教会了我 Ruby on Rails 后来使用的东西,它还教会了我关于数据库编程的东西,尽管它没有使用数据库!它教会了我一些东西,而这些东西对我来说很有用。它教给我的东西在我后来学习的五六种不同的语言中都很有用。它给我讲了一个又一个的战争故事。

有趣的是,许多年后我得到了一份 DGD 的咨询工作。世界上没有多少 DGD 的工作,从来没有。但我有一个!这比我学的很多 "实用 "语言更实用。你永远不知道。

假设马友友 15 岁,在他的音乐生涯中大约十年。假设他对你表达困惑:说他是应该演奏一首复杂的古典音乐,还是用一些流行的爵士乐来糊弄人。你可以研究一下其中的优点:古典音乐作品会提高他的技术,流行的爵士乐作品会给他带来广度,等等。

但真正的答案更简单:两者都有价值,所以选择一样东西,然后执行它。如果你再坚持 30 年,选择哪一个就不那么重要了。两者都能使你变得更好。重要的是工作。把真正的工作放在任何一个方面,这都将是宝贵的经验。试着不假思索地 "滑过",那么这两者都不值得你花时间。

这就是年轻的马友友的答案。这也是给你的答案。

我经常对自己说 "现在还早"。我的意思是,我已经 46 岁了。我还没有到 96 岁,还没有结束。我至少还有 20 年的时间,也许还有 50 年。因此,如果我做一些奇怪的、非主流的事情,而且它教给我有趣的东西,那真的很好。如果我做一些实际的事情,让我在短期内度过难关,那也很好。

但重要的是:努力。作为一个程序员,要想做到二十年或四十年或七十年,都需要大量的工作。如果两件工作难以取舍......可能它们都很好,而且任何一件都是好的选择。否则,它们都是坏的,你应该找一些有价值的东西来代替。

为时尚早。研究一些有趣或有用的东西。给予它时间来支付红利。但你猜测的是十年、二十年或三十年后的回报。不要总是选择十八个月后最好的东西。你不可能真正看到未来会发生什么。

满意的工作

你开始写软件是因为它的某些方面吸引了你。它的某些部分是好的,否则你就不会费心了。

试着弄清楚到底因为什么。你喜欢什么?是什么吸引力你?它有什么好处?这对每一个人来说都不一样。完全会不一样。

我喜欢有成就感和明智的感觉。这在我的工作中不是最好的事情,但我在家里经常这样做。我不需要每个人都看到它。我可以只靠自己的聪明才智。然后,工作就好了。我也喜欢做一些与我的工作不相关的事情,即使我在两个地方都写代码。我喜欢写一些其他程序员可以使用和欣赏的东西。

你的原因可能会不同。很好,去找到它。

对你的工作满意。如果它不再让你满意,你也会选择终止。如果它不再是好的,那就是紧急情况:你需要休假,或重新连接你喜欢的东西,或其他。如果你的工作不再有好的感觉,你就会快速且艰难地燃尽你对工作的热情。

对工作满意,甚好。如果不好,就换工作。

这些都不一定意味着工作都得很好,也不一定非得要换工作。但是你的工作中需要有足够的好东西来让你坚持下去。坚持下去需要一定的要求,不管是哪种方式。所以这也可能影响你的工作。

这不是一个短跑或马拉松,而是一本日记

决定 "我要成为一名计算机程序员 " 并制定一个有 56 个要点的八节计划,说明你将如何做,这很容易。我不会告诉你不要激动。如果你不能兴奋起来,那又何必呢?

但我想说:不要把计划看得太重。

小时候,我住在一个我讨厌的破烂小镇外 4.2 英里处,那里的人也讨厌我。公平地说,有很好的理由--我是一个悲惨的小混蛋。他们并没有错过机会。卡内基梅隆大学的学位让我离开了那里。在我看到电脑之前,电脑似乎很神奇,当我有机会玩弄一个老的 Apple IIe 时,在卡内基梅隆大学,我经常在计算机实验室里待着,因为计算机非常棒,而我没有任何社交技能。

40 岁程序员会有哪些肺腑之言?这篇文章告诉你_计算机科学_03

所以。我采取了一条非常直接的路线来编写软件。我很早就开始了,我不断地工作。

但即使是像我这样的人也不能只靠软件存活。随后,我找到了朋友,并希望能留住他们。紧接着,我厌倦了与人交谈的乏味。最终,我找到了妻子。然后,有了自己的孩子,并尽可能给他们最好的。最终我发现,情绪的僵化和压抑只能让你越走越远离幸福的生活,即使有一份好工作。

在某些时候,你停止盘算,因为你不可能通过计算和计划来完成所有的事情。在某些时候,你不是 "脱离任务",你只是在 "过你的生活"。

因此,如果你因为做了软件不相关的东西而自责......也许不必要。为什么我在这里谈了这么多音乐?因为我也在学习,而不是把所有东西都放到软件里。艺术,也是。我做了一个讲座,并写了一本书,讲的是从艺术家那里偷取软件的实践方法,而且我正在为自己的东西绘制越来越多的插图。很明显,我也在演讲和写作。我的兴趣每年都在扩大。

这不是一种失败。这也不是放弃。你无法预测什么是有价值的,所以你应该学习一些东西。这和我说的关于你应该写什么样的软件是一样的,尽可能广泛的涉猎。这就是我要教的:你活得越久,工作得越好,你就越能意识到每件事(和每个人)都有有用的东西能教会你。

继续工作吧。

学习编写软件并不是一项你计划好的任务:完成这些要点,你就是一个程序员了。随着你写出第一个程序,你就是一个程序员了。如果你正在读这篇文章,你有可能是一个程序员。如果不是,就去在线代码学习网站上写你的第一个程序吧 -- 它应该在 20 分钟内完成。

有时你会想在某些方面有所提高:你的程序越大就越混乱,所以你要学习一些模块化和封装。你试图以良好的性能来处理成千上万的组合,所以你可能要学习一些离散数学。所有这些东西都可以在网上找到,如果你想深入了解,通常会有书籍和课程的参考。

学习非软件的东西也是这样。写游戏《Chicory》的人将他屏幕上的声音与他写的那部分游戏音乐的调子相协调:你会得到和谐的音符,因为它播放的风铃略有不同,取决于背景中的歌曲。这真是太酷了?我意识到我知道的还不够多,甚至不懂得欣赏它。这有助于推动我去年的音乐创作。

只要继续工作。有很多无限有趣的工作可以让你变得更好。不要害怕那些看起来不切实际的工作。我不知道我的软件工作要用音乐来做什么。也许什么都不做。也许是一切。未来是非常遥远的,我不擅长预测二十年后会有什么帮助。

我们任何一个人都无法预测。

你不是在跑短跑或跑马拉松。相反,你在写一本日记。十年后,你是否会翻开它说,"哇,我做了一些很酷的事情?" 或者 "嗯,我是一个相当有趣的人?" 我想你可以在日记中写道:"我对 Java 语法很在行"。

但为什么?

不要把工作和职业混淆

我难道不想在某个时候退休吗?能退休就好了。但我不会停止工作。我不会为了钱而去做我不喜欢的工作,特别是如果它不能教给我什么了不起的东西。我目前在 ​ ​YJIT​​ 上的工作充满了我愿意免费写的代码......但如果我没有得到报酬,我就不会碰账单,也很少写状态更新。他们会少了很多系统管理的工作或 Git 历史的维护。不要把工作和你的事业混为一谈。它们不是一回事。它们只是勉强相关。编写软件是不可思议的工作。它是一个还不错或更好的职业。

这是我一直在谈论音乐家的另一个原因。有的人通过写作和演奏音乐获得报酬。但许多(大多数?)音乐家从未得到过报酬,但仍然在做。这项工作很有趣,很有力量,很令人满意。如果你能得到报酬,这可能为你打开更多的时间来工作。但工作是关于工作的,而有报酬的工作是关于为你热爱的工作扫清道路。对我来说,编写软件就是这样。也许对你来说也是如此?

不过,最重要的是要分辨出你在任何时候得到的是哪种建议。你会得到关于工作(此处作者用的 work)的建议。你会得到关于具体工作(job)的建议。如果你把其中一个误认为是另一个,那么这些建议就没有什么意义。更加令人讨厌的是,人们会交替使用 "工作"(work)、"工作 "(job) 和 "事业 "(career) 等词。因此,只听正确的词并不能告诉你哪个是哪个。

没有确定的级别

如果你学习的顺序并不重要,那么就不存在 "第一级 "或 "第二级 "这样的东西。或任何其他级别。关于先学什么语言或技术,你会得到不同的建议,这很好。但如果你开辟了自己的道路,这并不意味着你没有做基本功,你就很糟糕。最终,如果某些东西是重要的,你会发现你需要它,你会回到它上面。

或者你不会。但大多数情况下,你会的。

你会听到一些可怕的故事,说有人忽视了一些基本的东西,年复一年地变得很糟糕。这种情况也会发生。比如,你可以写 15 年的可怕的意大利面条代码,其中每个模块都伸向其他模块,直接设置对方的变量。如果你继续尝试,你会发现为什么这样做不好,或者你会发明一种新的风格,对这个问题有一个新的解决方案,并在一些奇怪的事情上获得成功。一个程序员的 "新范式 "就是另一个程序员的 "怪事",总是如此。

问题是当你不继续尝试变得更好。如果你不断地犯新的错误,你就会学到有用的东西,或美好的东西,或怪异的东西。如果你一直做同样的事情而不去尝试改进,那么当然,你会一直很糟糕。

但是,即使你按部就班地通过某人预先设计好的级别,这也是真的。

李小龙说:"我不惧怕会一万种腿法的敌人,我只怕把一种腿法练一万次的对手"。

40 岁程序员会有哪些肺腑之言?这篇文章告诉你_软件开发_04

诀窍是关注和提高。你可以在专注于一件事,或十件事,甚至一百件事时,如果你坚持足够长的时间都有可能做到。你可能无法管理一万件事情。但如果你真的足够努力,你可以证明我错了。你必须要做一些奇怪的事情。

这很好。新的范式 -- 被称为 "奇怪的事情"-- 是我们如何在新事物上变得更好的方式。如果 "每周二做一些全新的事情 "是你的一脚,那么就继续踢下去。你会发现这很糟糕,或者你会变得非常擅长它。

你变得越好,你就越不像其他人一样

职业生涯早期的培训(代码学校、博客文章、大学课程、书籍)往往感觉有点像一条流水线。有一堆真正的基本技能 -- 例如写函数、调试、估算、与团队交谈 -- 他们试图确保你在每一个方面都有一个基本的能力水平。

人们很容易认为,这意味着对于,比如说,一个首席工程师,有一个你需要的技能清单,但清单上有更多的技能,技能水平必须更高。但事实并非如此。根本不是这样。

这不仅仅是工作水平。它也是开源中的“级别”,尊重的级别。

你可以通过使用一段相当简单的代码并写出大量的细节(对人类来说,用英语)来获得巨大的尊重,比如 Patrick McKenzie 的 Bingo Card Creator 。你可以通过写一些真正有利可图的东西而受到尊重,像一个公司的创始人。或者写一些深奥复杂的东西,比如一种晦涩难懂的语言( Haskell ,有人知道吗?)这些途径除了基本能力之外,几乎没有任何共同之处。

你需要真正擅长某件事,而且这件事需要受欢迎或有利可图,或者以某种方式 "做大"。这听起来应该是非常模糊的,因为它是。它也是主观的。如果你打算做比尔-盖茨级别的软件,而你最后却写了 Haskell(复杂、深奥、广受好评,但不那么赚钱),那你就会铸成大失败,反之亦然。而相关的技能是完全不同的。

这就是为什么问这样一个问题:"我是一个有 15 年经验的软件工程师,通常的工资是多少?"这是很愚蠢的。十五年的经验是如此之多,以至于你应该几乎完全不像站在你旁边的工程师,他们同样有十五年经验。你写了一本书吗?在一个大规模的项目上工作,赚了钱?把一个有趣的开源项目放在一起?你在这 15 年里做了什么?这就像说,"我是一个有二十年经验的音乐家,我每小时应该收多少钱?" 这个问题没有简单的答案,也不应该有。

这也不仅仅是工资的问题。你可以问,"我是一个有 15 年经验的软件工程师,这意味着我有能力领导这个项目,对吗?" 当然,答案是 "也许"。后续的问题是 "你在这 15 年里做了什么?"

通过做基础工作来学习深刻的原理

我并没有告诉人们一开始就去学习软件设计的深层原理。这是因为如果你试图把它们作为理论来学习,而没有实践经验,你几乎可以保证会做错。首先要学会用某种实际的语言建立一个可用的软件。我并不关心是哪一种。在你的实际开发中下获得一些真正的错误。然后我们可以讨论有什么理论可以解决你个人的问题。

如果事实证明你在模块化方面很出色,那么很好!我们可以讨论你的其他问题。对我来说是可行的。如果你没有问题,但结果仍然是简单而平淡的......那么你确实有问题,我们可以讨论这个。如果你没有你关心的问题,那就意味着你可以在一段时间内建造同样水平的软件。由你决定。当你开始感觉到你的工作变得陈旧时,那么你确实有一个问题,所以你可以寻找一个解决方案。在那之前,做对你有用的事。

然后,做同样的循环,持续二十多年。建设,犯错,学习一些理论,修正你的错误。我不太关心你做这一切的顺序。

这是否意味着如果你先学习理论,你就会 "堕落 "并永远变坏?不,不。但在你能正确使用你所学的东西之前,需要一段时间。所以这不是建立软件的最快方法。从长远来看,这一切都很好。现在还很早,对吗?

你使用什么样的技术比较重要

我已经花了很多时间告诉你,你按什么顺序学习什么技术并不重要。

什么时候重要呢?

重要的是,你要学习一些不同的东西。如果你总是做一件事,你不知道你会养成什么坏习惯。如果你总是只做一台机器上的编码,你就不知道你有多少东西没有学到网络。而最终网络可能是很重要的。如果你只在网络服务器上工作,而从不在手机或应用程序的代码上工作,你永远不会知道为什么 "在我的机器上工作 "是如此糟糕。你可以在相当长的一段时间内做一件事--五年?十年?但如果你要做到四十年,你需要学习很多其他技术,这些技术是由你的软件在边缘触及的。你需要一点视角。

观点就像其他深层次的原则--你通过工作和看到现实世界的问题来获得它。而且你要通过各种工作来获得它,这样你就能看到不止一种观点。当你说 "好吧,我的部分是有效的",但整个系统是失败的,因为其他人的部分没有工作,你就会意识到你有一个观点问题。你学会了关心比你自己的代码更大的东西。这就变成了软件架构,但它也变成了视角和同情。一个真实世界的软件系统,要做一些有用的事情,有很多软件,但也有很多人。你不能忽视这些人。

这意味着要学习各种技术,以及各种非技术的技能。

你使用什么技术很重要的另一个原因是,一些语言或库会使你在特定的技能方面更出色。你 "应该至少学习一种功能性编程语言",就像你 "应该学习弹奏莫扎特的钢琴曲 "一样。它会教你一些有趣的东西,让你变得更好。如果你想在编程领域做四十年,你需要扎实的基本技能。

难道你不能从任何技术中学习扎实的基本功,而不仅仅是那些奇怪的难点?当然可以。如果你已经做到了,那么学习相当于莫扎特钢琴曲的软件对你来说就不难了。莫扎特没有什么神奇之处。他倾向于写难的音乐,你必须快速而准确地移动你的手指。Haskell 也没有什么神奇之处。它需要你对模块化和依赖性保持谨慎和准确。如果你在这些方面已经很出色,你会做得很好。

但如果你在欺骗自己说自己很棒,你会发现你在撒谎。

我对学习软件采取的 "做任何感觉好的事情 "的方法,最好的一点是,无论你在做什么,你都可以继续做下去。最糟糕的是,我不会让你对你的错误负责。我只是假设你会处理这个问题。

这可能是伟大的。它可能是可怕的。你可以选择。我不是你的母亲或你的导师。

我们中的大多数人都需要偶尔在屁股上踢一脚来注意我们的问题。我当然需要。我踢自己屁股的一个方法是学习一些艰难而准确的东西,如果我犯了一个错误,我会注意到它。

关注其他领域,向其他领域学习

如果我们的行业是年轻的,这意味着什么?这意味着我们仍然在摸索基本的东西。

当我在大学的时候,从 1993 年到 1998 年,测试优先和测试驱动开发还不是真正的东西。敏捷也不是一个真正的东西。这些方法是存在的,但并不流行,也不为人所知,更没有很好的发展。源码控制存在,但不是很好,没有被广泛使用。开放源码是存在的,但人们普遍认为开放源码意味着粗糙的软件。认为 Linux 是或可能是最好的服务器操作系统的想法是一件奇怪的事情,一些狂热者也许相信。C 语言的速度足以取代汇编语言用于速度密集型的应用,这一点并没有得到很好的解决。"GOTO "最终被认为是不好的,我们应该避免它。网络刚刚起步,在我上学期间,它开始支持网页上的图片。

在我们这个行业,事情变化得相当快。换个角度来说,我们在基础方面仍然是无能的。

你可以从其他领域学到大量的东西。我写了一本关于如何窃取艺术家的练习方法的书。我一直在这里谈论音乐家。艺术和音乐是古老的学科。我们已经教了它们很长时间了。艺术和音乐教师比计算机科学教授更好。他们有几千年的先机。

因此,如果你有一个问题,你开始学习计算机程序员处理这个问题的最好方法......你可能已经大大限制了你的选择。最好是考虑一下其他人是如何处理这个问题的。Atul Gawande 的《清单宣言》谈到了飞行员、摩天大楼建造者和医生处理清单的非常不同的方式。他们都是伟大的方法。在软件领域,我们才刚刚开始偷学他们的一些技巧。因此,如果你向软件工程师学习,你已经跳过了学习处理大多数核对表状问题的最佳方法。

核对表在这里并不独特。爵士乐手的合作水平让程序员羡慕不已。严肃的视觉设计师产生的结果是数据科学家可以尝试模仿的,但我们并不擅长这个。当我看到烹饪学校培训的团队和他们的工作空间组织时,我的下巴都掉下来了。在一个图书馆员组织的数据空间工作几年,你就会明白我们的文档是多么糟糕。

如果你想和最好的程序员一样好,你就会严重地出卖自己。

我相信你已经注意到,当涉及到建议时,程序员往往忽视非程序员的骄傲方式。"单纯的 "QA 人员和运营人员往往被视为二等公民,我们经常表现得好像他们没有什么可以教我们的。而这是非常愚蠢的。如果你是聪明人,你会弄清楚他们擅长什么,以及为什么这很重要。

如果你认为答案是 "他们什么都不擅长,而且这一点也不重要",那么你永远不会像他们那样擅长他们所做的事情。

要从非常不同的学科中学习技能是很难的。学习足够的艺术来偷学他们的实践方式是很难的。这可能需要几年时间。但那些与编程非常相似的学科 -- 比如说数据库管理,或者 DevOps --足够接近,值得尝试去了解它们。

这也意味着,如果你有木工、舞蹈或空手道的爱好,你也许应该考虑一下这给你带来了什么技能。另一个程序员将不得不花几年时间来学习它,但你已经有了。我希望它能教会你一些可转移的技能。我不知道是哪些,因为我不做木工或(大部分)舞蹈或空手道。这就是为什么我在这里谈论艺术和音乐,那些我知道一点的东西。

程序员是反面典型

如果你从其他领域学习,会让你变得很奇怪。大多数情况下这是好事,但有时也会引起摩擦。

例如,艺术家、音乐家和作家都知道,如果你重复同样的活动,一遍又一遍,你会变得很擅长。重写是一件事。反复练习同一首乐曲是一件事。反复画人物和画静物也是一件事。

我们在软件方面也有一个名字。"重新发明轮子"。这被认为是一件坏事,我们在私下里可耻地这样做。我们寻找方法,让计算机做所有的重复工作,这样我们就可以只做新的工作。

事实上,说你反复做同样的事情是在公众面前受到羞辱的快速方法。这让你失去了声誉。以怪异的方式做事往往会使你失去声誉。当然,声誉也与头衔和金钱等东西联系在一起。

这就是为什么我们大多数人真的不善于启动新项目。这就是为什么我们中的大多数人不能谈论何时使用一种或另一种语法结构,以及为什么我们表现得好像缩进有公开的规则,应该由机器来执行,好像有一种简单的、正确的方法来做。因为你培养这些技能的方式是重复,随着时间的推移变得更好,相信表达能力,并与其他人类交流。作为一个行业,这些都是我们鄙视的东西。

这是否意味着你个人需要在这些方面做得不好?一点也不。

你不可能说服程序员以其他方式思考。也许有几个人,个别的。但是,答案不是要把每个人都拖到更好的状态。那将需要几十年甚至更长时间。你没有那样的时间。你想变得更好,比这更快。

但是,你个人可以做一些 "不好的做法",但事实上会使你变得更好。

你可以重新发明轮子。你可以重复地写同样的东西。你也可以用 "坏 "的方式写代码,看看会发生什么。

对最佳实践要小心。它们就像其他形式的建议:它们意味着别人做了工作来思考并变得更聪明,而你只是在使用他们想出的最简单的东西。

这在开始时很好。但作为一种改进的方式,这是很糟糕的。

要明白,如果你向艺术家、图书馆员和厨师学习,你就不能轻易地把软件世界的其他部分也拖下水。仅仅因为你是对的,并不意味着你能说服他们。你的正确做法甚至可能需要他们不具备的技能。

但是,如果你不太关心你周围的人怎么想,你就可以变得更好。而且你不必告诉人们你是如何做到的。

你变得越好,你就越不像其他人。包括,特别是,那些真正擅长的 "其他人"。

出于同样的原因,要小心使用工具和执行。它们是为了保持最低限度的能力水平。它们并不是为了让你在一些不寻常的事情上真正擅长。

而你想在一些不寻常的事情上变得真正优秀。

谨慎对待生产力技巧

人们会告诉你,取得好成绩的诀窍是不断努力。我的意思是,到目前为止,我至少已经告诉你四五次了。他们会说,诀窍是每天进步一点点,让它成倍增长。

这个建议的陷阱就在这里:大多数时候,练习不会让你明显好转。每隔一段时间,它就会使你有一个巨大的跳跃。其中一些巨大的跳跃会使你在其他几件事上变得更糟。

如果你期望每年都有20%的进步,每月都有复利,这将会感觉很糟糕。

效率只能让你走到这里。这些过程中有很多是非常低效的,而且完全不可靠。有时它们会带来巨大的收益。通常情况下,他们会一无所获。偶尔他们会对你造成伤害,而不是帮助。

这就是成功的样子,对于这个特定的任务。

生产力和效率的建议,漂亮整齐的那种,通常是针对结构良好的任务,你很了解。四十年的编程生涯并不是那种任务。再次强调:考虑日记,而不是马拉松或短跑。试图为自己保留一个进度条是会很糟糕的。

随着时间的推移,你会学会小心任何过于整齐的东西。再次强调:建议是去除所有最重要部分的专业知识。是的,这包括我现在所说的。

效率总是某种特定类型的效率。一个有时间效率的方法可能是有金钱效率的。无论是哪一种,都可能需要比你目前拥有的孩子更少,或者需要一个更安静的地方。效率是指你如何完善一个已经到位并运作良好的策略。

我不太谈论效率技巧。我不会告诉你做这些事情的最快方法。最精心优化的方法是脆弱的,基本上总是如此。效率是好的。优化是好的。一旦你有了基本的工作,它可以提供额外的一点帮助。

困难的部分是让基本要素发挥作用。所以这就是我告诉你的大部分内容。之后的高效就不那么重要了,也更容易。

但说真的,大多数情况下,只要做到这一点就行了

对于我来说,这些都是完美的事情。大部分是为了让你放心,而不是为了改变你的方法。我一直在推荐来自非技术学科的建议,这并不是巧合,因为你已经知道了,而不是在满是技术书呆子的论坛上,淋漓尽致地表现出刚听从这些建议的热情。

如果你写程序,你就是一个程序员。或码农,或软件工程师,或任何你喜欢的称呼。

如果你继续写程序,你就可以成为一个不管多少年的程序员。没有人在监督这些东西。或者至少,如果有人这样做,你知道你可以安全地忽略他们。我的意思是,有人会在这里评论说:"他不是一个 40 年的程序员,他是全职不到 25 年的!" 这很愚蠢,但我们在这里谈论的是互联网。有人会这么说的。有时标题甚至不是为了自我描述,但你必须阅读第一句话才能理解。两句话,才能了解完整的背景。而你知道JoeRandom_420 并不会引起注意。

在任何情况下,如果你继续努力,你就有资格。这不是一个正式的俱乐部,任何人都可以把你赶出去。如果你做了一段时间的工作,你就可以说你做了一段时间的工作。

你如何做一段时间的工作?你要坚持不懈。你要管理你自己的期望。你注意到你正在犯的错误,并纠正它们。你试着小心,不要太僵硬。你试着继续享受这项工作。

以上就是你刚刚看到的所有这些东西。

剩下的就是时间,也许还需要保持一点稳健。

在你意识到之前,40 年就会过去了。正如我父亲的保险杠贴纸上橡树旁边写的那样:"你,也会很快变老"。

原文链接:​ ​The Forty-Year Programmer​


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK