笑话三则

昨天在隔壁宿舍讨论算法的时候,一个室友大喊了一声:“卧槽,老子就是更新了个 QQ 而已,这 QQ 浏览器和 QQ 音乐是哪里来的!”

说起来,我昨天从一个网站上下载了一些扑克牌的素材图片,过了一会儿……打字的时候,输入法已经默默地变成了百度输入法……

不过还是另一位朋友更惨,他说:“有次回宿舍,手机顺手插在电脑的 USB 上就上厕所去了,回来的时候,手机已经装好了360……。”

形成鲜明对比的是,最近收到一封广告邮件,于是发回去问他们是怎么知道我地址的。竟然真的收到了礼貌的回复:

emailreplay

 

自由比皇帝更伟大——《悲惨世界》笔记

在第三部《马吕斯》第四卷 ABC 朋友会中的第五章 “开阔视野”中,马吕斯和他在 ABC 的朋友们有一段精彩的辩论。ABC 的青年象征了年青一代,思想进步,热爱自由,热血,激进。读这段的时候,我和他们产生了强烈共鸣。

即使没读过《悲惨世界》,也能从中感受到这些青年人思想碰撞的火花,这段对话发生的时候,马吕斯刚加入 ABC 朋友会。在此之前,追随拿破仑的生父去世,马吕斯知道了父亲的事迹,由此产生了对拿破仑皇帝狂热的崇拜,和对共和国复辟的坚定信仰。因为这个政治观点和外公不和,大叫着“达到波旁王朝,打倒肥猪路易十八”离家出走,加入了 ABC 朋友会。 这一章,摘抄如下:

五 视野的扩展

青年们的相互接触有那么一种可喜的地方,那就是人们在其中无法预见火星,也无法预测闪电。过一会儿将会爆发什么?谁也不知道。温婉的交谈常引起一阵狂笑。人在戏谑时又常突然转入严肃的话题。偶然一个字能使人冲动。每个人都被激情所主宰。一句玩笑话已够打开一个意外的场面。这是一种山回路转、景物瞬息万变的郊游。偶然是这种交谈的幕后操纵者。

那天,格朗泰尔、巴阿雷、勃鲁维尔、博须埃、公白飞和古费拉克一伙谈得起劲,你一言,我一语,混战正酣,不料从唇枪舌剑中突然出现了一种奇怪的严肃思想,穿过喧杂的语声。

一句话怎样会在言谈中忽然出现的?它又怎么会突然吸引住听者的注意力?我们刚才说过,这是谁也不知道的。当时,在喧嚷哄闹声中,博须埃忽然对着公白飞随便说出了这个日期:

“一八一五年六月十八日:滑铁卢。”

马吕斯正对着一杯水,一手托着腮帮,支在一张桌子边上坐着,听到”滑铁卢”这三个字他的手腕便离开了下巴,开始注视在座的人们。

“上帝知道,”古费拉克喊着说(在当时,”天晓得”已经不大有人说了),”十八这个数字是个奇怪的数字,给我的印象非常深。这是决定波拿巴命运的数字。你把路易放在它的前面,雾月放在它的后面,这人的整个命运便全显现在你面前了。这里又还有这么一个耐人寻味的特点,那就是开场是被结局紧跟着的。”

安灼拉一直没有说过一句话,这时他才开口,对着古费拉克说了这么一句:

“你是要说罪行被惩罚紧跟着吧。”

马吕斯在突然听见人家提到”滑铁卢”时,他已很紧张了,现在又听人说出”罪行”这种字眼,那就更超出他所能接受的限度了。

他站起来,从容走向那张挂在墙上的法兰西地图,地图下端,原有一个隔开的方格,方格里有个岛,他把手指按在那方格上,说道:

“科西嘉。一个使法兰西变得相当伟大的小岛。”

这是一股冰冷的风。大家全不说话了。大家都觉得要发生什么事了。

巴阿雷正在摆出他常爱用的那种正襟危坐的姿势来和博须埃对驳,他也为了要听下文而放弃了那种姿态。

安灼拉的蓝眼睛并没有望着谁,仿佛只望着空间,这时他眼睛虽不望马吕斯,嘴里却回答说:

“法兰西并不需要科西嘉来使它自己伟大。法兰西之所以伟大,只因为它是法兰西。’因为我的名字叫狮子。'”

ABC

马吕斯绝没有退却的意思,他转向安灼拉,他那出自肺腑的激越的声音爆发出来了:

“上帝惩罚我要是我有贬低法兰西的意思,但是把它和拿破仑结合在一起,这并不贬低它一丁点。真怪,我们来谈谈吧。我在你们中是个新来的,但是老实说,你们确使我感到奇怪。我们是在什么地方?我们是谁?你们是谁?我是谁?让我们就皇帝这个问题来谈谈各自的见解吧。我常听见你们说布宛纳巴,象那些保王党人一样,强调那个’乌’音。老实告诉你们,我那外祖父念得还更好听些:他说布宛纳巴退。我总以为你们都是青年。你们的热情究竟寄托在什么地方?你们的热情究竟要用来作什么?你们佩服的是谁,如果你们不佩服皇上?你们还要求什么?如果你们不要这么一个伟大的人物,你们要的又是些什么样伟大的人物?他是一个全才。他是一个完人。他的脑子包含着人类种种才智的三乘。他象查士丁尼那样制定法典,象恺撒那样独理万机,他的谈吐兼有帕斯加尔的闪电和塔西佗的雷霆,他创造历史,也写历史,他的战报是诗篇,他把牛顿的数字和穆罕默德的妙喻糅合在一起,他在东方留下了象金字塔那样高大的训谕;他在提尔西特把朝仪教给各国帝王,他在科学院里和拉普拉斯争鸣,他在国务会议上和梅尔兰辩论,他经心整饬纪律,悉力排难解纷,他象检察官一样了解法律,象天文学家一样了解天文;象克伦威尔吹灭两支蜡烛中的一支那样,他也到大庙①去为一粒窗帘珠子讨价还价;他见到一切,他知道一切,这并不妨碍他伏在他小儿子的摇篮上笑得象个天真烂漫的人;突然,惊骇中的欧洲屏息细听,大军源源开拔了,炮队纷纷滚动了,长江大河上建起了浮桥,狂风中驰聘着漫山遍野的骑兵,叫喊声,号角声,所有的宝座全震动了,所有的王国的国境线全在地图上摇晃起来了,人们听到一把超人的宝剑的出鞘声,人们看见他屹立在天边,手里烈焰飞腾,眼里光芒四射,霹雳一声,展开了他的两翼,大军和老羽林军,威猛天神也不过如此!”

大家全不言语,安灼拉低着脑袋。寂静总多少有那么点默许或哑口无言的味儿。马吕斯,几乎没有喘气,以更加激动的心情继续说:

“我的朋友们,应该公正些!帝国有这么一个皇帝,这是一个民族多么辉煌的命运啊,而这个民族又正是法兰西,并且能把自己的天才附丽于这个人的天才!到一国便统治一国,打一仗便胜一仗,以别国的首都为兵站,封自己的士卒为国王,连连宣告王朝的灭亡,以冲锋的步伐改变欧洲的面貌,你一发威,人们便感到你的手已握住了上帝的宝剑的柄;追随汉尼拔、恺撒和查理大帝于一人;作一个能使每天的曙光为你带来响亮的前线捷报的人的人民;以残废军人院的炮声为闹钟,把一些彪炳千古的神奇的词抛上光明的天际,马伦哥、阿尔科拉、奥斯特里茨、耶拿、瓦格拉姆!随时把一些胜利的星斗罗列在几个世纪的天顶,使罗马帝国因法兰西帝国而不能专美于前,建大国,孕育大军,象一座高山向四方分遣它的雄鹰那样,使他的百万雄师飞遍整个大地,征服,控制,镇压,在欧洲成为一种因丰功伟绩而金光灿烂的民族,在历史中吹出天人的奏凯乐,两次征服世界,凭武功,又凭耀眼的光芒,这真卓绝,还能有什么比这更伟大的呢?”

“自由。”公白飞说。

这一下,马吕斯也把头低下去了。这个简单冰冷的词儿象把钢刀似的插进他那激昂慷慨的倾诉里,登时使他冷了半截。当他抬起眼睛时,公白飞已不在那里了。他也许因为能对那谀词泼上一瓢冷水而心满意足,便悄悄地走了,大家也全跟着他一道走了,只留下安灼拉一个人。那厅堂变成空的。安灼拉独自待在马吕斯旁边,闷闷地望着他。马吕斯这时已稍稍理了一下自己的思绪,但仍没有认输的意思,他心里还剩下一股未尽的热流在沸腾着,正待慢条斯理地向安灼拉展开争论,忽又听到有人在一面下楼梯一面歌唱,那正是公白飞的声音,他唱的是:

恺撒如给我

光荣与战争,

而我应抛弃

爱情与母亲,

我将对伟大的恺撒说:

收回你那指挥杖和战车,

我更爱我的母亲,咿呀嗨!

我更爱我的母亲!

公白飞的既柔婉又粗放的歌声给了那叠句一种雄伟的气势。马吕斯若有所思,呆望着天花板,几乎是机械地跟着唱:

“我的母亲!”

这时,他觉得安灼拉的手在他的肩头上。

“公民,”安灼拉对他说,”我的母亲是共和国。”

 

Git 10 周年访谈:Linus 讲述背后故事

十年前的这一周,Linux 内核开发社区正面临严峻的挑战:他们不能继续使用 BitKeeper 了(伯乐在线注:原因是当时Bitkeeper 著作权所有者决定收回授权,内核开发团队与其协商无果),而又没有其他的 SCM (Software Configuration Management)可满足他们的分布式系统的需求。Linux 之父 Linus Torvalds 接受了这个挑战,决定开发一个新的版本控制系统。周末他消失了,新的一周,Git 问世了。今天,Git 已经成为上万个项目的版本控制系统,并且在程序员中引发了开源热潮。

为了庆祝里程碑式的一刻,Linux 基金会邀请了 Linus 来分享 Git 背后的故事,以及他对 Git 在软件开发中的影响的观点。

Linus-Torvalds-LinuxCon-Europe-2014

你为什么要开发 Git?

Torvalds:我从来没有想过去做版本控制软件,因为在我看来那是计算机世界里最无聊的事了(如果数据库除外的话 ;^),我天生就不喜欢 SCM。但是 Bitkeeper 的诞生改变了我对版本控制的认识。BK 在大多数方面是正确的,在本地保存一个仓库的副本,分布式合并确实是一大创新。这个分布式版本控制的创新完美地解决了 SCM 的通病:“谁可以修改代码”的难题。BK 告诉我们,你只要给每个人一个仓库,问题就解决了。但是 BK 也存在一些问题,技术上的问题(例如重命名很麻烦)还不算什么,它最大的坏处是不开源,很多人因为这个不使用它。所以即使我们有几个核心维护者使用 BK——开源项目可以免费使用——但它也没有普及。虽然它帮助过我们开发内核,但依然有不少痛点没有解决。

当 Tridge 违反 BK 的使用协议反编译 BK 的时候,我们到达了紧急关头。我花了几个周(还是几个月来着?)试图调解 Tridge 和 Larry McVoy(伯乐在线注:他是 Bitkeeper 的 老大),最后也没有成功。我意识到我不能继续使用 BK 了,但我真的不想回到没有 BK 的黑暗时代。遗憾的是,我们想用其他 SCM 来代替它,却没有找到能在远程方面工作得好的。现有的软件不能满足我对远程方面的需求,我又担心整个流程和代码的完整性,所以最后我决定自己写一个。

你怎么做到的?整个周末都在熬夜写这个,还是只用了常规的时间?

Torvalds:呵呵,其实可以在 Git 的源代码仓库中看它是如何成型的。除了第一天的工作,因为我花了一天的时间进入“自举(self-hosting)”。之后我就能使用 Git 向 Git 自己提交代码了,虽然第一天所有的东西都不是明确的,但是大体上也都在那里了。虽然这些工作大多是在白天完成的,但也有时候工作到了深夜,甚至有两天到了凌晨两点。最有趣的部分是如何将它快速成型。Git 树中的第一次提交没有太多代码,但是它的基本功能已经实现了——向它自己提交代码。这部分写代码并不难,难的是如何组织数据。

所以我想强调的是,虽然它在短短十天内就完成了(我第一次使用 git 向内核提交代码的时间),但是这并不是某种“马拉松”式的开发。事实上,我早期的开发成本很低,这取决于基本的思路正确。在这个项目开始之前,我想了很久,我总结了很多别人犯过的错误,然后极力避免了。

Git 达到了你的期望吗?你估计一下它现在工作得如何?它还有什么不足吗?

Torvalds:我对 Git 很满意。它工作得相当出色,满足了我的所有需求。有趣的是,它还接手了很多其他项目,它成长地相当迅速。在切换版本控制系统中有很多惰性,看看 CVS 和 RCS 这些坚持了这么久就知道了。不过等时机到了,Git 早晚都会接管过来。

你觉得为什么它会被如此广泛地接受?

Torvalds:我提过以前我为什么痛恨 SCM,我相信很多人也为相同的问题烦恼过。很多项目要改一两个小地方就会使人抓狂。在 Git 之前,没有东西来真正解决这个问题。人们不清楚分布式的重要性, 可能还会与此抗争。一旦他们明白它支持的方便可靠的备份,并允许做私人的测试仓库,而不必担心有无中央存储仓库的权限的话,他们就永远不会放弃 Git 了。

Git 会永远流行吗?还是你预见在将来的十年会有另一种版本控制系统?作者会是你吗?

Torvalds:我不会是唯一一个作者,将来我们也可能使用另一种工具,但是我敢保证,它一定和 Git 非常像(“git-like”)。我不是说 Git 的什么都是对的,但它的基本路线是对的,之前其他 SCM 未曾尝试过。

没有假谦虚 :)

为什么 Git 能在 Linux 上工作地这么好呢?

Torvalds:很显然,Git 最初是为我们的工作流程设计的,所以这是它的一部分。虽然我重复“分布式”这个词很多次了,但这不为过。它被设计为足以高效地应付像 Linux 一样的大项目,它也用于完成 Git 之前人们觉得“艰难”的事情——因为这些事我每天都要做。

举个例子吧:在大多数的 SCM 中,“merging” 操作都被认为是痛苦而且艰难的事情。你需要计划好你的合并操作,因为这涉及到很多繁琐的细节。这我不能接受,因为我每天要做几十次合并,即使这样,最大的麻烦还不是合并本身,而是测试结果。“Git”的合并只需要几秒钟,写合并注释反而会花去我更多的时间。

所以 Git 基本上是为了满足我的需求来写的。

人们说 Git 是为聪明人设计的,即使 Andrew Morton 也说 “Git的明确设计让你感觉你比你想象中的要蠢。”你对此的回应是什么呢?

Torvalds:我觉得曾经可能是这样的,但现在不再是了。人们这么想可能会有很多原因,但只有一个站得住脚,很简单:“在 Git 中完成一件事你有太多的方法”。

使用 Git 你可以做很多事,大多数“你应该怎样”的规则,其实并不是技术上的限制,而是建议,这样你和别人一起工作的时候可以配合得更好。Git 是一个强大的工具,但是你不能因为这个望而却步。虽然你可以每次用不同的方法完成相同的事情,但在多数情况下,学习 Git 的最好方法还是从最基本的事情做起。直到你熟悉基本操作了,再去接触别的东西。

Git 给人复杂的印象有一些历史原因。其中一个是,它很早之前确实是复杂的。一开始需要使用 Git 来做内核方面的工作的时候,人们要配置一些脚本。那时候的工作主要集中于让核心模块工作,花在易用性方面的精力很少。所以很显然,Git 因其复杂性著称,但那大约还是头一年的事了。

人们认为 Git 难的原因是 Git 的与众不同。很多人用过十几二十年的 CVS,但 Git 并不是 CVS,一点都不像。概念不同,命令也不同。Git 从来没有考虑过要像 CVS,甚至大行反道。所以如果你使用 CVS 之类的系统很长时间,就会觉得 Git 复杂,而且它的差异毫无必要。人们会对版本号码感到奇怪。为什么 Git 的版本不像 CVS 的“1.3.1”这种递增式的数字?为什么会是恐怖的四十位 Hex 码?

但 Git 的不同并不是“毫无必要的”。只是这点让人们觉得它太复杂了,因为它来自一个不同的背景。“CVS”的背景过时了。现在很多程序员从没用过 CVS,如果他们学 CVS,可能觉得 CVS 的方式太诡异了,因为他们最先学的 Git。

如果没有 Git,Linux 内核会发展的像现在这样好吗?为什么?

Torvalds:“没有 Git”,好吧,但是一定会有别人写出来个像 Git 的工具,一个分布式版本控制系统。毫无疑问,我们需要“Git”这样的东西。

你怎么看待 Github ?

Torvalds:Github 是非常棒的代码托管服务,对此我没有任何反对。我的抱怨主要是因为它作为一个开发平台——提交代码,pull request,跟踪问题等等——不够好。不适用于内核之类的项目。限制太多了。

部分原因是,因为内核发展的原因,部分是因为 Github 的接口很鼓励坏习惯。在 Github 的提交有不好的提交信息等等,就是因为接口的问题。他们确实做了改善,可能现在好点了,可是永远不会适用于 Linux 内核这样的项目。

你见过的用 Git/Github 做的最有趣的事情是什么?

Torvalds:看到创建一个新项目能如此简单,我很开心。以前搞代码托管很痛苦的,但现在用 Git/Github ,创建一个小项目就小菜一碟了。你的项目是什么并不重要,重要的是你可以做得到。

你现在有什么精彩的项目吗?有什么将推动软件发展软件吗?

Torvalds:暂时没有,如果有的话,我会告诉你。

本文由伯乐在线推荐,赖信涛翻译,原文Linux.com,点击下图,可以访问特别制作的Git 十周年。

AtlassianGit10year

 

用 0x3f3f3f3f 设定最大int值的优点

在许多算法中都要用到一个常量来表示最大值,例如:寻找一个最小数,就要先设定一个值a,如果比a小,a就等于这个数;再如,最短路径中基本的松弛操作:

计算机不会表示出“无穷大”的概念,所以我们只能以一个定值来表示“最大”。那么使用什么值呢?

对于int类型,很自然地,我们想到用 0x7f ff ff ff 。这是32-bit的int类型所能表示的最大值。int类型在内存中的形式是,除了第一位表示正负,剩下的二进制位表示数据大小,将所有位设置为1,就是int的最大值,这个值是 2^31-1=2147483647 ,是一个十位数。

20150402204748

这样做对于上文中的第一个例子,是没有问题的,因为不涉及到计算。但是如果对于后一种,就会出现数据溢出的隐患。如果这个最大值加上任何一个数,就会变成一个很小的负数。所以,我们还要满足“无穷大加上无穷大还是无穷大。”的原则。

如果使用 0x3f3f3f3f ,这个问题可以得到完美的解决。这个数字的值是 1061109567,也是一个十位数,和 0x7fffffff是一个数量级的。而且它的两倍是 2122219134 ,就满足了即使两个无穷大相加,仍然可以表示一个无穷大。

20150402205123

 

使用这个数还有一个好处。我们想将一个数组的数据全部置为无穷大的时候(经常用到),使用的 memset的第二个参数value是8-bit的。

value:Value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned charconversion of this value.

也就是说,memset是按照8位来格式化数组的,而通过上图我们可以发现,0x3f3f3f3f的四个八位都是一样的!这样我们就可以使用memset来将数组所有值最大化,而不用使用循环了,提高了效率。

综上,将INF(最大值)设置为0x3f3f3f3f是一个不错的选择!

 

Joel给计算机系学生的建议

作者: 周思博 (Joel Spolsky)
译: Chen Bin
2005年1月2日

虽然大概一两年前我还在夸夸其谈桌面应用程序是将来的潮流,大学生们现在还是偶尔向我请教职业发展的问题。所以我把我的建议写下来。以供学生们阅读,嘲笑,忽略。

大多数锐气十足的学生从来不向前辈征求意见。在计算机科学领域,这样做是正确的。因为前辈们很可能说些“在2010年前,市场对于那些只会敲击键盘的代码工人的需求将会超过一亿(因此前景是乐观的)”,或者诸如“Lisp语言现在真的很热门”。

我和那些前辈也差不多,当我给别人建议时,实际上我不知道自己在说些什么。我是如此的落后于时尚,以至于连AIM也搞不明白,而不得不使用 email(恐龙时代的产品,在那个时代,音乐是刻在扁扁的的圆圆的盒子上,噢,那种盒子叫cd)。(译者按:我认为祖儿这里在说反话,后文很多地方作者都在说反话,读者尽量理解这种美国式幽默吧。)

所以你最好不要理睬我将要说的,你应该立刻去制作某种在线交友软件

然而,

如果你喜欢编程,那就感谢上帝吧:你属于幸运的少数人,这些人喜欢工作,他们的工作可以保证他们能过上舒适的生活。大多数人没有这么幸运。对大多数人来说,工作是不愉快的,忍受工作的目的攒钱,是为了在年满65岁退休后能过上自己想过的生活。如果他们想过的生活不需要灵活的膝盖,明亮的眼镜,轻盈的脚步的话。

现在让我回到主题,我将提供一些建议。

好了,不罗嗦了,下面就是Joel给计算机系学生们七条免费的建议:

  1. 毕业前学会写作
  2. 毕业前学会C语言
  3. 毕业前学习微观经济学(microeconomics)
  4. 不要因为某些非计算机课程枯燥无趣就敬而远之
  5. 学习有大量编程实践的课程
  6. 不要担心工作都跑到印度去了
  7. 好好做夏季毕业实习

让我逐条解释这些建议。但解释之前我要说明一下,如果因为这些建议是Joel的建议你就打算无条件地接受,以至于连我的理由都想跳过,那么你就太单纯,太容易被别人骗了。如果你是那种单纯的人,我还要给你第八条建议,找心理医生咨询一下如何培养自信(self-esteem)。

毕业前学会写作

如果Linus Torvalds不懂如何布道的话,Linux会成功吗? 正象每一个黑客,Linus精通写作,他知道如何准确地在email和邮件讨论组中使用书面英语表达自己的思想,所以他能够从全世界召集大量志愿者为Linux工作。

你听说过最近风靡全世界的极限编程(Extreme Programming)吗? 即使你不懂什么是极限编程,你至少听说过这个词。为什么?因为宣传极限编程的人都是天才的作者和演说家。

就看看你身边的那些小型的软件开发组织吧,最有权力和影响力的人是那些可以用自信,准确,舒适的英语交流的人。好吧,我承认这些人也许言过其实,但是你无可奈何。

一个合格的程序员和一个伟大的程序员的区别不在于知道多少种编程语言,不在于他们是喜欢Python或者Java,而是在于他们是否擅长表达。他们能够说服,所以他们获得权力。他们能够写清楚明白的评论和接口文档,所以他们使得别人不用重写,而可以重用他们的代码,否则他们的代码就是毫无用处的。他们也能够写出清晰的用户手册,于是最终用户可以理解他们的代码是做什么用的,明白了他们的工作的价值。sourceforge埋葬着许多精美的代码,这些已死的代码无人使用,因为代码的作者很少写(或者根本不写)用户手册。

我不会雇佣一个不懂写作的程序员。如果你擅长写,你就很容易找到工作,紧接着你就会被要求写技术规格文档,这意味着你已经被管理层注意到了。

大学里有一些课程,要求你做很多的写作练习,不要犹豫,赶快参加这些课程。不要错过任何要求你每周或者每天练习写作的课程。

给自己建立一个网络日志(weblog)。在上面写的越多,你会写地越容易。写地越容易,你就写地越多,这是一个正向地循环激励。

毕业前学会C语言

我可没有说是C++。虽然现在用C的工作不多,但是掌握各种编程语言的程序员事实上用C来交流(lingua franca);更重要的是,C比某些“现代”语言更接近机器语言。我不管现在大学里在教什么流行的垃圾语言(trendy junk),你至少得花一个学期接近机器。否则,你不可能使用高级语言写出高效的代码。这意味这你不会有机会写编译器或者操作系统,也许这是更好的编程工作;别人不会相信你能够为大项目设计架构。无论你知道多少高级的控制结构,知道如何进行错误处理,如果你不能解释为什么while (*s++ = *t++);的意思是进行字符串拷贝(而且对你而言这是世界上最自然,最易懂的代码),那么你就是在对编程一窍不通的状态下编程(programming based on superstition)。打个比方,就好比一个医生不懂基本的解剖学就给你开处方,如果你问这个医生为什么开这种药而不是那种药,他会说因为医药销售代表说这种药有用。

毕业前学习微观经济学(microeconomics)

我个人对经济学的一些理解:在经济学刚诞生的时候,它只是局限于有限的领域,在这些领域中人们发展和发现了很多有用的理论和很有趣的事实,这些理论和事实是从逻辑上是可以证明的。然后, 经济学开始走下坡路了。 “有限的领域”就是微观经济学,它对于商业可以进行有意义的指导。然后,事情就开始变糟了(以下部分你可以跳过),你接下来碰到的是讨论诸如失业率和银行利率之间关系之类东东的宏观经济学,很多时候宏观经济学讨论的理论都是无法证明正确或者错误的。接下来事态更加恶化了,经济学中的一些领域开始和物理学搭界,嗯,学习物理经济学也许你帮你在华尔街找到好工作。言归正传,无论如何请学习微观经济学,因为你需要知道什么是“供给和需求”,什么是竞争优势,什么是净现值(NPVs,Net Present Value,指项目经济寿命期内现金流入总和与现金流出总和之差额),什么是折扣和边际效用(discounting and marginal utility),如果你真想了解商业是如何运作的话。

为什么计算机系的学生要学习经济学?因为理解商业基本规律的程序员对商业界来说是宝贵的程序员。我记得无数个程序员使我非常沮丧,因为他们在代码中坚持某些疯狂的设计,这些设计从技术上来说,完美;从资本主义的角度来看,发疯。如果你是一个理解商业的程序员,商业会给你回报。这就是你要学习经济学的原因。

不要因为某些非计算机课程枯燥无趣就敬而远之

首先,你需要让你的学分平均分(GPA)看起来漂亮点。

不要低估学分平均分的威力。很多雇主和人事经理(包括我)阅读简历时首先看成绩,为什么?因为这代表了大部分的教授在很长的时期内对你的学业的一个平均的看法。托福成绩(美国的托福大致相对于我国的高考中的语文考试)?哈,几个小时的测验而已。当然学分不一定说明了一切,如果你修的是很难的课程,学分就有可能低一点。即使你的学分平均分很高,我还是要看各科分数是否一致。如果你应聘的是软件工程师职位,我为什么要关心你在大学里学的欧洲历史课程分数的高低呢?毕竟,历史很枯燥。那么要是你要编程的部分也是很枯燥的,你是不是要放弃了?事实上,有时候编程是枯燥的,如果你不能忍受编程中的枯燥部分的话,你就不能完成整个工作,雇主不愿意雇佣你这样的员工。

我在大学里修过一门叫做“文化人类学”的课程,因为那时候我也搞不懂我到底要学什么,听起来这么课程可能还蛮有意思的。

出乎我的意料。我不得不阅读大量讲述巴西热带雨林中的印第安人如何如何的书,让人真昏昏欲睡。听老师讲解也好不到哪去,我发觉看教室外的草如何长更有趣点。土著人如何烤蕃薯藤和我有什么关系?我为什么要去讨论如何烤蕃薯藤?但是期中考试马上就要到了,我暗暗下定决心,如果我能跨越“文化人类学”这个障碍,以后也许没有什么能难倒我了。我决心得A并且得到了A。以后当我不得不坐在林肯中心,连看18个小时的瓦格纳的《尼伯龙根的指环》时,我终于明白我为什么要学习“文化人类学”了,相比之下,我也能忍受这种歌剧了。

学习有大量编程实践的课程

我还记得决定不去读研究生的那一刻。

就是在学习《动态逻辑》(Dynamic Logic)这门课的时候,我记得是耶鲁的Lenore Zuck(一个天才的教师)教的。

修这门课的时候,我已经不再是雄心勃勃了。我可不指望在这么课程中得个A,我梦想的是混个及格。逻辑本质上是很简单的:如果结论正确,前提必须正确。例如,如果“所有读书好的人都能找到工作”并且“张三的读书好”,那么“张三能够找到好工作”。就这么简单。

但是我要学的是动态逻辑, 动态逻辑和一般逻辑差不多,但是要考虑时间因素。例如,“在你开灯之后,你可以看见你的鞋子”加上“过去灯被打开了”意味着“你现在可以看到你的鞋子”

动态逻辑学对于象Zuck教授这样的天才理论家来说非常诱人,因为这门学科的知识也许可以用来证明计算机程序是否正确。我记得在第一堂课上,为了证明“如果你有一盏关着的灯”并且“你按了一下开关”,那么“现在灯亮了”,Zuck教授就使用了两黑板加上边上的墙壁。

证明过程难以置信的复杂。我觉得如此复杂的证明过程很可能会有小错误,但是我没办法证明证明过程本身是正确的。事实上,写在黑板上的证明跳过了很多中间步骤,许多步的证明使用了演绎法,使用了归纳法,以及一些研究生才懂的证明方法。

作为课后作业,我们需要证明以下命题:如果灯过去是关着的,并且现在它是开着的,请证明有人按了开关

我真的试着证明它了。

我花了许多小时,试图证明这个命题。

在无数个小时的努力后,我发觉Zuck博士的原始的证明有一个逻辑上的错误,也许这个错误是我的笔记抄错了,我不知道。于是我终于认识到,如果为了证明一个简单的问题需要花三个小时写下几黑板的证明步骤,再考虑到这个漫长的证明过程中可能会引入种种错误,那么这种机制是不可能用来证明任何有趣的东西的。

对动态逻辑学家来说,有用是无关紧要的。

于是我退出了那门课程,发誓永远不会去读计算机系的研究生。

这个故事的主题是,计算机科学和软件开发不一样。如果你非常非常幸运,你的学校会开软件开发的课程。然而,他们也可能不开这样的课程,因为名牌大学认为教授实用技巧的事情应该留给那些二三流的技术学院或者某些释放犯人再安置计划。你可以在任何地方学习编程,我们是耶鲁大学,我们培养未来的世界领导人。你付给耶鲁16万美元的学费就是为了学习如何写循环语句吗?你把耶鲁当成什么地方了?Java速成班吗?哼。

问题在于,我们没有一个专业的学校教授软件开发。所以如果你想成为一个程序员,你可以进计算机系读书(当然计算机科学也值得学习),但是你学的不是软件开发。

如果走运的话,你可以在计算机系发掘出很多有大量编程实践的课程,就象你能在历史系找到很多提供写作水平的课程一样。这些课程绝对值得学习。如果你喜欢编程,不要为你不能上教授诸如lambda算子或者线性代数的课程沮丧,在那里你连摸一下计算机的机会都没有。找找看有没有名字中带有“实习(Practicum)”字样的课程,不要在乎Practicum是个拉丁语。有用的(无奈状)课程就是需要在课程名中塞一些拉丁语,才能从那些装模作样(Liberal Artsy Fartsy)管理层的眼前蒙混过关。

不要担心工作都跑到印度去了

啊哈,如果你人在印度,你就无所谓了。愿你享受外包带来的工作机会并顺祝身体健康。

但是我听说现在愿意读计算机系的学生越来越少了。据说原因之一是工作机会都跑到印度去了。我认为这种观点是大错特错。首先,根据眼前的商业时尚选择事业是非常愚蠢的。其次,即使工作真的都跑到印度和中国去了,编程对于其他有趣的工作来说都是极好的训练,例如业务流程工程(business process engineering)。第三,无论是在美国还是印度,好程序员仍然是非常短缺的,请相信我。当然,现在有许多所谓搞IT的人吵吵嚷嚷地说就业形势不好,工作太难找。但是事实如何?恕我直言,好程序员找工作还是很容易。第四,你还有更好的主意吗?历史系的毕业生找工作更容易吗?去法学院如何?据我所知,99%的律师恨他们的工作,每分钟都恨。而且律师一周工作90小时。正象我以前说过的,如果你喜欢计算机,那么感谢上帝,你将属于全世界人中的极少数的幸运儿,这些幸运儿热爱他们的工作,而且工作也可以提供体面的收入。

实际上,我也不认为报考计算机系的人越来越少有多大的意义。相对于internet泡沫时期大家都疯狂的往计算机系挤,现在的人数回落只是回归正常水平而已。在泡沫时期,我们这个行业涌入了许多对计算机毫无兴趣的南郭先生,他们梦想的是拿着高的吓人的薪水加诱人的期权,然后年轻退休。谢天谢地,现在这些人都跑了。

好好做夏季毕业实习

明智的招聘者知道热爱编程的人初中就为当地的牙医写数据库程序,高中就在计算机夏令营教课,为校报规划网站,在某个软件公司做实习。他们找的就是这样的人。

如果你喜欢编程,你最容易犯的最大的错误就是“有活就接”。我知道,其他专业的学生假期打工可顾不了这些条条框框。但是你不一样,你拥有一种特殊技能,不要浪费它。当你毕业时,你的简历上应该已经罗列一堆的编程工作实习。让其他人去“为大家提供租车服务”(Tom Welling是个例外,他业余时间去演超人)。

最后,为了让你的生活更容易一点,也为了说明我这篇文章是能够自圆其说的,我将给我自己的公司的做做广告。我的公司Fog Creek软件公司,可以为大学生提供软件开发方面的实习机会。在我们公司,你可以学习“编码,开发,商业”。去年在我们公司实习的Ben就是这么说的,可不是因为我给他什么好处他才这么说。二月一号截至,抓紧机会吧。

如果你听了我的建议,你就会太早地卖掉Microsoft公司的股票,拒绝Google提供的职位,原因是因为你已经拥有自己的公司了。到时候可别后悔,更别怪我,呵呵。