当前位置: 首页 > news >正文

最好的工程师像投资者一样思考,而不是建设者

我在大学期间住在图书馆。

“我学习的教科书理论越多,我就会成为一名更好的工程师,”我想。

然而,当我开始工作时,我注意到业内最优秀的工程师并不一定比应届毕业生了解更多的理论。他们只是带来了不同的心态,即投资者的心态。

正是这种心态帮助他们提出更聪明的问题,更好地确定优先次序,并让自己与众不同。他们像投资者一样:

  • 专注于早日获得回报的工作

  • 在深入研究之前计算这项工作是否值得他们花时间

  • 权衡他们工作的机会成本

在本文中,我讨论了每个工程师在其职业生涯中都会遇到的 3 个常见问题,以及投资者的心态如何帮助您每次做出正确的技术决策。

1. 你的工作什么时候有回报?

在投资中,有一个概念叫做“金钱的时间价值”。这是指现在的钱比以后的钱更值钱。您宁愿让一项投资从现在起一年后得到回报,而不是五年后。

工程工作也有“时间价值”。现在获得回报的工程项目比以后获得回报的工程项目更有价值。

我们最近在 Facebook 股票上看到了这一点。当高管们透露他们的 Metaverse 投资可能不会在“15 年后”得到回报时,它从历史高点下跌了 50%。

Meta 也已经向它投资了超过 10B 美元。

正如元宇宙的长期回报期如何吓坏了投资者一样,工程师应该避免在未来获得回报的工作。当涉及到工程迁移时,尤其会发生这种错误。

为什么迁移比您想象的要昂贵

从投资的角度来看,工程迁移是有保证的前期成本,未来回报不确定。而且这些奖励的回报不会比大多数人意识到的更久。

请考虑以下两年迁移的时间表。

成本是有保证的,但回报不是。

首先,我们现在花在迁移上的两年比我们以后从迁移中受益的两年更有价值。因此,迁移的收支平衡点比四年后要长。

其次,任何迁移的回报都必须超过工作成本。花两年时间来节省两年时间是没有意义的。那时您还不如根本不进行迁移。

你应该打折第 3 年和第 4 年的回报,因为它是在未来。

我有一条规则,任何工程工作必须至少有 2 倍的回报才能证明成本合理。如果我花一个月的时间迁移,它必须为我节省两个月的时间才能获得回报。

有了这个规则,如果你花了两年时间进行工程迁移,你必须享受双倍迁移时间的好处才能达到收支平衡。

因此,2 年迁移的盈亏平衡点实际上是四年后 — 或者迁移开始后的六年。

您是否愿意等待 6 年才能看到 2 年迁移的回报?

迁移花费的时间越长,永远无法获得回报的风险就越大。其他风险包括:

  • 改变业务优先级——公司可能会弃用团队的服务,使迁移变得过时。

  • 退出风险——如果一家初创公司被收购,这些迁移不会影响初创公司的估值,从而带来零商业价值。

  • 执行风险——一个单一的执行错误(例如数据泄漏)可能会使迁移的所有奖励无效。

教训是,工程应该偏向于早日获得回报的项目,否则就有可能永远看不到回报。

2. 这个项目值得你花时间吗?

沃伦·巴菲特 (Warren Buffett) 曾说过,一家公司的回报“与其说是你划船的效率,不如说更取决于你乘坐的是哪艘商业船。”

同样的原则也适用于工程。从事正确的项目(上正确的船)比编写代码的细节(划船的难度)更重要。

当涉及到工程中的购买与构建决策时,这一点尤为重要。

尽管我承认我对新建项目感到兴奋,但重要的是不要直接投入并默认“构建”。就像进行尽职调查的投资者一样,工程人员在决定采取任何一种方式之前必须计算成本和收益。

我问的一些问题包括:

  • 如果我们购买了一个解决方案,集成和维护的难易程度如何?

  • 这个功能是公司的核心竞争力吗?

  • 建造这个到底有多贵?

关于最后一个问题——重要的是要估算任何“构建”提案的成本,以确保预期回报与工程工作成正比。为此建立基线的一种方法是:

  1. 估计一个项目需要多少小时。

  1. 将其乘以您的每小时工程费率。

  1. 以此作为项目成本的指导方针。

项目越深入蓝色或红色区域,分别建造或购买的决定就越有说服力。

虽然成本不是唯一的考虑因素,但有时单独进行此练习可以帮助工程人员决定采用哪条路径。

示例:使用 RecordJoy.com 购买与构建

当我的商业伙伴和我不得不选择以 12,000 美元购买一个名为 RecordJoy.com 的屏幕录制网站或从头开始构建时,我自己做出了这个决定。

我们购买时的 RecordJoy.com 截图

我们估计我们自己建立网站需要两个月,或 320 个工程小时。假设我们的时间价值 100 美元/小时,那么构建我们自己将花费 32,000 美元。

购买 RecordJoy 的选择归结为我们是愿意现在花 12,000 美元购买 RecordJoy,还是花 32,000 美元自己构建它。买网站比建网站便宜,所以我们买了网站。

从头开始构建 RecordJoy 比购买它要贵得多。

回顾过去,这个决定是我们在开发 RecordJoy 时做出的最重要的工程决策。它使我们能够将精力集中在构建付费功能上,而不是产品本身。

它还降低了工程风险。通过购买 RecordJoy,我们得到了可以立即使用的有保证的产品,而不是我们无法保证在两个月后用完的产品。

至于 RecordJoy,我们通过几个月的工作,将这家公司从无收入发展为每月 700 美元的经常性收入。我们于 2022 年 4 月在 Microacquire.com 上出售了该公司。

在我在他们的网站上出售我的公司后,Microacquire 寄了一份礼物来祝贺我。

3. 这个项目对公司的影响最大吗?

在投资中,还有一个概念叫做“机会成本”。机会成本是你在做出选择时放弃的东西。

例如,如果我想要甜点,在蛋糕和冰淇淋之间做出选择,那么选择蛋糕的成本不仅仅是你付出的代价。蛋糕的成本也是享受冰淇淋的机会。因此,对于每一个选择,一扇门打开,另一扇门关闭。

每个技术债务清理也有机会成本。清理一个系统意味着我们无法清理另一个系统。因此,确保我们开展的清理工作产生最大影响至关重要。

我将管理技术债务比作打扫房子。就像你的房子永远不会完全干净一样,完全消除技术债务也是不可能的。但是,您家中的某些房间比其他房间更需要清洁。

如果房子内部不干净,为什么要打扫花园?

如果主卧室不干净,为什么还要打扫客卧?

干净的客房

同样,一些技术债务可以帮助团队比其他人更快地行动。

计费服务的警报系统比内部工具的警报更有影响力。主页的测试基础结构比任何其他页面都重要。

给工程师的教训是始终考虑工作的机会成本。

在您的主卧室先打扫干净之前,不要打扫您的客卧!

示例:Doma 从 Heroku 迁移到 Azure

Doma 是一家房地产软件公司,最近进行了一次技术债务清理,他们专注于清理主卧室得到了回报。

为了准备 2021 年的 IPO,他们不得不将云基础设施从 Heroku 迁移到 Microsoft Azure。他们给自己半年的时间来计划和执行这次迁移。

然而,到最后,Doma 与 Heroku 的合同出现了问题。Heroku 不允许他们以较低的数量续签合同,只向 Doma 提供了另一份长期合同的选择权。因此,如果 Doma 没有及时完成到 Azure 的迁移,他们的云基础设施可能会被切断。

他们给自己 41 天的时间来执行迁移,但这个问题将他们的时间表缩短了一个月,缩短到 11 天。

Doma 关于迁移到 Azure 的演示文稿中的一张幻灯片。

考虑到他们与 Heroku 的合同有一个迫在眉睫的最后期限,不完成此迁移可能会使公司损失数百万美元。与未及时完成此迁移的影响相比,任何其他工程工作都显得苍白无力。

作为回应,Doma 向他们的工程团队发出了全体人员的通知。每个团队都必须优先考虑从 Heroku 迁移,因为这种迁移的机会成本太高了。当主卧室 Heroku 迁移着火时,做任何其他工作就相当于打扫客卧。

Doma 的专注得到了回报。他们在 8 天内将所有剩余的应用程序迁移到 Azure,并留出 3 天时间进行测试。他们的投资者心态使他们能够权衡迁移与其他工作的机会成本并避免危机。他们很快就会上市。

最后的想法

在工程领域,培养投资者的心态比了解最新的科技潮流更能让你走得更远。

如果您花更多时间考虑 1) 财务成本 2) 回报期和 3) 工作的机会成本,您将做出更好的技术决策并节省时间。

相关文章:

最好的工程师像投资者一样思考,而不是建设者

我在大学期间住在图书馆。“我学习的教科书理论越多,我就会成为一名更好的工程师,”我想。然而,当我开始工作时,我注意到业内最优秀的工程师并不一定比应届毕业生了解更多的理论。他们只是带来了不同的心态,即投资者的…...

Mysql里的ibtmp1文件太大,导致磁盘空间被占满

目录 一、查看磁盘的时候发现磁盘空间100% 二、 排查的时候:查看是什么文件占用的时候,发现是数据库临时表空间增长的 三、为了避免以后再次出现ibtmp1文件暴涨,限制其大小,需在配置文件加入 四、重启Mysql实例(重启后…...

android kotlin 协程(四) 协程间的通信

android kotlin 协程(四) 协程间的通信 学完本篇你将会了解到: channelproduceactorselect 先来通过上一篇的简单案例回顾一下挂起于恢复: fun main() {val waitTime measureTimeMillis {runBlocking<Unit> {println("main start") // 1 // …...

苹果手机通讯录突然没了怎么恢复?

手机成为生活中的必需品&#xff0c;都会存储着各种数据文件&#xff0c;比如我们使用过的APP、音乐、照片、通讯录等通常都是存在这里面的。但我们的操作难免会有意外&#xff0c;有的是手动不小心删的&#xff0c;有的是误删的&#xff0c;有的是自己孩子删的等&#xff0c;却…...

BI知识全解,值得收藏

2021年度&#xff0c;中国商业软件市场的增长趋势是快速增长的&#xff0c;达到7.8亿美元&#xff0c;同比增长34.9%。商业智能BI在企业应用中具有巨大的价值&#xff0c;并逐渐成为现代企业信息化和数字化转型的基础。所以&#xff0c;全面了解BI&#xff0c;对于企业管理是非…...

【机器学习】GBDT

1.什么是GBDT GBDT(Gradient Boosting Decision Tree)&#xff0c;梯度提升树。它是一种基于决策树的集成算法。其中Gradient Boosting 是集成方法boosting中的一种算法&#xff0c;通过梯度下降来对新的学习器进行迭代。它是利用损失函数的负梯度方向在当前模型的值作为残差的…...

C#开发的OpenRA游戏高性能内存访问的方法

C#开发的OpenRA游戏高性能内存访问的方法 一个游戏性能往往是比较关键的, 因为游戏很多时候是比拼的是人的速度和技巧。 比如王者荣耀里,一个大招是否及时地放得出来,就会影响到一场比赛的关键。 而这个大招的释放,又取决于游戏运行在手机上的性能。 如果游戏太耗性能,导致…...

【elasticsearch】elasticsearch es读写原理

一、前言&#xff1a; 今天来学习下 es 的写入原理。 Elasticsearch底层使用Lucene来实现doc的读写操作&#xff1a; Luence 存在的问题&#xff1a; 没有并发设计 lucene只是一个搜索引擎库&#xff0c;并没有涉及到分布式相关的设计&#xff0c;因此要想使用Lucene来处理海量…...

数据在内存中的存储【上篇】

文章目录⚙️1.数据类型的详细介绍&#x1f529;1.1.类型的基本归类⚙️2.整型在内存中的存储&#x1f529;2.1.原码、反码、补码&#x1f529;2.2.大小端的介绍⚙️1.数据类型的详细介绍 &#x1f973;基本的内置类型 &#xff1a; &#x1f4a1;char ---------- 字符数据类型…...

慕了没?3年经验,3轮技术面+1轮HR面,拿下字节30k*16薪offer

前段时间有个朋友出去面试&#xff0c;这次他面试目标比较清晰&#xff0c;面的都是业务量大、业务比较核心的部门。前前后后去了不少公司&#xff0c;几家大厂里&#xff0c;他说给他印象最深的是字节3轮技术面1轮HR面&#xff0c;他最终拿到了30k*16薪的offer。第一轮主要考察…...

「可信计算」与软件行为学

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…...

华为OD机试题 - 找字符(JavaScript)| 代码+思路+重要知识点

最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - 整数分解(JavaScript) 华为OD机试题 - 单词反转(JavaScript) 使用说明 参加华为od机试,一定要注意不要完全背…...

Linux 进程启动方法

现实中程序编写的时候&#xff0c;经常会碰到一些这样需求&#xff1a;调用系统命令&#xff0c;完成一些操作&#xff0c;或判定结果 或获取结果作为启动进程&#xff0c;调用第三方进程&#xff0c;并监控进程是否退出加载升级进程&#xff0c;升级进程kill调用者或调用者自行…...

CLEVE:事件抽取的对比预训练

CLEVE: Contrastive Pre-training for Event Extraction 论文&#xff1a;CLEVE: Contrastive Pre-training for Event Extraction (arxiv.org) 代码&#xff1a;THU-KEG/CLEVE: Source code for ACL 2021 paper “CLEVE: Contrastive Pre-training for Event Extraction” (g…...

【C++】AVLTree——高度平衡二叉搜索树

文章目录一、AVL树的概念二、AVL树节点的定义三、AVL树的插入四、AVL树的旋转1.左单旋2.右单旋3.左右双旋4.右左双旋五、进行验证六、AVLTree的性能个人简介&#x1f4dd; &#x1f3c6;2022年度博客之星Top18;&#x1f3c6;2022社区之星Top2;的&#x1f947;C/C领域优质创作者…...

软考中级-嵌入式系统设计师(二)

1、逻辑电路&#xff1a;组合逻辑单路、时序逻辑电路。根据电路是否有存储功能判断。 2、组合逻辑电路 指该电路在任一时刻的输出&#xff0c;仅取决于该时刻的输入信号&#xff0c;而与输入信号作用前电路的状态无关。一般由门电路组成&#xff0c;不含记忆元器件&#xff0…...

epoll 笔记

maxevents 参数大小一般不超过64必须够了 maxevents 个事件&#xff0c;才会传到用户空间吗&#xff1f;可见&#xff0c;只要有事件就可以传到用户空间。一台服务器可以支撑多少个链接https://blog.csdn.net/mijichui2153/article/details/81331345 0、两台虚拟机的初始状态如…...

vue(5)

文章目录1. 监测数据原理1.1 通过问题引出1.2 开始1.3 Vue.set() 方法1.4 vue 监视 数组1.5 小练习2. 收集表数据3. 过滤器4. 内置指令4.1 v-text4.2 v-html4.3 v-cloak4.4 v-once4.5 v-pre1. 监测数据原理 1.1 通过问题引出 1.2 开始 要想解决上面的这个问题 &#xff0c;需要…...

Android OTA 相关工具(一) 虚拟 A/B 之 snapshotctl

Android 虚拟 A/B 分区推出快三年了&#xff0c;不论是 google 还是百度结果&#xff0c;除了源代码之外&#xff0c;竟然没有人提到这个 Android Virtual A/B 的调试工具 &#xff0c;着实让人感觉意外。 所以我相信还有不少人不知道 Android OTA 到底都有哪些调试工具&#…...

QT for Android BLE Bluetooch QT BLE

小白式的介绍&#xff0c;很详细了&#xff0c;很多主要内容写在程序的注释里&#xff0c;慢慢看 下面是我的源码 https://download.csdn.net/download/qq_27620407/87464307 源码打不开的话可以试试下图的操作&#xff0c;之后电机确定&#xff0c;可能是加图标搞的&#xff0…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...