Junedayday Blog

六月天天的个人博客

0%

【每周小结】2023-Week2

作为一名年龄30+程序员,随着2023年的到来,我的工作和生活正在逐步变化。

本系列会以周维度为周期,记录我对如下三块内容的思考,大家挑选各自感兴趣的内容阅读即可:

  • Go技巧 - Go开发者作为重点阅读的群体,不忘初心
  • 编程思考 - 面向所有开发者,从系统设计等高层维度进行分享
  • 工作生活 - 以更贴近生活的视角,分享时间管理、职业发展、焦虑感的一些心得

Go技巧 - 用接口interface提高模块间协作效率

本周要分享的一个技巧是 - 用接口interface提高模块间协作效率

我们在协作开发时,在划分清边界后,就需要协同开发。而这个边界,如果能结合interface特性,就会大幅提升效率。从边界功能的角色来看,主要包括2个:提供方调用方

从下图来看:

我们以一个具体工作内容为例:我们要开发一个Book的CRUD的工作,但时间紧迫,所以计划分为两块:

  • A同学 - HTTP API部分
  • B同学 - MySQL数据库部分

而由于数据库部分的工作比较少,所以计划让B同学来主导接口这块工作,即B是提供方,A是使用方。接下来的三块工作内容如下:

1 - 设计接口

B同学给出一版接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 核心接口定义
type BookDao interface {
Create(book *Book) error
Delete(bookId int64) error
List(pageNumber,pageSize int) ([]*Book, error)
Update(bookId int64, bookName string) error
}

// 实例化,新建
func NewBookDao() BookDao {
}

type Book struct {
// 具体实现
}

这里并没有真正的代码实现。代码重点包括3个部分:

  • interface的定义:核心内容,方便使用者阅读
  • 实例化:interface怎么创建
  • 数据结构:interface涉及的结构体

这一块,非常考验B同学的代码设计能力:怎么样让使用者快速了解你的设计?注释固然是一个不错的方式,但更好的方式是通过函数名、参数名等,详情可参考《 Effective Go》、《代码整洁之道》等资料。

2 - 审核接口

在B同学完成初步设计后,就需要A同学进行审核。审核主要的目标:发掘信息差,保证最终功能的正确性

信息差来源于不同模块的上下文差异。比如说,数据库同学更关注底层的数据存储,而API层的同学更关注用户的使用场景。所以,通过评审,A同学可以发现与B同学的信息差,并对接口提出意见、希望B同学加以改进。

从上面的示例来看,可能存在如下问题,我用注释的方式加以说明(往往结合Code Review):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type BookDao interface {
// 需求点1:提供批量创建的能力
Create(book *Book) error
// 需求点2:能否支持软删除
Delete(bookId int64) error
// 需求点3:查询能否支持一些字段的模糊查询,如bookName
// 需求点4:需要查询满足条件的Book总数,支持分页功能
List(pageNumber,pageSize int) ([]*Book, error)
// 需求点5:需要修改其余字段,如作者author
Update(bookId int64, bookName string) error
}

// 需求点6:字段缺失:如出版商、出版时间
type Book struct {
}

接下来,就是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

二维码