有许多因素都可能成为不良软件的催化剂:从使用的工具、团队沟通、开发人员对软件成功的个人利益,到测试方法。
我认为,在这些因素中,有一个问题是最主要的,它是导致糟糕软件的动力,几乎所有其他因素都是从这个动力中生根发芽的:
想象中的问题。(banq注:#主语思维 )
大多数复杂或损坏的软件在设计上并不是过于复杂或功能失调。它只是被设计用来做其预期目的之外的事情。
比方说,你是一个播客主持人,想要一个定制的网站,在这里你可以销售你的促销产品,赚取广告费而不需要第三方插手,最重要的是,还可以向你的听众提供播客、视频和博客。
您的小网络应用程序的要求可能是这样的:
- 在北美地区加载速度快,可实时流式传输和下载播客
- 对于 99.99% 的用户,在最初 15 分钟内不会崩溃或冻结,最好是永远不会崩溃或冻结
- 与谷歌 Adwords 整合良好,如果有时间,还可以与其他第三方广告提供商整合
- 动态链接到我的 Zazzle 商店中的最新产品,并在可能的情况下,根据用户所浏览的内容向其提供建议
- 与 Facebook 实时播放器集成。如果能轻松创建一个不需要 Facebook 的流媒体替代解决方案,那就更好了。
第一次打开应用程序时,屏幕冻结了。你询问如何选择允许在网站上投放的广告类型,结果被指向一个丑陋难懂的自定义用户界面(UI)。你在 Zazzle 上的商品链接有一半是坏的或缺少图片,Facebook 上的直播也很滞后!
但开发团队对你的愤怒感到困惑--从他们的角度来看,这是理所当然的--因为他们已经为你赴汤蹈火了。
他们全身心地投入到这款应用程序的开发中,它拥有一些令人惊叹的功能:
- 最先进的推荐系统
- 实时生成您的所有视频流副本的算法
- 您的首页可在全球各地以低于 200 毫秒的速度加载
- 几乎从零开始构建的流媒体协议和客户端,以防您不想依赖 Facebook Live
- 可让您轻松整合 20 多个广告交易平台的服务
更糟糕的是,你没有直接与开发人员沟通,而是通过 "电话 "游戏进行沟通。你与销售人员谈话,销售人员与一些中层管理人员开会,中层管理人员写出一些业务规格,然后交给项目经理,项目经理写出一些技术规格,然后交给团队领导或架构师,最后,团队领导或架构师开始与他的团队一起设计产品,每个人都会在设计过程中加入自己的想法。
如何解决?
解决想象中的问题往往比解决现实中的问题更有趣。聪明绝顶的人玩竞技游戏、构建并解决数学问题、撰写旨在回答人类生存条件的抽象问题的书籍,所有这些都是免费的。然而,一个平庸的程序员很可能会向你收取相当高的费用来制作一个简单的安卓应用程序。这并不是因为平庸的程序员比天才更难找,而是因为前者的活动都很有趣,而后者可能相当无聊。
大多数程序员都希望在获得报酬的同时还能享受乐趣。当然,每个人对 "乐趣 "的定义不同,但对许多工程师来说,"乐趣 "可以归结为解决有趣的、具有挑战性的、可解决的问题。
给一个稍微聪明的人太多无法自动化的枯燥任务,最终会把他逼疯。然而,经过数十亿年的进化,人类大脑在保持理智方面颇具天赋。就像童年遭受苦难或虐待的人可以在幻想书籍中找到解脱一样,企业编程或自由网站开发的受害者也可以在解决想象的问题中找到解脱。
软件工程师能为自己创造多少想象中的问题,取决于他们的想象力和他们要解决的实际问题的难度。
需要指出的是,这个问题并非开发人员独有。管理部门、销售部门、人力资源部门、支持部门、法律部门甚至会计部门都有自己独特的方式来制造想象中的问题。他们试图让自己过多地参与决策,而他们出席会议只是一种形式,或者根本没有被要求。他们过分强调与自己职责相关的细微问题,或雇佣比必要规模大得多的团队来说明自己的重要性。
当问题令人无语时,聪明的人会找到应对的方法。
但想象中的问题并不仅仅是开发人员无聊的结果。它们也是漫长的沟通链条造成的。
当我刚开始接手自由职业者客户时,我无法做到不拘一格。这意味着我的邮件链长达 100 多封,讨论的都是关于内部 MVP 的无关紧要的细节。有人曾在一周内改变一个项目的所有需求。我曾遇到过客户问我 "这个能不能做成 ICO?"或者 "我们能不能在这里添加一些人工智能?"之类的问题。
当然,大多数客户都比这更精明,但即便如此,他们往往还是缺乏一些必要的知识来表达或构建他们的某些需求。这没有问题,因为作为 "电脑男",我的工作之一就是帮助客户根据他们的使用案例来确定他们需要什么或不需要什么。但是,当你和客户之间隔着几个层次时,确定需求就会变得困难得多。
需求被更改的原因要么是有人误解了客户的意图,要么是有人想应付前面提到的无聊。
大多数公司都喜欢配备一名销售人员,负责向潜在客户推销产品、谈判价格并概述可能的功能。同时,他们也会安排一名人员与客户讨论更深入的要求和细节,通常是另一名销售人员,但头衔略有不同。然后是技术团队内部的指挥链、各级管理层,可能还有一些等级制度。
当一份客户需求清单经过这么多人的讨论时,即使这些人的初衷是好的,也难免会在翻译过程中丢失一些东西。有时,这种变化的发生是因为最初的需求没有意义,有时,需求需要重新定义。销售人员可能会告诉客户:"只需额外支付 39999 美元,我们就能在区块链上实现这个功能。但这样一来,每个遇到需求的人都会想知道 "在区块链上实现 "的定义是什么。
更常见的情况是,需求被更改的原因要么是有人误解了意图,要么是有人试图应对上述无聊,试图让自己或团队的工作更有趣、更令人印象深刻。
在这一切过程中,最初的需求--需要解决的真正问题--被遗忘了。取而代之的是想象中的问题和空洞,有很多人愿意用自己想象中的问题来填补这些空洞,因为他们要解决的问题很无聊,而填补空洞给了他们一种应对的方法。
过度复杂Overcomplexity与自然选择
假想问题的存在往往还有一个更阴暗的原因:问题可以帮助团队或公司成长,甚至可以成为其功能不可分割的一部分。
"那些被培养、选拔和补偿来寻找复杂解决方案的人,没有动力去实施简化的解决方案"。
- 纳西姆-尼古拉斯-塔勒布
你听说过三位网络工程师的故事吗?他们发现安全的网上银行实际上是一个很容易解决的问题。他们使用功能设计方法和内存安全语言,从零开始开发了一些完美无瑕的银行软件,然后开始将大型银行迁移到他们令人惊叹的基础设施上。
你可能没听说过他们,因为他们根本不存在。然而,有很多由数千名开发人员组成的团队,他们无法理解 "回滚 "等简单的概念,却一直在开发银行软件。
数字的存储和传输并不是一个特别困难的问题。而索引互联网的全部内容,并在亚秒级时间内为自然语言查询提供相关结果,则是一个难题。但是,就有几个聪明人设法解决了这个问题。
网上银行的顽疾在于,银行生态系统已经变得非常善于维护自身的敛财等级制度
我不会说银行的大多数员工都是邪恶或恶意的。远非如此。他们通常都是友好的小伙子,努力为家人提供食物、住所和教育。但他们的主要动力不是修复银行软件,而是继续就业。
在当今的经济形势下,丢掉工作对某些人来说可不是件开玩笑的事;在银行业,大嘴巴或过于主动很容易让自己站到纪律委员会的面前。
因此,银行系统一成不变--不是因为系统高效,而是因为惯性。这种惰性的表现形式是,为了避免解决实际问题而努力解决想象中的问题,而实际问题一旦被指出,就会威胁到其他人的工作。集中精力解决这些实际问题可能会导致被解雇,或者在某些特别恶劣的 "机构"(如高盛)中,给几名联邦调查局官员寄去几个毁灭生命的棕色信封,从而引发一场离奇的自杀。
"当一个人的薪水取决于他是否理解一件事时,很难让他理解这件事!"
- 厄普顿-辛克莱
C-suite无视这样一个事实,即他们的上层管理人员将90%的时间花在 "客户会议 "上,而这些会议涉及热带岛屿和数百万美元的 "其他费用 "预算。反过来,上层管理者却对 C-suite 的腐败视而不见。
因为中层管理者鼓励他们活在《华尔街之狼》的幻想中,所以上层管理者对中层管理者购买古怪的办公室、给自己雇三个秘书和十几个实习生的行为视而不见。
因为直线管理层不抱怨他们的独裁权力幻想,所以中层管理者忽视了直线经理把时间花在 "改进我们的敏捷方法 "的 PowerPoint 演示上,而不是削减成本。
由于团队领导似乎没有注意到他们的上司甚至不会正确使用 Excel,而且每隔几周才去一次办公室,因此直线经理们忽视了团队领导和架构师们在谈论 "使用 JRPC 在我们的系统之间建立下一代接口,以及使用 Hibernate 和 Spring 实现微服务化",而他们本应在一天之内完成那些该死的 Mysql 查询。
因为开发人员似乎并没有注意到,他们的领导除了 DOT 图之外并没有真正编写任何代码,所以团队领导也不会抱怨他们的开发人员,而不是查看上述缓慢查询的 EXPLAIN,而是在这一年中第十次使用新的 JavaScript 框架重新设计用户界面。
这是一个解决假想问题的恶性循环,从首席执行官没有意识到再偷 3000 万也不会让他老爸爱上他,到用户体验实习生没有意识到使用 Angular-Material-Bootstrap 19.13.5 重新设计 "提交 "按钮也不会让他们用纯文本存储密码(并将其作为认证 cookie 的一部分)的事实消失。
但每个人都需要继续解决想象中的问题,因为如果他们停止制造和解决这些问题,如果他们开始关注真正的问题,他们可能会意识到整个系统都坏掉了。
他们可能会意识到,自己 99% 的工作都是在延续别人的工作。这是一个很难消化的认识,我敢说,对大多数人来说都是不可能的。