点击上方“中兴开发者社区”,关注我们
每天读一篇一线开发者原创好文
作者简介
作者王辉,程序员、敏捷教练,最近致力于TDD、Clean Code、DDD等实践的落实实施,是软件设计和软件架构方法的积极学习者和实践者。这篇文章从人的认知出发,探索如何制定更加有效的措施,促进个人和团队的成长。
1.成长的焦虑
物联网、AI、区块链、数字化转型…… 在当前的这个时代,新技术、新工具、新语言层出不同,微信、微博、 公开课、专栏等各种渠道的信息扑面而来;
IT 从业人员尤其是软件开发 人员,面临着比以往所有时代更加丰富的资源;
但是,这个群体中也弥 漫着越来越严重的焦虑感,个人、团队和组织在思考如何才能在快速发 展的背景中维持竞争力,如何在这个竞争日趋激烈的时代“幸存”下来。
几乎不约而同地,大家认为学习是活下去的唯一方式;“进化”、“赋能” 等提法成为了各种大会的关键词,各种基于知识分享和变现的创新层出 不穷。
比如,罗胖就有效地贩卖了我们的“知识焦虑”,它提出了“一起建 设一所终身大学”的口号。
关于“学习”和“成长”,这是一个很宏大、也很专业的话题。在本次分享 中,我将从一个软件工程师和教练的角度,通过几个小的案例,来分享 几点自己关于个人、团队和组织学习和成长的心得。
2.认识大脑,高效学习
不同人的学习效率差之甚远。
有人能在很短的时间内完成学习任务,从 而留出更多的时间去干更多的事情,这种能力体现为高效的学习力。在 知识爆炸、信息传播高效的背景下,这种学习力将给个人的成长带来极 大的分化。直接体现在有些人懂得多、学得快,而有些人花了很多时间 和精力却收效甚微。 认知科学的知识,可以帮助我们认识大脑的学习规律,从而使得我们可 以更好地设计自己的学习方法,提升学习效率。
从表层知识到深层知识,构建知识体系
学习的最终目的,是需要形成抽象知识。当我们面对一个复杂的问题时, 经过层层分析,抽丝剥茧,去除掉其中不重要的细节,最终将问题映射 到我们既有的抽象知识上,从而找到问题的解决方案。
这是一种能力,是需要经过不断练习、积累才能习得的能力,也是从新 手迈向专家的必经阶段。学习的有效过程是,获取各种表层知识,经过 消化、积累、抽象等阶段,形成自己大脑中的深层知识。经过抽象的知 识,在大脑中占用的容量更小,从而为学习更多的东西腾出空间。 在《程序员思维修炼》这本书中,作者从认识人的大脑出发,讲述了如 何认识大脑所固有的生物性缺陷,克服个人的认知偏见,积极学习,提 高创造力和问题解决能力;并且提出了一系列实用的方法,帮助新手不断成长为专家。
几点个人心得
具体地,在过去几年中我个人采用了以下手段和方法,帮助自己更好地 消化知识,构建自己的知识树:
有所为,有所不为 结合个人发展和组织需要,制定个人成长的计划,将有限的精力投入 到关键的 2-3 个点上;构建个人在某几个领域内的竞争力,避免广撒 网带来的低效。 每个月、季度、年度进行定期的回顾,检查目前前进的方向是否偏离 了预定轨道。
勤于练习 一万小时定律已经广为人知,对于软件编程来说也不例外。没有足够的练习,就无法积累足够的表层知识,也就无法转化为大脑 中的深层知识,建立更高层次的抽象。
做笔记、写博客、做分享 在读书、学习的过程中,通过思维导图、涂鸦等各种方式对知识进行 总结、提炼,方便自己回顾,建立知识点之间的连接。做笔记的过程 就是重新对知识进行梳理和总结的过程,有效避免了书读完之后已经 把前面的内容忘掉的问题。
此外,将自己的心得写成博客对外发布,争取各种机会进行分享,也 是促进知识抽象、建立个人自信心和成就感的好方法。 过去的一两年,我平均每年在“简书”上输出 10 篇左右的总结文章, 并积极争取 TiD 等各种外部交流学习的机会。
授人以渔(教练他人) 在过去的几年中,我有幸作为教练参与到团队的转型中,进行软件设 计和基础能力提升相关的实践推广。比如,过去几年对于 TDD、重 构和抽象等实践的辅导,弄清楚了一些之前感觉已经懂了、但实际上 并不理解的知识点。 同时,我还先后进行了超过 300 小时的专题培训和工作坊,有效提 升了个人对技术的理解和公众表达的能力。 教练的过程是个人不断将知识内化,形成抽象知识的过程,也是这样 一个过程:感觉自己懂了 -> 真的懂了 -> 还有更多东西不懂。
3.从做中学,一种更有效的学习方式 关于学习的两个案例
关于学习的两个案例
学习古典音乐
在得到的专栏《雪枫音乐会》中,雪枫老师曾经提到,在专栏开始的初 期阶段很多听众希望能先介绍一些管弦乐队的乐器;但是他认为,对 于古典音乐的学习,应该坚持“先听后学,先爱后懂”。
学习攀岩
在学习攀岩的现场,教练走过来,确保所有人都系好了安全带。我们都全副武装地接受检查,检查完毕之后,他走到人群的前面,我们屏住呼 吸,准备聆听教诲。
但是,根本没有什么教诲。他只是告诉我们现在开始攀岩,30 分钟后 我们再回来集合。
教练扬长而去,去喝咖啡了。
我们胡乱地在岩石上爬了一会,事实上都不知道自己在干什么。半小时 之后,教练出现了,开始讲课,告诉我们如何攀岩。
现在因为我们有一 些经验,所以他的讲解更加有意义。
这比他一开始直接讲课要清楚的多。
首先我们经历了多感官、亲身实践的情景,帮助我们有了初步了解。
然 后,他再进行一次传统的、充满针对性的授课。
在正式的应用或动手实践之前,我们更倾向于先接受所谓的“基础”理论 知识。例如,在英语的学习中,我们会接受系统的语法知识;
在学习古 典音乐时,我们期望首先弄明白管弦乐队中的各种乐器,了解诸如协奏、变奏等术语的涵义;
在编程时,往往会优先学习这门语言的语法和各种 特性。
我们往往希望前期学习的这些基本知识,能够以为后续的实践做好准备。
不幸的是,我们在真地尝试学习语言时,语法知识很可能已经忘记了;
当我听到一首曲子的时候,之前学习的那些术语已经对不上号了;
当我 们在编程的时候,却发现还是有很多特性不会用,还得回头再翻开书本 学习。 我们在前期所花掉的大段的学习时间,并没有发挥出应有的作用。
相反地,如果我们先了解一小部分知识,然后直接投入实践,完成一些 简单的任务,让自己先“存活”下来;
然后,以此为基础,再制定下一步 的学习目标,进行更多的实践。按照这个模式不断迭代前进,学习效果会更好。
也就是在做中学,通过“做”为“学”提供更好的反馈。
一个软件设计工作坊的改进案例 基于同样的思路,在过去的几年中,我们不断摸索和改进内部的软件能 力提升项目。
在传统的培训课程中,讲师和学员之间是单向的信息流动方式:讲师说, 学员听。课程的效果往往很差,尤其是实践性很强的软件设计类课程。
针对这些问题,我们将软件设计类课程做成了开放式的 workshop 形式。
我们将课程内容按照内在关系进行拆分,将拆分出来的内容做成一个个 相对独立的模块。
在实施过程中,我们先针对每个模块抛出一个小问题,由学员在个人的 开发环境中进行尝试,教练在这个过程中仅提供支持性的辅导作用。
个人尝试环节结束后,学员们就个人完成的情况进行分享和交流;
这个环 节之后,教练再带领大家按照课程设计的方法继续进行实际操练,并根 据前面环节中学员反馈的信息进行有的放矢。
依此不断循环。 先尝试完成一个小目标,再投入学习,不断迭代完成大目标。通过这个 方法,学员反馈的满意度大幅提升,学员和讲师之间的互动和信任得到 了极大的改善。
4.影响与激励他人
承担管理或者教练角色的人,如果想在团队中推行某一件措施,往往并 不容易。《影响力》这本书中提到了一些具体的策略,可以帮助我们更 好地说服别人,提升个人做决策时的影响力。Linda Rising 在 TiD 2017 上的培训课程《Influence Strategies for Practitioners》,也着重介绍了 如何利用影响力的策略说服他人接受一件事情。
Liking. 我们喜欢有吸引力的人,以及跟我们相近的人。
Reciprocity. 互惠,人往往会投之以桃,报之以李。
Social proof/Consensus. 我们会跟随类似的或者有地位的人,比如人们曾经对庆丰包子的追捧。
Commitment/Consistency. 人往往会努力做到兑现之前的承诺。哪怕这件事不是自己原本想做的, 但一旦做出承诺,就会尽力实现。
Authority. 人往往会尊重权威或者专家。
Scarcity/Exclusivity. 当我们受到限制获得某些东西时,我们却更想得到它。 这些技巧可能已经被很多营销高手运用得得心应手,我们也可以将其加 入自己的工具箱中,更好地发挥自己的影响力。它让我想起了几年前我 们在内部实施 Code Review 的故事
一个实施 Code Review 的案例 Code Review 作为一项软件开发中广泛采用的实践,其有效性已经得到 了认同;左耳朵耗子在《从 CODE REVIEW 谈如何做技术》这篇文章 中已经有了讨论。但是,在我周围的团队中并没有得到很好的落实。 如何在团队中落地这么一件看似很简单、却长期被忽视的实践,不是一 件太容易的事;尤其是一线团队和开发人员,经常因为时间紧任务急、 耽误时间、没有用处等原因而忽略这个环节。 在后来的实践中,我们借鉴了上述有关影响力的模型,帮助我们逐步走 上正轨。具体来说包括以下几个方面。
打开眼界,看看外面的世界
在相对封闭的通信行业中,给予大家了解其他行业和公司的机会,尤 其是类似于 Google 这样的明星公司。在了解到这些成功的互联网公 司里也在做代码评审这件事情的时候,大家更有可能相信这个方法是 可行的,至少愿意去尝试一把。
邀请权威人士献身说法
在敏捷转型的几年中,公司投入资源,邀请了来自外部的咨询师和顾 问,给组织和团队做辅导,其中包含一些软件设计水平很高的牛人。 我们趁此机会,请他们帮助我们在团队内进行 Code Review 实践的 导入。 咨询师的影响力往往胜过内部的这些教练,团队成员显然也更愿意相 信他们头顶上的光环、以及过去的成功经验。从最开始带着大家做 daily review,到最后团队逐步养成定期代码评审的习惯,这些高手 的带动作用不可小视。
为开发人员解决燃眉之急,赢得信任
作为教练,平时积极地帮助开发人员解决问题,尤其是一些刁钻古怪 的 bug,可以帮助我们逐步树立个人的品牌,赢得他们的信任。 当我们再给他们“推销”一件东西的时候,他们会更容易接受,尤其是 在发现一些 bug 是可以通过代码评审消除的情况下。 人与人之间的互利互惠会让他们更容易接受我们。
建立正向的激励机制
代码评审稳定进行一段时间后,我们在组织内设立了“show me the code”活动。这个活动每月举行一次,大家可以把通过代码评审发现 的典型代码,提交到一个公共论坛供所有人点评和讨论。然后通过投 票的方式选出最有价值的几份代码,在内部给予相应的物质和精神奖 励。 通过这种方式,引导大家不断将代码评审的习惯保持下去,并形成稳 定的节奏。
5.总结
人的大脑来源于人类千百年来的进化和基因的遗传,这也决定了我们的 思考方式和行为方式在很长一段时间内保持基本稳定,其中包含了一些 与生俱来的弱点或者缺陷。 一切问题归根到底都是“人”的问题。从人的特点出发,可以帮助我们更 好地认识自己和团队,顺应人性,从而制定更加有效的措施,促进个人 和团队的成长和进步