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

最近在看深入理解计算机系统(CSAPP),感觉看得好慢啊。。

  •  7
     
  •   shaco · 358 天前 · 7821 次点击
    这是一个创建于 358 天前的主题,其中的信息可能已经有所发展或是发生改变。

    个人背景

    211 本科,工作一年半,后端,但是大学专业并不是计算机(很多专业课都没有学过,但是自己粗略的看过一些),所以基本上都是自学的

    疑惑

    最近在看 CSAPP 这本书,看到讲汇编的这一章(突然发现看得好吃力,于是回过头去看王爽的<<汇编语言>>)。想起自己好像看 CSAPP 这本书已经两个月了(每天花一到两个小时看,一遍看一遍敲,所有课后习题都做完),发现进度真的很慢,如果照这样的进度下去,我觉得看完整本书估计至少还得半年,所以请教各位有没有高效一点的方法来看这本书,或者传授一点看书 or 学习的经验与方法

    PS:我指的高效的方法并不是走捷径,而是换一种方式来读这本书,比如:

    • 找国外或者国内名校的课程进行辅助(我自己听英文课程的话大致能听懂),大家有啥好的课程推荐吗?(网易云课堂,Udacity, Coursea, Udemy)

    • 先获取足够的知识准备再看(如操作系统,编译原理,计算机系统结构等),但是我看使用这本书当做教材的大学都是大二的时候开设的这门课啊,那个时候学生大多也没啥基础,为啥我看得这么吃力这么慢呢?(个人感觉我比大二大多数学生的基础还是要好一些的)

    • 暂时忽略一些课后习题

    • 还是说自己慢慢啃,踏踏实实,该做习题做习题,该做实验做实验

    69 回复  |  直到 2018-11-13 18:18:30 +08:00
        1
    Shura   358 天前   ♥ 2
    CSAPP 就是一本入门书,如果你实在难懂的地方可以先跳过去。我看书的经验就是尽可能把书完整的看一遍,然后去查自己不懂的地方,之后再把书看一遍,如果不懂就再看一遍。我感觉经典书籍看一遍是不够的,你也没必要在某个细节上死磕。
    推荐一个 CSAPP 辅助的学习资料,http://wdxtub.com/2016/04/16/thin-csapp-0/ 里面有配套的实验,还是挺有意思的。
        2
    shaco   358 天前
    @Shura 谢谢,不过 CSAPP 真的是一本入门书吗??我感觉这本书讲的并不浅,有一定的深度啊。
        3
    Valyrian   358 天前 via iPad   ♥ 1
    整本看完确实很长…不如哪里感兴趣或有需求就看哪里,当作字典来用
        4
    charadeyouare   358 天前   ♥ 1
    做 lab
        5
    Shura   358 天前   ♥ 1
    @shaco https://www.zhihu.com/question/20402534
    “下图显示了 213 这门课在整个课程体系中的重要性,它是众多课程的先修要求。至于 15213 的先修课程则是 122 使用 C0 语言教学( C 语言的一个子集) 15-122 S16。 如果没有编程基础则可先修 15112,使用 Python 教学( 15-112 Schedule (Fall 16))。
    https://pic3.zhimg.com/50/9d2165634bb036b531ff92ce670579d2_hd.jpg

    CSAPP 就是 CMU15-213 的教材。
        6
    shaco   358 天前
    @Valyrian 是啊,其实说实话,CSAPP 里面的内容对我目前的工作的帮助并不明显,我想对大多数人都是这样,我之所以看这本书一方面是为了修炼内功,另一方面为我明年看操作系统,编译原理等课程做准备(明年可能考研)
        7
    hebwjb   358 天前
    慢慢啃吧,你着急短时间内看完干嘛?
        8
    shaco   358 天前
    @hebwjb 也不是着急看完,我是觉得如果看一本人家大二学生的教材,需要花费这么久的话,是不是我看书的姿势不对....
        9
    deepkolos   358 天前   ♥ 1
    @shaco 感觉前个时代的技术最佳实践积累书籍, 更多是往后的启发性意义, 不是实用
        10
    bramblex   358 天前   ♥ 2
    不用担心, 如果你能用这种态度学的话, 两年内就可以把基础知识吃的比绝大多数科班还牢固
        11
    zhizhuo   358 天前   ♥ 5
    提供一点自身经验:
    美国教材基本都是大而全的,所以想专门精读一本教材是非常费时间的 。
    个人在学习一些学科的时候,做法是交叉阅读不同的教材,看不同的书有哪些不同的部分,哪些相同的部分,以及相同的知识点有什么不同的解释。
    所以个人的建议是一定要拿捏重点,放弃不重要的冗余部分。
        12
    bramblex   358 天前   ♥ 1
    @shaco

    绝对没有姿势不对, 而是大学计算机教材虽然深奥, 但是应付考试的要求很低.
        13
    cielpy   358 天前   ♥ 1
    第一部分看了几节,然后浏览了下目录先略过了,目录来说我还是要了解一些比较贴近开发的原理向知识,如编译,线程,内存等,所以开始看第二部分,涉及到第一部分的内容再回去看看
        14
    we000   358 天前   ♥ 1
    同样不是 CS 专业, 当时第一时间买这本书花两晚看完爽得很, 后续又买了那本绝版的 AT&T 汇编书. 不过都没有做题...
        15
    wekw   358 天前   ♥ 1
    对后端工作帮助最大的应该是操作系统。
        16
    ipwx   358 天前   ♥ 4
    没看过 CSAPP。不过我可以说说我校( THU )计算机本科核心课的承接关系,供参考。

    大一上:程序设计基础( C 语言+简单的算法,比如动态规划)、计算机科学导论。
    大一下:面向对象程序设计基础( C++)。
    大二上:数据结构与算法、模拟电路。
    大二下:数字电路、形式语言与自动机。
    大三上:编译原理、计算机组成原理、软件工程、网络原理、操作系统。
    大三下:计算机系统结构。
        17
    ipwx   358 天前
    楼主可以参考我们本科培养方案所涉及的话题的前后关系,阅读各种参考资料。
        18
    bramblex   358 天前
    @ipwx 为啥我们大二就学完这些全部了...
        19
    hei1000   358 天前   ♥ 1
    这本书很好的,包括那些 lab,不要指望短时间看完,消化不了的,而且值得二刷三刷的
        20
    jimzhong   358 天前   ♥ 1
    @shaco CSAPP 是一本入门书,CS 本科毕业生应该能轻松阅读,操作系统部分讲的很浅。LZ 可以跳过处理器设计和程序优化章节。
        21
    qwertty01   358 天前   ♥ 1
    大学时候通读过一遍,用了两个学期(中间寒假没学)。
    习题不做或者挑着做,会快很多。
    没记错的话,汇编部分看过王爽那本汇编学的会轻松很多,不过两本用的是不同的汇编语言。
    后面的存储部分需要用的数字逻辑方面的知识。
    还有一部分用的计算机系统方面的知识。
    剩下的应该没压力了。
    PS:现在已经忘的差不多了,当时学下来感觉啥用也没用。
        22
    bzw875   358 天前   ♥ 1
    你好多了,我完全卡住了,大专的高等数学几乎没学上了几节课我也没怎么听
        23
    qwertty01   358 天前   ♥ 1
    @jimzhong 为啥要跳过程序优化那个章节?当时我读的时候感觉最有用的就是程序优化部分。现在对这本书唯一的印象的就是来自程序优化中关于 C/C++内联函数优化的那部分。
        24
    qwertty01   358 天前
    @bzw875 学 CSAPP 不需要啥高等数学知识啊,除了讲 Int/Double 那部分。更需要的是汇编、数字逻辑,操作系统方面的知识。
        25
    CodeingBoy   358 天前   ♥ 1
    最近在啃龙书,也是一样效率比较低,我阅读的方法是:
    - 精读,确保大部分知识可以理解(但是过了一段时间就忘了不少)
    - 不做课后习题(没时间)

    到现在发现就掌握了个大概,很多知识理解得不是很透彻。比如 FIRST/FOLLOW 还有手工构造 LR 语法分析器的方法记不住,还有一些原理性的东西不能理解,跟不上作者的思路。
    接下来打算结合习题重新学习一遍,现在就指望着考试别挂……
        26
    CodeingBoy   358 天前
    @CodeingBoy #25 另:从 9 月份开始到 12 月份,从龙书第一章读到了第六章结尾,速度看上去还行,但是实际上感觉没学到什么
        27
    rogerchen   358 天前   ♥ 1
    15213 不是 CSAPP 每一页都讲的。
    做题所有练习和 2 星以下作业就行。

    diss 一下说能很轻松看的,除了 10,11,12 三章,其他的章节深度和实用性绝对完爆绝大多数教材。
        28
    qwertty01   358 天前
    @CodeingBoy 这就是不做课后题的后果 ( dog
        30
    cyspy   358 天前   ♥ 1
    我们学校在计算机组成原理加一个实验,内容是手写汇编,把最基本的判断、跳转、寄存器弄明白,最后一课是两台机子互联,把键盘输入显示在另一台上
        31
    CodeingBoy   358 天前   ♥ 1
    @qwertty01 #28 2333,反模式
    不过我看书很多都不做课外习题的,一部分是因为有的课外习题太简单(比如编程语言基础特性的习题),一部分是没时间,还有很多书籍要阅读。
    我之前读过《计算机网络:自顶向下方法》,可能是因为比较有兴趣,知识也比较简单,所以比较轻松,不过也是一样细枝末节的比如 TCP 拥塞流量控制和路由算法细节都记不得了。《现代操作系统》也是一样。
    现在就想着要改变一下学习的方法,否则和死记硬背没什么两样。
        32
    alcarl   358 天前 via Android   ♥ 1
    刚开始看不动可以先看看 编码 隐匿在计算机软硬件背后的语言 。。。。。。当然这本有些也不好懂,毕竟太底层了,其实看不懂跳过就好了,看懂了不用过两天也会忘
        33
    BiuBiuBiuX   358 天前   ♥ 1
    看 然后在工程中 找到问题 和 CSAPP 中的东西结合

    如果你没有很多编码工程实践 看了也不能理解
        34
    feather12315   358 天前 via Android
    平时用不到,看了也是记住宏观层面,细节会忘记的。
    微机原理+Intel 微处理器(前半部分)这俩本书看个大概,外加计算机组成原理的大概,几小时扫完这本书没啥大问题(忽略细节)
        35
    feather12315   358 天前 via Android
    外插一楼:不明白为啥许多人特推崇这本书。感觉并不是很好的书,拓展知识范围倒可以,但对于初学者很不容易理解,对于有一点了解的就很鸡肋。
        36
    jimzhong   358 天前
    @qwertty01 程序优化涉及处理器架构(缓存,ILP 等),优化后的代码的可移植性和可读性变差,一般程序员(比如 Web 开发者)并没有太多机会使用这些优化技巧。而且,先进的编译器会自动 inline 函数,甚至还会尝试 loop unrolling.
    而且,CMU 的 15-213 没有涉及 Chap 5 的程序优化。
        37
    shaco   358 天前
    @zindex 谢谢,正需要这个
        38
    shaco   358 天前
    @qwertty01 不做课后习题确实得不偿失,很快就会忘,而且理解得很浅
        39
    qwertty01   358 天前
    @jimzhong 我讨论的是这本书啊,老哥。看看章节介绍“...
    5.4  消除循环的低效率 332
    5.5  减少过程调用 336
    5.6  消除不必要的存储器引用 336
    5.7  理解现代处理器 340
    5.7.1  整体操作 340
    5.7.2  功能单元的性能 343
    5.7.3  处理器操作的抽象模型 344
    5.8  循环展开 348
    5.9  提高并行性 351
    5.9.1  多个累积变量 351
    5.9.2  重新结合变换 354
    5.10  优化合并代码的结果小结 358
    ...”,并没有涉及到处理器架构,缓存啊这些东西。
        40
    springsummer   358 天前
    我也是非科班的。16 届。底层目前还没有碰.... 快一年了目前还是在看 java 基础类的书。最近在读 effective java 与 设计模式。
        41
    qwertty01   358 天前   ♥ 1
    @feather12315 我来说一个对我特别有帮助的,最近在看《深入理解 java 虚拟机》,里面涉及的字节码指令,类文件结构,字节码执行引擎在这本书都有提到,虽然是 c 语言的。
        42
    ipwx   358 天前
    @bramblex 只是计算机系统的课分散在三年而已。我没写数学课、物理课、自选专业课(比如图形学、神经网络)。
        43
    shaco   358 天前
    @springsummer 其实我个人不太建议上来就看高级语言相关的书,要么学脚本语言做点东西,要么从底层开始学起,学汇编,c 语言
        44
    feather12315   358 天前 via Android   ♥ 1
    @qwertty01 #41 对哒。
    或许你以前没通过其他层面了解相关知识才这么感觉。
    因为我学习专业课的时候都是课本+课外参考书 2/3 本结合着看,认真做课程设计 /大作业,外加捣鼓 Linux。这本书是我在近乎了解完 /接触过里面提到的东西才扫了一遍,就觉得没啥东西。而且因为实习接触了一些新的东西,超出了大学课本中的所学,更加觉得鸡肋了。
        45
    yuriko   358 天前   ♥ 1
    这本书是我当年大二的专业课教科书,现在的新生应该放到大一下去上了。

    从知识点深度来说,的确是入门书,基本上各个领域都有恰到好处的点到为止,基本上也就是把原理介绍清楚的程度又不过度涉及具体的实现细节。

    但这本书的确不算简单,因为很少有同类的书给你去做铺垫,以至于很多知识面需要从新去认知,并不是很容易去一下子去读懂,何况整个计算机系统又复杂。

    想想我们当年科班,虽然是面向低年级的课程,但也好歹也是 985 要上两个学期的课程。


    这门课书面部分还不算难的……你还可以挑战下 Lab 部分……
        46
    luoluoluo   358 天前   ♥ 1
    我最喜欢的一本书,看完后感觉像是推开了一扇新世界的大门,这书读起来非常爽,加油~
        47
    shaco   358 天前
    @feather12315 对,我也觉得应该是我了解的知识太少以及太浅,所以才导致看书感觉进度很慢,看书的过程也会遇到很多难点
        48
    hadoop   358 天前   ♥ 2
    少年,别着急,耐心看完绝对有收获
        49
    daliang   358 天前   ♥ 4
    我之前也和你一样,书想很快读完,读完就可以读下一本了,感觉这样比较好.
    其实我觉得这样并不好,读书的效果不能保证,很多内容读完要停下来想一想才能理解的更深刻,粗糙的看一遍,你看完了又能怎么样,合上书,原来会的现在还会,原来不会的依然不会,没有什么意义这样.
    如果你慢慢读,表面看的很慢,实际是最快的.因为你一次性把大部分东西都掌握了,而草草读了很多本读完依然那样.另外读书慢了容易体会到搞懂一点知识,看明白一些内容的快乐.如果很急躁,快乐是没有,只是感觉自己在赶任务,体验不好.
        50
    shaco   358 天前
    @daliang 很有道理,我好像懂一点了,说到底还是要静下来,读书不能太浮躁,太功利
        51
    nicktogo   358 天前   ♥ 1
    当然是跟 CMU 的上课视频,YouTube 应该有,看 15 年秋季的,是两个作者亲自上的课。
        52
    VicaYang   358 天前   ♥ 1
    习题不一定全做,八个 lab 还是得啃的,啃 lab 比看书还舒服
        54
    cxbig   357 天前 via iPhone   ♥ 1
    陌生的东西慢是正常的,用心并坚持下去就会越来越快。
        55
    rocksolid   357 天前   ♥ 1
    你这速度已经不慢了,快了记不住也没用啊
        56
    jimzhong   357 天前
    @qwertty01
    5.8  循环展开 348
    5.9  提高并行性 351
    5.9.1  多个累积变量 351
    这三个都依赖处理器架构。如果没有支持乱序执行的超标量处理器,这些优化都没有效果。
    缓存不在第五章。
        57
    wweir   357 天前 via Android   ♥ 1
    一年前刷了这本书,断断续续花了 4、5 个月,有效看书的日子大概两个月。

    经验就是:实在看不懂的地方,就用刷的方式看吧,不讲求看懂,混个眼熟。
    Y86 有一部分我就是这么看的,并不影响对后面章节的理解。

    整本书看完,感觉给自己对计算机的认知带来不少提升
        58
    wweir   357 天前 via Android   ♥ 1
    对了,千万别信什么看不懂就停下来慢慢看的话。

    作为一本入门书,里面没有多深奥的知识,很多看不懂的地方是和已有知识体系的关系比较远罢了。想搞懂,需要补充大量其它领域的基本概念,给自己的提升未必有多大。

    最重要的是:一直陷在困难章节里面,读书体验太差,很快你就会坚持不下去
        59
    shaco   357 天前
    @wweir 好,多谢建议
        60
    theeeeeeeo   357 天前   ♥ 1
    同在啃这本书,一年前买的,当时根本看不懂,现在越看越有意思。。。
    共勉
        61
    qwertty01   357 天前
    @jimzhong 程序员一般都是在现代处理器进行开发吧,当然不排除个别做嵌入式的是在标量处理器上进行开发。
    我来说一下我对优化程序那个章节为什么印象特别深刻。当年的我作为一个 C 小白,在读这本书的时候经历前四章包括不限于 Int/Double 的底层表示,汇编语言各种“无用东西”的学习之后,终于能在第五章可以学到我能在实际编码中能用上并立即产生效果的东西,那种感觉我至今都没有忘。
    所以你告诉我第五章可以跳过是我所不能理解的。
    当然每个人的技术背景不同,学习心路更是各异。到此为止吧
        62
    zhaogaz   357 天前
    哦,楼主说的这个书,我前一阵子也在看。

    我也是 16 届毕业,非科班的。

    我个人的想法是这样的,这本书的最大意义,在于理解计算机整体的发展和构造,了解一些可以迁移的知识。

    前人的很多开发和设计经验都是在前前人基础上进行的。

    如:你在开发一个功能的时候,突然想起来,这个东西的实现思路,和以前计算机中 xxx 的实现思路类似。然后你起名字的时候,就会写借用 xxx 的名字,来实现这个功能。等到别人看你开发的这个功能,看到你的名字,就会看到 xxx 这个名字。然后就知道了你这个要干什么了。

    当然以上这个例子是理想情况。

    做题什么的,就算了啊。

    看书,不做题,看 1 天,记 5 天。看书,做题,看 3 天,记 10 天。

    以上两种方式没什么本质区别,最终都是忘了。

    所以,经过以上讨论,我认为最合适的方式是,先随便看看,等干活干一阵子之后,隔一阵子翻一翻这种书,指不定就会有惊喜发生。
        63
    Poarry   357 天前
    不错不错
    学习学习
        64
    shaco   357 天前
    @zhaogaz 我并不同意看 1 记 5,看 3 记 10 这种说法,我觉得做题收获的并不是让记忆保持更长久,而是让理解更加深刻,理解这种东西是最有裨益的,也是最难忘的...
        65
    safeoy   357 天前
    最近也在看 CSAPP,刚开始大致翻了一下整本书,感觉前几章比较底层,于是从第二部分第七章链接开始看,看了 4 天才看完这章。总体来说对我这种非 CS 科班出身的码畜来说确实难度很大,但是收获也很大
        66
    tinylcy   357 天前   ♥ 1
    去年对其中的两个 Lab 做了总结,写了博客,可供参考。
    * [CSAPP: Bomb Lab]( http://tinylcy.me/2017/CSAPP-Bomb-Lab/)
    * [CSAPP: Attack Lab]( http://tinylcy.me/2017/CSAPP-Attack-Lab/)

    另外,我还对 CSAPP 网络编程一章实现的 Web Server 进行了扩展,造了一个轮子 [Vino]( https://github.com/tinylcy/vino),同时也有总结:[如何实现一个 Web Server]( http://tinylcy.me/2017/%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAWeb-Server/)。

    希望对你有帮助。
        67
    zhaogaz   357 天前
    @shaco 兄弟啊,现实一点。你看看理解深刻的人多少是做题做出来的,常用才能深刻理解啊。。。

    当然你要觉得做题理解深刻也行的啊,慢慢看呗。。。
        68
    myk502   36 天前
    这本书真的很难吗?
    我花了大概 2 个月时间,把前十章全部看完了,配套 lab 也做完了,无非每天看 8-10h。每天 1-2h 是不够的,刚进入状态就结束了。
    去官网搜一下他们上课的视频和 ppt,有一部分内容挺好的。
        69
    shaco   35 天前
    @myk502 厉害!我觉得可能是因为我看的时候没有建立起整个计算机课程体系的概念,也就是说如果有一些课程(比如操作系统,组成原理这些)如果先看过的话,看起来应该会轻松很多,
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1922 人在线   最高记录 4019   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 23ms · UTC 15:58 · PVG 23:58 · LAX 07:58 · JFK 10:58
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1