程序猿应该了解的内容以及程序猿如何强迫自己学习(算法篇)
记得LZ的第一篇博客发于2013-01-27 16:10,是LZ有一次上班闲下来的时候写的一篇文章,关于Jquery源码的研究成果。至今为止,断断续续也写了大半年博客,自从写博客以来,LZ间断性的收到过不少猿友的提问,这些提问中有很大一部分,是问LZ这样的问题,有很大的重复性与近似性。
“LZ,你不是学计算机的,你是怎么学习的?”
“LZ,你是怎么看书的,为什么我看着看着就玩游戏看电视去了?”
“LZ,你都看些什么书啊,能不能给点建议。”
“LZ,你平时下班回去都是如何学习的?”
“LZ,我天天加班,没时间学习,怎么办啊?”
“LZ,我工作好几年了,可是感觉技术没什么提升,怎么补救呢?应该看点什么书呢?”
“LZ,你觉得Java Web和android哪个更好呢?”(这个问题,真的是难住LZ了,0.0)
这些问题总结起来主要有两种,第一种是不知道要看什么,第二种是看书看不进去怎么办。
针对不知道看什么这种问题,说真的,LZ很多时候无法回答,因为我们从事的工作内容可能不同,比如LZ是JAVA,你是.NET,LZ是web,你是移动。就算恰巧我们做的领域几乎都一样,应该看那些书也是不能一概而论的。比如可能LZ想做架构师,而你想做技术总监,可能LZ想做研发经理,而你想做项目经理。
因此LZ觉得不能把自己看过的或者准备看的书名哗啦哗啦往那一堆,然后说,“喏,我都看这些,你也跟着看吧!”
不过尽管我们的领域可能不同,但是既然都是程序猿起家,肯定还是有一定的共性的,本次就以LZ的见解来简单说一下,程序猿必须了解的知识是哪些,之所以LZ没有说必须看的书有哪些,还是因为那句话,知识有共性,书没有共性,找到适合自己的就行。
【这些话是后来LZ加上来的,没想到不知不觉写一个算法写了这么长,我去,善了个哉的,由于时间关系,本次LZ就将本文又拾掇拾掇,写成(算法篇)了,后面再补上其它的内容。】
算法
有的猿友可能要说了,LZ你这不是废话吗?程序猿懂点算法最好,这事谁不知道?还用你来教啊?
猿友们莫要激动,要蛋定,请耐心看下去。
首先LZ不得不承认,我们很多时候几乎用不到算法。其它不说,就说LZ现在的工作,是针对企业IT建设的开发工作,大多数情况下都是以业务为主的工作,猴年马月能让你用到算法,哪怕是一个冒泡排序。
但是,but!
LZ想说的是,首先,我们说要掌握算法,并不是说你要把《算法导论》仔仔细细的来一遍,到时候LZ给你随便出个算法,你都能在一分钟内轻松搞定。
不是这样的,no!
那到底要如何?
我们先不忙说到底是怎样的,我们先把文章的对象范围限制一下。
对象范围
这里首先限定下对象范围,是为了避免引起不必要的争议,更是为了避免给不适合的人带来不好的建议。因此如果你尚且是一位学生,LZ没什么好说的,如果有算法这门课,那么你只管好好学习就好了,以下内容与你无关。
LZ这里所说的对象范围,首先得是已经毕业参加工作的,而且主要是指那些大学是非计算机专业,没有算法课程,或者大学虽然是计算机专业,但是压根就没怎么认真学过算法,或是一毕业就将算法全部还给了老师们的这部分人。
总而言之,言而总之,这里的对象范围主要是指已经工作,但是算法不怎么地的这部分人,倘若你的算法原本已经高深莫测,那么请参看“如果你尚且是一位学生”。
算法与工作
说真的,真正工作了以后,哪有时间让你研究那几百上千的算法?
更重要的是,我们研究这些算法,就算全部研究透了又能怎么样呢?
或许有的猿友可能会说,研究透了,BAT随我挑啊。
LZ不得不承认,全部掌握了当然是有好处的,那我们把排名前十的语言全部学会进去的概率就更大了,难道要去学吗。我们参加了工作以后,毕竟时间有限,相信大部分已经工作了的人都深有感触,随便学点什么东西,时间都是挤出来的。
这就牵扯到一个取舍问题了,我们费尽心思的去学习这么多算法,有这个必要吗?
如果你不能在研究完所有的算法以后,创造出新的算法,或者说在算法领域有所成,说真的,就算是BAT,也不一定就仅仅因为你懂几十几百个算法就要你的,而且他们也肯定没时间去考试你那么多算法。因此,疯狂的学习算法显然是没有必要的。当然了,如果你每天的工作本身就是与各种稀奇古怪的算法打交道的话,那LZ就不说什么了。
那为什么LZ还支持猿友们学习算法呢?
这里LZ先给各位讲一个LZ的小故事,本故事几乎是真实的。
小故事
LZ非常清楚的记得大学里教LZ高等代数的老师,那是一位非常值得尊敬的老师。
有一次上课,同学们都在各自忙着自己的任务,比如偷菜的,发短信的,补觉的,更有甚者,是跟身边的女朋友亲热的。
老师看到这种情况,就不慌不忙的说,“你们是不是觉得学数学出去没用?”
异口同声的,绝对没有商量的,同学们答:“是!”
老师听到后没有露出任何尴尬的神色,而是自然的笑了笑说,“或许你们搞了四年的证明题,等你们出了校门,你们一道证明题也不会做了,而且工作中也很可能用不上,但是它给你的是四年的逻辑思维锻炼,是你潜意识里逻辑思维能力的提高,这,就是学了四年证明题给你最大的礼物,出了校门以后你绝对再收不到这样的礼物。”
说真的,当时LZ听到这句话,直接就和LZ的小同学们震惊了,但是不出意外,几乎所有同学,包括LZ,依然都是异口同声的,没有商量的,说:“切...!”
但是LZ却将这句话深深的记在了心里。
小算即可
小故事告诉我们,我们工作中确实不可能让我们去证明为什么两点决定一条直线,但是不得不承认这些证明的过程,会让你的逻辑思维能力得到锻炼。
对于证明题是如此,对于算法亦是如此。
因此LZ一直都说,小算怡情,大算伤身,强算灰飞烟灭(一位猿友在评论里补上的,0.0)。
小算就是为了时常锻炼我们的逻辑思维能力,让我们不至于在出了校门以后,看到一大堆的数学符号就想撞山丘。因此我们平时看些算法,还是有好处的,但是不可贪多,否则很容易得不偿失。
不可贪多主要有两个原因,一个是学习算法很容易枯燥,没有设计模式等这类内容看起来有意思。另外一个是,算法的迅速提高,很多时候对我们的工作没有太大帮助,我们浪费大量的时间在这上面有点亏。
因此,LZ还是觉得小算即可。
LZ的小建议
具体如何学习算法,LZ的建议如下,觉得适合自己的猿友不妨尝试一下。
1、买一本你喜欢的算法书,可以是任何书,LZ对这个不做建议。
2、制定一个周期,每到一个周期学习一个算法,比如一个月,不宜太长,也不宜太短。
3、坚持,凡事不坚持,说什么都白说。一旦定好了时间,一定要雷打不动。
这样学习算法的好处是,一个月一次或者某个周期一次,不会因为每天看一堆算法而觉得枯燥,而且长此以往的坚持,两三年就足够你掌握数十种算法,就算你想跳槽去BAT,算法上也差不多足够你去应付了。
更重要的是,这相当于每一个月都给了你一次逻辑思维能力的锻炼,这就跟锻炼身体似的,定期的锻炼身体对身体是有好处的,那么定期的锻炼逻辑思维能力,其实对逻辑思维能力的提高也是有好处的。
这样看来,那厚厚的算法书不应该再是你恐惧的东西,而应该是你犒劳自己的奖赏,你应该慢慢的去享受它,定期的享受一次逻辑思维能力的锻炼和挑战,而不是痛苦的快速把它干掉。