每个程序员都是铁蹄下的尘埃
这个标题很文艺,我知道。实际上我想说的问题是,未来的计算机会是什么样子。在讲正题前,我们先得说说一个我相当成功也是相当失败的项目。
在很久很久以前——好吧,其实大概就是八九年前——我还在上大学,学习机械工程。当时我对电脑很感兴趣,所以父母给我装了一台电脑。这台电脑有512M内存,PIII800MHZ的CPU,120G硬盘,是当时比较新的配置,相当好。实际上,我是用考入大学时的配置升级来的,而且花了不小的一笔钱。当时我迷上了看动漫,交大有一套系统叫做comic,用过的人都有印象吧?这套系统开始是为了动漫而设计的,上面保存了相当多的动漫,而且有管理员定期更新。后来上面更是放上了其他的影像资料,做了视频点播系统,并且为全校师生服务。交大的网络滥用警告(例如国际流量超标)并不直接张贴在校务栏上,那样没多少人能看到。这些警告张贴在comic上,并且会ban掉你对comic服务器的访问。我们哪天看不了comic了,就会去看看上面是否有警告,然后去网络中心处理掉。
好吧,扯远了。在毕业的年代,我担心自己将来不能访问comic了,所以打算带走一批我觉得有价值的数据。我毕业时新增了一块硬盘,组成了双硬盘系统,但是没有组成磁盘阵列(Raid或者动态磁盘[1])。除去系统中的80G左右的程序和数据使用空间,我还可以使用300G左右的空间。但是comic上我喜欢的数据远远超过了1T。为了解决这个问题,我就设计了volcpy系统。这个系统是这样设计的,将硬盘上的数据保存在光盘上,而将他的元数据——包括文件名,大小,光盘卷标等——留在磁盘上。这样我可以以1M的空间存储上T的数据。当时250G的磁盘大约700元,平均2.8元/G。而光盘4.3G大约1元,合0.23元/G,大约相差10倍。动漫数据是不会经常更新的,事实上应当是几乎不更新。volcpy系统负责将光盘上的文件在硬盘上生成描述文件,在将来需要的时候也可以进行数据还原。
这个设计还是挺成功的,时至今日这个系统还在工作。我手头有接近2T的光盘,也不可能不使用这个系统。不过这个系统设计的时候,我还没接触linux,因此系统在设计上有一点缺陷——他的内部结构直接照抄了windows的卷描述和文件描述数据结构[2],这对于windows下的存储很方便。要拼装存储数据,我只需要memcpy[3]就可以了。但是这也导致linux下想读取这个数据就必须进行解析,然后对照windows文档(电脑诸神阿),将内容解析和转换。如果是今天,也许我会使用基于文本的格式,例如json,yaml,或者xml。文件大小会膨胀2-4倍,但是也只有2-4M而已。
但是我最近正在试图将数据拷贝回硬盘,并且废弃这个系统。为什么?我们再来看看刚刚计算的账单。目前光盘还在1元左右——除非你只打算保存几天的数据,否则廉价光盘的损坏率太高了。但是硬盘的价格却下降到了2T600元,合0.3元/G。有0.3元/G的可变数据存储,谁还会想要0.23元/G的光盘呢?更不提每次使用都需要启动volcpy,插入光盘,然后以7M/s的速度读取。硬盘的速度从50M/s提升到了接近100M/s,大约是光盘速度的10倍,而且还不用找到底是哪张光盘。
可写光盘存储已经死了,除非大容量固定数据的短期分发,例如软件发行,或者盗版电影,否则没人会用光盘。我在拷贝东西给别人的时候,都使用U盘——拿回来重新格式化过就不必担心中毒(windows用户不要学,没用的)。8G的usb存储只要80元,还可以重复使用。U盘还遇到了更加强劲的对手——云存储。1G网络空间基本不要钱。以现在我的带宽,我需要3小时填满,9分钟下载。主要麻烦还在于3小时缓慢的上传速度。如果上传和下载对称的话,我也没道理会使用8G80的U盘,而且花费不少时间去拿给别人。我只需要将1G数据(大概8部动漫),花费10分钟多点上传到我的云端存储,然后把地址和密码(如果需要保密的话)传给对方,让对方再用10分钟下载。我甚至不需要自己保存数据,只需要问云存储机构购买40G的空间和一定数额的带宽(这个应当比自己的硬盘便宜),然后直接使用就好,就像一块只有2.5M/s工作速度的本地磁盘一样。我可以在家里和公司使用一样的存储,把数据共享给别人,在不开启电脑的情况下下载。这简直是价廉物美的无敌方案。
但是这也是为什么我痛恨低上传网络的原因。
OK,我们说回来,未来的电脑是什么样子。本质上说,上面一个题外话(而且是相当长的题外话)正是说明这个问题的关键——软件技术受制于硬件体系的发展,在高速时代使用低速技术是不可能的。我们现在不会满足于使用光盘的廉价存储系统,也不会满足于只能传输文字的聊天系统。同样,当硬件快速发展的时候,我们更没道理满足于快速但不可变的程序。
在我大学的时候,那台老电脑(现在是老电脑了,当时可是新鲜货咧)是相当强劲的编译机,我也是个不错的程序员。经常有同学过来问一些程序问题。我一般会听一下大致问题,看看是否需要开机。如果需要,我坐下,打开vs6[4](那还是盗版,不过当时我也是学生)和合适的项目,然后拉过一把椅子让同学坐下,然后扯一些题外话,讨论一下问题。大概15-20s后,vs6那个难看的界面打开了,插件也初始化完毕,lazy eval和swap[5]也完成了,我可以很自由的操作电脑了,才会和他说。不好意思久等了。一般人都会说,没关系,你这个相当快。我觉得他们不是在恭维。
今天,我已经不用vs了,不过很偶尔还是会用到。vs已经从6升级到了2008,更复杂,界面也更漂亮了,没有什么可比性。但是我们做一个不伤脑筋的计算。目前我的电脑是3.0GHz4核,8G内存,1T硬盘的货色。CPU的线性速度增长了4倍不到,速度已经不能更快了。但是相应的,核心多了4倍,所以计算能力大概增长了16倍。内存大了16倍,硬盘大了4倍,硬盘速度快了一倍。单从集成电路的角度说,这个很符合摩尔定律。不过四个摩尔周期花费了不止6年,而是9年。也许这和设备价格下降了不止一倍有一定关系。实际上今天的瓶颈已经更进一步的向磁盘转移了。如果硬盘速度也增加了4倍或者4倍以上,我大概猜测,vs6的打开速度也许只需要1-2s,编译速度也至少应当增加了10倍。
这种速度下,我当年做了很长时间的一些修改,使得计算速度可以增加30%的努力,顿时变得黯然失色。固然,这些修改今天依然有效,1-2s的时间会加速0.3s。但是这0.3s绝对不是我如此长久努力所期待的结果。如果这个事情重演,我们在10年后,反观今天一些能够让速度加速1倍的决定,会觉得无比的愚蠢。当时为什么我不决定使用一种简单的方法呢?虽然响应时间从0.3s变成了0.6s,但是易变性很好,对未来的兼容也很好,谁在乎0.3s呢?
原因在于,你不知道什么时候会发生什么事情。我刚刚说了,我们今天的瓶颈在于硬盘吞吐。那么你怎么知道什么时候这个问题会有突破性的新技术出现呢?也许是明天,也许是10年后。难道你先去做别的,10年后再继续你的程序员生涯?我们必须基于我们当前的硬件假定编程,然后再把这个假定放在时间面前评判。而这个假定当出现新的硬件技术体系的时候,就会变得无比愚蠢。
如果要我预期将来的计算机系统,我首先就会猜测他无比的快,而且小巧省电。足够快,代表我们不需要把code载入内存中再运行,而是可以直接从外存(或者外存缓存)中直接运行代码。或者直接从网络(或者网络缓存,下同)中直接运行。足够小巧省电,代表我们可以带着计算机到处走,就像今天我们带着手机一样。然后在工作地点,或者其他地方,把机器接入一个输入输出设备上。所以?我估计好多人已经在泪流满面了,是不是呢?做磁盘检测和恢复的孩子们?当然,不是说这个行业会消失。但是他会变成一个相当小众的行业。小众到如同TBBT的笑话一样——25个人已经是一个嘉年华了。专家会通吃所有人,而普通程序员则根本进不去。然后——Bang,硬件又升级了,专家瞬间变成了转家。
每个程序员,或多或少,都生存在硬件升级这只巨兽脚下。你一不小心猜错了他会抬起左脚还是右脚,就会直接化为尘埃。如果猜对了,没事,你只是比别人多生存了一会而已。
1.两者都是将多块硬盘逻辑上变成一块硬盘的方案。
2.描述结构指属性存储格式和顺序,例如卷描述结构就是光盘的大小,卷标等等数据和他们的顺序。
3.指直接在内存中复制数据,不做任何其他操作。
4.visual stdio,Microsoft公司上世纪出品的编程工具,一般用于C/C++语言。
5.lazy eval指程序在加载一段时间后才会执行的一些工作。把这些工作分开有助于加快程序的启动速度,但是在操作时会感觉到速度变慢。swap也有类似效果。