做一个基础很扎实的程序员是一种什么感受啊 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
snappyone
V2EX    程序员

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

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

    想到这个话题是因为最近在看 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
    看源码是真的难
    rb6221
        8
    rb6221  
       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
    fsafdasfsdafd  
       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  
    @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 学了一些操作系统 算法之类的东西 一直在看书 但是还是感觉自己永远基础那么菜。。 很多时候基本上就是调 ai 用的东西挺多的 很多东西都没法了解
    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 高级环境编程(必看,熟读,完全消化)->unx 网络编程(卷 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     Solana     2476 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 11:11 PVG 19:11 LAX 04:11 JFK 07:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86