整理书架子
从除夕那天,我开始整理书架子。有两年没整了,自从上次挪书架子,把书都卸下来,突然有什么任务,没有时间按类别放回去,后来的书有很多就直接堆起来。
混乱一旦开始,就会愈演愈烈,直到,最近决定全都重新整理一遍。
整理书架是个体力活,同时也是梳理知识结构和学习过程的思考。
这几年,似乎一共整理了四五次吧,一般是搬家以后,或者乱得自己受不了。最初的一批书,是大学毕业的时候幸存的几本,教材加上特别钟爱的,没有卖掉。由于我彼此那么痛恨自己的专业,以致于把绝大部分教材都扔掉了。过了很多年,或者说,越是到了后来,我越发现,本科的学习所形成的世界观和方法论,深入到了骨髓,深入到你自己都不知道它们在那里。一个不太好的比喻,就像有些小资口声声谈西方思想什么的,但是骨子里,如果你深挖,却发现他们比上位的那些人更加东方。这里的东方,丝毫不含神秘哲学或者我们的文化的褒义。
这第一批书,几乎都是理工类的。
再后来的一批书,是从旧书市场上买到的,有各种品相。大多暗黄了,书页卷曲。这些书,好多在购买前就已经看过了,有些知识甚至都已过时,尤其是小时候就特别想拥有的那种,虽然借着看过几遍,仍然买了珍藏。这第二批书,大部分是人文类的,持续了好多年,有一些和第三批书的购买时间重叠,甚至延续到那以后。
第三批书,是读研究生期间,到了期末,突然说是有一笔经费,可以买U盘,或者买书。我全都用来买书了。这一批书中最重要的是计算机网络方面的几本专著。当时,我仍然未能清楚地知道,网络和系统管理
(现在流行叫做系维)的知识结构和职业前途与程序员是完全不同的。最终,计算机网络与通信,130厘米左右;操作系统45厘米左右。
第三批书当中,包括我最初读的英文原著,Douglas E. Comer的 计算机网络与因特网,和 Andrew S.
Tanenbaum的现代操作系统,封皮上有马戏团的那个。如果不算文档和电子版,这两本是最初读物。
很多人读书需要心态,或者心情,或者油墨的清香,或者纸张的声音。那纯粹是家里有钱惯出的...特质。读书所需要的,不过是一个能站立或坐下的地方,然后,就是书本身。至于它的材质,是纸的,电子的,印刷质量如何,在能找到书就高呼万岁的时候,这些统统不必考虑。
那两本书,是在不上课的时候,一页一页慢慢看完的。我的英语那个时候极差,不是说现在有多么好,那时我差到除了英文文档,基本看不懂别的什么。英语老师建议的小说啦电影啦新闻啦,没一样能流畅看明白的。不能看懂四级阅读,但是能阅读英文文献,其实也没啥奇怪的,因为二者所需要的词汇量的范围大不相同。后来单词量增长的时候,我注意到,很多单词,我都是首先知道它在计算机领域的含义。
读书,我们所需要的,只是几个小时的时间。
以后的书,基本不是成批购买了,需要哪方面的,就添置点啥,逐渐多起来。软件工程的,175厘米左右;文学类的,大约两个175厘米。
就阅读的时间分配,我在软件工程方面分配的时间远多于文学类的,尽管文学类的量大约是软件工程的二倍。这也是个有意思的事情,为什么理工学生的工资要比文学类的高,因为第一理工类学生花费了更多的时间来学习。第二,如果仅仅是浏览观赏性地阅读的话,读文学类的书是一种休息,没有人应该为你休息付钱的。而即使是观赏地阅读理工类书籍,即使那最终确实是一种愉悦的话,也是一种劳累的愉悦--这跟在健身房的努力差不多。
我曾经计划读某小说好几年,后来几天就看完了。那是我第一次发现,啊,以完全没有注意到,原来这两种不同的作品的阅读速度差别如此之大。
上述关于文学类学生工资的讨论,不包括那种牛到可以指导别人观赏,或者创造出作品来供别人观赏的同学。不幸的是,从现在的影视作品或者评论来看,文学类同学应该可以达到更高的水平,而不仅是自己没事欣赏一下自己的快乐。
是的,我们的理工很糟烂,可能除了这个词,不足以形容我们目前的水平在世界的地位;文学类,如果用糟烂这个词来形容,是对糟烂这个词的侮辱。
整理书架子,也回顾了一些知识学习的艰辛。有90厘米纯粹各种计算机语言的书,还有同等长度的书,是用这些语言调用网络、API、MFC什么的。后者不包括数据库调用之类的,这些基本上只有电子文档,而没有书籍。当年为了学习网络编程
(不是指 web programming,是指socket)
,MFC和API,也着实花了不少工夫,但是俱往矣。这些知识一旦获取了,如果不需要进一步深入研究的话,它就只是知识,而不是方法。
一大悲哀。我们要花很多时间,才能知道,有一些东西,恰恰不是你想要的;而如果你不花上这么多时间,你根本无法知道那是什么,更不必说了解那是不是你的目标。
而那个时间,你往往找不到一个人能够和愿意告诉你。即使有那样一个人在你的身份,年少轻狂,你也不一定就会相信。
然后,很多个小时,很多年,就这样流逝。再也不会重来。
要整理书架子的一个原因,我发现如果书堆在那,根本就想不起来看它,甚至忘了它的存在,或者记得有这本书,但是却找不到它。很多年过去以后,我发现,很多书需要重读,一遍一遍重读,每一次,你可能会有新的收获。那些需要重读的书,恰恰与前面提到的api,mfc的使用那种书不同,它们是历久弥新的。每一次读,你都有不同的动机,又深入地了解了作者这么写这么说的原因。
就像锻炼身体,只有你亲自流汗,然后才能了解,为什么教练或书里说,要这样动作,要避免那样,为什么呼吸而不是别的,才是最重要的。
就像大三和弦是明亮的,小三和弦是暗淡的,甚至是蓝色的绿色的。你不亲自去听,跟你说了也是白扯。有很多书,很多特别好的话,在我这里,就这么白扯过去了。时常感叹,如果当年就能明白那些,该有多好啊。
同学们现在都喜欢看视频了,喜欢在网上找个贴子。但是,真正的知识,尤其是深刻的那些,且不说需要训练才能掌握的,往往不可能容纳在一个贴子的长度之中。这就是几十年来,也许更久
(?),学者们提到的浮噪。我们浮噪到马上就要看到结果,马上就要得益,马上就要看到作用。
我们在网络里跑来跑去,不断去点击5分钟以下的小视频。我们看各种大片的特效。我们不断地转移注意力。我们从成年人,退化为三五岁的孩子,注意力只能保持三五分钟,甚至更短。又或者,我们中的一些希望得到成年人权利的人,从来也没有成年过,无所谓退化。
迅速反应,而不沉思,这正是动物而非人类的特性。
我把那些读过的书,收在书架上。开始制定漫长的计划,很多,都要重读一遍。
我抚摸那些书页,回想我曾经阅读它们的时光。
有一本,C++ Primer。那一年除夕的晚上,我坐火车返回通化。整个车厢里只有三两个人,还包括列车员。我一直低头读这本平时没有时间看的大部头。从上次读到的地方开始,几个小时,我读了平时几天几个月的页数。
不能做实验,也不能上网。我只能用纸记下所有的疑问,记下所有的收获。
晚上十点左右,外面漆黑的天空开始亮起焰火,在车轮的隆隆声里,那些光亮此起彼伏。C++ Primer,就是在这时读完了最主要的部分。
有一本,ZigBee技术实践教程,包师弟借给我的。前两天的某夜,我独坐在桌旁,喝光了咖啡,次序翻过那些书页。不能做实验,也不能上网,猜测作者的意思,用纸记下疑问和收获。凌晨五点的时候,天边开始有了亮光,书还剩下一章。
这个时候,我们才知道,那些短暂就能获得的快乐,并非我们真正想要的,它们也会瞬间就消失。
Category: 未分类
音程示范歌曲,lilypond example
音程示范歌曲,lilypond example
下面的文件是音程示范歌曲,lilypond源代码,可以生成pdf文件,五线谱带歌词的。
音程,比如,用简谱表示1=C时,1和2的距离与5和6的距离是相等的,3和4的距离与7和1的距离是相等的。
lilypond [http://lilypond.org/]
是著名的音乐engraving程序。有人把engraving翻译成雕版,这也正是这个词的本意。在这里,并不特别强调采用这种工艺,而是表达一般地指美丽漂亮的印刷乐谱的工具。
希望对其他也跑调的同学有所帮助,也可以作为lilypond的示例文件,语法忘了的时候参考一段。
又想起了刘俐俐和张绍刚的事件。
有同学评论,大致意思是这样的:当Boss问到问题的时候,都是有动机的,你应该小心作答。比如,领导问,你爱好些什么啊。你千万别说什么英雄双行体,那表明你不合群。你应该说,我喜欢二人传,这表明你尊重民间艺术,或者品味低下;你应该说,我喜欢歌剧,这表明你品味高雅,或者崇洋媚外。
一个人喜欢什么,怎么可能会因为问的人不同而有所变化?唯一的可能就是假装,或者你无法判定他是不是假装[参见《士兵突击》中的成才同志。同志,呵呵。]。
的确,有些人喜欢下属 (如果有这么个阶级,并且因为经济基础而能决定上层建筑甚至人格的话)迎和--即,你说的内容并不重要,但是要对上级的胃口。很多对白都有背后的意思[参见《红楼梦》],虽然很累,但是揣摩有时必不可少。不过,这并非意味着你揣摩完了就一定要赞一个,即使从功利的角度看,也并非每个领导都好这一口。你注意到网上那些对张的反对的声音了么,并非每个看起来像愤怒青年的都是loser,很有一些是winner,这从行文风格和内容可以看出。你可以选择和这样的人合作。
所谓"求职",并不像这两个字求暗示的,是"求"什么人"求"什么东西,无论市场供需如何,那也只是"找"一份工作,而不是"乞求"。有些女士的态度在这时非常正确,她们说,"就是世界上只剩你一个男人了,也绝不嫁你。"
求职确实是有底线的,那就是尊严。如果现在我低头从你胯下钻过,那么,今后呢?我们可以表达对领导的尊重,毕竟工作中的事务的决定权需要尊重地执行,但是并非一定要向他们展示假的自己。有时,所要做的是,告诉他们,我的这些爱好,与工作无关。我只是来工作,又不是卖身为奴;我热爱我工作的内容,但是不必也同时热爱领导你。
说到这里想起博士面试的时候,主任问的一句话,"听说你们搞计算机的都喜欢玩游戏,你玩不?"
我心想,玩啊,很爱玩,不爱玩游戏的,而爱计算机的没几个啊。
我的答复是非常缓慢地说:偶尔。
我庆幸这个世界上有程序设计和自然科学,它们的评判者高于人类和权力。我庆幸这世界上有音乐这样的东西,它的美丑虽然可能大家各执一词,却都是纯净的。
关于程序设计,补充解释一句。人类思考的规则,是人类发现的,却并非由人类所规定。对不,偶像?
"安能摧眉折腰事权贵,使我不得开心颜。"这句话我以前引用过一次,当时在人事处工作,处长问,"杨啊,你有没有座佑铭",然后我傻了吧唧地答了这么一句。所以,对读这贴子里知道典故的老家伙们来说,现在再引用容易笑场。
我补充一句吧,那些用来威胁我的,我愿意全部放弃。而剩下的,编程序,就像自己写作,在心里唱歌,谁又能禁止得了。
让我们歌唱,由关注音律、法则、美,不要关心那些狗P"柯老师"们的看法。
version "2.12.3"
header{ title = "音程示范歌曲"}
% 鲜花曾告诉(3 4)我你怎样(1 2 1)走过 小二度 大二度 《同一首歌》
markup { 上行}
markup { 大二度 同一首歌}
{time 4/4 huge set fontSize = #3 g2 c'4 d'4 | e'4. f'8 e'4
c'4_thumb | d'2_thumb c'4_thumb a4 | c'1 |}addlyrics { 鲜 花 曾 | 告 诉
我 你 | 怎 样 走 | 过 }
markup { 小二度 同一首歌}
{time 4/4 huge set fontSize = #3 g2 c'4 d'4 | e'4._thumb
f'8_thumb e'4 c'4 | d'2 c'4 a4 | c'1 |}addlyrics { 鲜 花 曾 | 告 诉 我 你
| 怎 样 走 | 过 }% 不要(5 6)问,不要说 大二度 《祝福》
markup { 大二度 祝福}
{time 4/4 huge set fontSize = #3 c'2. g8_thumb a8_thumb | c'4
d'8 e'8 d'4 e'8 g'8}addlyrics {你。 不 要 | 问 不 要 说 一 切 }
% 大风从坡上刮过(5 6) 大二度 《黄土高坡》
markup { 大二度上行 黄土高坡}
{time 4/4 huge set fontSize = #3 f'4 f'8. e'8 d'8 d'8 c'8_thumb
d'8_thumb}addlyrics { 大 风 从 坡 上 刮 过 }
% 我们(3 5)坐在高高的谷堆旁边 小三度 《听妈妈讲那过去的事情》markup {小三度上行 听妈妈讲那过去的事情}{time
2/4 huge set fontSize = #3 e'8_thumb g'8_thumb a'8 g'8 c''4 b'8.
a'16 g'8 a'8 g'8 e'8 ~ e'1
}addlyrics { 我 们 坐 在 高 高 的 谷 堆 旁 边 }% 长亭外,古道(6 1[高])边 小三度 《送别》
markup {小三度上行 送别}
{time 4/4 huge set fontSize = #3 g'4 e'8 g'8 c''2 a'4 c''4_thumb
g'2_thumb}addlyrics { 长 亭 - 外 古 道 边 }
% 明天你是否会想起(5 7) 大三度 《同桌的你》
markup {大三度上行 同桌的你}
{time 6/8 huge set fontSize = #3 g'8 g'8 g'8 g'8 e'8 f'8
g'4._thumb b''4._thumb}addlyrics { 明 天 你 是 否 会 想 起 }
% 月亮在白(2 5)莲花般的云朵里 纯四度 《听妈妈讲那过去的事情》
markup {纯四度上行 听妈妈讲那过去的事情}
{time 2/4 huge set fontSize = #3 s4 a'4 | g'4. e'8 | d'8._thumb
g'16_thumb e'8 g'8 | d'8 c'8 a8 c'8|}addlyrics { 月 亮 在 白 - 莲 花 般 的 云
朵 }
% 风中(3 6)有朵雨做的云 纯四度 《风中有朵雨做的云》
markup {纯四度上行 风中有朵雨做的云}
{time 4/4 huge set fontSize = #3 g'4_thumb a'4_thumb a'4 e'4 |
g'4 b'8 g'8 b'2 | }addlyrics { 风 中 有 朵 雨 做 的 云 }
% 也温暖不了你的视线(6 2[高]) 纯四度 《吻别》
markup {纯四度上行 吻别}
{time 3/4 huge set fontSize = #3 d' d'16 d'16 e'8 a16_thumb
d'16_thumb ~ d'4 r4 }addlyrics { 不 了 你 的 视 线 }
% 天上的星星(3 6) 纯四度 《鲁冰花》
markup {纯四度上行 鲁冰花}
{time 4/4 huge set fontSize = #3 a'8 a'4 a'8 e'4_thumb
a'4_thumb}addlyrics { 天 上 的 星 星 }
% 分给我快乐的往昔(6[低] 3) 纯五度 《睡在我上铺的兄弟》
markup {纯五度 睡在我上铺的兄弟}
{time 6/8 huge set fontSize = #3 b8 b8 b8 b8 b8 g8 | g4._thumb
e'4._thumb |}addlyrics { 分 给 我 快 乐 的 往 昔 }
markup {————————}
% ————————% 下行% 夜(1 7)色茫茫 小二度 《明月千里寄相思》
markup {小二度下行 明月千里寄相思}
{time 4/4 huge set fontSize = #3 s4 s4 s4 c''8_thumb b'8_thumb |
a'4. g'8 e'8 d'8 e'4 |}addlyrics { 夜 - 色 - 茫 - 茫 }% 难解百般愁相知爱意浓(1 7 6) 小二度 《相思风雨中》
markup {小二度下行 大二度下行 相思风雨中}
{time 4/4 huge set fontSize = #3 a4 e'8 b'8 e'4 a4 | b'8. b'16 a'8
c'8_thumb b8_thumb a2_thumb}addlyrics { 难 解 百 般 愁 相 知 爱 意 浓 }% 月亮(6 5)在白莲花般的云朵里 大二度 《听妈妈讲那过去的事情》
markup {大二度下行 听妈妈讲那过去的事情}
{time 2/4 huge set fontSize = #3 s4 a'4_thumb | g'4._thumb e'8 |
d'8. g'16 e'8 g'8 | d'8 c'8 a8 c'8|}addlyrics { 月 亮 在 白 - 莲 花 般 的 云 朵
}
% 愿心中永远留着我的笑容(1[高]6) 小三度 《祝福》
markup {小三度下行 祝福}
{time 4/4 huge set fontSize = #3 s2 s4 d'8 d'8 | c'4 d'8 e'8 g'8
a'8 g'8 a'8 | c''8._thumb a'16_thumb ~ a'2}addlyrics { 愿 心 中 永 远 留
着 我 的 笑 容 }
% 高高的谷堆旁边(5 3) 小三度 《听妈妈讲那过去的事情》markup {小三度下行
听妈妈讲那过去的事情}{time 2/4 huge set fontSize = #3 e'8 g'8 a'8 g'8 c''4
b'8. a'16 g'8 a'8 g'8_thumb e'8_thumb ~ e'1}addlyrics { 我 们 坐 在 高 高
的 谷 堆 旁 边 }
% 空独(7 5)眠的日子 大三度 《追梦人》markup {大三度下行 追梦人}{time 4/4
huge set fontSize = #3 b'8_thumb g'8_thumb g'16 a'16 b'8
a'4}addlyrics { 空 独 眠 的 日 子 }% 风中有朵(6 3)雨做的云 纯四度 《风中有朵雨做的云》
markup {纯四度下行 风中有朵雨做的云}
{time 4/4 huge set fontSize = #3 g'4 a'4 a'4_thumb e'4_thumb |
g'4 b'8 g'8 b'2 | }addlyrics { 风 中 有 朵 雨 做 的 云 }
% 狼山起,江山北望(3 6[低]) 纯五度 《精忠报国》
markup {纯五度下行 精忠报国}
{time 4/4 huge set fontSize = #3 a'4. g'8 e'4. b'8 | c'8 c'8 d'8
e'8_thumb a2_thumb | }addlyrics { 狼 烟 起 - 江 山 北 - 望 }
% 上行% 鲜花曾告诉(3 4)我你怎样(1 2 1)走过 小二度 大二度 《同一首歌》% 不要(5 6)问,不要说
大二度 《祝福》 % 大风从坡上刮过(5 6) 大二度 《黄土高坡》% 我们(3
5)坐在高高的谷堆旁边 小三度 《听妈妈讲那过去的事情》% 长亭外,古道(6 1[高])边 小三度 《送别》%
明天你是否会想起(5 7) 大三度 《同桌的你》% 月亮在白(2 5)莲花般的云朵里 纯四度
《听妈妈讲那过去的事情》% 风中(3 6)有朵雨做的云 纯四度 《风中有朵雨做的云》% 也温暖不了你的视线(6 2[高]) 纯四度
《吻别》% 天上的星星(3 6) 纯四度 《鲁冰花》% 分给我快乐的往昔(6[低] 3)
纯五度 《睡在我上铺的兄弟》
% ————————% 下行% 夜(1 7)色茫茫照四周 小二度 《明月千里寄相思》%
难解百般秋相知爱意浓(1 7 6) 小二度 《相思风雨中》% 月亮(6 5)在白莲花般的云朵里 大二度
《听妈妈讲那过去的事情》% 愿心中永远留着我的笑容(1[高]6) 小三度 《祝福》% 高高的谷堆旁边(5 3)
小三度 《听妈妈讲那过去的事情》% 空独(7 5)眠的日子 大三度 《追梦人》% 风中有朵(6
3)雨做的云 纯四度 《风中有朵雨做的云》% 狼山起,江山北望(3 6[低]) 纯五度
《精忠报国》% Local Variables:% coding: utf-8% End:% EOF
上位机与下位机的交流:编码与字节序的实验
上位机与下位机的交流:编码与字节序的实验
下午在南区的讨论班居然提前结束了,而且,到预定吃晚饭的时候还剩两个半小时,按包师弟的说法,真是个尴尬的时间啊。干做两个半小时,太无聊,如果赶回所编程序,似乎时间又不太够的样子。我甚至想提议去暴走吧,但是想到冷得冻肺子的天气,想到包师弟和我都正感冒,也就只是想想。
包师弟说:要编这程序的想法,真是搅得人...
我忘了他原来的措词,为避免他跑上来纠正,只好留了空白。大意是,热血沸腾啊,夜不能寐啊之类的。现场表现是坐立不安。
好吧。
我们迅速用了十来分钟重新回顾了一下以前做过的计划,然后跑出来打车去所里。
1. 实验计划及基本原理
我们要做的是一个原型实验,确定STM32某芯片 (意法半导体)
的浮点型变量的编码方案与PC[http://en.wikipedia.org/wiki/IEEE_754-2008]是相同的,且大小头
(Endianness) 也是一样的。
几天来,包师弟已经把下位机的板子都整完了,昨天半夜的时候邮件说USB芯片及驱动都整完了。
我们计划的技术路线是:由上位机通过USB向下位机发送一个浮点数的二进制形式,下位机接收到以后,写到串口,然后用PC从串口读了显示出来。
如果PC下发的和最后显示的如果不一致,即可判定STM32与PC使用了不同的浮点变量编码。我们希望一致。
为初学者同学们解释一下,这并非是为了验证PC-STM32-串口的链路是正常的,而是为了验证上位机与下位机使用相同的方式表示一个浮点。
上位机就是PC,下位机是单片机或者ARM芯片的机器。
有的同学可能会问:难道上位机和下位机表示同一个数,会使用不同的方式,不都是"3.14"这样的形式么?
可能不相同,一定不是"3.14"这样的形式。因为我们知道,计算机只接受二进制,而"3.14"显示不是二进制。所以"3.14"是以一种有点诡异的方式表示的。
(1) 编码
在上位机中,一个浮点数,比如3.14,需要经过归一化、求符号、求指数、求有效数字、求尾数……一系列的步骤,终于变成了下面的形式。
如果是32位系统,用十六进制表示就是: 4048F5C3
具体的步骤和4048F5C3中每个二进制位的含义略过,感兴趣的同学请去文后的两个地址自行观赏。
我和包师弟打算用实验确认,上位机与下位机使用了相同的计算方法,或者说,相同的编码方法。即,当上位机发送3.14的时候,它发送4048F5C3这四个字节;当下位机接收4048F5C3这四个字节的时候,它认为这是3.14。
上位机与下位机使用相同的语言,才能通信。如果一方对另一方一无所知,还要指导,情况就可能比较糟糕了。
比如下面的对话。
上位机:你最喜欢莎士比亚的什么作品。
请注意上位机知道莎士比亚是一个人,而是有作品的人,不是意法半导体生产的某个芯片型号。
下位机:英雄双行体。
上位机:……
如果上位机在日本动画里,估计会说"那呢?"。我文学基本白痴,以前从来只知道莎士比亚还写十四行诗,从来没听说过英雄双行体这种东西,不过上位机似乎更白痴一些,他似乎认定莎士比亚就只写过戏剧。
恩,我比较喜欢李清照的词。
上位机:你读过莎士比亚的哪部作品?
下位机:我演过麦克白中的巫婆。
上位机:你是演员?
上位机显然不知道,而不是在调笑,他不知道英文专业学习英文的重要方法之一,从高中的时候就是这样,就是表演英文经典名著或者非名著。每个学英语的好像还都有剧照什么的。
不幸的是,下位机也不知道上位机如此无知。
上位机:你英语这么好,为什么要学英语呢?
下位机:我们为什么要学汉语呢?
我补充一下:因为英语系根本不是学英语的,就像下位机的回答所暗示的,中文系不是学中文的,历史系不是学历史演义的,而计算机系也不是学计算机的。很多英语系还有个全称,叫英语言文学,中文系一般还有个名字,叫汉语言文学,历史系……历史系好像叫历史文化学院,计算机系则根本不学怎么修理计算机拆壳子什么的。
深入地研究一个东西,跟简单的使用,根本就是天壤之别。
有人可能误认为:上位机误会了自己的身份,那些指责只有BOSS们才有资格做。
不,不是这样。没有人有资格指责别人,尤其,尤其,尤其是你身居高位的时候。身为BOSS,被安排居高临下,你对看不惯的人唯一能说的话也就是:我们不适合你。被你指责的那个人,没有花钱请你做他的顾问。
上位机下位机,不过是为了称呼方便给的一个名字,你真以为自己就高人一等了,你当小资的时候口口声声赞扬的独立宣言里有一句"人生而平等"不知道是不是忘光了。你花钱买到的不过是劳动时间,并不包括人的尊严。
所以,如果编码不同,还是承认不同罢了,少扯别人低级自己高级什么的。
又,故做平易近人和蔼可亲低下头来和你说话这样的姿态的,也不是什么好鸟,因为他们假设自己高人一等。
(2)大小头
目前有两种Endianness在计算机中普遍存在,一种是,在内存里,4048F5C3就表示为4048F5C3,这个叫做 big endian,大头儿。
有同学说,还能有啥表示方法?
还有一种叫 little endian,小头儿,4048F5C3会表示成C3F54840,正好按逆序排列每个字节。
有同学可能说,居然还有小头儿这么诡异的表示方法。是啊,事实上,我们一般用的PC,x86体系的,都是小头儿,是诡异的那一方。而ARM,是大头那一方。
大头小头,这个名字来自格列弗游记,两个小人国战争的原因是,到底吃鸡蛋应该从大头还是小头先打碎。这个问题也困扰计算机网络,发送数据前,也可能需要重排一下字节的顺序。
说到这里插一句,有意思的是,在小头的x86体系中,浮点数恰恰很诡异地使用了大头方案。这是由于历史的原因,你看,我们已经是一门有历史的学科了。
以上,我和包师经要验证的是上位机 (并非多么尊贵) 与下位机 (并非理应谦卑)使用了相同的 (1)编码、 (2)大小头。
可能有的同学会说:查下手册不就完了么。大多数时候我乐意相信手册,不过昨天马利同学刚刚抱怨了Thinkphp手册之不咋地,还是小心为妙。
2. 实验环境
上位机一台,跑windows7,64位CPU。杨注:可能运行在32位模式,或者应用程序工作在32位模式。
上位机的应用程序包括:
* labview
* symbolink 可能是这个名字,不能确认了。windows驱动开发工具之一,用来显 示驱动提供用来读写的文件名的。
* 虚机里跑了个windows xp,里面有个visual studio.
* 下位机的交叉编译和烧写软件
* 串口通信工具,用来看下位机发到串口的东西
* bushond
下位机:
* 意法办导体STM32某芯片,USB驱动已完成,串口驱动已完成
其他的硬件环境包括:我和包师弟各据一个显示器,连接在同一台上位机上,两套鼠标两套键盘。
两套鼠标两套键盘的结对编程方式,是ZHUMAO同学最先采用的,我们两个似乎当时调的是个JAVA程序。两套输入设备,结对时就不必抢键盘了,只要说一句"放着我来",就行了。论起争执和争夺,嘴还是比手快。
其他的硬件环境,我在实验其间还征用了关同学的座机一会,用来拷出symbolink,包师弟其间用过他的笔记本一阵,查资料。
还用了一个不知道什么软件,为了计时工作,西红柿时间管理。一共两次迭代,第二次严重超时,刚好在最后一分钟结束所有工作。
2. 实验过程
* 下位机输出到串口,浮点变量
改下位机程序,把浮点数,比如3.14,忘记当时用的是什么了,输出到串口。用上位机的串口通信软件读,符合3.14。
这步是为了确认串口通信及下位机的浮点数格式化输出正确。
float a = 3.14;printf("%f", a);
我们观察到了单精度浮点数精度不够的情况,略。
* labview,不知道如何把浮点写下去
用labview,打算把浮点数对应的二进制四个字节写到USB口。遇到个问题,不知道应该怎么取得浮点数对应的二进制那四个字节。
这时,我们转到了另一个技术路线。
请某些同学注意,这里的另一个技术路线,原本就是我们计划的技术路线之一,而不是因为前一路线"可能"不通,而临时想到的。同时,我们非常确认另一条技术路线可能,而且我和包师弟各喜欢一条路线,所以才会转向。这与某些同学"一遇困难就转向,再遇困难再转回来,始终也不知道毛病在哪里,这个方法到底行不行"是完全不同的。事实上,我们基本确认labview有这样的能力,只是不打算再花时间。前面提过,我们原计划加交通也只有两个半小时。
* C,不知道symbolic link name
然后,开始用C写USB口,但是CreateFile的时候不知道驱动给提供的文件名(symbolic
link)是什么,因为正使用labview的驱动,不是我们自己写的那个版本。
自己马上写个驱动,也是方法,但是我们需要马上架起驱动开发的环境。原来有个驱动,但当前的这块板子vid,pid,endpoint设置全不一样。时间关系,也放到一边。请还是那部分同学注意,我们仍随时可以开始这一路线。
* 用symbolink (?) ,不能确定文件名是正确的,CreateFile没有发出数据
开关同学的机器,找到了能查驱动提供的文件名的工具。
这里有个插曲,我们拥有N多个虚拟机,以致于找到需要的那个,花了不少时间。后来全盘搜索才找到。
当时我想起了之前某次"结对"编程,我的身后有四位同学,包独坐一边,还是上面的硬件环境,我们把众多文件在真实的和虚拟的共达七台计算机间来回挪腾,最终一切都跑了起来。大家说,这很盗梦空间。
不过,这一次比较不幸,我按symbolikn查到的文件名发数据,下位机没有接收到。
* 包接受用C写用文件,然后用labview读
这时包提到一个之间的方案:我用C语言把float变量的二进制写到一个文件中,然后包用labview读进来,按字节读。
我说:咱们还是直接用手写吧。
* 用C输出float的4个字节
我们用C程序,把float变量对应的十六进制,显示在控制台上。这样:
#include <stdio.h>main(){ float a = 3.14; printf("%x", *
(unsigned char*) &a); printf("%x", * ((unsigned char*) &a + 1) );
printf("%x", * ((unsigned char*) &a + 2) ); printf("%x", *
((unsigned char*) &a + 3) );}
* 用bushound,而不是labview写到下位机
然后,我们没有用labview,而是用另一个更轻量级的工具,bushound,直接向usb的endpoint中写入了十六进制。
* 下位机,强制转换指针类型
在下位机中,我们按收到数据以后,把这四个字节十六进制转换成了浮点型变量,然后printf到串口。大致这样:
printf("%f", * (float*) buf);
* 上位机显示下位机串口
上位机显示,下位机的串口输出了 3.14。
我们又改了几个浮点数,由上位机把C算出来的十六进制通过USB口写给下位机,下位机又通过串口把这四个字节当成浮点型变量格式化输出。上位机显示下位机的串口输出,与我们预期的值是相同的。
* 然后,我们去东方肉馆吃肉去了。
虽然我的挂钩还疼着,尤其嚼脆骨的时候,不过心情不错。当你知道这个世界上有一些人与你用相同的语言交流,有些相同的习惯,比如大半夜的上网发贴子看贴子,怎么能心情不好。
就让那些 听不懂别人说话,还命令别人按自己的方式说话的 上位机孤独去吧。
3. 结论
浮点型单精度变量,PC与ARM使用了相同的编码和字节序。
参考文献:
[http://en.wikipedia.org/wiki/IEEE_754-2008][http://babbage.cs.qc.cuny.edu/IEEE-754/]
面试,为什么总问些没用的,及emacs支持正则表达式替换
面试,为什么总问些没用的,及emacs支持正则表达式替换* 题外话李记者辞职了,纪念一下。李记者不是记者,这是他的绰号。李记者辞职前是某二三线城市IT公司的技术负
责人。李记者和我相识,是一起参加一个吃不好睡不好啥也不好的比赛,我们都
获了吉林省的奖,所以,都是取得了高级技工资格。想李记者也面试人无数,肯定背地里被人骂过"面试,为什么总问些没用的"。今
天我试着解答一下。对了,李记者,高级技工证,我有两个。你有两个么?* 先说一个例子,emacs支持正则表达式替换Emacs,如同李记者这个名字,众所周知,是伪装成编辑器的操作系统,能完成
基本的编辑器功能,比如文本替换。替换这个功能没啥稀奇的,连WORD都有。如果你确信匹配条件是对的,那么尽可
能大胆地不搜索不一个个确认,直接替换全部。但有时候,世界不那么美妙简单,或者简单的事情都被别人做完了。比如,你想
进行下面这样的替换。有一段文字,其中的一段如下:
----引文开始----
14. 'This is a private conversation!'课文2 早餐还是午餐?
15. It was Sunday.
----引文结束----明眼人一看便知,这是我们背诵了无数遍,如此熟悉的《新概念2》的...第一课
结尾和第二课的开头。也许整本书,你就只熟悉这两课,不过并不影响我们的讨
论。现在的要求是,把整个文件中的每一课的标题,如"课文2 早餐还是午餐?"这样
的文字,后面都加个回车。面试提出这样的问题,有的同学可能会说:哈,不过就是90几课么,我一个个回
车下去。面试官就会问:如果文件非常非常长呢?当然,找很多人,把文件切割了,每人分一小块,处理完再合并,也算是个办法。
不过,也许你去应聘管理岗位的时候这么答效果更好。我们技术人员是这样解决的:找到那一行的特征,然后替换那一行,替换的方法
是原来的内容不变,在最后加个回车。1. 特征凡东西,你不先指出特征,就找不到它。马丁叔叔说:"如何藏起一棵树呢?把它
放在森林里。"这就是用大量的共性掩盖特性。这一行的特征是,开头有"课文"二字。还有别的特征,但是这个特征足够我们完
成任务了。齐同学请注意。为什么考试的时候要考概念,因为按我上面的这种描述特征的方
法,是不专业的,不方便技术人员之间沟通,也不方便与机器沟通。我们这样描述:课文.*这就是大名鼎鼎的正则表达式。学过编译原理的同学都如遇故人,因为这是我们
熟悉的领域,终于又回到我们的知识结构之中。数学家的方法是值得赞扬的,他们把未解决的问题转化为已解决的问题。典型的
例子是消防员的那个故事。队长问:如果你看到胡同口着火了怎么办?答:用灭
火器。再问:如果你看到胡同口没着火怎么办。答:点着它,接下来就是我们熟
悉的问题了。正则表达式 课文.* 的意思是,前面是"课文"二字,然后是任意个 (*的含义)任
意字符 (.的含义)。凡符合这样的特征的行,都会被搜索出来,准备被替换。2. 替换替换成什么呢?替换成 (1) 还是这样一行, (2)后面接一个回车。写作:&^J其中,"&"的意思是,匹配的文本的全部,上例中,即"课文2 早餐还是午餐?"
这一行;"^J"是这么键入的"C-q C-j",其中C-q相当于转义,C-j就是回车。你
可以试一下,在windows下,C-j就是ctrl-j也是回车。3. 命令在emacs下,M-x执行下面的命令:replace-regex RET 课文.* RET &^J然后,任务完成了。凡是符合特征"开头是课文二字的行",找到它们,在每一行
后面加个回车。4. 补充[http://www.emacswiki.org/emacs/ReplaceRegexp]提到
M-x replace-regexp
Replace regexp: (w+)
Replace regexp with: ,(capitalize 1)这里, 1 代表的是第一个括号分组里的部分,, 代表后面跟的不是要用来替
换的东西,而是一段lisp程序。上例执行的结果,会把一个或多个单词,替换为
把 它们中的第1部分 (刚好就是全部) 大写开头字母的结果。这个故事告诉我们,emacs很强大。马利同学,及其他尊敬的vim使用者们,我猜
vim一定也有这样的功能 :)这个故事还告诉我们,无论emacs还是vim,还是类似强大的编辑器,必然会以某
种方式支持 正则表达式 这种强大工具。(1) 因为正则表达式是计算机学科的基本概念,所以,很多方法 (包括gaga新的
.net)都建立在它的基础之上。它已经诞生很久了,我刚刚查了下,1950年代,相
信咱们没几个人比它的年龄还大的。许多人抱怨计算机学科学习的东西太古老,
答案在于,这些东西从来都没有过时,而且所有的新东西,都建立在它们的基础
之上。《故事 : 材质、结构、风格和银幕剧作的原理》告诉我们,叛逆是可以的,前
提是你已经充分了解和纯熟运用你准备叛逆的东西。(2) 对正则表达式支持得好的,必然会提供某种方式,允许你深入到其中,操控
所有的一切,只要你愿意。对.net的诟病之一,正是因为它走向了这一原则的反面。有位老外牛人,一时忘
了是谁,他说:如果.net是一个烤炉的话,它是这样的,特别容易就能做出比如
6.5英寸的汉堡,按标着6.5的那个钮就行 (请准备面试的同学考虑,公司为啥要
为一个只能按某个钮的员工付很多钱呢) 。但是,如果你想做,比如7.4英寸的汉
堡,对不起,不行。原因非常简单,没有那个按钮。它引导你规范你,按它的要求去操作,去完成它特别擅长完成的工作。这一部分
非常友好。但是,如果你打算做点特别的格路的,对不起,壳子拆不开,汉堡供
料仓与烘焙的部分是焊死的,汉堡来的时候是一箱一箱的,把箱子放在供料仓里
就行,不过你想放点别的,不行。用崭新的包装把一切遮盖起来,仿佛一切就真的简单的。如果理论上没有突破,
仅靠小技巧,这只是梦想。有的同学可能会说,.net具有重要的意义,它降低了编程的门槛。当然,是的,
完全正确。那么,我们是否能够重新思考一下这一段话呢?它降低了编程的门
槛, (1) 它会让一些某些工作变得简单--因此更不值钱, (2)那些不容易解决
的工作,仍然不容易解决,因此仍然值钱。这就是面试的时候,很多打算长久使用你的公司并不太关心你对新技术了解程度
的原因。因为,那一点也不重要。* 面试1前几天看到有同学问,为什么面试的时候,我明明应聘前端,却要问我些乱七八
糟的东西,而jquery啊html5啊,这些新的非常有前途的技术,这些我非常熟悉
和感兴趣的技术,他们完全不问。因为,那些东西对于理论基础正常的同学,学起来非常之快,可能两周之后就开
始使用,虽然深入某种技术,往往需要N年的时间,而如此精确有时并无必要。他
们学起来如此迅速的原因非常简单,因为手册、书籍 (我 没有、没有、没有 提
到网上短文中的示例)都使用了相同的术语和基本技术,这些术语和基本技术正是
计算机专业学习的内容。是的,计算机专业学习的内容是术语和基本技术,而不是什么新鲜的热气腾腾的
东西。关于计算机专业课程设置,很多年前偶像曾经开过一个玩笑,他说:现在oracle
dba这么值钱 (当时是4万?2万?) ,咱们还教什么专业课,专门培养他们得了。我说:那四年以后,oracle黄了怎么办?oracle没有黄,似乎日益飞黄腾达了。不过,谁知道呢。我们希望培养的是这样
的同学,他们在毕业以后可以在短时间内学会任何一种新的技术,而所有的新技
术对他来说,区别都不大。另一个关于计算机专业课程设置的讨论。姜同学是北京某大公司的头头,手下二
三百人。他希望高校毕业的学生能够熟练,j2ee hibernate struts spring,当
年的对话,大致相当于现在的这些技术吧。一个优秀的毕业生,当在一个月内了解所有这些的使用。当然,我们的培养很多
都失败了,那是另一回事,且不能作为把高校改为技工学校的理由。为什么面试的时候问你那些特别基础的问题,而不涉及新技术?因为新技术会过
时,而拥有基础的同学,能够学习所有的新技术。新技术,不是建立在旧一点的新技术基础之上,而是建立在理论和非常旧的技术
基础之上。* 面试2可能有同学还会质疑,只问理论,会不会让那些实践强的同学失去机会呢?以前CCNA考试流行的时候,对通过考试的同学有个分类方法。一种叫paper过去
的,他们只读了书,没有做过实验;一种叫bible过去的,他们背了题,甚至书也
没看懂;还有一种,真正有实践的--不过,你相信一个有实践经验的同学,他从
来没看过书么?微软和思科,和所有网络考试中最基础的部分,关于osi七层模型,关于tcp/ip
协议,都是完全相同的。这就是基础。对于了解基础理论的同学,如果,如果他拥有实践的精神,那么,一旦他解决过
一次这样的问题,相同原因的问题,无论故障现象看起来多么不一样,他都可能
解决。而对于只有实践,见过这个故障,见过如何解决的同学,再次见到另一个
故障,他一定无法解决,因为即使原理相同,那也是一个完全不同的故障。我们所要注视的,根本不是故障现象本身,而是导致它的原因。只有理论基础,
才能给予解释。我们把理论基础较好的那些,称为学院派。这很多时候是个贬义词,尤其在工业
应用中。但是,我看到很多学院派后来接触实践以后成长起来,我还看到很多野
路子的同学后来开始钻研理论。* 面试3还有同学提到,为什么我有这么好的想法公司却不用我,或者不用我的想法。你的确很有想法,可能非常杰出,但是企业招的却是员工,不是老板。我们都有
把别人当工具的倾向,不过如果想实施 (且不论是否正确),得先有自己身为工具
的觉悟。好想法,应该讲给风险投资商听,或者你自己有钱的话,讲给自己听。* 考试齐同学动手能力挺强的,他抱怨,为什么考试的时候要考概念。因为,我们将使用这些概念进行交流。比如,正则表达式,这是个严格清晰的概
念,一点也不像文科同学说的什么...那些乱用词。我们不能使用诸如"开头两个字是课文",这样的说法只能在跟人类跟用户这样有
限的交流范围使用。之所有要考概念的另一个原因,你真的以为自己清楚地掌握了它么?的确,这样,有的同学靠背诵就能得到很高的分数。这是考试技术低下造成的,
我们却不能因此放弃对概念的掌握。从难度上看,背诵 < 举例 < 使用 < 复述。有的时候,即使你偶而能正确使用 (在有限的场合下,有时还受到技术主管的辅
导或限制,因此不易失控),也不见得总能正确使用。而复述,可以考察出你是
否了解其中所有的要点。齐同学还提到,背概念真没意思。大意如此。概念从来就不是背的。不要使用别人的词汇,而应该使用自己的。如果你对要
点有所遗漏,当你应用它的时候,你如何确保充分注意到这一技术的优点、缺点、
使用的限制?使用的时候再查书?这确实是个答案,而且是个不错的答案。不过有些东西,我们要求的是 熟练,而不仅仅是掌握和理解。在水里理解自由泳
的精要,而不会熟练地扑腾 (还需要足够的心肺功能和肌肉耐力吧) ,也是白扯。要求"熟练"的一个结果,就是那些你最经常用到的知识,绝不会不理解,虽然不
能确保你的理解没有编差。谁说的来着:不了解自己的文章中的词意的作者应该枪决。同样,只会抄网上示
例,甚至不知道调的那个函数原型,没有读过手册的程序员,也...* 李记者你辞职,我对你还是挺有信心的。相同的技术和理论,总可以应用于不止一家公
司和不止一个领域。这个故事告诉我们,新技术等等,都是浮云。我们内心深处的,能长久停留的,
才可能成为我们自己的一部分,永不失去。祝你顺利。
pics
悠长假期
悠长假期1. 悠长假期,带本什么书这些天,不停地做梦编程序。有一次逻辑太难,我只好从梦里醒过来,睁着眼睛
看漆黑一片,窗外连隐约的路灯也都熄了。在清醒中解决了那几行,然后又沉沉
睡去。昨天,十字路口很多人在烧纸,是过年的前奏。东一堆西一堆,火苗腾跃,旁边
的人不停翻动纸堆。我突然想,如果我此刻挂了,该托家人给我烧本什么呢。长夜漫漫一定非常寂
莫,无书可读一定更加无聊。出差的时候,我总是随身带本小册子,不沉,又不那么容易看完的。每次出差前
整理东西,选书总是要花不少时间。因此,很多年来,设计模式我读了好多遍,
直到有了kindle。我见过向龙同学吃饭的时候拿出手机赶紧看两眼《大秦帝国》,那个时候秦始皇
已经出世了,估计现在他换另一本了。张科长同学前几个月在看的是《官场现形
记》,崔老师看《这才是春秋》。偶像提到过,去大连ACM的路上,我看《编译原
理》,现在也只看了四分之一左右。罗同学还提到过,她和韩老师在王府井逛商
场,我在门口看书,那本是什么我却不记得了,也许<UML Distilled>?从烧纸的火堆路过,想,如果是漫长的旅程,只选一本,真得好好选选。我想到
了SICP,这本挺扛看的,第二遍还没有看完,还要很多细节要想。但是,不配几
本参考书,手头没有实验环境,非常不方便啊--毕竟,真的出差,还有机会回来
再做实验。也想到了龙书。但这是会看完的,然后对于工程的启发,或者底层的程度,可能
也就有限度了。然后我想到了《牛虻》,想到了《高卢战记》。暗无天日,旷日持久,哪本书才适合漫长的相伴?然后,一批书目从我心上掠过。太多了。好多书都难以割舍,只好继续活下去,
慢慢把它们看完吧。2. 那些迭代的意义读罗素《幸福之路》。他提到,有人认为人生的意义之虚无,因为不过是一代又
一代人登场然后又退场,阳光之下没有新鲜的事情。这让我想起计算机程序设计中的迭代。计算机最擅长的事情是 重复,一次次做相同或类似的动作。为了显得IT男们有
文化和品味,我们更乐意使用迭代这样的字眼来代替重复。就像小资们用波希米
亚代替吉普赛或捷克斯洛伐克,用HR代替人力资源。那样显得倍有面子。说到重复,人类希望机器做的,自己却并不一定喜欢。想想《摩登时代》里的卓
别林,我们就知道为什么后现代们会提出"异化"这样的词。人类并不太适合或者
不喜欢一成不变地重复。我们不喜欢变化,但是我们期待重复,它给我们安全感。每个人的心里是不是有
断背山我们不知道,但是每个人心里都有半拉雨人是差不了的。我们期待每天发
生相同的事情,坐同样的班车,遇到些相似的面孔,他们会做你预料到的行为。
这个月铁定会发这么多钱,项目也只能是大约这样的,出不了大格。虽然很多人想做逃跑新娘啥的,想喷领导一口唾沫,想在地铁里遇到哥斯拉什么
的,那也只是想想而已,不然就不必有那么电影帮助大家YY这些无法实现的愿望
了。重复的生活,不变的仪式,所给我们的安全感,与给雨人的感觉没什么差异。所
不同者,我们期待重复里有小小的不同。起-承-转-合。起承,这些都差不多;转一下,生活中的变化;合,再重回到旧
有的轨道上,整体上又略有差异。在迭代、重复、循环中,我们有三个部分需要处理。C语言里一般这么写: for (i=0; i<10; ++i) {...}(1)起始条件,就是 i=0。这类似于数学归纳法中的 n=1 时等式成立。经典的求斐波那契数例的最开始,
如果用递归法,就是n0=1, n1=1。我们的起始条件各有不同。具体的说,我们初生时根本就不在同一条起跑线上。
有些人A出生在好地方,另一些人B需要花费大半生才有资格在A出生的地方生存
下来,而A出生就具有这样的资格。很多时候,A认为,这是理所当然的。这个再
具体地说,北京出生的人认为自己留在北京是理所当然的,而外地人留下来就是
"我就不明白这些人怎么回事儿,非要到北京来";美国出生的人认为自己留在美
国是理所当然的,而其他国家,尤其是亚非拉的,那就是挣夺了他们高贵的工作
岗位。我们大概都是这个路子,属于我的,那一定是我的,别人谁也别想抢;至
于别人认为应该属于他们的,我们就想,靠,这太不公平了。这基本是极坐标的思考方法,以我为中心。这世界上还有另一种坐标系,叫做迪
卡尔坐标系,我们可以回忆一下,虽然久违。血统所造成的差异,可能持续终生。在人人网上刚刚读了某同学的贴子,我很悲
伤。贴子大意是某 (女?)同学抱怨男朋友如此小气,过不下去了。历数的事情
包括她花自己的钱唱歌请朋友们吃饭是不必经过男朋友批准的,因为那是自己的
钱;重申了房租不超过1/5都不算多,他们的房租仅1800。文笔挺好,说得也都在理。凭啥你节省就不让我花钱。后面还提到:男朋友的父母太节省了,买肉只有他的爸爸能吃,他的妈妈发的工
作服要穿十几年。如果他的父母有你的父母的收入,还这么节省,几十年下来,该是多么富有啊。叹气。写到这里,想起小牛同学曾经说,"其实中国是没有阶级的。"我当时说,你当然
这么认为。或者这么希望。(2)终止条件,就是 i<10。有些人就是能活,没办法。最后把所有意见不同的都靠死了,自己就是老大了。我的平生夙愿就是一直活下去,等你们全死了,给你们挨个立传,想写啥写啥。如果只看起始和终止条件,每个人的一生都差不多。来到世界,经过一些事,然
后挂了。那人生还有什么意义?意义在下面。(3)每轮迭代,就是++i及{...}里面的那些东西。在函数式编程中,强调只得到返回值,而不希望在每轮迭代 (及整个计算过程中)对
环境有任何影响。凡是对环境的影响,称为副作用。人生的意义,恰恰在于副作用,即你对于别人的帮助。这样当你挂了的时候,就有人怀念你曾经的存在令世界有所不同;也许还有人给
你烧书看。正是这些副作用,而不仅仅是求值的结果,让我们区别于外界环境这个纯粹物质
的世界。其实,做工程和做练习也是一样的。能得到什么结果,挣多少钱,不过是副带的
一个结果而已,我们不必以这些来评判自己的价值。徒步的人,如果只是为了结果,有那么多现代化交通工具可以选择;推哑铃的那
些,跑圈的那些,不过是一次次一次次推起来跑过去,又回去终点;做各种实
验,最终大体都扔到废纸堆里或者删除。但是,这些过程,令我们从纯物质的世界里分离出来,成为人类--或者工程师。
我们所享受的,不是结果,而是过程本身的吸引。想起了以前对建一同学说的:工程本身很重要,但是它远不如 你做工程很爽 重
要。人生就像一个短促的假期,你从何而来,终止条件如何。在这期间,你发生了哪
些变化,你令世界发生了哪些变化。假期开始了,你快乐么?
那些非常好的书
有同学问,"哪些书非常好",答复如下。列表在这里:[http://book.douban.com/doulist/1371567/]1. 很些书因为太好,出了好几个版本,它们之间的区别对初学者不是非常重要;
基本上,哪本都非常好。2. 如果可能,建议读英文版。总有一天,你的所有阅读材料都会是英文的,所
以,总要有个开始。从哪本开始,区别不是甚大。我的第一本是 计算机网络与因特网,Comer那本,薄,相对简单。读的时候计算
机网络有一些基础了,看过不少英文文档。第二本是 计算机网络,Tanenbaum那
本,厚,用词非常文雅,所以很多词不认识。以后的我就不记得了。选择你的第一本英文著作,有些原则可供参考。1.选择你喜欢的。所以,男同
学,不必非得强迫自己去看 简爱 飘 红楼楼 那些看了就想睡的作品。打打杀杀
的似乎不流行了,没品味的样子,词汇也太少,那么,就从技术看起吧。2.复杂
或困难的,同时你已经有些了解的方向,想细读的。这时速度就不那么重要,因
为阻碍你阅读的不是语言本身,而是思想,所以英语还是汉语的差别不大。3.傻
瓜书什么的不行,它们太幽默,俚语太多,这些对老外简单的东西,对我们正是
难的,而且啥用没有。Visual C++ 技术内幕,建议第4版,中文的挺好。侯捷先生翻译的,中文版跟英
文版一样流畅;潘爱民先生翻译的,也是质量保证。3. 有些书是免费下载的,有电子版。同时,有些书是有版权的,不过也容易找
到电子版。有些书英文只有电子版,同时有纸质中文的。对于不习惯电子版的同
学,劝告一句,你习惯一下吧。墨香什么的,都是给文学青年们感受人生准备
的,技术男就别太介意感受了。此外,未来的世界如此艰难,哪有几家公司会为
你准备打印好的文档呢。4. 想说"以后有时间再一一细评这些书",后来一想,这也太狂妄了。这些都是
牛人牛书,还是推祟并表达一下敬仰吧。感谢他们助我成长,也希望你会有同感。
1. 编译原理
作者 : Alfred V.Aho/Jeffrey D.Ullman/Ravi Sethi
出版社 : 机械工业出版社
2. C程序设计语言
作者 : 克尼汉
出版社 : 机械工业出版社
3. 现代操作系统
作者 : (荷)Andrew S. Tanenbaum
出版社 : 机械工业出版社
4. 计算机程序的构造和解释
作者 : Harold Abelson/Gerald Jay Sussman/Julie Sussman
出版社 : 机械工业出版社
5. 算法导论
作者 : [美] Thomas H.Cormen/Charles E.Leiserson/Ronald L.Rivest/Clifford Stein
出版社 : 机械工业出版社
6. Applying UML and Patterns
作者 : Craig Larman
出版社 : Prentice Hall PTR
7. Design Patterns
作者 : Erich Gamma/Richard Helm/Ralph Johnson/John Vlissides
出版社 : Addison Wesley
8. UML Distilled
作者 : Martin Fowler
出版社 : Addison-Wesley Professional
9. UML应用建模实践过程
作者 : 尤克滨
出版社 : 机械工业出版社
10. 数据结构
作者 : 严蔚敏/吴伟民
出版社 : 清华大学出版社
11. IBM-PC汇编语言程序设计 (第2版)
作者 : 沈美明/温冬婵 编著
出版社 : 清华大学出版社
12. 软件工程:实践者的研究方法
13. Word排版艺术
作者 : 侯捷
出版社 : 电子工业出版社
14. Windows 程序设计:第5版
作者 : CharlesPetzold
出版社 : 北京大学出版社
15. 计算机网络与因特网
作者 : (美)Douglas E. C
出版社 : 机械工业出版社
16. 计算机网络
作者 : 特南鲍姆
出版社 : 清华大学出版社
17. 数据与计算机通信
作者 : 威廉·斯托林斯
18. C++程序设计语言(特别版)
作者 : [美] Bjarne Stroustrup 贝尔实验室
出版社 : 机械工业出版社
19. C++ Primer中文版
作者 : [美] Stanley B. Lippman/Josee Lajoie
出版社 : 中国电力出版社
20. Visual C++技术内幕
作者 : 小克鲁格林斯基
21. Java编程思想(英文版.第2版)
作者 : Bruce Eckel
出版社 :
与机器(或男人)沟通的原则
与机器(或男人)沟通的原则今天感冒头疼,脑袋不咋清楚,以下主要扯淡,跟技术关系不大。这也反应了最
初决定开写博客的原因。我很长时间一直担心所写的东西过于幼稚,不入大家法
眼,又担心过几年以后会觉得以前写的东西太担淡了。不过,后来被劝道:1.即
使特别糟烂的东西,总也可能对更幼稚的同学有所启发;2.错得离谱的那些,自
然会有同学跑上来骂,这样我就可以进步了。这就是写博客的目的:沟通--软件工程中代价最大的部分。* 差异,世界不是你想像的那样需要沟通的原因是,接受信息的人和发出消息的人所了解的信息是不同的。所以
跟黄同学提到过几次的一个写文档的原则:"要清楚",原因就于此。如果读者已经知道了你要写的内容,他为什么还要读。所以,在动笔以前,你就
要猜测读者不知道些什么。最简单的猜测是:假设读者啥也不知道。这是安培当
年在演讲中用过的方法,也是我们看到很多牛的英文教材写得非常详细 (甚至罗
嗦)的原因 。类似的,为什么我们的很多教材非常薄而简洁,我恶意地猜测,作
者只是想告诉我们:你看,我懂。如此而已。他并不希望我们也懂,也不愿意为
我们懂而努力。所以我们也不愿意买他们的作品。写得简短,可以藏拙,或者期待由于自然语言的二义性,虽然你不明白,但是读
者明白了;写得罗嗦,至多是被跳过;或者……我也看到过对我罗嗦不能忍受,跳
上来骂我的。沟通需要先预设背景,那是双方都接受和明白的部分,然后才是交换差异的信息。
忽略背景,固然简洁,但是那是没有基础的楼宇,清楚打了折扣。所以,讲故事都要先来时间地点。比如以前导师讲:芬兰有公路可以直达北极圈……那一路上都要小心鹿……路边有牌
子,上面写着"小心鹿"。就跟咱们有些人跟北海道的鬼子学习,在车上喷个牌子
"有熊出没注意"。我当时感叹:看看人家,多环保啊,怕把鹿压着了。导师说:是怕把车撞坏了,鹿长得很大,也够结实。这个故事告诉我们,世界不像我们想像的那样,所以我们才需要沟通。* 不沟通的情况小学的时候看过一个笑话:方程有两种,一种是方程,一种是 非方程。就是有
时候你解一个方程 (等式),解了半天,到最后,才发现,其实那根本不是个方
程。但是最初的时候你不知道的时候,也称它过方程来着。是不是有同学想到了很多别的东西?所以,沟通有两种,一种是沟通,一种是不沟通。什么时候不沟通呢?当表达无效的时候,我们会选择停止沟通。双方互骂,互掐,对打,仍然在交流。
真正的不爱,不是恨,而是冷漠。在琼瑶还不是奶奶的时候有部小说,名字忘了。女子很多年 (杨注:一般仍很年
轻,所以很多年一般是0.5或者0.3年的样子) 后见到了当年的男朋友,然后场
景,男子不在场的时候,她问她爸,"他刚刚怎么评价我?"她爸说:他大骂特骂了你,没有一句好话。女生喜极而泣:太好了,还有希望。你会对陌生人发火么?如果会,你会对电线杆子发火么?小时候我们会的,撞了
墙还要打墙两下才能解气。所以做项目的时候,你的客户 (还有你的下属和上级) 不跟你沟通的那部分,才
是更重要的,所以请他们表达出来非常重要。而"请"他们表达这件事,绝不可能
是他们自己的责任。昨天某公司一位常务副经理说:大学做开发啊,进度慢……他说到这的时候我频频点头,不是表达礼貌,而是表示赞同。他的担心不无道理。但是他接着说:意识啊,意识问题。我笑了:某经理,其实这主要是个成本问题。言下之意是,如果你给够钱,当然意识可以更好。不过,我得说,我这不是什么
好的沟通:无论从方式,还是从内容上看。很多年前,我还是本科生的时候,就对老板这样说过。这不是意识问题,因为并
非这个世界围着你转的就是意识对的,按你的控制操作的,就是好的,而不利于
你的就是不咋地的。不是只有你的意识才是意识,每个独立的人类个体都有意识的。当你想要操纵,或者诱导别人的时候,你与他的沟通之路就已经封闭了。人与物
之间没有什么好交流的。前面那位常务副经理显然明白了我的意思,停止了沟通或布道。当他过了一阵再
次提起意识二字的时候,我又笑了,他又不说了。这时可以判定,这是有效沟通。如果沟通无效,其中有些,可以试着换个方式;有些,则只能停止。在包括面向对象系统分析与设计的方法中,有一个术语叫做 消息。当消息到来的
时候,接收消息的信宿要做出一个动作 (执行消息响应函数,转发或执行对应的
消息句柄,等等)。这里有一个前提,那就是消息接收者有响应消息的机制,称
为责任。不承担责任的对象,就不能响应消息,因此不能接受通信,因此也没有
存在的必要--因为你无法调用它。我们所看不到摸不到,也不能沟通的,就是不存在的。* 沟通的原则沟通有时候进行了,但是却没有效果。双方都有责任。当我们用计算机语言跟机
器沟通的时候,如果沟通无效,那责任只在我们自己。因为机器是男人设计的,主要是西方的男人设计的,所以文化色彩可能跟咱们习
惯的略有差异。经常有人说,日本人说话非常暧昧。这里的暧昧与色情无关,指的是不清楚,模
糊的表达。我看到最早的例子是这样的。美国人和日本人谈判,美国人不管说啥,日本人都
说"嗨"。美国人一看,这日本人真好说话啊,那就提要求提要求提要求。第二
天,日本人不签字,说,我那些个"嗨",就表示"听到了",不是"我同意"的意思。其实咱们中国人也差不了多少。我经常见到有人频频点头,就表示我听到了,丝
毫也不表示我同意,甚至他说"是啊,对啊"的时候,也并不对应具体的意思,那
和脏话差不多,仅表示语气。我们还经常见到,职员对老板说的是:你看,现在物价涨了,房租挺贵的,我媳
妇认为我的职业没有前途……他要说的是:我想涨工资。当年一位老板对我如此暧昧地说:小杨家境挺贫寒的。我说:你应该把上次做网的工资给我,这跟我的家境没什么关系。后来我说,某部分是我做的,既然合作失败,我要删除那部分工作。他也同意了。
再后来,他说"你痛快把这部分活做了",这暗示报酬还是可以有的,谈判还是可
以继续的。好了好了,回忆这些让我感觉我们大家都是女人,生活在红楼梦之中,每句话里
都套着各种话。……女人们也经常交流了半天,却没有传达任何具体的信息。事实上,她们传达了
重要的信息,那就是"你看,我乐意和你交流"。这也很重要。不过,当你跟机器 (或男人) 交流的时候,则完全不同。我以前对韩师姐说过一
句话,作为原则,跟机器交流可以容易得多:指令要简短,意义要明确。不要试图暗示。当年去芬兰之前,偶像教导我说,如果遇到老外讨厌的,可以一边笑着一边骂他。
我挺感激偶像的,不过我不会那么做。一定要选择对方听得懂的语言,表达不满。
最礼貌的做法是,在发起攻击之前,要给出明确的信号--这一点,东北人做得不
好。东北同学应该理解南北的文化差异,南方的同学们并不认为辱及母亲的词是
发起动作攻击的明确信号。同办公室的黎巴嫩同学曾经拿我的一个瓷碗开玩笑,说:你们是把这个东西叫做
china?我说:这并不有趣。你会说什么?啊,虽然我知道你并无恶意,大家的文化差异很大,云云?最清晰
无误的消息传递就是:明确告诉你你不喜欢。今天在人人网,转了某位同学的博客,她明确告诉她的师姐,非常不喜欢这位师
姐的行为。挺好的。明确地表达能够让别人清楚地了解这个世界,包括你的那个部分。蔡依林先生说:"等我跳不动舞的那一天我还会做舞曲,到那时我会唱不需要跳着
舞唱的舞曲。"杨注:先生,是一种尊称,与性别可以无关。例如:孙宋庆龄先生。我们知道,她是真的热爱唱歌,可以失去舞蹈,但是不能失去歌唱。有位同学说:她想选文明史两门课,因为特别热爱。有另一位同学说,那就去旁
听呗。她说:我还想要学分。当你还想要别的什么的时候,我们就要考虑,你想要的,到底是你先提到的那
个,还是后提到的那个。当有人说,我真的喜欢你,如果你有房子就更好了。我们会有同样的思考。有人
尽可以补充说:安全感啦,什么的。但是,带了附加条件的,都是另一种东西,
而不是你声称的那种东西本身。如果你真的喜欢编程,你还会在乎它是不是赚钱么,在乎编哪种程序最赚钱?你
会用钱贴补编程这种行为。有同学说:我真的感到学习理论的迫切,但是图书馆的书太难借了,买书呢,太
贵了。有同学说:我真的非常想做项目,但是学习很紧张。请回想,你买魔兽点卡的时候,请回想,你给她买个冰淇淋然后牵着她的手满校
园走的时候。当你在乎做什么对你的生活影响的时候,我来告诉你:你并不喜欢它。你在用一
种日本人暧昧地方式在眼自己的内心交流。如果一个人骗了你,你想不想整死他?如果你的心骗了你呢。嘿嘿。我听到有人说:也许他 (它)是无意的。是这样,所有的欺骗都是有意的。欺骗这种行为,只能是有意的。啊,对了,唯
有一种例外,那就是幼稚。据说三五岁以下的孩子,还不能完全分清现实和想像、
愿望和事实。有时候,是一种表演吧。对别人表演,也对自己表演。就像有些经理,要求员工
努力工作,不计代价,后来说得自己都信了,直到损失自己的利益的时候才能再
重新发现事实的不同。我一直以来对演艺人员不存好感,偏见地认为,他们往往把生活本身也作为一种
表演。请参看海报栏里学生会同学们的照片,注意他们的微笑。蔡林依先生的话让我明白,有一种情感,是对表演的热爱,而这种表演并非希望
获取不当利益的欺骗。她的直截了当的话,清晰地传达了这一点。你能清晰明白地告诉我们,你热爱什么东西么?前几天在人人网看到一些同学在转一个状态,如果当初不能XX,我就去YY。比
如,如果不能编程,我就去做个销售。蔡林依先生估计会说:如果当初不唱歌,我就唱歌。我说:如果不能编程,我就去死。* 还有啥时候不能沟通有的时候无法沟通,仅仅因为回答者没有答案,或者,你想知道答案太早了。夏笳同学在douban上答复某同学的提问如下。问题是:"请问写一篇一万多字左右的科幻小说,除了清晰的情节线条,积极健康
的主题,还有完整的格式起承转合之外,要写得好一些,能够得上发表,还需要
什么要求?"她的答复是:"请先写出'一万字左右,清晰的情节线条,积极健康的主题,完整
的格式起承转合',然后编辑会告诉你还需要点什么。通常,提问题还会在前面加上,我如此热爱科幻写作啥的。这时,答案可以缩减
为:去做你喜欢做的事。不然就可以问:你是喜欢写作,还是喜欢写作成功被吹捧的感觉。又,当你写出了'一万字左右,清晰的情节线条,积极健康的主题,完整的格式起
承转合'的作品的时候,通常,你已经知道应该还需要什么了,或者,你知道了
如何去寻求到底需要什么。编程也是一样的。经常有同学问:如何才能成为一个好的程序员呢?回答可以是这样的:如果我知道,还会有时间在这里扯淡么?回答也可以是这样的:去编程序。同学可能会追问:然后呢?然后,然后你就知道答案了。有些事情,只有彼时才能理解信息,此时的沟通毫无必要。不是现在不告诉你,
而是,只有你自己亲自长大,才能明白。
当一名战士就是一支军队,那些不需要软件工程的时候
当一名战士就是一支军队,那些不需要软件工程的时候* 最初的代码1994年,当我开始对编程感兴趣的时候,还没有软件蓝领这一说法,但是我已经
有了后来软件蓝领流行起来以后的困惑。我第一次做的比较大的程序,是用GW-BASIC写的,没有IDE界面,需要按行号插
入,黑底绿字的显示器,单个软驱倒腾用两张盘。 (感谢我们的导员刘春光老师
每天中午借我用他的计算机) 要编的程序是自己想出来做着玩的,一个DOS界面下
CGA显示模式,菜单方式的……班费管理程序。如同齐同学的那个定票系统,这个软
件并没有实际应用,不过,它对我来说,比此后所有写的程序都更难。代码后来参加一个比赛的时候,打印了唯一的一份纸质版,打印纸抻开比我举起
手还要高。我当时遇到了程序设计中的核心问题--大量的代码,复杂的逻辑。我当时使用了GW-BASIC提供的一个非BASIC的功能 gosub,类似于函数调用,它帮
助我逃过了程序彻底混乱的厄运。后来当我学到模块化思想的时候,如遇故人。
我毫不费力地就接受了这个观念,因为痛过,所以印象深刻。后来经常见到有初学的同学函数写得超出两三屏,还很得意自己逻辑控制能力。
我就在心里撇嘴,你那是还没受够罪。大量的代码,复杂的逻辑。软件工程给了我们某个答案,就是软件蓝领,它声称
大量的人工、短期培训、重复地简单劳动,能够解决--以工程的方法--大量代码
和复杂逻辑的问题。是的,我们这么干过,好几千看前就这样做。埃及盖金字塔,是没有起重机的,
而是靠几千几万人力完成的;中国的古长城 (不是当代的) ,也没有等待现代电
子计算机和通信技术的发展,而是靠万喜良们的双手堆砌出来的。那个时候,他们一定期待一种东西,可以用燃油作为动作,稳妥精确地运输沉重
的材料。但是他们没有。因为是时代是父亲是民族选择我们,而不是反过来,所以很多时
候很多事情都不能一蹴而就。有的时候,智力或自然的法则也参与限制。* 他们说,没有解析解在数学当中,有一种解题的方法得出的结论称为解析解。我们解一个方程,得到
结果,如果我们所做的常见运算只需要 有限次,那么,这个结果就称为解析解。这是什么意思呢?就是说,你可以通过公式,只需要一个大式子,可能非常大,
但是最终可以计算出结果,直接地。难道不都是这样么?不幸的是,还有一些方程,伟大的牛人数学家们告诉我们,
有些方程就是不能通过公式求出来。而我们在工业生活中还需要求解。数学家牛人们还是有办法的。他们创造了另一种方法,用猜测-比较-再猜测,大
致这样的方法,逼近我们寻找的那个数。这些牛人们中的第一位就是著名的牛顿。但是,我们得到的是那个"数",是整个方程中的一段,而且是粗糙的。精细的完
全一致的解,可能永远也无法求得,我们得到的就是对于当前的应用"足够"精确
的个案。人类是多么地热爱形而上,热爱一次性解决所有问题啊。可是,数学牛人们说,
有时候,你哭也没有用,就是不行。在程序设计中也是一样,只有工程方法,有人说,就是蓝领方法,才能解决大量
代码和逻辑复杂的问题。如果没有燃油,没有热功当量,除了征服更多的奴隶,又有什么方法能够赢得自
己的自由呢?但是,我们是否已经判定程序设计一定没有解析解,所以只能靠人力逼近?* 解析解我和李记者曾经对刘典同学怀有偏见,认为他(没有虽然技)技术极好 ,但是却从
不注重软件中的工程,也不怎么注重合作。今天,关同学用事实给了我强烈的教育。她用事实告诉我:软件工程为什么有时
可以忽略?因为有的程序员,她一个人可以完成超过100个程序员的。就像有的战士,一个人就是一支军队。刘典同学讲过他写数据库的程序用了编译原理生成代码,讲过写手机游戏的时候
用虚拟机。前几天,我刚刚写了3千多的代码生成器,吐出来近6万行代码。这些
给我的印象也都没有今天这样深刻。程序设计,是一种创造工作,就像写小说。与写小说不同的,你所创造的是一台
机器,它可以做很多事,你甚至可以制造一台机器,它以代替你写作最终需要的
代码。在所有的计算机本科都开设了相关的课程,叫做编译原理。在一定程度上,这是
一个解析解。* 关同学今天我CIAC的导师请大家吃饭,辛苦一年。导师本人想参加,我托包师弟说:不
欢迎他。如果导师出现,今天稍微拘谨的场面,就可能令聚会完全不同。我们讨论了,我们吃午饭了,我们唱歌了,我们又吃晚饭了。刚开始吃晚饭没多久,包师弟说:2012的上半年,我们有一些任务要完成,相当
于本年度完成任务的40倍工作量。他说:这些工作都是相似的。可是这些相似的工作如果不能抽象出其中相同的部分,就没有一点相似。我们人
类看到的相似,对于构造代码而言,毫无用处。我看不出来相似。然后我想了几个方案,又都推翻--我在想从哪里抓那么多奴隶
来,又用什么报偿他们,工程本身于他们何益。其实,同学们并非奴隶,必须保
证同学们有足够利益和受益,否则除了我自己,一个人也派不出来。我说:包师弟啊,你能不能别在吃饭的时候说这个,我都吃不下去了。我真的吃不下去了。焦虑。而且,从这以后,我真的几乎没吃啥。奇迹时刻。关同学说:老师其实我想了,这些方案都是类似的。我说:啊?她说:所有的界面都可以……根据配置文件,new 出 一个 label来……是的,不熟悉关同学的,对女生能否写好程序有疑问的,请仔细看一下,她,不
是他。而且,她也不必再解释这个方案,因为软件组可以全体解散,而剩下的工作,只
需她一个人短时间就可以完成。这就是抽象的力量。她没有写GUI,而是解析配置文件生成了GUI;她绕过了令我头疼的C#如何表示
GUI--这样就可以生成RC文件,在编译前,我考虑过的方案--而是在运行时,new
出所有的GUI控件来,相当于解释执行的。* 后来后来,全体软件组成员加入了硬件组,将承担下位机的代码。很好,我终于不用
再讨厌他们用的IDE了,因为再也没有他们熟悉的VS什么的了。我们都开始进入
单片机或ARM的世界。后来,关同学对我的赞不绝口指出:这个方案是你告诉我的啊。我说:啊?她说:就是大仪网的时候,你告诉我blabla。我想起来了。不过,这仍不是我的方案,而是她的。一个方案之所以好(像这个,
好到如此突出,以致你一眼就能看到,绝不可能错过,如果你看到了的话),是
因为它被应用在一个恰好合适的领域,恰好解决了一个难题。至于这个方案有多
难有多容易,有多高科技,其实不是多重要。关同学刚毕业的时候,我们在CIAC讨论一个框架,当时我说:这个倒是可以再抽
象,不过我的方案有点耍赖了。关同学说:你是不是要用函数指针。是的。而且我非常欣慰了一下,因为学生优秀。黄同学当时认为:函数指针,也没啥难的啊。是的。函数指针一点也不难,能想到用函数指针解决这个问题,是一个高度。关同学在此刻想到了一个如此好的方案,所以接下来的半年,我们都不必那么焦
虑了。这就是解析解。关的方案,不是减轻了劳动,不是像我以工程的方法、各种测试 (关今天还提出
用MATLAB生成测试数据,也很好,后来给齐同学用上了) 来控制代码质量,用框
架规范程序员的行为,这些都不是,关同学直接替代十来个人把40个用例生成了
出来。代码质量如此一致和优秀,是由图灵保证的。* 后后记上午,与一位技术人员和一位经理谈话。我提到 通用的CMS > 定制的站点 > 使用CMS。那位技术人员不认可。我说:我刚刚说错了啊,我不是指复杂,而是指困难。那位技术人员blabla说,这不困难,只要如何如何即可。我说:其实我们也不必达成一致意见。我的意思不是说我们无法实现,我说的我
会收更多的钱。争执略去,我同意那位技术人员的下面这个观点 (大致意思,我翻译过的) ,但
是当时没有时间表达:这不是工作量,而是更高的高度。是的,那不是更复杂,不是更消耗时间,甚至不是更困难。那就是更值钱。关同学用事实告诉我:一名战士完全可以是一支军队。没错。
我早就说过
我早就说过"我早就说过",经常有牛人说出这一句话,配合气场,一般代表我多么地牛啊,
早就有些先见之明。有时候,还附带对听众的嘲笑,你看,你们居然不识货。我们常听到:某某观点我们祖宗早已有之,某某技术不过是啥啥技术的翻版……再来看两个例子。云服务的。当年,我整了几张大纸,画下了一个方案,命名为"科技改变生活",
内容是把计算和服务、软件都放在主机端,终端都用计算性能非常性的机器,只
负责显示。跟丁老师聊,他认为,这根本不可能。几个月后,云服务的概念正式
提出,当然,由别人,不是我。我的先见之明值得自豪么?不。因为我只有瞎扯的能力,如果整不出来,我也不
用负任何责任,所以,我也没有投入所有家当去整这个极有前途的东西。又。ZHUMAO有天提起来,他刚工作,或者还没工作的时候,跟我提到可以在计算
机里面装两个操作系统,一个跑在另外一个里面。我完全不相信,我觉得只有多
启动这一类的吧,怎么能一起跑呢。他说我都装出来了,我也不相信,直到亲眼
见到。说实话,我忘了这事很久了,因为不是我的光荣史的一部分。经他一提,
才想起来。ZHUMAO同学比我在云服务中的表现要好多了,他真的搭了个虚拟机出
来。我没有这种先见之明很应该惭愧么?也不。因为,即使我能预见到虚拟机巨大的
市场和技术潜力,我也没有能力实现。自己无法实现的事情,远观则可,没有必
要为没生出来的鸡蛋们打碎了而悲伤。前几天去学习精品课,听到两则八卦,也能说明类似的问题。某学校有个计划:
根据学生的既有表现和举趣,为学生提供下一步的建议,该学生该看什么,都可
以计算出来。很有雄心的计划,问题是,用什么样的技术手段可以实现呢?对于无法实现,至
少我们无法实现的东西,讨论到细节和投入资金,除了丰富一下想像力又有何益?另一个故事。说一位博士设计了个CPU,能在o(n^7)--可能是7--时间复杂度内解
决某个问题。更牛的人判定,这个问题像是个NP难问题,也就是说,这个问题理
论告诉我们,不能在这种时间内解决。即1.这位博士创造了奇迹,他很快就要得
图灵奖了,整个计算机行业的数学基础也快要换了;2.他整错了。在严格地论证以前,你更愿意相信哪个?能尽早地判断美好地梦想不能实现,并承认这一点,非常重要。甚至比美好梦想
本身更重要。判断那是美好梦想还是可能未来的一个重要的方法:你是否具有实现它的能力。如何度量能力本身呢?我并不太知道能力应该如何,不过,对于这种能力不是什么,我略有考虑,与你
分享。实现梦想的能力,不应该是聪明和飞跃的。《三宝大闹宝莱坞》里,编剧和导演为了表现主角是聪明睿智的,设计他完成了
以下任务:用照明灯的电惩罚向门上撒尿的学长、带无线摄像头的四旋翼直升机、
把危重病人绑在自己身上用两轮摩托车送去医院……用自行车带动(发电?)电推
子剪羊毛。各种聪明的做法。这些都很了不起,但是这些做法有个共同的特点,
使得它们的效用受限,那就是,这些做法不能用于设计航空母舰、航天飞机、导
弹,甚至AK47。我们在这些工业成果中,看到的是智慧,聪明无所置其身。也许吧,印度和我们一样,作为第三世界国家,对于技术具有这样的幻想,我们
认为英雄可以拯救世界。而事实上,即使有一千个刺客,也不能攻下四平。孙子
说,以正合,以奇胜。没有正,奇是没有用武之地的。杀伐掠地,最终靠的还是
野战攻城,而非奇技淫巧。《黑客与画家说》编程有三个层次:: (a)使用一种强大的语言,(b)为这个难题写一个事实上的解
: 释器,或者(c)你自己变成这个难题的人肉编译器。使用lisp语言,就是方案a;先写接口和函数库,或者写个dsl,大致相当于方案
b;用设计模式,或者把可能用编译器或者lisp macro生成的代码用手一行行写出
来,大致是方案c。作者暗示我们,方案a是最高妙的,方案b等而下之,方案c最基础。估计有很多人想,俺们应该按方案a行事。问题是,如果你能够使用lisp macro的话,有一个前提,你本人必是编译器/解释
器的专家,才有能力运用这种高级的特性。利剑在一个居家的妇男手中,可能还
不如切菜刀好使。如果你想用方案b,写个解释器,除了要具备写解释器的能力
外(此时不需要具备lisp macro的运用能力,也不需要会lisp语言),有一个前
提,那就是你本人必须能像编译器生成代码一样用手把代码写出来。你只是不想
这么做,不是没有这样的能力。你自己能完成的任务,才能指派别人去做。自己没有能力完成,却偏偏觉得别人
能够完成,而能够完成的人还不如他,这样的人也存在,不过大家面对他的时候
都感觉不太爽。而很多人的问题是,代码写得尚且人和编译器都不忍卒读,又怎么可能写出解释
器,或者更高级地用lisp macro作为编译器生成出代码来再执行呢。作者这样说,固然指出了一条光辉大道,但这大道必须从脚下走起。他只是没有
指出我们和他之间的鸿沟,估计会令很多人淹死在眼前的小河沟里。鸿鹄之飞固
然舒展而高级,不过虫子有虫子的移动之法,那就是爬。更何况同样飞得不错的
蝴蝶,当初爬得也是飞快的,虽然可能并不是最快。这里,还需要小心,实现的能力,是指能切实操作的能力,而不是感觉似乎大概
可以。能够和不能够,二者必居其一。"差不多"这种程度,根本就不存在。我初中的学校,以前提过,是山上片,升重点高中比例不高。每年大约十多个。
也就是说,如果你不是在这十多个里面,你是25名,27名,又或者
100名,150名,在升重点高中这一点上,是没有什么差别的。要么行,要么不行,"差不多"的内部,没有级别。而不行和行之间,有天渊之别。大学刚入学的时候,我以为我的听力老好了,还去过外语系请教学长,应该怎么
才能学得更好。很多年以后我才知道,如果只是听个一知半解,再加上看字幕或
者根据故事情节猜测,那根本不能算是听懂。要知道,一句外语也不会,光靠表
情,我们就能跟老外聊个半天。但是,你能告诉他你对于世界局势的看法么?你能精确地传达,斜上45度角倾望
天空是当今很多被另一些人称为脑残青年的生活态度,这样复杂的含义么?又或
者:: Lisp functions take Lisp values as input and return Lisp values. They
: are executed at run-time. Lisp macros take Lisp code as input, and
: return Lisp code. They are executed at compiler pre-processor time,
: just like in C. The resultant code gets executed at run-time.不能精确表达,我们就只能生存,而不能工作--工作,就是对别人有意义的事。
在这种情况下,你除了用父母的钱和微笑表达对别人的情感以外,对他人毫无帮
助。其实,一个秘密,我们还有一个办法。那就是,我们假装仍然生活在1500年以前的乡村,无论世界的哪个地方。我们施
施然穿过大街,任车流抚过身体,如同流水抚过舒蔓柔美的水草。然后,我们要快乐的生活,全然忘记明天及以后。我们满足于我们的幻想,过
去,我们无比伟大,未来也是。我们无论做什么,都"差不多"和最牛的那些想法非常接近了。只是,我们没有再
稍微努力一点,或者再精确一点,被他们占了先。但是,我们仍然是最聪明的个
体或者民族。只有哪天一发力,那世界就完全不同啦。这很简单。只要我们忘掉,这世界就像编译器一样残忍,只要你写错一个字符,
那么,一切就都是错的。任你流着眼泪说,我不过就差一点点,它都无动于衷。
孩子,这也是一种生活。