Skip to content

Commit

Permalink
add 程序员修炼之道
Browse files Browse the repository at this point in the history
  • Loading branch information
jackie-coming committed Feb 20, 2024
1 parent 1e07aa2 commit 115bd01
Showing 1 changed file with 213 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
# 前序
《小工到专家》 2005年出版
《通向务实的最高境界》第二版 2020年出版

Andy Hunt是一位木匠和音乐家
Dave Thomas细化驾驶单引擎飞机
书中提出:“编程是一种技艺,一种需要用心学习的技艺”

涵盖的主题:个人责任、职业发展、代码保持灵活、易于改编和复用的各种架构技术
目标是:
![image.png](https://cdn.nlark.com/yuque/0/2024/png/758294/1708226382528-be0df187-941c-4fde-afe3-cee370a54e10.png#averageHue=%23121623&clientId=u46299b2b-c9a5-4&from=paste&height=716&id=u736f4573&originHeight=716&originWidth=1330&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1004328&status=done&style=none&taskId=u2445e392-4636-49d4-ad05-77f37c5e913&title=&width=1330)
适用对象:初学者、有经验的程序员

建议:
1、尽可能阅读原著,看一手信息,减少翻译过程的gap
2、每一个原则都需要细品,多读几遍同时必须要实践
3、频繁的高强度的外部刺激(遇到的项目、团队)和自主的有意识的反复提醒有利于加速原则和知识的内化

陈述的方式:书中的观点+背景+解决方案+结合材料展开(网上的例子、观点、附录中提到的论文和资源)

# 个人成长
## 我的源码让猫给吃了
![image.png](https://cdn.nlark.com/yuque/0/2024/png/758294/1708228217762-077946e9-049d-476f-b3b6-4d1ea43bd163.png#averageHue=%23c7c7c7&clientId=u4140d099-0619-4&from=paste&height=610&id=u3af72dd5&originHeight=610&originWidth=1672&originalType=binary&ratio=1&rotation=0&showTitle=false&size=164038&status=done&style=none&taskId=u8cf04b65-7004-4c6d-bc86-562e46782cb&title=&width=1672)
### 负责
原则:提供各种选择,不要找蹩脚的借口
背景:你承诺确保某件事情正确完成,但是不一定可以直接控制事情的每一个方面,除了尽可能完成之外,还必须得先分析风险是否超出了控制。
解决方案:
分析风险是否可控

- 如果是风险无法控制的事情,有权不为项目的结果负责
- 如果同意为项目的结果负责,出现问题时,不是找借口,而是给出各种可行的解决方案。
- 如果需要额外的资源,不要害怕提出要求,也不要害怕承认需要帮助

举例:
![image.png](https://cdn.nlark.com/yuque/0/2024/png/758294/1708236997941-c0f46d6c-abc4-4f7b-9d3b-95f299901471.png#averageHue=%23979797&clientId=u7c009fbc-3bc0-4&from=paste&height=250&id=u4dacc238&originHeight=250&originWidth=1656&originalType=binary&ratio=1&rotation=0&showTitle=false&size=132829&status=done&style=none&taskId=u62a76fd0-35b7-4e69-83aa-98aac415f98&title=&width=1656)

## 你的知识资产
知识资产是有时效的。
### 工程师如何学习?
#### 书中观点

- 每年至少学习一种新语言。不同语言以不同方式解决相同的问题,可以帮助拓宽思维
- 每季度阅读一本技术书籍。
- 技术深度:阅读和项目有关的书籍
- 技术广度:阅读和项目无关的书籍
- 参加本地用户组织。不要只是去听讲,而要主动参与。打听公司以外的人在做什么
- 持续投入学习,保持技术敏感度
- 批判的思考你读到的和听到的
#### 引用观点
go业界大佬曹大的博客关于这个话题给出了一些学习方法和经验,个人感觉非常有用

- 阅读书籍
- 网络博客内容缺乏体系,不系统,很多博主为了掩饰自己的未知,不懂的关键点就一笔带过,最终获取的只是二手资料
- 能够读懂英文技术书籍是工程师的硬实力,大部分优秀的技术书籍以英文为主
- 英语阅读能力怎么训练?逼迫自己去翻译一些英文文档
- 翻译The Go Programming Language
- 翻译 es权威指南
- 信息源
- 技术书籍存在一个明显的缺点,时效问题
- github trending
- github trending代表一种风向,
- follow优秀的工程师
- 希望自己能在技术上做到一直精进,同时随着年龄和工龄的增长又会时不时陷入迷茫,这时候去看看同龄的优秀工程师,年纪更大的优秀工程师在这个时间段在写什么代码,在写什么博客,可能对于解决自己特定时期的迷茫有益。或许就发现了一个新的领域值得自己去奉献青春。
- reddit相关社区
- 国内的社区生态被人为地割裂了,建议关注国外的社区
- 阅读论文
- 除了工程之外,前言的理论知识需要通过论文去了解
- 技术会议和公开课
- 除了阅读文字之外,阅览视频和与人面对面交流有时候不可缺少
- youtube
- b站
- 多做开源
- 业务时间,用最严格的标准来要求自己编写自己的开源项目
- 多做总结
- 建立自己的blog
- 建立自己的blog
- 锻炼演技
- 软技能的训练,提前做好准备

## 交流(可以不讲,没啥亮点)
### 书中观点
没有有效的交流,一个好想法就只是一个无人关心的孤儿。
如何进行交流?

- 知道你想要说什么
- 规划你想要说出的东西,写出大纲,不断优化想要表达的话
- 了解你的听众
- 不同的观众需要获取的东西是不一样的,针对不同的人进行适当的修正
- 选择时机
- 要让所说的适得其时,在内容上切实相关
- 让听众参与
- 获取听众的反馈
- 做倾听者
- 鼓励大家通过提问来交谈
#### 引用观点

同级交流
向上沟通

# 代码架构
## 软件的熵
当软件中的无序增长时,程序员们称之为“软件腐烂”
原则:不用容忍破窗户
> 一扇破窗户,只要有那么一段时间不修理,就会渐渐给建筑的居民带来一种废弃感。于是又一扇窗户破了,人们开始乱扔垃圾,出现了乱涂乱画,严重的结构损坏开始了,建筑被损毁的超出了业主愿意修理的程度,导致废弃感变成了现实。
> “破窗户理论”启发了纽约和其他大城市的警察部门,他们对一些轻微的案件严加处理,以防止大案的发生

背景:破窗户代指:低劣的设计、错误的决策、糟糕的代码

解决方案:

1. 有时间:发现一个修一个
2. 没有时间:用木板把破窗户钉起来
1. 出问题的代码加入注释
1. 显示“未实现”消息,用虚设的数据加以替代

## 重复的危害

维护不是时有时无的活动,而是整个开发过程中的例行事务,同时会发现,在我们开发的规范、过程和程序中很容易重复表示知识。 如果有多个地方表达同一个事务,需要更改其中一处的时候,必须记得改变其他各处
原则1:DRY - Don't Repeat Yourself

- 强加的重复(imposed):开发者觉得他们无可选择--环境似乎要求重复
- 编写简单的过滤器或代码生成器。
- 根据在线数据库schema、或是最初用于构建schema的元数据,自动生成类定义
- 把注释保留给其他的高级说明
- 如果把注释给低级的代码,我们就是在重复知识,每一次改变都意味着既要改变代码,又要改变注释
- 不可信的注释比完全没有注释更糟糕
- 无意的重复(inadvertent):开发者没有意识到他们在重复信息
- 来自于设计中的错误![image.png](https://cdn.nlark.com/yuque/0/2024/png/758294/1708243154402-2cad43c4-72b2-4a94-ac2b-a2e4caf07a39.png#averageHue=%23d9d9d9&clientId=u7c009fbc-3bc0-4&from=paste&height=1022&id=u00961aa2&originHeight=1022&originWidth=2140&originalType=binary&ratio=1&rotation=0&showTitle=false&size=386217&status=done&style=none&taskId=ua61faee5-6d38-4158-8412-0f862fa595e&title=&width=2140)
- 可以因为性能原因而选择违反DRY原则,但是需要将影响局部化,对DRY原则的违反没有暴露给外界。
- 经常发生在需要缓存数据的时候,只有类中的方法需要关注DRY,“保持行为良好”![image.png](https://cdn.nlark.com/yuque/0/2024/png/758294/1708243266447-a675bf4b-f2d6-48b7-9cbc-d9a766541127.png#averageHue=%23dadada&clientId=u7c009fbc-3bc0-4&from=paste&height=1066&id=u7abd6785&originHeight=1066&originWidth=1646&originalType=binary&ratio=1&rotation=0&showTitle=false&size=259060&status=done&style=none&taskId=u744bfdb4-be35-4cb2-b0aa-b219f64885e&title=&width=1646)
- 无奈性的重复(impatient):开发者偷懒,他们重复,因为那样似乎更容易
- 在项目有时间压力的挑战下,如果可以避免无奈性的重复,更能体现个人能力。
- 开发者之间的重复(interdeveloper):同一个团队(或不同团队)的几个人重复了同样的信息
- 鼓励开发者相互进行主动的交流
- 设置论坛讨论常见的问题,可以永久保留所有讨论的痕迹

原则2:Make it easy to reuse
如果复用很难,大家就不会去复用。所以要营造一种环境,让复用变得更容易

## 正交性
### 书中观点
正交性指:用于表示某种不相依赖或是解耦性。如果多个事务中的一个发生变化,不会影响其他事物,这些事物就是正交的。
原则:Eliminate Effects Between Unrelated Things(清除无关事物之间的影响)
好处:

- 提高生产率
- 改动影响局部化,开发时间和测试时间降低
- 促进复用。如果组件有明确而具体的、良好定义的责任,就可以在新场景进行复用。 和乐高的思想一致,拼乐高,实际上就是在搭积木。
- 对正交的组件进行组合,做的事情会更多,某个组件做M件事情,另外的组件做N件事情,正交会实现M x N的效果。如果非正交,做的事情就会重叠。
- 降低风险
- 有问题的代码区域被隔离开来。不会影响到系统的其他部分同时更换成健康的新模块也会更容易
- 系统更健壮。对特定区域做出小的改动与修改,所导致的任务问题都将局限在改区域中
- 正交系统很容易得到更好的测试

实际应用:

- 项目团队
- 怎么把团队划分为责任得到了良好定义的小组,并使重叠将至最低?
- 量化的指标:每个需求改动时需要涉及多少人。人数越多,团队的正交性越差
- 没有简单的方案,取决于项目、变动的区域、人员
- 系统设计
- 使用模块化、基于组件、分层的思想指导系统设计
- 量化的指标:如果显著地改变某个特定功能背后的需求,有多少模块会受影响。数据越多,系统设计的正交性越差
- 编码
- 代码保持解耦
- 通过接口抽象的方式,实现代码内聚
- 避免使用全局数据
- 避免编写相似的函数
- 策略模式
#### 引用观点
实际上耦合的架构、代码设计会降低效率,好的业务架构,本质想尽一切办法减少沟通,只有沟通少,效率才会高,质量才会好。
而好的业务架构需要一些可衡量的指标
陶文的代码防腐实用技术给出一个解法
业务逻辑可以被拆分成:

- 编辑时:拆分成文件、文件夹、Git仓库
- 这种拆分标准屏蔽了不同编程语言和编程框架的影响,不用争论什么是Class,什么是Module,什么是Package。
- 目标是:“代码防腐”
- 量化的指标(列举部分)
1. 会议时间
1. 如果一个需求的改动需要花费大量的沟通成本,需要重新审视业务逻辑拆分
2. 接口改动/实现改动 比率
1. 可以指导仓库拆分的成本
2. 如果实现改动的非常多,指导使用配置化的方式
3. 过度抽象怎么衡量
1. 强行把一堆不相关的东西拧巴到一起,引入了“必要参数占比”和“咨询量”
2. 必要参数占比
1. 调用方是否必传的参数
2. 如果必要参数占比过小,把一些小众场景的具体业务以额外的方式加进来了,每个额外参数都增加了调用者的负担,是额外的学习和维护成本
3. 咨询量
1. 针对的是可复用模块,模块的使用成本很高,文档不清楚,沟通成本很大
- 运行时:拆分成进程
- 避免拆分出来的东西见仁见智,我们只能选择不那么用户可见,但是又相对稳定的东西。进程是歧义比较少的东西。
- 目标是:“只负责自己写的代码”
- 量化的指标(只列举部分)
1. 故障定位时长
1. 孤立的一个进程很难完成所有工作。业务逻辑不可避免地要拆分成多个进程。如何找到出问题的进程。 一个进程也很难仅由一个 Git 仓库构建而来。业务逻辑不可避免地要拆分成多个 Git 仓库。如何找到进程的问题是哪个 Git 仓库造成的。 故障定位延迟是指故障从开始定位,到找到根本原因所花的时间。进程边界,Git 仓库的边界,越不依赖人的经验,越不依赖人的现场沟通,就越可能降低故障定位延迟。


# 总结
1、负责,体现在如何处理问题,应该给出多个选择方案,而不是找借口
2、不要留破窗户,代码质量问题往往就是从一次“破窗户”开始的
3、作为一名程序员,需要坚持终身学习,修炼内功,保持技术敏感度
4、交流,在适当的时机说适当的话
5、DRY原则,减少重复,关注复用
6、抽象比细节活得更加长久
7、自动化提效

# 附录
1、工程师应该怎么学习 [https://xargin.com/how-to-learn/](https://xargin.com/how-to-learn/)
2、那些年,我从微信支付学到的东西 [https://mp.weixin.qq.com/s/qvTWcsjAPTJTEu30zapsQg](https://mp.weixin.qq.com/s/qvTWcsjAPTJTEu30zapsQg)
3、代码防腐实用技术 [https://autonomy.design/Modules.html](https://autonomy.design/Modules.html)

0 comments on commit 115bd01

Please sign in to comment.