﻿<?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-骆昊的Java空间</title><link>http://www.blogjava.net/jackfrued/</link><description>传道、授业、解惑，何有于我哉！
Java SE / Java ME / Java EE / C / C++ / C#</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 11:26:59 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 11:26:59 GMT</pubDate><ttl>60</ttl><item><title>关于MySQL的简单总结</title><link>http://www.blogjava.net/jackfrued/archive/2011/02/20/344679.html</link><dc:creator>骆昊</dc:creator><author>骆昊</author><pubDate>Sat, 19 Feb 2011 21:48:00 GMT</pubDate><guid>http://www.blogjava.net/jackfrued/archive/2011/02/20/344679.html</guid><wfw:comment>http://www.blogjava.net/jackfrued/comments/344679.html</wfw:comment><comments>http://www.blogjava.net/jackfrued/archive/2011/02/20/344679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackfrued/comments/commentRss/344679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackfrued/services/trackbacks/344679.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; MySQL是最著名的开源数据库，容易上手且功能强大，Yahoo!、BBC News等著名站点都使用了MySQL数据库进行数据存储在Linux环境中可以通过/etc/my.cnf对MySQL服务器进行配置（在Windows中是一个叫my.ini的文件），有接近300个配置参数可以用来在启动MySQL服务器时控制其行为（包括：内存、日志、错误报告等等）在Linux环境中可以通...&nbsp;&nbsp;<a href='http://www.blogjava.net/jackfrued/archive/2011/02/20/344679.html'>阅读全文</a><img src ="http://www.blogjava.net/jackfrued/aggbug/344679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackfrued/" target="_blank">骆昊</a> 2011-02-20 05:48 <a href="http://www.blogjava.net/jackfrued/archive/2011/02/20/344679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2.1.x + Spring 2.5.x + Hibernate 3.3.x整合需要的JAR包</title><link>http://www.blogjava.net/jackfrued/archive/2010/02/27/314074.html</link><dc:creator>骆昊</dc:creator><author>骆昊</author><pubDate>Sat, 27 Feb 2010 10:23:00 GMT</pubDate><guid>http://www.blogjava.net/jackfrued/archive/2010/02/27/314074.html</guid><wfw:comment>http://www.blogjava.net/jackfrued/comments/314074.html</wfw:comment><comments>http://www.blogjava.net/jackfrued/archive/2010/02/27/314074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackfrued/comments/commentRss/314074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackfrued/services/trackbacks/314074.html</trackback:ping><description><![CDATA[<p style="font-size: 12pt">&nbsp;下面这个表相信对很多人都有用：<br />
<table style="border-right: medium none; border-top: medium none; border-left: medium none; width: 426.1pt; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" width="568" border="1">
    <tbody>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; background: #ffffca; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>jar<span style="font-family: 宋体">包名称</span></p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; background: #ffffca; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p><span style="font-family: 宋体">所在位置</span></p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; background: #ffffca; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p><span style="font-family: 宋体">说明</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>antlr-2.7.6.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate/lib/required</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p><span style="font-family: 宋体">解析</span>HQL</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>aspectjrt</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>spring/lib/aspectj</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>AOP</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>aspectjweaver</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>..</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>AOP</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>cglib-nodep-2.1_3.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>spring/lib/cglib</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p><span style="font-family: 宋体">代理，二进制增强</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>common-annotations.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>spring/lib/j2ee</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>@Resource</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>commons-collections-3.1.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate/lib/required</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p><span style="font-family: 宋体">集合框架</span></p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>commons-fileupload-1.2.1.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>struts/lib</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>struts</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>commons-io-1.3.2</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>struts/lib</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>struts</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>commons-logging-1.1.1</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p><span style="font-family: 宋体">单独下载最新版本</span></p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>struts</p>
            <p>spring</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>dom4j-1.6.1.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate/required</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p><span style="font-family: 宋体">解析</span>xml</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>ejb3-persistence</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate-annotation/lib</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>@Entity</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>freemarker-2.3.13</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>struts/lib</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>struts</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate3.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate-annotations</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate-annotation/</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate-common-annotations</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate-annotation/lib</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>javassist-3.9.0.GA.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hiberante/lib/required</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>jta-1.1.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>..</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate transaction</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>junit4.5</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>mysql-</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>ognl-2.6.11.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>struts/lib</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>slf4j-api-1.5.8.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate/lib/required</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate-log</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>slf4j-nop-1.5.8.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>hibernate/lib/required</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>spring.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>spring/dist</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>struts2-core-2.1.6.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>struts/lib</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>xwork-2.1.2.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>struts/lib</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>struts2</p>
            </td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>commons-dbcp</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>spring/lib/jarkata-commons</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>commons-pool.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189">
            <p>..</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="189"></td>
        </tr>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1.5pt solid; width: 142pt; padding-top: 0cm; border-bottom: medium none" valign="top" width="189">
            <p>struts2-spring-plugin-2.1.6.jar</p>
            </td>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: medium none" valign="top" width="189">
            <p>struts/lib</p>
            </td>
            <td style="border-right: black 1.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 142.05pt; padding-top: 0cm; border-bottom: medium none" valign="top" width="189"></td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.blogjava.net/jackfrued/aggbug/314074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackfrued/" target="_blank">骆昊</a> 2010-02-27 18:23 <a href="http://www.blogjava.net/jackfrued/archive/2010/02/27/314074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP之Introduction(@DeclareParents)简介</title><link>http://www.blogjava.net/jackfrued/archive/2010/02/27/314060.html</link><dc:creator>骆昊</dc:creator><author>骆昊</author><pubDate>Sat, 27 Feb 2010 06:09:00 GMT</pubDate><guid>http://www.blogjava.net/jackfrued/archive/2010/02/27/314060.html</guid><wfw:comment>http://www.blogjava.net/jackfrued/comments/314060.html</wfw:comment><comments>http://www.blogjava.net/jackfrued/archive/2010/02/27/314060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackfrued/comments/commentRss/314060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackfrued/services/trackbacks/314060.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt"><span style="font-family: Times New Roman"><span style="font-size: 12pt; font-family: ">Spring的文档上对Introduction这个概念和相关的注解@DeclareParents作了如下介绍：<br />
<br style="font-family: " />
<span style="color: #000080"><em>Introductions (known as inter-type declarations in AspectJ) enable an aspect to declare that advised objects implement a given interface, and to provide an implementation of that interface on behalf of those objects.<br style="font-family: " />
An introduction is made using the @DeclareParents annotation. This annotation is used to declare that matching types have a new parent (hence the name).</em> <br />
</span><br style="font-family: " />
在这段介绍之后还给出了一个例子，对于初学者要理解这段话以及后面的例子还是蛮困难的，因此下面用一个简单的例子告诉大家什么是Introduction以及如何使用@DeclareParents注解。<br style="font-family: " />
<br style="font-family: " />
对于Introduction这个词，个人认为理解成引入是最合适的，其目标是对于一个已有的类引入新的接口（有人可能会问：有什么用呢？简单的说，你可以把当前对象转型成另一个对象，那么很显然，你就可以调用另一个对象的方法了），看一个例子就全明白了。<br />
<br />
假设已经有一个UserService类提供了保存User对象的服务，但是现在想增加对User进行验证的功能，只对通过验证的User提供保存服务，在不修改UserService类代码的前提下就可以通过Introduction来解决。<br />
<br />
首先定义一个Verifier接口，里面定义了进行验证的方法validate()，如下所示：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.jackfrued.aop;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.jackfrued.models.User;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_90_130_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_130_Open_Text.style.display='none'; Codehighlighter1_90_130_Closed_Image.style.display='inline'; Codehighlighter1_90_130_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_90_130_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_90_130_Closed_Text.style.display='none'; Codehighlighter1_90_130_Open_Image.style.display='inline'; Codehighlighter1_90_130_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Verifier&nbsp;</span><span id="Codehighlighter1_90_130_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_90_130_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;validate(User&nbsp;user);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<br />
接下来给出该接口的一个实现类BasicVerifier，如下所示：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.jackfrued.aop;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.jackfrued.models.User;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_111_281_Open_Image" onclick="this.style.display='none'; Codehighlighter1_111_281_Open_Text.style.display='none'; Codehighlighter1_111_281_Closed_Image.style.display='inline'; Codehighlighter1_111_281_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_111_281_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_111_281_Closed_Text.style.display='none'; Codehighlighter1_111_281_Open_Image.style.display='inline'; Codehighlighter1_111_281_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;BasicVerifier&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Verifier&nbsp;</span><span id="Codehighlighter1_111_281_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_111_281_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img id="Codehighlighter1_161_279_Open_Image" onclick="this.style.display='none'; Codehighlighter1_161_279_Open_Text.style.display='none'; Codehighlighter1_161_279_Closed_Image.style.display='inline'; Codehighlighter1_161_279_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_161_279_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_161_279_Closed_Text.style.display='none'; Codehighlighter1_161_279_Open_Image.style.display='inline'; Codehighlighter1_161_279_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;validate(User&nbsp;user)&nbsp;</span><span id="Codehighlighter1_161_279_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_161_279_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_240_260_Open_Image" onclick="this.style.display='none'; Codehighlighter1_240_260_Open_Text.style.display='none'; Codehighlighter1_240_260_Closed_Image.style.display='inline'; Codehighlighter1_240_260_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_240_260_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_240_260_Closed_Text.style.display='none'; Codehighlighter1_240_260_Open_Image.style.display='inline'; Codehighlighter1_240_260_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(user.getUsername().equals(</span><span style="color: #000000">"</span><span style="color: #000000">jack</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;user.getPassword().equals(</span><span style="color: #000000">"</span><span style="color: #000000">1234</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;</span><span id="Codehighlighter1_240_260_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_240_260_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img alt="" 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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
如何才能为UserService类增加验证User的功能呢，如下所示定义Aspect：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.jackfrued.aop;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.aspectj.lang.annotation.Aspect;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.aspectj.lang.annotation.DeclareParents;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.stereotype.Component;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />@Aspect<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />@Component<br />
<img id="Codehighlighter1_213_359_Open_Image" onclick="this.style.display='none'; Codehighlighter1_213_359_Open_Text.style.display='none'; Codehighlighter1_213_359_Closed_Image.style.display='inline'; Codehighlighter1_213_359_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_213_359_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_213_359_Closed_Text.style.display='none'; Codehighlighter1_213_359_Open_Image.style.display='inline'; Codehighlighter1_213_359_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyAspect&nbsp;</span><span id="Codehighlighter1_213_359_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_213_359_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;@DeclareParents(value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.tsinghuait.services.UserService</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultImpl</span><span style="color: #000000">=</span><span style="color: #000000">com.tsinghuait.aop.BasicVerifier.</span><span style="color: #0000ff">class</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Verifier&nbsp;verifer;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
接下来就可以将UserService对象转型为Verifier对象并对用户进行验证了，如下所示：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.jackfrued.main;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.ApplicationContext;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.jackfrued.aop.Verifier;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.jackfrued.models.User;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.jackfrued.services.Service;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_283_664_Open_Image" onclick="this.style.display='none'; Codehighlighter1_283_664_Open_Text.style.display='none'; Codehighlighter1_283_664_Closed_Image.style.display='inline'; Codehighlighter1_283_664_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_283_664_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_283_664_Closed_Text.style.display='none'; Codehighlighter1_283_664_Open_Image.style.display='inline'; Codehighlighter1_283_664_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span id="Codehighlighter1_283_664_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_283_664_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_326_662_Open_Image" onclick="this.style.display='none'; Codehighlighter1_326_662_Open_Text.style.display='none'; Codehighlighter1_326_662_Closed_Image.style.display='inline'; Codehighlighter1_326_662_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_326_662_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_326_662_Closed_Text.style.display='none'; Codehighlighter1_326_662_Open_Image.style.display='inline'; Codehighlighter1_326_662_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_326_662_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_326_662_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;user1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;User();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user1.setUsername(</span><span style="color: #000000">"</span><span style="color: #000000">abc</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user1.setPassword(</span><span style="color: #000000">"</span><span style="color: #000000">def</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;factory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassPathXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">config.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Service)&nbsp;factory.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">service</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Verifier&nbsp;v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Verifier)&nbsp;s;<br />
<img id="Codehighlighter1_599_653_Open_Image" onclick="this.style.display='none'; Codehighlighter1_599_653_Open_Text.style.display='none'; Codehighlighter1_599_653_Closed_Image.style.display='inline'; Codehighlighter1_599_653_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_599_653_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_599_653_Closed_Text.style.display='none'; Codehighlighter1_599_653_Open_Image.style.display='inline'; Codehighlighter1_599_653_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(v.validate(user1)&nbsp;</span><span id="Codehighlighter1_599_653_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_599_653_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">验证成功</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.serve(user1);<br />
<img alt="" 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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
这样，上面代码中的user1是不会被服务的，当然是因为没有通过验证啦！<br />
<br />
这样一说，是不是大概明白什么是Introduction了呢，其实@DeclareParents用起来也很简单吧！<br />
<br />
至于配置文件和其他内容请参考完整源代码：<a href="/Files/jackfrued/Spring-introduction.rar">/Files/jackfrued/Spring-introduction.rar</a><br />
</span></span></span>
<img src ="http://www.blogjava.net/jackfrued/aggbug/314060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackfrued/" target="_blank">骆昊</a> 2010-02-27 14:09 <a href="http://www.blogjava.net/jackfrued/archive/2010/02/27/314060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP编程中的一个小问题</title><link>http://www.blogjava.net/jackfrued/archive/2010/02/27/314053.html</link><dc:creator>骆昊</dc:creator><author>骆昊</author><pubDate>Sat, 27 Feb 2010 04:36:00 GMT</pubDate><guid>http://www.blogjava.net/jackfrued/archive/2010/02/27/314053.html</guid><wfw:comment>http://www.blogjava.net/jackfrued/comments/314053.html</wfw:comment><comments>http://www.blogjava.net/jackfrued/archive/2010/02/27/314053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackfrued/comments/commentRss/314053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackfrued/services/trackbacks/314053.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt">在用Spring 2.5.6 + jdk 1.7开发时，使用@PointCut注解定义切入点时会导致以下错误<br />
<br />
<span style="color: red">error at ::0 can't find referenced pointcut XXX<br />
</span><br />
这应该算是一个Bug吧，不过只要在类路径下放最新的aspectjrt.jar和aspectjweaver.jar<br />
就可以避免这个问题了。可以去到eclipse的官方网站下载上面的JAR包，下载地址：<br />
<br />
http://www.eclipse.org/aspectj/downloads.php<br />
</span>
 <img src ="http://www.blogjava.net/jackfrued/aggbug/314053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackfrued/" target="_blank">骆昊</a> 2010-02-27 12:36 <a href="http://www.blogjava.net/jackfrued/archive/2010/02/27/314053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]基于需求测试(RBT)</title><link>http://www.blogjava.net/jackfrued/archive/2010/02/05/312051.html</link><dc:creator>骆昊</dc:creator><author>骆昊</author><pubDate>Fri, 05 Feb 2010 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/jackfrued/archive/2010/02/05/312051.html</guid><wfw:comment>http://www.blogjava.net/jackfrued/comments/312051.html</wfw:comment><comments>http://www.blogjava.net/jackfrued/archive/2010/02/05/312051.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackfrued/comments/commentRss/312051.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackfrued/services/trackbacks/312051.html</trackback:ping><description><![CDATA[<span style="font-size: 12px; color: #333333; line-height: 21px; font-family: Arial, Helvetica, sans-serif">
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important"><a style="color: #000000; word-break: break-all; line-height: normal! important; text-decoration: none" onclick="javascript:tagshow(event, '%B2%E2%CA%D4');" href="javascript:;" target="_self"><u style="word-break: break-all; line-height: normal! important"><strong style="word-break: break-all; line-height: normal! important">测试</strong></u></a>人员的首要职责是找bug，但是最重要、最根本的职责应该是在软件产品发布前确保公司的软件产品满足顾客的需求。</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　测试组采用RBT(Requirements-based testing)，基于需求的测试方法会使测试更加有效，因为它使测试专注于质量问题产生的根源。</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　　　　　　　　　　　　　<a style="color: #000000; word-break: break-all; line-height: normal! important; text-decoration: none" href="http://www.51testing.com/batch.download.php?aid=6107" target="_blank"><img style="word-break: break-all; border-top-style: none; line-height: normal! important; border-right-style: none; border-left-style: none; border-bottom-style: none; max-width: 500px" alt="" src="http://www.51testing.com/attachments/2007/08/2_200708281517251.jpg" border="0" /></a></p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　研究报告指出，多年来，大部分的软件项目不能按计划完成，不能有效控制成本。大部分项目失败的首要原因是软件质量差，导致大量的返工、重新设计和编码。其中软件质量差的两大原因是：软件需求规格说明书的错误、有问题的系统测试覆盖。</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">需求规格说明书中的错误</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　我们经常听到最终用户抱怨、不用我们的软件，而这些软件还通过了严格的测试和QA。对于这点我们不会感到惊讶，原因是我们知道需求从一开始就是错误的。</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　一项调查(James Martin (&#8220;An Information Systems Manifesto,&#8221; Prentice Hall, 1984)表明56%的缺陷其实是在软件需求阶段被引入的。而这其中的50%是由于需求文档编写有问题、不明确、不清晰、不正确导致的。剩下的50%是由于需求的遗漏导致的。</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">有问题的测试覆盖</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　要获得满意的测试覆盖率是很难的。尤其现在的系统都比较复杂，功能场景很多，逻辑分支很多，要做到完全的覆盖几乎不可能。</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　再者，需求的变更往往缺乏控制，需求与测试用例之间往往缺乏可跟踪性。</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　　　　　　　　　　　　<a style="color: #000000; word-break: break-all; line-height: normal! important; text-decoration: none" href="http://www.51testing.com/batch.download.php?aid=6108" target="_blank"><img style="word-break: break-all; border-top-style: none; line-height: normal! important; border-right-style: none; border-left-style: none; border-bottom-style: none; max-width: 500px" alt="" src="http://www.51testing.com/attachments/2007/08/2_200708281519151.jpg" border="0" /></a></p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">RBT三大最佳实践</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">1、&nbsp;&nbsp;<a style="color: #000000; word-break: break-all; line-height: normal! important; text-decoration: none" onclick="javascript:tagshow(event, 'Test');" href="javascript:;" target="_self"><u style="word-break: break-all; line-height: normal! important"><strong style="word-break: break-all; line-height: normal! important">Test</strong></u></a>&nbsp;early and often.尽早测试，频繁地测试</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　确认需求的业务价值。</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　各利益相关方应该对需求进行评审。</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　通过用例检查需求的完整性</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　应用语言分析<a style="color: #000000; word-break: break-all; line-height: normal! important; text-decoration: none" onclick="javascript:tagshow(event, '%BC%BC%CA%F5');" href="javascript:;" target="_self"><u style="word-break: break-all; line-height: normal! important"><strong style="word-break: break-all; line-height: normal! important">技术</strong></u></a>确保需求文档清晰一致，不会引起同一问题不同人有不同的解释。</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">&nbsp;2、&nbsp; Test with your head, not your gut.不要单凭经验测试</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　不要依赖测试人员的经验来设计测试用例，应该采用系统、严格的测试用例设计方法，而不是依赖有经验的测试人员的技巧。通过这样的方式来增加测试覆盖的有效性。格式化、结构化的需求文档有助于测试人员评估需求的测试覆盖率。</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　通过测试用例评审来检查测试用例存在的错误，并且找出需求的不足之处。</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">&nbsp;3、&nbsp; Test with measurement and improvement in mind.测试过程中要保持度量</p>
<p style="margin: 10px 0px; word-break: break-all; line-height: 1.8em! important">　　在使用基于需求的测试方法的过程中，保持对需求的可追踪性非常重要。保持需求与测试用例及测试之间的可追踪性有助于监视进度、度量覆盖率，当然也有助于控制需求变更。</p>
</span>
<img src ="http://www.blogjava.net/jackfrued/aggbug/312051.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackfrued/" target="_blank">骆昊</a> 2010-02-05 09:50 <a href="http://www.blogjava.net/jackfrued/archive/2010/02/05/312051.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]我的七个建议</title><link>http://www.blogjava.net/jackfrued/archive/2010/02/01/311556.html</link><dc:creator>骆昊</dc:creator><author>骆昊</author><pubDate>Mon, 01 Feb 2010 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/jackfrued/archive/2010/02/01/311556.html</guid><wfw:comment>http://www.blogjava.net/jackfrued/comments/311556.html</wfw:comment><comments>http://www.blogjava.net/jackfrued/archive/2010/02/01/311556.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackfrued/comments/commentRss/311556.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackfrued/services/trackbacks/311556.html</trackback:ping><description><![CDATA[<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">如果你喜欢编程，那么你真是受到了上天的眷顾。你是非常幸运的少数人之一，能够以自己喜欢的事谋生。大多数人没有这么幸运。你认为理所当然的观念<span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">热爱你的工作</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">，其实是一个很现代的概念。通常的看法是，工作是一种让人很不开心的事，你为了拿工资才不得不去上班。你工作的目的是为了攒下钱去干那些自己真正喜欢干的事，但是前提是你得等到</span><span style="font-family: Times New Roman">65</span><span style="font-family: 宋体">岁退休之后才行，而且还有不少条件。条件一，你的积蓄必须足够多；条件二，你没有老到走不动，你还有体力去干那些事情；条件三，你喜欢的事情不需要用到脆弱的膝盖、昏花的视力，也不要求你走上一里地不喘气，等等。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">我刚才说到哪里了？对了，我要提建议。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold">毕业前练好写作</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">如果不是<span style="font-family: Times New Roman">Linus&nbsp;Torvalds</span><span style="font-family: 宋体">不断地散布福音，请问</span><span style="font-family: Times New Roman">Linux</span><span style="font-family: 宋体">操作系统会成功吗？虽然他是一个非常聪明的计算机天才，但是</span><span style="font-family: Times New Roman">Linux</span><span style="font-family: 宋体">吸引来全世界一大批志愿者的真正原因却是</span><span style="font-family: Times New Roman">Linus&nbsp;Torvalds</span><span style="font-family: 宋体">的表达能力。他通过电子邮件和邮件列表用书面形式传播自己的想法，最终引起了所有人的注意。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">你听说过现在风靡一时的<span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">极限编程</span><span style="font-family: Times New Roman">[&nbsp;]&nbsp;&#8221;</span><span style="font-family: 宋体">（</span><span style="font-family: Times New Roman">Extreme&nbsp;Programming</span><span style="font-family: 宋体">）吗？我在这个地方不谈我对极限编程的看法，我只说如果你听过这个词，那么原因就是它的倡导者都是一些非常有才华的作家和演说家。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">即使我们缩小范围，将目光局限在任何一个软件开发团体中，你也会发现该团体中最有权势和影响力的程序员正是那些表达能力强的程序员，他们无论是做书面表达还是做口头表达，都能够清晰、自如、具有说服力地传达观点。此外，长得高也有助于提升影响力，不过这个不取决于你。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">一个普通程序员与一个优秀程序员的区别，不在于他们懂得的编程语言谁多谁少，也不在于他们喜欢用<span style="font-family: Times New Roman">Python</span><span style="font-family: 宋体">语言还是喜欢用</span><span style="font-family: Times New Roman">Java</span><span style="font-family: 宋体">语言，而在于他们能否与他人交流思想。如果你能说服其他人，你的力量就可以得到放大。如果你能写出清晰的注释和技术规格说明书，其他程序员就能够理解你的代码，因此他们就能在自己的代码中使用，而不必重写。如果你做不到这一点，你的代码对其他人就没有价值。如果你能为最终用户写出清晰的使用手册，其他人就能明白你的代码是用来干什么的，这是唯一让别人明白你的代码有何价值的方法</span></span><span style="font-family: '宋体'; font-size: 10.5pt">。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">SourceForge[&nbsp;]<span style="font-family: 宋体">上有许多优美的、有用的代码，但是它们都像被埋葬了一样，根本没人来用，原因就是它们的作者没有写好使用说明（或者压根就没写）。这样一来就没有人知道他们的成果，他们杰出的代码就衰亡了。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">如果一个程序员不会用英语写作、没有良好的写作能力，我就不会雇他。如果你能写，不管你去哪家公司工作，你很快就会发现写作技术文档的任务会落到你头上，这意味着你已经开始在放大自己的影响力了，管理层正在注意到你。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">大学里有些课程被公认为<span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">写作密集型</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">（</span><span style="font-family: Times New Roman">writing&nbsp;intensive</span><span style="font-family: 宋体">）课程，这就是说为了拿到学分，你必须写作多得可怕的文字。一定要去上这样的课程！不要管学科，只要这门课每周甚至每天都要你写东西，你就去上。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">你还可以动手写日记或者网志。你写得越多，写作就会变得越容易。写起来越容易，你就会写得越多。这是一个良性循环。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold">毕业前学好<span style="font-family: Times New Roman">C</span><span style="font-family: 宋体">语言</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">第二点我要讲的是<span style="font-family: Times New Roman">C</span><span style="font-family: 宋体">语言。请注意，我说的是</span><span style="font-family: Times New Roman">C</span><span style="font-family: 宋体">语言，而不是</span><span style="font-family: Times New Roman">C++</span><span style="font-family: 宋体">。虽然在实际使用中</span><span style="font-family: Times New Roman">C</span><span style="font-family: 宋体">语言已经越来越罕见，但是它仍然是当前程序员的共同语言。</span><span style="font-family: Times New Roman">C</span><span style="font-family: 宋体">语言让程序员互相沟通，更重要的是，它比你在大学中学到的</span><span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">现代语言</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">（比如</span><span style="font-family: Times New Roman">ML</span><span style="font-family: 宋体">语言、</span><span style="font-family: Times New Roman">Java</span><span style="font-family: 宋体">语言、</span><span style="font-family: Times New Roman">Python</span><span style="font-family: 宋体">语言或者其它正在教授的流行垃圾语言）都更接近机器。你至少需要花一个学期来了解机器原理，否则你永远不可能在高级语言的层次写出高效的代码。你也永远无法开发编译器和操作系统，而它们恰恰属于目前程序员能够得到的最佳工作之列。别人也永远不会放心将大型项目的架构设计交给你。我不管你懂多少延续（</span><span style="font-family: Times New Roman">continuation</span><span style="font-family: 宋体">）、闭包（</span><span style="font-family: Times New Roman">closure</span><span style="font-family: 宋体">）、异常处理（</span><span style="font-family: Times New Roman">exception&nbsp;handling</span><span style="font-family: 宋体">），只要你不能解释为什么</span><span style="font-family: Times New Roman">while&nbsp;(*s++&nbsp;=&nbsp;*t++)</span><span style="font-family: 宋体">；这句代码的作用是复制字符串，或者不觉得这是世界上对你来说再自然不过的事情，那么你就是在盲目无知的情况下编程。在我看来，这就好像一个医生不懂得最基本的解剖学就在开处方，他看病的根据完全是因为那些娃娃脸的医药厂商销售代表说这种药有用。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt">
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold">毕业前学好微观经济学</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">如果你没有上过任何经济学课程，那么我首先来做一个超短的评论：经济学是这样的学科之一，刚开始学的时候轰轰烈烈，有许多有用的、言之有理的理论和可以在真实世界中得到证明的事实，等等；但是，再学下去就每况愈下，有用的东西就不多了。经济学一开始那个有用的部分正是微观经济学，它是商业领域所有重要理论的基础。跟在微观经济学后面的东西就不行了。你接下来学的是宏观经济学，如果你愿意，尽管跳过去，也不会有什么损失。宏观经济学开头的部分是利息理论，内容比方说是利率与失业之间的关系，但是怎么说呢，看上去这部分里面还没有被证实的东西多于已经被证实的东西。学完这部分，后面的内容越来越糟糕，许多经济学专业的学生实际上都变成在搞物理学，因为这样才能在华尔街上找到更好的工作。但是不管怎样，你一定要去学微观经济学，因为你必须搞懂供给和需求，你必须明白竞争优势，你必须理解什么是净现值（<span style="font-family: Times New Roman">NPV</span><span style="font-family: 宋体">），什么是贴现，什么是边际效用。只有这样，你才会懂得为什么生意是现在这种做法。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">为什么计算机系的学生也应该学经济学？因为，从经营一家公司的角度来看，比起那些不懂的程序员，一个理解基本商业规则的程序员将会更有价值。就是这么简单。我无法告诉你有多少次我是那样地充满挫折感，因为我看到了太多的提出一些疯狂的想法的程序员，这些想法在代码上也许可行，但在资本主义世界中毫无意义。如果你懂得商业规则，你就是一个更有价值的程序员，你会因此得到回报的，但是前提是你要去学习微观经济学。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">不要因为枯燥就不选修非计算机专业的课程。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">想提高<span style="font-family: Times New Roman">GPA</span><span style="font-family: 宋体">绩点的一个好方法就是多选修非计算机系的课程。请千万不要低估你的</span><span style="font-family: Times New Roman">GPA</span><span style="font-family: 宋体">的重大意义。千千万万的人事经理和招聘人员在拿到一份简历的时候，第一眼就会去看</span><span style="font-family: Times New Roman">GPA</span><span style="font-family: 宋体">，包括我也是这样。我们不会为这种做法道歉。为什么？因为</span><span style="font-family: Times New Roman">GPA</span><span style="font-family: 宋体">不反映单个的成绩，而是代表了许多个教授在一段很长的时间中，在不同的情况下，对你的表现的一个总的评估。</span><span style="font-family: Times New Roman">SAT</span><span style="font-family: 宋体">成绩难道不够吗？哈，那只不过是一场几个小时的测试罢了。</span><span style="font-family: Times New Roman">GPA</span><span style="font-family: 宋体">中包括了四年大学期间你的小论文、期中考试和课堂表现，总数有几百次之多。当然，</span><span style="font-family: Times New Roman">GPA</span><span style="font-family: 宋体">也有自己的问题，不是百分之百准确。比如，这些年来，老师对学生的打分越来越宽松，学习成绩有通货膨胀的趋势。再比如，</span><span style="font-family: Times New Roman">GPA</span><span style="font-family: 宋体">无法反映课程的难度，没人能够看出你的</span><span style="font-family: Times New Roman">GPA</span><span style="font-family: 宋体">是来自无名社区大学家政系的轻松课程还是来自加州理工学院针对研究生的量子力学课程。渐渐地，我形成了一套自己的做法，首先我会过滤掉所有来自社区大学、</span><span style="font-family: Times New Roman">GPA</span><span style="font-family: 宋体">低于</span><span style="font-family: Times New Roman">2.5</span><span style="font-family: 宋体">的简历，然后我会要求剩下的人给我寄成绩单和推荐信。我再从中发现那些成绩一贯优秀的人，而不是那些仅仅在计算机系课程中得到高分的人。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">为什么我要关心某人的<span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">欧洲历史</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">课程成绩呢，毕竟作为雇主我要找的应该是程序员啊？何况，历史是那么枯燥，不得高分很正常。哦，这么说来，你的意思是我应该雇用你，而不用考虑一旦工作变得枯燥你会不会努力工作？别忘了，在编程工作中也有很枯燥的东西。每一项工作都有枯燥难耐的时刻。我不想雇用那些只想干有趣事情的人。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold">选修有大量编程实践的课程</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">我依然清楚记得我发誓绝不读研究生的那一刻。那是在一门叫做<span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">动态逻辑</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">的课程上，教师是活力十足的耶鲁大学教授</span><span style="font-family: Times New Roman">Lenore&nbsp;Zuck</span><span style="font-family: 宋体">，她是计算机系那些聪明的老师中最聪明的人之一。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">如今，&nbsp;由于记忆力糟糕，&nbsp;我已经差不多把这门课的内容忘光了，但是不管怎么说，在这里我还是想要对付着说一下。大致上，形式逻辑的意思是说，如果条件成立，你就能证明结论也成立。比如，根据形式逻辑，已知<span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">只要成绩好，就能被雇用</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">，然后假定</span><span style="font-family: Times New Roman">&#8220;Johnny</span><span style="font-family: 宋体">的成绩好</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">，你就可以得到一个崭新的结论</span><span style="font-family: Times New Roman">&#8220;Johnny</span><span style="font-family: 宋体">会被雇用</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">。这完全是经典方法。但是，一个解构主义者（</span><span style="font-family: Times New Roman">deconstructionist</span><span style="font-family: 宋体">）只需要</span><span style="font-family: Times New Roman">10</span><span style="font-family: 宋体">秒钟就能破坏形式逻辑中所有有用的东西。这样一来，留给你的只是一些趣味性，而不是实用性。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">现在再来说动态逻辑。它与形式逻辑其实是一回事，但是必须再多考虑时间因素。比如，<span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">你打开灯之后，就能看见自己的鞋子</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">，已知</span><span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">灯以前是亮的</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">，那么这就意味着</span><span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">你看见了自己的鞋子</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">对于像<span style="font-family: Times New Roman">Zuck</span><span style="font-family: 宋体">教授那样聪明的理论家，动态逻辑充满了吸引力，因为它看上去很有希望让你在形式上证明一些计算机程序的相关理论问题。这样做说不定很有用。比如，你可以用它在形式上证明，火星漫游车的闪存卡不会发生溢出（</span><span style="font-family: Times New Roman">overflow</span><span style="font-family: 宋体">）问题，不会因而整天一遍又一遍地重启，耽误了它在那颗赤红色的星球上漫游寻找火星人马文（</span><span style="font-family: Times New Roman">Marvin&nbsp;the</span></span><span style="font-family: '宋体'; font-size: 10.5pt"> </span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Martian<span style="font-family: 宋体">）。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">在第一堂课上，<span style="font-family: Times New Roman">Zuck</span><span style="font-family: 宋体">博士写满了整整两面黑板，甚至黑板旁边的墙上都写上了很多证明步骤。需要证明的问题是，有一个控制灯泡的开关，现在灯泡没有亮，这时你打开了开关，请证明灯泡将会点亮。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">整个证明过程复杂得不可思议，处处都是陷阱，必须十分小心。保证这个证明不出错太困难了，还不如直接相信打开开关灯就会亮。真的，虽然证明过程写满了许多块黑板，但是还是有许多中间步骤被省略了，因为如果要从形式逻辑上完整证明所有步骤，那就琐碎得无法形容了。许多步骤是用各种经典的逻辑证明方法推导得到的，包括归纳法、反证法等，甚至有些部分还是由旁听的研究生证明的。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">留给我们的课后作业是证明逆命题：如果灯原来是关着的，现在却亮了，那么请证明开关的状态一定同原来相反。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">我动手开始证明，我真的去证明了。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">我在图书馆里待了很长时间。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">我对照着<span style="font-family: Times New Roman">Zuck</span><span style="font-family: 宋体">博士的原始证明想依样画葫芦。研究了几个小时之后，我在其中发现了一个错误。可能我抄写的时候抄错了，但是这使得我想通了一件事。如果花费</span><span style="font-family: Times New Roman">3</span><span style="font-family: 宋体">个小时，写满了一块又一块的黑板，每一秒钟都可能出错，最后能够证明的却只是一个很琐碎的结论，那么这种方式有多大的实用性呢？在活生生、充满趣味的现实世界中，你永远都不会有机会使用它。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">但是，动态逻辑的理论家们对这一点不感兴趣。他们看上它不是因为它有用，而是因为它可以为他们带来终身教职。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">我放弃了这门课，并且发誓绝不会去读计算机科学的研究生。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">这个故事告诉我们，计算机科学与软件开发不是一回事。如果你真的非常幸运，你的学校可能会开设很像样的软件开发课程。但是另一种可能是，你的学校根本不教你在现实中如何编程，因为精英学校都觉得，教授工作技能最好留给职业技术学校、犯人重返社会的培训项目去做。你到处都能学怎么写代码。别忘了，我们是耶鲁大学，我们的使命是培养未来的世界领袖。你交了<span style="font-family: Times New Roman">16</span><span style="font-family: 宋体">万美元的学费，却在学循环语句的写法，这怎么可以？你以为这是什么地方，难道是机场沿途的酒店里临时拼凑起来不靠谱的</span><span style="font-family: Times New Roman">Java</span><span style="font-family: 宋体">语言培训班？哼哼。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">麻烦在于我们没有一种真正教授软件开发的专门学校。你如果想成为一个程序员，你可能只能选择计算机科学专业。这是一个不错的专业，但是它同软件开发不是一回事。在那些<span style="font-family: Times New Roman">400</span><span style="font-family: 宋体">等级的课程代号中，去寻找名称中带有</span><span style="font-family: Times New Roman">&#8220;Practicum&#8221;</span><span style="font-family: 宋体">这个词的课程吧（编者注：指供人实习的课程）。不要被这个拉丁语单词吓倒，这些都是有用的课程，之所以起这种名字，只是为了让那些文绉绉、装腔作势、满嘴胡说八道的公司经理们觉得高深莫测。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold">别担心所有工作都被印度人抢走</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">我首先要说的是，如果你本身就已经在印度了，或者你就是印度人，那么你真的毫无必要去想这件事，根本不用琢磨所有的工作机会是不是都跑到了印度。那些都是非常好的工作，好好地享受吧，祝你身体健康。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">但是，我不断听说计算机系的入学人数下降得很厉害，已经到了危险的程度。根据我听到的说法，其中的一个原因是<span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">学生们不愿去学一个工作机会都流向印度的专业</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">。这种担心大错特错，有很多理由可以反驳。首先，根据一时性的商业潮流决定个人的职业选择，这是愚蠢的。其次，即使编程工作无一幸存地都流向了印度和中国，但是学习编程本身依然是一种第一流的素质训练，可以为各种超级有趣的工作打下基础，比如业务流程工程（</span><span style="font-family: Times New Roman">business&nbsp;process&nbsp;engineering</span><span style="font-family: 宋体">）。再次，不管是在美国还是在印度，真正优秀的程序员依然是非常非常短缺的，这一点请相信我。不错，确实有相当一批失业的</span><span style="font-family: Times New Roman">IT</span><span style="font-family: 宋体">从业者在那里鼓噪，抱怨他们长时间找不到工作，但是你知道吗？即使冒着触怒这些人的风险，我还是要说，真正优秀的程序员根本不会失业。最后，你还能找到更好的专业吗？你觉得什么专业好？主修历史学？如果那样，你毕业的时候就会发现，根本没有其他选择，只能去法学院。不过我倒是知道一件事：</span><span style="font-family: Times New Roman">99%</span><span style="font-family: 宋体">的律师都痛恨他们的工作，痛恨他们当律师的每一分钟。可是，律师每周的工作时间偏偏长达</span><span style="font-family: Times New Roman">90</span><span style="font-family: 宋体">小时。就像我前面说过的：如果你喜欢编程，那么你真是受到了上天的眷顾。你是非常幸运的少数人之一，能够以自己喜欢的事谋生。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">不过说实话，我不觉得学生们真的有上面的想法。近年来，计算机系入学人数的下降只是回到了历史上的正常水平，因为前些年的互联网狂热使得入学人数出现了大泡沫，抬高了基数。由于这种泡沫，许多并不真的喜欢编程的人也来读计算机系。他们心里想的是，只要进了计算机系，将来就能找到诱人的高薪工作，就能获得<span style="font-family: Times New Roman">24</span><span style="font-family: 宋体">岁当上</span><span style="font-family: Times New Roman">CEO</span><span style="font-family: 宋体">、进行</span><span style="font-family: Times New Roman">IPO</span><span style="font-family: 宋体">的机会。谢天谢地，这些人现在都离计算机系远远的了。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold">找一份好的暑期实习工作</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: bold"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt">
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">精明的招聘负责人都知道，喜欢编程的人高中时就将牙医的信息输入了数据库，进入大学前就去过三次电脑夏令营，为校报做过内容管理系统，有过软件公司的夏季实习经历。招聘负责人就是要在你的简历上找这些东西。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">如果你喜欢编程，&nbsp;就不要随便什么工作都答应，否则你会犯下最大的错误。不管是暑期工作，还是兼职或者其他性质的工作，只要与编程无关，就不要轻易接受。我知道，其他<span style="font-family: Times New Roman">19</span><span style="font-family: 宋体">岁的孩子都想去购物中心里打工，在那里折叠衬衫。但是你与他们不同，你</span><span style="font-family: Times New Roman">19</span><span style="font-family: 宋体">岁时就已经掌握了一门非常有价值的技能。将时间浪费在折叠衬衫上是很愚蠢的，等到毕业的时候，你的简历上本应该写满了一大堆与编程相关的经历。就让那些财经类的毕业生去租车公司</span><span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">帮助人们满足他们租车的需要</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">吧，你要干的是别的事（在电视中扮演超人的</span><span style="font-family: Times New Roman">Tom</span></span><span style="font-family: '宋体'; font-size: 10.5pt"> </span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Welling<span style="font-family: 宋体">注</span><span style="font-family: Times New Roman">1</span><span style="font-family: 宋体">除外）。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">为了让你的生活变得更容易一些，也为了强调这整篇文章完全是为了满足我的个人目的，我要告诉你，我的公司<span style="font-family: Times New Roman">——Fog&nbsp;Creek</span><span style="font-family: 宋体">软件公司</span><span style="font-family: Times New Roman">——</span><span style="font-family: 宋体">提供软件开发方面的暑期实习机会。我们非常看重简历。</span><span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">比起其他公司的实习工作，你在</span><span style="font-family: Times New Roman">Fog&nbsp;Creek</span><span style="font-family: 宋体">最有可能学到更多的编写代码、软件开发、商业运作方面的知识。</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">这是去年夏天我们的一个实习生</span><span style="font-family: Times New Roman">Ben</span><span style="font-family: 宋体">说的。他会这样说，并不完全是因为我派了人到他的宿舍让他这样说。我们接受实习申请的截止日期是</span><span style="font-family: Times New Roman">2</span><span style="font-family: 宋体">月</span><span style="font-family: Times New Roman">1</span><span style="font-family: 宋体">日。一起来吧。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">如果你听从了我的建议，你还是有可能落得一个悲惨的下场，比如很早就卖掉了微软公司的股票，再比如拒绝了谷歌公司的工作机会，原因是你想要一间自己的可以关上门的独立办公室，或者做出了其他生命中愚蠢的决定。但是，这些可不是我的错。我一开始就告诉过你，不要听我的话。</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 18pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt">（注<span style="font-family: Times New Roman">1 </span><span style="font-family: 宋体">： </span><span style="font-family: Times New Roman">T&nbsp;o&nbsp;m&nbsp;W&nbsp;e&nbsp;l&nbsp;l&nbsp;i&nbsp;n&nbsp;g</span><span style="font-family: 宋体">是一个美国演员，&nbsp;在电视剧《超人前传》（</span><span style="font-family: Times New Roman">Smallville</span><span style="font-family: 宋体">）中扮演超人。该电视剧讲述还没有成长为后来超人的克拉克</span><span style="font-family: Times New Roman">&#183;</span><span style="font-family: 宋体">肯特少年时代的故事。）</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 18pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt"><span style="font-family: 宋体"><br />
</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt">作者简介：</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><br />
</span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><img class="alignleft size-thumbnail wp-image-1815" title="Joel Spolsky" alt="Joel Spolsky" src="http://www.programmer.com.cn/wp-content/uploads/2010/01/Joel-Spolsky2-150x150.gif" width="150" height="150" /><br />
Joel&nbsp;Spolsky<span style="font-family: 宋体">，世界最具影响的程序员网志</span><span style="font-family: Times New Roman">Joel&nbsp;on</span></span><span style="font-family: '宋体'; font-size: 10.5pt"> </span><span style="font-family: 'Times New Roman'; font-size: 10.5pt">Software<span style="font-family: 宋体">的主人，软件业一位旗帜鲜明的思想者，一位传统软件管理理念的挑战者。他创办的这个网站被程序员誉为</span><span style="font-family: Times New Roman">&#8220;</span><span style="font-family: 宋体">反呆伯特宣言书</span><span style="font-family: Times New Roman">&#8221;</span><span style="font-family: 宋体">，并被翻译为三十多种语言。</span><span style="font-family: Times New Roman">Joel</span><span style="font-family: 宋体">毕业于耶鲁大学，随后即进入微软公司工作，曾任微软公司</span><span style="font-family: Times New Roman">E&nbsp;x&nbsp;c&nbsp;e&nbsp;l </span><span style="font-family: 宋体">开发小组项目经理。现在他在自己创办的</span><span style="font-family: Times New Roman">Fog&nbsp;Creek</span><span style="font-family: 宋体">软件公司任</span><span style="font-family: Times New Roman">CEO</span><span style="font-family: 宋体">。此外，他与人合办的</span><span style="font-family: Times New Roman">Stack&nbsp;Overflow</span><span style="font-family: 宋体">已经成为如今最热门的技术网站。</span></span></p>
<p style="text-align: left; margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span style="font-family: 宋体"><br />
</span></span></p>
 <img src ="http://www.blogjava.net/jackfrued/aggbug/311556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackfrued/" target="_blank">骆昊</a> 2010-02-01 21:37 <a href="http://www.blogjava.net/jackfrued/archive/2010/02/01/311556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>