程序猿划水指南

402 阅读10分钟

程序猿划水指南

20 世纪中叶,艾伦·图灵为了减少人类生产中机械重复的活动, 创造了计算机的原型--图灵机

turing

当下,很多同行却在使用计算机来做重复的机械的编码活动。
如若我们不提高自身的工作效率和工作手段,接踵而来的就是无尽的加班、疲惫的身心,枯燥的生活。
那么,有能让我们能提高工作效率,每天愉快的“划水”的办法吗?
我认为答案是肯定的,接下来我分享在平日工作中所用到的办法和它们背后的原理。

提升阅读代码的效率

在我们平日的工作中,有件事一定是躲不过的,那就是阅读源码。
我们可能是通过源码学习新内容,或是探究原理,又或是去修复bug。
但是,很多人或多或少的都会遇到这样的问题,那就是看的过程中非常迷茫,每一个在屏幕上出现的字母,你都想去弄懂他到底是代表了什么含义。结果,花了大把时间却不得要领。
其实,学术上用认知过载来描述我们遇到的这种状况。

confused

接下来,我们一起来看看,到底什么是认知过载。

什么是认知过载

认知过载是指你的工作记忆(或短期记忆)所能处理的信息总量。 当你的工作记忆所接收到的信息量超过了你所能顺利处理的信息量时,认知超载就会发生,同时会导致无效的决策。 上世纪 80 年代,澳大利亚教育心理学家 John Sweller 在教学设计的研究中开始研究认知相关领域内容。
他的工作成果最终整理成Cognitive Load Theor,Learning Difficulty, and Instructional Design(PDF)
虽然这些策略最初都是被应用于教育领域,但这个理论有更宽泛的应用场景。
比如,航空公司就把这个概念应用到他们的飞机和航天飞机上。
如果在这些高风险的环境中,飞行员的大脑处理太多的信息,那么这些信息可能导致致命的后果。
虽然,在我们看源码的过程中没有这么高的风险,但是,避免认知过载会减少我们阅读源码的时间,同样是挽救了我们可能会浪费的生命。
认知过载的理论中,将我们认知中的负荷分成了下列的三种类型。

  • 固有负荷:是内容本身的复杂性。内容越具有挑战性,学习者就越有可能遭受过度的认知负担。
  • 外来负荷:在进行学习和认知过程中需要排除一些不需要的内容所带来的认知负担。
  • 相关负荷:是指理解可以帮助学习者认知需要的信息的信息所带来的负荷。

我来分享一下,我在阅读代码的过程中会通过什么样的方式来避免这三个维度的负荷过载。

overload

怎么避免阅读源码中的认知过载

  1. 专注核心调用链:一般情况下,方法名和变量名已经说明了某行代码具体的行为和动作;除非是核心方法,请不要再进入下一层阅读,这样会导致内容本身的复杂性陡升。
  2. 阅读方法或注释中的 Example:在成熟的开源项目的源码中,方法和类上都会有比较详细的注释。但是,直接通过上面的 Example 去了解的话,会更快,也能避免相关负荷过载。
  3. 关闭 IDE 上不需要的源文件和功能的子窗口:关闭 IDE 中不需要的窗口可以减少外部信息对阅读源码带来的外来负荷增加。

我相信,在尝试上面三个方法后,你阅读代码的功力肯定能更上一层楼。 不过我这还有一个办法也能避免认知过载,那就是去提前储备数据结构、设计模式、编译系统等的相关概念。 因为,成熟开源系统的代码贡献者一般都会有比较强的相关方面的知识。 当他们在编写代码的时候应用这些知识信手拈来,但是,当你在阅读代码的时候没有这些相关知识做铺垫。 那可能第一行代码就会让你出师未捷身先死。

时间管理

勤奋不一定有好报,要聪明地工作。

busy

你曾经有没有这样的感觉:

  • 上班开始就都在忙,下班遥遥无期。
  • 功能没少做,代码没少写,bug 也没少修,可是领导就是不满意。
  • 除了上床睡觉就没有其他时间是自己的,睡着后还他么的可能被电话喊醒


没有谁愿意用这种方式去工作。

时间四象限法

时间四象限法,是美国的管理学家科维提出的一个时间管理理论。 把工作按照重要和紧急两个不同的程度分为四个“象限”:

  • 既紧急又重要(如客户投诉、即将到期的任务、财务危机等)
  • 重要但不紧急(如建立人际关系、人员培训、制订防范措施等)
  • 紧急但不重要(如电话铃声、不速之客、部门会议等)
  • 既不紧急也不重要(如上网、闲谈、邮件、写博客等)

time.jpg

时间四象限法的应用

优先排序:

receive_task
当有新的任务分配给你的时候,你不要去立马就开始做。你应该先将新的任务放到任务列表中进行排序。

屏蔽打断

在程序猿的写代码的过程中,大忌就是中途打断思维。 当我进行深入思考或者编写复杂代码的时候,会屏蔽外界对我的打断。 最通常的方式就是,退出所有的通讯软件,关闭手机,找一个没有人会找得到你的地方。 如果找不到这个地方,如果有人来找你的话,让他们将需要跟你沟通的内容通过Email 或者是在通讯软件上留言。

任务分流

distribution
其实,并不是所有任务都需要你一个人来完成。 当你在非常大负荷的状态下进行工作,本身效率是非常低的,而且错误率会陡然上升。 这时候,你应该找到领导或者同事将一些任务进行分流。 当在正常负荷之下工作,你才能提供最高的工作效率和最低的错误率。

刻意练习

每个人在刚刚出生的时候是什么都不会的,我们大多数的生存和生活的技能都是通过后天慢慢学习而来。 但是,大多数人为什么有着一样的先天资质,却比同龄人有着更加优秀的能力呢? 其实,那是因为优秀的人中的大部分,在有意识或无意识的在进行着刻意练习。 如若我们能将生活和工作中所使用的技能用的更为熟练时,想必我们就有更多的时间能够用来“划水”了。

刻意练习能干什么

我们先从刻意练习能给我们带来什么说起。 理论的发现者心理学家安德斯·艾利克森,通过一个实验来证实刻意练习能给带来什么效果。 每秒读一个随机的数字,然后让你最后复述出来。 普通人在完全没有经过训练的情况下只能记住 7-9 个数字。 但是,安德斯·艾利克森针对一个实验对象通过刻意练习来记忆数字。 2 年后,实验对象能成功的复述出 82 位数字。 接下来就跟着我一起,了解一下是什么样的练习让一个普通人变的这么厉害

什么是刻意练习

让我给大家总结一下,刻意练习有这些特征:

刻意练习是发生在舒适区以外的

学习被分为了三层

  • 舒适区:已经完全掌握的区域,没有学习难度的知识或者习以为常的事务。

  • 学习区:还没有完全掌握的区域,对你来说有一定挑战,感到不适,但不至于太难受。

  • 恐慌区:超出自己能力范围太多的事务或知识,心理感觉会严重不适,可能导致崩溃以致放弃学习。

Comfortable

刻意练习是发生在学习区的; 因为舒适区对于你来说太轻松了,什么都练习不到; 但是,恐慌区又太过于困难,无法坚持下去。 这就像是我们在写代码一样,如果你刚学了一门语言,就让你去做一个非常困难的业务,那你肯定是什么都做不了的。 但是,如果让你去做不那么容易,但是却还是能继续坚持下去的业务,那么你肯定是能在这个过程中学习和提升。

刻意练习需要明确的目标和精确的计划

为了能去有效的练习我们的技能,我们必须是有目标的和有计划的。 如果只是和《异类》中所提到的单纯练习 10000 小时,就希望能达到效果的话,那结果肯定是令人失望的。

刻意练习需要有效的反馈

在进行刻意练习时,有效反馈非常重要,因为你可以及时调整和改进。
反复做一件事情的目的在于找出不足,并进行改善和提高。不断进行自我检测,获得有效反馈,并及时进行改进和调整,才是真正的刻意练习。

1.01

总结

我认为工作是需要尽可能用最佳的性价比去完成他,单纯的无目的的加班、盲目的在一个方向的投入过多的资源,这些是对生命和时间的浪费。
从古至今的劳动者和生产者都视图用各种各样的方式来增加单位时间下的生产效率。
上到国家的历法军事兵法,下到百姓生活中的二十四节气、度量衡、成语;人类进化的历史长河之中就是在不断优化工作方式、总结方法、提炼指导思想。 虽然,软件工程和其他行业比起来还非常的年轻,不过我们依然在不停的用各种方式来提高我们的工作效率。
敏捷思想、极限编程、TDD、DDD、六边形架构、设计模式等等,这些不也是行业翘楚们在生产生活中不断的积累总结和提炼的么。 程序员是一群爱学习的人,只要我们去找到适合自己的方法,一定也能让加班越来越少,代码质量越来越高,工作越来越出色。

参考文献