V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
snappyone
V2EX  ›  程序员

做一个基础很扎实的程序员是一种什么感受啊

  •  
  •   snappyone · 2019-05-06 12:14:13 +08:00 · 10674 次点击
    这是一个创建于 2013 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想到这个话题是因为最近在看 linux 操作系统内核以及 mysql 的一些源码,突然感慨大学时候的一些基础课程的重要性以及底层原理的重要性,譬如我现在去看汇编都看不懂,c 语言也忘光了。

    试想如果一个程序员基础很扎实,后期在基础上添砖加瓦确实很轻松,而一开始只注重语言和应用的人则被拉开了巨大的差距

    62 条回复    2019-10-29 16:12:47 +08:00
    taogen
        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
    xinyusir
        2
    xinyusir  
       2019-05-06 12:49:36 +08:00
    同感,现在比较痛苦就是没有大块的时间可以看这些基础了,大块的时间都给了工作,只剩下些碎片时间
    snappyone
        3
    snappyone  
    OP
       2019-05-06 13:11:10 +08:00
    @xinyusir 是的,而且这块的知识比较硬核
    XiLemon
        4
    XiLemon  
       2019-05-06 13:14:48 +08:00
    整了一本 CSAPP,目前看到第 3 章,确实难啃。
    CEBBCAT
        5
    CEBBCAT  
       2019-05-06 13:37:08 +08:00
    我想需要先定义一下基础
    snappyone
        6
    snappyone  
    OP
       2019-05-06 13:46:01 +08:00
    @CEBBCAT 计算机基础吧,就操作系统、网络那些
    tt67wq
        7
    tt67wq  
       2019-05-06 13:52:47 +08:00
    看源码是真的难
    janus77
        8
    janus77  
       2019-05-06 15:35:42 +08:00   ❤️ 2
    我不是,但是根据我的经验和见过的大佬,基础扎实的话应该是这样的……
    别人解决问题是,能凭经验就凭经验,他会一直凭自己的知识(看懂报错 查文档,而不是直接百度别人的解决办法
    然后,对于不同难度的问题,不管简单还是难的,解决的速度全都是不紧不慢,不会很快但也绝对不慢(跟工作量有关系,但是查出问题解决办法的速度绝对很快)
    zyEros
        9
    zyEros  
       2019-05-06 15:50:49 +08:00
    啥都能写,只要给时间,啥都能做到超出预期,就这样。
    sinchuan
        10
    sinchuan  
       2019-05-06 16:05:17 +08:00
    一眼看出问题所在!能做的东西比别人多比别人深!
    dazhangpan
        11
    dazhangpan  
       2019-05-06 16:18:13 +08:00   ❤️ 22
    不了解底层调程序,就像年轻时哄女朋友,你不知道她为什么不高兴,为什么不理你,为什么会突然梨花带雨。尝试吃饭,买礼物,去旅游,都不见得能有效果。都等深入了底层之后,程序就像与你耳鬓厮磨多年的少妇,你拍拍屁股就知道换什么姿势。
    BIAOXYZ
        12
    BIAOXYZ  
       2019-05-06 16:31:26 +08:00
    @taogen 密码学部分太多了,贵精不贵多。体系结构那里我觉得不能少了 CSAPP 吧。
    snappyone
        13
    snappyone  
    OP
       2019-05-06 16:31:30 +08:00
    @dazhangpan 哥还是你说的到位
    littiefish
        14
    littiefish  
       2019-05-06 16:47:17 +08:00 via iPhone
    嗯,百科全书,啥事都来问你
    taogen
        15
    taogen  
       2019-05-06 18:47:35 +08:00
    @BIAOXYZ 密码学确实有点多,有时间优化一下去掉一些。CSAPP 我放在操作系统类别中了,我看了下目录确实应该放到体系结构那。
    luozic
        16
    luozic  
       2019-05-06 18:53:56 +08:00 via iPhone
    主要是看出问题的时候,不出问题的时候,猪也在天上飞,一旦出了问题,没基础的最喜欢的就是甩锅。
    crysislinux
        17
    crysislinux  
       2019-05-06 18:55:38 +08:00 via Android
    感受并不好,有些代码一看就有隐患。为了进度你还是得忍。
    b00tyhunt3r
        18
    b00tyhunt3r  
       2019-05-06 20:06:16 +08:00 via iPad
    @crysislinux 注释给测试。。
    snappyone
        19
    snappyone  
    OP
       2019-05-06 20:10:42 +08:00
    @luozic 是不是有一种认知完全不在一个世界的感觉啊
    xuanbg
        20
    xuanbg  
       2019-05-06 20:50:23 +08:00   ❤️ 1
    不要脸地自认“基础扎实”一把。。。感受就是没啥感受啊。。。

    平常只解决问题不制造问题,而且似乎也没碰到什么难以解决的问题。最困扰我的问题是翻墙延迟太高不够速度。。。
    dazhangpan
        21
    dazhangpan  
       2019-05-06 22:00:17 +08:00   ❤️ 5
    另外说一点题外话,这个“基础扎实”表现于你的软件就是两点:
    1.稳定
    这种稳定不是靠 UT 和覆盖率堆出来的稳定,而是在你练达晓畅之后自生出的一种气质
    2.高性能
    逻辑上这个很好解释,就是你明白硬件和操作系统的细节和机制,所以你能充分加以利用,所以你的软件有很高的性能
    然而这个逻辑是彻头彻尾的错误
    因为所有能去深入到底层细节的程序员,并不是因为他们天生喜欢底层的那些细节,而是他们首先有对高性能的渴望,这是一种焦渴难耐的贪婪,是一种如芒在背的占有;这对对他们来说,是一种 SM 般的快感
    所以如果你并不渴望这种快感,真没必要搞什么基础研究,但是如果你有这种渴望,那就不要压抑自己的天性
    chengpohi
        22
    chengpohi  
       2019-05-07 00:14:01 +08:00 via Android
    随手写个 parser ୧( ⁼̴̶̤̀ω⁼̴̶̤́ )૭加个鸡腿
    fsafdasfsdafsd
        23
    fsafdasfsdafsd  
       2019-05-07 00:19:22 +08:00
    基础 内功
    技术 招式。
    zndbly
        24
    zndbly  
       2019-05-07 00:19:35 +08:00 via Android
    懂底层的人应该会有胸有成竹的感觉把
    MonoLogueChi
        25
    MonoLogueChi  
       2019-05-07 00:24:29 +08:00 via Android
    认识一个数学出身的老哥,空间变换每次我都要想半天,他拿起来直接就撸,撸完了我还看不懂,现在有需求直接找他给写个类库就可以了
    MonoLogueChi
        26
    MonoLogueChi  
       2019-05-07 00:28:02 +08:00 via Android   ❤️ 1
    @dazhangpan 我基础并不好,但是我希望写出来的东西性能更好,所以经常研究这方面的东西,现在一看别人的东西有点卡,有的时候不看源码都能猜出来哪里有问题了,看着别人写出来的东西性能差,自己心里难受
    shiji
        27
    shiji  
       2019-05-07 00:36:45 +08:00 via Android   ❤️ 1
    我整理了一个计算机书单
    保证能看到 60 岁。。。
    加上后来新的技术。。
    保证能看到死。。。。
    ryd994
        28
    ryd994  
       2019-05-07 01:28:14 +08:00 via Android   ❤️ 4
    怎么才叫扎实呢?人外有人天外有天
    我搞过 Linux 内核,现在在搞虚拟化网络驱动
    在同届里算是基础最扎实的了

    @dazhangpan 调底层程序更惨。因为驱动、内核都是讲求简单高效。逻辑很简单,但没人帮你管理内存。问题主要是性能和内存访问错误。你永远不知道她是否在生气,为什么生气,以及什么时候炸了,为什么炸了。

    Windows 内核还稍微好点,有 kd,Linux 内核的 kd 基本不可用,只能靠 print。

    然后隔壁六十多的老工程师过来一看,你们这个 struct 顺序不对啊,会 cache thrashing 的。

    修完性能上升 10%
    ryd994
        29
    ryd994  
       2019-05-07 01:31:27 +08:00 via Android
    说实话我不觉得大多数程序员需要很强的操作系统基础。
    算法强一点是有好处的
    操作系统你会用就可以了,谁闲的蛋疼问你 malloc 分几步,TCP 传输数据分几步
    计算机组成就更用不到了,除非你搞底层。不然你一个 Python 程序员 Java 程序员,程序都在虚拟机里跑呢,机器底层的性能特性你根本无法控制好么
    usingnamespace
        30
    usingnamespace  
       2019-05-07 01:41:17 +08:00 via iPhone
    @ryd994 不不不 这些玩意是通用的 都是很好的内工 一通百通 当然 这是对于有志于成为顶级程序员来说
    usingnamespace
        31
    usingnamespace  
       2019-05-07 01:41:53 +08:00 via iPhone
    汇编不需要 c 一定要很熟啊
    ryd994
        32
    ryd994  
       2019-05-07 01:47:18 +08:00 via Android
    @usingnamespace 既然都在用 Java 了谁还在乎极限性能啊。真那么在乎的会用 C++ 或 C 好么。
    usingnamespace
        33
    usingnamespace  
       2019-05-07 01:54:15 +08:00 via iPhone
    @ryd994 写一辈子 java ? java 养你一辈子?
    Mithril
        34
    Mithril  
       2019-05-07 03:09:14 +08:00   ❤️ 3
    基本上就是你不管做什么,大概心里都会有个谱。
    - 这个需求能不能做,如果做了哪些部分会成为瓶颈。
    - 做一个公用的库,怎样设计会尽量避免 bug。
    - 遇到 bug,能大概知道问题有可能出在哪些地方,有针对性的去排除。
    实际上计算机应用技术的基本原理已经几十年没有什么发展了,无非是用新的语言又做了一遍。学习这些东西就和学习历史一样,了解的越多你就越会发现,太阳底下没有新鲜事,千百年来人类一直都是一个样子。
    fsafdasfsdafsd
        35
    fsafdasfsdafsd  
       2019-05-07 03:16:51 +08:00
    @shiji
    求分享
    ryd994
        36
    ryd994  
       2019-05-07 04:14:00 +08:00 via Android   ❤️ 1
    @usingnamespace 你能看看 28 楼么?我就是那个基础扎实的。但我不认为有必要人人如此。
    我虽然不写 Java,但是 Java 养很多人一辈子没什么问题。不说很多后端程序员就是 crud,除了基本的业务逻辑,往上可以搞分布式。而分布式是基本不依赖本地机器性能特性的。
    henryhu
        37
    henryhu  
       2019-05-07 08:35:12 +08:00
    基础扎实还需要经验丰富
    AngryMagikarp
        38
    AngryMagikarp  
       2019-05-07 09:27:11 +08:00
    当你遇到一个工作了几年连 HTTP 协议都不懂的人的时候就想骂人。
    geniusmyn
        39
    geniusmyn  
       2019-05-07 09:35:11 +08:00
    @shiji 求分享
    Tenma
        40
    Tenma  
       2019-05-07 09:45:13 +08:00
    @AngryMagikarp 老哥,我就不是很懂,只知道应用,请求头啊请求体啊啥的。什么三次握手根本就不了解,但是我没有要写网络框架的需求,也没有遇到过有什么场景需要深入了解 http 协议。当然我确实是菜鸡一枚……,但是真的想不到有啥情况需要我深入了解这个协议……
    ChenFanlin
        41
    ChenFanlin  
       2019-05-07 09:46:43 +08:00
    @shiji #27 不严谨, Math.min(猝死, 60 岁);
    zouzou
        42
    zouzou  
       2019-05-07 09:51:46 +08:00   ❤️ 1
    @ryd994
    基础扎实,操作系统、计算机网络、数据结构有 90/100 分以上。
    基础不扎实,操作系统、计算机网络、数据结构有 60/100 分,刚过及格分,这是对软件开发工程师的基本要求,有必要人人如此。
    没基础,那就是不及格,只会调用 api,面向百度编程。
    linghutf
        43
    linghutf  
       2019-05-07 09:53:48 +08:00
    身边曾有过这样的人,简直是百科全书似的,解决问题也非常深!
    shiji
        44
    shiji  
       2019-05-07 09:54:23 +08:00
    @ChenFanlin 有道理

    @fsafdasfsdafsd
    @geniusmyn
    其实我的意思是,很多人(包括我)喜欢收集书单,收集教程,@XX 云笔记,结果光顾着收集,光顾着比较哪本更好,哪本是“圣经”, 到头来根本没认真翻开看过几本。除非家里有矿,可以不上班在家看书学习。。。
    smdbh
        45
    smdbh  
       2019-05-07 09:58:31 +08:00
    原来是这样
    Mithril
        46
    Mithril  
       2019-05-07 10:09:57 +08:00   ❤️ 1
    @Tenma
    比如说你了解 HTTP 协议在某些情况下每发送一个请求会创建一次 TCP 链接,而 TCP 链接(包括你说的三次握手)会比较消耗资源。
    那么你写业务代码设计 HTTP 接口的时候就会尽量减少调用次数,在高频调用接口上使用 RPC 等其他方法。

    虽说你可以百度或者其他人凭“经验”告诉你要减少 HTTP 接口调用次数,但更可能的是你第一次在这里遇到过性能问题,才会去查找咨询这方面的信息。然而如果基础足够扎实的话,第一次开发和设计接口的时候就可以避免这种问题,可以显著减少开发和 Debug 过程中的试错成本
    ifxo
        47
    ifxo  
       2019-05-07 10:28:02 +08:00
    做任何事都是程序化的
    Geekgogo
        48
    Geekgogo  
       2019-05-07 11:07:45 +08:00
    那么,该怎么加强自己的基础呢
    www5070504
        49
    www5070504  
       2019-05-07 11:08:31 +08:00
    不知道什么算基础扎实 作为一个跨专业(电子专业毕业的)进来的 现在写 python 学了一些操作系统 算法之类的东西 一直在看书 但是还是感觉自己永远基础那么菜。。 很多时候基本上就是调 api 用的东西挺多的 很多东西都没法了解
    www5070504
        50
    www5070504  
       2019-05-07 11:10:06 +08:00
    btw 基础这个东西真的很扎实有时候也不一定就很厉害了 同事哈工大博士 程序里边也会有一些让人费解的调用和写法 而且一点也不遵循 pep8 的格式
    www5070504
        51
    www5070504  
       2019-05-07 11:13:30 +08:00
    很羡慕那些能把火箭上每个螺丝都弄的明明白白的人 确实很厉害 估计要钻研很久花很多心思吧
    snappyone
        52
    snappyone  
    OP
       2019-05-07 11:18:28 +08:00
    @www5070504 确实挺难的,但是一通百通,掌握之后的好处也是巨大的
    lzjamao
        53
    lzjamao  
       2019-05-07 11:20:34 +08:00
    同感,原理性的知识很重要,这是技术岗位与非技术岗位的核心竞争力。个人觉得应用层的技术会越来越好,使用门槛越来越低。
    whusnoopy
        54
    whusnoopy  
       2019-05-07 11:22:59 +08:00
    重剑无锋大巧不工
    独孤九剑在手,管你怎么来,我都一样破
    whusnoopy
        55
    whusnoopy  
       2019-05-07 11:24:07 +08:00
    @www5070504 哈工大博士和基础扎实又不一定必然划等号,也可能有是擅长考试或专注科研发论文的(只是说可能,没有说博士都水)
    xman99
        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 设计模式(强烈推荐!!)
    luozic
        57
    luozic  
       2019-05-07 11:50:42 +08:00
    @snappyone 哎,會吹牛逼就行,反正大部分都在沒出問題前,都不管到底啥實現。
    funlee
        58
    funlee  
       2019-05-07 12:47:29 +08:00
    一个转行的前端程序员表示经典的大头书看不懂啊,求指导。
    www5070504
        59
    www5070504  
       2019-05-07 12:59:32 +08:00
    @whusnoopy 嗯 发完我自己也有点觉得自己说法有些奇怪了 不过在我们这种学渣眼里哈工大的 cs 专业的博士已经是定级选手了。。QAQ
    snappyone
        60
    snappyone  
    OP
       2019-05-07 14:41:36 +08:00
    @funlee 大头书一般需要看很多遍才行,看不懂的地方还得补补前置知识,反正一言难尽
    CHYK
        61
    CHYK  
       2019-05-07 18:44:12 +08:00
    😌哎,看到这句话 "试想如果一个程序员基础很扎实,后期在基础上添砖加瓦确实很轻松,而一开始只注重语言和应用的人则被拉开了巨大的差距" ... 真的想说句 too young。仅此。

    但又怕引来太多的争论,甚至口水。这里就引用我听过了的,一位老前辈的话吧: 我刚开始工作的时候,有人再强调基础的重要性,然后我工作了十几年,那个人还在谈基础的重要性。。。

    大部头,这里的学霸,或者亚学霸肯定都啃过几部,然,差距的症结真的在这里么?
    头条的老大(Boss)以前有个演讲说的很不错,了解一下。

    您看过的龙书,有人让您去写编译器么?您设计了 X 脚本语言,领域语言(DSL)有人用么?练那么久的 C++,甚至写了一个自己非常自豪的 X 引擎,您给别人团队用,别人敢用么?

    那么多外行转过来做前端,《 HTTP 权威指南》听都没听说过,甚至跟科班一样的薪酬,还不明白么?

    。。。enough

    :) 开心就好。开心最重要了。
    EthanV2
        62
    EthanV2  
       2019-10-29 16:12:47 +08:00
    @CHYK 试想把编程作为一门艺术 是不是应该不给自己有天花板的机会,如果按赚钱来讲,弄不弄基础就在于你公司的技术栈需不需要自己开发框架,如果不是按赚钱来讲,搞艺术的就肯定想自己能做出拿得手的东西。现实固然残酷,但是如果没有理想那和咸鱼又有什么区别,当然每个人都有自己想法。咸不咸鱼都是自己想要的,学不学底层原理如果只是想了解 那就去了解好了,如果是想要自己写框架,提高性能,自己造轮子,那底层基础是必不可少的。如果只是谈业务逻辑,和实现业务逻辑,也不用考虑性能,那何必去操那份心呢。走好自己心里想要的那条路便好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2774 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 13:01 · PVG 21:01 · LAX 05:01 · JFK 08:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.