自己有个习惯,从高中开始就喜欢利用少许时间在百度知道回答感兴趣的问题,并且完全原创(经过多年,各种形式问答已经是我的最大兴趣之一,我也对旁人提出的问题具有较高敏感度),大致7年间发现很多人有志于从事软件开发方向,他们有的是在校大学生,有的是高中生感兴趣,有的是在校初中生就想学习编程,或者毕业后想转行到编程,有基础好的,也有基础很一般的,他们的问题大致都可以笼统的归结为两类: 1 T, u$ K' |( ]3 q% i+ ~% a& e9 S$ N& k3 W+ W
1:理论细节和技术细节等5 d$ _1 ?& y& U: m& I) [1 w8 U
6 [) w: \1 {1 H* q 2:总体学习方向和方法7 A s" A$ d) ?
8 I% P+ O* G! y3 u1 U
对于第一类,是见招拆招,自己熟悉的领域一般能给出精彩回答,自己暂时不熟悉的分支领域则尽量不回答或者以经验和推测的形式引导他们参考某些Helper。 ( M) l. h) l3 _. Q! [0 u0 i# A I5 A' u/ S
对于第二类,由于各个计算机分支领域多少都是相通的,所以我可以给出自己的综合分析结论作为建议给他们参考。6 `8 h, G7 o$ Z4 r1 c5 t
) O; ?. ~; r) z3 O$ X K7 p$ K
第一类好解决,会就是会,没碰过的就给人指大致方向和思路;第二类则是定位+心理预期问题,良好的定位是成功的一半(不排除某些人没定位,直接刻苦投入,也能走得很远)。 " T9 z; N# ~* K/ o, x; \0 e7 @ b2 m! q/ v- |
1 l& y0 K3 y9 E% P3 d& k' g
0 S* i/ M3 I) }7 }" b1 s* a 此篇文章重点希望通过全景鸟瞰+分支细节该如何顺序去学习,来构造一个较为通用的指引。1 J7 \" D. n! P: K
- r3 v k( t* P9 I1 T 0 o, H; j, Q/ Y : q" D$ `7 X7 p4 y& L2 T u* q# S }, i/ g9 b- U
( I1 h# A+ h$ j R. a①、计算机专业领域一共有几个大方向,十几个分支方向,而每个分支方向又有几十个小方向,每一个方向的深入学习与熟练到一定火候都不是一朝一夕,互相之间也不是完全没联系的,但是无论是初学者还是中前期学习者都应该选择一个大方向并在其中的一个小方向内深入(为什么要这么早就选择具体的分支方向?后面说)。/ U }# g* o+ Z+ m7 D
9 Y" f3 r8 r! I②、这里列出计算机的几个大方向(非编程开发类的我就不说了): $ S% K$ B4 Y9 ]3 C( v 基本方向:1 c" w2 ^ n* w% z
1、单片机、嵌入式方向 % ^, n( m1 U- K' _ 2、网络编程:涉及到服务器程序、客户端开发、脚本设计等。9 F* a( |" U/ @7 Z
3、系统编程:基础API开发、桌面开发、系统程序开发、服务程序" ^" L8 { e; I$ h$ o# ]
4、图形学:3D、2D、图像识别、人脸识别 " y/ J6 m+ l% T4 Z9 w- {9 i, M) h. n0 m 5、音频:语音识别、音频解码、音频软件0 g4 D* u- Y2 | v& O5 n
6、编译原理:编译器设计、脚本解释器、虚拟机、非自然语言翻译系统* L$ S( ?% X7 K1 P1 V# V
7、应用层开发:利用高层语言去开发表层应用 0 K7 i) b6 \+ M0 a2 B
8、安全:反工程、病毒、反病毒、木马、反木马、软件破解、软件加壳 / u0 L6 ^, T- K2 g* ]5 v @' ~ 附加方向:0 J8 M0 H( ^4 S
9、人工智能:遗传算法、神经网络、灰色系统等等; K: Y4 F# M5 _* x' C# V" U4 A
10、游戏设计:各种游戏引擎设计以及业务逻辑设计等+ L8 C2 r4 ~6 V/ o3 H
* x2 L- K: q. Z x+ ^③、基本方向是学习者一定要选的,附加方向只是基于基本方向的一些锦上添花,但是不管学习者怎么选,最开始某些东西一定要深入而不是只是懂就够(当然学习者对自己要求不应该低),我把这个列出来:- F8 @0 D/ Z$ v0 z+ w
: q/ \5 w' V7 ~0 B7 m; } 数据结构:下面其他理论的基础。(必看:《算法导论》 Q" q5 [/ _% @* } 操作系统原理:理解操作系统的架构和细节,学习者才能对以后关于多线程、文件管理、内存管理、指令优先级等有一个正确理解和运用。(必看:《操作系统:精髓与设计原理》% R; C8 L: H X3 ?. k" |0 s
编译原理:能够升华学习者对计算机编程语言的理解,对以后出现的各种编译、解释、兼容、移植、优化、并发与并行算法等有一个深入理解。(必看:三本圣经和《PT》,哪三本具体百度. l8 ]9 @6 t: @) S+ D
数据库系统原理:这个是进入公司都要会的,也是大型软件开发的基础。(这就有很多经典,但都不是必看的,具体douban$ f2 D; C4 w% @8 B" P; l2 x
软件工程:这个是学习者能够在经验不足还能保证大项目正常完成的理论基础。(设计模式能够有助于软工的架构设计,一定要看3 L+ h! D; F6 D, n0 |/ S2 v( ]
网络技术:这个是必须学的,因为目前几乎没有一款装几率很高的软件或者平台跟网络无关。(很多很牛的书,具体douban. d5 F4 i! x# s+ R
: T6 P+ \$ z, G; r- B- E1 ~
数学的话,主要是:离散数学、线性代数、高等数学、计算机图形学、概率论(各自都有很牛很好的书以及习题,具体douban 9 D+ ` {/ W8 j# ~, x) \& O 9 h' I1 i4 M. _5 a. q) P0 J - ?+ G n$ R3 ^/ B 以上几个基础就是学习者成为一个融汇各个主要分支牛人必须学的(当然不是指理论,而是理论+实践编码能力)4 B7 L) k& T( L5 J, B9 [