我们为什么要学数据结构与算法、设计模式
我有一位大学同学,我们是同一个宿舍的兄弟,由于我们的老家比较近的原因,我们的家乡话差不多,因此我们彼此之间一开始便有宿舍其他人不具备的亲切感,并且由于那会儿宿舍条件比较简陋,革命友谊很是浓厚。毕业后我来到了现在的学校读研,而他则是选择了就业。并且在我读研期间他刚好又因为换工作,来到了我读研的城市做java研发,同时也有另外一位大学同学在这个城市做运维工作。同一个宿舍的兄弟及同学,又恰巧在同一个城市,因此每隔一段时间我们就会找机会聚在一起吃吃饭,聊聊境况,侃侃大山。由于我一开始就打算研究生毕业之后做软件研发这一块的工作,于是我也经常借着跟他们聊天的机会向他们俩汲取一些工作上的经验,与其他的工作领域相比,研发这个领域,人与人的关系相对单纯很多,最主要关注的还是个人技术能力的高低,像电视、电影里面关于职场尔虞我诈险恶情景不敢说完全没有,但也少的可怜。我在与他们讨教的时候也主要关注最近他们公司用什么流行的技术做开发,以及做哪方面的项目以及这个领域的大环境情况,大部分程序员的素质等等问题。在这么多次的小型聚会的讨论中,在技术这一块让我印象最深的主要有三次。
第一次是我和我那位做Java开发的同屋战友,要从我们学校这边步行去找我们的另一位比较忙的兄弟吃饭,在这一过程中我的战友依稀听到有位哥们在叫他,迟疑了若干秒,最后发现是他原来的一位同事在叫他,停下来之后兄弟的前同事便过来与我们攀谈。这个过程中我得到了这样的一个信息,现在IT圈很多程序员在做开发的过程中一贯的做法是,去copy别人原来写过的与他现在要做的事情差不多的代码,然后去改一些参数,让copy过来的代码能够达到业务的需求,我与我兄弟听到之后相视一笑并没有说什么。最后朋友的这位前同事还抱怨了一通,什么大家原来都差不多,为什么现在工资没你高之类云云。
我不知道当初听了那位仁兄说的那一番话之后是怎么想的,反正我当时听到之后最开始想到的是,难怪现在都把程序员叫做码农,而不在是工程师。我相信他们也不是不想自己去动手完整写一些功能模块的业务逻辑,可能是他们都懂得甚至是熟悉所用语言的语法特性,但是码力(类似于围棋中的棋力)不够,导致他们没有能力去驾驭复杂业务逻辑的编写。于是只能去copy别人的代码,并且他们我不知道如何的去提高自己的码力!
第二次是在一次吃饭的过程中,我的那位做Java开发的兄弟向我们说,“编程这个事情真的是要靠天赋的,我边上的以为同事每次编写业务逻辑都是又快又好,逻辑能力比我们不是一般的强啊,我们大部分人都没有他那个逻辑能力,没那个天赋。”作为一个坚定的方法论拥护者,我坚信的是凡是都有方法让你快速的提高,这世上80%的人的天赋都在一个水平,因此它的话我并不是特别的赞同。当然不排除有些人天赋确实比你高,并且比你更加的努力,那么如果这样的话我们就跟应该努力寻找好的方法快速的提高自己,更加努力。
第三次是在一次与兄弟通话的过程中,他向我透露了一个消息,他们部门老大认为他现在编程特别惯常的使用面向对象的语言却用了面向过程的思维方式写代码,根本没有发挥出面向对象语言的优势。因此篇判断他以后可能在技术这条路上不会走多么长远,建议他尽早的转向管理岗位。这个信息给我的最大的感受是,让我想到了周围的很多师兄弟包括我,确实经常的使用一个面向对象语言做面向过程的开发,然后还很自豪的对那些用C等面向过程语言开发的开发人员面前吹嘘面向对象的牛逼,但是我们根本就没有让我们的代码达到易扩展、易维护、易复用、灵活性好等面向对象的优点,说来惭愧!!
从这三次交流,我得出了这样一个结论:一个程序员前期特别的熟悉各种业务逻辑的功能模块编写能力,可以让他解决初入职场时面对的大部分问题;一个程序员的后期如果想要有一个飞跃式的提高,譬如在碰到一个完全陌生的业务时能又快又好的编码实现,并且程序的运行效率还很高,或者是想让自己拥有系统设计的能力,成为架构师,那么数据结构与算法、设计模式这个时候就很重要。
如果说语言的基础语法和业务逻辑编码的经验积累是术,那么 数据结构与算法思想、设计模式就是道。我们可以把各种业务逻辑的功能模块编写能力当做武侠世界里面侠客们用的招式,而数据结构与算法、设计模式看做是侠客们修炼内功的法门。
就好像笑傲江湖里面华山派的剑宗、气宗的近况一样,在最前期的时候剑宗的门人一般要比气宗的门人厉害,因为他们剑法精炼,内力差不多的情况之下往往剑宗的人比较厉害;但是到了后期,当其中的门人把内你练上去之后,他们则会比剑宗的人更加厉害。
当然只偏向于剑法而忽略内力修为,或者只注重内力修为而不注重剑法修为都是不对的,我们应该两者并重。因为任何剑法都不可能穷尽战斗时对手的全部变化,就好像风清扬在教令狐冲剑法时,随手拿起地下的一根枯骨,随意的摆出一个姿势,问令狐冲这招这么**。令狐冲这个时候完全愣住了,因为他以前完全没有碰到过要**这种招式的情况。只有剑法和内力并重我们才能咋碰到对手新的招式的攻击时才能轻松的化解,就好像最后令狐冲同时具备了独孤九剑和少林易筋经以后,基本是无敌的存在一样。
因此我们程序员也应该,在具备熟悉各种常见业务逻辑的编程能力的同时,也应该学习数据结构与算法、设计模式。以便于不仅有能力胜任基本的也逻辑开发,也能让自己所开发的软件,运行效率更加的高,易于维护,易于扩展、易于复用,灵活性更加的好。这就是为什么国内外很多著名的互联网公司在招聘的时候,基本上都会问应聘者数据结构与算法、设计模式等相关的问题,甚至于要求现场手写代码;