学习PHP的时候,什么阶段才可以学数据结构?这个问题其实不只是学习PHP,也是其他语言。
关于这个问题一定不要瞎跟风,一定不要超前,也就是说不要看到网上别人说这个重要就马上去学,也不要看到别人说它很抽象,很难,就不去学。总的来说,这个玩意是要学,而且必须学,关键是什么时候学?怎么学?
如果没有学好该语言的基础,就不要学数据结构和算法,否则你学了许久,不但华而不实,派不上用武之地,还极大的打击你学习兴趣。
比如举个例子:学PHP2年多的人,你在公司开发项目中,用的是比如PHPCMS,你什么时候用过大学教材上教的数据结构中图的算法?或者哈夫曼算法?但是你却可以胜任公司的许多用PHPCMS开发的项目,工资可能还不低。
反过来,你哪怕背熟了汉诺塔这些复杂的算法,但是你没时间学PHP以及PHPCMS,你去应聘PHP开发职位,你觉得会有几个给发面试通知?你的简历上就只能写“精通数据结构和算法”,但是拍不上实战用途上,结局也很可能挺尴尬的。
别人学文科的连数据结构是什么都不知道,照样能找工作,别人就不找需要数据结构的工作嘛。这就说明了:找工作甚至是PHP之类的开发应用领域的工作是和需求直接挂钩的,工作中用到了什么才会需要该方面的人才。
所以,学不学数据结构,要看你以后想找的工作岗位需要不需要。如果你是想找个PHP快速开发项目的工作各位,1年后岗位上需要的框架你用的很熟练,你是很可能当技术经理的。但你可能并没有用到数据结构中那些复杂的算法。
所以有一个误区,那就是:但凡要学习PHP,就得要先吃透数据结构和算法,还局限于书本上写的那几个算法,如:哈夫曼算法,哈希算法,等等...谁不学这个谁就不会开发项目...之类的。
所以一听到很多初学者,连PHP的基础都没学会,连面向对象都没搞懂,连模板解析引擎也没搞懂,连动态标签都搞不清为什么要有,连Laravel都不能开发出一个完整项目出来,一来就在啃数据结构这本书,这纯粹是“华而不实”的举动。
这是学给别人看的,让别人看到你有多么的“高深”。其实为什么要学它,用在什么地方,估计他自己也搞不清楚。这样的学习严重脱离了实际,如果导致你找工作麻烦,难胜任工作需求,也是十分正常的。因为你学歪了。就像你精通历史,但是却是在找或者在做化学的工作,然后你跟别人说“历史很重要...”。
所以:上面得出的建议就是:工作或者未来的工作用不到,那就暂时不需要学数据结构。
那么,什么时候应该学数据结构呢?
那自然是用到了才需要学。什么时候用到?像数据结构中的排序,这些在PHP中都已经对数组集成了这些方法,一个sort()即可搞定,你还有必要自己来写个吗?相信你要做个对从数据库中提取的结果集进行排序的时候,你首选的会是那些库函数吧,不会自己再写个排序的算法吧,因为你在重复造轮子了。
很多人大夸特夸那些复杂算法如何如何的重要,试问你工作了几年PHP,你何曾用到哈夫曼算法在你的项目中?哈希算法?汉诺塔算法?在PHP中你自己写过链表吗?写了你用在了什么地方?你不需要写,因为都写好了。
PHP的数组就是动态的,就是链表实现的,你还用得着写吗?别人库函数写的比你高效很多,考虑了更多的情况。你写的那种只考虑一般的动态数组能派上用场吗?除非没有,你才必要去写。比如对网站栏目的递归处理。在开发领域中很多都是拿来主义,因为就是要减少重复造轮子。
只有当你从头到尾的写一个框架的时候,你才可能用到。但是又有几个在写自己的框架呢?到真正需要的地方又会看到很多人这样的言论:框架不是有了吗?如:TP,如:Laravel;就连开源系统都可以举出十多个常用的优秀的。知道这个,那么试问:你学的那些复杂算法又有什么意义?
所以:上面得出的建议就是:如果你想钻研框架的开发,开源系统的开发,那再去学数据结构和算法的深入的东西。否则,学了,你根本用不到。还是把它该学的先学会吧,如面向对象,如面向切面,如模板解析引擎,如缓存处理,如负载均衡,如集群,如Linux。
至于怎么学数据结构?
当你可以到要学数据结构的时候了,该怎么学呢?其实它就融在了你的日常生活中......
比如:如果你开发一个项目的过程中需要对提取的文章进行从1开始的打印。而你遍历的时候索引是从0开始,那么你只要加个1就可以实现。
在需要对偶数行进行标红的时候,你只要对2取余,看结果是0还是1,这其实就是算法,那么何谓算法?就是解决问题的思考途径,这样才会出现伪算法的概念,那就是用中文或者英文把解决过程先写出来,然后才会去用某种语言去实现。
至于书上描述的那些算法,是用在比如开发编译性能,操作系统队列任务的分配等底层领域,你以后要做底层驱动开发吗?你要写编译器吗?你要写浏览器吗?如果不想,那你死啃那些书籍有什么现实意义?
所以:不要狭隘的认为数据结构和算法就是某本大学教材上罗列的那几个抽象的解题代码。这太狭隘了。那些其实更多的被许多“不学无术”的人用来做“学术显摆”罢了,这也侮辱了真正编程前辈们的宗旨。相信你周围也有那些人,对,就是那些人。
得不到就说一堆你听不懂的专业术语,让你听的云里雾里,方能献出他比你优秀许多。让你“崇拜不已”。这就达到了他“虚荣”的目的。其实很多公司里的技术人员很多都是这样的漂浮心态。总喜欢拿那些让你听不懂的来震慑你,这样你就不敢继续深究他的技术实力了...仅此而已。
其实这也涉及到了技术教学和技术开发是两个不同的发展方向。前者就是要用通俗易懂的内容让你学的容易,后者就是要让你看不懂,才能显出他比你优秀。这就是很多技术高手为什么不懂技术教学的原因。这个话题以后在说。
那么,什么是真正的数据结构和算法呢?真正有实际意义的数据结构和算法其实是你身边所用到而没注意到的。这么说吧,你在开发中所创造的数据类型,如:int,char,字符串类型,结构体类型,类类型就是数据结构。
而你对他们的增删改查,排序,构造出链表从而形成动态数组,如何提取某个成员,其实就是算法。更往上走就是组合这些基础的去和实际问题的解决方案去结合。所以:那些比如汉诺塔算法其实也就是一种应用罢了。
这也就是看似你会了这些,但是项目中遇到了问题,却不会解决的原因。因为该特色的解决问题思路你没有,自然写不出那个问题需要的算法了。但是很多人误认为算法就是书上罗列的那几个程序都已经写好了的代码。这就太狭隘了。
这也就是为什么在实际项目开发中要解决一个问题,先要写个伪算法的原因,这样你才可能写的出相应的程序去解决。而你去写程序去实现,其实也就是在翻译你的伪算法而已。
最大的误区就是脱离实际、抛弃基础,而一味的追求那种用不上又耗时的狭隘意义上的代码例子的“算法”,是你学习兴趣荡然无存的根源。如果兴趣都被磨灭了,你都想转行了,那还去背诵那些用不上的用来显摆的东西又有什么意义呢?
所以:其实你身边一直在学和用数据结构和算法!
因为:数据结构和算法本质上是一种思考问题的途径,你要学的不仅仅是书本上罗列的那几个例子。更是一种前辈们解决问题的思路,那种从客观世界中悟出的道理。就像为什么要有面向对象一样,就是为了能更完整的描述客观世界的个体......
作者:灵感编程
链接:https://www.jianshu.com/p/875ee44dff61
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
共同学习,写下你的评论
评论加载中...
作者其他优质文章