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

如何学习网络、操作系统、编译原理等知识?

  •  
  •   javaWeber · 2018-09-13 09:37:26 +08:00 · 11140 次点击
    这是一个创建于 2261 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我尝试看些书,但是一打开全部都是概念,几百页堆砌的砖头。。合上书以后这些概念又全忘光了。
    比如学习语言或者框架,我可以照着做个简单的 demo,边学习边实践,这样比较容易理解。
    看操作系统,我又写不出一个操作系统,就看书本里的概念,实在是学不进去。
    请教,如何学习网络、操作系统、编译原理等知识?
    65 条回复    2018-09-17 14:08:24 +08:00
    cuzfinal
        1
    cuzfinal  
       2018-09-13 09:41:24 +08:00
    考个大学并选择计算机专业
    hongch
        2
    hongch  
       2018-09-13 09:44:02 +08:00
    看多了就懂了
    javaWeber
        3
    javaWeber  
    OP
       2018-09-13 09:46:32 +08:00   ❤️ 9
    @cuzfinal 已经毕业了。大学双学位。lol 专业和 cs 专业。
    daigouspy
        4
    daigouspy  
       2018-09-13 09:47:45 +08:00 via Android
    @javaWeber 工作了就没必要再看了。
    Hieast
        5
    Hieast  
       2018-09-13 09:49:26 +08:00 via Android
    你在学校不做实验么,做了实验还能忘?
    zongren
        6
    zongren  
       2018-09-13 09:51:20 +08:00
    我猜是看书吧,毕竟我也没看过
    BingoXuan
        7
    BingoXuan  
       2018-09-13 09:53:13 +08:00 via Android   ❤️ 1
    要理解凯撒不一定要成为凯撒

    很多概念并不是要你具体实现出来,需要你抽象理解它的过程,原理,模式,以此推及到其他问题的解决。
    ericv
        8
    ericv  
       2018-09-13 09:53:13 +08:00
    放弃吧.....
    nilrust
        9
    nilrust  
       2018-09-13 09:53:46 +08:00
    看书啊,大学时应付考试也就一礼拜突击下的事情
    mathzhaoliang
        10
    mathzhaoliang  
       2018-09-13 09:56:11 +08:00
    毕业了,就不太可能从头开始系统学习那些基础知识了,除非你能自己闭关两三年,啥也不做,待在一个地方专心修炼。

    建议在工作中,用到什么补什么。遇到一个问题就把它搞明白,这样积累的经验多了也可以达到融会贯通的效果。
    zhaoweichen
        11
    zhaoweichen  
       2018-09-13 10:03:55 +08:00   ❤️ 4
    我觉得好的 CS 课程都是边学习边实践的,应该跟 lz 学语言和框架类似。

    操作系统的话,是可以写出来简单的 demo 的。这个可以参考斯坦福 CS140e 里给树莓派写系统的项目。
    如果需要明白更复杂的东西,在基础足够的情况下可以去看相关的论文或者代码。
    其实就是按照本科生操作系统课和研究生操作系统课再上一次。
    如果想再进阶一步,就是博士生水平的课程,把之前论文里的系统自己实现一遍。

    网络和编译原理都是类似的操作。网络从 socket+发 /解包开始,到后面写写简单的协议栈都是可以分成若干比较小的项目的。
    zhaogaz
        12
    zhaogaz  
       2018-09-13 10:05:05 +08:00
    我猜楼主可能没读完过。

    怕忘可以再看一遍嘛,很简单的。
    vindurriel
        13
    vindurriel  
       2018-09-13 10:10:38 +08:00 via iPhone
    带着问题去读 书是用来做参考的
    zynlp
        14
    zynlp  
       2018-09-13 10:15:45 +08:00 via iPhone
    学而不思则罔,思而不学则殆
    tonychow
        15
    tonychow  
       2018-09-13 10:16:12 +08:00
    可以从基础中取一个点,对比实践,去找书里的内容或者搜别人的文章反复看,看到能理解。
    huangya
        16
    huangya  
       2018-09-13 10:17:13 +08:00   ❤️ 4
    1.计算机网络一定要做实验。分两种:
    A.构建计算机网络,比如搭建一个小型网络,包含路由转发。有条件的,用真实的设备,没条件的用模拟软件。
    B.写代码。比如实现一些应用层网络程序或者更深一点的抓包组包(2层)程序。

    2.操作系统也一定要做实验,推荐 MIT 6.828 JOS。这个课程里面有些问题还是有一定难度的。应该属于研究生课程。但 lz 已经毕业,所以应该没问题。

    3.编译原理没深入研究过,不做评价。
    wizardforcel
        17
    wizardforcel  
       2018-09-13 10:38:31 +08:00
    当然是做 lab 啊,你那样像文科一样背概念根本没用
    Hsinyao
        18
    Hsinyao  
       2018-09-13 10:49:13 +08:00 via iPhone
    mooc
    t6attack
        19
    t6attack  
       2018-09-13 11:06:47 +08:00
    上学时在书店看到过两本书。一本是讲 linux 内核源码的,一本是讲 win32 汇编的。
    两本书都像辞海一样厚。看那个厚度,就直接放弃了。
    zhzer
        20
    zhzer  
       2018-09-13 11:46:19 +08:00 via Android
    说那么多,写了,实现了,就会了
    dilu
        21
    dilu  
       2018-09-13 11:50:20 +08:00 via Android
    你真以为计算机专业四年就是混混就过来了?四年里我们安排了电工实验,软件实验,数电实验,微机原理实验,我们要学各种专业知识,包括不限于计算机组成原理 计算机网络 编译原理 数据库原理 微机原理 计算机操作系统 软件工程等等,你想几个月甚至半年就学完并理解?看上四五年,资质不算太差的就能懂了。
    abmin521
        22
    abmin521  
       2018-09-13 11:52:09 +08:00 via Android
    @huangya
    @wizardforcel 网络方面的 lab 有推荐的吗
    cjw1115
        23
    cjw1115  
       2018-09-13 12:04:08 +08:00   ❤️ 7
    @dilu 额。。说的好像和真的一样
    printese
        25
    printese  
       2018-09-13 12:47:12 +08:00 via iPhone
    从描述来看,楼主想要重温大学阶段的基础知识。不妨从嵌入式入手,从简单的 8051 的驱动,到 arm 的内核移植,一步一步来,边做边学,这样可能会更有效率,而且像操作系统,组成原理,编译原理,算法,这些都能涉及到。
    xiiin
        26
    xiiin  
       2018-09-13 13:43:32 +08:00
    推荐买课本看,注意,不是书籍,是课本。
    首先,课本的设计初衷就是“给初学者传授相关知识”,完美契合题主的需求。
    其次,课本的知识体系较为系统,有助于深刻理解相关知识。
    最后,题主你得弄明白一个问题:学习是一个漫长而痛苦的过程。
    不存在“开开心心轻轻松松”的学习捷径。
    zhengxiaowai
        27
    zhengxiaowai  
       2018-09-13 13:45:37 +08:00
    别被洗脑了,经典国外教科书,是学不来的,老老实实买国内的教科书慢慢看
    xpresslink
        28
    xpresslink  
       2018-09-13 13:47:25 +08:00
    楼主再加一个图形学就把程序员的三大浪漫凑齐了。
    lxrmido
        29
    lxrmido  
       2018-09-13 14:01:05 +08:00 via iPhone   ❤️ 1
    有好几本书是手把手教你从头到尾写一个操作系统的,名字大概就是自己动手写操作系统或者一个操作系统的实现之类的,大学的时候我写了一遍,大概三四万行代码,然后操作系统就理解了,编译原理也有类似的书,我写了个 lisp 的解释器也理解得差不多了,所以归根到底还是要动手。
    across
        30
    across  
       2018-09-13 14:03:17 +08:00 via iPhone
    考研套装书
    innoink
        31
    innoink  
       2018-09-13 14:04:15 +08:00 via Android
    你不能把这些和语言框架比,因为不在一个层次上
    mhycy
        32
    mhycy  
       2018-09-13 14:04:15 +08:00
    定一些目标开几个坑~
    边折腾边学有兴趣自然而然能学会。。。
    zbcwilliam
        33
    zbcwilliam  
       2018-09-13 14:30:17 +08:00   ❤️ 1
    推荐一个操作系统课程: http://os.cs.tsinghua.edu.cn/oscourse/ucore/2016 ;操作系统书籍推荐 ostep.
    ZiLong
        34
    ZiLong  
       2018-09-13 15:05:35 +08:00   ❤️ 1
    @BingoXuan What I cannot create, I do not understand
    ---- Richard Feynman
    wizardforcel
        35
    wizardforcel  
       2018-09-13 15:31:42 +08:00
    @zhengxiaowai 劝别人读国产的垃圾教材,是要上史书的。
    zhengxiaowai
        36
    zhengxiaowai  
       2018-09-13 15:36:49 +08:00
    @wizardforcel 你懂什么入门吗,上去算法导论你看懂吗,上去 scip 肯定懵逼,没有计算机基础,csapp 看得懂算我输。书垃圾不垃圾另说,能入门才是真的。被经典大部头劝退的人的人太多了
    wizardforcel
        37
    wizardforcel  
       2018-09-13 15:49:16 +08:00   ❤️ 1
    @zhengxiaowai

    《算法导论》并不是导论。你以为国外的算法书,每本都跟算导似的?? Sedgewick 的《算法》红皮书了解一下??里面的讲解和 Java 实现,还配有公开课,哪个不比你国的垃圾教材好用??

    拿着算导一个个例就说国外的大部头不适合入门??你怎么那么现眼啊??
    wizardforcel
        38
    wizardforcel  
       2018-09-13 15:55:42 +08:00
    @zhengxiaowai

    还有 CSAPP 不比你国的垃圾组成原理讲得明白??你国垃圾教材有几个能把微指令讲清楚的??有几个能把 malloc 的原理说明白的??有几个能上手 hdl 手撸数字逻辑的??读你国垃圾教材毕业的人,知道 pipeline 是什么么?

    都啥时候了还一水的 8051 和 8086,不嫌寒碜,这种教材不读也罢。
    Taojun0714
        39
    Taojun0714  
       2018-09-13 16:09:04 +08:00
    @zhengxiaowai 算法导论,scip 都是大一第一学期教材,csapp 也就是大二上学期教材吗?你不能按照中国专科院校进度和深度要求自己
    Taojun0714
        40
    Taojun0714  
       2018-09-13 16:11:52 +08:00
    @dilu 因为你大学四年你还学了马克思主义哲学,军事理论,体育课,泡妞把妹,最后考试前 deadline 突击过,真正压缩一下,再刨去工程实践的课,两年足以。
    zhengxiaowai
        41
    zhengxiaowai  
       2018-09-13 16:34:29 +08:00
    @wizardforcel @Taojun0714 你们忽略的一个很重要的东西,那玩意是教材,而且是很全的教材,那些弄懂哪些要么有老师带你,要么你本身足够优秀,才能看得懂,对于入门来说,先学会才是重要的,这玩意放后面看。

    @wizardforcel 你明白什么是深度么,盲目追求自己没能力的东西,那叫扯淡,国内有很多优秀的教材,只是被像你这样盲目跟风的人给抹杀了, 比如严蔚敏的《数据结构》,虽然代码很一般,但是原理讲的足够清楚。
    dilu
        42
    dilu  
       2018-09-13 16:40:36 +08:00
    @Taojun0714 两年我认同 但是几个月恐怕真的不行
    dingzs3
        43
    dingzs3  
       2018-09-13 16:48:51 +08:00   ❤️ 2
    楼主别听他们的,我是大学毕业只会 helloworld 的计算机科学与技术专业毕业。
    后来也是自学的,只要有这个动力和毅力,首先把电脑的系统装成 linux,虚拟机装 windows (别玩游戏了)
    我都是毕业后从新自学的,推荐你看下面的书:
    深入理解计算机系统 至少看一遍,例子也要写出来跑跑
    建议可以再学学汇编(也可略过,当年学习这个搞逆向破解,连续一个月,每天睡眠都不足 6 个小时,啊哈哈哈哈)
    再看啊哈算法,这个例子都写过调试过并能够自我扩展。
    接着再看数据结构与算法(基本的队列,链表,散列,二叉树平衡树(选一个 avl 或者是红黑树学习)即可,要能够自己敲代码可以运行)
    再接着就看网络编程方面的书。
    再往后就海阔天空了,linux 内核原理啊,tcp/ip 协议栈代码分析啊等可以深入学习了。

    我最开始也是啥的不会,学的很枯燥,但是在当时学习队列,遇到内核源码 kfifo.c 的一个博客的讲解,看懂了之后真的是惊为天人,自此才有了兴趣,学起来就很有动力了。

    在之后学啥东西感觉都轻松了,什么 java,python,golang,javascript。
    如果明白计算机是怎么运转的,其它都是浮云了。
    expy
        44
    expy  
       2018-09-13 16:52:49 +08:00
    https://github.com/ossu/computer-science
    ossu 整理的计科在线学习材料,MOOC 有老师往嘴里喂应该轻松点。
    shijingshijing
        45
    shijingshijing  
       2018-09-13 16:56:32 +08:00 via iPhone
    scip 不推荐,csapp 总归是要读一遍的。
    chengxiao
        46
    chengxiao  
       2018-09-13 17:04:23 +08:00
    v2 的标准 慢慢 就会变成 不是清华北大 你看什么 编程啊
    本科那些东西拿出来 真的有现在写工程难吗?
    还这 Lab 那 Lab
    已经有编程经验和项目经验的 回头看这种基础其实学的更快吧 看书看例子 平时项目怎么学 这里就怎么学就行了呗
    onepunch
        47
    onepunch  
       2018-09-13 17:12:07 +08:00
    学习网络
    大连理工——计算机网络——谢希仁版

    操作系统
    鸟哥的 linux 私房菜

    编译原理
    机械工业出版社——编译原理
    ThirdFlame
        48
    ThirdFlame  
       2018-09-13 17:25:47 +08:00
    网络 可以用 思科 华为的模拟机 跟着实验做。能把实验做完 基本上都能理解的差不多。
    不过如果没有现实的网络环境 和 解决实际遇到的网络问题,光靠实验记忆不会深刻。
    huangya
        49
    huangya  
       2018-09-13 17:35:43 +08:00
    @abmin521
    哈哈,我已经毕业几年了。当时是在学校跟着老师做的,不是某本书上的 lab。
    1.记得当时在模拟软件上配过交换机(含 VLAN),路由器和防火墙。最后作业是构造小型的企业网络,该企业有生产、办公这两种业务;需要实现业务隔离;为了内网的安全,在边界放置了一台防火墙,防火墙上设置三个区域,inside、outside、dmz,inside 区域与内网的用户相连,dmz 区域主要放置服务器( FTP、WEB ),outside 区域连接到 internet。利用 ACL 访问控制列表实现流量控制。
    2.代码的话,课程设计的作业有写聊天软件,LInux 下纯C语言,没有使用任何封装库。还写过 ping,trraceroute 等程序。当时还看了将近一两个月早期 linux 网络协议栈的代码。
    seraphv3
        50
    seraphv3  
       2018-09-13 17:54:52 +08:00
    操作系统有本日本人写的书《 30 天自制操作系统》不错

    https://book.douban.com/subject/11530329/
    Taojun0714
        51
    Taojun0714  
       2018-09-13 18:53:17 +08:00
    @zhengxiaowai 1. 配套课程全套的国内外不同院校视频满大街,你找不到? 2. 你没上过大学不知道大部分就是自学,习题答案 lab 全齐你自学能力是零?
    WeberXie
        52
    WeberXie  
       2018-09-13 18:58:31 +08:00
    @seraphv3 看过吗?代码跑起来没
    enaxm
        53
    enaxm  
       2018-09-13 19:19:51 +08:00
    @dingzs3 我是这个路线来的,不过我觉得学得有问题,之前的一些基础已经忘了。感觉还是应该缺哪补哪。
    onice
        54
    onice  
       2018-09-13 20:25:17 +08:00
    编译原理比较难,楼主倾向于实战的话,可以看看《两周自制脚本语言》
    seraphv3
        55
    seraphv3  
       2018-09-13 21:22:16 +08:00
    @WeberXie 看过一遍,网上有随书光盘中汉化的代码,代码跑了的
    我觉得有人如果有时间的话,在这个代码基础上,加上 smalltalk 的面向对象思想,能够自己做出一个图形界面的操作系统出来
    WeberXie
        56
    WeberXie  
       2018-09-13 21:34:04 +08:00
    @seraphv3 赞,收获大不
    zhengxiaowai
        57
    zhengxiaowai  
       2018-09-13 21:51:26 +08:00
    @Taojun0714 你能力强,不代表别人能力强
    wizardforcel
        58
    wizardforcel  
       2018-09-13 22:53:51 +08:00 via Android
    @zhengxiaowai

    我就告诉你,在计算机的世界里,只背概念不实战,才是扯淡。

    学完操作系统这门课,你不能实现一个简单的操作系统,甚至连填空性质的 lab 都做不出来,就是扯淡。

    你以为计算机科学是干嘛的??跟文史哲一样整天背几个名词就懂了??那你去读文史哲吧,计算机不适合你。
    wizardforcel
        59
    wizardforcel  
       2018-09-13 22:54:39 +08:00 via Android
    @chengxiao 你要考虑大多数人的工程是 curd,写测试用例,或者配交换机路由器。。。
    seraphv3
        60
    seraphv3  
       2018-09-14 09:07:59 +08:00
    @WeberXie 收获很大啊,至少知道了如果要做操作系统怎么开始动手了
    Marmot
        61
    Marmot  
       2018-09-14 09:30:00 +08:00
    @zbcwilliam 赞,是个好东西,油管上有视频
    songteng0604
        62
    songteng0604  
       2018-09-14 10:53:38 +08:00 via iPhone
    中国大学 mooc 这学期课程又开始了
    dingzs3
        63
    dingzs3  
       2018-09-14 12:35:21 +08:00
    @enaxm 哥们,如果你忘了那就说明你学的东西没有用到的地方,还有就是书中的代码你可能没有脱离书本自己敲,扩展功能,调试。
    如果是这样的确容易忘,你必须先确定目标,要学习什么,是否会实际用到。
    或者是列一个目标,我要用 C 开发一个双人五子棋,这个就设计到网络,数据结构与算法。
    那么你抱着目的去找资料学习,去设计,去编码,遇到问题继续 baidu。这样才记得牢,
    我当前学的时候也是没有实际用到的地方,怕忘就记了几个笔记本,没事就回头看看。
    enaxm
        64
    enaxm  
       2018-09-15 10:23:59 +08:00
    @dingzs3 我的回复其实是有两点想表述的,不过之前没大有时间现在重新叙述一下:
    1.我认为对于基础的学习是必要的,但对于底层的学习是没有必要。基础是算法、数据结构、网络编程这些,而底层是逆向、汇编、编译原理这些。毕竟开发语言是一层一层封装的,应该去研究语言的运用场景而不是深入底层知识,我们看嵌入式的工资就好了,市场也证明了这点。
    2.工作之后时间是非常分散的,即使工作之前没有掌握的内容,也只能在工作之余按点进行弥补,不太可能一条直线一直学下来,而且对于学习方面应该从业务入手分析需要哪些知识满足业务需求之后补充基础知识,没有应用场景的话我的思考还是尽量不涉猎,因为真的很容易忘。
    dingzs3
        65
    dingzs3  
       2018-09-17 14:08:24 +08:00
    @enaxm 你说得也很对,可能我说的还是太偏向自己固有的经验和路子了,理论上如果有工作,那么最好是工作相关的或者是有一定的帮助的,就像你说的了解算法 /数据结构和网络。我当时是觉得大学毕业什么都不会,所以强制给自己定的目标,了解计算机操作系统,硬件是如何协同工作的,所以偏向于底层方面的。而事实是,刚好我后来做 DNS 开发,对性能要求极高,所以这些东西都用的上了,比如我有时候会反编译程序看它实际编译出的程序的汇编代码,看看是否符合预期对编译器的要求,或者是程序出了 bug,需要定位等等。如我相信,只要你能在空闲时间不断的充实自己,不断的学习,那么必然会提升的,加油吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1052 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:29 · PVG 03:29 · LAX 11:29 · JFK 14:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.