作为本系列的第一篇,想谈谈程序员的学习问题。之所以第一个要谈的问题就是学习,是因为我觉得这个问题最重要,也是最让相当一部分程序员比较犯愁发憷的问题。本文如果能给这部分程序员带来一点帮助或者启发,那么目的就达到了。学习问题在那篇小结中写了一小段,这次可以相对较为详细的谈谈这个问题了。
既然要谈学习,那么首先需要明确一个问题,我们打算学什么?这里先对这个纷繁世界中的知识做一个分类:
A.教材上的知识
这部分内容来自计算机专业的课程教材。也有可能会涉及一部分来自其他相关专业或者相关课程的内容。
B.编程语言
每一个程序员只有在会使用一门语言的情况下才有可能从事开发工作,所以学习并掌握一门语言是最低要求了。
C.SDK
光有一门语言是不够的,从事任何实际的软件开发都需要一个类库或者开发包才可以完成。比如C语言中的库函数,C#中的 Framework类库,Windows的API等等就属于这个范畴。
D.开发工具
以如今的情况来说,没有开发工具理论上也是可以开发软件的,但效率就是一个问题,所以掌握并使用一个开发工具完成开发任务应该也是一个最低要求。
E.领域知识
软件总有用户,于是开发这些用户使用的软件,那么程序员就需要了解用户所在行业的知识,至少需要知道一些基本的必须的知识。还有一部分的内容也划分为领域知识,比如从事Photoshop这类软件的开发那么图形相关的知识就必须了解一些,从事工控软件的开发,那么对控制方面的知识也要有所了解。
以上的分类是在本文中我对知识的理解,一个程序员知道这些知识后从事一个软件的开发应该是没有问题了。下面分别来讨论一下这些知识的学习问题。
一.教材知识的学习
做为一个已经从业的程序员来说,我不认为计算机专业的所有专业课程(包括专业基础课,我在读大学的时候还有这个说法)都是有用的。实际上对于大部分程序员来说,只需要很少的一部分知识就足够了。这些知识主要由三门课程组成:数据结构,编译原理,操作系统。对于大部分的程序员来说,其他课程的内容不是没用,而是在实际工作中用不上。
数据结构这门课程的重要性,可以理解为是程序员的圣经,怎么如何形容其重要性都是不过过分的。这门课程中需要掌握的内容,我个人观点如下:
1. 掌握所有线性数据结构的知识,比如表,栈,队列等(广义表可以不作要求)
2. 二叉树的基本操作和基本使用
3. 图中需要知道遍历和了解最短路径算法,以及相关的一些概念
当然对于某些程序员来说,这是不够的,因为从事的具体的软件开发工作会有不同的要求。但是对于大部分从事MIS软件开发的程序员来说,这些知识够了。掌握这些知识可以有两个层面的要求。第一个是完成足够的习题,从而可以熟练的答题,第二个是能够在实际工作中使用数据结构描述实际的事物。做到这两点要求应该说不算太高,注意多加练习就可以了。目前来说这门课程的经典教材也不少,相信只要按部就班的学习完就是合格的了。
编译原理这门课程主要是学习方法和思想而不是课程中的知识本身。因为毕业出来能从事编译器开发的人实在是太少太少了。这门课程需要掌握了解的东西不多,我个人的观点主要是以下几个:
1. 确定有限自动机和非确定有限自动机的使用
2. 词法分析程序的实现
3. 语法分析的方法
自动机在实际应用中的体现就相当于是状态转换图,这个工具非常的重要,希望能够务必掌握。我们在开发EntityModelStudio时,设计界面交互部分的内容就是先设计出状态转换图然后再写代码的,否则直接开发的话就会面临开发失去控制的风险,同时重构和维护也会相当麻烦。所以这个工具极其强大,非常实用。另外提一下,非确定有限自动机,这个工具的能力和确定的有限自动机是等价的。但是由于它的不确定性,更符合人的自然思维习惯,从而在某些设计场合相对会方便很多。这一点是很实用的,也是很吸引人的。
掌握词法分析程序的实现,可以大幅度拓展开发能力和思考能力。这部分东西理论上描述可能比较麻烦,但是实际使用时还是很容易上手的,所以非常值得学习一下。语法分析程序不需要掌握了,毕竟开发编译器的机会是微乎其微的。但是相关的方法和思想希望能够了解,这可以帮助程序员用电脑的思维来思考问题。