翻译转载来源:https://codefol.io/posts/the-forty-year-programmer/
到2024年,我就已经做了40年程序员了。虽然现在还没有到达那个阶段,但那天迟早会来。不同于通过开发软件赚很多钱,或者开一个软件公司。虽然我确实赚了很多钱,但是这并不是我从事软件行业这么多年的目的。
我认为你想长时间当一个软件开发者,就像一些音乐家、艺术家、装修工一样。如果不是这样,你就可以点击浏览器的右上角了,这样做非常的有趣,没有伤害也没有痛苦。但是我认为你可能想做一个二十年或40年甚至更久的程序员。那么请往下看。
我不会告诉你去学习哪种语言或框架。因为如果你有良好的编程基础,你能学习任何你想学习的编程知识。直到学好基础之前,你不能学习好你想要学的任何技术知识。无论如何,这就是我学习的方式。
反而我要说的事情是我在刚开始编程时没有意识到但现在他们是我天空中的指路星的那些事情。这就意味着这篇文章不会具体的谈论某项技术。技术和语言来来去去,但他们不会成为你的指路星。
让我们从【软件是年轻的】开始吧
软件开发很年轻
计算机语言Fortran可以追溯到1957年,还有一些同期的语言(LISP和Algol:1958年,COBOL:1959)和一些年龄更大的奇怪竞争者(Konrad Zuse的Plankalkül,1942 ish)
距今已经65年了,大约从1957年开始就有程序员了。自1998年(24年)以来,我一直是一名全职有偿程序员,但自1984年(38年)以来我就开始做程序员了,所以我的经验颇为丰富。Alan Kay,Smalltalk编程语言的发明者,大约始于1963-59年。他是我发现的最活跃的人之一。
相比之下,YOYOMA已经66岁了,他从4岁半起就开始演奏大提琴。他远不是世界上演奏时间最长的音乐大师。《吉尼斯世界纪录》称,Kasper “Stranger” Malone 在连续八年里都有专业的音乐发行。这还只是职业音乐人和卖钱的歌曲。还没有计算live演出或者任何不需要付费的音乐。所以,让我们假设一位真正有经验的音乐家工作了15年,就比我们整个行业存在的时间还要长。
如此看来,我们的领域还很年轻。
你不需要从小开始
所以如果我从八岁开始编程以及YOYOMA从四岁半就开始演奏,相比之下对你来说就太迟了吗?
大约一年前,我才开始认真弹钢琴,当时我才45岁。我想我真的很有进步,如果我坚持下去,我会在60岁的时候演奏的非常棒。我已经可以体面演奏一些歌曲了。你知道吗?当你掌握一些知识背景和思考方法时,你会更快的编号。几年来,你一直在练习掌握技能,甚至不止几年。
假设你已经50岁了,你能有差不多30年的好时光去做一个软件开发者。如果你从50岁开始,当你到60岁会比我在十八岁所花的十年有效率多了。
我遇到过20岁、30岁甚至40岁才开始工作的优秀程序员。我不知道任何你不能从50岁或者60岁开始的原因。学习编程需要时间和工作,但不需要你年轻。
但这是否意味着你不会做的那么好?我在钢琴演奏上没有YOYOMA在大提琴演奏好。即使我重新从年轻时重学编程,我在编程上都没有Alan Kay厉害。你还知道有谁不如YOYOMA吗?基本上所有演奏大提琴的人,但是这点没有阻止他们去学习大提琴。不管怎样,他们中的许多人都擅长大提琴。所以即使我永远不会进入世界前十,我还是享受弹钢琴。
我同样享受编程。我成为下一个艾伦·凯的可能性基本为零。他在我这个年龄已经完成了Smalltalk的编写。如果你从事软件工作,“不需要做艾伦凯”是必要的。即使是年轻的艾伦·凯也也做不了现在的艾伦·凯。他必须接受这一点。
顺序并不关乎成败
如果你想拥有一个长期编程生涯并且你开始入行,就应该照我常说的做:“只需要写一些软件,任何软件都没有关系”。你需要去学习许多不同的事情,你学习它们的顺序反而不是很重要。
在这40年中,许多业务方向来来往往。桌面app?完成了,移动端?写了,操作系统?搞定了,网页编程?一直在弄。你自己的列表可能回不一样,但是它将跨越多种不同的编程。你做这些功能的顺序并不重要,重要的是你需要一直尝试不同的事情。
当然,“尝试不同的东西”是关键。你在四个不同领域中的每一个领域都用了 10 年的时间,比用 40 年编写网络套接字服务器好得多。这不代表40年的深度没有价值,深度肯定是有其价值的。所以你不应该在一年中做40件不同的事情。
但是你得小心别太死板,事实证明几乎任何学科方向都会教你一些东西。如果你坚持不去学习它,你就会落伍。
尝试不同类型的编程。虽然无需在意尝试它们的顺序,但你应该在某些方面深耕,并变得更好。
现在还早着呢
如果你学的东西没用呢?呃,有没有用是相对的。我花了多年的业余时间扑在一门叫DGD的老式MUD编程语言上。我当然不是为了它的实用价值。几乎所有关于它的东西都是奇怪而且非标准化的,并且它很少有真正实用的地方。但正因为它的奇怪教会了我很多。它教会了我后面使用Ruby on Rails,还教会了数据编程方面的一些东西,即使它没有使用数据库!它教会我的东西,在我后面学习的五六种语言都很有用。它让我一小时又一小时地讲与它战斗的故事。
有趣的是,很多年后我在DGD中得到一份咨询工作。这个世界上就没有几个DGD的工作,我居然得到了一份。你永远不会知道我学了许多“有用”的语言都没有这个语言有用。
假如YOYOMA15岁,大约是它音乐生涯中的十年。假装他像你一样烦恼,到底是该演奏一首复杂的古典音乐,还是玩弄一些流行的、爵士乐的东西。你可以帮他看看它们的优点:古典音乐会提高他的技巧,流行的爵士乐会给他带来广度,等等。
但是真正的答案很简单:既然两者都有价值,那就挑选一些东西然后学习它。如果你再坚持30多年,你选哪一个并不重要。这两个都能让你变得更好。重要的是工作,将其投入实际工作中,这将是宝贵的经验。试着不假思索的“划走”,这两种都不值得你花时间。
这就是年轻的马友友的答案。这也是给你的答案。
我经常对自己说“现在还早”。我的意思是我才46岁,而不是96岁或更高年龄。我至少还剩下二十年甚至是五十年时间。所以如果我做了奇怪的或者非主流但是它带给我了乐趣的东西,那真的很不错。如果我做一些实际的东西,并且能让我在短期度过难关,那也挺好。
但是重要的事情是:坚持工作,作为一个程序员需要在20年、40年或60年做大量的工作。如果两个工作都难以取舍,那可能他们都很好,其中每一个都是好的选择。否则他们都是不好的,那你就需要找更有价值的替代他们了。
现在还早,去学习有趣的或者有用的吧。去支付你的时间学习他们,但你猜测的是十年、二十年或三十年后的回报。不要总是选择十八个月后最好的东西。你不可能真正看到未来会发生什么。
好的工作
你开始编写软件一定是因为它在某些方面吸引到了你。它的某些部分是好的,否则你就不会费心了。
尝试弄清楚原因。你喜欢什么?什么引导着你?他有什么好处?这对每个人来说都不一样。
我喜欢成就感和聪明的感觉。这在我工作中不是最好的事情,但是我在家经常做。我不需要所有人看见它。我可以完全依靠自己的智慧。然后工作就好了。我同样喜欢做一些不同于工作的东西,甚至我在两个地方都写代码。我喜欢写一些其他程序员可以使用和欣赏的东西。
你的将会有些不同,这很好,找到他们吧。
你应该对你的工作感到满意,如果它不在让你满意,你就应该停止做它。如果它不再是好的,那就是紧急情况:你就需要休假或者找到一个你喜欢的东西。如果你的工作不再有好的感觉,你就会快速且艰难地燃尽你对工作的热情。
对工作满意比较好。如果不满意,就换工作。
这些都不一定意味着工作都需要很好,或者必须要换工作。但是你需要足够好的工作来保持你进步。保持进步是有要求的,不管是以那种方式。所以这也可能影响你的工作。
这不是短跑或者马拉松,这是写日志
做一个决定很简单,例如“我要成为一名程序员”然后列出有56个要点的8节计划说明你要如何做。我不会告诉你不要激动,如果你都不能兴奋起来,那又何必费心做程序员呢。
但是我会告诉你:不要把计划看的太重。
在我小时候,我住在离这里4.2英里的一个破烂小镇上,我讨厌哪里的所有人,当然他们也讨厌我。有个好理由,公平的说:我是个小混蛋,他们都没啥过错。一个卡内基梅隆大学的学位让我离开了那里。在我看到电脑之前,我一直觉得电脑很神奇,直到我有机会玩弄一个老的 Apple IIe 时才开始了解电脑。在卡内基梅隆大学我一直呆在实验室,因为计算机非常棒,而我没有任何社交技能。
所以:我采取了一条非常直接的路径去写软件,我很早开始了不断的工作。
但是即使是像我这样的人都不能只靠软件生活。最后我找到了朋友并且希望和他们维持关系。最后我厌倦了与人交谈的乏味。最后我找到了妻子。然后,有了自己的孩子,并尽可能给他们最好的。最终我发现,情绪的僵化和压抑只能让你越走越远离幸福的生活,即使有一份好工作。
在某些时候,你停止筹划是因为你不可能预料到每件事并给出计划。在某些时候,你不是 "脱离任务",你只是在 "过你的生活"。
所以你因为做了软件不相关的东西而自责是没必要的。为什么我在这里谈了这么多音乐?因为我也在学习,而不是把所有东西都放到软件里。学习艺术也同样如此,我曾经做了一个讲座并且写了一本书,它讲的是如何从艺术家那里偷取软件的时间方法,我正在展示越来越多我自己的东西。很明显,我也在演讲和写作。我的兴趣每年都在扩大。
这不是一种失败,也不是放弃。你不能预测什么将会变得有价值,所以你应该学习一些东西。这和我给你说的关于你应该写什么样的软件一样,你应该尽可能广泛的涉猎。这就是我要交给你的:你活的越久工作的就越好,你就越能意识到每件事(和每个人)都有有用的东西能教会你。
工作就完了。
学习软件编程并不是一项你计划好的任务:当你完成这些点就你就是一个程序员了。还需要你尽可能快的写出你第一个项目你才是一个程序员。如果你在读这篇文章,你有可能是一个程序员。如果不是,如果不是,就去在线代码学习网站上写你的第一个程序吧 -- 它应该在 20 分钟内完成。
有时候你想要提升你的某些方面:你的程序越大就越混乱,所以你需要学习模块化和封装。你试图以良好的性能来处理成千上万的组合,所以你可能要学习一些离散数学。所有这些东西都可以在网上找到,如果你想深入了解,通常会有书籍和课程的参考。
学习非软件的东西也是这样。写游戏《Chicory》的人将他屏幕上的声音与他写的那部分游戏音乐的调子相协调:你会得到和谐的音符,因为它播放的风铃略有不同,取决于背景中的歌曲。这真是太酷了?我意识到我知道的还不够多,甚至不懂得欣赏它。这有助于推动我去年的音乐创作。
继续去实践吧,工作会有无限的乐趣让你变得更好。不要害怕那些看起来不切实际的工作。就像我不知道音乐对我的软件工作有什么帮助,也许什么帮助都没有,也许会让我获得很高成就。未来太遥远了,我不善于预测未来20年后音乐会给我什么帮助。
我们任何一个人都无法预测。
你不是在短跑或者跑一场马拉松。相反的,你正在写日记。在十年后,你可能会翻开它说:‘哇,我做了一些很酷的事情’或者‘哈,我真是个有趣的人’。但是我猜你能坚持写日记然后说“我很擅长java语法的”。
不要搞混工作和职业
难道我不想在某个时候退休吗?退休当然很不错。但是我不会停止工作。我不会为了钱做我不喜欢的工作,特别是不会教给我什么了不起的东西的工作。我目前在 YJIT 上的工作充满了我愿意免费写的代码,但是如果我没有收费,我就永远不会碰账单还很少更新我的状态。他们会少了很多系统管理的工作或 Git 历史的维护。所以,不要把你的工作和你的事业混为一谈,他们不是一回事。他们只有很少的关联。写软件是了不起的工作,它是一个不错或更好的职业。
这就是我要一直谈论音乐家的另一个原因。一些人通过写和演奏音乐获得报酬。但是许多或者大多数音乐家一直没有获得报酬但是他们仍然在做。工作时有趣,有力量且令人满意的。如果你能通过它获得报酬,这可以为你打开更多时间去工作。但是工作就是工作,而职业是帮你扫清工作障碍的一种手段。对我来说,编写软件就是我的职业。也许你也一样?
不过,最重要的事情是你在任何时候得到的是哪类建议。你会得到关于工作的建议。也会得到关于职业的建议。如果你把一个建议误认为另外一个,这个建议就没有多大意义了。令人讨厌的是,人们会混淆使用“工作”、“职业”、“事业”等词。所以只听词的表达不能告诉你哪个是哪个。
编程没有固定的等级
如果学习的顺序不重要,那么就不存在“第一级”或“第二级”或其他级别这样的东西。关于先学哪门语言或课程你会获得不同的建议,这很好。但是如果你开辟了你自己的路,这并不意味着你没有做好基本功,你就很糟糕。最终,如果某件事很重要,你会发现你需要它,然后会回到它上面。
或者你不会,但是大多数时候,你会的。
你会听到一些可怕的故事,关于一些人忽视一些基础,年复一年变得更糟糕。这种情况是会发生的,就像你能写15年的意大利面条式代码,其中每个模块都能直接进入其他模块,并且能直接修改对方的变量。如果你继续尝试,你会发现这样为什么不好,你会创造一个新的风格来解决这个问题,然后在一些奇怪的事情上获得表现出色。一个程序员的“新范式”对于其他程序员总是相对怪异的。
问题在于你不尝试继续进步。如果你继续犯错,你就会学到有用的东西,或美好的东西,或怪异的东西。如果你一直做相同的事情而不去尝试改进,你就会一直很糟。
但如果你按照顺序通过某人预设的关卡也是可行的。
李小龙说:"我不惧怕会一万种腿法的敌人,我只怕把一种腿法练一万次的对手"。
诀窍就是关注和提高,如果你坚持足够长的时间,你可以专注于一件事,十件事甚至是一百件事。你可能无法管理一一万件事情。但是如果你真的足够努力,你可以证明我错了。但你必须要做一些奇怪的事情。
这很好,新的范式-被称为“奇怪的事情”-是我们怎样收集好的新事物的方式。如果“在每个星期二做一些全新的事情”是你的“一脚”,那就继续踢下去吧。你会发现这很糟糕,或者你会变得非常擅长它。
你变得越好,你就越与众不同
职业生涯早期的培训(代码学校、博客文章、大学课程、书籍)感觉像一条流水线。他们有一堆真正的基础技能-例如,写函数、调试、估算以及团队交流。他们试图确保你在每一个方面都有一个基本的能力水平。
人们很容易认为,比如说,一个首席工程师,有一个你需要的技能清单,但是有许多技能在列表上同时,还必须要保持高水平,但是那并不是事实,一点儿也不。
它不仅仅是工作水平,它同样是开源的级别,还是受尊敬的级别。
你能通过写一段相当简单的代码然后写出(使用自然语言,如英语)它的大量细节来获得巨大的尊重,比如 Patrick McKenzie 的 Bingo Card Creator 。你还能通过写出一些真正能获利的软件来获得尊重,就像一个公司的创始人。或者写一些有深度的和复杂的东西,就像一些晦涩难懂的语言(Haskell)。这些途径除了基本能力之外没有多少相同的地方。
你需要非常擅长某件事,而且这件事需要受欢迎或有利可图,或者以某种方式 "做大"。这听起来应该非常模糊,因为它本来就是模糊的。它同样是主观的。如果你打算赚比尔-盖茨级别软件的钱,但是你却写了Haskell(复杂,高深,广受好评,但没钱)。你将会获得巨大的失败,反之亦然。并且相关联的技能完全不同。
这就是为什么问一些问题会很傻,例如“我有15年的编程经验,我的工资应该有多少?”。十五年的经验非常多,以至于你应该完全不像站在你旁边同样有15年经验的人。你写过书吗?在一个大规模的项目上工作,赚了钱?上传了非常有趣的开源项目?你在这十五年里面做了什么?就像说,“我是一个有20年经验的音乐家,我应该每小时赚多少钱?”对于这个问题没有一个简答的答案,它也不应该有。
不仅仅是工资的问题,你应该问“我是一个有15年经验的软件工程师,这意味着我完全有能力领导这个项目,对吗?”,这个答案当然是“有可能”。接下来的问题是“你在15年里面做了什么?”
你应该通过做基础练习学习深刻原理
我不会告诉人们一开始就去学习软件设计的深层原理。这是因为如果你尝试把他们当作理论去学习,但没有实际的经验,你大概率会犯错。先学习通过一些实际的语言去构建一个可用的软件。我真的不关心是哪个语言。在你的实际开发中获得一些真正的错误。然后我们能去讨论存在哪些理论去修复你个人的问题。
如果事实证明你在模块化这方面做的很出色,这太棒了!我们可以讨论你遇到的其他问题,对我来说是可行的。如果你没有问题,但结果仍然是简单而平淡的......那么你确实有问题,我们可以讨论这个。如果你没有需要关心的问题,这仅仅意味着你能很好的构建同级别的软件。由你决定。当你开始感觉到你的工作变得陈旧时,那么你确实有一个问题,所以你可以寻找一个解决方案。在那之前,做对你有用的事情。
然后,做二十多年的相同的循环。构建,犯错,学习理论,修复你的错误。我不太关心你做这一切的顺序。
这是否意味着如果你一开始学习了理论你就会“破坏”你自己然后永远变坏?当然不会。但是它会需要一段时间你才能使用你学的理论。所以他不是最快的方式去构建一个好的软件。在长期的学习中,一切都会好的,现在还早,不是吗?
使用什么样的技术很重要
我花了很多时间告诉你学习技术的顺序并不重要。
那重要的是什么呢?
重要的是你要学不同的东西,如果你总是做一件事,你不会了解到你养成了哪些坏习惯。如果你总是在一台机器上写代码,你就不知道自己有多少网络知识没有学到,而最终网络可能是重要的。如果你只是工作于web服务器并且从不写移动端或app代码,你就永远不会知道到为什么“只在我的机器上工作”是如此的糟糕。你能在相当长一段时间内做一件事情,五年?十年?但是如果你需要做40年,你就需要了解自己软件所涉及的许多其他技术。你需要一些视角(洞察力)才行。
观点就像其他深层原理一样,你通过工作和看到现实世界的问题来获得它。你需要通过各种工作来获取它,这样你就能看到不止一种观点。当你说“好吧,我的部分正常工作”,但是这整个系统失败了,因为其他人的部分没有工作,你就能意识到你观点的问题。你学习到关心一些大于你自己的代码的问题。这样就变成了软件架构,但是它同样变成了洞察和同理心。一个真实世界的软件系统,要做一些有用的事情,有很多软件,但也有很多人。你不能忽视这些人。
这意味着需要学习多种技术,和许多非技术的技能。
你使用什么技术很重要的另一个原因是,一些语言或库会使你在特定的技能方面更出色。你“应该至少学习一门功能性编程语言”,就像你“应该学习弹奏莫扎特的曲子”一样。它会教你一些有趣的东西,让你能变得更好。如果你想做四十年的编程,那你就需要有扎实的基础技能。
难道你不能从任何技术中学习扎实的基本功,而不仅仅是那些奇怪的难点?当然可以。如果你已经做到了,那么学习相当于莫扎特钢琴曲的软件对你来说就不难了。莫扎特没有什么神奇之处。他倾向于些难的音乐,你必须快速而准确地移动你的手指。Haskell同样没有什么神奇之处。它需要你对模块化和依赖性保持小心和精确。如果你在这方面已经很出色,你会做的很好。
但如果你在欺骗自己说自己很棒,你会发现你在撒谎。
我对学习软件编程采取 "做任何感觉好的事情 "的方法,这样的好处是无论你在做什么,你都可以继续做下去。但最糟糕的是,我不会让你对你的错误负责,我只是假设你会处理这个问题。
这可能很好,也可能很糟。你自己做选择吧。我不是你的母亲或你的导师。
大多数时候我们需要在屁股上被踢一脚来提醒我们的问题。我当然也需要。我在踢自己屁股的一个方法就是学习难而准确的东西,如果我犯错我就会注意到它。
关注其他领域,向其他领域学习
如果我们的产业很年轻,这意味着什么?它意味着我们仍然在摸索基础的东西。
当我在大学的时候(1993-1998),测试优先和测试驱动开发还不是真正的东西。敏捷开发也不是真正的东西。这些方法是存在的,但是并不流行,也不为人所知,更没有很好的开发。源码控制存在但是并不好用也没有广泛的使用。开源项目是存在的,但是人们普遍认为开放源码的都是粗糙的软件。认为Linux是或者永远是最好的操作系统是一件奇怪的事情,虽然一些狂热的信徒是相信的。对于速度密集型应用来说,C语言是否足够快以取代汇编语言还没有定论。最终,“GOTO”被认为是不好的,我们应该避免它。web开发才刚刚起步,我在校期间它开始在网页上支持图片。
在我们这行事情改变相当的快。换个角度来说,我们仍然在基础方面是无能的。
你能从其他领域中学到一大堆东西。我写了一本关于如何窃取艺术家的练习方法的书。我一直在这里谈论音乐家,艺术和音乐是古老的学科,我们已经教了它们很长时间。所以艺术和音乐教师比计算机科学教授更好,他们有几千年的经验优势。
所以如果你遇到一个问题,你开始学习计算机程序员处理问题的最佳方法……可能已经大大限制了你的选择。最好想想其他人处理问题的方式。Atul Gawande的《The Checklist Manifesto》讲述了关于宇航员、摩天大楼建造者和医生处理清单列表的方式是非常不同的。他们都是伟大的方法。在软件中,我们才刚刚开始偷他们的方法,所以如果你向软件工程师学习,你已经跳过了学习处理大多数清单类型问题的最好方式。
检查清单在这里不是独一无二的,爵士音乐家的合作水平让程序员十分羡慕。严肃的视觉设计师产生的结果是数据科学家可以尝试模仿的,但我们并不擅长这个。当我看到烹饪学校培训的团队和他们的工作空间组织时,我的下巴都掉下来了。在一个图书馆员组织的数据空间工作几年,你就会明白我们的文档是多么糟糕。
如果你想要和非常棒的程序员一样好,你真的在出卖你自己。
我很确定你会注意到程序员趋于忽视非程序员的好建议。"单纯的 "QA 人员和运营人员往往被视为二等公民,我们经常表现得好像他们没有什么可以教我们的。这是非常愚蠢的。如果你足够聪明,你会弄清楚他们擅长什么,并且为什么它很重要。
如果你认为答案是“他们什么都不擅长,而且这一点也不重要”,那你永远不会像他们一样擅长他们的事情。
要从非常不同的学科中学习技能是很难的。学习足够的艺术去偷他们的练习方式也是很难的。这可能需要几年时间。但是对于那些非常像编程的学科-数据库管理或者DevOps-都非常接近,这些都非常值得去了解他们。
这同样意味着如果你有木工、舞蹈或空手道的爱好,你应该去考虑这些技能能给你什么。另一个程序员可能要花多年去学习它,但是你已经有了。我希望它能教会你一些“可转移”的技能。但是我不知道是哪些技能,因为我不做木工或(大部分)舞蹈或空手道。这就是为什么我在这里谈论艺术和音乐,那些东西我还了解一点。
程序员是反面的
如果你从其他领域学习,它会让你变得奇怪。虽然大多数情况是好的,但是有时候它也会不太一样。
具体的例子就是,艺术家和音乐家还有作家如果你重复了相同的练习一遍又一遍,你会变得很擅长。重写是一件事,练习相同的音乐段落是一件事,反复画人物和画静物也是一件事。
我们在软件开发里面也有一个名字-“重复造轮子”。这被认为是一件坏事,我们在私下里认为这样做是可耻的。我们寻找方法让计算机做重复的事情让我们可以投身于新工作上面。
实际上,说你反复做同样的事情是在公众面前受到羞辱的快速方法。这让你失去了声誉,以怪异的方式做做事通常会消耗你的声誉。声誉当然同样与头衔和金钱等绑定在一起。
这就是为什么我们大多数人真的不善于启动新项目。这就是为什么我们中的大多数人都不能说明什么时候使用一种或另一种语法结构,这也是我为什么我们的行为就像机器应该强制执行关于缩进的一目了然的规则,好像有一种简单的、正确的方法来做。因为你构建技能的方式是重复的,并且它会随着时间变得更好,然后相信表达能力,并与其他人交流等常规规则在我们的行业都是被鄙视的。
这是否意味着你个人需要在这些方面做得不好?一点也不。
除了有几个个别的人,你不可能说服程序员以其他方式思考。但是,答案不是要把每个人都变为更好的状态。那将需要几十年甚至更长时间。你没有那样的时间。你想变得更好,比这更快。
但是,你个人可以做一些 "不好的做法",事实上做这些会使你变得更好。
你能重复的造轮子。你能重复的写一些东西,你同样能通过写一些“坏的”代码的方式来观察发生了什么。
但是要小心最佳实践(最佳方案),他们就像其他形式的建议:它们意味着别人做了工作来思考它,并变得更聪明,而你只是在使用他们想出的最简单的东西。这在开始时很好,但作为一种改进的方式就很糟糕。
明白如果你向艺术家和图书管理员和厨师长学习,你不能简单将软件世界的其他人拉进来。仅仅因为你是对的并不能说服他们。你的正确做法甚至可能需要他们不具备的技能。
但是,你不关心太多你周围的其他人怎么想,你就可以变得更好。而且你不必告诉人们你是如何做到的。
你变得更好,你就和其他人越不一样。包括,特别是,那些真正擅长的 "其他人"。
出于同样的原因,要小心使用工具和执行。它们是保证最低能力水平而设置的,而不是为了让你真正擅长一些不寻常的事情而设计的。但你想要的是在一些不寻常的事情上变得真正优秀。
谨慎对待生产力技巧
人们会告诉你取得好成绩的诀窍是持续不断的工作。我的意思是,我至少已经告诉你四五次了。他们会说诀窍是每天进步一点,然后成倍增长。
这个建议有个陷阱:大部分时间,练习并不能让你明显的变好。每隔一段时间,它就会使你有一个巨大的跳跃。其中一些巨大的跳跃会使你在其他几件事上变得更糟。
如果你期望每年持续20%的增长,月复一月就会感到很难受。因为效率只能达到这个程度,这些过程中有很多是非常低效的,而且完全不可靠。虽然有时它们会带来巨大的收益,但往往是什么都没有,偶尔他们还会对你造成伤害,而不是帮助。
漂亮整洁的生产力和效率建议,通常是针对你很了解,结构良好的任务,但40年的编程生涯并不是那种任务。需要再次强调的是:想想日志,不是马拉松或短跑。试图为自己保留一个进度条会很糟糕。
随着时间的推移,你会学会小型一些过于整齐的东西。再次强调:建议是去除最重要部分的专业知识。是的,包括我现在正在说的。
效率总是某种特定类型的效率。省时的方法可能不省钱。无论是哪一种,都可能需要比你目前拥有的孩子更少或者更安静的地方。效率是指你如何完善一个已经到位并运作良好的策略。
我很少谈论效率技巧,也并不是在告诉你做这些事情的最快方法,因为基本上最精心优化的方法也是最脆弱的。但是效率没问题,优化也是好的。一旦你有了基本工作,它可以提供额外的一点帮助。不过困难的部分在于让基础发挥作用,这也是我最想告诉你的,事后保持高效就不那么重要,也更容易。
但说真的,大多数情况下,干就完了
这些都是我认为比较完美的事情,大多数是为了让你安心,而并不是改变你的方法。我一直在推荐来自非技术学科的建议,这并不是巧合,因为你已经知道了,而不是在满是技术书呆子的论坛上展示自己。
如果你写程序,你就是程序员。或者是码农,或软件工程师,或任何你喜欢的称呼。
如果你坚持写程序,你可以成为一名多年的程序员。没人在监管这些东西,或者至少,如果一些人做了,你知道你能安全的避开他们。我的意思是,有人会在这里评论说:"他不是一个 40 年的程序员,他是全职不到 25 年的!" 这很愚蠢,但我们在这里谈论的是互联网。有人会这么说的,有时标题甚至不意味着自我描述,但你必须逐字阅读第一句才能理解。至少阅读两个句子,以获得完整的上下文。你知道,JoeRandom_420并不引人注目。
无论如何,如果你坚持做,你就有资格被称为程序员。这不是一个俱乐部,这里没人能赶你出去。如果你做了一段时间工作,就说你做了一段时间工作就是了。
你如何做一段时间的工作?答案是坚持不懈。在坚持中管理你自己的期望,同时注意在犯错时修正他们。并且不能太过于死板,需要尝试各种各样的编程方式,并且从其他领域学习。最后,尝试享受你的工作吧。
以上就是你刚刚看到的所有这些东西。
剩下的就是时间,也许还有一点就是保持成熟。
在你意识到之前,40年不知不觉就过去了。正如我父亲的保险杠贴纸上橡树旁边写的那样:"你,和我一样,会很快变老"。