为什么建议你常阅读源码?

我叫谢伟,是一名侧重在后端的程序员。

自身智力一般,技术迭代又非常快,为不至于总处于入门水平,给自己定位是后端,进一步定位现阶段是 web后台开发。

为保持好奇心,经常会尝鲜新技术,其实不仅仅是技术,比如摄影、演示设计、拍视频、自媒体写作啊等,都会经常性的涉猎。

如果此刻我是一个成功人士,看到上面的领域,有人会羡慕说:"斜杠",遗憾的是,在下没有成功,所以,上面的领域都一定程序上会被人认为:"不务正业",不重要的,重要的是:我依然是一名后端程序员。

记忆

记忆有遗忘曲线,这是大家都懂的道理,所以为了防止忘记,最重要的方法是经常使用、反复使用。这也就是为什么,有些人说:在工作中学最容易进步,因为工作的流程、项目啊之类的不会频繁变动,你会经常性的关注一个或者多个项目进行开发,假以时日,你会越来越熟悉,理所当然,你会越做越快。这个时候,也叫达到了所谓的:舒适圈。要再想进步,你得跳到"学习区"内去。再反复这个动作。

问题是,除了工作之外,你很少有其他机会再进行技能锻炼了。

创造机会

  • 主动承接更为复杂的任务

这个很清晰,更为复杂的任务,你才可能尝试使用新的技术栈,这样你有机会进行其他技能的锻炼,这样就能进入学习区。

如果公司项目就这么点,没有太复杂的,或者说新项目和你接触的相差不多,只不过应用场景不同而已。这个时候,任务如果一定需要你的参与,这个时候,你最好尝试新的架构,尝试新的技术点,尽管大体相同,可以将你认为原系统不合理的地方改进,这样也能创造机会进入学习区。

但就我认为,一般项目开发时间都非常紧,开发人员有可能没有充足的时间进行考虑,会依然使用原有技术点,这样进入学习区的机会就被浪费了,你只是使用一份经验,做了两个类型的项目而已。

旧知识补全

刚进入职场,核心位置就那么几个人占着,论经验、论资历,你都不如别人,你接触到的资源有限,没有新项目让你独立开发,只有旧项目的Bug让你修复,那该怎么办?

换坑吗?怕不怕是另外一个坑?

  • 补知识体系

即使是你能完成的任务,你有没有尝试过自己独立写一个,你有没有尝试过自己弥补下不懂的知识点,你有没有尝试过总结下自己的开发流程是否是最优的,

你有没有尝试过总结下项目的技术要点,你有没有尝试过提炼可以复用的技术点...

如果你都没有,恭喜你,你又找到了一个进入学习区的点,即:补充原有技术栈。

也许你对一门编程语言能用,但都是靠 Google、stackOverflow,你是不是要尝试梳理下整个编程语言的知识体系,当然梳理的切入点依然是和工作相关为先,因为这

最迫切,最能反复,使用频率最高。

也许你对数据库相关知识能用,对优化数据知识点不是很懂,你是不是要尝试下找相关资料弥补下。

也许...

也许你还可以经常性的翻阅源码,比如内置库的实现,之前我还不太会关注这些,写起代码来也不是很有底,后来经常性的查看源码,借助IDE的跳转功能

可以实现对源码的阅读,再结合IDE的structure ,可以对文件的函数、结构体、方法等组织起来。这样从整体观一目了然,看得多了,

你甚至可以总结出一些共性:

  • 比如包的错误处理一般定义在包的顶部几行,而且格式都统一
  • 比如Interface 是方法的集合,内置的常用的Interface其实不多,很多内置包都相互实现
  • 比如包的结构体,可以实例化一个默认的,这样可以直接调用函数,比如http.DefaultClient
    ...

阅读库的源码,我一般是怎么做的呢?(不要太关注具体的实现,除非你完全能看懂)

  • 官方文档:了解常用使用方法
  • 思维导图:输出可导出的结构体、函数、方法等,依然选择最为常用的
  • IDE 的 structure 功能,查看文件的具体组织形式,看可导出的结构体、函数、方法等
  • 持续总结

举个示例:net/http 包几乎奠定了Go领域所有web 框架、网络请求库的基础。

1. 了解 HTTP 相关知识
随意找本相关的书,发现是个大块知识啊。

结合一般的历史经验,你可能作出这么张思维导图。

image

整个过程像是:你从一本书总摘出的目录,前提是看过书的内容而得出来的。

2. net/http 客户端

网络请求分为两个层面:1。客户端发起网络请求 2。服务端提供网络请求访问资源

func getHandle(rawString string) {
    response, err := http.Get(rawString)
    if err != nil {
        return
    }
    defer response.Body.Close()
    content, _ := ioutil.ReadAll(response.Body)
    fmt.Println(string(content))
}

看上去发起网络请求很简单,只需要使用 http.Get 即可。

为完善认知,去看看源码,直接使用IDE 的跳转功能。

image

结合 IDE 的structure 功能,原来http.Get 是源码中有一个默认的DefaultClient 调用其方法 Get

func Get(url string) (resp *Response, err error) {
    return DefaultClient.Get(url)
}

同理,http.Posthttp.PostForm 也是。

理所当然,你可以自定义个定制化的client,调用其 Do或者 Get、Post、PostForm 方法等

type Client struct {
    ...
}

这个时候,你的思维导出可能是这样:

image

好,关于net/http 客户端层面,你现在应该清楚如何使用了。你既可以使用默认的,默认的如果达不到需求,你

可以自己实例化一个client, 你还可以实例化 http.Request ,最后调用 client.Do 方法,都可以完成目的。

3. net/http 服务端

服务端比较重要,日常web 开发,也绝大部分是在服务端工作。

如何启动web服务呢?

type SelfHandler struct {
}

func (SelfHandler) ServeHTTP(writer http.ResponseWriter, req *http.Request) {
    writer.Write([]byte("Hello Python"))
}

func main(){
        // method One
        http.HandleFunc("/hello_golang", func(writer http.ResponseWriter, request *http.Request) {
            writer.Write([]byte("Hello Golang"))
        })
    
        // method Two
        var self SelfHandler
        http.Handle("/hello_python", self)
        log.Fatal(http.ListenAndServe(":9090", selfServerMux))
}

分为两步:定义路由和触发路由之后的动作、启动服务。

看上去也很简单啊,看看源代码,服务端比客户端更为复杂。

func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

原来又使用了内部一个默认的DefaultServeMux(请求路由器)。Handler 是个接口。上文中 SelfHandler 实现了 Handler 接口。

之前你可能会有点混淆,Handle、HandleFunc、Handler 之间的关系。对比着看,你应该会清晰些。

既然使用默认的DefaultServeMux, 那么也可以定制化ServeMux

func main(){
        var selfServerMux *http.ServeMux
        selfServerMux = &http.ServeMux{}
        selfServerMux.HandleFunc("/hello_golang_2", func(writer http.ResponseWriter, request *http.Request) {
            writer.Write([]byte("Hello Golang 2"))
        })
        log.Fatal(http.ListenAndServe(":9090", selfServerMux))

}

同时可以定制化服务端的配置信息。


func main(){
    var selfServer http.Server

    var selfMux *http.ServeMux
    
    selfMux = &http.ServeMux{}
    
    selfMux.HandleFunc("/d", func(writer http.ResponseWriter, request *http.Request) {
        writer.Write([]byte("Hello Mux"))
    })

    selfServer = http.Server{
        Handler: selfMux,
        Addr:    "localhost:9098",
    }
    log.Fatal(selfServer.ListenAndServe())
}

至此,你的思维导图大概这样:

image

当然企业级的web 服务开发还需要考虑:

  • 路由设计
  • 请求参数检验
  • 响应信息
  • 前后端分离
  • 错误处理信息
  • ...

4. 使用一些 web 框架

  • gin
  • echo
  • iris
  • beego
    ...

总结

上文就是我日常的一些思考,希望对你有所启发。

整个的过程,其实是梳理你的知识的过程,如果你接触的知识很多,不经常理,在你脑海中,可能只是堆积,用到的时候不能及时的调用出来,所以会经常说:这个我见过啊。

及时的梳理,在脑中模块化,调用起来自然顺畅的多,当然,迫于遗忘曲线,这些动作,你还需要反复的重复。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容