﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-emu in blogjava-文章分类-项目开发</title><link>http://www.blogjava.net/emu/category/1389.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 15 Nov 2007 11:16:08 GMT</lastBuildDate><pubDate>Thu, 15 Nov 2007 11:16:08 GMT</pubDate><ttl>60</ttl><item><title>几篇转帖</title><link>http://www.blogjava.net/emu/articles/160802.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Thu, 15 Nov 2007 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/160802.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/160802.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/160802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/160802.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/160802.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 　我有个有趣的观察，外企公司多的是 25-35岁的白领， 40岁以上的员工很少，二三十岁的外企员工是意气风发的，但外企公司 40岁附近的经理人是很尴尬的。我见过的 40岁附近的外企经理人大多在一直跳槽，最后大多跳到民企，比方说，唐骏。外企员工的成功很大程度上是公司的成功，并非个人的成功，西门子的确比国美大，但并不代表西门子中国经理比国美的老板强，甚至可以说差得很远。而进外企的人往往并...&nbsp;&nbsp;<a href='http://www.blogjava.net/emu/articles/160802.html'>阅读全文</a><img src ="http://www.blogjava.net/emu/aggbug/160802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2007-11-15 17:41 <a href="http://www.blogjava.net/emu/articles/160802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]给计算机系学生的建议 </title><link>http://www.blogjava.net/emu/articles/62309.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Tue, 08 Aug 2006 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/62309.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/62309.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/62309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/62309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/62309.html</trackback:ping><description><![CDATA[
		<table class="slugTable" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<p class="slugText">
												<strong>
														<a href="http://chinese.joelonsoftware.com/Articles/AdviceforComputerScienceC.html">http://chinese.joelonsoftware.com/Articles/AdviceforComputerScienceC.html</a>
														<br />
														<br />给计算机系学生的建议</strong>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<font color="#808080">
		</font>
		<font color="#808080">
				<font size="2">作者： 周思博 (Joel Spolsky)<br />译： Chen Bin <br /><!--StartFragment -->2005年1月2日 <br /></font>
				<br />
		</font>
		<!--StartFragment -->
		<p>虽然大概一两年前我还在夸夸其谈桌面应用程序是将来的潮流，大学生们现在还是偶尔向我请教职业发展的问题。所以我把我的建议写下来。以供学生们阅读，嘲笑，忽略。</p>
		<p>大多数锐气十足的学生从来不向前辈征求意见。在计算机科学领域，这样做是正确的。因为前辈们很可能说些“在2010年前，市场对于那些只会敲击键盘的代码工人的需求将会超过一亿（因此前景是乐观的）”，或者诸如“Lisp语言现在真的很热门”。</p>
		<p>我和那些前辈也差不多，当我给别人建议时，实际上我不知道自己在说些什么。我是如此的落后于时尚，以至于连AIM也搞不明白，而不得不使用 email（恐龙时代的产品，在那个时代，音乐是刻在扁扁的的圆圆的盒子上，噢，那种盒子叫cd）。（译者按：我认为祖儿这里在说反话，后文很多地方作者都在说反话，读者尽量理解这种美国式幽默吧。）</p>
		<p>
				<img style="MARGIN-LEFT: 5px" alt="" src="http://www.joelonsoftware.com/pictures/college/CA1.JPG" align="right" border="0" />所以你最好不要理睬我将要说的，你应该立刻去制作某种<a href="http://www.thefacebook.com/">在线交友软件</a>。</p>
		<p>然而，</p>
		<p>如果你喜欢编程，那就感谢上帝吧:你属于幸运的少数人，这些人喜欢工作，他们的工作可以保证他们能过上舒适的生活。大多数人没有这么幸运。对大多数人来说，工作是不愉快的，忍受工作的目的攒钱，是为了在年满65岁退休后能过上自己想过的生活。如果他们想过的生活不需要灵活的膝盖，明亮的眼镜，轻盈的脚步的话。</p>
		<p>现在让我回到主题，我将提供一些建议。</p>
		<p>好了，不罗嗦了，下面就是Joel给计算机系学生们七条免费的建议:</p>
		<ol>
				<li>毕业前学会写作 
</li>
				<li>毕业前学会C语言 
</li>
				<li>毕业前学习微观经济学（microeconomics） 
</li>
				<li>不要因为某些非计算机课程枯燥无趣就敬而远之 
</li>
				<li>学习有大量编程实践的课程 
</li>
				<li>不要担心工作都跑到印度去了 
</li>
				<li>好好做夏季毕业实习</li>
		</ol>
		<p>让我逐条解释这些建议。但解释之前我要说明一下，如果因为这些建议是Joel的建议你就打算无条件地接受，以至于连我的理由都想跳过，那么你就太单纯，太容易被别人骗了。如果你是那种单纯的人，我还要给你第八条建议，找心理医生咨询一下如何培养自信（self-esteem）。</p>
		<p>
				<strong>毕业前学会写作</strong>
		</p>
		<p>如果Linus Torvalds不懂如何<a href="http://groups.google.com/groups?selm=1991Oct5.054106.4647%40klaava.Helsinki.FI">布道</a>的话，Linux会成功吗？ 正象每一个黑客，Linus精通写作，他知道如何准确地在email和邮件讨论组中使用书面英语表达自己的思想，所以他能够从全世界召集大量志愿者为Linux工作。</p>
		<p>你听说过最近风靡全世界的极限编程（Extreme Programming）吗？ 即使你不懂什么是极限编程，你至少听说过这个词。为什么？因为宣传极限编程的人都是天才的作者和演说家。 </p>
		<p>就看看你身边的那些小型的软件开发组织吧，最有权力和影响力的人是那些可以用自信，准确，舒适的英语交流的人。好吧，我承认这些人也许言过其实，但是你无可奈何。</p>
		<p>
				<img style="MARGIN-LEFT: 5px" alt="" src="http://www.joelonsoftware.com/pictures/college/CA2.JPG" align="right" border="0" />一个合格的程序员和一个伟大的程序员的区别不在于知道多少种编程语言，不在于他们是<a href="http://www.paulgraham.com/gh.html">喜欢Python或者Java</a>，而是在于他们是否擅长表达。他们能够说服，所以他们获得权力。他们能够写清楚明白的评论和接口文档，所以他们使得别人不用<a href="http://www.joelonsoftware.com/articles/fog0000000069.html">重写</a>，而可以重用他们的代码，否则他们的代码就是毫无用处的。他们也能够写出清晰的用户手册，于是最终用户可以理解他们的代码是做什么用的，明白了他们的工作的价值。sourceforge埋葬着许多精美的代码，这些已死的代码无人使用，因为代码的作者很少写（或者根本不写）用户手册。</p>
		<p>我不会雇佣一个不懂写作的程序员。如果你擅长写，你就很容易找到工作，紧接着你就会被要求写技术规格文档，这意味着你已经被管理层注意到了。</p>
		<p>大学里有一些课程，要求你做很多的写作练习，不要犹豫，赶快参加这些课程。不要错过任何要求你每周或者每天练习写作的课程。 </p>
		<p>给自己建立一个网络日志（weblog）。在上面写的越多，你会写地越容易。写地越容易，你就写地越多，这是一个正向地循环激励。</p>
		<strong>毕业前学会C语言</strong>
		<p>我可没有说是C++。虽然现在用C的工作不多，但是掌握各种编程语言的程序员事实上用C来交流（lingua franca）；更重要的是，C比某些“现代”语言更接近机器语言。我不管现在大学里在教什么流行的垃圾语言（trendy junk），你至少得花一个学期接近机器。否则，<a href="http://www.joelonsoftware.com/articles/fog0000000319.html">你不可能使用高级语言写出高效的代码</a>。这意味这你不会有机会写编译器或者操作系统，也许这是更好的编程工作；别人不会相信你能够为大项目设计架构。无论你知道多少高级的控制结构，知道如何进行错误处理，如果你不能解释为什么<strong>while （*s++ = *t++）;</strong>的意思是进行字符串拷贝（而且对你而言这是世界上最自然，最易懂的代码），那么你就是在对编程一窍不通的状态下编程（programming based on superstition）。打个比方，就好比一个医生不懂基本的解剖学就给你开处方，如果你问这个医生为什么开这种药而不是那种药，他会说因为医药销售代表说这种药有用。</p>
		<p>
				<strong>毕业前学习微观经济学（microeconomics）</strong>
		</p>
		<p>
				<img style="MARGIN-LEFT: 5px" alt="" src="http://www.joelonsoftware.com/pictures/college/CA3.JPG" align="right" border="0" />我个人对经济学的一些理解：在经济学刚诞生的时候，它只是局限于有限的领域，在这些领域中人们发展和发现了很多<a href="http://www.joelonsoftware.com/articles/StrategyLetterV.html">有用的理论和很有趣的事实</a>，这些理论和事实是从逻辑上是可以证明的。然后， <a href="http://www.joelonsoftware.com/articles/CamelsandRubberDuckies.html">经济学开始走下坡路了</a>。 “有限的领域”就是微观经济学，它对于商业可以进行有意义的指导。然后，事情就开始变糟了（以下部分你可以跳过），你接下来碰到的是讨论诸如失业率和银行利率之间关系之类东东的宏观经济学，很多时候宏观经济学讨论的理论都是无法证明正确或者错误的。接下来事态更加恶化了，经济学中的一些领域开始和物理学搭界，嗯，学习物理经济学也许你帮你在华尔街找到好工作。言归正传，无论如何请学习微观经济学，因为你需要知道什么是“供给和需求”，什么是竞争优势，什么是净现值（NPVs，Net Present Value，指项目经济寿命期内现金流入总和与现金流出总和之差额），什么是折扣和边际效用（discounting and marginal utility），如果你真想了解商业是如何运作的话。</p>
		<p>为什么计算机系的学生要学习经济学？因为理解商业基本规律的程序员对商业界来说是宝贵的程序员。我记得无数个程序员使我非常沮丧，因为他们在代码中坚持某些疯狂的设计，这些设计从技术上来说，完美；从资本主义的角度来看，发疯。如果你是一个理解商业的程序员，商业会给你回报。这就是你要学习经济学的原因。</p>
		<p>
				<strong>不要因为某些非计算机课程枯燥无趣就敬而远之</strong>
		</p>
		<p>首先，你需要让你的学分平均分（GPA）看起来漂亮点。</p>
		<p>不要低估学分平均分的威力。很多雇主和人事经理（包括我）阅读简历时首先看成绩，为什么？因为这代表了大部分的教授在很长的时期内对你的学业的一个平均的看法。托福成绩（美国的托福大致相对于我国的高考中的语文考试）？哈，几个小时的测验而已。当然学分不一定说明了一切，如果你修的是很难的课程，学分就有可能低一点。即使你的学分平均分很高，我还是要看各科分数是否<em>一致</em>。如果你应聘的是软件工程师职位，我为什么要关心你在大学里学的欧洲历史课程分数的高低呢？毕竟，历史很<em>枯燥</em>。那么要是你要编程的部分也是很枯燥的，你是不是要放弃了？事实上，有时候编程是枯燥的，如果你不能忍受编程中的枯燥部分的话，你就不能完成整个工作，雇主不愿意雇佣你这样的员工。</p>
		<p>我在大学里修过一门叫做“文化人类学”的课程，因为那时候我也搞不懂我到底要学什么，听起来这么课程可能还蛮有意思的。</p>
		<p>
				<img style="MARGIN-LEFT: 5px" alt="" src="http://www.joelonsoftware.com/pictures/college/CA4.JPG" align="right" border="0" />出乎我的意料。我不得不阅读大量讲述巴西热带雨林中的印第安人如何如何的书，让人真昏昏欲睡。听老师讲解也好不到哪去，我发觉看教室外的草如何长更有趣点。土著人如何烤蕃薯藤和我有什么关系？我为什么要去讨论如何烤蕃薯藤？但是期中考试马上就要到了，我暗暗下定决心，如果我能跨越“文化人类学”这个障碍，以后也许没有什么能难倒我了。我决心得A并且得到了A。以后当我不得不坐在林肯中心，连看18个小时的瓦格纳的《尼伯龙根的指环》时，我终于明白我为什么要学习“文化人类学”了，相比之下，我也能忍受这种歌剧了。</p>
		<p>
				<strong>学习有大量编程实践的课程</strong>
		</p>
		<p>我还记得决定不去读研究生的那一刻。</p>
		<p>就是在学习<a href="http://www.wisdom.weizmann.ac.il/%7Edharel/dynamic_logic.html">《动态逻辑》（Dynamic Logic）</a>这门课的时候，我记得是耶鲁的Lenore Zuck（一个天才的教师）教的。</p>
		<p>修这门课的时候，我已经不再是雄心勃勃了。我可不指望在这么课程中得个A，我梦想的是混个及格。逻辑本质上是很简单的：如果结论正确，前提必须正确。例如，如果“所有读书好的人都能找到工作”并且“张三的读书好”，那么“张三能够找到好工作”。就这么简单。</p>
		<p>但是我要学的是动态逻辑， <em>动态</em>逻辑和一般逻辑差不多，但是要考虑时间因素。例如，“在你开灯<em>之后</em>，你可以看见你的鞋子”加上“过去灯被打开了”意味着“你现在可以看到你的鞋子”</p>
		<p>动态逻辑学对于象Zuck教授这样的天才理论家来说非常诱人，因为这门学科的知识也许可以用来证明计算机程序是否正确。我记得在第一堂课上，为了证明“如果你有一盏关着的灯”并且“你按了一下开关”，那么“现在灯亮了”，Zuck教授就使用了两黑板加上边上的墙壁。</p>
		<p>证明过程难以置信的复杂。我觉得如此复杂的证明过程很可能会有小错误，但是我没办法证明<em>证明过程</em>本身是正确的。事实上，写在黑板上的证明跳过了很多中间步骤，许多步的证明使用了演绎法，使用了归纳法，以及一些研究生才懂的证明方法。</p>
		<p>作为课后作业，我们需要证明以下命题：<em>如果</em>灯过去是关着的，<em>并且</em>现在它是开着的，请证明有人按了开关</p>
		<p>我真的试着证明它了。</p>
		<p>我花了许多小时，试图证明这个命题。</p>
		<p>在无数个小时的努力后，我发觉Zuck博士的原始的证明有一个逻辑上的错误，也许这个错误是我的笔记抄错了，我不知道。于是我终于认识到，如果为了证明一个简单的问题需要花三个小时写下几黑板的证明步骤，再考虑到这个漫长的证明过程中可能会引入种种错误，那么这种机制是不可能用来证明任何<em>有趣的</em>东西的。 </p>
		<p>对动态逻辑学家来说，<em>有用</em>是无关紧要的。</p>
		<p>于是我退出了那门课程，发誓永远不会去读计算机系的研究生。</p>
		<p>这个故事的主题是，计算机科学和软件开发不一样。如果你非常非常幸运，你的学校会开软件开发的课程。然而，他们也可能不开这样的课程，因为名牌大学认为教授实用技巧的事情应该留给那些二三流的技术学院或者某些释放犯人再安置计划。你可以在任何地方学习<em>编程</em>，我们是耶鲁大学，我们培养未来的世界领导人。你付给耶鲁16万美元的学费就是为了学习如何写循环语句吗？你把耶鲁当成什么地方了？Java速成班吗？哼。</p>
		<p>问题在于，我们没有一个专业的学校教授软件开发。所以如果你想成为一个程序员，你可以进计算机系读书（当然计算机科学也值得学习），但是你学的<em>不是</em>软件开发。</p>
		<p>如果走运的话，你可以在计算机系发掘出很多有大量编程实践的课程，就象你能在历史系找到很多提供写作水平的课程一样。这些课程绝对值得学习。如果你喜欢编程，不要为你不能上教授诸如lambda算子或者线性代数的课程沮丧，在那里你连摸一下计算机的机会都没有。找找看有没有名字中带有“实习（Practicum）”字样的课程，不要在乎Practicum是个拉丁语。有用的（无奈状）课程就是需要在课程名中塞一些拉丁语，才能从那些装模作样（Liberal Artsy Fartsy）管理层的眼前蒙混过关。</p>
		<p>
				<strong>不要担心工作都跑到印度去了</strong>
		</p>
		<p>啊哈，如果你人在印度，你就无所谓了。愿你享受外包带来的工作机会并顺祝身体健康。</p>
		<p>但是我听说现在愿意读计算机系的学生越来越少了。据说原因之一是工作机会都跑到印度去了。我认为这种观点是大错特错。首先，根据眼前的商业时尚选择事业是非常愚蠢的。其次，即使工作真的都跑到印度和中国去了，编程对于其他有趣的工作来说都是极好的训练，例如业务流程工程（business process engineering）。第三，无论是在美国还是印度，好程序员仍然是非常短缺的，请相信我。当然，现在有许多所谓搞IT的人吵吵嚷嚷地说就业形势不好，工作太难找。但是事实如何？恕我直言，好程序员找工作还是很容易。第四，你还有更好的主意吗？历史系的毕业生找工作更容易吗？去法学院如何？据我所知，99％的律师恨他们的工作，每分钟都恨。而且律师一周工作90小时。正象我以前说过的，如果你喜欢计算机，那么感谢上帝，你将属于全世界人中的极少数的幸运儿，这些幸运儿热爱他们的工作，而且工作也可以提供体面的收入。</p>
		<p>实际上，我也不认为报考计算机系的人越来越少有多大的意义。相对于internet泡沫时期大家都疯狂的往计算机系挤，现在的人数回落只是回归正常水平而已。在泡沫时期，我们这个行业涌入了许多对计算机毫无兴趣的南郭先生，他们梦想的是拿着高的吓人的薪水加诱人的期权，然后年轻退休。谢天谢地，现在这些人都跑了。</p>
		<p>
				<strong>好好做夏季毕业实习</strong>
		</p>
		<p>明智的招聘者知道热爱编程的人初中就为当地的牙医写数据库程序，高中就在计算机夏令营教课，为校报规划网站，在某个软件公司做实习。他们找的就是这样的人。</p>
		<p>
				<img style="MARGIN-LEFT: 5px" alt="" src="http://www.joelonsoftware.com/pictures/college/CA5.JPG" align="right" border="0" />如果你喜欢编程，你最容易犯的最大的错误就是“有活就接”。我知道，其他专业的学生假期打工可顾不了这些条条框框。但是你不一样，你拥有一种特殊技能，不要浪费它。当你毕业时，你的简历上应该已经罗列一堆的编程工作实习。让其他人去“为大家提供租车服务”（Tom Welling是个例外，他业余时间去演超人）。</p>
		<p>最后，为了让你的生活更容易一点，也为了说明我这篇文章是能够自圆其说的，我将给我自己的公司的做做广告。我的公司Fog Creek软件公司，可以为大学生提供<a href="http://www.fogcreek.com/Jobs/SummerIntern.html">软件开发方面的实习机会</a>。在我们公司，你可以学习“编码，开发，商业”。去年在我们公司实习的Ben就是这么说的，可不是因为我给他什么好处他才这么说。二月一号截至，抓紧机会吧。</p>
		<p>如果你听了我的建议，你就会太早地卖掉Microsoft公司的股票，拒绝Google提供的职位，原因是因为你已经拥有自己的公司了。到时候可别后悔，更别怪我，呵呵。</p>
		<br />
		<br />
		<font style="FONT-FAMILY: Georgia, Times, serif" color="#808080" size="2">
				<span style="FONT-FAMILY: SimSun">本文最先用英文出版，题为</span>
				<a href="http://www.joelonsoftware.com/articles/CollegeAdvice.html">Advice for Computer Science College Students </a>
				<span style="FONT-FAMILY: SimSun">
				</span>
		</font>
<img src ="http://www.blogjava.net/emu/aggbug/62309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2006-08-08 10:41 <a href="http://www.blogjava.net/emu/articles/62309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]轻松面试找到理想员工－非官方的面试技术指南</title><link>http://www.blogjava.net/emu/articles/62308.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Tue, 08 Aug 2006 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/62308.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/62308.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/62308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/62308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/62308.html</trackback:ping><description><![CDATA[
		<a href="http://chinese.joelonsoftware.com/Articles/Interviewing.html">http://chinese.joelonsoftware.com/Articles/Interviewing.html</a>
		<a href="http://chinese.joelonsoftware.com/Articles/AdviceforComputerScienceC.html">
		</a>
		<br />
		<br />
		<table class="slugTable" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<p class="slugText">
												<strong>轻松面试找到理想员工－非官方的面试技术指南</strong>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<font color="#808080">
		</font>
		<font color="#808080">
				<font size="2">作者： 周思博 (Joel Spolsky)<br />译： Chen Bin <br />编辑： Rick Ju <br />2000年3月23日<br /></font>
				<br />
		</font>
		<p>雇佣合适的人对于Fog Creek软件公司来说是非常关键的。在我们这个领域，有三类人可以挑选。在一个极端, 是哪些混进来的, 甚至缺乏最基本的工作技巧. 只要问这类人两三个简单的问题，再读一下他们的简历，就可以轻易地剔除他们。另一个极端的类型是 <a href="http://joel.spolsky.com/" target="_blank">才华横溢的超级明星</a> 这些人仅仅为了好玩就用汇编语言为Palm Pilot（一种手掌电脑）写了一个Lisp（一种人工智能编程语言）编译器。在这两种极端类型中间的是一大群不能确定水平的候选者，也许他们中的某些人能干些什么？这里的关键是明白超级明星和那一大堆属于中间类型的人的区别，因为Fog Creek软件公司只雇佣超级明星。下面我要介绍一些找出超级明星的技巧。 </p>
		<p>Fog Creek公司最重要的雇佣标准是: </p>
		<blockquote>
				<b>
						<p>有头脑, 并且<br />完成工作</p>
				</b>
		</blockquote>
		<p>就是这些了。符合这样标准的人就是我们公司需要的员工了。 记住这条标准。 每天上床前背诵这条标准。我们公司的目标之一就是雇佣拥有这样的<i>潜质</i>的人，而不是雇佣懂某些技术的人。任何人所拥有的某些具体技术都会在几年内过时，所以，雇佣有能力学习新技术的人，要比雇佣那些只在这一分钟知道SQL编程是怎么回事的人对公司更划算一点。</p>
		<p>
				<b>有头脑</b>确实是一个很难定义的品质。但是让我们看一些在面试时能提问的一些问题，通过这些提问，我们可以找出拥有这种品质的人。<b>完成工作</b>非常关键。看起来<b>有头脑</b>但是不能<b>完成工作</b>的人经常拥有博士学位，在大公司工作过，但是在公司中没有人听他们的建议，因为他们是完全脱离实际的。比起准时交活儿，他们宁愿对于一些学院派的东西沉思。这些人由以下特性而可以识别出来。他们总是爱指出两个根本不同的概念间的相似性。例如，他们会说“Spreadsheets是一种特殊的编程语言”,然后花一个礼拜写一篇动人的，智慧的白皮书。这篇白皮书论述了，作为一个编程语言，spreadsheet关于计算语言特性的方方面面。聪明，但是没用。</p>
		<p>现在，我们来谈谈<b>完成工作</b>但是没有<b>头脑</b>的人。他们爱做蠢事。从来也没有考虑过将来得靠他们自己或者别的什么人来亡羊补牢。通过制造新的工作，他们成为了公司的<i>负债</i>而不是资产。因为他们不仅没有为公司贡献价值，还浪费了好员工的时间。这些人通常到处粘贴大堆的代码，而不愿意写子程序。他们是完成了工作，但是不是以最聪明的方式完成工作。</p>
		<p>面试时最重要的法则是: </p>
		<blockquote>
				<b>
				</b>
				<p>
						<b>做决定</b>
				</p>
		</blockquote>
		<p>在面试结束时，对于被面试者，你不得不做一个直截了当的决定。这个决定只有两个结果：<b>雇佣</b>或者<b>不雇佣</b>. 回到你的电脑前，立刻用电子邮件通知招聘负责人你的决定。电子邮件的主题应该是<b>雇佣</b>或者<b>不雇佣</b>。接着你需要在正文中写两段来支持你的决定.</p>
		<p>没有其他的答案。<i>永远不要</i>说，“雇佣你，但是不能在我的团队中”。这是非常粗鲁的，因为你在暗示应试者没有聪明到能有和你一起工作的资格，但是以他的头脑适合进入那些天生输家队伍。如果你发觉自己被诱惑，想说出那句“雇佣你，但是不能在我的队伍中”，那么就简单的把这句话变成“不雇佣”再说出口。这样就没事了。甚至如果某个人在特定领域很能干，但是在别的队伍中将会表现不好，也是<b>不雇佣</b>。事物变化的如此之快，我们需要的是在任何地方都能成功的人。如果某些情况下你发现了一个白痴专家（拥有某些特殊能力的白痴），这个专家对于SQL非常，非常，非常的精通，但是除此之外什么也学不会，<b>不雇佣</b>。在Fog Creek公司他们没有将来。</p>
		<i>
		</i>
		<p>
				<i>永远不要</i>说，“也许，我吃不准”。如果你吃不准，意味着<b>不雇佣</b>。看，比你想象的容易的多。吃不准？就说不！同样，如果你<i>不能作出决定</i>，那意味着<b>不雇佣</b>。不要说，”嗯，雇佣，我想是这样的。但是关于...，我想知道 ...”。这种情况就是<b>不雇佣</b>。</p>
		<p>最重要的是记住这点，放弃一个可能的好人要比招进一个坏人强（译者按：中国有位哲人说过，宁可错杀一千，不可放过一个，呵呵）。一个不合格的求职者如果进入了公司，将要消耗公司大量的金钱和精力。其他优秀员工的还要浪费时间来修复这个人的错误。如果现在你还在犹豫，<b>不雇佣</b>。</p>
		<p>如果你是Fog Creek公司的面试官，当你拒绝了大量的应聘者时，不要为Fog Creek公司将因此雇不到任何人了而忧虑。这不是你的问题。这是招聘负责人的问题。这是人力资源部的问题。这是Joel（译者注: Fog Creek公司的老板，本文作者）的问题。但<i>不是</i>你的问题。不停地问自己，哪种情况更糟糕？一种情况是我们变成了一个庞大的，糟糕的软件公司，充斥着许多脑袋空空如可可果壳的家伙，另一种情况是我们是一个小而高品质的公司。当然，找到优秀的应聘者（并聘用他们）是很重要的。找到有头脑而且完成工作的人是公司中的每个员工的日常工作之一。但是当你作为Joel Creek公司的一员真的开始面试一个应聘者时，要装作现在正有很多优秀的人想打破头挤进Fog Creek公司。总之，无论找到一个不错的应聘者是多么的难，永远不要降低你的标准。</p>
		<p>但是你如何作出雇佣或者不雇佣这样艰难的决定？你只要在面试过程中不停地问自己：<i>这个人<b>有头脑</b>吗？</i>这个人能<i><b>完成工作</b>吗？</i>要作出正确的回答，在面试时你必须问对问题。</p>
		<p>开个玩笑，下面我要问个有史以来最差的面试问题: “Oracle 8i中的数据类型varchar和varchar2有什么区别”这是一个可怕的问题。掌握这种琐碎的技术细节和Fog Creek公司想雇佣你之间没有任何联系。谁会去记这种东西？如果有在线帮助，你可以在15秒内找到答案。</p>
		<p>实际上，还有更差的问题，等会儿我会谈到的。</p>
		<p>现在我们要谈到有趣的部分了：面试时提哪些问题。我的面试问题清单来自于我去微软公司找第一份工作的经历。这里实际上有几百个微软面试问题。每个人都有偏爱的问题。你也可以发展一套自己的面试问题以及面试的个人风格，这样你就可以比较容易地作出<b>雇佣/不雇佣</b>的决定。以下是我成功使用过的一些面试技巧，</p>
		<p>在面试前，我读一遍应试者的简历，然后在一张纸片上随便写以下我的<i>面试计划</i>。这个计划实际上就是我要问的问题清单。以下是一个例子（用来面试程序员的）：</p>
		<ol>
				<ol>
						<b>
								<li>介绍 
</li>
								<li>应试者参加过的项目 
</li>
								<li>无法回答的问题 
</li>
								<li>C语言函数 
</li>
								<li>你满意吗？ 
</li>
								<li>设计问题 
</li>
								<li>挑战 
</li>
								<li>你还有什么问题？ </li>
						</b>
				</ol>
		</ol>
		<p>在面试前，我非常，非常当心，避免自己先入为主。如果在面试前你就已经想当然地认为，一个麻省理工的博士一定是一个有头脑的人。那么在接下来的一小时的面试时间内，无论那个麻省理工的博士说什么都不能改变你的最初印象。如果在面试前你就认为这个应试者是个傻瓜，那么他面试时说什么也无济于事。面试就象一个非常精巧的天平。一小时的面试结束后就要对一个人下结论是不容易的（但是你又必须在面试结束后得出结论）。一些不起眼的细节可能会影响最后的结论。如果你在面试开始前对于应试者有了一点了解的话，就好比天平的某一端加上了重重的砝码。这样面试本身就会变得没有用处了。以前有一次在面试前，一个招聘负责人跑进我的房间说，“你肯定会爱上这个家伙的!" 对一个男孩? 天哪，这简直让我发疯。我本来应该说，“嗯，如果你这么确定我会喜欢他，为什么你不干脆雇佣他,何必让我浪费时间来面试？”但是那时我还太年轻幼稚, 所以还是面试了那个人。当这个家伙开始说一些蠢话时，我对自己说，“哇塞，这应该是个例外情况，也许是大智若愚。”我开始带着玫瑰色眼镜看他了。于是我以说<b>“雇佣”</b>结束了面试，虽然他是一个糟糕的面试者。接下来发生了什么事？除了我，其他的面试官都说，<b>不要雇佣</b>这个人。教训是，不要听别的人的话，在面试应试者前不要四处打探这个面试者的情况。最重要的是不要和别的面考官谈论应试者，除非你们都已经作出了独立的判断。这才是科学的做法。</p>
		<p>作为面试步骤的第一步，<i>介绍</i>的目的是让应试者放轻松。我通常花30秒钟，讲一下我是谁，接下来面试会如何进行。我总是使得应试者确信，我们关心的是他（她）<i>如何</i>解决问题的，而不是他（她）的最终答案是对还是错。顺便说一下，面试时，你不要和应试者隔着一个桌子坐着，否则在你和面试者之间就有了一个障碍，并且暗示着一种比较正式严肃的气氛，这样应试者就很难放松了。更好的办法是把桌子靠墙放着，或者和应试者坐在桌子的同一边，这样有助于应试者放松。只有应试者不会因为紧张而表现失常，你才能更有效的进行面试.</p>
		<p>第二步的内容就是问应试者最近做了些什么项目。对刚毕业的学生, 如果有论文就问问论文, 没有的话, 就问问他们做过什么很喜欢的大作业.例如，有时候我会问一下，“你最喜欢上学期哪门课程？不一定要和计算机相关的。”事实上，如果应试者回答的课程和计算机没有关系，我会比较高兴。有时候你会发现这个计算机系应届生选择了尽可能少的计算机相关课程，但是却选修了很多和音乐相关的课程。但是他（她）却说最喜欢的课程是《面向对象数据库》。哼哼，不错啊. 不过如果你直接承认你喜欢音乐胜于计算机, 而不是在这儿胡说八道的话, 我会更高兴一点。</p>
		<p>当面试有工作经验的人时，你可以让他们谈一下前一份工作。</p>
		<p>我问这个问题的目的是在寻找一样品质：<i>热情</i>。在应试者谈到他（她）最近做过的项目时，你观察到以下迹象都是不错的： </p>
		<ul>
				<li>谈到他们做过的项目时变得热情洋溢；他们的语速更快，语言更生动活泼。这说明他们对某些东西有兴趣，有热情（因为现实中有许多人对所做的项目根本漠不关心呢）。即使他们激动地表达对做过的项目的负面感情，这也是一个好的信号。“我曾经为上一个老板安装Foo Bar Mark II，但他是个傻瓜！”表现出热情的人就是我们要雇佣的人。差的应试者对工作根本就不关心，所以根本不会激动。一个非常好的信号是当应试者很激动地谈论上一份工作，以至于暂时忘记了他们正在被面试。有时候应试者刚开始面试时表现的很紧张 -- 这是很正常的现象，所以我通常忽略不计。但是当他们谈到单色计算艺术（Computational Monochromatic Art）时，这个家伙变得极端兴奋, 一点都不紧张了。不错，我喜欢这样的应试者，因为他们关心他们做的事。（什么是单色计算艺术？拔掉你的电脑显示器的电源就可以看到了） 
</li>
				<li>能认真地去解释事情。某些人被我拒掉的原因就是他们不会用普通人能明白的语言去解释他们做过的项目。很多工科专业的人总是以为所有人都知道Bates理论（译者注: Bates Theorem，一种经济学的理论）或者Peano公理组（译者注: Peano's Axioms，数论中的一些定理）是什么。如果应试者开始满口行话了，让他们停一停，然后你说，“能帮我个忙吗？就是为了练习一下，你能把刚才说的用我老祖母也能理解的话说一遍吗？”但即便如此, 有些人还是继续用那些术语, 而且根本没法让人明白他们在说什么。天哪！ 
</li>
				<li>如果这个项目是一个团队项目，看看他们是否在有承担领导责任的迹象？一个应试者可能会说：“我们用的是X方法，但是老板说应该是Y，而客户说应该是Z。”我会问，“那么<i>你</i>怎么做的？”一个好的回答可能是“我设法和团队中别的人开了个会，然后一起搞出个办法...”坏的回答看起来象，“嗯，我什么也<i>不能</i>做。这样的问题我解决不了。”记住，<b>聪明并且能完成工作</b>。要搞清楚某人是否能<b>完成工作</b>的一个办法就是看看他（她）过去是否倾向于完成任务。事实上，你可以主动要求他们给你个例子证明他们能担任领导作用，完成任务。－例如克服公司的陈规陋习。 </li>
		</ul>
		<p>现在我们谈谈清单上的第三款，<i>无法回答的问题</i>。这很有趣。这个主意的关键在于问一些不可能有答案的问题，就是想看一下应试者怎么办。“西雅图有多少眼科医生？”“华盛顿纪念碑有多重？”“洛杉机有多少加油站？”“纽约有多少钢琴调音师？”</p>
		<ul>
				<li>聪明的应试者猜到你不是要测验他们的专业知识，他们会积极地给出一个估计。“嗯，洛杉机的人口是七百万；每个人平均拥有2.5辆轿车...”当然如果他们的估计完全错误了也没有关系。重要的是他们能积极地试着回答问题。他们可能会试着搞清楚每个加油站的储量。“嗯，需要四分钟给一个储油罐加满油，一个加油站有十个油泵每天运行十八个小时...”他们也可能试着从占地面积来估计。有时, 他们的想法的创造力让你吃惊. 而有时, 他们直接要一个LA的黄页去查。这都是好迹象。 
</li>
				<li>不聪明的应试者则被难住了。他们目瞪口呆地望着你，好像你来自火星。你不得不提示：“嗯，如果你想建立一个象洛杉机那么大的城市，你需要建立多少个加油站？”你还可以提示他们：“加满一个储油罐要多长时间？”不过，这些榆木疙瘩脑袋还是只会坐在那里发呆，你得拖着他们往前走才行。这类人不会解决问题，我们可不要这样的人。 </li>
		</ul>
		<p>关于编程问题，我通常要求应试者用C语言写一些小函数。以下是我通常会出的题目： </p>
		<ol>
				<li>将一个字符串逆序 
</li>
				<li>将一个链表（linked list）逆序 
</li>
				<li>计算一个字节（byte）里有多少bit被置1 
</li>
				<li>搜索给定的字节（byte） 
</li>
				<li>在一个字符串中找到可能的最长的子字符串，该字符串是由同一字符组成的 
</li>
				<li>字符串转换成整数 
</li>
				<li>整数转换成字符串（这个问题很不错，因为应试者要用到堆栈或者strev函数） </li>
		</ol>
		<p>注意，通常你不会希望他们写的代码多于5行，因为你没有时间理解太长的代码。</p>现在我们来详细看一看其中几个问题: 第一个问题: 逆序一个字符串。我这辈子还没有见过那个面试者能把这题目一次做对。所有的应试者都试图动态生成缓冲区，然后将逆序的字符串输出到该缓冲区中。问题的关键在于，谁负责分配这个缓冲区？谁又负责释放那个缓冲区？通过这个问题，我发现了一个有趣的事实，就是大多数认为自己懂C的人实际上不理解指针和内存的概念。他们就是不明白。这真叫人吃惊，无法想象这种人也能做程序员。但他们真的就是！这个问题可以从多个角度判断应试者：<br /><ul><li>他们的函数运行快吗？看一下他们多少此调用了<i>strlen</i>函数。我曾经看到应试者写的strrev的算法竟然只有O(n^2) 的效率，而标准的算法效率应该是O(n)，效率如此底下的原因是因为他们在循环中一次又一次调用<i>strlen</i>函数。 
</li><li>他们使用指针运算吗（译者按：原文为pointer arithmetic，指的是加减指针变量的值）？使用指针运算是个好现象。许多所谓的“C程序员”竟然不知道如何使用指针运算（pointer arithmetic）。当然，我在前文说过我不会因为应试者不掌握一种特定的技巧而拒绝他。但是，理解C语言中的指针不是一种技巧，而是一种与生俱来的才能。每年一所大学要招进200多个计算机系的新生，所有这些小孩子4岁就开始用BASIC语言在Atari 800s写冒险游戏了。在大学里他们还学Pascal语言，学得也很棒。直到有一天他们的教授讲了指针的概念，突然，<i>他们开始搞不懂了</i>。他们就是不能再理解C语言中的任何东西了。于是90%的计算机系学生转系去学政治学。为了挽回面子，他们告诉朋友，他们之所以转系是因为他们计算机系英俊貌美的异性太少。许多人注定脑子里就没有理解指针的那根弦。所以说理解指针是一种与生俱来的品质，而不是一种单纯的技巧。理解指针需要脑子转好几个弯，某些人天生不擅长转这几个弯。</li></ul><p>第三个问题可以考考面试者对C的位运算的掌握，但这是一种技巧，不是一种品质，所以你可以帮助他们。有趣的等他们建立了一个子函数用来计算byte中为1的位的数目，然后你要求他们优化这个子函数，尽量加快这个函数的运行速度。聪明的应试者会使用查表算法（毕竟这个表只有 256个元素，用不了多少内存），整个表只需要建立一次。跟聪明的应试者讨论一下提高时间／空间效率的不同策略是十分有意思的事情. 进一步告诉他们你不想在程序启动时初始化查询表。聪明的面试者可能会建议使用缓冲机制，对于一个特定的byte，只有在第一次被查询时进行计算，然后计算结果会被放入查询表。这样以后再被查询时直接查表就行了。而特别特别聪明的面试这会尝试有没有建立查询表的捷径，如一个byte和它的置1的bit数之间有没有规律可循？ </p><p>当你观察应试者写C代码时，以下一些技巧会对你有帮助： </p><ul><li>事先向应试者说明，你完全理解，没有一个好的编辑器光在纸上写代码是困难的，所以你不在乎他们手写的代码是否看上去不整洁。你也完全明白没有好的编译器和调试器，很难第一次就写出完全没有bug的程序，所以请他们不必为此担心。 
</li><li>好程序员的标志：好程序员写完“{”符号后，通常立刻跟上“}”符号，然后再在当中填上代码。他们也倾向于使用命名规则，虽然这个规则可能很原始。如果一个变量用作循环语句的索引，好程序员通常使用尽可能少的字符为它命名。如果他们的循环语句的索引变量的名字是CurrentPagePositionLoopCounter，显而易见他们写代码的经验还不够多。偶尔，你会看到一个C程序员写下象<b>if (0==strlen(x))</b>一样的代码，<i>常量</i>被放在==的左边。这是非常好的现象。这说明他因为总是把＝和＝＝搞混，已经强迫自己养成这种习惯以避免犯错。 
</li><li>好的程序员在写代码前会订一个计划，特别是当他们的代码用到了指针时。例如，如果你要求逆序一个链表，好程序员通常会在纸的一边画上链表的草图，并表明算法中的索引指针当前移动到的位置。他们不得不这样做。正常人是不可能不借助草图就开始写一个逆序链表的程序的。差的程序员立刻开始写代码。 </li></ul><p>不可避免的，你会在他们的程序中发现bug，于是我们现在来到了第五个问题：<b>你对代码满意吗？</b> 你可能想问，“好吧，bug在哪里？”这是来自地狱的一针见血的问题，要回答这个问题可要大费口舌。所有的程序员都会犯错误，这不是问题。但他们必须能找到错误。对于字符串操作的函数，他们通常会忘记在输出缓冲区加上字符串结束符。所有的函数，他们都会犯off-by-one错误（译者按：指的是某个变量的最大值和最小值可能会和正常值差1)。他们会忘掉正常的C语句结尾的分号。如果输入是零长度字符串，他们的函数会运行错误。如果malloc调用失败而他们没有为此写好错误处理代码，程序会崩溃。一次就能把所有事情做对的程序员非常,非常,非常地少.不过要是真的碰上一个的话, 提问就更有意思了. 你说,"还有Bug"。他们会再仔细地检查一遍代码。这个时候, 观察一下他们内心是否开始动摇了, 只是表面上勉强坚持说代码没有问题。总之，在程序员写完代码后，问一下他们是否对代码满意是个好主意。就像Regis那样问他们！（译者按，Regis Philbin是美国ABC电视网的游戏电视节目主持人，他的口头禅是“这是你的最后的答案吗？”）</p><p>第六部分：关于设计的问题。让应试者设计某样东西。Jabe Blumenthal，Excel的原始设计者，喜欢让应试者设计房子。Jabe说，曾经有一个应试者跑到白板前，画了一个方块，这就是他的全部设计。天哪，一个方块！立刻<b>拒绝</b>这样的家伙。你喜欢问什么样的设计问题？</p><ul><li>好的程序员会问更多的信息。房子为谁造的？我们公司的政策是，我们不会雇佣那些在设计前不问为谁设计的人。通常，我会很烦恼我得打断他们的设计，说“事实上，你忘记问这个房子是给谁设计的了。这个房子是给一群长颈鹿造的。” 
</li><li>笨笨的应试者认为设计就像画画，你想画什么就画什么。聪明的应试者明白设计的过程是一系列艰难的权衡。一个很棒的设计问题是：设计一个放在街角的垃圾箱。想一想你得做多少权衡！垃圾箱必须易于清空，但是很难被偷走；易于放进垃圾，但是碰到狂风大作，里面的垃圾不会被吹出来；垃圾箱必须坚固而便宜。在某些城市，垃圾箱必须特别设计，以防恐怖分子在里面藏一个定时炸弹。 
</li><li>有创造力的应试者会给出有趣而独特的设计。我最喜欢的问题之一是<i>为盲人设计一个放调味品的架子</i>（译者按：原文为spice rack，老外的厨房里有个专门放调味品的架子,上面放了很多小罐罐，里面装了各种各样的调料）通常许多应试者的建议是把布莱叶文（一种盲人使用的文字）刻在放调料的罐子上，这样文字会卷起来而变形。我碰到一个应试者，他的设计是把调料放在抽屉里，因为他觉得水平地感知布莱叶文比垂直地做更方便。（试试看！）这个答案这样有创意，使我震惊！我面试了有一打得程序员，从来没有人想到过类似的答案。这样有创意的答案确实跃过了普通人考虑问题的条条框框。仅仅因为这个答案太有创意了，而且应试者别的方面还过得去，我雇佣了这个应试者，他现在已经成为Excel团队中一个优秀的项目经理了（译者按，本文作者曾在微软工作过）。 
</li><li>总是争取一个<i>确定的了结</i>。这也是<b>完成工作</b>的特质的一部分。有时候应试者会犹犹豫豫不能作出一个决定,试图回避困难的问题，留着困难的问题不作决定就直接向下进行,这很不好。好的应试者有一种推动事情自然地前进的倾向，即使你有意把他们拖回来。如果关于某个话题的讨论开始原地打转变得没有意义了，好的应试者会说，“嗯，我们可以整天谈论这个，但是我们得做点什么。为什么我们不开始...” </li></ul><p>于是我们来到了第七部分，<b>挑战</b>。这部分很好玩。在面试中留心一下, 当面试者的回答绝对的百分之百毫无争议时, 你可以说: " 嗯, 等一下等一下." 然后花上两分钟玩一下魔鬼的游戏（译者按，原文为devil's advocate，魔鬼代言人指的是违背自己的良知，为错误邪恶的观点辩护）. 记住一定要在你可以肯定他正确时和他争论。</p><pre wrap="">这个很有意思.  <br /></pre><ul><li>软弱的应试者会屈服。那我就和他说<b>拜拜</b>了。 
</li><li>坚定的应试者会找到一个办法说服你。他们会以肯尼迪总统的口才来说服你，“也许我误会了你的意思，”他们这样开头，但是正文仍是坚定地站稳立场。这样的人我就<b>雇佣</b>。 </li></ul><p>不得不承认，面试双方的地位并不是平等的。有可能应试者由于害怕你的权力而不敢于你争辩。<b>但是</b>，好的应试者有足够的热情和勇气坚持正确的观点，他们由于热切希望说服你而会暂时忘记正在被面试。这样的人就是我们要雇佣的人。</p><p>最后，可以问一下应试者有什么想问的。一些人喜欢看看应试者这时是否会问一些聪明的问题。这是市面上流行的面试书籍的标准技巧。我个人不在乎应试者问什么，因为这时我已经做了决定。麻烦在于，应试者也许已经见了5、6个人，进行了好几轮面试，他们可能很累了，以至于不能为每轮面试都准备一个聪明而独特的问题。所以如果他们没有可问的，没关系。</p><p>我总是留下面试的最后5分钟来推销我的公司。这很重要。<i>即使我不打算雇佣眼前这个应试者。</i>如果你幸运的找到一个很棒的应试者，你当然愿意做任何事情说服他（她）来你的公司。即使他们不是好的应试者，你也要尽力让他们为Fog Creek公司激动，这样面试结束时他们会对Fog Creek公司留下一个很好的印象。记住，应试者并不仅仅是可能的雇员，他们也是顾客，也是我们公司的推销员。如果他们觉得我们的公司很棒，他们也许会推荐朋友来面试。</p>啊哈，我记得我说过我会给出一些应该避免的非常不好的反面的试题例子。 
<p>首先，避免不合法的问题。有关种族，宗教，性别，出生国，年龄，服役记录，是否老兵，性取向，生理障碍的问题都是<strong>不合法的</strong>。即使他们的简历说他们1990年在军中服役，也不要问有关问题。也许这会让他们愉快地谈论在海湾战争中的经历。但是你的问题还是不合法的。如果简历上写着他们上过Technion in Haifa, 不要问他们是否是以色列人, 即使只是为了闲谈, 因为这是违法的. 下面有一个很好的不合法的例子。<a href="http://www.job-interview.net/Guide/SPstep4.htm">点击这里</a>有很多关于什么是违法的讨论。（但是这个网站的其余问题够愚蠢的。）</p><p>其次，不要在问题中给予应试者暗示，我们公司喜欢或者不喜欢什么样的员工。我能想到的一个例子是问应试者是否有小孩或者是否结婚了。应试者也许会想我们不喜欢有家庭拖累的员工。</p><p>最后，不要问那些脑筋急转弯的题目，例如6根火柴怎么拼出4个三角形。象这样的灵机一动的问题是不能看出应试者是否有“有头脑/完成工作”的品质。</p><p>面试与其说是科学不如说是艺术。但是只要你记住<b>有头脑/完成工作</b>这个原则，你就可以应对自如。有机会就问问你的同事他们喜欢的面试问题和答案。这是我们公司员工午饭时热衷的话题之一。</p><br /><br /><font style="FONT-FAMILY: Georgia, Times, serif" color="#808080" size="2"><span style="FONT-FAMILY: SimSun">本文最先用英文出版，题为</span><a href="http://www.joelonsoftware.com/articles/fog0000000073.html">The Guerrilla Guide to Interviewing</a> <span style="FONT-FAMILY: SimSun"></span></font> <img src ="http://www.blogjava.net/emu/aggbug/62308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2006-08-08 10:40 <a href="http://www.blogjava.net/emu/articles/62308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]膨胀软件与80/20的谣传 </title><link>http://www.blogjava.net/emu/articles/62306.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Tue, 08 Aug 2006 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/62306.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/62306.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/62306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/62306.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/62306.html</trackback:ping><description><![CDATA[
		<a href="http://chinese.joelonsoftware.com/Articles/StrategyLetterIV.html">http://chinese.joelonsoftware.com/Articles/StrategyLetterIV.html</a>
		<br />
		<br />
		<table class="slugTable" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<p class="slugText">
												<strong>第四战略篇：膨胀软件与80/20的谣传</strong>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<font color="#808080">
		</font>
		<font color="#808080">
				<font size="2">作者： 周思博 (Joel Spolsky)<br />译： Bo Yang <br />编辑： Wenjing Jiang <br /><span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">2001<span lang="ZH-CN">年</span>3<span lang="ZH-CN">月</span>23<span lang="ZH-CN">日</span></span><br /></font>
				<br />
		</font>
		<p>1993年，微软公司的电子表格软件Excel 5.0出版了。它是一个巨大的软件，需要15兆的硬盘空间。当年我们还记得最早上市(1985年左右)的PC硬盘只有20兆，所以15兆显得很多。</p>
		<p>
		</p>
		<p>
		</p>
		<p>等到Excel 2000出版的时候，它竟需要146兆的硬盘空间，几乎增长到1993年的十倍！微软公司的程序员真是差劲，对不对？</p>
		<img height="219" alt="" src="http://chinese.joelonsoftware.com/Images/Main_Beach_Lifeguards.jpg" width="356" border="0" cd:pos="5" />
		<p>不对。</p>
		<p>
		</p>
		<p>我敢打赌，你以为我要写一篇令人厌烦的，批评膨胀软件的文章。这种文章因特网上到处都是。批一批，怨一怨，这些庞大臃肿的软件，令我讨厌，还是vi和edlin比Microsoft Word与Emacs强多了，因为前两者很小巧灵活...</p>
		<p>
		</p>
		<p>
		</p>
		<p>哈哈，把你蒙了！我才不会去写一篇那样的文章呢，因为那种说法根本不对。</p>
		<p>
		</p>
		<p>1993年，根据当时硬盘的价格，Microsoft Excel 5.0占用了$36元的硬盘空间。</p>
		<p>
		</p>
		<p>
		</p>
		<p>2000年，根据当时硬盘的价格，Microsoft Excel 2000占用了$1.03元的硬盘空间。</p>
		<p>
		</p>
		<p>
		</p>
		<p>（这些数字是根据<a href="http://www.littletechshoppe.com/ns1625/winchest.html">此处的硬盘历史价格数据</a>计算的，以把通货膨胀的效果算进去了。）</p>
		<p>
		</p>
		<p>从实际经济角度出发，Excel好像变小了！</p>
		<p>
		</p>
		<p>
		</p>
		<p>说真格的，什么叫膨胀软件？<u><font color="#0000ff"><a href="http://www.tuxedo.org/~esr/jargon/html/entry/bloatware.html"><u><font color="#0000ff">Jargon File</font></u></a></font></u>把它嘲贬地定义为：“提供最低等的功能，同时占用不成比例的磁盘与内存空间的软件。特别是形容应用软件与操作系统升级来用的。此词在Windows/NT上是常见的，Windows/NT也是它的来源。”</p>
		<p>
		</p>
		<p>
		</p>
		<p>我猜这帮人只不过是恨Windows而已。自从虚拟内存在Windows 386(1989年)上出现后，我已经有十多年没有把内存用完过了。再说硬盘价格已经降到$0.0071元一兆，而且越降越快。</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>也许Linus Åkerlund能把这个问题解释清楚。他在<a href="http://user.tninet.se/~uxm165t/bloatware.html">他的网页</a> 上写道：“这些膨胀软件的一个大缺点，就是即使你只想干一件很小的事，你也要负载这个很大的程序。它把你的内存全用掉了…你不是很有效地利用你的系统。它毫无必要地把你系统的效率弄得很低。”</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>我明白了，原来它把你的内存都用完了。嗯，不对。自从Windows 1.0在1988年出版以后，操作系统只把用到的代码页放在内存中。如果你有一个15兆的可执行文件，但运行时只用到两兆的代码页，操作系统就只把这两兆从磁盘装入内存中。而且如果你用的是比较现代版的Windows的话，操作系统还会自动调整硬盘，把这两兆代码页放在一起，使程序起动得更快。</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>我想没有人会否定，在今天强大而便宜的计算机上，起动一个大程序比仅仅五年前起动一个小程序还要快。那么那些人在瞎叫唤什么呢？</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
				<a href="http://www.blu.org/faq/bloat.html">RA Downes</a>给了我们一个提示。看起来他花了几个钟头，把Microsoft的一个小程序研究了一通，而且因为这个程序有一兆大小，令他十分气愤（他写那篇文章，一兆硬盘只值3.15分）。以他看来，那个程序应该小下去95%才对。可笑的是，他研究的那个程序叫做RegClean，你很可能没听说过。它的作用，是把Windows registry中没用的东西找出来删掉。如果你整天为Windows registry中没用的东西担心的话，你性格上很可能有为事物着迷，难以克制的弱点。所以我怀疑批判膨胀软件是<a href="http://www.mentalhealth.com/dis/p20-an05.html">精神病</a> 的体现，不是软件问题。</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>实际上讲，膨胀软件的存在是有道理的。最起码的，如果程序员不用担心软件的大小，那么软件就可以早点出版。用户可以早点得到更多的功能。这些功能用时有益，不用时无害。假如你的软件商在出版软件之前，花两个月的时间，把它的软件缩小50%，这对你的实际好处来说，几乎是感觉不到。也许，你的硬盘要是快满了的话，你可以多下载一首MP3歌曲。可是你多花两个月的时间，等新软件出版的损失，你就感觉得到了。而且你的软件商会丢掉两个月的销售额，损失更大。</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>很多搞软件开发的人，被"80/20"的老规律引诱了。这个规律好像很有道理：80%的人只用20%的功能。所以你以为，只要实现20%的功能，就能得到80%的销售量。</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>不幸的是，那从不是同样的20%。每个人都用到不同的功能。再过去十年中，我大概听说过几十家公司，下定决心不互相吸取教训，企图出版“轻形”版本，只有20%的功能的文字处理软件。大多数情况是，他们把软件送到记者哪里去评论，那些记者评论的方法，就是用这个新的文字处理软件去写他们的评论文章。文章写完了，记者就要用到“字数”这个功能了，因为大多数记者写文章时有明确的字数限制。可是“字数”这个功能在软件里却找不到，因为它是属于“没人用的80%”里面。结果记者就会写<a href="http://www.zdnet.com/anchordesk/stories/story/0,10738,2681437,00.html">一篇文章</a>，一方面说着这个“轻形” 软件怎么怎么好，膨胀软件怎么怎么糟，另一方面又说我不能用这个软件，因为它没有“字数”这个功能。而且<a href="http://washingtonpost.com/wp-srv/tech/reviews/finder/rev_1030.htm">这种文章</a> 经常有人写。</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>当你去推销你的“轻形” 软件时，你跟人家说：“嗨，这个软件很小巧，只有一兆。” 人家听了一般都很高兴，然后就会问你有没有对于他们来说很重要的功能，要是没有，就不会买你的软件。</p>
		<p>
		</p>
		<p>
		</p>
		<p>基本概要是：如果你的战略是“80/20”，你就很难卖出你的软件。事实就是这样。这个战略自从软件工业开始时就有，从来没有胜利过。令人吃惊的是，很多<a href="http://www.fuckedcompany.com/">倒闭了的公司</a>的高级主管还觉得它是个好的主意。</p>
		<p>
		</p>
		<p>
		</p>
		<p>
				<a href="http://www.jwz.org/doc/easter-eggs.html">Jamie Zawinski</a> 在讨论改变世界的首版Netscape时讲得最好：“Mozilla [Netscape 1.0]很大并不是因为里面全是没用的东西（如果真是那样，解释起来倒很方便）。Mozilla很大，是因为你的需要很大。你的需要很大，是因为因特网是个很大的东西。网上有很多小型的浏览器，说起来基本上是没用的。我们当初写Mozilla的时候，从未想把它做成一颗完美无缺的明珠。”</p>
		<p>
		</p>
		<br />
		<br />
		<font style="FONT-FAMILY: Georgia, Times, serif" color="#808080" size="2">
				<span style="FONT-FAMILY: SimSun">本文最先用英文出版，题为</span>
				<a href="http://www.joelonsoftware.com/articles/fog0000000020.html">Strategy Letter IV: Bloatware and the 80/20 Myth</a> <span style="FONT-FAMILY: SimSun"></span></font> <img src ="http://www.blogjava.net/emu/aggbug/62306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2006-08-08 10:38 <a href="http://www.blogjava.net/emu/articles/62306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]行进中开火 </title><link>http://www.blogjava.net/emu/articles/62302.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Tue, 08 Aug 2006 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/62302.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/62302.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/62302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/62302.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/62302.html</trackback:ping><description><![CDATA[
		<table class="slugTable" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<p class="slugText">
												<strong>
														<a href="http://chinese.joelonsoftware.com/Articles/FireAndMotion.html">http://chinese.joelonsoftware.com/Articles/FireAndMotion.html</a>
														<br />
														<br />行进中开火</strong>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<font color="#808080">
		</font>
		<font color="#808080">
				<font size="2">作者： 周思博 (Joel Spolsky)<br />译： Siyan Li 李思延 <br />编辑： Paul May 梅普華 <br />2002年1月6日<br /></font>
				<br />
		</font>
		<p>时不时，总有一阵儿，我什么事也干不了。 </p>
		<p>我也去办公厅，东瞄瞄，西看看，每十秒钟查一次电子邮件，网上逛一圈。也许干点儿象付运通卡账单之类不需要大脑的事。不过要回去哗啦哗啦写程序，可没门儿。 </p>
		<p align="center">
				<img height="166" alt="Tetris" hspace="4" src="http://chinese.joelonsoftware.com/Images/bored-tetris.gif" width="200" border="0" cd:pos="0" />
		</p>
		<p>这种不出活的状态，一般通常会持续一两天。在我的软件开发生涯中也有过几个星期干不了活的时候。就像他们说的，我不在状态，我进入不了情况，我找不到组织。 </p>
		<p>人人都有情绪波动，有的人温和一些，有的响动大点儿，也有的可以整个乱套。但不管怎么着，那段不出活期似乎总是跟忧郁有点儿关系。 </p>
		<p>我不由得联想到那些专家说，人们基本上控制不了自己吃什么。任何节食计划都长不了。大家总是悠回各自的正常体重。也许作为一个软件工程师，我也不能控制什么时候最能出活。我唯一希望的就是发呆那段能被哗哗干活那段扯平，最终还能混碗饭吃。 </p>
		<p>
		</p>
		<p align="center">
				<img height="183" alt="Go read The Onion for a while." hspace="4" src="http://chinese.joelonsoftware.com/Images/bored-onion.gif" width="200" border="0" cd:pos="0" />
		</p>
		<p>
		</p>
		<p>自从我干上软件开发这一行起，我平均每天只有两三个的高效时间。这真让我头大。我在微软实习的时候，另外一个实习生告诉我，他每天12点上班，5点下班。5个钟头还包括午餐时间，但他的同事还对他特别满意。因为他干的活比一般人都多。其实我也一样。我每天只有两三个小时的高效时间。看着别人那么卖力的干，还有点不好意思。不过呢，我总是组里出活最多的。由此可见，“人件理论”和极限编程都坚持不加班，每周只干40小时，还是有点道理的。他们都清楚这么做不会降低一个小组的生产能力。 </p>
		<p>每天只能干两小时还没让我太担心，真让我担心的是完全干不了活的那些天。 </p>
		<p>我老想这是怎么回事儿。我努力回忆我出活最多的时候。估计是微软把我搬到一间漂亮的新办公室的时候。舒适豪华的办公室，窗外风景如画，窗对面樱桃花开满了石头堆砌的庭院。所有的一切都那么恰到好处。我马不停蹄地干好好几个月，一口气把Excel Basic的详细设计搞定。用象纪念碑那么高的一叠纸，详细描素了一个超大型目标模型和编程环境，工作之细致，令人难以置信。我自始至终就没停过手。去波士顿参加MacWorld I的时候，我都带着一台手提电脑，坐在哈佛商学院的大阳台上把Windows类别的所有文件都写完了。 </p>
		<p>按步就班并不难。通常我一天是这样度过的：1，去上班。2，查电子邮件和上网等等。 3，考虑是否应该吃完中饭在开始干活。4，吃完中饭回来。5，查电子邮件逛网。6，终于决定应该开始工作了。7，查电子邮件逛网，东瞄瞄，西看看。8，再次决定确实应该开始开始干活了。9，打开该死的编辑器。10，一直会些程序学到晚上7：30，写到忘记时间。 </p>
		<p>在以上第8步和第9步之间似乎有点缺陷，因为我不是每次都能顺利地执行下去。 </p>
		<p>
				<span>
						<img height="103" alt="bike trip" hspace="4" src="http://chinese.joelonsoftware.com/Images/bike-trip.jpg" width="113" align="left" border="0" cd:pos="1" />
				</span>对我来说，启动是唯一的难题。静止物体在不受外力作用的情况下会保持静止。大脑里有些物质的质量大得不可思议，让它加速太难了。但是只要速度上去了，在全速行使的情况下，倒不用使什么劲就能继续走下去。就象骑着自行车去作一次自费横穿美国的旅行，一开始，你根本想象不出要花那么多时间让车轮动起来，可是一旦动起来了，让它们继续转就不是一件很难的事了。 </p>
		<p>也许高效率的关键就：启动起来。配对编程法之所以成功，说不定就靠两个人在一起，互相强迫对方启动起来。 </p>
		<p>
				<span>
						<img height="99" alt="Joel in the Army" hspace="4" src="http://chinese.joelonsoftware.com/Images/ARMY-wee.JPG" width="91" align="right" border="0" cd:pos="3" />
				</span>我在以色烈当伞兵时，一次，有个将军来给我们讲实战战术。他告诉我们，步兵战术其实只有一种：行进中开火。你一边开火一边朝着敌人冲过去，火力让敌人抬不起头来，不能朝你开火 (当一个军人喊：“掩护我”的时候，他的意思就是“在我冲过街时候，你朝敌人猛烈开火，迫使他猫起来，没法朝我开火)。前进了，你就可以占领阵地，接近敌人，这样你的胜算要大的多。你要是不往前冲，敌人就有时间来搞清楚形势，这可不妙。你要是不开火，敌人就要朝你开火，撂倒你。 </p>
		<p>我很长一段时间都在想着这个教导。我想通了不论是战斗机空中格斗还是大规模舰队攻击，大部份军事战略战术都是以行进中开火作为基础的。我又化了十五年时间才想通了行进中开火也是一个人在现实生活中成功的基本原则。你每天都得往前进点儿，不用想你写的程序怎么差劲，怎么卖不出去，只要你不停地写，不停地改，滴水也能穿石。同时， 要注意你的竞争对手朝你开火。他们是不是想让你全心全意应付他们的扫射，好让你往前走不了呢？ </p>
		<p>想想这些年来，微软开发出来的资料存取方法，从OBDC，RDO，DAO，ADO，OLEDB直到现在的 ADO，.NET，不停翻新，技术上有必要吗？还是因为那个设计组实在蹩脚，每过他妈一年就得重新发明一遍资料存取技术？(实际上可能真是)。它最终的效果其实是一道掩护火力，让竞争者别无选择，只能把本来该用来开发新功能的宝贵时间都用来移植和升级了。仔细看看软件行业，干得好的公司对那些对大公司都依赖最少，不用把所有精力都用来为赶潮流而把程序重写一遍，还得修改那些只有在Windows XP上才会出现的缺陷。那些花太多时间去猜测微软未来发展方向的公司，日子都好过不了。有些人见了.NET就发怵，忍不住要按.NET来完全重建自己的体系结构，以为自己别无选择。哥门儿，看清楚了，微软是在朝你开火呢，而且这只是掩护火力。这游戏就是这么玩儿的。这样一来，他们就可以大步朝前走，而你却不能。你要支持<a href="http://wmf.editthispage.com/discuss/msgReader$3194?mode=topic">Hailstorm</a> 吗？<a href="http://radiodiscuss.userland.com/soap">SOAP</a>呢？还有<a href="http://www.w3.org/RDF/">RDF</a>？是因为你的顾客需要，所以你支持它们？还是因为有人朝你开火而你觉得应该还击？大公司的营销部都懂火力掩护。他们到客人那儿就说，“你们不一定非买我们的。谁的产品最好您就应该买谁的。不过，我们想提醒您，在下单之前最好先确认他们支持(XML/ SOAP/CDE/J2EE)。否则你们就会被他们的技术套牢。”。等到小公司去向这个客户推销的时候，那个听话的CTO就会问他们：“你们有J2EE吗？”。他们回去就只好不管卖不卖得掉，都埋头打造他们的J2EE。他们也就再没有机会来展示自己的特色了。其实，这只不过是个打勾功能。因为有个打勾拦在那儿空着，你就必须有这个功能。其实谁都不需要它。这就是火力掩护。 </p>
		<p>对于我这样的小公司来说，行进中开火意味着两件事。别跟时间过不去，同时你还得每天都进步。天不负苦心人，你终有出头的一天。我昨天花了一天时间只不过让FogBUGZ的颜色稍微好看点。这不要紧，只要不停步。最重要的是，我们的软件越来越好，客人越来越多。在我们达到Oracle 的规模之前，我们并不需要通盘战略。我们只需要每天早晨到办公室来，别多想，打开编程器。 <br /></p>
		<center>
				<span>
						<img height="217" alt="It's getting better all the time... o/~" hspace="4" src="http://chinese.joelonsoftware.com/Images/editing.gif" width="359" align="left" border="0" cd:pos="1" />
				</span>
		</center>
		<a href="http://discuss.fogcreek.com/joelonsoftware/default.asp?cmd=show&amp;ixPost=2290">
		</a>
		<br />
		<br />
		<font style="FONT-FAMILY: Georgia, Times, serif" color="#808080" size="2">
				<span style="FONT-FAMILY: SimSun">本文最先用英文出版，题为</span>
				<a href="http://www.joelonsoftware.com/articles/fog0000000339.html">Fire and Motion</a> <span style="FONT-FAMILY: SimSun"></span></font> <img src ="http://www.blogjava.net/emu/aggbug/62302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2006-08-08 10:32 <a href="http://www.blogjava.net/emu/articles/62302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]看起来简单， 实际上复杂 </title><link>http://www.blogjava.net/emu/articles/62300.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Tue, 08 Aug 2006 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/62300.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/62300.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/62300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/62300.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/62300.html</trackback:ping><description><![CDATA[
		<table class="slugTable" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<p class="slugText">
												<strong>
														<a href="http://chinese.joelonsoftware.com/Articles/NothingSimpleSeems.html">http://chinese.joelonsoftware.com/Articles/NothingSimpleSeems.html</a>
														<br />
														<br />看起来简单， 实际上复杂</strong>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<font color="#808080">
		</font>
		<font color="#808080">
				<font size="2">作者： 周思博 (Joel Spolsky)<br />译： <span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Bo Yang <span lang="ZH-CN">翻译</span></span><br />编辑： <span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Billy Chen <span lang="ZH-CN">编校</span></span><br /><span style="FONT-SIZE: 12pt; FONT-FAMILY: Georgia; mso-fareast-language: EN-US; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">2002</span><span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">年</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: Georgia; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">3</span><span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">月</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: Georgia; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">4</span><span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">日</span><br /></font>
				<br />
		</font>
		<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
				<font size="3">
						<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">我们在</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<a href="http://www.fogcreek.com/CityDesk">CityDesk</a>
												<span lang="ZH-CN">里有一个使用性上的小问题。</span>
												<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">问题是这样的：你可以用菜单上“导入网页”的命令，从因特网上导入一个文件。你也可以用鼠标拖放的方法，从磁盘上导入一个文件。但是菜单上没有“导入磁盘文件”这个命令，所以有些用户</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<span lang="ZH-CN">没有发现</span>CityDesk <span lang="ZH-CN">有这个功能，或者他们</span><span lang="ZH-CN">试图</span><span lang="ZH-CN">用“导入网页”这个命令去导入磁盘上的文件，结果造成无法成功导入。</span><o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">我一开始想这个问题很好解决，大概的方法就是用一个两个页面的文件导入向导。第一页问你：“你要从哪里导入？”。如果你选择“磁盘”，第二页就会提示你选一个文件；你要是选择“因特网”，第二页就会提示你输入一个</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">URL.<o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">我差点就开始动手去实现我这个想法了，但是有些事情使得我并没有这样做。我决定先写一个小的规约再说。写出来的规约如下：</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<b>
												<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">第一页</span>
										</b>
										<b>
												<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
														<o:p>
														</o:p>
												</span>
										</b>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">你要从哪里导入？</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">磁盘</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">/<span lang="ZH-CN">因特网</span><o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<b>
												<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">第二页（磁盘）</span>
										</b>
										<b>
												<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
														<o:p>
														</o:p>
												</span>
										</b>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">标准的打开文件对话框</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<b>
												<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">第二页（因特网）</span>
										</b>
										<b>
												<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
														<o:p>
														</o:p>
												</span>
										</b>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">用小浏览器让你输入一个</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">URL<o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">突然间我想到一个问题。</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">Windows<span lang="ZH-CN">的打开文件的对话框，通常是由操作系统提供的。能不能把这个对话框放到我的文件导入向导里面呢？</span><o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">嗯</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">…<o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">我查了一下。是可以这样做的，但这不是一件</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<a href="http://www.vbaccelerator.com/codelib/cmdlgd/cmdlgtp.htm">
														<span lang="ZH-CN">好玩</span>
												</a>
												<span lang="ZH-CN">的事，而且要花好几个小时的时间。我能不能不使用导入向导的方式呢？我重写了一下我的规约：</span>
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<b>
												<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">两个菜单项：</span>
										</b>
										<b>
												<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
														<o:p>
														</o:p>
												</span>
										</b>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<b>
												<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">1<span lang="ZH-CN">）从网上导入网页</span></span>
										</b>
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
										</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">-&gt; <span lang="ZH-CN">显示</span></span>
										<font size="3">
												<span style="FONT-FAMILY: Georgia; mso-fareast-language: ZH-CN">URL</span>
												<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">输入</span>
										</font>
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">对话框</span>
										<b>
												<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
														<o:p>
														</o:p>
												</span>
										</b>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<b>
												<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">2<span lang="ZH-CN">）从磁盘上导入网页</span></span>
										</b>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">–&gt; <span lang="ZH-CN">显示打开文件对话框</span><b><o:p></o:p></b></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<span style="mso-spacerun: yes">   </span>
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">这就好多了。三分钟的设计时间，省了我几个小时的编程序时间。</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">如果你这辈子花了二十分钟以上的时间去编软件代码的话，你就可能发现了一条规则：<b>事情没有看起来那么简单</b>。</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">就像拷贝文件这样简单的事，都充满了危险。如果第一个参数是个目录会如何？如果第二个参数是个文件会如何？如果同名的文件已经存在于目的子目录会如何？如果你没有写的权限又会如何？</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">如果在拷贝文件的过程中失败了怎么办？如果目的地是在一个远程计算机上，但是需要身份验证怎么办？如果文件很大但网络连接又慢，所以你需要显示一个进度条怎么办？如果文件传输速度降到几乎是零了，你什么时候放弃拷贝而给用户一个错误信息呢？</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">一个面试测试员的好办法，就是给他们一个简单的操作过程，然后让他们列出可能出现的错误情况。一个在</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">Microsoft<span lang="ZH-CN">面试时典型的问题就是：你怎样去测试打开文件对话框呢？一个好的测试员，可以轻而易举地列出几十个令人难以想到的情况去测试（比如“一个文件显示在对话框里，然后你去打开它，但是在你按<b>打开</b>的按钮之前，这个文件被另一个用户删除了”）。</span><o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">好，我们得到这样一个公理：事情没有看起来那么简单。</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">软件工程里还有一个指导思想，那就是你要永远想方设法去减低风险性。一个要特别小心去避免的风险，就是项目进度延期的风险。项目延期很不好，因为老板会训你，闹得你挺不高兴的。除此之外，这也存在经济方面的原因，那就是当初你决定给你的软件加某个功能的时候，你觉得这个功能只需要一个星期就能完成。现在你认识到该功能需要二十个星期才能完成，那么你当初的决定当然就是错的。如果你当初就知道需要花掉二十个星期的话，你可能就作出不同的决定了。你作出的错误决定越多，你公司的财产被一次性冲销处理的可能性就越大（甚至你们公司的标志会被收入债权人的</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<a href="http://news.bbc.co.uk/hi/english/business/newsid_1229000/1229279.stm">
														<span lang="ZH-CN">仓库</span>
												</a>
												<span lang="ZH-CN">）。到时候你的前老板抱怨道：“我们公司关门倒闭了不说，气人的是连上</span>
										</span>
										<span style="FONT-FAMILY: Georgia">
												<a href="http://www.fuckedcompany.com/">
														<span style="mso-fareast-language: ZH-CN">
																<font size="3">fuckedcompany</font>
														</span>
												</a>
										</span>
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">的资格都没有。”</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">事情没有看起来那么简单，再加上减低风险性的指导思想，只能让你得出如下的结论：</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt 0.5in">
										<b>
												<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">先设计再编程序，先思而后行。</span>
										</b>
										<b>
												<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
														<o:p>
														</o:p>
												</span>
										</b>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">让你失望了，很抱歉。我知道你读过</span>
										<font size="3">
												<span style="FONT-FAMILY: Georgia; mso-fareast-language: ZH-CN">Kent Beck</span>
												<span lang="ZH-CN" style="FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">的书，</span>
										</font>
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">所以你以为动手之前不做设计是可以的。对不起，那是<b>不可以</b>的。你修改程序<b>不可能</b>像修改设计文件那样“容易”。有些人总是发表这样的谬论：“我们现在用高级工具了，像</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">Java<span lang="ZH-CN">和</span>XML<span lang="ZH-CN">。 我们在几分钟之内，就可以改动程序里的很多东西。为什么不在程序里直接设计呢？”哥们儿，你可以在你自行车上加个发动机，但你不能把它变成汽车。如果你以为把你拷贝文件的程序，由线程式改为抢占式，而且改得比我写这句话还快，那你就大错特错了。</span><o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
												<o:p>
												</o:p>
										</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">不管怎么说，我不认为</span>
										<span style="FONT-FAMILY: Georgia; mso-fareast-language: ZH-CN">
												<font size="3">Extreme Programming</font>
										</span>
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">是在鼓吹零设计的理念。他们只是说：“不要作任何无必要的设计”，这没有什么错嘛。但人们听到的并不是这样。大多数程序员是在找不用设计的借口，所以他们像飞蛾扑火般投向“不用设计” 这个馊主意。这是一种奇怪的，让你事倍功半的懒惰方式。我懒得先在纸上把这个功能给设计好了，所以我就先写程序，然后发现不对，我就去改，结果反倒花更多的时间。或者，更经常发生的是，我先写些程序，发现它不对，但是没时间改了，结果我的产品质量低劣，而且我还是要找出些借口，说明它为什么“一定要那样“。那只不过是马虎潦草，缺乏职业精神。</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
										</span> </p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
										</span>
										<span style="FONT-SIZE: 12pt; FONT-FAMILY: Georgia; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Linus Torvalds</span>
										<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
												<a href="http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.0/0004.html">
														<span lang="ZH-CN">攻击设计</span>
												</a>
												<span lang="ZH-CN">的时候，他是在讲那些规模庞大的系统。大规模的系统必须慢慢进化，要不然它们就变成</span>
										</span>
										<span style="FONT-SIZE: 12pt; FONT-FAMILY: Georgia; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Multics</span>
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">了。他不是在说你那个拷贝文件的程序。你再想想，</span>
										<span style="FONT-SIZE: 12pt; FONT-FAMILY: Georgia; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Linus Torvalds</span>
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">脑子里有一个很清楚的路线图，知道他要到哪去，所以他觉得设计没什么用，也不足为奇。但不要上当，基本上说那对你不适用。</span>
										<span style="FONT-SIZE: 12pt; FONT-FAMILY: Georgia; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Linus Torvalds</span>
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">比我们聪明多了，所以他能干的事，不等于我们一般人也能干。渐增式设计及实现是好事。频繁地发布版本是可以的（但针对在大众市场上的软件来说，频繁发布版本会使用户不高兴，绝不是个好主意——可以多搞些内部的里程碑取而代之）。设计上不要拘泥于形式，那只是浪费时间。我从来没有见过某个项目得益于不动脑筋的流程图、</span>
										<span style="FONT-SIZE: 12pt; FONT-FAMILY: Georgia; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">UML</span>
										<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">、</span>
										<span style="FONT-SIZE: 12pt; FONT-FAMILY: Georgia; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">CRC</span>
										<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">，</span>
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">或者其他什么时髦的，花里呼哨的设计方法。至于那些</span>
										<span style="FONT-SIZE: 12pt; FONT-FAMILY: Georgia; mso-fareast-language: ZH-CN; mso-fareast-font-family: SimSun; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">Linus Torvalds</span>
										<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">说的系统，</span>
										<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">那些</span>
										<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">有一千万行代码程序的庞然大物，它们应该慢慢进化，因为人类还不知道怎样设计那种规模的软件。</span>
								</p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
										</span> </p>
								<p class="MsoNormal" style="MARGIN: 0in 0in 0pt">
										<span lang="ZH-CN" style="FONT-SIZE: 12pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">但是当你坐下来写你的拷贝文件的程序，或者计划给你的软件下个版本增添功能的时候，你一定要先作设计。不要让报急的号角使你草草动手。</span>
								</p>
						</span>
				</font>
		</span>
		<span lang="ZH-CN" style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">
				<font size="3">
						<span style="FONT-SIZE: 11pt; FONT-FAMILY: SimSun; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">
								<span lang="ZH-CN">
								</span>
								<o:p>
								</o:p>
						</span>
				</font>
		</span>
		<br />
		<br />
		<font style="FONT-FAMILY: Georgia, Times, serif" color="#808080" size="2">
				<span style="FONT-FAMILY: SimSun">本文最先用英文出版，题为</span>
				<a href="http://www.joelonsoftware.com/articles/NothingIsSimple.html">Nothing is as Simple as it Seems</a> <span style="FONT-FAMILY: SimSun"></span></font> <img src ="http://www.blogjava.net/emu/aggbug/62300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2006-08-08 10:29 <a href="http://www.blogjava.net/emu/articles/62300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]The Joel Test: 软件开发成功 12 法则</title><link>http://www.blogjava.net/emu/articles/62299.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Tue, 08 Aug 2006 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/62299.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/62299.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/62299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/62299.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/62299.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://chinese.joelonsoftware.com/Articles/TheJoelTest.html																																														The Joel Test: 软件开发成功 12 法则 																																			...&nbsp;&nbsp;<a href='http://www.blogjava.net/emu/articles/62299.html'>阅读全文</a><img src ="http://www.blogjava.net/emu/aggbug/62299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2006-08-08 10:26 <a href="http://www.blogjava.net/emu/articles/62299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个需求镀金的教训  </title><link>http://www.blogjava.net/emu/articles/4767.html</link><dc:creator>emu</dc:creator><author>emu</author><pubDate>Wed, 18 May 2005 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/emu/articles/4767.html</guid><wfw:comment>http://www.blogjava.net/emu/comments/4767.html</wfw:comment><comments>http://www.blogjava.net/emu/articles/4767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/emu/comments/commentRss/4767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/emu/services/trackbacks/4767.html</trackback:ping><description><![CDATA[<TABLE style="BORDER-COLLAPSE: collapse" width="95%" border=0>
<TBODY>
<TR>
<TD class=BlogArticleTitle><SPAN id=BlogBody_BlogArticleView_lbTitle></SPAN></TD></TR>
<TR>
<TD class=BlogArticleContent>
<TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word"><SPAN id=BlogBody_BlogArticleView_lbContent><PRE><P><PRE>一个OA项目，原来的需求文档已经面目全非了，得益于版本管理，找到了需求差异分析前的最后一个版本：</PRE><PRE><HR>3.1.2.6.&nbsp;安排其他用户日程<BR>&nbsp;用户在查看同事日程安排页面中点击“添加日程安排”按钮<BR>&nbsp;系统显示日程安排添加页面<BR>&nbsp;用户选择时间，填写事务详情，预计需要时间，选择事务类型，是否公开<BR>&nbsp;用户点击“提交”按钮<BR>&nbsp;系统检查时间冲突<BR>&nbsp;&nbsp;时间上没有冲突<BR>&nbsp;&nbsp;&nbsp;系统记录新事务<BR>&nbsp;&nbsp;&nbsp;系统显示操作成功页面<BR>&nbsp;&nbsp;存在时间冲突<BR>&nbsp;&nbsp;&nbsp;系统提示存在冲突的事务，提示是否修改事务<BR>&nbsp;&nbsp;&nbsp;&nbsp;用户确认添加<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;系统记录新事务<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;系统显示操作成功页面<BR>&nbsp;&nbsp;&nbsp;&nbsp;用户选择修改事务<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;系统返回到日程安排添加页面</PRE><PRE><HR></PRE><PRE>写完这个版本之后我出差去做需求差异分析，其他同事则按照暂定的需求文档开始做编码（时间紧迫，设计被跳过了，后来的设计文档都是从</PRE><PRE>代码反向工程处理的）。</PRE><PRE>在我出差期间，有个同事提出了，一个日程安排在某些情况下应该可以指派给多个同事，因此产生了一个“日程草稿”的概念，即一个日程可</PRE><PRE>以先起草然后再反复指派给多个用户。负责开发这一模块的兄弟们觉得大有道理，于是照此开发。</PRE><PRE>出差回来后我更新了需求文档，但是这一部分用户并没有提出异议，因此没有修改。直到上周开发基本完成，这周一开始做SIT。这时我才发现原来我现在要安排一个日程的话一定要先起草一个“日程草稿”再把它指派给自己或者别人。这就好比我要发个email，就要先写个email保存到草稿箱里面，再去草稿箱里面把它找出来发。</PRE><PRE>这当然是不能接受的，于是要求兄弟们按尽可能少的修改工作量进行修改，也就是说把保存草稿再取出草稿这个过程包装起来，自动保存后直</PRE><PRE>接指派出去。但是由于检查时间冲突并做出响应的流程并不是为草稿设计的，不得不修改了流程、设计并重新编码。今晚和兄弟们一起加班修正这个问题，希望明天可以开始SIT.</PRE><PRE>“一个日程安排在某些情况下应该可以指派给多个同事”是一个没有被确认的需求镀金，在没有被仔细考察的时候就轻率的被依以设计，造成了今天的困境。</PRE><PRE><HR></PRE><PRE><DIV class=post><DIV class=postTitle><A href="http://www.cnblogs.com/jackei/" target=_blank><U><FONT color=#800080>jackei</FONT></U></A>&nbsp;发表于<SPAN>2005-01-19 10:19 AM</SPAN>&nbsp;&nbsp;</DIV><DIV class=postText>这就是为什么一直在强调在测试过程中，超出已经明确定义的需求的功能也同样是软件缺陷，因为这中新增的功能是未经确认的，另外，对于项目来说，也增加了一些原本可控的风险之外的新的风险。昨天还在同大家解释这个问题，看来emu帮我找到了一个更好的例子^_^</DIV></DIV><BR><DIV class=post><DIV class=postTitle><A href="http://blog.csdn.net/emu/" target=_blank><U><FONT color=#800080>emu</FONT></U></A>&nbsp;发表于<SPAN>2005-01-21 5:08 PM</SPAN>&nbsp;&nbsp;</DIV><DIV class=postText>超出已经明确定义的需求的功能也同样是软件缺陷？ <BR><BR>从来没有从这个角度考虑国问题，有意思。 <BR><BR>实际情况是我们常常没有充分明确的需求定义。第一步规范不起来，后面就只有越走越远了……</DIV></DIV><BR><DIV class=post><DIV class=postTitle><A href="http://blog.csdn.net/emu/" target=_blank><U><FONT color=#800080>emu</FONT></U></A>&nbsp;发表于<SPAN>2005-04-22 11:55 AM</SPAN>&nbsp;&nbsp;</DIV><DIV class=postText>这个镀金模块最终的下场是，原来的代码全部删除，重新按照原先的设计开发了一遍。</DIV></DIV></PRE><P></P></PRE></SPAN></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/emu/aggbug/4767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/emu/" target="_blank">emu</a> 2005-05-18 16:05 <a href="http://www.blogjava.net/emu/articles/4767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>