仔细回顾我这些年,也有很多做得不够好的地方。希望有一些经验能帮到其他人。我觉得开始应该多接触一些操作系统,计算机组成原理,编译原理的知识,把整个计算机学科的基础打好。
总结
我觉得刚上来最重要的是开阔一下视野,感觉的那时候,说到计算机就想到ACM了,但是后来才发现,计算机领域里ACM其实只是一小部分。(不过如果想清楚确实要专心搞ACM,也挺好的。)
我觉得我那时候对我非常有用的事情是,去图书馆看了很多计算机导论的书,把计算机的几个学科之间的关系弄清楚了。那时候虽然不懂,但是也知道计算机几门核心的基础课:数据结构与算法,操作系统,计算机网络,计算机组成原理,数据库。它们具体是做什么的,什么关系也不太明白。那时候本来就对计算机感兴趣,经常周末去图书馆借书,没课的下午或晚上在图书馆找本书看,感觉就是看科普书。过了几个星期之后,尤其是理解了计算机芯片怎么从门电路到汇编语言到各种软件之后,感觉视野开阔了很多,每个方向都很有意思,值得探索。
首先当然可以多接触一些新的编程语言,多“重新入门”几次编程。可以感受到JavaScript的事件性,Go语言的并发性,Rust语言的所有权带来的安全性。同时可以思考解释型语言和编译型语言的区别。
还可以学习电脑装机,磁盘格式,多安装一些新的操作系统,尤其是Ubuntu,同时熟悉Linux的终端界面和SSH连接服务器。
其次可以入门的是Web开发。Web开发的资源很多,就和Python编程入门一样。首先它反馈性很强,学会了立刻可以给自己搞个个人网站,而且用途也很广,以后无论是课程项目套GUI,给自己写小项目,甚至未来就业都非常有用。同时它也是入门计算机网络的绝佳路径。学习路径一般是从 HTML/CSS 到 JavaScript,然后学计网和HTTP协议,写简单后端。当你把握了计网和协议,Web开发的精髓之后,各种Web框架都能很快上手了。后续学Web安全也离不开这些知识。
稍微提一句GUI,图形界面看似离我们很近,在计算机领域里其实只是操作系统里图形界面环境的一小部分内容。不过也还是值得学习的,但是建议不要拘泥于某一种语言,而是不被语言限制,走到大路上。比如Windows图形界面大可以从C#开始入门,不需要先去接触C++ Qt。然后可以尝试简单的Android开发,用Java或者Kotlin。这些都可以在图书馆借到书,在看书的过程中就有代入感了,能了解到开发调试的全流程。
相关的比赛
最近几年出现了很多新的活动和比赛,比如OSPP和计算机系统能力大赛。国内相关的学习环境确实在不断变好。不得不说,现在互联网时代,学习资源越来越多,但是也意味着必须要坚定自学的信念。
首先是一些网课。这些网课不得不说都有难度,但是也学得深入。做好长线学习的准备。毕竟自己之后也要学这些课,提前学一学,后面更轻松。学习就是这样,看不懂也没关系,继续往后看,先把能看懂的都看了。下次回来再看的时候,能看懂的更多了。多看几遍之后就可以动手做实验,写作业代码了。
- 值得学的网课
- 清华大学 向勇、陈渝老师的操作系统课:老师也积极组织开源社区,rcore也经常会有夏令营活动。
- UCore
- RCore-Tutorial 从零学习
- 编译器相关的资料
- 计算机组成原理:自己动手画CPU 这个课讲清楚了,从逻辑电路是怎么实现CPU的,关键就在于这个时序电路和寄存器,构成的每个CPU周期,每次执行不同的运算。
- 清华大学 向勇、陈渝老师的操作系统课:老师也积极组织开源社区,rcore也经常会有夏令营活动。
还有很多比赛,可以作为自己的目标而奋斗,让自己更有学习动力。其次,每个比赛作为关键词去搜,都能搜出很多相关的学习资源。
- 计算机系统能力大赛
- 操作系统赛:深入操作系统原理,借助CPU的硬件支持,调度进程,使用外设,管理整个计算机系统。
- 编译系统赛:深入编程语言原理,实现一个编译器,从高级语言转换为汇编语言。
- 龙芯杯,一生一芯项目:深入计算机硬件设计,设计CPU。
当你把视野仅仅放在国内,某种意义上都还是狭隘的。如果语言不是障碍,那么可以放眼全球的顶尖大学,他们很多课件和课程都是公开的,也是绝佳的学习资源。
最后是开源。开源是一种理念,当你发现一个软件有问题的时候,你可以从用户转变为开发者,直接debug修复,然后让原来的开发者审核合并你的修改。而且每一次这样的参与你都可以写进简历。
- 开源开发:
- Google Summer of Code & Google Summer of Docs
- OSPP:国内的类似GSOC的活动。
- Linux内核:LFX Mentorship