Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【每周小结】2023-Week2

【每周小结】2023-Week2

作者头像
junedayday
发布于 2023-02-18 08:36:59
发布于 2023-02-18 08:36:59
27600
代码可运行
举报
文章被收录于专栏:Go编程点滴Go编程点滴
运行总次数:0
代码可运行

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

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

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

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

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

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

从下图来看:

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

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

1 - 设计接口

B同学给出一版接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 核心接口定义
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【每周小结】2023-Week3
本周,我的工作模式正式从远程办公回到了现场办公。恰逢过年,整体工作节奏放缓,切换的过程很顺畅。
junedayday
2023/02/18
5360
【每周小结】2023-Week3
【每周小结】2023-Week4
在面向对象开发的场景下,我们经常会写高度重复的Go代码。为了帮助大家形成一定的方法论,这里以一个具体场景为例,分享我的三个技巧。
junedayday
2023/02/18
2440
【每周小结】2023-Week4
【每周小结】2023-Week5
Go官方最近开放了一个问卷,里面收集了用户的相关意见。整个问卷是全英文的,全部填完需要15min左右,有很多是收集用户背景与满意度的常规问题。
junedayday
2023/02/18
2830
【每周小结】2023-Week5
Spring-JDBCTemplate
今天开始学习我自己总结的 Java-学习路线 中的《Spring-JDBCTemplate》,小简从 0 开始学 Java 知识,并不定期更新所学笔记,期待一年后的蜕变吧!
小简
2023/01/04
3720
【每周小结】2023-Week6
本周Go语言1.20版本正式发布,我们对其重要特性进行简单分析,为后续掌握Go的发展脉络做好铺垫。
junedayday
2023/02/18
3020
【每周小结】2023-Week6
springboot第18集:SpringMVC我的春天
MVC是一种常用的软件设计规范,它将一个应用程序分为三个不同的部分:模型(Model)、视图(View)、控制器(Controller)。这三个部分相互协作,共同完成应用程序的各项任务。
达达前端
2023/10/08
1660
springboot第18集:SpringMVC我的春天
AIDL源码解析in、out和inout
为什么会想写这篇文章,只因为一个error idl.exe E 4928 5836 type_namespace.cpp:130] 'Book' can be an out type, so you must declare it as in, out or inout. 看过上一篇文章Android:IPC之AIDL的学习和总结的同学都知道这是因为在AIDL文件中使用非常规类型作为参数传递的时候没有标记指向tag,那么到底为什么会是这样子的呢,作为一个好奇宝宝我想好好看看。
静默加载
2020/05/29
1.9K0
【每周小结】2023-Week7
在Go语言开发的过程中,我们或多或少会引入并发模式,常见的如go、channel、sync.WaitGroup等。这些并发原语使用起来很方便,但常常会阻碍相关代码的单元测试,如依赖的channel发生阻塞,mutex被锁等,导致想验证的重要代码根本跑不到。
junedayday
2023/02/18
3090
【每周小结】2023-Week7
手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis
本文发表于2016年6月,写于作者学生时期。文中使用到的技术和框架可能不是当下最佳实践,甚至很不“优雅”。但对于刚接触JavaEE和Spring的同学来说,还是能有很多收获的,大牛轻拍= =
全栈程序员站长
2022/07/31
4210
手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis
一文解读spring中事务管理
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
一个风轻云淡
2023/10/15
3400
一文解读spring中事务管理
购物车的实现(jsp的session+Java的Map的结合)
1:电商如此发达的现在,作为一个web开发程序猿,如果不会写购物车,真是有点不好意思找工作。所以抓紧练习啊,从上篇博客中抽离出如何实现购物车的功能。 2:首先需要理解购物车实现的一些基本步骤。   2
别先生
2018/01/02
5.1K1
购物车的实现(jsp的session+Java的Map的结合)
手把手整合SSM框架
目录包括 main、resources、mapper、webapp,不一一介绍,不熟悉查看前面文章。
JavaPub
2020/07/12
7191
手把手整合SSM框架
初步使用Druid连接池+代码示例:对图书进行增删改查
1.创建数据库,向里面添加数据 数据库名:BookShop #用户表 CREATE TABLE USER( id INT(11) PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) NOT NULL, PASSWORD VARCHAR(32) NOT NULL, realname VARCHAR(20), email VARCHAR(50) NOT NULL, gender VARCHAR(50) NOT NULL, flag INT(11), role IN
2020/10/23
9800
初步使用Druid连接池+代码示例:对图书进行增删改查
Android:IPC之AIDL的学习和总结
为了使得一个程序能够在同一时间里处理许多用户的要求。即使用户可能发出一个要求,也肯能导致一个操作系统中多个进程的运行(PS:听音乐,看地图)。而且多个进程间需要相互交换、传递信息,IPC方法提供了这种可能。IPC方法包括管道(PIPE)、消息排队、旗语、共用内存以及套接字(Socket)。
静默加载
2020/05/29
1.4K0
Binder 进程通信
对应一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间,当然内核空间的大小是可以通过参数配置调整的。对于用户空间,不同进程之间彼此是不能共享的,而内核空间却是可共享的。Client进程向Server进程通信,恰恰是利用进程间可共享的内核内存空间来完成底层通信工作的,Client端与Server端进程往往采用ioctl等方法跟内核空间的驱动进行交互。
Yif
2019/12/26
8840
21.<基于Spring图书管理系统②(图书列表+删除图书+更改图书)(非强制登录版本完结)>
针对先上线的程序而言 比如后端接口从A改成了B。(前端接口也要修改) 如果后端先上线:前端调用就会出错,找不到A接口 如果前端先上线,前端调用依然会报错,找不到B接口。因为此时后端还没上线。 正确的做法:后端对之前的接口进行兼容,如果兼容则同时存在A和B接口 实现方式 实现开闭原则的方式主要包括:
用户11288958
2024/11/21
1340
21.<基于Spring图书管理系统②(图书列表+删除图书+更改图书)(非强制登录版本完结)>
Spring6 JdbcTemplate和事务
Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作
鱼找水需要时间
2023/06/17
3970
Spring6 JdbcTemplate和事务
Spring:声明式事务
Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作
愷龍
2023/02/09
7210
Spring:声明式事务
Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作
愷龍
2023/02/10
7210
Spring:声明式事务
spring6-事务
Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作
程序员小甲
2023/10/13
2241
spring6-事务
相关推荐
【每周小结】2023-Week3
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档