硬核软件开发者 30 多年的 11 条经验教训

  • 日期:07-20
  • 点击:(1842)

兴发娱乐网址

R6Ay3Xl4IFwSVm

从非专业编程到专业开发人员,从BASIC,C ++到Rust,在本文中,已经从事软件开发行业30年的资深人士将带来他们最深刻的11课。

RVmSZDT4PJ6UqL

作者| Dean Roddey

翻译|谭凯,编辑|涂敏

制作| CSDN(ID:CSDNnews)

以下是翻译:

我第一次从事非专业编程工作多年,直到1988年我才开始专业编程。当我开始时,它处于软盘时代。我的高中计算机课程是主机终端上的BASIC程序。从那以后,我在这个领域投入了大量的时间和精力。我只希望在编程领域花费50年后,我会抛弃一些我学到或相信的东西,并探索各种问题,遵循内在的接受或忽略它。

RT4Gwk56bt5iOJ

复杂性是一场噩梦

从根本上说,复杂性对于我们这些处于软件频谱末端的人来说是一场噩梦。不幸的是,优化和灵活性是噩梦的间接生产者。遗憾的是,我们无法真正避免它们,并且在某种程度上它们非常有用或绝对必要。但显然,它们是复杂性的重要来源,复杂性不仅仅是错误决策或广泛漠不关心的结果,即使是最好的设计系统也是无法避免的,我们有目的地创造它们。

显然,这些工具可以在很小的部分提供很多帮助。但从更广泛的角度来看,没有什么可以帮助我们。这里存在一个真正的问题,无论是在开始还是在中间,我们在不同代码之间创建链接,这样我们就无法将信息完全传达给工具以确保我们做正确的事情。我们不可避免地创建始终不一致的对象的内部状态,以避免不必要的消耗,或者支持一些必需或预期的函数(如C ++中的移动语义)。

30多年后,我仍然没有答案。也许没有答案。除非有人能够在一个能够提前解决所有问题的框架中“完全按照我的意愿行事”,否则每项主要任务都将面临复杂的问题,而在我看来,只有人才能非常谨慎。我们并不擅长。

RT7S2kzFTfre26

顽固的持久性问题

我学到的重要一点是始终确保所保存的数据是版本化的,并使用精心设计的架构来支持扩展。如果你不能这样做,那么在你不在乎的地方总会出现问题。一旦您获得的存储数据不受版本控制,如果数据类型保持不变并且仍然是其他类型的一部分,解决问题的唯一方法是处理每种类型的包含,因为您可能必须依赖于版本的包括类型以确定您正在处理哪一个,旧的,坏的或新的。

我在早期犯了一些错误,但直到今天,我都不想考虑弥补它们。它们仍然存在,并且可能永远不会改变。

我在早期犯的另一个错误是先写入包含的数据值,然后写下包含数据类型本身的内容。但是,这意味着您甚至无法使用包含数据类型的版本来更正包含无版本值的持久性错误,因为在读取所有包含的值之前无法获取包含数据类型值的版本。在项目的早期,这让我非常不舒服。所以经验教训是,如果数据是分层的,请确保您的版本控制信息与之匹配(我认为它应该是预先排序的)。通过这种方式,您可以更正包含值持久性的错误。

RTJXJ1kBqzfCnu

一个可以在家创建的帝国

我真幸运。事实上,关于软件的最好的事情之一就是你可以做很多事情,可以改变你卧室的世界,或者创建一个小公司并发展成一个商业帝国,这将极大地改变你。银行资产创造了大量就业机会。当然还有一些其他的,虽然其中很多都很有创意,但你的劳动价值更多的是一种观点和趋势,而不是一种实用的效用,因为它更可能是软件。

通过计算机,编译器和概念,您可以以某种方式在世界上发挥真正的作用。

RTJXJ7YR5xGDl

说出你想要的东西

虽然持续的努力是合理的,但一些简单的工作可能不像它们那样敏感,因为它们并不那么复杂,当它们达到一定程度的复杂性时,它们变得麻烦,并且明确的意图陈述是最好的。

语言中可能总会存在一些压力,以便更快地编写代码。大多数产品都是这样的。那些能够尽快坐下来进入轻松愉快的演讲阶段的人更有可能被接受。对于更容易实现的事情来说,这是一个巨大的优势,或者VC是一个巨大的优势。

但是对于您创建的复杂系统,您所要做的就是将其写出来,然后您将永远负责。因此,任何以牺牲显式语义表达为代价来提高开发速度的方法(表达工具的真正含义,这是工具做你真正想做的事情的唯一方法)并不是一个好的折衷方案。在我看来,所有语言都应优先考虑提高表达语义的能力。例如,Rust在这方面做了一些有趣的事情,尽管我不同意他们的其他一些决定。

RTJXJ7uHXU5GZc

中年的必然性

语言似乎随着人们的生活轨迹而改变。他们在开始时非常专注,然后他们慢慢添加了越来越多的东西。我想部分原因是“游泳或死亡”法。在这种情况下,您认为必须不断添加功能,否则您将被视为落后并变得无关紧要。部分原因是为了增加越来越多人接受更多事物的吸引力和适用性。部分原因是,在与用户打交道时,他们总是在争论他们特别着迷的东西,但它们往往是不同的或相互排斥的。

最后,语言就像一个穿着speedo泳衣的中年胖子。它有点肥胖,太复杂,太分散,试图满足许多人的许多要求。在某些情况下,它甚至可能在相反的方向上创建,这在更广阔的世界中通常是正确的。这让我有时期待朋克革命。

一个相关的观点是,我认为语言必须大胆:我就是这样。这是进化的终结。它将被维护,仅此而已。我们需要放下进化的负担,并在相当高的水平上建立一个新的大本营。显然,这很难做到,但不这样做的后果也非常明显,因为进化的负担在不断积累,并且很可能不受整个语言领域的根本改进的影响,因为当空间被占用当他们根本无法重建时。

RTLSNam5ZxLDlM

过去的错误成为未来的希望

经过足够长的时间,那些在现实生活中被证明是不成熟和次优的事物,然后以巨大的牺牲得到纠正,将再次成为一个激进未来的新视野。一旦有足够多的人在难以实施解决方案后开始他们的职业生涯,他们将成长为一个他们沮丧的唯一目标是解决原始遗留问题的世界。

最后,很多人对过去没有不好的回忆。他们只看到现有的问题。他们看到了错误决策的后果,并指责工具和技术,或者认为固有的复杂性实际上是一种复杂的工具和技术。性,然后他们开始认为旧的东西是他们所有问题的答案,因为它比现在的模型更好。他们经常将这些想法用作现代主义,但实际上它们可能是倒退的。他们没有意识到,如果他们回到过去,他们仍然会做出那些糟糕的决定,并且存在固有的问题和复杂性,但在目前的技术背景下,这些技术在几年前就被彻底使用了。拒绝了。

RTRIuPNI7JPB03

企业家和雇佣兵

在我看来,有两种基本类型的开发人员。有些人想要创造自己的东西来销售,而其他人则为别人工作。这很明显,似乎与开发无关,但这两个方向创造了一个完全不同的软件世界。对于前者而言,语言主要是一种工具,一种实现目标的手段,没有必要追求最新和最好的语言功能,因为客户可能并不在乎,他们只关心功能和质量。因此,如果新的语言功能对产品或代码的质量没有真正的贡献,那么企业家可能根本不关心。

另一方面,在我看来,雇佣兵似乎更痴迷于语言本身,因为他们相信(通常是合理的)理解所有最新特征对于他们继续下一份工作很重要。换句话说,语言可能是他们职业发展的工具。因此,他们更有可能采用新功能,因为他们可能会在下次采访中被问及这些功能。

在我看来,这就是为什么有很多人在面向语言的论坛中讨论新语言的特点,而且这些功能多年不可能使用,即使有,实际的公司也不能使用这两个修改过的功能。

在线讨论中产生了一些不和谐的声音,因为参与者的潜在观点可能大不相同,但双方都没有明确理解对方的出发点。必须要说的是,编程论坛中的大多数人似乎都倾向于寻求个人利益,因此创办企业的想法往往不被广泛接受或理解。

RTRIuPaahjHjS

一些特殊需求需要特殊处理

我们从小时代就了解到,过度优化的缺点是正确的。您可以花费数月时间优化代码并引入许多额外的复杂性,但收效甚微,而在非常有限的代码区域中进行简单调整最终可以获得一个数量级的性能提升。许多程序根本没有明显的性能限制。

但是,如C ++,其性能优化有时会在底层基础架构和应用程序中产生复杂性,即使它实际上可能位于非常小的区域中的项目中。虚拟方法或运行时继承通常会谨慎使用,因此无需担心大多数项目,您应该选择最适合您的项目。

显然,通用代码在这方面确实有一些额外的义务,但总的来说,为优化通用代码引入很多复杂性并不是一个总体的胜利。这些代码变得更难以维护,更难以安全和快速地向前移动,并且需要更多的脑循环可以应用于其他事物并且更容易出错。所以这实际上是10%收益的90%份额,或者无论实际相对比率如何。

我想说的是那些有特殊性能需求的人是自给自足的,那些真正需要在更一般的程序中进行大幅优化的人需要特殊处理。这并不一定意味着他们每个人都必须自己做,但他们至少应该为那些真正需要它的程序或小程序使用专门的工具。这意味着有更多的时间花在对我们大多数人有益的事情上,而且我们所有的代码都不太可能随着时间的推移而引入错误。

RTYlVXmICmMrFE

从第一天起就认真对待项目结构

虽然经常说:哦,我们以后可以重构。但我们都知道,实际上,大型团队和大型代码库以及粗略的代码都不愿意接管。很难解释任何重大的重组,我们的努力是赶上以前的轨迹。知道自己确实需要做到这一点,甚至很难保护自己,因为不管你是否有心脏病发作,你都必须获得同样的奖励。

所以我主张从一开始就认真对待项目的结构。提前考虑一些相当糟糕的情况并计划进行大量扩展。即使你不重构,你也不会太难。如果是这样,你会更加准备。即使你一开始看起来太谨慎,也许你不会后悔。

显然,这不是最大的问题。我提到它的原因是因为当我开始一个项目时,很容易想到它。好吧,让我们做点什么吧,然后我们就知道下一步该怎么做了。然后你会得到一些有用的东西,商业现实开始起作用,而且突然间,多年后,这将是一个混乱和残酷的情况,所以你必须现在就做。

您可能仍然无法提前完成它,但对于非平凡的项目,一些认真的准备想法和先进的基础设施设置工作通常是值得的。作为单手开发人员,我的情况比大多数人更好,因此更容易停止开发并在整个代码库中进行大规模更改。但这可能是灵魂和脑细胞的丧失,也可能是浪费时间,可以避免,而这些时间可以花在更有成效的事情上。

RTYlVY98d1MEiD

数据和表达的分歧

这是一个非常常见的问题,但它仍然非常容易出错。开始时一切都很困难。当你开始一份新工作时,很容易忘记这些问题。安排这项工作通常需要付出更多努力。我厌倦了这样的问题。我仍然想提出一个论点:我的大多数错误(其中一些很难处理,因为它们已被处理到目前为止)已经很久以前就已经犯下了,并且已经成为我们日常生活的一部分。

我造成的最大问题是自动化系统的触摸屏系统。这非常复杂。刚刚完成初始部分已经是一项艰巨的任务,并且从那时起它已经发展壮大。与许多类似的东西一样,它是一组图形化的,通常是交互式的小部件,您可以将它们放在屏幕上与设计师一起配置为按照您的需要进行查看和操作。最后,配置这些小部件的数据是类层次结构的一部分,它负责实际显示小部件,因此两个小部件绑定在一起。

虽然15年前我做初期工作时没有意识到这些类型的问题。我可以解决这个问题,但需要做很多工作,还需要牺牲其他重要的事情。

RTcGEOD4Gd9xON

永不放弃,永不投降

最后,对于像我这样的技术极客,以及许多可能正在阅读本文的人,软件是一个完美的挑战,面对混乱的黑暗力量。它包含数学或纯逻辑等智力挑战,但它(至少可能)具有实际结果。总的来说,它的薪水要高得多。

如果您刚刚加入该行业,那么请坚持下去。就像无尽的努力一样,需要时间来磨练你,让你变得更好。你不能通过思考来解决这个问题。如果你想成为一个真正的主人,你必须潜入并牺牲你在这个领域的大部分时间。

对于我们中的一些人来说,这不是一个糟糕的权衡,因为我们从一开始就无法做到这一点。但是,无论哪种方式,你都不可能成为一个偶然的大师,这将需要相当大的承诺。尽管如此,生活中的大多数事情都可以达到一定的高度以获得良好的回报,但如果它很容易,那么每个人都可以做到。

如果你愿意投入时间,我认为这是一个很好的选择,因为你可以获得很多智慧,开阔视野,获得经验。每个人都可以随时随地使用软件。因此,您可以将您的职业生涯集中在一个领域,或开发一项有用的技能,然后深入到许多不同的领域。鉴于其高于平均水平的工资,有许多情况下可以在家里完成工作,并且在一天结束时,身体没有受到伤害,更不用说优势了。

原文:

本文翻译为CSDN,请注明出处。

【END】

RMvfpeL6LFHPQER6AyIXEDhX4QB8R6BUf5F99tylIC