法度榜样员天天都和代码打交道。经由数年的基本教导和职业培训,大年夜部分法度榜样员都邑「写」代码,或者至少会抄代码和改代码。然则,会读代码的并不在多半,会读代码又真正读懂一些大年夜项目标源码的,少之又少。这种怪状,真要穷究起来,怪不得法度榜样员这个群体本身 —— 它是两个原因造成的:
- 我们所有的教导和培训都在强调怎么写代码,并没有教大年夜家若何读代码
- 大年夜多半工作场景都是一个萝卜一个坑,我们只须要懂得一个体系的局部便能开展工作,读不相干的代码,似乎没用
我经常把写代码和写作进行类比 —— 二者有很多相通之处;但大年夜培养写代码和写作的过程来看,二者又有很多不合。我们的写作才能,是建立在大年夜量基本浏览的基本上的,是除了进修语法和文法常识外,大年夜小学开端,经年累月,经由过程浏览各类不合层次的名家的作品,再加上各类各样的写作练习,累积出来的;而我们的写代码的才能,在懂得和控制了语法/文法之后(进修和抄写 example 代码也算语法/文法进修的一部分),跳过了大年夜量浏览名家作品的过程,直接 biu 地一下就主动养成了:学会基本的语法和实验了若干 example 后,我们就火箭般蹿到了本身写代码打怪赞经验的阶段。如许略过大年夜量浏览代码的阶段有三个害处:
- 写代码的基本是不坚固的,打怪进级的过程也是最慢的。事理很简单 —— 前辈们踩过的坑,总桨?江验教训,你都不得不亲自用最慢的办法一点点试着踩一遍。
- 很轻易养成 stackoverflow driven 的写代码习惯 —— 碰到不知若何写的代码,大年夜网上找现成的谜底,找个高票的复制粘贴改吧改吧,凑活着完成功能再说。写代码的过程中碰到问题,开启调试模式,要么设置无数断点一步步跟踪,要么到处打印信息试图为满是洞穴的代码打上补丁,导致全部写代码的过程是一部调代码的血泪史。(见我的文┞仿:你要避免的软件开辟模式)
- 你四周最强的那个工程师的开辟程度的上限就是你的上限。
大年夜小学到高中,就语文而言,12年时光,单单教材我们要读十二册,数百篇文┞仿。如不雅每篇文┞仿平均一千字,那么我们读了数十万文字。这些文字,我们是精读过的(有些甚至请求全文背诵)。每篇文┞仿我们须要总结中间思惟,段落大年夜意,归纳出论点论证论据或者时光义务地点原由经由结不雅,会分析长句难句,会进修起承转结,并反复练习基本的遣词造句才能,并最终模仿那些文┞仿写出本身的文┞仿。在这个过程中,我们学会了赋、比、兴,我们控制了三段论,我们知道了若何用更优雅处所式表达本身的思惟。更重要的是,这些浏览练习让我们在我们在离开黉舍的基本教导后,可以本身自力完成一本书的浏览。我们不再依附师长教师或者参考书为我们给出段落大年夜意,中间思惟,我们知道若何粗读,细读甚至类比浏览一本书,我们能榜书中的精华浓缩成思维导图,也大年夜段大年夜段摘录书中出色的句子,段落或者篇章。
这十几年的时光,算上各类课外浏览,世界名著,古典文学,金庸古龙,修改玄幻,一个大年夜学卒业的二十几岁的青年人,浏览量应当不下几百万字。而稍稍浏览广些的读者,上切切字的浏览累积是常有的事。有了这些累积,你才能在迎面走来一位妙龄女子,想到的是肌肤胜雪,明眸善睐,桃腮带笑,齿如含贝,气若幽兰,美艳弗成方物,一笑倾城,再笑倾国,沉鱼落雁,闭月羞花这些词句,而非不知若何表达,只能吞吞口水,在肚子琅绫瞧上一句:「我擦,美男啊」。
information -> knowledge -> wisdom 是个经久的累积,并非一朝一夕之功。
我们再回到读书进行类比。
这是读书的第一大年夜功用:累积素材(information)。你是否写文┞仿时,经由一番搜肠刮肚,也不知该若何描述某事某物?同样的,写代码时,有没有毫无头绪,不知大年夜何写起的时刻?或者有了些的思路,双手却在键盘上迟滞,不知所措?这些现象,大年夜多是缺乏累积所致。
读书的第二大年夜功用:是开辟思路。有时刻,一段文字,甚至一个句子,在你料想之外劈面而来,让你有种醍醐灌顶的感到。比如『围城』里,赵辛楣和方鸿渐鸿初次会晤,钱琅绫氰述赵的傲慢无礼,是这么写的:「傲兀地把他大年夜头到脚看一下,似乎鸿渐是本一览而尽的大年夜字幼稚园读本」。初读围城的时刻,我存眷点是其故事性,将如许的句子随便马虎放了以前,几年前再读时,才发觉它的精妙:竟能如斯简单地以物喻人,就把全部场景答复复兴到如同产生在我的面前一样活灵活现。随后,我本身的文字里也模仿着,有时甚至克意地如斯这般应用比方来加强画面感。前些日子有时再读到这句,因我有了作为一个成人,给女儿读幼稚园读本的经验,不由得莞尔一笑,旋即明白了一个门路:精妙的不是比方本身,而是对生活的细微不雅察。
我在边学 elixir 边做 policy engine(见:Policy Engine 的前世此生)的过程中,除了官方的文档和零碎的博文外,可读的内容少得可怜,我要解决的一些问题,论坛里也没人能给我较好的思路。于是我转而读了部分 iex 的代码,懂得了 elixir 代码编译的方法,最终完成了一个 auto compiler 的 app —— 它能接收一些 API 请求,对预先设备的属于其他 app 下的源码可以在 cluster 里的有且仅有一个 node 长进行编译,编译完成后在全部 cluster 的所有 node 里从新加载;在做 API 的过程中,我读了 plug(elixir 下官方的 connection adapter 实现)琅绫擎的重要逻辑,尤其是精读了 Plug.Router 的代码,搞明白了为何 Phoenix 的 router 敢传播鼓吹在 route match 阶段,其 performance 就甩同业好几个数量级。于是我做 API 时,对如安在 match / dispatch 前后若何做些动作实现 middleware,甚至 hook 进 before send,有了更清楚的思路,在写代码时,也加倍明白若何写出类似的 composable adapter。
推荐阅读
腾讯日前购入特斯拉5%股权的消息引爆业界,两边将来在人工智能(AI)范畴的合作激发存眷。其实,2016年人工智能家当就已站在全球注目标风口,多达20家人工智能公司被微软、特斯拉、谷歌母公>>>详细阅读
本文标题:为什么我们要阅读源码?
地址:http://www.17bianji.com/lsqh/34590.html
1/2 1