转来的,我以为挺好,分享一下

今天这篇博客不是写关于具体技术的,而是我对程序员怎样学习和提升本身能力的一些感悟。我是今年7月初毕业的,离开学校后就直接进入以前实习的公司上班了。如今算来工做了也将近半年了,算上实习的时间,将近一年了。在这期间,参与了几个android项目的开发,也维护过别人写的项目,虽然都不是很大的项目,但也学习了很多东西。在这其间,我亲身经历了一个设计拙劣的项目,是怎么样一步步趋于混乱而最终变的彻底不可维护。从这件事情我了解到优秀的程序员是多么难得,而“不优秀”的程序员是怎样把项目一步步的搞砸搞烂,也了解到作出一款优秀的软件是多么的困难。什么样的程序员才算优秀的程序员,而什么样的程序员是“不优秀”的?(我不肯意说别人坏话,只能委婉的说“不优秀”)做为一个工做不到半年的新人,谈论这个问题好像没什么权威性可言, 我也只是简单的谈论一下本身的见解,鉴于本身的阅历和经验不是很丰富,不免具备局限性,读这篇文章的读者能够指出个人错误。java

 

我认为,优秀程序员和不优秀程序员的区别首先是态度上的区别。优秀的程序员有本身的理想,他们想作出好的东西,而不是混混日子而已,他们思考不少,不论是项目开始以前仍是在项目进行中,项目完成以后也会进行总结。他们对待问题比较严谨,思考比较全面,在动手写代码以前确定通过了必定的思考,对可能引入的问题进行预估。而不优秀的程序员对待问题比较随意,也就是态度上不是那么认真,代码写的也比较随意,从不考虑之后的变化因素,今天吃饱无论明天肚子饿,他们不会意识到他们的代码已经污染了整个项目。 在发现问题时,优秀的程序员老是想办法弥补,他们会找出本身的代码写的很差的地方,谨慎的修改或大胆的推翻重写,这样的话把问题消灭在萌芽阶段而不会让整个项目偏出正轨。而不优秀的程序员,不多能发现问题,即便能发现问题,也是迟迟不愿作出弥补,他们老是侥幸的认为这些问题不会在后期暴露出来,因此问题越积越多,最后致使整个项目混乱不堪,错误百出,没法维护。android

 

除了态度上的不一样,在能力上也有很大的差异。显而易见,优秀的程序员懂得比较多,他们乐于深刻研究原理,对底层的知识有必定的了解或者了解的很透彻,而不仅是停留在调用一个API;而不优秀的程序员通常不喜欢思考,对原理的兴趣也很少,他们不肯意花一些时间把一些问题搞明白,而只是简单的调用一下API,若是解决不了问题,随便在网上搜一段代码复制过来就万事大吉。因此遇到比较难缠的问题,优秀的程序员老是能从原理出发,一针见血的看出问题的真正缘由,进而解决问题,而不优秀的程序员老是停留在表面,在网上搜了很长时间也没有解决问题。我深切的认识到,若是只是停留在调用API而不深刻原理,永远也用很差API。程序员

 

除此以外,优秀的程序员的另外一个特色是善于并乐于学习,他们对本身所从事的工做有浓厚的兴趣,有强烈的好奇心,他们老是想把问题弄明白,他们喜欢清晰,而不是迷迷糊糊的感受。对一我的的进步起决定性做用的因素是刻苦的学习,而不是所谓的“经验”。就像有人说的那样,在公司里工做不会使你成为大牛,只有持续的学习才能让你有长足的进步。如今不少招聘职位要求有几年的工做经验,这是最容易让人误导的。工做时间长的就能力必定强吗?举个例子,有两个清洁工,一个干了十年,天天还在默默的工做,而另外一个只干了几天,通过本身的思考发明了一个新的工具或方法,让他的工做事半功倍。因此说,工做经验是很虚的东西,他用时间来计量,一我的工做了5年,他可能在5年中天天都学习进步,也可能一个经验用了5年而没有什么实质性的提升。设计模式

 

扯了这么多,好像和题目没什么关系。如今扯点和题目相关的。做为一个搞Android应用开发的,我为何要学Linux呢?我工做中又不会写Linux程序,再说Linux内核博大精深,代码海量,关系错综复杂,学习Linux内核确定要耗费大量的时间和精力,那我为何还要学呢?在说这个问题以前,先谈谈我对学习的见解。架构

 

在学习一个东西以前,出于保险起见,咱们老是会询问别人的意见,而在这些意见中,老是会有人说学这个干什么,工做中又用不到。若是谁给了你这样的建议,那么你必定要当心,由于基本上能够判定他是一个不爱学习的人。有不少东西,不是由于你“感受”有用才学它,而是学了以后才能知道它有用。个人一位朋友是作C#的,他在业余时间学了Perl,当时学的时候老是有人认为没有用,可是当他学会以后,可使用Perl强大的文本处理能力,去整理格式混乱的源码文件,能够写个程序自动的给领导发邮件。还有我大学的一位老师,年轻时由于英语比较好,被单位派去美国,得到了深造的机会,回来后作了咱们学校的物理系主任,不少人也认为英语没有用,呵呵。我进入公司实习的时候,看了设计模式,在我翻看《Head First设计模式》时,被一个有经验的同事看见了,他告诉我看设计模式没有用,由于咱们的项目是不会用到设计模式的。我不知道这是什么逻辑。反正当我看完设计模式以后,真的被这些设计巧妙而又极具实用性的模式所震撼,在之后的项目中,我大量使用了这些模式或者设计原则。因此若是一个工做了两三年或者更长时间的程序员尚未学习过设计模式,我会深深的鄙视他,认为他不是一个真正的程序员。工具

 

我上大学时学习了java语言,当时还费了很多劲。基本的语法比较熟悉了以后,仍是感受到有些东西老是糊里糊涂,不够清晰,好比说不知道反射是怎样工做的。因此找了《深刻Java虚拟机》来看,当我看了两遍这本书以后,感受到原来不清晰的地方都显得天然而然,知道了class文件结构是怎样的,类是怎样被加载的,指令是怎么样被执行的,方法是怎样被动态绑定的。这些知识对我有很大的帮助,假如我不学习Java虚拟机,只是单纯的写Java程序,即便写上10年,也不见的比我如今对Java的理解更透彻。学习

 

说了这么多,只是想说学习是有用的,大大的有用。一个经验用5年并不等于有5年的工做经验,一个不学习的程序员是不会有什么发展机会的。因此,对于一个java程序员,还分不清对象和对象的引用,对于一个IOS程序员,还分不清ViewController究竟是MVC中的视图仍是控制器,那么没错,你该学习了,该静下心来好好巩固一下基础了。操作系统

 

最后,来到正题。我为何学习Linux内核?设计

首先,我对Linux有很深的兴趣和好奇心,我喜欢专研一下。从实用性出发,我可能一生都没有机会编写Linux内核,也可能一生都不会从事Linux驱动开发相关的工做,可是我知道它对我是有用的。能进一步加深对操做系统中概念和实现的理解,对底层的深刻理解,能让我打下扎实的基础。一些新技术其实都是架构在基础的东西之上的。基础牢固,之后再学习什么新技术都会水到渠成。有人可能会反驳,说学习底层的东西没用,优秀的程序员应该专一于设计,项目管理或架构等上层的知识,个人观点是,设计,项目管理或架构等上层的知识和底层的知识一点都不冲突,不懂底层的人,基础不扎实,在上层也不会走的顺畅,设想一下,若是没有深厚的基础知识,你怎么能知道本身架构出来的东西能不能实现呢?对象

 

写到这里文章就写完了,因为比较困,可能写的有些散乱,在最后总结一下这篇文章的主要观点。

 

总结:

1 咱们要作优秀的程序员,不要作“不优秀”的程序员;

2 学习是有用的,若是有人给你的建议是学XXX没用,那么你可要小心;

3 底层的知识和高层的知识不是不能相容的,真正优秀的程序员应该二者兼顾。

相关文章
相关标签/搜索