20120126
整理书架子
从除夕那天,我开始整理书架子。有两年没整了,自从上次挪书架子,把书都卸下来,突然有什么任务,没有时间按类别放回去,后来的书有很多就直接堆起来。
混乱一旦开始,就会愈演愈烈,直到,最近决定全都重新整理一遍。
整理书架是个体力活,同时也是梳理知识结构和学习过程的思考。
这几年,似乎一共整理了四五次吧,一般是搬家以后,或者乱得自己受不了。最初的一批书,是大学毕业的时候幸存的几本,教材加上特别钟爱的,没有卖掉。由于我彼此那么痛恨自己的专业,以致于把绝大部分教材都扔掉了。过了很多年,或者说,越是到了后来,我越发现,本科的学习所形成的世界观和方法论,深入到了骨髓,深入到你自己都不知道它们在那里。一个不太好的比喻,就像有些小资口声声谈西方思想什么的,但是骨子里,如果你深挖,却发现他们比上位的那些人更加东方。这里的东方,丝毫不含神秘哲学或者我们的文化的褒义。
这第一批书,几乎都是理工类的。
再后来的一批书,是从旧书市场上买到的,有各种品相。大多暗黄了,书页卷曲。这些书,好多在购买前就已经看过了,有些知识甚至都已过时,尤其是小时候就特别想拥有的那种,虽然借着看过几遍,仍然买了珍藏。这第二批书,大部分是人文类的,持续了好多年,有一些和第三批书的购买时间重叠,甚至延续到那以后。
第三批书,是读研究生期间,到了期末,突然说是有一笔经费,可以买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技术实践教程,包师弟借给我的。前两天的某夜,我独坐在桌旁,喝光了咖啡,次序翻过那些书页。不能做实验,也不能上网,猜测作者的意思,用纸记下疑问和收获。凌晨五点的时候,天边开始有了亮光,书还剩下一章。
这个时候,我们才知道,那些短暂就能获得的快乐,并非我们真正想要的,它们也会瞬间就消失。
20120117
音程示范歌曲,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
20120115
上位机与下位机的交流:编码与字节序的实验
下午在南区的讨论班居然提前结束了,而且,到预定吃晚饭的时候还剩两个半小时,按包师弟的说法,真是个尴尬的时间啊。干做两个半小时,太无聊,如果赶回所编程序,似乎时间又不太够的样子。我甚至想提议去暴走吧,但是想到冷得冻肺子的天气,想到包师弟和我都正感冒,也就只是想想。
包师弟说:要编这程序的想法,真是搅得人...
我忘了他原来的措词,为避免他跑上来纠正,只好留了空白。大意是,热血沸腾啊,夜不能寐啊之类的。现场表现是坐立不安。
好吧。
我们迅速用了十来分钟重新回顾了一下以前做过的计划,然后跑出来打车去所里。
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/]
20120113
面试,为什么总问些没用的,及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
还有同学提到,为什么我有这么好的想法公司却不用我,或者不用我的想法。
你的确很有想法,可能非常杰出,但是企业招的却是员工,不是老板。我们都有
把别人当工具的倾向,不过如果想实施 (且不论是否正确),得先有自己身为工具
的觉悟。
好想法,应该讲给风险投资商听,或者你自己有钱的话,讲给自己听。
* 考试
齐同学动手能力挺强的,他抱怨,为什么考试的时候要考概念。
因为,我们将使用这些概念进行交流。比如,正则表达式,这是个严格清晰的概
念,一点也不像文科同学说的什么...那些乱用词。
我们不能使用诸如"开头两个字是课文",这样的说法只能在跟人类跟用户这样有
限的交流范围使用。
之所有要考概念的另一个原因,你真的以为自己清楚地掌握了它么?
的确,这样,有的同学靠背诵就能得到很高的分数。这是考试技术低下造成的,
我们却不能因此放弃对概念的掌握。
从难度上看,背诵 < 举例 < 使用 < 复述。
有的时候,即使你偶而能正确使用 (在有限的场合下,有时还受到技术主管的辅
导或限制,因此不易失控),也不见得总能正确使用。而复述,可以考察出你是
否了解其中所有的要点。
齐同学还提到,背概念真没意思。大意如此。
概念从来就不是背的。不要使用别人的词汇,而应该使用自己的。如果你对要
点有所遗漏,当你应用它的时候,你如何确保充分注意到这一技术的优点、缺点、
使用的限制?
使用的时候再查书?这确实是个答案,而且是个不错的答案。
不过有些东西,我们要求的是 熟练,而不仅仅是掌握和理解。在水里理解自由泳
的精要,而不会熟练地扑腾 (还需要足够的心肺功能和肌肉耐力吧) ,也是白扯。
要求"熟练"的一个结果,就是那些你最经常用到的知识,绝不会不理解,虽然不
能确保你的理解没有编差。
谁说的来着:不了解自己的文章中的词意的作者应该枪决。同样,只会抄网上示
例,甚至不知道调的那个函数原型,没有读过手册的程序员,也...
* 李记者
你辞职,我对你还是挺有信心的。相同的技术和理论,总可以应用于不止一家公
司和不止一个领域。
这个故事告诉我们,新技术等等,都是浮云。我们内心深处的,能长久停留的,
才可能成为我们自己的一部分,永不失去。
祝你顺利。
20120110
悠长假期
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及{...}里面的那些东西。
在函数式编程中,强调只得到返回值,而不希望在每轮迭代 (及整个计算过程中)对
环境有任何影响。凡是对环境的影响,称为副作用。
人生的意义,恰恰在于副作用,即你对于别人的帮助。
这样当你挂了的时候,就有人怀念你曾经的存在令世界有所不同;也许还有人给
你烧书看。
正是这些副作用,而不仅仅是求值的结果,让我们区别于外界环境这个纯粹物质
的世界。
其实,做工程和做练习也是一样的。能得到什么结果,挣多少钱,不过是副带的
一个结果而已,我们不必以这些来评判自己的价值。
徒步的人,如果只是为了结果,有那么多现代化交通工具可以选择;推哑铃的那
些,跑圈的那些,不过是一次次一次次推起来跑过去,又回去终点;做各种实
验,最终大体都扔到废纸堆里或者删除。
但是,这些过程,令我们从纯物质的世界里分离出来,成为人类--或者工程师。
我们所享受的,不是结果,而是过程本身的吸引。
想起了以前对建一同学说的:工程本身很重要,但是它远不如 你做工程很爽 重
要。
人生就像一个短促的假期,你从何而来,终止条件如何。在这期间,你发生了哪
些变化,你令世界发生了哪些变化。
假期开始了,你快乐么?
20120107
那些非常好的书
列表在这里:[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
出版社 :
20120106
与机器(或男人)沟通的原则
今天感冒头疼,脑袋不咋清楚,以下主要扯淡,跟技术关系不大。这也反应了最
初决定开写博客的原因。我很长时间一直担心所写的东西过于幼稚,不入大家法
眼,又担心过几年以后会觉得以前写的东西太担淡了。不过,后来被劝道:1.即
使特别糟烂的东西,总也可能对更幼稚的同学有所启发;2.错得离谱的那些,自
然会有同学跑上来骂,这样我就可以进步了。
这就是写博客的目的:沟通--软件工程中代价最大的部分。
* 差异,世界不是你想像的那样
需要沟通的原因是,接受信息的人和发出消息的人所了解的信息是不同的。所以
跟黄同学提到过几次的一个写文档的原则:"要清楚",原因就于此。
如果读者已经知道了你要写的内容,他为什么还要读。所以,在动笔以前,你就
要猜测读者不知道些什么。最简单的猜测是:假设读者啥也不知道。这是安培当
年在演讲中用过的方法,也是我们看到很多牛的英文教材写得非常详细 (甚至罗
嗦)的原因 。类似的,为什么我们的很多教材非常薄而简洁,我恶意地猜测,作
者只是想告诉我们:你看,我懂。如此而已。他并不希望我们也懂,也不愿意为
我们懂而努力。
所以我们也不愿意买他们的作品。
写得简短,可以藏拙,或者期待由于自然语言的二义性,虽然你不明白,但是读
者明白了;写得罗嗦,至多是被跳过;或者……我也看到过对我罗嗦不能忍受,跳
上来骂我的。
沟通需要先预设背景,那是双方都接受和明白的部分,然后才是交换差异的信息。
忽略背景,固然简洁,但是那是没有基础的楼宇,清楚打了折扣。
所以,讲故事都要先来时间地点。
比如以前导师讲:芬兰有公路可以直达北极圈……那一路上都要小心鹿……路边有牌
子,上面写着"小心鹿"。就跟咱们有些人跟北海道的鬼子学习,在车上喷个牌子
"有熊出没注意"。
我当时感叹:看看人家,多环保啊,怕把鹿压着了。
导师说:是怕把车撞坏了,鹿长得很大,也够结实。
这个故事告诉我们,世界不像我们想像的那样,所以我们才需要沟通。
* 不沟通的情况
小学的时候看过一个笑话:方程有两种,一种是方程,一种是 非方程。就是有
时候你解一个方程 (等式),解了半天,到最后,才发现,其实那根本不是个方
程。
但是最初的时候你不知道的时候,也称它过方程来着。
是不是有同学想到了很多别的东西?
所以,沟通有两种,一种是沟通,一种是不沟通。
什么时候不沟通呢?
当表达无效的时候,我们会选择停止沟通。双方互骂,互掐,对打,仍然在交流。
真正的不爱,不是恨,而是冷漠。
在琼瑶还不是奶奶的时候有部小说,名字忘了。女子很多年 (杨注:一般仍很年
轻,所以很多年一般是0.5或者0.3年的样子) 后见到了当年的男朋友,然后场
景,男子不在场的时候,她问她爸,"他刚刚怎么评价我?"
她爸说:他大骂特骂了你,没有一句好话。
女生喜极而泣:太好了,还有希望。
你会对陌生人发火么?如果会,你会对电线杆子发火么?小时候我们会的,撞了
墙还要打墙两下才能解气。
所以做项目的时候,你的客户 (还有你的下属和上级) 不跟你沟通的那部分,才
是更重要的,所以请他们表达出来非常重要。而"请"他们表达这件事,绝不可能
是他们自己的责任。
昨天某公司一位常务副经理说:大学做开发啊,进度慢……
他说到这的时候我频频点头,不是表达礼貌,而是表示赞同。他的担心不无道理。
但是他接着说:意识啊,意识问题。
我笑了:某经理,其实这主要是个成本问题。
言下之意是,如果你给够钱,当然意识可以更好。不过,我得说,我这不是什么
好的沟通:无论从方式,还是从内容上看。
很多年前,我还是本科生的时候,就对老板这样说过。这不是意识问题,因为并
非这个世界围着你转的就是意识对的,按你的控制操作的,就是好的,而不利于
你的就是不咋地的。
不是只有你的意识才是意识,每个独立的人类个体都有意识的。
当你想要操纵,或者诱导别人的时候,你与他的沟通之路就已经封闭了。人与物
之间没有什么好交流的。
前面那位常务副经理显然明白了我的意思,停止了沟通或布道。当他过了一阵再
次提起意识二字的时候,我又笑了,他又不说了。
这时可以判定,这是有效沟通。
如果沟通无效,其中有些,可以试着换个方式;有些,则只能停止。
在包括面向对象系统分析与设计的方法中,有一个术语叫做 消息。当消息到来的
时候,接收消息的信宿要做出一个动作 (执行消息响应函数,转发或执行对应的
消息句柄,等等)。这里有一个前提,那就是消息接收者有响应消息的机制,称
为责任。不承担责任的对象,就不能响应消息,因此不能接受通信,因此也没有
存在的必要--因为你无法调用它。
我们所看不到摸不到,也不能沟通的,就是不存在的。
* 沟通的原则
沟通有时候进行了,但是却没有效果。双方都有责任。当我们用计算机语言跟机
器沟通的时候,如果沟通无效,那责任只在我们自己。
因为机器是男人设计的,主要是西方的男人设计的,所以文化色彩可能跟咱们习
惯的略有差异。
经常有人说,日本人说话非常暧昧。这里的暧昧与色情无关,指的是不清楚,模
糊的表达。
我看到最早的例子是这样的。美国人和日本人谈判,美国人不管说啥,日本人都
说"嗨"。美国人一看,这日本人真好说话啊,那就提要求提要求提要求。第二
天,日本人不签字,说,我那些个"嗨",就表示"听到了",不是"我同意"的意思。
其实咱们中国人也差不了多少。我经常见到有人频频点头,就表示我听到了,丝
毫也不表示我同意,甚至他说"是啊,对啊"的时候,也并不对应具体的意思,那
和脏话差不多,仅表示语气。
我们还经常见到,职员对老板说的是:你看,现在物价涨了,房租挺贵的,我媳
妇认为我的职业没有前途……他要说的是:我想涨工资。
当年一位老板对我如此暧昧地说:小杨家境挺贫寒的。
我说:你应该把上次做网的工资给我,这跟我的家境没什么关系。
后来我说,某部分是我做的,既然合作失败,我要删除那部分工作。他也同意了。
再后来,他说"你痛快把这部分活做了",这暗示报酬还是可以有的,谈判还是可
以继续的。
好了好了,回忆这些让我感觉我们大家都是女人,生活在红楼梦之中,每句话里
都套着各种话。
……女人们也经常交流了半天,却没有传达任何具体的信息。事实上,她们传达了
重要的信息,那就是"你看,我乐意和你交流"。这也很重要。
不过,当你跟机器 (或男人) 交流的时候,则完全不同。我以前对韩师姐说过一
句话,作为原则,跟机器交流可以容易得多:指令要简短,意义要明确。
不要试图暗示。
当年去芬兰之前,偶像教导我说,如果遇到老外讨厌的,可以一边笑着一边骂他。
我挺感激偶像的,不过我不会那么做。一定要选择对方听得懂的语言,表达不满。
最礼貌的做法是,在发起攻击之前,要给出明确的信号--这一点,东北人做得不
好。东北同学应该理解南北的文化差异,南方的同学们并不认为辱及母亲的词是
发起动作攻击的明确信号。
同办公室的黎巴嫩同学曾经拿我的一个瓷碗开玩笑,说:你们是把这个东西叫做
china?
我说:这并不有趣。
你会说什么?啊,虽然我知道你并无恶意,大家的文化差异很大,云云?最清晰
无误的消息传递就是:明确告诉你你不喜欢。
今天在人人网,转了某位同学的博客,她明确告诉她的师姐,非常不喜欢这位师
姐的行为。
挺好的。
明确地表达能够让别人清楚地了解这个世界,包括你的那个部分。
蔡依林先生说:"等我跳不动舞的那一天我还会做舞曲,到那时我会唱不需要跳着
舞唱的舞曲。"
杨注:先生,是一种尊称,与性别可以无关。例如:孙宋庆龄先生。
我们知道,她是真的热爱唱歌,可以失去舞蹈,但是不能失去歌唱。
有位同学说:她想选文明史两门课,因为特别热爱。有另一位同学说,那就去旁
听呗。她说:我还想要学分。
当你还想要别的什么的时候,我们就要考虑,你想要的,到底是你先提到的那
个,还是后提到的那个。
当有人说,我真的喜欢你,如果你有房子就更好了。我们会有同样的思考。有人
尽可以补充说:安全感啦,什么的。但是,带了附加条件的,都是另一种东西,
而不是你声称的那种东西本身。
如果你真的喜欢编程,你还会在乎它是不是赚钱么,在乎编哪种程序最赚钱?你
会用钱贴补编程这种行为。
有同学说:我真的感到学习理论的迫切,但是图书馆的书太难借了,买书呢,太
贵了。
有同学说:我真的非常想做项目,但是学习很紧张。
请回想,你买魔兽点卡的时候,请回想,你给她买个冰淇淋然后牵着她的手满校
园走的时候。
当你在乎做什么对你的生活影响的时候,我来告诉你:你并不喜欢它。你在用一
种日本人暧昧地方式在眼自己的内心交流。
如果一个人骗了你,你想不想整死他?如果你的心骗了你呢。
嘿嘿。我听到有人说:也许他 (它)是无意的。
是这样,所有的欺骗都是有意的。欺骗这种行为,只能是有意的。啊,对了,唯
有一种例外,那就是幼稚。据说三五岁以下的孩子,还不能完全分清现实和想像、
愿望和事实。
有时候,是一种表演吧。对别人表演,也对自己表演。就像有些经理,要求员工
努力工作,不计代价,后来说得自己都信了,直到损失自己的利益的时候才能再
重新发现事实的不同。
我一直以来对演艺人员不存好感,偏见地认为,他们往往把生活本身也作为一种
表演。请参看海报栏里学生会同学们的照片,注意他们的微笑。
蔡林依先生的话让我明白,有一种情感,是对表演的热爱,而这种表演并非希望
获取不当利益的欺骗。她的直截了当的话,清晰地传达了这一点。
你能清晰明白地告诉我们,你热爱什么东西么?
前几天在人人网看到一些同学在转一个状态,如果当初不能XX,我就去YY。比
如,如果不能编程,我就去做个销售。
蔡林依先生估计会说:如果当初不唱歌,我就唱歌。
我说:如果不能编程,我就去死。
* 还有啥时候不能沟通
有的时候无法沟通,仅仅因为回答者没有答案,或者,你想知道答案太早了。
夏笳同学在douban上答复某同学的提问如下。
问题是:"请问写一篇一万多字左右的科幻小说,除了清晰的情节线条,积极健康
的主题,还有完整的格式起承转合之外,要写得好一些,能够得上发表,还需要
什么要求?"
她的答复是:"请先写出'一万字左右,清晰的情节线条,积极健康的主题,完整
的格式起承转合',然后编辑会告诉你还需要点什么。
通常,提问题还会在前面加上,我如此热爱科幻写作啥的。这时,答案可以缩减
为:去做你喜欢做的事。
不然就可以问:你是喜欢写作,还是喜欢写作成功被吹捧的感觉。
又,当你写出了'一万字左右,清晰的情节线条,积极健康的主题,完整的格式起
承转合'的作品的时候,通常,你已经知道应该还需要什么了,或者,你知道了
如何去寻求到底需要什么。
编程也是一样的。
经常有同学问:如何才能成为一个好的程序员呢?
回答可以是这样的:如果我知道,还会有时间在这里扯淡么?
回答也可以是这样的:去编程序。
同学可能会追问:然后呢?
然后,然后你就知道答案了。
有些事情,只有彼时才能理解信息,此时的沟通毫无必要。不是现在不告诉你,
而是,只有你自己亲自长大,才能明白。