想到这个话题是因为最近在看 linux 操作系统内核以及 mysql 的一些源码,突然感慨大学时候的一些基础课程的重要性以及底层原理的重要性,譬如我现在去看汇编都看不懂,c 语言也忘光了。
试想如果一个程序员基础很扎实,后期在基础上添砖加瓦确实很轻松,而一开始只注重语言和应用的人则被拉开了巨大的差距
1
taogen 2019-05-06 12:41:21 +08:00 via Android 4
现在开始学基础也不会晚。最近也一直在看计算机基础相关圣经。我整理了一个计算机基础书单,可以参考参考 https://github.com/tagnja/resources-of-learning/blob/master/%23cs-foundations.md
|
2
xinyusir 2019-05-06 12:49:36 +08:00
同感,现在比较痛苦就是没有大块的时间可以看这些基础了,大块的时间都给了工作,只剩下些碎片时间
|
4
XiLemon 2019-05-06 13:14:48 +08:00
整了一本 CSAPP,目前看到第 3 章,确实难啃。
|
5
CEBBCAT 2019-05-06 13:37:08 +08:00
我想需要先定义一下基础
|
7
tt67wq 2019-05-06 13:52:47 +08:00
看源码是真的难
|
8
janus77 2019-05-06 15:35:42 +08:00 2
我不是,但是根据我的经验和见过的大佬,基础扎实的话应该是这样的……
别人解决问题是,能凭经验就凭经验,他会一直凭自己的知识(看懂报错 查文档,而不是直接百度别人的解决办法 然后,对于不同难度的问题,不管简单还是难的,解决的速度全都是不紧不慢,不会很快但也绝对不慢(跟工作量有关系,但是查出问题解决办法的速度绝对很快) |
9
zyEros 2019-05-06 15:50:49 +08:00
啥都能写,只要给时间,啥都能做到超出预期,就这样。
|
10
sinchuan 2019-05-06 16:05:17 +08:00
一眼看出问题所在!能做的东西比别人多比别人深!
|
11
dazhangpan 2019-05-06 16:18:13 +08:00 22
不了解底层调程序,就像年轻时哄女朋友,你不知道她为什么不高兴,为什么不理你,为什么会突然梨花带雨。尝试吃饭,买礼物,去旅游,都不见得能有效果。都等深入了底层之后,程序就像与你耳鬓厮磨多年的少妇,你拍拍屁股就知道换什么姿势。
|
13
snappyone OP @dazhangpan 哥还是你说的到位
|
14
littiefish 2019-05-06 16:47:17 +08:00 via iPhone
嗯,百科全书,啥事都来问你
|
15
taogen 2019-05-06 18:47:35 +08:00
@BIAOXYZ 密码学确实有点多,有时间优化一下去掉一些。CSAPP 我放在操作系统类别中了,我看了下目录确实应该放到体系结构那。
|
16
luozic 2019-05-06 18:53:56 +08:00 via iPhone
主要是看出问题的时候,不出问题的时候,猪也在天上飞,一旦出了问题,没基础的最喜欢的就是甩锅。
|
17
crysislinux 2019-05-06 18:55:38 +08:00 via Android
感受并不好,有些代码一看就有隐患。为了进度你还是得忍。
|
18
b00tyhunt3r 2019-05-06 20:06:16 +08:00 via iPad
@crysislinux 注释给测试。。
|
20
xuanbg 2019-05-06 20:50:23 +08:00 1
不要脸地自认“基础扎实”一把。。。感受就是没啥感受啊。。。
平常只解决问题不制造问题,而且似乎也没碰到什么难以解决的问题。最困扰我的问题是翻墙延迟太高不够速度。。。 |
21
dazhangpan 2019-05-06 22:00:17 +08:00 5
另外说一点题外话,这个“基础扎实”表现于你的软件就是两点:
1.稳定 这种稳定不是靠 UT 和覆盖率堆出来的稳定,而是在你练达晓畅之后自生出的一种气质 2.高性能 逻辑上这个很好解释,就是你明白硬件和操作系统的细节和机制,所以你能充分加以利用,所以你的软件有很高的性能 然而这个逻辑是彻头彻尾的错误 因为所有能去深入到底层细节的程序员,并不是因为他们天生喜欢底层的那些细节,而是他们首先有对高性能的渴望,这是一种焦渴难耐的贪婪,是一种如芒在背的占有;这对对他们来说,是一种 SM 般的快感 所以如果你并不渴望这种快感,真没必要搞什么基础研究,但是如果你有这种渴望,那就不要压抑自己的天性 |
22
chengpohi 2019-05-07 00:14:01 +08:00 via Android
随手写个 parser ୧( ⁼̴̶̤̀ω⁼̴̶̤́ )૭加个鸡腿
|
23
fsafdasfsdafsd 2019-05-07 00:19:22 +08:00
基础 内功
技术 招式。 |
24
zndbly 2019-05-07 00:19:35 +08:00 via Android
懂底层的人应该会有胸有成竹的感觉把
|
25
MonoLogueChi 2019-05-07 00:24:29 +08:00 via Android
认识一个数学出身的老哥,空间变换每次我都要想半天,他拿起来直接就撸,撸完了我还看不懂,现在有需求直接找他给写个类库就可以了
|
26
MonoLogueChi 2019-05-07 00:28:02 +08:00 via Android 1
@dazhangpan 我基础并不好,但是我希望写出来的东西性能更好,所以经常研究这方面的东西,现在一看别人的东西有点卡,有的时候不看源码都能猜出来哪里有问题了,看着别人写出来的东西性能差,自己心里难受
|
27
shiji 2019-05-07 00:36:45 +08:00 via Android 1
我整理了一个计算机书单
保证能看到 60 岁。。。 加上后来新的技术。。 保证能看到死。。。。 |
28
ryd994 2019-05-07 01:28:14 +08:00 via Android 4
怎么才叫扎实呢?人外有人天外有天
我搞过 Linux 内核,现在在搞虚拟化网络驱动 在同届里算是基础最扎实的了 @dazhangpan 调底层程序更惨。因为驱动、内核都是讲求简单高效。逻辑很简单,但没人帮你管理内存。问题主要是性能和内存访问错误。你永远不知道她是否在生气,为什么生气,以及什么时候炸了,为什么炸了。 Windows 内核还稍微好点,有 kd,Linux 内核的 kd 基本不可用,只能靠 print。 然后隔壁六十多的老工程师过来一看,你们这个 struct 顺序不对啊,会 cache thrashing 的。 修完性能上升 10% |
29
ryd994 2019-05-07 01:31:27 +08:00 via Android
说实话我不觉得大多数程序员需要很强的操作系统基础。
算法强一点是有好处的 操作系统你会用就可以了,谁闲的蛋疼问你 malloc 分几步,TCP 传输数据分几步 计算机组成就更用不到了,除非你搞底层。不然你一个 Python 程序员 Java 程序员,程序都在虚拟机里跑呢,机器底层的性能特性你根本无法控制好么 |
30
usingnamespace 2019-05-07 01:41:17 +08:00 via iPhone
@ryd994 不不不 这些玩意是通用的 都是很好的内工 一通百通 当然 这是对于有志于成为顶级程序员来说
|
31
usingnamespace 2019-05-07 01:41:53 +08:00 via iPhone
汇编不需要 c 一定要很熟啊
|
32
ryd994 2019-05-07 01:47:18 +08:00 via Android
@usingnamespace 既然都在用 Java 了谁还在乎极限性能啊。真那么在乎的会用 C++ 或 C 好么。
|
33
usingnamespace 2019-05-07 01:54:15 +08:00 via iPhone
@ryd994 写一辈子 java ? java 养你一辈子?
|
34
Mithril 2019-05-07 03:09:14 +08:00 3
基本上就是你不管做什么,大概心里都会有个谱。
- 这个需求能不能做,如果做了哪些部分会成为瓶颈。 - 做一个公用的库,怎样设计会尽量避免 bug。 - 遇到 bug,能大概知道问题有可能出在哪些地方,有针对性的去排除。 实际上计算机应用技术的基本原理已经几十年没有什么发展了,无非是用新的语言又做了一遍。学习这些东西就和学习历史一样,了解的越多你就越会发现,太阳底下没有新鲜事,千百年来人类一直都是一个样子。 |
35
fsafdasfsdafsd 2019-05-07 03:16:51 +08:00
@shiji
求分享 |
36
ryd994 2019-05-07 04:14:00 +08:00 via Android 1
@usingnamespace 你能看看 28 楼么?我就是那个基础扎实的。但我不认为有必要人人如此。
我虽然不写 Java,但是 Java 养很多人一辈子没什么问题。不说很多后端程序员就是 crud,除了基本的业务逻辑,往上可以搞分布式。而分布式是基本不依赖本地机器性能特性的。 |
37
henryhu 2019-05-07 08:35:12 +08:00
基础扎实还需要经验丰富
|
38
AngryMagikarp 2019-05-07 09:27:11 +08:00
当你遇到一个工作了几年连 HTTP 协议都不懂的人的时候就想骂人。
|
40
Tenma 2019-05-07 09:45:13 +08:00
@AngryMagikarp 老哥,我就不是很懂,只知道应用,请求头啊请求体啊啥的。什么三次握手根本就不了解,但是我没有要写网络框架的需求,也没有遇到过有什么场景需要深入了解 http 协议。当然我确实是菜鸡一枚……,但是真的想不到有啥情况需要我深入了解这个协议……
|
41
ChenFanlin 2019-05-07 09:46:43 +08:00
@shiji #27 不严谨, Math.min(猝死, 60 岁);
|
42
zouzou 2019-05-07 09:51:46 +08:00 1
@ryd994
基础扎实,操作系统、计算机网络、数据结构有 90/100 分以上。 基础不扎实,操作系统、计算机网络、数据结构有 60/100 分,刚过及格分,这是对软件开发工程师的基本要求,有必要人人如此。 没基础,那就是不及格,只会调用 api,面向百度编程。 |
43
linghutf 2019-05-07 09:53:48 +08:00
身边曾有过这样的人,简直是百科全书似的,解决问题也非常深!
|
44
shiji 2019-05-07 09:54:23 +08:00
@ChenFanlin 有道理
@fsafdasfsdafsd @geniusmyn 其实我的意思是,很多人(包括我)喜欢收集书单,收集教程,@XX 云笔记,结果光顾着收集,光顾着比较哪本更好,哪本是“圣经”, 到头来根本没认真翻开看过几本。除非家里有矿,可以不上班在家看书学习。。。 |
45
smdbh 2019-05-07 09:58:31 +08:00
原来是这样
|
46
Mithril 2019-05-07 10:09:57 +08:00 1
@Tenma
比如说你了解 HTTP 协议在某些情况下每发送一个请求会创建一次 TCP 链接,而 TCP 链接(包括你说的三次握手)会比较消耗资源。 那么你写业务代码设计 HTTP 接口的时候就会尽量减少调用次数,在高频调用接口上使用 RPC 等其他方法。 虽说你可以百度或者其他人凭“经验”告诉你要减少 HTTP 接口调用次数,但更可能的是你第一次在这里遇到过性能问题,才会去查找咨询这方面的信息。然而如果基础足够扎实的话,第一次开发和设计接口的时候就可以避免这种问题,可以显著减少开发和 Debug 过程中的试错成本 |
47
ifxo 2019-05-07 10:28:02 +08:00
做任何事都是程序化的
|
48
Geekgogo 2019-05-07 11:07:45 +08:00
那么,该怎么加强自己的基础呢
|
49
www5070504 2019-05-07 11:08:31 +08:00
不知道什么算基础扎实 作为一个跨专业(电子专业毕业的)进来的 现在写 python 学了一些操作系统 算法之类的东西 一直在看书 但是还是感觉自己永远基础那么菜。。 很多时候基本上就是调 api 用的东西挺多的 很多东西都没法了解
|
50
www5070504 2019-05-07 11:10:06 +08:00
btw 基础这个东西真的很扎实有时候也不一定就很厉害了 同事哈工大博士 程序里边也会有一些让人费解的调用和写法 而且一点也不遵循 pep8 的格式
|
51
www5070504 2019-05-07 11:13:30 +08:00
很羡慕那些能把火箭上每个螺丝都弄的明明白白的人 确实很厉害 估计要钻研很久花很多心思吧
|
52
snappyone OP @www5070504 确实挺难的,但是一通百通,掌握之后的好处也是巨大的
|
53
lzjamao 2019-05-07 11:20:34 +08:00
同感,原理性的知识很重要,这是技术岗位与非技术岗位的核心竞争力。个人觉得应用层的技术会越来越好,使用门槛越来越低。
|
54
whusnoopy 2019-05-07 11:22:59 +08:00
重剑无锋大巧不工
独孤九剑在手,管你怎么来,我都一样破 |
55
whusnoopy 2019-05-07 11:24:07 +08:00
@www5070504 哈工大博士和基础扎实又不一定必然划等号,也可能有是擅长考试或专注科研发论文的(只是说可能,没有说博士都水)
|
56
xman99 2019-05-07 11:42:46 +08:00 6
2019-2020 书单
语言经典书: C:C 程序设计语言( K&R )->C 和指针->C 专家编程->C 陷阱与缺陷->你必须知道的 495 个 C 语言问题 C++: C++ primer -> effective C++->深度探索 C++对象模型 ->stl 源码分析->C++必知必会 java:java 编程思想->java 并发编程->深入理解 Java 虚拟机:JVM 高级特性与最佳实践 算法经典书: 算法导论->数据结构与算法分析(维斯)->编程之美->剑指 offer 系统经典书: 无关平台: 深入理解计算机操作系统->编译原理(龙书)->程序员自我修养 TCP/IP 协议详解 v1 linux:鸟哥的 linux 私房菜->unix 高级环境编程(必看,熟读,完全消化)->unix 网络编程(卷 1&卷 2 )->unix 编程艺术(进阶)->linux shell 脚本攻略(短小精悍)->linux 内核设计与实现->深入理解 linux 内核 windows:windows 核心编程(必看)->深入理解 MFC(经典)->windows 内核情景分析(上下)->寒江独钓 windows 内核安全编程 视野: linux 多线程服务端编程 深入理解 nginx 深入剖析 nginx 调试:软件调试的艺术(强烈推荐!!) 设计模式:headfirst 设计模式(强烈推荐!!) |
58
funlee 2019-05-07 12:47:29 +08:00
一个转行的前端程序员表示经典的大头书看不懂啊,求指导。
|
59
www5070504 2019-05-07 12:59:32 +08:00
@whusnoopy 嗯 发完我自己也有点觉得自己说法有些奇怪了 不过在我们这种学渣眼里哈工大的 cs 专业的博士已经是定级选手了。。QAQ
|
61
CHYK 2019-05-07 18:44:12 +08:00
😌哎,看到这句话 "试想如果一个程序员基础很扎实,后期在基础上添砖加瓦确实很轻松,而一开始只注重语言和应用的人则被拉开了巨大的差距" ... 真的想说句 too young。仅此。
但又怕引来太多的争论,甚至口水。这里就引用我听过了的,一位老前辈的话吧: 我刚开始工作的时候,有人再强调基础的重要性,然后我工作了十几年,那个人还在谈基础的重要性。。。 大部头,这里的学霸,或者亚学霸肯定都啃过几部,然,差距的症结真的在这里么? 头条的老大(Boss)以前有个演讲说的很不错,了解一下。 您看过的龙书,有人让您去写编译器么?您设计了 X 脚本语言,领域语言(DSL)有人用么?练那么久的 C++,甚至写了一个自己非常自豪的 X 引擎,您给别人团队用,别人敢用么? 那么多外行转过来做前端,《 HTTP 权威指南》听都没听说过,甚至跟科班一样的薪酬,还不明白么? 。。。enough :) 开心就好。开心最重要了。 |