使用心理学的这五个技巧,在编程中找到快乐,获得持久动力并保持高效产出
如何在编程时保持持续高效的产出?如何喜欢上编程的工作,快乐编程?如何解决编程过程碰到的复杂难题?如何提升编程认知,提高编程能力?阅读本篇文章,可以找到所有这些问题的答案;了解并使用心理学的这五个技巧,在编程中找到快乐,获得持久动力并保持高效产出。本文内容包含以下几个部分:
1. 达到「心流」状态
2. 「深度工作」:集中精力,全神投入
3. 减少「选择」
4. 不要与自己的意愿(willpower)对抗
5. 同理心(Empathy)实践
6. 总结
像从事别的职业的人一样,程序员在工作中也会面临各种琐事、经常被转移注意力、长期跟不同部门斗争、心路历程常有波折。下面的五个技巧可以帮助我们在编程中找到快乐,获得持久动力并保持高效产出。
1. 达到「心流」状态
心理学家 米哈里·契克森米哈赖(Mihaly Csikszentmihalyi)在其著名的《心流:最优体验心理学》(Flow: The Psychology of Optimal Experience) 一书中指出,提升幸福感和效率实现的秘诀是达到一种称为「心流」(flow) 的最佳状态。
「心流」是指我们在做某些事情时,那种全神贯注、投入忘我的状态——这种状态下,你甚至感觉不到时间的存在,在这件事情完成之后我们会有一种充满能量并且非常满足的感受。其实很多时候我们在做自己非常喜欢、有挑战并且擅长的事情的时候,很容易体验到「心流」,比如爬山、游泳、打球、玩游戏、阅读、演奏乐器还有工作的时候。一个人在忘我投入应对并克服挑战的过程中,进入「心流」状态,可以更容易的学习到新的技能并应对更加复杂的挑战,最终达到不断提升自己的目标。
而为了达到「心流」状态,我们首先需要提升编程技能,使其与从事工作的难度两者之间获得平衡。需要:
- 提前学习技能 ✅
如果工作中需要新的技能(新的编程语言、编程技术等),不要等到工作需要时才开始学习,也不要寄希望于边工作边学习。应对挑战前掌握足够的技能可以避免或减少焦虑情绪,更有助于达到「心流」的状态。提前学习技能,确保自己具有应对项目挑战的足够能力。
- 首先使其工作,然后使其完美 ✅
从项目一开始就试图编写出完美代码的做法,会让工作变得艰巨,并很可能陷入困境。因此,项目初期尽量降低实现难度,在开始时只需编写出可以运行的首个版本,而不必过于担心性能等问题。首先使其工作,然后在后续版本更新中逐渐使其完美。
- 学会分解,分而治之 ✅
达到「心流」状态的另一个技巧,是将复杂问题或工作内容分解为许多子问题或子任务,更便于控制,也更容易实现。通过这些方法,可以提高自己编程的技能,降低挑战难度,从而进入到「心流」的工作状态。实际上,游戏设计师也会经常使用心理学上「心流」的这种技巧来吸引更多玩家;在设计游戏时,游戏难度与玩家技能相匹配,使玩家既不会感到沮丧,也不会感到无聊,从而带来更好的游戏体验。「心流」的工作状态,可以让我们在工作时找到玩游戏一样的感觉。
2. 「深度工作」:集中精力,全神投入
刚开始时,可能很难达到「心流」状态。在进入这样的状态之前,首先需要集中精力,全身心投入到工作当中。卡尔·纽波特 (Cal Newport) 在他的著作《深度工作:如何有效使用每一点脑力》(Deep Work: Rules for Focused Success in a Distracted World)谈到了「深度工作」的重要性。
「深度工作」:在指无干扰的状态下进行专注的职业活动,使个人的认知能力达到极限。通过这种状态下的努力可以不断创造出新的价值,提升专业技能,让我们变得独一无二、难被复制。
我们很多时候都处于这样一个状态:随时随地收发电子邮件、一个接一个地参加大小会议、在即时通讯软件的尖叫中手忙脚乱、在繁杂的多线程工作中不断地切换注意力……我们看起来非常忙碌,甚至在不自觉地享受这种忙碌,但我们的忙碌真的能转化为生产能力吗?卡尔·纽波特的研究指出,知识工作者 60% 以上的工作时间都花费在处理此类浮浅事务上,而这些工作不仅产出的价值有限,还会永久性地损害人们深度工作的能力!
为了达到「深度工作」的状态,需要:
- 为「深度工作」留出足够时间 ✅
首先,我们需要留出足够的时间进行「深度工作」。为避免分神,可以关闭计算机或手机上的所有通知。如果不擅长自我控制,可以尝试下面的时间管理方法:番茄工作法。
- 番茄工作法 ✅
可以使用「番茄工作法」,在「深度工作」时管理规划自己的工作时间。
1. 每天工作开始前,规划当天要完成的任务,并将任务逐项写在列表里
2. 设定你的番茄钟(定时器、软件、闹钟等),时间为 25 分钟
3. 开始进行第一项任务,直到一个番茄钟( 25 分钟)结束
4. 停止工作,并在列表里该项任务后画 X
5. 休息 3 ~ 5 分钟,活动、喝水、方便等
6. 开始下一个番茄钟,继续该任务。循环直到完成该任务
7. 每四个番茄钟后,休息25分钟
注意:不要对番茄时间安排太过严格。如果正处于「心流」状态,则在 25 分钟结束时不必强制休息。但在其他时间总是需要休息,后面对此会继续讨论。
通过这样的方法基本可以排除外部的干扰因素。但自己内在精神上的分心应该怎样应对?
- 有别的任务或想法干扰当前工作,先提交完成它们 ✅
在工作中,我们经常会因为有惦记其他未完成任务的想法而造成对当前工作的分心,无论这些未完成的任务重要与否。我们很多人有与生俱来的完成欲,要做的事一日不完结,一日不得解脱。这种跟当前工作不相关的想法会占据我们的短期记忆,造成一定程度的困扰,影响我们进入「深度工作」的状态。
感谢 蔡格尼克(Zeigarnik)所做的「蔡格尼克记忆效应」 相关研究。现在我们知道了:
实际上,我们并不一定需要通过完成这些未完成的任务,来说服大脑停止这样的想法。我们也可以通过类似阶段性代码提交并记录好后续事项,来让我们的大脑确信这些未完成的任务已经得到良好的照顾,从而可以把精力转移到当前工作中来。
每阶段性的完成一项工作,我们不仅应该将代码提交到代码库,还需要在适当的地方详细记录我们的想法,如后续步骤、待办事项等。通过这样的做法,帮助大脑克服「蔡格尼克记忆效应」。
3. 减少「选择」
我们每个人每天都要面临很多选择,而当选择过多时,反而不利于做出明智的决定。在工作中,这些选择同样会干扰我们进入「心流」的工作状态。巴里·施瓦茨(Barry Schwartz)在其著作《选择的悖论》(The Paradox of Choice)一书中解释了过多的选择是如何导致焦虑的。从购物到职业选择再到恋爱,他列举了很多的例子,表明减少选择不仅可以提高我们的生产力,而且可以提高我们的自由度,并使我们更容易享受当下的生活。
虽然巴里·施瓦茨主要研究的是购物相关的行为,但这对程序员所进行的编程工作同样也是适应的。程序员在工作中需要使用一些技巧来适度减少「选择」的机会。
- 选择编程语言或编程框架时考虑一下「选择」的问题 ✅
许多人喜欢 Go 语言,因为很多时候做一件事情只有一种方法(例如在写循环代码时)。同样,人们讨厌 Perl 语言的原因之一是做同样一件事情,可用的方法太多。因此,在选择编程语言或编程框架时,考虑一下灵活性与限制性的利弊。如果做一件事情只有一种方法时,自然也就无需担心这种方法是不是符合最佳实践。
- 预先收集基本的资料信息 ✅
程序员通常需要查找示例代码或文档来完成工作。这不仅导致频繁的上下文切换,而且还增加了选择示例代码或 API 的工作负担。因此,在相关工作开始前就收集好必要的资料信息,避免在工作时频繁 Google 并严重依赖这样的操作来做相关决定 。
- 编写代码之前先进行详细设计 ✅
在开始编写代码之前,先进行详细设计,对重要问题预先做出决策。这可以让我们在编写代码过程中专注于解决手头的问题,而不是浪费或分散精力进行其他决策。
如果有拖延症,或在某个问题上卡壳了,这些情况怎么办?
4. 不要与自己的意愿(willpower)对抗
对很多特别成功的人所做的研究表明,成功不是靠强大的意志力和能力去克服阻力,而是在灵活的工作环境中首先考虑如何避开阻力的结果。
下面有一些技巧可以帮助你避免与自己的意愿对抗。
如何避免拖延症?
与其强迫自己做一些自己不想做的事情,不如尝试找一种既让自己喜欢又能推动项目进展的方法。
- 制定一个明确的目标 ✅
拖延的主要原因是因为给自己定的目标不明确。详细写下要做什么,何时何地具体做什么事情,制定一个明确的有可行性的目标。如果做一件事情缺少足够的细节,大脑通常会认为这件事情难做,并以拖延来应对。一个明确的有可行性的目标可以战胜拖延的意愿。
- 一个任务完成后,马上开始下一个 ✅
通常人们在完成一个任务的当天会休息一下,然后在第二天开始下一个任务。但是,在完成一个任务的当天,开始下一个任务并取得一些进展将是一个更好的主意。因为第二天开始工作的时候,你会有更强的信心来应对这个新的任务。这将有助于克服拖延症,因为人们通常拖延是因为一件事情还没开始。在读书时也可以试试这样的技巧。即便你完成一章节后仅仅阅读了下一章节的第一页,也比这一页不读的情况,有更大可能让你再次拿起这本书继续阅读。
碰到难以解决的问题怎么办?
与意愿类似,很多情况下我们也不需要跟久难解决的问题死磕。试着调整一下自己的思路,有时候解决问题的办法会在你不经意间以令人惊讶的方式自动出现!
- 离开电脑桌,出去走走 ✅
从过度关注的问题上离开,让大脑休息一下。这有助于我们的大脑以更有成效的方式来处理问题。当我们去散步,洗个澡或打扫房间时,大脑会以另外一种方式处理这些还未解决的问题。有的时候,你离电脑远一些,更能找到解决问题的答案。
- 该睡的时候安心睡吧 ✅
晚上回家,不要还想着解决未解决的问题,你需要的只是好的睡眠。睡眠时潜意识将对此起作用,在深夜或早晨醒来时也许就找到了答案。
- 尝试处理其他问题或其他工作 ✅
与其跟难题死磕无果,不如将精力转移到其他工作。很多时候,给大脑留些时间,答案终会出现。使用这种方法,可以同时处理不同的事情,也能避免给自己精神上带来困扰。还是缺少点什么。生活因为人的情感而变得美好。编程也是。
5. 同理心(Empathy)实践
同理心指的是一种能深入他人主观世界,了解其感受的能力。同理心是一项重要技能,在生活和工作中可以给人带来更多的成功机会和幸福指数。在编程中也要进行同理心实践,进行换位思考。编程不仅仅有逻辑,它也像艺术作品一样富有表现力。
- 编写可维护的代码 ✅
我们需要记住,我们编写的代码也将会被别人读取和维护。
程序必须写得能供人阅读,机器执行只是附带。
Programs must be written for people to read, and only incidentally for machines to execute.
—— Harold Abelson《Structure and Interpretation of Computer Programs》
编程过程中遵循编码风格的最佳实践,如使用有意义的变量名,使用短函数(small method)等。在你的代码里不应该出现这样的注释 :-)
// When I wrote this, only God and I understood what I was doing
// Now, God only knows
编写可读性好的代码,让其他开发人员容易理解,以便于维护。记得写必要的有用的注释。这是我遇到的一段的有趣的注释 :-)
//
// Dear maintainer:
//
// Once you are done trying to 'optimize' this routine,
// and have realized what a terrible mistake that was,
// please increment the following counter as a warning
// to the next guy:
//
// total_hours_wasted_here = 42
//
- 使用简单明了的设计 ✅
无论在设计 API 或在设计用户界面时,都考虑使用简单明了的设计让用户能够轻松自如的应对。可以遵循这样的基本原则:
Simple things should be simpler. Complex things should be possible.
—— Alan Kay
同理心实践不仅可以帮助个人,也可以让开发团队更富有成效,并让用户满意。
6. 总结
你可能已经使用过这些编程的技巧。了解这些技巧背后心理学的原因可以帮助你更好的实践。
如果你正讨厌编程或正考虑退出编程,使用这些心理学的技巧也许可以改变你的想法,让你成为一名快乐、高效的程序员。
从心理学的角度看编程,你更能欣赏到编程之美并喜欢上编程这么艺术。
感谢阅读。如果喜欢这篇文章,顺手转发一下,让更多的人能够看到;并在评论中分享你的想法。
了解更多家庭教育方面的信息,请参考:
家庭教育方法:关于儿童如何学习的背景思考
决定孩子成功的关键是什么?家长应该注重孩子哪些特质的培养?对于孩子的学习,家长应该更注重结果,还是过程?
青少年必备书单:最适合孩子阅读的 100 本经典图书;少儿书单;儿童必读书籍;少儿图书推荐;青少年必读图书
了解互联网安全方面的信息,请参考:
家长互联网安全指南(一):关于互联网安全你了解多少,如何保证孩子在互联网上的安全,你知道网络安全专家会怎么做吗?
家长互联网安全指南(二):关于互联网安全你了解多少,如何保证孩子在互联网上的安全,你知道网络安全专家会怎么做吗?
扫码下面二维码,关注我们的公众号,阅读最新文章或观看更多视频教程:
英文原文:Want to become a Happy and Productive Programmer? Use these 5 techniques from Psychology
编译制作:校外课 | 少儿编程