This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

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

View File

@@ -0,0 +1,112 @@
<audio id="audio" title="FAQ第二期 | 世界上第一个编程语言是怎么来的?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/32/ed/323442a890f99b2a81a9e962eeeb57ed.mp3"></audio>
你好我是徐文浩今天是第二期FAQ我搜集了第3讲到第6讲大家在留言区问的比较多的问题来做一次集中解答。
有些问题,可能你已经知道了答案,不妨看看和我的理解是否一样;如果这些问题刚好你也有,那可要认真看啦!
希望今天的你,也同样有收获!
## Q1为什么user + sys运行出来会比real time多呢
<img src="https://static001.geekbang.org/resource/image/36/4c/3665db1602c971c2cad1932ee8d0804c.png" alt="">
我们知道实际的计算机运行的过程中CPU会在多个不同的进程里面切换分配不同的时间片去执行任务。所以运行一个程序在现实中走过的时间并不是实际CPU运行这个程序所花费的时间。前者在现实中走过的时间我们叫作real time。有时候叫作wall clock time也就是墙上挂着的钟走过的时间。
而实际CPU上所花费的时间又可以分成在操作系统的系统调用里面花的sys time和用户态的程序所花的user time。如果我们只有一个CPU的话那real time &gt;= sys time + user time 。所以,我当时在文章里给大家看了对应的示例。
不过有不少同学运行出来的结果不是这样的。这是因为现在大家都已经用上多核的CPU了。也就是同一时间有两个CPU可以同时运行任务。
你在一台多核或者多CPU的机器上运行seq和wc命令会分配到两个CPU上。虽然seq和wc这两个命令都是单线程运行的但是这两个命令在多核CPU运行的情况下会分别分配到两个不同的CPU。
于是user和sys的时间是两个CPU上运行的时间之和这就可能超过real的时间。而real只是现实时钟里走过的时间极端情况下user+sys可以到达real的两倍。
你可以运行下面这个命令,快速验证。让这个命令多跑一会儿,并且在后台运行。
```
time seq 100000000 | wc -l &amp;
```
然后我们利用top命令查看不同进程的CPU占用情况。你会在top的前几行里看到seq和wc的CPU占用都接近100实际上它们各被分配到了一个不同的CPU执行。
我写这篇文章的时候测试时只开了一个1u的最小的虚拟机只有一个CPU所以不会遇到这个问题。
## Q2时钟周期时间和指令执行耗时有直接关系吗
<img src="https://static001.geekbang.org/resource/image/f9/31/f9da13f81cc676645a224b8ea6744931.png" alt="">
这个问题提的得非常好,@易儿易 同学的学习和思考都很仔细、深入。
“晶振时间与CPU执行固定指令耗时成正比”这个说法更准确一点。我们为了理解可以暂且认为是晶振在触发一条一条电路变化指令。这就好比你拨算盘的节奏一样。算盘拨得快珠算就算得快。结果就是一条简单的指令需要的时间就和一个时钟周期一样。
当然实际上这个问题要比这样一句话复杂很多。你可以仔细去读一读专栏关于CPU的章节呢。
从最简单的单指令周期CPU来说其实时钟周期应该是放下最复杂的一条指令的时间长度。但是我们现在实际用的都没有单指令周期CPU了而是采用了流水线技术。采用了流水线技术之后单个时钟周期里面能够执行的就不是一个指令了。我们会把一条机器指令拆分成很多个小步骤。不同的指令的步骤数量可能还不一样。不同的步骤的执行时间也不一样。所以一个时钟周期里面能够放下的是最耗时间的某一个指令步骤。
这样的话单看一条指令其实一定需要很多个时钟周期。也就是说从响应时间的角度来看一个时钟周期一定是不够执行一条指令的。但是呢因为有流水线我们同时又会去执行很多个指令的不同步骤。再加上后面讲的像超线程技术等等从吞吐量的角度来看我们又能够做到平均一个时钟周期里面完成指令数可以超过1。
想要准确理解CPU的性能问题请你一定去仔细读一读专栏的整个CPU的部分啊。
## Q3为什么低压主频只有标压的2/3计算向量点积的时候怎么提高性能
<img src="https://static001.geekbang.org/resource/image/87/6b/87e8925f9d8b12906164e17dad86626b.png" alt="">
低压和低主频都是为了减少能耗。比如Surface Go的电池很小机器的尺寸也很小。如果用上高主频性能更好了但是耗电并没有下来。
另外低电压对于CPU的工艺有更高的要求因为太低的电压可能导致电路都不能导通要高主频一样对工艺有更高的要求。所以一般低压CPU都是通过和低主频配合用在对于移动性和续航要求比较高的机器上。
向量计算是可以通过让加法也并行来优化的不过真实的CPU里面其实是通过SIMD指令来优化向量计算的我在后面也会讲到SIMD指令。
## Q4世界上第一个编程语言是怎么来的
<img src="https://static001.geekbang.org/resource/image/8d/75/8d8e399dfef0d4b62c34910ccd4f4d75.png" alt="">
如果你去计算机历史博物馆看一下真机就会明白第一台通用计算机ENIAC它的各种输入都是一些旋钮可以认为是类似用机器码在编程后来才有了汇编语言、C语言这样越来越高级的语言。
编程语言是自举的,指的是说,我们能用自己写出来的程序编译自己。但是自举,并不要求这门语言的**第一个**编译器就是用自己写的。
比如这里说到的Go先是有了Go语言我们通过C++写了编译器A。然后呢我们就可以用这个编译器A来编译Go语言的程序。接着我们再用Go语言写一个编译器程序B然后用A去编译B就得到了Go语言写好的编译器的可执行文件了。
这个之后我们就可以一直用B来编译未来的Go语言程序这也就实现了所谓的自举了。所以即使是自举也通常是先有了别的语言写好的编译器然后再用自己来写自己语言的编译器。
更详细的关于鸡蛋问题可以直接看Wikipedia上[这个链接](https://en.wikipedia.org/wiki/Bootstrapping_(compilers)),里面讲了多种这个问题的解决方案。
## Q5不同指令集中汇编语言和机器码的关系怎么对应的
<img src="https://static001.geekbang.org/resource/image/26/bc/26dbff8c5bf1f6fa4c24516cf4d911bc.png" alt="">
不同指令集里对应的汇编代码会对应这个指令集的机器码呀。大家不要把“汇编语言”当成是像C一样的一门统一编程语言。
“汇编语言”其实可以理解成“机器码”的一种别名或者书写方式,不同的指令集和体系结构的机器会有不同的“机器码”。
高级语言在转换成为机器码的时候,是通过编译器进行的,需要编译器指定编译成哪种汇编/机器码。
物理机自己执行的时候只有机器码,并不认识汇编代码。
编译器如果支持编译成不同的体系结构的汇编/机器码就要维护很多不同的对应关系表但是这个表并不会太大。以最复杂的Intel X86的指令集为例也只有2000条不同的指令而已。
## Q6某篇文章大段大段读不懂怎么办
<img src="https://static001.geekbang.org/resource/image/3e/f6/3eeecdd9685196f4eb2e32012dc867f6.png" alt="">
@胖胖胖 同学说得很好。在专栏最开始几篇,或者到后面比较深入的文章,很多非科班的或者基础不太好的同学,会觉得读不下去,甚至很多地方看不懂。这些其实都是正常现象。
即便我在写的时候,已经尽可能考虑得比较完善,照顾大家的情况,但是肯定无法面面俱到。在我平时学习过程遇到拦路虎的时候,我一般有两种方法,这里跟你分享一下。
第一种,硬读。
你可能说了,这也叫方法吗?没错,事实就是这样。如果这个知识点,我必须要攻克,就想要搞明白,那我就会尽我所能,去看每一个字眼,把每个不理解的地方,都一点一点搞明白。不吝啬花费时间和精力。
当然这种情况适合我对这个内容完全不了解,或者已经基本了解,现在需要进一步提升的情况下。因为,在完全不了解一个知识的时候,这个壁垒是很高的。如果不想办法突破的话,那可能就没办法了解这个新的领域。而在已经基本了解某个领域或者某块知识的情况下,我去攻克一些更高难度的知识,很多时候也需要同样的方法,我会建立在兴趣的基础上去硬读,但是之后会非常非常有成就感。
第二种,先抓主要矛盾,再抓细节问题。
很多时候,大家在对一个知识不了解的时候,会感觉很“恐慌”。其实完全没必要,大家学任何东西都是从不会到会这么一个过程。就像@胖胖胖 同学说的那样,先找出这篇文章的主干,先对这些东西有个大致的概念。如果有需要,在之后的过程中,你还会碰到,你可以再重读,加深印象。
有时候,学习知识可以尝试“短期多次”。也就是说,看完一遍之后,如果不明白,先放下,过一段时间再看一遍,如果还不明白,再过一段时间再看。这样循环几次,在大脑中发酵几次,说不定就明白了,要给大脑一个缓冲的时间。
好了,今天的答疑到这里就结束了。不知道能否帮你解决了一些疑惑和问题呢?
我会持续不断地回复留言,并把比较好的问题精选出来,作为答疑。欢迎你继续在留言区留言,和大家一起交流学习。

View File

@@ -0,0 +1,105 @@
<audio id="audio" title="特别加餐 | 我在2019年F8大会的两日见闻录" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/36/6c/36013b6b3bb588b9ae87119328821b6c.mp3"></audio>
你好我是徐文浩。4月30日我在美国圣何塞参加了F8大会趁此机会和你分享一下我在大会上的一些见闻。下面是我参会这两天写的见闻录分享给你。希望可以看到更多技术人走出去抬头看看世界丰富自己的见识和经历。
## Day 1“The Future is Private”
今年是我连续第三年来F8了。如果说第一年是带着一点好奇和忐忑作为一个开发者来看看世界上最大的社交网络的开发者大会是怎么回事儿到了第二年作为一个Developer Partner看到自己公司的logo出现在首日的Keynote里就觉得格外兴奋那么今年第三年就有些轻车熟路了没有什么压力反而很想看一看每年一次的开发者大会还能办出什么新花样。
<img src="https://static001.geekbang.org/resource/image/e6/27/e6effd7050ec22d0284d3af592c56c27.jpg" alt="">
从旧金山国际机场出来一路Uber到了圣何塞住下不禁感慨互联网和智能手机的确改变了世界。一个中国人到美国拿着手机也能在这里生存下来了。
为了倒时差,我硬是熬到半夜睡了一觉。早早赶到圣何塞市中心的会场,发现已经有不少人在排队入场了。
去年的F8因为Facebook面临“剑桥门事件”主题的Keynote颇有些疲于应对的感觉。然而在过去的一年里Facebook推出的种种隐私保护的功能似乎并没有解决“隐私泄露”的问题反而给人一种此起彼伏、应接不暇的感觉。
<img src="https://static001.geekbang.org/resource/image/0f/e2/0f8bdbdcbe2c5cfba7926c79fb2c11e2.jpg" alt="">
于是今年的F8Facebook颇有些破釜沉舟、不破不立之感。扎克伯格的开场Keynote就表示Facebook要开始在整个公司的运营策略上做出重大改变打造一个“Privacy Focused Social Platform”接着更是亮出了“The Future is Private”的slogan。
<img src="https://static001.geekbang.org/resource/image/c5/2e/c583a5791cd27a0b9b0af67aa474162e.jpg" alt="">
紧接着扎克伯格介绍了Facebook这两年力推的产品Messenger。Messenger团队重写了整个手机客户端让整个客户端小于30MB冷启动时间少于1.3秒默认端到端加密并给它起了一个代号叫LightSpeed。
这几项指标都可以直接拿来和自家被认为简单易用的WhatsApp做对比而且明显胜出。为了服务更多Messenger的发达国家用户Facebook更是干脆开发了一个桌面版的客户端。要知道在这个移动端主宰一切的年代还会投入精力开发桌面客户端的公司可不多了。可以看出Facebook推动Messenger产品的决心。
<img src="https://static001.geekbang.org/resource/image/4d/c3/4d5274e5a721847f0331bb270befe5c3.jpg" alt="">
WhatsApp产品更新介绍的核心也还是在隐私上。他们能够通过Messenger直接和WhatsApp联系人通信这更是可以看出Facebook迈出了打通旗下所有产品的第一步。
<img src="https://static001.geekbang.org/resource/image/f7/5f/f7c163214d2de6fd6714287db764345f.jpg" alt="">
然而更重磅的还在后面。在介绍完Messenger和WhatsApp的产品更新之后会场的大屏幕上打出了白底蓝字的“FB5”的logo。
**作为Facebook最核心的产品也是自己公司名字的Facebook迎来了多年以来的第一次大型改版**App和Web端界面完全重写产品中心从原先的信息流转向以Group为核心。“Groups at the heart”传统蓝底白字的“f”字logo也变成了有背景动图的“f”字logo了。
<img src="https://static001.geekbang.org/resource/image/8b/77/8b46c1caf0c083c4d96cd2d16522b777.jpg" alt="">
如果说其他App上的改动还可以认为是Facebook的尝试或者探索作为其主要收入来源的Facebook改版恐怕是动真格的了。**从一个开放信息流式的产品变成一个以Group为核心的、有着私密性的产品怕是多年以来Facebook这个App的另一次重大转变了。**
之后的Instagram、Portal以及Spark VR的产品更新都没有引起太多关注。Keynote的下一个爆点自然是Oculus。
Facebook是目前市场上唯一还在大力投入VR的大型厂商。这一次让人尖叫的就是Oculus Quest。这第一个“无线”的Oculus的确引人注目。当现场宣布所有参加F8的人将人手派发一个Oculus Quest更是引来全场的掌声。大屏幕上看着卡马克头戴Oculus挥舞光剑更是让老程序员们回忆起在DOS上玩“Wolfenstein 3D”的旧时光。
<img src="https://static001.geekbang.org/resource/image/7c/f1/7c67b09702e8e26c47afa0b83cae4cf1.jpg" alt="">
早上的Keynote结束之后就是自由活动了。参会的工程师们可以选择去不同的会议室听各种开发和产品相关的小讲座也可以直接在主会场的各个“摊位”前和Facebook的工程师沟通交流。通常如果提问的话还会拿到背包、T恤、帽子这样的小奖品。
当然排长队去体验Oculus是每年最热门的项目。你也可以在会场里面转悠和其他开发者认识一下。免费的零食和饮料到处都是。**与其说这是一个开发者大会其实更像是一个Facebook生态圈的嘉年华。**
<img src="https://static001.geekbang.org/resource/image/95/50/95ca1c530901b73e48bc2452f2b2fe50.jpg" alt=""><img src="https://static001.geekbang.org/resource/image/2a/71/2a57495f80f1dc4ab31ee77c5dd28671.jpg" alt="">
F8的第一天仍然是以Facebook自己的四大产品为核心的一个主题会议并没有介绍太多AI和VR的黑科技。按照惯例这些黑科技会在明天的Keynote呈现值得期待。我印象比较深的是今天在讲解Oculus Rift S的时候介绍了Oculus Insight Position Tracking不知道明天又会有什么新科技出现。
## Day 2科技改变世界
第二天的Keynote仍然是在圣何塞市中心的McEnery会议中心举办。虽然Keynote要到10点开始但是我住的公寓没有早餐我和同事们还是8点刚过就跑到会场去“蹭饭”吃。
<img src="https://static001.geekbang.org/resource/image/b2/84/b2dd1268cb0457941619328b72133a84.jpg" alt="">
女性在科技界始终是“少数派”所以Facebook特地在F8的第二天在会场旁边的万豪酒店举办了一个Women Breakfast的活动邀请所有参与F8的女性一起吃早餐相互交流。
我们的一位产品经理也早早地去了会场参与这个活动。我想起前一天的Keynote里介绍4个核心产品的演讲者中有3位都是女性这让这个充满“科技感”的活动平添了一分人文的色彩。
<img src="https://static001.geekbang.org/resource/image/d1/66/d10ff8ad0033d9a934dd603fc1a68e66.jpg" alt="">
免费早餐之后大家的焦点又转移到了主会场。第二天的主题Keynote不同于第一天以Facebook的产品为核心而是集中在“技术”这个词上。
一般来说第一天的Keynote关注的是最近这三五年来Facebook的产品发展方向那么第二天的Keynote的目标则放得更加长远关注的是Facebook未来十年会关注和投入的技术。今年也毫不例外。Connectivity、机器学习、AR和VR把整个会场带入了一个更有科技感的主题里去。
<img src="https://static001.geekbang.org/resource/image/83/3e/83d67089c4ff6de8a3d508ec0921f93e.jpg" alt="">
不过今年的Keynote和往年的还是有点不一样。过去几年里F8第二天的Keynote都显得更有“梦想”一些比如通过无人机为经济不发达区域提供网络接入研究怎么通过Reinforcement Learning让机器打《星际争霸》。
过去两年里我们常常能看到一些或许挑战很大但是却又容易让人憧憬的项目出现。而今年第二天的Keynote主题却和前一天环环相扣专注在了“Responsible Innovation”这样一个主题上。
<img src="https://static001.geekbang.org/resource/image/8d/a2/8d96967f3c1346392f4caca9ea7389a2.jpg" alt="">
如何通过机器学习找出虚假账号如何过滤仇恨言论乃至如何解决网络霸凌变成了一个个的机器学习案例反复出现在今天的Keynote里。似乎Facebook是想更坚定地传达这样一个信息“The Future is Private”这件事情我们是认真的。
在整个Keynote的过程里面也让大家看到了对于有害内容的过滤从简单的关键词匹配进化到应用计算机视觉直到今天使用的Nearest Neighbor Manifold Expansion &amp; Multi-modal Understanding这样更加复杂的机器学习技术一步一步是如何发展的。
<img src="https://static001.geekbang.org/resource/image/c9/fd/c90468d382b57a21706adce0f08c68fd.jpg" alt="">
Keynote结束之后第二天的其他内容都安排得更加紧凑了一些。大部分的小会场都在午餐时间同时进行内容也更加“硬核”。各个小会场里看到的不是产品更新而是各种机器学习问题在Facebook的实际解决方法和应用。更有不少小会场里面Facebook的工程师直接给大家展示了代码。有心想要了解一些特定问题的工程师可以从这里面学到不少有用的东西。
<img src="https://static001.geekbang.org/resource/image/e4/5a/e4650e28e113101b3b36ebaa5b0b835a.jpg" alt="">
除了“学习”之外参加F8很重要的一个方面是社交。第二天的有些小会场是以座谈会的形式邀请外部的开发者合作伙伴来分享他们的成功案例。开发者之间的相互交流也更多了起来。
在所有内容结束之后Facebook新加坡办公室的Partner Manager带着我们移师会议中心附近的餐馆开始了一个小小的After Party。我们一群来自五湖四海的华人就在美国一边吃着墨西哥菜一边交流。“微信”是Facebook的开发者大会上始终绕不开的话题Facebook自己的各类消息类产品其实也一直在从微信里面汲取养分。
<img src="https://static001.geekbang.org/resource/image/f3/f4/f3c98d9ce71e26ec1846215fc4de73f4.jpg" alt="">
晚餐过后今年的F8就算正式结束了。认识的新朋友重新见面的老朋友之后就又要各奔东西了。而我自己打算在回程之前跑一趟心心念念的计算机历史博物馆去看看里面收藏的从ENIAC到现代计算机的经典型号为今年的旅程画上一个完满的句号。
## 推荐阅读
[Facebook全球最大社交网络向未知转型](https://mp.weixin.qq.com/s/UMnm2U1qKEI4V5IQdXINTQ)
[F8 2019 Day 1 Keynote](https://developers.facebook.com/videos/f8-2019/day-1-keynote/)
[F8 2019 Day 2 Keynote](https://developers.facebook.com/videos/f8-2019/day-2-keynote/)

View File

@@ -0,0 +1,41 @@
<audio id="audio" title="特别加餐 | 我的一天怎么过?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/d4/29/d4731b87cca6015b51b9860816fa1a29.mp3"></audio>
你好我是徐文浩。专栏更新到50多篇快要结束了。在进入实战篇之前我想先和你分享一个专栏之外的话题那就是我的一天是怎么过的。
为什么想写这篇文章呢?主要目的是“破除神话”。周围一些朋友说,你在创业很厉害;也有朋友说,你能写专栏很厉害。其实我觉得自己和大家一样,就是一个普普通通的工程师,每一天都是普通且忙碌的。同时,我也希望通过这篇文章,能够拉近和你的距离,在专栏快要完结之际,可以在未来和你有更多的交流。
作为一个工程师出身的创业者,很多人会好奇,我是不是还常常写代码?也有朋友看我一直出差,会问我现在主要精力是不是都在产品上了?还有,我究竟要花多少时间在写这个专栏上?
事实上,作为一个创业者,我很难给自己的工作划定个小小的范围,然后说,“看,这个就是我做的事情”。在公司里,我每天在做的,其实主要就是两件事情。一件事情,我称之为“让事情按次发生”,主要是规划和推动公司里想要做的事情,推动产品结合业务往前走。另一件事情,我称之为“面对问题,解决问题”,主要是给各种突发的、意料之外的问题找解决办法。
规划和推动产品的工作,往往时间安排上主动一些,我会尽可能找完整大块的时间来做。而解决问题的事情,往往就比较碎片化,只能时时响应处理。
很多学习专栏的同学,工作时间应该都不是非常久,还有不少属于自己的业余时间。对我来说,想有属于自己的时间,基本上是奢望了。特别是最近半年多时间,每天都要抽出时间来写专栏,睡眠时间都牺牲了不少。
当然,我和大部分同学以及其他专栏作者,在时间安排上,差异最大的一点是,我会比较频繁地去海外出差了。在国内的时候,我的时间安排通常还比较有规律,比如,下面是我最近在国内的一个周一。
1.周一一早9点刚到公司我先会看看我们用作视频会议设备是否都连上了。虽然其实公司人还不多但是因为主要是针对海外的业务所以有马尼拉、曼谷、杭州、深圳四个办公地点异地沟通成了一个很大的问题。通过发消息或者视频会议的方式沟通效率仍然很低所以我们干脆通过Facebook Portal群组聊天的方式8小时“直播”各个办公室的情况。需要找另外一个办公室的同事的时候对着视频会议的屏幕吼一声就是了。
2.9:45开始我连续参加了两个小团队的站会。站会有对应负责的同学来主持推动我主要是多听一听大家是否遇到什么问题以及需要什么样的支持。这里面的问题可能来自内部的其他团队也可能是需要问外部的客户、Facebook、合作方的各种问题。这一天很顺利事情团队自运转就继续正常推进了我们的产品进度。
3.因为是周一所以10:00开始我会和各个团队的负责人开一个非业务内容的周会。因为最近在推动公司内部做好跨团队职责的协同所以最近的重点是在做两件事情。一个是从后端的研发团队开始推进强流程的代码审核目标是提升代码质量和长期的迭代速度。第二个是培养整个系统里各个非功能模块的首要负责人主要是要把从云服务器管理、CDN、网络、监测等等非功能性的需求和职责划分给到更多不同的工程师让他们各自负责之后再做学习分享。这样可以让大家对整个系统的全貌有个了解而不是只是把这些问题放在一两个资深的技术同学身上。
这一天里,我发现代码审核进展很慢,主要是大家都还是觉得这样会影响进度,但是我内心深处知道不是这么回事儿,因为从开始要做这个事情已经两三周过去了。所以,我就不再是“建议”,而是“强迫”团队开始做代码审核了。各种非功能性的“负责人”的分配倒是相对比较顺利。
4.我们通常开会都很短三个会开完也就是10:30这样子。不过因为是周一所以接下来的主要时间还是在清理邮件。这里面既有来自外部客户和合作伙伴的问题也有系统自动生成的各种报告。能直接回复的都会直接回复掉不能直接回复的我会加到Microsoft TO-DO里面作为待办事项列表。
5.基本上把邮件清理完了,也就到了中午。我一般不叫外卖,而是和同事们一起出门觅食。因为大部分时间都是在办公室里坐着,运动也少,所以除非是暴雨天气,我一定是要出去走动走动的。和不同的同事吃饭,聊两句生活,互相之间的距离也能拉近不少。
6.吃完午饭,我自己的常备节目是去买杯瑞幸或者全家的咖啡。通常也有不少同事会一起过去,不管买还是不买,都要溜个弯儿。我自己最近有点睡得少,不靠咖啡下午就会犯困。
7.之后回到办公室想要开始写点代码。因为团队越来越大所以现在我已经不写任何“必须要写”的代码了避免自己的时间安排成为发布计划的瓶颈。不过我还是尽可能会抽一些时间来写一点效率提升的代码。这天要写的是答应了团队把自动化滚动部署Auto Rolling Update的脚本给写了。不过还没写多少我们的产品经理YC就来找我一起和团队过新的OMS订单管理系统的产品评审。虽然作为程序员被打断总是会觉得很头疼不过该过的事情还是要过。
8.等到产品评审走完终于又有了点儿时间重新开始写滚动部署的脚本。脚本写起来方便测试起来却是非常麻烦要频繁地开关虚拟机去做检查也没有什么太好的办法做单元测试或者自动化测试。前前后后几个小时下去终于把整个脚本调通。不过我又在JIRA里面记了一串新的想法主要是想要进一步把目前手动在云平台上创建负载均衡后端服务的手工工作都自动化掉。
9.抬头一看已经快晚上9点了其实已经过了饭点儿了。办公室里也空了大半于是干脆收拾好包出门吃饭回家。
10.回家刷了一会儿抖音重新打开电脑开始写专栏。专栏的工作量比想象中大不少基本上写到12点、1点除非已经是死线了。不然即使进度比想象中慢一点我也会先去睡了不然第二天效率更差。毕竟明天我们又要开始创造明天么。
这就是我上周的一天,不知道和你想象中差别大吗?下次有机会,我会再写写我在海外出差的一天是什么过的。
最后,我想听你讲讲,你的一天是怎么过的呢?欢迎在留言区和同学们一起分享。

View File

@@ -0,0 +1,83 @@
<audio id="audio" title="用户故事 | 赵文海:怕什么真理无穷,进一寸有一寸的欢喜" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/18/f0/1815daf3625f700d8fb75a72f6f5e0f0.mp3"></audio>
大家好我是赵文海一名Android开发仔坐标北京目前工作刚满一年在这里分享一下自己学习“深入浅出计算机组成原理”专栏的心得。
## 为什么要学计算机组成原理?
一直以来我心里都有一个念想,就是好好把计算机基础知识补一补,原因有两个。
第一,我不是计算机专业的,如果连基础知识都不熟悉,那怎么与科班出身的同事交流呢?虽然我目前的工作主要是在业务层进行开发,涉及基础知识的场景其实并不多,但是,既然我要在程序员这个行业长久地走下去,我觉得自己还是有必要补一下基础知识。
第二,虽然现在各种新框架、新技术层出不穷,但它们的根基其实还是那些基础知识。我们每个人的精力有限,整天追随这些“新”的东西,在我看来并不是一个很明智的选择。相反,正所谓“磨刀不误砍柴工”,如果我把先基础知识掌握好,那学习和了解那些应用层的框架应该会更容易一点。
所以我给自己设定了两个学习方向一是深入学习移动端开发相关技术比如学习Android 系统知识、深入了解一些框架、接触 Flutter 这类跨平台技术;二是学习计算机基础知识,然后再随着工作慢慢深入去学习移动端开发技术。
正好那时候极客时间出了很多基础课程,比如王争老师的“数据结构与算法之美”、刘超老师的“趣谈网络协议”等等。我是先从数据结构与算法开始学的,后面又学了一些网络协议的知识,然后才开始学习徐文浩老师的“深入浅出计算机组成原理”。
我记得徐老师在开篇词里写过这么一段话:
>
正所谓“练拳不练功,到老一场空”。如果越早去弄清楚计算机的底层原理,在你的知识体系中储备这些知识,也就意味着你有越长的时间来收获学习的“利息”。虽然一开始可能不起眼,但是随着时间带来的复利效应,你的长线投资项目,就能让你在成长的过程中越走越快。
这段话和我的想法不谋而合,也给了我极大的鼓舞,我学习基础知识的决心也更加坚定了 。
## 我是怎么学习专栏的?
刚开始看的时候,专栏已经更新了二十多讲,但我没有想要赶快跟上老师的步伐,就希望自己每天都能坚持看一讲。
我一般都是在晚上下班回家后看专栏,也有时候是早上到公司后,因为住的地方离公司比较近,还有时候一个人出去坐地铁也会拿出来看一会儿。
最开始由于我过于自信了,我想着只是把文章看了一遍就可以了。后来过了一周,我发现看完的东西,很快就没有印象了。我当时就想,这样可不行啊!不知道你是不是经常有这种感受,费很大劲搞懂的东西,结果因为只看了一遍,没有及时复习,很快就又忘记了。于是,后面每篇文章,我至少都会看两遍。第一遍认真阅读思考,第二遍、第三遍作为复习巩固。
另外,学习这个专栏时我没有做笔记,因为我觉得老师的文章不长,而且言语足够简练,没有必要自己再提炼一次。毕竟我每天都会打开极客时间,如果碰到哪里想不起来了,就直接再看一遍文章就好了,也花不了多长时间。
当然,记不记笔记是个人喜好,如果时间充裕,你也可以选择通过做笔记来加深印象。极客时间的划线笔记功能也是极好的,看到有问题或者非常好的地方,直接记录下来,方便以后查阅、学习。
就这样,保持一天一节的速度,慢慢我就赶上了老师更新的步伐,后面的文章基本就是更新当天就看完。
虽然进度跟上了,但是老师文章后面附的书籍我目前并没有去读。作为一个非科班出身的工作党,平时时间并不宽裕,掌握老师每一节的主要知识,已经挺不容易了。
这里特别说一下,徐老师每篇文章下的推荐阅读,是我个人最喜欢这个专栏的地方。徐老师每次都会在文章结尾列出相关书籍的对应章节、相关的博客或论文,这为我后面深入学习相关知识提供了很大的便利。
因此,关于这一块内容我是这么打算的。我准备学完第一遍之后,仔细去读一读老师推荐的书籍。这样有了第一遍的铺垫,读起老师推荐的书和论文,不至于那么困难和恐惧。读书的时候还可以结合书中内容再复习一遍专栏,到时候肯定会有新的收获。毕竟,基础知识的学习是一个**长期积累、慢慢参悟、螺旋上升**的过程,我已经做好了打持久战的准备。
## 学习专栏有什么收获?
徐老师的文章长度适中、图文并茂、言简意赅。在解释一些名词和概念的时候,徐老师经常拿生活中我们熟悉的事物来举例。我觉得这一点非常好。
比如,他把电路组装看成“搭乐高积木”、把动态链接比喻成程序内部的“共享单车”、把总线比喻成计算机里的“高速公路”,这很容易让我这种非科班的同学,对陌生概念迅速建立起一个初步印象。当然,能把概念解释地如此清晰和“接地气”,也反映了老师的深厚功底。
通过专栏的学习我对计算机的CPU、内存、I/O设备以及它们之间的通信有了初步的了解。
另外,像 GPU、TPU相关的章节也让我开拓了眼界比如 GPU 那一节老师就讲到了计算机图形渲染的流程,这些知识是我之前从未接触过的。
同时,专栏还有很多很实用的章节,比如讲 CPU 的高速缓存时,讲到了 Java 中的 volatile 关键字的作用,这些都可以直接运用到实际的工作或面试中。
不过,除了计算机组成原理的知识外,我还有其他的收获,在我看来这些收获甚至比那些知识还重要。
首先,就是克服了对于基础知识的恐惧。
我之前觉得基础知识是晦涩难懂的,像计算机组成原理、网络协议、操作系统,这些课听起来就觉得很难。开始学习之前,心里总是怕自己理解不了或者坚持不下来,但是通过学习专栏,我发现它们并没有想象中那么可怕,很多技术灵感其实就是源于我们的生活实践。先去学,然后慢慢就能发现其中有趣的地方。
比如CPU分支预测就和我们天气预测有相似之处。文章里穿插的历史知识也让我意识到这些知识虽然看似高深但也是无数前辈经历很长时间、很多次失败才慢慢积累下来的学习这些知识就是站在巨人的肩膀上体会他们思考和实践的过程。
还有就是,我意识到了持续学习的重要性。
徐老师在第2讲时写过“**我工作之后一直在持续学习,在这个过程中,我发现最有效的方法,不是短时间冲刺,而是有节奏的坚持**。”我对这句话真是深有感触,所以一直记到现在,估计你也是吧?
## 总结
通过专栏的学习,我确实收获了很多,真的非常感谢徐文浩老师的付出,也感谢极客时间推出了这么多实用的基础课程。
其实,尽管毕业之后工作才半年左右,但是我的心里其实挺焦虑的,主要是担心自己在如此快速的技术变革中,跟不上变化,慢慢被淘汰。在这个过程中,我也思考了很多。通过学习专栏,我的焦虑情绪也化解了很多。在这里我也想说说我对于焦虑的看法。
我觉得人之所以会感到焦虑,是因为有上进心,说白了就是觉得自己不够好。这其实是一件好事,正是因为觉得自己不够好,我们才能产生变得更好的想法,进而找到变得更好的方法,所以我们要正确看待焦虑这种情绪。而**缓解焦虑的方式很简单,就是行动。担心自己长胖,那就去锻炼;担心自己被淘汰,那就去学习。**
我特别喜欢胡适说的一句话:“怕什么真理无穷,进一寸有一寸的欢喜”。
用这句话与各位共勉吧,希望我们都能抱着长线投资的心态,坚持下去,和时间做朋友,不要急躁。虽然学完这些基础知识,老板也看不到,短时间内也不会加薪升职,但我相信,它们会在未来的某个时间回馈你,让你知道现在的决定是正确的,现在的付出是值得的!
好了,我想要分享的内容就是这些,不知道你学习这个专栏的过程是怎样的呢?有没有什么独特的学习方法和心路历程呢?欢迎你写在留言区,我们一起分享,相互鼓励,共同进步!