转:操作系统课程是如何改变我的

操作系统课程是如何改变我的

在普林斯顿大学有很多课程改变了我,就像COS 318(操作系统课程)。它极有挑战,耗时耗力,但是当我学完后回头想想,我很庆幸我选了这门课。

我当初选择这门课程的时候很犹豫,因为周围的人都这么说:

  • 操作系统课程听起来非常难
  • 操作系统课程是为那些喜欢计算机底层的人设计的
  • 操作系统课程非常浪费时间,而且你平常很少用到这方面的知识

这门课毫无疑问非常难,但是不妨暂时放下你之前听到的对它的偏见。不学它并不会毁掉你软件工程师的生涯,但是如果你真的学过了它,你将会在很多方面获得启发。我选择操作系统课程之前其实十分讨厌系统底层编程,也很害怕参加这门课程。但是现在来看,我觉得选择它是我做过最正确的决定之一。下面是我认为这门课程对我作为学生,作为软件工程师和作为问题解决者所带来的启发:

我的经验和启发都是基于普林斯顿2013年秋季的COS 318课程来说的,但是这对其他本科操作系统课程也都适用。

1.操作系统课程让我更善于调试代码错误(debug

毫无疑问,在写一个操作系统的时候,我们需要非常非常多的调试。如果你觉得你在算法课上的调试已经够难了,那你可以想想如果两次调试会产生完全不同的结果该是多么令你抓狂。

当你写的操作系统慢慢变得异常复杂了之后,你就不得不去寻找顺手的调试(debug)工具和一套科学合理的调试方法了。

在参加这门课之前,我觉得调试就是随手做一做的事情,根本不是写程序的一个正规环节。以往我调试的方法都是把所有我认为可能出错的地方都修改一遍看看,这是一种毫无技巧可言并且让人感到无聊的过程,我通常称之为“橡胶鸡调试法”(rubber chicken debugging)。在操作系统课程结束之后,调试从一门艺术变成了一门科学。我开始意识到原来存在一种科学省时的方法能够迅速精确地定位错误(bug),并决定应该采用什么样的修复方案。

这种调试方法在其他的课程或者经历中也十分有用。比如,我在Facebook做实习生的时候,我十分接受“亲力亲为”这样的代码工程理念。如果有些部分除了问题,那么就要立刻开始标记记录日志,然后一直记录查看,直到一个地方记录的结果和你所期望的结果出现了不同(这就是错误出现的地方)。这种思维方式只有那种高强度的编程课程,类似操作系统课程,才能给你的。

2.操作系统课程让我的代码更高效

操作系统课程突然让我意识到了代码的性能问题。如果这个程序运行很慢,我就会停下来想一下:到底是什么是制约性能的关键因素?CPU?内存?硬盘I/O?理解了这些基础的东西让我在高层次编程的时候让代码更快,更简练。

人们通常都认为操作系统课程只有在底层编程的情况下才会有用。但是事实上并不是这样,只有用C和汇编写过操作系统代码的人才能够更好地驾驭高级语言。

3. 操作系统课程让我变成一个更好的合作者

我们的操作系统课程有一些协作完成的项目,两个同学一组。我十分幸运在协作项目中和我两个好朋友一起工作。这种一起面对困难的经历让我们成为更好的朋友,也让整个班级同学的联系更加紧密。

由于有这些协作项目,我们变得更加善于合作。团队工作很容易陷入这么一种模式:一个人编写代码,另外一个坐在旁边看写代码。在操作系统课程上,我们的做法更加高效:两个人分别负责不同模块的实现,然后互相检查对方的代码。团队合作同时也增强了我们版本控制的能力,这是一个好的实际应用Git的机会。

4. 操作系统课程让我更高效解决问题

这是一个年轻程序员面临的最显著也是最难解决的问题:当我们遇到问题的时候,常常陷于费曼算法(Feynman Algorithm

  1. 把问题写下来
  2. 努力去想…想不出来继续努力想…想…努力…努力想…
  3. 写下来答案

采用这个方法让我操作系统前一部分的项目苦不堪言。这门课让我不得不去找一个科学的解决问题的方案。我最后想到了一种通用的做编程项目的方案,而且我把这个方法也用到了其他的计算机课程上了。它包括三个步骤:

① 任务:在这个项目中我需要完成哪些目标?我非常看重任务驱动,所以在安排我工作的时候,我会做一份清单,上面有一些划分成小块的任务目标。拿烘焙蛋糕打个比方:

  • 采购生产原料
  1. 买鸡蛋
  2. 买牛奶
  3. 买面粉
  • 准备厨具
  1. 洗碗
  2. 洗锅
  3. 洗勺
  4. 预热炉子
  5. 给锅涂脂
  • 执行整合
  1. 把鸡蛋,牛奶和面粉混合成面糊
  2. 把面糊铺到平底锅上
  3. 把平底锅放到炉子上

② 代码错误(Bugs:有哪些代码中的错误是已知的?在这个步骤中,我会跟踪代码错误和一些我尝试修复的东西。在早期的项目里,我把时间都浪费到了重复尝试可能的解决方案上和频繁遇到一样的代码错误上了。频繁追踪产生的代码错误和修复方案能够在接下来的项目中节约我很大一部分时间。

③ 问题:我有什么问题?在这部分,只要我遇到了问题,我都会把它们大致记下来。当我翻阅文档或者询问同学获得答案之后,我就会把我学到的知识记录在这。

有这么一个表格让我对我所做的项目抱有很大的信心。如果没有它,我可能现在还在花大量的时间在实验室里,虽然也可能有进步,但绝对没有我现在进步得这么明显。

结束语

操作系统课程确实是一门有挑战性的课程,但是还是建议能够参加这门课。它是我成为软件工程师路上提高最大的一门课。如果即使你学完之后甚至都不记得什么是虚拟层(hypervisor )了,你也会感谢它教会你的其他东西。

一些关于操作系统课程的其他观点评论:

感谢Dan Kang审阅本文。

时间: 2024-10-24 05:31:57

转:操作系统课程是如何改变我的的相关文章

基于MVC模式的ASP操作系统课程在线教学平台

建立操作系统课程在线教学平台,实现教学环节不仅仅局限于课堂上:并且提高教学信息发布及反馈的效率.充分发挥学生的主观能动性,培养主动学习知识的能力.更好的为<操作系统>教学工作服务. 根据操作系统课程在线教学平台的研究现状和发展趋势,系统从需求分析.结构设计.数据库设计,在到系统实现,分别为前端实现和后端实现.论文内容从系统描述.系统分析.系统设计.系统实现.系统测试来阐述系统的开发过程.本系统力求结合实际找出一种切实可行的开发方案,经过反复研究和学习,借助C#编程语言.sqlserver数据库

操作系统课程设计摸鱼全纪录

读了几年,都没留下什么东西方便学弟学妹借鉴.感觉这个大三上学期的操作系统课程设计恰好在寒假,大概是最后一次机会了,写点东西. 首先老师要求用的是: ubuntu-18.04 fuse-2.7.0 这种事情当然是使用虚拟机啦!下载并安装VMware,然后下载并安装ubuntu-18.04,拷贝老师给的fuse-2.7.0进去解压.找找看怎么安装. 看了一圈,发现有个README是看得懂的,里面有很多话,我相信来看我博客的人也是摸鱼混及格的,那当然只关心下面的: 那么打开一个Terminal,输入对

文件系统的设计与实现(操作系统课程设计)

 转发请注明:http://blog.csdn.net/tianqingdezhuanlan/article/details/51344739 源码下载地址:http://download.csdn.net/download/u013255737/9513460 目录 一.设计目的.意义 1 二. 设计分析 1 三.方案分析 2 四.功能模块实现 3 五.最终结果分析 4 六. 设计体会 5 一.设计目的.意义 1.通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重

操作系统课程设计--Linux平台哲学家问题

哲学家问题是操作系统中资源分配的经典问题 linux平台下的系统api不同于Windows下的实现 要求:一个正确的哲学家程序(不会发生死锁) 一个错误的哲学家程序(会发生死锁) 系统环境:ElementaryOS wrong.c #include<stdio.h> #include<stdlib.h> #include<sys/ipc.h> #include<sys/msg.h> #include<sys/types.h> #include&l

操作系统课程设计 消息缓冲队列通信

消息缓冲队列通信机制其基本思想是根据“生产者——消费者”原理,利用内存中公用消息缓冲区实现进程间的信息交换. 在这种通信机制中,首先需要在内存中开辟若干空闲消息缓冲区,用以存放要通信的消息.每当一个进程需要向另一个进程发送消息时,便向系统申请一个空闲消息缓冲区,并把已准备好的消息复制到该缓冲区,然后把该消息缓冲区插入到接收进程的消息队列中,最后通知接收进程.接收进程接收到发送进程发来的通知后,从本进程的消息队列中摘下一消息缓冲区,取出其中的信息,然后把消息缓冲区作为空闲消息缓冲区归还给系统.系统

《现代操作系统(原书第3版)》pdf

下载地址:网盘下载 内容简介  · · · · · · 本书是操作系统领域的经典之作,与第2版相比,增加了关于Linux.Windows Vista和Symbian操作系统的详细介绍.书中集中讨论了操作系统的基本原理,包括进程.线程.存储管理.文件系统.输入/输出.死锁等,同时还包含了有关计算机安全.多媒体操作系统.掌上计算机操作系统.微内核.多核处理机上的虚拟机以及操作系统设计等方面的内容.此外,还在第2版的基础上对部分习题进行了增删,更有助于读者学习和对知识的理解及掌握. 本书适合作为高等院

VirtualBox使用ISO安装RancherOS——感受容器技术对操作系统发展的影响

在大学时期,我们上第一节操作系统课程的时候,老师就给我们讲,操作系统到底要干什么?这个问题想讲清楚说容易,也不容易.在操作系统发展的不同时期,它所完成的功能是不大一样的,单道程序,多道程序,批处理程序,网络操作系统,多用户操作系统,开源操作系统,闭源操作系统,分布式操作系统,分时操作系统,实时操作系统等等,划分的角度不同,划分的结果就不同.这么多的划分,操作系统要干什么呢?老师说:"很简单,就是管理计算机硬件资源,控制其他程序运行并为用户提供交互操作界面的系统软件的集合.".概念的东西

操作系统-页式虚拟存储器管理系统设计

(大三下学期开学)操作系统课程设计 题外话: 介个系统的算法啊其实很简单很好理解,就是当时自己实践的时候整了好久,各种调bug各种惆怅啊! 但是此乃100%原创哇!真是老老实实光啃操作系统书自己设计出来的,啥参考都没有 写完的时候真是太有成就感了(流泪) 还为此特别手写了算法研究了好久,刚刚翻出笔记本发现自己为了研究地址变换画了个小漫画!(见最下页) 当时的计划:2/27实现的目标:能够根据作业大小为作业分配空间,建立页表.2/28实现的目标:完成两种算法的设计与调试3/1实现的目标:完善展示界

操作系统之Windows多线程简单学习

操作系统课程学习过程中,.................  先了解下什么是句柄.       句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象.但是,如果您真的这样认为,那么您就大错特错了.我们知道,Windows是一个以虚拟内存为基础的操作系统.在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要.对