四十年编程
一位留着胡须、戴着高帽的教授向你鞠躬。
很高兴见到你…

YouTube上有视频版本 Source
在2024年,我将成为一名40年的程序员。我还没有完全达到目的,但我会达到的。这与开发软件赚最多的钱,或创办一家软件公司不同。我确实赚了很多钱。但这并不是这一切的目的。
我认为你可能想长期做一个软件开发者,就像有些人长期做音乐家,或长期做艺术家,或长期做屋顶工人一样。如果不是,你可以在你的浏览器中点击 “返回”。这很好,无伤大雅。但我想也许你想成为一个二十年的程序员,或四十年,或更多。
我不会告诉你要学什么语言或框架。如果你擅长基础知识,你可以学习任何你想要的东西。在那之前,你想学哪种就学哪种,你可以不擅长。反正我就是这么做的。
相反,我将谈论那些在我开始时没有意义的事情,现在它们是我天空中的指导性星星。这意味着这不是关于具体的技术。技术来了又走。语言来了又走。它们不可能成为你的天空。
让我们从这个开始:软件是年轻的。
软件开发是年轻的
计算机语言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岁半就开始拉大提琴。他远远不是世界上演奏时间最长的音乐大师。吉尼斯书上说卡斯帕-“陌生人”-马龙有连续八十年的专业音乐发布。而这只是专业音乐人和为赚钱而出售的歌曲。它不包括现场表演或任何他们不收费的东西。因此,让我们说一个真正有经验的音乐家已经工作了15年,比我们整个学科存在的时间还长。
我们的领域是年轻的。
你不一定要从年轻开始
那么,如果我8岁开始,马友友4岁半开始,对你来说是不是太晚了?不,不。
我45岁时开始认真弹钢琴,大约一年前。我认为我真的在进步。如果我能够坚持下去,当我60岁的时候,我就会变得非常出色。我已经可以演奏一些像样的歌曲了。当你已经有一些背景和一些观点时,你会变得更好,你知道吗?你已经练习了几十年,或者超过几十年的技能。
假设你50岁了。你可能有30年的时间作为一个软件开发人员,或多或少。如果你从50岁开始,你在10年后的60岁会比我在10年后的18岁好得多。好得多。
我遇到的优秀程序员都是从20岁、30岁甚至40岁开始的。我不知道你有什么理由不能从50或60岁开始。这需要时间和工作。但你不一定要年轻。
但这是否意味着你不会有多好?算是吧。我在钢琴上不会像马友友在大提琴上那么好。我不会像艾伦-凯那样擅长编程,尽管我开始时比较年轻。你知道还有谁比不上马友友吗?基本上所有其他拉大提琴的人。他们没有让它阻止他们。反正他们中的很多人都擅长大提琴。而我喜欢弹钢琴,即使我永远不会成为世界前十名。
我仍然喜欢写软件。我成为下一个Alan Kay的几率基本为零。他在我这个年龄已经写出了Smalltalk。如果你从事软件工作,"不要成为Alan Kay "是必要的。即使年轻的Alan Kay也不是现在的Alan Kay。他必须接受这一点。
秩序不是决定性的
如果你想有一个长期的编程生涯,而你刚刚开始,我经常说 “只要写一些软件,任何软件,什么都无所谓”。你将需要研究很多不同的东西。你以什么顺序研究它们并不是什么大问题。
在40年里,很多趋势来了又走。桌面应用程序?完成了。手机?写了。操作系统和系统?是的。网络编程?完全是。你自己的清单将是不同的,但它将横跨许多种编程。只要你尝试不同的事情,你做这些事情的顺序并不重要。
当然,"尝试不同的事情 "是关键。你在四个不同领域各做十年,比你写40年的网络插座服务器要好得多。这并不是说40年的深度没有价值。深度绝对有价值。所以你不应该在四十个不同的领域各做一年。
但你必须小心,不要变得僵化。事实证明,几乎任何学科都有东西可以教你。如果你太僵硬而不去学习,你就会失去机会。
尝试不同种类的编程。以任何顺序尝试它们。但是,你应该在某些方面下功夫,而且要越来越好。
现在还很早
如果你研究的东西是无用的呢?呃,无用是相对的。我把多年的业余时间放在一种叫做DGD的旧MUD编程语言上。这当然不是为了实用价值。几乎所有关于它的东西都是奇怪的、非标准的,而且很少有真正实用的东西。然而,因为它很奇怪,所以它教会了我很多东西。它教会了我Ruby on Rails后来使用的东西,它还教会了我关于数据库编程的东西,尽管它没有使用数据库!它教会了我一些东西,而这些东西对我来说很有用。它教给我的东西在我后来学习的五六种不同的语言中都很有用。它给我讲了一个又一个的战争故事。
有趣的是,许多年后我得到了一份DGD的咨询工作。世界上没有多少DGD的工作,从来没有。但我有一个。这比我所学的很多 "实用 "语言更实用。你永远不知道。
假设马友友15岁,在他的音乐生涯中大约十年。假设他对你大惊小怪,说他是应该演奏一首复杂的古典音乐,还是用一些流行的爵士乐来糊弄人。你可以研究其优点:古典音乐作品会提高他的技术,流行的爵士乐作品会给他带来广度,等等。
但真正的答案更简单:两者都有价值,所以选择一些东西并加以利用。如果你再坚持30年,那么你选哪一个就不那么重要了。两者都能使你变得更好。重要的是工作。把真正的工作放在任何一个方面,这都将是宝贵的经验。试图不假思索地 “溜之大吉”,那么这两者都不值得你花时间。
这就是年轻的马友友的答案。这也是对你的答案。
我经常对自己说 “现在还早”。我的意思是,我已经46岁了。我还没有到96岁,还没有结束。我至少还有二十年的时间,也许还有五十年的时间。因此,如果我做一些奇怪的、非主流的事情,而且它教给我有趣的东西,那真的很好。如果我做一些实用的东西,让我度过短期,那也很好。
但重要的是:继续工作。作为一个程序员,要想做到二十年或四十年或七十年,需要大量的工作。如果两件工作难以取舍……可能它们都很好,任何一件都会是一个好的选择。否则,它们都是坏的,你应该找一些有价值的东西来代替。
现在还很早。研究一些有趣或有用的东西。给予它时间来支付红利。但你猜测的是十年、二十年或三十年后的回报。不要总是选择十八个月后最好的东西。你不可能真正看到未来会发生什么。
工作是好的
你进入写软件,是因为它有吸引你的地方。它的某些部分是好的,否则你就不会费心了。
试着想一想那是什么。你喜欢什么?是什么吸引了你?它有什么好的地方?这对每个人来说都是不一样的。完全不一样。
我喜欢有成就感和聪明的感觉。这在我的工作中不是最好的事情,但我在家里经常这样做。我不需要每个人都看到它。我可以只靠自己的聪明才智。然后,工作就好了。我也喜欢做一些与我的工作不同的事情,即使我在两个地方都写代码。我喜欢写一些其他程序员可以使用和欣赏的东西。
你的理由会有所不同。很好。找到它们。
工作是好的。如果它不再是好的,你也会停止。如果它不再是好的,那就是紧急情况:你需要休假,或重新联系你喜欢的东西,或其他。如果你的工作不再有好的感觉,你就会快速而艰难地烧掉。
工作是好的。如果不好,就换工作。
这些都不一定意味着工作是好的,也不意味着要换工作。但是你的工作中需要有足够的好东西来让你继续下去。要保持下去是一种要求,不管是哪种方式。所以这也可能影响你的工作。
这不是一个短跑或马拉松,而是一个日记本
决定 "我将成为一名计算机程序员 "并制定一个有56个要点的八个部分的计划,说明你将如何做,这很容易。我不会告诉你不要激动。如果你不能兴奋起来,那又何必呢?
但我想说:不要把计划看得太重。
小时候,我住在一个我讨厌的破烂小镇外4.2英里处,那里的人也讨厌我。公平地说,有很好的理由–我是一个悲惨的小混蛋。他们并没有错过机会。卡内基梅隆大学的学位让我离开了那里。在我看到电脑之前,电脑似乎很神奇,当我有机会玩弄一个老的苹果IIe时,电脑又很神奇。在卡内基梅隆大学,我经常在计算机实验室里闲逛,因为计算机非常棒,而我却没有任何社交技能。
所以。我采取了一条非常直接的路线来编写软件。我很早就开始了,我不断地工作。
但即使是像我这样的人也不能只靠软件生存或死亡。最终我找到了朋友,并希望能留住他们。最终,我厌倦了自己是个糟糕的谈话对象。最终,我想要,并且找到了妻子。最终,我有了孩子,并试图为他们做好事。最终我发现,情绪的僵化和压抑只能让你走得更远,即使有一份好工作。
在某些时候,你会停止计算,因为你不可能通过计算和计划来完成所有的事情。在某些时候,你不是在 “脱离任务”,你只是在 “过日子”。
因此,如果你因为做一些不是软件的事情而自责……也许不要。为什么我在这里谈了这么多音乐?因为我也在学习,而不是把所有东西都放到软件里。艺术,也是。我做了一个讲座,并写了一本书,讲的是从艺术家那里偷取软件的实践方法,而且我正在为自己的东西绘制越来越多的插图。很明显,我也在演讲和写作。我的兴趣每年都在扩大。
这不是一种失败。这不是放弃。你无法预测什么是有价值的,所以你应该学习一些东西。这和我说的关于你应该写什么样的软件是一样的,但是更广泛。这就是教训:你活得越久,工作得越好,你就越能意识到每件事(和每个人)都有有用的东西要教你。
只要继续工作。
学习编写软件并不是一项你计划好的任务:完成这些要点,你就是一个程序员了。只要你写出你的第一个程序,你就是一个程序员。如果你正在读这篇文章,你有可能是一个程序员。如果不是,请在一个在线代码学习网站上写出你的第一个程序–它应该在20分钟内完成。
有时你会想在一些特别的方面有所提高:你的程序在变大后会被缠在一起,所以你要学习一些模块化和封装。你试图以良好的性能处理数以千计的组合,所以你可能会学习一些离散的数学知识。所有这些东西都可以在网上找到,如果你想深入了解,通常会有书籍和课程的参考。
学习非软件的东西也是如此。写游戏《Chicory》的人将他屏幕上的声音与他写的那部分游戏音乐的调子协调起来:你会得到和谐的音符,因为它播放的风铃略有不同,取决于背景中的歌曲。这真是太酷了?我意识到我知道的还不够多,甚至不懂得欣赏它。这有助于推动我去年的音乐创作。
只要继续工作。有无限有趣的工作可以让你变得更好。不要害怕那些看起来不切实际的工作。我不知道我的软件工作要用音乐来做什么。也许什么都不做。也许是一切。未来是非常遥远的,我不擅长预测二十年后会有什么帮助。
我们都不擅长。
你不是在跑短跑或跑马拉松。相反,你在写一本日记。十年后,你是否会翻开它说,“哇,我做了一些很酷的事情?” 或者 “嗯,我是一个相当有趣的人?” 我想你可以在日记中写道:“我在Java语法方面相当出色。”
但为什么呢?
不要混淆工作和事业
难道我不想在某个时候退休吗?那就好了。但我不会停止工作。我不会为了钱而去做我不喜欢的工作,特别是如果它不能教给我什么了不起的东西。我目前在YJIT上的工作充满了我愿意免费写的代码……但如果我没有得到报酬,我就不会碰费用报告,也很少写状态更新。他们会少了很多系统管理的工作或Git历史的修剪。不要把工作和你的事业混为一谈。它们不是一回事。它们只是勉强相关。编写软件是不可思议的工作。它是一个好的或更好的职业。
这是我一直在谈论音乐家的另一个原因。有一些人通过写作和演奏音乐获得报酬。但许多(大多数?)音乐家从未得到过报酬,但仍然在做。这项工作很有趣,很有力量,很令人满意。如果你能得到报酬,这可能为你打开了更多的时间来工作。但工作是关于工作的,而工作是关于为你的工作扫清道路。对我来说,编写软件就是这样。也许对你来说也是如此?
不过,最重要的是,要分辨出你在任何时候得到的是哪种建议。你会得到关于工作的建议。你会得到关于工作的建议。如果你把其中一个误认为是另一个,那么这些建议就没有什么意义了。更加令人讨厌的是,人们会交替使用 “工作”、"工作 "和 "事业 "等词。因此,只听正确的词并不能告诉你哪个是哪个。
没有确定的级别
如果你学习的顺序并不重要,那么就不存在 "第一级 "或 "第二级 "这样的东西。或任何其他级别。关于先学什么语言或技术,你会得到不同的建议,这很好。但如果你开辟了自己的道路,这并不意味着你没有做基本功,你就很糟糕。最终,如果某些东西是重要的,你会发现你需要它,你会回到它上面。
或者你不会。但大多数情况下,你会的。
你会听到一些可怕的故事,说有人忽视了一些基本的东西,年复一年地变得很糟糕。这种情况也会发生。比如,你可以写15年的可怕的意大利面条代码,其中每个模块都伸向其他模块,直接设置对方的变量。如果你继续尝试,你会发现为什么这样不好,或者你会发明一种新的风格,对这个问题有一个新的解决方案,并在一些奇怪的事情上获得成功。一个程序员的 "新范式 "就是另一个程序员的 “怪事”,总是如此。
问题是当你不继续尝试变得更好。如果你不断地犯新的错误,你就会学到有用的东西,或美丽的东西,或怪异的东西。如果你一直做同样的事情而不去尝试改进,那么当然,你会一直很糟糕。
但是,即使你按部就班地通过某人预先设计好的水平,这也是真的。
李小龙说:“我不惧怕练过一万次腿法的人,每次都是一次。但是,练过一万次一脚的人,我怕他”。
诀窍是关心和改进。你可以在专注于一件事,或十件事,甚至一百件事时做到这一点,如果你坚持足够长的时间。你可能无法管理一万件事情。但如果你真的足够努力,你可以证明我错了。你必须要做一些奇怪的事情。
这很好。新的范式–读作 “奇怪的事情”–是我们集体擅长新事物的方式。如果 "每周二做一些全新的事情 "是你的一脚,那么就继续踢下去。你会发现这很糟糕,或者你会变得非常擅长。
你变得越好,你就越不像其他人
职业生涯早期的培训(代码学校、博客文章、大学课程、书籍)往往感觉有点像一条流水线。有一堆真正的基本技能–例如写函数、调试、估算、与团队交谈–他们试图确保你在每一个方面都有一个基本的能力水平。
人们很容易认为,这意味着对于,比如说,一个首席工程师,有一个你需要的技能清单,但清单上有更多的技能,技能水平必须更高。但事实并非如此。根本不是这样。
这不仅仅是工作水平。它也是开源中的’级别’,尊重的级别。
你可以通过使用一段相当简单的代码并写出大量的细节(对人类来说,用英语)来获得巨大的尊重,比如Patrick McKenzie的Bingo Card Creator。你可以通过写一些真正有利可图的东西而受到尊重,比如公司的创始人。或者写一些深奥复杂的东西,比如一种晦涩难懂的语言(Haskell,有人知道吗?)这些途径除了基本能力之外,几乎没有任何共同之处。
你需要真正擅长某件事,而且这件事需要受欢迎或有利可图,或者以某种方式 “做大”。这听起来应该是非常模糊的,因为它是。它也是主观的。如果你打算做比尔-盖茨级别的软件,而你最后却写了哈斯克尔(复杂、深奥、广受好评,但不那么赚钱),那你就是个大失败,反之亦然。而相关的技能是完全不同的。
这就是为什么问这样一个问题:"我是一个有15年经验的软件工程师,通常的工资是多少?"这是很愚蠢的。十五年的经验是如此之多,以至于你应该几乎完全不像站在你旁边的一个同样有十五年经验的工程师。你写了一本书吗?在一个大规模的项目上工作,赚了钱?把一个有趣的开源项目放在一起?你在这15年里做了什么?这就像说,“我是一个有二十年经验的音乐家,我每小时应该收多少钱?” 这个问题没有简单的答案,也不应该有。
这也不仅仅是工资的问题。你可以问,“我是一个有15年经验的软件工程师,这意味着我有能力领导这个项目,对吗?” 当然,答案是 “也许”。后面的问题是 “你在这15年里做了什么?”
你通过做基础工作来学习深奥的原理
我不会告诉人们一开始就去学习软件设计的深层原则。这是因为如果你试图把它们作为理论来学习,而没有实践经验,你几乎可以保证会做错。首先要学会用某种实际的语言建立一个可用的软件。我并不关心是哪一种。在你的腰带下获得一些真正的错误。然后我们就可以讨论有什么理论可以解决你个人遇到的问题。
如果事实证明你在模块化方面很出色,那就太好了!我们可以讨论你的其他问题。我们可以讨论你有的其他问题。对我来说是可行的。如果你没有问题,但结果仍然是简单而平淡的……那么你确实有问题,我们可以讨论这个。如果你没有你关心的问题,那就意味着你可以在一段时间内建造同样水平的软件。由你决定。当你开始感觉到你的工作变得陈旧时,那么你确实有一个问题,所以你可以寻找一个解决方案。在那之前,做对你有用的事。
然后,做同样的循环,持续二十多年。建设,犯错,学习一些理论,修正你的错误。我不太关心你做这一切的顺序。
这是否意味着如果你先学习理论,你就会 "堕落 "并永远变坏?不,不。但在你能正确使用你所学的东西之前,需要一段时间。所以这不是建立好软件的最快方法。从长远来看,这一切都很好。现在还很早,对吗?
你使用什么技术很重要
我已经花了很多时间告诉你,你按什么顺序学习什么技术并不重要。
什么时候重要呢?
重要的是,你要学习一些不同的技术。如果你总是做一件事,你不知道你会养成什么坏习惯。如果你总是只做一台机器上的编码,你就不知道你有多少东西没有学到网络。而最终网络可能是很重要的。如果你只在网络服务器上工作,而从不在手机或应用程序的代码上工作,你永远不会知道为什么 "在我的机器上工作 "是如此糟糕。你可以在相当长的一段时间内做一件事–五年?十年?但如果你要做到四十年,你需要学习很多其他技术,这些技术是由你的软件在边缘触及的。你需要一点视角。
观点就像其他深层次的原则–你通过工作和看到现实世界的问题来获得它。而且你要通过各种工作来获得它,这样你就能看到不止一种观点。当你说 “好吧,我的部分是有效的”,但整个系统是失败的,因为其他人的部分没有工作,你就会意识到你有一个观点问题。你学会了关心比你自己的代码更大的东西。这就变成了软件架构,但它也变成了视角和同情。一个真实世界的软件系统,要做一些有用的事情,有很多软件,但也有很多人。你不能忽视这些人。
这意味着要学习各种技术,以及各种非技术的技能。
你使用什么技术很重要的另一个原因是,一些语言或库会使你在特定的技能方面更出色。你 “应该至少学习一种功能性编程语言”,就像你 "应该学习弹奏莫扎特的钢琴曲 "一样。它会教你一些有趣的东西,让你变得更好。如果你想在编程领域做四十年,你需要扎实的基本技能。
难道你不能从任何技术中学习扎实的基本功,而不仅仅是那些奇怪的难点?当然可以。如果你已经做到了这一点,那么学习相当于莫扎特钢琴曲的软件对你来说就不难了。莫扎特没有什么神奇之处。他倾向于写难的音乐,你必须快速而准确地移动你的手指。Haskell也没有什么神奇之处。它需要你对模块化和依赖性保持谨慎和准确。如果你在这些方面已经很出色,你会做得很好。
但如果你在欺骗自己说自己很棒,你会发现你在撒谎。
我对学习软件采取的 "做任何感觉好的事情 "的方法,最好的一点是,无论你在做什么,你都可以继续做下去。最糟糕的是,我不会让你对你的错误负责。我只是假设你会处理这个问题。
这可能是伟大的。它可能是可怕的。你可以选择。我不是你的母亲或你的导师。
我们中的大多数人都需要偶尔在屁股上踢一脚来注意我们的问题。我当然需要。我踢自己屁股的一个方法是学习一些艰难而准确的东西,如果我犯了一个错误,我会注意到它。
向其他领域看齐,向其他领域学习
如果我们的行业很年轻,这意味着什么?这意味着我们仍在摸索基础知识。
当我在大学里的时候,从1993年到1998年,测试优先和测试驱动的开发还不是真正的东西。敏捷也不是一个真正的东西。这些方法是存在的,但并不流行,也不为人所知,更没有很好的发展。源码控制存在,但不是很好,没有被广泛使用。开放源码是存在的,但人们普遍认为开放源码意味着粗糙的软件。认为Linux是或可能是最好的服务器操作系统的想法是一件奇怪的事情,一些狂热者也许相信。C语言的速度足以取代汇编语言用于速度密集型的应用,这一点并没有得到很好的解决。"GOTO "最终被认为是不好的,我们应该避免它。网络刚刚起步,在我上学的时候,它就开始支持网页上的图片了。
在我们这个行业,事情变化相当快。换一种说法,我们在基础方面仍然是无能为力的。
你可以从其他领域学到大量的东西。我写了一本关于如何窃取艺术家的实践方法的书。我在这里一直在谈论音乐家。艺术和音乐是古老的学科。我们已经教了它们很长时间了。艺术和音乐教师比计算机科学教授更好。他们有几千年的先机。
因此,如果你有一个问题,你开始学习计算机程序员处理这个问题的最好方法……你可能已经大大地限制了你的选择。最好是考虑一下其他人是如何处理这个问题的。Atul Gawande的《清单宣言》谈到了飞行员、摩天大楼建造者和医生处理清单的非常不同的方式。他们都是伟大的方法。在软件领域,我们才刚刚开始偷学他们的一些技巧。因此,如果你向软件工程师学习,你已经跳过了学习处理大多数核对表状问题的最佳方法。
核对表在这里并不独特。爵士乐手的合作水平让程序员羡慕不已。严肃的视觉设计师产生的结果是数据科学家可以尝试模仿的,但我们并不擅长这个。当我看到烹饪学校培训的团队和他们的工作空间组织时,我的下巴都掉下来了。在一个图书馆员组织的数据空间工作几年,你就会明白我们的文档是多么的糟糕。
如果你想和最好的程序员一样好,你就会严重地亏待自己。
我相信你已经注意到,当涉及到建议时,程序员倾向于忽略非程序员的骄傲方式。"单纯的 "QA人员和运营人员往往被视为二等公民,我们经常表现得好像他们没有什么可以教我们的。而这是非常愚蠢的。如果你是聪明人,你会弄清楚他们擅长什么,以及为什么这很重要。
如果你认为答案是 “他们什么都不擅长,而且这一点也不重要”,那么你永远不会像他们那样擅长他们所做的事情。
要从非常不同的学科中学习技能是很难的。学习足够的艺术来偷学他们的实践方式是很难的。这可能需要几年时间。但那些与编程非常相似的学科–比如说数据库管理,或者DevOps–足够接近,值得尝试去了解它们。
这也意味着,如果你有木工、舞蹈或空手道的爱好,你也许应该考虑一下这给你带来了什么技能。另一个程序员将不得不花几年时间来学习它,但你已经有了。我希望它能教会你一些可转移的技能。我不知道是哪些,因为我不做木工或(主要)舞蹈或空手道。这就是为什么我在这里谈论艺术和音乐,那些我知道一点的东西。
程序员是相反的
如果你从其他领域学习,会让你变得很奇怪。大多数情况下这是好事,但有时也会引起摩擦。
例如,艺术家、音乐家和作家都知道,如果你重复同样的活动,一遍又一遍,你会变得很擅长。重写是一件事。反复练习同一首乐曲是一件事。反复画人像和画静物也是一件事。
在软件领域,我们也有一个名称。“重新发明轮子”。这被认为是一件坏事,我们在私下里可耻地这样做。我们寻找方法,让计算机做所有的重复工作,这样我们就可以只做新的工作。
事实上,说你反复做同样的事情是在公众面前受到羞辱的快速方法。这让你失去了声誉。以怪异的方式做事往往会使你失去声誉。当然,声誉也与头衔和金钱等东西联系在一起。
这就是为什么我们大多数人在开始新项目时真的很糟糕。这就是为什么我们中的大多数人不能谈论何时使用一种或另一种语法结构,以及为什么我们表现得好像缩进有公开的规则,应该由机器来执行,好像有一种简单的、正确的方法来做。因为你培养这些技能的方式是重复,随着时间的推移变得更好,相信表达能力,并与其他人类交流。作为一个行业,这些都是我们鄙视的东西。
这是否意味着你个人需要在这些方面做得不好?一点也不。
你不可能说服程序员以其他方式思考。也许有几个人,个别的。但是,答案不是要把每个人都拖到更好的状态。那将需要几十年甚至更长时间。你没有那样的时间。你想变得更好,比这更快。
但你个人可以做一些 “不好的做法”,但事实上会使你变得更好。
你可以重新发明轮子。你可以重复地写同样的东西。你也可以用 "坏 "的方式写代码,看看会发生什么。
对最佳实践要小心。它们就像其他形式的建议:它们意味着别人做了工作来思考并变得更聪明,而你只是在使用他们想出的最简单的东西。
这在开始时很好。但作为一种改进的方式,这很糟糕。
你要明白,如果你向艺术家、图书馆员和厨师学习,你就不能轻易地把软件世界的其他人也拉进来。仅仅因为你是对的,并不意味着你能说服他们。你的正确做法甚至可能需要他们不具备的技能。
但是,如果你不太关心你周围的人怎么想,你就可以变得更好。而且你不必告诉人们你是如何做到的。
你变得越好,你就越不像其他人。包括,特别是,那些真正擅长的 “其他人”。
出于同样的原因,要小心使用工具和执行。它们是为了保持最低限度的能力水平。它们并不是为了让你在一些不寻常的事情上真正擅长。
而你想在一些不寻常的事情上变得真正优秀。
谨慎对待生产力技巧
人们会告诉你,取得好成绩的诀窍是不断工作。我的意思是,到目前为止,我已经告诉你至少四五次了。他们会说,诀窍是每天进步一点点,让它成倍增长。
这个建议的陷阱就在这里:大多数时候,练习不会让你明显好转。每隔一段时间,它就会使你的成绩有一个巨大的飞跃。其中一些巨大的跳跃会使你在其他几件事上变得更糟。
如果你期望每年都有20%的进步,每月都有复利,这将会感觉很糟糕。
效率只能让你走到这里。这些过程中有很多是非常低效的,而且完全不可靠。有时它们会带来巨大的收益。通常情况下,他们会一无所获。偶尔他们会对你造成的伤害比他们的帮助更大。
这就是成功的样子,对于这个特定的任务。
生产力和效率的建议,漂亮整齐的那种,通常是针对结构良好的任务,你很了解。四十年的编程生涯并不是那种任务。再次强调:考虑日记,而不是马拉松或短跑。试图为自己保留一个进度条是会很糟糕的。
随着时间的推移,你会学会小心任何过于整齐的东西。再次强调:建议是去除所有最重要部分的专业知识。是的,这包括我现在所说的。
效率总是某种特定类型的效率。一个有时间效率的方法可能是有金钱效率的。无论是哪一种,都可能需要比你目前拥有的孩子更少,或者需要一个更安静的地方。效率是指你如何完善一个已经到位并运作良好的策略。
我不太谈论效率技巧。我不会告诉你做这些事情的最快方法。最精心优化的方法是脆弱的,基本上总是如此。效率是好的。优化是好的。一旦你有了基本的工作,它可以提供额外的一点帮助。
困难的部分是让基本的工作。所以这就是我告诉你的大部分内容。之后的高效就不那么重要了,也更容易。
但是,说真的,主要是要做到这一点
我说的这些都是非常好的事情。大部分是为了让你放心,而不是为了改变你的方法。我一直在推荐来自非技术学科的建议,这并不是巧合,因为你已经知道了,而不是在满是技术书呆子的论坛上,淋漓尽致地表现出新近皈依者的不宽容的热忱。
如果你写程序,你就是一个程序员。或编码员,或软件工程师,或任何你喜欢的称呼。
如果你继续写程序,你就可以成为一个不管多少年的程序员。没有人在监督这些东西。或者至少,如果有人这样做,你知道你可以安全地忽略掉他们。我的意思是,有人会在这里评论说:“他不是一个40年的程序员,他是全职不到25年的!” 这很愚蠢,但我们在这里谈论的是互联网。有人会这么说的。有时标题甚至不是为了自我描述,但你必须阅读第一句话才能理解。两句话,才能了解完整的背景。而JoeRandom_420并不是由注意力组成的,你知道。
在任何情况下,如果你继续努力,你就有资格。这不是一个正式的俱乐部,任何人都可以把你赶出去。如果你做了一段时间的工作,你就可以说你做了一段时间的工作。
你如何做一段时间的工作?你要坚持不懈。你要管理你自己的期望。你注意到你正在犯的错误,并纠正它们。你试着小心,不要太僵硬。你试着继续享受这项工作。
你刚刚看到的所有这些东西。
剩下的就是时间,也许还有一点保持温润。
在你意识到之前,40年就会过去了。正如我父亲的保险杠贴纸上的橡树旁边所说:“你也会很快变老。”
2022年8月29日
职业技巧
分享。推特
www.DeepL.com/Translator