You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
14 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 36 | 加餐6这15年来我是如何在工作中学习技术和英语的
你好,我是朱晔。今天,我来和你聊聊如何在工作中,让自己成长得更快。
工作这些年来,经常会有同学来找我沟通学习和成长,他们的问题可以归结为两个。
一是长期参与CRUD业务开发项目技术提升出现瓶颈学不到新知识完全没有办法实践各种新技术以后会不会被淘汰、找不到工作
二是,英语学得比较晚,大学的时候也只是为了应试,英语水平很低,看不了英文的技术资料,更别说去外企找工作了。
不知道你是不是也面临这两个问题呢?今天,我就通过自己的经历和你分享一下,如何利用有限的环境、有限的时间来学习技术和英语?
## 学好技术
在我看来,知识网络的搭建就是在造楼房:基础也就是地基的承载力,决定了你能把楼造多高;广度就像是把房子造大、造宽;深度就是楼房的高度。因此,如果你想要提升自己的水平,那这三个方面的发展缺一不可。
### 第一,学习必须靠自觉。
虽说工作经历和项目经验是实践技术、提升技术的一个重要手段,但不可能所有的工作经历和项目都能持续地提升我们的技术。所以,我们要想提升自己的技术水平,就必须打消仅仅通过工作经历来提升的念头,要靠业余时间主动地持续学习和积累来提升。
比如你可以针对项目中用到的技术全面阅读官方文档做各种Demo来论证其技术特性。在这个过程中你一定还会产生许多技术疑问那就继续展开学习。
### 第二,不要吝啬分享。
刚毕业那会我花了很多时间和精力在CSDN回答问题积极写博客、写书和翻译书。这些经历对我的技术成长帮助非常大。
很多知识点我们自认为完全掌握了但其实并不是那么回事儿。当我们要说出来教别人的时候就必须100%了解每一个细节。因此,分享不仅是帮助自己进一步理清每一个知识点、锻炼自己的表达能力,更是一种强迫自己学习的手段,因为你要保证按时交付。
当然了分享的过程也需要些正向激励让自己保持分享的激情。就比如说我获得的几次微软MVP、CSDN TOP3专家等荣誉就对我激励很大可以让我保持热情去不断地学习并帮助别人。
### 第三,不要停留在舒适区。
分享一段我的真实经历吧。我加入一家公司组建新团队后,在做技术选型的时候,考虑到成本等因素,放弃了从事了七年的.NET技术转型Java。有了.NET的积累我自己转型Java只用了两周。其实一开始做这个决定非常痛苦但是突破自己的舒适区并没有想象得那么困难。随后我又自学了iOS、深度学习、Python等技术或语言。
随着掌握的技术越来越多这些技术不但让我触类旁通更让我理解了技术只是工具解决问题需要使用合适的技术。因此我也建议你利用业余时间多学习几门不同类型的编程语言比如Java、Python和Go。
有些时候,我们因为恐惧跳出舒适区而不愿意学习和引入合适的新技术来解决问题,虽然省去了前期的学习转型成本,但是后期却会投入更多的时间来弥补技术上的短板。
### 第四,打好基础很重要。
这里的“基础”是指和编程语言无关的那部分知识包括硬件基础、操作系统原理、TCP/IP、HTTP、数据结构和算法、安全基础、设计模式、数据库原理等。学习基础知识是比较枯燥的过程需要大块的时间来系统阅读相关书籍并要尝试把学到的知识付诸实践。只有实践过的技术才能映入脑子里否则只是书本上的知识。
比如学习TCP/IP的时候我们可以使用Wireshark来观察网络数据。又比如学习设计模式的时候我们可以结合身边的业务案例来思考下是否有对应的适用场景如果没有能否模拟一个场景然后使用所有设计模式和自己熟悉的语言开发一个实际的Demo。
这些看似和我们日常业务开发关系不大的基础知识,是我们是否能够深入理解技术的最重要的基石。
### 第五,想办法积累技术深度。
对开发者而言技术深度体现在从一个框架、组件或SDK的使用者转变为开发者。
虽然不建议大家重复去造轮子、造框架但我们完全可以阅读各种框架的源码去了解其实现并亲手实现一些框架的原型。比如你可以尝试把MVC、RPC、ORM、IoC、AOP等框架都实现一个最基本功能点原型。在实现的过程中你一定会遇到很多问题和难点然后再继续研究一下Spring、Hibernate、Dubbo等框架是如何实现的。
当把自己的小框架实现出来的那一刻,你收获的不仅是满满的成就感,更是在技术深度积累上的更进一步。在这个过程中,你肯定会遇到不少问题、解决不少问题。有了这些积累,之后再去学习甚至二次开发那些流行的开源框架,就会更容易了。
除了实现一些框架外我还建议你选择一个中间件比如Redis、RocketMQ来练手学习网络知识。
我们可以先实现它的客户端用Netty实现TCP通信层的功能之后参照官方文档实现协议封装、客户端连接池等功能。在实现的过程中你可以对自己实现的客户端进行压测分析和官方实现的性能差距。这样一来你不仅可以对TCP/IP网络有更深入的了解还可以获得很多网络方面的优化经验。
然后,再尝试实现服务端,进一步加深对网络的认识。最后,尝试把服务端扩展为支持高可用的集群,来加深对分布式通信技术的理解。
在实现这样一个分布式C/S中间件的过程中你对技术的理解肯定会深入了许多。在这个过程中你会发现技术深度的“下探”和基础知识的积累息息相关。基础知识不扎实往深了走往往会步履维艰。这时你可以再回过头来重新系统学习一些基础理论。
### 第六,扩大技术广度也重要。
除了之前提到的多学几门编程语言之外,在技术广度的拓展上,我们还可以在两个方面下功夫。
第一阅读大量的技术书籍。新出来的各种技术图书不只是编程相关的一般我都会买。十几年来我买了500多本技术图书大概有三分之一是完整看过的还有三分之一只翻了一个大概还有三分之一只看了目录。
广泛的阅读,让我能够了解目前各种技术的主流框架和平台。这样的好处是,在整体看技术方案的时候,我可以知道大家都在做什么,不至于只能理解方案中的一部分。对于看不完的、又比较有价值的书,我会做好标签,等空闲的时候再看。
第二在开发程序的时候我们会直接使用运维搭建的数据库比如Elasticsearch、MySQL、中间件比如RabbitMQ、ZooKeeper、容器云比如Kubernetes。但如果我们只会使用这些组件而不会搭建的话对它们的理解很可能只是停留在API或客户端层面。
因此,我建议你去尝试下从头搭建和配置这些组件,在遇到性能问题的时候自己着手分析一下。把实现技术的前后打通,遇到问题时我们就不至于手足无措了。我通常会购买公有云按小时收费的服务器,来构建一些服务器集群,尝试搭建和测试这些系统,加深对运维的理解。
## 学好英语
为啥要单独说英语的学习方法呢,这是因为学好英语对做技术的同学非常重要:
* 国外的社区环境比较好许多技术问题只有通过英文关键字才能在Google或Stackoverflow上搜到答案
* 可以第一时间学习各种新技术、阅读第一手资料,中文翻译资料往往至少有半年左右的延迟;
* 参与或研究各种开源项目,和老外沟通需要使用英语来提问,以及阅读别人的答复。
所以说,学好英语可以整体拓宽个人视野。不过,对于上班族来说,我们可能没有太多的大块时间投入英语学习,那如何利用碎片时间、相对休闲地学习英语呢?还有一个问题是,学好英语需要大量的练习和训练,但不在外企工作就连个英语环境都没有,那如何解决这样的矛盾呢?
接下来,我将从读、听、写和说四个方面,和你分享一下我学习英语的方法。
### 读方面
读对于我们这些搞技术的人来说是最重要的,并且也是最容易掌握的。我建议你这么学:
* 先从阅读身边的技术文档开始,有英语文档的一定要选择阅读英语文档。一来,贴近实际工作,是我们真正用得到的知识,比较容易有兴趣去读;二来,这些文档中大部分词汇,我们日常基本都接触过,难度不会太大。
* 技术书籍的常用词汇量不大,有了一些基础后,你可以正式或非正式地参与翻译一些英语书籍或文档。从我的经验来看,翻译过一本书之后,你在日常阅读任何技术资料时基本都不需要查字典了。
* 订阅一些英语报纸比如ChinaDaily。第一贴近日常生活都是我们身边发生的事儿不会很枯燥第二可以进一步积累词汇量。在这个过程中你肯定需要大量查字典打断阅读让你感觉很痛苦。但一般来说一个单词最多查三次也就记住了所以随着时间推移你慢慢可以摆脱字典词汇量也可以上一个台阶了。
技术方面阅读能力的培养,通常只需要三个月左右的时间,但生活方面资料的阅读可能需要一年甚至更长的时间。
### 听方面
读需要积累词汇量,听力的训练需要通过时间来磨耳朵。每个人都可以选择适合自己的材料来磨耳朵,比如我是通过看美剧来训练听力的。
我就以看美剧为例,说说练听力的几个关键点。
* 量变到质变的过程需要1000小时的量。如果一部美剧是100小时那么看前9部的时候可能都很痛苦直到某一天你突然觉得一下子都可以听懂了。
* 需要确保看美剧时没有中文字幕,否则很难忍住不看,看了字幕就无法起到训练听力的效果。
* 在美剧的选择上可以先选择对话比较少也可以选择自己感兴趣的题材这样不容易放弃。如果第一次听下来听懂率低于30%,连理解剧情都困难,那么可以先带着中文字幕看一遍,然后再脱离字幕看。
* 看美剧不在乎看的多少而是要找适合的素材反复训练。有人说反复看100遍《老友记》英语的听说能力可以接近母语是英语的人的水平。
如果看美剧不适合你的话你可以选择其他方式比如开车或坐地铁的时候听一些感兴趣的PodCast等。
总而言之选择自己喜欢的材料和内容从简单开始不断听。如果你有一定词汇量的话查字典其实不是必须的很多时候不借助字典同一个单词出现10遍后我们也就知道它的意思了。
一定要记住在积累1000小时之前别轻易放弃。
### 写方面
如果有外企经历,那么平时写英语邮件和文档基本就可以让你的工作英语过关;如果没有外企经历也没关系,你可以尝试通过下面的方式锻炼写作:
* 每天写英语日记。日记是自己看的,没人会嘲笑你,可以从简单的开始。
* 在保持写作的同时,需要确保自己能有持续的一定量的阅读。因为,写作要实现从正确到准确到优雅,离不开阅读的积累。
* 写程序的时候使用英语注释,或者尝试写英语博客,总之利用好一切写的机会,来提升自己的英语表达。
再和你分享一个小技巧。当你要通过查词典知道中文的英语翻译时,尽量不要直接用找到的英文单词,最好先在英语例句中确认这个翻译的准确性再使用,以免闹笑话。
### 说方面
训练说英语的机会是最少的,毕竟身边说英语的人少,很难自己主动练习。
这里我和你分享两个方法吧。
第一是买外教的1-1对话课程来训练。这些课程一般按小时计费由母语是英语的人在线和你聊一些话题帮助你训练对话能力。
买不买课程不重要,只要能有母语是英语的人来帮你提升就可以。同时,大量的听力训练也可以帮助你提升说的能力,很多英语短句经过反复强化会成为脱口而出的下意识反应。所以,你会发现在听力达到质变的时候,说的能力也会上一个台阶。
第二,大胆说,不要担心有语法错误、单词发音问题、表达不流畅问题而被嘲笑。其实,你可以反过来想想,老外说中文时出现这些问题,你会嘲笑他吗。
这里有一个技巧是,尽量选用简单的表达和词汇去说,先尝试把内容说出来,甚至是只说几个关键字,而不是憋着在脑子里尝试整理一个完整的句子。灵活运用有限的单词,尽可能地流畅、准确表达,才是聪明的做法。
## 总结
最后我想说如果你感觉学得很累、进步很慢也不要放弃坚持下来就会越来越好。我刚毕业那会儿有一阵子也对OOP很迷茫感觉根本无法理解OOP的理念写出的代码完全是过程化的代码。但我没有放弃参与写了几年的复杂业务程序再加上系统自学设计模式到某一个时刻我突然就能写出OOP的业务代码了。
学习一定是一个日积月累、量变到质变的过程,希望我分享的学习方法能对你有启发。不过,每个人的情况都不同,一定要找到适合自己的学习方式,才更容易坚持下去。
持续学习很重要,不一定要短时间突击学习,而最好是慢慢学、持续积累,积累越多学习就会越轻松。如果学习遇到瓶颈感觉怎么都学不会,也不要沮丧,这其实还是因为积累不够。你一定也有过这样的经验:一本去年觉得很难啃的书,到今年再看会觉得恰到好处,明年就会觉得比较简单,就是这个道理。
我是朱晔,欢迎在评论区与我留言分享你学习技术和英语的心得,也欢迎你把今天的内容分享给你的朋友或同事,一起交流。