如何从错误中成长?
在上一篇文章“技术人的犯错成本”里,我和你聊了技术人可能会犯的各式各样的错误,也举了很多例子,说明了技术人犯错的成本。在竞争激烈的互联网时代,试错当然是好事,但了解错误成本,避免不应该犯的错误,最大可能地从错误中成长,才是我们应有的态度。
我之前看过一篇文章,其中把错误分成四类。
第一类:伸展错误(The stretch mistakes)
伸展错误是:当你尝试去做能力之外挑战的时候,因为自身能力或其他条件的束缚,做得不够好而犯的错。这种错误通常是因为我们主动尝试导致的,再小心也难以避免。不过,在此过程中,你获得学习的机会成本很高,一旦经历过一次,就可能有长足的进步。
比如在创业公司,大家有个创新性的想法需要去验证和实现,这时候谁都没经验,也没有前人的产品可以借鉴,也没有很懂的人给你指导,那怎么办?只能摸索前行,遇到问题,解决问题,犯错,然后纠正错误,所谓逢山开道,遇水搭桥,就是这个道理。当你抵达彼岸的时候,你会发现自己已经升级了,进入了另一个境界。
第二类:无知错误(The aha-moment mistakes)
无知错误是指:当你发现自己为什么错了的时候,你会发出“噢,原来是这样”的感慨。
这种错误一般是因为你不知道或忘记考虑某些特殊情况导致的错误,或者是你做了错误的假设。
初级程序员很容易犯这样的错误,比如忘记处理异常,没有考虑某些数值的边界值,没有进行安全校验等等,还有人因为没有仔细阅读产品文档,不知道产品设计已经改变了,也没有进行对应的调整。出现这种错误之前,你主观上根本没有意识到犯错的风险,还以为自己一直是对的,以至于出错后会有那样的反应。
这种错误一般不会反复出现,但要尽可能避免在不同类型的事情上犯同类型的错误。
第三类:粗心错误(The sloppy mistakes)
直译过来就是由于粗心大意导致的错误,很容易理解。这种错误与“无知错误”不同,是你明明知道怎么回事,但是因为不小心或者忘记了导致的错误。如果你是个粗心大意的人并且没有有意识地纠正自己,这种错误可能一犯再犯。
第四类:高风险错误(The high-stakes mistakes)
主动去做事情,但风险很高,是否会犯错不受自己的控制。比如你面临一个重要的选择,但在结果出来之前,你之前掌握的所有信息都无法告诉你哪个选择是绝对正确的,你只能去做自己认为是大概率的选择。
这种错误与第一类不同,经历过一次,下次遇到高风险的事件,依然可能犯错误,并且不知道会犯什么样的错。
以上我们介绍了四种错误类型,我在文章中放了一张图片,如图所示:第一类和第四类更具意识性,也就是主动去做事情,做事之前你就知道有可能出问题;第二类和第三类则属于下意识的错误,更加不可控。

从另一个角度来看,第一类和第二类错误都会让你学习到更多有价值的、可重用的信息,再有类似情况基本上不会犯重复错误;而第三类和第四类每次犯错后并不能学到太多可以复用的信息,以后有类似情况很可能再犯同样的错误。
了解了这些错误和错误分类,我们就可以有计划有意识地去应对这些错误,尽可能不犯那些对我们成长没有意义的错。当我们面临一个犯错和成长并存的机会时,我们也要知道如何去学习并避免犯同样的错误。
有哪些措施或者方法可以系统性的让我们避免那些无效错误,并从错误中成长呢?
1. 为了避免伸展错误,尽可能地提供一些培训机制。比如对新上任经理的培训,组织一些特定领域的学习班,系统地帮助大家积累岗位可能需要的技能和信息。让一个人担任某个全新的职务时,考虑导师机制,工作中有人结对给予实时指导,等等。
2. 为了避免无知错误,要做好信息的透明和共享。比如完善的文档和快捷的查询机制,任何技术或产品讨论以及达成的共识,要尽可能用邮件抄送到所有相关的人。大的改动可以举行一些会议确保所有人都得到最新的信息。一些常犯的错误或者容易被漏掉的信息可以整理成 Checklist 或手册等形式,让大家更方便地获取到有效信息。
3. 为了避免粗心错误,设置一定的复盘机制。如果是粗心大意造成的错误,要再三总结,反复问为什么,帮助加深记忆。另外还可以通过一些流程来确保低级的错误不会发生,比如细化开发流程,设置检查点,不断迭代和反馈,慢慢形成全面考虑问题的习惯。在不同的事情上,多给自己做一些 Checklist,做事的过程中对照进行,确保不会因为一时大意而有所疏漏。
4. 为了避免高风险错误,所有的决定尽可能都有一个备用方案。也就是除了 Plan A,还要有 Plan B。这样当事情没有按照预期去发展的时候,我们为错误付出的代价也会更少。
总结一下,今天我和你分享了“技术人如何从错误中成长”的话题,首先,我谈到了工作中常见的四种错误类型:伸展错误、无知错误、粗心错误以及高风险错误。前两种错误可以帮助我们迭代成长,后两种错误代价较高,我们要尽量避免一犯再犯。
其次,我讲到了如何去避免以上的错误,针对四种错误类型,要分别采取不同的方式对待。因地制宜、对症下药,让错误成为丰富的经验,为你的成长提供充足的养分。
你在工作中犯过错么,在这个过程中你又获得了什么的成长。欢迎在下面留言,我们一起成长,感谢你的收听,我们下期再见。
文章来源:极客时间《朱赟的技术管理课》
相关文章:
如何从错误中成长?
在上一篇文章“技术人的犯错成本”里,我和你聊了技术人可能会犯的各式各样的错误,也举了很多例子,说明了技术人犯错的成本。在竞争激烈的互联网时代,试错当然是好事,但了解错误成本,避免不应该犯的错误&…...
谈谈一个程序员的职场心得(真有用)
谈谈一个程序员的职场心得 我会分为三个部分:软件开发,职场协作和认知成长,每个部分精简成 7 条心得。 软件开发 若无必要,勿增实体。 这是奥卡姆剃刀的定义,所谓剃刀就是法则,是奥卡姆这个英国学者提出来…...
Pytest:一个卓有成效的测试工具
大家都知道,目前最流行的Python单元测试框架有三种,分别是unittest, nose和pytest。其中unittest是Python自带的测试框架,但问题是比较老了,赶不上时代发展了(哈哈哈);nose2定位是带插件的unitt…...
Compose 动画 (三) : AnimatedVisibility 从入门到深入
1. AnimatedVisibility 是什么 AnimatedVisibility可以实现Compose组件的显示和隐藏,并且可以指定显示/隐藏时候的动画效果。(EnterTransition/ExitTransition) 和 animateXxxAsState、animateContentSize、Crossfade、AnimatedContent 这几个API一起,都…...
网络基础(二)
目录 应用层 再谈 "协议" 协议是一种 "约定". socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么办呢? 为什么要转换呢? 如果我们将struct message里面…...
Java线程知识点总结
文章目录Java 线程基础线程简介什么是进程什么是线程进程和线程的区别创建线程ThreadRunnableCallable、Future、FutureTaskCallableFutureFutureTaskCallable Future FutureTask 示例线程基本用法线程休眠线程礼让终止线程守护线程线程通信wait/notify/notifyAlljoin管道线程…...
数据结构——第三章 栈与队列(4)
队列的应用1.基于队列的医院挂号模拟系统2.队列的运用1.基于队列的医院挂号模拟系统 代码实现分享 2.队列的运用 问题描述:某运动会设立N个比赛项目,每个运动成员可以参加1~3个项目。试问如何安排比赛日程,既可以使同一运动员参加的项目不…...
华为机试HJ73-计算日期到天数转换
HJ73 计算日期到天数转换 题目描述: 描述 根据输入的日期,计算是这一年的第几天。 保证年份为4位数且日期合法。 进阶:时间复杂度:O(n) ,空间复杂度:O(1) 输入描述: 输入一行,每行…...
【阅读笔记】你不知道的JavaScript--this与对象2
目录this默认绑定隐式绑定隐式丢失显示绑定API 调用上下文new 绑定this 绑定优先级其余绑定例外对象字面量与对象属性描述符迭代器遍历this 默认绑定 默认绑定适配 独立函数调用 默认绑定 this 指向全局对象; 故直接调用函数,该函数内部的 this 即指向全…...
单板TVS接地不当造成辐射骚扰超标问题分析-EMC
【摘要】 某产品EMC辐射骚扰测试超标,通过近远场扫描配合定位分析,逐步找出骚扰源、传播路径,最终通过修改 PCB 走线切断传播路径解决此问题。 1 故障现象 某产品在进行 EMC 研发摸底测试时发现,整机辐射骚扰垂直方向测试超标&a…...
用Python Flask为女朋友做一个简单的网站(附可运行的源码)
🌟所属专栏:献给榕榕🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该专栏系为女友准备的,里面会不定时发一些讨好她的技术作品,感兴趣的小伙伴可以关注一下~👉文章简介…...
vue3+rust个人博客建站日记5-所有界面
没有数据的前端,是没有灵魂的。明明标题是vue3 rust ,但日记撰写至今,似乎只有第一篇提及了Rust,这可不行。是时候一股作气,完成大部分页面绘制工作了! 最后再说一次,时间要加速了。 ——普奇神…...
青少年软件编程C++一级真题(202212)
1、输入一个整数x,输出这个整数加1后的值,即x1的值。 时间限制:1000 内存限制:65536 输入 一个整数x(0 ≤ x ≤ 1000)。 输出 按题目要求输出一个整数。 样例输入 9样例输出 10 #include<iost…...
【Spring】AOP底层原理(动态代理)-》 AOP概念及术语 -》 AOP实现
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ AOP - 面向切面编程一、简述AOP二、AOP底层原理…...
Java8 新特性 之 lambda 表达 和 函数式接口
—— lambda 表达式 概念 lambda 表达式是一个匿名函数,可以把 lambda 表达式理解为是一段可以传递的代码。更简洁、更灵活,使 Java 的语言表达能力得到了提升lambda 表达式是作为接口的实现类的对象(万事万物皆对象) 使用语法…...
Netty服务端和客户端开发实例
一、Netty服务端开发在开始使用 Netty 开发 TimeServer 之前,先回顾一下使用 NIO 进行服务端开发的步骤。(1)创建ServerSocketChannel,配置它为非阻塞模式;(2)绑定监听,配置TCP 参数,例如 backlog 大小;(3)创建一个独立的I/O线程&…...
linux基本指令和权限
目录 一.shell命令以及运行原理 二.Linux常用指令 1. ls 指令 2. pwd命令 3.cd指令 4. touch指令 5.mkdir指令(重要) 6.rmdir指令 && rm 指令(重要) 7.man指令(重要) 8.cp指令(重要&…...
滚蛋吧,正则表达式!
大家好,我是良许。 不知道大家有没有被正则表达式支配过的恐惧?看着一行火星文一样的表达式,虽然每一个字符都认识,但放在一起直接就让人蒙圈了~ 你是不是也有这样的操作,比如你需要使用「电子邮箱正则表达式」&…...
序列号和反序列化--java--Serializable接口--json序列化普通使用
序列化和反序列化序列化和反序列化作用为什么需要用途Serializable使用serialVersionUID不设置的后果什么时候修改Externalizable序列化的顺序json序列化序列化和反序列化 序列化:把对象转换为字节序列的过程称为对象的序列化。 反序列化:把字节序列恢复为对象的过…...
Java异步任务编排
多线程创建的五种方式: 继承Thread类实现runnable接口。实现Callable接口 FutureTask(可以拿到返回结果,阻塞式等待。)线程池创建。 ExcutorService service Excutors.newFixedThreadPool(10); service.excute(new Runnable01());另外一种创建线程池…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
6.9本日总结
一、英语 复习默写list11list18,订正07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语:复习l默写sit12list17&#…...
英国云服务器上安装宝塔面板(BT Panel)
在英国云服务器上安装宝塔面板(BT Panel) 是完全可行的,尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎,虽然官方主要面向中国大陆…...
