作为一名年龄30+程序员,随着2023年的到来,我的工作和生活正在逐步变化。
本系列会以周维度为周期,记录我对如下三块内容的思考,大家挑选各自感兴趣的内容阅读即可:
interface
提高模块间协作效率本周要分享的一个技巧是 - 用接口interface
提高模块间协作效率。
我们在协作开发时,在划分清边界后,就需要协同开发。而这个边界,如果能结合interface
特性,就会大幅提升效率。从边界功能的角色来看,主要包括2个:提供方与调用方。
从下图来看:
我们以一个具体工作内容为例:我们要开发一个Book的CRUD的工作,但时间紧迫,所以计划分为两块:
而由于数据库部分的工作比较少,所以计划让B同学来主导接口这块工作,即B是提供方,A是使用方。接下来的三块工作内容如下:
B同学给出一版接口:
// 核心接口定义
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》、《代码整洁之道》等资料。
在B同学完成初步设计后,就需要A同学进行审核。审核主要的目标:发掘信息差,保证最终功能的正确性。
信息差来源于不同模块的上下文差异。比如说,数据库同学更关注底层的数据存储,而API层的同学更关注用户的使用场景。所以,通过评审,A同学可以发现与B同学的信息差,并对接口提出意见、希望B同学加以改进。
从上面的示例来看,可能存在如下问题,我用注释的方式加以说明(往往结合Code Review):
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
的过程,直到双方基本达成一致。
随着接口的敲定,接下来的工作就可以兵分两路了:
可以看到,interface
的定义有利于将工作进行拆分,定义关键边界,然后各自完成独立开发。
从两个角色来看,他们侧重的能力点会有差异:
这个情况不仅仅存在于模块间设计,在更大的系统设计时也有非常重要的体现。所以,这是一个很好的提升能力的机会。
最近,我经常看到一个问题:我该学习什么编程能力? 我会先关心提问者的初衷,常见分为两种:
相信绝大多数的人都是为了后者。单纯为了提升编程能力的话,自己去啃那些经典教材即可。
认清并承认自己的目标很重要。关于程序员的市场竞争力这个问题,我分享个人的三点看法:
我从本周开始,记录了自己的每日生活作息,分为7类:
记录的动作很简单,拿纸笔就能快速完成,但我在今年才开始真正地做这件事。这背后,我长期存在的一个性格问题:我清楚自己浪费时间的问题所在,但不敢真正地去面对它,更羞于看到具体的浪费时长。
我的最终目标也不是为了成为一个时间管理领域的达人,而是 让自己时间更可控,减少来自浪费时间的焦虑感。
Github: https://github.com/Junedayday/code_reading Blog: http://junes.tech/ Bilibili: https://space.bilibili.com/293775192 公众号: golangcoding