朱晓祥:做个操作系统吧,一个程序小白的大神路
2019年10月9日
9:07
简介
朱晓祥,2015年电子科技大学计算机学院本科入学,2019年电子科技大学攻读研究生。bitman(紫宸的曾用名)成员。
说起小朱,我觉得他的成长过程对我们众多同学们很有启发意义。
记得小朱拿着做好的画板练习给我看时,说话声音很小,显得没有那么有自信心的样子。那时,他二年级就刚会写C语言。然后,我将写病毒的教程让他做(这个难度非常大,需要学习汇编,计算机组成原理,操作系统…,)。开始,我问他进展怎样时,他问我一个技术问题。我告诉他,一定要自己解决。尽最大努力解决。能进成电的人,脑子都差不多,主要是敢不敢面对问题死磕。然后,他就再没问我问题。大约两三个月后,他完成了病毒教程的所有代码来找我。
我说,咱们了做个逆向吧。这是个破解的中等难度的题目。他从来没有专门学过逆向。两三天后,他又来问我。经过各种工具捣腾和分析后,他已经找到了症结,但还有一个点搞不定。我没有直接告诉他答案。带有提示性的引导了一句,并说,你一定能够想出办法。结果两天后,他真的就搞定了。
然后,他就自己照书去做操作系统了!用了几个月就完成了这种教学性的操作系统。什么概念呢?我来告诉大家吧,许多研究生毕业时,操作系统在他们头脑里就是些名词的组合。不要说写内核代码,看也没有看过,甚至,系统的API编程也没怎么深入过。
记得有一次,bitman(紫宸的曾用名)每周的演讲和讨论会上,小朱介绍了自己写的操作系统内核的一个功能:写拷贝。这是进程间共享内存,如果共享的被修改了,就给要写的进程拷贝一分副本内存页,而不修改共享的。李林老师问小朱,你用了多长时间写的?他说,就是暑假里,觉得没有事干,想起了这个功能,花了两天就实现了!李林老师当时都不住点头。
小朱有一个很好的特点,就是喜欢动手去用代码验证他所学的知识。比如这个写拷贝功能的实现。再比如,有一次,他旁听到我给低年级同学们将画板里的一个设计模式的优劣(他当时都做过画板了)。结果,他自己按新的思路修改了以前的程序。有一次,我只是在闲谈中提到应该自己写个加载器,又是过了一段时间,他说他已经完成了。他就是这样,一点点不断的知行合一,慢慢地成长起来。
从编程小白,称为了技术非常坚实的家伙。上半年,他在QQ中给我发消息
“韩老师,今后我就会去侯老师那边干活了。大一能够加入bitmen得到您的指导实乃吾之所幸,师恩难忘,遂留言与此。”嗯,韩老师挺感动的。生命如逝水不返,愿这些小朋友们有一段精彩、快乐而无愧的人生。
(注:关于大学期间是否应该关注自己社会和与人相处的经验的问题。小朱的意见稍微有点偏颇。其实,我们认为与人沟通和交流是非常重要的能力。比如bitman(紫宸的曾用名)就每周要开会演讲,训练大家的表达。还请过企业的教师来给同学们充实这方面的能力。不过,为了保持小朱的本身的想法和意见,也作为一个多样化的案例,我就按他的愿意发布出来。不删减了)
刚入学时你获取会有这样的疑问,我该不该加入学生会,加入社团?作为过来人,我的感受是,作为计算机专业的你,专业能力绝对是第一位的。如果你真的想在大学四年里学到实实在在的知识和技术,学生会、社团只会浪费你的学习时间!我身边有一个学生会的同学,大量的时间都花在了各种学生工作上,但是他也收获了很多人际关系。所以,最重要的是知道自己想要什么,如果你想学习技术,提升能力,趁早打消做学生工作的念头!你也许会疑惑,没有学生工作经验的话工作上会不会吃亏?除非你想当公务员,进入体制内,这样的话学生会的工作经验或许会有用。不过计算机专业的同学从事的都是技术类工作,面试官只会在乎你的专业功底,至于你是不是加入过学生会、当过什么学生干部,他们并不在乎!读研究生也是一样的,老师需要的是能做实事的学生,不会在乎你的学生工作经验的!总之,想学习知识,想提升技术能力,那就把课余时间放在正确的地方,而不是浪费在一些无关紧要的琐事上!当你的专业能力达到一定水平,不论工作还是深造,你都将畅行无阻!
既然学生工作对自身专业能力的实质性提高没有半点帮助,那么专心学好学校的课程就万事大吉了吗?这不是废话嘛,如果真是这样的话,那么毕业时岂不人均技术大神了吗?学校设置的大多数课程都只会教你理论知识,动手实践的部分就需要你自己完成了。有的人把学校的课程学得非常好,但是代码能力欠缺,有的人又反了过来。真的的牛人一定是把学校的理论课程学好的同时,充分利用课余时间提升工程能力,正所谓学以致用,用以致治学,尽量把你学习到的书本知识转换成代码。计算机是一门实践性很强的学科,把课程中的理论知识学好、绩点全满,不代表你就是一个够格的计算机专业的学生。以前学习计算机网络这门课,我就自己动手实现过端口扫描、ping、ARP欺骗攻击。至于操作系统这门课,你可能只能在课堂上学到一些理论、概念。如果不是加入了Bitman(紫宸的曾用名),我是不会有写一个操作系统的打算的。保护模式是现代操作系统的基础,可是学校对这一块内容是不要求的,最多微机原理这门课上提到一下而已,而我们学校的微机原理课程只要求你掌握一些简单的8086/8088汇编,所以大部分同学直到毕业也没有接触过保护模式汇编,这对于理解计算机底层系统的概念是一大灾难!在自己动手写操作系统的过程中,我正是参考《一个操作系统的实现》《x86汇编语言 从实模式到保护模式》,从最底层的保护模式开始学习,自底向上搭建出整个操作系统内核框架——中断处理过程、进程调度、段页式内存管理这些概念都将通过一行行代码落到实处。所以想成为高手,就不能满足于学校的这点课程。
自己动手写操作系统听起来是一件很厉害的事情,后来我和别人说起,他们都觉得我很牛。可是我大一加入Bitman(紫宸的曾用名)时真的只是一个小白,只会一点C和Java,听说要写一个画板时我是很懵的,最后也只是勉强用Java做了一个出来,不过后来还是用C++实现了一个完整的。
之后就开始了病毒相关的练习,真正的零基础学汇编,边学边用。病毒的练习积累了汇编编程的基础,整个过程是一个“用以致学”的过程,需要什么学什么,所以不能形成系统。因此我后来又参考王爽《汇编语言》系统地学习了8086汇编,有了之前的积累,学习速度是很快的,就像已经准备好了砖头、水泥,只差把它们搭建成楼房。至此我已具备了写操作系统的技术功底,不过这也是一个漫长的过程,需要的是两三个月不懈坚持。
真正的计算机牛人一定是从底层到顶层都摸得非常清楚的,不能说我是做底层做系统的,就可以忽视上层应用技术,也不能因为我是做应用层开发的就可以不关心底层。学习底层的目的不一定是说你以后就得从事底层开发或是安全相关的工作,真正的目的是培养系统思维。当你面对一坨抛出了古怪异常的代码,如果你的脑海里能浮现出程序背后的内存图景,那么你就不再是一个只会coding的码农了。