经常有学妹问我(其实学弟也爱问):
大家都是成年人了,这还用选吗?
当然是两者都要重点啃下来呀,算法和技术相辅相成的,一定不要有二选一的想法!
我当时大一也是觉得数据结构没啥用,哪有学个JS、CSS写个漂亮的网页炫酷?
这玩意有qsort快吗?
我直接一行就排好序了,你还要写十几行,真菜呀!
但是越学到后面心里越没底,因为这些东西对自己都是黑盒子。
所以如果数据结构与算法掌握不好,那么这些API对于我们就是一堆的黑黑子,连什么时候用Map(红黑树实现)、什么时候用HashMap都分不清。
Redis这种组件,难道只需要了解如何get、set就是算是掌握了吗?
现在还在大一、大二的同学还不抓紧机会,别给自己留下遗憾。当然,不打ACM,我们也是能够学好数据结构和算法的。
所以学习算法有助于我们根据应用场景选择最合适的数据结构。
日常开发中也一定离不开算法,比如小北最近工作中涉及的某种嵌套TLV(Tag-Length-Value)结构编码的解析,就需要用到递归、多叉树等知识。如果不学习算法,那么程序中只能见到大量的if/else、while/for。。。
再来说操作系统、编译原理,这些里面也是蕴含着各种数据结构与算法的,就拿编译原理来说。
一、编译原理遇见算法
当你学完有限状态机以后,你会发现以前觉得很牛逼正则表达式似乎自己也能用DFA、NFA实现一下了。状态机的思想在编程中很多地方都用得上。
比如解析HTTP协议,如果没学过状态机思想,你可能会一行行的if/else去做解析,这里最麻烦的地方在于,if/else需要提前将HTTP头部字段都接收到再来判断,而我们知道HTTP基于TCP,而TCP是流式传输,所以你很有可能是几个字符一组组接收到的,这个时候用if/else写出来就很难看了。
而用状态机编写起来代码就会非常优雅。状态的转移是由规则驱动的,接收到一个字符就判断一个,非常的方便。
继续学完语法分析,你会掌握递归下降分析这样非常重要的思想,你可以使用递归下降快速的实现四则运算计算器。
如果不用递归下降你可能需要先中缀表达式转后缀,然后求值,这是我们大一数据结构课写的,当时用栈写的,有点麻烦。后来学完编译原理,又用递归下降重写了一遍,区区几十行代码遍搞定。
还有一类场景在实际开发中的用的很多,比如淘宝、京东这样的电商,它们的营销规则有很多,比如满减、直减、跨店等等,这样的规则是不可能写死在代码里的。
那是怎么做的呢?
像我们平常经常使用的JSON、SQL、HTML这些都算是一种DSL,你甚至可以尝试用递归下降去写一个JSON、XML解析器,这比写电商网站更有价值的。
继续往下学你会了解到抽象语法树AST如何生成、如何转化为中间代码、如何对中间代码优化、最终又是怎么生成机器指令的。
二、CS基础课
如果你有ACM获奖经历,那BAT是很容易进的,但是也一定要掌握基本的CS基础课程知识,不能只重算法不重基础。
国外可能把题刷好就能拿到offer,但是国内不懂OS、网络这些基础和一些语言八股文也是很难的!
三、CS学习路线
我大学专业学计算机的,对CS本科课程还算了解,也经常了解学习国外CS课程。
CS专业区别于其它专业很大特点就是:
比如你学了数据结构、编译原理、操作系统、计算机网络,如果你从事的是研发岗,那一定离不开这些知识。
主要靠自学
不管是科班还是非科班,想要快速持续的提高技术水平,就得靠自己去钻,尤其离不开自学。
可能唯一差别就是少了一个计算机学士学位。
也有人把这种自学出家的叫做民科,当然没有任何的讽刺意思哈。
四、那么计算机专业该如何自学呢?
最简单的方式就是参考CS科班同学的课程,比如下面这个:
很多,概况起来就是(下面只涉及CS专业课):
算法与数据结构
操作系统
计算机网络
数据库系统
学习的途径就是:
多看国外/国外的CS名校的一些开放课程+看经典的书+多写代码!!!
毕竟现在MOOC、Udemy、B站上学习的资源都是很丰富的。
下面开始上干货:
一、计算机导论
首先建议从计算机导论课程开始,推荐下面这些课程:
MIT的6.001mit-6.001
提到C语言,我这里推荐国内浙大翁凯老师的课,看过的都说好,分为两门:
第一门是面向高考结束想提前自学一点编程的,叫大学先修课:C语言程序设计CAP-大学先修课
虽然叫先修课,但是覆盖了C语言的主要知识点,也适合大一新生~
第二门是C语言程序设计进阶:C语言程序设计进阶
会带你用C语言完成一些有趣的项目,比如一些图形界面小游戏,先修课学习C语言语法基础,进阶课带你项目实操,搭配使用,你就是同学中的大神!
有了语言基础之后建议学数据结构与算法:
数据结构推荐:
StanfordCS106系列
CS106A:ProgrammingMethodologies
算法推荐:
6.046(进阶)DesignandAnalysisofAlgorithms-MIT
MIT的6.006IntroductiontoAlgorithms
Berkeley的CS61A和CS61B
学习完经典的数据结构和算法之后就可以去刷题了。
操作系统推荐:
CMU的15-213
Berkeley的CS162,
这两个都是有视频有lab的好课
还有一个非常经典的MIT6.828,附带一个xv6lab
课程:6.828:OperatingSystemEngineering
组成原理、体系结构:
MIT的6.004,
Berkeley的CS61C
计算机网络:
Stanford的CS144,lab很有意思
五、新手快速自学的方法
一个原则,来自翁凯老师:
学计算机一定要有一个非常强大的心理状态,计算机的所有东西都是人做出来的,别人能想的出来,我也一定能想得出来,在计算机的世界里没有任何的黑魔法,所有的东西只不过是我现在不知道而已,总有一天我会把所有的细节、所有的内部的东西全搞明白的
建立抽象层,我自己的感悟
计算机里,几乎都是人造的概念,大部分的东西,只要你一直深挖下去,几乎都可以搞明白。
“打破砂锅问到底”式的学习虽然精神可敬,但性价比并不划算。
比如学习HTTP,那么就先认可TCP提供的稳定可靠传输,而不继续深挖TCP的内容,等到学习传输层的时候再去深入挖掘TCP具体实现。
也就是我们常说的面向接口/抽象编程。
视频为主,看书为辅
看书学习基本的理论
编程练习、实践
有了新领悟,继续看书
如此反复的循环。
责任编辑:lq6
原文标题:学妹:大学四年以算法为重还是技术为重?
长沙市望城经济技术开发区航空路6号手机智能终端产业园2号厂房3层(0731-88081133)