致还在学习方向岔道上迷茫,在荒废了大一后想要重整旗鼓的当代计算机大学生。随着时间的推移,计算机技术,变化之大,可以用日新月异来形容。暂存绝对地位的java以及火遍线上线下培训班加入中小学课本的paython,或者已经面临淘汰危险的iOS,似乎就在说明这个变化。越来越多大学生开始焦虑选择困难,是先熟练掌握一门语言,还是先精通计算机的底层。答案是底层,是算法。这无需争论,因为,无论是谁站在反对的一面,都会输的一塌糊涂。
卡内基梅隆大学博士,离职google后开创创新工厂的李开复老师,也曾多次言明过算法的重要性。他说,数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等这些,远远比日新月异的语言重要的多。这些都是本质,是“万变不离其宗”的东西。
在国外,美国哈佛大学《算法导论》的公开课,已经登上各大网上公开课的界面,供全世界的人学习。微软操作系统的研发更新,谷歌搜索,百度地图导引等等,这些都需要强大的算法理论在背后支撑。
真正学懂计算机的人(不只是“编程匠")都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”。
ACM,相信你并不陌生,一项以三个人为一支队伍,在五个小时之内,对十一个题目通过编程进行解决的同场竞技。发展到如今,很多人都加入了进来,这说明算法已经得到了他们的重视。在大学内,我们还没有走入社会,是还在学习时代,会得到很多人的陪伴和帮助,我们应该好好珍惜。
当然有部分离开ACM的大学生认为,算法除了在ACM竞赛中用到,平时几乎接触不到,把算法看做是一门“不食人间烟火”的学问。认同这种观点的人,当下并不少有。而产生这种观点的原因,可能就在于算法的“门槛”之高,算法的“内容”之难,他们是吃多了wrong的loser,甘做大厂码农的败者。
算法包罗万象,奇杂无比。单从狭义上面来说,在ACM竞赛中包括的内容就有二十几种之多,其中就以动态规划、搜索、贪心、递归、计算几何(凸包、半平面交、旋转卡壳)、数学(数论、组合、概率、博弈等)、图论(最短路、生成树、强连通分量、网络流等)、数据结构(线段树、并查集、树状数组等)、字符串(KMP、扩展KMP、AC自动机、字典树、后缀数组)为主。可以说,在任何一类中想要达到某种高度,都是非一两年的学习而不得速成的。
而上述仅仅是从狭义上面说的。在广义上面,ACM算法只是算法中的一小部分。还有其他的包括机器算法、人工智能算法、大数据算法等等。可以说,算法才能代表计算机科学。没学过算法,没掌握过算法的程序员,不能说他有能力。用一句话来形容,就是“整天赶时髦的人最后只懂得招式,没有功力,是不可能成为高手的。”
接触过算法的人也许都知道,算法难,甚至非常难。当然,没接触过的但是身边有学算法的人听他们说的也可能领会到了,算法的
“难”。的的确确,算法是真的具有很大的挑战性。要学好算法,极其不易。但正是因为它的“难”,才具有必学的“重要性”。“每个行业,初步探索,都是一条漫长而艰苦的道路。计算机行业何尝不是这样呢!
只是当今很多人对此产生了认识的偏差,因为工程性的原因,很多业界人士甚至还未毕业工作的大学生都如此认为,我们学计算机,学软件知识以后是用来工作的,是用来做项目的,我们应该学活Java或者其他一门足够拿到offer的技术,学算法以后工作都用不到,这岂不是浪费时间?
听到这样或者类似这样的认识,我个人觉得很可悲。当然,有的时候我也会将心比心,换位思考一番。毕竟大学只有四年,刨去大四,最多只有三年的学习时间,对于一个不选择考研的人,选择找工作这条路的话,也是不容易的。
面对如今不管大小公司的职位招聘,无非是一些“Java工程师”、“C++工程师”、“Java服务器”、“php工程师”、“前端工程师”、“安卓工程师”等等。其涉及涵盖的主要是网站前端设计、网站后端服务器维护、安卓app开发、嵌入式几个方面。接触过的明白,这些东西任何一样似乎同样不太好学,对于已经荒废了一两年的人,选择某一个培训,似乎也需要一两年。纠结于学什么语言,以后找什么样的工作。就算是想好当程序员,可殊知,程序员也是分很多很多种。
个人建议,如果你是正在读相关专业的大一学生,希望能够接触一些基本的算法。就算不能熟练掌握,不能够写出优美代码,也需要了解其中思想。因为有可能在以后的某个项目中,你就会用到。这是每个程序员都需要掌握的“内功”。不学,是一定会吃亏的。因为,不管在什么时候,算法都是计算机科学领域最重要的基石。
内容引荐于
FZU_SYU
百度百科