程序员应该如何学习新技术
文/楠木大叔
技术更迭,一往无前。技术人总是要不断学习以适应社会的发展和行业对我们的要求。每隔一段时间,就会有纷至沓来的新技术,新知识,新概念,我们应该如何应对,是被逼到墙角,还是主动出击?
导读
- 从一道小题说起
- 空杯心态
- 不下水,就学不会游泳
- 漫无目的的学习纯属浪费时间
- 没有深度思考的学习就是自嗨
- 只输入不输出的学习就是耍流氓
- 天下武功,为快不破
- 万物即可为题
- 结语
- 参考
人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。——《为学》
从一道小题说起
作为一个技术出身的码农,我总是对小镇做题家是嗤之以鼻的。然而,经历多年的学习和工作洗礼之后,我似乎又从小镇做题家身上看到一些不一样的东西,那就是做题是一种相对靠谱的学习方式。特别是近年来,在新技术的学习上,我逐渐开始认可和实践这种方式。各位客官先不要反驳,请听我慢慢道来。
笔者在学习SpringAOP的时候,非常认真的地研读过《Spring实战》一书中关于AOP相关知识点,也参阅过相关技术博客文章并在实践中有过应用,相关文章可查阅笔者文章:
自认为已经能够基本理解AOP的概念和应用场景,但是直到遇到这道题,笔者才发现自己对Spring AOP的理解其实依然浮于表面。
尽管类似的例子在《Spring实战》这本书上有涉及,如下
但是在大多数的技术博文中亦或是整理的面试考点中,基本都是摘抄书本术语和总结一些概念居多(当然能够沉下心来去读懂源码的同学请绕行)。这就会给新手们一种错觉,AOP思想不过如此。
AOP的相关术语
- jointpoint(连接点):是指那些被拦截到的点。在spring中是指方法,因为spring只支持方法类型的连接点。
- pointcut(切入点):对哪些joinpoint进行拦截
- advice(通知/增强):拦截到的jionpoint所做的事情。方法层面的。
- 前置通知
- 后置通知
- 异常通知(抛出异常)
- 最终通知(无论如何都执行)
- 环绕通知(方法执行的前后都通知,甚至可以阻止目标方法执行)
- introduction(引介):特殊的通知,类层面的。
- target(目标对象):代理的目标对象
- weaving(织入):把增强应用到目标对象来创建新的代理对象的过程
- proxy(代理):被AOP织入增强后产生的结果代理类
- aspect(切面):切入点+通知的结合
- advisor:一般的切面,advice本身就是一个切面,对目标类所有方法进行拦截
- PointcutAdvisor:代表具有切点的切面,可以指定拦截目标类哪些方法
- IntroductionAdvisor:引介切面
短短总结,其实涉及了众多知识点,如果没有仔细品读和思考,恐怕是很难吃透的。所以,笔者反思,平时阅读和学习新知识的一些问题,很多时候容易大而化之,停留表面——毕竟技术书籍不像小说,可以快速阅读完。有时候自认为理解了,实则不然。知识点其实需要一个载体来承载,比如一个实际应用实战,或者一道理论题目。否则就是纸上谈兵,无法落地。技术的学习本身是理论和实践结合的。所以,要想多快好省的学习,笔者推荐通过理论学习,并结合做一些实战性强的题目。这样的目的如下:
- 快速熟悉各种应用场景
- 检验理论知识
- 聚焦
空杯心态
你就像这只杯子一样,里面装满了自己的看法和成见。如果你不先把杯子空掉,叫我如何对你说禅呢?
南隐是一位禅师。一天,一位学者来向他问禅,但自己喋喋不休。南隐则默默无语,以茶相待。他将茶水注入这位客人的杯子,满了也不停下来,而是继续往里面倒,眼睁睁看着茶水不停地溢出杯外。客人着急地说:“已经满出来了,不要再倒了!”
南隐说:“你就像这只杯子一样,里面装满了自己的看法和成见。如果你不先把杯子空掉,叫我如何对你说禅呢?”。
"空杯心态"是我最近几年比较爱提及的一个词,学习新知识,对新手来说,是没有思想包袱的,但是对于老鸟,建议空杯心态,否则容易沉迷过去的知识体系,走弯路。
不下水,就学不会游泳
绝大多数的人,面对陌生事物,往往会怀有畏惧感。
我没有接触过PS,那么如果让我去设计一个海报,就会心生畏惧。我没有用过Java,让我去写Java的项目,我总是处于观看而不敢亲自下去写...
过去的数年中,笔者长时间从事C#项目研发,但是最近两年由于工作项目的需要,需要学习Python,Java等语言。这里以学习Java为例。
笔者学习Java真的是一波三折,不敢说自己有多大期望,就是希望能够做一个小小的网站。第一次想学Java,大概是16~17年左右,因为没有人指导,必然是要走弯路的,在windows上从搭建环境到跑起来第一个spring web的hello,world,足足花了一周多的时间。有兴趣的朋友可以去看那篇纪实文章
出师不利,被Spring的各种配置虐的一无是处。然后更多的是看书,再加上没有在实战中应用的需求,基本放弃使用。几年后,无独有偶,遇见另外一个技术还不错的同事,他也刚好有这段经历,不过他当年他坚持了一周都没有把Spring跑起来,令人唏嘘。
去年,因为工作原因又开始使用Java,此时Springboot已经大行其道。便又开始投入Sprigboot的学习中,没话说,Springboot的确是大大降低了学习门槛。有了实际应用场景,加上工作的方面的推进,这一次真正开始上手了,基本熟悉了整个项目搭建和开发流程,总算能够独立完成一个网站的开发和部署。
面对一个陌生领域,大部分人总是会有畏难心理,左顾右盼,甚至无从下手。这个时候,你只需要考虑是否有学的价值,如果有,那么就毫不犹豫的先干起来,否则,从心态上你就会选择躺平。
漫无目的的学习纯属浪费时间
漫无目标,无书不读的人,他们的知识是很难精湛的。
"好读书,不求甚解",这也许是陶渊明先生的自谦的说法。普通人,特别是技术人真不要仿效。技术工作及其严谨,差之毫厘,谬以千里。学习上来不得半点马虎。
我很钦佩热爱学习的人,他们博览群书,对新技术总是第一批尝鲜的人。但是也有另一种,喜欢读书,但是很盲目和无目的。
我有一个很爱学习的同事,在公司,中午就会看书,下班回到家也看,公司组织团建出去也看。但是我最近留意了一下,半月过去,我发现他的阅读进展并不是很快,依然还停留在半个月前的那个章节。很多企业都会组织读书会,就是大家建一个群,组织有兴趣的同事一起读书,群里相互监督,固定时间打卡。笔者曾经供职的一家公司,老总亲自搞了一个52读书班,什么意思呢?就是每个人一年要读52本书,平均下来就是一周一本书。最后完成目标的人会授予奖章,当然是有人完成的。所以,从这个角度来看,我这个同事读书效率是极低的。甚至这种不连续性还会带来兴趣的热度的下降,最终半途而废。
如果您确实有充足的闲散时间,那么您随心的读书总比刷手机娱乐八卦强。但如果您是真正想学习的人,特别是学习新技术。因为这种学习的结果只有会和不会,对于技术人来说半瓶水和小白没有没有本质区别。
艾宾浩斯遗忘曲线表明,遗忘在学习之后立即开始,最初的遗忘速度很快,随着时间的推移,遗忘的速度逐渐下降,达到一定速度后就不再遗忘。
所以,当你决定要学习的时候,一定要给自己有个规划,要有里程碑,要有截止日期。一定要保持学习的连续性和连贯性。
没有深度思考的学习纯属自嗨
学而不思则罔,思而不学则殆。
学习的渠道和资源从未如此丰富。记得多年以前,我们在各大技术群里提问总会有人帮你解答,但不知从什么时候开始,"不懂就问百度"成了一种神回复。
你想学什么技术,网络上总能找到相关学习资源。但是,伴随而来的可能是更多参差不齐的搜索结果。新手无法辨别搜索结果的信度,走点弯路还好,但是时间却实实在在浪费了。
所以,在学习新知识的时候,官网和原著优先。合理利用网络资源和相关辅助教程,技术博客等。同时切记随大流,尽信书不如无书。
对于一些较为晦涩的技术知识点,你就算阅读一百遍也不一定能够理解,只有从场景的角度出发去深度思考,才能理解和吃透。
在没有深度思考之前你会觉得的自己无所不能,在深度思考之后,你会觉得自己只是勉强入门。
不以输出为目的的学习都是耍流氓
学习,是指通过阅读、听讲、思考、研究、实践等途径获得知识和技能的过程。
没有结果的学习本身就没有意义,在终身学习的时代,在技术知识发展日新月异的时代,很多知识和技能一样是有生命周期的。你今天学习了某个新知识,获得了一项新技能,3~5年之后,这项技能可能在行业里面已经没有用武之地了。
学习是一个过程,需要投入人力,物力,时间和金钱,一切没有结果的学习都是毫无意义的。那我们如何来分辨我们是否是真的努力呢?答案就是——输出,输出,大量的输出,用作品说话。你总不能说我学会了,但就是做不出来吧!这不就是耍流氓吗?
一鼓作气,趁热打铁
若有恒,何必三更眠五更起;最无益,莫过一日曝十日寒。
除了少数天才,学习新知识本来就不是一件快乐的事情。懒惰,拖延是人的本性,能够长期坚持学习的绝非常人。所以当我们开始要学一个知识或新技能的时候,不管是外部还是内部的驱动,一定会有"三分钟热度"。
比如,人工智能时代已经来临,行业压力让你觉得不学习就有失业风险。所以,你想学习Python来适应时代的发展。你买了教材,甚至还订阅了相关的在线视频课程。
刚开始,你全身都是劲儿,教材,安装开发环境,甚至还订阅了相关的在线视频课程,忙得不亦说乎。这种热度一般不会太持久,除非你的领导要求你学习,并在工作中使用。否则,没人能保证这个热度是否能够坚持到周五。
笔者的建议,要充分利用这个三分钟热度,快速把构建项目并跑起来,做一个能够有一定价值的demo,持续交互。比如,一个爬虫,一个可以用在工作中的自动化工具等。
一方面趁热打铁,一方面有成就感,同时也输出了。
万物即可为题
前面笔者提到,知识点其实需要一个载体来承载,比如一个实际应用实战,或者一道理论题目。否则就是纸上谈兵,无法落地。
过去在高校,我们学习都会有考试题目,那些题目更加理论化,属于"背多分"类型。但是进入工作岗位,特别是技术工作岗位,这就行不通了。因为技术工作不仅要强调过程,还要强调结果,只有过程和结果都对才是完成。
一直以来,前辈们都在强调动手实践的重要性,但是往往忽略了新手们并没有代入感。举个例子,所有人都明白学好英语的方式就是多说口语。但是实际上大多数都是“哑巴式英语”,道理都懂,语法倍儿棒,就是没法落地。
所以,题目一定是理论和实践相结合的,一定是符合实际应用场景的。这样的题目,才具有代入感,否则就是为学而学。
选择性的刷一些高质量的技术题目,绝对是提升认知的,并且事半工倍。
结语
以上只是笔者个人对学习技术的一点看法和思考,一家之言,姑妄言之姑妄听之。欢迎大家共同探讨和文明交流。
参考
- 《Spring实战(第4版)》
- Windows上如何搭建Java开发环境?
- 细说AOP(面向切面编程)