程序员谈学习:我为什么要学习Linux?

今天这篇博客不是写关于具体技术的,而是我对程序员怎样学习和提高自己能力的一些感悟。我是今年7月初毕业的,离开学校后就直接进入之前实习的公司上班了。现在算来工作了也将近半年了,算上实习的时间,将近一年了。在这期间,参与了几个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. 底层的知识和高层的知识不是不能相容的,真正优秀的程序员应该两者兼顾。

时间: 2024-09-20 20:53:06

程序员谈学习:我为什么要学习Linux?的相关文章

C++程序员在学习C#时需要注意的一些问题(一)

c++|程序|程序员|问题 本文讲述的是C++程序员在学习C#时需要注意的一些问题. C++程序员在学习C#时需要注意的一些问题(一) 1)使用接口(interface)在c#中,使用关键字interface来定义接口:而且,在c#中不能使用多重继承.  interface ICar//接口ICar {  int Speed//属性Speed  {   get;   set;  }   void Run();//接口方法  void Stop(); }  class MyCar : ICar /

编程报错-初级程序员 正在学习老黑莓编程,有几个问题请教

问题描述 初级程序员 正在学习老黑莓编程,有几个问题请教 我是照着黑莓开发入门到精通那本教程书,编的,但是到后来一些页面,编的代码,老是报错,下载的JDE是7.1的,是不是跟教程比是新的,教程里6才刚出来,咋办

.Net程序员安卓学习之路5:使用xutils注入View和事件以及图片的显示

原文:.Net程序员安卓学习之路5:使用xutils注入View和事件以及图片的显示 xUtils注入和图片显示 一.xUtils注入 引用官方介绍: ViewUtils模块: •android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定: •新的事件绑定方式,使用混淆工具混淆后仍可正常工作: •目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event.       之前我

.Net程序员安卓学习之路4:使用xutils Get Post数据

原文:.Net程序员安卓学习之路4:使用xutils Get Post数据 前面使用了一些网络上找来的类进行网络访问,后来发现了安卓开发中有一个国人写的类库xutils比较全面,也比较经典,故后续使用xutils类库进行记录. 本例服务端使用WCF来实现,写好的WCF服务端在:http://www.cnblogs.com/madyina/p/3454741.html 下载部署即可 该服务说明如下: 这4个公开方法均返回一个User对象,其中最后一个还接收一个User对象. 下面我们就分别请求这4

.Net程序员安卓学习之路3:Post数据给网络API

原文:.Net程序员安卓学习之路3:Post数据给网络API 本例我们实现一次真正的网络交互,将数据POST到API,然后接收服务器的返回值进行处理,同时引入自定义类型和传说中阿里的FastJson. 实现思路如: 1. 在API端接收客户POST的数据还原成对象,给每个属性加个后缀后输出: 2. 在客户端输入用户名和密码,用来和服务器端返回的进行对比: 我们POST给服务器的是name=mady&pwd=123,服务器分别加了后缀为name=madya &pwd=1231所以我们客户端需

.Net程序员安卓学习之路6:等待条

原文:.Net程序员安卓学习之路6:等待条 一般在需要访问网络或者长时间操作的时候避免界面无响应才使用:等待条 本例将实现一个无框架的等待条,效果如下: 点击后,使线程Sleep5秒,就出现如下效果:   实现代码如: private ProgressDialog pd; public void btn_click(View v) { pd = ProgressDialog.show(MainActivity.this, "标题", "加载中,请稍后--"); /*

阿里面试回来,想和Java程序员谈一谈

引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容基本上忘得一干二净,所以写这篇文章其实是很有难度的. 但是,最近问LZ的人实在是太多了,为了避免重复回答,给自己省点力气,干脆就在这里统一回复了. 其实之前LZ写过一篇文章,但是那篇文章更多的是在讨论"面试前该不该刷题"这个话题,而这篇文章将会更加聚焦在面试前如何准备,以及工作当中如何学习

一个.Net程序员关于学习的思考顺带思考人生

本文转载:http://www.cnblogs.com/Wayou/archive/2012/11/08/some_words.html   心安即是归处 既然选择了编程,只管风雨兼程 你错过了夏花绚烂,必将走进秋叶静羌 一次会议记录是不会有人感兴趣的,做标题党也是不道德的.所以,走了个折衷的路线,标题不叫会议记录, 内容不纯总结,技术加吐槽,经验加总结. 对于一个程序员的成长,学习似乎是永恒的事情.为什么网友爱用"苦逼"来形容程序员,因为他们整天伏案写代码,学不完的新技术.其实仔细想

一个游戏程序员的学习资料

转自:http://software.intel.com/zh-cn/blogs/2012/03/20/400010004/?cid=sw:prccsdn2194 想起写这篇文章是在看侯杰先生的<深入浅出MFC>时, 突然觉得自己在大学这几年关于游戏编程方面还算是有些心得,因此写出这篇小文,介绍我眼中的游戏程序 员的书单与源代码参考.一则是作为自己今后两年学习目标的备忘录,二来没准对别人也有点参考价值.我的原则是只写自己研究过或准备研究的资料,所以内容无 疑会带上强烈的个人喜好色彩, 比如对网