由于我们现在的内容已经不仅仅在Web设计这个领域上了,所以新开一个新的系列——“Web开发杂谈”,讨论开发相关的话题。
有不少读者和网友经常地留言,问类似这样问题:“我没有相关基础,我应该学习什么课程?”,或者“我没有相关基础,我能学会某某技术吗?”,“我不是计算机专业的,我能学会编程吗?”。
作为这个系列的第一篇文章,就来谈谈我个人的一些想法,回答这个问题,和读者分享一下。
就像刘欢可以算是咱们中国顶尖的男歌手了吧,他可是没上过任何音乐院校。所以上不上大学,以及上什么专业,都不是关键的问题。但是绝不是说,你什么都不学,就可以做技术开发工作。
我要说的是:如果打算做开发工作挣钱养活自己,可以什么学都不上,但是该学的东西都得学,一样也不能少,捷径是没有的,想绕过基础课,直接学习所谓“有用”的东西,是不可能的。
首先,任何技术工作都是需要一些基础的,获取这些基础知识和能力的最通常的方法,是上大学的相关专业。但是中国的教育现状,使得上大学和寻找自己的兴趣,这两件事往往无法统一,所以出现了很多学非所用,和用非所学的情况,这是很无奈的事情。但是需要指出的一点就是,无论要做什么,都是需要一些必须的基础知识,或者说,更重要的是一些基本的思想方法的。
各个职业之间所需要的思想方法和技能是不同的,因此,如果你希望进入一行,就应该先踏下心来,把这一行所需要的基本知识和思想方法掌握,无论你在大学是不是计算机专业,如果想做这一行,就应该(必须)把一些基本的课程掌握。
现在的一个现实情况是,很多朋友希望学习一两本书,就能作很大的事情,能做很牛的事情,这个是不现实的,任何知识和技能体系的建立都是一个综合、按部就班的过程。你要相信一点,大学四年的课程一定不是在浪费时间。除非对于确实天才的人来说,有可能是浪费时间,比如对于比尔盖茨这样的人,不过我相信如果您是这样的人,一定不会在阅读我写的这篇文章了:)
那么,到底应该学一些什么东西呢?那么从我的理解来说,应该有一个比较长远的学习计划,逐步提高。这个计划应该包括三个层次的内容:
这个层次的主要目标,是真正理解计算机内部是怎样运行的,你应该能在200字内,用自己的语言说清计算机的原理,应该理解什么叫寄存器、运算器、存储器?什么叫队列、栈、堆?什么叫递归、迭代?什么叫算法时间复杂度、空间复杂度?什么叫进程、分时、调度?什么叫文法、正则表达式?什么叫数据库设计的范式?什么叫关系、函数、群?
这些东西都不是直接用在你的开发中,但是没有这些基础,你永远无法真正理解什么叫程序。
在以后的文章里,我可以对大学计算机专业比较重要的一些课程,做一些简单的介绍,讲一讲它们的基本内容和特点。事实上我最近从网上找了几所大学的教学大纲,基本上和我十几年前学的课程没有什么变化,这也说明了,这些基础课的重要性和稳定性。
在有了上述基础,真正做开发还需要掌握一些主流的开发工具,实际上一个项目需要涉及很多方面,需要用到很多工具,比如说下面是某个网站项目用到的开发工具栈:
上面的开发工具栈是以.NET平台为例的,目前Web开发的主流“三巨头”(.NET、JAVA、PHP),都各自有一套比较完整的开发工具栈,上表中各个项目也都有个各自的工具,比如上面.NET项目用的是C#语言,对应JAVA平台就是JAVA语言;.NET用Visual Studio作为集成开发环境,JAVA则可以使用Eclipse;上面用的Web框架是ASP.NET MVC,JAVA对应的则是Struts;上面项目用的ORM是 LINQ to SQL,而JAVA则有Hibernate对应,等等。
因此,所有开发人员学习的第一个层次课程都是相同的,而第二个层次的内容,则需要先做一个选择,你打算走哪条路线,实际上“三巨头”(.NET、JAVA、PHP)都可以,至少在几年内,都会是主流技术。但是要注意的两点是:
1:选择某一个路线以后,所有相关的工具就都要选配套的了。这就好像玩单反相机的兄弟,一但选择了尼康还是佳能的机身,那么以后很长时间里,你再配各种镜头、配件,就都得跟着机身走了。而且一旦用习惯了,再换就麻烦了,而且你以前积累的所有镜头都不能用了,很麻烦。当然,要换或者同时拥有多家的也是可以的。
2:在摄影社区里,N(尼康)C(佳能)粉丝之间的“口水战”是永远的话题,同样在开发社区里(.NET、JAVA、PHP)的口水大战也是年复一年、日复一日的。其实这是完全没必要的,如果尼康和佳能之间的质量差异能够让普通人都看出来,那早就有一家倒闭了。实际上在“寡头垄断”的行业里,寡头之间的差异是极小的,否则就不会是一个稳定的状态了。如果你学过物理学就知道,这是热力学第二定律“熵增加原理”早就说明了的道理。我们这些普通人,根本不必为这些事儿操心,你就踏踏实实选一个你喜欢的,看着顺眼的,用着顺手的,走下去就可以了。
如果基础的原理你都理解了,上面列的一些工具也都掌握了,基本上也应该是一个职业的开发人员了,那么你的目标应该不是仅仅做一个合格的程序员,而应该是做一名优秀的程序员。评价一个人工作是否优秀,标准就是看他的产品质量如何。对于程序员来说,他的产品就是它写出来的程序代码,因此,就要看他的程序质量如何。
在这方面,就有很多方面要不断地修炼,而这种修炼都是长期的,潜移默化地进行着。从方法来说,无非几个:
从具体方面来说,比如如下几点: