程序员编程效率的大敌:中断与上下文切换

news2025/1/16 3:48:45

程序员编程效率的大敌:中断与上下文切换

首先解释一下中断和上下文切换:

  • 中断: 编程时被打断, 比如被聊天软件/电子邮件/电话/当面打断等;
  • 上下文切换:即任务的切换,有自己主动切换,有伴随中断的新任务;

这两个是编程效率的大敌,程序员都很讨厌专注编程时被打断。至于到底影响多大,有文章专门对次进行了专门的深入分析:

  • 英文原文:Programmer Interrupted: The Real Cost of Interruption and Context Switching
  • 中文译文:【译】程序员中断:中断和上下文切换的实际成本

中断的成本与应对

软件开发是一个高度抽象的过程,需要高度的专注力。研究表明,中断后至少需要10-15分钟才能回到原来的工作状态。如果大脑中维护着很多逻辑和状态时被其他事物中断,而当前多段未完成的代码以复杂的方式组合在一起时,那么回到心流状态会更加的困难。

Friday Funny: This Is Why You Shouldn’t Interrupt a Programmer 这片文章里的漫画非常形象,也阐述了一个观点:

正如大多数开发者所理解的,当你致力于解决一个问题、研究一种新技术或者修复一个复杂的 bug 时,你的大脑正忙于处理许多可能的解决方案,并排除那些不可行的方案。最终,它会找到一个可行的解决方案。所有这些思考发生得太快,以至于没有时间写下任何东西,所以请不要因为我们没有在键盘上打字而打断我们。

但是,现实中你总是会被打断,尤其是国内的大厂,有些中断都是不可抗力。在知乎上看过很多程序员吐槽白天各种开会扯皮电话,以至于得晚上加班写代码。对于这个问题,我观察了周围技术高手的应对措施和大牛们的工作方法,就是写工作日志,写出关键思考和线索啥的就可以,帮助你从中断回来接着思考开开发。用个普通的editor纯文本写就行,我个人就喜欢用Sublime这个非常轻量快速的编辑器写,配合层次缩进非常好用。

上下文切换的成本与应对

当在复杂的编程任务之间切换时,返回到心流状态通常比从简单的中断事物返回更费脑力。完全切换到其他东西需要刷新大脑的缓存(短时记忆)并加载一个全新的上下文。这个过程需要时间、精力和精神能量,而这些能量是有限的。

如何快速重建上下文

对于程序员来说,在任务切换后重建上下文通常涉及回到以前编辑或调试过的旧代码。在开始编辑之前,程序员会导航到多个位置以重建上下文。

  • 不轻易关机甚至关相关的程序,任何打开的工作相关程序窗口都不要关,这基本已经是共识;
  • 利用心理学中编码特异性原理,创造相关任务相似的环境与条件,固定位置环境专心写代码;
  • 尽量提升短期记忆和工作记忆,通过关联前验知识加强记忆,加强对记忆分块与索引的能力;

编码特异性原理介绍:https://www.wikiwand.com/en/Encoding_specificity_principle

尽量的提升上下文密度

(1) 要让IDE/Editor尽量显示多的代码行,减少无效元素的干扰,增加对上下文有用的有效信息:

  • Jetbrains的新UI,简约聚焦: https://www.jetbrains.com/help/pycharm/new-ui.html
  • Jetbrains的 View --> Appearance --> Enter Zen Mode
  • VS code的 View --> Appearance --> Zen mode
  • Sublime的 View --> Enter Distraction Free Mode
  • VIM 基本天然就是偏向全屏幕,配合极致的组合快捷键

一张著名的照片是 John Carmack 在 1995 年使用 28 英寸 1080p 显示器制作 Quake。

Carmark28

为什么他会在 1995 年以大约 1 万美元的价格选择 45 公斤的显示器?更高的屏幕空间允许同时显示更多代码,从而产生更密集的上下文。当您能够存储和访问更详细的上下文时,工作效率会大大提高。这就像在为考试学习或执行任何需要使用来自公共领域的多个信息源的任务(例如解决难题)时拥有更大的桌子来存放文件。

(2) 将关键上下文信息钉在屏幕上,类似电视里常见的照片线索墙,术语Mosaic Investigation Wall

推荐一个屏幕截图工具: https://www.snipaste.com 。

把关键的资料,设计图,核心代码片段定在屏幕上。聚焦深度思考,开发review代码。类似的工具还有很多,我见过周围的同事基本都有类似的习惯,因为这真的非常有帮助,屏幕截图核心信息全部贴到关键的位置。

在开发复杂代码的时候,尤其涉及到非常多业务细节时,把关键的信息钉到屏幕上,充分利用屏幕所有空间,大脑一眼快速载入关键信息,或者在编程时需要参考是直接一眼就获取。非常有利于提高效率。

知乎这个问题:电视里整理线索时,会把钉在墙上的资料用线连起来,然后找到交汇点,是什么方法?专门讨论了这个,效果上也是增强了上下文密度,也用到了心理学中编码特异性原理,相似的环境中,大家一看照片线索墙,马上载入上下文进入状态。

总结

编程时:

  1. 尽量避免被打断,养成写工作日志的习惯,随时快速记录关键逻辑和线索;
  2. 尽量避免频繁切换工作内容,学会借助各种工具尽可能的提升上下文密度;

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

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

相关文章

C# 静态构造函数学习

静态构造函数用于初始化类中的静态数据或执行仅需一次的特定操作,静态构造函数将在创建第一个实例或引用类中的静态成员之前自动调用。 静态构造函数具有以下特点: 静态构造函数不使用访问权限修饰符修饰或不具有参数; 类或结构体中…

Proxmox VE 8 发布 - 开源虚拟化管理平台

Proxmox VE 8 发布 - 开源虚拟化管理平台 请访问原文链接:https://sysin.org/blog/proxmox-ve-8/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 宣布 Proxmox 虚拟环境的主要版本 8.0!它基于出色的 De…

SkyWalking--用代码手动获取traceId的方法

原文网址&#xff1a;SkyWalking--用代码手动获取traceId的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java项目如何用代码手动获取SkyWalking的traceId。 引入依赖 <dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-tool…

【PCB专题】如何使用Assign color在 Allegro 中快速区别不同网络?

在PCB Layout中经常要查看网络走线,比如电源路径是否合理,线宽是否合适,网络是否形成环路等等。一般我们使用的是高亮网络来查看。 困扰 如果是单一网络这样做是没有什么问题的,但如果是多条网络,就一种颜色会很难看清。就算不同的网络是不同的条纹,在布线比较密集的时…

JavaScript 手写代码 第三期

文章目录 1. 为什么要手写代码&#xff1f;2. 手写代码2.1 函数柯里化2.1.1 基本使用2.1.2 手写实现 2.2 sleep函数2.2.1 简单使用2.2.2 手写实现 2.3 Object.assign() 方法2.3.1 基本使用2.3.2 具体示例2.3.3 具体思路2.3.4 具体实现 1. 为什么要手写代码&#xff1f; 我们在…

ChatGPT底层架构Transformer技术及源码实现(三)

ChatGPT底层架构Transformer技术及源码实现(三) 贝叶斯Bayesian Transformer数学推导论证过程全生命周期详解及底层神经网络物理机制剖析 Gavin大咖微信:NLP_Matrix_Space 从数学的角度来讲,线性转换 其中函数g联合了所有头的操作结果,每个头的产生是采用一个f_att的…

RedHat红帽认证---RHCE

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; RHCE 1.安装和配置 Ansible 安装和配置 Ansible按照下方所述&#xff0c;在控制节点 control 上安装和配置 Ansible&#xff1a;安装所需的软件包创建名为 /home/gre…

认识区块链

文章目录 前言从交易说起线下交易&线上交易存在的隐患线上交易隐患引发的思考 货币发展史解决线上交易存在的隐患比特币的诞生比特币价值的产生 比特币&区块链 前言 我想大多数的 IT 人&#xff0c;即便不是 IT 人&#xff0c;或多说少都听说过“比特币”“区块链”这…

InceptionNext:当Inception遇到ConvNeXt

摘要 https://arxiv.org/pdf/2303.16900.pdf 受 Vision Transformer 长距离依赖关系建模能力的启发&#xff0c;大核卷积最近被广泛研究和采用&#xff0c;以扩大感受野和提高模型性能&#xff0c;如采用77深度卷积的杰出工作connext。虽然这种深度算子只消耗少量的flop&…

初识mysql数据库之数据库介绍

目录 一、什么是数据库 1. 数据库的概念 2. 为什么要有数据库 3. 数据库样例 二、 主流数据库 三、服务器、数据库和表之间的关系 四、mysql存储架构 五、sql语句分类 一、什么是数据库 1. 数据库的概念 如果大家现在已经安装好了mysql&#xff0c;想必大家应该也都知…

数字逻辑与模拟电子技术-部分知识点(1)——模电部分-半导体二极管,半导体的基础知识、本征半导体、杂质半导体、PN结的形成、PN结的特性、二极管的伏安特性

目录 半导体二极管 半导体的基础知识 本征半导体(经过加工处理) 杂质半导体 PN结的形成 PN结的特性 二极管的伏安特性 半导体二极管 半导体的基础知识 半导体器件的材料主要是硅&#xff08;Si&#xff09;、锗&#xff08;Ge&#xff09;和砷化镓&#xff08;GaAs&…

Airtest框架和Poco框架常见问题

Airtest 报告可以导出发给别人看吗 Airtest的报告是可以打包发给别人看的。 ① 想要导出报告发给别人观看&#xff0c;我们需要生成报告的命令中传入 --export 参数&#xff0c;这样就可以将 包含静态资源文件和图片文件的报告 导出到一个指定的文件夹内&#xff0c;之后直接…

Qt绘图(线条、椭圆、矩形、图片滚动)

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();//绘图事件void paintEvent(QPaintE…

XML系列篇之dtd约束

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于xml的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.XML 是什么 &#x1f4a1;辉辉小贴士&a…

STM32时钟系统

时钟 时钟是具有周期性的脉冲信号&#xff0c;最常用的是占空比50%的方波。 时钟是单片机的脉搏。 时钟树 HSE&#xff1a;高速外部振荡器&#xff0c;4~16MHz&#xff0c;&#xff08;晶体&#xff0c;陶瓷&#xff09;LSE&#xff1a;低速外部振荡器&#xff0c;32.768KHz…

ADC0808/ADC0809引脚图及功能和工作原理介绍

ADC0808芯片有28条引脚&#xff0c;采用双列直插式封装。如图所示&#xff1a; . . . 各引脚功能如下&#xff1a; 1-5和26-28&#xff08;IN0-IN7&#xff09;&#xff1a;8路模拟量输入端。 8、14、15和17-21&#xff1a;8位数字量输出端。 22&#xff08;ALE&#xff09…

深度学习代码环境配置(编译器, git, anaconda)

内容 编译器 gcc&#xff1a;GNU编译器套装C builderMicrosoft Visual C&#xff08;MSVC&#xff09;&#xff1a;微软的VC编译器MinGW&#xff08;Minimalist GNU on Windows&#xff09;&#xff1a;可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合&…

【设计模式】面向对象的设计原则

(一) UML 和面向对象设计原则 1. 一种某唱片播放器不仅可以播放唱片&#xff0c;而且可以连接计算机并把计算机中的歌曲刻录到 唱片上&#xff08;同步歌曲&#xff09;。连接计算机的过程中还可自动完成充电。 关于唱片&#xff0c;还有如下描述信息&#xff1a; &#xf…

ChatGPT底层架构Transformer技术及源码实现(一)

ChatGPT底层架构Transformer技术及源码实现 Language Model底层的数学原理之最大似然估计MLE及最大后验概率MAP内部机制详解 Gavin大咖微信:NLP_Matrix_Space 传统人工智能算法的真相(The Truth Under Traditional AI Algorithms),传统人工智能算法是相对于贝叶斯(Bayesia…