《代码之外的生存指南》读书笔记

Posted by 皮皮潘 on 10-19,2022

职业规划

  1. 核心——“工作是属于公司的,而职业生涯却是属于你自己的”

  2. 我们不能将自己看作一个只是为公司打工的领着固定薪酬的劳动力,我们需要将自己看作是企业自身,并向客户出售自己的产品或者服务(所有的企业都是通过产品或者服务来收益的),作为程序员虽然我们可能可以出售数字产品这种产品,但是更多情况下我们是在出售服务——将一个想法转化为数字化产品的服务。正如更好的服务才能吸引到更多的客户,我们也需要努力提升我们的服务并且营销我们的服务(企业会花费很大的精力去营销他们的产品,从而让客户自己找上门来,我们也应该这样),另外在提高我们的服务的时候,我们需要思考专注为哪一特定类型的客户提供哪样特定的服务。

  3. 我们需要为自己的职业生涯规划一个大目标——成为CTO、成为一个十几人的小团队的技术leader、成为技术管理或者开发自己的技术产品然后自己开办企业。在有了明确的大目标之后我们才有了前进的方向,接下来就是将大目标拆分成多个里程碑,再针对每个里程碑规划实现的小目标。在往目标迈进的过程中,我们需要时不时地检查和调整我们的小目标或者里程碑,从而保证没有偏航

  4. 软件开发的职业生涯发展主要有三种:

    1. 雇员:为一家公司工作并只向一个老板负责,可以看到明确的发展路径,但是并不具有自由时间,同时薪资会有一定的天花板
    2. 咨询师:为多家公司工作并向多个老板负责,具有相对自由的时间且比较高的薪酬,但是可能会非常累,而且需要一定的人脉基础
    3. 创业者:自己做老板,具有绝对的自由、最高的收益但是也具有最大风险
  5. 我们需要学会如何与人打交道,在处理人际关系时我们需要注意以下几点,更加具体的学习可以阅读《人性的弱点》:

    1. 每个人都觉得自己很重要,如果能在交际的过程中让他感受到这点,那么他会享受与你交际的过程
    2. 尽量不要批评他人,更多的应该是表扬,才能激励事情做的更好
    3. 要学会换位思考,进而明白怎样才能吸引别人的注意力并接受自己的方案
    4. 避免陷入争论,在不重要的时候可以主动低头与认错
  6. 尽量让领导感觉到一种“你是那种自觉主动地能找到要做什么的人,同时你也能自觉主动地知道该怎么做的人”,我们可以通过主动记录每日任务,定时发周报给上级汇报,主动找一些没有人愿意负责的活来达成上述效果,我们需要记住一点——金钱往往与责任成正比

学习

  1. “教育就是当一个人把在学校所学全部忘光之后剩下的东西”——爱因斯坦

  2. 自主学习过程:(学习 —— 实践 —— 疑问 —— 回顾 —— 解决 —— 教导) —— 反复

  3. 学习方式:在很多情况下,我们去学习某一些技术的时候,我们喜欢去买一些著作,然后”从封面到封底“地进行阅读(虽然很多时候可能是从封面到目录^^),最后掌握了某项技术。这无疑是一种常见的也是有用的学习路径,但是它的效率往往会比较低下,因为对于我们而言,需要掌握一门新技术并应用于实践的时候,我们其实只需要学会它 20 % 的内容,就可以应用于 80 % 的场景(著名的二八定律),剩下的 80 % 的内容可能往往只是细枝末节但是却可能将真正有用的东西淹没在其中。因此,在真正学习前,我们可能需要花费一定的精力去做好事前工作,也就是去弄明白对于我们而言真正重要的那 20 % 是什么,然后着眼于这 20 % 去收集相应的资料,不一定得是整本书或是整个文档,可能是其中的一些章节或者一部分,然后再针对这 20 % 的内容进行深入了解,从而实现”聚焦学习范围,关注重点内容“地学习

  4. 九步学习法体系:

    • 第一步:了解全局

      在开始一个主题技术的学习之前,我们可以先通过维基百科、官方文档等方式,对于这个主题整体有一个大概的了解,明白有哪些分支,每个分支聚焦于什么,可以用来解决什么问题,从而避免”未知之未知(不知道自己不知道)“的情况——某个问题的解决方案,可能可以基于对应主题技术下的某个分支快速的实现,但是由于自己不知道那个东东,因此只能用自己了解的局部的东西去绕远路式地解决

    • 第二步:确定范围

      我们不可能在短时间内直接学会一个主题技术全部的东西,在大多数情况下,也没必要去学会全部,因此我们要学会确定具体的学习范围,比如:在 Spring 框架中,我们可能想学会它的启动方法、依赖转置、常用注解等,但是对于 AOP、自动注入、工厂 Bean、Spring Cloud 等概念则不再我们的学习范围内

    • 第三步:定义目标

      为了验证我们学习到的知识是否已经足够,我们需要为我们的学习定义一个目标从而作为验收标准(和 Scrum 中每一个用户故事的 How to demo 比较像),比如:学会 Spring 框架的目标是熟悉 Spring 中的常用概念,并且可以使用 Spring 框架将自己原来一个用原生 Java 实现的 Web 应用进行重构,除此之外,通过定义目标也可以反过来去明确在第二步中确定的范围,定义目标与确定范围两个步骤往往相辅相成

    • 第四步:寻找资料

      在定义了目标之后,我们需要去寻找能够支持我们学习的资料,我们不应该局限于单本书,或者单个视频集,我们应该从多个维度出发,在开始阶段去尽可能多地收集和寻找资料,常见的资料源包括:1. 书籍 2. 视频 3. 博客 4. 官方文档 5. 源代码 6. 示例项目 7. 专家

    • 第五步:创建学习计划

      对于大多数技术而言,各个概念都不是呈现碎片化知识的方式展示的,而是通过一定的脉络与逻辑联系在一起的,而这也往往与各个资料的目录相对应,因此我们可以通过整理收集的资料,找到一条最符合个人逻辑的概念模块与学习路径,然后制定相应的学习路径

    • 第六步:筛选资料

      针对我们第四步收集的资料,我们必然是没有时间去读完它们的,读完一本书的时间可能都要好几天,更遑论那么多的资料,因此我们要做的就是对于资料进行筛选,结合我们创建的学习计划中每一个模块挑选最适合的资料进行学习,或者是否有哪些特别优质的资料可以完全覆盖我们的学习计划,那么就可以根据对应的资料进行学习了

    • 第七步:开始学习,浅尝辄止

      当我们开始学习的时候,我们很容易失去自控力,往往会陷入想要一下子就把所有的资料都学完的漩涡里,但事实上,学习那些能够让我们动手操作的最小知识集然后立马去动手操作,可能才会更高地提高效率

    • 第八步:动手操作,边做边学

      当我们为了实现目标,开始操作的时候,我们会产生大量问题:这一步该怎么做,为什么我要这么做,如果那么做会怎么样,然后我们势必会试图解决这些问题,而解决问题的方法往往就是回到之前的资料中进一步的学习,但是相较于直接学习,以问题为导向的学习能够进一步地提升我们的效率摒弃那些对于我们而言不重要的知识,同时也在解决问题的时候给我们带来真正的成就感

    • 第九步:教学相长,融汇贯通

      很多时候我们以为我们自己学会了,当时我们给别人讲解的时候却发现不能很好的将知识点组织起来给别人讲明白,甚至发现自己回答不了别人的问题,这个时候就代表我们可能并没有学习到位或者说我们只是懂了但是没有转化为我们自己真正的知识,通过给别人讲解明白可以进一步地提升我们对于对应知识地理解并转化为自己真正地知识

  5. 输出倒逼输入:在很多情况下,我们会发现我们在看书的时候,一本书看完了然后就完了,书中讲了些什么东西好像有些印象但是具体说说又说不出来,等于白看,这种情况往往是因为我们只是在一昧的输入,也就是从书中学习东西,但是并没有通过输出去将学习到的东西进行强化。因此在学习的时候一定要注重使用输出倒逼输入,通过记笔记(不要简单的划线或者复制,要整理成自己的表述)、写博客、动手操作、主动教别人的方式,将学习到的东西进一步的强化,从而达到真正学习的目的

生产力

  1. 专注:做任何一件事只有进入了心流状态才可以保持专注,从而减少外界对自己的打扰,进入专注状态往往很难,但是一但强制自己进入某个专注状态 10 分钟以上,就会比较容易地维持这样一个状态,反之则容易从对应状态滑落
  2. 工作计划:工作计划主要包括:1. 季度计划;2. 月计划;3. 周计划;4. 日计划。季度计划与月计划主要是粒度比较粗的整体目标,真正落地还是着眼于周计划于日计划,一种具体方式是使用 Kanban Flow 建立一周计划,并把任务划分到每天上,在 Kanban 中除了 7 天对应的 7 列,额外增加三列,分别是:1. 当天 2. 已完成 3. 下周计划。在每周开始的时候,安排好这周的 Kanban,在每天开始的时候将今天需要做的任务,排一个优先级并且放置到当天对应的一列中。需要注意的是,每天的目标是”完成 X个番茄钟”,而不是“完成 X 项任务”,因此不要有“赶工”事件发生,做不完的就放到明天或者下周,我们只需要保证每天全力以赴地完成了预定地工作量就行了,事情没有做完是因为我们的计划安排、对自己能力的预期以及对计划的难度估计有问题,需要进一步调整
  3. 休息和休假:除了工作之外,我们偶尔也需要休息一下,一种好的方式是把某几周称之为“无工作周”,在这几周中不使用番茄钟,也不会把整周都排满,但是也需要工作,只不过在无工作周里主要做一些自己喜欢的工作,比如某些 DIY 软件
  4. 番茄工作法:一个番茄钟对应工作 25 分钟 + 休息 5 分钟,同时对应当天计划中的一项任务,每 4 个番茄钟后都需要休息一段时间,通常为 15 分钟。番茄工作法不仅仅只是让人陷入专注状态,它更多地用作估算和评估工作的工具。通过追踪自己在一天内完成了多少个番茄钟,以及为每天要完成地番茄钟地数量设定目标,才可以用能力去真正评估自己每日工作地努力程度,也能知晓自己的工作能力。使用番茄工作法,可以把每周看作是有限个番茄钟组成的,从而可以确切地估算自己一周可以完成多少任务,并设置任务的优先级
  5. 定额工作法:对于一些可能每周都要重复几次的日常任务而言,我们可以采用定额工作法:1. 挑选一项重复性工作;2. 明确有效时限,在此期间该任务被重复执行;3. 明确在给定的有效时限内该任务应该完成的次数的定额;4. 给自己承诺一定要完成定额,否则就会导致定额工作法付之一炬。定额工作法也可以看作是培养自己惯例的一种好方法
  6. 自我驱动力:一个人做事主要有两大动机——外部驱动力和自我驱动力,后者相较于前者有效的多,而自我驱动力的本质是对自己要做的事情有责任感或者有兴趣点,前者更为可靠与长久,责任感会促使我们去做一些如果我们可以自主决定是绝对不会去做的事情,保持责任感的一种方式就是为自己的生活进行规划和制定规则并且履行对应的规划,但有时候只对自己负责的时候很容易违反自己制定的规则,在这种情况可以考虑请志同道合的人彼此监督和强制执行这些规则
  7. 多任务并行:多任务并行一般都很糟糕,因为我们并没有多任务并行的能力,表面上的多任务并行其实本质上是不停的任务切换,而任务切换地越多,各个任务地效率就越底下,因为这代表我们的大脑无法专注于做某一项任务并且需要花费一定的时间在任务切换上(和操作系统的多任务并行很像),因此对于一些会偶尔打断我们工作的事情,比如:微信、QQ、电话等,最好每天专门抽几个时间段进行批量处理,而不是立即处理,并且在工作期间采用番茄工作法,一个番茄时钟只做一件事而不要分心。真正能并行的任务一般是一些关注点不尽相同的任务进行组合,比如:一项不费脑筋的任务和一项一定程度上需要精神专注才能完成的任务组合,就像看书的时候听音乐,健身的时候听有声读物等
  8. 时间规划:一些常见的时间杀手包括:看电视、社交媒体、新闻网站、不必要的会议、烹饪、打游戏、看小说等。我们需要追踪自己的时间,来看看每天时间的确切去向,从而找到真正的时间杀手并尽量的压缩对应的时间从而保证我们能完成我们承诺的任务,在完成了承诺的任务或者每日限额工作量的任务的情况下,我们可以合理地安排我们的时间去做一些我们喜欢的事情,但是需要保证那个确实是喜欢的,并让我们快乐的事情,而不是无意义地消磨时间
  9. 任务分解:完成一件大任务的唯一手段就是将它分解为一件件小任务,然后一件件地完成他们,这和 Scrum 敏捷开发的思想开发很像——多次迭代优于一次完成,在把大任务分解为小任务的过程中,我们要保证每一个小任务都有明确的目标,如果没有的话,那说明我们遗漏了一些关键信息,并需要想办法把他们找回来

参考指南

《软技能2 —— 代码之外的生存指南》