每隔一段时间,就会收到些类似的消息:

怎么学好软件开发? 我已经学完了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系列,这些有选择的使用和学习即可。

技术族谱:软件开发相关知识体系的整理心得(图)相关推荐

  1. (转载)技术族谱:软件开发相关知识体系的整理心得(图)

    每隔一段时间,就会收到些类似的消息: 怎么学好软件开发? 我已经学完了A,我接下来该学B还是C? 其实这样的问题,真的是一言难复.如何学习,是一个很复杂的话题,尤其是眼下业内的技术名词日新月异,乱花迷 ...

  2. 《精益软件度量——实践者的观察与思考》—第1章1.1节精益软件开发的度量体系...

    本节书摘来自异步社区<精益软件度量--实践者的观察与思考>一书中的第1章1.1节精益软件开发的度量体系,作者张松,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  3. 软件开发的能力体系及锻炼

    (摘自<learn-with-open-source>,网址:http://www.teamhost.org/projects/learn-with-open-source/wiki/St ...

  4. 【黄啊码】老师,高考后我想选软件开发相关专业,你觉得选哪个方向好?高考志愿怎么填报?

    今天恰逢是高考的时间,昨天有个同学问我:老师,高考后我想选软件开发相关专业,你觉得选哪个方向好?高考志愿怎么填报?那么今天黄啊码就先来跟大家科普一下软件工程专业及其就业前景. 软件工程专业包含: 软件 ...

  5. 【软件开发底层知识修炼】二十二 ABI-应用程序二进制接口 二

    上一篇文章学习了ABI的相关内容,具体最后分析了不同ABI下结构体的对齐方式的不同.点击链接查看上一篇文章:[软件开发底层知识修炼]二十一 ABI-应用程序二进制接口一 本篇文章继续学习ABI相关内容 ...

  6. *Java软件开发面试知识整理*

    Java软件开发面试知识整理 围绕以下几点回答问题:是什么.为什么.什么时候用.项目实现.解决什么问题.遇到的困难 谈谈你对Java和C的理解? Java: 面向对象.Unicode:可以跨平台(JV ...

  7. 软件开发工程师知识_您作为软件开发人员的知识组合

    软件开发工程师知识 This article is my take on the chapter with the same title from the brilliant book The Pra ...

  8. 【软件开发底层知识修炼】二十四 ABI之函数调用约定

    上一篇文章学习了Linux环境下的函数栈帧的形成与摧毁.点击链接查看相关文章:软件开发底层知识修炼]二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁 本篇文章继续学习ABI接口相关的 ...

  9. 【软件开发底层知识修炼】二十 深入理解可执行程序的结构

    上一篇文章记录了GDB调试从入门到熟练掌握的学习全过程.点击链接查看:[软件开发底层知识修炼]十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录 还记得在以前的学习Binutils工具的时候,学 ...

  10. 【软件开发底层知识修炼】十八 快速学习GDB调试五 使用GDB进行调试的一些小技巧

    上一篇文章学习了如何使用GDB进行函数调用栈的查看:[软件开发底层知识修炼]十六 快速学习GDB调试四 使用GDB进行函数调用栈的查看 本篇文章是GDB调试快速学习系列的最后一篇.将综合前几篇文章做一 ...

最新文章

  1. 协方差矩阵有什么意义?
  2. jsp页面生成验证码且验证
  3. 第十六周 个人项目开发流程
  4. 文件上传到ftp服务工具类
  5. 2020-12-01 Halcon初学者知识[1] 初始界面
  6. Cannot resolve de.codecentric:spring-boot-admin-starter-server:2.4.0-SNAPSHOT
  7. etcd v3 集群——简单配置
  8. Hexo+GitHub 快速搭建个人博客(二)---- 域名解析
  9. x86 和 ARM 谁能主宰服务器市场?Linux 之父和 Redis 之父有分歧了
  10. Python多线程同步、互斥锁、死锁
  11. windows下安装cygwin以及SeismicUnix在cygwin下的安装(windows下安装linux环境,非虚拟机、非双系统)
  12. Vue 应用性能优化指南(转)
  13. sql取系统时间减一小时_Java秒杀系统实战系列-整体业务流程介绍与数据库设计...
  14. eigen之eigen中文文档
  15. java学习之Eclipse开发工具
  16. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GR
  17. Python 为何能坐稳 AI 时代头牌语言
  18. 淘宝网店商品哪个时间段是最佳上架时间?
  19. mysql组合索引,abc索引命中
  20. Kubernetes----Job控制器

热门文章

  1. 企业级服务器固态硬盘,企业级硬盘和固态硬盘有什么区别
  2. 嵌入式单片机学习入门到大牛
  3. 百面机器学习(5)——非监督学习
  4. QT使用openg离屏渲染到纹理并存到opencv的mat中
  5. SEM和SEO有什么区别,哪种更好一些
  6. ElasticSearch文档检索,分词、精确匹配、多条件
  7. android 开发者模式进入
  8. 2017年CSTQB/ISTQB认证考试时间表
  9. 【组合优化】旅行商问题Traveling Salesman Problem(TSP)-概述
  10. 云计算基础与应用 第五章 云存储