前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【每周小结】2023-Week2

【每周小结】2023-Week2

作者头像
junedayday
发布2023-02-18 16:36:59
2670
发布2023-02-18 16:36:59
举报
文章被收录于专栏:Go编程点滴

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

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

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

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

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

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

从下图来看:

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

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

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

1 - 设计接口

B同学给出一版接口:

代码语言:javascript
复制
// 核心接口定义
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):

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go编程点滴 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Go技巧 - 用接口interface提高模块间协作效率
    • 1 - 设计接口
      • 2 - 审核接口
        • 3 - 实现与使用接口
          • 小结
          • 编程思考 - 提高个人的市场竞争力
          • 工作生活 - 记录生活作息
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档