﻿<?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/norvid/category/29406.html</link><description>走在人生的路上——寻找戈多</description><language>zh-cn</language><lastBuildDate>Sun, 04 Apr 2010 06:32:04 GMT</lastBuildDate><pubDate>Sun, 04 Apr 2010 06:32:04 GMT</pubDate><ttl>60</ttl><item><title>盒图(boxplot)</title><link>http://www.blogjava.net/norvid/articles/317235.html</link><dc:creator>Norvid</dc:creator><author>Norvid</author><pubDate>Thu, 01 Apr 2010 14:22:00 GMT</pubDate><guid>http://www.blogjava.net/norvid/articles/317235.html</guid><wfw:comment>http://www.blogjava.net/norvid/comments/317235.html</wfw:comment><comments>http://www.blogjava.net/norvid/articles/317235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/norvid/comments/commentRss/317235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/norvid/services/trackbacks/317235.html</trackback:ping><description><![CDATA[<span style="font-family: Tahoma, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; color: #4d4d4d; line-height: 26px; ">
<div>最近在摆弄数据离散度的时候遇到一种图形，叫做盒图(boxplot)。它对于显示数据的离散的分布情况效果不错。</div>
<div><img src="http://www.blogjava.net/images/blogjava_net/norvid/44484/o_boxplot.png" border="0" alt="" width="393" height="311" /><br />
</div>
<div>盒图是在1977年由美国的统计学家约翰&#183;图基(John Tukey)发明的。它由五个数值点组成：最小值(min)，下四分位数(Q1)，中位数(median)，上四分位数(Q3)，最大值(max)。也可以往盒图里面加入平均值(mean)。如上图。下四分位数、中位数、上四分位数组成一个&#8220;带有隔间的盒子&#8221;。上四分位数到最大值之间建立一条延伸线，这个延伸线成为&#8220;胡须(whisker)&#8221;。</div>
<div>由于现实数据中总是存在各式各样地&#8220;脏数据&#8221;，也成为&#8220;离群点&#8221;，于是为了不因这些少数的离群数据导致整体特征的偏移，将这些离群点单独汇出，而盒图中的胡须的两级修改成最小观测值与最大观测值。这里有个经验，就是最大(最小)观测值设置为与四分位数值间距离为1.5个IQR(中间四分位数极差)。即</div>
<div><img src="http://www.blogjava.net/images/blogjava_net/norvid/44484/r_boxplot.gif" border="0" alt="" width="365" height="369" /><br />
<ul>
    <li>IQR = Q3-Q1，即上四分位数与下四分位数之间的差，也就是盒子的长度。</li>
    <li>最小观测值为min = Q1 - 1.5*IQR，如果存在离群点小于最小观测值，则胡须下限为最小观测值，离群点单独以点汇出。如果没有比最小观测值小的数，则胡须下限为最小值。</li>
    <li>最大观测值为max = Q3 -1.5*IQR，如果存在离群点大于最大观测值，则胡须上限为最大观测值，离群点单独以点汇出。如果没有比最大观测值大的数，则胡须上限为最大值。</li>
</ul>
</div>
<div>通过盒图，在分析数据的时候，盒图能够有效地帮助我们识别数据的特征：
</div>
<div>
<ol>
    <li>直观地识别数据集中的异常值(查看离群点)。</li>
    <li>判断数据集的数据离散程度和偏向(观察盒子的长度，上下隔间的形状，以及胡须的长度)。</li>
</ol>
</div>
</span>
<img src ="http://www.blogjava.net/norvid/aggbug/317235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/norvid/" target="_blank">Norvid</a> 2010-04-01 22:22 <a href="http://www.blogjava.net/norvid/articles/317235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用例的粒度</title><link>http://www.blogjava.net/norvid/articles/187590.html</link><dc:creator>Norvid</dc:creator><author>Norvid</author><pubDate>Thu, 20 Mar 2008 16:08:00 GMT</pubDate><guid>http://www.blogjava.net/norvid/articles/187590.html</guid><wfw:comment>http://www.blogjava.net/norvid/comments/187590.html</wfw:comment><comments>http://www.blogjava.net/norvid/articles/187590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/norvid/comments/commentRss/187590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/norvid/services/trackbacks/187590.html</trackback:ping><description><![CDATA[在08年3月期的&#8220;程序员&#8221;中，潘加宇的&#8220;用例有粒度吗&#8221;这篇文章感觉非常好，让我有种茅塞顿开之感。遂作笔记如下。<br />
<ol>
    <li>做用例前，要<strong>先弄清楚研究对象是什么</strong>，并时刻提醒自己不要偏离主题。不然会发生&#8220;患者到医院挂号&#8221;，或者&#8220;患者到医院信息系统看病&#8221;之类的笑话。</li>
    <li>只要在形式上能写出符合需求标准的路径、步骤，都可以作为用例。注意，是&#8220;可以&#8221;，并不是&#8220;一定&#8221;。</li>
    <li>做用例分析时<strong>最常犯的错误是：把步骤当作用例</strong>。如&#8220;取款&#8221;用例中的&#8220;验证密码&#8221;与&#8220;扣除帐户金额&#8221;，它们是&#8220;取款&#8221;用例的步骤，而不是其子用例。</li>
    <li><strong>include的目的是为了复用有价值的步骤集合</strong>。形式往往是多个大用例include一个可复用的用例，即&#8220;多个老大include一个小弟&#8221;。</li>
    <li><strong>用例是否用对了的一个判断标准是：其是否加强了和涉众的联系</strong>。如多级审批中，局长乐意跟科长共享一个审批功能吗？</li>
    <li>层次问题的出现常常是因为把研究对象弄错了，或者将系统契约与非契约混在一起。如将医院的职责&#8220;强加&#8221;给了医院信息系统。</li>
    <li>讲究&#8220;复用&#8221;不是需求要考虑的事情，而是设计要考虑的。高焕堂老师说：<strong>需求是收益面，设计是成本面。</strong></li>
    <li><strong>用例的步骤应该是回合制的</strong>，一个回合内包括一下几类步骤：</li>
    <ul>
        <li>1.执行者请求；</li>
        <li>2.系统验证(可选)；</li>
        <li>3.系统改变(可选)；</li>
        <li>4.系统回应。</li>
    </ul>
</ol>
<br />
<img src ="http://www.blogjava.net/norvid/aggbug/187590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/norvid/" target="_blank">Norvid</a> 2008-03-21 00:08 <a href="http://www.blogjava.net/norvid/articles/187590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UML和模式应用(二):迭代、进化和敏捷</title><link>http://www.blogjava.net/norvid/articles/179579.html</link><dc:creator>Norvid</dc:creator><author>Norvid</author><pubDate>Sun, 10 Feb 2008 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/norvid/articles/179579.html</guid><wfw:comment>http://www.blogjava.net/norvid/comments/179579.html</wfw:comment><comments>http://www.blogjava.net/norvid/articles/179579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/norvid/comments/commentRss/179579.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/norvid/services/trackbacks/179579.html</trackback:ping><description><![CDATA[<h3>基本概念</h3>
<strong>迭代开发(iterative development)</strong>是UP和大多数其他现代方法中的关键实践。在这种生命周期方法中，<strong>开发被组织成一系列固定的短期(如三个星期)小项目</strong>，成为迭代(iteration)；每次迭代都产生经过测试、集成并可执行的局部系统。<strong>每次迭代都具有各自的需求分析、设计、实现和测试活动</strong>。<br />
<br />
在迭代的过程中一步步增量式地发展完整系统，这种方法也成为迭代和增量式开发(iterative and incremental development)。<br />
<br />
<strong>迭代的输出不是实验性的或将丢弃的原型，迭代开发也不是构造原型。与此相反，其输出式最终的产品子集。</strong><br />
<br />
<strong>早期反馈具有极高的价值</strong>。&#8220;不错&#8230;&#8230;但是&#8230;&#8230;&#8221;这种早期反馈并不是失败的标志，与此相反，早期频繁地在&#8220;不错&#8230;&#8230;但是&#8230;&#8230;&#8221;中循环，正是改进软件和发现什么对涉众有真正价值的使用方式。<br />
<br />
迭代除了可以明确需求外，还将有助于及早地解决和验证具有风险的、关键的设计决策。<br />
<br />
<strong>大部分迭代方式建议迭代时间在2~6周之间</strong>。短时迭代为上。<br />
<br />
迭代的一个关键思想是<strong>时间定量</strong>，或时长固定。即必须严格依照时间表来集成、测试和稳定局部系统——拖延实践则违约。如果觉得难以满足期限要求，则应将本次迭代任务进行拆解，抽出一部分放到下一次迭代中完成，而不是推迟完成的时间。<br />
<br />
不要让瀑布思维侵蚀迭代或UP项目。<br />
<br />
进行迭代开发的步骤：<br />
<ol>
    <li>在第一次迭代之前，召开第一个时间定量的需求工作会议，进行高阶需求分析，如仅仅确定用例和特性的名称，以及关键的非功能性需求。在高阶需求列表中选取10%具有架构意义、高业务价值的需求进行功能和非功能性需求的详细分析；</li>
    <li>在第一次迭代钱，召开迭代计划会议，从做好初步详细分析的用例中选择本次迭代的任务目标；</li>
    <li>在三到四周内完成第一次迭代，并严格遵守时间；</li>
    <li>在第一次迭代即将结束时，召开第二次需求工作会，对上一次会议的所有材料进行复查和净化。然后选择具有重要架构意义和高业务价值的另外10%到15%的用例，用一到两天对其进行详细分析；</li>
    <li>于第一次迭代结束最后一天举行下一次迭代的迭代计划会议；</li>
    <li>以相同步骤进行第二次迭代；</li>
    <li>反复进行四次迭代和五次需求工作会，这样在第四次迭代结束时，可能已经详细记录了约80%~90%的需求，但只实现了系统的10%；</li>
    <li>大约推进了整个项目的20%，这是细化阶段。此时根据分析以及早期反馈、早期编程及测试，已经可以获取系统的概貌和各种风险，可以把握住开发并能估计出需要多长时间来结束；</li>
    <li>此后，一般不需要再召开工作会，需求已经稳定了，接下来时一些列为期三周的迭代。</li>
</ol>
UP提倡风险驱动(risk-driven)与客户驱动(client-driven)相结合的迭代计划。这意味着早期的迭代目标要能够<strong>识别和降低最高风险</strong>，并且能<strong>构造客户最关心的可视化特性</strong>。<br />
<br />
<strong>敏捷宣言：个体和迭代，超越过程和工具；工作的软件，超越完整的文档；客户协作，超越合同谈判；响应变更，超越履行计划</strong>。<br />
<br />
UP项目将其工作和迭代组织为四个主要阶段：<strong>初始，细化，构造，移交</strong>。<br />
<br />
<br />
<img src ="http://www.blogjava.net/norvid/aggbug/179579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/norvid/" target="_blank">Norvid</a> 2008-02-10 23:49 <a href="http://www.blogjava.net/norvid/articles/179579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UML和模式应用(一):面向对象分析和设计</title><link>http://www.blogjava.net/norvid/articles/179569.html</link><dc:creator>Norvid</dc:creator><author>Norvid</author><pubDate>Sun, 10 Feb 2008 14:40:00 GMT</pubDate><guid>http://www.blogjava.net/norvid/articles/179569.html</guid><wfw:comment>http://www.blogjava.net/norvid/comments/179569.html</wfw:comment><comments>http://www.blogjava.net/norvid/articles/179569.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/norvid/comments/commentRss/179569.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/norvid/services/trackbacks/179569.html</trackback:ping><description><![CDATA[<h2>
基本概念</h2>
应该如何为对象类分配<strong>职责(responsibility)</strong>?对象之间应该如何协作？什么样的类应该做什么样的事情？这些都是系统设计中的关键问题。解决这些问题的一个设计方法是<strong>职责驱动设计(responsibility-driven design)</strong>。<br />
<br />
<strong>Scrum</strong>：由Ken Schwaber和Jeff Sutherland提出，旨在寻求充分发挥面向对象和构建技术的开发方法，是对<strong>迭代式面向对象方法的改进</strong>，<strong>适用于需求难以预测的复杂商务应用产品的开发</strong>。<br />
<br />
<strong>Feature-Driven Development(FDD)</strong>:由Jeff de Luca和Peter Coad提出，是一个模型驱动、短迭代的开发方法，适用于变换周期短的业务应用开发。所谓的特征点(Feature)时一些用户眼中<strong>有用的小功能项，一个特征点能在两周或更短的时间内被实施，且产生可见的、能运行的代码</strong>。<br />
<br />
<strong>Lean Development</strong>:这一思想诞生于20世纪40年代默契。当时由于缺乏足够的资金，刚成立不久的丰田公司制定了丰田生产系统，其主旨是消除浪费。该方法的原则是<strong>消除浪费、增加学习、尽量推迟决策、尽快交付、授权团队、潜入完整性和认识整体</strong>。<br />
<br />
在OO开发中，至关重要的能力是<strong>熟练地为软件对象分配职责</strong>。<br />
<br />
<strong>分析(analysis)</strong>强调的是<strong>对问题和需求的调查研究，而不是解决方案</strong>。如一个系统应该如何使用它？它应该具有哪些功能？<br />
<br />
<strong>设计(design)</strong>强调的是<strong>满足需求的概念上的解决方案</strong>(软件、硬件两方面)，而不是其实现。设计思想通常排斥底层或&#8220;显而易见&#8221;的细节。<br />
<br />
有益的分析和设计可以概括为：<strong>做正确的事(分析)和正确地做事(设计)</strong>。<br />
<br />
<strong>面向对象分析(Object-oriented analysis)</strong>过程中，强调的是<strong>在问题领域内发现和描述对象(或概念)</strong>。如飞机、航班、飞行员等。<br />
<br />
<strong>面向对象设计(Object-oriented design)</strong>过程中，强调的是<strong>定义软件对象以及他们如何协作以实现需求，即职责和协作</strong>。如对象有哪些属性以及方法。<br />
<br />
面向对象分析关注从对象的角度创建领域描述，面向对象分析需要鉴别重要的概念。其分析结果可以表示为<strong>领域模型(Domain model)，展示重要的领域概念和对象</strong>。领域模型也可以成为<strong>概念对象模型(conceptual object model)</strong>。<br />
<br />
<strong>顺序图(sequence diagram)</strong>，描述协作的常见表示法，它展示<strong>软件对象之间的消息流，和由消息引起的方法调用</strong>。<br />
<br />
<strong>
设计类图(design class diagram)</strong>，描述类的属性和方法，从而<strong>展示类定义的静态视图</strong>。<br />
<br />
统一建模语言(UML)是描述、构造和文档化系统制品的<strong>可视化</strong>语言。<br />
<br />
应用UML的三种方式：1)<strong>UML作为草图</strong>：非正式的、不完整的图，借助可视化语言的功能，用于探讨问题或者解决方案空间的复杂部分；2)<strong>UML作为蓝图</strong>：相对详细的设计图，用于逆向工程或者代码工程(即前向工程)；3)<strong>UML作为编程语言</strong>：用UML完成软件系统可执行规格说明。<br />
<br />
敏捷建模(Agile Modeling)强调了UML作为草图的方式，这也是使用UML的普通方式，而且通常对时间投入具有高回报。<br />
<br />
应用UML的三种透视图：1)<strong>概念透视图</strong>：用图来描述现实世界或关注领域中的事物；2)<strong>规格说明透视图</strong>：用图来描述软件的抽象物或具有规格说明和接口的构件，但是并不约定特定实现；3)<strong>实现透视图</strong>：用图来描述特定技术(如Java)中的软件实现。<br />
<br />
<strong>概念类(conceptual class)</strong>：现实世界中的概念或事物。在概念或本质透视图中使用。<br />
<br />
<strong>软件类(software class)</strong>：无论在过程还是方法中，都表示软件构件在规格说明或实现透视图中的类。<br />
<br />
<strong>实现类(implementation class)</strong>：特定OO语言中的类。<br />
<br />
<h3>小结</h3>
介绍了什么是面向对象的分析与设计，以及综述了UML和其可视化建模。<br />
<br />
<img src ="http://www.blogjava.net/norvid/aggbug/179569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/norvid/" target="_blank">Norvid</a> 2008-02-10 22:40 <a href="http://www.blogjava.net/norvid/articles/179569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>