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

在这里插入图片描述

原文: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.rhkb.cn/news/323731.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试算法之哈希专题

赎金信 class Solution { public:bool canConstruct(string ransomNote, string magazine) {// 小写字母int r_cnt[26];int m_cnt[26];for(int i 0; i< magazine.size(); i) {m_cnt[magazine[i]-a]; // 统计}// 对比for(int i 0; i< ransomNote.size(); i) {if(m_cnt[r…

树与二叉树之间的转换

树转化成二叉树&#xff1a;兄弟相连留长子 1.加线&#xff1a;在兄弟之间加一条线 2.抹线&#xff1a;对每个结点&#xff0c;除了其左孩子外&#xff0c;去除其与其余孩子之间的关系 3.旋转&#xff1a;以树的根结点为轴心&#xff0c;将整树顺时针转45 二叉树转化成为树…

Day65:代码随想录训练营总结

两个月的算法训练营之旅圆满落幕&#xff0c;回首这段时光&#xff0c;我深感自己错过了许多早日成长的机会&#xff0c;如今不禁懊悔没有更早地报名参与。 这段充实的日子里&#xff0c;我遵循着训练营精心设计的计划&#xff0c;攻克了上百道力扣题目。从最初对编程语法的生…

react18【实战】tab切换,纯前端列表排序(含 lodash 和 classnames 的安装和使用)

技术要点 动态样式 className{tabItem ${currentType item.value && "active"}}安装 lodash npm i --save lodash使用 lodash 对对象数组排序&#xff08;不会改变源数组&#xff09; _.orderBy(dataList, "readNum", "desc")src\De…

如何正确使用防静电擦拭纸以确保产品质量

在现代工业生产中&#xff0c;防静电擦拭纸扮演着至关重要的角色&#xff0c;它们被广泛应用于各种电子产品、精密仪器以及其他对静电敏感的领域。然而&#xff0c;要想确保防静电擦拭纸发挥最佳效果&#xff0c;正确的使用方法至关重要。下面优斯特将介绍如何正确使用防静电擦…

调试代码问题汇总

1.最常见的就是数据库密码不对。根据调试视频将你的数据库密码设置正确&#xff0c;数据库密码是数字的优先直接连如果不成功可以加个双引号或者单引号。 提示&#xff1a;java.sql.SQLException: Access denied for user rootlocalhost (using password: YES) 2.原本配置好的…

什么是HTTP/2?

HTTP/2&#xff08;原名HTTP 2.0&#xff09;即超文本传输协议第二版&#xff0c;使用于万维网。HTTP/2主要基于SPDY协议&#xff0c;通过对HTTP头字段进行数据压缩、对数据传输采用多路复用和增加服务端推送等举措&#xff0c;来减少网络延迟&#xff0c;提高客户端的页面加载…

C++ -- 函数重载 、引用、 内联函数、auto、基于范围的for循环、指针空值nullptr

目录 1.函数重载 1.1函数重载: 1.2函数重载需要注意&#xff1a; 1.3函数重载的一些特殊情况 1.4为什么C语言不支持函数重载&#xff0c;C支持函数重载&#xff1f;底层逻辑是&#xff1f; 2.引用 2.1 引用特性 2.2 常引用 2.3 权限问题&#xff08;权限放大&#xff0c;…

QT:QT与操作系统

文章目录 信号槽与事件QT多线程概述原理完成倒计时程序 UDP回显服务器服务端客户端 信号槽与事件 在之前的信号槽中&#xff0c;已经有了一个基本的认识&#xff0c;那么对于QT中事件的理解其实就非常的类似&#xff0c;当用户进行某种操作的时候&#xff0c;就会触发事件&…

【洛谷】动态规划之最长公共子序列

前言&#xff1a; 本系列目的是记录日常所刷的题&#xff0c;有的是自己想出来的题&#xff0c;有的是看了大佬题解后想明白的题 题目 P1439 【模板】最长公共子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前提&#xff1a; 两个排列都是1到n的排列&#xff0c;说…

linux安装 mysql

环境&#xff1a;centOS8 一、安装 1 安装wget库 sudo yum -y install wget 2. 安装 mysql 换yum源 亲测成功&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 换yum源 1.下载对应版本的repo文件 wget -O CentOS-Base.repo http://mirrors…

ESLint: Unexpected ‘debugger‘ statement.(no-debugger)(debugger报红)

ESLint: Unexpected debugger statement.(no-debugger) 解决办法&#xff1a; 找到.eslintrc.js文件中rules的no-debugger更改为0即可

200-500人规模工厂网络方案(中小企业网络)

一、方案概述 工厂一般有单独的弱电房&#xff0c;类似这种 里面采用的方案如下&#xff1a; 主要考虑有线、无线、财务、办公、访客等业务&#xff0c;便于维护管理和后续扩容 还需要 Wi-Fi覆盖零死角高速率&#xff0c;工作不卡顿 同时考虑AV反病毒、IPS入侵防御、用户准…

【LLama】Llama3 的本地部署与lora微调(基于xturn)

系列课程代码文档&#xff08;前2节课可跳过&#xff09;&#xff1a;https://github.com/SmartFlowAI/Llama3-Tutorial 课程视频&#xff1a;https://space.bilibili.com/3546636263360696/channel/series XTuner &#xff1a;https://github.com/InternLM/xtuner/blob/main/R…

内网安全-代理Socks协议路由不出网后渗透通讯CS-MSF控制上线简单总结

我这里只记录原理&#xff0c;具体操作看文章后半段或者这篇文章内网渗透—代理Socks协议、路由不出网、后渗透通讯、CS-MSF控制上线_内网渗透 代理-CSDN博客 注意这里是解决后渗透通讯问题&#xff0c;之后怎么提权&#xff0c;控制后面再说 背景 只有win7有网&#xff0c;其…

对XYctf的一些总结

对XYctf的一些总结 WEB 1.http请求头字段 此次比赛中出现的&#xff1a; X-Forwarded-For/Client-ip&#xff1a;修改来源ip via&#xff1a;修改代理服务器 还有一些常见的字段&#xff1a; GET&#xff1a;此方法用于请求指定的资源。GET请求应该安全且幂等&#xff0c…

C++ 如何进阶?

一、C基础&#xff08;3个月&#xff09; 1、面向对象的三大特性&#xff1a;封装、继承、多态 2、类的访问权限&#xff1a;private、protected、public 3、类的构造函数、析构函数、赋值函数、拷贝函数 4、移动构造函数与接贝构造函数对比 5、深接贝与浅贝的区别 6、空…

超标量处理器设计:重排序缓存(ROB)

★超标量处理器的很多地方用到了重排序缓存&#xff0c;但是我对它不是很了解&#xff0c;所以我整理一下重排序缓存的知识点。 重排序缓存(ROB)在确保乱序执行的指令能够正确地完成和提交(Commit)&#xff0c;也可以用来寄存器重命名。 ROB是一个先进先出的表&#xff0c;每个…

教你解决PUBG绝地求生游戏中闪退掉线无法重连回去的问题

《绝地求生》&#xff08;PUBG&#xff09;&#xff0c;作为一款在全球范围内掀起热潮的战术竞技游戏&#xff0c;以其栩栩如生的战场环境和令人心跳加速的生存冒险博得了广大玩家的青睐。然而&#xff0c;一些玩家在经历了一场惊心动魄的对局后&#xff0c;却面临了一个不大不…

uniapp video 层级覆盖

层级覆盖 cover-view组件 我这里做了个判断 监听全屏时隐藏按钮 根据项目需求自行更改