透过用户思维谈程序员的进阶之路

470 阅读17分钟

最近读了一本关于产品的好书 《用户思维+ 好产品让用户为自己尖叫》,虽然是一本产品相关的书,但是全书都在围绕如何让你的用户变得更优秀展开讨论。作者的观点很明确也很独到,可持续成功的产品都是由推荐(口碑传播)产生的。而激发这些推荐的是用户对自己的感觉,也就是我们的产品或服务帮助他们做了什么或成为什么样子。这可能也是知识付费这几年火热的原因之一吧。

这本书的作者可谓将用户思维挖掘到了极致,这一点在此书中随处可见。可以这么讲,这本书本身就非常的用户思维,在关键的观点或知识点上,总是配有恰到好处的生动插图,读起来毫不费劲,想象一下《Head First》系列图书的画风。奥对了,这本书的作者Kathy Sierra就是Head First系列图书的策划人之一。

我在读这本书的时候,更多的是将自己当成了书中的用户。所以读完之后最大的感触就是,我能不能运用书中讲的这些让自己变得更优秀呢?毕竟用户思维就是一切从用户出发。思考过后,我觉得是可以的。从这个角度而言,这本书已经超出了讨论如何做好产品的范围,着重的是用户思维中的思维这两个字。而这种思维就是译者序中提到的成长型思维模式。这也是我写此文的目的,希望这种成长型思维能对自己的进阶之路有借鉴意义。如果能对大家也有所帮助,那就再好不过了。

如何做到保持理想成长曲线呢?

用户理想成长曲线:

mark

若是顺着成长曲线向右上方移动,最终我们将达到专家(某一领域)的高度。但其实我们大多数人只是想变得更好一些而已,一点点进步就会非常明显。那么如何做才能顺着成长曲线向右上方快速移动,甚至接近理想曲线呢?或许可以从专家身上找到答案,首先我们需要了解一下什么是专家?

专家不只是指他们知道什么。重要的是,他们能将已有的知识应用到实践中。而且,他们可将这一过程一次次地重现。在一个领域中,给定一项具有代表性的任务,专家的完成情况更好、更可靠。

然后我们再来看看专家是如何做的?

  • 持续不断地构建技能
  • 保持渴望成功的愿望

持续不断地构建技能

构建技能

要想具备专业能力,就必须构建专业技能。技能的构建就是将一项技能由“不能做”移动到“能做”。能做又划分为两种类别:费力(不可靠)和精通(可靠、已内化)。

我们设想中的技能构建过程可能是这样:

mark

但是,这不是一条通向高水平专业能力的有效途径:

mark

我们看一下专家是如何做的:

mark

  • 专家从不停止增加新的技能。
  • 专家既有意识地构建技能,也无意识地构建技能。
  • 专家会改进现有的技能。

我们应该格外注意这个过程:

mark

刀不磨要生锈,那些无需我们有意识练习的技能将慢慢退化。所以仅仅使用是不够的,还需要拿出来有意识的练习。

刻意练习

我们经常会有这种感觉,在某一项技能的练习上,我们付出了努力,也付出了时间,但是效果就是不理想。很多人可能会将此归咎为自己笨,没有天赋;其实并不是,很有可能是自己练习的姿势不对。

在时间一样的情况下,专家会将更多的时间放在刻意练习上,注意可以刻意练习不是刻意地练习。可以练习有助于防止陷入平庸,这是因为:精通半个技能完胜一堆半生不熟的技能

mark

通常情况下,更细粒度的子技能学习法是构建技能的最佳途径,但是没有人愿意把一周的时间都用在简单的练习上。刻意练习总是恰好超出我们当前的能力范围(舒适区)。这一点非常重要,如果我们练习那些远超出当前能力的技能,很可能会因为太困难、长时间没有反馈而放弃。而如果一直练习没有难度没有挑战的技能,后果可能会更严重,我们在平庸阶段进行的练习越多,对平庸技能的强化就越大,并且练习造成的影响是永久的。

mark

刻意练习的简明原则:完成一项细粒度的任务,经过一到三组45-90分钟的练习就能达到95%的精通度。

如果无法达到这一要求,我们可以将任务划分为更小的子任务,或者降低要求和标准。

  • 如果这项任务或技能过于复杂(未精通的技能过多),就将其划分为更细粒度的子任务或子技能
    mark
  • 如果这一任务并不复杂,只是难度太高了,则降低要求或标准

mark

但是大多数人在大多数的专业能力成长曲线上遇到的最大问题是,阶段B堆积了太多东西。与一次只做一件事情相反,我们想要同时学习和练习的东西太多了。这种形式的技能堆砌会拖慢进步速度、扼杀进步。

mark

专家将更多的时间放在刻意练习,给了我们借鉴的意义。程序员这个职业,不学习就会被淘汰,学习就意味着要构建新的技能,丰富自己的技能库。这个时候就可以运用上面的刻意练习的方式。首先我们要明确自己学习的目标,学习此技能能帮助我们完成什么,是否值得我们学习,切莫贪大贪全,应该确定自己的核心竞争力是什么。以阅读优秀源码(至于为什么阅读源代码,后面有提到)为例,一般一个项目的源码到了值得阅读学习的阶段,此项目应该已经比较成熟了。那么此项目的代码量以及代码难度应该都是不小的,如果从最新最全的版本开始看起,很容易就因为太困难放弃了。那么此时就可以进行任务拆解,可以从比较早期的版本看起,这个时期的代码量比较小,代码设计要比较好理解。或者是可以研究此项目中其中一个功能,掌握以后再切换到别的功能上。例如研究数据库,数据库发展到现在,其中的实现无比复杂。那么我们就可以从其中的几个主要的功能特性入手,比如索引、锁之类。

此外我们需要格外注意上面提到的两个问题,一个是阶段B堆积了太多东西,我们想学习的东西太多,但是精力有限。此时应该收缩战线,专注构建最重要的技能。精通半个技能完胜一堆半生不熟的技能。另一个是我们在平庸阶段进行的练习越多,对平庸技能的强化就越大,并且练习造成的影响是永久的。有很多工作年限比较久的程序员,专业能力还不如刚工作几年的新人。究其原因,都是因为不努力吗?不然,他们也努力了,只不过他们待在舒适区的时间太长了。

感性接触

我们会经常听到这么一个观点,中国人学不好英语,是因为中国人从来不用英语,只是单纯的死记硬背。同样的道理,专家之所以成为专家,是因为专家周围的环境更好,他们接触了大量高质量的专业技能。中国有句古话,“近朱者赤,近墨者黑”,也是同样的道理。放在现在就是,如果你身边都是优秀的人,那你多半也差不到哪里去。但是,除非满足特定的条件,否则简单地接触专业人士并不能帮助你构建专业能力

书中有个很生动的例子,小鸡性别鉴定。辨别刚出生的小鸡的性别异常困难,但是更早的辨别出小鸡性别,将公鸡和母鸡分开,有助于更快的进入鸡蛋生产环节。在20世纪初,日本人开发了一套鉴别小鸡性别的方法,但是只有很少的几位专家掌握了这一技能。现在的关键是培训具备这一技能的新手,便可以大规模应用这一技能。问题是身为掌握这一技能的专家也不知道自己是如何做到的。你的大脑能够学习一些你无法学习的东西,这不是什么魔法,而是感性知识。

他们是这样培训新人的,让新人随意指出小鸡的性别,只是随意的猜测。然后小鸡性别鉴定专家给予新人反馈,对,不对,不对,对。新人的每次猜测都会得到专家的反馈。终于,随着时间的流逝,新人在小鸡性别鉴定方面的表现越来越好了。只不过这时候新人还是不知道这是为什么?

其实在接触足够多的反馈之后,你的大脑在无需意识介入的情况下,开始发现模式和潜在的结构,伴随着更多的接触,你的大脑开始精心调整它的感知能力,最终找到真正的解决方案。你的大脑能够觉察更加细微的特征,将信号和噪声区别开来,即使你无法解释其中的原理。

所有领域的专家都在学习和利用无意识的感性知识,他们的大脑知道的东西远比展现出来的多得多。

mark

当你接触了大量多样化的实例时,你的大脑便开始观察什么是不变的。在感性学习能够发挥作用的地方,“发现”其实比“讲授”更有效。我们的目标就是通过展现更好的实例,帮助自己变得更加优秀。

现在知道为什么要读源码学习了吧,而且要读优秀的源码。你无需观察优秀程序员是如何编写代码的,只需要阅读很多优质代码即可。所以不要把自己写不出好代码的原因归咎于身边没有大牛,也不要妄想着要是有个大牛带带我写代码就好了。

那么要不要看烂代码呢?要看!因为有时候这不是你想不想看的问题,而是你不得不看,是项目就会有烂代码。当你确实需要展示或者阅读错误或不良的实例时,要营造不适感。我曾经和我的组员说,有时候阅读烂代码反而比阅读优秀代码进步更快。但是前提是你要能识别出什么是好代码,或者什么是烂代码。当你看到烂代码时,你就会打心底里嫌弃,然后就是想办法去改造它,这就是进步的机会啊。学习鉴别“不良”实例的最佳办法,就是学习“优秀”实例的潜藏模式。《重构 改善既有代码的设计》这本书就是这样做的,首先明确指出烂代码都有哪些特点,然后才是针对这些特点的代码重构方法和解决方案。

保持渴望成功的愿望

排除障碍

如何能保证自己顺着理想成长曲线不断前进呢?要知道在愿望和现实之间存在着一条鸿沟。有一些东西干扰了我们,有两种不同类型的干扰性鸿沟。

  • 技能鸿沟

mark

  • 关系鸿沟

mark

第一次学习编程的你会遭受很多痛苦。任何一件值得你付出的事情,都是如此。所以当我们面对困难时,第一件事就是要承认困难。人们之所以在遭遇困难时放弃,并不是因为他们遭遇了困难。这是因为他们不知道他们的境遇是正常的。这是因为他们不知道他们的努力方向是正确的。这是因为他们不知道其他人也会在同一阶段遭遇困难。那些放弃的人们,没有意识到,困难只是暂时的,也是正常的。

在承认困难之后,我们还要对成长曲线上可能会遇到的问题做出预测和补偿。预测出可能会干扰我们前进的因素。比如我自己在看书时,会将手机静音放到自己够不到的地方去。这样我就不会一直惦记手机会不会有消息,等到看完书再处理就是了。然后要对自己遇到的困难做出补偿,以编程为例,我们遇到的问题基本上前辈们都遇到过,这个时候善用搜索引擎就非常有用了。论坛和社区也非常重要。

进步+回报

我们知道了阻碍我们前进的因素,但是吸引我们前进的因素是什么呢?我觉得是成就感。成长路线上所收获的,会让我们获得成就感。如果我们没能从进步中获得任何好处,一切将变得没有任何意义。所以规划好成长路径图就非常重要了,仅仅知道有这么一条成长路径存在,就是强烈的动机来源。

对于程序员而言,制作一份技能清单,内容涵盖从初级到高级的技能。然后将其划分为不同的级别和层次。一种可行的做法是,在每个层次所花费的时间是前一个层次的两倍。即使这条路径不是最佳也无所谓,因为重要的不是路径,而是取得进步。让我们大胆一些,尽管尝试就是了。另外使用领域特定的专业术语进行交流,不仅有用,而且也是一种激励。所以和同事交流,或者写博客分享我们的技巧都是很好的激励方式。

维护认知资源

1999年,Baba Shiv教授以及165位大学生一起开展了一项简单的实验。他要求一半的学生记忆一个7位数,其余学生记忆一个2位数。

mark

上图中的结果,可能很多人认为是大脑在工作之后需要更多的卡路里,需要吃点蛋糕补充能量。但是研究人员向我们揭示了一个违反直觉、令人震惊的事实:

意志力与认知加工能力从同一个资源池中获取能量。

记忆7位数的参与者选择蛋糕,不仅是因为他们大脑需要更多的热量,还因为这项记忆性任务耗尽了他们抵抗蛋糕诱惑的意志力。所以我们应该确保自己把稀缺、易耗的认知资源用在正确的事情上。核心任务就是减少资源泄露

减少认知泄露

  • 要想减少认知泄露,应该把认知工作委托给外部世界(这样它就不会滞留在用户的大脑中)

    我们的大脑每次只能专注于一件事情,对于未完成或者中断的任务,我们的大脑会为其保留一个“后台进程”,多任务切换会耗尽大脑的能量。人们更容易记住未完成或不完整的任务,这就是蔡加尼克效应

  • 要想减少认知泄露,不要让用户选择

    选择是一种代价昂贵的认知开销。之前看过一篇文章,讲的是不要在你的卧室内学习或者工作。这一点我深以为然,学习本来就是一件违反人性的行为,选择在卧室内学习或者工作,很可能整个周末都是在起床学习工作还是躺在床上休息中的纠结中度过。所以干脆不要给自己选择的机会,我现在就是周末会抽一天很早起床,然后直接去公司,断了自己想偷懒的想法。

  • 要想减少认知泄露,帮助用户内化技能

    位于阶段B的技能会消耗大量的认知资源,位于阶段C的技能所消耗的认知资源则很少。所以我们宁愿只精通一项技能,也不要同时学习过多的技能。

  • 要想减少认知泄露,减少对意志力的需求

    自控力和意志力是昂贵的认知资源开销。要想减少用户对意志力的需求,就假设它们根本不存在,帮助他们养成习惯。习惯只需要很少的意志力或者无需意志力。但是我们的关注点应该不仅仅在于养成新的习惯,我们必须升级或者替换掉那些容易招致平台期和中等技能困境的不良习惯。

穿越大脑的垃圾过滤器

我们的大脑总是努力区分噪声和信号,这其实是好事,只不过我们无法控制这个过滤器。所以我们需要做另外一件事,阻止大脑把我们应该关注的事情当成垃圾

我们必须帮助大脑同意:

  • 这是一件值得关注的事情
  • 这是一件值得集中注意力的事情
  • 这是一件值得记住的事情

大脑喜欢即学即用式学习,而不是储备式学习。这也是为什么同样的工作时间,不同的人能力提升却差别很大。如果你的工作是极具挑战性的,那么你就需要一直学习新的技能来满足工作的需要,并且都是即学即用式学习,这可是我们的大脑所喜欢的。相反,你的工作没有任何挑战性,即使你在不断学习,但是始终用不到学到的新技能。我们经常会有这种感觉,很多当时学会的东西,过一段时间基本就忘却了,因为我们的大脑不喜欢储备式学习。所以我们可以利用技能映射验证知识的有用性,通过将知识映射为技能来验证(减少)必须学习的知识。直接把多余的知识删除、删除、删除。

mark

利用应用场景说服大脑。当我们学习很抽象的技能,不好理解和记忆时,可以尝试利用应用场景来说服大脑。例如在学习Redis的5种基本数据结构(现在是6种了)时,就可以思考每种结构可以应用在什么场景?hash可以用于记录帖子的点赞数、评论数和点击数;zset可以用于记录热榜帖子ID等等。

最后

努力吧,骚年,成就卓越的自己

mark

作者:CoderFocus
微信公众号: