人们往往倾向于研究和创造表层的应用,而不是深入探索底层的原理。这并非对应用科学的偏见,而是因为表层工作更容易取得可见的成果,也更“炫酷”,更容易获得认可与回报。 从利益角度看,这种倾向其实十分自然。表层的事物,只要新颖,就容易被视为创新。除非强烈的个人兴趣或长期理想,在各种压力下,人们也通常会优先选择更容易产生成果的表层创新——即使具备更深入挖掘的能力。而对底层原理的研究往往只在两种情况下出现:1. 一个人或一群人不依赖外界反馈,完全出于兴趣、信念或理想去探底层原理,或预见到其巨大的潜在价值;2. 当表层创新逐渐遇到瓶颈,创新的难度已经接近底层突破的难度,或者表层创新受制于底层基础的发展,这可以被称为“应用驱动的创新”。如果把视角放到整个社会层面,规律依然类似。第一种情形可能更为常见;而第二种情况,则往往出现在一个领域的表层应用进入衰退期之后少部分人的坚守。底层原理的突破常常会引发表层应用的热潮,而表层工作的过热又会带来低效的繁荣和后续不可避免的消沉。从宏观上看,也就形成了一个领域在历史长河中的兴衰循环。 我们当然不能否认表层工作的“百花齐放”,它是孕育优秀成果的必要土壤,没有大量尝试,也不会有真正革新的应用出现。但从更长远的角度看,一个领域的理想状态,或许是底层创新与表层应用保持合理比例:无论通过有形的政策引导,还是无形的市场调节,让底层突破与表层创新交替出现、相互促进,才能让整体效率达到最优。从更大的时间尺度来看,即便没有刻意干预,人类社会的自然演进也会呈现出底层原理与表层应用交替发展的节奏。正因为无论底层还是表层创新都充满不确定性,我们无法完全预测它们的路径,于是只能任由热潮此起彼伏、周期往复。或许,这种“无序中的自洽”,正是现实世界的最优解。

最近我偶尔会想一个问题:那些小说作家是怎么写出那么长的小说的?这个问题最初源于我玩一个叫做《双影奇境》的游戏。这款游戏的开头设定很特别:每个主角都是作家,他们脑海中都有多个独立的小说虚拟世界,而这些虚拟世界正是他们创作的源泉,玩家也是在这些虚拟世界中展开冒险。 写一篇小说一定有很多困难。首先,如果我们想写一个比较长的故事,这个故事肯定会产生一些前后相互依赖或关联的情节。如果不小心处理,很可能出现前后不一致的情况。那么,实际上作家在创作小说时,是如何保证故事前后一致、连贯性的呢?我觉得,很可能的原因是:作家并不是在写完某些段落后,再去增加新的故事延续。而是他们在脑海中已经构建了一个虚拟的小说世界模型。在写作时,他们只需要让这个虚拟世界在脑海中“运行”,然后把世界中发生的故事以文字形式记录下来,就能形成小说。这种方法可以在最大程度上保证长篇小说的前后一致性和整体连贯性。 这种思路在我长期接触的计算机系统领域也有所印证。无论是磁盘存储还是程序在内存中保存运行状态,都涉及一个数据一致性的问题。比如,我在内存中保存软件的配置项时,如果为了方便或效率将同一个配置项存储在多个变量中,那么后续修改时可能因为疏忽只改了一份副本,就会导致同一配置项在内存中出现不一致的副本‘在存储系统中,如果相同或应该一致的信息在磁盘上存储了多份,即使形式不同,当操作这些磁盘的计算机断电或关机时,也可能因为数据副本不一致而破坏整个存储系统。在计算机领域,保证一致的方法就是原子的修改应该一致的状态,尽量减少关联数据的副本,尽量用重建表示的方式代替副本的形式。 这其实和写小说的思路很类似,如果我们完全依赖非常长的上下文来编写后续章节,很容易因为对某个事件的描述存在偏差而出现前后不一致,而且往往也难以回忆并检查这些不一致。随着故事篇幅增加,修正这些不一致的代价会成倍增长。因此,对于较长的小说,我们越不应该边写边构思后续情节,而是应该在最开始就把故事概要在脑海中梳理清楚,或者最好建立一个完整的小说世界模型,让故事在脑海中自然展开。我觉得这也应能解释为什么有些原作者之外的其他作者对一个经典小说进行续写时,他的反响往往不如原作。 说到长篇小说的创作,也不得不想到最近非常火的大语言模型。大模型擅长写小说吗? 大模型本质上就是一种生成式语言模型,它可以进行创作。有人猜测,这类模型在有限的参数中,可能已经压缩了人类的大量知识,甚至包括某种世界模型。因此,如果让大模型生成小说或长篇故事,它理应表现得不错。实际上,网上也有研究和论证表明,大模型确实可以创作出较为完整的小说作品。但是,按照我之前讨论的思路,要写出一个好的长篇小说,大模型不应该仅仅依赖已经生成的上下文去延续故事,而是需要有整体的构思。它应该根据最初的设定,结合自身对世界的理解,以及提示词(prompt),去构建一个虚拟的世界模型。 如果一个作家脑海中已经有了完整的虚拟世界模型,那么把这个模型“传递”给大模型并不容易。原因在于,对于一个复杂的虚拟世界,直接在脑海中“运行”它,比用语言去精确描述这个模型要容易得多。要把脑海中的复杂关系完全描述出来,所需的语言信息可能比写整部小说还要多。如果在输入过程中需要精确描述大量细节,就会产生极高的成本,这并不高效。所以,关键在于大模型自身的能力:它是否能够利用自身内在已经学习的世界知识,再结合提示词,构建出一个足够丰富的虚拟世界,从而生成连贯、有深度的小说内容。这种能力决定了它能否在生成小说时表现出像作家脑海中那样的整体连贯性和世界观深度。

“计算机学科的基础理论从根本上来说可以分为哪几个方向?” 这个问题我最近偶有新的思考,记录下来。首先看下 chatgpt 怎么说: 计算机学科的基础理论可以分为多个方向,主要包括以下几个方面: 计算理论:包括图灵机、可计算性理论、复杂性理论等,研究计算的本质和计算过程中的复杂性。 算法理论:研究算法的设计、分析和优化,包括算法的效率、最优性和应用问题。 数据结构:研究如何组织和存储数据,以便高效地进行访问和修改,常见的数据结构包括树、图、哈希表等。 自动机理论:涉及自动机的定义和性质,研究语言的识别和生成,相关内容包括形式语言、正则语言和上下文无关语言等。 逻辑与证明理论:研究计算机科学中的逻辑基础,包括命题逻辑、谓词逻辑和自动证明等。 编程语言理论:研究编程语言的设计、实现以及其语义和类型系统的理论基础。 计算机系统理论:关注计算机系统的结构和运行机制,包括操作系统、分布式系统和网络协议等。 以上每个方向都有其独特的研究问题和应用场景,构成了计算机科学的理论基础。 其次,国内的计算机专业也早就分了三个子学科,计算机系统结构、计算机软件与理论和计算机应用技术。 这些分类肯定各有道理,我先不去替他们解释,先记录下我的想法: 系统结构 系统架构:既包括计算机的硬件组成架构设计,也包括多个计算机组成的分布式系统设计。这里涉及到很多经典问题,包括容错、一致性、缓存系统、扩展性等等。 控制系统:既包括单个计算机的操作系统设计,也包括分布式系统中的控制节点设计。这里也会有很多经典的问题,比如调度公平与效率的权衡,资源碎片和利用率问题等等。 通信系统:包括计算机之间的网络通信架构和通信协议设计。通信协议分为多个层次,可以参考 OSI 模型。 编程语言 编程语言:人要将自己的语言转换为机器指令,设计介于人和机器间的编程语言必不可少的。 编译器:要把编程语言转成机器码,也就有了编译器这种特殊的软件。 软件工程 软件工程也许更多是与人相关的,一个成功软件也是一个成功的项目,项目的规模、生命周期、开发进程,都会相当重要。 计算机应用 不必多说,正是人们需要应用计算机,才有了计算机。一些热门的方向例如: 人工智能 互联网通信 科学计算 数据存储和数据挖掘 形成“闭环” 人们写了程序(软件工程),转换成了机器语言(编程语言),程序就以人们设计的方式(系统结构)运行于计算机上,这个运行的系统也就为人们提供了他们想要的各种服务(计算机应用)。因此,这四个研究方向”闭环“了:

日记式的个人胡扯,没有一句话保证正确,谢谢围观,欢迎指正。。 通用与专用,没有好坏 首先举两个极端的例子:深度学习应用十分重要,因此人们愿意专门为它花钱设计新型专用芯片和硬件架构,甚至可能为了它的性能,没准以后会重新写了一个叫”DnnOS”(我自己瞎编的名字)操作系统;而Jc写的helloworld.py程序无论在Linux, Windows 95还是Win 10上怎么折腾,都是打印一行hello, world,没有任何区别的。 哪个更好的问题没有绝对的答案,也许深度学习的新型硬件没有键盘鼠标和显示器,DnnOS也只要实现一套新型硬件的驱动,复杂程度远远小于Linux和Windows。但是Jc的helloworld.py无论运行在多么复杂的系统上,都无法到一个好的深度学习模型所带来的价值;反过来说,即使这套新型深度学习工具再牛逼,可能都无法运行Jc的helloworld.py程序。 所以,废话就是,当然是各有利弊。 什么应用需要专用系统, 首先当然是嵌入式设备,有些嵌入式设备并没有操作系统,有些有经过精简的操作系统。为实际应用量身定做的硬件和软件,对权衡性能和成本应该是最有利的! 另一种是,在我看来,是专用服务器,比如一台专门的数据库服务器,那么首先它的硬件选型是很重要的,比如存储设备要选高端的,显卡就不要了;它的操作系统的很多东西就用不上了,比如DBMS通常会关掉OS的文件缓存page cache,甚至不用OS的文件系统,来自己管理缓存和裸块设备,包括很多多余的硬件驱动都是不必要的。 什么应用需要通用系统 最易想到应该使用通用系统的例子,就是每个人的手机还有个人电脑了,由于每个人的爱好和工作习惯不同,它们的任务多种多样,资源利用的特点也各不相同。80年代的PC、00年代的手机,都是以计数器、画图、记事本功能齐全作为卖点,后来随着系统的发展,甚至会搞出应用商店这种来增加系统的功能,这时,工作负载就更不唯一。这样,在为每个用户量身定做系统不现实的情况下,只有系统更通用才会更满足消费者的多样需求(比如有人爱拍照,有人爱打王者荣耀)。 另一种,可能是云,也就是各种虚拟化和分布式技术。原因很简单,租用云服务的用户所需要的不只是一种服务(可能是云主机、云数据库或者云存储),更重要的是负载也是无法预测的。最典型的例子是云虚拟机,这时,一个“需要通用”的操作系统运行在云上,那么这个云更通用,比通用OS还要通用。比如,一个可以称为“云操作系统”的系统,要保证计算、存储、内存的可伸缩性,这时一般OS是不提供的,还要保证运行和数据可靠,这都是通用(通用虚拟机)之外的通用(伸缩性、可靠性)。 通用也是专用 讨论了什么时候应该通用和专用,及其原因之后,突然觉得:通用也是专用,因为不管是通用的还是专用的。因为专用的本来就是专用的;而通用的,开发它们多数都是 专用 来赚钱的,不管是手机还是云。

欢迎评论。。以后还可能写个版本2。。。 冗余的人类语言 研表究明,汉字序顺并不定一影阅响读!事证实明了当你看这完句话之后才发字现都乱是的。 以上这句话很多人都看到过,知乎上也有很多人讨论问题的原因[2],对于这段中文,有人从贝叶斯决策的角度分析,指出这是由于人借助了上下文的相关信息+日常的经验。对于英文,如果把一段话的每个单词的字母顺序打乱,也会出现不影响阅读的情况,有人指出这可能是人在阅读一个单词时只看第一个字母和最后一个字母的原因。我感觉都是有道理的。 但现在我们要从另一个角度考虑这个问题: 假设在另一个平行宇宙中,汉语“研表究明”和“研究表明”存在截然不同表示的是两种截然不同的意思,那么就算那个宇宙中的人们可能就觉得这两个词是有区别的。 再假设一个更极端的平行宇宙,他们每个单词都长为6个字母,且只能由ABCDEF 6种字母组成(我算了下有4万多种组合,够多了),那么,他们对词序的判别应该就特别严格吧。 可见,我们所在的平行宇宙中,语言中是存在“冗余”的。这样,不管依据什么经验,语言的冗余,让我们辨识出调换词序的句子的原本意思成为可能。 其实不光调换词序体现了这种冗余。类似的,当我们在一个噪音大的环境中讲话的时候,或者在FM收音机中调出一个信号不好的电台时,我们一般情况下照样可以听明白对方所讲,靠着也是这种“冗余”,我们可以根据已知的信息,猜出完整的信息。 0和1:抗干扰的冗余 接着说收音机。如前边所说,我们的语言中存在”冗余”,所以接收的电台中音调偶尔的变化或者一些字的不清晰依然不影响我们接受信息。那么为什么现在的网络电台没有这些失真、底噪呢,人们靠什么高科技来消除这些噪声干扰? 我们常见的收音机,不管是调幅的还是调频的,都是以模拟信号进行传输的,这种信号直接将要传输的信息以幅度或者频率的形式均匀地映射(调制)到负责传输信号的电磁波(载波)上,由于传输的过程(信道)中信号必然是被各种干扰(噪声)的,于是我们的收音机接收到的电磁波转换到声音的形式(解调)时,干扰信号(噪声)也就被一一映射到了声音(噪音)传到我们耳朵中。 但是现在的网络传输,多数基于数字信号。信号都不再是一一映射到频率值或幅度值了,而是仅映射为一个由0或1(两种频率或幅度)组成的编码。我们假定一个最简单的串行通信,在一个时刻,只能有0或1两种可能,假设信道中存在干扰(比如0被干扰到0.2还会被认为是0信号,1被干扰为0.9还会被认为是1信号),接收后的结果也大概率没有出错。其实这也是一种冗余,一种防止出错的冗余。 0, 1, 2, 3:高效的冗余? 我们为了信息的稳定传输,将无限种状态映射到两种状态(0和1)的编码。但是,我们为什么一定要2种状态呢?为什么不能是0, 1, 2三种状态呢?如果这种可能容易实现(电路上),而且人们最开始没有走上普及二进制计算机这条不归路,那么可能我们现在用的都是基于三机制的电脑了[4]。 技术上的难度或者转换的巨大成本,让人类点了”二进制”这条科技树。不过人们虽然没有用3种状态,但是用4种状态或者8种状态的情况倒是有很多,因为这能保证了和系统其他部分的二进制组件兼容。 比如在信息存储中,固态硬盘(SSD)的MLC/TLC技术,就是在每个存储单元中把以前SLC的两种状态(电压)记录信息,转为用4种/8种电压来记录信息,这样做便增加了SSD的存储密度。 (0, 1, 2, 3) + X: 不可避免的冗余 但是,这种4种或8种状态的SSD,虽然提高了存储密度,但它们的存储单元的寿命会缩短,所以制作这种SSD的时候,就一定要在设备内部预留更多的备用存储单元,这也是一种冗余。看来冗余从抗干扰的冗余被迫转为空间的冗余。 当然,我们也可以采用校验/纠错码技术,用更小的空间冗余来保证信息的可靠。但是编码或数据恢复都需要话费额外的计算时间。如果我们比起冗余空间的开销,更不看重数据恢复的时间,那么看起来空间的冗余又转为了时间的冗余。 看来,冗余无法避免,0/1到(0, 1, 2, 3),虽然它们减少了信号抗干扰的冗余,但是最终也无法避免的使用了其他的冗余。X可能是空间,可能是时间,但到今天这个世界中,都会是money,无法预测的money。 扩展阅读 [1] 熵:宇宙的终极规则, http://www.ruanyifeng.com/blog/2017/04/entropy.html [2] 知乎:为什么汉字顺序有时候不影响阅读? https://www.zhihu.com/question/20428571 [3] 知乎:如何从心理学上解释『打乱英语单词首尾字母之外的字母顺序仍然不影响阅读』的现象?https://www.zhihu.com/question/20804531/answer/16237704 [4] 知乎:苏联三进制计算机Сетунь到底是怎样一个计算机?https://www.zhihu.com/question/35937929

今天,老师给实验室发的邮件中有一条建议说,我们应该将工作数据任何时候都保存多于一份,来避免丢失: 在该页面还有一个同步软件,请一并下载,使用该软件每天将工作文件夹分别同步到U盘(或移动硬盘)和电脑硬盘中,保证任何时候都有至少两份,因为目前的设备特别是硬盘容易损坏,避免关键数据丢失 其实说到这个问题,我也有一很多相关的想法,找不到人去说,干脆写个博客吧,反正微博那么短,也不适合我叨叨。。。 多份好于一份 对于重要信息,放到电脑里就安全了吗?当然不是,设想最极端的情况,你的电脑被人偷走了。。。 好吧,那我放一份到移动硬盘里怎么样?再设想一种情况:你去某个地方需要带电脑和移动硬盘,你把移动硬盘和笔记本电脑放在了一个书包里,你的书包被人偷走了。。。 我的做法:把重要信息存到电脑一份、存到移动硬盘一份,再存到某个网盘一份(上传前最好加密,对于代码工程还可以开源到github)。 数据的历史 有些数据是慢慢变化的,比如毕业论文、代码文件等,它们都在不断改进、增删。有时候,我们想找回几分钟前删除的一段文字/代码,但是发现删除之后已经点了保存键,岂不是追悔莫及? 我的做法:为了留有余地,对于论文等文字创作,每隔完成一次重要的创作,都存一次副本;对于代码文件,没做一次可行的修改,就用git系统进行一次commit。甚至如果对于论文,也可以使用git进行版本控制,我还曾经想过用git保存我的minecraft游戏存档,一边我可以随时在“我的世界”里进行“时光穿梭”。。。 控制权应该在我手中 这点是还不能令我完全睡好觉的一个点。 社交网络 例如,我从10年左右,就注册了微博,然后现在微博两千多条了,可是新浪微博却无法导出我的所有微博(除非用手去复制粘贴或用爬虫强行去扒),类似的当然还有朋友圈或者qq空间,这些可都是没有导出功能的。 然而,和新浪微博相比,twitter就可以下载自己所发过的所有推文,仅此一点,微博在我心中就无法和twitter相比。 我的做法:对于只能在墙中生活的我,不找到一个好点的爬虫爬下我发过的大部分微博,我是完全无法睡个好觉的,谁知道微博哪天会倒闭(或是微博的数据库管理员哪天会突然删数据库跑路?) 聊天记录 最容易想到的,手机QQ是无法导出聊天记录的,电脑qq和微信虽然能,但是一定要再导进软件才能看,所以如果哪天腾讯倒闭了,可能聊天记录就再也回不来了,而这些记录里面可能有重要的信息。 我的想法:虽然暂时摆脱不了腾讯qq和微信的“魔爪”,但是我还是认为邮件是比较可靠的,它有开方的协议,而且方便随时下载保存本地。 引申 数据越来越重要,我们不希望重要数据的丢失,就像不希望丢钱一样。对于金钱来说,它是无法像数据一样进行复制的,放在手里可能被偷,放在股市可能赔死,放在银行还可能倒闭;但是数据可以有副本。也就是说数据的安全相对于财产的安全,更容易让我们睡好觉。想到这里,我不禁又想到了比特币。。。

“时间”和“空间”,在小的时候对我来说只是两个词语,没有什么实质的领悟;后来知道了霍金曾写《时间简史》来讨论时间,到现在也没读完过,估计读完也懂不了;貌似爱因斯坦还说过时间是现实世界的第四个维度?但时间对于人来说总是有别于空间的,但时间总是感觉很特别,感觉不应该和空间统一起来,我想两者应该是个对等的关系;再后来,相见别离,让我明白了时间的意义,房价飙涨,也让我了解了空间的残酷(2333…)。 倒是从大学后的一些课程开始,我对这两个概念有了更加现实的理解。比如,数据结构这门课貌似从第一节就让我们求一段程序的空间复杂度和时间复杂度,有些算法是用时间换空间(牺牲更多计算时间,减少存储空间),有些是用空间换时间。加上后来的各种经历和获得的知识,让我觉得,信息的存在需要空间和时间,而随着人类的发展,各种信息所需要的时间和空间之间可以互相转换替代。 生活中的信息和时间/空间 如果对算法复杂度一窍不通,我们也能在生活中找到一些例子。比如街上的小店铺门前挂的LED电子屏幕,上面可能滚动着各种最新的促销信息,如果你碰巧感兴趣,就需要驻足等所有字幕滚动一遍。看完你可能觉得很烦:“为什么字幕滚动这么慢,促销又这么没有诚意,完全是在浪费时间…”,这说明你的阅读速度很快,老板也许还想让更多心不在焉的人感受到他跳楼甩卖之决心呢。我们考虑这样一个问题,如果放到没有LED屏的30年前,也许把整个店铺的店面用横幅盖住也写不下这么多的字吧。这里,LED电子屏减小了店铺广告的空间,却增加了展示同样多信息的时间(不考虑人的阅读速度,时间由零秒变为字幕滚动所需的数秒)。 类似还有很多例子。我还可以想到电子书和纸质书,一个iPad可能可以存下原来一个图书馆的书籍,空间大大减小。但是要展示所有的书籍的信息,iPad却必须花时间:设想我们有足够的空间的话,可以把图书馆所有的书的每一页都撕下来摊开放在地上,所有信息展示的时间为零,而iPad只有一个屏幕,我们无法在一个时刻翻完所有的信息(假设屏幕帧率为100Hz,我们一秒最多翻100页)。再例如,如果你喜欢电子读物,只需要一个MP3和一个耳机,甚至连ipad的大屏幕都不需要,空间又减小了,但由于说话速度小于阅读速度,展示完所有信息需要的时间却又增加了。这里当然是把人接收书中信息的速度忽略不计了,因为有人会把音频书加快3倍听,而另一些人可能看文字书一目十行。 更接近信息本质的思考 在通信和计算机系统中,信息的传递和存储都是需要编码的,这些编码的过程就是对信息进行表示和压缩的过程。 莫尔斯码也许是为人熟知的系统,这种电码和现代计算机系统类似,最小的通信单元也是两种状态:长、短。长短电报音的各种组合就能表示各种各样不同的信息。最早的电报是需要电报员的,他只能戴上耳机,处于紧张的接收状态。设想如果我们是21世纪的操纵古老电报机的电报员,我们可能会想出各种办法把这种音频记录通过模式识别之类的手段存储起来,然后用Python写一个解码器就直接将翻译过来了。我们不考虑翻译过程的话,我们的“现代做法”便是用存储空间换取了持续在线接收的时间,或者说这是一种带不带“缓冲区”的区别。 数据压缩的概念也很常见,我们从网上下载的很多文件,格式都是rar或zip的,这时如果你想使用它,就必须用压缩软件解压。而这个解压速度,主要取决于你CPU的计算性能。很简单的道理:解压和压缩虽然都需要消耗时间,但可以节省更多的空间。这就是信息在时间和空间的一种转换。 信息的成本和价值 “时间就是金钱”。我认为,之所以人们经常那这句话提醒自己,肯定是因为通常金钱并不经常和时间有一个公认的“汇率”。也许空间就不一样了,在北京的房子可能需要10万一平米,其他有些地方的房子可能只要1千元一平米,大家都觉得很合理;一块普通硬盘可能需要5毛钱1GB的成本,可能固态硬盘就要5块钱1GB,大家也认为很合理,空间总有个价格。 …… 如果我假设,信息的产生、获取或者存储可以用存储空间和计算时间来度量,同时计算时间和存储空间之间又存在某种公认的价格(比如云计算–明码标价的计算能力和存储能力),那么也许时间就是真的可以用金钱来衡量了。而信息这种依赖时间和空间的产物,也便产生了其必然的价值。那么到了那个时候,时间就是金钱,金钱就是信息。 …… 最后要说明: 这篇博客并没有投入很多时间深入思考,只是最近偶然冒出的一些想法。在我看来,人生的意义很大程度上在于了解自己和自己之外的东西,这些想法也许有用也许没用,也许深奥也许通俗,但以我的角度,都是自己所学所见的一些积累所导致,所以对我来说都是值得记录的。谢谢大家的关注。