Buffer是万恶之源
断言啥玩意是万恶之源,是需要证据的,不能凭空诬陷。
甚至,我跳出来激动地说"我最近每天就睡两个小时,昼夜颠倒,白天还总被人
打电话吵醒。我这么不容易,怎么能是凭空诬陷呢。另外,我像这样的人吗。"
这也不行。需要证据。
事情是这样的。
Buffer者也,中文译名是 缓冲区,计算机术语。不过,下面要谈的,其实也不
怎么涉及计算机,看官不妨当此段作赋比兴之类。
起初,俺们是要整个程序。这程序分成两部分。一部分刘同学开发,负责从硬件
里把数据读出来,加加减减什么的,这部分不妨称 数据控;另一部分是关同学
开发,负责从 数据据 里把数据读出来,显示在人类容易看到的屏幕上面,画个
曲线啊什么的,这部分不妨称为 显摆控。
数据控是控数据的,显摆控是控显摆的,这样比较容易记了。于是事情就这样成
了。
数据控用C语言的风格写的C++,大致意思是风格古老而严谨。赞一下刘同学的程
序架构。
显摆控是用C#语言写的,大致意思是风格很in,效果很High。
这两部分如何交流呢。我们找了个特古老的技术,叫做管道。
数据据有了数据,交给管道;显摆控从管道里读了数据,即时的显摆出来。于
是,用设备的人看到了设备的数据。如果这样,事情就成了。
差啥呢?
发现1 数据不是一个一个出来的,而是一团子一团子出来的。或者如毛同学说
的,是一坨一坨出来的。本来电机走着,激光亮着,显摆的数据应该是电机走几
步,显摆一下,走几步,显摆一下,走几步,显摆一下...就像许多软件,非要
不停地告诉你"我干活呐,我正常工作呐,我可真干了不少啊。"
为了加强用户的安全感,和软件开发商的安全感,也许这是必要的。反正,俺们
准备要这个效果。
结果不是的。数据,一坨一坨出来的。
连这,也是好不容易发现的。最初看到的是,前面的一种数据,根本就不显摆,
后面的另一种数据,正常频率显摆。
明眼人一看便知:那一定是后面的数据与前面的数据是不同的技术手段。国情不
同,用同样的制度,所以结果也不一样。如同美英用资本主义就强大,日本也是
啊,而一些蕞尔小国用了,那就完犊子了。
但是! 这两部分都是刘同学一个人用同一种风格开发的,且风格严谨。严谨到啥
程度呢,关同学和俺用了两个来小时,想证明其中一行是错误的。最后,证明关
同学和俺试图证明那是错误的这一行为,是错误的。
后来! 关同学终于发现,前一种数据和后一种数据的速度不一样。再之前,关
同学还发现,前一种数据不是一点也不实时显摆,而是,一直不吭声,然后"哗
"一下,一堆数据出来了,中间过程就全没啥。
意思可能是,中间的过程你不用了解啦,反正有结果就行呗。
插话,好多同学喜欢这么干,这并非优良习惯。交互始终都是必要的。说了一百
遍了,不赘述。插话完毕。
是刘同学的程序有问题,是关同学的程序有问题?反正沟通中的问题,应该是其
中至少一方,或者双方的。
以下诊断的次序不分先后。
1 关同学换了刘同学的数据控程序,用来沟通,按相同的思路写了一个一样的,除了刘
同学的数据控读真正的设备,关同学的程序不读真正的设备,数据全是假的,但
是跟真的一样好。
观察的结果是: 用刘同学的数据控,数据就一团团;用关同学的伪数据控,数
据就很实时。
2 关同学换了关同学的程序显摆控,用来和刘同学的数据控沟通,按相同思路写
了一个一个的,除了真的显摆控逻辑更复杂一些,伪显摆控咔擦掉了一部分。
观察的结果是: 与用真显摆控没啥区别。
2.5 俺们用了一个传统的,微软公司开发的工具和刘同学的数据控沟通。换句话
说,权威出场啦。
观察结果:数据控快乐地工作着,一步一个脚印一声叫唤,实时得很。
从2和2.5分析,是不是看起来刘同学的数据控程序认人唯亲,不是领导不给好脸色啊。
可是从1分析, 是不是关同学的显摆控程序认人唯亲,不是自己家的产品就不好
好合作啊。
其实,不是的,这一切都只是假象。
因为刘的数据控和关的显摆控 根 本 从 来 就没有真正地直接地沟通过。
在两者之间,有一个叫做管道的东西存在。它声称自己接收的和发出的是完全相
同的。取之于啥用之于啥。但是,它并非如所声称的那样工作,或者说,在哪个
犄角九日日九,还有个别的文档,你也早就被表示过认同的,上面写着:
我告诉你的,才是真的;我不知道你的,就是不存在的。
不禁又冒着冷汗想起那段:
引文大意开始
问:哥是不是真实的一个人,还是只是一个虚幻的假的偶像?
答:你说的真实是啥意思?
问:就是像我这样存在的。
答:你不存在。
引文大意结束
因为刘的数据控和关的显摆控 根 本 从 来 就没有真正地直接地沟通过。
在他们之间,Buffer是万恶之源。
当刘的数据控与微软的那位领导(大名曰控制台)沟通的时候,buffer的长度是
0。即,管道知无不言,言无不尽,毫无保留,而时刻都没有保留。
当刘的数据控与关的显摆控合作的时候,buffer的长度被设置为天知道的一个长
度(注:"If the size of the internal buffer was unspecified when the
stream was constructed, its default size is 4 kilobytes (4096
bytes)."),反正不是0。那意思就是,"有数据,是啊,我有数据啦,但是我觉
得,怎么说捏,你现在还太幼稚,不适合都显摆出来。你还真的都想显摆出来
啊,那么,我只好不给你啦。这可是为了你好喔。"
我甚至不让你知道数据的存在。"真的没有数据,不信你读。GetLine(),果然啥
也没有吧。到一个阶段,我会把数据给你滴。什么,你想实时显摆,不是说了这
都是为你好么。"
Buffer对刘的数据控说,你给我的数据我接收到了,再来再来;Buffer对关的显
摆控说,还没有数据哩,你在等等。
最终,当数据大批涌向关的显摆控的时候,Buffer确实可以说,你看,我毫无保
留。
但是,你真的觉得这毫无不同么?
在工程中,我们不得不经常地 间接,而不是直接 使用材料和操作物件。
我们使用指针间接地访问变量; 我们使用文件封装了键盘和显示器; 我们使用
工具隔离高热和危险。
但是,我们从来没有说过, 当我们想利用工具的时候,工具可以剥夺我们直接触
摸世界的权利。
你可以劝我不要直视太阳,但是,请不要替我捂住眼睛。
所以,Buffer是万恶之源。
我还以为过了青春期就不用再这么叽歪了呐。