想看 SCIP, 铁子们有没有推荐的打开姿势?

2021-02-02 20:13:02 +08:00
 asanelder
终于按耐不住自己的好奇心了, 下定决心, 干它!

但干它之前, 想问问铁子们, 2021 年了, 这本书有没有正确的打开姿势?

俺怕自己看偏了, 消磨了兴趣

另外, 有没有铁子说一下, 为什么要看这本书捏? 看之前和看之后, 有啥不同?
4315 次点击
所在节点    程序员
34 条回复
levelworm
2021-02-03 01:12:05 +08:00
我觉得别纠结做完练习,练习里头有一些算法的东西,还有一些比如什么电子工程的玩意。我觉得可以找名校课程跟着他们的作业和实验就好了。
levelworm
2021-02-03 05:25:15 +08:00
话说大家有没有兴趣搞个 discord 一块看?最好是跟 CS61A 而不是看书,因为习题实在太多了。周末可以视频或者音频聚一次,大家总结一下经验和问题,平时就文字讨论,如何?
1490213
2021-02-03 07:32:50 +08:00
直接看就行了,能有啥问题?只是后面几章需要多花点时间琢磨一下而已。
xpresslink
2021-02-03 10:04:48 +08:00
楼主是要干以前 scheme 版还是现在的 python 版?

scheme 版, 百度 《计算机程序的构造和解释( SICP 中文第 2 版)
https://download.csdn.net/download/a19980115/10289121
https://github.com/huyubing/books-pdf/find/master

python 版
https://wizardforcel.gitbooks.io/sicp-py/content/
namelosw
2021-02-03 12:13:55 +08:00
除了第五章没看完其他都看得差不多了. 一些打开方式:

* 快速扫一遍, 确认真的想读. 很多人读过了大呼上当, 其实前半本书很多东西都跟日常工作对应.

* 看完了就忘是最没意义的, 尝试避免这点, 不然还不如不看.

* 从快到慢多看两遍效果比较好. 不然上来精读总也看不到后边, 前面其实都不重要.

* 找个时间心气高的时候一口气看一两章, 然后接下来的几天里努力把第三章啃完

* 看二三章之后如果看不下去了, 可以回顾一下, 拿一些现代的工具比较一下, 思考一下优劣. 比如里面的 data directed 和 Java 的扩展机制比有什么优劣. 再比如第三章既介绍了 map 和 flatMap, 又介绍了 stream, 这两个能不能合并起来呢? 其实合并起来就是 Reactive extension.

* 第三章的结束是一个重点: OO 和 FP 思想的区别. 可以找一下原教旨的 OO 语言比如 Smalltalk 玩一玩, 感受一下和 Java 有什么不一样的. 然后再找个现代函数式语言试试, 比如 Elixir(易)或者 Haskell(难).

* 看完要做题, 但是卡住了直接跳到下一道, 基本上做上一半或者三分之一就代表你大概理解了, 赶紧趁热乎看后续章节, 别纠结. 某些题一看就很花时间就跳过, 或者上网看一下思路.

* 第四章第五章基本就不是第一轮看的. 大部分人都会看两三章就放下了, 然后过几个月就全还回给书了. 所以二刷的时候可以快速温习一下前三章.

* 第四章看完可以试一下 Prolog/Datalog, 比如 Datomic 数据库.

* 四五章看到后面觉得不着地可以再去看 crafting interpreters 看, 前半本跟第四章对应, 后半本跟第五章的一部分对应.

* 学不学 Emacs 都行, 不学 Emacs 就用 Racket, 里面有 SICP 的 language pack. 但是如果看不下去书的时候又没啥好做的可以折腾一下 Emacs, 然后折腾烦了再看书. 切忌把 Emacs 当前置条件, 同时学两个东西很容易互相卡住.

---

大概列一下提纲, 感兴趣的同学可以大概扫一眼是不是真的感兴趣:

* 五章五个主题, 这五个主题描述的是和编程语言相关的主要话题, 一个编程语言的重点是它如何处理原语, 组合, 抽象.

* SICP 的特点是扔掉现实世界, 在一个极小的 LISP 世界里从 0 开始构建所有关于计算机的基础知识.

* 前两章讲介绍了 LISP 原语 /组合 /抽象, 第一章是函数抽象, 第二张是数据抽象(最终引向多态)

* 前三章和规模化软件开发相关, 也就是日常我们说怎么写可维护可扩展的软件. 第三章说的是引入状态之后编程会变得复杂, 就有了函数式和面向对象两种互相矛盾的思想. 面向对象是把状态拆散, 函数式风格是不分状态而靠函数组合模块化(横切纵切), 他们各有合适的场景, 比如量子物理模拟用面向对象就没有意义, 书里的逻辑电路模拟用函数式风格就特别难写.

* 第四章先讲了怎么用 LISP 实现 LISP 解释器, 这样对 LISP 的实现就有了一半的理解. 后面套用 LISP 解释器的套路, 可以把 LISP 改造成风格不同的 LISP, 也可以改造成其他语言, 可以解决风格迥然不同的实际问题(既然没有最好的语言, 只有最适合的语言, 那么最好的语言就是可以变成最适合语言的语言).

* 第四章借用了很多 LISP 原语, 所以只有一半理解, 第五章从头实现一个假想的电脑: 固定逻辑计算机, 寄存器, 汇编语言, 重新实现解释器, GC, 最后再重新给这套假想的电脑实现一个到假想汇编的编译器 (最后一个作业是用 C 重写一遍…).
levelworm
2021-02-03 13:07:11 +08:00
@namelosw 其实我一直好奇直接看第四章第五章行不行。当然事先把基本语法过一遍。
no1xsyzy
2021-02-03 13:53:58 +08:00
@levelworm 如果有软件工程的底子应当是没问题的,但不确定是否有部分前面直接疏通过去了
Kirsk
2021-02-03 13:54:03 +08:00
这本书我都搞不懂好在什么地方 只看了目录就不想看了 大概太菜
namelosw
2021-02-03 15:05:09 +08:00
@levelworm 我觉得能看懂代码就完全没问题. 这本书前面都在讲上层建筑, 后面讲基础设施, 走的两个方向, 关系的确不大.
hurryning
2021-02-03 15:12:38 +08:00
干就完了
asanelder
2021-02-03 15:44:27 +08:00
@546L5LiK6ZOt #18 俺就是好奇这书到底有没有说的那么神
@zwpaper #20 soga!
@levelworm #21 不纠结
@xpresslink #24 打算就是 scheme 原汁原味
@namelosw #25 铁子给的建议好啊, 大大减轻了俺的抵触心理. 书就应该这么看! 俺现在越来越期待了

有一个问题, 现在函数式语言可不可以用 Scala?
namelosw
2021-02-03 18:55:36 +08:00
@asanelder 这本书很多内容用 Scala 很难写, 因为 Scala 是静态类型语言. 宏也没有 LISP 那么简单好用.
日常用 Scala 函数式风格肯定是没问题, 毕竟向 Haskell 对齐的语言.
levelworm
2021-02-04 02:21:59 +08:00
@namelosw 多谢那我之后试试看过了第一章然后直奔第四章。Python 的那个倒是挺好懂的。我觉得我还是不习惯 scheme 比如说没有循环,所以得重练下第一章某些习题。
asanelder
2021-02-04 09:28:30 +08:00
@namelosw #32 ok

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/750715

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX