0%

Programmer

programmer20180402.jpg

从事程序开发、程序维护的专业人员。

痛苦造就性格(也许还造就产品)

作者: 阮一峰
日期: 2011年12月 6日

如果你知道TechCrunch,那么你可能知道Michael Arrington。

他是一个律师,自称对”Web 2.0”更有兴趣,因此创办了个人网志TechCrunch,专门报道硅谷的创业公司和风险资本家。

虽然不少人认为TechCrunch缺乏可读性,但是它可能是世界上订阅人数最多的科技类网志,2010年9月被AOL以2500万美元收购。有了这笔钱,Michael Arrington就改行当上了风险资本家。

一周前,他发表了一篇文章,评论了网络游戏公司Zynga的劳资矛盾。文章的题目叫做《创业是艰难的:多工作,少喊累,别发牢骚》( “Startups Are Hard. So Work More, Cry Less, And Quit All The Whining”)。

这篇文章引用了程序员Jamie Zawinski写于1994年的日记(详见后文),得出了这么一个观点:

“If you work at a startup and you think you’re working too hard and sacrificing too much, find a job somewhere else that will cater to your needs.”

“如果你在创业公司工作,觉得工作得很累,牺牲太多,那么换个地方,找一份更合适你的工作吧。”

言下之意,软件业就是一个很累的地方,要想成功,就必须拼命,哪怕放弃正常生活和休闲,也在所不惜,否则你失败就是活该。

第二天,Jamie Zawinski发表回应,严厉批评了Michael Arrington。

“He’s using my words to try and back up that thesis.

他用我的话,支持这种观点。

I hate this, because it’s not true, and it’s disingenuous.

我很反感,因为这不是事实,而是诡辩。

What is true is that for a VC’s business model to work, it’s necessary for you to give up your life in order for him to become richer.

事实是,风险资本家的商业模式需要这种宣传。只有你放弃你的生活,才能使他变得更富有。

He’s telling you the story of, “If you bust your ass and don’t sleep, you’ll get rich” because the only way that people in his line of work get richer is if young, poorly-socialized, naive geniuses believe that story! Without those coat-tails to ride, VCs might have to work for a living. Once that kid burns out, they’ll just slot a new one in.

他鼓吹,如果你忙得一刻不停,不休息不睡觉,你就会致富。因为干他那一行的人致富的唯一方法,就是那些年轻的、不擅于社交的、天真的程序员相信他那一套鬼话!没有这些垫背,风险资本家可能就必须自己动手谋生了。一旦那些孩子们失去利用价值,他们就接着去骗下一批人。”

别信风险资本家的鬼话,真正值得追求的生活是这样的:

“I recommend that you do what you love because you love doing it. If that means long hours, fantastic. If that means leaving the office by 6pm every day for your underwater basket-weaving class, also fantastic.

我的建议是,你去做那些你喜欢做的事,只要喜欢就行。如果这意味着长时间工作,那很好。如果这意味着每天6点钟准时下班,参加潜水培训班,那也很好。”

===================================

看了他的这篇回应,我的第一个感觉是,当年那个特立独行、不羁放纵的Jamie Zawinski又回来了。

他是一个非常传奇的人,高中都没有毕业,却是世界上最好的程序员之一,Netscape公司的主力程序员,划时代产品”网景浏览器”的主要开发者。

他在公司里就是一身摇滚明星的打扮,留长发、穿皮夹克、戴金属饰品,非常有个性。当微软公司不正当竞争,将IE与Windows捆绑在一起,击败Netscape的时候,他就公开发誓,终身不使用微软公司的任何产品,也不授权任何人将他的代码用于Windows平台。他是Mozilla这个名字的创造者,也是第一个提议将”网景浏览器”开源的人。当同事们决定彻底放弃以前的代码,重头编写一个全新的浏览器,他心灰意冷,辞职离开,在旧金山买下一家酒吧,不再编程,改当一个小店主,从此退出江湖。

我知道他的故事,是因为纪录片《Code Rush》。我强烈推荐这部作品,那是1998年一个摄制组在Netscape公司整整跟拍一年的结果。你不仅可以从中了解”网景浏览器”衰落的那一段历史,还可以看到硅谷程序员的日常生活。

==================================

回到Michael Arrington的文章,我最大的收获是得知Jamie Zawinski还写过日记。

我把他的这份日记读了一遍,感触非常多。日记的名称叫做”the netscape dorm.”,直译过来就是《睡在Netscape的日子》,记录了1994年Netscape刚成立时的情景:小公司,没有产品,急需证明自己,必须赶在资金用完之前写出代码。那些日记是创业公司的真实写照,以及一个非常孤独、拼命工作的程序员的内心独白。

编程是一种非常单调枯燥的工作,长时间、全身心、独自一人地与机器打交道,人际交往和日常生活难免会受到影响。这份日记告诉我们,一个优秀程序员怎么看待这些事情:为什么要这么做?值得吗?乐趣在哪里呢?……

日记的开头,有这样一段话,一下子就打动我了。

“Time always softens the pain and makes things look like more fun than they really were.

时间总是淡化痛苦,让一切变得比实际情况更轻松。

But who said everything has to be fun?

但是谁说生活一定是轻松的?

Pain builds character. (Sometimes it builds products, too.)

痛苦造就性格。(也许还造就产品。)”

我反复看着这段话,心里只有一个愿望。如果经受的这些痛苦无法避免,那么我希望它们是值得的,最终带来想要的结果,一切皆有所偿。

下面是我翻译的他的部分日记。

=====================================

Jamie Zawinski日记(节选)

阮一峰 译

(Image credit: m.joedicke)

1994年6月26日,星期二,凌晨四点

我已经在Mosaic工作一个半月了。睡眠很少,不常回家。

今天一整天,Lou和Rob都在玩遥控汽车。这真让人恼火,因为其他所有人都忙得不可开交,他们却在那里玩耍。我走到Chouck旁边,问他”你生气吗?”他张开双臂,板着脸,说”我的火气有这么大”。我点点头,走回自己的办公桌。

十分钟后,他走过来问:”你是因为自己也生气,还是因为你想看看,我是否容易被激怒?”我说我也生气,但是可能程度比他稍稍轻一点。

大约凌晨四点,Lou收拾东西,准备离开办公室了。他跟我说,Marc把他叫进办公室,问他是不是无事可干。我心里也是这么想的,就说”是这样吗?”他说,这些天来彻底筋疲力尽,真的需要放松。我完全理解他的感受,但是我说最好在办公室以外的地方放松,而不是工作时当着其他人的面这样做。

Marc要我去写Unix客户端,配合SGI公司与Irix 5.3一起发布。这意味着巨大的工作量,时间却不到两个月。我还一点代码都没写,甚至没有把握,这个产品是否可行,任务就已经来到了我的面前。所有部件散落一地,我脑海中却还没有整体的概念。Marc可以很轻易地把这个任务强加给我,但是我不愿意冒失败的风险。这个项目的影响太大了,太多的人在等着我们出丑……

1994年6月28日,星期四,晚上十一点

昨天,我又在干活的时候睡着了。缩在办公桌底下,盖着毯子,从中午11点睡到下午1点半,2个半小时。然后突然惊醒,想起来开会要迟到了。我们在会上要讨论如何在可怕的8位空间的条件下,生成彩色图案。不过,迟到就迟到了,可以找别的时间讨论。如果你因为长时间工作、极度疲劳而迟到,大概不会有人因此指责你。

1994年8月5日,星期天,凌晨5点

我回家了。距离上一次入睡,已经39个小时了。我现在还不觉得累,正处在第二次或者第三次也许第十八次回光返照。我回家只是因为担心,如果再待在办公室,可能又要在那里睡了。我不想连续在那里熬夜,因为现在真的必须洗个澡。昨天太热了,我和Lou玩air hockey太投入,汗流浃背。

哦,我一定是累了。打开电视机,觉得MTV画面动得太快了,完全无法理解。

过去一个星期,我一直喉咙痛和咳嗽。但是,我没有采取任何措施,因为没时间。我觉得,自己纯粹靠意志力,在抵御感冒的进攻。

我上一次起床还是在星期五,大概下午三点到了公司,已经有一吨的电子邮件等着我,全部与工作有关。下午四点还有全体大会,开会前每个人都在找我。我感到自己真的被击溃压倒了。我的意思是,其实我只离开了办公室7个小时!不过,会议很振奋人心,一份OEM合同已经达成(我忘了与哪家公司),可以安装60万个客户端。不错啊,我真觉得市场部的那些人有两下子!以前我从没有这种感觉,太疯狂了。

60万个用户!我写过的所有软件的用户数字,从来没有到达过这个级别。真是骇人啊!

我的手最近伤了。我希望,不断的打字不会废掉我的手腕。如果我不能打字,我的人生就完了。我的右手一直在抖,中间两根手指的最后一个关节在疼,好像淤青得很厉害。我猜想是时候了,该去问问公司提供的医疗保险怎么用。如果医生不说”停止大量打字”,我就该笑死了。

1994年8月11日,星期四,凌晨二点

几个月来第一次,我见到了Ian。他的第一句话就是,”哇,你看上去一团糟。” 他说我有点神情恍惚、浑身痉挛。可是,我自我感觉还不错啊!昨晚,睡了一个完整的觉,其他的事情也都正常。我只是没有正常的生活,看不到任何一个与工作无关的朋友,我正在浪费自己只有一次的青春。我应该离开办公室,去做一些更好玩更积极的事情。等我的精神和肉体都衰老的时候,就做不动这些事情了。但是,现实是我守在荧光灯下,往计算机里输入一个个比特位,只有其他与我一样的怪人才会对这种事情感兴趣。我看着一张最新的电影排片表,发现一部也没有听说过。怎么会这样?我真是吓坏了。

我在药店里买了一些腕部护套,这几天都戴着它们打字。我觉得没什么用,我的中指疼得不算严重,但食指的情况很差。这份工作摧垮了我的身体,这是不值得的。

1994年8月26日,星期五,凌晨一点

我重读了过去几个月的日记,很多部分根本连不起来!完全是只言片语,一个个不连贯的词,各种随机的超现实意向,我自己也理解不了,只记得打字时的情景。这是不是我在梦里写下的?我希望,人际交往之中,我留给别人的不是这种印象。我很想知道,我的代码看上去什么样!不过还好,它们至少还能运行。

晚上9:30,我离开办公室,因为Eric和Susan打电话约我一起看电影。我已经工作了31个小时,其中零零星星合计睡了4个小时。我还在等编译结果出来,但是他们已经替我买了10点半的电影票,我还怎么拒绝呢?我说:”我太累了,但是你们是对的,我需要看场电影。”

1994年8月28日,星期天

Mozilla已经有点像一个产品了,也许我们最终可以活下来。今天我到办公室的时候,大家都坐着看影碟Repo Man。我完全认同他们,花掉几个小时看电影,我没有产生任何负罪感。

1994年10月12日,星期三,上午十一点

今天,我们将发布Mozilla 0.9。我刚刚结束在6种不同的Unix平台上的编译。上午9点,我们发现了一些灾难性的bug,然后立刻修正。现在我正在重新编译所有的二进制文件。它们应该在一个半小时后完成,然后再过不到一个小时,出现在我们的FTP上。

毫无疑问,这太疯狂了。

下午六点,所有人都有一种缓期执行的感觉,因为发布时间推迟到了今天午夜。大家开始测试我在下午1:50分新编译出来的文件。这时我开始去睡觉。

午夜,我们终于把这该死的程序放上了FTP,200万人立刻尝试下载,这时我们甚至还没发布软件上线的消息。我们终于完成了,我想从此所有人都可以幸福生活了。

我们坐在会议室里,将显示器与一台大电视机连在一起。在黑暗里,我们看着FTP的下载日志快速向下滚动。jg即兴写了一个脚本,每当一次下载成功,电脑就发出一声加农炮的声音。我们听着这声音,坐在黑暗里庆祝。

接着,我就回家了。我想如果现在就走,应该不至于在路上因过度疲劳而发生车祸,否则今晚我又只能蜷缩在办公桌下睡觉了。

(完)

程序员小测试:保守派 vs 自由派

作者: 阮一峰
日期: 2016年9月 8日

最近,我在阅读 Steve Yegg 的文集《程序员的呐喊》。

ranting[ræntɪŋ] v. 夸夸其谈( rant的现在分词 ); 大叫大嚷地以…说教; 气愤地)大叫大嚷; 不停地大声抱怨;变形 复数: rantings

这是一本非常有趣的书,里面甚至包含了一个小测试(原文),区分一个程序员到底是保守派还是自由派。

下面一共有十个问题,每个问题都有 A 和 B 两个选项,请选择你的答案。

问题一:Bug 还没修复,软件能不能上线?

(A)软件发布前,应该编写完整测试,充分调试,尽量修复所有bug。

(B)不管多努力,bug 总是无法避免的,如果性质不是很严重,可以先上线,根据反馈再调试和修补。

问题二:容易出错的特性,是否应该用在程序中?

(A)很多语言的高级特性都是很容易出错和危险的,应该禁止用在代码里。没有这些特性我们一样可以进行开发,代码也会因此变得更安全。

(B)聪明的程序员有学习动力,知道怎么可以解决问题。为了避免出错,就立下一堆规矩,完全不可取。

问题三:新的语言或语法是否应该有所限制?

(A)公司里可以使用的语言数量应该受到限制,这样万一系统在半夜或是圣诞夜挂掉的时候,值班的人就不需要去临时抱佛脚学习新语法了。另外,也应该禁止改变语言原始定义的语法,比如严格限制操作符重载和元编程。

(B)程序员的学习能力是惊人的,没必要”保护”程序员远离新语法,只要有需要,他们自然能学会。

问题四:静态检查是否必要?

(A)编译器的安全检查很重要,不能进行静态检查的代码通常是不可接受的。

(B)代码应该短小精悍,静态检查工具可能会让代码变得又臭又长。

问题五:数据是否一定要有格式定义?

(A)数据必须遵循事先定义好的格式。比如,关系型数据库必须满足第三范式或UML,XML都必须有DTD,NoSQL数据库必须有单独的格式定义(标明所有允许的键,以及相应的值类型)。

(B)严格的数据定义只会妨碍灵活性,延缓开发进程。更好的策略是写一些注释,或者只定义一部分,甚至先略过它。因为在大量用户案例出现之前,没人知道数据可能会是什么样,代码先行才是正确的做法。

问题六:公共接口是否应该静态化?

(A)公共接口必须严格建模。数据绝不可以是无类型的,所有的输入输出实体都必须完整显式地定义为可以静态检查的模型。

(B)公共接口应该尽量简单,向前向后都兼容。建模时太过缜密的话,其实只是在猜测接口会怎么演化。

问题七:是否可以留有方便修改的后门?

(A)生产系统里绝不允许存在危险或有风险的后门。想要通过调试器、SSH、或任何接口,连接到工作中的生产系统,去修改运行时的代码或数据,应该是不可能的。

(B)系统的灵活性,有时能决定客户或合同是归你还是归对手。至于生产系统的安全隐患,可以通过日志、监控、审核等手段来缓解。事实证明,很多有最高权限后门和Shell 接口的大型系统,都做到了在控制风险的同时具备运行灵活性。

问题八:急需的但有安全隐患的系统,是否可以上线?

(A)假如一个组件的安全性存在任何疑虑,那它就不能发布上线,团队怎么哀求都没用。

(B)企业要保持竞争力,唯有不断有意识地去承担风险。就算不去冒险,其他系统急需这个系统,线上可能还是会出问题,既然如此那还不如冒险一试。

问题九:代码运行较慢,是否要去解决?

(A)快比慢好。没人喜欢慢的代码,所以代码的性能一定要好。从一开始,就要有性能意识,那些比较慢的语言和库都应该避免使用。

(B)不要过早优化,代码先跑起来再说。正确性比性能重要,而原型的快速迭代又比正确性更重要。只有当客户将性能列为首要问题时,再进行优化。

问题十:你最认可的语言是哪一个?

(A)C++、Java、C#、D、Go、Clojure、Ada、Ocaml、Eiffel、Clojure、Erlang、Pascal、Haskell、SML。

(B)C、Objective-C、JavaScript、Visual Basic、Lua、Scheme、Python、Common Lisp、Smalltalk/Squeak、Perl、Ruby、PHP,Bash。

结论

如果你的答案有超过一半的 A,你就属于保守派程序员。你非常重视软件安全和可靠性,厌恶风险,提倡严格管理,认为有效的规章制度是软件质量的保证。

如果你的答案有超过一半的 B,你就属于自由派程序员。你重视软件开发的灵活性,提倡给予程序员足够的自由,只要新功能顺利上线,可以接受一定的风险和瑕疵。

保守派或自由派,都没问题,都是可取的。问题是一支和谐的团队最好是由单一人群组成,要么全是自由派,要么全是保守派,免得双方不停地发生理念上的冲突。

(完)

欢迎关注我的其它发布渠道