如何从错误中成长?
在上一篇文章“技术人的犯错成本”里,我和你聊了技术人可能会犯的各式各样的错误,也举了很多例子,说明了技术人犯错的成本。在竞争激烈的互联网时代,试错当然是好事,但了解错误成本,避免不应该犯的错误,最大可能地从错误中成长,才是我们应有的态度。
我之前看过一篇文章,其中把错误分成四类。
第一类:伸展错误(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());另外一种创建线程池…...

Hive与HBase的区别及应用场景
当数据量达到一定量级的时候,存储和统计计算查询都会遇到问题,今天了解一下Hive和Hbase的区别和应用场景。 一、定义 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能&am…...

C++之单例模式
目录 1. 请设计一个类,只能在堆上创建对象 2. 请设计一个类,只能在栈上创建对象 3.请设计一个类,不能被拷贝 C98 C11 4. 请设计一个类,不能被继承 C98 C11 5. 请设计一个类,只能创建一个对象(单例模式) 设计…...

Redis十大类型——Set与Zset常见操作
Redis十大类型——Set与Zset常见操作Set命令操作简列基本操作展示删除移动剪切集合运算Zset基本操作简列添加展示反转按分数取值获取分数值删除分数操作下标操作如果我们对Java有所了解,相信大家很容易就明白Set,在Redis中也一样,Set的value值…...

车载雷达实战之Firmware内存优化
内存(Memory)是计算机中最重要的部件之一,计算机运时的程序以及数据都依赖它进行存储。内存主要分为随机存储器(RAM),只读存储器(ROM)以及高速缓存(Cache)。仅仅雷达的原…...

【剑指Offer】JZ14--剪绳子
剪绳子详解1.问题描述2.解题思路3.具体实现1.问题描述 2.解题思路 首先想到的思路:因为是求乘积的最大值,所以如果截取剩下的是1,那还是它本身就没有意义。从此出发,考虑绳子长度是2、3、4、5…通过穷举法来找规律。 值–》拆分–…...

raspberry pi播放音视频
文章目录目的QMediaPlayerGStreamerwhat is GStreamer体系框架优势omxplayerwhat is omxplayercommand Linekey bindings运行过程中错误ALSA目的 实现在树莓派下外接扬声器, 播放某段音频, 进行回音测试。 QMediaPlayer 首先我的安装是5.11版本。 优先…...

【电子学会】2022年12月图形化二级 -- 老鹰捉小鸡
老鹰捉小鸡 小鸡正在农场上玩耍,突然从远处飞来一只老鹰,小鸡要快速回到鸡舍中,躲避老鹰的抓捕。 1. 准备工作 (1)删除默认白色背景,添加背景Farm; (2)删除默认角色小…...

C++的双端队列
双端队列介绍1.双端队列知识需知2.大试牛刀1.双端队列知识需知 由于队列是一种先进先出(FIFO)的数据结构,因此无法直接从队列的底部删除元素。如果希望从队列的底部删除元素,可以考虑使用双端队列(deque)。…...

【独家】华为OD机试 - 拼接 URL(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...

为什么使用Junit单元测试?Junit的详解
Hi I’m Shendi 为什么使用Junit单元测试?Junit的详解 Junit简介 Junit是一个Java语言的单元测试框架。 单元测试是一个对单一实体(类或方法)的测试 JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression test…...