万能青年程序员

V1

2022/06/15阅读:21主题:默认主题

刻意练习与编程进阶

0 焦虑是一切的开始

毕业到现在快四年的时间,作为一个半路出道的程序员,侥幸混进大厂,每天做着差不多需求,解着差不多的Bug。出租屋和公司的两点一线让四年时间一晃而过。年末的时候偶尔想回顾一下,却发现实在没有什么好回顾的。于是我想,如果再过几年的话,到时候我会是什么样的呢?而我又希望自己是什么样呢?是时候好好审视一下自己,试着做出一些改变了。

上学的时候我就读过《刻意练习》这本书,当时作为学生,读完也没有多大的感触,觉得可能只有像国际象棋,体育比赛,英语学习这种类型活动才能够通过刻意练习来实现进步。这种类型的活动有个特点,就是规则很简单,你可能花了一个小时到几天,就能把规则熟记于心,而天花板极高,业余爱好者跟专业运动员之间可以说是天壤之别。而程序开发作为一项知识性的工作,它的规则是极其复杂的,你得知道计算机组成原理,网络,数据库,编程语言等,才能开始开发。于是会给人一种错觉,似乎你知道的越多,你就越厉害,你只需要不断往大脑里面灌输知识点并烂熟于心,最后就能成为大师。于是一但发现了新技术或者知识盲区,就奋不顾身地扑上去,不管能不能消化,先吞下去再说。后来经过几年的工作之后,我才意识到这种观念值得商榷。首先,随着技术进步,知识点是爆炸增长的,你记忆知识点的速度可能永远赶不上知识点增加的速度。第二,你所记忆的知识点,能够高频率用到你的日常工作的,可能只有20%,你花费了80%精力背下来的知识点,可能几年都无法应用一次,真正到了要应用的时候,你已经忘的差不多了。那么对于开发者来说,想要不断取得进步,应该做什么?

1 什么是刻意练习

直到最近,我重新翻阅《刻意练习》这本书,发现把刻意练习这一套应用到Android开发上,似乎也是可行的。于是我试着在刻意练习的框架里面,重新制定Android进阶计划。

刻意练习的终极目标是形成长时工作记忆和强大心理表征。这两个什么意思,比如接到一个需求,新手可能开始百度网上有没有类似的需求实现方案,然后直接抄过来,而高手则无须借用工具就能很快搭建出来代码结构。如果非要让高手讲讲自己的思考过程,似乎他也说不出来什么,但他就是能很快想到,而且各种情况考虑周全。这就是心理表征。它不需要你长时间思考就能给出结论,应对变化能够反应。很多时候我们觉得自己反应很慢,遇到问题总要想很久,最主要的还是我们练习的不够,没有形成心理表征。

2 如何进行刻意练习

知道了刻意练习的目的之后,下面看看怎么进行刻意练习以及怎么进行编程的刻意练习。

书里面提到,刻意练习有六个特点:

  • 前提:存在于较成熟地领域
  • 方法
    • 寻找好的导师和情境
    • 每次练习发生在舒适区之外
    • 有精确的目标和计划
    • 有有效的反馈机制
  • 目的:最终形成有效的心理表征

首先,刻意练习的前提是要存在于较成熟的领域。这一点计算机领域勉强符合。虽然不像围棋,足球一样有上千年历史,但计算机诞生的这几十年,各种基础技术栈已经基本固定下来,所带来的生产力提升扎扎实实地促进了整个人类社会的发展。

符合这一前提的情况下,我们看看怎么用刻意练习让你的编程能力取得提升。

2.1 寻找好的导师和情境

刻意练习的第一步,你需要找到一个好的导师。导师的作用是什么?我觉得有两点,示范与纠正。就像健身一样,如果你只是一个人在不断练习,没有导师,那你永远也不知道正确动作是怎么样的。即使看了网上的健身教程,你在做动作的时候,也难免会有不规范的地方。如果没有一个人在旁边随时纠正,不规范的健身动作带来的受伤风险会远大于你的健身收益。在程序开发中也是这样的,一味自己钻研,写出不优雅不健壮的代码,自己也不知道,后患无穷。

那么作为一个已经毕业的程序员,去哪里能找到导师呢?显然,你不能像请健身教练一样,找个人坐在旁边看你写代码,现在也不存在这样的『代码教练』。不过偶尔与伙伴结对编程其实也可以达到这种效果。但是在节奏紧张的互联网公司,这种方式实践起来还是略有困难。那我们可以换个思路。导师不一定是真人,也可以是抽象的。上面说到,导师的作用是示范和纠正,在写代码时,什么能够对于你的代码编写起到示范作用呢?优秀的开源项目。计算机发展至今,积累了大量的优秀的开源项目,这些开源项目经历过时间的洗礼沉淀,都是非常宝贵的学习资料。那第二个,怎么什么能够纠正写代码中的坏习惯呢?Code Review。如果身边有很厉害的人,自己工作中写的代码让别人帮你Review,如果找不到的话,就写一些开源框架,放到Github上去,让全世界的人帮你Review。只有不断地接受大家的审查,找出你的问题,你才会发现自己的不足,你才会进步。

所以,Android刻意练习的第一步,就是阅读大量优秀的开源项目,并自己开源一些代码接受大家的审查。

2.2 每次练习发生在舒适区之外

刻意练习,当然离不开练习。作为一个开发者,你可以把工作中的每一次需求开发,都当做成一次练习。仔细回想一下,你之前是怎么进行『练习』的?是不是拿到需求之后,看看现有代码中有没有类似的实现,然后再搜搜网上有没有类似的实现,接着直接开始『抄』代码?如果真的想进步的话,这种做法是不可取的。刻意练习要求,我们的每次练习,最好都发生在舒适区之外。显然这种抄代码的行为,是在舒适区之内的懒惰行为了。

那我们怎么把练习突破到舒适区之外呢?这就需要每个人根据自己的情况和每一次需求的情况来具体分析了。比如你可以根据需求的复杂度,要求自己这个需求必须要用一种或几种设计模式,或者仔细想想这个需求以后可能有哪些扩展,然后自己在设计过程中考虑到这样的扩展,再比如,这次的需求我可以模仿一下某个开源项目的代码框架,针对目前的需求做出一定的修改。就好像,如果你的需求是写一个视频加载框架,你很自然的可以模仿一下Glide或者其他的图片加载框架。

这里说的对开源框架的模仿,跟上面说的『抄』其实有着本质的区别。首先你得彻底理解你要模仿的代码的设计思想,解决了什么问题,有哪方面的扩展性。然后再看看这样的设计是不是适合你现在要做的需求,有没有解决你的问题,是让你的问题更复杂了还是更简单了。这样思考的过程其实也是一种进步。

很多编程教科书都告诉我们,不要做『过度设计』,但是我觉得,为了进步,你可以做一点『稍微过度的设计』也无妨,对你的编程设计能力会有好处。

如果你觉得自己已经是个『熟练工』,每次做需求都很轻松,那你可能需要警惕起来了,可能你正在原地踏步。

2.3 有精确的目标和计划

前面说了做什么,下面说说怎么做。做什么大家其实已经清楚了,那就是源码阅读,多让大家进行code review,在实际开发过程中多使用一些优秀的『套路』。那到底该怎么做,如何制定目标和计划呢?对于一个人来说,制定目标和计划是一项通用能力,目标和计划制定的优劣,直接决定了最终的成果。一个好的目标,一定是量化的,可衡量的。比如,源码阅读,你打算一个月阅读几个项目的源码?code review,你打算一年在组内进行几次code review,模仿开源项目,你打算下一个项目就用上吗?更进一步的,可以去了解一下目标管理的SMART原则。每个人都需要根据自己的实际情况来制定目标和计划。

比如,下面是一份可以执行的计划:

每2周阅读一个开源框架源码;

每2个月在组内进行一次code review;

每个开发周期在3天以上的需求,都至少使用一种设计模式。开发周期5天以上的需求,模仿一个开源框架。

这个计划已经很宽松了,你可以按照这个计划来,也可以根据自己的情况来适当调节。

2.4 有有效的反馈机制

首先你应该知道,反馈是什么?对内,是你知道自己掌握了,是你能明显地看到,自己确实进步了,对外,是你的技术影响力逐步提升,团队里面大家有了疑难杂症会想到你,有了什么想法会想到跟你讨论一下,设计评审或者代码评审的时候总会拉上你,问问你的意见。那么,在我们上面列出的计划和目标中,怎么才能获得明确反馈,知道自己进步了呢?

首先是源码阅读。读源码你怎么知道你自己掌握了呢?一个方法就是你可以分享出来,给别人讲,只有你能讲明白了,你才算是真的掌握了。分享有很多种方式,有写文章的,录视频的,有直接组内技术分享的,形式不限。而分享也是最能直接收到大家反馈的一种形式。你文章的阅读人数,你组内分享的时候,大家是踊跃提问,还是默默听完毫无波澜,都代表了你分享的质量,而你分享的质量则代表了你的掌握程度。

另一个是代码质量。在自己日常开发过程中,可以建立一套属于自己的代码质量衡量标准。比如你的bug数量,有时候有的公司会用千行Bug率这个指标。不过我感觉这个指标并不是那么准确。因为我们其实是想衡量一定工作量内你写的代码出问题的概率。而代码行数跟工作量其实关系不大。同样的需求,你深思熟虑两天,写一天,写30行的代码,出1个bug,跟你直接写三天,写300行,出10个bug,它们千行bug率一样,那到底谁的质量更高呢?答案显而易见。我觉得一个比较好的办法是,可以用你做一个需求的Bug数量,除以你做这个需求的开发周期。获取单位时间内的Bug数量,比千行Bug率要准确不少。

3 总结

上面说了这么多,总结一下主要是下面几点:

  • 阅读优秀开源项目,知道什么是好的设计;
  • 多暴露自己,接受大家的代码审查;
  • 『模仿』学到的优秀设计架构;
  • 做一点稍微过度的设计;
  • 制定计划来执行;
  • 总结和分享自己的学习成果;
  • 制定量化指标衡量自己的代码质量。

程序开发领域普遍比较喜欢『进阶』一词,网络上更是有很多《XXX进阶》的技术指导书,仿佛看了这本书,你就能跃迁到下一个阶段。但其实,成长是一个连续的过程,是一点点的积累与进步,是需要不断地思考,练习,经历失败,品尝成功。不会有一个明确的时间点告诉你,你是一个高阶玩家了,但是你一定能感觉到,自己每天都在在刷新自己。

分类:

后端

标签:

后端

作者介绍

万能青年程序员
V1