软件开发故事 - 我对 CTO 撒谎并挽救了项目

news2024/11/19 19:36:39

在这里插入图片描述

原文:GrumpyOldDev - 2024.04.18

这是几年前的事情了。还记得在我职业生涯的初期,父亲曾告诉我,做好工作往往意味着要在上司的阻碍下做好需要做的事情。他的意思是,你可以让上司成功并感到快乐;也可以让上司做每一个决定,在这种情况下,没有人会成功或快乐。

当时,我在一家财富 500 强公司工作,我们的 CTO 承诺要为一个重要的客户交付一个大项目,他与该客户有私人关系。他还决定将其中的一个关键部分外包给一家大型技术服务公司,该公司声称他们有一款产品可以为我们完成大部分繁重的工作。

在我的职业生涯中,这种情况很常见,当供应商说他们有一款产品时,真正的意思是他们一个隐约类似于产品的东西,在某种程度上符合我们的需求,并且通过大量的定制,他们可以把它改造成我们需要的样子。当然,通过定制他们的“产品”,我们巧妙地结合了供应商软件的所有缺点和定制软件的所有缺点。我们同时实现了“坏主意”中的“圣杯”:一个不灵活的供应商软件包,必须被强迫去做它并未设计去做的事情,还要从他们的主产品代码库中分叉出来 – 一旦供应商意识到维护它的成本有多高,它就会被淘汰。我们彼此抱怨这是一个多么可怕的馊主意,尤其是考虑到供应商在不按时交付产品方面的“良好记录”。

由于 CTO 每年都会更换他的直接下属,每次关于项目的状态都会是一些“老板,这是个好主意”,尽管根本没有人认为这是个好主意。

甚至连一般的主意都算不上。这是一个坏主意。

在这里插入图片描述

项目的其他部分都需要在公司内部进行大量开发,所以我们也有自己的挑战,忙得不可开交。但即便如此,随着整个夏天项目日期的推迟,供应商承诺他们的产品随时都可以集成到 10 月份的发布日期,除了 CTO 之外,其他人都越来越明显地感觉到项目遇到了麻烦。终于在 8 月份,供应商交付了他们的“产品”,我们开始了与之集成的死亡之旅。

9 月份,我们遇到了一个令人沮丧的错误。供应商的产品将每笔客户交易以 json 记录的形式存储在一个巨大的 json 文档中(注:此处的 json 文档存储在 MongoDB Collection)。因此,随着测试数据的积累,产品的性能变得越来越慢。添加一个新的交易需要从数据库中读取整个 json 文档,然后将新记录添加到文档末尾。供应商声称,他们可以通过索引交易字段来解决这个问题,这似乎有点帮助,直到我们遇到了第二个问题。

他们选择的数据库是 MongoDB,而当时 Mongo 的记录限制是每个文档 16MB。因此,到了 10 月份,当实施团队开始将真实的客户数据放入其中时,我们遇到了 16MB 的限制。事情开始变得有趣了起来,我们决定向客户隐瞒这一限制,并推迟一个月上线,但同时启动了一个小型项目来替换供应商集成,而且也没有告诉供应商。因此,我们同时欺骗了客户和重要的技术合作伙伴。

当时的“暴躁老开发者”更像是一个“热情的年轻开发者”,于是他组建了自己的团队来开发替代产品。供应商有 70 多人参与了这个项目,团队只分配了 3 个人来替换它。一个负责设计数据库,一个负责构建与数据库接口的后端,还有一个负责构建业务逻辑/网络服务。

客户被告知,我们将在 1 月份推出新版本供他们测试。新版本将修复他们在最初上线时遇到的最严重缺陷。但他们并不知道我们正在重写整个核心系统。这只用了不到两个月的时间,而原始的项目启动用了一年多的时间。只有 3 个人,还是在假期里(你看这是怎么回事)。

于是,大约在 12 月中旬,所有参与项目的人都被告知(不是要求)要在假期中工作。

要知道,在过去的 6 个月里,我们中的大多数人已经每周工作 60-80 个小时,只为赶上原定(大约)的发布日期。

每个人都累坏了。

此时此刻,如果你正在阅读这篇文章,而且你不是一个以交付为导向的技术人员,可能会觉得这太疯狂了,是时候辞职了。你是对的,但是,我们中的许多人真的很喜欢软件开发,感觉有点像摇滚明星。你花了几个月甚至几年的时间来准备这场“演出”,然后发布日期就像一场表演,你想在发布日期一炮而红。部分原因就像剧院里的人:演出必须继续。但你也想在自己的辛勤工作第一次与真正的用户见面时,感觉自己像个摇滚明星,感受到“我做到了”的快感。人们喜欢我做的事情,我战胜了不可能。对于内向的人来说,软件发布就像是现场表演。

在这里插入图片描述

所以,到这个时候,已经快到圣诞节了。团队基本上用一个月的时间就完成了替代软件的开发,还有一些功能有待完善。但这些开发人员都很聪明,他们一直在按部就班地工作,我知道,如果他们不精疲力竭,我们一定能赶上测试日期。

所以,当 CTO 来找我,说假期被取消时,我说“好吧”…

然后,在我一生中最自豪的时刻,回想起父亲关于不顾上司阻碍完成工作的建议…

我告诉团队中的那三个人,“休息一周,我来搞定。”

每天早上,我都会参加 CTO 强制性的死亡进度电话会议,然后我撒谎:

  • “团队正在努力工作,今天我们达到了第 73 个集成点。”
  • “团队昨天进展顺利,我们又完成了一项网络服务”

每天我都会出现在大老板面前,告诉他我们正在努力工作,而这些工作已经在上个月完成了。

一周后,伙伴们回来了,他们精神焕发。

我们在一月份准时完成了任务,上线后取得了很好的效果,短暂的时间里我们成了“摇滚明星”。也许更像是 Herman’s Hermits,而不是 The Beatles。但是,感觉仍然很好。

这就是我向 CTO 撒谎的经历。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1661887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

window10设置静态IP

右键桌面网络图标 点击属性 点击要查看的网络 点击详细信息 获得网络连接详细信息 右键WiFi符号 或者其他方式进入网络与internet中心 点击 WLAN 点击属性 点击编辑(点击一个即可) 选择手动将刚才的信息方进入即可 完成

20232801 2023-2024-2 《网络攻防实践》实践九报告

20232801 2023-2024-2 《网络攻防实践》实践九报告 1.实践内容 (1)手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 (2)利用foo函数的Bof漏洞,构造一个攻击输入字符串&#xf…

差速机器人模型LQR 控制仿真(c++ opencv显示)

1 差速机器人状态方程构建 1.1差速机器人运动学模型 1.2模型线性化 1.3模型离散化 2离散LQR迭代计算 注意1:P值的初值为Q。见链接中的: 注意2:Q, R参数调节 注意3:LQR一般只做横向控制,不做纵向控制。LQR输出的速度…

视频号音乐怎么下载

音乐,那个能够触动灵魂的艺术形式,穿越屏幕,流淌在视频号的每一个角落。然而,有时候,我们更希望能将那些动人心弦的旋律保存下来,让它们成为我们日常生活的一部分,陪伴我们度过每一个动人瞬间。…

SAM轻量化应用Auto-SAM、Group-Mix SAM、RAP-SAM、STLM

1. Auto SAM(Auto-Prompting SAM for Mobile Friendly 3D Medical Image Segmentation) 1.1 面临问题 医学背景: (1)与自然图像相比,医学图像的尺寸更小,形状不规则,对比度更低。&…

【Qt 开发基础体系】QMap 类和 QHash 类以及 QVector 类

文章目录 1.QMap 详解1.1 QMap 的介绍1.2 QMap 的具体用法如下1.3 QmultiMap类 2.QHash 详解3. QMap 和 QHash 的对比4. QVector 详解 1.QMap 详解 1.1 QMap 的介绍 &#x1f427;① QMap<key,T>提供一个从类型为Key的键到类型为T的值的映射。通常&#xff0c;QMap存储的…

使用torch完成多卡训练

最近在学detr&#xff0c;顺便学了一下多卡训模型&#xff0c;它的源码写的非常不错&#xff01; 我自己在detr的代码的基础上实现了一个vae的训练&#xff0c;在mnist数据集上&#xff0c;4张2080上&#xff0c;batch size开到1024&#xff0c;训练快到飞起。 总结一下多卡训…

JUC下的CompletableFuture详解

详细介绍 CompletableFuture是Java 8引入的一个实现Future接口的类&#xff0c;它代表一个异步计算的结果。与传统的Future相比&#xff0c;CompletableFuture提供了更丰富的功能&#xff0c;比如链式调用、组合异步操作、转换结果、异常处理等&#xff0c;极大地增强了Java在…

力扣HOT100 - 739. 每日温度

解题思路&#xff1a; 单调栈 class Solution {public int[] dailyTemperatures(int[] temperatures) {int length temperatures.length;int[] ans new int[length];Deque<Integer> stack new LinkedList<>();for (int i 0; i < length; i) {int temperatu…

TCP超时重传机制

一、TCP超时重传机制简介 TCP超时重传机制是指当发送端发送数据后&#xff0c;如果在一定时间内未收到接收端的确认应答&#xff0c;则会认为数据丢失或损坏&#xff0c;从而触发重传机制。发送端会重新发送数据&#xff0c;并等待确认应答。如果在多次重传后仍未收到确认应答&…

VMware Workstation 17 Player 创建虚拟机教程

本教程是以windows server 2012物理机服务器安装好的VMware Workstation 17 Player为例进行演示&#xff0c;安装VMware Workstation 17 Player大家可以自行网上搜索安装。 1、新建虚拟机 双击安装好的VMvare图标&#xff0c;点击创建虚拟机。 2、选择是否安装系统 本步骤选…

复习了好久的软考中项,现在上半年不考了,该怎么办?

如果有更多学习时间的话&#xff0c;可以考虑报考高级职称&#xff0c;因为高级和中级职称的很多知识点有重叠&#xff0c;只需要再复习一下相关论文就可以了。 从2024年下半年开始&#xff0c;集成考试将采用最新版教材和大纲&#xff0c;与高级职称的新版教材内容相似度很高…

Spring框架学习笔记(二):Spring IOC容器配置 Bean,分别基于XML配置bean 和 基于注解配置 bean

1 Spring 配置/管理 bean 介绍 Bean 管理包括两方面 &#xff1a;创建 bean 对象&#xff1b;给 bean 注入属性 Bean 配置方式&#xff1a;基于 xml 文件配置方式&#xff1b;基于注解方式 2 基于 XML 配置 bean 2.1 通过类型来获取 bean 方法&#xff1a;给getBean传入一…

新型AI Stable Artisan横空出世?

StabilityAI宣布推出Stable Artisan 前言 就在今天&#xff0c;Stability AI宣布推出 Stable Artisan&#xff0c;让更广泛的受众能够使用 Stability AI 的 Developer Platform API 功能。Stable Artisan 具有他们的高级型号&#xff0c;例如 Stable Diffusion 3、Stable Video…

4000字超详解Linux权限

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 在Linux当中权限的体现主要有两种 普通用户 超…

ARIMA模型在河流水质预测中的应用_含代码

#水质模型 #时间序列 #python应用 ARIMA 时间序列模型简介 时间序列是研究数据随时间变化而变化的一种算法&#xff0c;是一种预测性分析算法。它的基本出发点就是事物发展都有连续性&#xff0c;按照它本身固有的规律进行。ARIMA(p,d,q)模型全称为差分自回归移动平均模型 (A…

动态IP避坑指南:如何挑选合适的动态代理IP?

在如今的网络环境中&#xff0c;使用动态IP代理成为实现隐私保护、访问受限内容和提高网络效率的一种常见方式&#xff0c;选择合适的国外动态IP代理可以让我们的业务处理事半功倍。面对市面上琳琅满目的选择&#xff0c;如何挑选购买适合自己的动态IP代理服务呢&#xff1f;在…

数字化转型失败率80%!盘点国内数字化转型“失败案例”有哪些

尤记得几年前&#xff0c;那桩轰动一时的《国外某巨额投入的数字化转型项目失败所引起的法律纠纷案》。 当时&#xff0c;业界人士几乎都在热议这件事。 我也在了解整件事情的原委后&#xff0c;发表一些感想。 当时我就觉得&#xff0c;作为行业从业人员&#xff0c;不要幸…

动态表名 的使用方法

动态表名插件的底层是 拦截器 1&#xff0c;创建一个拦截器 Configuration public class MybatisConfiguration {Beanpublic DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() {// 准备一个Map&#xff0c;用于存储TableNameHandlerMap<String, Table…

3d gaussian-splatting源码运行及结果展示

笔者是在windows下配置的环境 源码地址及官方教程 github gaussian-splatting 官网给出了详细的配置教程和视频解说 记录一下个人的部署过程 环境需求 硬件需求 具有计算能力 7.0 的带有CUDA的GPU 24G显存 软件需求 python版本我没注意到明确说明&#xff0c;3.7以上应…