为什么我们要一直深入底层

为什么我们要一直深入底层我们喜欢说啥啥东西自古有之。别的我不知道,不追根问底并视为美德,这个自
古有之。后人曲解过陶先生的一句"不求甚解",并且引申义远比原意用得更广
泛,可见一斑。老祖宗喜欢说"自然之理也",然后就不管了;后来喜欢认为老祖宗说得都是有道
理的,也不管了。可是,为什么那是自然之理也,那是哪部分自然的什么理,我们不喜欢管;老祖
说的为什么都可能有道理,我们也不喜欢管。有人引述陈丹青先生的话说,中国人的哲学是,X,不管什么烂糟的,先活下去
再说。有人引述谁谁的观点,说我们要活在当下--似乎我们只活在当下,只活下
去就行。至于以后,X。我们正为此付出代价。今天,花了大半宿的时候,跟包师弟评估驱动程序开发的技术路线。以前,我们
的设备驱动使用driverstudio+vc6.0+ddk开发的。当时典典同学就劝过我,用
DDK吧,用DDK吧,driverstudio那玩艺的代码是不可靠的。我没听。时间总是太
紧迫,而众所周知,DDK的学习曲线贼拉地陡峭。现如今,有了新的需求,要支持windows7啦。windows7下连VC6.0都装不上去,
所以我去查替代品,说是用vs2008可以。顺便,我还看到,driverstudio的那家公司,似乎黄了。或者卖给了谁谁,然后
那个谁谁改做 云 了。QTMD云吧。netscape好好的公司就做了电子商务。不得不插感慨,技术好也只有被卖的命。这个世界,如果真的如偶像想让我告诉
学生的,前途啊,美好啊,我想说,那真的令人绝望。黑岛没了,我们说,那不过是游戏而已,做出花来能怎样。赛班没了,我们说,
那不过是个手机而已,做出花来能怎样。如今,driverstudio也没了。有的人可能对这个词不太熟悉。生产这个软件的公司,名字叫numega。这个名字
可能也不令你激动。他们的产品还包括BoundsChecker自动运行时错误检测用的,CodeReview源代码
级别的错误检测用的,TrueTime做性能评估的,SmartCheck做VB错误检测的。如果以上都不令你有感觉,以前还有个非常有名气的东西,叫做SoftIce,也是
他们的作品。那是真正的盗版工具和游戏加密啥的克星。ICE的意思是硬件模拟器,SoftICE的意思是就是那是用软件实现的硬件模拟器。当年,10多年前,我们用SoftICE破解游戏光盘加密,把它们安装在硬盘上,安
装在服务器上。我们按Ctrl-D切换到黑地绿字的界面--现在我仍然在沿用这样的风格,无比眷
恋--然后用bpx,bpe这样的指令设置断点。然后一行行一个函数一个函数地跟踪下去。直到找到在千百万行代码中,根据条
件跳转到可以执行游戏或者报告盗版的那行指令。然后,我们现在知道,开发这个工具的那家公司消失了。我们用以开发驱动程序
的那个工具的公司消失了。这,就是我们基于高级的工具,而没有深入底层所付出的代价。之一。当driverstudio消失,我看不懂DDK。当软件公司开始瞄准小企业,收取
ultraedit收取photoshop的版权费用,小企业只有两个选择。1. 花上大笔的钱,而且没完没了;2.从底层开发。凡是让你省时间省钱省学习成本的,一定是一个产品,这个产品终究是要收钱的。从底层开发,当然也有代价。比如,小企业没有能力养活底层的程序员。那应该
怎么办?买一个底层的产品,或者黄掉。我们还有别的选择吗?当某位同学由别人架设了环境,写出测试的hello world,代替你跑起来。我想
说,小心了,他还会替你取得学分--他的学分,不能分给你的。以后的工资也是
一样。深入底层,亲自地,然后从底层开始开发。从那里开始,这些工作是你的贡献。
这也是我告诉黄同学,为什么web程序设计没有前途的原因--因为它太简单,依
赖太多的工具,太顶层。在高层中,你所依赖的技术不稳定的因素以乘法而不是加法递增。建立在这样的
基础之上,一丁点动摇就会让大厦倒掉。你会做一个程序,只有在哈雷慧星回归那天的第10秒才能正确运行?可靠,就是当遇到任何困难的时候,你能把困难与别人隔离开来,而不是传递下
去。一个解决方案就是,你直接地与基础接触,而尽可能地不依赖别人。或者,只依赖可靠的人。大哥在两三年前,喜欢说一句说,现在不说了,"这是底线,不能讨论的。"我们
怎么会有很多底线的。我们不是相信世界是依赖简单的规则可以推导而出的么。沿着这许多底线挖掘下去,它们是不是有共同的基础,它们之间是不是有矛盾。
向底层,我们有无穷的空间可以探索,这些更坚实地基础支持我们在其上建立更
稳固的结构。这就是为什么我们应该学习操作系统,计算机体系结构,数据结构,算法,离散
数学。这就是为什么我们应该学习电子线路模拟电路数字电路。这就是为什么我们应该学习高等数字普通物理。因为我们不相信任何人的结论,我们要知道为什么会是这样,我们要亲见亲历亲
自决定。然后我们才能为我们的决定负责。费曼说过,底层有足够空间。他指的是在原子之下,纳米尺度的世界和规则。其
实,工程、学习莫不如此。附:有同学收到过我的邮件,说你看的太细了。我得这样说,其实全文是:我对有的同学说,你看的太细;而同时,当你不知道原因的时候,我又会抱怨你
看得太粗了。是不是好象我既要求你看细,又要求你不花时间,又要马儿跑,又不让马儿吃草?不是的。我的真正目的是:让你发现,什么才是重要的,需要细看,什么是可以
粗看的;粗看的东西,当发现需要细致了解的时候,又如何弥补。这些,也只能训练,不能传授。

桓仁,阳光极其灿烂

桓仁,阳光极其灿烂相机在旅游的头一天就没电了,所以只拍了非常少的几张。没了照片作为线索,
整个旅程似乎也支离破碎,成了很多片断。起得很早,披着长袖衣服准备上车睡觉。看见周同学穿了件砍袖衣服,露出两块
大粗膀子。跟小丁同学同坐,他的脚踝数次撞在车里一个突起的地方。后来换座,我说:"我
明白你怎么撞上的了。"他说:"你终于也撞上啦。""没有,我没撞上,我只是明
白了你怎么撞上的。"山势起伏盘旋,孙老师和李老师开始晕车。马老师一直坐在汽车的最后,值得佩
服一下。剩下的都是个人感受了。1. 比如没有好牙口,旅游是件遭罪的事。第一天晚上,曹同学说:"我今天中午就想知道,你都吃了啥。"我苦笑,"幸亏有鱼籽,还有豆腐。还有一种..."我比划那形状,大家说是鸡胗。
那东西虽然是肉,但是够韧,把我的假牙咯歪一小块。那小块被我抠了下来,不
然咽下去更惨。剩下菜都是鱼。有刺,我不会刷,只能看着。还有一种嘴里长了很多牙的,很凶
的样子,被大家分食了。很多同学不同的场合很多次劝我"这鱼没刺。"这让我见识了人类语言的含糊。"
没刺",其实是刺很少的意思。像我这种菜鸟,一根刺就足够去医院了。真正没刺的,只有鲨鱼。小时候我爸是饭店的,拿回过一条小鲨鱼,是不知整错
了冻在带鱼里的。真的没有刺。再没刺的,就只有鱿鱼这样的非鱼类了。后来,我对"原则上""基本上"总是心生畏惧。尤其是做项目的时候,用户跟你
说,"这个基本上没用",或者文件上说"原则上"同意或不同意。总是令人难以把握。就像因为看不清楚菜,我经常问旁边的好心同学,"这个是什么",我也经常问旁
边好心的同学,"他到底什么意思,是行,还是不行。"跟韩师姐说过,"指令要简短,意义要明确。"后来发现,说起来简单,其实跟人
类打交道其实挺难的。最难之处就在于,你不仅不知道他说是否正是他想的知
道,甚至听不明白他所说的到底是什么意思。所以,只好像对待鱼一样,置之不理。2. 没有好腿脚,旅游是件遭罪的事。左脚后跟滑囊炎,所以不能长走。多长算长呢,2公里左右吧,就会疼。所以,当车停在某个地方,大家欢天喜地跑去山上、洞里的时候,我就找个凉亭
或者什么能有点荫凉的地方,看隆美尔和田中芳树。等大家回来,多半个下午,时间正好看一章隆美尔打意大利,再看一章田中的中
国武将。感叹德国一战时军人的素养,感叹隆美尔是个好作家,感叹鬼子对中国研究得太
充分了。四下一片安静,只有我的感叹,和那些专门我为讲述故事的大师。有时,阳光很
强,我戴着墨镜读,有时,我脱光了膀子,让风紧贴着我吹过。远山直立如屏,勾勒出很美的天际线,远胜于城市里楼群圈起来的天空。为什么脚疼还要跟着去旅游呢?因为脚是在单位统计完出旅游的名单以后才发现
有毛病的。在此之前,我已经承诺过确保去。如同"鲨鱼真的没刺"一样,"真的"会去就是"真的"会去。没有"真的"二字的时
候,我们也应该保证自己的话是真的。如果诺言的诺现有困难,那么,是做出承诺的人自己的事情,不到万不得已,不
应该把困难传递给接受诺言的人。当然,万不得已这四个字,大家的理解差异很大。如果你总是"万不得已","实在没有办法",你的诺言又有几个人敢当真呢?3. 打水仗很好玩,漂流倒在其次。在大雅河漂流的过程中,涌现出无数可歌可泣的故事和骁勇善战的斗士。有撕碎别人雨衣的,有抢夺别人武器的,有非常缓慢而有条不紊地朝人脖子里倒
水的,有把船都扔别人船里的,有集结成船队阻击后来者的。有在陆地上等着袭击靠岸船只的,有不得不举白帽子投降的。各自对号入座吧。我的战果是折断了一把塑料飘,锋利的手柄在我右颊留下一道不知的划痕。这两
天正盼望不要结疤。4. 美好的日子都会结束,然后生活还要继续。晚上,我泡一包方便面,整或不整根火腿肠。这是我能吃的全部食物。小丁同学点根烟,我们开始谈人生、艺术和哲学。宾馆里非常黑,点亮所有的灯
也不能看书。外面倒是有些光亮,窗户上映着小丁同学的影子和一亮一灭的烟。无论谈的结果如何,第二天都要早起,去这里或者那里,爬山或者下洞。其实,桓仁是我妈的故乡。她说过,进那些洞原来都是不要钱的。所有的一切原
来属于所有的人,后来,只属于能付得起钱的人。大哥曾经嚼着烤串考问过我难以回答的问题,逼我承认"私有制是万恶之源"是没
有足够依据的。但是,当可继承的私有制作为一种社会制度,又如何保证拥有财
富的人不去购买他人的自由呢。我可以大言不惭地说,任别人给我多少钱,我也不出卖一包方便面,夜色里扯淡
的自由。但是,如果大把的钞票摆在我的面前,我还能如此淡定么?如果同时发现别人都有大把钞票,而就我没有的时候呢?如果发现我承担着责任的人需要大把钞票呢。说远了,还是珍惜能嚼动方便面的时光吧。阳光留在我身上的痕迹正在消退。漂流的当晚,我的手背像戴了忍者手套,红色
的和白色的皮肤泾渭分明,呈现出方形的边界,连鼻梁顶都是红色,而两侧是白
的。而现在,我的肤色正逐渐恢复,慢慢沉灭在众人之中。桓仁的阳光依然灿烂,只是我们最终将淡忘这一切,只会奢望从城市楼群的缝隙
里能望到天空。然后,为了能比别人看到的天空多一平方毫米而窃喜终日。

标 题: 我写了一个用来在上班时偷偷看小说的工具 转载

发信人: wolfgang (狂云), 信区: Emacs
标 题: 我写了一个用来在上班时偷偷看小说的工具
发信站: 水木社区 (Mon Jul 11 10:24:04 2011), 转信版面需要话题,我们需要有一些激动人心的事,
比方说,用emacs在上班时偷偷看小说。我认为一个很好的办法是,把小说写到源代码里去!
满屏幕的源代码,其中夹杂着一行小说,还是被注释掉的,
匆匆路过的领导总不会注意到吧?把以下代码贴到.emacs中,
把你想读的小说放在 ~/misc/book.txt 中,
按C-.看前一行,按C-,看后一行,按C-'清除作案痕迹。
我也不用多说废话,谁用谁知道。
;;;; Leisureread by wolfgang 2011-7-12 10:55 ver1.3(require 'bookmark)
(when (not (file-exists-p bookmark-default-file))
(bookmark-save))
(bookmark-load bookmark-default-file t t)(defvar *leisureread-my-book-path* "~/misc/book.txt")
(defvar *leisureread-bookmark-name* "leisureread")
(defvar *leisureread-window-height* 1)(defun leisureread-initialize-bookmark-if-necessary ()
;; if no previous bookmark, create it at first line
(when (or (null bookmark-alist)
(null (assoc *leisureread-bookmark-name* bookmark-alist)))
(find-file *leisureread-my-book-path*)
(bookmark-set *leisureread-bookmark-name*)
(bury-buffer))
;; if not opened book.txt yet, open it and keep it open
(when (not (get-file-buffer *leisureread-my-book-path*))
(save-excursion
(find-file *leisureread-my-book-path*)
(bookmark-jump *leisureread-bookmark-name*)
(bury-buffer))))(defun leisureread-line-prefix ()
(concat comment-start "+"))(defun leisureread-decorate-lines (text)
(let ((lines (split-string text "n")))
(let ((decorated-lines
(mapcar (lambda (line) (concat (leisureread-line-prefix) line))
lines)))
(reduce (lambda (acc next) (concat acc "n" next))
decorated-lines))))
(defun leisureread-on-leisure-line-p ()
(let ((text (buffer-substring-no-properties
(line-beginning-position)
(line-end-position))))
(start-with-p text (leisureread-line-prefix))))(defun start-with-p (big small)
(and (>= (length big) (length small))
(string= small (substring big 0 (length small)))))(defun leisureread-clear-line ()
(interactive)
(while (leisureread-on-leisure-line-p)
(kill-whole-line)))(defun leisureread-insert-next-line ()
(interactive)
(leisureread-insert-line 'forward-line))(defun leisureread-insert-previous-line ()
(interactive)
(leisureread-insert-line 'previous-line))(defun leisureread-insert-line (func)
(leisureread-initialize-bookmark-if-necessary)
(move-beginning-of-line nil)
(let ((text ""))
(while (<= (length text) 1)
(save-excursion
(set-buffer (get-file-buffer *leisureread-my-book-path*))
(funcall func)
(setq text (buffer-substring-no-properties
(line-beginning-position)
(line-end-position *leisureread-window-height*)))
(bookmark-set *leisureread-bookmark-name*)
(bury-buffer)))
(save-excursion
(leisureread-clear-line)
(insert (leisureread-decorate-lines text))
(newline))))
(global-set-key (kbd "C-.") 'leisureread-insert-next-line)
(global-set-key (kbd "C-,") 'leisureread-insert-previous-line)
(global-set-key (kbd "C-'") 'leisureread-clear-line);;;; emacs的用户有福了!让其它编辑器的用户颤抖吧!--
热二定律比动量守恒更高
它告诉我们世界的原初是恨 爱, 就是对恨的战斗!
※ 修改:·wolfgang 于 Jul 12 12:27:23 2011 修改本文·[FROM: 221.133.241.*]
※ 来源:·水木社区 newsmth.net·[FROM: 221.133.241.*]