作为一名年龄30+程序员,随着2023年的到来,我的工作和生活正在逐步变化。
本系列会以周维度为周期,记录我对如下三块内容的思考,大家挑选各自感兴趣的内容阅读即可:
- Go技巧 - Go开发者作为重点阅读的群体,不忘初心
- 编程思考 - 面向所有开发者,从系统设计等高层维度进行分享
- 工作生活 - 以更贴近生活的视角,分享时间管理、职业发展、焦虑感的一些心得
Go技巧 - 用接口interface
提高模块间协作效率
本周要分享的一个技巧是 - 用接口interface
提高模块间协作效率。
我们在协作开发时,在划分清边界后,就需要协同开发。而这个边界,如果能结合interface
特性,就会大幅提升效率。从边界功能的角色来看,主要包括2个:提供方与调用方。
从下图来看:
我们以一个具体工作内容为例:我们要开发一个Book的CRUD的工作,但时间紧迫,所以计划分为两块:
- A同学 - HTTP API部分
- B同学 - MySQL数据库部分
而由于数据库部分的工作比较少,所以计划让B同学来主导接口这块工作,即B是提供方,A是使用方。接下来的三块工作内容如下:
1 - 设计接口
B同学给出一版接口:
1 | // 核心接口定义 |
这里并没有真正的代码实现。代码重点包括3个部分:
interface
的定义:核心内容,方便使用者阅读- 实例化:
interface
怎么创建 - 数据结构:
interface
涉及的结构体
这一块,非常考验B同学的代码设计能力:怎么样让使用者快速了解你的设计?注释固然是一个不错的方式,但更好的方式是通过函数名、参数名等,详情可参考《 Effective Go》、《代码整洁之道》等资料。
2 - 审核接口
在B同学完成初步设计后,就需要A同学进行审核。审核主要的目标:发掘信息差,保证最终功能的正确性。
信息差来源于不同模块的上下文差异。比如说,数据库同学更关注底层的数据存储,而API层的同学更关注用户的使用场景。所以,通过评审,A同学可以发现与B同学的信息差,并对接口提出意见、希望B同学加以改进。
从上面的示例来看,可能存在如下问题,我用注释的方式加以说明(往往结合Code Review):
1 | type BookDao interface { |
接下来,就是A与B的不断沟通、不断修改interface
的过程,直到双方基本达成一致。
3 - 实现与使用接口
随着接口的敲定,接下来的工作就可以兵分两路了:
- B - 提供方去编写这个接口的具体实现,也就是MySQL相关的部分
- A - 使用方调用代码,完成上层业务部分的开发
可以看到,interface
的定义有利于将工作进行拆分,定义关键边界,然后各自完成独立开发。
小结
从两个角色来看,他们侧重的能力点会有差异:
- 提供者:偏向基础能力,主要在于代码的可读性与能力的通用性(不仅仅对接一个使用方)
- 使用者:偏向业务能力,需要结合用户使用场景来思考程序设计
这个情况不仅仅存在于模块间设计,在更大的系统设计时也有非常重要的体现。所以,这是一个很好的提升能力的机会。
编程思考 - 提高个人的市场竞争力
最近,我经常看到一个问题:我该学习什么编程能力? 我会先关心提问者的初衷,常见分为两种:
- 提升编程能力
- 提高个人的市场竞争力
相信绝大多数的人都是为了后者。单纯为了提升编程能力的话,自己去啃那些经典教材即可。
认清并承认自己的目标很重要。关于程序员的市场竞争力这个问题,我分享个人的三点看法:
- 从ROI的角度分析个人的能力成长方向,把自己当作一个商品(想不清楚的话,多搜搜各大公司的招聘要求)
- 多和“高阶人士”交流,扩展视野:可以是职位比你高的领导,也可以是某个方向的资深人员
- 为机遇创造条件(能力储备、人脉),但不要一心追求机遇,而是逐步成长
工作生活 - 记录生活作息
我从本周开始,记录了自己的每日生活作息,分为7类:
- 睡眠
- 吃饭
- 工作
- 娱乐
- 学习
- 运动
- 家庭
记录的动作很简单,拿纸笔就能快速完成,但我在今年才开始真正地做这件事。这背后,我长期存在的一个性格问题:我清楚自己浪费时间的问题所在,但不敢真正地去面对它,更羞于看到具体的浪费时长。
我的最终目标也不是为了成为一个时间管理领域的达人,而是 让自己时间更可控,减少来自浪费时间的焦虑感。
Github: https://github.com/Junedayday/code_reading
Blog: http://junes.tech/
Bilibili: https://space.bilibili.com/293775192
公众号: golangcoding