[转载]基础的重要性(程序员之路)
基础的重要性(程序员之路)
学习编程有几年了,感觉走了不少弯路,而不少的学弟学妹又在重蹈我当初的覆辙,不免有些痛心。最近在网上也看了许多前辈们的经验建议,再结合自己的学习经历在这里谈谈基础的重要性,希望帮助大家少走些弯路。
什么是基础呢?就是要把我们大学所学的离散数学,算法与数据结构,操作系统,计算机体系结构,编译原理等课程学好,对计算机的体系,CPU本身,操作系统内核,系统平台,面向对象编程,程序的性能等要有深层次的掌握。
初学者可能体会不到这些基础的重要性,学习jsp,donet,mfc,vb的朋友甚至会对这些嗤之以鼻,但是一开始没学好基础就去学jsp或donet会产生很坏的影响,而且陷入其中不能自拔。我上大二的时候还对编程没什么概念,就上了门C++也不知道能干什么,老师说MFC也不知道是什么东西,看别的同学在学asp.net就跟着学了,然后就了解到.net,j2ee,php是什么了,就觉得软件开发就是用这些了,而上的那些专业课又与我们学的sqlserver啊,css啊,ajax啊,毫无关系,就感慨啊,还不如回家自学去就为一个文凭吗?还不如去培训,浪费这么多钱.于是天天基本上没去上什么课,天天就在做网站,几个学期就做了三个网站。感觉做这些网站就是学到些技巧,没什么进步,这些技巧就好比别人的名字,告诉你你就知道了,网上也都可以搜到。那时候就觉得把.net学好就行了,搞j2ee的比较难,搞api编程就别想了,操作系统更是望尘莫及了。后来随着学习的深入和看了网上许多前辈们的建议才对这些基础的重要性有所体会。
虽然.net或java的开发并不直接用到汇编,操作系统这些,但是不掌握这些基础是有很大问题的,因为你只知其然不知其所有然,在mfc和.net里面控件一拖什么都做好了,很方便,但是出了问题可能就解决不了,有些在网上搜都搜不到。这就是基础没打好,不知道它的原理就不知道出错的原因。在学.net的时候常会讨论那些控件该不该用别人说尽量别用也不知道为什么?不让用是因为你在高层开发,你不知道它的原理出错了你可能解决不了,但其实是应该用的,不然人家开发它干嘛,但要在了解它的原理后去用就会很方便。
要编写出优秀的代码同样要扎实的基础,如果数据结构和算法学的不好,怎么对程序的性能进行优化,怎样从类库中选择合适的数据结构。如果不了解操作系统,怎样能了解这些开发工具的原理,它们都是基于操作系统的。不了解汇编,编译原理,怎么知道程序运行时要多长时间要多少内存,就不能编出高效的代码。
如果没有学好基础一开始就去学.net,java这些越往后就会觉得越吃力,它们涉及的技术太多了,而且不但在更新,对于三层啊,mvc,orm这些架构,你只会用也不明白为什么用,就感觉心里虚,感觉没学好。而你把面向对象,软件工程,设计模式这些基础学好了再去看这些就可以一不变应万变。
大家不要被新名词、新技术所迷惑.NET、XML等等技术固然诱人,可是如果自己的基础不扎实,就像是在云里雾里行走一样,只能看到眼前,不能看到更远的地方。这些新鲜的技术掩盖了许多底层的原理,要想真正的学习技术还是走下云端,扎扎实实的把基础知识学好,有了这些基础,要掌握那些新技术也就很容易了。
开始编程应该先学C/C++,系统api编程,因为它们更接近底层,学习他们更能搞清楚原理。学好了C/C++编程和基础,再去学习mfc,.net这些就会比较轻松,而且很踏实。假设学习VB编程需要4个月,学习基础课程和VC的程序设计需要1年。那么如果你先学VB,再来学习后者,时间不会减少,还是1年,而反过来,如果先学习后者,再来学VB,也许你只需要1个星期就能学得非常熟练。
教的表面看来是马步冲权实则都是内功心法,郭靖拜师洪七之后开始练习降龙十八掌凭借的就是这深厚的内功,吞食蝮蛇宝血又加上练习了周博通传授的九阴真经和外加功夫双手互博技之后,终于练就行走江湖的武功,由此可见马玉道长传授给了郭靖的是最基础的,也是最重要的观念,编程也好比盖高楼,根基没打好早晚有一天会挎掉的,而且盖得越高,损失也越惨重。这些底层知识和课本不是没有用也不是高深的不能学,而是我们必须掌握的基础。
这些是个人的愚见,说的不是很清楚,大家可以看看这些前辈们的经验,相信看完后大家一定会有所体会说了这么多无非是想告诫大家要打好扎实的基础,不要只顾追求时髦的技术,打好基础再去学那些技术或是参加些培训,对自身的发展会更好的。基础这么重要怎样学好它呢?我觉得学好它们应该对照这些基础课程所涉及的方面,多看一些经典书籍,像算法导论,编程珠玑,代码大全(具体介绍在本论坛每本书的版块里)等,这些经典书籍不仅能帮助我们打好基础,而且对我们的程序人生也能产生莫大的影响,相信认真研究看完这些书籍后,我们的程序之路会十分顺畅。然而这些书籍并不好读,有些甚至相当难读,国内的大学用这些书当教材的也不多,这些书又偏向理论,自己读起来难免会有些枯燥无味。于是就想到建一个论坛,大家共同讨论学习这些书籍,就会学的更踏实更牢固更有趣,这样就能
为以后的学习打下扎实的基础。
1.为计算机初学者或基础不太扎实的朋友指明方向,要注重内功
2.为学习者推荐经典书籍,指明应看哪些书籍,怎样练内功
3.为学习者提供一个交流的地方,更容易学好,不会那么枯燥
4.对每本书分章分别讨论,更专,会学的更踏实更牢固
5.讨论的都是经典书籍,每一本都会让我们受益匪浅,对每本书分别讨论是很有意义的。
1.计算机科学概论
计算机科学概论
2.计算机数学基础
高等数学
线性代数
概率论与数理统计
离散数学及其应用
离散数学教程(北大版)
什么是数学
具体数学:计算机科学基础
3.C语言
谭浩强C程序设计
C primer plus
The C programming language
C和指针
C专家教程
C陷阱与缺陷
c语言解惑
C标准库
你必须知道的495个C语言问题
4.算法与数据结构
数据结构(清华版)
数据结构与算法分析—C语言描述
编程珠玑
编程珠玑II
算法导论
计算机程序设计艺术卷1
计算机程序设计艺术卷2
计算机程序设计艺术卷3
5.电子技术基础
模拟电子技术(童诗白版)
数字逻辑与数字集成电路(清华版)
6.汇编语言
汇编语言(王爽版)
80X86汇编语言程序设计教程
Intel汇编语言程序设计
IBM PC汇编语言程序设计(国外版)
高级汇编语言程序设计
保护方式下的80386及其编程
黑客反汇编揭秘
Windows环境下32位汇编语言程序设计
7.计算机硬件原理
计算机组成-结构化方法
微机原理与接口技术(陈光军版)
计算机体系结构(张晨曦版)
计算机组成与设计硬件/软件接口
Intel微处理器结构、编程与接口
计算机体系结构(量化研究方法)
编程卓越之道卷1
编程卓越之道卷2
深入理解计算机系统
编码的奥秘
8.数据库系统原理
数据库系统概念
数据库系统导论
数据库系统实现
9.编译原理
编译原理(清华第2版)
编译原理及实践
编译原理:原则,技术和工具
现代编译原理-C语言描述
高级编译器设计与实现
10.操作系统原理
操作系统概念
现代操作系统
链接器和加载器
程序员的自我修养:链接、装载与库
自己动手写操作系统
操作系统设计与实现
11.计算机网络
计算机网络(Computer Networks)
TCP-IP详解卷1
TCP-IP详解卷2
TCP-IP详解卷3
用TCP/IP进行网际互联(第一卷)
用TCP/IP进行网际互联第二卷
用TCP/IP 进行网际互联第三卷
12.软件工程和面向对象程序设计
C++编程思想卷1
java编程思想
软件工程(Software.Engineering)
软件工程:实践者的研究方法
深入浅出面向对象分析与设计
head first设计模式
道法自然:面向对象实践指南
面向对象分析与设计
敏捷软件开发:原则、模式与实践
设计模式:可复用面向对象软件的基础
测试驱动开发
重构—改善既有代码的设计
代码大全
程序设计实践
程序员修炼之道:从小工到专家
卓有成效的程序员
代码之美
人月神话
计算机程序的构造和解释
观止-微软创建NT和未来的夺命狂奔
代码优化:有效使用内存[美]克里斯·卡巴斯基
编程高手箴言(梁肇新)
游戏之旅-我的编程感悟(云风)
13.windows编程基础
Windows操作系统原理
Inside Windows 2000
深入解析Windows操作系统
天书夜读:从汇编语言到Windows内核编程
windows程序设计
WINDOWS核心编程
14.linux/unix编程基础
鸟哥的Linux私房菜:基础学习篇
鸟哥的Linux私房菜:服务器架设篇
linux程序设计
UNIX环境高级编程
Unix网络编程卷1
UNIX网络编程卷2
UNIX编程艺术
UNIX Shell范例精解
15.Linux/unix内核源代码和驱动程序
Linux内核设计与实现
LINUX内核源代码情景分析
深入理解LINUX内核
Linux内核完全注释
Linux设备驱动程序
16.C++语言
C++编程思想2
Essential C++
C++ primer
C++程序设计语言
C++语言的设计和演化
Accelerated C++
Effective C++
More Effective C++
Exceptional C++
More Exceptional C++
C++设计新思维
深度探索C++对象模型
C++沉思录
C++ Templates: The Complete Guide
C++ FAQs
17.标准库STL使用
C++标准程序库
Effective STL
泛型编程与STL
18.STL源代码
STL源码剖析
19.java语言
java编程思想
Java编程规范