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.

92 lines
9.7 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.

# FAQ第一期 | 学与不学,知识就在那里,不如就先学好了
你好,我是徐文浩。专栏上线三个多月,我们已经进入后半段。
首先,恭喜跟到这里的同学,很快你就可以看到胜利的曙光了。如果你已经掉队了,不要紧,现在继续依然来得及。
其次,非常感谢同学们的积极留言,看到这么多人因为我的文章受到启发、产生思考,我也感到非常开心。因此,我特意把留言区中非常棒的、值得反复阅读和思考的内容,摘录出来,供你反复阅读学习。
有些内容你可能已经非常熟悉了,但是随着工作、学习经验的不同,相信你的理解也会不一样;有些内容可能刚好也是你的疑问,但是你还没发现,这里说不定就帮你解决了。
今天第一期,我们先来聊聊,“学习”这件事。我准备了五个问题,话不多说,一起来看看吧!
* * *
## Q1“要不要学”和“学不会怎么办”系列
![](https://static001.geekbang.org/resource/image/eb/86/eba537e71418f1af3ddedcd7940f4386.jpeg)
专栏已经更新三个多月了但是我估计很多人还是停留在前面3篇的学习上我相信一定有的
我观察了一下,其实很多人并不是真的学不会,而是“不敢学”,往往还没开始就被自己给吓到了。很多优秀的人,并非真的智商有多么高,而是他们敢于尝试,敢于突破自己的舒适区。
所以说,学习底层知识或者新知识的第一点,就是要“克服恐惧”,其实大部分东西上手了都不难,都很有意思。就像《冰与火之歌》里面,水舞者教导艾莉亚时的情况一样,“恐惧比利剑”更伤人。破除对于基础知识“难”的迷信,是迈向更高水平必经的一步。
“组成原理可以算是理解计算机运作机制的第一门入门课,这门课的交付目标就是让科班的同学们能够温故而知新,为非科班的同学们打开深入学习计算机核心课程的大门。”这是我在专栏刚上线的时候给一个同学的留言回复,现在拿过来再给你说一遍。
另外,大家在学校里学这些课程的时候,都会遇到一个问题,那就是理论和我们的编程应用实践离得比较远。在这个专栏里,我的目标是让大家能够更“实践”地去学习计算机组成原理。
所以,这门课我的目标就是尽量讲得“理论和实践相结合”,能和你的日常代码工作结合起来。让非科班的同学们也能学习到计算机组成原理的知识,所以在深入讲解知识点之外,我会尽量和你在开发过程中可能遇到的问题放到一块儿,只要跟着课程的节奏走,不会跟不上哦。**(跟到这里的同学可以在留言区冒个泡,给跟不上的同学招个手,让他们放心大胆看过来。)**
我自己在大学的时候也不是个“好学生”。现在回头看,我自己常常觉得大学的时候没有好好读书,浪费了很多时间。常常想,当时要是做了就好了。当时,不是就是现在么?学或者不学,知识就在那里,不如就先学好了啊。
## Q2“计算机组成原理”和“操作系统”到底有啥不一样
![](https://static001.geekbang.org/resource/image/d4/6b/d4a64cf654218cf992c6cf621356ee6b.png)
其实操作系统也是一个“软件”,而开发操作系统,只需要关注到“组成原理”或者“体系结构”就好了,不需要真的了解硬件。操作系统,其实是在“组成原理”所讲的“指令集”上做一层封装。
体系结构、操作系统、编译原理以及计算机网络,都可以认为是组成原理的后继课程。体系结构不是一个系统软件,它更多地是讲,如何量化地设计和研究体系结构和指令集。操作系统、编译原理和计算机网络都是基于体系结构之上的系统软件。
其实这几门基础学科,都是环环相扣,相互渗透的,每一门课都不可能独立存在。不知道你现在是否明白这几门基础学科的价值呢?
## Q3“图灵机”和“冯·诺依曼机”的区别
![](https://static001.geekbang.org/resource/image/ce/dd/ce241278076f71c81a78812de51114dd.jpg)
首先,先回答一下这道题本身。有些同学已经回答的不错。我把他们的答案贴在这里。你可以看看跟你想的是不是一样。
**Amanda 同学:**
> 两者有交叉但是不同,根据了解整理如下:
> 图灵机是一种思想模型(计算机的基本理论基础),是一种有穷的、构造性的问题的求解思路,图灵认为凡是能用算法解决的问题也一定能用图灵机解决;
> 冯·诺依曼提出了“存储程序”的计算机设计思想,并“参照”图灵模型设计了历史上第一台电子计算机,即冯·诺依曼机。
图灵机其实是一个很有意思的话题。我上大学的时候,对应着图灵机也有一门课程,叫作“可计算性理论”,其实就是告诉我们什么样的问题是计算机解决得了的,什么样的问题是它解决不了的。
在我看来,图灵机就是一个抽象的“思维实验”,而冯·诺依曼机就是对应着这个“思维实验”的“物理实现”。如果我们把“图灵机”当成“灵魂”,代表计算机最抽象的本质,那么“冯诺伊曼机”就是“肉体”,代表了计算机最具体的本质。这两者之间颇有理论物理学家和实验物理学家的合作关系的意思,可谓是一个问题的两面。
冯·诺依曼体系结构距今已经几十年了目前我们还没有看到真正颠覆性的新的体系结构出现更多地是针对硬件变化和应用场景变化的优化。但是过去几年随着深度学习、IoT等的发展体系结构又有了一波新的大发展也许未来会有新的变化呢我们可以拭目以待。
## Q4工作多年如何保持对知识清晰、准确的认识
![](https://static001.geekbang.org/resource/image/fa/05/fafe82142456949c5e1e670efe102705.png)
我之前跟很多人聊过,发现工作很多年之后的工程师,在计算机科学的基础知识上,反而比不上很多应届的同学。我总结下来,大概有这么几个因素。
首先,很多工程师只是满足于工作的需求被满足了,没有真的深入去搞清楚一个问题的原理。从网络上搜索一段代码,复制粘贴到自己的程序里,只要能跑就认为问题解决了,并没有深入一行行看明白每行代码到底是做了什么,为什么要这么做。
比如说我们现在要提升RPC和序列化的性能很多人的做法是找一个教程用一下Thrift这样的开源框架解决眼下的问题就完事儿。至于Thrift是怎么序列化的每一种里面支持的RPC协议是怎么回事儿完全不清楚。其实这些开源代码并不复杂稍微花点时间搞清楚里面的实现细节和原理你对二进制存储、程序性能、网络性能就会有一个更深刻的认识之后遇到类似的问题你就不会再一问三不知久而久之你的能力就会得到提升。
其次,读书的时候我们认为一个东西掌握扎实了,有时候其实未必。很多人估计都有感受,像计算机这类实践性比较强的专业,书上所学和真正实践中所用完全是两码事。背出计算机的五大组成部分,似乎和我们的实际应用没有联系,但是在实际的系统开发过程中,无论是内存地址转换使用的页表树这样的数据结构,还是各个系统组件间通过总线进行通信的模式,其实都可以和我们自己的应用系统开发里的模式和思路联系起来。
至于究竟该怎么去掌握知识,其实没有什么特别好的方法。我就说说我一般会怎么做,一方面,遇到疑难问题、复杂的系统时,必须要用更底层更本质的理解计算机运作的方式,去处理问题,自然会去回头把这些基础知识捡起来;另一方面,时不时抽点时间回头看看一些“大部头”的教科书,对我自己而言,本身就很有自我满足感,而这种自我满足感也会促使我不断去读它们,从而形成一个良性循环。
## Q5六个最实用的、督促自己学习的办法
看到很多同学在留言里分享了自己学习方法,我看了也非常受益,我把这些方法筛选总结了一下,又结合我自己的学习经验,放在这里分享给你。
1. 好奇心是一个优秀程序员必然要有的特质。多去想想“为什么是这样的”,有助于你更深入地掌握这些知识点。
2. 先了解知识面,再寻找自己有兴趣的点深入,学习也是个反复迭代的过程。
3. 带着问题去学习是最快的成长方式之一。彻底搞清楚实际在开发过程中遇到的困难的问题,而不是只满足于功能问题被实现和解决,是提升自己的必经之路。
4. “教别人”是一种非常高效的学习方式,自己有没有弄清楚,在教别人的过程中,会体会得明明白白。
5. 每个月给自己投资100-200块在专业学习上面这样花了钱通过外部约束也是一个让自己坚持下去的好办法。
6. 坚持到底就是胜利✌️。把学习和成长变成一种习惯,这个习惯带来的惯性会让你更快地成长。
* * *
好了,到这里,我们第一期答疑就要结束了。这次我主要和你谈了谈“学习”这个话题,不知道你有什么感受呢?你还想听我和你聊什么专栏之外的话题呢?
欢迎积极留言给我。如果觉得这篇文章对你有帮助,也欢迎你收藏并分享给你的朋友。对了,看到这里的同学,记得在留言区给后面的同学招个手啊:)