软件工程师都应该知道的10个定律

 一、海勒姆法则

内容

当一个 API 有足够多的用户,你在契约中承诺了什么并不重要:系统中所有看得见的行为都会有某个人依赖……

案例

现在有两个系统A和B,B的一个接口返回一个列表。A系统的开发人员发现返回的列表都是按照ID正向排序的。本身A系统正好需要其按照正序排序,于是直接自己没有做排序就直接使用了。

海勒姆法则

实际B返回的列表是直接从数据库取出来的,自身没有做排序,并不知道自己的返回列表顺序被依赖了。有一天,B系统有个新需求,需要在返回列表数据前对数据先做个处理。因为B本身没有意识到自己提供了有序的列表,处理时就可能产生问题。

二、切斯特顿栅栏

内容

简单来说是:存在即合理。

在某种情况下存在某种制度或法律,为了简单起见,我们可以把它当做道路上竖立一道栅栏或大门。后来的改革者会欢欣鼓舞地说:“我没有看到这东西有什么用处,让我们把它清除掉吧。”

而更聪明的改革者则会说:“如果你没有看到它的用处,我当然不会让你们清除它。离远点动脑子想想。然后,当你可以回来告诉我你确实看到了它的用途时,我才可能让你毁掉它。”

做出重大决策的核心部分是理解先前决策背后的理由。如果我们不了解是如何形成当前状态,我们就有使事情变得更糟的风险。

切斯特顿栅栏

案例

有很多人接手一个前人做的项目时,会发现一些代码写的不对或者不好。有想马上动手改一改的冲动。但是有经验的前辈就会说这个代码运行了这么多长时间,不能随便改。有段逻辑看起来是错的,那很有可能是因为负负得正,其他地方也有问题正好一起合成了正确的结果。在理清楚所有脉络前,最好什么都不要动。

三、二阶思维

内容

简单来说:更深层次的考虑问题

把问题思考到二阶、三阶和n阶的能力,或者简称为二阶思维——是增强你思维的强大工具。

案例

二阶思维

在上面切斯特顿栅栏的案例中,就可以使用二阶思维多想一层,把整个系统的原本思路原因分析清楚。大家在做故障回顾和案例分析时常用的5why分析法也是二阶思维的经典应用。

四、街灯效应

内容

简单来说就是:拿着锤头找钉子

出自下面这则寓言:

一天晚上,一个警察看到一个醉汉在路灯下的地面上找东西,问他在找什么。醉汉回答说他钥匙丢了。警察看了看也找不到,就问他:“你确定你钥匙是在这儿丢的,就在路灯下?”醉汉说:“不,但是这儿的光是最亮的”。

街灯效应

案例

在排查生产问题的时候,特别是不能复现的问题。很多人的排查方法取决于自己知道哪些方法而不是问题本身需要什么方法。要解这个问题需要大量的积累,有更多的方法、思路,才能根据问题找到合适的方法。

五、虚荣指标

内容

虚荣指标是指无法真正反映情况的数字。

案例

虚荣指标

有些反馈表面数据的指标,它们让效果看起来很好但却不能告诉我们具体价值,典型的虚荣指标如点击量、下载量和曝光量,数据量级很大,让人印象深刻,但这样的数据用于广告宣传还行,用于指导公司行动就意义不大。举例如下:

1、 点击量。这是互联网洪荒年代所使用的指标,随便什么网站,只要上面可点 的东西多,这个数字都会很高。相比之下,你更应统计点击的人数。

2、页面浏览量(PV值)。这个指标只比点击量稍好一点点,因其统计的是网页被访客请求的次数。除非你的商业模式直接与PV值挂钩(即展示广 告),你还是更应统计(访问的)人数。

3、访问量。你的100访问量究竟来自于1个访问了 100次的用户,还是100 个访问了 1次的用户?它无法指导行动。

4、独立访客数。只能显示有多少人访问了网页,却不能告诉你这些人在页面上做了什么。他们为什么停留?是否离开了?如果是一款内容型产品,更应该关注单个用户的阅读文章数量、用户的使用频次、有点击行为的浏览时长 和点击位置。以这些指标反馈到具体的用户行为和用户喜好,来优化内容运 营行为。

5、粉丝/好友/赞的数量。计算粉丝/好友的数量只是一场毫无意义的人气比 赛,除非你能让他们做对你有利的事。你在社交平台上振臂一呼时,有多少 粉丝会响应?只有知道了这个数字,他们才对你有意义。实际上,更应该观察用户对产品核心 功能的使用情况,资讯类产品公司要关注用户浏览了几篇文章,电商类产品 公司要看用户浏览了哪些商品且有没有购买,在线教育类产品公司要关注用 户是否参与了课程并按课程进度听课。

6、网站停留时间(time on site ) /浏览页数(number of pages )。用户停留时间是指用户在某个页面停留了多久,而不是浏览了多久。用 户停留时间并不能反映用户对内容的喜好程度,我们更应该使用用户的阅读速度、阅读完成度和内容跳出率等数据判断用户对某个页面内容的喜好程度。用这 两个指标来替代客户参与度或活跃度并非明智之举,除非你的商业模式与这两个指标相绑定。而且,它们并非一定能说明问题。比如,客户在客服或投 诉页面上停留了很长时间,不见得是什么好事。

7、收集到的用户邮件地址数量。有很多人对你的创业项目感兴趣,这很好。但是,如果不知道他们中有多少人会真正打开你的邮件(并为你邮件中的内容 买单),纵使有再多人在你的邮件列表上也是枉然。更好的做法是:向一部 分注册用户发送测试邮件,看他们是否会按照邮件中的提示去做。

8、下载量。尽管有时会影响你在应用商店中的排名,但下载量本身并不带来价值。你需要衡量的是:应用下载后的激活量、账号创建量等等。但是没有免费功能的付费应用除外。

六、墨菲定律

内容

凡事只要可能出错,那就一定会出错。

墨菲定律

案例

一个项目负责人,拿到一个项目,做好了方案。把开发人员、测试人员等相关方都叫到一起开会,对齐了方案和排期。如果大家各司其职,按照方案和排期进行,事情会很顺利。但是经常做项目的我们自然知道,事情很少像想象的那样顺利过。比如开发人员自己开发好了,却忘记了通知测试人员测试。测试人员有其他的项目要忙,没人通知他也没有自己主动问问是否需要测试了。这些都需要设置跟进和应对措施,不能想当然。

七、墨菲第二定律

内容

没有什么事情像看起来那么简单。

墨菲第二定律

案例

项目往往会比你预计的时间长,比如临时会插进去更紧急的事情;比如合作团队遇到问题;所以有经验的工程师往往会给自己留一些buffer。

八、康威定律

内容

组织设计的产品/设计等价于这个组织的沟通结构。

案例

如果你让 4 个小组开发编译器,那么你就会获得 4 个编译器。所以我们要用一切手段提升沟通效率,比如工作中常用的wiki、jira、github和即时通讯工具。

九、格雷欣法则

内容

简单来说就是坏的挤走好的。

也就是通常所说的“劣币驱逐良币”定律。周先生以西方公案的方式介绍其来龙去脉,也就是先生说的“以讹传讹”。十六世纪的英王伊丽莎白有位顾问,就是Sir Thomas Gresham(葛氏),他发现市场上流通的货币,由于在流通中磨损而重量不足,人们便把“足金”储存起来,熔化成金属块,甚至转运出口,只把“不足”的拿到市场上使用。

格雷欣法则

案例

很多用人单位招聘秉持着:新招聘的员工水平一定要高于目前员工的平均水平,宁缺毋滥的原则。就是要避免“劣币驱逐良币”定律。

十、泰斯勒定律

内容

泰思勒定律也被称为复杂度守恒定律。该定律指出每一个过程都有其固有的复杂性,存在一个临界点,超过了这个点过程就不能再简化了,你只能将固有的复杂性从一个地方移动到另外一个地方。

简单点来说:如果想让用户使用简单,那产品自身的实现复杂性就会增加。

案例

以下是一个通过产品自身增加处理,让用户行为变得简单的例子:

泰斯勒定律

 

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

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

相关文章

Flink实现kafka到kafka、kafka到doris的精准一次消费

1 流程图 2 Flink来源表建模 --来源-城市topic CREATE TABLE NJ_QL_JC_SSJC_SOURCE ( record string ) WITH (connector = kafka,topic = QL_JC_SSJC,properties.bootstrap.servers = 172.*.*.*:9092,properties.group.id = QL_JC_SSJC_NJ_QL_JC_SSJC_SOURCE,scan.startup.mo…

基于Springboot实现疫情网课管理系统项目【项目源码+论文说明】分享

基于Springboot实现疫情网课管理系统演示 摘要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于疫情网课管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了疫情…

学习开发一个RISC-V上的操作系统(汪辰老师) — unrecognized opcode `csrr t0,mhartid‘报错问题

前言 (1)此系列文章是跟着汪辰老师的RISC-V课程所记录的学习笔记。 (2)该课程相关代码gitee链接; (3)PLCT实验室实习生长期招聘:招聘信息链接 正文 (1)在跟着…

three.js点击模型实现模型边缘高亮选中效果

three.jsreact实现点击模型实现高亮选中效果 1、创建一个场景 let scene, camera, renderer, controls; let stats null; // 检测动画运行时的帧数 let clock new THREE.Clock(); // getDelta()方法获得两帧的时间间隔 let FPS 30; let renderT 1 / FPS; let timeS 0;con…

SpringBoot中使用拦截器

拦截器属于MVC中的内容 SpringBoot项目,引入web依赖即可 需要访问的控制器 拦截器第一步实现HandlerInterceptor接口 第二步实现WebMvcConfigurer接口,并重写addInterCeptors()方法,将自定义的拦截器注册 也就是说这里add进去拦截的请求,才会进入到prehandle方法,这里放行的请…

kafka与zookeeper的集群

基础配置 systemctl stop firewalld && systemctl disable firewalld setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/configvi /etc/hosts ip1 node1 ip2 node2 ip3 node3zookeeper介绍 zookeeper是一个分布式的协调服务,主要用…

计算机竞赛 : 题目:基于深度学习的水果识别 设计 开题 技术

1 前言 Hi,大家好,这里是丹成学长,今天做一个 基于深度学习的水果识别demo 这是一个较为新颖的竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/pos…

[天翼杯 2021]esay_eval - RCE(disabled_function绕过||AS_Redis绕过)+反序列化(大小写wakeup绕过)

[天翼杯 2021]esay_eval 1 解题流程1.1 分析1.2 解题1.2.1 一阶段1.2.2 二阶段 二、思考总结 题目代码&#xff1a; <?php class A{public $code "";function __call($method,$args){eval($this->code);}function __wakeup(){$this->code "";…

虚拟机Ubuntu18.04安装对应ROS版本详细教程!(含错误提示解决)

参考链接&#xff1a; Ubuntu18.04安装Ros(最新最详细亲测)_向日葵骑士Faraday的博客-CSDN博客 1.4 ROS的安装与配置_哔哩哔哩_bilibili ROS官网&#xff1a;http://wiki.ros.org/melodic/Installation/Ubuntu 一、检查cmake 安装ROS时会自动安装旧版的Cmake3.10.2。所以在…

uniapp 在uni.scss 根据@mixin定义方法 、通过@include全局使用

在官方文档中提及到uni.scss中变量的使用&#xff0c;而我想定义方法&#xff0c;这样写css样式更方便 一、官方文档的介绍 根据官方文档我知道&#xff0c;在这面定义的变量全局都可使用。接下来我要在这里定义方法。 二、在uni.scss文件中定义方法 我在uni.scss文件中定义了…

12P4375X042-233C KJ2005X1-BA1 CE3007 EMERSON servo controller

12P4375X042-233C KJ2005X1-BA1 CE3007 EMERSON servo controller 我们提供三种不同类别的EDGEBoost I/O模块供选择&#xff0c;以实现最大程度的I/O定制: 数字和模拟输入/输出网络和连接边缘人工智能和存储 利用EDGEBoost I/O实现变革性技术 EBIO-2M2BK EBIO-2M2BK载板支持…

conda安装使用jupyterlab注意事项

文章目录 一、conda安装1.1 conda安装1.2 常见命令1.3 常见问题 二、jupyterlab2.1 jupyterlab安装和卸载2.2 常见错误2.2.1 版本冲突&#xff0c;jupyterlab无法启动2.2.2 插件版本冲突 2.3 常用插件2.3.1 debugger2.3.2 jupyterlab_code_formatter 2.4 jupyter技巧 一、conda…

ThreeJS-3D教学七-交互

在threejs中想要选中一个物体&#xff0c;点击或者鼠标悬浮&#xff0c;又或者移动端的touch事件&#xff0c;核心都是通过new THREE.Raycaster完成的。这里用到了一个概念&#xff0c;即我们点击时的 屏幕坐标 转换为 three中的3D坐标。 先看效果图&#xff1a; 代码是&#…

掌握这3点,企业就能规避收款业务中的合规风险

随着国家政策监管日趋严格&#xff0c;企业合规管理正在受到高度关注。在企业收业务款场景中&#xff0c;银行回单管理容易被忽略&#xff0c;若处理不当&#xff0c;将面临合规风险。具体表现如下&#xff1a; 审计依据不充分 银行回单是企业内部控制和合规管理的重要组成部…

vue3 集成 tailwindcss

tailwindcss 介绍 Tailwind CSS 是一个流行的前端框架&#xff0c;用于构建现代、响应式的网页和 Web 应用程序。它的设计理念是提供一组可复用的简单、低级别的 CSS 类&#xff0c;这些类可以直接应用到 HTML 元素上&#xff0c;从而加速开发过程并提高样式一致性。 主要特点…

大语言模型学到什么

背景&#xff1a; 这篇文章是对《LANGUAGE MODELS REPRESENT SPACE AND TIME》论文的翻译加解读。之所以选这篇文章是因为最近在研究大模型的可解释性&#xff0c;以及基于可解释性对大模型的下游任务适配做训练级别可控性增强研究。其实总结成两句话就是&#xff1a; 1.大模…

Spring【@Resource、@Autowired+lombook+Bean的生命周期】

Resource 和 Autowired 的区别 在Spring中找Bean的两种方式&#xff1a;①先根据类型查找②再根据名称查找 Autowired先根据类型查找&#xff0c;再根据名称查找【根据上述查找结果不唯一&#xff0c;再添加一个 Qualifier(value“”)&#xff0c;就可以查找】 Resource先根据名…

【12】c++设计模式——>单例模式练习(任务队列)

属性&#xff1a; &#xff08;1&#xff09;存储任务的容器&#xff0c;这个容器可以选择使用STL中的队列&#xff08;queue) &#xff08;2&#xff09;互斥锁&#xff0c;多线程访问的时候用于保护任务队列中的数据 方法&#xff1a;主要是对任务队列中的任务进行操作 &…

【C++ 学习 ㉖】- 布隆过滤器详解(哈希扩展)

目录 一、布隆过滤器的简介 二、布隆过滤器的实现 2.1 - BloomFilter.h 2.2 - test.cpp 一、布隆过滤器的简介 布隆过滤器&#xff08;Bloom Filter&#xff09;是由 Burton Howard Bloom 在 1970 年提出的一种紧凑型的、比较巧妙的概率型数据结构&#xff08;probabilist…

【排序算法】插入排序

文章目录 一&#xff1a;基本概念1.1 介绍1.2 原理1.3 插入排序法思想 二&#xff1a;代码实现2.1 源码2.2 执行结果2.3 测试八万条数据 三&#xff1a;算法分析3.1 时间复杂度3.2 空间复杂度3.3 稳定性 一&#xff1a;基本概念 1.1 介绍 插入式排序属于内部排序法&#xff0…