黑客的价值观

黑客,可能在大家的眼里是那些入侵别人计算机搞破坏的人,其实并不是那样的。如果你这样认为了,只能说明你对计算机文化并不了解,真正的黑客是一种 自由的象征,他们挑战权威,追求自由,并和很多非人类的行为作斗争。如果你想了解黑客文化,你一定要去看看我写的《Unix传奇,上篇下篇》。你会对正宗的计算机文化以及黑客文化有所了解的。而那些只懂得入侵别人计算机搞破坏活动的“黑客”只能称为是街头的小混混,他们根本就不配称黑客。

下面有四篇关于“Hacker’s Code”文章,我觉得相当的不错,可以让你明白什么是黑客的行为规范,道德准则,以及黑客的历史使命,希望能对你有启发。但是翻译水平有限,所以我请Mailper同学帮忙翻译了一下,但还是觉得原文更为传神,尤其是原文中的押韵,双意以及朗朗上口,所以,下面提供了中英文对照。如果有翻译得不好的还请大家指正。

 

The Hacker’s Code

http://muq.org/~cynbe/hackers-code.html

“A hacker of the Old Code.”

  • Hackers come and go, but a great hack is forever.
    黑客们来来往往,但是只有黑客的壮举是永存的
  • Public goods belong to the public.*
    公众的东西是属于大众的
  • Software hoarding is evil.
    Software does the greatest good given to the greatest number.
    圈养软件是邪恶的,最好的软件是有最多人使用的
  • Don’t be evil.
    不作恶
  • Sourceless software sucks.
    不公开源码的软件是令人厌恶的
  • People have rights.
    Organizations live on sufferance.
    每个人都是有权利的,而组织是建立在互相的容忍上的
  • Governments are organizations.
    政府也是组织
  • If it is wrong when citizens do it,
    it is wrong when governments do it.
    对与错的标准,对于公民和政府是同样适用的。(不能“只许州官放火不许百姓点灯”)
  • Information wants to be free.
    Information deserves to be free.
    信息需要自由(免费),信息也应该是是自由(免费)的
  • Being legal doesn’t make it right.Being illegal doesn’t make it wrong.
    合法的不一定是正确的,不合法不一定就是错误的
  • Subverting tyranny is the highest duty.
    推翻专制是黑客的最高天职
  • Trust your technolust!
    相信你的“技术贪欲”

* Definition: A good is public if the marginal production cost is lower than the marginal billing cost.
定义
一个好的公众事物仅当其边际产值小于其边际广告值。(关于 marginal production是一个经济学术语,我不是很懂,大家可以参考这篇文章

 

The Hacker’s Code of Ethics

http://courses.cs.vt.edu/cs3604/lib/WorldCodes/Hackers.Code.html

Levy (1984) suggests that there is a “code of ethics” for hacking which, though not pasted on the walls, is in the air:

列维认为黑客有一种准则,这种准则不是墙上贴着的,而是像空气一样无处不在的。

  • Access to Computers – and anything which might teach you something about the way the world works – should be unlimited and total. Always yield to the Hands-On Imperative!
    计算机的使用(就像任何教会你去了解这个世界的东西一样)应该是无限和无所不包的。真理来自实际动手操作。
  • All information should be free.
    所有的信息都应该是自由的(免费和不加限制的)
  • Mistrust Authority – Promote Decentralization.
    不要相信权威,推崇分权和群众的智慧
  • Hackers should be judged by their hacking, not bogus criteria such as degrees, age, race, or position.
    英雄(黑客)不问出处,更不会去计较世俗的标准:学历,年龄,种族和职位高低。
  • You can create art and beauty on a computer.
    黑客可以在计算机上创造艺术和美。
  • Computers can change your life for the better.
    计算机可以提升你的生命。

Reference:

Levy, Steven. 1984. Hackers: Heroes of the Computer Revolution, Anchor Press/Doubleday, Garden City, NY, 458 pp.

史蒂芬.列维 1984  黑客:计算机革命的英豪们, Achor Press… 第458页

 

DRAFT The Hacker’s Code DRAFT

http://www.petascale.org/code/code.html

Preamble: We, the people of the electronic universe, in order to establish a society of knowledge and skills, do hereby proclaim the following.

导言:我们,数字领域的主宰者,为了建一个知识和技术的社区,我们发出下面的声明。

Hackers are diverse, from all cultures and backgrounds. Every hacker is unique, yet we all share some characteristics. While not every hacker follows this Code, many believe it is a fair description of our shared traditions, goals and values.

黑客是各式各样的,无论是从文化还是背景。每个黑客都是唯一的,然后,我们是有一些相同的特质的。也许并不是所有的黑客都会跟从下面的准则,但大多数黑客都相信这是一个公正的惯例,目标和价值观。

  • Hackers share and are willing to teach their knowledge
    黑客共享并愿意传播他们的知识。
  • Hackers are skilled. Many are self-taught, or learn by interacting with other hackers.
    黑客都是老手。他们中很多人要么是自学,要么是与别的黑客相互共世而成长的。
  • Hackers seek knowledge. This knowledge may come from unauthorized or unusual sources, and is often hidden.
    黑客查找知识。那些知识可能是多一些未授权或是不寻常的通常都是被隐藏起来的地方来的。
  • Hackers are tinkerers. They like to understand how things work, and want to make their own improvements or modifications.
    黑客都是些好管闲事的人。他们总是喜欢对事物刨根问底,而且总是要为改善那些事情加上自己的想法。
  • Hackers often disagree with authority, including parents, employers, social customs and laws. They often seek to circumvent authority they disagree with.
    黑客通常都在挑战权威,包括家长,同事,用户以及法律。他们总是挑战那些他们并不认可以权威。
  • Hackers disagree with each other. Different hackers have different values, and come from all backgrounds. This means that what one hacker is opposed to might be embraced by another.
    黑客也是互不信任的。不同的黑客有不同的价值取向,而且也有相同的背景。也就是说,某个黑客被反对了,但也会被别的黑客所拥护。
  • Hackers are persistent, and are willing to devote hours, days and years to pursuing their individual passions.
    黑客是永不放弃的。他们愿意全身心地把他们的热情投入到每一个小时,每一天,每一年中。
  • This Code is not to prescribe how hackers act. Instead, it is to help us to recognize our own diversity and identify.
    准则并不是说明黑客是什么样的,而说让我们明白我们的不同性和一致性。
  • Every hacker must make his or her own decisions about what is right or wrong, and some might do things they believe are illegal, amoral or anti-social to achieve higher goals.
    每一个黑客必需自己为对和错作决定,有一些事可能是不合法,不道德的,甚至反社会的,但却可以让他们攀上自己价值观的高峰。
  • Hackers’ motivations are their own, and there is no reason for all hackers to agree.
    黑客的动机是他们自己的,而且无需任何理由获得其它的同意。
  • Hackers have a shared identify, however, and many shared interests.
    黑客一般会有共同的认识,然而,许多黑客却是拥有共同的利益。
  • By reading this Code, hackers can recognize themselves and each other, and understand better the group they are a part of. This will be beneficial to all hackers.
    了解了这些准则,黑客们能够赏识自己或相互赏识,并相当明白他们是这个团体的一部分。这会让所有的黑客受益。

The Conscience of a Hacker

http://www.phrack.org/issues.html?issue=7&id=3&mode=html

##=========================================

\/\The Conscience of a Hacker/\/

by

+++The Mentor+++

笔名:导师

Written on January 8, 1986

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Another one got caught today, it’s all over the papers.  “Teenager Arrested in Computer Crime Scandal”, “Hacker Arrested after Bank Tampering”… Damn kids.  They’re all alike.

今天有一个被捕的消息受到媒体热议。“某少年由于计算机犯罪被捕”,“入侵银行的黑客被捕”…一帮臭小子,他们都一样。

But did you, in your three-piece psychology and 1950′s technobrain, ever take a look behind the eyes of the hacker?  Did you ever wonder what made him tick, what forces shaped him, what may have molded him?

但是你们是帮老朽只知道老套的心理学和50年代的技术。你们有没有想想黑客究竟在想什么?你们有没有想想他们为什么这么做,什么造就了他们,什么塑造了这帮黑客?

I am a hacker, enter my world…

我是名黑客,请走进我的世界…

Mine is a world that begins with school… I’m smarter than most of the other kids, this crap they teach us bores me…

我的世界是从学校开始的…我是学校里最聪明的孩子,学校教我的垃圾让我厌倦。

Damn underachiever.  They’re all alike.

都他妈的水货,这帮子成绩不好的都一样烂。

I’m in junior high or high school.  I’ve listened to teachers explain for the fifteenth time how to reduce a fraction.  I understand it.  “No, Ms. Smith, I didn’t show my work.  I did it in my head…”

我初中高中时候就是如此了。白痴老师一个分式化简要解释15次。这些我全懂。所以我说”不用了,XX老师,我不用写这些步骤,我可以心算…”

Damn kid.  Probably copied it.  They’re all alike.

一帮傻同学,估计都只知道抄写老师的板书,一棒子二百五。

I made a discovery today.  I found a computer.  Wait a second, this is cool.  It does what I want it to.  If it makes a mistake, it’s because I screwed it up.  Not because it doesn’t like me…

今天我发现新大陆了。我遇到了一台计算机。真是太酷了,计算机完全按照我的指令执行。如果计算机犯了错,是因为我没搞对。而不是因为它不喜欢我…

Or feels threatened by me…

也不是觉得我成绩太好到威胁它了,也不是因为我是个自是聪明自以为是,而且不对我教条主义

Or thinks I’m a smart ass…

Or doesn’t like teaching and shouldn’t be here…

Damn kid.  All he does is play games.  They’re all alike.

而我的一帮傻逼同学,都他妈只知道玩。

And then it happened… a door opened to a world… rushing through the phone line like heroin through an addict’s veins, an electronic pulse is sent out, a refuge from the day-to-day incompetencies is sought… a board is found.

突然,与计算机相处为我打开了一扇通往另一个世界的门。一股电脉冲从电话线传送出去,就好像海洛因冲过毒瘾者的血脉,我可以逃离那帮子傻逼,一个新大陆!

“This is it… this is where I belong…”

是的!计算机是我的归属。

I know everyone here… even if I’ve never met them, never talked to them, may never hear from them again… I know you all…

在这个世界里,我认识这里的每一个人…虽然我并没有跟他们见面,没跟他们交谈,也许以后也不会再提到他们的消息。但是他们对我是那么的熟悉。

Damn kid.  Tying up the phone line again.  They’re all alike…

一棒子傻逼,大概他们又把我的电话线打结了。

You bet your ass we’re all alike… we’ve been spoon-fed baby food at school when we hungered for steak… the bits of meat that you did let slip through were pre-chewed and tasteless.  We’ve been dominated by sadists, or ignored by the apathetic.  The few that had something to teach found us willing pupils, but those few are like drops of water in the desert.

是的,我们黑客都差不多…我们智力高度成熟,我们想啃牛排的时候只有被喂婴儿食物。好不容易有点肉吃,也是被嚼烂了的。我们被虐待狂欺负,被冷漠者漠视。偶尔有好人理解我们其实是最好学的学生,但是这种人少得跟沙漠中的水滴一样。

This is our world now… the world of the electron and the switch, the beauty of the baud.  We make use of a service already existing without paying for what could be dirt-cheap if it wasn’t run by profiteering gluttons, and you call us criminals.  We explore… and you call us criminals.  We seek after knowledge… and you call us criminals.  We exist without skin color, without nationality, without religious bias… and you call us criminals.

You build atomic bombs, you wage wars, you murder, cheat, and lie to us and try to make us believe it’s for our own good, yet we’re the criminals.

我们这些黑客长大了…这个世界充满着电子,开关,和美丽的波特(信号传输单位)。我们并不是在犯罪,我们只是在免费使用服务,这些服务要不是因为那 些敛财狂本可以是非常廉价的。我们在探索…可你们说我们是在犯罪。我们是在寻求知识…可你们说我们是在犯罪。我们黑客无处不在,不分肤色,没有国界,没有 宗教偏见…可你们说我们是在犯罪。你们这些伪君子制造了原子弹,发动战争,某战争,不忠,并且对我们说谎;你们居然说你们的行径是为我们好,而我们黑客是 犯罪分子。

Yes, I am a criminal.  My crime is that of curiosity.  My crime is that of judging people by what they say and think, not what they look like. My crime is that of outsmarting you, something that you will never forgive me for.

好吧,我是犯罪分子。我所犯的最是好奇心。我的罪过是基于一个人的言行评判一个人,而不是他的长相。我的罪过是我比你聪明,而你大概永远不会原谅我比你聪明。

I am a hacker, and this is my manifesto.  You may stop this individual, but you can’t stop us all… after all, we’re all alike.

我是一名黑客,以上是我的宣言。你可以制止一个个体,但是你阻止不了我们全部…因为,我们黑客都一样。

+++The Mentor+++

署名:导师

Unix传奇(下篇)

Unix是目前还在存活的操作系统的元老了,走过了40年的历程(参看《Unix 40年:Unix年鉴》、《Unix 40年:昨天,今天和明天》)。 由它引发的思想变革,对当今计算机文化造成的深远影响。这是一段所有从事计算机行业人员尤其是软件开发人员需要了解的历史。Unix的传奇历史是整个计算 机世界文化最具代表性的,它对整个计算机世界文化的影响也是最巨大,最深远的。他给人带来的不单单的对过去的回味,更为我们带来了计算机世界的新思潮。

下篇

  • Unix与黑客文化
  • Unix的历史教训
  • Unix 家族谱
  • Unix的特点
  • Unix的影响和哲学
  • Unix痛恨者手册

上篇

  • Unix起源
  • Unix分裂
  • Unix的法律纠纷
  • GNU开源组织
  • Linux横空出世
  • Linux今天的领袖

Unix与黑客文化

黑客的文化和Unix的商业化存在着必然的联系。自从Unix出现,黑客文化就与之而来。

1993初,一个悲观的观察家撰文指出,已经有理由认为Unix的传奇故事连同他带有黑客文明将一同破产。许多人预测,从那时起Unix将在六月内 死亡。他们很清楚,十年的Unix商业化,使自由跨平台的Unix梦以失败告终。Unix允诺的跨平台可移植性,在一打大公司专有的Unix版本之间不停 地斗嘴中丢失,一个完美的操作系统最终沦为多种版本的一团乱麻,这应该说是人类文明史上的一个重大悲剧。

在专有软件社会中,只有像微软一样的“集权制,大教堂”生产方式才能成功。那个时代的人悲观地相信,技术世界的个人英雄主义时代已经结束,软件工业 和发展中的互联网络将逐渐地由像微软一样的巨型企业支配,再也没有“佐罗”,世界是恺撒大帝的世界,计算机文明将进入黑暗的帝国时代。黑客已经死了,自由 不付存在。

自从Unix出现以来,第一代的Unix黑客似乎垂垂老矣,衣食不饱( Berkeley计算机科学研究组在1994丢失了自己基金)。这是一个抑压的时代。专有的商业Unix的结果证明那么沉重、那么盲目、那么不适当,以致 微软能够用那次等技术的Windows抢走他们生存的空间,拿走他们的干粮。黑客世界的残余力量被逼到了世界上的角落里,苟延残喘。

就在黑客文化日渐衰落之时,美国新闻周刊的资深记者Steven Levy完成了著名的《黑客列传》一书,书中着力介绍了一个人物:Richard M. Stallman的故事,他是麻省理工学院(MIT)人工智能实验室领袖人物,坚决反对实验室的研究成果商业化。他是商业软件社会中坚强的一员,决不随波 逐流,建立了全新的黑客文化。

Richard M. Stallman(他的登陆名RMS更为人熟知)早在1970年代晚期就已经证明他是当时最有能力的程序员之一。Emacs编辑器就是他众多发明中的一 项。RMS的目标是将后1980的松散黑客社群变成一台有组织的社会化机器以达到一个单纯的革命目标。也许他未意识到,他的言行与当年卡尔·马克思号召产 业无产阶级反抗工作的努力如出一辙。RMS宣言引发的争论至今仍存于黑客文化中。他的纲要远不止于维护一个代码库,已经暗含了废除软件知识产权主张的精 髓。RMS通过“自由软件(free software)”让黑客文化更加有自我意识。当然,这个充满魅力又具争议的人物本身已经成为了一个黑客文化英雄。

只有痴迷的“黑客”和具有创造力的怪人结成的反叛联盟才能把我们从愚蠢中拯救出来——他们接着教导我们,真正的专业和奉献精神,正是我们在屈服于世俗观念的“合理商业做法”之前的所作所为。 ——The Art of Unix Programming

RMS让世界上所有的人都知道,入侵电脑系统只是低级不入流的黑客干的事,真正的黑客,是为了自由,为了软件的自由,为了挑战计算机世界中的霸权主 义而斗争。他们不是街头小混混,他们更像是绿林好汉,更像是罗宾汉,更像是佐罗。就像渴望民主的人民同专制的政府斗争一样。RMS领导着许多的黑客通过互 联网向专有软件发出宣战。

X Windows是首批由服务于全球各地不同组织的许多个人以团队形式开发的大规模开源项目之一。电子邮件使创意得以在这个群体中快速传播,问题由此得以快 速解决,而开发者可以人尽其才。软件更新可以在数小时之内发送到位,使得每个节点在整个开发过程中步调一致。网络改变了软件的开发模式。

另一方面,RMS的理论体系有许多东西非常有争议,他的GPL被认为是一种“病毒式”的协议,BSD的fans和老牌Unix黑客们认为,他们编写 Unix的年头都比GPL声明要长得多,GPL依然有太多的限制,而BSD协议则比GPL更加的自由。另一方面,RMS走向了另一个极端,他是完全反版权 的,反商业化的。把软件产品从强制收费推向了强制免费、共享和开源,这也为他带来了许多许多的争议。

在RMS组织黑客闹革命的年代里,没有多少黑客认同于RMS的理论体系,更多的他们参与GNU只是为了体现那种在互联网上协同工作,令人激动的工作模式。自从GNU设立以来,争议不断,而黑客文化却从未有统一在他的理想体系之下。

自从Linux出现以后,一个新的黑客领袖出现了,Linus Torvalds的中庸态度网聚了世界上顶尖的黑客,其绕过了GPL和反GPL的派系之争,他使用GNU的工具从而以GPL的“传染性”保护了 Linux,但他同时也不承认RMS的理论思想体系,他即开源,又支持商业化。虽然,他没有带给黑客们什么重要的思想体系或统一的价值观,但他整合了全世 界黑客的阵营,让所有的黑客的行为都围绕着Linux这一事物进行。他以“用自由软件是因为它运行得更好”轻而易举地盖过了“用自由软件是因为所有软件都 该是自由的”。

1998年初,这种新思潮促使网景公司(Netscape Communications)公布了其Mozilla浏览器的源码。媒体对此事件的关注促成了Linux在华尔街的上市,推动了1999-2001年间 科技股的繁荣。事实证明,此事无论对黑客文化的历史还是对Unix的历史都是一个转折点。

 

Unix的历史教训

下面的文字出自《The Art of Unix Programming》(Unix编程艺术)。令今天我们所有人所反思。

在Unix历史中,最大的规律就是: (看看《谁写了Linux》你就会知道这一规律)

距开源越近就越繁荣。任何将Unix专有化的企图,只能陷入停滞和衰败。

回顾过去,我们早该认识到这一点。1984年至今,我们浪费了十年时间才学到这个教训。如果我们日后不思悔改,可能还得大吃苦头。

虽然我们在软件设计这个重要但狭窄的领域比其他人聪明,但这不能使我们摆脱对技术与经济相互作用影响的茫然,而这些就发生在我们的眼皮底下。即使Unix社区中最具洞察力、最具远见卓识的思想家,他们的眼光终究有限。对今后的教训就是:过度依赖任何一种技术或者商业模式都是错误的——相反,保持软件及其设计传统的的灵活性才是长存之道。

另一个教训是:别和低价而灵活的方案较劲。或者,换句话说,低档的硬件只要数量足够,就能爬上性能曲线而最终获 胜。经济学家Clayton Christensen称之为“破坏性技术”,他在《创新者窘境》(The Innovator’s Dilemma)[Christensen]一书中以磁盘驱动器、蒸汽挖土机和摩托车为例阐明了这种现象的发生。当小型机取代大型机、工作站和服务器取代 小型机以及日用Intel机器又取代工作站和服务器时,我们也看到了这种现象。开源运动获得成功正是由于软件的大众化。Unix要繁荣,就必须继续采用吸 纳低价而灵活的方案的诀窍,而不是去反对它们。

最后,旧学派的Unix社区因采用了传统的公司组织、财务和市场等命令机制而最终未能实现“职业化”。只有痴迷的“黑客”和具有创造力的怪人结成的 反叛联盟才能把我们从愚蠢中拯救出来——他们接着教导我们,真正的专业和奉献精神,正是我们在屈服于世俗观念的“合理商业做法”之前的所作所为。

 

Unix族谱

Unix的故事仍旧延续着……,许多网站也为这段历史留下记录。一个详细记录Unix历史的网站(http://www.levenez.com /unix/),这个网站忠实记载着1969~2005 年Unix发展的大事,而且还有 PDF 档案可供下载,上面有一个庞大的UNIX家族版本树, 让人叹为观止。网站的首页陈列每个时期Unix的历史,也代表着无数工程师的心血与努力。

下面是一个简单的Unix的族谱:

点些查看《Linux 分发包族谱

 

Unix的特点

现在的文献中提到Unix基本上是说,由Ken Thompson和Dennis Ritchie共同开发的。而通过历史我们也能发现,Unix的主要是由Ken Thompson写下的。但在学术界,Dennis Ritchie的名字往往被排在了Ken Thompson前面的。这就是因为,Dennis Ritchie不但发明了C语言,而且当时他设计Unix操作系统的设计思想,影响了整个世界,直到今天。

当时,他们开发UNIX,没有正式立项,是Ken Thompson和Dennis Ritchie等少数几个人偷偷干的,如果一切都要从头从新设计,那几乎是不可能的。所以,Unix吸取与借鉴了Multics的经验,如内核,进程,层 次式目录,面向流的I/O,把设备当作文件,……等等。但是Unix在继承中又有创新,比如Unix采用一种无格式的文件结构,文件由字节串加\0组成。 这带来两大好处:一是在说明文件时不必加进许多无关的“填充物”,二是任何程序的输出可直接用作其他任何程序的输入,不必经过转换。后面这一点叫做“管 道”(piping),这就是Unix首创的。此外,像把设备当作文件,从而简化了设备管理这一操作系统设计中的难题,虽然不是UNIX的发明,但是实现 上它采用了一些新方法,比Multics更高明一些。

下面是Unix的特点:(30多年过去了,这些东西早已变成经典)

  • Everything (including hardware) is a file
    所有的事物(甚至硬件本身)都是一个的文件。
  • Configuration data stored in text
    以文本形式储存配置数据。
  • Small, single-purpose program
    程序尽量朝向小而单一的目标设计
  • Avoid captive user interfaces
    尽量避免令人困惑的用户接口
  • Ability to chain program together to perform complex tasks
    将几个程序连结起来,处理大而复杂的工作。

Unix的影响和哲学

Unix是第三次工业革命中计算机软件领域最具代表性的产物。在这近40年中,由Unix造成的影响是最有深远意义的。就我看来,Unix为软件领域带来了至少以下有积极的东西,由这些东西所引发的直接或间接的事物更是举不胜数。

  1. 软件开发的若干哲学和思想。
  2. 全民参与推动软件,代码共享的模式。
  3. 开启了黑客文化和开源项目。
  4. 免费和商业的完美结合的Linux。
  5. C语言,而后发展的C++,Java等等类C的语言和脚本。(参看《C语言的演变史》)
  6. TCP/IP,其的Socket编程已成为今天通用的网络编程主流。(参看《到处都是Unix的胎记》)

不能不说,AT&T虽然发展了Unix,但今天Unix的混乱的局面也和AT&T 有着直接原因。但反过来说,如果没有 AT&T的反面教材,今天的GNU/Linux很有可能也不会出现。AT&T究竟是限制了Unix的发展,还是以反面示例促进了Unix 社区,已不好评说。今天,软件是商业化好还是开源好的争论还在继续,纵观这几十年来Unix的历史,Linux的划时代地出现。相信你会得出自己的结论。 不管怎么样,Unix的经历对计算机领域贡献的不单单是技术,他给我们提供了丰富而生动的教材。特别是Unix引发的哲学,让今天的我们依然受益不浅。

说到Unix为我们所带来的软件开发的哲学,我必需要说一说。Unix遵循的原则是KISS(Keep it simple, stupid)。在http://en.wikipedia.org/wiki/Unix_philosophy 上有很多的基本上大同小异的Unix哲学,都是很经典的。

Doug McIlroy 是认为UNIX的哲学是这样的:三条哲学,简明扼要,就是这三条哲学贯穿着整个Unix世界。尤其是第一条“do one thing and do it well”真是相当精彩!

  • Write programs that do one thing and do it well.
  • Write programs to work together.
  • Write programs to handle text streams, because that is a universal interface.

只要是Unix的程序员,他们会比别的程序员在任何时候都会不停地强调着这三条哲学。

而《The Art of Unix Programming》总结了下面这些哲学,都是至理名言啊。

  • Rule of Modularity: Write simple parts connected by clean interfaces.
  • Rule of Clarity: Clarity is better than cleverness.
  • Rule of Composition: Design programs to be connected to other programs.
  • Rule of Separation: Separate policy from mechanism; separate interfaces from engines.
  • Rule of Simplicity: Design for simplicity; add complexity only where you must.
  • Rule of Parsimony: Write a big program only when it is clear by demonstration that nothing else will do.
  • Rule of Transparency: Design for visibility to make inspection and debugging easier.
  • Rule of Robustness: Robustness is the child of transparency and simplicity.
  • Rule of Representation: Fold knowledge into data so program logic can be stupid and robust.
  • Rule of Least Surprise: In interface design, always do the least surprising thing.
  • Rule of Silence: When a program has nothing surprising to say, it should say nothing.
  • Rule of Repair: When you must fail, fail noisily and as soon as possible.
  • Rule of Economy: Programmer time is expensive; conserve it in preference to machine time.
  • Rule of Generation: Avoid hand-hacking; write programs to write programs when you can.
  • Rule of Optimization: Prototype before polishing. Get it working before you optimize it.
  • Rule of Diversity: Distrust all claims for “one true way”.
  • Rule of Extensibility: Design for the future, because it will be here sooner than you think.

X Windows 的设计者 Mike Gancarz 给出了下面九条哲学思想

  1. Small is beautiful.
  2. Make each program do one thing well.
  3. Build a prototype as soon as possible.
  4. Choose portability over efficiency.
  5. Store data in flat text files.
  6. Use software leverage to your advantage.
  7. Use shell scripts to increase leverage and portability.
  8. Avoid captive user interfaces.
  9. Make every program a filter.

在今天,这种思想依然被传承着,在影响着世界上各个角落的每一个程序员。

 
 

Unix痛恨者手册

这里还需要值得一提的是一本叫《The Unix-Haters Handbook》,中文译做《Unix痛恨者手册》。可以在这里下载:http://research.microsoft.com/~daniel/uhh-download.html。 其中以调侃的语气声讨了Unix的种种不是。虽然这是十年前的一本书了,但还是值得一读。这本书指出了许多Unix的设计错误,指出了种种看起来很合理的 设计走向了荒谬,还这样调侃了C语言——“如果说C语言给足了让你上吊的绳子,那么,C++在给了你足够的绳子把你的邻居全部捆起来之后,还给了你足够的 绳子让你为一艘小帆船装上帆,最后你还有足够的绳子把自己吊死在帆船的桅杆上”。呵呵,相当的尖酸刻薄吧。里面有一句对操作系统的评价是这样的:“The fundamental difference between Unix and the Macintosh operating system is that Unix was designed to please programmers, whereas the Mac was designed to please users. (Windows, on the other hand, was designed to please accountants.”(Windows设计给会计人员?!连计算机用户都不是了,呵呵)

不过,我可以感觉得到这本书的作者在书中对Unix的感情是比较复杂的,爱恨交加,在书的最后有这样一句话“would anyone have spent this much time and effort writing about how much they hated Unix if they didn’t secretly love it? I’ll leave that to the readers to judge, but in the end, it really doesn’t matter: If this book doesn’t kill Unix, nothing will”。是的,如果Unix能够存活这么长的时间,那么,不会有什么东西可以把他消灭了。

从《Unix痛恨者手册》这本书,再加上Unix的历史,我们可以感到Unix的经历的风风雨雨,在Unix上面出现有种种教训,近40年的历 程,Unix历经磨难,几近夭折,一路走来的确很不容易,让人由衷感叹。今天的Unix,今天的软件工业和以前相比已是不可同日而语。很大程度上,这些都 要归功于这个充满苍桑的Unix。

 

后记

在中国我们开始学习计算机的时候,我们被Microsoft所创造的文化所笼罩里。就在Unix出现革命性的转变,在Unix影响计算机世界文化的 那几年里,科班出生专业开发人员学习的是MS-DOS和微软的文化,我们犹如一个井底之蛙一样,对外面的翻天覆地的变化无动于衷。微软创造的文化在我们这 里尤其地根深蒂固,我们几乎忘记了另外一边的Unix(参看《Unix 40年:Unix年鉴》、《Unix 40年:昨天,今天和明天》)。

在那充满激情的Unix的岁月里,大伙为了科研目的或个人兴趣在Unix上进行各种开发,并且不计较金钱利益,将这些源码公开,互相共享。在那里, 开发和自由成为主题,正因为如此,当今的世界才如此丰富多采。在40年Unix文化和技术积淀的里面,蕴涵着比较纯正的计算机文化和思想。

纵观整个Unix的历史过程中,许许多多的程序员、工程师前辈们在Unix中所摸爬滚打,他们的辛勤地、他们呕心沥血地跟随Unix,努力建立一个 繁荣的计算机世界的文明。Unix不是一个简简单单的操作系统。有人说,Unix是程序员设计给程序员的,一点没错。Unix的近40年历史造就了它的博 大精深,它给程序员们带来的绝不仅仅只是技术上的知识。它的失误,它的无奈,它的精神,它的荣耀,它从技术和思想上都启迪着我们。对于程序员来说,学习 Unix就等同于向前辈程序学习。无论你是什么样的程序员,你都应该了解Unix,这是开发人员的根,前面的开发者造就了它,而它又在引领后面的开发人 员,它是前辈程序员们交给我们的一份礼物,一个接力棒,它是开发人员赖以生存的土壤,是上一辈程序员留给我们这一代程序员开启未来的钥匙。Unix就像一 个程序员教父一样,理当受到我们的尊敬和崇拜。

 

参考资料

偷了世界的程序员

本文译自美国时代(time.com)的《The Men Who Stole the World》,原作者:Lev Grossman。相当有传奇色彩,读起来很爽,翻译过来。译得不好,还请大家指正。本中的四个程序员可能并不是那么声名显赫,而且也很不老实,或许算不上成功,不过他们的确改变了世界。而本文有分析了互联网上P2P的那些事,相当的有参考价值

 

十年前,有四个年轻人改变了这个世界的运作方式。他们使用的并不是法律或是武器或是金钱,而是使用软件来改变世界。他们当时有着激进和极具破坏性的 想法,并把这些想法付诸于代码,在Internet上以免费自由方式发布。这四个人,没有一个完成了大学学业,却奠定了今天我们习惯的数字媒体环境的基 础。然后,因为各种原因,他们也迅速地消失在公众视野中。

1999年,美国东北大学的一个叫Shawn Fanning的一年级新生开发Napster,从此,成为了P2P文件共享和不需要大型机构或零售商就可以获得音乐的先锋和范例。《时代周刊》和《财富》把他放上了封面。那时,他在19岁。

就在同一年,一个挪威的只有十几岁的年轻人 Jon Lech Johansen,他和另两个今天都不为人知的程序员,写下了一个程序解密了商业的DVD,而他成为了全球盛名的“ DVD Jon.”,那年,他只有15岁。

而在1997年,Justin Frankel,一个亚利桑那州塞多纳的18岁的黑客,开发了一个免费的MP3播放器——WinAmp,其成为了Windows操作系统上装机必备的软 件,并造就了主流数字音乐的革命。在他发布的第18个月内,1500万人下载了这个软件。而三年后,Frankel 开发了 Gnutella,一个P2P的文件共享协议,没有中心结点,不像 Napster,其不可能被关闭。目前有上百万人还在使用它。

2001年,Bram Cohen, 当年 26 岁,开发了一个P2P的文件传输共享协议—— BitTorrent,其以全新一流的架构全面优化了网络上大文件的共享和传输效率。 BitTorrent 也变成了整个Internet上发布大数据和文件的一个标准。

在 2000年代的上半段,《时代》采访了这四个程序员。那个时候,看起来他们要以数字化动乱把整个复杂的传统媒体娱乐平台给拆除,而对有版权的电影,音乐和 电视的收费则变得困难和不可能,那些艺术家也将无法从他们作品得到报酬,整个娱乐业包括时代华纳也将被炸为平地。而盗版业则借着这四个程员的软件侵袭了美 国公司。

“毕竟”,我们在2003年报道到:“在整个信息经济中,不可能所有的信息都是免费的”。如果毁灭正在来临,那么, Fanning, Johansen, Frankel 和 Cohen 将是那“四骑士”(译注:启示录中的四骑士传统上被解释为瘟疫、战争、饥荒和死亡)。



Shawn Fanning(左) 和 Bram Cohen(右)

 

没有毁灭

毁灭并没有发生。但是整个娱乐业因此而改变,而这些改变的复杂性和逐渐演进超出了我们的期望。这些发生的故事, 海盗王们的事,对于今天数字化世界正在发生的事情有非常高的参考和教育价值。Fanning, Johansen, Frankel 和 Cohen 现在都硅谷运作着自己的小的,合法的软件公司。他们现在没有在做和盗版有干系的事情——当然,如果他们真的没有。

Fanning,四个人中唯一一个没有回复我们的采访请求的人,他较早地退出了毁灭传统唱片业的事业。在2001年,Napster因为不堪众多关 于其协助并煽动版权侵权的法律诉论的重压,而不得不关闭。2002年,Fanning 创办了新的服务 Snocap —— 他尝试把文件共享合法化,在和相关的唱片公司合作下,Snocap 赋予消费者对其下载作品给于创作者报酬的权利。

但是,到那个时候,免费自由的文件共享程序像病毒一样的增涨,而用户则热衷于更换他们的音乐硬盘。他们仅在2001年8月一个月内就交换了30亿个 文件。而要从这些文件交易中收到钱是根本不可能的。是的,要和免费竞争是很难的一件事。 Fanning 创造了一个连他自己都搞不定的怪物。

所以,他停止继续尝试Snocap下去。 Fanning 的下一个项目是给游戏玩家的社交网络叫 Rupture,最终,他在2008年时以1500万美金把其卖给了电子艺界Electronic Arts ——这是他的第一次发薪日。他现在又于2008年11月开了一个公司 Path, 其主要提供给iPhone手机进行照片分享的服务。

而Napster呢?今天他还在。这个商标在破产拍卖时被卖了,然后再被卖了,但其再也没有被 重建。现在其被  Best Buy 运营,其是 iTunes 的竞争者,其口号是—— “More than just a music store.” (不仅仅只是音乐商店)

 

 
 
没有盗版的人


作 为 Gnutella 的作者, Justin Frankel 是 Fanning 合法的继任者。不像 Fanning,他很早就收获了他的第一桶金。在1999年,当WinAmp大放光芒的时候,AOL买了WinAmp和他的公司——Nullsoft,价 格应该在1亿美金左右。这让 Frankel 在20岁的时候就非常富有。当然,他也成了AOL的员工。

但这并不是很匹配,在Nullsoft, Frankel的做法是把软件开发到极致,然后免费发布出去。而在 AOL,软件的商业销售威胁并压倒了软件本身。“我致力于的产品,就像这样,我们不愿意金钱的掺入,我们正和其它公司做这笔交易,所以,产品也只能是这样 的结果”,他回忆到,“没有人真正地去关心用户的体验是怎么样的”。

与此同时,Frankel 用他的业余时间开发 Gnutella 。这是一个很有才的软件,不像Napster,其是真正的分布式,没有中心服务器,这样,也没有那个“关闭按钮”让那些律师按。在2000年3月的时 候,Gnutella上线,其发了一个贴子:“看见没?AOL也能给你一些好的东西!”,但是就算是这样,也没有换来AOL对其忠爱,而一大堆互联网公司 在那时试图并入大的媒体公司,在Napster被诉讼的中期,2004年,他离开了AOL。

然后,他开始干了些有趣的事:他离开了他的成功地,他不用 Gnutella,也没有花一毛钱,就算是10年以后也是这样。 LimeWire —— 最流行的 Gnutella 客户端 —— 号称有 5千万用户。“当我开发它的时候,我最初主要是想用其在验证一下是否可行。所以我也不想从其中获益”,他说,“所以,甚至我和它一点关系也没有也说得通, 其就是一个概念”。

Frankel 他最近从旧金山搬到了纽约城,现在全心打理自己的公司 Cockos (别问为什么叫这名),这是一个关于音频产品套件,叫 Reaper。他坚持不懈地改进着它,并且他和他的用户保持着很近的关系,其用户数大约是几万人。“当前的策略我们并不想发展用户数量”,他说,“我们只 是在享受目前的过程,并在做正确的事情”。他并不同意他是这个世界上最危险的geek,而滚石在2004年时对他则是这么认为的。“我不觉得盗版是很危险 的”,他说,“根本上来说,大众的商业模式总是依赖于对所有事情的强控制——尤其是那些有瑕疵的模式。而作为一个软件开发者来说,多少会产生一定程度的盗 版”, Gnutella 对他来说已是远古的事情了。“数字化盗版:它毁了唱片业了吗?没有。唱片业适应了吗?当然,很多人会说得更好。你应该更关注质量,以及更小一些乐队,等等 这类的事”。

“至于音乐流行和排行这么大的市场,这点盗版算什么?” 他边说边笑道, “我希望就是这样。”

 

 
 
 
 
四眼怪兽

在这四骑士中,只有 Bram Cohen他现在还在致力于其10年前的那个项目。他是 BitTorrent的创始人和首席科学家,而一个令人敬佩的旧金山的公司希望能把Cohen的这个令人瞠目的高效的内容分布式技术变成商业化应用。

这是一个奇特的公司:其合法的业务建立在一种仍然可能被用来进行大规模版权侵权的技术上。即使像 BitTorrent这样被8千万用户安装了的东西,其看上去还是像刚刚开始创业一样。 在BitTorrent上有相对较小的一部分是完全合法的 —— 最近的一个研究表明完全合法的部分占11%。而在这11%中,有更少的一部分产生了BitTorrent的收入。

就像 Fanning 的 Snocap 一样,Cohen 试图把其BitTorrent从大量的盗版领域转移到合法的领域,这样才能挣到钱。2007年是BT发展最震动的一年,BitTorrent成为了20世 纪福克斯、派拉蒙、华纳兄弟 和 米高梅 影业公司的合作伙伴,和他们一起共同形成了 Torrent Entertainment Network,主要提供电影,电视,电子游戏的购买和零售。

就像 Fanning一样, Cohen 明了要摆脱盗版并不像看上去的那么容易。“所有的和它有关的事都是灾难”,他说到。Torrent Entertainment Network 于2008年底关闭。回想起来,你能明白这为什么不行。 BitTorrent在用户友好上做得还不够,并且,在其底层也不够有效率。它可以很快地像病毒一样地移动大量的数据。然后,当你要在上面算钱的时候,你 不得不把速度给降下来,然后跟踪并控制其下载流,还和使用一些很扯淡的诸如“数字版权管理(DRM)”之流的技术,其大量地限制了用户那些是可以干的,哪 些是要买的。

“我从这次失败中学到了很多很多的教训”, Cohen 悔恨地说。他现在的策略是只和那些只需要他的BT中的“快速”和“病毒式分布”的人合作。“与其去和那些内容提供商合作,为他们加上特权,以扩展我们的渠 道,我们还不如直接获取那更大的渠道,那里的人更喜欢更为开放的方式”。

迄今,对些感兴趣的独立电影制片商叫 Four Eyed Monsters (四眼怪兽)和 一个叫 Pioneer One (先驱者一号)的电视剧集的创作团队。说起来有点沮丧:Cohen正坐在一个消防水带上,一个程序员所梦想的成功的技术却失控了,而大的玩家又不想来玩。

以他的编码天份,Cohen可以很容易的进入一家大型的公司。但那并不是他的风格。“我的确需要一定的自由度”,他说。他现在正在开发一个全新的事 情——一个P2P的实时数据流的系统,而不是分散的文件。这个项止将可能有巨大的潜力,尤其在新闻、体育等事的互联网上的现场直播。当然,他还在维护着 BitTorrent,但他没有花太多的时间在上面。他说:“当我开发它的时候我就知道没错”。

 
 

简单之道

那么,在去年,盗版导致了什么?在美国,每个人都认为盗版对内容制造者的影响并没有那么坏。一份去年四月份美国审计署的报告,非常牵强地把盗版和滞销给联系在一起,但其结果尚无定论。

打击盗版在今天扁平化的世界上并不那么成功。无政府主义的世界观加上那些无与伦比的代码,不可能在那些合法的津津计较的商业界里传播。好的代码应该 给用户有不同的选择,用户使用他们也并不一定是对行业有益的。而你真正需要的是向那些合法商业界挑战,挑战他们那些限制用户做用户想做的事的那种独裁 性。(译注:这让我想到了腾讯360还有敏感词)

另外一个重要的原因是唱片业的灾难是不会发生的。Steve Jobs 在 2003年4月28日,那段时间是互联网文件共享井喷的时候,Apple揭开了iTunes Music Store的面纱。在那个时候,我们都觉得iTunes不可能成功,就像Snocap以及他和它类似的项目都以失败告终。这是因为,你怎么可以可能和免费竞争呢?

但是iTunes 确实成功了。Apple无情地强调着简单和有魅力的用户接口,以及有乔布斯对唱片业的那强有力的谈判,造就了一个最新型的专业的服务,其可以让你放心地下 载并传输音乐。的确是做到了,尽管其是收费的,而且我们的购买需要和DRM(数字版权管理)扯上关系并限制我们。

于是,我们看到了可以和免费竞争的东西——简单(译注:个人以为可能还需要加上一点时尚)。Napster, Gnutella 和 BitTorrent 从来没有在用户友好度上到达像Apple那样的境界。从来没有人在网上检查并整理那些文件内容,所以,当那些众多的文件被共享时,我们可以看到,很多文件 加杂时广告,色情,木马,病毒以及其它一些垃圾。当乔布斯为我们提供了那条简单之路,我们接受了。很明显,自由太过头——至少数字媒体是这样的。

这 是一个让那些年轻的海盗王们认真学习的教训。就像 Fanning, Frankel 和 Cohen一样, 其实,Jon Lech Johansen 并不能算得上是一个真正的海盗。他没有因为想把好莱坞搞破产而去帮助破解DVD,他这样做是因为他想在他的电脑上看电影。他的电脑安装的是Linux操作 系统,而1999年,在Linux上根本没有可以用来播放DVD的程序,所以,他和他的伙伴们决定自己写一个,所以,他们不得不先把DVD给解密了。

当美国电影协会( Motion Picture Association of America)发现了DVD被破解的这个事,其向挪威政府控告 Johansen,并拘留了他。 他在奥斯陆(挪威的首都)受审两次,不过两次都被宣告无罪。因为他解密的DVD是他付费购买的。

但Johansen真正的明白消费者对其购买的数字媒体的权利,这就好像一本书一样——我们可以不断的使用这本书,或是把这本书借出去,这是我们的 权利。2005年, Johansen 去了加利福尼亚,在那里,他逆向工程了 FairPlay,这是苹果公司的用来保护其多媒体文件的DRM类软件(译注:这是苹果公司用来加密iPod的工具)。之后,他注意到了苹果公司产品的用 户体验是多么的迷人,所以,他在想,应该把这些东西带给全世界给那些更为无序的非苹果的产品。

“我们看到这世上有很多很多的产品,但其并没有像他们那样良好地运作”,Johansen说,那时他26岁的程序员。“所以,我们应该开发一个系统,其可以让这些设备的整合起来并给消费者他一个相当不错的用户体验”。

所谓的 “我们”,就是 Johansen 自己的公司—— doubleTwist,这个公司于2007年创建。 doubleTwist 软件是免费的,是一种像罗塞塔石一样的为数字多媒体软件文件开发的软件——它是可以翻译,和谐并组织大约500种不同设备的文件,把他们放在一起并提供一个相当漂亮的接口。其6月份, doubleTwist 摧出 Android App,当时就有超过50万的用户下载了(译注:大家可以Google一下, 好评如潮)。去年, doubleTwist 开始了他的政变打出了这样的广告:“The Cure for iPhone Envy. Your iTunes library on any device. In seconds.”(嫉妒iPhone的对策。你的iTunes库可以在任何设备上,只需几秒钟。)它这个条幅挂在了苹果在旧金山的旗舰店的外墙上。

Johansen 拒绝承认他和盗版有关系。“至于我被所指责的,真的和我没有什么关系”,他说。“我支持公平使用,意思是你的确是需要合法地获得内容,但你应该有权利使用 任何一款设备或是应用程序来查看那些内容”。 Johansen 像所有的海盗王一样,他总是能写好的代码,而这些好的代码给了人民使用的权力。这才是盗版灾难不会发生的真正原因。盗版永远不希望所有的音乐和电影或是其它的东西成为免费的,他们想要的“free”其实是自由!

 
 

————————————正文结束————————————

最后一句话是点睛之笔,作者对这个世界的认识真是相当的透彻。所以,加粗了。我个人理解本文带给我如下的启示:

  1. 年轻就应该豁得出去,就应该有天不怕地不怕的想法,并付诸于行动。
  2. 互联网上的盗版永远不会停止,与其说是盗版,其后面则是自由和无政府主义。
  3. 自由过度并不是那些利益集团所希望的,并可能会让你惹上麻烦,不过这世界总是因此而改变。
  4. 版权限制和免费并不是最好的,而最根本的是尊重用户的自由权以及不断地化繁为简以改善用户的体验。

另,题外话,最近一段时间都在招人,有一天,一个同事和我说,“现在的这些程序员怎么回事啊?我问他们:‘你心目中的最牛的程序员是谁?’,居然回 答不出来,有人说是Bill Gates,还有人说是马云,气死我了……”。我想想也真是可笑,难道,Dijkstra,Linus,Ken Thompson,Dennis Ritchie,Richard Steven,Bjarne Stroustrup…… 这些人不认识吗?就知道有钱人,哎,这个时代真是个文化缺失的年代!。

其实细想一下,不单单是我国的计算机文化都是那些肤浅的大公司的文化,我们整个国家的公司,社会和人都是很肤浅的。

最后还是送给大家那句话——真正让我们成为局域网的不是那个墙,而是我们自己的肤浅

五种应该避免的代码注释

一、自恋型注释

(注:原文为Proud,我觉得“自恋”更好一点)

  1. public class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         string message = “Hello World!”;  // 07/24/2010 Bob  
  6.         Console.WriteLine(message); // 07/24/2010 Bob  
  7.         message = “I am so proud of this code!”// 07/24/2010 Bob  
  8.         Console.WriteLine(message); // 07/24/2010 Bob  
  9.     }  

 

原文:这样的程序员对于自己的代码改动非常骄傲和自恋,所以,他觉得需在在这些自己的代码上标上自己的名字。其实,一个版本控制工具(如:CVS或Subversion)可以完整地记录下所有的关于代码的改动的和作者相关的一切信息,只不过不是那么明显罢了。

笔者:我同意原文的观点。在我的团队里也有这样的事情发生。有段时间我认真思考过这样的事情,是否应该把这样的事情在代码中铲除出去。后来,我觉得,允许这样的行为并不一定是坏事,因为两点:

  1. 调动程序员下属的积极性可能更为重要。即然,这种方式可以让程序员有骄傲的感觉,能在写代码中找到成就感,为什么要阻止呢?又不是什么大问题。
  2. 调动程序员的负责任的态度。程序员敢把自己的名字放在代码里,说明他对这些代码的信心,是想向大家展示其才能。所以,他当然知道,如果这段他加入的代码有问题的话,他的声誉必然受到损失,所以,他敢这么干,也就表明他敢于对自己的代码全面的负责。这不正是我们所需要的?!

所以,基于上述考虑,我个人认为,从代码的技术角度上来说,这样的注释很不好。但从团队的激励和管理上来说,这样的方式可能也挺好的。所以,我并不阻止也不鼓励这样的注释。关键在于其是否能有更好的结果。

 

 

二、废弃代码的注释

 
  1. public class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         /* This block of code is no longer needed 
  6.          * because we found out that Y2K was a hoax 
  7.          * and our systems did not roll over to 1/1/1900 */  
  8.         //DateTime today = DateTime.Today;  
  9.         //if (today == new DateTime(1900, 1, 1))  
  10.         //{  
  11.         //    today = today.AddYears(100);  
  12.         //    string message = “The date has been fixed for Y2K.”;  
  13.         //    Console.WriteLine(message);  
  14.         //}  
  15.     }  

 

原文:如果某段代码不再使用了,那就应该直接删除。我们不应该使用注释来标准废弃的代码。同样,我们有版本控制工具来管理我们的源代码,在版本控制工具里,是不可能有代码能被真正的物理删除的。所以,你总是可以从以前的版本上找回你的代码的。

笔者:我非常同意这样的观点。只要你是废弃的,就应该是删除,而不是注释掉。注释并不是用来删除代码的。也许你 会争论到,在迭代开发中,你觉得被注释的代码很有可能在未来会被使用,但现在因为种种问题暂时用不到,所以,你先注释着,然后等到某一天再enable 它。所以你注释掉一些未来会有的程序。在这样的情况,你可以注释掉这段代码,但你要明白,这段代码不是“废弃”的,而是“临时”不用的。所以,我在这里提 醒你,请不要教条式地在你的程序源码中杜绝这样的注释形式,是否“废弃”是其关键。

 

 

三、明显的注释

  1. public class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         /* This is a for loop that prints the 
  6.          * words “I Rule!” to the console screen 
  7.          * 1 million times, each on its own line. It 
  8.          * accomplishes this by starting at 0 and 
  9.          * incrementing by 1. If the value of the 
  10.          * counter equals 1 million the for loop 
  11.          * stops executing.*/  
  12.         for (int i = 0; i < 1000000; i++)  
  13.         {  
  14.             Console.WriteLine(“I Rule!”);  
  15.         }  
  16.     }  

 

原文:看看上面的例子,代码比注释还容易读。是的,大家都是程序员,对于一些简单的,显而易见的程序逻辑,不需要注释的。而且,你不需要在你的注释中教别人怎么编程,你这是在浪费时间去解释那些显而易见的东西。你应该用注释去解释你的代码功能,原因,想法,而不是代码本身。

笔者:非常同意。最理解的情况是你的代码写得直接易读,代码本身就是自解释的,根本不需要注释。这是最高境界。 注释应该说明下面的代码主要完成什么样的功能,为什么需要他,其主要算法怎么设计的,等等。而不是解释代码是怎么工作的。这点很多新手程序员都做得不够 好。别外,我需要指出的是,代码注释不宜过多,如果太多的话,你应该去写文档,而不是写注释了。

 

 

四、故事型注释

 
  1. public class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.        /* I discussed with Jim from Sales over coffee 
  6.         * at the Starbucks on main street one day and he 
  7.         * told me that Sales Reps receive commission 
  8.         * based upon the following structure. 
  9.         * Friday: 25% 
  10.         * Wednesday: 15% 
  11.         * All Other Days: 5% 
  12.         * Did I mention that I ordered the Caramel Latte with 
  13.         * a double shot of Espresso? 
  14.        */  
  15.         double price = 5.00;  
  16.         double commissionRate;  
  17.         double commission;  
  18.         if (DateTime.Today.DayOfWeek == DayOfWeek.Friday)  
  19.         {  
  20.             commissionRate = .25;  
  21.         }  
  22.         else if (DateTime.Today.DayOfWeek == DayOfWeek.Wednesday)  
  23.         {  
  24.             commissionRate = .15;  
  25.         }  
  26.         else  
  27.         {  
  28.             commissionRate = .05;  
  29.         }  
  30.         commission = price * commissionRate;  
  31.     }  

 

原文:如果你不得不在你的代码注释中提及需求,那也不应该提及人名。在上面的示例中,好像程序想要告诉其它程序员,下面那些代码的典故来自销售部的Jim,如果有不懂的,你可以去问他。其实,这根本没有必要在注释中提到一些和代码不相干的事。

笔者:太同意了。这里仅仅是代码,不要在代码中掺入别的和代码不相干的事。这里你也许会有以下的争辩:

  1. 有时候,那些所谓的“高手”逼着我这么干,所以,我要把他的名字放在这里让所有人看看他有多SB。
  2. 有时候,我对需求并不了解,我们应该放一个联系人在在这里,以便你可以去询问之。

对于第一点,我觉得这是一种情绪化。如果你的上级提出一些很SB的想法,我觉得你应该做的是努力去和他沟通,说明你的想法。如果这样都不行的话,你 应该让你的经理或是那个高手很正式地把他的想法和方案写在文档里或是电子邮件里,然后,你去执行。这样,当出现问题的时候,你可以用他的文档和邮件作为你 的免责证据,而不是在代码里干这些事。

对于第二点,这些需求的联系人应该是在需求文档中,如果有人有一天给你提了一个需求,你应该把其写在你的需求文档中,而不是你的代码里。要学会使用流程来管理你的工作,而不是用注释。

最后,关于故事型的注释,我需要指出也有例外的情况,我们团队中有人写注释喜欢在注释或文档里写一些名人名言(如 22条经典的编程引言编程引言补充Linus Torvalds 语录 Top 10 ),甚至写一些小笑话,幽默的短句。我并不鼓励这么做,但如果这样有利于培养团队文化,有利于让大家对工作更感兴趣,有利于大家在一种轻松愉快的环境下读/写代码,那不也是挺好的事吗?

另外,做为一个管理者,有时候我们应该去看看程序员的注释,因为那里面可能会有程序员最直实的想法和情绪(程序员嘴最脏??)。了解了他们的想法有利于你的管理。

 

 

五、“TODO”注释

 
  1. public class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.        //TODO: I need to fix this someday – 07/24/1995 Bob  
  6.        /* I know this error message is hard coded and 
  7.         * I am relying on a Contains function, but 
  8.         * someday I will make this code print a 
  9.         * meaningful error message and exit gracefully. 
  10.         * I just don’t have the time right now. 
  11.        */  
  12.        string message = “An error has occurred”;  
  13.        if(message.Contains(“error”))  
  14.        {  
  15.            throw new Exception(message);  
  16.        }  
  17.     }  

 

原文:当你在初始化一个项目的时候,TODO注释是非常有用的。但是,如果这样的注释在你的产品源码中出现了N多年,那就有问题了。如果有BUG要被fix,那就Fix吧,没有必要整一个TODO。

笔者:是的,TODO是一个好的标志仅当存在于还未release的项目中,如果你的软件产品都release 了,你的代码里还有TODO,这个就不对了。也许你会争辩说,那是你下一个版本要干的事。OK,那你应该使用项目管理,或是需求管理来管理你下一个版本要 干的事,而不是使用代码注释。通常,在项目release的前夕,你应该走查一下你代码中的TODO标志,并且做出决定,是马上做,还是以后做。如果是以 后做,那么,你应该使用项目管理或需求管理的流程。

上述是你应该避免使用的注释,以及我个人的一些观点,也欢迎你留下你的观点!

最佳编程语录

以前本站发布过《22条经典的编程引言》、《编程引言补充》、《Linus Torvalds 语录》还有《十条不错的编程观点》。今天向大家介绍“最佳编程语录”,条条都是很不错的语录,如同我们的太阳,照亮了我们的方向(所以我们选用了一个红色的图片,希望能够通过五毛们的网络审查)。其中只有一两条在以前本站发布过的文章中出现过。这篇文章的出处在这里,下面是“Neo”和“陈皓”的翻译,我们的翻译水平有限,所以,我们提供了中英文对照,有不当之处,还请各位指正。

A good programmer is someone who looks both ways before crossing a one-way street. — Doug Linder, systems administrator

好的程序员这样一类人,这类人在横穿一条单行道前都要先看一下路两边。– Doug Linder, 系统管理员

A most important, but also most elusive, aspect of any tool is its influence on the habits of those who train themselves in its use. If the tool is a programming language this influence is, whether we like it or not, an influence on our thinking habits. — Edsger Dijkstra, computer scientist

关于工具,一个最重要的,也是最不易察觉的方面是,工具对使用此工具的人的习惯的潜移默化的影响。如果这个工具是一门程序语言,不管我们是否喜欢它,它都会影响我们的思维惯式。 –Edsger Dijkstra, 著名的计算机科学家。

Being abstract is something profoundly different from being vague… The purpose of abstraction is not to be vague, but to create a new semantic level in which one can be absolutely precise. — Edsger Dijkstra

抽象和模糊完全地不同,抽象的目的并不是把事情变模糊,而去创建一个新的语义层,在那里是绝对精确的描述。 — Edsger Dijkstra

Besides a mathematical inclination, an exceptionally good mastery of one’s native tongue is the most vital asset of a competent programmer. — Edsger Dijkstra

除了数学爱好,对于一个有能力的程序员来说,出色地掌握自己的母语是最宝贵的财富。– Edsger Dijkstra

C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg. — Bjarne Stroustrup, developer of the C++ programming language

C很容易使你搬起石头砸自己的脚,而C++把这事变得更难,但是如果一定要这么做,那么你的整条腿都会被炸飞 -Bjarne Stroustrup, C++语言的发明者

Commentary: most debugging problems are fixed easily; identifying the location of the problem is hard. — unknown

修复bug很容易,但是定位bug却很困难 – 匿名

Considering the current sad state of our computer programs, software development is clearly still a black art, and cannot yet be called an engineering discipline. — Bill Clinton, former President of the United States

看看当前计算机程序糟糕的事态,软件开发明显一直是一门妖术,其仍然不能被称为一个工程学。 –比尔.克林顿 美国前总统

For a long time it puzzled me how something so expensive, so leading edge, could be so useless, and then it occurred to me that a computer is a stupid machine with the ability to do incredibly smart things, while computer programmers are smart people with the ability to do incredibly stupid things. They are, in short, a perfect match. — Bill Bryson, author, from Notes from a Big Country

长期以来,有个事一直困扰着我,那就是越是昂贵的,越是前沿的,就越可能是没用的。然后,困扰我的另一个事是,计算机是一个死的机器,却可以不可思 议地去完成那些巧妙的事情,而计算机程序员是那么聪明人却在做着不可思议的愚蠢的事情,简而言之,他们真是天生的一对。– Bill Bryson旅游文学作家 Big Country中的笔记

Given enough eyeballs, all bugs are shallow (e.g., given a large enough beta-tester and co-developer base, almost every problem will be characterized quickly and the fix obvious to someone). — Eric S. Raymond, programmer and advocate of open source software, from The Cathedral and the Bazaar

足够多的眼睛,就可让所有问题浮现(比如:只要给于足够多的beta测试者和开发人员一起工作,那么,几所所有的问题都会很快的出现,而修正也会是显而易见的)

Good code is its own best documentation. As you’re about to add a comment, ask yourself, ‘How can I improve the code so that this comment isn’t needed?’ Improve the code and then document it to make it even clearer. — Steve McConnell, software engineer and author, from Code Complete

好的代码自己本身就是最好的文档。当你打算加注释的时候,问问自己‘我如何才能把我的代码改善到不需增加注释?’重构自己的代码,然后使文档让其更清楚。 — Steve McConnell《代码大全》的作者

Hey! It compiles! Ship it! — unknown

嘿,编译通过了!出货!–匿名

Inside every well-written large program is a well-written small program. — Charles Antony Richard Hoare, computer scientist

在每个编写精良的大程序里面都是一个编写精良的小程序。 –Charles Antony Richard Hoare,计算机科学家

It should be noted that no ethically-trained software engineer would ever consent to write a DestroyBaghdad procedure. Basic professional ethics would instead require him to write a DestroyCity procedure, to which Baghdad could be given as a parameter. — Nathaniel S. Borenstein, computer scientist

需要注意的是,没有哪个经过规范培训的工程师会赞成写一个DestoryBaghdad(摧毁巴克达)的函数。最基本的职业规范会告诉他们应该去写 一个叫DestoryCity的函数,然后把“Baghdad”(巴克达)当成这个函数的参数。—— Nathaniel S. Borenstein, 计算机科学家

Managing programmers is like herding cats. — unknown

管理程序员就如同养一群猫一样 –匿名

Measuring programming progress by lines of code is like measuring aircraft building progress by weight. — Bill Gates, co-founder of Microsoft Corporation

用代码行数来衡量编程的进度,就如同用航空器零件的重量来衡量航空飞机的制造进度一样。——Bill Gates,微软创始人

More good code has been written in languages denounced as bad than in languages proclaimed wonderful — much more. — Bjarne Stroustrup, from The Design and Evolution of C++

更多的优秀代码是用被认为很烂的语言写成的,而不是用那些被说的好的不得了的语言。——Bjarne Stroustrup, 摘自《The Design and Evolution of C++》

Programs must be written for people to read, and only incidentally for machines to execute. — Harold Abelson and Gerald Jay Sussman, computer scientists and authors, from The Structure and Interpretation of Computer Programs

代码应该是写给其他人来读的,而能让机器运行的仅仅是附带着的。—— Harold Abelson 与 Gerald Jay Sussman, 计算机科学家和作家,摘自《The Structure and Interpretation of Computer Programs》

Real programmers don’t comment their code. If it was hard to write, it should be hard to understand. — unknown

真正程序员从来不写代码的注释,如果代码非常难写,那么同样代码的注释也会非常难懂 –匿名

Simplicity is prerequisite for reliability. — Edsger Dijkstra

简单是可靠的前提条件 — 迪杰斯特拉

The C programming language — a language which combines the flexibility of assembly language with the power of assembly language. — unknown

C语言—— 一门同时具有了汇编语言灵活性和汇编语言强大能力的语言。– 匿名

The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time. — Tom Cargill, object-oriented programming expert at Bell Labs

开始的90%的代码用了90%的开发时间,而剩下的最后的10%的代码会需要另外90%的开发时间。– Tom Cargill,贝尔实验室的面向对象编程专家。

The important point is that the cost of adding a feature isn’t just the time it takes to code it. The cost also includes the addition of an obstacle to future expansion. Sure, any given feature list can be implemented, given enough coding time. But in addition to coming out late, you will usually wind up with a codebase that is so fragile that new ideas that should be dead-simple wind up taking longer and longer to work into the tangled existing web. The trick is to pick the features that don’t fight each other. — John Carmack, computer game programmer

增加一个功能特性的成本并不单单是为这些功能编码所花费时间的成本,还这个成本应该包括特性扩展的障碍成本。当然,任何的功能清单都可以被实现,只 需要有足够的时间。但是除些之外,你应该对你的代码库的脆弱性感到紧张,而那些新的想法应该足够的简单,而不是去花费更多更多的时间去纠缠于现有的蜘蛛 网。这里的决窃是挑选那些不会和别人冲突的的功能。

The key to performance is elegance, not battalions of special cases. The terrible temptation to tweak should be resisted unless the payoff is really noticeable. — Jon Bently and M. Douglas McIlroy, both computer scientists at Bell Labs

表现的关键是精美和典雅的,并不是使用大量的特殊案例。对于任何调整的冲动都应该是被限制的,除非其回报真的是值得注意的。– Jon Bently and M. Douglas McIlroy, 二者都是贝尔试验实的计算机科学家

The last good thing written in C was Franz Schubert’s Symphony Number 9. — Erwin Dieterich, programmer
最后一件用C做的好作品就是弗朗茨.舒伯特的C大调第9交响曲 — Erwin Dieterich, programmer程序员

The problem with using C++ … is that there’s already a strong tendency in the language to require you to know everything before you can do anything. — Larry Wall, developer of the Perl language

使用C++最大的问题是..在C++语言里,存在这一种很强的趋势,就是如果你不明白C++语言的细节,你就无法做好任何事情。– Larry Wall, developer of the Perl language

The sooner you start to code, the longer the program will take. — Roy Carlson, University of Wisconsin

你越早开始都手编码,你所花费来编程的时间就越长 — Roy Carlson, University of Wisconsin

The value of a prototype is in the education it gives you, not in the code itself. — Alan Cooper, software author, from The Inmates are Running the Asylum

原型的价值在于他给你的教训,而不是代码自身 — Alan Cooper, software author, from The Inmates are Running the Asylum

There are only two kinds of programming languages: those people always bitch about and those nobody uses. — Bjarne Stroustrup

世界上只有两类编程语言:人们都抱怨的语言和从来没有人使用的语言 — Bjarne Stroustrup

There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies. — Charles Antony Richard Hoare

世界上有两个设计软件的方法,一种方法是设计的尽量简单,以至于明显的没有什么缺陷,另外一种方式是使他尽量的复杂,以至于其缺陷不那么明显。

Ugly programs are like ugly suspension bridges: they’re much more liable to collapse than pretty ones, because the way humans (especially engineer-humans) perceive beauty is intimately related to our ability to process and understand complexity. A language that makes it hard to write elegant code makes it hard to write good code. — Eric S. Raymond

丑陋的程序就像一座丑陋的吊桥:他们相比漂亮的良好的吊桥起来,更有可能会坍塌,这是因为人类(尤其是工程师)感知漂亮的东西是和我们处理和理解复杂问题的能力相关的。所以,一个程序语言如果很难以优雅地方式编程,那么其就很难写出好的代码。

Weeks of programming can save you hours of planning. — unknown

多做几周的编程可以节省你做计划的时间 —— 匿名 (意思为,只有实践过了,你才更容易做计划,没有实践过,做起计划来将会很头痛)

When a programming language is created that allows programmers to program in simple English, it will be discovered that programmers cannot speak English. — unknown

当程序语言被设计成允许程序以很简单的英语来编程的时候,人们将会发现编写程序的程序员都来自不会说英语的地方。 –匿名

编程时间分配图

下面是一个程序员coding的时间分配图,原图在这里

编程时间分配图


思考会是一个很重要的过程,当然耽搁拖沓也有可能也是因为没有想好,抽烟/喝咖啡应该也是一种思考,吃点东西是为了让脑子转得更快一点,上网搜索一下灵感可以借鉴一下其它人的想法,抱怨写注释只是一个例子,更多的应该是抱怨加班或是公司的老板。

如果需要加上点什么的话,我觉得应该加点“重构”,“编译”,“调试”,当然,他们都可以算在coding里。不过,我觉得更应该还有:“开会”,“争吵/解释”,“打断”,这些比重也是很大的。

所以,下面是我个人认为比较实际的版本:

编程时间图(酷壳版)

你的编程时间分配图是怎么样的?

40个很不错的CSS技术

1. A CSS styled table version 2

 
 

2. A CSS-based Form Template

 
 

3. A Stripe of List Style Inspiration

 
 

4. Accessible expanding and collapsing menu

 
 

5. Advanced CSS Menu Trick

 
 

6. Animated Rollover Arrow

 
 

7. Animations

 
 

8. Background Size

 
 

9. Better Ordered Lists (Using Simple PHP and CSS)

 
 

10. Box Shadow

 
 

11. Creating a table with dynamically highlighted columns

 
 

12. Creating bulletproof graphic link buttons with CSS | 456 Berea Street

 
 

13. Creative and Cool Uses of the CSS Border Property

 
 

14. Creative Use of PNG Transparency in Web Design

 
 

15. Cross Browser CSS SlideShow

 
 

16. Cross Browser Multi-Page Photograph Gallery

 
 

17. CSS Bar Graphs: Examples

 
 

18. CSS Based Navigation

 
 

19. CSS Curves

 
 

20. CSS Dock Menu

 
 

21. CSS Double Lists

 
 

22. CSS-Based Tables: Technique

 
 

23. CSS Gradient Text Effect

 
 

24. CSS List Boxes

 
 

25. CSS Map Pop

 
 

26. CSS Pricing Matrix

 
 

27. CSS Production Notes

 
 

28. CSS Pull Quotes

 
 

29. CSS Rounded Corners Roundup (Nifty Corners)

 
 

30. CSS SiteMap

 
 

31. CSS Speech Bubbles

 
 

32. CSS Stacked Bar Graphs

 
 

33. CSS Step Menu

 
 

34. CSS Tabs

 
 

35. CSS Teaser Box

 
 

36. CSS Zooming

 
 

37. CSS: Menu Descriptions

 
 

38. CSS-Based Forms: Techniques

 
 

39. Date Display Technique with Sprites

 
 

40. Displaying Percentages with CSS

 
 

文章来源:http://technologytosoftware.com/best-css-techniques-you-shouldt-miss-for-effective-coding.html

140个Google的面试题

来源:http://blog.seattleinterviewcoach.com/2009/02/140-google-interview-questions.html(墙)

某猎头收集了140多个Google的面试题,都张到他的Blog中了,主要是下面这些职位的,因为被墙,且无任何敏感信息,所以,我原文搬过来了。
  • Product Marketing Manager
  • Product Manager
  • Software Engineer
  • Software Engineer in Test
  • Quantitative Compensation Analyst
  • Engineering Manager
  • AdWords Associate

这篇Blog例举了Google用来面试下面这几个职位的面试题。很多不是很容易回答,不过都比较经典与变态,是 Google,Microsoft,Amazon之类的公司的风格。对于本文,我没有翻译,因为我相信,英文问题是最好的。不过对于有些问题,我做了一些 注释,不一定对,但希望对你有帮助启发。对于一些问题,如果你百思不得其解,可以Google一下,StackOverflow或是Wikipedia上 可能会给你非常全面的答案。

Product Marketing Manager
  • Why do you want to join Google?
  • What do you know about Google’s product and technology?
  • If you are Product Manager for Google’s Adwords, how do you plan to market this?
  • What would you say during an AdWords or AdSense product seminar?
  • Who are Google’s competitors, and how does Google compete with them?
  • Have you ever used Google’s products? Gmail?
  • What’s a creative way of marketing Google’s brand name and product?
  • If you are the product marketing manager for Google’s Gmail product, how do you plan to market it so as to achieve 100 million customers in 6 months?
  • How much money you think Google makes daily from Gmail ads?
  • Name a piece of technology you’ve read about recently. Now tell me your own creative execution for an ad for that product.
  • Say an advertiser makes $0.10 every time someone clicks on their ad. Only 20% of people who visit the site click on their ad. How many people need to visit the site for the advertiser to make $20?
  • Estimate the number of students who are college seniors, attend four-year schools, and graduate with a job in the United States every year.

Product Manager
  • How would you boost the GMail subscription base?
  • What is the most efficient way to sort a million integers?  (merge sort)
  • How would you re-position Google’s offerings to counteract competitive threats from Microsoft?
  • How many golf balls can fit in a school bus? (这种题一般来说是考你的解题思路的,注意,你不能单纯地把高尔夫球当成一个小立方体,其是一个圆球,堆起来的时候应该是错开的——也就是三个相邻 的球的圆心是个等边三角形)
  • You are shrunk to the height of a nickel and your mass is proportionally reduced so as to maintain your original density. You are then thrown into an empty glass blender. The blades will start moving in 60 seconds. What do you do?
  • How much should you charge to wash all the windows in Seattle?
  • How would you find out if a machine’s stack grows up or down in memory?
  • Explain a database in three sentences to your eight-year-old nephew. (用三句话向8岁的侄子解释什么是数据库,考你的表达能力了)
  • How many times a day does a clock’s hands overlap?(经典的时钟问题)
  • You have to get from point A to point B. You don’t know if you can get there. What would you do?
  • Imagine you have a closet full of shirts. It’s very hard to find a shirt. So what can you do to organize your shirts for easy retrieval? (很不错的一道题,不要以为分类查询很容易,想想图书馆图书的分类查询问题吧。另外,你处想想如何在你在你的衣柜里实现一个相当于Hash表或是一 个Tree之类的数据结构)
  • Every man in a village of 100 married couples has cheated on his wife. Every wife in the village instantly knows when a man other than her husband has cheated, but does not know when her own husband has. The village has a law that does not allow for adultery. Any wife who can prove that her husband is unfaithful must kill him that very day. The women of the village would never disobey this law. One day, the queen of the village visits and announces that at least one husband has been unfaithful. What happens? (这个问题很有限制级,哈哈,非常搞的一个问题,注意wife们的递归,这类的问题是经典的分布式通讯问题,上网搜 一搜吧。)
  • In a country in which people only want boys, every family continues to have children until they have a boy. If they have a girl, they have another child. If they have a boy, they stop. What is the proportion of boys to girls in the country?(第一反应是——这个国家是中国。一个概率问题,其实,无论你怎么生,50%的概率是永远不变的。)
  • If the probability of observing a car in 30 minutes on a highway is 0.95, what is the probability of observing a car in 10 minutes (assuming constant default probability)?
  • If you look at a clock and the time is 3:15, what is the angle between the hour and the minute hands? (The answer to this is not zero!)
  • Four people need to cross a rickety rope bridge to get back to their camp at night. Unfortunately, they only have one flashlight and it only has enough light left for seventeen minutes. The bridge is too dangerous to cross without a flashlight, and it’s only strong enough to support two people at any given time. Each of the campers walks at a different speed. One can cross the bridge in 1 minute, another in 2 minutes, the third in 5 minutes, and the slow poke takes 10 minutes to cross. How do the campers make it across in 17 minutes?(经典的过桥问题)
  • You are at a party with a friend and 10 people are present including you and the friend. your friend makes you a wager that for every person you find that has the same birthday as you, you get $1; for every person he finds that does not have the same birthday as you, he gets $2. would you accept the wager?
  • How many piano tuners are there in the entire world?
  • You have eight balls all of the same size. 7 of them weigh the same, and one of them weighs slightly more. How can you find the ball that is heavier by using a balance and only two weighings?(经典的称重问题。这样的问题花样很多,不过都不难回答)
  • You have five pirates, ranked from 5 to 1 in descending order. The top pirate has the right to propose how 100 gold coins should be divided among them. But the others get to vote on his plan, and if fewer than half agree with him, he gets killed. How should he allocate the gold in order to maximize his share but live to enjoy it? (Hint: One pirate ends up with 98 percent of the gold.)
  • You are given 2 eggs. You have access to a 100-story building. Eggs can be very hard or very fragile means it may break if dropped from the first floor or may not even break if dropped from 100th floor. Both eggs are identical. You need to figure out the highest floor of a 100-story building an egg can be dropped without breaking. The question is how many drops you need to make. You are allowed to break 2 eggs in the process. (从3的倍数的楼层开始扔,比如3,6,9,12…..,如果鸡蛋在3n层碎了,那到在3n-1层扔第二个鸡蛋,如果没碎,则最高不碎楼层为3n- 1,否则为3n-2)
  • Describe a technical problem you had and how you solved it.
  • How would you design a simple search engine?
  • Design an evacuation plan for San Francisco.
  • There’s a latency problem in South Africa. Diagnose it. (这个问题完全是在考你的解决问题的能力。没有明确的答案。不过,解决性能问题的第一步通常是找出瓶颈,找瓶颈有很多种方法,工具,二分查,时间记 录等等。)
  • What are three long term challenges facing Google?
  • Name three non-Google websites that you visit often and like. What do you like about the user interface and design? Choose one of the three sites and comment on what new feature or project you would work on. How would you design it?
  • If there is only one elevator in the building, how would you change the design? How about if there are only two elevators in the building? (经典的电梯设计问题,这种问题千变万化,主要是考你的设计能力和需求变化的适变能力,与此相似的是酒店订房系统。)
  • How many vacuum’s are made per year in USA?

Software Engineer
  • Why are manhole covers round? (为什么下水井盖是圆的?这是有N种答案的,上Wiki看看吧)
  • What is the difference between a mutex and a semaphore? Which one would you use to protect access to an increment operation?
  • A man pushed his car to a hotel and lost his fortune. What happened? (脑筋急转弯?他在玩大富翁游戏?!!)
  • Explain the significance of “dead beef”.(要是你看到的是16进制 DEAD BEEF,你会觉得这是什么?IPv6的地址?)
  • Write a C program which measures the the speed of a context switch on a UNIX/Linux system.
  • Given a function which produces a random integer in the range 1 to 5, write a function which produces a random integer in the range 1 to 7.(上StackOverflow看看吧,经典的问题)
  • Describe the algorithm for a depth-first graph traversal.
  • Design a class library for writing card games. (用一系列的类来设计一个扑克游戏,设计题)
  • You need to check that your friend, Bob, has your correct phone number, but you cannot ask him directly. You must write a the question on a card which and give it to Eve who will take the card to Bob and return the answer to you. What must you write on the card, besides the question, to ensure Bob can encode the message so that Eve cannot read your phone number?(协议+数字加密,我试想了一个,纸条上可以这样写,“Bob,请把我的手机号以MD5算法加密后的字符串,比对下面的字符串—— XXXXXX,它们是一样的吗?”)
  • How are cookies passed in the HTTP protocol?
  • Design the SQL database tables for a car rental database.
  • Write a regular expression which matches a email address. (上StackOverflow查相当的问题吧。)
  • Write a function f(a, b) which takes two character string arguments and returns a string containing only the characters found in both strings in the order of a. Write a version which is order N-squared and one which is order N.(算法题,不难,不说了。一个O(n^2)和一个O(n)的算法复杂度)
  • You are given a the source to a application which is crashing when run. After running it 10 times in a debugger, you find it never crashes in the same place. The application is single threaded, and uses only the C standard library. What programming errors could be causing this crash? How would you test each one? (和随机数有关系?或是时间?)
  • Explain how congestion control works in the TCP protocol.
  • In Java, what is the difference between final, finally, and finalize?
  • What is multithreaded programming? What is a deadlock?
  • Write a function (with helper functions if needed) called to Excel that takes an excel column value (A,B,C,D…AA,AB,AC,… AAA..) and returns a corresponding integer value (A=1,B=2,… AA=26..).
  • You have a stream of infinite queries (ie: real time Google search queries that people are entering). Describe how you would go about finding a good estimate of 1000 samples from this never ending set of data and then write code for it.
  • Tree search algorithms. Write BFS and DFS code, explain run time and space requirements. Modify the code to handle trees with weighted edges and loops with BFS and DFS, make the code print out path to goal state.
  • You are given a list of numbers. When you reach the end of the list you will come back to the beginning of the list (a circular list). Write the most efficient algorithm to find the minimum # in this list. Find any given # in the list. The numbers in the list are always increasing but you don’t know where the circular list begins, ie: 38, 40, 55, 89, 6, 13, 20, 23, 36. (循环排序数组的二分查找问题)
  • Describe the data structure that is used to manage memory. (stack)
  • What’s the difference between local and global variables?
  • If you have 1 million integers, how would you sort them efficiently? (modify a specific sorting algorithm to solve this)
  • In Java, what is the difference between static, final, and const. (if you don’t know Java they will ask something similar for C or C++).
  • Talk about your class projects or work projects (pick something easy)… then describe how you could make them more efficient (in terms of algorithms).
  • Suppose you have an NxN matrix of positive and negative integers. Write some code that finds the sub-matrix with the maximum sum of its elements.(以前见过一维数组的这个问题,现在是二维的。感觉应该是把二维的第一行的最大和的区间算出来,然后再在这个基础之上进行二维的 分析。思路应该是这个,不过具体的算法还需要想一想)
  • Write some code to reverse a string.
  • Implement division (without using the divide operator, obviously).(想一想手算除法的过程。)
  • Write some code to find all permutations of the letters in a particular string.
  • What method would you use to look up a word in a dictionary? (使用排序,哈希,树等算法和数据结构)
  • Imagine you have a closet full of shirts. It’s very hard to find a shirt. So what can you do to organize your shirts for easy retrieval?
  • You have eight balls all of the same size. 7 of them weigh the same, and one of them weighs slightly more. How can you fine the ball that is heavier by using a balance and only two weighings?
  • What is the C-language command for opening a connection with a foreign host over the internet?
  • Design and describe a system/application that will most efficiently produce a report of the top 1 million Google search requests. These are the particulars: 1) You are given 12 servers to work with. They are all dual-processor machines with 4Gb of RAM, 4x400GB hard drives and networked together.(Basically, nothing more than high-end PC’s) 2) The log data has already been cleaned for you. It consists of 100 Billion log lines, broken down into 12 320 GB files of 40-byte search terms per line. 3) You can use only custom written applications or available free open-source software.
  • There is an array A[N] of N numbers. You have to compose an array Output[N] such that Output[i] will be equal to multiplication of all the elements of A[N] except A[i]. For example Output[0] will be multiplication of A[1] to A[N-1] and Output[1] will be multiplication of A[0] and from A[2] to A[N-1]. Solve it without division operator and in O(n).(注意其不能使用除法。算法思路是这样的,把output[i]=a[i]左边的乘积 x a[i]右边的乘积,所以,我们可以分两个循环,第一次先把A[i]左边的乘积放在Output[i]中,第二次把A[i]右边的乘积算出来。我们先看第 一次的循环,使用迭代累积的方式,代码如下:for(r=1; i=0; i<n-1; i++){ Output[i]=r; r*=a[i]; },看明白了吧。第二次的循环我就不说了,方法一样的。)
  • There is a linked list of numbers of length N. N is very large and you don’t know N. You have to write a function that will return k random numbers from the list. Numbers should be completely random. Hint: 1. Use random function rand() (returns a number between 0 and 1) and irand() (return either 0 or 1) 2. It should be done in O(n).(本题其实不难。在遍历链表的同时一边生成随机数,一边记录最大的K个随机数和其链接地址。)
  • Find or determine non existence of a number in a sorted list of N numbers where the numbers range over M, M>> N and N large enough to span multiple disks. Algorithm to beat O(log n) bonus points for constant time algorithm.(使用bitmap,如果一个长整形有64位,那么我们可以使用M/64个bitmap)
  • You are given a game of Tic Tac Toe. You have to write a function in which you pass the whole game and name of a player. The function will return whether the player has won the game or not. First you to decide which data structure you will use for the game. You need to tell the algorithm first and then need to write the code. Note: Some position may be blank in the game। So your data structure should consider this condition also.
  • You are given an array [a1 To an] and we have to construct another array [b1 To bn] where bi = a1*a2*…*an/ai. you are allowed to use only constant space and the time complexity is O(n). No divisions are allowed.(前面说过了)
  • How do you put a Binary Search Tree in an array in a efficient manner. Hint :: If the node is stored at the ith position and its children are at 2i and 2i+1(I mean level order wise)Its not the most efficient way.(按顺序遍历树)
  • How do you find out the fifth maximum element in an Binary Search Tree in efficient manner. Note: You should not use use any extra space. i.e sorting Binary Search Tree and storing the results in an array and listing out the fifth element.
  • Given a Data Structure having first n integers and next n chars. A = i1 i2 i3 … iN c1 c2 c3 … cN.Write an in-place algorithm to rearrange the elements of the array ass A = i1 c1 i2 c2 … in cn(这个算法其实就是从中间开始交换元素,代码:for(i=n-1; i>1; i++) {  for(j=i; j<2*n-i; j+=2) { swap(a[j], a[j+1]); } },不好意思写在同一行上了。)
  • Given two sequences of items, find the items whose absolute number increases or decreases the most when comparing one sequence with the other by reading the sequence only once.
  • Given That One of the strings is very very long , and the other one could be of various sizes. Windowing will result in O(N+M) solution but could it be better? May be NlogM or even better?
  • How many lines can be drawn in a 2D plane such that they are equidistant from 3 non-collinear points?
  • Let’s say you have to construct Google maps from scratch and guide a person standing on Gateway of India (Mumbai) to India Gate(Delhi). How do you do the same?
  • Given that you have one string of length N and M small strings of length L. How do you efficiently find the occurrence of each small string in the larger one?
  • Given a binary tree, programmatically you need to prove it is a binary search tree.
  • You are given a small sorted list of numbers, and a very very long sorted list of numbers – so long that it had to be put on a disk in different blocks. How would you find those short list numbers in the bigger one?
  • Suppose you have given N companies, and we want to eventually merge them into one big company. How many ways are theres to merge?
  • Given a file of 4 billion 32-bit integers, how to find one that appears at least twice? (我能想到的是拆分成若干个小数组,排序,然后一点点归并起来)
  • Write a program for displaying the ten most frequent words in a file such that your program should be efficient in all complexity measures.(你可能需要看看这篇文章Finding Frequent Items in Data Streams)
  • Design a stack. We want to push, pop, and also, retrieve the minimum element in constant time.
  • Given a set of coin denominators, find the minimum number of coins to give a certain amount of change.(你应该查看一下这篇文章:Coin Change Problem)
  • Given an array, i) find the longest continuous increasing subsequence. ii) find the longest increasing subsequence.(这个题不难,O(n)算法是边遍历边记录当前最大的连续的长度。)
  • Suppose we have N companies, and we want to eventually merge them into one big company. How many ways are there to merge?
  • Write a function to find the middle node of a single link list. (我能想到的算法是——设置两个指针p1和p2,每一次,p1走两步,p2走一步,这样,当p1走到最后时,p2就在中间)
  • Given two binary trees, write a compare function to check if they are equal or not. Being equal means that they have the same value and same structure.(这个很简单,使用递归算法。)
  • Implement put/get methods of a fixed size cache with LRU replacement algorithm.
  • You are given with three sorted arrays ( in ascending order), you are required to find a triplet ( one element from each array) such that distance is minimum. Distance is defined like this : If a[i], b[j] and c[k] are three elements then distance=max(abs(a[i]-b[j]),abs(a[i]-c[k]),abs(b[j]-c[k]))” Please give a solution in O(n) time complexity(三个指针,a, b, c分别指向三个数组头,假设:a[0]<b[0]<c[0],推进a直到a[i]>b[0],计算 abs(a[i-1] – c[0]),把结果保存在min中。现在情况变成找 a[i], b[0],c[0],重复上述过程,如果有一个新的值比min要小,那就取代现有的min。)
  • How does C++ deal with constructors and deconstructors of a class and its child class?
  • Write a function that flips the bits inside a byte (either in C++ or Java). Write an algorithm that take a list of n words, and an integer m, and retrieves the mth most frequent word in that list.
  • What’s 2 to the power of 64?
  • Given that you have one string of length N and M small strings of length L. How do you efficiently find the occurrence of each small string in the larger one? (我能想到的是——把那M个小字串排个序,然后遍历大字串,并在那M个字串中以二分取中的方式查找。)
  • How do you find out the fifth maximum element in an Binary Search Tree in efficient manner.
  • Suppose we have N companies, and we want to eventually merge them into one big company. How many ways are there to merge?
  • There is linked list of millions of node and you do not know the length of it. Write a function which will return a random number from the list.
  • You need to check that your friend, Bob, has your correct phone number, but you cannot ask him directly. You must write a the question on a card which and give it to Eve who will take the card to Bob and return the answer to you. What must you write on the card, besides the question, to ensure Bob can encode the message so that Eve cannot read your phone number?
  • How long it would take to sort 1 trillion numbers? Come up with a good estimate.
  • Order the functions in order of their asymptotic performance: 1) 2^n 2) n^100 3) n! 4) n^n
  • There are some data represented by(x,y,z). Now we want to find the Kth least data. We say (x1, y1, z1) > (x2, y2, z2) when value(x1, y1, z1) > value(x2, y2, z2) where value(x,y,z) = (2^x)*(3^y)*(5^z). Now we can not get it by calculating value(x,y,z) or through other indirect calculations as lg(value(x,y,z)). How to solve it?
  • How many degrees are there in the angle between the hour and minute hands of a clock when the time is a quarter past three?
  • Given an array whose elements are sorted, return the index of a the first occurrence of a specific integer. Do this in sub-linear time. I.e. do not just go through each element searching for that element.
  • Given two linked lists, return the intersection of the two lists: i.e. return a list containing only the elements that occur in both of the input lists. (把第一个链表存入hash表,然后遍历第二个链表。不知道还没有更好的方法。)
  • What’s the difference between a hashtable and a hashmap?
  • If a person dials a sequence of numbers on the telephone, what possible words/strings can be formed from the letters associated with those numbers?(这个问题和美国的电话有关系,大家可以试着想一下我们发短信的手机,按数字键出字母,一个组合的数学问题。)
  • How would you reverse the image on an n by n matrix where each pixel is represented by a bit?
  • Create a fast cached storage mechanism that, given a limitation on the amount of cache memory, will ensure that only the least recently used items are discarded when the cache memory is reached when inserting a new item. It supports 2 functions: String get(T t) and void put(String k, T t).
  • Create a cost model that allows Google to make purchasing decisions on to compare the cost of purchasing more RAM memory for their servers vs. buying more disk space.
  • Design an algorithm to play a game of Frogger and then code the solution. The object of the game is to direct a frog to avoid cars while crossing a busy road. You may represent a road lane via an array. Generalize the solution for an N-lane road.
  • What sort would you use if you had a large data set on disk and a small amount of ram to work with?
  • What sort would you use if you required tight max time bounds and wanted highly regular performance.
  • How would you store 1 million phone numbers?(试想电话是有区段的,可以把区段统一保存,Flyweight设计模式)
  • Design a 2D dungeon crawling game. It must allow for various items in the maze – walls, objects, and computer-controlled characters. (The focus was on the class structures, and how to optimize the experience for the user as s/he travels through the dungeon.)
  • What is the size of the C structure below on a 32-bit system? On a 64-bit? (注意编译器的对齐)

struct foo {

char a;
char* b;
};

Software Engineer in Test
  • Efficiently implement 3 stacks in a single array.
  • Given an array of integers which is circularly sorted, how do you find a given integer.
  • Write a program to find depth of binary search tree without using recursion.
  • Find the maximum rectangle (in terms of area) under a histogram in linear time.
  • Most phones now have full keyboards. Before there there three letters mapped to a number button. Describe how you would go about implementing spelling and word suggestions as people type.
  • Describe recursive mergesort and its runtime. Write an iterative version in C++/Java/Python.
  • How would you determine if someone has won a game of tic-tac-toe on a board of any size?
  • Given an array of numbers, replace each number with the product of all the numbers in the array except the number itself *without* using division.
  • Create a cache with fast look up that only stores the N most recently accessed items.
  • How to design a search engine? If each document contains a set of keywords, and is associated with a numeric attribute, how to build indices?
  • Given two files that has list of words (one per line), write a program to show the intersection.
  • What kind of data structure would you use to index annagrams of words? e.g. if there exists the word “top” in the database, the query for “pot” should list that.
Quantitative Compensation Analyst

  • What is the yearly standard deviation of a stock given the monthly standard deviation?
  • How many resumes does Google receive each year for software engineering?
  • Anywhere in the world, where would you open up a new Google office and how would you figure out compensation for all the employees at this new office?
  • What is the probability of breaking a stick into 3 pieces and forming a triangle?
Engineering Manager
  • You’re the captain of a pirate ship, and your crew gets to vote on how the gold is divided up. If fewer than half of the pirates agree with you, you die. How do you recommend apportioning the gold in such a way that you get a good share of the booty, but still survive?
AdWords Associate
  • How would you work with an advertiser who was not seeing the benefits of the AdWords relationship due to poor conversions?
  • How would you deal with an angry or frustrated advertisers on the phone?
 
 
 
Sources