为什么要讲数据结构和算法?以及如何学习数据结构和算法
“飞哥你变了!”
“没想到你这个浓眉大眼的,也叛变了革命……”
这就是我在讲《数据结构和算法》的时候,脑子里浮现出来的台词。
熟悉我的同学都知道,我是一个“实战派”,
一直在强调学编程要尽快“上手”,做出东西来,看到效果,获得正反馈和自激励……而《计算机组成和原理》《编译原理》《数据结构和算法》之类的,是能排在多后面,就排在多后面的东西。
但为什么源栈一开课就讲数据机构,第二天就写“二分查找”呢?(对了,附上当天群聊天记录若干……)
这特么的就是传说中的“人工”智能啊!
当然,以上为搞笑版。
事实上同学们最后都写出来了。写出来之后回头看看,“其实也没有那么难嘛!”
^_^,你确定?
其实,讲《数据机构和算法》,最大最大的原因,就是“面向就业”编程的需要。有非常大的概率,你面试的时候,面试官就让你写一个“冒泡排序法”,你一脸懵逼,写个:
int[] numbers = new int[] { 3, 1, 8, 12, 7, 9, 10 };
var result = numbers.AsEnumerable().OrderBy(m => m);
foreach (var item in result)
{
Console.WriteLine(item);
}
那就比较尴尬了。
这不一看就是培训班出来的嘛!
虽然说飞哥对培训班的同学毫无偏见,但其他人不这么想啊,所以我也没有办法——至少目前是没有办法的。只能是希望通过我们所有人持之以恒的不懈努力,逐渐的改变这种歧视和偏见。在此之前,大家还是委曲求全,憋说是“源栈”培训出来的,就是是自己“自学”的吧……
除此以外的理由,应该就是自己说服自己,硬找的了。按靠谱程度,依次排列:
- 理解并学会“用循环和分支解决问题”的“电脑”思维。很多零基础的同学对此是一脸懵逼的(包括当年飞哥自己),比如排序,人的思维是怎么样的?找到最大值放第一个,然后第二个第三个啊……我们就不会考虑:电脑怎么知道哪一个数是最大的呢?但是呢,这种训练,是一把双刃剑,过深的纠结于具体的过程,会给我们理解“面向对象”造成干扰:又让我们不敢抽象不能抽象!
-
教学需要。你说,刚学会变量赋值,if...else和for循环的孩子,你能给他布置一个什么作业呢?就只有这些排序啊查找啊需求简单,不涉及任何类库框架,刚刚好。其实这也是面试新人时爱用简单算法的原因。就面试那点时间,总不能讲需求就讲半个小时吧?!
-
向其中所凝聚的人类智慧致敬。这是真心的,反正我在准备软考,博览群书的时候,是被震撼到了的。作为一个文科生,我真心好奇这些人的脑子是怎么构造的,能想出这么多匪夷所思的办法出来?其实有很多东西,不一定是要有用才需要学,那些美好瑰丽的东西,只是看一看,都是一种享受。
- 浪漫和逼格,偶尔还是可以有——而且可以用来怼人!一直有同学问我考了软考有什么用没有。我想了又想,除了一部分的知识在以后潜移默化的滋润渗透,对编程开发有所裨益之外,最重要的一个作用就是给了我底气:当某些(注意,仅仅是某些)科班生,在我面前鼻孔朝天,但其实渣渣的时候,我可以毫不心虚的怼回去:要不我们来比一比?看看什么你会的我不会,我会的你不会?他们自然就怂了,其实他们也就多知道那么几个名词而已,¯\_(ツ)_/¯,上了个大学有什么了不起,学的又不是国家机密核心技术……
我说了为什么教,可能同学们更关心的是怎么学。
其实我一直反对的,是“数据结构和算法”至上论(同样我反对的,还有“学历”至上论),注意“至上”这两个字。比如那种说法,“不学数据结构和算法,一辈子都是码畜”,我就非常讨厌。真的是非常讨厌,哪怕我自己好歹学了点。知识,是没有高低贵贱之分的。
总有些人,觉得有什么缺了它就不行的“核心”技术——但我告诉你,做成一件事,其实缺了哪一门技术都不行。比如造汽车,大家都觉得发动机是核心是关键,但其实一款汽车在市场上卖得好卖得不好,难道就是因为她的发动机好或者不好?用大拇指想想也知道是不可能的!可能一款车大卖,靠的就是最不核心最不核心的技术:好看。这个世界还是看脸的,比如说飞哥,明明就可以靠颜值……唉哟!哪里来的臭鸡蛋?唉哟,又是一个,嫉妒,赤果果的嫉妒啊!
好了好了,说正事,如果你因为众多车型因为外观热卖,就说“外观设计”就说汽车工业的核心,那就又犯了同样的错误。难道发动机制动就不重要了么?没有发动机,跑都跑不起来,还卖个屁!
所以,其实无论是一件事,或者一个人的成功,都是综合因素的结果。只是我们看问题的时候,有意无意的,忽略了很多很多方面,按我们的想象,把成功简单的归结于某一点。
好像又有一点跑题。长话短说,数据结构和算法,怎么学,看你的兴趣。实际上,学无止境,只要尽力了,能学到哪里就到哪里,没有什么问题。计算机发展到今天,其实已经大量封装高度抽象啦,我们做程序员,不一定个个都得造轮子。其实能把别人的轮子用好,能做一个所谓的好码农,都已经很了不起了。定义稍稍严格一点,很多很多的程序猿,连“合格”都够不上。
当然,你说,我对这玩意儿特别感兴趣……那没关系啊,盘他!是不是?但是呢,给个小建议,别盘出什么优越感来了。没必要,还拉仇恨值,关键的关键,这很有可能让你变得狭隘,局限你的视野:除了数据结构和算法,原本还有很多很多很有意思很有挑战性的东西。
最后的最后,给没时间看我视频的同学简单总结两条:
-
知其然,更要知其所以然。
- 数据结构是算法的基础,两者不可割裂。
很多教材,讲数据结构就“链表”“二叉树”的讲数据结构,数据结构是什么样子的,怎么插入怎么删除怎么查找,什么都讲了,但为什么需要这样的数据结构?不讲!或者一笔带过……这是非常非常不负责任的!飞哥那时候学数据结构,这一点是把我坑死了的。很后来很后来,也不知道是哪里东看一句西捡一段,“哦,链表是为了内存管理!”“栈,是方便函数调用”“二叉树就是数据库的索引”……这样点点滴滴的才把这些东西串起来,数据结构的世界才豁然开朗。
学习,你一定要知道学习的目的,学习的意义,你才能更好的坚持下去。就像走路,蒙着你的眼睛,让旁边人告诉你“往前三步,左转两步,再右转走十步”,你想想,这种模式,有几个人能撑到下去?还不如一开始就告诉他,“今天我们去哪里,跟着我走!”