<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt; mso-ascii-font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-hansi-font-family:"Times New Roman"; mso-font-kerning:0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->
人的能力也有一个架构存在,每个的能力架构都不一样,有的人能力架构比较合理,有的人则不那么合理,合理的能力架构能让较少能力元素(知识、技能、方法等)发挥出较大的作用,不合理的能力架构会浪费人的能力,让所学无所用。
什么样的能力结构是比较合理的呢,这不是一个简单的问题,这里我根据自己的经验总结提出一个参考模型,这个参考模型采用我们常见的分层架构模式。我认为一个软件开发人员的能力大体应该分为四个层次:
最高层:过程控制和管理 |
第三层:方法、思想和理论 |
第二层:具体技术、语言和工具 |
最底层:基础原理、基础知识 |
层与层之间存在一定的关系,上一层必须以下一层为基础,而上一层又反过来影响下一层。
最底层是基础原理和基本技术:包括计算机原理、电路、数据结构、数据库原理、编译原理、操作系统等。这些知识是很基础的有了一定的基础才能更好的学习其它能力。
第二层是具体技术、语言和工具,包括各种编程语言、开发环境、数据库、开发框架等。很显然,一般情况下要学习第二层的内容必须要有以最底层的能力为基础, 当然也有人没有任何基础就能学习第二层的能力,但是一般这样学习效果很差,知其然不知其所以然,遇到一些问题也会不知所措。另一方面第二层的学习又会反过来影响最底层的能力,它能巩固基础知识的学习,能暴露出你在基础方面的不足,还能驱动你对基础知识的学习。当我还是个程序员的时候,学习的内容主要集中在这两个层次。
第三层是方法、思想和理论,包括面向对象思想、设计原理、设计模式、需求工程、UML等,同样第三层的能力也要以第二层为基础,具个例子来说,要学习面向对象的设计方法首先要学会一门面向对象语言还要会使用case工具,同时第三层的能力又会反过来影响第二层,好的方法能更好的发挥你的技术,还可以弥补技术的不足,举几个例子来说,设计做的好是不是写起程序来很轻松,断言、单元测试这些方法能让代码的质量达到前所未有的高度。
最高层是过程控制和管理,这个层次的能力通常涉及时间跨度和团队协作,包括项目管理的能力,软件过程的控制能力、版本控制的能力、需求管理的能力等。同样这一层次的能力也要以第三层的能力为基础,举例来说,如果软件没有好的架构,那不管采用什么过程最终都会一团糟,而良好的设计能力,再加上迭代的开发过程、严格的版本控制,就一定能开发出优秀的软件。
通过这个模型我们不难看出,一个优秀的软件开发人员各个层次的能力应该是比较均衡的,并且这些能力不应该是独立,它们应该能组合在一起发挥出整体性的威力。
通过这个模型也可以指导我们的学习过程,一般地,我们应该先掌握下一层的能力再掌握上一层的能力,但又不能只停留在下一层。我见过不少大学生,刚开始工作就学习项目管理,还一些做项目N年的前辈,能够把类库倒背如流,还不知什么是UML、什么是内聚、藕合和粒度。我觉得这都不是好的现象,我认为能力的学习也应该采取迭代的方式,我们先要打基础,但也不需要打一个完美的基础,我认为打个三成就够了,然后就可以尝试学习上一层的的能力,可能你会掌握一成上层的能力,这时会发现基础还比较薄弱,然后再带着你的问题来补基础。如此反复,当你上一层的能力也达到三成时,又可以尝试再上层的学习。这时就把上一层当成是基础再上一层当成是上层。如此反复直到你爽了为止,哈哈。
整个过程是迭代式学习的,可以来回跳跃学习,不懂的再回到下层来补。
从业务理解上分层:
最低层:实现简单的提交,保证数据能进去。
中:学会理解单个模块,并且能够考虑到一些安全性。
高:能够把整个业务有效的和单个模块结合。
最高:能够多个纬度得理解业务,并正确有效的架构设计,并且产品化,能够指导整个行业发展。
自己1,2层的很多基础还不是很扎实。当涉及到一个大点的系统,模块多点,感觉又没办法控制住了,线程太多,服务设计的很乱,这些应该在3层来学习。比较难,多看看不错的源码应该有助于这一层的学习了(如:Linux kernel, MySQL, Apache, Berkeley DB, ......)。
如果把学习当作一个项目的话那应该用螺旋模型而不是线性模型来处理。