每隔一段时间,就会收到些类似的消息:
怎么学好软件开发? 我已经学完了A,我接下来该学B还是C?
其实这样的问题,真的是一言难复。如何学习,是一个很复杂的话题,尤其是眼下业内的技术名词日新月异,乱花迷人眼,使得新人更加看不清。所以才激发了我关于“技术族谱”的设想,本意就是想通过一个机制来理顺知识之间的关系,分享每个人的学习经验,新人借鉴老人的学习路径,从而减少走弯路的现象。
记得2007年的时候,一次团队内部开总结会,我在白板上随手画过一个开发相关知识的结构图,当时还有团队成员拿相机拍下来,现在想想,也许对某些人有一定的指导意义,于是今天整理了一下发出来,如下图所示:
一些相关的解释:
学校里的课程没用吗?
答:肯定有用。
计算机专业的经典理论课,意义非凡:计算机组成原理、计算机体系结构、操作系统、编译原理、数据结构。操作系统中的内存管理算法、进程调度算法、并发控制算法,都是非常经典的,你会在很多其它地方发现这些算法的应用或者变体。编译原理有助于我们理解编程语言是如何工作的,如何用范式来表达复杂的语法,编译原理中的状态机相关知识,也是开发者手中的强大武器。数据结构就更不用说了,List,Map,Tree,是编程中广泛使用的。
快餐式软件开发培训的问题何在?
一个典型的快餐式培训班,先教java语言,然后教SSH,然后给个千篇一律的虚拟项目做一下,最后号称培养出来一批“WEB开发”程序员。我觉得,如果之前没有任何基础,仅靠这样的培训,那么出来真的只能做非常程式化的工作。我一直提倡稳扎稳打,从下向上学起这样的方式,缺点是不如容易出效果。所以从两个方向入手,一边学基础,一边学应用,互相印证,也是不错的学习路径。
软件开发的门槛在提高吗?
我觉得是的,当然,我说的不包括hello world这样的示例程序的开发。虽然现在程序语言比十年前强大很多,工具要好用很多,但要想写出一个有点意义的软件,需要了解的知识多了很多,需要配置的环境复杂了很多。看看有多少初学者被java的ClassPath所困扰,您就明白我说的意思了。
开发不仅仅是学一门语言!
开发的本质是用程序控制计算机做一件事。基本上,任何有价值的程序都有内政和外交。内政就是程序的处理流程、数据加工算法、并发控制。外交就是网络通信、IO、数据库访问,以及通过各种协议和其它系统进行交互。很多知识,尤其是外交相关的知识,仅仅学习一门语言是不够的。
误区:很多人花大量精力关注最上层,比如:新的框架、新的工具、各种处理问题的技巧等等。但偏偏这一部分的变化最快,您在这上面投入的精力保值能力最差。技术有很强的相似性,比如,如果您真正掌握了javascript,那么掌握Ext或者JQuery只是熟悉对方的编程习惯和API而已,没必要为了这些新名词而疲于奔命。