Golang 库开发

指导原则

  1. 开发库,写代码反而是简单的部分
    1. 总有计划外的工作
    2. 总有新的 feature
    3. 总有要修的 bug
  2. 人们衡量开源库的质量基本方式
    1. 基本的代码质量, go vet, go fmt, go lint
    2. 测试覆盖率
    3. 文档
    4. Issue open / closed 的数量
    5. GitHub star 数量多并不意味着质量高
  3. 开源库的四大要素, 可用性/可读性/灵活性/可测性

库的四大要素

可用性: 从使用者角度出发思考问题

比如要写一个 HTTP GET Request ,先创建再发送

import "net/http"

req, err := http.NewRequest(
  http.MethodGet, "https://www.google.com", nil /* no body */)
if err != nil {
  return err
}
client := &http.Client{}
res, err := client.Do(req)

但是,这种代码会经常被用到,反复写的话会很冗长,那么为什么不直接提供 GET 的接口呢?

import "net/http"

client := &http.Client{}
res, err := client.Get("https://www.google.com")

可读性

灵活性

还是 GET 的例子,如果要加 request logging

import "net/http"

client := &http.Client{}
res, err := client.Get("https://www.google.com")

有一个可替换的 RoundTripper interface

type Client struct {
    // Transport specifies the mechanism by which individual
    // HTTP requests are made.
    // If nil, DefaultTransport is used.
    Transport RoundTripper
type RoundTripper interface {
    RoundTrip(*Request) (*Response, error)
}

这样只需要指定一个 loggingRoundTripper 就可以了,不需要 wrap

import "net/http"

client := &http.Client{Transport: loggingRoundTripper}
res, err := client.Get("https://www.google.com")

可测性

  • 不仅要自己保证自己可测
  • 还提供 test helper 给 caller 用

向后兼容

  • 任何 exported entity
    • 重命名、移除
    • 函数参数类型的修改
    • interface 加一个 method

这些都有可能导致 breaking change,这个时候就需要 semantic version 了

版本控制

Semantic Versioning 2.0.0 | Semantic Versioning

MAJOR.MINOR.PATCH
  • patch: a bug fix
  • minor: a new non-breaking change
  • major: a breaking change

Stable / Unstable?

  • v < 1.0 unstable
    • 从 0.1.0 开始,每个 release 的时候 increment MINOR,bug fix 的时候 increment PATCH
  • v >= 1.0 stable 正式版 release 1.0

Version Bump 很难,在 micro services 大系统中的核心库大概会花 6 个月到 1 年来更新所有的 dependencies

^1.1 is short for >= 1.1, < 2;
~0.2 is short for >= 0.2, < 0.3

Pin to version range vs Lock exact version

如何休息?

为什么要休息?

  • 成长 = 压力 + 休息。压力太大休息太少,人会被击垮;压力不够而休息太多,人就会自满而停滞不前。高手会合理分配压力和休息,高效、持续地成长。
  • 进行有针对性的、高强度的训练,然后休息和恢复。再重复这个过程,但略微提高强度,能有效提升身体机能。

休息可以恢复什么?

  • 脑力工作者最需要花费,也是最需要从休息中恢复的两个资源,是意志力和注意力,所以
    1. 要休息,先断网
    2. 短而频繁的休息比长时间工作然后长时间休息更好
    3. 休息的时候最好离开办公室

什么是休息,什么不是休息?

  • 有用的休息:放松、社交(瞎聊,wechat)
  • 无用的休息:吃东西,认知(看新闻、查邮件)

怎么休息?

  • 短期
    1. 适时户外散步。活动肢体可以增加给大脑的供血量,同时给大脑提供一个恰到好处的“打扰”。就算不正式散步,每隔一个小时站起来走几步,也是很好的休 息。
    2. 回到大自然中去,置身花草树木、山川河流都可以休息。甚至看大自然图片,也能对大脑产生明显的效果。把电脑桌面换成自然风景也有用。
    3. 跟朋友聚会,聊聊天、喝点酒。必须是朋友,是为了友情,而不是为了什么“人脉”。
  • 中期
    1. 好的休假就像充电,可以让人在后面很长一段时间有充沛精力。休假的时候,要完全抛开工作。除了散步、回归自然、跟朋友聚会,还可以听音乐、洗澡, 但是打游戏、半夜刷手机这些消耗注意力的活动,统统不行。
  • 长期
    1. 学会冥想。找个不受打扰的时间,舒服地坐在一个安静的地方;深呼吸,体会肚子随着呼吸起起伏伏。意识始终只想呼吸,但不用刻意回避脑子里冒出来 的想法,承认它,然后把它放走。从每天1分钟开始,逐渐增加时间。
    2. 睡眠非常重要,它的作用不仅仅是消除疲劳,更重要的是让身体和大脑“成长”。睡眠要规律,以每晚7-9个小时为宜,具体长短因人而异,以不用闹钟、 自然醒为最好。

如何不集中注意力? 注意力是一个有限的资源。当你集中注意力的时候,你就在消耗有关注意力的脑回路。可是养神怎么养呢?我们每时每刻都在想事情,想停都停不下来,那什 么叫“不集中注意力”呢?这就引出一个重要概念,叫做“ 默认模式网络(default mode network) ”

  1. “积极的建设性的白日梦(positive constructive daydreaming,简称 PCD)”
  2. 小睡片刻。
  3. 假装自己是别人,视压力为挑战而不是威胁,跟自己打气

Ref

© 2010-2018 Tian
Built with ❤️ in San Francisco