﻿<?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-皇家方舟</title><link>http://www.blogjava.net/xixuui/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 30 Apr 2026 08:01:00 GMT</lastBuildDate><pubDate>Thu, 30 Apr 2026 08:01:00 GMT</pubDate><ttl>60</ttl><item><title>智力题集2</title><link>http://www.blogjava.net/xixuui/archive/2008/03/12/185833.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Wed, 12 Mar 2008 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2008/03/12/185833.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/185833.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2008/03/12/185833.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/185833.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/185833.html</trackback:ping><description><![CDATA[一。 给你一个7克的砝码，一个2克的砝码和一个天平。如何只称三次 把140克盐分成50克和90克<br />二 四个容器中都装有同样的药，有三个容器的药是好的，有一个容器的药是坏的 。已知坏的容器的药的质量=好容器的药的质量+1 。问如何只称一次，就可以知道那个容器的药是坏的<br />三 13根10公分的钉子，一个紧紧插在地上，其他12根如何在不借助外力和外物的条件下放在这个钉上?<br />四 54张扑克，一半红，一半黑，随机抽取两张，其中有一张是红的，问另一张是黑的概率是多少?<br /><img src ="http://www.blogjava.net/xixuui/aggbug/185833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2008-03-12 22:05 <a href="http://www.blogjava.net/xixuui/archive/2008/03/12/185833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>算兔子（经典算法题）</title><link>http://www.blogjava.net/xixuui/archive/2008/03/09/184908.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Sun, 09 Mar 2008 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2008/03/09/184908.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/184908.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2008/03/09/184908.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/184908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/184908.html</trackback:ping><description><![CDATA[
		<p>题目:   1对兔子,2个月后生第一对兔子,之后每隔1个月生1对兔子(一公一母).且之后生下来的兔子都可以继续生兔子,每对兔子生兔子的周期都一样.<br />问:<br />1.   如果最开始有一对兔子,8个月后有多少对兔子?一年后,两年后呢?<br />2.   若开始有两对,三对……兔子，题1的答案又是多少呢？<br />3.   若1对兔子生第一对兔子是在1个月后呢？3个月后？……？上述两题的答案是多少？<br /><br />写一段程序，回答上述所有问题。<br /></p>
<img src ="http://www.blogjava.net/xixuui/aggbug/184908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2008-03-09 23:05 <a href="http://www.blogjava.net/xixuui/archive/2008/03/09/184908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一道看似简单的面试题</title><link>http://www.blogjava.net/xixuui/archive/2008/01/21/176849.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Mon, 21 Jan 2008 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2008/01/21/176849.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/176849.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2008/01/21/176849.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/176849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/176849.html</trackback:ping><description><![CDATA[请用C++、Java、C#或VB.NET任意一种面向对象语言实现一个计算器控制台程序，要求输入两个数和运算符号，得到结果。<br /><img src ="http://www.blogjava.net/xixuui/aggbug/176849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2008-01-21 22:11 <a href="http://www.blogjava.net/xixuui/archive/2008/01/21/176849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ICE学习</title><link>http://www.blogjava.net/xixuui/archive/2007/07/18/131077.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Wed, 18 Jul 2007 07:01:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/07/18/131077.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/131077.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/07/18/131077.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/131077.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/131077.html</trackback:ping><description><![CDATA[链接：<a href="http://www.cnblogs.com/SGSoft/archive/2007/05/02/734775.html">http://www.cnblogs.com/SGSoft/archive/2007/05/02/734775.html</a><br /><a href="http://www.zeroc.com/download.html#bin">http://www.zeroc.com/download.html#bin</a><br /><img src ="http://www.blogjava.net/xixuui/aggbug/131077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-07-18 15:01 <a href="http://www.blogjava.net/xixuui/archive/2007/07/18/131077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《源代码就是设计》敏捷开发论文</title><link>http://www.blogjava.net/xixuui/archive/2007/07/17/130743.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Tue, 17 Jul 2007 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/07/17/130743.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/130743.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/07/17/130743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/130743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/130743.html</trackback:ping><description><![CDATA[
		<div class="quote_div">这是一篇伟大的论文，该文撰写于1992年，作者在当时就能有这样的反思，实在是非常了不起。 
<p></p><p>至今，我仍能记起当我顿悟并最终产生下面文章时所在的地方。那是1986年的夏天，我在加利福尼亚中国湖海军武器中心担任临时顾问。在这期间，我有幸参加了一个关于Ada的研讨会。讨论当中，有一位听众提出了一个具有代表性的问题，“软件开发者是工程师吗？”我不记得当时的回答，但是我却记得当时并没有真正解答这个问题。于是，我就退出讨论，开始思考我会怎样回答这样一个问题。现在，我无法肯定当时我为什么会记起几乎10年前曾经在Datamation杂志上阅读过的一篇论文，不过促使我记起的应该是后续讨论中的某些东西。这篇论文阐述了工程师为什么必须是好的作家（我记得该论文谈论就是这个问题——好久没有看了），但是我从该论文中得到的关键一点是：作者认为工程过程的最终结果是文档。换句话说，工程师生产的是文档，不是实物。其他人根据这些文档去制造实物。于是，我就在困惑中提出了一个问题，“除了软件项目正常产生的所有文档以外，还有可以被认为是真正的工程文档的东西吗？”我给出的回答是，“是的，有这样的文档存在，并且只有一份——源代码。”</p><p>把源代码看作是一份工程文档——设计——完全颠覆了我对自己所选择的职业的看法。它改变了我看待一切事情的方式。此外，我对它思考的越多，我就越觉得它阐明了软件项目常常遇到的众多问题。更确切地说，我觉得大多数人不理解这个不同的看法，或者有意拒绝它这样一个事实，就足以说明很多问题。几年后，我终于有机会把我的观点公开发表。C++ Journal中的一篇有关软件设计的论文促使我给编辑写了一封关于这个主题的信。经过几封书信交换后，编辑Livleen Singh同意把我关于这个主题的想法发表为一篇论文。下面就是这篇文章。</p><p>——Jack Reecves, December,22,2001</p><p>什么是软件设计？ <br />Jack W.Reeves, 1992</p><p>面向对象技术，特别是C++，似乎给软件界带来了不小的震动。出现了大量的论文和书籍去描述如何应用这项新技术。总的来说，那些关于面向对象技术是否只是一个骗局的问题已经被那些关于如何付出最小的努力即可获得收益的问题所替代。面向对象技术出现已经有一段时间了，但是这种爆炸式的流行却似乎有点不寻常。人们为何会突然关注它呢？对于这个问题，人们给出了各种各样的解释。事实上，很可能就没有单一的原因。也许，把多种因素的结合起来才能最终取得突破，并且这项工作正在进展之中。尽管如此，在软件革命的这个最新阶段中，C++本身看起来似乎成为了一个主要因素。同样，对于这个问题，很可能也存在很多种理由，不过我想从一个稍微不同的视角给出一个答案：C++之所以变得流行，是因为它使软件设计变得更容易的同时，也使编程变得更容易。</p><p>虽然这个解释好像有点奇特，但是它却是深思熟虑的结果。在这篇论文中，我就是想要关注一下编程和程序设计之间的关系。近10年来，我一直觉得整个软件行业都没有觉察到做出一个软件设计和什么是真正的软件设计之间的一个微妙的不同点。只要看到了这一点，我认为我们就可以从C++增长的流行趋势中，学到关于如何才能成为更好的软件工程师的意义深远的知识。这个知识就是，编程不是构建软件，而是设计软件。</p><p>几年前，我参见了一个讨论会，其中讨论到软件开发是否是一门工程学科的问题。虽然我不记得了讨论结果，但是我却记得它是如何促使我认识到：软件业已经做出了一些错误的和硬件工程的比较，而忽视了一些绝对正确的对比。其实，我认为我们不是软件工程师，因为我们没有认识到什么才是真正的软件设计。现在，我对这一点更是确信无疑。</p><p>任何工程活动的最终目标都是某些类型的文档。当设计工作完成时，设计文档就被转交给制造团队。该团队是一个和设计团队完全不同的群体，并且其技能也和设计团队完全不同。如果设计文档正确地描绘了一个完整的设计，那么制造团队就可以着手构建产品。事实上，他们可以着手构建该产品的许多实物，完全无需设计者的任何进一步的介入。在按照我的理解方式审查了软件开发的生命周期后，我得出一个结论：实际上满足工程设计标准的惟一软件文档，就是源代码清单。</p><p>对于这个观点，人们进行了很多的争论，无论是赞成的还是反对的都足以写成无数的论文。本文假定最终的源代码就是真正的软件设计，然后仔细研究了该假定带来的一些结果。我可能无法证明这个观点是正确的，但是我希望证明：它确实解释了软件行业中一些已经观察到的事实，包括C++的流行。</p><p>在把代码看作是软件设计所带来的结果中，有一个结果完全盖过了所有其他的结果。它非常重要并且非常明显，也正因为如此，对于大多数软件机构来说，它完全是一个盲点。这个结果就是：软件的构建是廉价的。它根本就不具有昂贵的资格；它非常的廉价，几乎就是免费的。如果源代码是软件设计，那么实际的软件构建就是由编译器和连接器完成的。我们常常把编译和连接一个完整的软件系统的过程称为“进行一次构建”。在软件构建设备上所进行的主要投资是很少的——实际需要的只有一台计算机、一个编辑器、一个编译器以及一个连接器。一旦具有了一个构建环境，那么实际的软件构建只需花费少许的时间。编译50 000行的C++程序也许会花费很长的时间，但是构建一个具有和50 000行C++程序同样设计复杂性的硬件系统要花费多长的时间呢？</p><p>把源代码看作是软件设计的另外一个结果是，软件设计相对易于创作，至少在机械意义上如此。通常，编写（也就是设计）一个具有代表性的软件模块（50至100行代码）只需花费几天的时间（对它进行完全的调试是另外一个议题，稍后会对它进行更多的讨论）。我很想问一下，是否还有任何其他的学科可以在如此短的时间内，产生出和软件具有同样复杂性的设计来，不过，首先我们必须要弄清出如何来度量和比较复杂性。然而，有一点是明显的，那就是软件设计可以 极为迅速地变得非常庞大。</p><p>假设软件设计相对易于创作，并且在本质上构建起来也没有什么代价，一个不令人吃惊的发现是，软件设计往往是难以置信的庞大和复杂。这看起来似乎很明显，但是问题的重要性却常常被忽视。学校中的项目通常具有数千行的代码。具有10 000行代码（设计）的软件产品被它们的设计者丢弃的情况也是有的。我们早就不再关注于简单的软件。典型的商业软件的设计都是由数十万行代码组成的。许多软件设计达到了上百万行代码。另外，软件设计几乎总是在不断地演化。虽然当前的设计可能只有几千行代码，但是在产品的生命期中，实际上可能要编写许多倍的代码。</p><p>尽管确实存在一些硬件设计，它们看起来似乎和软件设计一样复杂，但是请注意两个有关现代硬件的事实。第一，复杂的硬件工程成果未必总是没有错误的，在这一点上，它不存在像软件那样让我们相信的评判标准。多数的微处理器在发售时都具有一些逻辑错误：桥梁坍塌，大坝破裂，飞机失事以及数以千计的汽车和其他消费品被召回——所有的这些我们都记忆犹新，所有的这些都是设计错误的结果。第二，复杂的硬件设计具有与之对应的复杂、昂贵的构建阶段。结果，制造这种系统所需的能力限制了真正能够生产复杂硬件设计公司的数目。对于软件来说，没有这种限制。目前，已经有数以百计的软件机构和数以千计的非常复杂的软件系统存在，并且数量以及复杂性每天都在增长。这意味着软件行业不可能通过仿效硬件开发者找到针对自身问题的解决办法。倘若一定要说出有什么相同之处的话，那就是，当CAD和CAM可以做到帮助硬件设计者创建越来越复杂的设计时，硬件工程才会变得和软件开发越来越像。</p><p>设计软件是一种管理复杂性的活动。复杂性存在于软件设计本身之中，存在于公司的软件机构之中，也存在于整个软件行业之中。软件设计和系统设计非常相似。它可以跨越多种技术并且常常涉及多个学科分支。软件的规格说明往往不固定、经常快速变化，这种变化常常在正进行软件设计时发生。同样，软件开发团队也往往不固定，常常在设计过程的中间发生变化。在许多方面，软件都要比硬件更像复杂的社会或者有机系统。所有这些都使得软件设计成为了一个困难的并且易出错的过程。虽然所有这些都不是创造性的想法，但是在软件工程革命开始将近30年后的今天，和其他工程行业相比，软件开发看起来仍然像是一种未受过训练（undisciplined）的技艺。</p><p>一般的看法认为，当真正的工程师完成了一个设计，不管该设计有多么复杂，他们都非常确信该设计是可以工作的。他们也非常确信该设计可以使用公认的技术建造出来。为了做到这一点，硬件工程师花费了大量的时间去验证和改进他们的设计。例如，请考虑一个桥梁设计。在这样一个设计实际建造之前，工程师会进行结构分析——他们建立计算机模型并进行仿真，他们建立比例模型并在风洞中或者用其他一些方法进行测试。简而言之，在建造前，设计者会使用他们能够想到的一切方法来证实设计是正确的。对于一架新型客机的设计来说，情况甚至更加严重；必须要构建出和原物同尺寸的原型，并且必须要进行飞行测试来验证设计中的种种预计。</p><p>对于大多数人来说，软件中明显不存在和硬件设计同样严格的工程。然而，如果我们把源代码看做是设计，那么就会发现软件工程师实际上对他们的设计做了大量的验证和改进。软件工程师不把这称为工程，而称它为测试和调试。大多数人不把测试和调试看作是真正的“工程”——在软件行业中肯定没有被看作是。造成这种看法的原因，更多的是因为软件行业拒绝把代码看作设计，而不是任何实际的工程差别。事实上，试验模型、原型以及电路试验板已经成为其他工程学科公认的组成部分。软件设计者之所以不具有或者没有使用更多的正规方法来验证他们的设计，是因为软件构建周期的简单经济规律。</p><p>第一个启示：仅仅构建设计并测试它比做任何其他事情要廉价一些，也简单一些。我们不关心做了多少次构建——这些构建在时间方面的代价几乎为零，并且如果我们丢弃了构建，那么它所使用的资源完全可以重新利用。请注意，测试并非仅仅是让当前的设计正确，它也是改进设计的过程的一部分。复杂系统的硬件工程师常常建立模型（或者，至少他们把设计用计算机图形直观地表现出来）。这就使得他们获得了对于设计的一种“感觉”，而仅仅去检查设计是不可能获得这种感觉的。对于软件来说，构建这样一个模型既不可能也无必要。我们仅仅构建产品本身。即使正规的软件验证可以和编译器一样自动进行，我们还是会去进行构建/测试循环。因此，正规的验证对于软件行业来说从来没有太多的实际意义。</p><p>这就是现今软件开发过程的现实。数量不断增长的人和机构正在创建着更加复杂的软件设计。这些设计会被先用某些编程语言编写出来，然后通过构建/测试循环进行验证和改进。过程易于出错，并且不是特别的严格。相当多的软件开发人员并不想相信这就是过程的运作方式，也正因为这一点，使问题变得更加复杂。</p><p>当前大多数的软件过程都试图把软件设计的不同阶段分离到不同的类别中。必须要在顶层的设计完成并且冻结后，才能开始编码。测试和调试只对清除建造错误是必要的。程序员处在中间位置，他们是软件行业的建造工人。许多人认为，如果我们可以让程序员不再进行“随意的编码（hacking）”并且按照交给他们的设计去进行构建（还要在过程中，犯更少的错误），那么软件开发就可以变得成熟，从而成为一门真正的工程学科。但是，只要过程忽视了工程和经济学事实，这就不可能发生。</p><p>例如，任何一个现代行业都无法忍受在其制造过程中出现超过100%的返工率。如果一个建造工人常常不能在第一次就构建正确，那么不久他就会失业。但是在软件业中，即使最小的一块代码，在测试和调试期间，也很可能会被修正或者完全重写。在一个创造性的过程中（比如：设计），我们认可这种改进不是制造过程的一部分。没有人会期望工程师第一次就创建出完美的设计。即使她做到了，仍然必须让它经受改进过程，目的就是为了证明它是完美的。</p><p>即使我们从日本的管理方法中没有学到任何东西，我们也应该知道由于在过程中犯错误而去责备工人是无益于提高生产率的。我们不应该不断地强迫软件开发去符合不正确的过程模型，相反，我们需要去改进过程，使之有助于而不是阻碍产生更好的软件。这就是“软件工程”的石蕊测试。工程是关于你如何实施过程的，而不是关于是否需要一个CAD系统来产生最终的设计文档。</p><p>关于软件开发有一个压倒性的问题，那就是一切都是设计过程的一部分。编码是设计，测试和调试是设计的一部分，并且我们通常认为的设计仍然是设计的一部分。虽然软件构建起来很廉价，但是设计起来却是难以置信的昂贵。软件非常的复杂，具有众多不同方面的设计内容以及它们所导致的设计考虑。问题在于，所有不同方面的内容是相互关连的（就像硬件工程中的一样）。我们希望顶层设计者可以忽视模块算法设计的细节。同样，我们希望程序员在设计模块内部算法时不必考虑顶层设计问题。糟糕的是，一个设计层面中的问题侵入到了其他层面之中。对于整个软件系统的成功来说，为一个特定模块选择算法可能和任何一个更高层次的设计问题同样重要。在软件设计的不同方面内容中，不存在重要性的等级。最低层模块中的一个不正确设计可能和最高层中的错误一样致命。软件设计必须在所有的方面都是完整和正确的，否则，构建于该设计基础之上的所有软件都会是错误的。</p><p>为了管理复杂性，软件被分层设计。当程序员在考虑一个模块的详细设计时，可能还有数以百计的其他模块以及数以千计的细节，他不可能同时顾及。例如，在软件设计中，有一些重要方面的内容不是完全属于数据结构和算法的范畴。在理想情况下，程序员不应该在设计代码时还得去考虑设计的这些其他方面的内容。</p><p>但是，设计并不是以这种方式工作的，并且原因也开始变得明朗。软件设计只有在其被编写和测试后才算完成。测试是设计验证和改进过程的基础部分。高层结构的设计不是完整的软件设计；它只是细节设计的一个结构框架。在严格地验证高层设计方面，我们的能力是非常有限的。详细设计最终会对高层设计造成的影响至少和其他的因素一样多（或者应该允许这种影响）。对设计的各个方面进行改进，是一个应该贯穿整个设计周期的过程。如果设计的任何一个方面内容被冻结在改进过程之外，那么对于最终设计将会是糟糕的或者甚至无法工作这一点，就不会觉得奇怪了。</p><p>如果高层的软件设计可以成为一个更加严格的工程过程，那该有多好呀，但是软件系统的真实情况不是严格的。软件非常的复杂，它依赖于太多的其他东西。或许，某些硬件没有按照设计者认为的那样工作，或者一个库例程具有一个文档中没有说明的限制。每一个软件项目迟早都会遇到这些种类的问题。这些种类的问题会在测试期间被发现（如果我们的测试工作做得好的话），之所以如此是因为没有办法在早期就发现它们。当它们被发现时，就迫使对设计进行更改。如果我们幸运，那么对设计的更改是局部的。时常，更改会波及到整个软件设计中的一些重要部分（莫非定律）。当受到影响的设计的一部分由于某种原因不能更改时，那么为了能够适应影响，设计的其他部分就必须得遭到破坏。这通常导致的结果就是管理者所认为的“随意编码”，但是这就是软件开发的现实。</p><p>例如，在我最近工作的一个项目中，发现了模块A的内部结构和另一个模块B之间的一个时序依赖关系。糟糕的是，模块A的内部结构隐藏在一个抽象体的后面，而该抽象体不允许以任何方法把对模块B的调用合入到它的正确调用序列中。当问题被发现时，当然已经错过了更改A的抽象体的时机。正如所料，所发生的就是把一个日益增长的复杂的“修正”集应用到A的内部设计上。在我们还没有安装完版本1时，就普遍感觉到设计正在衰退。每一个新的修正很可能都会破坏一些老的修正。这是一个正规的软件开发项目。最后，我和我的同事决定对设计进行更改，但是为了得到管理层的同意，我们不得不自愿无偿加班。</p><p>在任何一般规模的软件项目中，肯定会出现像这样的问题，尽管人们使用了各种方法来防止它的出现，但是仍然会忽视一些重要的细节。这就是工艺和工程之间的区别。如果经验可以把我们引向正确的方向，这就是工艺。如果经验只会把我们带入未知的领域，然后我们必须使用一开始所使用的方法并通过一个受控的改进过程把它变得更好，这就是工程。</p><p>我们来看一下只是作为其中很小一点的内容，所有的程序员都知道，在编码之后而不是之前编写软件设计文档会产生更加准确的文档。现在，原因是显而易见的。用代码来表现的最终设计是惟一一个在构建/测试循环期间被改进的东西。在这个循环期间，初始设计保持不变的可能性和模块的数量以及项目中程序员的数量成反比。它很快就会变得毫无价值。</p><p>在软件工程中，我们非常需要在各个层次都优秀的设计。我们特别需要优秀的顶层设计。初期的设计越好，详细设计就会越容易。设计者应该使用任何可以提供帮助的东西。结构图表、Booch 图、状态表、PDL等等——如果它能够提供帮助，就去使用它。但是，我们必须记住，这些工具和符号都不是软件设计。最后，我们必须创建真正的软件设计，并且是使用某种编程语言完成的。因此，当我们得出设计时，我们不应该害怕对它们进行编码。在必要时，我们必须应该乐于去改进它们。</p><p>至今，还没有任何设计符号可以同时适用于顶层设计和详细设计。设计最终会表现为以某种编程语言编写的代码。这意味着在详细设计可以开始前，顶层设计符号必须被转换成目标编程语言。这个转换步骤耗费时间并且会引入错误。程序员常常是对需求进行回顾并且重新进行顶层设计，然后根据它们的实际去进行编码，而不是从一个可能没有和所选择的编程语言完全映射的符号进行转换。这同样也是软件开发的部分现实情况。</p><p>也许，如果让设计者本人来编写初始代码，而不是后来让其他人去转换语言无关的设计，就会更好一些。我们所需要的是一个适用于各个层次设计的统一符号。换句话说，我们需要一种编程语言，它同样也适用于捕获高层的设计概念。C＋＋正好可以满足这个要求。C++是一门适用于真实项目的编程语言，同时它也是一个非常具有表达力的软件设计语言。C++允许我们直接表达关于设计组件的高层信息。这样，就可以更容易地进行设计，并且以后可以更容易地改进设计。由于它具有更强大的类型检查机制，所以也有助于检测到设计中的错误。这就产生了一个更加健壮的设计，实际上也是一个更好的工程化设计。</p><p>最后，软件设计必须要用某种编程语言表现出来，然后通过一个构建/测试循环对其进行验证和改进。除此之外的任何其他主张都完全没有用。请考虑一下都有哪些软件开发工具和技术得以流行。结构化编程在它的时代被认为是创造性的技术。Pascal使之变得流行，从而自己也变得流行。面向对象设计是新的流行技术，而C++是它的核心。现在，请考虑一下那些没有成效的东西。CASE工具，流行吗？是的；通用吗？不是。结构图表怎么样？情况也一样。同样地，还有Warner-Orr图、Booch图、对象图以及你能想起的一切。每一个都有自己的强项，以及惟一的一个根本弱点——它不是真正的软件设计。事实上，惟一一个可以被普遍认可的软件设计符号是PDL，而它看起来像什么呢？</p><p>这表明，在软件业的共同潜意识中本能地知道，编程技术，特别是实际开发所使用的编程语言的改进和软件行业中任何其他东西相比，具有压倒性的重要性。这还表明，程序员关心的是设计。当出现更加具有表达力的编程语言时，软件开发者就会使用它们。</p><p>同样，请考虑一下软件开发过程是如何变化的。从前，我们使用瀑布式过程。现在，我们谈论的是螺旋式开发和快速原型。虽然这种技术常常被认为可以“消除风险”以及“缩短产品的交付时间”，但是它们事实上也只是为了在软件的生命周期中更早地开始编码。这是好事。这使得构建/测试循环可以更早地开始对设计进行验证和改进。这同样也意味着，顶层软件设计者很有可能也会去进行详细设计。</p><p>正如上面所表明的，工程更多的是关于如何去实施过程的，而不是关于最终产品看起来的像什么。处在软件行业中的我们，已经接近工程师的标准，但是我们需要一些认知上的改变。编程和构建/测试循环是工程软件过程的中心。我们需要以像这样的方式去管理它们。构建/测试循环的经济规律，再加上软件系统几乎可以表现任何东西的事实，就使得我们完全不可能找出一种通用的方法来验证软件设计。我们可以改善这个过程，但是我们不能脱离它。</p><p>最后一点：任何工程设计项目的目标是一些文档产品。显然，实际设计的文档是最重要的，但是它们并非惟一要产生的文档。最终，会期望某些人来使用软件。同样，系统很可能也需要后续的修改和增强。这意味着，和硬件项目一样，辅助文档对于软件项目具有同样的重要性。虽然暂时忽略了用户手册、安装指南以及其他一些和设计过程没有直接联系的文档，但是仍然有两个重要的需求需要使用辅助设计文档来解决。</p><p>辅助文档的第一个用途是从问题空间中捕获重要的信息，这些信息是不能直接在设计中使用的。软件设计需要创造一些软件概念来对问题空间中的概念进行建模。这个过程需要我们得出一个对问题空间中概念的理解。通常，这个理解中会包含一些最后不会被直接建模到软件空间中的信息，但是这些信息却仍然有助于设计者确定什么是本质概念以及如何最好地对它们建模。这些信息应该被记录在某处，以防以后要去更改模型。</p><p>对辅助文档的第二个重要需要是对设计的某些方面的内容进行记录，而这些方面的内容是难以直接从设计本身中提取的。它们既可以是高层方面的内容，也可以是低层方面内容。对于这些方面内容中的许多来说，图形是最好的描述方式。这就使得它们难以作为注释包含在代码中。这并不是说要用图形化的软件设计符号代替编程语言。这和用一些文本描述来对硬件科目的图形化设计文档进行补充没有什么区别。</p><p>决不要忘记，是源代码决定了实际设计的真实样子，而不是辅助文档。在理想情况下，可以使用软件工具对源代码进行后期处理并产生出辅助文档。对于这一点，我们可能期望过高了。次一点的情况是，程序员（或者技术方面的编写者）可以使用一些工具从源代码中提取出一些特定的信息，然后可以把这些信息以其他一些方式文档化。毫无疑问，手工对这种文档保持更新是困难的。这是另外一个支持需要更具表达力的编程语言的理由。同样，这也是一个支持使这种辅助文档保持最小并且尽可能在项目晚期才使之变成正式的理由。同样，我们可以使用一些好的工具；不然的话，我们就得求助于铅笔、纸以及黑板。</p><p>总结如下： <br />　　实际的软件运行于计算机之中。它是存储在某种磁介质中的0和1的序列。它不是使用C++语言（或者其他任何编程语言）编写的程序。 <br />　　程序清单是代表软件设计的文档。实际上把软件设计构建出来的是编译器和连接器。 <br />　　构建实际软件设计的廉价程度是令人难以置信的，并且它始终随着计算机速度的加快而变得更加廉价。 <br />　　设计实际软件的昂贵程度是令人难以置信的，之所以如此，是因为软件的复杂性是令人难以置信的，并且软件项目的几乎所有步骤都是设计过程的一部分。 <br />　　编程是一种设计活动——好的软件设计过程认可这一点，并且在编码显得有意义时，就会毫不犹豫的去编码。 <br />　　编码要比我们所认为的更频繁地显现出它的意义。通常，在代码中表现设计的过程会揭示出一些疏漏以及额外的设计需要。这发生的越早，设计就会越好。 <br />　　因为软件构建起来非常廉价，所以正规的工程验证方法在实际的软件开发中没有多大用处。仅仅建造设计并测试它要比试图去证明它更简单、更廉价。 <br />　　测试和调试是设计活动——对于软件来说，它们就相当于其他工程学科中的设计验证和改进过程。好的软件设计过程认可这一点，并且不会试图去减少这些步骤。 <br />　　还有一些其他的设计活动——称它们为高层设计、模块设计、结构设计、构架设计或者诸如此类的东西。好的软件设计过程认可这一点，并且慎重地包含这些步骤。 <br />　　所有的设计活动都是相互影响的。好的软件设计过程认可这一点，并且当不同的设计步骤显示出有必要时，它会允许设计改变，有时甚至是根本上的改变， <br />　　许多不同的软件设计符号可能是有用的——它们可以作为辅助文档以及工具来帮助简化设计过程。它们不是软件设计。 <br />　　软件开发仍然还是一门工艺，而不是一个工程学科。主要是因为缺乏验证和改善设计的关键过程中所需的严格性。 <br />　　最后，软件开发的真正进步依赖于编程技术的进步，而这又意味着编程语言的进步。C++就是这样的一个进步。它已经取得了爆炸式的流行，因为它是一门直接支持更好的软件设计的主流编程语言。 <br />　　C++在正确的方向上迈出了一步，但是还需要更大的进步。</p><p>后 记</p><p>当我回顾几乎10年前所写的东西时，有几点让我印象深刻。第一点（也是和本书最有关的）是，现今，我甚至比那时更加确信我试图去阐述的要点在本质上的正确性。随后的一些年中，许多流行的软件开发方法增强了其中的许多观点，这支持了我的信念。最明显的（或许也是最不重要的）是面向对象编程语言的流行。现在，除了C++外，出现了许多其他的面向对象编程语言。另外，还有一些面向对象设计符号，比如：UML。我关于面向对象语言之所以得到流行是因为它们允许在代码中直接表现出更具表达力的设计的论点，现在看来有点过时了。</p><p>重构的概念——重新组织代码基础，使之更加健壮和可重用——同样也和我的关于设计的所有方面的内容都应该是灵活的并且在验证设计时允许改变的论点相似。重构只是提供了一个过程以及一组如何去改善已经被证实具有缺陷的设计的准则。</p><p>最后，文中有一个敏捷开发的总的概念。虽然极限编程是这些新方法中最知名的一个，但是它们都具有一个共同点：它们都承认源代码是软件开发工作中的最重要的产品。</p><p>另一方面，有一些观点——其中的一些我在论文中略微谈到过——在随后的一些年中，对我来说变得更加重要。第一个是构架，或者顶层设计的重要性。在论文中，我认为构架只是设计的一部分内容，并且在构建/测试循环对设计进行验证的过程中，构架需要保持可变。这在本质上是正确的，但是回想起来，我认为我的想法有点不成熟。虽然构建/测试循环可能揭示出构架中的问题，但是更多的问题是常常由于改变需求而表现出来的。 一般来说，设计软件是困难的，并且新的编程语言，比如：Java或者C++，以及图形化的符号，比如：UML，对于不知道如何有效地使用它的人来说，都没有多大的帮助。此外，一旦一个项目基于一个构架构建了大量的代码，那么对该构架进行基础性的更改，常常相当于丢弃掉该项目并重新开始一个，这就意味着该项目没有出现过。即使项目和机构在根本上接受了重构的概念，但是他们通常仍然不愿意去做一些看起来就像是完全重写的事情。这意味着第一次就把它作对（或者至少是接近对）是重要的，并且项目变得越大，就越要如此。幸运的是，软件设计模式有助于解决这方面问题。</p><p>还有其他一些方面的内容，我认为需要更多地强调一下，其中之一就是辅助文档，尤其是构架方面的文档。虽然源代码就是设计，但是试图从源代码中得出构架，可能是一个令人畏惧的体验。在论文中，我希望能够出现一些软件工具来帮助软件开发者自动地维护来自源代码的辅助文档。我几乎已经放弃了这个希望。一个好的面向对象构架通常可以使用几幅图以及少许的十几页文本描述出来。不过，这些图（和文本）必须集中于设计中的关键类和关系。糟糕的是，对于软件设计工具可能会变得足够聪明，以至于可以从源代码的大量细节中提取出这些重要方面的内容这一点，我没有看到任何真正的希望。这意味着还得必须由人来编写和维护这种文档。我仍然认为，在源代码完成后，或者至少是在编写源代码的同时去编文档，要比在编写源代码之前去编写文档更好一些。</p><p>最后，我在论文的最后谈到了C++是编程——并且因此是软件设计——艺术的一个进步，但是还需要更大的进步。就算我完全没有看到语言中出现任何真正的编程进步来挑战C++的流行，那么在今天，我会认为这一点甚至要比我首次编写它时更加正确。</p><p>——Jack Reeves, 2002年1月1日 <br /></p></div>
<img src ="http://www.blogjava.net/xixuui/aggbug/130743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-07-17 10:09 <a href="http://www.blogjava.net/xixuui/archive/2007/07/17/130743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初学linux</title><link>http://www.blogjava.net/xixuui/archive/2007/07/08/128946.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Sun, 08 Jul 2007 15:45:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/07/08/128946.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/128946.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/07/08/128946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/128946.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/128946.html</trackback:ping><description><![CDATA[
		<p>没事装个inux玩玩，现在才把系统装好，还有好多东西没装呢<br />有以下资料可用：<br />一、装五笔输入法：<a href="">http://www.blogjava.net/xixuui/admin/EditPosts.aspx</a><br />二、装QQ：<a href="http://cn.tech.yahoo.com/050902/551/27dli.html">http://cn.tech.yahoo.com/050902/551/27dli.html</a>， <a href="http://www.xxlinux.com/linux/article/accidence/internet/20060602/1098.html">http://www.xxlinux.com/linux/article/accidence/internet/20060602/1098.html</a><br />三、查看磁盘分区情况：<a href="http://fedora.linuxsir.org/main/?q=node/41">http://fedora.linuxsir.org/main/?q=node/41</a><br />四、挂载windows下的空间：<a href="http://www.yuanma.org/data/2006/0622/article_909.htm">http://www.yuanma.org/data/2006/0622/article_909.htm</a>, <a href="http://tech.ccidnet.com/art/302/20060608/575235_1.html">http://tech.ccidnet.com/art/302/20060608/575235_1.html</a><br />五、安装播放器：<a href="http://www.lslnet.com/linux/docs/linux-3746.htm">http://www.lslnet.com/linux/docs/linux-3746.htm</a>，<a href="http://www.5inet.net/System/Linux/025612.html">http://www.5inet.net/System/Linux/025612.html</a><br /><br /></p>
<img src ="http://www.blogjava.net/xixuui/aggbug/128946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-07-08 23:45 <a href="http://www.blogjava.net/xixuui/archive/2007/07/08/128946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 简单命令</title><link>http://www.blogjava.net/xixuui/archive/2007/07/03/127746.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Tue, 03 Jul 2007 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/07/03/127746.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/127746.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/07/03/127746.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/127746.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/127746.html</trackback:ping><description><![CDATA[source c:\abc.sql; 执行sql脚本<br /><br />use database;切换数据库<br />desc table;查看表属性<br />show create table tablename; 查看建表时的语句<br /><img src ="http://www.blogjava.net/xixuui/aggbug/127746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-07-03 09:58 <a href="http://www.blogjava.net/xixuui/archive/2007/07/03/127746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 看门狗</title><link>http://www.blogjava.net/xixuui/archive/2007/06/27/126545.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Wed, 27 Jun 2007 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/06/27/126545.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/126545.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/06/27/126545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/126545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/126545.html</trackback:ping><description><![CDATA[
		<p>先要编写看门狗程序program.sh，内容如：<br />#!/bin/bash</p>
		<p>#注：本脚本需要以超级用户身份运行。</p>
		<p># 监测的时间间隔，秒计<br />INTERVAL=60</p>
		<p># 重启时间间隔<br />INTERVALRESTART=1</p>
		<p>#==================================================================</p>
		<p>PROGRAME=program<br />THREADNUMS=1<br />LOG=/apps/server/monitor.log<br />#SYSDATE=$(date)<br />   <br />SYSBUILD=`/bin/cat /etc/redhat-release | /bin/awk '{print $5$7}'`</p>
		<p>var="-emf"<br /> <br />case ${SYSBUILD} in<br />"7.3")<br />        var="-e"<br />        ;;<br />"8.0")<br />        var="-em"<br />        ;;<br />"AS3")<br />        var="-emf"<br />        ;;<br />esac<br />   <br />  <br />while true<br />do <br />   SYSDATE=$(date)</p>
		<p>  <br />   nowps1=`ps $var | grep $PROGRAME | grep -v grep | wc -l`<br />   nowps1=`expr $nowps1`<br />      <br />   if  [  $nowps1 -lt $THREADNUMS ]; then <br />        /bin/sh /apps/program.sh<br />        echo " " &gt;&gt; $LOG<br />        echo "*******************************************************" &gt;&gt; $LOG<br />        echo "Restart time:" $SYSDATE &gt;&gt; $LOG<br />        echo "---------- Program $PROGRAME restart ----------------" &gt;&gt; $LOG<br />        echo "*******************************************************" &gt;&gt; $LOG<br />        echo " "<br />   fi<br />sleep $INTERVAL<br />   <br />done</p>
		<p>#-----------------------------------------------------------<br />exit 0</p>
		<p>在文件/etc/rc.local在其中增加一个启动项，即在文件末尾增加一条可执行语句(如：/bin/sh /apps/program.sh)<br />看门狗制作完毕。<br /></p>
<img src ="http://www.blogjava.net/xixuui/aggbug/126545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-06-27 12:04 <a href="http://www.blogjava.net/xixuui/archive/2007/06/27/126545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UML中类之间的关系及其Java代码例子&lt;转&gt;</title><link>http://www.blogjava.net/xixuui/archive/2007/06/22/125793.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Fri, 22 Jun 2007 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/06/22/125793.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/125793.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/06/22/125793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/125793.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/125793.html</trackback:ping><description><![CDATA[
		<font color="#555555">关系是事物之间的联系。类之间有4种重要的关系：依赖、泛化、关联和实现。这些关系都可以映射到代码里。<br /></font>
		<font color="#333333">依赖是一种使用关系，描述了一个事物的规格说明的变化可能会影响到使用它的另一个事物（反之不一定）。在UML中表示为一条指向被依赖事物的虚线。依赖有很多构造型，不过一般不需要使用，以免搞得过份复杂。其实另外3种关系泛化、关联和实现都可以算作是某种依赖关系，只不过它们有比较强的语义和重要的作用，所以划分出来。一般对类关系建模的时候，先对泛化、关联和实现建模，剩下的关系都可以看作依赖了。<br />对应到代码中，依赖关系可能有很多种形式，例如<br />public class A<br />{<br />   public B getB(C c, D d)<br />   {<br />       E e = new E();<br />       B b = new B(c, d, e);<br />   }<br />}<br />这里类A就依赖于类B（方法返回类）、C和D（参数类）、E（方法内变量的类），因为这几个类的变化都有可能影响到类A <br /><br /></font>
		<font color="#555555">泛化是一般事物（称为超类或父类）和较特殊的事务（称为子类）之间的关系，对类来说一般就是继承了，如：public Class A extends B。一般用一个带空心箭头的实线表示泛化关系。<br /><br /></font>
		<font color="#333333">关联是一种结构关系，说明一个事物的对象与另一个事物的对象相联系。给定一个连接两各类的关联，可以从一个类的对象导航到另一个类的对象。<br />一般把关联画为连接相同或者不同的类一条实线。关联可以有方向，即导航。一般不作说明的时候，导航是双向的，不需要在线上标出箭头。大部分情况下导航是单向的，可以加一个箭头表示。<br />关联在代码中一般表示为属性，例如<br />public class A<br />{<br />private B b;<br />}<br />可以认为有一个A指向B的关联。<br />如果B也关联到A，那么它们就是双向的关联。<br />有的时候B不是A的属性，但是也可以有关联关系，例如：<br />public class A<br />{<br />public B[] getBs()<br />{...}<br />}<br />方法getBs可能去查数据库，找到A和B之间的关联关系。 <br /><br /><font color="#555555">两个类之间的简单关联表示了两个同等地位类之间的结构关系。聚合也是一种关联关系，与简单关联不同的是，它描述的是一个整体和组成部分的关系，即“has-a”关系，意思是整体对象拥有部分对象，例如学校和学生的关系。聚合的整体和部分之间在生命周期上没有什么必然的联系，部分对象可以在整体对象创建之前创建，也可以在整体对象销毁之后销毁。聚合用带一个空心菱形（整体的一端）的实线表示。<br />public Class Person<br />{...} </font><p>public Class School<br />{<br />private ArrayList students;<br />private void addStudent(Person person)<br />{<br />students.add(person);<br />}<br />}<br />组合则是比聚合更强的关联形式。组合是指带有很强的拥有有关系且整体与部分的生命周期一致的聚合关联形式。例如Windows的窗口和窗口上的菜单就是组合关系。生命周期一致指的是部分必须在组合创建的同时或者之后创建，在组合销毁之前或者同时销毁，部分的生命周期不会超 
</p><p>出组合的生命周期。组合是用带实心菱形的实线来表示。<br />public Class Menu<br />{...}<br />public Class Window<br />{<br />private Menu menu;<br />}<br />组合和聚合在代码实现上的主要差别在于生命周期的实现上，组成需要负责其部分的创建和销毁。<br />public Class School<br />{<br />public School()<br />{...}//不需要创建任何Person对象，其Students都是已有的Person对象<br />public void destroy()<br />{...}//只需要关掉School对象和断开它与自己所有的Person对象的关联即可，Person对象是不会销毁的<br />} 
</p><p>public Class Window<br />{<br />private Menu menu;<br />public Window()<br />{<br />menu = new Menu();<br />}//可以在这时候创建Menu对象，也可以在之后创建<br />public void destory()<br />{<br />menu.destory();<br />}//必须同时或者在这之前销毁关联的Menu对象<br />} 
</p><p>另外有一个差别是组合中的一个对象在同一时刻只能属于一个组成对象，而聚合的一个部分对象可以被多个整体对象聚合，例如一个学生可以在多个学校就读，而一个菜单在同一时刻只能是某个窗口内的对象。 <br /><br />实现关系就比较简单了，指的是一个类元描述了另一个类元保证实现的契约。对类来说，就是一个类实现了一个接口<br />public interface A<br />{<br />public void methodA();<br />}<br />public class B implements A<br />{<br />public void methodA()<br />{...}<br />...<br />}<br />一般在面对对象的系统中，尽可能的使用接口来减少类之间的耦合。因为接口没有实现，所以依赖于接口就不会依赖于某种具体实现，例如jdbc里的Connection和ResultSet都是接口，不同数据库厂商的实现可以不一样。<br /><br /><font color="#555555">总结一下<br />1)依赖关系：关系对象出现在局部变量或者方法的参数里，或者关系类的静态方法被调用<br />2)关联关系：关系对象出现在实例变量中<br />3)聚合关系:关系对象出现在实例变量中<br />4)合成关系：关系对象出现在实例变量中<br />5)Generalization:   extends<br />6)实现：    implements </font></p><p><font color="#555555"></font> </p><p>聚合是这样的：学生与所选课程之间的关系就是组合，他们之间在感念上没有必然关系，删掉一门课程，不会影响到学生 <br />组合是这样的：订单和订单条目的关系就是聚合，他们的关系很紧密，删掉一个订单，订单条目也就没有意义了<br />组合是聚合的一种形式</p></font>
<img src ="http://www.blogjava.net/xixuui/aggbug/125793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-06-22 11:52 <a href="http://www.blogjava.net/xixuui/archive/2007/06/22/125793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何不将jdk运行java程序</title><link>http://www.blogjava.net/xixuui/archive/2007/05/10/116449.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Thu, 10 May 2007 04:39:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/05/10/116449.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/116449.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/05/10/116449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/116449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/116449.html</trackback:ping><description><![CDATA[1、将项目打成jar包(program.jar)放在目录apps下<br />2、将jre1.5.0_10拷到apps目录下<br />3、建立program.bat，将将下面内容写入该文件<br />set path="jre1.5.0_10\bin"<br />set classpath="jre1.5.0_10\lib;jre1.5.0_10\lib\rt.jar"<br />java -cp %classpath% -jar program.jar<br />@pause<br />4、双击program.bat即可运行<img src ="http://www.blogjava.net/xixuui/aggbug/116449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-05-10 12:39 <a href="http://www.blogjava.net/xixuui/archive/2007/05/10/116449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 脚本</title><link>http://www.blogjava.net/xixuui/archive/2007/05/10/116446.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Thu, 10 May 2007 04:35:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/05/10/116446.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/116446.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/05/10/116446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/116446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/116446.html</trackback:ping><description><![CDATA[
		<p>一、shell脚本 program.sh<br />#!/bin/sh</p>
		<p>export LANG=zh_CN.GB2312</p>
		<p>/bin/echo -e "start program!" &gt;&gt; /p2p.log</p>
		<p>ps -ef|grep 'program' |grep -v grep |awk '{print $2}' |xargs -t -l kill -9</p>
		<p>nohup /usr/java/jdk1.5.0_08/bin/java -jar /apps/program.jar 1&gt;program.log&amp; <br /><br />启动时sh program.sh即可<br /><br />二、看门狗shell脚本 monitor.sh<br /><br />#!/bin/bash</p>
		<p>#注：本脚本需要以超级用户身份运行。</p>
		<p># 监测的时间间隔，秒计<br />INTERVAL=60</p>
		<p># 重启时间间隔<br />INTERVALRESTART=1</p>
		<p>#==================================================================</p>
		<p>PROGRAME=program<br />THREADNUMS=1<br />LOG=/apps/monitor.log<br />#SYSDATE=$(date)</p>
		<p>while true<br />do<br />   #echo " "<br />   #echo "**********Now begin to monitor program's status , please wait.************"<br />   #echo " "<br />   #`ulimit -c unlimited`   <br />   SYSDATE=$(date)<br />   <br />   nowps1=`ps -e | grep $PROGRAME | grep -v grep | wc -l`<br />   nowps1=`expr $nowps1`<br />    <br />   #echo "ps = $nowps1"<br />       <br />   if  [  $nowps1 -lt $THREADNUMS ]; then <br />   <br />        /usr/bin/killall -9 $PROGRAME 1&gt;/dev/null 2&gt;/dev/null<br />        echo "======================================================" &gt;&gt; $LOG<br />        echo "Restart date:" $SYSDATE &gt;&gt; $LOG<br />        echo "Program name:" $PROGRAME &gt;&gt; $LOG<br />        echo "======================================================" &gt;&gt; $LOG<br />  #sleep $INTERVALRESTART         <br />       # ./$PROGRAME 1&gt;ucfile 2&gt;ucfile<br />        /bin/sh /apps/server/p2pstart.sh<br />        echo " "<br />        echo "*******************************************************"<br />        echo "---------- Program $PROGRAME restart ----------------"<br />        echo "*******************************************************"<br />        echo " "</p>
		<p>   fi   </p>
		<p>   #echo "**********Now ended  monitor program's status !*************************"<br />   #echo " "   <br />   <br />   sleep $INTERVAL<br />   <br />done</p>
		<p>#-----------------------------------------------------------<br />exit 0</p>
		<p>如何在系统启动时启动看门狗程序：<br /></p>将/bin/sh /apps/monitor.sh加入到文件/etc/rc.local中即可，这样每次系统启动都会运行该程序以监听自己要监听的程序<img src ="http://www.blogjava.net/xixuui/aggbug/116446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-05-10 12:35 <a href="http://www.blogjava.net/xixuui/archive/2007/05/10/116446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse插件安装方法和流程</title><link>http://www.blogjava.net/xixuui/archive/2007/05/07/115693.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Mon, 07 May 2007 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/05/07/115693.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/115693.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/05/07/115693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/115693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/115693.html</trackback:ping><description><![CDATA[      一般情况下，下载后的eclipse插件解压后会有两个文件夹features和plugins，大部分人喜欢将这两个目录下的文件全部拷到eclipse安装目录下相同目录中，但是如果装的插件多，eclipse安装目录就会特别大，而且启动会特别慢。<br />       下面以swt的安装为例，简单的描述一下eclipse插件安装的流程。将下载后的文件解压到E:\\swt\\eclipse下，然后在eclipse安装目录下建一个文件夹links，新建一个swt.link的文件，文件内容为："path=E:\\swt"即可，将eclipse重启后，该插件即可生效（swt为例，即可建立swt和jface类）。<br /><br />         注：links文件夹下面可以存在多个link为后缀的文件，如：language.link,swt.link等等，eclipse启动时会从该目录下加载插件的。<br />       <br /><br /><img src ="http://www.blogjava.net/xixuui/aggbug/115693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-05-07 14:02 <a href="http://www.blogjava.net/xixuui/archive/2007/05/07/115693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作中常用的小方法集合</title><link>http://www.blogjava.net/xixuui/archive/2007/04/26/113877.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Thu, 26 Apr 2007 10:12:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2007/04/26/113877.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/113877.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2007/04/26/113877.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/113877.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/113877.html</trackback:ping><description><![CDATA[获取本机IP<br />public static String getLocalHostIp() throws SocketException<br /> {<br />  Enumeration netInterfaces = NetworkInterface.getNetworkInterfaces();<br />  while(netInterfaces.hasMoreElements())<br />  {<br />   NetworkInterface ni = (NetworkInterface)netInterfaces.nextElement();<br />   Enumeration&lt;InetAddress&gt; inetAddresses = ni.getInetAddresses();<br />   while(inetAddresses.hasMoreElements())<br />   {<br />    InetAddress ip = inetAddresses.nextElement();<br />    if(!ip.isLoopbackAddress())<br />    {<br />     return ip.getHostAddress();<br />    }<br />   }<br />  }<br />  return null;<br /> }<br /><br />获取本机MAC<br />public static String getLocalMac() throws IOException<br /> {<br />  Process p1 = Runtime.getRuntime().exec("ipconfig   /all");<br />  BufferedReader br = new BufferedReader(<br />            new InputStreamReader(<br />                  p1<br />                   .getInputStream()));<br />  String buf = br.readLine();<br />  while(buf != null)<br />  {<br />   if(buf.contains("Physical Address"))<br />   {<br />    int i = buf.indexOf("Physical Address") + 36;<br />    return buf.substring(i).trim();<br />   }<br />   buf = br.readLine();<br />  }<br />  return "000000";<br /> }<img src ="http://www.blogjava.net/xixuui/aggbug/113877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2007-04-26 18:12 <a href="http://www.blogjava.net/xixuui/archive/2007/04/26/113877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中国谎言大全!</title><link>http://www.blogjava.net/xixuui/archive/2006/12/25/89952.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Mon, 25 Dec 2006 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/12/25/89952.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/89952.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/12/25/89952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/89952.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/89952.html</trackback:ping><description><![CDATA[      <br>网站：我们是免费的。 <br>
　　电信：我们是亏损的。 <br>
　　警察：我们是为人民服务的。 <br>
　　上市公司：我们不做假报表的。 <br>
　　老板：我不会忘记你的贡献。 <br>
　　女孩：这是我第一次…… <br>
　　客车司机：准时出发。 <br>
　　公司职员：明天我就不干了。 <br>
　　商贩：大亏本、大出血、大甩卖。 <br>
　　影视明星：我们只是朋友关系。 <br>
　　公安人员：决不让任何一个犯罪分子逃脱。 <br>
　　政客；我一分钱都没收。 <br>
　　领导：下面，我简单地讲两句 <br>
　　房地产商；我们不会在面积上让你吃亏，物业收费完全合理。 <br>
　　电影海报；最精彩、最火爆、最刺激。 <br>
　　学校；决不会增加家长负担。 <br>
　　春节晚会；今年的晚会是最受观众喜欢爱的，收视率最高。 <br>
　　医生；救死扶伤是我们应该做的，绝对不是为了钱。 <br>
　　医院；抢救病人的药费都是质高价低的，不会向病人多收费的。 <br>
　　法院；我们是公证的。 <br>
　　律师；我一定为你打赢这场官司而收费合理。 <br>
　　工商税务；收上来的钱全部送到国库。 <br>
　　公交铁路；负担太重，设施太贵，所以适当的提高票价。 <br>
　　自来水公司；为了提高人们的节水意识，所以水费要涨价。 <br>
　　电力公司；煤炭太贵，成本太高，电力一直在赔钱。 <br>
　　统计数据；人均收入达到了。。。。。。 <br>
　　人均住房达到了。。。。。。 <br>
　　喉舌们；今年增加了多少多少岗位， 
　　解决了多少多少失业人员的<br><img src ="http://www.blogjava.net/xixuui/aggbug/89952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-12-25 17:46 <a href="http://www.blogjava.net/xixuui/archive/2006/12/25/89952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软笔试面试题集锦（转） </title><link>http://www.blogjava.net/xixuui/archive/2006/12/11/66748.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Mon, 11 Dec 2006 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/12/11/66748.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/66748.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/12/11/66748.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/66748.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/66748.html</trackback:ping><description><![CDATA[		<div id="header">
				<font size="2">一．最基本题型（说明：此类题型比较简单） <br /><br />1． 1到100有多少个9 <br /><br />2． 连续整数之和为1000的共有几组 <br /><br />3. U2合唱团在17分钟内得赶到演唱会场，途中必需跨过一座桥，四个人从桥的 <br />同一端出发，你得帮助他们到达另一端，天色很暗，而他们只有一只手电筒。 <br />一次同时最多可以有两人一起过桥，而过桥的时候必须持有手电筒，所以就 <br />得有人把手电筒带来带去，来回桥两端。手电筒是不能用丢的方式来传递的。 <br />四个人的步行速度各不同，若两人同行则以较慢者的速度为准。 Bono需花1 <br />分钟过桥 Edge需花2分钟过桥 Adam需花5分钟过桥 Larry需花10分钟过桥 <br />他们要如何在17分钟内过桥呢？(这是Micrsoft征聘人员时问的问题，你必须 <br />在五分钟内答出来才可能获得聘用)。 <br /><br />4．   说有一份遗产3500元一个女人的老公留下来的，如果这个女人生的是儿子那么 <br />她将分到她儿子的一半，如果是女儿，他将分得她女儿的2倍,如果这个女人生 <br />了一对，一男一女，问各得多少遗产？ <br /><br />5． 老师d的物理测验答案在教室里丢失了，今天那个教室上了5堂课，老师d上了3 <br />堂，有可能是a、b、c三个同学盗窃 <br />已知：  1、a上了两堂课 <br />        2、b上了三堂课 <br />        3、c上了四堂课 <br />        4、a、b、c每个人都上了老师d的两堂课 <br />        5、五堂课中，三个人到堂的组合各不相同 <br />        6、老师d的课中有一堂，三个人中到了两个，事后证明不是那两个人偷得 <br />问？是谁偷得 <br /><br />6． a b c d e <br />           * f <br />__________________ <br />＝g g g g g g <br />问，a b c d e f g各是什么数字（不重复） <br /><br />7． a进行一次C和D之间往返旅行，希望在整个旅行中能够达到60km/h的平均速度， <br />但是当他从C到达D的时候发现平均速度只有30km/h，问a应当怎么做才能够使 <br />这次往返旅行的平局速度到达60km/h <br /><br />8． 烧一根不均匀的绳，从头烧到尾总共需要1个小时。现在有若干条材质相同的 <br />绳子，问如何用烧绳的方法来计时一个小时十五分钟呢？ <br /><br />9． 你有一桶果冻，其中有黄色、绿色、红色三种，闭上眼睛抓取同种颜色的两个。 <br />抓取多少个就可以确定你肯定有两个同一颜色的果冻？ <br /><br />10． 如果你有无穷多的水，一个3公升的提捅，一个5公升的提捅，两只提捅形状上 <br />下都不均匀，问你如何才能准确称出4公升的水？ <br /><br />11． 一个岔路口分别通向诚实国和说谎国。来了两个人，已知一个是诚实国的，另 <br />一个是说谎国的。诚实国永远说实话，说谎国永远说谎话。现在你要去说谎国， <br />但不知道应该走哪条路，需要问这两个人。请问应该怎么问？ <br /><br />12． 12个球一个天平，现知道只有一个和其它的重量不同，问怎样称才能用三次就 <br />找到那个球。13个呢？ <br /><br />13．在9个点上画10条直线，要求每条直线上至少有三个点？ <br /><br />14．在一天的24小时之中，时钟的时针、分针和秒针完全重合在一起的时候有 <br />几次？都分别是什么时间？你怎样算出来的？ <br /><br />二．没有答案型（说明：这些题显然不是考你智力。而考的是你的反应能力。 这种题大多数没有答案，但是要看你的反应喽！） <br /><br />1．为什么下水道的盖子是圆的？ <br /><br />2．中国有多少辆汽车？ <br /><br />3．将汽车钥匙插入车门，向哪个方向旋转就可以打开车锁？ <br /><br />4．如果你要去掉中国的34个省（含自治区、直辖市和港澳特区及台湾省）中的 <br />任何一个，你会去掉哪一个，为什么？ <br /><br />5．多少个加油站才能满足中国的所有汽车？ <br /><br />6．想象你站在镜子前，请问，为什么镜子中的影象可以颠倒左右，却不能颠倒上下？ <br /><br />7．为什么在任何旅馆里，你打开热水，热水都会瞬间倾泻而出？ <br /><br />8．你怎样将Excel的用法解释给你的奶奶听？ <br /><br />9．你怎样重新改进和设计一个ATM银行自动取款机？ <br /><br />10．如果你不得不重新学习一种新的计算机语言，你打算怎样着手来开始？ <br /><br />11．如果你的生涯规划中打算在5年内受到奖励，那获取该项奖励的动机是什么？ <br />观众是谁？ <br /><br />12．如果微软告诉你，我们打算投资五百万美元来启动你的投资计划，你将开始什 <br />么样商业计划？为什么？ <br />13．如果你能够将全世界的电脑厂商集合在一个办公室里，然后告诉他们将被强迫 <br />做一件事，那件事将是什么？ <br /><br />三．难题（说明：这类题有一定难度，如果得不到答案，也不能说明什么。 如果你想到了解题思路，那么答案马上就能出来。如果想不到思路， 那么......就别想解出来了。） <br /><br />1．你让工人为你工作7天，回报是一根金条，这个金条平分成相连的7段， <br />你必须在每天结束的时候给他们一段金条。如果只允许你两次把金条弄断， <br />你如何给你的工人付费？ <br /><br />2．有一辆火车以每小时15公里的速度离开北京直奔广州，同时另一辆火车 <br />每小时20公里的速度从广州开往北京。如果有一只鸟，以30公里每小时的速 <br />度和两辆火车同时启动，从北京出发，碰到另一辆车后就向相反的方向返回 <br />去飞，就这样依次在两辆火车之间来回地飞，直到两辆火车相遇。请问，这 <br />只鸟共飞行了多长的距离？ <br /><br />3．你有四个装药丸的罐子，每个药丸都有一定的重量，被污染的药丸是没被 <br />污染的药丸的重量+1。只称量一次，如何判断哪个罐子的药被污染了？ <br /><br />4．门外三个开关分别对应室内三盏灯，线路良好，在门外控制开关时候不能 <br />看到室内灯的情况，现在只允许进门一次，确定开关和灯的对应关系？ <br /><br />5．人民币为什么只有1、2、5、10的面值？ <br /><br />6．你有两个罐子以及50个红色弹球和50个蓝色弹球，随机选出一个罐子， <br />随机选出一个弹球放入罐子，怎么给出红色弹球最大的选中机会？在你的计 <br />划里，得到红球的几率是多少？ <br /><br />四．超难题（说明：如果你是第一次看到这种题，并且以前从来没有见过类 <br />似的题型，并且能够在半个小时之内做出答案。只能说明你的智力超常......） <br /><br />第一题  五个海盗抢到了100颗宝石，每一颗都一样大小和价值连城。 <br />他们决定这么分： <br />抽签决定自己的号码（1、2、3、4、5） <br />首先，由1号提出分配方案，然后大家表决，当且仅当超过半数的人同意时， <br />按照他的方案进行分配，否则将被扔进大海喂鲨鱼如果1号死后，再由2号提 <br />出分配方案，然后剩下的4人进行表决，当且仅当超过半数的人同意时，按照 <br />他的方案进行分配，否则将被扔入大海喂鲨鱼 <br />依此类推 <br />条件：每个海盗都是很聪明的人，都能很理智地做出判断，从而做出选择。 <br />问题：第一个海盗提出怎样的分配方案才能使自己的收益最大化？ <br /><br />第二题 . 一道关于飞机加油的问题，已知： <br />每个飞机只有一个油箱， 飞机之间可以相互加油（注意是相互，没有加油机） 一箱油可供一架飞机绕地球飞半圈， <br /><br />问题： 为使至少一架飞机绕地球一圈回到起飞时的飞机场，至少需要出动几架飞机？ <br />（所有飞机从同一机场起飞，而且必须安全返回机场，不允许中途降落，中间 <br />没有飞机场） <br /><br />五．主观题（说明：在以后的工作过程中，我们可定会犯这样那样的错误。 既然错误已经酿成，损失在所难免，我们只能想办法把损失减少到最小。 如果能巧妙地回答出这些问题，再发生错误的情况下。能让客户有最少的抱 <br />怨，公司有最少的损失。） <br /><br />1．某手机厂家由于设计失误，有可能造成电池寿命比原来设计的寿命短一半 （不是冲放电时间），解决方案就是免费更换电池或给50元购买该厂家新手机 的折换券。请给所有已购买的用户写信告诉解决方案。 <br /><br />2．一高层领导在参观某博物馆时，向博物馆馆员小王要了一块明代的城砖作 为纪念，按国家规定，任何人不得将博物馆收藏品变为私有。博物馆馆长需要如何写信给这位领导，将城砖取回。 <br /><br />3．营业员小姐由于工作失误，将2万元的笔记本电脑以1.2万元错卖给李先生， <br />王小姐的经理怎么写信给李先生试图将钱要回来？ <br /><br />六.算法题（说明：这些题就不是什么花样了，考的是你的基础知识怎么样。 再聪明而没有实学的人都将会被这些题所淘汰。） <br /><br />1．链表和数组的区别在哪里？ <br /><br />2．编写实现链表排序的一种算法。说明为什么你会选择用这样的方法？ <br /><br />3．编写实现数组排序的一种算法。说明为什么你会选择用这样的方法？ <br /><br />4．编写能直接实现strstr()函数功能的代码。 <br /><br />5．编写反转字符串的程序，要求优化速度、优化空间。 <br /><br />6．在链表里如何发现循环链接？ <br /><br />7．给出洗牌的一个算法，并将洗好的牌存储在一个整形数组里。 <br /><br />8．写一个函数，检查字符是否是整数，如果是，返回其整数值。 <br />（或者：怎样只用4行代码编写出一个从字符串到长整形的函数？） <br /><br />9．给出一个函数来输出一个字符串的所有排列。 <br /><br />10．请编写实现malloc()内存分配函数功能一样的代码。 <br /><br />11．给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串 <br />B的前几个字节重叠。 <br /><br />12．怎样编写一个程序，把一个有序整数数组放到二叉树中？ <br /><br />13．怎样从顶部开始逐层打印二叉树结点数据？请编程。 <br /><br />14．怎样把一个链表掉个顺序（也就是反序，注意链表的边界条件并考虑空链表）？ <br /><br />七．几个微软技术支持中心电话面试的题目 <br /><br />1.如果只想让程序有一个实例运行，不能运行两个。象winnamp一样， 只能开一个窗口，怎么作？ <br /><br />2.如何截取键盘的响应，让所有的'a'变成'b'？ <br /><br />3.apartment在com中有什么用？为什么要引入这个？ <br /><br />4.存储过程是什么，有什么用，什么优点？ <br /><br />5.template有什么特点，什么时候用？ <br /><br />6.好像最好要了解win32sdk底层的知识。比如消息响应的过程等等。 <br /><br />7.对.net的理解，对web service的理解，对三层结构的理解 <br /><br />8.两层的负载平衡与三层结构的负载平衡有什么差别，优点 <br /><br />9.windows DNA结构的特点，优点。 </font>
		</div>
<img src ="http://www.blogjava.net/xixuui/aggbug/66748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-12-11 16:34 <a href="http://www.blogjava.net/xixuui/archive/2006/12/11/66748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最新工作流程</title><link>http://www.blogjava.net/xixuui/archive/2006/12/09/86549.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Sat, 09 Dec 2006 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/12/09/86549.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/86549.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/12/09/86549.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/86549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/86549.html</trackback:ping><description><![CDATA[通过学习TDD以及三个月来杨博的多次言传身教和他写的一些文档，得到了下面这一套工作流程：
1.       获得任务。即项目经理安排的任务。任务往往不止一项。将它们写入周工作计划表或者月工作计划表。
2.       选择任务。每天开始工作之前，将今天将要完成的任务写入工作计划列表。并选择自己最有把握完成的任务作为当前任务。
3.       分析并分解任务。将当前任务分解成一个个相对简单的问题，分解的问题最好是能在短时间之内能完成，并将它们写入工作列表。
4.       写测试列表。选择一个简单的问题(此时可以为该方法取名了)，并将所要完成的所有功能写入工作列表。这就是方法注释中的功能注释。并且将每一项功能所对应的单元测试记录下来，写入测试列表。
5.       选择测试。从测试列表中选择那个具有指导意义而且自己认为最有把握实现的一项。如：一个数值对象类，也许对我来说，实现equals()方法是最有把握的，那我就可以选择它作为我的当前测试。
6.       编写测试数据。写一个容易让人理解的必须实现的测试数据列表，尽量使用显然数据。如：用 String 表示 IP 地址 "255.255.255.255" 转换为 int ，在我们写测试数据时应这样写： (255 << 24) + (255 << 16) + (255 << 8) + 255 ，而不应该写成“ -1 ”。 
7.       编写测试。选择一项最容易让测试通过的测试数据加入测试方法。如：实现equals()方法中“比较两个不是同类的对象返回false”的测试是最容易实现的，我就可以将它加入是最容易实现的，那就先实现它吧！断言优先，然后加入为了让断言通过编译的一切准备条件。
8.       运行测试，不可运行状态。 
9.     编写功能代码，使之达到可运行状态。 
10.   重构，消除重复设计。 
11.   往测试方法中增加一个新的小测试。 
12.   运行测试，不可运行状态。 
13.   修改功能代码，使之达到可运行状态。 
14.   重构。消除重复设计。 
15.   重复 12-15 。 
16.   当无论如何也不能让该测试通过的时候，认真想一想是不是哪里出大问题了，如果实在想不出来的话，就将现有代码扔掉，重新开始。 
17.   所有测试都运行通过之后，仔细检查所有代码，看是否还有值得重构的地方，并重构。 
18.   提交 (check in) 。 
19.   再选择测试列表中的下一个测试。重复以上步骤。 
20.   当要离开工作的时间比较久时，若有某个任务未完成，则留下一个不完整测试，以便于回到工作岗位时能迅速回忆起当时写该代码时的想法，并接着写下去。 

<img src ="http://www.blogjava.net/xixuui/aggbug/86549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-12-09 16:40 <a href="http://www.blogjava.net/xixuui/archive/2006/12/09/86549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>疯狗问题</title><link>http://www.blogjava.net/xixuui/archive/2006/12/08/86397.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Fri, 08 Dec 2006 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/12/08/86397.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/86397.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/12/08/86397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/86397.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/86397.html</trackback:ping><description><![CDATA[		<br />
		<p>早上所有人去看别人的狗，晚上若能确定自己家狗是疯狗杀!(不能看自己的狗）（如看不到别人有疯狗，则自己家为疯狗）</p>
		<br />
		<br />
		<p>第一天晚上，无人杀狗。</p>
		<br />
		<br />
		<p>第二天晚上，无人杀狗。</p>
		<br />
		<br />
		<p>第三天晚上，疯狗全被杀！</p>
		<br />
		<br />
		<p>问：有几只疯狗？</p>
<img src ="http://www.blogjava.net/xixuui/aggbug/86397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-12-08 16:52 <a href="http://www.blogjava.net/xixuui/archive/2006/12/08/86397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>智力题集</title><link>http://www.blogjava.net/xixuui/archive/2006/12/08/86395.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Fri, 08 Dec 2006 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/12/08/86395.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/86395.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/12/08/86395.html#Feedback</comments><slash:comments>106</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/86395.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/86395.html</trackback:ping><description><![CDATA[以下均为自己收集的一些有趣的智力题，有兴趣的人可以一起讨论。欢迎大家一起讨论，有空我会逐个将自己认为正确的答案发布。

<img src ="http://www.blogjava.net/xixuui/aggbug/86395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-12-08 16:46 <a href="http://www.blogjava.net/xixuui/archive/2006/12/08/86395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作总结</title><link>http://www.blogjava.net/xixuui/archive/2006/12/07/85992.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Thu, 07 Dec 2006 00:57:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/12/07/85992.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/85992.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/12/07/85992.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/85992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/85992.html</trackback:ping><description><![CDATA[      三个月来，一直都在学习杨博的编程思想，也阅读了他推荐的几本好书，通过这一段时间的学习，觉得自己确实在编程方面有了比较大的提高，对编程中最为重要的两个环节（单元测试、重构）也都有了一定的了解；另外一个收获是作为一个团队的成员，应该如何与队友进行交流并表达自己的想法。<br />      现在，谈谈如何进行团队合作。首先，应该为自己定位，自己在团队中处于什么位置，应该做哪些事情？其次，当自己有什么新的想法(不管是否正确)时，一定要与团队成员进行交流。如果自己的想法是正确的，那团队就很可能采用自己的新想法；当然有的时候想法也不一定正确，但是却肯定会引起大家的讨论，也许就可能从新的想法中得到其它的什么提示，而产生另外的好的想法也不一定。<br />       接着，讲讲自己在这段时间的学习成果吧！虽然不多，但却非常有用。首先，学习了使用TDD(测试驱动开发)模式进行软件开发；其次，学习如何写好注释；另外，还学习了怎样嗅出代码中的臭味，并进行重构。<br />      <img src ="http://www.blogjava.net/xixuui/aggbug/85992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-12-07 08:57 <a href="http://www.blogjava.net/xixuui/archive/2006/12/07/85992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>日记</title><link>http://www.blogjava.net/xixuui/archive/2006/12/07/85991.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Thu, 07 Dec 2006 00:45:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/12/07/85991.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/85991.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/12/07/85991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/85991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/85991.html</trackback:ping><description><![CDATA[      不知不觉，试用期就快过了，今天老大和我们聊了聊，说会给我们一个考试，不过他的标准会比较高，希望延长我们的试用期，继续考查我们。虽然三个月来为公司做的事情并不多，但是有幸得到杨博的直接指导是我们的荣幸，因此作为个人来说，也确实学习到了很多的东西。希望能在考试的时候好好表现一个，把自己这三个月以来所学的东西全部展现出来，争取给杨博一个好的印象。<img src ="http://www.blogjava.net/xixuui/aggbug/85991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-12-07 08:45 <a href="http://www.blogjava.net/xixuui/archive/2006/12/07/85991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>