本节课,我来给你分享下 Go 项目开发中,我的项目开发思维模式、开发思路,以及你可以从哪些方面去提高你的项目开发质量。
思维驱动下的项目开发设计
从业十年多,开发生涯带给我的不光是一份可以养家糊口的工作,还锻炼了我的思维,形成了一套架构师思维。什么是架构师思维,其实没有一个官方定义,纯粹是我为了便于说明杜撰的一个名字。
我理解的架构师思维方式如下:首先明确需求,之后根据需求进行全行业的产品、技术调研。接着,结合需求、调研结果给出一套架构设计方案,该方案是结合了各种方案实现,升华改进后的最佳方案,方案中不仅有上层架构设计,还有架构中各个功能点的详细实现。方案中也会考虑各种异常场景,并给出相应的解决方案。之后,参考方案设计,从中进行工作任务拆分,并给出DDL(Deadline)。后面根据任务优先级,不断往前滚动、迭代,最终实现产品功能。思维过程如下图所示:
上述思维流程可以简单概括为:全面调研 -> 输出最佳方案 -> 排期实现。这种思维方式有很多好处,例如:
- 可以结合行业已有方案,输出最佳方案;
- 方案考虑周全、长远,可以满足现在,也能满足未来;
- 方案具有很强的可实施性,能够顺利排期迭代。
在这种思维模式主导下,在真正开始研发一个项目之前,我们也需要提前思考、规划下,如何开发一个高质量的 Go 项目。本节课,就是这种思维模式下的产物。
提示:如果我们把上述需求从软件需求,扩展为其他各类需求,例如:如何购买一个性价比最高的MP3、如何解决 35 岁焦虑等等,通过架构师思维,最终你也会觅得一个成熟、靠谱的实现方法。
Go 项目开发中我的一些开发"原则"
在 Go 项目开发中,每个人都有一些开发原则。本小节,我来分享下我开发过程喜欢的一些开发思路。这些开发思路都是为了构建一个:易阅读、易维护、易扩展的高质量 Go 项目。
下面介绍的一些开发思路,其实并不是标准答案,也没有一个非常明确的对错衡量界限。大家仅供参考即可。
原则一:简洁 > 性能
在 Go 项目开发中,其实很多应用并不需要极高的性能。例如:A 日志包的性能会略低于 B 日志包的性能。但是 A 日志包可以更清晰、更方便的记录日志。在这种情况下,我可能会舍弃这点性能损失,二选择更简洁易用的 A 日志包。
在我的项目开发生涯中,发现一些开发者,为了一点点,几乎可以忽略的性能,写出了很复杂的代码逻辑,导致项目阅读、维护起来很难,个人觉得完全可以牺牲这微乎其微的性能,而让你的代码变得更加易读、易维护。
原则二:易读 > 代码量
有时候为了提高代码的易读性,我会牺牲代码量,适当增加一些代码,来使代码变得更加清晰、易理解。
例如,有以下代码段:
package main
type Novel struct {
Content string
FullContent string
}
func main() {
var category string
var novel Novel
// content := GetContentVX(category, novel)
}
func GetContentV1(category string, novel Novel) string {
if category != "military " || novel.FullContent == "" {
return novel.Content
}
return novel.FullContent
}
func GetContentV2(category string, novel Novel) string {
if category != "military " || (category == "military " && novel.FullContent == "") {
return novel.Content
}
return novel.FullContent
}
func GetContentV3(category string, novel Novel) string {
// 如果category不是military或者当category为military,但是FullContent字段为空时取Content字段的内容
// 否则取 FullContent 字段的内容
// 注意:不要调换或条件的位置
if category != "military " || novel.FullContent == "" {
return novel.Content
}
return novel.FullContent
}通过 GetContentVX来获取 Novel 的内容。获取内容的逻辑为:如果category不是military或者当category为military,但是FullContent字段为空时取Content字段的内容,否则取FullContent字段的内容 。
有以下 3 种实现:
- GetContentV1:函数最简洁,但是从代码并不是很容易看得出取值逻辑。随着 项目的迭代,未来可能会有一些风险,例如:调换或条件位置,造成取值错误。
- GetContentV2:通过增加小量代码,来使判断逻辑更清晰;
- GetContentV3:对于不清晰的判断逻辑,进行详细的注释。
在实际开发中,我会选择 GetContentV3来详细说明这里的判断逻辑,避免未来调换或条件带来的取值异常。
上面,就是通过牺牲代码的简洁性,来提升代码的易读性,进而降低未来的维护成本和风险。
原则三:进度再赶,开发时也要思考代码的最佳实现方式
第三个原则,就是项目开发中,不管进度再紧迫,我都会花一点时间,哪怕加班,也要思考下代码中有哪些地方可以优化、有哪些地方会有更好的实现。因为,我坚信一个优秀的代码实现,是给自己未来排雷,让自己未来更轻松。
如何写出高质量的 Go 项目?
接下来,我就来介绍下如何开发一个高质量的 Go 项目。在回答这个问题之前,我们先来看另外两个问题:
- 为什么是 Go 项目,而不是 Go 应用?
- 一个高质量的 Go 项目具有哪些特点?
先来看第 1 个问题。Go 项目其实是一个偏工程化的概念,不仅包含了最核心的 Go 应用,还包含了项目管理和项目文档:
要开发一个高质量的 Go 项目,在我看来就是用“最佳实践”的方式去实现 Go 项目中的 Go 应用、项目管理和项目文档。具体来说,就是高效的管理项目、开发高质量的 Go应用、编写高质量的项目文档。为了协助你理解,我将这些逻辑绘制成了下面一张图。
一个高质量的 Go 项目,不仅要求我们的 Go 应用是高质量的,还要确保我们的项目管理和文档也是高质量的。在我看来一个高质量的 Go 项目应该具备以下特点:
- 项目管理高效:能够便捷高效的管理 Go 项目,例如:代码编译、单元测试、代码生成、代码静态检查等;
- 代码质量高:代码结构清晰、简洁、可扩展;代码逻辑实现清晰、简洁、可扩展;符合 Go 代码开发规范、最佳实践;代码稳定、性能高等;
- 文档质量高:拥有全面的文档,而且文档内容格式规范、质量高、更新及时等。
换句话说,要开发一个高质量的 Go 项目其实就是:
- 高效的管理项目;
- 开发高质量的 Go 应用;
- 编写高质量的项目文档。
上面 3 个特点,是我在开发过程中觉得比较重要的点,这些点会极大的影响整个项目的质量。如果你觉得,还有其他因素可以影响到项目质量,也欢迎评论区分享。上述 3 个特点,共同作用,可以确保我们的 Go 项目是易阅读、易维护和易扩展的,并可以是你充分享受到高质量 Go 项目带来的各种好处。
接下来的课程,我会围绕上面 3 个点来详细介绍具体该如何做:
- 高效的管理项目:第 02 节 ~ 第 10 节;
- 开发高质量的 Go 应用:第 11 节 ~ 第 20 节;
- 编写高质量的项目文档:第 21 节。