程序员在大学里究竟应该学习什么?

标签: 程序员 大学里 学习 | 发表时间:2012-12-24 00:16 | 作者:理想流
出处:http://www.cnblogs.com/

近来在CSDN结识了 贺利坚老师,并仔细的读了一下贺老师的博客,感觉贺老师是非常负责的一个大学老师,在他的博客中看到了很多他和大学生的交流。

这就促使我开始思考,如果大学再来一遍,我也还是想做软件,那我应该在大学里学点什么?

最终我决定把想到的东西写下来,希望能对在校的人有点帮助。

 

首先我们得知道这问题的答案是个变量,他依赖于你的目标和天资能力,绝不唯一。当然大学的课程设置往往是唯一的,所以会有点矛盾。

这里最关键的东西是目标,大学学习只是达成最终目标高度的一个环节,他应该为最终目标服务。

 

当然大学生很难清楚的知道自己的目标究竟在那里,但要总归要大致知道自己的方向。

这个之所以关键是因为,这直接决定你应不应该学习某个东西。我是在做了很多年软件后,才发现软件和软件的差别其实比马和牛的差别还要大。

 

用流行的分类方法比如:前端开发、后端开发、.net开发,Java开发等会让人迷失焦点,

所以我一直觉得Barry W Boehm在《软件成本估算:COCOMOII模型方法》里的分类方法对学习更有帮助。

在这个分类方法里软件被分了三层:最底层是基础结构型(平台)软件的开发;中间层次是开发工具、系统集成、中间件;最上层是终端用户编程,也可以理解为一般应用的开发。

同时作者还补充了份数据说:在2005年95%的美国程序员是在做终端用户编程。

 

这似乎把话题扯开了,但其实不是,关键要大致定位下自己的方向。因为对于目标是基础结构的程序员和目标是一般应用的程序员,他们要学习的东西差别很大。

Donald Knuth的《计算机程序设计艺术》不是没用,但如果你花了2年把他啃了一遍回头专门做 应用开发,那它真的用处不大。

至少和一个精通具体语言、框架、设计模式、面向对象、UML的人比只是钻研了《计算机程序设计艺术》的人反倒是在劣势,虽然可能后者更花时间。

反过来讲则是在算法密集型的工作里,那优劣情形就会掉过来。

无疑的什么都精通最好,但人的时间是有限的,而软件相关的知识是无限的,所以把学习聚焦在自己的目标上非常关键。

 

而目标是什么则要根据自己的实际情形来定。

假设说你真的感觉自己的能力挺好,就想做基础结构型的东西,去做MapReduce,去做操作系统等等,那首先要认识到的是干这个的人很少,竞争很激烈。

如果说在2005年美国只有5%的程序员是干这个的,那我估计今天在中国也顶多是这么个比例。

个人感觉,大学的计算机课程还真都是往这个方向培养人的,一旦真的走这个方向,那么大学的计算机课程还真用的上。需要好好学习,天天向上。

当然只上课也不行,把课上学的东西实践起来也很关键(比如开源项目)。

这里麻烦的事情是,干这个的可能只有5%,很多人即使很努力也不一定挤的上去。

 

那么假设说一个人很现实,说:国内排名靠前的几所学校凑凑也就5%了,竞争太激烈,我不选这个目标方向,我还是95%里做做吧,那这个时候我应该学什么?

我个人认为主要要学好一些比较硬的,需要大块时间学习的东西,而不要在花里胡哨的东西上多费时间。

硬的东西是指:

  • 数据结构和基本算法。

不管是不是做基础结构性软件,基本的数据结构和算法知识还是要有的。

很可能不太会有自己从头写数据结构和算法的机会,但如果复杂度不知道怎么算,链表、红黑树、哈希表的差别都不知道,那就怎么都玄。

  • 精通一门编程语言

具体是那个可以根据实际情形来选。但这里强调的是语言,不是IDE和框架。可以通俗理解为每个关键字背后的含义要整清楚。

这里的陷阱是学一堆语言,但那个都不精。

  • 精读一个有点规模的开源项目(至少要超过2万行)

要找那种规模不太大,又比较有名的项目,一定要精读,争取每行都懂。

  • 累积一定的代码量

不算IDE帮助生成的,争取也在2万行之上。

  • 面向对象和设计模式

这点最好配合着下一点一起做。

  • 从头考察一下某个框架

考察某个框架的内存机制、线程机制等。

 

整个学习过程中最常见的陷阱是学会操作一堆IDE和框架的使用,但实际上这事儿价值不大,程序员的价值符合反木桶原理,啥都知道一点的,大多时候不如某个上精通的。

同时除非很特别的公司,大一点的公司并不期望毕业生过来就能干活。

有上面的基础后,再突击下,应该可以面对大部分公司的笔试和面试。

本文链接

相关 [程序员 大学里 学习] 推荐:

程序员在大学里究竟应该学习什么?

- - 博客园_首页
近来在CSDN结识了 贺利坚老师,并仔细的读了一下贺老师的博客,感觉贺老师是非常负责的一个大学老师,在他的博客中看到了很多他和大学生的交流. 这就促使我开始思考,如果大学再来一遍,我也还是想做软件,那我应该在大学里学点什么. 最终我决定把想到的东西写下来,希望能对在校的人有点帮助. 首先我们得知道这问题的答案是个变量,他依赖于你的目标和天资能力,绝不唯一.

每个程序员都应该学习使用Python或Ruby

- Kings - 开源中国社区最新新闻
本文是从 Why every programmer should learn Python or Ruby 这篇文章翻译而来. 如 果你是个学生,你应该会C,C++和Java. 还会一些VB,或C#/.NET. 多少你还可能开发过一些Web网页,你知道一些HTML,CSS和 JavaScript知识.

程序员初学机器学习的四种方式

- - HTML5资源教程
学习机器学习有很多方法,大多数人选择从理论开始. 如果你是个程序员,那么你已经掌握了把问题拆分成相应组成部分及设计小项目原型的能力,这些能力能帮助你学习新的技术、类库和方法. 这些对任何一个职业程序员来说都是重要的能力,现在它们也能用在初学机器学习上. 要想有效地学习机器学习你必须学习相关理论,但是你可以利用你的兴趣及对知识的渴望,来激励你从实际例子学起,然后再步入对算法的数学理解.

国外程序员整理的机器学习资源大全

- - 我爱机器学习
  本列表选编了一些机器学习领域牛B的框架、库以及软件(按编程语言排序). CCV —基于C语言/提供缓存/核心的机器视觉库,新颖的机器视觉库. OpenCV—它提供C++, C, Python, Java 以及 MATLAB接口,并支持Windows, Linux, Android and Mac OS操作系统.

【外刊IT评论网】每个程序员都应该学习使用Python或Ruby

- 悟怡 - 外刊IT评论网
本文是从 Why every programmer should learn Python or Ruby 这篇文章翻译而来. 如果你是个学生,你应该会C,C++和Java. 还会一些VB,或C#/.NET. 多少你还可能开发过一些Web网页,你知道一些HTML,CSS和JavaScript知识. 总体上说,我们很难发现会有学生显露出掌握超出这几种语言范围外的语言的才能.

为什么每个程序员都应该学习代码编译器知识

- - 外刊IT评论
所有优秀的计算机科学学院都提供了编译器课程,但是相对比较少的学校把它作为本科课程的必修部分. 这篇文章回答了这个问题:为什么需要学习编译器知识. 我写这篇文章的其中一个原因是,尽管我在读本科时很喜欢编译器课程,但是我几乎看不到它的实际作用. 大多数资料看起来要么简单易懂,要么很深奥(事实上,我找到的大部分编译器资料都是很枯燥的.

【外刊IT评论】为什么说学习Prolog语言能让你成为更好的程序员

- allenpatient - 外刊IT评论
本文是从 Why Learning Prolog Can Make You a Better Programmer 这篇文章翻译而来. 本人对这种语言不太熟悉,翻译中有些地方理解的可能不正确,欢迎指正. 在计算机教学的课程中,有个传统的现象,是否学过某一两种的课程能够成为判断一个人能否深入理解一些计算机科学概念的分水岭.

[来自iPc.me] 传说中的《程序猿装B指南》,程序员童鞋们请认真学习

- han - iPc.me
最近似乎某些装B指南比较火,刚好周五的晚上闲着没事,于是我也随便写一个《程序员装B指南》,话说装B是一种能延年益寿的好习惯,大家随便看看,开心就好……. [ 请大家更新订阅地址 http://feed.ipc.me ]. iPc.me 猜你可能还会喜欢:为什么我们程序员晋升要这么难. 2011程序员薪资调查报告出炉.

普通程序员、文艺程序员、2B程序员

- 可可 - 宇宙的心弦
希望能引起广大苦逼的正在学或者已经学过c++人的共鸣和会心一笑吧. 如何辨别自己在现实还是虚拟世界.