两种不同的编程学习观点,深度还是广度?

来源:互联网 发布:cp linux 文件夹 编辑:程序博客网 时间:2024/05/16 18:48

深度:

作者:晓风轻
链接:https://www.zhihu.com/question/31116593/answer/200716881
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我记得我大学毕业简历上写的是精通java,工作5年后写的是熟悉java,现在10年+后写的是了解java。

你才一年。。。


(这真不是梗,你学的越多,就会知道自己不懂的越多,自然不敢说精通了。大学毕业写精通是为了找工作大家都这样写。。我们当时是学过就叫精通,用过就写熟悉,听过就写了解,:D)


作为过来人我经历过感觉什么都懂,不知道何去何从的阶段。现在想想其实根本是似懂非懂。后面恶补基础,多简单的例子都亲自测试,思考实现原理,查看对应的jdk代码,半年后感觉到质的变化,才觉得java真有意思!


了解得越多,发现自己不懂的越多,这句话绝对是真理!


大胆讲一句,楼主工作一年,很大可能连wait,notify怎么样用都不懂?不服?用wait,notify写一个blockqueue试试?


==========================================================

补充一些有用的信息,说一下我是怎么样学习的,就说一点数据结构的:


一开始我们就学习list和map。先说list,最基本有Arraylist和LinkedList,就以他们两为例分析,看他们的父类和实现的接口。ArrayList继承AbstractList,LinkedList继承AbstractSequentialList,AbstractSequentialList继承AbstractList,查看代码AbstractSequentialList没有新增方法,那么Arraylist和LinkedList都继承AbstractList,可以把他们当成有相同的特性。


接下来查看AbstractList,他实现了List接口,没有新增方法,那么重点查看List的方法即可。每一个方法都要看一遍API说明,用一遍测试一遍。add,remove这些没有什么好看的,重点留意你不熟悉的方法。


接下来看他们实现的接口,相同的Cloneable, Serializable看一下有哪些方法即可,重点看不同的,Arraylist实现了RandomAccess(其实里面啥方法也没有,应该说是只是一个标志),LinkedList实现了Deque。在看每一个接口的说明,RandomAccess说明可以用get方法访问,性能很快,你如果是一个LinkedList用get你就会发现慢的吓人;Deque说明实现了双向队列,在查看Dueue的各个方法了解他所有的特性。


接下来看构造函数的参数,可以看出ArrayList有个int类型的initialCapacity参数,LinkedList没有,思考一下为什么。接下来你会发现有数组的数据结构的构造函数都有一个容量的参数(如HashMap),你会发现他的用处,再深究下去会发现ArrayList会存在扩容这个概念。。。


到了这步你应该有自己的总结:

a。ArrayList是用数组实现的,需要初始化容量,容量不够的时候会扩容,扩容会把数组copy一遍比较耗费性能,大数据量的时应该尽量避免。

b。ArrayList可以用get方法随机访问,性能还能很快,LinkedList用get方法会比较慢,大数据量应该避免。

c。LinkedList实现了双向队列,可以非常方便的在头尾增加和删除数据。

d。一边遍历一边修改的时候需要使用listIterator,不要傻傻的搞2个List。


到了这步算是入门了,我才敢说自己入门了。


我有时候面试会问,list怎么样删除指定的数据了?如,存放数字的list,把偶数删除掉。很简单对吧,你写代码试试?你要是知道List接口有个可以修改的listIterator,你就会知道这么常见的场景应该用这个迭代器解决。


面试的时候最讨厌有点人自以为是:“这个我不清楚,但我上网查一下就知道了!”Are you kidding?你都不知道有这个东西,你会去查?


说这么多,只是希望大家记住,最简单的基础才是最重要的,我不希望我接下来在面试的时候,问map有哪些map,只能回答出我大学毕业的时候就知道的hashmap和hashtable。。。


广度:

编程么,无非就是用代码解决问题,哪有那么多耐心和必要去理解其中1和0的本质呢,那些要题主深入理解源代码的小伙伴,可能是在为题主跳槽面试提供建议吧。除了面试,我保证你100%用不着深入理解JAVA源码。

现在问题来了,按照题主所说,该会的都会了,项目来了能用JAVA轻车熟路的搭架构,甚至编码都已经不屑写了,框架,模型出来就胸有成竹了。那么题主目前应该向什么方向发展?

这是个好问题,因为相当多的程序员都会有这个阶段,并且在这个阶段表现出一定的焦虑,这是程序员的通病:危机感。

我也是,有一段时间很迷茫,很焦虑,我想说的是,我通过不断学习自己感兴趣的技术,度过了这个阶段。完全跳出了JAVA的束缚(前提是对JAVA相当有自信哦),我为什么说是「束缚」呢,因为我一直把JAVA当万金油使,跨平台、B/S 、 C/S 、APP都能写,而且脚手架、轮子极多,文档超级丰富,遇到一切场景似乎都能用JAVA解决。然而我跳出了这个「束缚」,我尝试卸载JVM,在无JAVA的环境尝试完成自己的工作,因此那段时间,我连续使用了Qt编写跨平台的GUI程序,使用nodejs写WEB小系统,使用Golang写公司的加解密脚本,使用Angular.js重构前后端分离的WEB项目。大约半年的时间,我发现我焦虑感已经荡然无存了,取而代之的是一丢丢的自信和成就感,并且我可以很容易判断出什么场景,用XX技术要比JAVA来得快,来的轻量级,来得优美。

现在,源于公司有个嵌入式小产品的开发,我又开始对嵌入式产生浓厚的兴趣,在完成公司嵌入式项目之后,自己又在家搭起了工作间,买了电烙铁,锡丝,洞洞板,杜邦线,电阻,电容,三极管等等等等。。。开始玩起了89C51,STC15系列,STM32系列,ARM9、Ardunio、树莓派。。。在家里捣鼓智能家居,用JAVA或者别的语言编写的WEB系统或者手机APP,尝试控制这些电子器件,尝试驱动电机、舵机,尝试编写自己家里的智能家居控制系统。。。尝试把家里的窗帘改造成声控的,尝试给老婆制作一面能告诉她她很美的「魔镜」作为她30岁的生日礼物。。。

总之,保持学习,多对一些实用的技术产生好奇心,你的危机感就会逐步消失,如果一直窝在万金油JAVA之中,人就会变得越来越懒,同时越来越焦虑,久而久之,说不定就不再具有竞争力。放弃去阅读什么源码吧,特别是很多知乎政治正确的回答,让你阅读Spring,Hibernate,甚至JDK中某个一辈子用不到的类的源码,那多无聊啊。。。

屠龙之技留给那些需要屠龙的大师去学,我等凡夫俗子,倒不如广泛涉猎,学点实用的功夫防身,说不定也可路见不平拔刀相助呢,哈哈哈。。。

/***************************2017年7月22日 补充**************************************/

我认为,编程,只是一种工具和手段,就像武侠小说中各种招式、心法一样,程序员在练到一定功力以后,需要利用编程的能力去解决实际的问题,在第三方行业中,去跨界使用它创造社会价值。

就比如说柯镇恶练的「降魔杖法」,而梅超风练的「九阴白骨爪」,按理说梅超风要比柯镇恶厉害多了,然而二者产生的社会价值却是相反的。如果一味的去深究和研习武功心法,像欧阳锋一样甚至倒练「九阴真经」,最终落得个走火入魔,并不能创造出什么社会价值出来。

再讲个真人真事吧,我有个朋友,编程水平一般般,别人请他做一个物流系统,具体需求提得也不是很清晰,于是他花了很多精力潜心在物流行业体验,最终用自己的切身体验给自己提项目需求,开发得很成功。这不是高潮,高潮是他后来自己开物流公司了,用他在这个领域所体验到的种种感受,优化和完善了一整套制度,开发出了更科学更高效的物流系统,这个公司后来比之前让他开发系统的那个物流公司规模还要大。我想用这个故事告诉大家,编程,永远是在需求和场景的前提下去解决实际问题。编程本无能力高下之分,解决问题和创造价值的能力才有高下之分。

非要谈编程能力的话,我不建议去阅读各大框架或者Linux的源码,但是我倒是希望大家去接触接触NOIP和ACM,那些精巧的算法我认为才是核心的编程内功,我有从高二到大四,几乎六年的NOIP和ACM参赛经验,虽然最高只得过省赛二等奖,但那些年训练和参赛的经历让我收益良多。



原创粉丝点击