作者:谢伟(内容经作者授权转载

链接:https://url.leanapp.cn/BP2weAb


我叫谢伟,是一名侧重在后端的程序员,进一步定位现阶段是 Web 后台开发。


由于自身智力一般,技术迭代又非常快,为不至于总处于入门水平,经常会尝鲜新技术。


为保持好奇心,日常除技术以外,还会涉猎摄影、演示设计、拍视频、自媒体写作等。


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


记忆


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


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


创造机会


主动承接更为复杂的任务


这个比较容易理解,因为更为复杂的任务,你才可能尝试使用新的技术栈,有机会进行其他技能的锻炼,这样就能进入「学习区」


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


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


旧知识补全


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


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


补知识体系


即使是你能完成的任务,你有没有尝试过自己独立写一个,你有没有尝试过自己弥补下不懂的知识点,你有没有尝试过总结下自己的开发流程是否是最优的,你有没有尝试过总结下项目的技术要点,你有没有尝试过提炼可以复用的技术点...


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


也许你工作中已经有一门常用编程语言,但都是靠 Google、StackOverFlow,你是不是要尝试梳理下整个编程语言的知识体系,当然梳理的切入点依然是和工作相关为先,因为这最迫切,最能反复,使用频率最高。


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


也许...


也许你还可以翻阅源码,比如内置库的实现,之前我还不太会关注这些,写起代码来不是很有底气,后来经常性的查看源码,借助 IDE 的跳转功能实现对源码的阅读,再结合 IDE 的 structure ,可以对文件的函数、结构体、方法等进行组织。这样从整体观看一目了然,看得多了,你甚至可以总结出一些共性:



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



举个例子


net/http 包几乎奠定了 Go 领域所有 Web 框架、网络请求库的基础。由此来看下我是如何梳理的。


了解 HTTP 相关知识 


随意找本相关的书,发现是个大块知识啊。结合一般的历史经验,你可能作出这么张思维导图。


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


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


net/http 客户端


网络请求分为两个层面:



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 的跳转功能。


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


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



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


同理,http.Post 和 http.PostForm 也是。


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



type Client struct {	
  ...	
}


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


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


好,关于net/http 客户端层面,你现在应该清楚如何使用了。你既可以使用默认的,默认的如果达不到需求,你可以自己实例化一个client, 你还可以实例化 http.Request ,最后调用 client.Do 方法,都可以完成目的。


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())	
}


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


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


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


使用一些 web 框架


总结


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


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


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


end


LeanCloud,领先的 BaaS 提供商,为移动开发提供强有力的后端支持。更多内容请关注「 LeanCloud 通讯」

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

相关文章:

  • 2021-05-31
  • 2023-03-16
  • 2021-10-31
  • 2022-01-16
  • 2021-10-03
猜你喜欢
  • 2022-12-23
  • 2021-10-29
  • 2021-11-23
  • 2021-08-06
  • 2021-12-13
  • 2021-12-02
相关资源
相似解决方案