转自: https://mp.weixin.qq.com/s/92Cr_kE1djVDvB24N_kCvAjava
我工做已经将近12年了(其实12年才混到这个地步,天资实在是通常),在华为作了5年,在UC作了6年,如今主要负责阿里游戏的中间件和组件的架构设计和实现,包括用户消息推送、系统异步通知系统等等。nginx
同时我还带了三四十人的研发团队,除了工做之外,我也喜欢写博客,是CSDN、云栖的社区之星和博客专家,InfoQ的签约做者。程序员
整体上来讲,我如今虽然还算不上业界顶级的大牛,但在公司也算一头小牛了,今天个人分享将综合本身的成长经历给你们谈一谈怎么样成为一个大牛。我如今还在业界的大牛路上狂奔,但我以为这些经验和技巧应该是每一个同窗均可以用到本身的平常工做和生活当中的。web
一举成名背后是1万小时的不断练习如何成为大牛?这个问题以前有不少人问我:你是怎么成为技术上的一个大牛的?最开始的时候我也常常跟他们讲你要去看看某某某开发方案,深刻学习UNIX的开发等等这些“术”的东西,后来我在思考,是否有成为一种大牛的“道”上面的东西,也就是说无论你作产品、作运营、作运维、程序员仍是测试,经过这个方式都可以成为一个大牛呢?面试
经过寻找和思考,后来真的让我找到了应用到全部行业、全部职业我称之为成为大牛的一个道,这是1万小时理论。数据库
我先简单介绍一下1万小时理论,我最初看到1万小时理论是从《异类》这本书知道的,这是很出名的书,它很是有意思,我建议全部同窗都去看一下,它分析了不少成功人士背后一些咱们一般状况下不了解或没看到的一些现象,得出一些比较使人震撼的结论,其中有一个理论就是1万小时理论。npm
它里面有举了一些例子,好比说莫扎特,你们都知道他是音乐神童,6岁就开始做曲了,你看完这本书就知道他真正出人头地是20多岁的时候,也就是说他虽然6岁开始做曲,但他当时做的曲也是比较很差的。编程
因此《异类》这本书里面提到了1万小时的理论,它对我是颇有帮助的,成为世界上顶级的专家惟一的方法就是1万小时持续不断地进行练习,你们要特别注意“惟一”,也就是说绝大部分专业是没有什么天才的,所谓的天才只是他一举成名以后咱们才这样以为,在他成为天才以前至少要通过1万小时持续不断的练习。设计模式
我第一次看到1万小时的理论,以为没什么神奇的,我算了算,我工做五年就会成为业界顶级的专家了,但想一想这是不可能的,为何呢?我反思了一下我本身的工做状态,对于大部分人来讲天天的工做不少时候是重复劳动,虽然咱们一天工做8小时,可是只是重复以往的经验,并无刻意去训练提高本身。浏览器
有一个笑话是有一个10年工做经验的人去面试,面试完了以后面试官跟他说其实你只有1年工做经验,你把它重复了9年。
对于1万小时理论来讲若是你深刻思考其实它并无那么简单,这意味着什么呢?意味着你天天要花3小时时间用于提高本身的技能,这样一直作,要持续大约10年时间。你们想一想天天持续十年去作一件事情去提高本身,有几个能作到,因此咱们看到虽然有些人工做了10年,可是也不必定能成为业界的专家。
为何我要强调天天3小时?持续10年提高本身,你不能把你重复的工做算进去,你要在专业广度和深度上面不断扩展,才能业界一个顶尖的大牛或者专家。
举一个例子,一个小孩子天天唱《两只老虎》,唱10年,你以为他会成为周杰伦吗?确定不会。固然1万小时理论不适合一些领域,尤为是不适合炒股,特别是中国的股市,若是你花1万小时去炒股,可能会倾家荡产。
如何找到10000小时? 碎片化时间管理Facebook提到了经过CI工具运行npm install时的问题,由于处于安全的考虑,他们的环境与互联网是互相切断的。最直接的解决方案就是单独下载所需的模块,并将它们包含到项目的源代码中。可是,更新其中的某些数据模块会带来很大的影响。
1万小时理论听起来好像很简单,天天持续3小时,也不难,但实际上真正作起来是很难的,就像咱们互联网的人加班加成狗,感受身体每天被掏空,时间从哪来,这是一个现实问题,不要说天天抽3个小时提高本身,天天抽1个小时陪女友或者找女友的时间都不够。具体怎么作?
首先是找到3个30分钟:
第一个30分钟就是早上的30分钟,假设你习惯8点起床,明天你把闹钟改为7点半,这就多了半个小时。
第二个30分钟是睡觉前的30分钟,假设你习惯玩游戏到12点,明天晚上你玩游戏就玩到11点半。
第三个30分钟就是上班到你座位上的30分钟,有的同窗担忧说我这30分钟会不会影响我这一天的工做效率,可能加班完不成,还让我挤出30分钟来,这不用担忧,从个人经从来看挤30分钟不会影响你总体的工做效率,持续一两年,你会发现本身的收益很是大。
第二点是利用或节省路途时间
咱们天天上下班都是一两个小时,好比像我这种,怎么去利用时间呢?
首先是能够利用上下班路上的时间去看书、听书,也是能够作的。若是你以为上班路上是不能看书的,或者是不可能学习的,好比你坐广州的3号线,这是闻名中外的挤得要命的,不要说看书了,把手伸出去都不知道去哪了,那就建议你们搬到离公司近一点位置,虽然每月多几百块钱的房租,可是你要相信这个投资节省下来的时间用于提高本身,它最终的收益是10倍回报都不止的。
第三点是周末4小时
周末仍是不用怎么加班的,周末用于放松、睡觉、看电影、娱乐,你也能够在周末里面规定本身挤出4个小时,也就是天天2个小时,这样算下来,一天大概就两个多小时,再加上你在工做中的积累,天天3小时也不是很难。
接下来说一下我是怎么作的,我如今有2个小孩,并且我住的比较远,应该在座的比我忙的也不会不少,看一下我是怎么作的,我是坐广州的四号线,坐四号线天天来回能够看一个小时的书,天天迟早30分钟,周末4小时,有的同窗可能会有疑问,周末确定要带小孩玩,本身也要休息,哪里有4个小时,其实只要你去找,时间都会有的,我找的方法就是当我小孩睡觉的时候,由于小孩子睡觉通常要睡三四个小时,大人通常睡一个小时、半个小时就差很少了,因此经过这种方式,你们能够看到2015年我一共看了84本书,有专业的,也有非专业的,人文社科、历史这些都有。
不过特别提醒一下对于男程序员来讲有一个时间千万不能少,就是陪女友的时间,由于对程序员来讲找女友不容易,别看了这篇文章回去以后女友也不要了,就每天回去提高,这也不是咱们想要的生活。
10000小时理论如何轻松落地?虽然理论上很简单,但真正要落地实行也并不那么容易,实行10000小时理论的关键在于坚持,我认为坚持的关键在于本身对于所从事的事业是否有“激情和兴趣”。这点固然是核心,但若是只靠激情支撑,持续10年也确实有挑战,正如一个朋友在分享会后问个人“要持续10年才能成为大牛啊,时间好长啊”!
若是说作一件事要10年后才能修成正果,估计不少朋友就会放弃了,毕竟像唐僧那么坚决的信仰者老是少数,大部分凡夫俗子都仍是须要持续不断的激励才能有动力去作一件事,由于咱们的大脑在进化的过程当中已经造成了须要持续不断的奖励才能保持兴奋的机制,也就是说相对于在第10年给一个大奖励,还不如每一年给一个小奖励。
那如何才能在10年漫长的路上让咱们持续的坚持下去呢?答案其实就是首富的话:“先定一个能达到的小目标”!咱们来看如何将“10年成为大牛”这个目标分解为一个个能达到的小目标。我将这个方法概括为“三段分解法”,即:将一个宏大或者长远的目标通过3次分解,获得一个个短时间内能达到的小目标。具体的分解方法以下。
一段分解:分解“等级”10年成为大牛的目标虽然比较长远比较宏大,但并不意味着在没有成为大牛前,咱们一直都是菜鸟。从菜鸟到大牛的过程当中,中间其实有几个关键的里程碑,这些里程碑就是咱们的一段目标。
以技术人员为例,技术人员典型的发展路径基本上都是下面的这个模式:
1)0 ~ 1年:菜鸟,须要别人手把手来教
2)1 ~ 3年:初级,须要别人带你作
3)3 ~ 5年:高级,能独当一面,能够带初级技术人员了
4)5 ~ 8年:资深,能独挡多面
5)8 ~ 10年:大牛,统筹规划,高屋建瓴
经过上面的分解咱们能够看到,虽说10年才能成为大牛,可是3年就能够达到初级水平,5年就能够达到高级水平,8年就能够达到资深水平,在这个过程当中咱们一直在成长和提高,而不是说没有成为大牛就是菜鸟;而且对于不少朋友来讲,若是目标不是像首富那样要赚就赚1亿,能达到高级或者资深水平,其实已经能够过得比较滋润了。经过这种分解方法,再核对一下本身目前所处的位置,而后先瞄准下一个目标,尽心尽力其实也就2 ~ 3年时间,这样来看一段目标实际上是比较容易达成的。这种目标分解的方法除了适合技术人员外,其它不少领域也都适应,好比说产品人员、运营人员、甚至公务员!
二段分解:分解“技能”通过一段分解后,明确本身目前所处的位置和下一个目标,接下来就要看这个一段目标如何实现了。虽说每一个一段目标持续时间在 2~3年,但3年时间说长不长,说短也不短,若是没有好好利用,可能到了2年多的时候回头一看,好像什么都没达成,仍是原地踏步。所以,为了更好的利用这3年时间,咱们须要进一步分解,这就是“二段分解”。
一段分解的维度是等级,二段分解的维度则不同,不能再分等级了,不然等级太细就无法区别了。二段分解的维度变成了“技能”,即:为了达到一段目标,我须要具有什么样的技能。
仍是以技术人员为例,假设通过自我评估,认为本身目前处于初级阶段,并且初级阶段的事情已经作得比较顺手和熟练了,那么下一个一段目标天然就是达到“高级”水平。“高级”与“初级”相比,有哪些不一样的技能要求呢?
这就须要咱们根据各自不一样的行业和方向详细列出来了,若是本身想不出来,网上有不少资料均可以搜索到,最方便的就是到一个招聘网站,多看看几个招聘需求的描述,而后概括总结一下。
咱们随便到网上搜索一个,例如拉勾网上滴滴的“高级Java开发工程师”招聘:
多看几个相似的职位招聘,基本上咱们就能明白“高级Java开发工程师”的一些基本要求。固然实际上的技能要求比招聘需求的描述还要更加细致,我我的的习惯是将这些要求整理为一个思惟导图,详细列出每一个技术点。例如:
注意:以上这个图只是示例,并非说全部Java高级工程师都必定是这个要求,例如互联网行业和电信行业的要求不同)
有了这样一个思惟导图后,咱们就能够开始真正进行二段分解了,分解的方法很简单:哪里不懂补哪里!例如:我感受目前个人数据库水平通常,仅仅会写CRUD语句,其它的东西都不懂,那我就开始专攻数据库这一部分,通过一段时间的专攻来提高本身的水平。
二段目标持续时间通常建议是6个月,既不能过短也不能太长。过短容易让人陷入为了目标而作的误区,没有真正获得有效提高;时间太长的话,3年时间又不够完成其它目标了,例如要是我定一个目标说2年提高数据库,那操做系统怎么办?网络怎么办?……等等。以6个月为一个周期,基本上刚恰好。
通过分解,最终的二段目标能够分解为以下的几个更小的目标:
1)2016.06 ~ 2017.01:提高数据库水平
2)2017.01 ~ 2017.06:提高Linux水平
3)2017.06 ~ 2017.12:提高网络和网络编程水平
固然,二段分解目标并非一成不变的,不少时候须要根据咱们工做的内容进行调整。例如老大正好安排我来负责优化系统性能,下降机器负载,那么我彻底能够将“提高Linux水平”安排到“提高数据库水平”以前。
三段分解:分解“行动”二段分解获得技能的小目标后,接下来的关键就是要实现这个目标,这就是三段分解的主要目的,即:将技能目标分解为具体要作的事情,而后按照计划执行。
好比说个人二段目标是“提高Linux水平”,那怎么样才能提高呢?能够上网搜索(知乎是个好地方),也能够去问有经验的朋友。明确要作的事情后,三段分解须要将二段分解的6个月目标更加细化,分为1个月或者两个月一个目标。
以我当时加入UC的状况为例,我在华为的时候是在Windows平台上用VC6进行开发,而到了UC的时候是在Linux平台上用C++开发,我当时定了“提高Linux水平”的目标,而后经过上网查,找别人问等方法,最终将这个目标分解为几个步骤:
1)1个月:通读《UNIX环境高级编程》
2)1个月:通读《Linux系统编程》
3)2个月:通读《UNIX网络编程 卷1》
4)1个月:Linux经常使用命令实战:tcpdump、ps、top等
经过这种方法,将6个月的目标又进一步分解为1个月的目标,实施起来就简单多了,每1 ~ 2个月专一一个具体目标,每次完成后都颇有成就感,既感受本身的水平有了提高,又佩服本身可以坚持按计划按目标完成任务,双重奖赏让本身更有动力进行下一个目标。
我大约花了2年的时间将Linux、网络、MySQL三个重点技能从一无所知提高到高级的水平,不少同事都问我以前在华为是否是就是作这方面的,由于他们以为短期能达到这个水平是不太可能的。
综合前面的分析,咱们将三段分解提炼一下:一段分解“等级”,二段分解“技能”,三段分解“行动”。经过前面咱们的案例就能够看出,本来一个宏大的“10年成为技术大牛”的目标,通过三段分解,最终获得的是1 ~ 2个月可执行的具体行动,经过这种一步一个脚印的行动,最终就能够达成“10年成为技术大牛”的目标。
每天写业务代码,如何成为技术大牛? 几个典型的误区拜大牛为师
知乎上有人认为想成为技术大牛最简单直接、快速有效的方式是“拜团队技术大牛为师”,让他们平时给你开小灶,给你分配一些有难度的任务。我我的是反对这种方法的,主要的缘由有几个:
大牛很忙,不太可能单独给你开小灶,更不可能天天都给你开1个小时的小灶;并且一个团队里面,若是大牛平时常常给你开小灶,不免会引发其余团队成员的疑惑,我我的认为若是团队里的大牛若是真正有心的话,多给团队培训是最好的。然而作过培训的都知道,准备一场培训是很耗费时间的,课件和材料至少2个小时(还不能是碎片时间),讲解1个小时,大牛们一个月作一次培训已是很高频了。
由于第一个缘由,因此通常要找大牛,都是带着问题去请教或者探讨。由于回答或者探讨问题无需太多的时间,更多的是靠经验和积累,这种状况下大牛们都是很乐意的,毕竟影响力是大牛的一个重要指标嘛。然而也要特别注意:若是常常问那些书本或者google可以很容易查到的知识,大牛们也会很不耐烦的,毕竟时间宝贵。常常有网友问我诸如“jvm的-Xmn参数如何配置”这类问题,我都是直接回答“请直接去google”,由于这样的问题实在是太多了,若是本身不去系统学习,每一个都要问是很是浪费本身和别人的时间的。
大牛很少,不太可能每一个团队都有技术大牛,只能说团队里面会有比你水平高的人,即便他天天给你开小灶,最终你也只能提高到他的水平;而若是是跨团队的技术大牛,因为工做安排和分配的缘由,直接请教和辅导的机会是比较少的,单凭参加几回大牛的培训,是不太可能就成为技术大牛的。
综合上述的几个缘由,我认为对于大部分人来讲,要想成为技术大牛,首先仍是要明白“主要靠本身”这个道理,不要指望有个像武功师傅同样的大牛手把手一步一步的教你。适当的时候能够经过请教大牛或者和大牛探讨来提高本身,但大部分时间仍是本身系统性、有针对性的提高。
业务代码同样很牛逼知乎上有的回答认为写业务代码同样能够很牛逼,理由是业务代码同样能够有各类技巧,例如可使用封装和抽象使得业务代码更具可扩展性,能够经过和产品多交流以便更好的理解和实现业务,日志记录好了问题定位效率能够提高10倍……等等。
业务代码同样有技术含量,这点是确定的,业务代码中的技术是每一个程序员的基础,但只是掌握了这些技巧,并不能成为技术大牛,就像游戏中升级打怪同样,开始打小怪,经验值很高,越到后面经验值越少,打小怪已经不能提高经验值了,这个时候就须要打一些更高级的怪,刷一些有挑战的副本了,没看到哪一个游戏只要一直打小怪就能升到顶级的。
成为技术大牛的路也是相似的,你要不断的提高本身的水平,而后面临更大的挑战,经过应对这些挑战从而使本身水平更上一级,而后如此往复,最终达到技术大牛甚至业界大牛的境界,写业务代码只是这个打怪升级路上的一个挑战而已,并且我认为是比较初级的一个挑战。
因此我认为:author >业务代码都写很差的程序员确定没法成为技术大牛,但只把业务代码写好的程序员也还不能成为技术大牛。
上班太忙没时间本身学习不少人认为本身没有成为技术大牛并非本身不聪明,也不是本身不努力,而是中国的这个环境下,技术人员加班都太多了,致使本身没有额外的时间进行学习。这个理由有必定的客观性,毕竟和欧美相比,咱们的加班确实要多一些,但这个因素只是一个须要克服的问题,并非不可逾越的鸿沟,毕竟咱们身边仍是有那么多的大牛也是在中国这个环境成长起来的。
我认为有几个误区致使了这种见解的造成:
1)上班作的都是重复工做,要想提高必须本身额外去学习
造成这个误区的主要缘由仍是在于认为“写业务代码是没有技术含量的”,而我如今上班就是写业务代码,因此我在工做中不能提高。
2)学习须要大段的连续时间
不少人觉得要学习就要像学校上课同样,给你一成天时间来上课才算学习,而咱们平时加班又比较多,周末累的只想睡懒觉,或者只想去看看电影打打游戏来放松,因此就没有时间学习了。
正确的作法正好相反:
首先咱们应该在工做中学习和提高,由于学以至用或者有实例参考,学习的效果是最好的;其次工做后学习不须要大段时间,而是要挤出时间,利用时间碎片来学习。(参照前文10000小时理论)
正确的作法Do more
作的更多,作的比你主管安排给你的任务更多。
我在HW的时候,负责一个版本的开发,这个版本的工做量大约是2000行左右,可是我除了作完这个功能,还将关联的功能所有掌握清楚了,代码(大约10000行)也所有看了一遍,作完这个版本后,我对这个版本相关的整套业务所有很熟悉了。通过一两次会议后,你们发现我对这块掌握最熟了,接下来就有趣了:产品讨论需求找我、测试有问题也找我、老大对外支撑也找我;后来,不是我负责的功能他们也找我,即便我当时不知道,我也会看代码或者找文档帮他们回答……最后我就成了我这个系统的“专家”了。虽然这个时候我仍是作业务的,仍是写业务代码,可是我已经对整个业务都很熟悉了。
以上只是一个简单的例子,其实就是想说:要想有机会,首先你得从人群中冒出来,要想冒出来,你就必须作到不同凡响,要作到不同凡响,你就要作得更多!
怎么作得更多呢?能够从如下几个方面着手:
1)熟悉更多业务,无论是否是你负责的;熟悉更多代码,无论是否是你写的
这样作有不少好处,举几个简单的例子:
需求分析的时候更加准确,可以在需求阶段就识别风险、影响、难点
问题处理的时候更加快速,由于相关的业务和代码都熟悉,可以快速的判断问题可能的缘由并进行排查处理
方案设计的时候考虑更加周全,因为有对全局业务的理解,可以设计出更好的方案
2)熟悉端到端
好比说你负责web后台开发,但实际上用户发起一个http请求,要通过不少中间步骤才到你的服务器(例如浏览器缓存、DNS、nginx等),服务器通常又会通过不少处理才到你写的那部分代码(路由、权限等)这整个流程中的不少系统或者步骤,绝大部分人是不可能去参与写代码的,但掌握了这些知识对你的综合水平有很大做用,例如方案设计、线上故障处理这些更加有含金量的技术工做都须要综合技术水平。
“系统性”、“全局性”、“综合性”这些字眼看起来比较虚,但其实都是技术大牛的必备的素质,要达到这样的境界,必须去熟悉更多系统、业务、代码。
3)自学
通常在比较成熟的团队,因为框架或者组件已经进行了大量的封装,写业务代码所用到的技术确实也比较少,但咱们要明白“惟一不变的只有变化”,框架有可能要改进,组件可能要替换,现有技术可能已经没法知足业务需求,或者你换了一家公司,新公司既没有组件也没有框架,要你从头开始来作。这些都是机会,也是挑战,而机会和挑战只会分配给有准备的人,因此这种状况下咱们更加须要自学更多东西,由于真正等到要用的时候再来学已经没有时间了。
以java为例,大部分业务代码就是if-else加个数据库操做,但咱们彻底能够本身学些更多java的知识,例如垃圾回收,调优,网络编程等,这些可能暂时没用,但真要用的时候,不是google一下就能够了,这个时候谁已经掌握了相关知识和技能,机会就是谁的。
以垃圾回收为例,我本身平时就抽时间学习了这些知识,学了1年都没用上,但后来用上了几回,每次都解决了卡死的大问题,而有的同窗,写了几年的java代码,对于stop-the-world是什么概念都不知道,更不用说去优化了。
特别是不少开源软件,更加须要本身平时去自学,例如Nginx、Redis、Mongodb、ElasticSearch等,在合适的时机引入这些技术,可以带来很大的价值。
Do better
要知道这个世界上没有完美的东西,你负责的系统和业务,总有不合理和能够改进的地方,这些“不合理”和“可改进”的地方,都是更高级别的怪物,打完后可以增长更多的经验值。识别出这些地方,而且给出解决方案,而后向主管提出,一次不行两次,多提几回,只要有一次落地了,这就是你的机会。
例如:
重复代码太多,是否能够引入设计模式?
系统性能通常,能否进行优化?
目前是单机,若是作成双机是否更好?
版本开发质量不高,是否引入高效的单元测试和集成测试方案?
目前的系统太庞大,是否能够经过重构和解耦改成3个系统?
阿里中间件有一些系统感受咱们也能够用,是否能够引入 ?
只要你去想,其实总能发现能够改进的地方的;若是你以为系统哪里都没有改进的地方,那就说明你的水平还不够,能够多学习相关技术,多看看业界其它公司怎么作,BAT都怎么作。
我2013年调配到九游,刚开始接手了一个简单的后台系统,天天就是配合前台作数据增删改查,看起来彻底没意思,是吧?若是只作这些确实没意思,但咱们接手后作了不少事情:
解耦,将一个后台拆分为2个后台,提高可扩展性和稳定性;
双机,将单机改成双机系统,提升可靠性;
优化,将原来一个耗时5小时的接口优化为耗时5分钟
还有其它不少优化,后来咱们这个组承担了更多的系统,后来这个小组5我的,负责了6个系统。
Do exercise
在作职业等级沟通的时候,发现有不少同窗确实也在尝试Do more、Do better,但在执行的过程当中,几乎每一个人都遇到同一个问题:光看不用效果不好,怎么办?
例如:
学习了jvm的垃圾回收,可是线上比较少出现FGC致使的卡顿问题,就算出现了,恢复业务也是第一位的,不太可能线上出现问题而后让每一个同窗都去练一下手,那怎么去实践这些jvm的知识和技能呢?
Netty我也看了,也了解了Reactor的原理,可是我不可能参与Netty开发,怎么去让本身真正掌握Reactor异步模式呢?
看了《高性能MySQL》,可是线上的数据库都是DBA管理的,测试环境的数据库感受又是随便配置的,我怎么去验证这些技术呢?
框架封装了DAL层,数据库的访问咱们都不须要操心,咱们怎么去了解分库分表实现?
诸如此类问题还有不少,我这里分享一下我的的经验,其实就是3个词:learning、trying、teaching!
1)Learning
这个是第一阶段,看书、google、看视频、看别人的博客均可以,但要注意一点是“系统化”,特别是一些基础性的东西,例如JVM原理、Java编程、网络编程,HTTP协议。。。。。。等等,这些基础技术不能只经过google或者博客学习,个人作法通常是先完整的看完一本书全面的了解,而后再经过google、视频、博客去有针对性的查找一些有疑问的地方,或者一些技巧。
2)Trying
这个步骤就是解答前面提到的不少同窗的疑惑的关键点,形象来讲就是“本身动手丰衣足食”,也就是本身去尝试搭建一些模拟环境,本身写一些测试程序。例如:
Jvm垃圾回收:能够本身写一个简单的测试程序,分配内存不释放,而后调整各类jvm启动参数,再运行的过程当中使用jstack、jstat等命令查看jvm的堆内存分布和垃圾回收状况。这样的程序写起来很简单,简单一点的就几行,复杂一点的也就几十行。
Reactor原理:本身真正去尝试写一个Reactor模式的Demo,不要觉得这个很难,最简单的Reactor模式代码量(包括注释)不超过200行(能够参考Doug Lee的PPT)。本身写完后,再去看看netty怎么作,一对比理解就更加深入了。
MySQL:既然有线上的配置能够参考,那能够直接让DBA将线上配置发给咱们(注意去掉敏感信息),直接学习;而后本身搭建一个MySQL环境,用线上的配置启动;要知道不少同窗用了不少年MySQL,可是连个简单的MySQL环境都搭不起来。
框架封装了DAL层:能够本身用JDBC尝试去写一个分库分表的简单实现,而后与框架的实现进行对比,看看差别在哪里。
用浏览器的工具查看HTTP缓存实现,看看不一样种类的网站,不一样类型的资源,具体是如何控制缓存的;也能够本身用Python写一个简单的HTTP服务器,模拟返回各类HTTP Headers来观察浏览器的反应。
还有不少方法,这里就不一一列举,简单来讲,就是要将学到的东西真正试试,才能理解更加深入,印第安人有一句谚语:I hear and I forget. I see and I remember. I do and I understand,并且“试试”其实能够比较简单,不少时候咱们均可以本身动手作。
固然,若是可以在实际工做中使用,效果会更好,毕竟实际的线上环境和业务复杂度不是咱们写个模拟程序就可以模拟的,但这样的机会可遇不可求,大部分状况咱们还真的只能靠本身模拟,而后等到真正业务要用的时候,可以信手拈来。
3)Teaching
通常来讲,通过Learning和Trying,能掌握70%左右,但要真正掌握,我以为必定要作到可以跟别人讲清楚。由于在讲的时候,咱们既须要将一个知识点系统化,也须要考虑各类细节,这会促使咱们进一步思考和学习。同时,讲出来后看或者听的人能够有不一样的理解,或者有新的补充,这至关于继续完善了整个知识技能体系。
这样的例子不少,包括我本身写博客的时候常常遇到,原本我以为本身已经掌握很全面了,但一写就发现不少点没考虑到;组内培训的时候也常常看到,有的同窗写了PPT,可是讲的时候,你们一问,或者一讨论,就会发现不少点尚未讲清楚,或者有的点实际上是理解错了。写PPT、讲PPT、讨论PPT,这个流程所有走一遍,基本上对一个知识点掌握就比较全面了。
后记成为技术大牛梦想虽然很美好,可是要付出不少,无论是Do more仍是Do better仍是Do exercise,都须要花费时间和精力,这个过程当中可能很苦逼,也可能很枯燥,这里我想特别强调一下:前面我讲的都是一些方法论的东西,但真正起决定做用的,其实仍是咱们对技术的热情和兴趣!
本文系InfoQ原创文章,已经受权StuQ公众号转发传播。
李运华,阿里游戏资深软件工程师,带领多个研发团队,承担架构设计、架构重构、技术团队管理、技术培训等职责;专一于开源技术、系统分析、架构设计,对互联网技术的特色和发展趋势有较深刻的研究,对系统解耦、高性能、高可用架构有丰富的经验。