每隔一段时间,就会收到些类似的消息:
怎么学好软件开发? 我已经学完了A,我接下来该学B还是C?
其实这样的问题,真的是一言难复。如何学习,是一个很复杂的话题,尤其是眼下业内的技术名词日新月异,乱花迷人眼,使得新人更加看不清。所以才激发了我关于“技术族谱”的设想,本意就是想通过一个机制来理顺知识之间的关系,分享每个人的学习经验,新人借鉴老人的学习路径,从而减少走弯路的现象。
记得2007年的时候,一次团队内部开总结会,我在白板上随手画过一个开发相关知识的结构图,当时还有团队成员拿相机拍下来,现在想想,也许对某些人有一定的指导意义,于是今天整理了一下发出来,如下图所示:
一些相关的解释:
学校里的课程没用吗?
答:肯定有用。
计算机专业的经典理论课,意义非凡:计算机组成原理、计算机体系结构、操作系统、编译原理、数据结构。操作系统中的内存管理算法、进程调度算法、并发控制算法,都是非常经典的,你会在很多其它地方发现这些算法的应用或者变体。编译原理有助于我们理解编程语言是如何工作的,如何用范式来表达复杂的语法,编译原理中的状态机相关知识,也是开发者手中的强大武器。数据结构就更不用说了,List,Map,Tree,是编程中广泛使用的。
快餐式软件开发培训的问题何在?
一个典型的快餐式培训班,先教java语言,然后教SSH,然后给个千篇一律的虚拟项目做一下,最后号称培养出来一批“WEB开发”程序员。我觉得,如果之前没有任何基础,仅靠这样的培训,那么出来真的只能做非常程式化的工作。我一直提倡稳扎稳打,从下向上学起这样的方式,缺点是不如容易出效果。所以从两个方向入手,一边学基础,一边学应用,互相印证,也是不错的学习路径。
软件开发的门槛在提高吗?
我觉得是的,当然,我说的不包括hello world这样的示例程序的开发。虽然现在程序语言比十年前强大很多,工具要好用很多,但要想写出一个有点意义的软件,需要了解的知识多了很多,需要配置的环境复杂了很多。看看有多少初学者被java的ClassPath所困扰,您就明白我说的意思了。
开发不仅仅是学一门语言!
开发的本质是用程序控制计算机做一件事。基本上,任何有价值的程序都有内政和外交。内政就是程序的处理流程、数据加工算法、并发控制。外交就是网络通信、IO、数据库访问,以及通过各种协议和其它系统进行交互。很多知识,尤其是外交相关的知识,仅仅学习一门语言是不够的。
误区:很多人花大量精力关注最上层,比如:新的框架、新的工具、各种处理问题的技巧等等。但偏偏这一部分的变化最快,您在这上面投入的精力保值能力最差。技术有很强的相似性,比如,如果您真正掌握了javascript,那么掌握Ext或者JQuery只是熟悉对方的编程习惯和API而已,没必要为了这些新名词而疲于奔命。
一家之言,欢迎拍砖或者交流。
----
答问:
sun_blackh 发表于2009年9月30日 8:18:27
不好。不知道各种通信协议在什么地方。为什么要把tcp/ip单独拿出来?质量意识显得很突兀,和整体没有关系。虽然它很重要。什么是框架?它应该在哪里?我想LZ没有仔细推敲过。
答:
知识体系中,越是向上,则越是偏向应用层的东西。“各类协议”,只是一个泛指,协议太多了,在一个人的知识结构中,只学习跟自己工作和兴趣需要的即可,比如,如果你做网管,可以关心SNMP,JMX;如果你做WEB开发,可以关心SOAP,AJAX;如果你做SP,可以关注各类短信网关的协议等等。TCP/IP之所以要单拿出来,那绝对是有道理的,TCP/IP是一个协议栈,我觉得只要你想做网络方面的开发,那是必须要学习的,TCP/IP已经是一种不可替代的标准了。
“框架”和刚才对“各类协议”的解释是一样的,并不特指哪种框架,而是一个统称,是根据需要去学习的,比如:SSH,比如:JQUERY,比如:EXT,比如:Reason等等。
质量意识你觉得突兀吗?我觉得它就应该贯穿软件开发的方方面面,它并不是一项具体的技术,但却要时时刻刻挂在心中。
chgaowei 发表于2009年10月2日 星期五 11:08:53
这个模型很不错。我想在补充几个: 1、领域知识。 2、软件工程。 3、算法,数据库,网络基础应该放在下面。 4、质量意识换成软件工程。
答:
您补充的挺好,领域知识,或者说业务知识,的确很重要。
关于“软件工程”,如果代替“质量意识”,这个我觉得值得商榷,因为我觉得软件工程并不能代表高质量软件的全部,你觉得呢。
算法,我个人的意见认为,并不能作为一个底层的东西,对于多数人来说,应该算是可选项,对于某些特殊软件开发,比如视频编解码、搜索引擎等等,可能算法是必须的基础,可能连数学都要算上。
而 网络 和 数据库,按我的原意,应该是程序语言、数据库、网络作为三个并列的知识领域,为了图的紧凑型,所以把数据库和网络竖起来了,但我觉得数据库和网络并不是构成软件开发的必要基础,可以选修。
veriguoguo 发表于2009年10月9日 17:55:12
我认为“工具”和“扩展API”不应该并排的列在最上层。自下至上,各个环节应该有不同的工具。扩展API也只是一种方法。
答:
您对于工具的看法有道理,在软件开发过程中,合适好用的工具也是很有重要的。
至于“扩展API“,我的意思是各种从语言基本KPI扩展出来的API,比如apache-commons系列,这些有选择的使用和学习即可。