The way of CS

看到萧井陌大神的专栏文章,这里发表一下个人看法。

萧大的专栏文章:http://zhuanlan.zhihu.com/p/19959253

入门阶段

萧大的建议是使用python入门(他的原话是启蒙),可以避免同时学习语法,计算机系统,与算法思想的问题。他给出的路线是:

  • • 完成 MIT 6.00.1x麻省理工:计算机科学和 Python 编程导论)。虽然该课程的教学语言为 Python,但作为一门优秀的导论课,它强调学习计算机科学领域里的重要概念和范式,而不仅仅是教你特定的语言。如果你不是科班生,这能让你在自学时开阔眼界;课程内容:计算概念,Python 编程语言,一些简单的数据结构与算法,测试与调试。(这门课我倒是在MOOC上学过了,没时间看视频的话推荐看那本《像计算机科学家一样思考Python》)
  • • 完成 Harvard CS50x哈佛大学:计算机科学)。同样是导论课,但这门课与MIT的导论课互补。教学语言涉及 C, PHP, JavaScript + SQL, HTML + CSS,内容的广度与深度十分合理,还能够了解到最新的一些科技成果,可以很好激发学习计算机的兴趣。(看过一点,目测有点拖沓)
  • 支线任务:阅读《编码
  • • 完成 Python 教程

不过我认为这没有必要,python是一个非常优雅&强力的脚本语言,不过如果以Unix的出现为现代计算机的开端的话,一切都是从命令式语言C开始的。OOP的思想在底层仍旧由堆栈和数据结构实现。所以还是用C最佳。至少对我来说如此。

推荐书籍:C语言之父的著作 K&R C
《编码》这本书涉及了很多数电与逻辑,也是非常值得阅读的。
萧大原本推荐了一本《Hack’s delight》(译作:算法心得,讲的十分底层),我的数学水平比较着急,如果你数学功底够好,那确实非常值得一读。

接下来是对真正的编程能力的培养,这里推荐的是《SICP》(计算机程序的构造与解释)与《计算机系统要素》( The Elements of Computing Systems

结束启蒙阶段后,初学者积累了一定的代码量,对编程也有了一定的了解。这时你可能想去学一门具体的技术,诸如 Web 开发, Android 开发,iOS 开发什么的,你可以去尝试做一些尽可能简单的东西,给自己一些正反馈,补充自己的推动力。但记住别深入,这些技术有无数的细节,将来会有时间去学习;同样的,这时候也别过于深入特定的框架和语言,现在是学习计算机科学通用基础知识的时候,不要试图去抄近路直接学你现在想学的东西,这是注定会失败的。

(当然我也不喜欢过早钻研框架和应用层,当然做东西是必不可少的,让兴趣指引方向即可)

那么入门阶段具体该做些什么呢?这时候你需要做的是反思自己曾经写过的程序,去思考程序为什么 (Why) 要这样设计?,思考怎样 (How) 写出更好的程序?试图去探寻理解编程的本质:利用计算机解决问题。

设想 :

X = 用于思考解决方案的时间,即「解决问题」 部分

Y = 用于实现代码的时间,即「利用计算机」部分」

编程能力 = F(X, Y) (X>Y)

要想提高编程能力,就得优化 X,Y 与函数 F(X, Y),很少有书的内容能同时着重集中在这三点上,但有一本书做到了——Structure and Interpretation of Computer Programs (SICP)《计算机程序的构造和解释》,它为你指明了这三个变量的方向。在阅读 SICP 之前,你也许能通过调用几个函数解决一个简单问题。但阅读完 SICP 之后,你会学会如何将问题抽象并且分解,从而处理更复杂更庞大的问题,这是编程能力巨大的飞跃,这会在本质上改变你思考问题以及用代码解决问题的方式。此外,SICP 的教学语言为 Scheme,可以让你初步了解函数式编程。更重要的是,他的语法十分简单,你可以很快学会它,从而把更多的时间用于学习书中的编程思想以及复杂问题的解决之道上。

————————摘自萧大专栏

《SICP》浅尝辄止,等看完后再做评论

剩下的底层部分可以说是CS的四大浪漫,计算机系统,算法,编程语言,网络通信(最后一个是我加的)

详细的看萧大的专栏即可

我这里整理一下我打算阅读的书单

System:《CSAPP》(深入理解计算机系统)

分支:Unix的哲学:《unix环境高级编程》(这本已购)《linux/unix系统编程手册》(朋友推荐)

网络:《TCP/IP》三卷,《unix网络编程》

编程语言:C++就够我受的了,JAVA和PHP还是可以看看的。

算法:没资格评论

现在的状态只能看些风趣的书和课本了,搞点基本算法:几种排序、Dijkstra 和 Floyd、KMP / Boyer-Moore、快速幂、Karatsuba、线性筛……
几个数据结构:线性表、有序和无序树、哈希表、堆、图、BST,深入的话学点红黑树、B+ 树、跳表……等等。


前路漫漫,一分努力一分收获,为什么这么简单的道理我到现在才明白

“The way of CS”的一个回复

  1. 感觉我是永远也无法再入门了,可能退休后会有时间吧。以上的书好像都买过,但是基本上只读了目录。所以,我到现在感觉还只是一个installer而不是programmer更不要说designer

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注