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

软件开发中的抓大放小vs极致细节思维

在这里插入图片描述

  最近在开发过程中,遇到了好多次 “这个需求点这次要不要做?” 的问题, 主要有两方阵营,比如以研发主导的 “这次先不做、等必要的时候再做” ,另外一方是以PM主导的 “这个不做需求不完整,可能影响用户体验” 。争议主要出现在一些小需求或者细节点上,一般不是啥核心功能,比如一些鸡肋需求或者有些极端异常case的处理。 前者的主要观点是“这个需求不重要可能会浪费时间,有哪些时间还不如做一些更重要的事”,后者的主要观点是“这个点虽然不是核心功能,但没有的话可能让用户决定我们产品有缺陷。” 如果遇到的两方脾气不好,甚至可能闹到剑拔弩张的情况。

  这两种不同的观点其实就是我标题上说的两种不同思维模式导致的,前者的思维模式更偏向于 “抓大放小,优先解决主要矛盾”,而后者的思维模式就是“细节决定成败,不放过一个问题”。不同的人在这两种思维模式上有不同的倾向,就是孰对孰错、孰优孰劣。这仿佛是个无解的哲学问题,下面我给出我对这个问题的答案,仅仅是一份我自己的观点,大家也可以在评论区探讨下。

  首先,我作为研发,大部分情况下的决策都是“不做”,因为做了会显著增加我的工作量,软件开发过程中也存在二八定律,80%的功能只占开发时间的20%,而剩余20%的功能需要额外投入80%工作量。剩下20%的功能ROI是极低的,这是我的第一个理由。 其次,很多需要点和细节点只是别人的假设,并不一定代表真实的场景,大部分情况下这个需求点是伪需求,直接拒绝可以有效避免研发人力的浪费。

  我们举个我所遇到的例子。我们公司的业务建立在某云之上,如果该云厂商宕机我们业务一定会挂,这显然从业务上讲这是不可容忍的,如果你去问老板,你希望自己的产品稳定性是多少,他一定会回答是100%。有一定技术经验的人都知道100%的稳定性是不可能达到的,我们只能无限趋近于100%。 摆脱单云依赖,我们唯一的选择就是要支持多云备份,然而这个成本巨高,可能需要我们全部技术吭哧吭哧改造几个月来完成,这对于一个以业务快速发展的团队来说也是不可接受的。在这件事上,我们都选择了坦然接受云厂商可能宕机的风险,选择抓大(业务发展)放小(极致的稳定性),

  再举一个决策完全相反的例子。我在入职阿里参加新员工培训的时候,听老员工将讲到了阿里曾经的去IOE项目,就是要在阿里巴巴的IT架构中,去掉IBM的小型机、Oracle数据库、EMC存储设备。其中我印象比较深的就是他讲到支付宝替换Oracle数据库过程中,他们投入了巨大的成本做数据稳定性一致性的验证,因为金融级别的数据就是要求100%的准确性,这种情况下就是追求极致的思维模式。

  可能有些同学也看出来以上两个案例决策结果不一致的原因。表面看是业务场景的不同,虽然我在案例一中没有具体介绍我们的场景,但大家也能看出来我们是可以接受不可用风险的,而且云厂商宕机其实算是小概率事件(虽然前两天阿里云就出事了),短暂出问题后我们的损失远小于投入人力建设多云备份的能力的。而反观支付宝替换Oracle数据库的事,他们处理的是金融相关的数据,也就是和钱相关的数据,比如给你少算一分钱,这不仅仅是一分钱的问题,而是信任的问题,一旦出问题公司可能就黄了,所以他们出问题的成本是非常高的。 虽然这两个场景得出了不一样的决策,但其背后都遵循同一个原则,就是投入产出比最大化,大白话就是在同样的收益下成本最小或者在同样的成本下收益最大。

  投入产出比最大化 这个思路相信正常人都是认同的,那为什么同样一件事不同的角色在抓大放小和极致细节之间选择不同的思维方式? 答案就是不同的人对收益和投入的评估结果是不一样的,有些时候做一件事投入的成本和预期收益是很难量化的,大家只能凭借自己的经验和感受做一个简单的评估,这个时候每个人评估的结果可能就会出现差异。我举一些观察到的现象(不一定完全准确)

  • PM倾向于高估收益低估成本
  • 研发倾向于低估收益
  • QA倾向于高估风险
  • 管理层和PM一样容易高估收益低估成本
  • 不了解技术的人容易低估技术成本
  • 乐观的人任意高估收益,悲观者容易高估风险
  • 容易替别人低估成本,替自己高估成本
  • 如果最近出过严重问题,容易高估风险
  • ……

  有些是角色使然、有些是性格使然、还有些是环境使然,这些都很难控制,只能多沟通、建立规范、多尝试,各方在软件开发过程中,可以参考下这些建议,希望可以尽可能减少在成本和收益上的认知偏差。

  1. 在评估收益时,我们应该考虑功能对用户和业务的实际价值,而不仅仅是满足用户的要求。很多用户需求可能只是“好奇心”或者“完美主义”,真正使用时作用不大。我们需要区分核心价值和边际价值。
  2. 评估成本时,不要只看短期投入,还要考虑带来的长期维护成本。一个小功能可能需要持续Debug、完善、升级,总成本远超初期开发。
  3. 沟通时,各方应摒弃主观偏见,不能因为立场不同就互不信任。研发应直面PM的质疑,而PM也应理解技术难点。管理层要站在全局角度平衡各方诉求。
  4. 可以建立一套清晰的规范,说明不同类型需求的优先级原则、成本评估模型等,减少鸡肋需求的争议。并且可根据实际情况不断完善这套规范。
  5. 在可行范围内,应该允许小规模试错,因为很多收益和成本在实际开发前难以准确预测。通过最小可行产品快速验证idea,再决定下一步优化方向。

  软件开发过程中的抓大放小和极致细节两种思维模式并没有明显的对错之分,至于不同的人选择不同的思维模式,源自于不同角色对收益和成本的认知偏差。但我认为在软件开发的不同阶段中,有着适合的不同思维模式,所以还是需要有倾向性的。 比如在软件开发初期或者资源有限的情况下,可以更倾向于抓大放小。但在软件稳定期更应倾向于极致细节。 当然如果遵循投入产出比最大的原则,一切都是可以自然而然改变的。比如在软件发展的过程中,有些功能初期不重要,但后期可能会变的很重要。所以还需保持开放和灵活的心态,根据不断变化的实际情况调整开发策略和优先级。

相关文章:

软件开发中的抓大放小vs极致细节思维

最近在开发过程中,遇到了好多次 “这个需求点这次要不要做?” 的问题, 主要有两方阵营,比如以研发主导的 “这次先不做、等必要的时候再做” ,另外一方是以PM主导的 “这个不做需求不完整,可能影响用户体验…...

java文件上传以及使用阿里云OSS

JavaWeb 文件上传本地存储阿里云OSS配置文件 yml配置文件 文件上传 前端页面三要素: 表单项type“file” 表单提交方式post 表单的enctype属性multipart/form-data 本地存储 保证上传的文件不重复 //获取原始文件名String originalFilename image.getOriginalFi…...

相关性分析和作图

相关的类型 1. Pearson、Spearman和Kendall相关 Pearson 积差相关系数衡量了两个定量变量之间的线性相关程度。(连续) Spearman等级相关系数则衡量分级定序变量之间的相关程度。(分类) Kendall’s Tau 相关系数也是一种非参数的…...

AlphaFold的原理及解读

1、背景 蛋白质是生物体内一类重要的生物大分子,其结构复杂多样,蛋白质的结构对于理解其功能和参与的生物学过程具有重要意义。从生物学角度上看,蛋白质的结构可以分为四个层次:初级结构、二级结构、三级结构和四级结构。 初级结…...

【ChatGLM3-6B】Docker下快速部署

【ChatGLM2-6B】小白入门及Docker下部署 前提下载安装包网盘地址 开始安装加载镜像启动镜像进入容器启动模型交互页面访问页面地址 前提 安装好了docker安装好了NVIDIA显卡16G 下载安装包 网盘地址 ​ 这里因为网盘上传文件有大小限制,所以使用了分卷压缩的方式…...

两部手机数据传输后备忘录不见了怎么回事

想必很多人都遇到过,当两部手机进行备忘录数据传输后,突然发现备忘录不见了,这让人不禁着急上火,我也曾经遇到过这种事情导致很多重要的内容都丢失了。 一般出现这种情况可能是因为,两部手机使用的是不同的云服务&…...

【Unity入门】LayerMask小结

LayerMask常用的几种方法 LayerMask.GetMask 根据 层名称 获取其层遮罩值 遮罩值 2^层索引 假设 UserLayerA 和 UserLayerB 是第十层和第十一层。 这两个层会具有 User Layer 值 10 和 11。若要获取其层遮罩值, 可以将其名称传入 GetMask。参数可以是 其名称的列…...

mysql按年、季度、月,统计

以下是按年、按季度和按月统计SQL查询语句: 按年统计: SELECTds.checker,YEAR(ds.create_time) AS settleYear,SUM(ds.quantity) AS quantity,SUM(ds.approval_price) AS approvalPrice FROMdata_settle ds WHEREds.delete_flag 0AND ds.approval_sta…...

Python的换行和转义:深入理解代码排版与字符串处理

更多Python学习内容:ipengtao.com 大家好,我是涛哥,今天为大家分享 Python的换行和转义:深入理解代码排版与字符串处理,全文2700字,阅读大约8分钟。 在Python编程中,正确使用换行和转义字符是保…...

dart多线程双向通信的案例----【小学4年级课程】

下面是运行后的打印顺序 I/flutter (20170): 上班 I/flutter (20170): 这里是校长室:main I/flutter (20170): 这里是饭堂:fantang1 I/flutter (20170): 这里是收发室--检查小孩发回去给他妈妈的信息是:我是秘书的儿子,我来到在校长室了。校长今晚想吃羊…...

每日一练:简易计算器

1. 题目 设计实现一个简易的计算器,可以进行加减乘除的计算。可以考虑通过GUI和命令行输入等方式实现。 2. 设计思路 创建一个简单的用户界面,可以使用 Python 的 Tkinter模块。在界面上放置按钮,每个按钮代表一个数字、运算符或其他功能。…...

Jmeter和Testlink自动化测试框架研究与实施

摘 要 目前基于Jmeter的接口自动化测试框架,大多只实现脚本维护和自动调度,无法与Testlink进行互通,实现测试方案与自动化实施流程连接,本文基于Testlink、Jmeter、Jenkins实现:通过Testlink统一维护接口自动化测试用…...

MethodArgumentNotValidException 与 ConstraintViolationException

MethodArgumentNotValidException 和ConstraintViolationException 都是用于处理参数校验异常的异常类,但它们在不同的上下文中使用。 1. MethodArgumentNotValidException: - MethodArgumentNotValidException 是在 Spring MVC 或 Spring Boot 中处…...

【数学】旋转矩阵

参考链接 OpenGL from OpenGL.GL import * from OpenGL.GLUT import * from math import * import numpy as np def draw_axes():glClear(GL_COLOR_BUFFER_BIT)# 绘制坐标轴glColor3f(1.0, 1.0, 1.0) # 设置坐标轴颜色为白色glBegin(GL_LINES)glVertex2f(-1.0, 0.0) # x 轴g…...

Python与设计模式--中介者模式

23种计模式之 前言 (5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、(11)策略模式、责任链模式、命令模式、中介者模…...

后台管理系统开源项目

最近项目没有什么事做,就自己整理,修改了一些vue2,react的后台管理系统项目,方便以后有需要可以直接提取,当然也方便了大家 vue2技术栈 lyl-vueProjectAdmin: vue2后台管理系统 react技术栈 lyl-reactAdminProject:…...

电子印章管理系统:是什么、3个平台推荐

说到印章,相信看过近现代电视剧的人都见过,一般在订立合约时最常用到,双方在合约上加盖印鉴,即代表着合约的成立。 我小时候还见过我父亲的印章,只是随着时代的发展,印章因为不易携带,容易被盗…...

现货黄金区间交易的两个要点

在现货黄金市场中,我们常碰到横盘区间行情。有区间,就终究会出现突破,因为金价不可能缺乏方向而一直在区间内运行。那既然要突破,我们又应当如何应对和交易呢?下面我们就来讨论一下。 切忌在突破发生时马上跟随突破方向…...

安卓底部导航栏BottomNavigationView

目录 1. BottomNavigationView (1) 准备BottomNavigationView使用的菜单资源文件 (2) 准备颜色选择器 (3) BottomNavigationView控件设置 (4) 在Java代码中设置OnItemSelectedListener监听器 (5) 与Fragment配合 2. BottomTabBar 实现安卓底部导航栏,google为…...

rust每日一库 rand 生成随机数

文章目录 生成随机值生成随机数生成范围内随机数生成自定义类型随机值从一组字母数字字符创建随机密码从一组用户定义字符创建随机密码 总结 生成随机值 rust中官方并没有像以他语言一样,rust并没有官方并没有提供生成随机数的工具,所以我们要借助rand包…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

测试markdown--肇兴

day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

今日科技热点速览

🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...