我们从构建软件难的前提开始。如果你不同意这个前提,我开始怀疑你是否真的做过软件。这并不意味着我不愿意被惊讶;毕竟我认为自己只是一个中等水平的软件开发者,远远超过了大量 Jon Gjengset级别的首席工程师和技术研究员。
我编程已经有一段时间了:我大约处于C语言的年代,而且我很早就开始了。我的心被1MHz和64kB的内存深深吸引。在转录第一个BASIC程序的几天内,我开始问自己:“最好的'编排'方式是什么?”我想我从未停止过。
那么。为什么硬件这么难?
软件本质上是复杂的
首先,软件有一些非常独特的“特性”。如果我们允许自己比较软件工程与其他工程学科,就可以建立一个软件与其他工程学科中涉及的“物质”之间的范式:电子、化学反应、结构、土壤和混凝土等。在我们接下来将深入探讨的这种比较中,软件在我们关注的所有方面都显得独特。特别是,软件容易产生惊人的复杂性,以至于处理软件时的首要指令就是限制、控制、缓解和最小化这种复杂性。
构建软件是一项人类活动
软件难度的另一个方面源于,正如 约翰·科马克 所说,构建软件归根结底是一门社会科学,因为它涉及团队、社区和利益相关者的努力。软件开发者的目标最终是创造有价值的东西,而价值是人类的判断[1].更具体地说,这需要软件专家与非专家之间的互动。在我内心的秘密词汇中,我称非专家为“平民”,有时也称之为“普通人”。这需要耐心与专家对话,谦逊地深入挖掘并提出大量问题。这需要与那些不会做香肠但常常试图告诉你如何做的人交流。这让人谦卑,有时也令人沉重。
这是一场马拉松,不是短跑
软件不仅复杂,而且表现得我们不习惯。如果你不幸听过我说的“软件作为实体”时刻,你会听到诸如“它是涌现的”、“信息想要自我复制”、“指数排列”等话。然后我可能会用“软件估算错误”、“工程经理错误”等短语猛烈抨击你,我最喜欢的一句是从IBM某个陌生人那里偷来的:“......那就只是编程的问题了。”
软件的一个奇怪之处在于,它不是一个保守的领域。在保守领域,你如何从A点到B点并不重要。如果你在攀登珠穆朗玛峰,物理学告诉你你可以走上山坡,或者跳上去,完成的工作是一样的。有时候你会觉得自己是在和这个领域一起工作 (这里指的是引力),有时甚至逆着它,所以很多游离会变得平衡。更奇怪的是,这不是线性的。
想象你有两个任务:添加一个功能,以及清理代码。事实证明,清理顺序非常重要 (答案:先清理干净)如果用错方法,最终会投入更多精力。此外,软件寿命很长,所有这些工作都转化为能量,也就是努力曲线下的面积。上一次经理是什么时候 (不是在公用事业公司) 你说过能量就是钱?
我们被赋予任务、KPI并获得奖励,因为我们交付了大量功能,但这并不是目标。圣麦肯锡透露,我们的使命是最大化长期投资者价值。这不仅仅是通过软件功能实现,而是通过持续关注代码质量和灵活性 (这就是质量),可读性 (这就是质量),可测试性 (这就是质量),等等。
这是一个长期游戏,讽刺的是,通过先关注非功能性需求,我们就能实现“目标”。
看看你隔壁隔壁的软件工程师。他们要么在交付功能,却不在乎留下的混乱,要么一边疯狂地清理营地,一边送你那些宝贵、可能毫无意义的图表。而你可能在匿名的360度评估中忽视了后者,同时称赞前者。
结论中,我试图用积极主义来尝试
问题是,人们普遍不擅长软件,有非常充分、非常合理、非常人道的理由[2].这些原因归根结底只有一个:缺乏对软件本质的认知或意愿。因此,我的目标之一 (在工作时、和同事喝啤酒、去看牙医等等。) 是建立一种美德感,不是罗马字面意义上的“男子气概”,而是“应当追求的目标”。
幸运的是,过去有很多人花时间梳理出一整套一般的美德分类 (虽然遗憾的是,作为一个物种,我们通常忽视了它们).我的工作变成了重新利用和重新定位一些古人的工作,并将其应用于软件业务。
好消息是他们做得很好,你也熟悉他们用过的术语。他们说 责任、纪律、慈善等等,很容易停止过度思考,只是撒上美好,就像奥普拉读完《尼各马可伦理学》后说的那样,说我们的 职责 是要存在的 纪律严明 在我们对软件工作的处理方法中,并且是 倡导者 对整个业务而言, 教育 我们的内部客户。我甚至可以跳出美德的花园,把一些东西扔进去 团队导向, 以客户为中心, 或 颠覆-助长。 这些在大多数观众眼中都被视为正当美德。
但阿维罗伊和康德的语言已经过时,无法胜任当前任务,而围绕技术的道德要求也有其紧迫性,因为技术已成为世界上最普遍的力量,也是我们为数不多的希望来源之一。随着我们作为一个物种的进步,我们慢慢开始理解计算对我们存在的核心和强大地位。
而这种存在要求软件工程师成为技术的灯塔 酷炫不断追求完善我们的知识和技能。这要求我们的管理者和政治领导人重新聚焦心态,以成为 人文主义者, 人道,以及他们同胞的守护者。它要求我们成为 更好了, 更聪明,更多 知识渊博,更多 慈善,以及更多 理解.
我希望工程师能成为 粗体 以及 无畏我希望管理者能够 开悟.我希望两人都因为我们毕竟是人而感到不便。
在更简单的层面上,我们需要信任软件人员有足够的空间去创造健康、长期且高质量的软件。软件人员需要赢得并保持这种信任。
最后,是必要的自我宣传
如果你喜欢这篇文章,而且你不是受虐狂,不妨看看 我刚开始写的博客。在那里我有更多自由去写东西,尝试不同的内容。这整个过程很可怕,所以感谢你的耐心。
仔细想想,这也是为什么程序员无法完全被人工智能取代的原因。
到现在你可能已经想:“嘿,那Netflix、亚马逊、谷歌这些公司呢!”你说得没错。外面确实有软件卓越的中心 (依我看,最著名的是 Jetbrains).然而,在他们闪耀的城市之外,荒野中,99%的人都在挣扎。