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.

204 lines
18 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.

# 用户故事 | 技术人如何做选择,路才越走越宽?
你好,我是宇新。
作为《操作系统实战45讲》的编辑。从专栏上线到现在已经有3个多月的时间了感谢你一直坚持到现在。
留意过课程评论区的同学都知道,我们有几位常驻的同学一直在主动输出。那这些“课代表”是怎样学习专栏,又有什么学习诀窍?
为了满足咱们的好奇心我特意策划了这次特别的采访请到了在专栏里留下很多精彩足迹的neohope同学我会代表好奇的小伙伴向他提问希望这次的分享能够带给你一些启发。
首先让我介绍一下neohope他是一个技术爱好者年龄就不说了。neohope做过很多的岗位像是软件工程师、项目经理、项目总监、产品经理、架构师、研发总监等现在他在医疗健康行业工作。
让我们正式开始这次采访吧!
### 如何搭建自己的学习体系
**Q1**你好neohope。你的课程笔记帮到了不少人看得出你学得很认真能给同学们说说对于学好《操作系统实战45讲》这个专栏你有哪些建议么
**A1**你好,关于怎么学好这门课程。我有这样几个建议作为参考。
第一个建议是**多动动手**:前期看到有些小伙伴不会用虚拟机,也不会命令行,但其实大部分同学花上几个小时也就搞定了。有了感性的认识,后面学习就不那么抽象了;
第二个建议就是**够用就好**不要一看里面有汇编语言就去从头学汇编也不要一看C语言就去学C。我的建议是能读懂就够了不会的命令网上找一下就可以了。其实我们不妨想一下自己小时候是如何读书的有些看不懂的字其实可以跳过去这不影响理解的
然后,我建议你**多看源码**:其实我的方法很笨,就是把老师的注释先拷贝到课程源码里,再结合自己的思考理解补充一些注释,这样读起来还是很简单的;
接着,就是要**多理资料**:有些地方看不太懂的,就去查资料,建议你把看完的资料,用自己的方式整理出来,然后分享,这样会有很好的效果;
最后,要**找到组织**:不要自己孤军奋战,找几个小伙伴定期聊聊,参与一些好的技术群,多交流会让你提升很快。自己迷惑的问题,可以问一下,看看别人如何理解的,不要害羞。
**Q2**感谢neohope的建议。从你的留言里可以看出你对操作系统认识很深即使是比较复杂的调用过程你也总能很快地理清脉络把握全局。这是怎么做到的呢
**A2**其实操作系统也好,其他技术也好,想要理解透彻都需要一个过程,而非一蹴而就。我觉得建立自己的知识体系,是一种很好的方法。
**Q3**这个知识体系你是怎么建立的呢?可否分享一下,让入行不久或即将入行的小伙伴做个参考么?
**A3**在我日常工作中,经常会遇到要教新人的情况,每一次带一位新人,我都会要求他/她做这样几件事情。
1.首先,我会请他用图解的方式,画一下自己会哪些技术;
2.然后,跟他深入聊几个常见问题,比如下面这些问题:
* 用谷歌浏览器打开一个登录页面,输入用户名、密码,当用鼠标点击登录按钮时,究竟发生了什么?
* 如何自己做一个框架去实现Spring Boot、Flask或WCF等相关功能自己平时用框架有没有不爽的地方想要如何改进它
* 找一个大家都熟的业务场景,聊一聊如何在技术或非技术层面进行改进……
3.在技术上,我还会问问他,后续的学习发展计划是怎样的,自己想学什么,优先要学什么?
4.最后,我会帮他/她去逐步建立一个技术栈并以此为出发点做一个为期1到3年的技术规划。
**Q4**前面几步听起来有点像面试的场景。你是怎样想到用这个方法呢?
**A4**我接着刚才知识体系说,因为工作以后,相比在学校系统学习,我们现在接触的信息大多都是碎片化的,对自己掌握了什么技术,我们并没有清晰的了解。而且根据我多年观察,即使是一些平时工作很认真的人,都没有去好好整理过自己的知识体系,这很可惜。
我第一次跟新入职的同学沟通时,可能最开始往往得到的是一堆的技术名词。
![](https://static001.geekbang.org/resource/image/1a/62/1a4cd91837c916927f380d8ff0f25062.jpg?wh=2625x1510)
这个时候,我会根据小伙伴自己的技术栈,帮他/她搭一个简单的体系框架,把上面的技术名词归类放好,这里我以后端工程师为例。
![](https://static001.geekbang.org/resource/image/82/00/82d26eb43679d2b69bba7a25020yy700.jpg?wh=2625x1510)
然后对于重点关注的层还可以进一步展开。咱们是自学操作系统那这里就把OS层展开。
![图片](https://static001.geekbang.org/resource/image/02/2a/0294030df01a0035424e6ccf2ac0d62a.jpg?wh=1920x821)
之后可以把自己整理的图和可信度高的资料进行对比。咱们这里就把上图和Cosmos、Linux进行一下对比。根据对比摘取自己需要的内容对自己的图进行补充。
![图片](https://static001.geekbang.org/resource/image/56/5c/564f822880c5dbe80755fb668a372d5c.jpg?wh=1920x2027)
![图片](https://static001.geekbang.org/resource/image/db/48/db075ebb230834f6ef75084a4eaab948.png?wh=1920x1440)
参考:[https://makelinux.github.io/kernel/map/](https://makelinux.github.io/kernel/map/)
这样,你自己的知识体系就有了雏形。接着,对于自己要重点学的内容,进一步展开,比如说,对于锁这个知识点,我是这样拆分的。
* 乐观锁、悲观锁
* 公平锁、非公平锁
* 重入锁、不可重入锁
* 自旋锁、非自旋锁
* 独享锁、共享锁、读写锁
* 分段锁、行锁、表锁
* 分布式锁、共识算法
* ……
之后,对于这些知识点,我们可以用不同颜色进行标记(后面我列出了我自己习惯用的标记方式)。标记好了以后,你可以把“必须,未掌握,红色”的内容,整理一个清单,排个优先级,作为未来一段时间学习计划的参考。
![](https://static001.geekbang.org/resource/image/4b/76/4bb513f8a40d67342abb78207065a876.jpg?wh=2025x1110)
A、必须已掌握绿色
B、必须未掌握红色
C、非必须已掌握绿色
D、非必须未掌握黄色
其实这个知识体系就像是一张藏宝图上面的一个个知识点就是一个个宝藏。实际使用的时候我们不用花很大精力去做这个图也不用限制是何种模式一个markdown文件足够了对自己有帮助就好。
随着你的积累和进步,每经过一个时期,都可以重新看下这个藏宝图,常看常新。
如果你特别喜欢自己的藏宝图,但图中有不少盲点,那就先找最基础的东西看,探索一段时间,迷雾自然就少了;如果你的藏宝图虽然很大,但能挖掘的精华有限,建议先找一张对你最有用的图,精力不要过于分散。如果这张图的要点你都掌握了,就需要扩展知识面,再去开个副本吧!
**Q5**你的藏宝图方法听起来很酷,看得出你对不同的技术栈都比较熟悉,可以说说你的思考么?比如,不同技术栈怎样找共同点?
**A5**随着不断的学习,我发现不同的技术栈,的确有很多相似的地方,就像是同一类型的宝藏。然后去看细节,又会发现不一样的地方,就像每个宝石,纹理都不一样。
以操作系统及虚拟机为例你有没有想过Linux、Windows、Android、iOS、Docker、VritualBox、JVM、CLR、V8都在管理哪些事情呢
虽然这些技术并不在一个层面其实很多要做的事情却是很相似的。比如都需要CPU管理、内存管理、任务管理、处理同步问题、文件管理、I/O管理、资源隔离、提供统一而稳定的API等。
然后,从任务管理这个角度再去看,还能看到优先级、时间片、抢占式、沙盒、命名空间、配额、欺上瞒下、甩手掌柜、单脑回路等等精彩的宝石纹理。
**Q6**刚才说了不少寻找共性的思路,掌握了很多技术以后,你会怎么去分析它们呢?
**A6**技术千千万,但追究其本质,技术都是为了解决具体问题的,这里我举三个例子吧。
以远程调用为例(远程调用推荐你看下公开课[《周志明的软件架构课》](https://time.geekbang.org/opencourse/intro/100064201)CORBA、DCOM、EJB、Webservice、REST、Thrift、ProtocolBuffer、Dubbo等这些技术都在解决什么问题呢这些技术的流行和没落的原因是什么呢
我们想要解决类似RPC的问题都是定义了一套规范要调用方和被调用方共同遵守而且都提供了代码的辅助生成工具。那为何至今还会有很多新的技术出来要解决这个问题呢咱们就又要去观察“纹理”了。
以任务调度为例从操作系统进程调度到线程池、Socket连接池、DB连接池、对象池再到F5、Nginx、Dubbo的流量控制以及到大数据的Yarn、容器的编排它们都在解决哪些问题
再以低代码为例ESB、OA流程编辑器+表单设计器、FaaS平台、SaaS平台都在解决什么问题给出的答案又有什么差异这种思考方式还有很多例子我就不一一列举了。
随着不断的学习,你会发现,不同的技术栈,有很多重叠的地方。比如,数据结构与算法、网络、数据库、文件处理、加密解密、系统调用等。一旦一次学会,就像打通任督二脉,在另外的地方,遇到类似问题的时候,就无师自通了。
**Q7**那不同的技术栈,你会怎么样做对比呢?
**A7**不同的技术栈,有很多不同的思路。就拿泛型为例,每种语言各有不同。
* C语言可以通过函数指针或宏来实现需要一定的编程技巧
* C++语言一般通过STL来实现在编译时实现会造成代码膨胀
* Java语言通过类型擦除实现编译时擦除JVM运行时并不知道处理的是什么类型
* C#语言在编译生成IL中间码时通用类型T只是一个占位符在实例化时根据实际类型进行替代并通过JIT生成本地代码不同类型的泛型类是不一样的
* Go语言当前版本并不支持泛型可以通过interface强制转换需要一些编程技巧
* JavaScript语言动态类型天生支持泛型。
**Q8**感觉这样做了对比之后,确实更容易加深理解。这个方法只能用在分析泛型么,可以不可以再举个例子?
**A8**好,我们再以继承为例,看看每种语言都是什么思路?
* C语言虽然通过一些编程技巧可以达到类似效果但C不是面向对象语言包一般不算支持继承
* C++语言,支持规格的继承(纯虚函数)和实现的继承(支持多个父类),多个父类会提升语言复杂度,造成很多问题;
* Java语言支持规格的继承接口和实现继承支持单个父类单个父类有时会无法复用部分代码
* Ruby语言支持规格的继承接口和实现继承支持单个父类同时mixin解决了代码复用的问题
* Go语言支持规格的继承接口和实现继承基于组合是一个优雅代码复用的解决方案
* JavaScript语言基于原型的继承。
### 学习方法相关
**Q9**说完学习体系的搭建neohope可以分享一下自己学习某个具体技术时有什么好方法么
**A9**在日常学习过程中,我自己总结了一个六步学习法,其实几步不重要,重要的是构建一个不断上升的螺旋就可以了。我的六步是这样的:学习、应用、思考、实现、剖析、交流,最后交流这一步又可以连回学习。
![图片](https://static001.geekbang.org/resource/image/15/54/15ba7c9ee43e5c3662cccbe406c3d954.jpg?wh=1920x1402)
这样说有点抽象就拿很多小伙伴都会的Spring技术为例你可以这样学习。
首先找本好书或好的教程学习Spring的使用。然后在学习和工作中开始使用Spring框架。在使用的时候就要去思考Spring框架的核心功能是如何实现的比如IoC是如何实现的
有了一定积累也做了不少思考之后自己可以尝试去写一个IoC框架并且对比源码或好的文章去看下自己框架有哪些地方没有考虑好试试改进。
我们在上小学、初中的时候,都会有一个错题本。掌握不好的知识点,会记录到本子上,定期拿出来看一下。建议你在工作和学习过程中,也养成这种复盘的习惯。比如,每天晚上洗澡的时候,可以想想,今天我做的事情有什么可以改进的地方。
最后,还要记得和同行多交流,学习高手的经验,进行深层次思考。发现不足后,再次进行学习。
关于交流我还想额外说两点,一个是练好英语,另外就是自己试着输出。工程师的英语要掌握到什么程度呢?在我看来,至少要可以流畅地看英文技术文档。不说别的,国外有很多高质量的技术文档及视频,真的很好。
另外,就是写博客写文章。相信很多小伙伴都知道费曼学习法,把别人教会才算真懂。写博客有很多好处,可以帮自己整理思路,可以加深对知识的理解,可以帮到别人。运营得好不仅可以得到收益,也可以给自己赢得名声。我自己也有写技术博客的习惯,你感兴趣的话可以看下[这里](http://www.neohope.com)。
### 学习心态与职业规划相关问题
**Q10**刚才我们聊了不少学习本身的事儿,其实学习方法之外,心态也很重要。现在很多人总是处于知识的焦虑中,无法沉下心学习,这个问题你是怎么看的呢?
**A10**现在是一个知识爆炸的时代,有各种各样的技术,有各行各业的知识。一打开电脑或手机,就感觉一堆东西要学,天天都有新框架,日日都有新名词,焦虑浮躁不堪。再加上网络上充斥着各大厂面试要求,更是让我们感觉内卷严重。
更糟糕的是,我们还总看到某些大厂根据年龄裁员的报道,感觉自己马上就要失业了,喘不过气来。不过我觉得吧,有紧迫感是个好事情,但过度焦虑大可不必。
如果你是一个学生或新人,不建议盲目追新,很多技术追着追着就没了。打基础,追主流,聚焦技术重点,就好了。
我们一直觉得国内内卷严重。但你不妨听一下吴军博士的演讲,日美欧早就开始用其他形式卷了,总结一下就是,“**内卷是社会发展到一定阶段的必然,是社会从粗放型到精细型转换的产物**”。
内卷不可怕可怕的是不断的重复自己10年经验只不过把第1年的事情重复了10年而已新技术啥都不会这样的人不失业谁失业
任何行业从来都缺少优秀的人但从来都不缺螺丝钉。30岁有30岁的要求40岁有40岁的要求。40岁还拿“螺丝钉”的要求考量自己是不行的。不要说开发哪个行业都不行。
其实来咱们专栏学习的小伙伴,已经比业界大多数人都要勤奋好学了。只要我们做好规划,不断朝目标前进,一定会收获一个不错的结果。优质的人才,在任何一个行业都是稀缺的。
**A11刚才你说“40岁不应该再拿螺丝钉要求自己了”。这就涉及到职业规划的问题可以说说你的看法么**
**Q11**有些小伙伴,从业一段时间后,又开始纠结,“我是不是该转管理了啊,我是不是做产品试试,我什么时候能做架构呢”。如果你也有这样的困惑,我建议你问自己这样一个问题,你想发展“技术+什么”?
如果你技术很好,学新东西特别快,广度和深度都很好,那你可以走技术+技术这条路。当然这里可以细化,比如说如果你技术很好,对数据安全方面特别感兴趣,就可以走技术+数据安全这条路。
如果感觉技术纵深不适合,但你对行业特别感兴趣,可以考虑技术+行业这条路,一方面懂技术,一方面懂行业知识,这样的人哪个行业都缺,很棒! 比如你技术不错,对行业、对公司产品又有深入的理解,不妨试试解决方案专家这条路;对公司产品有深入的理解,又懂客户、会聊天,技术+售前、技术型销售这些方向,都可以考虑。
如果你技术不错,又有一定的领导力,喜欢和人打交道,也可以做技术+管理这条路;如果你不光技术不错,还特别善于把自己所学传授他人,也可以做技术+培训这条路……
![图片](https://static001.geekbang.org/resource/image/yy/1a/yy54b4f04323d6751f7ca3yy1c730e1a.jpg?wh=1522x663)
这样的选择,很多很多。路要越走越宽,不要越走越窄。以后你要“技术+什么”?这才是每个人自己要面对的问题。我对职业规划的理解大概是这些。
谢谢neohope谢谢你给同学们分享了这么多建议、思考。
正如neohope同学所说学习不是一蹴而就而是要搭建自己的学习体系。想成为优秀的工程师首先要对自己有充分的了解。“35岁魔咒”这样让人焦虑的问题我们也不妨换个思路看想一想自己可以走“技术+什么”的道路。
像neohope这样把自己的学习思考变成能分享给他人的方法论的确是一件很酷的事儿。很期待这次的分享能够带给你不一样的思考让我们共同学习进步