来大学也快三年了,学习探索编程也有两年了,感觉自己走了些弯路,而不少学弟学妹又在重蹈我的覆辙,感觉心里有些不是滋味。想分享一下自己的经历,希望能够帮助一些同学少走弯路。
什么是基础?那就是我们学的数据结构,操作系统,计算机网络,线性代数等。记得自己在大二上开始学习javase,javaee,html,css,js,学习数据库mysql,oracle,感觉软件开发就是这些了,但是发现自己上的课和自己学的东西联系不大,就觉得大学好无聊,学的这些东西和大学学习的不搭边,大学尽学些过时的(C语言觉得也没有什么用),上个培训机构就好了,而且还不用这么浪费时间,后来随着学习的深入逐渐发现自己越学越不懂,(java多线程编程就学不懂)越学越笨,头脑也不灵活了,感觉学习做网站很多就是在学些技巧,没什么进步,就是来回调用人家编好的类,import人家的包,有时候自己效果做出来了,自己却不知道怎么回事。程序不出问题还好,一出问题就无法解决了。因为自己只知其然不知其所以然,调用人家封装好的库,感觉很方便,但是不知道它的内部机制,所以出了问题就无法解决。
到了大二下的时候自己放弃了以前学的那些东西,重新开始学习底层知识,重新复习C语言,数据结构,汇编语言,自己了解计算机组成原理,开始学习操作系统,计算机网络,学习的过程中感觉以前的很多疑惑都解决了,以前不理解java多线程编程,后来学了操作系统之后感觉java多线程编程原来很简单,通过这些学习,认识到了C语言的重要性,java为什么能够跨平台,那是因为它有个java虚拟机,java虚拟机是用C语言写的,正是java虚拟机的平台相关实现了java的平台无关,以前很傻,以为tcp/ip协议是硬件,后来才发现原来它是操作系统内核的一部分,而操作系统就是C语言写的,数据库管理系统也是用C语言写的,各种服务器,只要对性能要求高,也是用C语言写的,很多编译器也是用C语言写的,感觉C 真的很强大,这些东西才是本质的东西,感觉深入学习了操作系统之后,学习其他的会容易很多,我们不会去开发操作系统,不会去写编译器,但是它们里边有很好的思想值得学习,而且一些概念理解之后对学习其他的东西也有帮助,拿编译原理来说,我觉得正则表达式肯定用了编译原理里边的词法分析,语法分析的一些思想和知识。
要想编写优秀健壮的代码也需要扎实的基础知识,如果数据结构和算法学不好如何对程序进行优化?我们从高级语言怎么能看出程序运行时候的运行栈?只有看汇编代码才能知道程序运行时的运行栈如何组织,缓冲区怎么溢出,漏洞如何预防。由此我也觉得如果你想从事网络安全,基础更是重中之重。最近在学习网络编程,有些东西不理解,追根溯源发现是TCP/IP理解不够深入。
由此可见,基础十分重要,所以一定要重视基础。
加强基础的好书推荐:
C语言方面:C程序设计语言(公认经典),C和指针,C专家编程。
Java方面:java核心技术(共两卷,适合基础学习)java编程思想(适合提高)。
C++:C++ primer,C++程序设计语言(C++之父写的)
汇编语言:国内清华大学出版的书就行。
编译原理方面:书名就是编译原理(龙书)
操作系统:现代操作系统,深入理解linux内核,linux内核设计与实现,深入linux内核架构。Unix环境高级编程(stevens撰写,unix环境下的编程圣经)。Linux设备驱动程序。
计算机网络方面:TCP/IP详解(三卷stevens撰写),unix网络编程(stevens撰写,C语言套接字编程的权威经典),用TCP/ip进行网际互联(三卷)。深入理解linux网络技术内幕。
算法和数据结构:数据结构与算法分析C语言实现,算法导论。
其他好书:linux入门:鸟哥的私房菜,深入理解计算机系统(可以提高C语言),数据库系统概念。