代码精进之路:从码农到工匠-技术人的素养

记录张建飞《代码精进之路:从码农到工匠》的阅读笔记!!!

一、不教条

在软件的世界里没有”银弹”,在技术人的众多素养中,“不教条”占有重要的地位。

这里的”银弹”代指:提高软件生产力的万能的方法。

教条的主要原因是:
我们还停留在有样学样的阶段,导致我们忘记软件的第一性原理:”控制软件复杂度”。

Effective Java作者Joshua Bloch曾说过:
”同大多数学科一样,学习编程艺术首先要学会基本的规则,然后才能知道什么时候去打破规则。“

1.瀑布还是敏捷

不论瀑布、迭代还是敏捷,一般会经历下面的过程:
● 需求:对于系统做什么,建立并保持与客户的其他涉众的一致意见,定义系统的边界。
● 分析与设计:将需求转化为系统设计,设计将作为在特定实现环境中的规格说明,包括逐渐形成一个健壮的系统架构,建立起系统不同元素必须用到的共同机制。
● 实现:编码、单元测试、以及对设计进行集成,得到一个可执行的系统。
● 测试:对实现进行测试,确保它实现了需求,通过具体的展示来验证软件产品是否像预期的那样工作。
● 部署:确保软件产品能被它的最终用户使用。

2.贫血还是充血

贫血模型提倡模型对象只包含数据,并提供简单的Getter和Setter。
充血模型提倡数据和行为放在一起。

不要拘泥于到底该使用贫血模型还是充血模型,问题的核心在于你能否有效地控制复杂度。
如果你有很好的面向对象思维,使用贫血也可以写出好的代码;没有面向对象思维,即使使用DDD,也会陷入复杂性的泥潭。

3.单体还是分布式

业务发展早期:用户少、流量少、功能相对简单,单体应用架构足以支撑业务发展。
业务迅速发展以及用户的增加:单体应用的局限性开始凸显,具有水平扩展性的分布式系统架构几乎已经变成互联网公司的标配。

二、批判性思维

批判性思维是一种谨慎运推理去断定一个断言是否为真的能力。它要求我们保持思考的自主性和逻辑的严密性,不被动地全盘接受,也不刻意地带着偏见去驳斥一个观点。

技术人员虽然有很强的逻辑推理能力,但不见得都有很强的逻辑思维。

训练批判性思维的书籍推荐:

  • 《学会提问》。
  • 《思辨与立场:生活中无处不在的批判性思维工具》。

三、成长型思维
成长的过程中不可能是一帆风顺的,肯定会有痛苦、有阻力、有挫折。

面对逆境我们该怎么做?
有些人不堪重负,就此沉沦。有些人越挫越勇,把每一次失败都当成学习的机会。

具有成长型思维的人相信自己可以通过学习来提升自我,相信学习和成长的力量,相信努力可以改变智力和能力。

1.成长型思维

  • (1)我的态度和汗水决定了一切。
  • (2)我可以学会任何我想学的东西。
  • (3)我想要挑战我自己。
  • (4)当我失败的时候,我学会很多东西。
  • (5)我希望你表扬我很努力。
  • (6)如果别人成功了,我会受别人的启发。

2.固定型思维

  • (1)我的聪明才智决定了一切。
  • (2)我擅长某些事,不擅长另外一些事。
  • (3)我不想要尝试我可能不擅长的东西。
  • (4)如果我失败了,我就无地自容。
  • (5)我希望你表扬我很聪明。
  • (6)如果别人成功了,他会威胁到我。

四、结构化思维

结构化思维的简要定义:”逻辑”+”套路”。

1.逻辑

所谓逻辑,是指结构之间必须是有逻辑关系的(如针对某个观点的讨论列举第一、第二、第三而不是第一、第三、第二这样的)。

组织思想的逻辑有4种:

  • (1)演绎推理(大前提、小前提、结论)。
  • (2)时间步骤顺序(比如第一、第二、第三和首先、再者、然后等)。
  • (3)空间结构顺序(比如北京、上海、广州、深圳、杭州等)。
  • (4)程度顺序(比如最重要、次重要、不重要等)。

2.套路

套路是指我们解决问题的方法论、路径和经验(比如5W2H分析法就是非可以帮助我们分析问题的一个“套路”)。

逻辑是一种能力,而套路是方法论、经验;逻辑属于道,而方法论属于术。

刚入职一家新公司或转岗到一个新团队,作为一个技术人你将如何落地开展工作(用结构化思路来理清)?

  • (1)熟悉业务(了解产品形态、了解业务流程、走访客户)。
  • (2)熟悉技术(了解系统架构、了解领域模型、了解代码结构)。
  • (3)熟悉人(了解组织结构、了解人员角色、勤沟通)。

最清晰和实用的结构化表达是:“提出问题、定义问题、分析问题、解决问题、最后展望未来”。

五、工具化思维

适当的懒比低效的勤奋更具智慧,是更难得的美德。

偷懒的三个境界:

  • (1)最差的境界是“实在懒”,拖延不喜欢的任务。
  • (2)其次是“开明懒”,迅速做完不喜欢的任务,以摆脱之。
  • (3)最高的境界是”智慧懒”,编写某个工具来完成不喜欢的任务,以便再也不用做这样的事情了,从而一劳永逸。

懒惰的对立面除了勤奋,也可能是“硬干”或“苦干”。“硬干”或“苦干”并没有带着光环,而是一种徒劳、低效、大可不可的努力,只会说明你做事情很急切,但并不是在完成工作。人们容易混淆行动与进展、混淆忙碌与多产的概念。

我们提倡的”智慧懒”实际上是一种工具化思维,是“磨刀不误砍柴工”的智慧。有人说程序员和其他行业的最大区别是不仅使用工具,还能创造工具。

每当你重复同样的工作3次以上,就应该停下来问问自己:我是不是可以通过自动化脚本、配置化,或者小工具来帮助自己提效?(这也是每个优秀技术人的良好习惯)

对于那些整天非常忙,忙到没有时间思考的朋友,我真心建议你停下来,思考一下:我的方法有没有问题?是不是有更“偷懒”的方式可以帮助我提升效率?

六、好奇心

学习的动力不应该来自于外界的强力,而应该来自于内在,来自于我们内心对知识的渴望、对世界的好奇心。

好奇心是创新的驱动力。首先,它使我们灵活思考,打破现有的思维局限,从而不断地突破自己,完善自己的工作方式。

做技术这行,没有比持续学习更重要。因为有太多新的东西需要我们学习和了解,很多人工作了很多年,知道的东西还很少,对很多东西的理解不透彻,就是因为缺少一点好奇心,没有深入钻研。

七、记笔记

记笔记的好处:

  • (1)知识内化:记笔记的过程是一个归纳整理、再理解、再吸收的过程,可以加深我们对知识的理解。
  • (2)形成知识体系:零散的知识很容易被遗忘,而形成知识体系之后,知识之间就能有更强的连接。
  • (3)方便回顾:笔记就像我们的硬盘,当缓存失效后,我们依然可以通过硬盘调回,保证知识不丢失。

张建飞分享自己记笔记的经验:

  • (1)使用云笔记:云笔记能够在多端使用,要有目录的层次结构、标签和搜索功能。
  • (2)归类分组:要定期回顾笔记内容,尽量按照合理的方式对笔记进行重组,形成一个有逻辑关系的树形结构。这样既方便记忆检索,也可以逐渐形成自己的知识体系。
  • (3)不要复制粘贴:好的笔记最好是自己消化后的总结,而不是简单的照抄。如果有引用和参考,建议把链接放在笔记下面,方便溯源。
  • (4)结构化表达:对于简单的内容要重点突出,粗体显示重点部分;对于篇幅较长的内容,最好有目录,这样才能更加结构化地呈现笔记内容。

八、有目标

在《高效能人士的七个习惯》中,柯维博士提到,“所有的事物都要经过两次创造的原则,第一次为心智上的创造,第二次为实际的创造”。直观的表达就是:先想清楚目标,然后努力实现。不管是人生大问题,还是阶段性要完成的事情,都需要目标清晰、有的放矢。

九、选择的自由

自由并不是想做什么,就做什么。自由是一种价值观,是一种为自己过去、现在及未来的行为负责的价值观。自由是一种责任,是一种敢于做出选择,并愿意为自己的选择承担后果的责任。

十、平和的心态

张建飞在这里分享他的座右铭“动机至善,了无私心;用无为的心,做有为的事”。他这样说,我们做事情的出发点必须是善的。其次,“有为的事”是指要认真做事,认真生活;“无为的心”代表一种平和的心态,一种活在当下的智慧。也就是做事要积极,但是心态要放平。

十一、精进

精进就是你每天必须进步一点点。慢,就是快。

文章目录
  1. 一、不教条
    1. 1.瀑布还是敏捷
    2. 2.贫血还是充血
    3. 3.单体还是分布式
  2. 二、批判性思维
    1. 1.成长型思维
    2. 2.固定型思维
  3. 四、结构化思维
    1. 1.逻辑
    2. 2.套路
  4. 五、工具化思维
  5. 六、好奇心
  6. 七、记笔记
  7. 八、有目标
  8. 九、选择的自由
  9. 十、平和的心态
  10. 十一、精进