如何制定工程战略
本文介绍了领导者如何有效制定工程战略,包括理解战略核心、如何收集信息并制定可行的策略,以及如何利用行业最佳实践和技术债务管理来提升团队效能和产品质量。原文: How to Build Engineering Strategy
如果你了解过目标框架(如 OKR)背后的理论,通常会发现战略和目标应该是层层递进的。这类方法从公司使命和关键指标(KPI)开始,到公司目标,再到产品战略,然后将战略细分为团队或部门的具体目标。
然而,现实与理论却大相径庭。产品战略往往只是一份要实施的产品功能列表,并不包括技术债务、维护、SDLC 流程、自动化或工作方式等内容。在某些组织中,作为工程领导者,你是唯一知道需要做什么来提高产品整体质量、缩短上市时间和改进底层软件架构的人。只有你知道框架版本的支持何时结束,也知道数据存储解决方案的扩展性不佳,需要迁移。
根据我个人经验,作为技术负责人(公司的一级经理),我负责移动应用平台。尽管公司管理层知道想要提供什么样的产品,但只有我和我的团队知道如何打理我们构建的平台(维护、架构、自动化等)。
作为工程领导者,不仅要确保交给团队的产品任务得以执行,还意味着要制定计划,使团队的工作成果更加完美。为此,你需要有一个好的计划。
本文将探讨一些工具和技术,从而帮助我们制定长期工程战略。有些工具和技术在组织层面效果最佳,因为产品部门和技术部门可以合作应对挑战。有些工具和技术可以成功应用于团队层面,自下而上的激励组织的其他成员。
伟大的领导者都有计划
糟糕的领导者会执行,优秀的领导者会改进,而伟大的领导者则会整合。
整合不是即兴发挥,而是针对未来的战略挑战采取一整套连贯的行动。如果你想制定这样一个计划,理查德·鲁梅尔特(Richard Rumelt)的好战略/坏战略是最好的灵感来源。
虽然鲁梅尔特的著作主要侧重于整个组织的战略,但对较低层次的工程管理人员仍有借鉴意义。
即使作为一级领导(技术领导),也可以运用鲁梅尔特的见解为团队和技术栈制定 12-18 个月的计划。这种方法使团队能够重新构建解决方案、迁移技术栈、减少分心、集中精力、提高质量等等。
作为工程经理或技术主管,你已经负责管理部分技术堆栈、特定领域,甚至可能是整个产品。你应该有足够的背景来诊断问题、制定策略并选择具体的行动来推进工作。
什么是战略?
战略是为应对未来挑战而设计的对策。
理查德·鲁梅尔特认为,好的设计包含三个核心方面:
-
准备(Anticipation):观察和学习。 -
预谋(Premeditation):制定指导性政策,避免临时抱佛脚。 -
设计协调行动(Design of Coordinated Actions):制定在空间和时间上协调一致的计划。
建立在这些方面基础上的战略框架侧重于对长期计划至关重要的三件事(理查德·鲁梅尔特称之为"战略内核"):
-
诊断(The Diagnosis):了解现状,确定组织面临的主要挑战。 -
指导政策(The Guiding Policy):规定组织或团队应对挑战的总体方法。 -
一致行动(The Coherent Action):包括一系列旨在实施指导政策的协调行动。
如何制定战略
简而言之,包括四个步骤:
-
收集输入(Collecting Input):收集有关优势、挑战、机遇、瓶颈、当前计划和干扰因素的信息。这些信息可能与团队、技术栈或组织(利益相关者、管理层等)提出的问题有关。 -
战略模块分组(Strategic Blocks Grouping):对上一步的所有输入进行分类,考虑鲁梅尔特书中的战略要素,如杠杆作用、近似目标、利用优势等。 -
构建战略内核(Build Strategy Kernel):根据收集和分类的信息,制定战略内核--诊断、指导政策和一致行动。 -
迭代和完善(Iterate and Refine):收集输入、分组以及描述策略内核的过程可能需要数周时间,在此期间,应不断进行修改,并与团队和其他利益相关者分享,直到每个人都认为战略是合理的。
如需更全面的指南,建议查看实用工程管理(Practical Engineering Management),其中详细探讨了这一过程:工程战略框架。
为战略献计献策
如果你想寻找战略模块的灵感和范例,还是推荐你参考理查德·鲁梅尔特,他列出了这些要点:
-
关键目标(Leverage Objective):需要重点关注的最关键目标。 -
阶段目标(Proximate Objective):尽管存在模糊性和复杂性,但仍足够接近可行的目标。 -
链条中最薄弱的环节(Weakest Link in Chain):首先需要解决的限制因素。 -
设计的力量(Power of Design):决定是将资源和工作结合起来还是分离开来。 -
利用优势(Using Advantage):利用你的优势和机会。 -
屹立潮头(Riding the Wave of Change):识别和评估行业和环境重大变化的早期迹象。 -
了解惯性和熵(Understanding Inertia and Entropy):惯性是组织内部对变革的抵制,熵是系统和组织走向无序的趋势,
战略模块示例
下面是软件工程实践中的几个例子:
关键目标/修复干扰因素 -- 去除阻碍工程师进入心流状态的障碍。可能包括在开放空间环境中使用降噪耳机,或减少告警系统噪音,从而避免每天数十次的错误告警。还可能包括重新安排团队日程表,让每位工程师每天至少有 4 小时专注工作,或者限制正在进行的工作--"停止开始,开始完成(stop starting, start finishing)"。
题外话:心流状态是开发人员体验的关键因素。 请在 Abi Noda 的 DevEx 框架中相关信息。
阶段目标/改造 SDLC 流程 -- 最终目标--真正的持续交付或部署--往往过于雄心勃勃,难以一蹴而就。首先,必须将其分解为可实现的步骤,如良好的测试实践、发布和回滚解决方案、良好的监控和告警、软件稳定性等,其中每个步骤本身都可以是一个阶段目标。
链条中的薄弱环节/技术债务 -- 技术债务分类是一个真正的链条中的薄弱环节。总有一些工作要做--系统解耦、库更新、重构。在这里,主要工作就是找出最拖后腿的部分。为了进行分类,可以参考十种技术债务类型。
有关行业和软件工程实践中的更多示例,以及关键目标、阶段目标或链条中的薄弱环节等反模式,建议查看工程战略的战略模块示例。
信息来源
在制定战略时,可以利用无数的信息来源:一对一交流、人们的反馈、产品战略背景、分类技术债务等等。如需灵感,建议查看Practical Engineering Management上的这些文章:
工程领导者的信息信号 -- 知识来源可分为三类:拥有的知识(你已经知道的)、外部来源(在公司外部可以观察到的)和内部信号(公司的数据、洞察力、仪表盘)。作为工程领导者,你的任务是:a)为捕捉内部信号奠定坚实的基础;b)利用这些数据推动决策和长期战略。
掌握反馈 -- 反馈是一种特殊的知识来源,其并不总是经验事实,而往往只是意见、信念和个人看法。尽管这些信息并不总是量化的,但往往与遥测数据和产品仪表盘上的数据一样具有洞察力。如果没有收到反馈,并不意味着没有什么需要改变的,也许只是意味着没有与你分享的空间。作为工程领导者,必须在给予和接受反馈这两方面都游刃有余。
结构化信息来源
DevOps 文化 -- 科技行业尽管日新月异,但全球数以千计的成功企业积累了数十年经验和最佳实践。尽管大多数科技企业都认为自己是独一无二的,但通常都会解决经典的、众所周知的软件工程问题。这意味着有许多经过验证的实践也可以在你的组织中发挥作用--与其重新发明轮子,可以采用现有的行业标准,以满足我们的需求。
要制定长期计划,可以采用 DevOps 文化,这是一种促进工程团队和其他团队协作和分担责任的思维模式,帮助团队快速可靠的交付高质量软件。
以下是值得在团队中评估的 DevOps 文化的几个因素:
-
注重高度信任的文化和协作学习的环境。 -
围绕自动化、CI/CD 和遥测的开发实践。 -
团队架构和流程注重独立性和长期目标。 -
可预测的部署和发布管理。 -
每个人都对质量负责的弹性组织。 -
以成果而非任务为导向。
如果想对 DevOps 文化进行全面自我评估,以便更轻松的制定工程战略,建议查看 Practical Engineering Management 上的资料和模板:DevOps 文化清单。
技术债务分类 -- 有些公司,如 Google 或 Thoughtworks,已经制定了自己的技术债务分类,采用它们的框架可以帮助你找到适合你的软件工程战略的模块。
以下是谷歌定义的十种类型:
-
需要迁移或正在迁移 -
项目和应用程序接口 (API) 文档 -
测试 -
代码质量 -
死代码和/或废弃代码 -
代码退化 -
团队缺乏必要的专业知识 -
依赖关系 -
执行不力或放弃迁移 -
释放过程
结束语
为团队和技术制定良好的工程战略是最具挑战性和最耗时的工作之一。然而,有了这样一个计划,你就能成为一个真正有影响力的领导者,从而带来巨大的变化。
在我担任工程总监、工程主管和工程经理/技术领导的职业生涯中,制定了多种战略。最成功的战略充分利用了从理查德·鲁梅尔特(Richard Rumelt)所著的好战略/坏战略一书中吸取的经验教训。
希望这里分享的资料能激励你制定自己的长期计划,并成为一名能扩大影响力的领导者。
你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!
本文由 mdnice 多平台发布
相关文章:
如何制定工程战略
本文介绍了领导者如何有效制定工程战略,包括理解战略核心、如何收集信息并制定可行的策略,以及如何利用行业最佳实践和技术债务管理来提升团队效能和产品质量。原文: How to Build Engineering Strategy 如果你了解过目标框架(如 OKR…...
认识和使用 Vite 环境变量配置,优化定制化开发体验
Vite 官方中文文档:https://cn.vitejs.dev/ 环境变量 Vite 内置的环境变量如下: {"MODE": "development", // 应用的运行环境"BASE_URL": "/", // 部署应用时使用的 URL 前缀"PROD": false, //应用…...
Java18新特性总结
Java 18作为Java编程语言的一个重要更新,引入了一系列新特性和改进,旨在提高开发者的生产力和程序的性能。以下是Java 18的主要新特性概述: 元编程功能: Java 18引入了元注释和元类型声明的功能,允许开发人员在编译时…...
理解 Java 中的 `final` 关键字
理解 Java 中的 final 关键字 final 关键字是 Java 编程语言中一个重要的修饰符,它可以应用于类、方法和变量。理解 final 的用法和作用对于编写稳健和高效的 Java 代码至关重要。在本文中,我们将深入探讨 final 关键字的各种用法及其意义。 一、final…...
磁盘未格式化:深度解析、恢复方案及预防之道
在当今这个信息化爆炸的时代,磁盘未格式化问题无疑成为了众多用户头疼的难题。当我们的存储设备突然提示“磁盘未格式化”时,数据的丢失与恢复的挑战便摆在了我们面前。本文将深入解析磁盘未格式化的现象、原因,并给出两种有效的数据恢复方案…...
JWT 从入门到精通
什么是 JWT JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案 JSON Web Token Introduction - jwt.ioLearn about JSON Web Tokens, what are they, how they work, when and why you should use them.https://jwt.io/introduction 一、常见会…...
31-捕获异常(NoSuchElementException)
在定位元素的时候,经常会遇到各种异常,遇到异常又该如何处理呢?本篇通过学习selenium的exceptions模块,了解异常发生的原因。 一、发生异常 打开百度搜索首页,定位搜索框,此元素id"kw"。为了故意…...
使用Spring Boot设计对象存储系统
对象存储系统是一种以对象为存储单位的存储架构,适合存储大量非结构化数据,如图片、音视频文件、文档等。MinIO是一个高性能的对象存储系统,基于开源和云原生的设计理念。本文将讨论如何使用Spring Boot设计一个类似MinIO的对象存储系统。 目…...
Apple开发者macOS设备与描述文件Profile创建完整过程
安装并打开Apple Configurator 新建描述文件 输入macOS平台的描述文件的相关信息,然后选择证书 选择一个可用证书 存储描述文件 存储成功如下: 使用文本编辑器打开刚才保存的描述文件,找到设备名与UDID...
SpringBootWeb 篇-深入了解 Redis 五种类型命令与如何在 Java 中操作 Redis
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Redis 概述 1.1 Redis 下载与安装 2.0 Redis 数据类型 3.0 Redis 常见五种类型的命令 3.1 字符串操作命令 3.2 哈希操作命令 3.3 列表操作命令 3.4 集合操作命令 …...
mysql设置允许外部ip访问,局域网IP访问
(支持MYSQL8版本) 1. 登录进入mysql;mysql -uroot -p输入密码进入 2. 输入以下语句,进入mysql库,查看user表中root用户的访问 use mysql; select host,user from user; 3. 更新user表中root用户域属性,…...
mac虚拟光驱工具:Daemon Tools for Mac
Daemon Tools for Mac是一款功能强大的虚拟光驱工具,它为用户提供了在Mac上模拟物理光驱的能力,从而方便用户处理各种光盘映像文件。以下是关于Daemon Tools for Mac的详细介绍: 守护进程工具:Daemon Tools不仅是一个简单的虚拟光…...
软考 系统架构设计师系列知识点之杂项集萃(32)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(31) 第51题 网络逻辑结构设计的内容不包括( )。 A. 逻辑网络设计图 B. IP地址方案 C. 具体的软硬件、广域网连接和基本服务 D. 用户培训计划 正确答案&am…...
Web--CSS基础
文章目录 定义方式选择器文本字体背景边框元素展示格式内边距与外边距盒子模型位置浮动flex布局响应式布局 定义方式 行内样式表 直接定义在style属性中,作用于当前标签 <img src "/imges/logo.jpg" alt "" style "width 400"…...
服务部署:Linux系统部署C# .NET项目
1. 安装 .NET SDK 首先,你需要在你的 Linux 系统上安装 .NET SDK。 Ubuntu系统: 下载 Microsoft 包配置文件 wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb 这个命令使用 wge…...
【机器学习】基于卷积LSTM的视频预测
1. 引言 1.1 LSTM是什么 LSTM(Long Short-Term Memory)是一种特殊的循环神经网络(RNN)变体,旨在解决传统RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题。LSTM通过引入门控机制和细胞状态的概念,使得…...
细说wayland和X11
文章目录 协议介绍协议区别开发差异 Wayland和X11都是用于Linux和其他类Unix系统的显示服务器协议。它们负责在用户和应用程序之间的交互中管理屏幕的输出以及输入设备的输入。 协议介绍 X11通常称为X Window System,是一个历史悠久的显示服务器,自1987…...
数据结构:二叉树的实现
目录 二叉树的遍历方式 前序遍历: 中序遍历: 后序遍历: 二叉树的基本结构和功能 基本结构: 基本功能: 二叉树功能的实现思路 二叉树功能的实现 1、构建一个二叉树 2、二叉树的销毁 3、计算二叉树里的节点个数 4、得…...
Helm离线部署Rancher2.7.10
环境依赖: K8s集群、helm 工具 Rancher组件架构 Rancher Server 包括用于管理整个 Rancher 部署的所有软件组件。 下图展示了 Rancher 2.x 的上层架构。下图中,Rancher Server 管理两个下游 Kubernetes 集群 准备Rancher镜像推送到私有仓库 cat >…...
Linux目录的作用和常用指令
目录结构及其详细作用 / (根目录) Linux文件系统的起点,所有文件和目录都在其下。 /bin 存放系统启动和运行时所需的基本命令,如 ls, cp, mv, rm,这些命令在单用户模式下或系统崩溃时仍然可用。 /boot 包含启动引导加载器的文件和Linux内核…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
