大家好,我是大师兄Alex,今天分享一下我的一些学习经验,希望对大家学习有帮助。
我的学习方法
学习计划
核心思想:把自己像产品一样打造,就像张一鸣经典语录:
"run company as a product"
制定目标
首先学习需要明确学习目标,学习之前,要把目标制定下来,一个月,三个月,半年,一年,三年等不同周期目标。
迭代计划
分解目标,然后建立特定周期的迭代计划,终形成多个迭代, 不断迭代自己,成为更好的自己。
每天学习安排
每一天时间安排,就像高中一样,制定出一个时间表,心里有数,用来指导学习,不需要严格执行,大致就好,留一些缓冲时间,具体时间安排可以参考番茄工作法,一般每天至少尽量留一个小时给自己充电。
迭代计划
之前用的一个敏捷开发工具 trello来实现迭代计划,我设置10天为一个迭代周期,每个月结束后会进行总结复盘,是否达到迭代的目标。
具体迭代看板:
每个卡片为一个具体任务,可以设置开发时间,设置任务状态,check list是用来验收任务-闭环:
trello软件,在手机和电脑都可以用,是我比较喜欢的软件迭代工具(任务管理,团队协作工具),知乎评价非常高,同样可以用来迭代自己,国内也有很多类似工具,比如Teambition。
学习资料
书籍
很多经典书籍(后面有经典书单推荐),经典书籍可以让我们更容易理解知识的本质,学习作者对技术的理解,和作者进行精神交流,有些章节我都会反复看几遍,然后敲代码去实现验证。
博客网站
大多数知识点都需要上网查看,翻看各种博客网站,主要是看一下该知识点的内涵和外延,看一下别人是怎么理解的,后面有经典博客网站推荐。
极客时间
极客时间课程, 有些很经典,质量很高,我会选我想看的章节, 查缺补漏, 加强理解, 看一下其他大佬对这个知识点是怎么理解的, 有助于加深理解。
总结沉淀
要学会多思考,多总结(输出),对知识的透彻理解,才是我们终的目标,而不是死记硬背,背概念,总结可以加强我们对知识理解深度,甚至创造自己的理解看法,所谓智慧就是这些思考的成果。
我目前用来记笔记的工具 mindmaster 脑图 比较好分类, 查找比较方便。之前有用文本记录比较乱,看个人爱好, 这款软件支持手机和电脑端同步使用。
比如学习TCP/IP协议后,就需要总结如下:
由于展开太大,这里取TCP节点展示看(由于导出图片有大小限制,完整版更详细):
不知不觉中总结很多知识:
这些其实可以算是个人知识财富,希望大家多总结。
读过一些经典书单
1. 深入理解计算机系统
计算机界的神书,底层开发的圣经,计算机基础知识神作,建议多读几遍,我读了好几遍,遍比较详细,第二遍查缺补漏,第三遍升华总结。
2.具体数学
计算机科学的神奇书籍,帮你建立计算机独有数学思维,比如递归,组合,动态规划等。
3. 编译原理
本书作者Alfred V.Aho、Ravi Sethi和Jeffrey D.Ullman是世界的计算机 科学家,他们在计算机科学理论、数据库等很多领域都做出了杰出贡献。本书是编译领域无可替代的经典著作,被广大计算机专业人士誉为“龙书”,帮助我们理解编译原理。
4 . 计算机程序的构造和解释
书中使用程序设计语言Lisp的方言Scheme来解释计算机科学的核心概念,包括抽象、递归、解释器以及元语言抽象。具体而微地由宏观到微观给出清楚地轮廓与脉络。
5 . The C Programming Language
到今天仍然是C语言入门的,书非常简洁优美,就像C语言本身一样。
6. 深度探索C++对象模型
C++对象内存模型,从语法上看编译器实现,学习C++必须要掌握的。
7. 深入理解LINUX内核
如果你想深入学习Linux内核,这本书是个很好选择。
8. 深入理解LINUX网络内幕
对Linux网络子系统有深入分析,如果你要深入学习网络,这本书是很好的选择。
9. UNIX编程艺术
本书主要介绍了Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验,而这些经验对于理解Linux系统有非常大的益处。
10. 程序员的自我修养
了解程序编译,连接,库等程序运行原理,包含windows和linux系统,加强基本功修炼。
11. 刻意练习
这本书深刻分析刻意练习背后的原理,用科学方法论证如何从新手到大师。
推荐好的博客
1.https://blog.csdn.net/dog250
dog250的文章都比较深刻,属于网络进阶,可能不太适合入门,建议入门后,再看这里文章,会让你醍醐灌顶。
2. https://blog.csdn.net/gatieme
操作系统优质博客,可以学习linux 调度相关内核知识;
3.http://www.wowotech.net
蜗窝科技,博客专注分享linux内核知识(偏嵌入式方向), 很多文章都非常精华和透彻,值得内核学习者学习;
4. http://bbs.chinaunix.net/
bbs.chinaunix的内核板块,代内核程序员聚集地,很多大佬在这里分享内核知识,现在应该都是各大公司技术专家或者负责人了。
5.https://coolshell.cn
耗子叔个人技术网站,早期我喜欢的技术blog博主,一个乐于分享技术的大牛,尤其是分享的基础知识,本人也很喜欢基础知识;
6. https://blog.codingnow.com/
云风的blog,大多数和游戏相关,可以学习很多高性能编程技巧。
7. C++博客
7.1 https://www.stroustrup.com
Bjarne Stroustrup,不认识的可以去面壁了,没有他,就没有我们现在的饭碗。Bjarne Stroustrup是丹麦人,目前任教于TAMU。他的Homepage和他的书籍The C++ Programming Language一样,都是百科全书级的,如果你认真研究,你也会成为你同事或周围人的C++之父。
7.2 https://www.fluentcpp.com
博客作者Jonathan Boccara是C++软件工程负责人、博客作者和作家,专注于如何使代码具有表现力,C++高手。
7.3 http://scottmeyers.blogspot.com
Scott Meyers,不多介绍,世界上几乎每个C++程序员都应该知道的名字,畅销书:Effective C++, More Effective C++的作者。博客长期更新,就凭Scott Meyers这个名字,就值得一读。
7.4 http://www.modernescpp.com/index.php
现代C++编程大神,文章主打modern C++,让你与时俱进;
7.5 http://purecpp.org/
应该是算国内C++社区,举办多届C++大会。博主为C++委员会成员
个人博客 https://www.cnblogs.com/qicosmos,也非常值得C++开发者学习。
8.http://www.yinwang.org/
王垠大佬博客,对编程语言理解深刻,如果还在学习编程语言语法,可以看一下这个博客一些文章;
个人学习经验总结
此处为个人学习经验总结,可能不一定适合你,但或许对你有些帮助,希望你取长补短,协助你找到自己的方向。
1. 学习一定要有目标,目标一定要有计划(排期),计划一定要有落地执行方案(迭代),迭代一定要有check list(结果验证),后根据结果进行复盘总结,这样才能形成学习的闭环,然后不断按照这个流程迭代自己,同时整个流程可能也会发现一些问题,比如拖延,比如时间估算不准等,这时候流程也需要不断调整优化。
2. 学习中,真正困难的地方,是习惯问题,可能存在一些不好的习惯,导致不能专心学习,比如玩手机等,改变自己习惯是一件很困难的事情,如果你已经走投无路,或者你很想完成你的目标,做梦都想,那你必须对自己狠心一点,改掉自己不好习惯,学习的时候好专注,找个安静的地方学习,尽量不要被打扰。
3. 学习中,多去和别人交流,很多心中疑惑,很可能别人一句话就让你悟道解开,和大神交流(可以书本,视频演讲,直播,线下技术讲座等等),要学会虚心请教,大神对一些基础概念的本质理解,会让人醍醐灌顶,胜读十年书。
4. 学习要有耐心,很多时候是需要花很多时间去学习一个知识点,一些知识点需要反复来回多看几遍,要刻意去练习,大脑才会加深影响,慢慢地把各个点串起来,很多时候看代码就是这样,需要时间,我会慢慢在大脑中试图关联起来,后才能恍然大悟。
5. 学习重要就是坚持,这个比任何技能都重要,很多知识是需要花很多时间才能吃透的,而这个过程并不是循序渐进,很可能是某一天灵感爆发,或者悟道,而这个爆发又是你之前慢慢积累结果,所以很多时候,我们可能百思不得其解,很多人中途可能放弃了,觉得太难了, 如果我们非常想完成我们的目标,就要突破这些难点,咬牙坚持,总有一天会拨开迷雾,获得真知,你会感谢当初坚持下来的你,这个过程是痛并快乐着。
6. 要学会思考,要学会多总结(输出),对知识的透彻理解,才是我们终的目标,而不是死记硬背,背概念,这需要我们不断思考,不断总结,所谓智慧就是这些思考的成果,这也是社会进步源泉;
7. 要学会分清重点,逐个攻破重点知识,时间有限,需要掌握28定律,了解一个系统,先要明白什么才是它的核心技术,其他只是辅助或者实现细节。
8. 要学会各种搜索技能(google,bing,百度,知乎等),学会查找各种经典资源,包括付费资源(csdn下载,百度文档,购买课程),有时候不要舍不得,好的资料,犹如武林秘籍,可以助你一臂之力。
总之,要建立自己的知识体系,不断迭代,查缺补漏, 把其他资源融入到自己计划中 。
技术思考总结
多年工作经验和学习经验,分享一些技术思考,可能不一定准确,但希望对热爱技术人有一些帮助。
1. 很多开源软件,其实并不是很难,只要花时间,有耐心啃代码,都会水落石出,源码面前,了无秘密,这是进大厂的一个快速路径。
2. 上层技术都是都是基于底层技术构建,找到底层原子操作,你也可以构建上层应用,比如docker基于Linux三大件(namespace,cgroup,ufs),不管上层应用如何变化,这些技术都不会过时,掌握这些核心技术,会让你走得更远,即使是开发应用,也会比其他人做得更好。
3. 计算机基础知识(内存,CPU,缓存,网络,文件系统),基础思想(二分思想,缓存思想, 面向对象,流水线,批量,递归,延后处理等),都非常重要,这些是决定你技术上限,只有深刻理解基础知识,才能看问题看到本质,才能拥有强悍的实战能力,才能在技术之路上走得更远:
-
一类是解决问题的高手,保证业务可以稳定持续运行,基本功非常扎实,可以解决很多技术难题,终这类人会成为技术牛人和专家,比如阿里的多隆大神,谢宝友大神,耗子叔-陈皓,Dog250,TK教主,Kevin David Mitnick等;
-
一类是代码和软件设计高手,输出机器,保证产品可以快速上线,这类人终会成为架构师或者负责人,比如求伯君,章文嵩,章亦春,张小龙,比尔盖茨,Ken Thompson,Fabrice Bellard,Linus Torvalds,Jeff Dean等;
4. 学会把大系统分解成子系统,按专项逐个攻破每个子系统,收集子系统相关的资料,吸收他人的精华,有时候胜读十年书,加快自己成长;每个专家大神,都是从菜鸟过来的,向大佬看齐,快速吸收他们的经验,总有一天你也会修炼成功。
5. 团队都需要各种人才,我们不可能样样精通,5v5团战是需要大家一起配合的,一定要找到自己的位置,就算是辅助,也是辅助,照样让人刮目相看,比如我在我们团队,基本上算是疑难问题解决,辅助(各种环境搭建,资源建设,自动化,协助他人解决问题)和攻关队长,但不是很擅长写大段代码(纯输出)。
6. 有一些技术难点,是必现要去攻破的,比如之前在外企的时候,我写了多年的C++业务框架代码,一直对模板元编程感到力不从心,后面决心攻破这个问题, 并总结了C++这三座大山:
同时业务框架代码讲究就是代码和架构设计,对设计能力要求很高,我又重新学习很多设计模式(大话设计模式等):
7. 不设边界,之前在华为的时候,主要是做无线通信产品(USB上网卡,无线模块,车载模块,家庭CPE网关),需要对3G,4G等协议非常熟悉,我是从来没有搞过,使用是高通modem芯片,这些都是高通专利,一些重要的代码没有开放给我们,只能通过查看log和有限资料学习,通过提case和高通技术支持交流(悄悄学习),慢慢熟悉了高通设计,终我们写了很多经典文章,比如无线传输性能白皮书等;我们开发分两波人,一波是主协议,属于上层应用,一波是主驱动,属于底层架构,我一年后差不多掌握了无线协议开发,包括熟悉理解高通芯片设计,后面主动学习USB协议和驱动相关的,1年半后,我可以一个人包揽从上层到底层全部任务,后面很多项目PL都叫我来主导,每一年几乎都是员工。
8. 不断学习,谦虚谨慎,每个领域知识都是非常多,各行如隔山,学习是一辈子的事情,我们要成为更好自己,希望我们这一代在国内IT技术有所作为,引领计算机技术。