内容简介:我叫谢伟,是一名侧重在后端的程序员。自身智力一般,技术迭代又非常快,为不至于总处于入门水平,给自己定位是后端,进一步定位现阶段是为保持好奇心,经常会尝鲜新技术,其实不仅仅是技术,比如摄影、演示设计、拍视频、自媒体写作啊等,都会经常性的涉猎。
我叫谢伟,是一名侧重在后端的程序员。
自身智力一般,技术迭代又非常快,为不至于总处于入门水平,给自己定位是后端,进一步定位现阶段是 web
后台开发。
为保持好奇心,经常会尝鲜新技术,其实不仅仅是技术,比如摄影、演示设计、拍视频、自媒体写作啊等,都会经常性的涉猎。
如果此刻我是一个成功人士,看到上面的领域,有人会羡慕说:"斜杠",遗憾的是,在下没有成功,所以,上面的领域都一定程序上会被人认为:"不务正业",不重要的,重要的是:我依然是一名后端程序员。
记忆
记忆有遗忘曲线,这是大家都懂的道理,所以为了防止忘记,最重要的方法是经常使用、反复使用。这也就是为什么,有些人说:在工作中学最容易进步,因为工作的流程、项目啊之类的不会频繁变动,你会经常性的关注一个或者多个项目进行开发,假以时日,你会越来越熟悉,理所当然,你会越做越快。这个时候,也叫达到了所谓的:舒适圈。要再想进步,你得跳到"学习区"内去。再反复这个动作。
问题是,除了工作之外,你很少有其他机会再进行技能锻炼了。
创造机会
- 主动承接更为复杂的任务
这个很清晰,更为复杂的任务,你才可能尝试使用新的技术栈,这样你有机会进行其他技能的锻炼,这样就能进入学习区。
如果公司项目就这么点,没有太复杂的,或者说新项目和你接触的相差不多,只不过应用场景不同而已。这个时候,任务如果一定需要你的参与,这个时候,你最好尝试新的架构,尝试新的技术点,尽管大体相同,可以将你认为原系统不合理的地方改进,这样也能创造机会进入学习区。
但就我认为,一般项目开发时间都非常紧,开发人员有可能没有充足的时间进行考虑,会依然使用原有技术点,这样进入学习区的机会就被浪费了,你只是使用一份经验,做了两个类型的项目而已。
旧知识补全
刚进入职场,核心位置就那么几个人占着,论经验、论资历,你都不如别人,你接触到的资源有限,没有新项目让你独立开发,只有旧项目的Bug让你修复,那该怎么办?
换坑吗?怕不怕是另外一个坑?
- 补知识体系
即使是你能完成的任务,你有没有尝试过自己独立写一个,你有没有尝试过自己弥补下不懂的知识点,你有没有尝试过总结下自己的开发流程是否是最优的,
你有没有尝试过总结下项目的技术要点,你有没有尝试过提炼可以复用的技术点...
如果你都没有,恭喜你,你又找到了一个进入学习区的点,即:补充原有技术栈。
也许你对一门编程语言能用,但都是靠 Google、stackOverflow,你是不是要尝试梳理下整个编程语言的知识体系,当然梳理的切入点依然是和工作相关为先,因为这
最迫切,最能反复,使用频率最高。
也许你对数据库相关知识能用,对优化数据知识点不是很懂,你是不是要尝试下找相关资料弥补下。
也许...
也许你还可以经常性的翻阅源码,比如内置库的实现,之前我还不太会关注这些,写起代码来也不是很有底,后来经常性的查看源码,借助IDE的跳转功能
可以实现对源码的阅读,再结合IDE的 structure
,可以对文件的函数、结构体、方法等组织起来。这样从整体观一目了然,看得多了,
你甚至可以总结出一些共性:
- 比如包的错误处理一般定义在包的顶部几行,而且格式都统一
- 比如
Interface
是方法的集合,内置的常用的Interface
其实不多,很多内置包都相互实现 - 比如包的结构体,可以实例化一个默认的,这样可以直接调用函数,比如
http.DefaultClient
...
阅读库的源码,我一般是怎么做的呢?(不要太关注具体的实现,除非你完全能看懂)
structure
举个示例: net/http
包几乎奠定了 Go 领域所有 web
框架、网络请求库的基础。
1. 了解 HTTP 相关知识随意找本相关的书,发现是个大块知识啊。
结合一般的历史经验,你可能作出这么张思维导图。
整个过程像是:你从一本书总摘出的目录,前提是看过书的内容而得出来的。
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 的跳转功能。
结合 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
方法,都可以完成目的。
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()) } 复制代码
至此,你的思维导图大概这样:
当然企业级的 web
服务开发还需要考虑:
- 路由设计
- 请求参数检验
- 响应信息
- 前后端分离
- 错误处理信息
- ...
4. 使用一些 web 框架
- gin
- echo
- iris
- beego ...
总结
上文就是我日常的一些思考,希望对你有所启发。
整个的过程,其实是梳理你的知识的过程,如果你接触的知识很多,不经常理,在你脑海中,可能只是堆积,用到的时候不能及时的调用出来,所以会经常说:这个我见过啊。
及时的梳理,在脑中模块化,调用起来自然顺畅的多,当然,迫于遗忘曲线,这些动作,你还需要反复的重复。
以上所述就是小编给大家介绍的《为什么建议你常阅读源码?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python for Data Analysis
Wes McKinney / O'Reilly Media / 2012-11-1 / USD 39.99
Finding great data analysts is difficult. Despite the explosive growth of data in industries ranging from manufacturing and retail to high technology, finance, and healthcare, learning and accessing d......一起来看看 《Python for Data Analysis》 这本书的介绍吧!