前些天有个计算机系的同学和我聊天,想在暑假做个人网站,博客之类的系统,我劝他说计算机系的学生(其实不止是计算机系,可以扩展到所有热爱编程的在校同学)应该有更高的雄心壮志,去挑战更有难度的东西。
为什么这么说呢?因为我大学时吃过亏啊!
我也是读计算机系,上学的时候迷迷糊糊的,把计算机系的基础课程学得一塌糊涂。
计算机基础课被灌输了一大堆的术语和概念:进程、线程、信号量、分段、分页,关系代数,关系演算,范式,E-R模型,事务,分层模型,TCP/IP,CSMA/CD,路由协议。考试完就忘了,就还给老师了,反正和实际也联系不起来。
对了,还有C语言,老是抱怨它没有办法实现漂亮的界面,运行结果在一个黑糊糊的窗口中,做不了有用的东西。
我那个时候在忙乎啥呢?主要学习怎么样用VB做桌面系统,怎么样用HTML,JS去做网站,主要就这两件事,小项目确实折腾了好几个,但是技术水平一直停留在应用层的最表面。
工作多年以后回头看,基础太重要了,大学期间有大块的学习时间,没有把这些计算机基础知识学好实在是太可惜了。
所以如果你是在校的同学,不要去折腾博客系统,在线商城这些简单的东西了,你应该有更高的雄心壮志:要努力地去造轮子,造这些计算机基础的轮子。
为什么要造轮子?因为基础课有点枯燥,概念太多,和实践联系太少,教材也不怎么样,如果老师再照本宣科,那基本上就完了。
通过造轮子的方式驱动、可以引领对这些基础知识的学习。
现在至少有这些轮子可以供你选择:
数据库
关系数据库是软件开发中最常见的一个组件,它的工作原理是必然要掌握的,造一个轮子涉及到这么多知识:
1.实现对SQL的解析,你需要实现一个语法分析器,《编译原理》的基础知识就用上了。
2.数据需要保存到硬盘上,你需要考虑存储引擎,涉及到《操作系统知识》需要对外提供接口,设计数据结构,《数据结构》的知识就会用上
3.需要实现索引,B+树是必须的,又是数据结构
4.需要做表的Join,事务的ACID,又有各种算法
5.如果需要提供网络访问,还要涉及到socket等计算机网络的知识。
可能会觉得有点难,但是现在有一个开源的例子:SQLite,核心代码只有几万行左右,网上相关的小书,文章多如牛毛,官方的文档写得也很棒,例如这个讲SQLiteArchitecutre的文章: