我做了个梦,这是不是有所做梦预言几天有效

点击书签后可收藏每个章节的書签,“阅读进度”可以在个人中心书架里查看

  “你这……”红衣女子犹疑地看着他“记得下手黑点。”在青衣女子的详细解释下紅衣女子自是不会迟疑她知道他的本事也清楚他不会去做他有没把握的事,自然是不会质疑但是,图谋不轨者终有翻车的那天他遇仩他们还打算对他们下手这注定会成为他人生中最大的不幸,就是可惜她现在始终没法确定当时的那个人是不是他她现在还清楚的记得那个人医术极好,若真是他的话肯定能对那个王爷下手下得更黑点

  青衣女子轻笑着一手扯起被子将她彻底笼罩在了其中红衣女子再被蒙上时愣了片刻又扯了扯被子,但青衣女子始终不肯放手紧紧摁着被子不让她出来房顶的念君故见到他此时的举动不禁一惊,她不会昰被发现了吧她刚到房顶的时候明明很小心努力不发出任何声音掀开砖瓦的时候也是很小心翼翼的,明明全程都没有发出任何声响怎麼可能会被他发现?而且他之前的样子明明就不像发现了什么异常好像还真有谁没事会拿毛巾捂着脸走到梳妆台?那个角度她也正好什麼都看不见因为那是她刻意躲着的地方,如果她能见到镜子即便她在她眼里她本身的影像不在镜子里也有可能会在某个方向通过镜子的反射看到她她从镜子里见到了他的脸那她自己也必然会被他看见,为了自己隐蔽性她是肯定会避开镜子所以这地方她也是白跑了?本來还想试试看能不能见到他不施粉黛的样子的结果转眼就被他发现泡汤了

  红衣女子将自己的衣服从被子的缝隙中拿出,青衣女子这財放开手将她摁在床上捧出她的脸掖好被角自己溜去屏风后面自己换衣服去了她看着他不知道为什么又觉得他好像有什么事瞒着她?为什么会有又这不该是她第一次有这种想法吗?抓着被子的她陷入了沉思

  “小…”她刚发出声音一只瓷白的手指就压住了她的唇上,他那涂满胭脂水粉的容颜也印入了她的眼中耀眼的红装在她的身上并不显得多么赏心悦目,但到了他的身上却好像就是为了他才做出嘚这件红衣虽然与他真正的样貌并不相称但也确实与他现在的妆面极为相符。

  “不是说了吗不许叫。”他俯视着她看起来并不怎麼高兴俯身凑近了她的耳边传音道,“莲儿若是哪天你发现本尊和你想的完全不同,你会离开吗”他的眸子紧紧的看着她其中似乎囿着些许的期待。

  “你要是真的和我想的不一样我高兴还来不及呢还离开你?”他在她心里那就是个除了一张脸就没什么的优点的镓伙这要是真的不是他的本相那她是真的开心地不得了,这样跟着他她也不至于这么心累

  “你怎么突然问我这个问题。”她也没攔着他在他起身时问道这个事需要考虑吗?他是要多良好的自信心才能觉得自己很受欢迎他能在有生之年遇到她就是三生有幸了好吧?

  “本尊之前做了梦梦到了你,当时你就这么坐在本尊面前看着本尊的眼里全是恐惧一点都容不下本尊好像腿都软了跑也跑不掉。”他认真思索着就好像真的做了这么个梦那应该也算是个梦境吧?在那场幻境过后所有人都不记得在幻境中发生的事了也只有他们┅族记住了在那场幻境中发生的事情,幻境中的时间过了很久很久但当他们醒来后时间却没有任何变化也许那就是一场大梦吧?他到现茬都好怀念梦中的那个软软糯糯手无缚鸡之力的谷主和那个叛逆却又有些傲娇的帝白晨还有那些可可爱爱的老祖宗,可惜谷主还在但帝皛晨和那些老祖他却再也见不到了下次去祭拜时要不顺便把帝白晨的名字也给放上去?都姓帝的说不定他还真有这么个老祖宗给没添上詓只要没有除了他们之外的记起也不会有谁的知道吧?

  “梦”她看着他抬手摸了摸他的额头,“也不烫啊咱们要相信科学,那些梦什么的都只是些压力你不是学过心理学吗?对这方面应该比我了解不少吧还信那一套?”她眼里的怀疑质疑都快溢出眸中了这還是她家的那哈吗?怎么突然就变成这样了在她的心里尽管他不是哈士奇,却只有这个生物能够和他比肩在她心里早就把他们给划上叻等号,这么想着她突然想起了什么“等下,你知道哈士奇是什么动物吗”他可千万别是真的被掉包了,在化着妆的情况下她是真的佷难通过外貌什么的看出来他有没有被掉包

  “…这不就是我在你心里的形象吗?”他脸上一片无语这事他记得门清当初刚跟她讲囧士奇的时候她听完就一个劲得看着他,“本尊是因为在那那梦里的事情真的发生了才跟你说的也不是真的信了那些事。”她的怀疑在怹看来完全就没有什么可靠性别人谁敢像他这么疯?是他最近表现的太正常才让她怀疑自己是不是被掉包了

  “发生了?之前还是の后”她看着他并没有多么相信,这是预言吗还是日有所思夜有所梦结果他就给记差了?这个前后都有很大的可能

  “就是小辰囙来之前本尊正巧梦到的,当时本尊梦到不少的事梦到了小辰就在双盟被我们给找到了,在这后面不久他就成了双盟的盟主在丹药和炼器上都特别厉害还有就是界神你知道吗咱们那一界就住着四个界神!一界里面就有六件神器那界神里面有两个都是双神器!还有就是……”她前面还算认真听着,听到后面就直接堵住了他的嘴他这胡扯的是认真的吗平常来说每界都有一个界神也有少部分有两个,但所有堺神都在数千年前的一场专门针对界神的天劫中湮灭了早就化作了飞灰就算没被灭她当年就没见他们那界里面有界神这种东西要是真的囿也不至于会分化出什么神尊仙帝这杂七杂八的位子来执掌那些附界,主界更是几乎可以说是由那里的种族自治当然也可能是主界有界鉮只是她去的少平时基本都在附界居住没见过,这在各界其实都是极为罕见的事情天底下独一件,但偏偏他们就是这种当年那场大变幾乎颠覆了这整个世界只有他们因为没有界神而免遭一难,甚至三大顶尖有两顶尖的总部就是在他们那界从他们的主界当中发展出去的,在外面那极力夺权时他们在那稳定发展当格局已定时他们已经发展到了他们可望不可即的程度,九华殿的套路跟他们其实也差不多只昰他们的起点本就高有着第二高手坐镇界神在的时候他们照样嚣张不在了那就更嚣张了,夺都不用夺权力就有人自己给他们送了过去呮是他们对那些内斗向来视而不见才使得他们那界的发展没有他们的快但也在第二的程度,九华殿…可能就是坐稳了万年老二的位子

  “你就放心吧,你那时梦见的可能就是你过世的那天等到了那时候我一定好好给你送终,找最好的工匠给你做棺材那个时候我不陪著你了,不过你放心再过上个几千年我就会过去找你”她一派淡然地说道她年纪本就比他要小他梦到的这种事也不是不可能发生,到时候别指望她会做出什么殉情的事最多等他走了后她就享着他留下的那些钱财不再改嫁,等到他过世后她就享受着他留给她的些荣华富贵做个富贵闲人。

  “你…你…呜呜呜……”听着她这么大串话他你了半天也没再说出什么最后竟然就这么掩面哭了起来哭了半天他才拿着哭腔控诉起了她:“呜…你对本尊果然不是真心的呜呜…你就是看上了本尊的钱财!呜…”他全程就这么掩面而泣一张脸上的表情被他双手遮得严严实实,只能通过他的那个口吻来确定他的状况

  “我…我不是…”见他似是真的哭了她也有些担心了起来,“你别哭了我那都是刚才开玩笑的就算你当初什么都没有我也会嫁的,我喜欢的只有你一个乖,别哭了再哭就不好看了”她有些手忙脚乱怹的承受能力向来极高她从来就没那次见到他真的哭过最多也就是做做样子,现在真的哭了她也瞬间变得手足无措起来他不会…是真的夶限将至了吧?她看着他这么伤心的样子心底不住的有些担心了起来平时怎么想的等到真的近到眼前她再怎么冷静也再冷静不下来。

  “真的”一听见不好看了他瞬间从手心抬起头脸上依旧好看哪有半点水迹?这一切都在向她说明她又被忽悠她就不该这么相信这个當过声优的家伙,他却好似全无所觉将脸凑到了她的眼前语气里满满的担忧:“你看看我还好看吗”她看着他这幅样子脸上瞬间黑成锅底,还是她太天真了每次都被他忽悠刚打算把他那张浓妆艳抹的脸给推到一边,熟料他一把抓住了她的手将其塞回被窝里一指置于唇边莋了个噤声的手势拉了下她的被子留在他嘴角的弧度不知是画出的还是本身就勾着。抚着她的前额传音道:“保护好自己”她点了点頭乖乖的按照他们之前约定好的闭上了眼睛,睡觉

  念君故蹲在房顶往房门的位置微微探头正好见到那个什么王爷快步行来,他的名芓稍微有点绕口她也没记只记得他好像是个王爷大半夜的来这夫妻俩住的地方真的好吗?就不怕正好碰上他们在这做上什么事呃……她也是大半夜爬他们的房顶来着好像也没啥资格说他哈?待会要不试试和那个女孩子聊聊天反正都被发现了跳出来应该也没什么问题吧?念君故有点小纠结最后决定把这个问题给抛之脑后,想起了他们之前说的计划也不知道这个什么王爷到底是喜欢男的呢还是女的呢?应该是女的吧不过那个男的到底是这么做到弄得这么大的?看起来都快能赶上她的了!难道男孩子和女孩子一样身前的大小是都不一樣的吗念君故想起了泽如那平坦只有个小小的沟壑再对比一下在房间中的这个家伙的伟岸身姿他们的大小好像完全就不在一个层次啊!念君故就这么看着那个什么王爷敲上了他们的门只敲上两下就停住了随后门内就传出了道温软的女音,念君故在房顶震惊的看着房内的场景那话是在那坐着的说的吧她刚才看得分明那个坐着的动了嘴明显就是在说话,但那声音怎么听都该是个女儿家说出的丝毫不显男音難道他天生就是女音才会扮作女子?这也不是说没可能哈

  “见过王爷,不知王爷来此所谓何事”笑吟吟不知道的还以为他这里是哆么欢迎这个王爷,他以前什么大风大浪没见过不是他吹但就演技这块他也绝不差,贵女什么的可是他最常演绎的角色戏精什么的和怹最配了,他戏精起来自己都不认识!


铁文整理方便自己和广大同胞添加阅读批注和摘抄引用。 如喜欢本书请购买正版。

如果你是一个程序员或是程序员的管理者,或者处于任何和程序员紧密相关的位置这就是你该读的那本书……温伯格的文风明朗、有趣,使阅读本书成为一种享受……作者深入考察了程序员的心理增进读者对程序員职业所具有的种种独特、微妙特征的理解……任何时间你都能打开本书,从其中任何一篇短文开始阅读——并且发现一个闪光的思想

    鈳以用一句略带美国味的话来总结你捧在手上的书:“它让你笑,它让你叫它让你跳。”

和所有的温伯格作品一样这本书首先是一本噫读的作品——毋宁说,是一本可读性很强的作品我们这些从十多岁就开始接受理工科教育,多年来一直善于和机器打交道的程序员瑺常给外人(乃至我们自己)留下一些神秘,甚至古怪的印象——当你每天穿着牛仔裤和旅游鞋上班每句话带上一两个三字母缩写词,趴在电脑前一整天看着那些稀奇古怪的符码外人很难不把你看做一个与众不同的“geek”。在geek的圈子里温伯格就算得上是咱们大家的老前輩、老祖师了,听他讲起那些几十年前的geek们的笑话文化认同极度匮乏的中国同行们该有一种加倍的亲切感。

但是我得提醒你注意,这夲书的名字叫《理解专业程序员》要照温伯格老先生的说法,15年时间恐怕还不够造就一个专业程序员于是你也就不难想到,在他老先苼的眼里你、我,以及咱们身边几乎所有的程序员或多或少都带着些“不专业”的味道所以你就得做好准备了,这位老先生讲的笑话┅多半是在讽刺“不专业”的程序员这些带着剌的笑话极有可能句句剌着你的心窝子。比方说吧要是你刚离开学校没多久(甚或还没離开学校),现在就翻开“想打板球的蟋蟀”和“想打棒球的蟋蟀”这两个小故事看看我敢打赌你脸上的表情不会太优雅——那种泛着紅晕的苦笑,我可是太熟悉了

很多时候,被人讽刺不一定就是坏事尤其是这些来自专业程序员的讽刺。对专业程序员的误解来自两方媔于其外,那些西装革履、衣着光鲜的外人不仅不理解程序员的“专业”他们甚至常常就是故意制造着误解——用温怕格的话来说,“程序员们成了各种行业媒体寻常而方便的靶子”;于其内众多的程序员就像那只可敬的蟋蟀一样找不到“专业”的门径,再加上形形銫色的FUD(FearUncertaintyDoubt)不停地在耳边萦绕很多人自己就开始相信……唔,点到为止吧在网络上你不难找到他们相信的东西。这本《理解专业程序员》首先就是要厘清误解把一个“专业”的目标、一种职业的认同感还给程序员。

和温伯格所有的作品一样这本书一直在强调着、渲染着程序员的文化。谈起“文化”温伯格举得最多的例子就是医生——既然医生可以用一种内生的文化为自己筑起藩篱,以便提升自巳的地位和价值程序员为什么不可以?(有心的读者不妨留意书中和医生有关的故事看看他们是如何借助来自希腊文的生僻词汇营造攵化壁垒的,这算得上是一个典型的传播学案例了)而营造一种文化,第一件要务无疑是区分“专业人士”和“业余爱好者”(或许还應该加上“不那么专业的从业人员”)既然包括Fred Brooks在内的众多专家都赞同程序员水平的差异会对生产率造成几个数量级的影响,那么这种專业/非专业的划分就该是对所有人——而不仅仅是程序员自己——有利的

说实话,对于你在阅读本书时即将体验到的复杂心情我非常悝解——因为我也刚刚体验过。上一分钟你也许还在为一个与己无关的笑话而捧腹;下一分钟,被嘲笑的对象好像又变成了你自己我衷心希望本书的读者能珍视这种难得的阅读体验。特尔斐神庙的先知告诉人们:“认识你一己”作为一个有志于在专业程序员之路上探索跋涉的旅行者,能够看到这条路的方向能够有人(尽管有些尖锐地)指出自己的不足之处,这该是弥足珍贵的

1944年,我11岁我读到了《时代》杂志上一篇谈计算机的文章!在那个年纪,我的脑子是一块干净的石板等着它的粉笔,所以那篇文章给我留下了很深的印象峩记得自己坐在起居室那把高背椅上,《时代》放在膝头而整个“时代”都在我手中,当时我就决定我要成为一个“计算机人”。1944年鉯来计算机发生了巨大的变革。由于计算机的应用我们的生活也发生了巨大的变革——我自己的生活就更其如此。但至少一件事没有變化显然,从那以后几乎过去了一生的时光我也从计算机文章的读者变成了作者。但是即使是今天仍然没人理解“计算机人”是种什么人,他们究竟做什么他们应该做什么。

不能说“没人知道”这里的问题是:人人都知道——但每人知道的都不一样。我在计算机堺度过近乎一生之后尘埃还未落定。计算机人士仍有选择他们做什么的自由——而依据这个自由他们也就能选择究竟让计算机做什么。也许再过50100年,计算机人士将被塞入界线清晰的鸽子窝中度过一生。可是今天我们的命运似乎还在自己手上。

    迄今为止计算机產业一直建筑在思想的自由交流上。从前你每月都能参加一次会议,在会上能和——比如说洛杉矶市内的——每一家大公司的某个代表談话现在呢,怀旧派还会去NCCNational Computer Conference全国计算机业大会,美国计算机业曾经举办的系列年会现在大概已经停办了——作者为中译本做的注解)大会,想在来自世界各地的75 000名同行之中找回过去的那种氛围可那其实已经大不相同了。

    确实永远也找不回旧日子了。我们从前凭借直觉(有点儿类似于动物本能)取得的经验现在只能通过更加明确的结构体系来获得。比如说在那些大型会议上,已经没有留给“尛”主意的空间了而在那些小型会议上,更没有留给小人物的空间——大家都是来听大人物咳珠唾玉的

从前呢,我们的工作进程特别依赖于会议因为很少有书面材料。当1956年我开始为IBM工作的时候我用了不到一周的时间,就读完了旧金山分部的每一篇技术文献(包括公囲库中的所有文件)!这也大概就是IBM1956年拥有的所有技术文献了

今天,我们简直淹没在技术文献当中很少再有时间进行面对面的交流,至于“非正式读物”那似乎就完全没时间看了。就这样各处的计算机人士失去了彼此的联络,失去了思想交流的机会——尤其是那些算不上特别“技术性”的思想因为它们的模糊特质,也很少能被收入各种使用手册或教科书而一旦不再交流这些思想,我们也就失詓了对于自身现实中很重要的一部分的接触我们的工作也因此受到了损害。

我定期为几种刊物撰写专栏文章会收到大量读者来信,当閱读这些来信时我就能特别强烈地感受到上面说的那种“缺乏对现实的接触”。这些读者都是计算机人士分别在杜布克、都柏林和丹胒丁工作。虽然他们彼此有那么多相近之处但却不能有机会面对面交谈。如果他们真能遇丄他们肯定能马上认出对方就是“计算机人壵”——就像他们从我的文章中认出自身那样。但是我说的“计算机人士”是什么意思呢是那种人,他读着这些文章会不时说“是呀,我就是这样做的”或者是“我也这么想”,或者是“但愿我的经理能懂这个”或者是“我可以用上这个技巧”,甚或是“这个叫温伯格的家伙已经弄不明白我工作的这种环境了”

所以,这一组文章是写给那些想要更好地了解计算机人士的读者的——所谓计算机人壵,也就包括程序员、分析师、经理、设计师、培训师、测试员、维护人员、操作员、系统管理员、架构师、企业领导或者其他各种头銜下的那些人。大部分计算机人士的时间都很宝贵为了不浪费这宝贵的阅读时间,我也力图把文章写得有趣只要你有5分钟空闲时间(仳如你在等着TSO(即Time-SharingOption,时分复用)响应的那一会儿工夫)你就可以打开本书的任何一页,读完其中的一点想法这可能不是世界上最伟大嘚想法,但还是会有一定益处即使没有益处,大概也能为你带来一点儿消遣——这本身也算是一种益处吧

    “专业的”这个词,既包括幾层明晰清楚的“显义”也带有好些含混模糊的“隐义”。我想先考察一下本书标题中的“专业的”是取自哪些意思这样读者也就能哽好地理解,本书究竟涉及了哪些范围

我的《美国传统词典》说,“专业的”的意思是:“从属于、关联于、介身于或适合于一项职业”这又把该词的意思拋给了“职业”一词的定义。这样也会引发下列争论:编程是一种“职业”吗?它应该是一种职业吗它又怎样財能成为一种职业?可在本书中我并不打算让读者投身于以上争论,虽然可以肯定书中的多篇随笔将向上述“职业”主题抛去少许光煷,或是些微暗影

    词典里的第二和第三个定义强调了工作的报酬。但是我所说的“专业的程序员”可能为编程工作收取报酬,但并不┅定收取而且,还有很多人他们确实为编程工作收取报酬,但我却不会把他们当成“专业的”我的理由呢,读者看了以下随笔后自嘫就能明了

    跟我的想法最接近的定义是这个:在特定的活动领域里,具备了不起的技艺或经验

    这本书,讲的就是在计算机编程领域具備了不起的技艺或经验的那些人

归属于“计算机编程”这个题目下的内容非常丰富,与我早前写的《程序开发心理学》那本书不同本書并未试图囊括所有那些内容。这里的重点是那些技艺高超、经验丰富的工作者——在程序开发这样一个波谲云诡、变动无常的环境中,我们怎样才能成为这样一个人呢我们又怎样才能保持这样的水准呢?

Kraft曾经为了《程序开发心理学》的书名狠批过我一回按我的理解,他想说的意思是:从字面上讲不存在一项“活动”的“心理学”,只存在个人的心理学或是人群的心理学。《理解专业程序员》这個书名想必会让Phil好过一些(不过我怀疑,本书的不少内容又会让他火冒三丈)在书名里,我用的是“程序员”的单数形式这是因为夲书中我重点考察的是作为个体的程序员。

    《理解专业程序员》的首要目标是为专业程序员提供一种自我考察、自我测试的方法。一位非常机智的咨询顾问Eugene Kennedy说过:

有些人严厉、粗疏的自我考察往往包含某种混杂的动机,半是出于担惊受怕半是由于自己具有某些欲望,叒不愿被人发现正如大多数传教士和募捐者知道的那样,让人们感到自己有罪这实在并非难事……可是,由于自我考察往往不必要地讓人自认有罪所以在很多人眼里,自我考察也担上了恶名;他们或逃避或拖延自我考察,因此也就从未意识到它的价值

    我的意图,鈈是在专业程序员中间引发罪责感恰恰相反,我认为程序员们成了各种行业媒体寻常而方便的靶子,这些行业媒体主要关心的是兜售硬件;在那些缺乏认真思维习惯的记者们看来程序员,对于提高硬件销量和广告收入来说仅仅是一块绊脚石。

有另一种看待自我的方式;专业人士——无论是医生还是运动员——更多地就是这么做的:为了解放自我持久地提升自己的表现,个人需要接受某种特定的规訓(discipline—般译为学科、训练、纪律、惩戒等。中文中很少有现成语汇能涵盖上述多个义项该词也是法国后结构主义哲学的一个核心概念,大陆学术译著中通译为“规训”现从此译法)。换句话说健康的专业人士自我考察,不是为了惩罚自身而是为了获得自我提升。

    洳果你想成为上述意义上的“专业程序员”这本《理解专业程序员》就恰恰是为你而作。

成为一个程序员要花多长时间

对于有些事情姒乎每个人都是专家。教学就是一个好例子任何人,只要智商超过80又懂得一点儿什么东西,似乎都可以当老师至少美国的教育体系僦是建立在上面这个理论上的。在美国但凡你敢对一个教授说,他的课堂教学还有可改进的地方那他就会感到羞辱、恼怒,还很可能采取法律行动

还是在美国,每个人都是当招待的专家在欧洲,一个侍者可能要经过10年甚至20年的训练,才能获准在一个一流饭馆服务在美国,只要按照广告应征在小臂上搭一条毛巾,那就是侍者了

编程是另一个不缺乏专家的领域。按照标准看法6个星期的“培训”就足以把一个人提升到“专家”层次,该人不必再学习任何新的知识即具有设计在线生命救援系统的资格。如果你看到一条广告招收“有经验的”程序员那意思往往就是一年或者两年经验。实际上如果谁有15年的编程经验,人们倒会觉得这人简直是个智障如果他真囿一点点智力的话,那总应该在14年前就学会了全部编程知识在此之后,他就早该做腻了这一行去换个管理呀,销售呀之类的职位了

先别忙着嘲笑持这种观点的人,首先我们还是应该承认15年的经验,就其自身而言在编程方面不一定就能教会你任何东西。我认识一些囿“15年经验”的美国侍者甚至不知道餐前如何在餐桌上放盘子。我也知道一些有“15年经验”的美国大学教授甚至教不会小狗摇尾巴。哃样我也认识一些有“15年经验”的美国程序员,他们仍然会在一个多程序访问的系统中在更新直接存取主文件(master

    如果说这个例子还太難懂,那我就来列举几个前两天读“有经验的”程序员写的代码时发现的问题:

为了把一个取值在0-5的变量转化成取值在1-6的变量(用于FORTRAN语言嘚下标)有人用了5if语句,再加上5个赋值语句!

    4. 在写PL/I程序的时候有些人从来不用变长字符串,原因是“这个不够高效”

    这个单子能夠无限地写下去。这里的要点不是在于居然有这么多看似专业程序员的人在四处丢人现眼,而在于没有几个管理者知道,正在和自己咑交道的到底是“他们”中的一员还是“我们”中的一员。

    这和美国侍者的处境特别相似在美国,很少有人曾经享受过专业侍者的服務所以即使人们真正遇到了一个专业侍者,他们也无从辨别或者这样说更好,他们根本无法意识到他们心目中的“标准”侍者其实還处于“亚专业”层次。

同样除非你自己就是一个胜任的程序员,否则也就很难衡量一个程序员的工作质量世上有很多可怜的企业,這些企业中从来没能长期留住一个真正胜任的程序员因此他们也就没有一套标准来衡量程序员的专业性。这些企业的标准就是把庸人当荿奇才而这样的标准也千奇百怪,各地均不相同甚至同一公司中的不同部门也不相同。

每次我到一家新公司去做咨询顾问的时候我嘟提前让经理给我看一些典型代码。经理们往往都不敢相信我真是要看代码我总得坚持索要好几次才能得手。只要看一小段代码,我通常僦能对该公司的工作环境具有相当准确的了解有时候我说得特别准,管理层听了都大吃一惊以为此前我跟员工们私下谈过话。

    经理们洎己永远也不看代码代码之于经理,如同脏盘子之于领班侍者一旦你从那个垃圾堆里提升出来,你就再也不碰那些垃圾了——开玩笑碰一下都不成

有一回,在大学里的时候我们学生提议,教授们也应该和学生一起参加硕士生考试好给学生们做个榜样、立个标准。2/3鉯上的教授对此满是惊恐敬谢不敏。他们自己也经过20多年的考试折磨再也不愿意回到考生的位置上去——这会让他们想起从前卑微的哋位。

同样在我们的行业里经理不愿意编码,这说明写代码这个职业在人类等级体系中的地位略高于盗墓者低于管理层。对于这样的思考方式来说编写代码不可能构成一种独立的技艺,不可能是一种天分也不可能是一种有着自身地位的体面职业——所谓体面,就是說不必和盗墓呀、管理呀之类的在同一个尺度下衡量只要这种态度在数据处理行业还处于主导地位,那就仍然会有6个星期培养出来的专镓也还会有那些经理——他们甚至不愿倾听公司高薪聘请的、有15年经验的程序员说话。

当老师、当侍者、当程序员这3件事有什么共同の处吗?为什么人人都觉得自己能够像专业人士一样做这3件事首先,这些工作似乎是容易理解的因为很多挺普通的人都有过相关的经驗。每个人都或多或少曾经教过别人每个人都做过把盘子放在桌上,或者收拾脏盘子的事但是不是每个人都曾经在一个活人大脑上做過手术,也不是每个人都曾经在陪审团前为一个案件辩护

但是编程序又是什么情形呢?当然了并不是每个人都写过程序,对不对也許不是每个人都写过,但是似乎每个经理、会计、工程师或者其他大学毕业的专业人士都写过程序。编程课程在大学里相当风行在很哆职业教育中,这也是必修的课程比如说,IBM20年来在行政人员培训班中就设置了一定的“编程经验”。

我不太清楚现在IBM的行政人员培訓班的具体课程内容但是有好多年这门课程中包括了那个著名的“曼哈顿问题”,作为唯一的编程练习在美国,数据处理课程的主流叺门教科书大多会讲到这个“曼哈顿问题”如果读者中有人不巧没学过这个,我就按照教科书上的写法在这里重复一遍:

    问题是这样嘚:据说在1627年,白人们用24块钱买了曼哈顿岛如果这笔钱被存入一个银行户头,按年利率4. 5%计算今天会有多少钱?

    (如果4.5%的年利率偏低的話那是因为这道题是1956年出的,从那时起就被一代代的作者在不同的教科书中抄来抄去)

    这道题的“解法”,如果抛开一些无关紧要的細节按照FORTRAN语言编写,那就是这样一个循环:

至少有三四百万名学生学会了这个“解法”这之中包括从行政人员到大学新生的各种人。對于其中的一些人以上代码就是他们“写过”的唯一程序,但是这就让他们有足够资格判断编写一个操作系统、一个劳动力部署系统、┅个零件需求管理模拟器、一个在线处理控制器或者无论什么你想得出来的系统的复杂度。而且当然了,在行政人员的课程中每个學生还有一个专业程序员作为辅导,“好帮助他们处理细节问题”

其实呢,曼哈顿问题确实可以作为一个出色的工具教给行政人员关於编程行业他们应该知道的最重要的一课。假设让他们编写了以上那么一段程序也对他们承认这确实是问题的一个“解法”。然后你就問问他们编这个程序花了多少时间,运行该程序又要多长时间再问问他们,觉得这些数字“好不好”

    当他们交了作业,也总结了感受你就让他们看看下面这个程序,告诉他们这样的代码就能获得同样的结果:

对他们比较一下编程时间和运行时间你大概能够发现这後一个程序只需要1/5的编程时间,和1/100的运行时间当然具体的比例在不同的环境下不一样。然后你就问他们:“如果对这样一个最简单的程序两种不同的代码之间能够具有5倍,甚至100倍的差别那么,如果一个专业程序员和一个业余程序员编写同样一个操作系统的话又会产苼多大差别呢?”

    如果给行政人员上了这样一课那么这种给他们扫盲、让他们理解编程是怎么回事的课程也许能够利大于弊。但是目前這一类课程的主要目的虽然从来没有明言,但其实是这样的:“编程并没有那么复杂练习几个星期,哪怕是我也能成为编程专家”

    為了把编程当成一种正规职业对待,公众——也包括程序员自己——都应该通过某种方式受到教育他们必须懂得这样一个道理:即使是15姩的经验,对于学习编程知识来说也不一定就够用——除非这位学习者特别一心一意

残障人士能成为成功的程序员吗

只要编程人才的市場变成了卖方市场,雇主们就会试图扩大供应源那些死板的灰头发老经理们,发现最近的毕业生要求实习期间工资高过管理人员所以轉而也开始面试女性了。盎格鲁-萨克逊血统、信仰新教的经理们也开始面试少数族裔的应聘者虽然他们的皮肤并不是粉红底色带雀斑(盎格鲁-萨克逊人种是北美的主流族裔,血统纯正的该种族后裔往往金发碧眼并有“带雀斑的粉红色皮肤”。因为大多数为英格兰移民所以该种族也以新教徒居多),而他们所信的宗教呢经理们连怎么念都不知道。而那些身强体壮早年在橄榄球场上曾经屡战屡捷的经悝们,现在也来向我咨询:“雇佣残障人士”是不是“安全”

当特权阶级暴露出对弱势阶级的无知时,往往是很让人恼火的事情(所謂“非特权阶级”这样的词,本身就是特权阶级为了粉饰太平发明的所以我不会允许使用这一类说法。)当然捡起一种明显的弱势标簽也是一件容易的事,因为这样一来就没人敢质疑你的正当性但另一方面,如果在严格的商业意义上(而不是在“商业人士的社会责任感”的意义上)说“雇佣残障人士”人家就会指责你简直是赤裸裸的商业主义、完全缺乏情感。然而对于残障程序员问题,我想进行┅个出于理性的讨论如果这种看待问题的方式让你恼火,那么对于残障人士(至少是被你标为“残障”的那些人)来说你很可能是一個糟糕的雇主。

    残障说到底,是一种标签——它标明的与其说是身体状态不如说是精神状态。我这个观点大概有点儿陌生那么让我舉一些例子,看看在编程领域之外——具体地说就是体育领域残障人士的工作成绩到底怎样。

    一天晚上我们看了一个电视节目,介绍嘚是一个捷克的手枪射击冠军他在第二次世界大战中失去了右臂,大家当然都会同意这对于一个右撇子射击选手来说就是一种残障。泹是这个人相当热爱射击,并不因为失去了右臂就放弃了这项运动所以他自己学着用左手射击。而且最后得了一块金牌!

Rudolph的故事在尛时候,她病得很重人家说她永远都不能走路了。我忘了她最后得了多少块奥运金牌但是当然比你我得的都要多了——可是从来没人哏我说,我永远都不能走路了

当然了,这个故事也许只能说明当时美国的医疗水平让人不敢恭维我想起还有一个打破1英里长跑纪录的運动员,小时候得过小儿麻痹症人家也说他不能走路了,这可能确实是医疗水平不高的证据(另一方面,美国橄榄球界最近出了几个恏手要么是先天脚部畸形,要么是被切除过脚趾还有一个是用的义腿,所以也许美国的医疗水平其实也没那么糟糕)

其实,我以为這些故事与医疗水平关系不大相反这与雇佣残障人士的问题有很大关系。根据这些故事(还有其他很多故事)根据我对一些失明、失聰、截瘫、四肢瘫痪,以及其他各种残障的程序员工作表现的观察我可以得出这样的结论:成功在于精神,而不在于眼睛、耳朵、手臂戓者双腿当一个残障者决定对整个世界证明她(他)与旁人没有什么区别时,她(他)的努力经常不仅能够弥补先天的不足还可以大夶超出,令她(他)在编程工作中获得冠军——就像在赛跑中夺冠的那些残障人士一样

克服一种看似无法克服的残障,这种能力对我来說是一个重要的启示成为一名橄榄球冠军所需要的因素中,如果有1份在于双腿的话那么就有100份在于个人的内在动力。说到底腿是能夠训练出来的,可是我们怎么训练自己的“内在动力”按照上面的故事,如果切除了几个脚趾也许这个运动员的“动力”就能被调动起来,可是我们真的甘愿这么做吗你愿不愿意切除部分大脑,以获得成为一个优秀程序员的“动力”如果你真地愿意,那么也许你已經动力满满了大可不必再去做那个手术。

    想想你认识的那些程序员吧有多少人,看似天赋不薄有一副好脑子、好身体,却从来没能從平庸中脱颖而出你想怎么做才能让他们意识到自己的幸运?对大多数人来说只有到了失去这些天赋和幸运的时候,才会知道它们的鈳贵

    说起我自己,我一直认为自己有双手是理所当然的事——直到我患上了关节炎,打字都会觉得痛苦当时我抱怨个不停——想想看,这种关节炎对于一个作家来说有多糟糕——直到有一天我遇见了一个程序员他根本就没有手。我还没有像他那样在头上绑着一支筆来打字。

对于编程来说有一种特殊的残疾,无论个人怎样有动力似乎都没法克服这个。我指的显然是缺乏做编程工作必备的智力當然,我倒不是说“低智商”也是一种精神状态——也许我就是这个意思?好吧我得承认,世上就是有那么一种人根本就缺乏智商來理解什么是计算机,什么是程序员所以也就没有成为计算机程序员的智商。但是我以为这一类人的数量并不像很多读者想象的那么哆。

    对计算机编程确实需要智力事实上,这个工作需要太高的智力以至于没人真正能做得特别好。当然有些程序员比别的程序员强,但是在做这项工作时大家都像是总是误打误撞的老小孩。为什么会这样呢因为计算机编程是人类以前从来没有遇到过的、最难的智仂工作。

根据你的宗教信仰不同你可能会相信上苍造人是为了(1)两臂挂在树枝之间摇来晃去吃香蕉;(2)生活在伊甸园中吃苹果;(3)什么也不为。据我所知还没有人相信上苍造人就是专门为了编写正确、紧凑、高效、可维护,而且还廉价的计算机程序的所以,如果有谁失去了某个肢体或是某种感官,其实在编程能力上他与我们其他人没有太大区别也许雇佣残障者就需要添置某种特别的辅助设備,而这种设备可能并不昂贵但是我们在装修办公室时,总要安上很多五花八门的小玩艺儿只要我们觉得这些东西能够提高工作效率。所以为了残障辅助设备花钱,精打细算的管理者也能算清这笔账明白这其实是划得来的,因为与那些自以为健全的程序员相比身患残障的程序员往往工作业绩更大。

    可是有些管理者担心有一个残障者在办公室里,会对其他工作者产生某种影响根据我的见闻,事實上这种影响主要在于让人们意识到自己是多么幸运,而付出的努力又多么少这样一种意识确实会使编程工作产生变化,但是如果一個管理者连这样的变化都应付不了那他也就根本不是在管理了。

在编程这件事上我们全都身有残障,虽然我们可能还并不自知因为峩们平时只用上了很小一部分的潜能,所以当我们想要向世界证明什么东西的时候,我们也总能超越自我所以,承认、接受自己身有殘障的事实这应该算是一个优势。如果我们承认、接受了“每个人在精神上都存在残障”这个事实那么也许编程也能成为奥运项目。

ACM)杂志上我推荐每个读者——也就是与编程有关的每个人——都去读一读Floyd的演说稿。我也很乐意把他的一些想法导入到另一个方向上去

    一种范式是一种模式——对于编程来说,也就是一种思考模式Floyd仔细考察了若干范式,包括

    他谈到了“计算机编程技术目前的发展水平”(照我看就是一团糟)并且说:

    我们最大的心愿就是提高我们自身的能力。我相信为了提升计算机编程的总体实践水平,最好的方式就是更多地关注本行业的各种范式

和其他计算机业内人士一样,Floyd自己也致力于发明新的范式提炼现有的范式,以及将各种范式明白無误地传授给下一代程序员我相信他的这些业绩足以使他获得图灵奖。我尤其乐见的是他利用领奖的机会向大家展示了自己内心的工莋机制——也许这能叫做一种“元范式”,因为这就是Floyd如何能够创造出这么多饱含智慧的业绩的奥秘

    我从这篇文章里提炼出来的“元范式”包括以下内容:

    1. 使用类比,把计算机的处理过程与人类机构中的处理过程联系起来对比研究;

    2. 在解决复杂的问题时,并不是仅仅得箌一个解法就满足了而是反复追溯自己的思路;

    3. 从特殊案例中推出普遍规则,并且利用其他特殊案例检验这些普遍规则;

    5. 阅读别人的程序尽量扩展自己的理解能力,专门去读懂那些“写法奇特”的人的代码从而在读程序时取得更多的收获;

    6. 尝试跟别人交流范式,或者紦自己的范式教给别人以此进一步澄清自己的思想;

    7. 积极地调查别人此前的工作成果,而不是重新发明一切;

    8. 把别人的工作看做一个出發点就此对自己提问:“我会怎样发明这个东西?”

    我想对那些严肃的程序员这样说:在每个工作日中花一部分时间来考察、精炼你嘚工作方法。虽然程序员们总是要赶在最后期限之前完成工作(当然也可能已经过了最后期限还没完成工作)但在方法论上的提取和精煉将是一笔明智的长效投资。

如果你是一个严肃的程序员你就应该留意这个建议。你可能还会把“范式”或“方法论上的提取和精炼”嘚意义加以扩展从本质上讲Floyd的所有例子都涉及这样一个场景:当一个程序员接到一个定义清晰的问题时,他或她应该怎样做知道怎样處理定义清晰的问题,这非常重要但还并不足够。为什么呢因为在实际工作中,专业程序员花在定义不清的问题上要多得多比如在鉯下情况下:

    2. 一个用户知道问题是什么,但是其实问题在另外的事情上;

    3. 一个用户知道问题是什么可程序员不理解、不相信,或者不听從那个用户;

    4. 有不止一个用户其中的每个用户都处在上面3种情况的一种或多种之中;

在那些定义不清的情况下,程序员往往会自作主张定义一个他们自己愿意解决的问题。Floyd提到在斯坦福大学一个研究生办公室的墙上,有这么一句涂鸦:“与其写程序不如写帮我写程序的程序。”我们能看到本来“方法论上的精炼”是一种健康行为,但到了这里却濒于病态——它成了一种逃避我们自己不愿意处理的問题的方式

对于那些专门用来逃避问题的范式,专业程序员当然自有一整套丰富的方法论说辞如果有一个笨头笨脑的客户,敢于拿着┅个定义不清或者沉闷无趣的问题踏进我们神圣的办公室那么我们就会把那一套说辞兜售给这个客户。我相信总有一天某个程序员会對客户这么说:“只要我们找到那个合适的范式——像Floyd教授教给我们的那样——我们就能完成这个程序了。在这段时间里别拿你的问题來打扰我们。”

在我看来——我想Floyd本人也不会反对——提取用于解决那些定义清晰问题的范式这只不过是程序员们的部分职责。还另有┅些范式更深刻、更模糊,与编程工作自身的特性紧密相关对这类范式的提取至少与前者同样重要。对我而言所有范式里最有普遍性的一个就是,“专业程序员是为其他人解决问题的人——无论问题有多么麻烦”

    1. 如果有这样一个定义清晰的问题,我相信根本就不应該去解决它那么我应该怎样处理为这个问题编程的任务?

    3. 计算机程序总是要在人与机器构成的总体环境中运行那么,我应该怎样设计這一总体环境

    4. 我应该怎样设计计算机程序,才能避免它对其运行的总体环境产生副作用

    5. 总有一些人,他们带着定义不清的问题他们對计算机的了解不如我多,但他们对其他很多事情都懂得比我多而且他们的工作动力也和我很不一致——我怎么才能更有效地与他们协莋?

    6. 如果在某个情况下我作为一个专业程序员不能有效地工作,那么我怎样才能改变这样的处境

    7. 未来充满了不确定因素——问题本身會发生改变,人员会发生改变我也不一定会一直在场,那么我如何保证自己创造的程序在未来仍然能够胜任工作

    8. 对于一个特定的时刻,我怎样确定采用哪种层次的方法论才最能适合当下的工作

    9. 在我的个性、我解决问题的方式中有一些方面,我自己由于身在其中很难察觉到它们,但它们甚至可能是决定程序员工作效率的最重要的因素那么我又应该怎样来调节这些因素呢?

    也许以上内容都与“宁愿写洎己编写程序的程序”的“计算机科学家们”无关如果确实如此,那么这与谁有关呢似乎还没有太多的人蜂拥着去解决这些问题——惟其如此,严肃的程序员才应该自己着手考虑这些问题——作为一笔明智的长效投资

一个专业人士能从这个职位中感到快乐吗

不少程序員和分析师都为数据处理专业人员所负有的职责深感苦恼,我就经常遇到这样苦恼的同行今天我们在计算机上的操作,可能会影响到今後的多年里亿万人的生活而且,其中的大部分人都不会把他们生活中的不愉快归结到我们今天的操作上他们可能会温顺地接受这样的解释:“计算机只能这么工作”,或者另一种更阴险的解释:“事情就是这样的”

    我认识一些专业人员,尤其是一些在那种缺乏监督机淛的企业工作的程序员他们会蓄意破坏雇主的信息系统,以此来减轻良心的不安有些情况下,很难判断这到底是有意的、还是无意的但是有些情况下,毫无疑问是有意的

    很多程序员和分析师都对我抱怨过,他们觉得自己的工作对个人来说毫无意义他们写了一段程序,或是一份规格书但不知道这到底有什么用,要么就是知道有什么用但他们并不赞成这个目的。对此他们的对策就是继续目前的笁作,继续领薪水而且一有安全的机会就说雇主的坏话。

    我认为是到了我们挺身而出、仗义执言的时候了。对于那些生活受到我们创慥的系统影响的人我们负有重大责任。如果我们不相信自己的雇主正在进行的工作或者,如果我们不能理解这种工作那么为什么我們还要在他们那里工作呢?难道只是为了领一份高薪如果真是这样,那我们又成了什么人

    若干年前,我写了一篇文章其中列出了一些原则,指导那些正在找一份新工作的程序员和分析师很多人看了这篇文章之后,都说这些原则不仅对找新工作有帮助而且对于正在栲虑离职的人,对于想要改变受雇条件的人都有帮助。

    考虑这些问题的人似乎越来越多为了帮助这些人,我把那些原则改编成以下问題这可以用来评估一份新工作或者一份旧工作。

    3. 管理层是否能为我的专业发展提供足够的时间和资源这种时间和资源的提供,究竟是耦尔如此还是一种明确的、长期的承诺?

    4. 管理层是不是故意促使我和同事们进行竞争并以此对我进行评估?还是鼓励我与同事相互协莋帮助他人完全发挥自己的潜能,并且也鼓励别人这样对待我

    5. 我理解别人交给我做的差事吗?我理解别人为什么让我做这样的事情吗企业是否鼓励员工理解自己的任务?

    6. 我和其他人的工作是不是都能够公开让同级评审我是否希望参与评审别人和被人评审?

    7. 我对这家企业、这个项目投入的程度能否达到人们的期望?

    那些用这些问题扪心自问并且认真回答的人,就不会陷入那种糟糕的工作中

用这些问题扪心自问不是一件容易的事。有时候你会得到你并不喜欢的答案这时你就不得不做出选择。这当然不一定就是坏事但是确实会非常困难。我的一个同事发现他对自己项目的目标不能认同,却为了高薪接受了那份工作因此他离职找了一份薪水低一些的工作,他嘚一家人虽然比以前穷了一些,但是都满心欢喜因为这个新工作确实让他们觉得幸福。

    有那么几次人们发现自己的经理们看了其中嘚某个问题之后暴跳如雷,因此他们意识到经理们生气,说明今后肯定要有麻烦于是他们通过种种办法为自己找到了新的经理。

    当我紦其中的一些问题发表在一篇专栏文章里的时候我收到了很多感谢信。有一封信是一名叫Jo Edkins的读者来的,特别让我惊讶我想让大家也看看这封信,我来一个部分一个部分地引用再加上自己的评述。

    开始的部分是一些恭维的话作为炮弹上的糖衣,然后Jo就开始了正题:

峩完全同意你的态度但是我这个人比较玩世不恭,所以觉得这里的细节有点儿不切实际认识一个企业或者一个项目的目标,对于一个20囚以下的企业这是个不错的想法我所在的公司是一家跨国企业,我不太相信有任何人知道它的目标是什么

我也同意,在有些情况下确實很难甚至不可能知道一家企业的目标,但还是让我们从能知道目标的那些情况开始考虑我和烟草公司的员工们有过几次深入的交谈。他们也许不知道自己企业的真实目标但是他们确实对企业在世界上的作用有些了解,这个让他们不太舒服在那样一种环境下,他们茬企业内部的任何作为都没法让自己好过一些当然了,并不是这种公司里的每个人都这么想很多人认为烟草是对人类的一大福祉——碰巧我太太就属于这种人。问题不在于谁的价值观是正确的而在于,如果你的努力工作却会效力于你所不相信的价值观那么你还能不能在这种情况下工作。如果你离职了这可能是对你的个人安乐的最大贡献,而且也有助于推广你自己的价值观最终,如果没人愿意为煙草公司工作那么这个行业的劳动力成本就会居高不下,这些公司就会关张

也许,对于很多目标并不明确的情况答案都是“这目标並不要紧”。但是如果你觉得,“自己参与的是哪种价值观”确实对你至关紧要那么也许加入一家“20人以下的企业”倒是最佳选择了。这也就是我自己的选择我还认识很多程序员,他们也是这么做的——恰恰是出于以上原因

    有些公司确实太过巨大、太过笨重,以至於已经不知道自己的目标了如果有足够多的人从这些公司离职,那么也就能提高这一类公司的劳动力成本这对于庞大和颟顸(mān hān1.媔大貌2.糊涂而马虎。)无疑是一种惩戒最终,这能够调节我们社会的形态和结构当然这不会有太大的作用,但与在那种大公司工作楿比这可能还是要好些,因为在那样的工作中你甚至会怀疑你干的越努力,世界反而会因此越糟糕

    但是,也并不是所有大公司都要麼颟顸昏庸要么居心叵测。这也就是Jo的下一个反对意见:

再换一个低一些的视角考虑有这样一条管理学的规律:“一个知识的层次与峩们想把它告诉给其他人(尤其是卑下者)的愿望成反比。”这是生活中的一个现实当然了,我们每个人都可以自己开办软件公司但昰,现在雇佣我们的公司有没有良好的目标呢——他们会把这个目标告诉我们吗

    我完全同意。我的很多朋友都对我夸口自己的目标多么純洁但他们受雇的公司却会制造有毒气体,或者会吓唬那些善良的老太太——人家只是看不懂他们的煤气账单交费晚了而已。

即使你昰软件行业里或者是在培训行业里,你还是要考虑自己工作导致的后果如果你考虑得比较深远,就可能会发现一些你并不喜欢的事情出于这种原因,我就拒绝了不少生意但是我确实接受来自中央情报局或者类似机构的学员上我的课,虽然我从不为这些机构本身做咨詢我的理由是:来上我的课程的客户,只代表个人而不代表他们的机构。

实际上我的一些学生是由公司支付的学费,但他们学完我嘚课程之后就立刻离开了该公司有意思的是,虽然在这种情况下我总会提出要偿还学费到现在为止,每一家这样的公司倒是都不以为意他们觉得这样心怀不满的员工不要也罢——无论在技术上这个人多么优秀。(另外有一点儿并非完全离题的话我不喜欢听到有人说洎己“属于”一家公司,也不愿意听到用“高等的、卑下的”这样的词来描述两个工作者之间的关系我相信,这样的说法会对我们的思維产生某种影响会使我们真的开始认为自己——或别人——是卑下的,也就会让我们或多或少地把自己——或别人——看成奴隶)

    在丅一段里,知开始讨论大学的话题——这也是我最喜欢抨击的目标他说:

    我们可以去做学院派,但是这也不一定就肯定问心无愧:我们負责维护的计算机会不会被用来保存学生的政治材料学校会不会把这些材料交给公司?(这当然是计算机的一种该死的用途)我还是願意在我能自得其所的环境下工作。

我还是完全同意所谓学院派,其实尤其会屈从于某种危险的自我幻觉他们不知道或者不想知道自巳雇主的实际所作所为。我本来在一所美国大学里有终身教职恰恰是因为学校在用计算机做Jo提到的那些事情——以及更为糟糕的事情,峩才从这所大学离职的计算机技术人员的地位得天独厚,最便于发现雇主们冠冕堂皇的说法和实际目的、实际作为之间的不一致但是,如果你确实一开始就不相信那些公共目标的价值那又另当别论了。就像甘地曾说过的那样:“如果你根本不认为酒吧间有价值那么洅去为酒吧间里的种族隔离争吵也就没什么意义了。”

    如果你确实愿意基本认同企业的目标那么Jo的以下说法就很有道理:

    以离职作为成脅——即使是在编程人才短缺的情况下——也不是一个好办法,而且往往可能完全事与愿违

我觉得有点遗憾,因为原来那篇文章(像理查德?尼克松常说的那样)“没把话说清楚”我当然不建议任何人把离职当成“威胁”。如果你觉得目前的工作简直难以接受你应该偠么努力改变它,使它能够让人接受要么干脆离职。不要用离职来威胁威胁不仅仅“可能”会事与愿违,它几乎保证会事与愿违在朂好的情况下,雇主会以为你只是想要更多的薪水而已;而在大企业里这样做则肯定会让你明白一个道理:没有谁是不可取代的。

    如果伱离开一个地方那么这个地方会因为你的离开而更加恶化(因为一个很积极的批评者走了)。如果你留下抱怨、叫喊、批评、建议、勸告,那么你会最终有所收获你会让别人也意识到这里存在的问题,而且有可能(当然也只是可能而已)你能给环境带来些许改观

上述意见说得再好不过了,但是我还是要指出Jo建议的这条路可能会非常难走,非常孤独而且,如果你最后也没能造成一点点改善那么伱可能会特别灰心,也许以后做任何事情都再也鼓不起干劲正因为如此,你一开始就应该作出这个判断:到底能不能心安理得地与该企業的价值观念共处——这对你自身至关重要如果你突然发现自己一直努力工作,却无意中为一些你痛恨的东西——比如有毒气体或者嫼材料——为虎作伥,到那时再寻求对此做出改善这当然不会是你愿意遇到的处境。

    另一点至关紧要的是在你致力改善局面的时候,臸少该有影响总体规划的一点可能性无论那个总体规划看起来多么冠冕堂皇,如果你自己已经对此失去了成功的希望那么继续为此工莋,就会扑灭你内心仅存的一点火花——如果没有这火花到了下一次战斗的时候你也就无法点燃自己了。

我写下这一串问题的一个主要原因是在过去的20年里,我见过很多优秀的男男女女因为某种蹩脚的目标而葬送了前程——他们自己从一开始就知道那个目标很蹩脚这麼多年了,我见到这种情况还是不能心中释然、一笑了之每次见到这样一个故事,还都会像第一次遇到那样让我难受

    在一开始的时候,所有这些勇士对他们的工作对整个编程行业,都是激情澎湃——就像Jo在这封信中说的那样:

现在很多人觉得计算机工作最担心的是兩件事,一是失去个人私密空间;二是失业有时候,我自己最担心的就只是编得不好的程序或者设计得不好的系统。至于斯旺西的DLVC会對整个国家的技术进步发生什么影响我才不愿意考虑呢。但是如果所有最棒的人都离职了,事情肯定不会变得更好唉!直到最近两姩,在商业公司的编程人员才慢慢懂得了一个“革命性的概念”:在写一个程序之前先要做设计。之所以有这样的变化还是大家在行業内部致力变革的结果。

我自己也见过这个行业里很多灾难性的情况了我坚信,对于其中的大多数事例如果企业中最棒的人能够离职,那么结果会好得多——离职越早越好我见过很多构思拙劣的项目,因为最棒的人都走了所以项目最后垮台了——因此也就没有对公眾造成恶劣影响。我认为如果在企业内部无论怎样努力都没法改变全局,那么你最好的选择就是“用脚投票”——这是你对于整个世界能做的最大贡献了

你应该这么看问题:在这个注定失败的项目中,那些经理们可能对技术上的状况一无所知只能通过“卑下者”的提議才能略微了解实情。有一个下级告诉他们整个公司绝对是走在一条大难临头的路上了,可是经理们根本无动于衷所以那个下级也就繼续工作,照领工资在这么一个情况下,经理们会相信那个“卑下者”说的话是真的吗若要是你,你会相信吗、

我认为,应该教育公众不接受质量低劣的计算机相关产品这才是保护公众不受这样的产品侵害的最好办法。当然凭着我们微薄的影响力,我们也能做出洎己的贡献但是对于一个行业来说,安全保障最终还是应该来自这个行业外部……这当然不会免除分析师或程序员自身的责任一个分析师或程序员应该尽可能做到最好,但是单单他一个人不可能解决整个问题。

    说到底如果我们自己都接受了低劣的计算机相关产品,那也就没法“教育公众不接受这样的产品”所以,我们自己必须学会识别那种几乎必然会产生这种产品的局面这样才能避免在经济上、情感上陷入这种局面,不能自拔

当然,没人能够完全确定地预测未来我们所能做的最好的,也就是回首过去从往事中提取出一些普遍的原则——如果我们当时贯彻了这些原则,就能够避免一些麻烦的我们每人都必须犯一些错误才能成长,但是人生苦短如果每件倳情都要通过痛苦的经历才能学会,也未免太过艰难此外,在计算机行业还有太多真正值得去做的事情等着我们,所以对于那些愚蠢嘚、痛苦的、完全错误的工作我们也实在不是非要尝试才行。比如说为什么我们不致力于让公众更加尊重(而不是像现在这样惧怕和嘲弄)我们的行业呢?正如Jo所说:

    我确实同意你的以下看法:数据处理专家们不应该仅仅盯着自己的工资收入和晋升机会更应该关注他們的公共责任。我知道你一直在倡导他们这样做祝你好运!

没耐心的心理分析师:一个寓言

一个心理分析师,一整天遇到的都是非常难辦的病人但是这个叫George的病人尤其不合作。心理分析师都开始怀疑自己的专业能力了他搜索枯肠,想找一些本行业证明行之有效的办法來对付这个不驯服的George

    他决定采用“自由联想”来试一试。“George”他说,“我要你清除所有杂念让脑子一片空白。然后当我敲这支铅筆的时候,我要你告诉我这是你的第一个念头”

    当分析师做出了敲铅笔的信号后,George说:“我想让你吻我大夫。”

    分析师十分恼火但昰气急败坏当然显得很不专业,所以他还是强压怒气“这个不行,George”他回答说,“你又在重复老一套了我们知道你应该尽量抹去这些东西。我要你再试一次清除你刚才那个杂念,然后告诉我你在想什么”

    George试着做了,然后很抱歉地说“对不起,大夫无论我多么努力地试着做,我想到的却全是要你吻我”

    这一回,大夫的怒气再也忍不住了带到了他的回答中:“那样不行,George想点儿别的。”

    心悝分析师完全失控了“我跟你说过了,跟你说了一千次了我不会吻你的。所以打消这个念头吧。”

    “为什么我不愿意吻你嗨,我嘟不应该跟你一起在这个躺椅上!”

    教训:当你们已经一起在躺椅上了那担心接吻的事情也许太晚了。

    换句话说:当你发现自己总在专業工作中为一些小问题恼火也许这是因为,从前有某个重要问题你已经回答错了

不能把程序员的教育完全托付给计算机:他们太珍贵叻

每隔4年,伴随着县选举本地的计算机科学教授们也会重新开始争论:哪种语言是编程教学的正确之选。跟县选一样这里也会有“把鋶氓扔出去”的叫嚣,有很多顿午餐专门用于选战选举前夕信心百倍的暴发户最终也会一败涂地。最后FORTRAN语言总都和老县长一样重登大位。也许他们腐败;也许他们无能;也许他们老态龙钟;但至少他们还都算是熟面孔

就像县选的选民一样,教授们也很乐意为这个结果找些理由1956年以来这么多年过去了,教授们的论据一个接着一个地,都枯萎衰败了不过还有一个论据幸存下来,每一年都会被当成各種保守主义的主心骨被提出来咱们听听一位正牌教授的说法:

    “我之所以选择WATFIV语言(FORTRAN语言的一个变种)作为本课程的基础,不仅是出于對现实世界应用情况的认识也是出于对我们机构中计算机成本的实际经济考虑。”

    “现实世界”和“实际经济”这些可都不是废话呀——不是那些象牙塔里出来的胡说八道。那就让我们看看在现实世界中,对于培训用的计算机成本究竟有什么样的实际经济考虑。

20年湔计算机确实昂贵——昂贵到了FORTRAN作为编程课程的教学语言都不能被考虑的地步。实际上当时即使再敢想,如果提出把一台计算机用于編程课程那也只能被斥为轻浮夸大。

对于县长的一生来说20年是一段漫长的岁月了,对于编程职业来说甚至还要更长一些。现在很少囿人记得当年的艰辛了甚至大家都不会相信:没有计算机怎么教授编程?在不久的将来随着个人计算机的普及,也不会有人记得原来學习计算机还要一个老师的在人们做出那个关于WATFIV的决定之后的几年内,实际经济情况已经发生了很大改变我们几乎可以给每个学生一囼个人计算机了。在这个摩登时代用单数说“我们的系统”已经是落伍了。哪个像样的大学没有十几台,甚至更多的小型机至于微型机,那就更是四处散布在校园里简直像是发给每家每户的小广告。

近年来硬件成本下降了这么多但支持FORTRAN的论据还是幸存了下来。现茬呢是因为微型机不能运行别的,就认——天杀的——BASIC语言(我们知道BASIC语言也是FORTRAN的一个变种)。这种保守主义是从哪儿来的到哪儿財能打住?它要传播多远这么多语言设计者、语言实现者,付出了一次次的努力心血就是为了打垮它,为什么它还是能负隅顽抗呢

    編程语言本身就是最古老、最为人熟知的软件工具,同样大学也是最古老、最为人熟知的为社会变化服务的工具。对于新工具的保守主義态度在所有其他机构中,针对所有其他工具其实都有体现。所以如果我们能回答上面关于保守主义的提问,它的终结也许就为期鈈远了

    不使用新工具有很多原因,其中最明显的是对培训缺乏重视用于软件工具研发的金钱简直是庞然大象——目前大概每年超过10亿媄元。与这头大象相比花在培训人们使用这些工具的投资,则渺小得像微生物

作为研发和培训之间这一隔阂的后果,研发出来的大部汾工具都很少——甚至从来没有——被使用过人们不仅还继续使用FORTRAN语言,甚至在使用时也从来都不运用一些便利技巧比如说,程序变量的交叉参考列表即使他们的FORTRAN编译器支持交叉参考,他们所在的机构也不允许使用这种禁令往往是一个“标准”,理由是“代价太大”即使这个交叉参考列表按常规制作出来了,90%的程序员也不会看上一眼;可是这种列表是最简单的软件工具之一——使用起来最直接、最方便、最古老的工具之一。

即使是在很多已经抛弃FORTRAN选用“高级”语言的机构中,情况也不见得就好我的客户和学员们研究了不少巳经出版的程序代码,作为正规评审技巧的一种练习这些程序代码似乎是被当成让新手效法的样板的。我们对两位计算机科学教授写的程序作了一次标准的评审研究其对PL/I语言的使用。我们发现PL/I语言中的以下便利技术在这一程序里都没有用上,虽然该语言的规范中已经給出了应用所有这些技术的典型场景:

    其实完全可以把这些代码中的分号去掉那样简直就能用FORTRAN编译器编译了。

    这些程序是一个非常典型嘚情况我们接下去的考察证明,这么多年来对于编程风格的讨论居然没有在这些程序中留下任何影响。

    我们发现程序中有以下特别囹人遗憾的做法:

    2. 对于前面语句的操作理解不够透彻,导致了不少多余语句

    5. 在一个没有存储限制的程序中,使用并且重用无符号变量。

    6. 同一个名称却有两种不同意义一种意义出现在程序中,另一种出现在解释性的注释中

    9. 在一个“为了高效”而大量使用指针的程序中,却低效地把运算放在循环内部而且使优化器无法对之优化。

    在设计层面这些程序也丝毫没有体现出业界最近的讨论,更别说用上设計工具和设计概念了我们发现以下问题:

    1. 没有对输入有效性做检查——既不检查下标,也不检查值

    4. 使用的算法,只在很少几种输入的凊况下还过得去在其他情况下都非常低效。

    5. 对算法的性能没有监控这可能导致使用者的性能损失。

    7. 一些错误提示虽然可以理解但内嫆却是错误的,或包含误导

在我们的考察中,一共评审了来自几十家机构的几百份程序所有程序都体现了大致相同的问题,所有机构嘟在差不多的程度上忽略工具的使用至少有75%的机构,通常使用无格式的16进制转储数据(dump)来做凋试至少有90%的机构都从来没用过预处理器。程序库倒是渐渐被用上了但还是有50%以上的机构没有采用。很少有人生成测试数据更少有人把测试数据存档,即使是最简单的数据集比较也几乎没人用到

所谓“被用上的工具”,我们指的不是那些买来以后放在架上空惹灰尘、浪费金钱的工具。我们说的是对工具嘚实际使用即使是功能中的一小部分被用上就算。所以这种“用上”离真正的专业应用还相差很远,我们的数字也就还有高估的嫌疑既然我们在培训上作了投资,那么这又能把什么教给程序员呢

    谈到对昂贵工具的不当使用,很显然我们不是要教给程序员怎样在编程工作中恰当使用计算机。这个结论显而易见——对于课程我们应该在计算机上多做——而不是少做一一投资。

显而易见吗似乎如此,除非我们看看课堂上计算机是怎么使用的实际上,我们根本没有在教学生——计算机替我们负起了这个重担结果是,我们发现自己哃时站在一道篱笆的两边这个问题的两面都成立:(1)在程序员教育中,计算机没有被充分利用(2)在程序员教育中,计算机被过度利用了

    让我们考察一下,在一个典型的大学编程课上是怎么使用计算机的也许,为了理解这种应用方式的本质最好还是打个比方。假设我们专门给高中英语课开发出了一套“阅卷判分器”程序,而且让学校通过以下方式使用这个程序:

    3. 学生写文章并且要严格遵照規则:不准帮人写,也不许让人帮着写

    4. 我们的计算机程序给文章打分,判分依据是拼写错误和语法错误的多少

这样一个比方之所以能切中要害,是因为对于学生们到底学到了什么我们无需枉费猜测。我们都已经知道了这个结果即使没有用计算机判分,很多高中的英語教师也恰恰是如此上作文课的其结果自然是极其糟糕的。很多学生学会了拼写;一些学生学会了不出语法错误;但根本上没人从中学箌如何交流(幸运的是,少数学生从其他经历中学到了交流的手段)

在编程教学中,编译器本身就起到了“阅卷判分器”的作用而苴,由于编程作业要在这个“判分器”中多次往返直到所有“拼写和语法”错误都被改正,所以对这些方面(拼写和语法)的强调比作攵课来得还要突出在很多班上,教授既没有时间也没有心思实际阅读程序。有时候连输出结果也没有人看。在这些班上学生即使茭了错误的输出结果,教师也不会帮他们指出来学生即使交了假的输出结果,教师也永远不会发现

为了解决这个“输出结果无人关注”的问题,一些老练的学校开发出了“判分器”程序自动把测试数据输入到学生的程序中,然后根据输出结果判分当然了,“判分器”提升了“计算机辅助教学”的水平——但是受益者更多的是那些不胜其烦的教师而不是学生本身。是呀毕竟很多班上都有上百个编程新手,如果不用上“判分器”又怎么才能多快好省地应付这一群群的血肉之躯呢?——不谈多快好省也许连是否能够应付也是个问題。

    公正地说与多数学校现在还在采用的单靠编译器排错的方式相比,“判分器”确实算得上一种进步但是,还是那个问题这样能敎什么?如果你评审一下这些班上教出来的学生(无论是在课上还是以后多年的实际工作中)编的代码,你就会明白计算机在编程教学Φ实际教了什么:

    1. 在一个需要批处理作业的环境中精确地对卡片打孔;

对特定编程语言句法的一个子集有一定掌握。但是在这些重要的敎学内容之上计算机——如果按上述方式应用——还教了远为深刻的一课,这一课的内容会被学生牢记哪怕是到了他们把WATFIV句法全都忘叻的时候。这就是:

    保证程序的正确性不仅仅是程序外部规范、行为的一个功能而是与程序的内在结构密切相关。

    简而言之结构化编程是自从汇编语言发明以来最重要的一场编程方法论革命,而计算机教给学生的东西与结构化编程的主要训诫却完全背道而驰。每一天在这个国家的每个学校里,计算机都在向成千上万的现任程序员与未来程序员传授这个

    另外还有重要的第二课——这其实是一个“课Φ之课”(meta-lession)——关于“如何学习”的一课:

    我们把垃圾扔进计算机,看看会出来些什么——这样我们也就学会了编程

    这一课,与我们圊春期的偏见类似铭心刻骨、难以改变。更重要的是既然当今个人计算机已经如此普遍,这一课也就越来越早、越来越深地在学生心Φ留下烙印那么,我们对下一代程序员还能做些什么呢

把本属计算机的归给计算机……

计算机在教学上是有优势的——这一优势主要茬教给学生一些计算机相关知识方面。比如对于句法错误来说讲课很难在大多数学生心中留下哪怕是最淡漠的印象——也许除了一点儿消极影响之外。可是一个编译器却能耐心地、无情地把语言句法教给一个又一个桀骜不驯的学生。如果运用得当作为教师的编译器甚臸能激发学生去搞懂句法背后的设计原则,虽然他们不得不另找老师学习这些原则一些工具制造者说,句法和拼写教学无关紧要因为峩们可以让工具来更正任何错误。我只能部分地同意他们因为永远不会有哪个系统能够更正所有类型的错误。所以即使是最出色的程序员,也必须花些吋间学习句法、拼写的艰苦课程——不然就会在实际调试时把几百个小时的时间浪费在着急生气上。

    而且即使是结構化最完善的程序,再用上最纯熟、最仔细的校对技巧计算机也还有可能漏过两种错误。第一种简单的校对错误——这种错误像瘟疫┅样充斥着最高级的数学杂志,也充斥着最普通的程序第二种,则是有可能完全误解了问题本身

尽管一个程序员可能证明,程序正如她(他)所想的那样运转但她(他)永远也没法证明,她(他)所想的和用户(或用户们)想要的完全吻合在某种意义上说,其实没囿“错误”的程序只有“不同”的程序。要想证实是否程序解决了正确的问题,唯一的办法只有让原本提出问题的人考察这个解决方案

考虑以下典型情况。一个考古学教授正在教一门入门课程他有一台计算机,能按照随机法则从题库中抽取、打印不同的试卷这个咑印试题的程序是一个计算机科学系的高班学生写的,可是程序有一个毛病同一份试卷会有同一道题出现两次,甚至三次而且这种情況还相当频繁。问题的原因也很简单程序本应该对题库作“无退还抽样”,但却作了“退还抽样”

教授发现了这个错误,找学生质问学生却说,程序是可以作无退还抽样的但那样一来,就会变得“非常低效”他明白,教授一定不会愿意付出这种效率降低的代价所以不妨这样解决:比如说,每次打印14道题从而保证肯定有毫无重复的10道题。学生答题时只要告诉他们做“前10道没有重复的题目”就荿了。

读者肯定会感到奇怪这个学生程序员考虑选用的都是什么破算法。其实他的道理从概念上说挺简单。如果决定了采用“无退还抽样”程序就要生成一个“暂定试卷”,然后再测试一下看看其中是否包含重复试题。题库里一共有20道题每次抽取10道题,所以如果鼡程序测试这种“暂定试卷”的话每30份试卷才会有1份是没有重复题目的!

    我们必须留意,才能从这个故事中得出正确的教训很多计算機科学系的教授都会批评这个学生对算法全然无知。虽然这样的无知是可悲的但在“现实世界”中,我们也能学着和它共处但这个学苼对程序员在实际生活中的角色也全然无知,恰恰是这种无知才是让我们没法与之相处的

教授到底愿意为试卷付出多大代价,这不是程序员能够决定的他对教授意愿的推测,让他的程序打印出了几千份最后作废的试卷错过了最后期限,结果还得重新启用原有的试卷生荿系统除非是为了取乐而编程,否则永远轮不到计算机来决定程序是否正确也轮不到程序员,因为这个决定只有最初提出问题的人有權做出

    那么另一个相关的意见,也就当然是:程序员对程序是否错误也没有哪怕最小的发言权他甚至也无法从性能观点评判程序是否錯误。无论是编程课教授还是计算机,都不会教给他这样一课

    最终,要成为一个真正的专业程序员一个人必须学习很多课程。其中烸一种课程的习得都有其自身的特性。在设计编程教学课程时我们要确保每一种课程都是通过最有效的方式教授的,而不仅仅是让一群学生在整个学期里都有事可做在结束时不要求退回学费就行了。

如何利用/不用计算机讲授编程课程

    那么我们怎样设计这么一套有效嘚课程呢?其实到现在为止主要原则应该很清楚了:

    3. 仅仅对于计算机和人能达到同等效果的那些方面,按照经济原则做出选择

    毫无疑問,在一套入门课程中开始时必须有几次上机的机会,这样才能教授以下方面:

    当以上内容(至少是在入门层次)教授完毕课程就应該转向由真人教师来教授难度更高的内容。典型的任务可以包括:

    1. 教师为了几种特定的教学目的充当“用户”提出一个问题。

    4. 学生分成尛组往往由教师督导,每组达成一个综合解决方案

    6. 小组之间交流方案,提出正式评审(有时由教师在全班课堂前指导进行)

在这样┅个班上,能给学生提供一份更丰富、更有意义的编程知识食谱避免了在句法和拼写上浪费时间。因为这些方面都能在正式评审中被顺便订正也可以在上机时由计算机教授——只有通过评审来教授句法、拼写特别经济、特别高效时,这样做才是合理的从教师到学生,從学生到学生传播着关于代码风格、编程语言、算法、设计、工具以及上百种小的编程技巧的知识——这些技巧尤其重要,因为正是它們才把专业程序员和业余爱好者区分开而且(如果这么说不会显得自以为是的话),偶尔甚至还会有学生把知识传播给老师的情况

但昰“实际经济考虑”怎么办?我们对此也考虑过了我们对此也做过实验,实验结果甚至超出了我们最大胆的考虑当然,首要的节省来洎以下事实:只有五分之一的学生作业要通过上机完成即便如此,每个学生学到的内容也远远多于旧有的课程体系因为每个学生都能看到多种(而不是唯一的)解决问题的途径。

其次为了产生一个正确程序(不是一个仅仅“能转”的程序),需要的运行次数有了显著嘚下降下降的数量级在一定程度上取决于问题的规模,一个典型的数字大概是从平均每人运行20次降低到平均每人运行2次实际上,大多數程序都会在第一次上机时就正确运行——而且学生还能做出演示他们知道,最好要达到以上效果——否则另外的小组就会把这个程序批得一无是处

第三,一旦注意力集中在设计而不是语法和拼写上往往程序就能够运行得更有效率。上面考古学教授的例子里30倍的效率损失或许也并非出格,不过让我们假设只会发生2倍的损失把上面3项中提到的数字相乘,则总机时损失了100倍(5*10*2)毫无疑问,这已经足夠满足“实际经济考虑”允许我们按照教学效果(而不是教学成本)来选择编程工具。

但是以上方法的收益还不仅仅停留在机时利用上当我们想要教一种语言,却没有编译器时甚至当连编译器还没有发明,课程也没有出现时我们都可以成功应用这种方法。因为如果程序在第一时间能够成功运行的概率非常高,那么在很多情况下实际运行该程序其实也没有多大教学效果。所以此时甚至可以摆脱计算机至少是可以控制计算机导致的种种稀奇古怪的变数,这就能让我们对教学计划更有信心随着学期的进行稳步完成计划。确实一旦我们从机器的约束下解放出来,课程的经济考虑就主要取决于有现成可用的教师和教室而只要渡过了最初的入门阶段,任何一组程序員都能按照这样的方法自我教学无论是脱产还是不脱产。

    实际上不脱产培训的经济情况与学院中的一般假设完全相反。学生很可能比咾师工资更高如果考虑班级整体,则肯定是如此显然,如果把这些专业程序员全体送到大学校园里听编程课程肯定不如用更少的时間通过互相评审代码学习编程来得划算。

如果专业教师不想踏进失业线也就必须面对这样一种隐含的挑战。要是有合适的人引导一个程序员小组能够通过评审技术大大提高学习效率。引导者能够帮助他们把从学费、机时费上节省下来的钱用在更有用的地方比如,安排哆次测试运行这样可以进行设计、算法上的比较——而这种比较单靠凭空分析是很难完成的。

我要回帖

更多关于 为什么会做预知梦 的文章

 

随机推荐