﻿<?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-Brian Sun @ 爬树的泡泡-随笔分类-软件</title><link>http://www.blogjava.net/briansun/category/436.html</link><description>&lt;marquee direction="down" scrollamount=4 height="120" align="right"&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/09/03/11884.html"&gt;关于洞穴寓言的几部电影&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/08/31/11634.html"&gt;关于AOP的七个猜想&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/07/31/8813.html"&gt;测试驱动开发全功略&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/07/21/8095.html"&gt;体验经济在软件&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/07/20/8028.html"&gt;NXUnit 中文说明&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/07/15/7765.html"&gt;发表我自己的开源软件&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/04/16/3336.html"&gt;4月16日评点IBM&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/04/04/2808.html"&gt;4月4日评点Google&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/03/27/2505.html"&gt;3月27日评点版权制度&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/03/21/2274.html"&gt;天下归一，谈EclipseCon2005&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/03/20/2270.html"&gt;软件标准的生命周期&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/03/18/2205.html"&gt;2005年度Jolt大奖&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/03/14/2067.html"&gt;3月14日评点Microsoft Office&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/03/14/2063.html"&gt;3月14日评点OMG&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/03/12/1963.html"&gt;关于UI的不同解释&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/03/07/1786.html"&gt;非理智的抗议，只为JDO&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/03/01/1597.html"&gt;关于ERP的未来&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/02/27/1534.html"&gt;有没有可能以开源软件为平台建构ERP？&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/02/26/1518.html"&gt;UI框架的组织模式&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.blogjava.net/briansun/archive/2005/02/19/1321.html"&gt;关于人工智能&lt;/a&gt;&lt;br&gt;
&lt;/marquee&gt;</description><language>zh-cn</language><lastBuildDate>Mon, 21 May 2007 02:14:42 GMT</lastBuildDate><pubDate>Mon, 21 May 2007 02:14:42 GMT</pubDate><ttl>60</ttl><item><title>XMIND与MindManager从使用者角度的差别是什么？</title><link>http://www.blogjava.net/briansun/archive/2007/05/21/118810.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Mon, 21 May 2007 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2007/05/21/118810.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/118810.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2007/05/21/118810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/118810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/118810.html</trackback:ping><description><![CDATA[<span style="font-weight: bold;">1.100%纯中文。</span><br>XMIND改变了中国人没有自己的思维导图工具的现状。国外的所有软件厂商都没有把中文版列为其发展方向之一，且在处理中文的过程中，几乎无一例外的存在Bug。使用MindManager一段时间之后的很多中国用户都发现一些Notes丢失了，一些中文变成了乱码。但XMIND没有，它是100%纯中文设计，中文处理非常稳定。以至于新加波的代理商都以&#8220;the best practice of using Chinese&#8221;为由代理XMIND。且XMIND的研发团队在国内，各类服务都比较方便。<br><br><span style="font-weight: bold;">2.适合中国人的思考方式。</span><br>XMIND不仅考虑了中文处理和中文界面，还更考虑了中国人的思维习惯。国内权威IT产品评测杂志《个人电脑》在2007年第5期中介绍了XMIND 2007，经过详细评测给出的评价之一就是&#8220;与国外的同类软件相比，XMIND2007更加符合我们的思维习惯。&#8221;<br><br><span style="font-weight: bold;">3.更易用，零学习曲线。</span><br>三个特性体现XMIND的易用性：<br><br>3.1 XMIND的过滤功能非常直观，用户可以通过图标将思维导图分成很多层，可单独查看其中的一层，是个人计划、项目管理等领域的法宝。<br><br>3.2 XMIND的图例功能非常有用，让用户再分享自己绘制的思维导图时可以方便的看到图上所用到的所有图标，以及图标的含义。有了此项功能，用户才愿意打印思维导图到纸上。<br><br>3.3 XMIND的外框功能与MindManager有很大分歧。后者认为外框的含义在于强调，所以一个外框只能加在一个分支上，但XMIND认为除了强调外，外框还应该能体现&#8220;弱分类&#8221;的功能，所以XMIND可以随意选择几个分支添加外框，相近的分支被安排在同一个外框中。<br><br><span style="font-weight: bold;">4.神奇的关联图与强大的工作簿。</span><br>XMIND允许用户将多张图放在同一个文件中，这种设计更类似于现实生活中的图纸与工作簿。用户将相同或相近主题下的图放在同一个文件中也便于与他人分享。<br><br>此外，同一个工作簿中的图可以具有一定的关联性，这是XMIND的独特创造。两张图中具备关联性的分支除了位置和关系不同外，文字和图标都是相同的。很多用户用关联图表达相同内容的不同分类法，也有很多用户用此来表达概述和详细内容之间的关系。<br><br><span style="font-weight: bold;">5.个性化窗口布局提高工作效率。</span><br>XMIND可以根据您的喜好随意改变窗体的布局，大小，层叠样式。在XMIND中可以拥有您自己的风格，将某些窗体拖拽到您认为最合适的位置和大小，或者选择打开某些窗体，关闭另一些。当您在工作簿页签栏上双击时，整个工作簿就会以最大化的样式呈现，再次双击又会回到原来的布局格式，改变灵活自如。这样，您的XMIND就可以在一台电脑上为不同个性，不同喜好的用户提供让大家都满意的布局格式和窗体效果，满足各类个性化需求，在符合各类人群使用习惯的基础上进一步提高效率。<br><br><span style="font-weight: bold;">6.兼容其它思维导图保护客户投资。</span><br>作为一款出色的思维导图软件，XMIND充分考虑到使用者已有的资源及习惯，方便的将其他格式的思维导图（如FreeMind格式和MindManager格式）导入成XMIND支持的.xmap格式，可以充分保护客户对XMIND的投资。一旦拥有XMIND，可以拥有多种思维导图软件带来的资源和信息，不必担心集成与兼容，更无需浪费时间重复劳动，给与客户极大的使用便利性。<br><br><span style="font-weight: bold;">7.降低客户的成本。</span><br>XMIND在海外市场和国内市场的零售价均不到MindManager的三分之一。提供整体解决方案的价格也远远低于MindManager。<br><br><span style="font-weight: bold;">XMIND官方网站：</span><a style="font-weight: bold;"  href="http://www.xmind.org/">http://www.xmind.org/</a><span style="font-weight: bold;">
</span><br><br>
<br><img src ="http://www.blogjava.net/briansun/aggbug/118810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2007-05-21 10:08 <a href="http://www.blogjava.net/briansun/archive/2007/05/21/118810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse在做什么</title><link>http://www.blogjava.net/briansun/archive/2007/04/18/111709.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Wed, 18 Apr 2007 10:53:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2007/04/18/111709.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/111709.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2007/04/18/111709.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/111709.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/111709.html</trackback:ping><description><![CDATA[很久没关心Eclipse基金会的动作了，只是不断在使用，不断在开发，不断在教别人使用和开发，然后就是等待Eclipse的下个版本。那么，Eclipse基金会究竟在干什么呢？我不想写篇很长的Blog了，只是随便谈谈最近的几个映像：<br><br><span style="font-weight: bold;">1。Eclipse 3.3</span><br>如果我的推算没有问题的话，今年的第三季度我们就可以拿到正式版的3.3了，3.3好像没有什么太大的动作了，我只记得3.2的时候搞了一个MDC（百万下载挑战），据说在预订一半多的时间里就实现了百万下载量。回头看看Firefox好像几乎没花什么精力下载量就达到千万级别了，不是一个类型的软件确实没法比啊。<br><br>看了3.3M6的一些表现，Forms包的外观有些改善，但是不知道有没有结构上的调整；Application扩展点的API改了很多，名字也比原来合理了，不过最近正在开发中的一些项目又要重构了，呵呵；最令人激动还是View终于可以折叠到一边了，而不是原来那样最小化了之后还占很多位置，而且最大化也更酷炫了，得益于View的新折叠方式。<br><br><span style="font-weight: bold;">2。越来越重视MacOSX</span><br>SWT 3.3的&#8220;New and Noteworthy&#8221;可以看到这个趋势。记得我去年与Sun公司的James Bai谈到Eclipse与NetBeans时，我就表达了自己的观点，好像Blog里面也有。事实上，&#8220;惯用法和外观&#8221;在MacOSX系统上的重要地位是没用过苹果电脑的人无法想象的，Eclipse在Windows确实很漂亮，但是之前的版本在MacOSX上还是远不如NetBeans的。我自己也遇到了这样的问题，我们在Windows上开发有&#8220;助记符&#8221;的问题，比如文件菜单，应该写成&#8220;文件(&amp;F)&#8221;，这样F下面有条小横线，用户按Alt-F就可以直接打开文件菜单，但是在Mac上没有这样的设计，Eclipse展示出来仍然是这样，就显得有明显从Windows移植的痕迹。除了Mac的菜单外，Mac的窗体、Mac的工具栏、Mac的任务栏、Mac的快捷键都有很多与Windows不同的地方，Eclipse要加油了啊～～<br><br>回到说SWT，3.3在MacOSX上有了不少改善，增加了TrayItem，增加了彩色鼠标指针，还改了一个reparent的bug。<br><br><span style="font-weight: bold;">3。Ajax是大方向</span><br>前段时间炒作了一条新闻，说Eclipse基金会同时发布了三款用于Ajax开发的插件，这个说法是欠妥的。因为这三个项目都是很久以前就有的，现在把他们拿到一起来说，根本原因就是为了回应现在炒作很凶的Ajax。其中&#8220;Dynamic Languages Toolkit&#8221;没什么稀奇的，NetBeans也已经做了，但我相信Eclipse在易用性方面一定又是做到最好；&#8220;Ajax Toolkit Framework&#8221;也就是ATF是三者中最红的，现在要合并进WTP了，是为Dojo、Rico、Zimbra这些API的开发人员提供集成，套用行话说，就是&#8220;Ajax开发人员终于有了自己的IDE了（欢呼+大笑）&#8221;；唯独只有&#8220;Rich Ajax Platform&#8221;（RAP）最值得一提。<br><br>这是一个与众不同的项目，非常具有前瞻性和远见性，这也是Eclipse一贯的做事风格。RAP的缩写是来自于RCP的，RCP已经家喻户晓了，很多知名项目比如Lotus Notes 8和RSSOwl都是基于RCP的，RCP的程序员也很多，&#8220;如遇危难，RCP可以将兵！&#8221;但是面对Ajax一夜来袭，很多Rich Client应用程序开始希望自己能够搬到Web上去的，可是怎么搬呢？把Java代码翻译成javascript吗？我们都知道真正伟大的程序员都是在Java平台上的，而Java程序员大都不喜欢javascript这样高效但不严谨的风格，尤其是不好调试这一项，使得javascript项目的成本随规模成几何级数递增，这种事情放在Google这样钱花不掉的公司身上还行，但是要放在小公司上就捉襟见肘了。<br><br>所以行业内的专家经过这几年的反复斟酌，得到的结论是，终极的解决方案还是要让程序员手写Java代码，出来的却是javascript效果。那如何实现这样的转变了，有两个方案。一是写一个编译器，首先给出一个限定的Java API库，只有utils包、io包、lang包的少数功能和标准控件，最好是SWT式的，大家都很习惯了，如果程序员仅用这些API（和自己编写的API）写代码，就可以被这个编译器丝毫不差的编译成javascript代码，在本地执行和在Web上执行达到相同的效果，这样完全可以调试，也可以扩展这些API。这种解决方案以Google的GWT为代表。二是写一个服务器，这样就可以用全套的Java API，但是不能用AWT和Swing，再给出一组标准控件，（最好是SWT式的，大家都很习惯了），程序员所写的Java代码其实是在服务器上运行的，服务器根据这段代码的操作，把相应的结果反馈给Client端也就是浏览器，而浏览器以javascript的方式展现和接收事件。这种解决方案的代表，就是RAP。<br><br>还要说的一点就是后者其实有个帮手，也算很多Ajax网站的诀窍，就是JSON。JSON是把一个Map（名值对组）序列化成XML的工具，如果这样解释好像没什么新奇的。。。那么好，应广大JSON粉丝的强烈要求，我把JSON的解释改成：&#8220;JSON就是一个你在服务器端把JavaObject给它，就能在浏览器端取出一个javascript object的神奇而又强大的工具，而它的实现机制，只不过是把一个Map序列化成XML&#8221;！<br><br>这两个方案有明显的差别，可以说根本不是一种技术，但是他们很可能都有前途，都是王者之道，一个齐桓公一个晋文公，都有机会成为霸主，也完全有可能鼎足而立，开发人员选择谁，完全是根据项目的情况，甚至有可能。。。开发一个联合的方案。。。把GWT封装成一个Eclipse RAP的插件。<br><br><span style="font-weight: bold;">4。看看Summer Of Code</span><br>不小心点进了Google的Summer Of Code，之前就已经关注过一些，但是好奇心还没有驱使我点Eclipse Foundation进去看，今天终于按奈不住了。。。先简单介绍一下Google SoC[http://code.google.com/soc/]，其实是这样的，很多开源软件基金会想花钱请一些比较牛的大学生来开发一些代码（这些都是最著名的开源软件，也是最肥的），但是不知道去哪里找大学生。Google的影响力比较大，所以就挑了个头，先把这些开源项目的ideas登上去，让学生们挑，学生再把自己的简历投给Google，Google安排一个统一的时间由开源组织去选，选中的学生由Google撮合双方见面或不见面开发，主要是利用了学生在暑期的80天空闲时间，然后老板把钱付给Google，Google付给学生，中间40天的时候Google还要搞个&#8220;期中考试&#8221;。。。看了一下Eclipse的ideas，挺惊讶的，虽说这不是Eclipse项目发展的主流，但是也从一定程度上显示了Eclipse的不小野心。<br><br>其中我最感兴趣的是&#8220;Eclipse Open Office Integration&#8221;，它旨在把OpenOffice.org的组件嵌入到Eclipse的编辑器中去，而在此之前，Eclipse已能方便的嵌入Microsoft Office的组件了（得益于ActiveX）。这样的功能如果能实现，对我们平时的开发也是很有好处的。另一个我感兴趣的就是&#8220;Eclipse install based manager&#8221;，现在的RCP没有自己的安装程序，只是在Eclipse的帮助文档中有一篇制作RCP Install的指南，但这是远远不够的，我花在做安装程序上的时间太多了，不值得，因为这些都是共性的工作。除此之外，我还对&#8220;RCP real-time collaboration based upon ECF and Google Talk XMPP-based messaging service&#8221;感兴趣，如果Eclipse不做，我们也要做这样的功能。最后要提到的一个好玩的功能就是&#8220;NetBeans in Eclipse&#8221;，两种插件接口对Java阵营还是不利的，如果我为NetBeans编写的插件能够跑在Eclipse上的话，那NetBeans的新特性就会都变成Eclipse的新特性了（够自私了吧！）<br><br><span style="font-weight: bold;">5。RCP仍是无冕之王</span><br>Eclipse官网的黄金位置还是留给了RCP，RCP在全球还是有大量忠实粉丝的。不久前发现汇丰银行某个分行的CRM系统是基于RCP的（客户端），不久前又发现英国一个咨询公司专门提供RCP开发的咨询业务，不久前IBM正式进入公测阶段的Lotus Notes 8/Hannover也是基于RCP的，只是为了外观重写了Workbench，不久前。。。被人发现我们的软件也是基于RCP的，而且随时提供RCP方面的咨询和培训。<br><br><span style="font-weight: bold;">6。跟Mozilla结个亲家吧</span><br>忘了提Eclipse 3.3的又一大特性了，叫做&#8220;Moziila Everywhere&#8221;，是指在任何平台上都可以创建一个Browser控件但是使用Mozilla内核（及时该平台上没有安装Firefox）。这是怎么实现的呢？其实很简单，它要求你必须安装一个xulrunner，后者是Mozilla的全部内核，包括Gecko布局引擎、Javascript解析引擎、XUL解析引擎和XPCOM，其中每样东西都足够写一本书，有了这些，仅用XUL+Javascript就可以写出一个Firefox来，Eclipse洽是利用了这个特性，用Java连接XPCOM所以创建了一个Mozilla的Browser，但是没有任何行为，包括右键菜单。<br><br>这个Browser控件和缺省的Browser控件是不一样的，我们平时见到的缺省Browser控件，在Windows上用的是IE内核，在MacOSX上用的是Safari，在Linux上。。。不知道，所以它是最最简单的浏览器，不具备任何可以定制的功能，除了显示一张HTML页面外，没有任何用处。（你该不会想用Eclipse写一个傲游出来吧）<br><br>但是Mozilla内核的浏览器控件就不同了，它意味着如果程序员平时为Firefox写插件的形式，也可以被应用到RCP应用程序上来，设想一下我们拥有一个RCP+xulrunner的平台吧，RCP接收Java扩展，xulrunner接收xul和javascript扩展，那我们的平台——要么叫Fireclipse，要么叫Eclifox——就所向披靡了。即使不利用它的可扩展性，单单就是能保证在不同平台上提供对Web应用程序的一致性展现一条，就足够臭美的了，更可以用写Eclipse插件的形式来限定浏览器的行为。。。。。。唉，刚才是不是说过一个NetBeans in Eclipse啊？把那玩意扔了吧～～<br><br><span style="font-weight: bold;">总结。</span><br><br>活活，还真是好久没有写Blog了呢。本来只想谈谈Eclipse基金会的，没想到越说越多，连MacOSX、JSON、Google、Mozilla都说了个遍，是不是说了你的偶像什么坏话，我常干这种事，直接跟我联系吧，我愿意分享我的一切感受和看法。忙了，再聊！
<br><br><span style="font-style: italic;">下一个大泡泡</span><br style="font-style: italic;"><span style="font-style: italic;">（转载本文需注明出处：Brian Sun @ 爬树的泡泡[http://www.briansun.com]）</span>
<br><br>  <img src ="http://www.blogjava.net/briansun/aggbug/111709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2007-04-18 18:53 <a href="http://www.blogjava.net/briansun/archive/2007/04/18/111709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 专业人士必备的书籍和网站列表</title><link>http://www.blogjava.net/briansun/archive/2007/04/14/110626.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Sat, 14 Apr 2007 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2007/04/14/110626.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/110626.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2007/04/14/110626.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/110626.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/110626.html</trackback:ping><description><![CDATA[<p>developerWorks里面一篇非常不错的文章，我在订阅邮件里发现的：</p>
<p><a  href="http://www.ibm.com/developerworks/cn/java/j-javares.html?ca=dwcn-newsletter-java" title="http://www.ibm.com/developerworks/cn/java/j-javares.html?ca=dwcn-newsletter-java" target="_blank">Java 专业人士必备的书籍和网站列表</a></p>
<p>摘要：</p>
<p><a name="N1005A">书籍</a></p>
<p><a name="N1005A">每个程序员都会有一些由于经常被当作专业资料参阅而磨坏的书。下列书籍应该是 Java 语言程序员的书架上必备的。书很贵，所以我有意将这份列表弄得很短，仅限于重要书籍。</a></p>
<p><a name="N10064">Thinking in Java (Bruce Eckel)</a></p>
<p><a  href="http://www.amazon.com/exec/obidos/ASIN/0131002872" target="_blank"><em>Thinking in Java, 3rd edition</em></a> （Bruce Eckel; Prentice Hall PTR，2002 年）<br>
<a  href="http://www.china-pub.com/computers/common/info.asp?id=24614" target="_blank"><em>Java 编程思想：第3版</em></a> （陈昊鹏 等译; 机械工业出版社，2005 年）<br>
Eckel 的书对于学习如何在 Java 语言环境中使用好面向对象技术极其实用。书中大量的代码样例解释了他所介绍的概念。文字出自一个并不认为
Java 技术总是正确答案的人，所以相当地实用。Eckel
具有多种语言的大量经验，还有用面向对象方式进行思考的扎实技能。本书将这些技能放到实用的 Java 语言环境中。他还在写一本新书，名为 <em>Thinking in Enterprise Java</em>。</p>
<p><a name="N10080">Effective Java (Joshua Bloch)</a></p>
<p><a  href="http://www.amazon.com/exec/obidos/ASIN/0201310058" target="_blank"> 					<em>Effective Java: Programming Language Guide</em> 				</a> （Joshua Bloch; Addison-Wesley，2001 年）<br>
<a  href="http://www.china-pub.com/computers/common/info.asp?id=8645" target="_blank"><em>Effective Java 中文版</em></a> （潘爱民 译; 机械工业出版社，2003 年）<br>
本书是理解优秀 Java 程序设计原则的最佳书籍。大多数材料从其他的 &#8220;学习 Java &#8221; 的书中根本找不到。例如，Bloch 书中关于覆盖 <code>equals()</code> 这一章是我读过的最好的参考资料之一。他也在书中包括了很实用的建议：用接口替代抽象类和灵活使用异常。Bloch 是 Sun 公司 Java 平台库的架构师，所以他透彻地了解这门语言。事实上，他编写了该语言中大量有用的库。本书必读！</p>
<p>。。。。。。</p>
<p>。。。。。。</p>
<p>。。。。。。</p><img src ="http://www.blogjava.net/briansun/aggbug/110626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2007-04-14 13:14 <a href="http://www.blogjava.net/briansun/archive/2007/04/14/110626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>芒果软件XMIND 2007</title><link>http://www.blogjava.net/briansun/archive/2007/01/16/94288.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Tue, 16 Jan 2007 11:36:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2007/01/16/94288.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/94288.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2007/01/16/94288.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/94288.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/94288.html</trackback:ping><description><![CDATA[
		<p>
				<strong>[什么是芒果软件？]</strong>
				<br />
芒果软件，全称“北京市朝阳区芒果软件研究所”，是依法成立的民办科技类非企业法人。。。。。。</p>
		<p>这个话怎么说的这么不顺啊，换种说法。芒果软件，是一群技术精英的名字，我们来自四面八方，为了一个共同的前途走到一起，开始了一款软件从创意、设计到开发、测试、上市、销售，以及未来将成为国产软件之骄傲的传奇之旅。。。。。。</p>
		<p>我们所说的这段软件，就是XMIND！它是第一款可视化思维工具，也是目前市场上唯一的同类产品。登陆我们的网站可以看到它的介绍和截图：<br /><a title="http://www.mango-software.com/" target="_blank" href="http://www.mango-software.com/">http://www.mango-software.com/</a><br />
以及免费下载beta版：<br /><a title="http://www.xmind.cn/" target="_blank" href="http://www.xmind.cn/">http://www.xmind.cn/</a></p>
		<p>
				<strong>[什么是可视化思维工具？]<br /></strong>很多管理咨询公司和培训公司，以及很多中学和大学的教师，他们在传授一类方法，或开设一门课程，题目可能是“如何提高你的工作效率”。
这类课程80％的内容是很无聊的，学员也不太喜欢，但是有20％的内容是激动人心的。我们发现这激动人心的提高工作效率的方法就是用形象的思维工具帮助思
维。比如很多管理咨询公司和培训公司会开设名为“<strong>思维导图</strong>”的课程，课上要求学员们用纸和笔把自己脑海中随时冒出来的创意随时记录下来。</p>
		<p>记录的方法是在纸的中央画一个椭圆，里面写上中心主题，从这里发散出去想，想到的内容标为分支主题，每个分支主题还可以再发散，字写在线上，线划到
哪儿都要多划一点，这样就促进了自己的思维，这种思维方式比写文章要快很多倍（如果你没试过是无法想象的快），很快你就写满了整张A3纸！</p>
		<p>即为别人培训又会做软件的我们就想到用软件来实现这一切！因为软件绘制思维导图，可以大大提高绘图制品的价值，不仅可以自己看，还可以与别人分享，
最重要的是即使修改。如果在纸上绘制的时候把一个分支错误的连接在了另一个分支的后面，就无法修改了，如果是重要的图，就必须重新绘制，但是软件就不怕
了。另外，软件还可以排版，或者将某个思维导图<strong>导出成Word/Powerpoint</strong>的格式，再进一步利用，这就延长了办公软件的流程，从用户脑子里想的到纸上打印的完全的连接了起来。</p>
		<p>作为补齐最后一公里的软件产品，可视化思维工具还是跟其它Office软件有很大的不同，首先，Word和Powerpoint几乎都是以线性的方式组织文字和内容的，这和人脑的结构有很大的不同，因为人类都是以<strong>发散的方式</strong>思
考问题的；其次，Word和Powerpoint在调整篇章结构上太繁琐也不直观，很多用户都反映，他们在写文章或制作幻灯片之前都先用XMIND列提
纲，以便于谋篇布局，然后再为每个分支填入内容，之后还可以持续优化篇章结构，完全确定了以后，再用XMIND导出成最终需要的格式，修改错别字和最后排
版。</p>
		<p>除了绘制思维导图以外，XMIND还包含了很多其它符合人类基本思维方式的图形，我们将这类图形统称为“<strong>思维图</strong>”。XMIND提供了在线更新的功能，XMIND的用户还可以从芒果软件的网站上源源不断的下载更多的思维图的种类。当然，我们只作最重要的，适合大多数人的，具有个性化的图形还是要靠用户自己用XMIND丰富的个性定制功能自己设计，并提取模版，相互交流。</p>
		<p>可视化思维工具的另一大类用途是与他人交流思想。我们有很多客户是大企业的销售经理，他们在向客户演示自己产品和服务的过程中引入了XMIND，并获得了很好的反馈效果。因为它的形状是最适合人脑思维的，所以能表达的信息也最多最精确，也最容易被别人接受。XMIND的<strong>图标库</strong>也为用户绘制的思维图提供了额外的亮点，图形+图标所具有的表达能力是非凡的。此外，咨询公司和培训公司还辅导学员们利用XMIND帮助记忆和会议记录。最后，XMIND可以将同一个主题的所有思维图<strong>整合在一个文件里</strong>，因为用户愿意将“晨会计划”、“晨会内容”、“参会人员”和“会议反馈”等主题放在一个文件里，便于发给自己的boss。</p>
		<p>上面这些就是可视化思维工具的主要功能，了解一下XMIND
2007就会发现它的功能还远远不只这些。芒果软件的宗旨就是为广大用户提供最适合思维的软件，而XMIND的宗旨就是整理您的思维、发掘您的潜意识、激
活您的创意灵感，最后，帮助您绘制漂亮的图形。让Google去搜索网络吧，我们搜索的是您的大脑！</p>
		<p>
				<strong>[谁将会是XMIND的用户？]<br /></strong>XMIND有两类大的用户群：</p>
		<p>1。高层经理、白领精英、办公室一族、政府公务员<br />
特征：每日工作用脑量很大，处在现代办公环境中，常常需要计划、决策、记录、创意、演示、与人交流等等，工作节奏很快，工作时间中使用电脑占一定比重。</p>
		<p>2。中学生、大学生、中学教师、大学教授<br />
特征：每日学习、工作用脑量很大，常常需要记录、总结、归纳、综合、交流等等，工作、学习繁忙，使用电脑占一定比重。
</p>
<img src ="http://www.blogjava.net/briansun/aggbug/94288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2007-01-16 19:36 <a href="http://www.blogjava.net/briansun/archive/2007/01/16/94288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>澄清关于芒果软件的几个问题</title><link>http://www.blogjava.net/briansun/archive/2006/09/24/71540.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Sun, 24 Sep 2006 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2006/09/24/71540.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/71540.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2006/09/24/71540.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/71540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/71540.html</trackback:ping><description><![CDATA[
		<b>[名称和商标]</b>
		<br />
		<br />我们和芒果网不是一家，一个是“芒果软件”，一个是“芒果网”；一个是“Mango Software”，一个“MangoCity”，将来也不会有商标权力上的问题，请大家放心。我们的中文全称是“北京市朝阳区芒果软件研究所”，目前的项目研发代号是“Brainy”。<br /><br /><b>[不是汉化软件]</b><br /><br />我们不是MindManager的汉化版本，也不是其它国外软件引入国内的成果。我们是完全自己开发拥有自主知识产权的软件产品。<br /><br />说起MindManager，我们不得不说它是一个强大的竞争对手，它已经得到了我们全部的重视，芒果软件的战略层视MindManager犹如百事可乐看待可口可乐一样。我们的技术目标是比MindManager做的更专业，就芒果软件目前的实力来说，这个目标是可以实现的；我们的商业目标是首先在国内站稳脚跟，因为我们是国内第一家，同时在国际市场上分得MindManager的一杯羹，进而和它平起平坐，最后超过它的市场份额。但这个目标并不表明我们是先做国内市场后做国际市场的。<br /><br /><b>[15％的问题]</b><br /><br />我们的推广材料上说“以15％的成本为用户提供15％的解决方案”，导致了很多不必要的误解。其实国内很多企业都宣称他们的解决方案是“100％的”、“完全的”或者“全套的”，我们从心底反对这种说法，这是在欺骗消费者，目前为止人类还没有一种软件能满足消费者的100％需求哪怕这种需求只是一个方面。（任何一款汽车也不行）。我们的产品是面向商业用户和教育用户的，拿前者来说，一个商业用户在办公的过程中需要一个软件来帮忙他整理思路，这是他完全可以使用Brainy，但很有可能并不仅仅使用Brainy，他用Brainy快速记录脑海中所想到的信息，用Quicktime录下自己的声音，再用Firefox通过Google搜索自己需要的图片，把图片加入到用Brainy绘制的思维导图上，再导出成Powerpoint文件，经过修改以后交给领导。<br /><br />我们所说的15％成本，其实是在说为用户在思考问题的总成本降低了85％，很多企业在提高员工的办公效率方面投资不少，但收效甚微。而国外很多学者论证过，思维导图确实是符合人的思维模式一种图形，它的效果说是说不清的，用了才知道。此外还有一层含义，是说我们的产品在面市之后，价格会很便宜。<br /><br /><b>[“符合中国人思维”的问题]</b><br /><br />很多朋友发来消息说他们期待我们能推出“符合中国人思维”的思维导图软件，我们非常感谢这些朋友的关注，但我认为这种说法不妥。首先我们要研究一下中国人和外国人的思维方式是否有不同？如果有，那么不同在哪里？我不想长篇大论，但我想说中国人和外国人思维方式的不同，是在于我们的文化，而不是我们大脑的结构。思议这种差异在我们的“芒果可视化思维工具”里是体现不出来的。<br /><br /><b>[“技术狂人”问题]</b><br /><br />很多很热心的朋友担心我们作为一个企业的方向问题。事实上，我们不是由“技术狂人”组成的，（哈哈，大笑，作狂人状），我们是一些有想法有热情而又时刻叮嘱自己保持清醒的年轻人。作为我的Blog读者的你，应该清楚这一点。我们注重市场，我们是从去年上半年开始思考这个创业方案的，但是直到今年5月份才开始着手去做。在开始创业前的一年的时间里，我们都在思考，思考市场、思考客户、思考营销、思考人员管理、思考国外的软件行业、思考国内的同行、思考产品、思考渠道、思考销售模式、思考市场合作与活动，甚至思考定价和折扣！而后，我们决定去做！事实上，我们直到现在也不是很成熟，但是让我们成熟起来的唯一途径就是大胆去做，我们已经感觉比国内的很多同行都要成熟了。<br /><br />在广泛的和朋友共享我们的创业思路的过程中，我发现了有趣的现象。当我和技术精英介绍我们项目时，他们往往担心这个东西做好了以后卖不出去，而丝毫不会担心这个产品能否面市；而当我和软件销售人员聊这个项目时，他们往往会担心这个东西做不出来，而丝毫不会担心做出来了以后能否卖的掉。这可能就是领域思维吧，当每个人谈及自己很擅长的领域时，都对我们赞不绝口，但也都表示，对他们不擅长的领域，十分担心（幸好情况不是反过来的）。我非常感谢这些朋友，也请你们相信，我们不会让你们失望！<br /><br /><b>[“盗版软件”问题]</b><br /><br />国内软件行业的版权问题确实不容乐观，作为进入这个行业的创业者，我们丝毫不会粉饰太平，也不会掩饰我们对于这个问题的担心。事实上，我们要正视这个问题，盗版是个大问题。但是担心终究要转变成一个解决问题的思路，如果你不想转行的话。我们对待这个问题有一套完整的想法，那就是“战略上轻视它，战术上重视它”！什么？具体一点？那就请听我娓娓道来。<br /><br />从战略上讲，盗版软件并不可怕，著名的Microsoft软件公司，盗版横行，据说，全中国只有3％的微软软件是正版的，但是微软公司在中国区的利润仍然很高，是全球利润最高的一个地区。国内的金山软件，其金山词霸和金山毒霸两大产品线都同时是盗版猖狂和利润丰厚的。<br /><br />从战术上讲，微软和金山这样的产品型企业为什么会在盗版横行的今天才能挣到这么多钱呢？原因有三：其一是抓大客户，主动向大客户推销，并保证大客户不在使用盗版，多数大企业尤其是跨国企业是不愿意使用盗版软件的。有些中型企业如果已经在使用盗版了，那就说明他们需要我们的产品，再可以由销售人员以赠送培训或打折的形式将正版软件推销出去。如果对方仍然执意不听，那么就只能用律师函的形式警告之，综合起来，就是“以法律为依靠，以谈判为途径，以价格为手段”。<br /><br />其二是技术反盗版，矢志不渝。上面所提到的这些手段，如果没有技术支撑就毫无疑义，你无法知道谁在用盗版，甚至给盗版软件提供正版的服务，这些没有技术上不断的进步是很有可能发生的，在这个方面，有很多做的很好的第三方技术可以被我所用，比如在线激活等等。<br /><br />其三，是商业手段和技术手段的联合使用。比如正版软件带有大量的资源光盘，这使得盗版的产品体积非常大，不易传播，很多盗版商为解决这个问题会精简产品，这违背了很多用户的意愿，导致这些用户不得不去购买正版，金山词霸就是这个策略。再比如版本混淆，很多软件产品出很多版本，每年每个系列都再出一个，盗版商往往只盗版其中的一个版本，然后以欺骗用户的方式把这个版本以多个版本发放，这使得用户常常得不到自己想要的版本，只好购买。还有一个更高级的策略就是在线升级，因为不断的更新正版软件的鉴别方法，且在升级时必须检查软件的合法性，所以导致很多用户使用了盗版软件之后不能自动更新，杀毒软件厂商，多数都是这个办法。<br /><br /><b>[“通用软件和盒装软件”问题]</b><br /><br />当我在网上公开这个想法时，很多朋友，甚至是软件界的朋友，表现出了他们对“通用软件和盒装软件”的前途的不信任感，他们认为这样的产品可能没有出路。很高兴这些朋友能够提醒我们这个问题。当我在思考该如何回答他们时，我发现可能由于一种“恨屋及乌”的作用，他们真正的想法并不是这样，而应该这样表述：“如果一种软件，仅仅通过零售渠道来销售，那么他们是没有前途的”。我非常及其已经特别的支持这种观点，因为通用和盒装软件的销售如果只有一种渠道的话，确实不太好做，况且现在个人软件零售市场还相当不健全。但是如果将它错误的表述为“通用和盒装软件没有前途”，那就大错特错了，纵观现在的软件界哪个领域不是通用软件在打头阵？哪个领域不是盒装软件的利润率最高？哪个财富500强企业不是通用和盒装软件的客户？不用说国外的微软国内的金山，单举数据库的例子就可以了，DB2主要的利润源是“通用数据库”而主要的竞争对手是Oracle的什么什么i和微软的SQL Server。<br /><br /><br />芒果软件的泡泡<br /><br /><br /><img src ="http://www.blogjava.net/briansun/aggbug/71540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2006-09-24 11:27 <a href="http://www.blogjava.net/briansun/archive/2006/09/24/71540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>芒果软件实验室 诚揽人才</title><link>http://www.blogjava.net/briansun/archive/2006/09/09/68698.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Sat, 09 Sep 2006 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2006/09/09/68698.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/68698.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2006/09/09/68698.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/68698.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/68698.html</trackback:ping><description><![CDATA[
		<p>芒果软件实验室（Mango Software Labs）是国内首家从事可视化思维工具类软件开发的机构。我们由一群技术精英组成，致力于使用先进的软件技术帮助用户真正意义上提高生产率，以15%的成本为用户提供15%的解决方案。</p>
		<p>芒果软件实验室正在研发中的项目Brainy（利用盛行于欧美，风靡于全球的思维导图理论）将会成为未来人类离之不得的全脑思维伴侣，它利用计算机软件技术和全脑思维艺术将人们的大脑和思维带入一个积极、高效的全新领域，Brainy将会在人们日常办公和生活中帮助用户增强记忆、规划写作、促进团队合作和内部沟通，在客户演示、会议记录、个人计划、项目管理、青少年教育等方面更是发挥着不可估量的作用。</p>
		<p>Brainy不能取代任何Office 办公软件，却能和当前的Office紧密集成，成为办公软件生态环境中的一员，Brainy存在的目的是为了填补用户的大脑和办公软件制品之间的鸿沟。多数用户可以在五分钟之内上手，并在第一次试用之后就离之不得。尤其对于英文区国家的从小在这种氛围中长大的用户而言更是容易接受这种理念。也正因为如此，芒果软件实验室从成立之初就把国际市场当作最重要的市场来看待。</p>
		<p>目前Brainy仍在开发阶段，芒果软件实验室需要有理想有抱负有能力有信心的“四有”技术骨干和创业精英的加盟。我们以Eclipse RCP为产品的运行平台，以测试驱动为产品的开发过程，以大量开放标准和开源软件为降低产品成本的有效手段，以全球第一的思维导图软件为产品的战略目标。</p>
		<p>芒果软件实验室在技术上重视重构和复用，在经营上重视产品化和全球化，在管理上重视“团队综合能力”和敏捷开发，实验室还会定期聘请“武林高手”现身讲座，让每位员工每周都有培训的机会，每月都有培训别人的任务，定期参加Code Review，量身订做技术课程。</p>
		<p>思想为箭，芒果做弓。一群充满激情和个性的年轻人正试图通过他们的努力去改变人们的思维方式，乃至改变整个世界。</p>
		<p>加入我们，你一定会大开眼界！</p>
		<p>
				<br />公司主页：  <a href="http://www.mango-software.com">http://www.mango-software.com</a></p>
		<p>有意者请联系（邮件请包含个人简历）：<a href="mailto:hr.mangosoft@gmail.com">hr.mangosoft@gmail.com</a></p>（申请职位请注明信息来自BlogJava,将会得到更多的关注) <br /><br /><span class="tpc_content">招聘职位1:<br />【软件设计师：RCP方向】<br /><br />职位描述：<br />通过重用Eclipse组件搭建桌面应用程序，完成所有的设计要求，将产品的易用性提高到专业水准。全部代码使用Java5.0。（同时招全职/实习研究生）<br /><br />职位要求：<br />1。精通Eclipse RCP，Eclipse插件开发，SWT/JFace架构。<br />2。精通设计模式，熟练使用重构优化软件设计。<br /><br /><br />招聘职位2：<br />【软件设计师：ODF方向】<br /><br />职位描述：<br />担任Brainy的核心模型的主要开发工作、文件格式设计、导入导出等。全部代码使用Java5.0。（同时招全职/实习研究生）<br /><br />职位要求：<br />1。了解ODF。<br />2。精通JCE者优先。<br />3。精通设计模式，熟练使用重构优化软件设计。<br />4。熟练使用Eclipse开发环境，了解测试驱动开发的开发流程。<br /><br /><br />招聘职位3：<br />【Java程序员】<br /><br />职位描述：<br />担
任Brainy项目组的开发人员，从开发开始做起，逐渐参与设计、测试、需求等环节。全面认识并使用Java5.0、Eclipse3.2、
Graphical Editing Framework、Apache Ant、Jakarta
Commons、iText、TrueZip、BouncyCastle等开发平台和编程环境。适合立志在软件行业发展的同学。（同时招全职/实习研究
生）<br /><br />职位要求：<br />1。精通Java语言。<br />2。有绘图软件开发经验者优先。<br />3。有桌面应用程序开发经验者优先。<br />4。精通设计模式，熟练使用重构优化软件设计。<br />5。熟练使用Eclipse开发环境。<br />6。了解测试驱动开发的开发流程者优先。</span><br /><p> </p><img src ="http://www.blogjava.net/briansun/aggbug/68698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2006-09-09 12:34 <a href="http://www.blogjava.net/briansun/archive/2006/09/09/68698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>诚揽人才（北京）</title><link>http://www.blogjava.net/briansun/archive/2006/08/01/61224.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Tue, 01 Aug 2006 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2006/08/01/61224.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/61224.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2006/08/01/61224.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/61224.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/61224.html</trackback:ping><description><![CDATA[
		<br />北京，创业型软件公司，走商用化产品化路线，目前正致力于开发某商务软件套件，特别需要以下人才，有意者请联系：<br /><br />Brian Sun<br /> briansun.vip@gmail.com<br /> 13811410545<br /><br />邮件请包含个人简历，欢迎暑期实习。<br /><br /><b>【软件设计师：UI方向】</b><br />兼职全职均可。<br />要求：<br />1。了解什么是轻量组件架构，熟练使用其中的一个（最好是Swing或Draw2D）。<br />2。精通GEF者优先。<br />3。了解基本的图形学算法。<br />4。精通设计模式，熟练使用重构优化软件设计。<br />工作简介：<br />使用Draw2D编写一个类似GEF的100%MVC架构，并用该架构编写并维护一个编辑器。全部代码使用Java5.0。<br />需要人数：2人<br /><b><br />【软件设计师：RCP方向】</b><br />兼职全职均可。<br />要求：<br />1。精通Eclipse RCP，Eclipse插件开发，SWT/JFace架构。<br />2。精通设计模式，熟练使用重构优化软件设计。<br />工作简介：<br />通过重用Eclipse组件搭建桌面应用程序，完成所有的设计要求，将产品的易用性提高到专业水准。可能需要对插件进行分拆、替换或重写。全部代码使用Java5.0。<br />需要人数：2人<br /><br /><b>【软件工程师：Java方向】</b><br />兼职全职均可。<br />要求：<br />1。精通Java语言，具备一定的Java5.0知识。<br />2。精通设计模式，熟练使用重构优化软件设计。<br />3。熟练使用Eclipse开发环境，了解测试驱动开发的开发流程。<br />工作简介：<br />担任某桌面应用程序的主要开放工作。<br />需要人数：2人<br /><br /><img src ="http://www.blogjava.net/briansun/aggbug/61224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2006-08-01 16:55 <a href="http://www.blogjava.net/briansun/archive/2006/08/01/61224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为茶进化</title><link>http://www.blogjava.net/briansun/archive/2006/08/01/61216.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Tue, 01 Aug 2006 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2006/08/01/61216.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/61216.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2006/08/01/61216.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/61216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/61216.html</trackback:ping><description><![CDATA[我喜欢喝咖啡，但每周最多只能喝两杯，过量饮用总是导致身体不适，尤其是胃。一个医学界的朋友告诉我这是由于中国人的胃是为茶而进化的，西方人的胃是为咖啡而进化的，所以中国人不适合多喝咖啡。由于抱有个人感情色彩，我总是试图反对她的这种观点，但苦于没有合适的理由，最近，我终于想通了这个问题。中国人喝茶的历史不过几千年，在几千年的时间里迅速的进化一个器官，即使达尔文的进化论毫无毛病可挑，这也在数学概率上难以圆说。也许这个问题刚好相反，我的意思是，反过来想就对了。事实上，是中国人在几千年的茶叶种植中不断的精选和改良品种，使得茶叶总是在向味觉和营养两个方向上发展，是中国人创造了适合中国胃的茶叶。所以，进化了的是茶，而不是胃。<br /><br />当然，这只是我的一个猜测，因为我不是医学工作者，也不是进化论专家，所以对这个问题没有发言权，而我想说的真正主体是：软件。<br /><br />在过去的20年中，人们眼睁睁看着微软从一个小企业成长为软件帝国，很多人把这种变化归功于微软的商业技巧和蛮横的霸权主义，我对这一观点十分非常以及相当的赞同，但也该想清楚的是，全世界的人们不会在短短20年中进化到额头上有个“M”，就像老虎的额头上有个“王”一样。真实的情况应该是，忠实的用户调教出了微软，而不是微软培养了广大的用户群。成功的软件总是在人们心里最痒痒的地方狠狠挠了一下。<br /><br />很多M打头的软件在易用性方面有太多值得我们学习的细节了，我们完全有理由比微软做的更好那是因为我们站在巨人的肩膀上。例如我非常喜欢的IE7，尽管它在很多方面仍然不如Firefox，但在其它一些方面却很快将成为标准，比如合并在一起的前进后退按钮，会不会又是一个进化的结果呢？又会不会对其它软件的Undo/Redo功能产生影响呢？<br /><br />在软件开发领域亦是如此。比如很多软件都需要浏览的功能，其中多数软件会选择使用一个成熟的浏览器产品来达到这个功能，IE对大家说的一句话是：“请将我嵌入您的应用程序！”，而Firefox对大家说的一句话是：“请和我一起组建您的应用程序！”人们更容易接受哪一种呢？我们同样看到的是“为软件开发人员进化”和“让软件开发人员为我们进化”两种力量。<br /><br />请将我所提及的观点同“面向”分开，我拒绝说“面向用户”，因为这会导致将责任推给用户。我建议很多软件企业（尤其是那些正在为自身软件的易用性发愁的企业——比如：用友）将内部宣传的口号改为“为用户进化”，因为这是一个动态的概念，区别于“面向用户”；也是一个自主的概念，区别于“用户驱动”。<br /><br />也许全世界最应该得到我的这些建议的是Google。Google正企图从零开始创造另一个物种，也许我应该把它比喻成中式咖啡，在这个过程中，创新并不是最重要的，无论我们要谈论的是态度还是方法。要知道，用户一时的激情只能让你一夜暴富，却不能让你称王称帝。<br /><br /><img src ="http://www.blogjava.net/briansun/aggbug/61216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2006-08-01 16:16 <a href="http://www.blogjava.net/briansun/archive/2006/08/01/61216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两件小事让我抓狂 之二：Google编程大赛疯狂掉线</title><link>http://www.blogjava.net/briansun/archive/2005/12/13/23587.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Tue, 13 Dec 2005 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/12/13/23587.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/23587.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/12/13/23587.html#Feedback</comments><slash:comments>33</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/23587.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/23587.html</trackback:ping><description><![CDATA[<P>订阅我Blog的人都知道，我小时候，编程竞赛是我的强项，这是我最引以为豪的两件事之一。尤其是“动态规划”的题目，我更是花了高一宝贵的一年去研究，并且已经多次证明我是全市（小城市）青少年中做的最好的。所以直到现在，我仍然对这类编程竞赛充满了自信。昨天和今天举行的“Google中国编程挑战赛”又让我兴奋了起来，我已经一年没这么兴奋了，说实话，我对进入Google工作不抱有什么希望，也没想过得了什么奖，只是希望能够爽一把，（倒是很想得到李开复博士的签名），就像一个游戏高手看到游戏挑战赛那样。<BR><BR>令人气氛的结果不说你们也能猜到，更可气还是态度问题，下面是我跟admin的对话：</P>
<P><EM><FONT color=#006400>briansun&gt; (To Admin) admin:我刚刚掉线的时候还剩3分钟，能否将着3分钟补回来<BR>briansun&gt; (To Admin) admin: 我已经完成了代码，但是在点Compile的时候掉线了<BR>visualage&gt; (From Admin) briansun: 报歉，不能。<BR>briansun&gt; (To Admin) admin: 我掉线的时候，系统自动log off，然后计时仍然在继续吗？<BR>visualage&gt; (From Admin) briansun: 是的。<BR>briansun&gt; (To Admin) admin: 那不是很不合理？<BR>visualage&gt; (From Admin) briansun: 我们认为这样才合理。<BR>briansun&gt; (To Admin) admin: 我后来又连续登陆了4～5次都没有成功才耽误了时间<BR>visualage&gt; (From Admin) briansun: 不然你不是可以登上来，看了题，下去做，做好再发上来？<BR>briansun&gt; (To Admin) admin: 你们为了杜绝这种情况就把一些水平高但是网络环境不好的人拒之门外？！<BR>visualage&gt; (From Admin) briansun: 首先，断线而导致来不及的人，比offline下去作弊再上来帖的人，肯定要少得多。<BR>visualage&gt; (From Admin) briansun: 其次，真正水平高的人，不会在快来不及的时候才交。<BR>briansun&gt; (To Admin) admin: 我能不能再做一次别的题目，用刚才那么多的时间？<BR>visualage&gt; (From Admin) briansun: 不可以。<BR>visualage&gt; (From Admin) briansun: 一个人只允许有一个账号。<BR>briansun&gt; (To Admin) admin: 难道公平和多少有关吗？？！！<BR>briansun&gt; (To Admin) admin: 真正水平高的人可以喝杯咖啡再来做题吧？<BR>visualage&gt; (From Admin) briansun: 真正的选手，相信不会在比赛进行当中浪费时间。<BR>briansun&gt; (To Admin) admin: 但是网络浪费了我的时间！<BR>briansun&gt; (To Admin) admin: 你们对网络质量不好的人一次机会都不给吗？<BR>briansun&gt; (To Admin) admin: 那我应该投诉Google还是TopCoder还是中国网通？<BR>visualage&gt; (From Admin) briansun: 投诉谁也没有用。<BR>briansun&gt; (To Admin) admin: 你是哪个公司的？员工号多少？我投诉你！</FONT></EM></P>
<P>之后他再也没有回复。技术问题已经使我很恼火了，居然还有态度问题！我还是上篇那句话，我可以驳倒他，但是却不能对这场比赛有任何影响，只能眼睁睁看着它继续沿着“不公平”的道路走下去。后来我看了一下论坛，多数人反映教育网容易掉线，看来有志向的大学生们是跟Google无缘了。</P>
<P>抓狂的泡泡<BR></P><img src ="http://www.blogjava.net/briansun/aggbug/23587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2005-12-13 09:40 <a href="http://www.blogjava.net/briansun/archive/2005/12/13/23587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两件小事让我抓狂 之一：Mac OSX上没有可用的双拼</title><link>http://www.blogjava.net/briansun/archive/2005/12/13/23586.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Tue, 13 Dec 2005 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/12/13/23586.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/23586.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/12/13/23586.html#Feedback</comments><slash:comments>28</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/23586.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/23586.html</trackback:ping><description><![CDATA[<P>1995年我就看上了苹果电脑，但是没有钱，也没必要买，当时的苹果电脑还很难用，高层应用和PC有很大的差异，但是现在的Mac OSX已经很好用了，很多平时在PC上赖以生存的工具都有了Mac版。简单举两个例子，凡是跟Apache/Eclipse/Mozilla/Codehaus有关的产品一般都有Mac版，GNU的产品很多都有Mac版，Microsoft的产品很多都有Mac版，凡是Mac OSX上的字处理软件，多数都有导出成Word文档的选项，以前认为我的掌上电脑（PocketPC2003）没有同步软件，最近也找到一个叫做PocketMac的东东。唯独没有的，就是双拼输入法了！事实上，Mac OSX本身带有一个双拼输入法，但是不能改码表，有点输入法常识的人都知道，双拼不能改表等于没有，因为市面上流行的码表少说也有5～8个，无论你选择哪一个，基本上只有1/8～1/5的用户可以使用。</P>
<P>但是，最令我气氛的是，国内软件除了100%PureJava的外，几乎清一色没有Mac版，但是据苹果公司的数据看，中国的苹果电脑用户并不少，这是为什么？！起初我站在软件生产厂商的立场上，觉得应该“把有限的资源投入到最广泛的市场上去”，但是随着时间的流逝我越来越感觉到这是欺负人（当然也是欺负自己），为什么呢？我有三个理由：</P>
<P>1。把应用从Windows上转移到Mac OSX上非常简单。Mac OSX的架构看起来复杂，其实很简单，就是BSD+Step，你用FreeBSD+OpenStep就可以模拟一个了，上面有GCC，还有支持老式MacOS的API，要知道，MacOS跟Windows的相似程度要大于其它任何视窗系统。</P>
<P>2。拱手把市场让给别人。Mac OSX上没有金山词霸，我只好用Google工具栏的及时翻译；Mac OSX上没有QQ，我只好用Sinomac的isQ（其实大部分时间我用iChat，这是一个Mac OSX自带的聊天工具，因为支持Jabber，所以可以跟Google Talk的用户聊天）；Mac OSX上没有Maxthon，我只好把机会留给Firefox；Mac OSX上没有FlashGet，我只好下个iGetter并且一直在用试用版；Mac OSX上没有紫光拼音，我。。。我。。。我什么办法都没的想，因为老外不会去做拼音输入法。</P>
<P>3。态度问题。抱着激励国产软件的想法，我分别给QIM（一个很好的输入法）的作者和紫光拼音的支持人员发了邮件。前者给我回了邮件，说他不懂双拼所以不做，然后我又回了邮件，告诉了他双拼的概念，任何一个有输入法常识的人都知道，双拼只要在全拼上稍稍修改就可以了，如果QIM真的全部代码都是他写的话（或者只要他理解全部代码的话），做出这样的修改不到8个小时的工作量，可是我收到的回复邮件还是说“不做”，理由居然是“...完全依赖于输入的上下文关系...”。天哪，我简直不敢相信自己的眼睛，我开始担心起自己是否有编程的天赋了，为此我特地请了一位同事——他是拼音加加的创始人之一——证明了这种说法是站不住脚的。但是我没有再给他任何回复，人家毕竟是一个人在无偿的写一个软件，即使我能在技术上驳倒他也不能“要求”他做任何事情。我突然想起来很久之前老外曾经议论过免费软件有没有服务的问题，可惜这种争议在国内毫无动静，我的同事还笑我说“国产软件连收费的都没有服务，更不要说免费的了”。真的吗？我的心巴凉巴凉的。紫光华宇更是直接了当的说不做。</P>
<P>稍有一些编程常识的人都知道，从Windows移植到Mac OSX是很简单的，稍有一些输入法常识的人都知道，从全拼到双拼的改动是很小的，可是国内同行，你们在面对上面两个常识的时候，在想什么呢？？<BR><BR>抓狂的泡泡<BR></P><img src ="http://www.blogjava.net/briansun/aggbug/23586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2005-12-13 09:35 <a href="http://www.blogjava.net/briansun/archive/2005/12/13/23586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>平台相关性与平台无关性</title><link>http://www.blogjava.net/briansun/archive/2005/11/17/20177.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Thu, 17 Nov 2005 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/11/17/20177.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/20177.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/11/17/20177.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/20177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/20177.html</trackback:ping><description><![CDATA[这是一篇写给初学者看的文章。在前一段时间的招聘软件设计师的过程中，我对每一个看似初学者的人都会问这个问题，“您觉得平台相关性和平台无关性哪个更好
一些”，呵呵（偷笑），其实这是唬人的，多数回答者都会顺着出题者假装的思路回答“我个人认为平台无关性比较好”，可是只要有点软件设计经验或是对这个问
题有所思考的人都知道其实这个问题不只两个标准答案。<br>
<br>
关于平台无关性，我不想说什么，说什么也没用。大量软件设计或软件架构以此来标榜自己的优秀和出众，其实这没什么，因为大部分平台无关性的工作不是由你来
做的。如果你正在写一个Java程序，并依照Sun的100% Pure
Java的要求来做，那么应该就是平台无关的，如果你正在写一个Eclipse应用或直接用SWT/JFace组合来写应用程序，那么也是平台无关的，如
果你喜欢C/C++，并在用wxWidget写应用程序，那么也是平台无关的，如果你实在是很牛，在依照OSGi的规范写代码，那么ok，你的程序已经可
以从微设备到大型机统统可以用。<br>
<br>
平台无关也是一个相对的概念，在多个操作系统上运行可以称为平台无关的，以往在多个不同品种的CPU上运行可以称为平台无关性，还有一件搞笑的事情，某个
公司出了一套系统，可以在Java和.NET两个平台上运行，但却只能依赖于Windows系统（因而只能依赖于x86芯片），居然还可以称平台无关性，
可见这个概念有多么混乱。我个人评价是不是平台无关的仅有一个标准，那就是——你有没有为平台无关做出贡献！如果你为了能在多个平台上跑出你的代码而做了
很多工作，那么你就可以称自己为平台无关的，而如果你仅仅依赖SWT工作，那就不能称自己为平台无关的。不过话又说回来，如果你把SWT包含在自己的软件
中，并为此出了该软件的多个版本（每个SWT的版本是一个发行包），那么你也可以称此为平台无关的，虽然这个贡献并非出自你手。<br>
<br>
平台无关也不见得总是个优点，很多系统为了坚持平台无关而牺牲了很多特性，或不必要的提高了成本。比如前几年很多系统原意搞WEB界面，导致了很多易用性
方面的问题，Cooper说Web使人机交互技术倒退了10年，的确如此。我还读过一段源码，大概是一个单机版个人软件的源码，令人惊奇的是，该软件很
小，却把很多笔墨花在了业务对象和JDBC访问层之间的一个“抽象数据存储层”，理由是便于将来移至非JDBC平台，天哪！会有多少用户有机会使用不支持
JDBC的数据库？？！！这种设计和下面一种设计是一样的效用：“为了让这段代码支持非OO语境，我决定整个软件只用一个类！”。这种追求可以用四个字来
表述就是：“过渡设计”或者“吃饱撑着”！<br>
<br>
相反，这个世界上有80％的软件是平台相关的，这没什么不能理解的。就像“民主和专制的TCO哪个高”这个问题的答案一样，如果我现在要招聘的是部门经理
或副总裁，我很可能会问这个问题。事实上是，在整个人类的发展历程中，总成本最低（即总效率最高）的几个“社会时期”，几乎全是专制，但如果你不假思索，你的
答案一定是民主！当然，平台相关也是相对的概念。<br>
<br>
说到这里，有兴趣的读者可能会说结合二者是最好的选择，我不喜欢这种说法，因为太辨证了，我喜欢的是首先考虑依赖于哪个框架，再找寻该框架的平台无关性，
如果没有必要，尽量不要为平台无关（实际上是一种优先级非常低的非功能性需求）做任何事情，但如果有必要且成本允许，再做少许考虑，最好还是能够重用开源
世界的产品。<br>
<br>
仍以OSGi为例，这个例子很好，它对Java语言本身（还不是面向对象的公共语义）非常依赖，直接依赖至VM的spec，当然也写了些代码以避开
ClassLoader的个性，即使如此，OSGi事实上实现了从微设备到大型机全套支持，借助Java的平台无关性，既没有易用性、性能和成本方面的丝
毫损失，也为上层平台提供了平台无关的环境。同样，为Mac
OSX设计的很多非常优秀的软件都没有考虑平台无关的问题，而是用在PC上再做一套的方式来解决，这些都是值得思考和借鉴的解决方案。<br>
<br>
<span style="color: rgb(128, 128, 128); font-weight: bold;">有点忙的泡泡</span><br>
<span style="color: rgb(128, 128, 128); font-weight: bold;">（转载本文需注明出处：Brian Sun @ 爬树的泡泡[http://www.briansun.com]）</span><br>
<br>
<br>
<img src ="http://www.blogjava.net/briansun/aggbug/20177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2005-11-17 09:19 <a href="http://www.blogjava.net/briansun/archive/2005/11/17/20177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于隐喻</title><link>http://www.blogjava.net/briansun/archive/2005/11/15/19925.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Tue, 15 Nov 2005 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/11/15/19925.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/19925.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/11/15/19925.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/19925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/19925.html</trackback:ping><description><![CDATA[<p>重温2005年1月期的《个人电脑》，一篇文章引起了我的思考，这篇文章的思想是说虽然每种电子产品都努力成为未来时尚，但任何电子产品都不会成为
未来时尚，因为在它们被普及之前它们就已经被淘汰了。（我认为作者是这个意思，但如果不是，请原谅）。文章以iPod为例，iPod？我没用过，但是我身
边这位同事，正在使用。</p>
<p>事实上这个世界上所有绝对创新的产品——注意，是绝对创新——都是超前的，不易被人理解的，流行不流行都是它的表面现象，它的本质是颠覆了人们之前
的某种理念。历史证明这种创新很难成功，想要举出一个伟大的发明因不合时代要求而饱受磨难的例子非常容易，找个小学生就可以了；历史证明这种创新很难成
功，但iPod不是失败者中的一员；历史证明这种创新很难成功，除非。。。。。。</p>
<p>除非什么？先看看我常说到的三个例子。</p>
<p>iPod是人类历史上的一个歹怪的东西，它违反了人们之前对MP3播放器的要求，它既不轻也不小，没有击中人们对随身听的主流需求；但是iPod引
入了另一些优点。。。可以播放很久。。。你都不知道自己想听什么。。。华丽的外观。。。等等等等；事实是iPod取得了市场的胜利，传统MP3厂商推出了
大量模仿iPod的产品也丝毫未能撼动它的地位，iPod嘲笑别人“你们不了解客户的真正需求”，抨击iPod的人则说“iPod将用户导向了一个错误的
领域，用户是缺乏理性的，他们并不了解自己的需要”，这就像辩论赛的双方，正方说反方没有读懂辩题，反方则说正方在歪曲辩题。</p>
<p>另一个例子来自Google
Talk，现在我已经基本离不开它了，虽然在几个月前我曾扬言“聊天工具我只要QQ”。Talk的出现来自对传统及时通讯工具（IM，Instant
Message）和“因特网实时聊天”工具（IRC，Internet Realtime
Chat）的反叛，这些工具经过近10年的发展已经越来越趋向复杂和娱乐化，互联网上随处可见“QQ大战MSN”之类的帖子，评价它们娱乐功能之间的差
异，但是Talk却以简洁的外观和几乎可以称为“功能不全”的软件设计杀入市场。与前一个例子相比，Talk并未取得什么可以称道的成功，但它的成功是必
然的，我有我的理由。</p>
<p>问题出在哪里？为什么会有些违反市场原理的所谓绝对的或彻底的创新取得胜利了呢？问题场出在我们的意识上。这就好比你遇到一位美女，你把她跟老婆做
了一个简单的比较后发现她比老婆更性感，但没有老婆可爱贤惠，这时美女向你表达了爱慕之心，怎么办？哈哈。我用脚趾头想一下也知道会有两种结果发生，一种
是在犹豫痛苦了很久之后终于还是回到老婆的怀抱，让美女失望即使她取得过短暂的成功，另一种可能是和老婆之间产生了越来越多的隔阂（不知道这些隔阂是从哪
来的）最后“不得不”分手，然后在痛苦了一小段时间之后又找到了新的归宿。而我要表达的观点是，这两种结果产生于两个不同的隐喻。在前一种情况里，美女向
你示意的结果是你认为她可以成为你的老婆，也就是说，她的目的是老婆，她的竞争对手是老婆，你必须在她和老婆之间作出选择。而在后一种情况里，她为自己设
定的隐喻是“情人”，她的目的是成为你生活中的另一个角色，因此你很快就接近了她并在不经意间帮助她取得了最后的胜利。</p>
<p>这个例子足够夸张了吧？再看看前面两个例子，开头那篇文章引起了我的注意，因为作者的观点是iPod的隐喻并不是一个MP3随身听，而是一个晶体管
收音机的替代品。（做惊讶状）试想人们为什么听收音机，是为了随时随地可以听到已经录制好了的节目，这些节目包括多数具有听觉享受的声音内容，并可以随意
切换，而现代收音机的缺点是这些节目不能随意组织，有时还会被地理位置影响收听品质。iPod没有地理位置的影响，节目可以随意组织，（也可以
Shuffle），更重要的是，现在的互联网和BT下载等技术已经可以很方便的找到所以你喜欢的节目，除非你喜欢某个电台的DJ，或者喜欢打热线电话参加
互动游戏，否则iPod都可以胜任。此外，我们应该对网上可以下载的声音内容越来越丰富充满信心，我之前的一个室友一直以听mp3的评书为杀时间的主要方
式。</p>
<p>我已经离不开Talk了，自从我跟一个武大的MM常用Talk聊天之后，现在跟老婆也总是用Talk聊天，Talk的好处是轻磅，速度快，窗口小，
不占空间（桌面空间和内存空间），没有乱七八糟的提示和广告。与Gmail良好集成，最近还发现它的一个好处是使用开放协议，所以在我刚买的iBook上
没有Talk我还可以用Google帐号跟Talk用户聊天（用iChat），这样又充分利用了iChat的优点。上次见到dudu（很久了）的时候还谈
起Talk，很多人认为Talk的优点在于跟Gmail的良好集成，这意味着Talk存在一个很有竞争力的隐喻：“能聊天的邮件提醒器”。如果你大部分的
网络生活都跟Gmail联系在一起，那你真的会离不开它。</p>
<p>隐喻的魅力是可以让一个不易被人理解的创意变得易于被人接受，不理解不要紧，感情上的接受是最重要的。事实上，隐喻并不是对事物表面现象的某个概括
或总结，而是对事物本质的歪曲的描述。虽然歪曲，但毕竟是体现本质的。不仅不同的隐喻可以导致不同的后果，同一个隐喻也可以导致不同的后果。最初老师在课
上讲“菜单”，很多学生都笑，“此菜单非彼菜单也”。Windows中提到的主菜单有很多，每个窗口都有一个，优点是菜单的内容与窗体（甚至窗体的内容）
相关，在同一个桌面上可以看到主菜单的比较，缺点是带来了大量的视线转移，且存在菜单被遮蔽的可能性。Mac系统上的主菜单是全局唯一的，随当前激活的窗
体的改变而改变，优点是为不会出现用户“找菜单”的局面，缺点了降低了菜单在应用程序功能中的地位，好在多数用户在从“初级”向“中级”的转变中，对菜单
的依赖越来越少，对快捷键（Mac上称“键盘迅捷”）的依赖越来越多。<br><br><font color="#808080"><strong>泡泡很久不见</strong><br></font></p><img src ="http://www.blogjava.net/briansun/aggbug/19925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2005-11-15 16:54 <a href="http://www.blogjava.net/briansun/archive/2005/11/15/19925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用例还是用案</title><link>http://www.blogjava.net/briansun/archive/2005/09/19/13397.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Mon, 19 Sep 2005 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/09/19/13397.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/13397.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/09/19/13397.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/13397.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/13397.html</trackback:ping><description><![CDATA[<P>首先要做个广告，UMLChina(<A href="http://www.umlchina.com">http://www.umlchina.com</A>)是一家致力于在国内普及UML工具和方法学的一家网站，UMLChina目前已经举办过17期公开课，第17期于上周六周日在北京举行，主讲是国内第一批该领域的先行者潘加宇，熟悉&lt;&lt;程序员&gt;&gt;的朋友们应该非常熟悉这个名字。我有幸去听了这次公开课，虽然课程的内容多数对我来说是很熟的了，但是课程的形式上还是让我感受到了一丝震惊，我已经很久没有认真听过课了（大三的时候我喜欢学校里几个教管理学的教授，挺的很认真，此后就再也没认真听过课了），但是这次为期两天的课程还是给我感觉吸取了很多能量。作为一个学生的观点，我认为能吸引学生是合格的老师的第一道门槛；作为一个老师（我偶尔也走上讲台），我认为一节课能让学生领悟到一个或两个道理就已经很了不起了，而老潘就是这种讲师。（本条广告不收费）</P>
<P>第二件事还是做广告。在上课的空余时间里，我看了&lt;&lt;UML Distilled&gt;&gt;这本书，最新的版本是第三版，里面涵盖了UML 2.0的主要内容，Martin Fowler的书我全买了，也全看了，每一本都是经典，没有一句废话。可是令我有些不爽的是这本书的翻译。这本书的翻译者和本书第二版的翻译者是同一个人，可能这位翻译者在翻译上一个版本的时候UML界的一些术语的译法还没有统一，所以用的词和我们后来看到的多数关于UML的主流文档和书籍中不太一样，为个人阅读带来了一些不便，这一版他还沿用了上一版的译法，可能是译者很满意于自己以前的作品的缘故吧。（本条广告也不收Martin Fowler的钱了）</P>
<P>最后一件事是想讨论一下这本书里的一个译法：译者把所有的Use Case都翻译成了“用案”，而不是我们闭着眼睛也能说出来的“用例”。事实上China-pub上曾经还有翻译成“用况”的，并且讨论也十分激烈。关于这个词的翻译我想了很多，（没有利用上课的时间想，呵呵），最后我还是觉得可能“用案”更贴切一些。我的理由是这样的：case一词在国内用的最多的地方一般都翻译为“案例”，主要出现领域是管理咨询业和大学教育，所以为了保持其字面意思，还是翻译成“用例”或“用案”比较好，至于“用况”，不容易让人联想起Case来，要知道技术翻译最重要的一点就是“隐喻”，任何翻译都应该保证“Use Case”和“Test Case”在本质上是一种东西，二者的差别应该体现在用途和形式上。就像男人和女人的本质都是人一样。如果Test Case能翻译成“测况”的话，那我就实在佩服这位译者的想象力和勇气了，因为“测况”很容易让人联想起“测试实况”。接下来比较“案”和“例”，因为案有书面表示的意味，与公文打叫道的工作常常被称为“文案”；而“例”既有依据的意思，又有规定的含义。我认为使用“用例”一词的译者认为用例既是一种依据也是一种规定，所以应该用“例”。但事实上使用Use Case一词的老外也许并不是这种看法，他们可能既不是想要依据，也不是想要规定（Specification），而仅仅是想要一种结构化的文档，该文档以定义角色和封装角色的目标为表现手法，很好的为需求的描述和特征的枚举提供了。所以，“案”更能表示其英文原意。而Test Case则可以翻译成“测案”，如果不舒服，就叫“测试案例”好了。下面附上&lt;&lt;国际标准汉语大词典&gt;&gt;对这两个字的分别解释。</P>
<P><FONT color=#006400>案<BR>1.长形的桌子或架起来代替桌子用的长木板：～子。～板。书～。条～。拍～而起。<BR>2.提出计划、方法和建议的文件或记录：档～。备～。议～。提～。方～。有～可查。～卷。～牍。<BR>3.事件，特指涉及法律问题的事件：惨～。血～。～件。～例。～犯。破～。<BR>4.古代有短脚盛食物的木托盘：举～齐眉（形容夫妻相敬）。</FONT></P>
<P><FONT color=#006400>例<BR>1.可以做依据的事物：～证。～题。举～。～句。～如。<BR>2.规定：～外（不按规定的，和一般情况不同的）。体～。凡～。条～。破～。发凡起～。<BR>3.按规定的，照成规进行的：～会。～假。～行公事。<BR>4.调查或统计时指合于某种条件的具有代表性的事情：事～。病～。案～。</FONT></P>
<P>我本人英语水平很烂（不是谦虚），所以对于翻译也没什么发言权，更不想跟技术翻译精英们叫板，这篇随笔仅是随便聊聊，弥补一下中秋之夜没有写blog的憾事罢了。<BR></P><img src ="http://www.blogjava.net/briansun/aggbug/13397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2005-09-19 14:37 <a href="http://www.blogjava.net/briansun/archive/2005/09/19/13397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也谈天下归一</title><link>http://www.blogjava.net/briansun/archive/2005/09/02/11844.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Fri, 02 Sep 2005 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/09/02/11844.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/11844.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/09/02/11844.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/11844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/11844.html</trackback:ping><description><![CDATA[还记得我的文章吗？http://www.blogjava.net/briansun/archive/2005/03/21/2274.html<br>
<br>
现在，有两件事情需要补充：<br>
1。我当时（3月份）的猜测已经得到证实，Borland已经宣布作为独立软件的JBuilder已经走到了它生命的尽头，下一个版本的JBuilder
（可能是2006，今年年底将发行Beta版）将建立在Eclipse的基础之上。也就是说作为Eclipse对头的JBuilder已不复存在，现在的
JBuilder将是以一组Eclipse的插件形式提供给它忠实的用户和粉丝的。<br>
<br>
2。BEA已经把AspectWerks贡献给AspectJ这个已经不是新闻了，但是直到今天我才意识到这一战略的真正含义！原本AspectJ由
IBM一手主导的情况已经被改变了（施乐已经交出了AspectJ整个开发小组，现在的领导人是IBM的Adrian
Colyer），现在的AspectJ是由IBM和BEA联合控制的产品。看看有关AspectJ
5的随便一篇报道吧，长期以来在AOP领域内的楚河汉界——语法方面和XML方面——转眼便成了一条通天大道！而AspectJ昔日的最大竞争对手今天也
手拉手肩并肩的走在了一起，就好像那些战火和硝烟只存在于日记中一样。<br>
<br>
2004年，AOP的创始人Kiczales曾有过一段访谈，大概介绍了AOP的标准化之路，其中给出了两条道路供世人选择：以AspectJ为标准，或
者，以AspectJ来制定标准，现在看来IBM和BEA已经代表人类作出了选择。想到这。。。。。。我真的无话可说了。<br>
<br>
而且，BEA的野心还不仅仅局限于此。“在开源的世界里，什么是贡献？”这个问题不好回答，但是下面这个问题要简单一些：“靠昆虫传媒的花为什么都要好看
一些？”BEA贡献出AspectWerks的代价是得到了整个AspectJ，并且它已经多次表示将在JRockit中全面支持AspectJ了！设想
一下这是什么样的局面吧，作为中间件巨头的BEA，现在已经具备了随时可以将它庞大的产品线全方位的平移到轻量级容器的路线上去了，因为它可以从虚拟机的
级别支持AOP，釜底抽薪式的对所有开源容器发起新一轮的剿匪运动！IBM怎么办？IBM也没办法啊，除了应招之外还能干什么，好在IBM的精力全在这方
面了，又有AspectJ的主控制权。再假想一下——最后一次假想，如果IBM和BEA联手转向轻量级容器。。。。。。宁可。。。不要让。。。漏网！——
嘘，小声点！<br>
<br>
写日记的泡泡<br>
<br>
<br>

<img src ="http://www.blogjava.net/briansun/aggbug/11844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2005-09-02 17:23 <a href="http://www.blogjava.net/briansun/archive/2005/09/02/11844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于AOP的七个猜想</title><link>http://www.blogjava.net/briansun/archive/2005/08/31/11634.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Wed, 31 Aug 2005 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/08/31/11634.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/11634.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/08/31/11634.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/11634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/11634.html</trackback:ping><description><![CDATA[<P><STRONG><FONT color=#ff0000>1。随处可见猜想。<BR></FONT></STRONG>在未来的软件开发过程中，AOP将以一种基础编程能力的形式出现，与OOP共同发展，成为主流开发环境的一个组成部分。而目前为止，AOP只是作为一种开发工具、或运行时代码而存在。到了那个时候，可能没有哪个产品声称：“我使用了AOP”，因为没有哪个产品没有使用AOP，就像现在没有哪个产品没有使用OOP一样。就算你的源代码中没有应用到编程语言的AOP能力，你也可能调用了某个应用了AOP的基础库。事实上，AOP之父Kiczales认为AOP可能首先在操作系统上有一定规模的应用。</P>
<P><STRONG><FONT color=#ffa500>2。语言级猜想。</FONT></STRONG><BR>AOP的真正实现是在一个特定的语言基础上的。比如数年之后，人类开始普遍使用K语言（K是J的后一个字母），K语言在语言本身上就可以编织和横切。此时AOP才得到真正的成熟，因为程序员在编写代码时可能根本不知道自己用到的是曾经的OO还是现在的AO，只有了解K语言虚拟机构造和背后实现的人才知道。但是，可能由于人固有的思维方式的问题吧，AOP仍然不会比OOP要使用的更多，甚至有可能仍然是Kiczales所提到的15% Solution！但是，从语言的角度去实现AOP也许会给人类的编程观念带来巨大的变化，这种变化就像OO所带来的一样。</P>
<P><STRONG><FONT color=#ffff00><FONT color=#a52a2a>3。存在AOD/AOA猜想。</FONT><BR></FONT></STRONG>OOP对人类的影响远不如它的两个弟弟OOA/OOD，后两者已经为整个软件开发行业带来了一次意义深远的革命，它至少使得全世界开发团队的人数扩大了10倍，开发工具和平台的复杂程度增加了10倍，完成客户某些简单要求的成本降低了90%，唯一的遗憾的是，软件开发的效率几乎没有数量级上的变化（依据《没有银弹》）。既然存在AOP，我们猜想也会存在AOD/AOA，比如会存在面向方面的重构手段，面向方面的设计模式，面向方面的最佳实践，面向方面的过程管理，以及在UML的未来版本中看到为面向方向而专门做的改进，甚至添加一个新的UML图类型。当这些东西都产生的时候，AOP才真正发展到了鼎盛时期。</P>
<P><FONT color=#008000><STRONG>4。可执行用例猜想。</STRONG></FONT><BR>AOP是一个广泛适用的充满想象空间的新技术，但是目前人们对AOP的研究方向过于狭窄，大部分声称正在研究AOP的开源项目其实是把AOP当成一个辅助工具来使用，这些项目中又有相当一部分是在做企业开发环境下的容器，他们并没有针对AOP本身进行开发。事实上，依照Jacbson的说法，AOP将直接导致软件的开发分为两种形式——对模块的开发和对用例的开发，现在的用例仅仅是图纸，必须要转变为OO代码才能执行，但是一旦有了AOP，AOP可以直接依据用例的定义，将多个不同的模块（可能来自不同的开发单位）连接起来，形成方面，而方面本身是可以执行的（语言级猜想），所以用例也就不再是图纸而是可以执行的了。这对于以UML为核心的现代软件过程来说，是个极好的信号。</P>
<P><FONT color=#ffc0cb><STRONG><FONT color=#9acd32>5。标准化猜想。</FONT><BR></STRONG></FONT>OO的成功经验告诉我们，要想取得最后的胜利，就要一致对外，统一了内部的概念，剩下的争论就只有实现问题了。我个人认为，多数OOP语言在概念上都是一致的，这种概念被语言学称之为语义，多数OOP的语义来自Smalltalk和C++这些早期尝试者，少数来自Java这种在技术的成熟期涌现出的商业产品。AOP目前还面临着这个问题。业界对AOP的标准化过程有两个猜想，一是由AspectJ领头，各大AOP实现都以AspectJ的语义作为研究问题的基本用语，设计和实现沿用现在的思路；另一个猜想是由权威组织，（开源、商业、或全球研究组织），如Eclipse/IBM/OOPSLA等等拿出一个统一的AOP语义内核，所有AOP项目都以该内核为基础开发。Java虚拟机是前一种思路的成功案例，后者则以XML为代表。</P>
<P><STRONG><FONT color=#7fffd4><FONT color=#000080>6。全静态编织猜想。</FONT><BR></FONT></STRONG>下面讨论一个实际的技术问题。时下多数AOP项目采用的编织技术无外乎两种：静态编织和动态编织。前者是指在编译前（预编译期）、编译期、和编译后编织，后者是指在运行期编织。Kiczales认为虽然没有明显的技术缺陷，但动态编织可能会面临一些发展远景的问题，他称之为“软件的演化问题”。不知道我对大师观点的理解是不是准确，我认为由于被编织的代码是在变化（发展）中的，我们总是希望这种变化对编织本身的影响最小，这时静态编织面临的问题最多就是重新编译，而动态编织可能不会那么简单。此外，全静态编织会导致另一个优点——这听起来有点奇怪——就是能力较弱，因为全静态编织继承了OO语言本身的约束，比如Java的约束和.NET之CLR的约束等等，这对于更规范的使用开发利器是大有好处的。“应该对人类准备大规模应用的每一种新工具小心钳制。”</P>
<P><FONT color=#800080><STRONG>7。AOP的诞生之迷猜想。</STRONG></FONT><BR>Kiczales先生在从事AOP的研究和开发之前也曾接触过其它对OOP的改良研究，其中包括反射和元对象技术。事实上，心平气和的说，后两者的变通能力和灵活程度都在前者之上，但是正因为如此，语言学家们认为，这些技术并不能有效的改善OOP的弊端，甚至还有可能引狼入室，带来新的“狼人问题”。后来，当Kiczales发现AOP时，他明白这才是人们真正需要的，他认为他们抓住了问题的咽喉。时至今日，AOP的实现技术已经千姿百态，百家争鸣了，但是，AOP创立之初的种种想法也在这种百花争艳中渐渐被人们遗忘，现在利用反射、元对象技术以及种种双刃剑式的技术来实现AOP的想法已经像争抢参院席位一样争夺市场的认可，这是事物的发展还是理想的倒退？AOP何时才能回归它的本原？上天为它安排的命运究竟如何，我们拭目以待。<BR><BR>最近，我和我的几个朋友正在组织一批开源斗士们合作编写AOP.NET，这是一个开源软件，在博客园上可以看到部分有关该项目的消息。但是由于种种原因，我们对一些基本的问题还没有达成共识，本文来自我对AOP的一贯看法，也是我对社团里很多问题的一个集中性回答吧。</P>
<P>开源泡泡<BR>（转载本文需注明出处：Brian Sun @ 爬树的泡泡[http://www.blogjava.net/briansun]）<BR></P><img src ="http://www.blogjava.net/briansun/aggbug/11634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2005-08-31 13:53 <a href="http://www.blogjava.net/briansun/archive/2005/08/31/11634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试驱动开发全功略</title><link>http://www.blogjava.net/briansun/archive/2005/07/31/8813.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Sat, 30 Jul 2005 18:08:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/07/31/8813.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/8813.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/07/31/8813.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/8813.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/8813.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: {关键字}<br>测试驱动开发/Test Driven Development/TDD<br>测试用例/TestCase/TC<br>设计/Design<br>重构/Refactoring<br><br>{目录}<br>TDD的目标<br>TDD的优点<br>TDD的步骤<br>FAQ<br>Best Practise<br>关于单元测试<br>实例：Fibonacci数列<br>关于本文的写作<br>后记：Martin Fowler在中国<br>鸣谢<br><br>什么时候重构？<br>什么时候设计？<br>什么时候增加新的TestCase？<br>TestCase该怎么写？<br>TDD能帮助我消除Bug吗？<br>我该为一个Feature编写TestCase还是为一个类编写TestCase？<br>什么时候应该将全部测试都运行一遍？<br>什么时候改进一个TestCase？<br>。。。。。。<br><br>（转载本文需注明出处：Brian Sun @ 爬树的泡泡[http://www.briansun.com]）&nbsp;&nbsp;<a href='http://www.blogjava.net/briansun/archive/2005/07/31/8813.html'>阅读全文</a><img src ="http://www.blogjava.net/briansun/aggbug/8813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2005-07-31 02:08 <a href="http://www.blogjava.net/briansun/archive/2005/07/31/8813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>好书推荐&amp;lt&amp;lt About Face 2.0 &amp;gt&amp;gt</title><link>http://www.blogjava.net/briansun/archive/2005/07/29/8734.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Fri, 29 Jul 2005 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/07/29/8734.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/8734.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/07/29/8734.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/8734.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/8734.html</trackback:ping><description><![CDATA[<span style="font-weight: bold;">英文名：About Face 2.0 - The Essentials Of Interaction Design</span><br style="font-weight: bold;">
<span style="font-weight: bold;">中文名：软件观念革命——交互设计精髓</span><br>
<br style="font-weight: bold;"><span style="font-weight: bold;">
作者：Alan Cooper，Robert M. Reimann</span><br>
<br>
<span style="font-weight: bold;">泡泡的评价：</span><br>
本书第一版几乎引发了一张全球软件界的革命，然而这次革命的影响却由于种种原因未能在今天的多数软件中体现，这不是人类的悲哀，这是我们要为之奋斗的事
业。自从我们选择入了软件这一行，我们就有义务为用户提供经过出色设计的软件，可尽管如此，我们当中仍然有很多人根本不知道什么叫设计。本书的作者
Alan Cooper为微软拿到了为数不多的几个Jolt大奖中的一个——Visual
Basic2.0，也为我们提供了为数不多的几本好书中的一本——About
Face2.0。我们崇拜大师，并不因为他们是上帝，而是因为他们是上帝的布道者；我们渴望设计，并不因为设计代表一切，而是因为一切都依靠设计。书的扉
页上写着：“因为设计，所以出色”。<br>
<br>
<span style="font-weight: bold;">China-pub的简介：</span><br>
本书是一本由一位在交互设计前沿有着10年设计咨询经验及25年计算机工业界经验的卓越权威撰写的设计数字化产品行为的启蒙书。它探索了一个独特的设计领
域，即复杂系统行为的设计——特别是软件激活技术。本书论述一种具有革命意义的设计观念——人类驱动设计过程。
本书是一本难得的大师经典之作，应该是一本产品规划师、界面设计师以及可用性工程职业人员或者程序员都想得到的书。<br>
<br>
<span style="font-weight: bold;">目录：</span><br>
<br>
第一篇 了解你的用户<br>
<br>
&nbsp;&nbsp; &nbsp;第一部分 弥合差距<br>
&nbsp;&nbsp; &nbsp;1 目标导向设计<br>
&nbsp;&nbsp; &nbsp;2 实现模型和心智模型<br>
&nbsp;&nbsp; &nbsp;3 新手. 专家和中间用户<br>
&nbsp;&nbsp; &nbsp;4 理解用户：定性研究<br>
&nbsp;&nbsp; &nbsp;5 用户建模：人物角色和目标<br>
&nbsp;&nbsp; &nbsp;6 脚本提纲：将目标转换为设计<br>
&nbsp;&nbsp; &nbsp;7 综合好的设计：原理和模式<br>
<br>
第二篇 设计行为和形式<br>
<br>
&nbsp;&nbsp; &nbsp;第二部分 除去障碍，达到目标<br>
&nbsp;&nbsp; &nbsp;8 软件姿态<br>
&nbsp;&nbsp; &nbsp;9 和谐与流<br>
&nbsp;&nbsp; &nbsp;10 消除附加工作<br>
&nbsp;&nbsp; &nbsp;11 导航和调整<br>
&nbsp;&nbsp; &nbsp;12 理解撤销<br>
&nbsp;&nbsp; &nbsp;13 重新思考“ Files ”和“ Save ”<br>
<br>
&nbsp;&nbsp; &nbsp;第三部分 提供高效能和愉悦<br>
&nbsp;&nbsp; &nbsp;14 设计体贴的软件<br>
&nbsp;&nbsp; &nbsp;15 设计智能的软件<br>
&nbsp;&nbsp; &nbsp;16 改进数据检索<br>
&nbsp;&nbsp; &nbsp;17 改进数据输入<br>
&nbsp;&nbsp; &nbsp;18 为不同的需要进行设计<br>
<br>
&nbsp;&nbsp; &nbsp;第四部分 应用视觉设计原理<br>
&nbsp;&nbsp; &nbsp;19 外观设计<br>
&nbsp;&nbsp; &nbsp;20 隐喻. 习惯用法和启示<br>
<br>
第三篇 交互细节<br>
<br>
&nbsp;&nbsp; &nbsp;第五部分 鼠标和操作<br>
&nbsp;&nbsp; &nbsp;21 直接操作和定点设备<br>
&nbsp;&nbsp; &nbsp;22 选 择<br>
&nbsp;&nbsp; &nbsp;23 拖 放<br>
&nbsp;&nbsp; &nbsp;24 操作控件. 对象和连接<br>
<br>
&nbsp;&nbsp; &nbsp;第六部分 控件及其行为<br>
&nbsp;&nbsp; &nbsp;25 窗口行为<br>
&nbsp;&nbsp; &nbsp;26 使用控件<br>
&nbsp;&nbsp; &nbsp;27 菜单：教学向量<br>
&nbsp;&nbsp; &nbsp;28 使用菜单<br>
&nbsp;&nbsp; &nbsp;29 使用工具条和工具提示<br>
&nbsp;&nbsp; &nbsp;30 使用对话框<br>
&nbsp;&nbsp; &nbsp;31 对话框礼节<br>
&nbsp;&nbsp; &nbsp;32 创建更好的控件<br>
<br>
&nbsp;&nbsp; &nbsp;第七部分 与用户的交流<br>
&nbsp;&nbsp; &nbsp;33 消除错误<br>
&nbsp;&nbsp; &nbsp;34 通知和确认<br>
&nbsp;&nbsp; &nbsp;35 与用户的其他交流方式<br>
&nbsp;&nbsp; &nbsp;36 安装过程<br>
<br>
&nbsp;&nbsp; &nbsp;第八部分 超越桌面的设计<br>
&nbsp;&nbsp; &nbsp;37 Web 设计<br>
&nbsp;&nbsp; &nbsp;38 嵌入式系统的设计<br>
<br>
<img src ="http://www.blogjava.net/briansun/aggbug/8734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2005-07-29 13:29 <a href="http://www.blogjava.net/briansun/archive/2005/07/29/8734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>哪些是rup必须要有的制品</title><link>http://www.blogjava.net/briansun/archive/2005/07/22/8165.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Fri, 22 Jul 2005 01:46:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/07/22/8165.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/8165.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/07/22/8165.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/8165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/8165.html</trackback:ping><description><![CDATA[<BR><SPAN style="FONT-WEIGHT: bold">1。项目概述</SPAN><BR>简单的说就是“WHAT IS”。向任何对该项目感兴趣的角色传达这些基本的必要的信息。<BR><BR style="FONT-WEIGHT: bold"><SPAN style="FONT-WEIGHT: bold">2。风险列表</SPAN><BR>以头脑风暴的方式列出项目可能遇到的所有风险。风险列表一定要是客观的，既不能推卸责任也不能表决心献殷勤，要实事求是。<BR><BR><SPAN style="FONT-WEIGHT: bold">3。用例</SPAN><BR>需求的规范表现形式。用例并不一定要用UML用例图来表示，但是颗粒度是用例最难以把握的问题之一。<BR><BR><SPAN style="FONT-WEIGHT: bold">4。设计图</SPAN><BR>通常用于总体设计，可以是UML图，也可以是CRC卡，还可以是更灵活的一些东西，视项目组成员的习惯和水平而定。<BR><BR><SPAN style="FONT-WEIGHT: bold">5。构建工具</SPAN><BR>如Ant脚本，目的是实现每日构建。<BR><BR><SPAN style="FONT-WEIGHT: bold">6。版本管理</SPAN><BR>悲观锁如VSS或乐观锁如CVS/SVN，都无所谓，关键是要能管理不同的分支和历史工作成果。<BR><BR><SPAN style="FONT-WEIGHT: bold">7。测试用例</SPAN><BR>按TDD的说法，测试用例应该打成包，随产品已经发布，这样在每次修改代码之后或发布一个新版本之前都可以确保之前的代码仍然是有效的。<BR><BR><SPAN style="FONT-WEIGHT: bold">8。产品</SPAN><BR>包括二进制发布包和所有导致该发布包的源代码或原始配置文件。<BR><BR><SPAN style="FONT-WEIGHT: bold">9。发布说明</SPAN><BR>简述这一版与上一版的不同。当然还要包括版权声明、其它商品的版权声明、和许可证。<BR><BR><SPAN style="FONT-WEIGHT: bold">10。开发计划和迭代计划</SPAN><BR>项目过程中产生的制品，为日后开发其它项目提供参考资料。<BR><BR>RUP泡泡<BR><BR><img src ="http://www.blogjava.net/briansun/aggbug/8165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2005-07-22 09:46 <a href="http://www.blogjava.net/briansun/archive/2005/07/22/8165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>体验经济在软件</title><link>http://www.blogjava.net/briansun/archive/2005/07/21/8095.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Thu, 21 Jul 2005 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/07/21/8095.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/8095.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/07/21/8095.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/8095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/8095.html</trackback:ping><description><![CDATA[<P>近100年来美国经济学界和管理学界的主流理论和理论框架，都会或多或少的在其它领域的主流理论和理论框架中产生映射，这是很多主修经管专业的学生改行进入其它领域后总的心得。在下不才，也是其中一员，并且也有一点自己的心得。</P>
<P>最近十年管理学界对体验经济的理论层出不穷，形成理论界的一大热点。总的来说，体验经济是将未来的经济模式，同产品经济、商品经济和服务经济相区别，对这个概念不了解的朋友可以先看一个写在《体验经济》一书扉页上的这个案例：</P>
<P><FONT color=#008000>Rebecca的妈妈小时候过生日，Rebecca的奶奶自己亲手做蛋糕为她庆祝，她的原料比如奶油、鸡蛋、面粉等等都是从邻街的小店里面一美分一美分买来的。Rebecca小时候过生日，妈妈打电话给附近的一家蛋糕店，蛋糕店立即送来的美味可口的蛋糕，这样Rebecca可以请邻居家的小孩来过Party，这个蛋糕只要花十几美元。现在Rebecca的女儿过生日，Rebecca将整个生日交给Disney公司去办，公司的姐姐们带Rebecca的女儿和她的小伙伴们去城郊的一个小山坡野营。在那里，孩子们学会了自己搭帐篷，挤牛奶，采野生的葡萄酿酒，整理破旧的茅草屋。在一天的猎奇旅程之后，公司送每一位孩子回家，Rebecca付给了他们一张$146的支票。</FONT></P>
<P>尽管体验经济首先是在餐饮、旅游、娱乐、零售等行业首先发展并扩散开来，但是我相信，它迟早会在软件领域展露头角。我的这种想法由来已久，在最近一段时间里这个想法被激发，导致我写这篇文章，我认为体验经济至少应该在下面四个方面对软件界有所帮助：</P>
<P><FONT color=#ff0000><STRONG>1）近似帮助的导航。</STRONG></FONT><BR>如果你还没有下载Eclipse 3.1，那么你还不能真真了解我的意思。看看Eclipse的Million Downloads Challenge吧，3.1版正式版推出的第一天全球下载量就接近20万份，这绝不是宣传的效果，而是全世界的软件开发人员和关注软件界成长的人们共同的精神支柱。3.1版在易用性上又有大幅度的提高，随处可见的Html风格的说明信息，从一个对话框到另一个对话框的“超链接”，首选项的搜索与过滤，首选项的编辑导航（前进、后退等），FastView可以变成内嵌Frame，任意输入框里的工具条，任意输入框里的感叹号、问号和小红叉，等等等等，无一不在3.0版已经很“花里胡梢”的界面上再“锦上添花”。并且，知道内情的人都知道，这些对用户眼球产生极大刺激的小技量，对于Eclipse来说是多么的轻而易举。这么说吧，这些东西放在你的应用程序里面叫做“特性”，放在Eclipse里面叫做“对特性的应用”。</P>
<P><FONT color=#ffa500><STRONG>2）软件为什么不能用画的。<BR></STRONG></FONT>既然标准控件可以拖到窗体里变成代码，为什么用户不能用笔画一些代码出来呢？我想未来的软件应该会以某种“更自由”的方式向用户提供体验。比如，用户可以画一个圆作为输入框；用户可以画一条线来表示状态条；用户可以画一个图标或写一个单词，再和一个程序定义好的Action建立链接；用户可以画一个小人提供导航；用户可以规定什么样的状态用什么样的符号表示；用户还可以规定在哪里可以显示固定的及时帮助，什么时候可以显示浮动的及时帮助；最后，用户被要求画一个区域（可能是不规则的多边形）来把刚才画的那些东西装进入，这个区域就是我们所说的窗体（想想很多播放器都支持不规则的图形作为skin）。</P>
<P><FONT color=#008000><STRONG>3）同时面对新手和熟练工人。</STRONG><BR></FONT>关于气泡式的及时帮助，业界有很多的争议，这些争议大都来自不同领域的不同需求。比如一个面向客户的财务系统，开发者可能希望随时随地都能让使用者知道下一步该怎么办（或者这一步该怎么办），可是一个面向企业内部的财务系统，投资商则更愿意花费少许培训费用来使该系统的使用者更加熟练，这些费用可能会比在软件中加入大量的帮助更为经济，更重要的是，去除这些气泡往往会提高使用者的效率，给企业带来更多的好处。所以体验经济要求我们的软件理念能在两种模式之间自由切换，甚至可能会同时体现在同一个系统上，比如某个在线游戏，新手希望能随时随地得到提示，而老玩家则希望在某个选项页上关掉这些提示——以速度取胜。</P>
<P><FONT color=#800080><STRONG>4）功能微调和界面微调。</STRONG></FONT><BR>多数软件已经开始向Extendable转变了，少数精英已经开始向Pluginable（这是我自己造的词，被画上红线别怪我，呵呵）转变了。有图形处理和媒体制作软件，如Photoshop、Fireworks、Flash，有开发工具IDE，如Eclipse、SharpDevelop，有浏览器如Firefox，有小工具如我正在使用的EmEditor等等，在SourceForge的排行榜第一名上待了很久不愿下来的Azureus - Java BitTorrent Client也是Pluginable的。更有令人惊奇的，有一个叫Java Plugin Framework(JPF)的项目可以为所有Java软件增加Pluginable的能力，这个项目吸收了Eclipse的思想，但是比Eclipse的插件平台更通用，更具扩展性，也更严格。至于界面上的微调，Eclipse也为我们作出了榜样，它可以允许成千上万个View和Editor并存在同一个窗体里，并提供了最大化、最小化、FastView、内部Frame等多种展现形式，（意思是说它们不会太挤），甚至可以在界面上搜索和过滤这些parts，这样做的主要目的是将用户工作中能遇到的交互事件划分成更细小的颗粒。我认为未来的软件能让用户在更小的颗粒度上调整UI，比如某个用户会在用软件时自言自语：“这个的Label我不喜欢，我要变成Icon；那里有个Table太繁琐了，换个饼图看看；哦，对了，这里有个讨厌的文字框，小样儿，我早就看你不爽了，干掉，直接写进log吧！”</P>
<P>在本文的最后我还要告诉大家的是，虽然很多软件用XP结尾来标称自己是“用户体验版”，比如Windows xp和Office xp，但是我仍然认为体验经济的时代要求未能很好的表现在当前的主流应用中，无论是操作系统、办公软件、在线应用，或者ERP，但是我们已经可以在一些游戏、及时消息软件或大师作品中看到一点希望。重复本文开头时的论点，我相信体验经济在软件的时代即将到来，如果您手上正在做的软件没有考虑这一点，那么还是请考虑一下吧，我们都不希望在这次浪潮中国产软件再次落后，如果要我给出一个理由来支撑我的观点，那我只想说——这是经济学的规律。<BR><BR>（转载本文需注明出处：Brian Sun @ 爬树的泡泡[http://www.blogjava.net/briansun]）<BR></P><img src ="http://www.blogjava.net/briansun/aggbug/8095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2005-07-21 10:38 <a href="http://www.blogjava.net/briansun/archive/2005/07/21/8095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NXUnit 中文说明</title><link>http://www.blogjava.net/briansun/archive/2005/07/20/8028.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Wed, 20 Jul 2005 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/07/20/8028.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/8028.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/07/20/8028.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/8028.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/8028.html</trackback:ping><description><![CDATA[<a href="http://nxunit.sourceforge.net">NXUnit</a>是一个基于.NET
Framework的具有NUnit风格的XML单元测试框架。它是对NUnit的一个扩展，使你可以简单的在XML应用程序中加入断言，使你可以集中精
力在你的XML应用程序中的业务逻辑，使你提升测试驱动开发(TDD)的技巧，使你可以直接比较两个XML字符串或流，或者断言它们相等，就像使用
xUnit断言两个整数是否相等一样简单。如果没有NXUnit，你就必须把注意力集中在XML字符串中的空格、空节点、空属性、节点序、属性序、注释等
等。在某些方面，NXUnit有些像XmlUnit。<br>
<br>
NXUnit的当前版本是2005年7月的<a href="http://www.sourceforge.net/projects/nxunit">NXUnit 1.0rc1</a>，下面是该版本的8个特性，这些特性你都可以在XMLAssert类中找到相应的方法：<br>
1。断言两个XML输入是否相等。<br>
2。比较两个XML输入并找出它们的不同点。<br>
3。断言两个XML输入的XML定义是否相等。<br>
4。断言两个XML输入的文档类型是否相等。<br>
5。断言一个XML输入是否有效。<br>
6。断言一个XPath表达式在一个XML输入上执行返回的值是否是期望值。<br>
7。断言一个XPath表达式在一个XML输入上是否存在。<br>
8。断言一个XML输入是否包含另一个XML输入。<br>
<br>
并且，你可以改变一个XMLAssert实例的属性来配置一个断言或比较，目的在于：<br>
1。忽略节点和属性名称中的大小写。<br>
2。忽略XML注释。<br>
3。忽略XML定义或文档类型。<br>
4。忽略空的节点或属性。<br>
5。忽略节点和属性的顺序。<br>
6。忽略不重要的空白。<br>
<br>
<img src ="http://www.blogjava.net/briansun/aggbug/8028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/briansun/" target="_blank">Brian Sun</a> 2005-07-20 10:09 <a href="http://www.blogjava.net/briansun/archive/2005/07/20/8028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BlogJava的开源软件：NXUnit</title><link>http://www.blogjava.net/briansun/archive/2005/07/15/7765.html</link><dc:creator>Brian Sun</dc:creator><author>Brian Sun</author><pubDate>Fri, 15 Jul 2005 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/briansun/archive/2005/07/15/7765.html</guid><wfw:comment>http://www.blogjava.net/briansun/comments/7765.html</wfw:comment><comments>http://www.blogjava.net/briansun/archive/2005/07/15/7765.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/briansun/comments/commentRss/7765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/briansun/services/trackbacks/7765.html</trackback:ping><description><![CDATA[<P><FONT face="Courier New" size=5><STRONG>What is NXUnit?</STRONG></FONT></P>
<P><A href="http://nxunit.sourceforge.net/">NXUnit</A> is a NUnit -style unit testing framework about XML for .NET Framework. It is an extension to NUnit. It brings you the ability to do unit testing easily in XML applications. It helps you to concentrate on business logic of your XML application and improve your Test Driven Development(TDD) technics. You can directly compare one XML string or stream with another, er assert that they are equal, just like doing the same thing to two integers using xUnit. But without NXUnit, you must pay attention to whitespaces in XML strings, empty elements or attributes, unimportant order of elements or attributes, unneccessary comments and so on. It's similar with XmlUnit in some aspects.</P>
<P><FONT face="Courier New" size=5><STRONG>Features</STRONG></FONT></P>
<P>The current version is <A href="http://www.sourceforge.net/projects/nxunit">NXUnit 1.0rc1, July 2005</A>. The following is the 8 features of this version, which you can find in the facade class XMLAssert:</P>
<P>&nbsp;&nbsp;&nbsp; * Assert that two XML inputs are equal.<BR>&nbsp;&nbsp;&nbsp; * Compare two XML inputs and find all differences between them.<BR>&nbsp;&nbsp;&nbsp; * Assert that declarations of two XML inputs are equal.<BR>&nbsp;&nbsp;&nbsp; * Assert that document types of two XML inputs are equal.<BR>&nbsp;&nbsp;&nbsp; * Assert the validity of an XML input.<BR>&nbsp;&nbsp;&nbsp; * Assert that the evaluation of an XPath expression on an XML input will return the expected value.<BR>&nbsp;&nbsp;&nbsp; * Assert that an XPath expression exists for an XML input.<BR>&nbsp;&nbsp;&nbsp; * Assert that an XML input is included by another. </P>
<P>And you can change the properties of an instance of XMLAssert before an assertion or comparition, in order to:</P>
<P>&nbsp;&nbsp;&nbsp; * Ignore the case of the elements' and attributes' names<BR>&nbsp;&nbsp;&nbsp; * Ignore XML comments<BR>&nbsp;&nbsp;&nbsp; * Ignore XML declarations and document types of both inputs<BR>&nbsp;&nbsp;&nbsp; * Ignore empty elements and attributes<BR>&nbsp;&nbsp;&nbsp; * Ignore orders of elements and attributes<BR>&nbsp;&nbsp;&nbsp; * Ignore unimportant whitespaces</P>
<P><FONT face="Courier New" size=5><STRONG>Sample<BR></STRONG><FONT size=3><FONT size=2><BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #008080">&nbsp;1</SPAN><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;System;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;System.IO;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;System.Xml;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;NUnit.Framework;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;NXUnit.Framework;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;[TestFixture]<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Sample<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_164_2392_Open_Image onclick="this.style.display='none'; Codehighlighter1_164_2392_Open_Text.style.display='none'; Codehighlighter1_164_2392_Closed_Image.style.display='inline'; Codehighlighter1_164_2392_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_164_2392_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_164_2392_Closed_Text.style.display='none'; Codehighlighter1_164_2392_Open_Image.style.display='inline'; Codehighlighter1_164_2392_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_164_2392_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_164_2392_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLAssert&nbsp;xa;<BR></SPAN><SPAN style="COLOR: #008080">12</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">13</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[SetUp]<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Init()<BR></SPAN><SPAN style="COLOR: #008080">15</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_248_303_Open_Image onclick="this.style.display='none'; Codehighlighter1_248_303_Open_Text.style.display='none'; Codehighlighter1_248_303_Closed_Image.style.display='inline'; Codehighlighter1_248_303_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_248_303_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_248_303_Closed_Text.style.display='none'; Codehighlighter1_248_303_Open_Image.style.display='inline'; Codehighlighter1_248_303_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_248_303_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_248_303_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">16</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xa&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLAssert.CreateInstance();<BR></SPAN><SPAN style="COLOR: #008080">17</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">18</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">19</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Test]<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;TestMethod()<BR></SPAN><SPAN style="COLOR: #008080">21</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_362_2386_Open_Image onclick="this.style.display='none'; Codehighlighter1_362_2386_Open_Text.style.display='none'; Codehighlighter1_362_2386_Closed_Image.style.display='inline'; Codehighlighter1_362_2386_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_362_2386_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_362_2386_Closed_Text.style.display='none'; Codehighlighter1_362_2386_Open_Image.style.display='inline'; Codehighlighter1_362_2386_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_362_2386_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_362_2386_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">22</SPAN><SPAN style="COLOR