程序猿应该了解的内容以及程序猿如何强迫自己学习(思考篇)

            上一篇文章LZ给出了作为一个程序猿必须掌握的知识之一,也就是我们常说的算法,后面还给出了有关算法学习的建议,希望这些内容能给猿友们一些帮助,同时也希望这一系列文章能够解答一部分猿友经常问LZ的问题。

            这次LZ思来想去,决定给文章起一个思考篇的名字,其实按照这个思路起名字的话,上一章应该叫做逻辑思维篇,而不应该叫算法篇。不过由于本次的重点在于思考,因此起这个题目也无可厚非了。

 

引言

 

            前面LZ说过,程序猿必须掌握的知识,其中之一就是算法,这里面很重要的一个原因,不仅仅是为了应付一些公司的面试,更重要的意义在于,可以锻炼各位的逻辑思维能力。作为一个程序猿,或者说作为一个优秀的程序猿,逻辑思维能力是程序猿能力当中很重要的一项。

            那么本次LZ就来和各位猿友探讨一下第二个必须掌握的知识,而这部分知识则重点是为了锻炼各位的思考能力,因为善于思考也是程序猿或者说一个优秀的程序猿必备的品质。

 

面向对象

 

            看到这个小标题,估计大部分猿友都猜到了,LZ所说的锻炼善于思考的能力的方式,就是通过掌握面向对象的知识,从而激活我们的大脑里的脑细胞进行高速的运转。

            面向对象,是一个人尽皆知的名词,它是现在几乎所有的高级程序设计语言的设计思想,主流的语言包括Java、C#、C++、Objective-C、PHP等等。随着计算机软件的快速发展,软件的规模与复杂性在稳步上升,因此传统的面向过程的程序设计方式,会导致程序的维护性降到一个可怕的地步。

            这是由于在面向过程的程序设计当中,所有的流控制都是由语言的流程控制来完成的,更通俗的讲,也就是由if/else等一些条件判断来完成的。因此不难想象,如果一个大型的软件当中,没有对象,没有多态,没有继承,没有封装,而是充斥着一大堆的if/else之类的条件判断,那估计不久以后会出现大批量这样的新闻,“某某系统维护人员,不堪重负,跳楼自杀!”

            

对象范围

 

            根据语言的特性来说,倘若一个编程语言不支持面向对象的设计,那么就已经注定,几乎不会有人使用它来开发大型的应用软件或者系统,就算是勉强开发出来了,估计也不会有人愿意再去维护这个系统。在当今程序规模剧增的时代,作为一个程序猿,如果不懂面向对象的设计思想,这几乎已经注定,你真的也就是一个码农了。

            但是凡事都有例外,并不是所有的人都必须掌握面向对象的思想,因此为了避免不必要的争议以及误导某些猿友,这里LZ还是要先说一下我们讨论的对象范围。

            简单的来说,本文适合的人群为,现在以及将来或将来的很长一段时间内,都将以某种支持面向对象特性的编程语言为饭碗的猿友们。除了这一部分人之外,其余的猿友LZ建议可以点击浏览器右上方的“小叉叉”,以免接受误导。以下所提到的程序猿,全部基于上面提到的人群。

 

面向对象与工作

 

            面向对象与算法不同,它充斥在程序猿的工作当中,与工作是息息相关的。

            比如某个方法应该放在哪个类当中(要符合单一职责原则)?某个属性的访问权限应该是私有的还是受保护的(封装)?某两个类的关系应该使用继承还是组合(类之间的耦合关系)?

            上面这类问题还会有很多很多,这些统统都是面向对象相关的问题。如果有的猿友看到这些问题,发现自己似乎从未思考过类似上面提到的一些问题,那么LZ可能要告诉你一个不幸的消息,你目前很可能还是一个真正的码农。

            与算法不同的是,是否掌握了面向对象的设计思想,会直接影响你的代码质量。换句话说,面向对象与平日里的工作是息息相关的。这也使得我们更加确信,掌握面向对象的设计思想,是一个程序猿必须做的事情。

 

小谈LZ的面向对象之旅

 

            说起来,LZ第一次接触面向对象的相关内容,应该是在某培训机构里,当时是负责面授课的一位老师提到的。从LZ的了解来看,这位老师也属于偏爱技术并且喜欢分享的一类人。

            依稀记得那应该是一节有关spring框架的课,这位老师当时在课上简单的提了一下设计模式当中的策略模式,引起了LZ的严重好奇心,也是从那个时候开始LZ才知道,接口原来还可以这么用的,当时LZ和我的小同学们都惊呆了。

            自那次以后,LZ看代码和写代码的时候就不知不觉的养成了一种习惯,就是总会不自然的去思考所写或者所看的代码当中,各个类之间的关系,之后在培训机构最后的分组小项目当中,LZ担任组长一职,在编写核心代码的时候第一次使用了策略模式。

            之后LZ便进入了一家小型的互联网公司,当时公司的框架使用的是一个开源的基于SSH框架的电子商务架构,LZ看到后瞬间就被SSH代码的优雅给折服了。不过这个时候,由于LZ的面向对象思维尚且比较初级,所以不太能体会到框架中类的精妙设计。不过由于此时LZ已经有了面向对象的思维,也开始涉猎一些面向对象相关的书籍,因此在不断的学习和思考之余,还是在逐渐加深着对面向对象的理解。

            后来LZ陆陆续续的看了一些与设计模式、重构等相关的书籍,再一次巩固了面向对象的设计思想,并试图将其应用于LZ现在所维护的项目当中,在这个过程当中,LZ对于面向对象的理解依旧在不断的加深。之后LZ便干脆写了一个设计模式系列的博文,并因文章风格迥异有幸被邀执笔,至今此书还在LZ的构思当中,希望不远的将来它可以出现在大家的面前。

 

LZ的小建议

 

            LZ之所以将自己学习面向对象的过程简单的描述了一下,是想让各位猿友意识到,在这个过程当中,LZ其实一直在思考,而且可以说是从头至尾。从LZ的经历也可以看出,面向对象不仅仅是程序猿必备的知识,更是牵动你思考的琴弦,只要你了解了面向对象的知识,很多时候会不知不觉的思考一些设计方面的问题,这也是思考与总结能力的一种锻炼。

            就LZ个人的经验来讲,LZ觉得面向对象的设计思想是一个长期培养的过程,而非一朝一夕的努力而至,它是一种思维模式,是一种编码习惯,学习面向对象的过程其实就是一个不断思考的过程。

            面向对象一般都会与你的整个编程生涯相关,因此我们应当尽早的接触它,但不需要着急的掌握它,应当循序渐进。

            根据LZ个人的学习经历,LZ建议学习面向对象的过程,可以分为以下几个阶段,各位猿友也可根据自身适当调整。另外,由于LZ是非计算机专业的半路出家之人,所以以下方法可能更适合非计算机专业的猿友们,不过对于是计算机专业的猿友们,应该也有一定的参考意义。

            1、初识阶段:这一阶段应该发生在你刚进入工作岗位的时候或者之前,或者更确切的说,应该在你可以动手写应用程序的时候就开始,无论是Web还是App。这个阶段可以看下网络上的文章,初步了解一些面向对象设计的基本内容,比如类之间的耦合关系(依赖,关联、聚合、组合等)以及一些简单的设计模式,例如简单工厂、工厂方法、策略模式等。

            2、了解阶段:这一阶段应该发生在你工作一段时间之后,此时你对你开始了解的面向对象的简单内容已经思考的差不多了。此时应该选取一本入门级的面向对象的书籍,较为系统的了解一下整个面向对象设计思想的内容,而不应该依旧只是在网络上猎取一些零碎的知识。

            3、实践阶段:这一阶段发生在你读完入门书籍之后,此时便应该开始实践阶段了。不过实践的时候不要轻易拿工作中的项目开刀,可以尝试写一些自己的小工具,然后将面向对象的设计思想应用进去,深入的体会它给你的小工具带来的好处。

            4、提高阶段:在经过实践阶段以后,便应该尝试提高自己的理解,以便在真正的工作当中可以正确的应用。此时可以选取一些较为深奥的面向对象书籍进行研读,加深自己的理解。

            5、取经阶段:此时你应该已经研读完了一些较为高深的面向对象设计书籍,现在可以进行下一个阶段了。找一个优秀的开源框架,彻底搞清楚它的设计,深入体会其中的奥妙,向那些优秀的开源框架设计者们取取经。

            6、大成阶段:倘若你已经成功的研读完一个优秀的开源框架,并深入的理解了其中的面向对象的设计思想。那么恭喜你,你的面向对象的设计思想已基本大成。此时你已经完全可以尝试写出一个优秀的开源框架,供世人们膜拜。

            总结:以上6个阶段的主线,主要就是思考。大致总结起来就是,先通过网络或者书籍等渠道,学习一些面向对象的知识,然后不断的思考、实践与总结,等现有的知识理解的很透彻了,再猎取一些相对更加高深的知识,再思考、实践以及总结,以此类推。

            面向对象的设计思想无法一朝而就,只能随着经验的增加,逐渐的加深理解。倘若在你未参与过任何的实际项目之前,哪怕你将书籍读烂了,也几乎不可能真正的理解面向对象这四个字。又或者你确实是理解了,但是真正用起来,还是会显得十分生涩。

            面向对象是人生的一次长征,我们应当尽早上路,并加快我们的脚步。但不要将自己想象成孙猴子,翻个跟头就想到达终点,好好的做个唐僧,徒步取经才是正道。

原文地址:https://www.cnblogs.com/chenhongyu/p/3342054.html