早在读中学的时候,我们就在物理课上得知电路有两种联接方式:“串联”和“并联”,还背过相关的一些规律,比如“串联分压、并联分流”。在任务管理的过程中,可以运用类似的思考方式去思考任务与任务之间的关系:这两个任务之间究竟应该是串行关系呢,还是并行关系?
无论学到什么东西,都可以接着问自己“那……这个道理还可运用在什么地方?”反复问自己这样简单的问题,会锻炼只记得“融会贯通、举一反三”的能力。尽管总是有人劝诫“速成没戏”,但还是不停地有人宣扬各种速成的方法,并且信者大有人在的同时,“野火烧不尽,春风吹又生”。为什么呢?他们在中学学过“省功不省力、省力不省功”的啊?这些人缺乏的就是这种思考能力或者说思考习惯。
有些任务之间只能是串行关系。比如,要先洗手再吃饭。“洗手”和“吃饭”,不仅是串行关系的任务,还是顺序确定的任务。尽管确实有些人真的“不洗手先吃饭而后再洗手”,但是,大多数人还是能够看到这么做事的“明显之荒谬”。而很多的时候,所谓的效率提高了,指的就是“原本只能串行完成的两个任务,现在可以并行完成”。(尽管争议颇多)“迅雷看看”就是效率因把串行变成并行而提高的典型例子。过去我们只能“先下载”影音文件,而后才能“播放”——那时“下载”与“播放”是两个串行关系的任务,并且,先“播放”后“下载”显然是不可能的。然而,现在网络带宽增加了,再加上Bit Torrent技术使得下载速度产生了革命性的提高,使得迅雷可以做到很快就能下载影音文件中一定量的“够看/够听”的内容之后让用户“边观看边下载”。
俗话说,“一心不可二用”,某种意义上这是对的。不过我们也确实很难做到“一心一意”地长期只做一件事,事实上,我们一生要做的事情随时随刻都可能是至少两件和两件以上。计算机操作系统最初的时候是“单任务操作系统”,比如微软早期的DOS;而为了提高效率,程序员们写出了“多任务操作系统”,比如UNIX、比如现在的Windows。某种意义上,为了提高效率,我们必须把自己的大脑打造成一个“多任务操作系统”。



{ 8 comments… read them below or add one }
我觉得这个主题可以引申出一个最关键的问题,那就是“如何分配或者优化你的任务”来提高效率。
拿CPU为例(多核的CPU除外),CPU在一个时间段内其实只能做一件事,因为它只有一个个体,一个时空。对CPU来说,它只不过是离散地按顺序执行一系列的互不相干的基础运算而已,每一个运算都耗费一个很短的时间段,所有的运算在CPU看来它们之间并无任何联系。多任务操作系统把一个长的时间段划分成很多短小的时间片,每个时间片只让CPU执行一个进程(process)的任务,A的时间到了就暂时挂起,执行B进程的任务,B完了继续往后轮,然后循环,这样连续起来就好像是它同时运行着很多进程,实际上它就像是视觉暂留一样。这就像是一个负责盖章审批的领导,你递上去申请书,别人也递上去申请书,他总是要一个一个的挨个看并且盖章,早晚有一天会轮到你那份申请的,这个过程我们无法优化,这是底层机制的执行方式。而对我们来说,程序,也就是人的智慧,是可以优化的,有的程序执行效率高,反应快而灵敏,有的程序迟钝缓慢,还总是出错,这里面就体现了程序员的智慧水平。一个程序在操作系统中运行的时候往往就是一个进程(process),或几个互相独立又有可能互相沟通或依赖的进程,每个进程内部还可以生成许多线程(thread)来同时执行几个并行运算,线程之间如何完美地协调就是编程的最大挑战了,有些线程互不依赖,而有些则需要互相依赖和等待对方的结果返回。有些数据运算只能串行处理因为每一步的运算都需要等待上一步的结果,而有些数据运算经过算法优化则可以适当的安排并行执行。许多优秀程序正是由于程序员采用了高效的算法和数据组织结构,充分的利用了计算机的全部性能达到较高的执行效率。
人也类似,我们在一秒钟之内只能够做一件事(指头脑活动),当然你可以边擦地边学习,边炒菜边听歌,这是因为人有五官、四肢,但是人只有一个大脑,它同一时刻只能集中处理一个信息,三心二意带来的必定是效率的低下,没有什么方法可以比集中精力效率更高的了。人脑是串行处理任务的,但是人脑又是会分配任务的,我们可以把一件事情拆开成很多小份,划分成许多阶段来分别完成,这是人类思维的本能,也就是将一个事物进行分析并归纳分类的能力。比如拿学英语这件事情来说,可以把学习过程分成“听、说、读、写”四个能力的训练过程,每一种能力在教材中往往都分成Unit1、Unit2、Unit3……,每个Unit又分别是课文、词汇、习题等等。抑或是另一种更简单的归纳,比如英语就是词汇+语法而已,这样一来词汇又是被分成100个一组的WordList来分组记忆,或是被分成不同学科的分类词汇来记忆,语法则被归纳为各种呜哩哇啦的大道理小条目。学生们就是按照这种被拆解成许多小单元的知识来一点一滴地习得英语这门本领的。那么哪一种才是合理和高效的任务分解方法呢?相信谁也不会先把所有的词汇都背会以后再去学语法,谁也不会先把听力练的完美无缺了再去练写作,事实情况是,这些事情是不可避免地齐头并进的进行下去的,每个人都有自己的判断力和决断力,去分配任务,去执行任务。
记得在上初中的时候老师所采用的方法就是:每一个单元在学习之前先用一天时间把此单元的所有生词背会,后面才开始读课文、讲课文、背课文、做习题,这样我发现的确比先学课文再找出生词再记忆生词的学习效率高的多。进而我们又逐渐尝试把一学期的所有生词用一周时间背会然后再开始从第一单元学课文,但是你又不能把初中三年的生词都背会再去从最开始学起,这样可能又会增加记忆难度从而降低效率。
再拿炒菜来做例子,炒菜要先把料都备好,然后按菜谱上的顺序分别下锅处理,谁也不会把肉下锅后再去切芹菜,需要料汁的时候再去现调,这样菜就糊锅了,这是一个顺序和时间都严格限定并且不可逆的程序。另外,如果要炒四个菜呢?应该是先备好所有的料再一个一个炒好上桌才对,如果你备一个菜的料炒一个菜,那炒好最后一个菜的时候前面三个菜全都放凉了,仍然是不合适的方法,尽管其总体时间花费是差不多的。
如果你有100个wav音频文件要用LAME程序压缩成mp3格式,你该怎么做?最笨的办法就是用命令行一个一个的去敲,或者用鼠标一个一个的把wav文件拖到LAME程序上,生成一个一个的mp3文件。好一些的办法是用批处理,或者干脆用支持批处理的LAME外壳程序,把wav文件全部拖进列表里,设定好参数,开始执行!然后你就可以去干别的或者睡觉去。假如你有一个双核的CPU呢?老版本的LAME只能利用一个内核的性能,在双核CPU上执行,CPU占用率最多只能达到50%,那我就同时打开两个LAME,每个分别处理50个wav文件,同时执行压缩,这样压缩速度提高将近一倍!当然,优秀的程序员为我们准备好了LAME的多线程版本,可以完全利用双核处理器的优势了,那我们就只开一个LAME便可以达到效率最佳化。
总结起来,人在做一件事情之前,必须要充分思考时间片的安排,比如这一次出门,有哪些事情可以一起办,走怎样的路线可以节省时间。今天背了word list 1,明天是背word list 2还是去读一篇阅读文章?这种复杂的心理安排我想每个人都是随时随地在思考的,如果没思考就说明你的思维方式有问题,或者说,是个没条理的人。我们不可能做到像电脑那样精确地在每一个时间片内执行一个精确的独立任务块,从而可以任意的三心二意,但是我们在相对精力比较集中的一个时间片内执行任务时尽量不要中断注意力,最好不要被外界打断,否则就会像程序的进度条没有走到100%就被按下了abort或cancel键一样,会丢失一些数据,造成了部分工作的前功尽弃。
Unix应该是较早的os之一,出现在dos之前吧
apu说得很透彻,佩服!最赞这一点:“我们在相对精力比较集中的一个时间片内执行任务时尽量不要中断注意力,最好不要被外界打断,否则就会像程序的进度条没有走到100%就被按下了abort或cancel键一样,会丢失一些数据,造成了部分工作的前功尽弃”。感觉对人而言,专注还是最重要的(因为我们只有一个核?),否则即使可以在表面上通过“并行”实现高效率,但工作的质量可能是不同的。特别是对进行创造性的思维活动,如果不能专注是不可能有深刻的认识和灵感的顿悟的。当然,各项任务的安排和计划是可以通过运筹学的原理进行优化,好比中学学过的一篇关于烧水泡茶的文章所说的那样。但细究起来,其中的并行其实只是因为某些事件的执行时间是另外一些事件时间的子集而言。对大脑而言,那些跨度长的事件,运行后就暂时放弃控制了,或者说从大脑中清除了,让事件自行运行,只不过到了一定的时间大脑再接过来运行。因此如果只观察大脑的运行的话,其实还是不同程序的串联执行而已。
to anthony,谢谢提醒。
to apu: 你提到的炒菜的例子很恰当。:)
尽管总是有人劝诫“速成没戏”,但还是不停地有人宣扬各种速成的方法,并且信者大有人在的同时,“野火烧不尽,春风吹又生”。为什么呢?他们在中学学过“省功不省力、省力不省功”的啊?
想起我同学一个很精妙的比喻:做一件事情的时候有“有效功”和“无效功”,我们只能尽可能减少后者而无法减少前者。但必须充分认识到很多情况下前者的量本来就是很大的,所以一定要端正心态不要以为可以通过什么方法来速成:所谓“速成”很多时候只能以牺牲“有效功”为代价,这是得不偿失的
我看,楼上三位说的太有问题,这不是典型的书呆子理论嘛?
工作中不被打扰,进入唯我主义,请明白工作不等同于学习,学习可以闭门造车,工作你闭门看看。
笑来老师说的,串行,跟平行,我觉得有问题。
比如说自己吧,我经常在工作的时候,利用空闲时间,比如网络打开的时候,比如比较累的时候,来看google reader抓取的新闻,但是我发现,马上注意力就转移了,一个不够,在看看第二个吧。。
如此的平行,让我的工作效率很慢。。
于是我,现在开始专门划一个时间来看新闻,在特定时间只干一件事情,这就是串行吧。
也不知道我的理解是不是对路,也请笑来老师对于我的情况给予指点。谢谢
呵呵,我要说的正是“如何最优化地分配任务”的问题,任务要并行执行是绝对的,但是如何将任务分配到并行的进程当中是没有绝对的唯一真理的,只有因人而异,人人都动脑筋并实践。
关于看新闻这件事,我个人感觉的确是很浪费时间,很分散注意力,这是现代网络社会带给人的负面影响,就是效率低下。所以要避免在该集中注意力的时候被唾手可得的其他信息给打扰,如果你总是在工作或学习的过程中时不时地去看google reader或者新闻网站,这说明你的时间片分配的太短促,不断的在几个事情上来回切换,以至于每个事情都不能彻底进入注意力集中的高效时段,因为人要集中注意力是需要一定的酝酿时间的,试着集中注意力,延长每个时间片的时长,尽量在一个时间片内安排一个阶段性的小目标,达到后,再切换到另一个任务去“执行”。
龟兔赛跑故事存在的意义是,光会跑是没有用的.