<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>舒の随想日记 &#187; 2010</title>
	<atom:link href="http://blog.hesey.net/2010/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.hesey.net</link>
	<description>思考生活，关注科技。To live is to CHANGE the world.</description>
	<lastBuildDate>Tue, 03 Apr 2012 13:15:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>CosHtmlCache静态化的自动化访问</title>
		<link>http://blog.hesey.net/2010/12/auto-visit-for-cache-create-by-coshtmlcache.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=auto-visit-for-cache-create-by-coshtmlcache</link>
		<comments>http://blog.hesey.net/2010/12/auto-visit-for-cache-create-by-coshtmlcache.html#comments</comments>
		<pubDate>Thu, 23 Dec 2010 12:53:15 +0000</pubDate>
		<dc:creator>Hesey</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.hesey.net/?p=623</guid>
		<description><![CDATA[为了提升访问速度并利于SEO，博主的博客使用CosHtmlCache插件进行静态化处理，该插件的一个不足就是就是必须在非登录状态下访问页面才会自动生成缓存，在后台的插件设置中只有删除缓存而没有一次性静态化的选项，这非常不方便，特别是当博文比较多达到几百篇时，显然人工点击是让人无法忍受的。 第一个想到的是直接修改插件，对文章内容进行变更后自动生成缓存，但是这里有一个问题：如果插件升级，就必须重新修改代码，另一方面这也破坏了封装原则。 鉴于此，我写了两个程序尝试解决这个问题，思路是用程序模拟GET请求自动访问所有页面，这样达到了与人工点击一样的效果。至于如何得到博客的所有文章和所有页面的地址，我使用了Google Sitemap XML插件。当然并不是单纯为了得到网址才安装的这个插件，之前为了优化Google的搜索，用这个插件自动生成了Sitemap然后在Google的Webmaster Tools里提交就可以起到比较好的收录效果。这个插件当然也可以提供博客所有的网址。 Java版本采用DOM对XML文件进行处理，PHP版本采用正则表达式解析出网址。 Java版本和PHP版本都需要用户填写Sitemap的XML地址 Java版本源码下载：点我下载 PHP版本源码下载：点我下载 你也可以自己实现一个这样的程序，为便于参考，将源代码贴出如下： Java Edition Visitor.java import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Visitor { public static CountDownLatch latch; // 在命令行下输入XML文件所在地址，例如：java Visitor http://yourdomain.com/yourxml.xml public static void main(String[] args) { if (args.length == 0) { System.out.println("没有输入XML文件所在地址"); } else { String XMLaddr = args[0]; try { [...]]]></description>
			<content:encoded><![CDATA[<p>为了提升访问速度并利于SEO，博主的博客使用<a href="http://www.storyday.com/tag/cos-html-cache"><span style="color: #008000;"><strong>CosHtmlCache</strong></span></a>插件进行静态化处理，该插件的一个不足就是就是必须在非登录状态下访问页面才会自动生成缓存，在后台的插件设置中只有删除缓存而没有一次性静态化的选项，这非常不方便，特别是当博文比较多达到几百篇时，显然人工点击是让人无法忍受的。</p>
<p>第一个想到的是直接修改插件，对文章内容进行变更后自动生成缓存，但是这里有一个问题：如果插件升级，就必须重新修改代码，另一方面这也破坏了封装原则。</p>
<p>鉴于此，我写了两个程序尝试解决这个问题，思路是用程序模拟GET请求自动访问所有页面，这样达到了与人工点击一样的效果。至于如何得到博客的所有文章和所有页面的地址，我使用了<a href="http://itx-technologies.com/blog/simple-google-sitemap-xml-for-wordpress"><span style="color: #008000;"><strong>Google Sitemap XML</strong></span></a>插件。当然并不是单纯为了得到网址才安装的这个插件，之前为了优化Google的搜索，用这个插件自动生成了Sitemap然后在Google的<a href="http://www.google.com/webmasters/tools/"><span style="color: #008000;"><strong>Webmaster Tools</strong></span></a>里提交就可以起到比较好的收录效果。这个插件当然也可以提供博客所有的网址。</p>
<p>Java版本采用DOM对XML文件进行处理，PHP版本采用正则表达式解析出网址。<span id="more-623"></span></p>
<p><strong><span style="color: #ff0000;">Java版本和PHP版本都需要用户填写Sitemap的XML地址</span></strong></p>
<p>Java版本源码下载：<a href="visit_java.zip"><span style="color: #ff0000;"><strong>点我下载</strong></span></a></p>
<p>PHP版本源码下载：<a href="visit_php.zip"><span style="color: #ff0000;"><strong>点我下载</strong></span></a></p>
<p>你也可以自己实现一个这样的程序，为便于参考，将源代码贴出如下：</p>
<p><span style="color: #ff0000;"><strong>Java Edition</strong></span></p>
<p>Visitor.java</p>
<pre class="brush:[java]">import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Visitor {
	public static CountDownLatch latch;

	// 在命令行下输入XML文件所在地址，例如：java Visitor http://yourdomain.com/yourxml.xml
	public static void main(String[] args) {
		if (args.length == 0) {
			System.out.println("没有输入XML文件所在地址");
		} else {
			String XMLaddr = args[0];
			try {
				visit(XMLaddr);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public static void visit(String XMLaddr) throws Exception {
		XMLAnalyser xa = new XMLAnalyser(XMLaddr);
		List&lt;String&gt; URLs = xa.parseXML();

		latch = new CountDownLatch(URLs.size());

		ExecutorService exec = Executors.newCachedThreadPool();
		for (int i = 0; i &lt; lt; URLs.size(); i++) {
			exec.execute(new MailMan(URLs.get(i)));
		}
		exec.shutdown();

		latch.await();
		System.out.println("任务完成");
	}
}
</pre>
<p>XMLAnalyser.java</p>
<pre class="brush:[java]">import java.util.LinkedList;
import java.util.List;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class XMLAnalyser {
	private String XMLaddr;

	public XMLAnalyser(String XMLaddr) {
		this.XMLaddr = XMLaddr;
	}

	public List&lt;String&gt; parseXML() throws Exception {
		Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(XMLaddr);
		NodeList list = doc.getElementsByTagName("loc");
		List&lt;String&gt; URLs = getTagElements(list);
		return URLs;
	}

	private List&lt;String&gt; getTagElements(NodeList list) {
		List&lt;String&gt; URLs = new LinkedList&lt;String&gt;();
		for (int i = 0; i &lt; list.getLength(); i++) {
			URLs.add(list.item(i).getChildNodes().item(0).getNodeValue());
		}
		return URLs;
	}
}
</pre>
<p>MailMan.java</p>
<pre class="brush:[java]">import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;

public class MailMan implements Runnable {
	private String URL;
	private String Domain;
	private Socket socket;
	private BufferedReader br;
	private PrintWriter pw;
	private List&lt;String&gt; output;

	public MailMan(String URL) throws MalformedURLException {
		this.URL = URL;
		this.Domain = new URL(URL).getHost();
		output = new LinkedList&lt;String&gt;();
	}

	public void run() {
		initialize();
		sendToServer();
		receiveFromServer();
		closeConnection();
	}

	private void initialize() {
		String Get = "GET " + URL + " HTTP/1.1";
		String Host = "Host: " + Domain;

		output.add(Get);
		output.add(Host);

		try {
			InetAddress addr = InetAddress.getByName(Domain);
			socket = new Socket(addr, 80);
			br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
			pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void sendToServer() {
		for (int i = 0; i &lt; output.size(); i++) {
			pw.println(output.get(i));
		}
		pw.println();
		pw.flush();
	}

	private String receiveFromServer() {
		String temp;
		StringBuilder infoReceived = new StringBuilder();
		try {
			while ((temp = br.readLine()) != null) {
				// Just receive but do nothing
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return infoReceived.toString();
	}

	private void closeConnection() {
		try {
			br.close();
			pw.close();
			socket.close();
			System.out.println(URL + " Received.");
			Visitor.latch.countDown();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
</pre>
<p><span style="color: #ff0000;"><strong>PHP Edition</strong></span></p>
<pre class="brush:[php]">&lt;?php
$url = ""; // 填写你的XML地址
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);

$pattern = "/(&lt;loc&gt;(.*)&lt;\/loc&gt;)/";
preg_match_all($pattern, $data, $matches);

$mh = curl_multi_init();

for ($i=0;$i&lt;count($matches[2]);$i++){
	$arr[] = curl_init();
}

for ($i=0;$i&lt;count($arr);$i++){
	echo "Get the page: ".$matches[2][$i]."&lt;br/&gt;";
	curl_setopt($arr[$i], CURLOPT_URL, $matches[2][$i]);
	curl_setopt($arr[$i], CURLOPT_HEADER, 0);
	curl_setopt($arr[$i], CURLOPT_RETURNTRANSFER, 1);
	curl_multi_add_handle($mh,$arr[$i]);
}

$active = null;
do {
	$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active &amp;&amp; $mrc == CURLM_OK) {
	if (curl_multi_select($mh) != -1) {
		do {
			$mrc = curl_multi_exec($mh, $active);
		} while ($mrc == CURLM_CALL_MULTI_PERFORM);
	}
}
echo "&lt;b&gt;&lt;font color=\"#FF0000\"&gt;Success.&lt;/font&gt;&lt;/b&gt;\n&lt;br/&gt;";
for ($i=0;$i&lt;count($arr);$i++){
	curl_multi_remove_handle($mh, $arr[$i]);
}

curl_multi_close($mh);
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.hesey.net/2010/12/auto-visit-for-cache-create-by-coshtmlcache.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>浅谈多态机制的意义及实现</title>
		<link>http://blog.hesey.net/2010/12/significance-and-implementation-of-polymorphism.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=significance-and-implementation-of-polymorphism</link>
		<comments>http://blog.hesey.net/2010/12/significance-and-implementation-of-polymorphism.html#comments</comments>
		<pubDate>Thu, 16 Dec 2010 14:26:08 +0000</pubDate>
		<dc:creator>Hesey</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://blog.hesey.net/?p=596</guid>
		<description><![CDATA[在面向对象编程（Object-Oriented Programming, OOP）中，多态机制无疑是其最具特色的功能，甚至可以说，不运用多态的编程不能称之为OOP。这也是为什么有人说，使用面向对象语言的编程和面向对象的编程是两码事。 多态并没有一个严格的定义，维基百科上给它下的定义比较宽松： Subtype polymorphism, almost universally called just polymorphism in the context of object-oriented programming, is the ability of one type, A, to appear as and be used like another type, B. 一、子类型和子类 这里我想先提一下子类型（Subtype）这个词和子类（Subclass）的区别，简单地说，只要是A类运用了extends关键字实现了对B类的继承，那么我们就可以说Class A是Class B的子类，子类是一个语法层面上的词，只要满足继承的语法，就存在子类关系。 子类型比子类有更严格的要求，它不仅要求有继承的语法，同时要求如果存在子类对父类方法的改写（override），那么改写的内容必须符合父类原本的语义，其被调用后的作用应该和父类实现的效果方向一致。 对二者的对比是想强调一点：只有保证子类都是子类型，多态才有意义。 二、多态的机制 本质上多态分两种： 1、编译时多态（又称静态多态） 2、运行时多态（又称动态多态） 重载（overload）就是编译时多态的一个例子，编译时多态在编译时就已经确定，运行时运行的时候调用的是确定的方法。 我们通常所说的多态指的都是运行时多态，也就是编译时不确定究竟调用哪个具体方法，一直延迟到运行时才能确定。这也是为什么有时候多态方法又被称为延迟方法的原因。 在维基百科中多态的行为被描述为： The primary usage of polymorphism in industry (object-oriented [...]]]></description>
			<content:encoded><![CDATA[<p>在面向对象编程（<a href="http://en.wikipedia.org/wiki/Object-Oriented_Programming"><span style="color: #008000;"><strong>Object-Oriented Programming</strong></span></a>, OOP）中，多态机制无疑是其最具特色的功能，甚至可以说，不运用多态的编程不能称之为OOP。这也是为什么有人说，<span style="color: #ff0000;"><strong>使用面向对象语言的编程和面向对象的编程是两码事。</strong></span></p>
<p>多态并没有一个严格的定义，维基百科上给它下的定义比较宽松：</p>
<blockquote><p><span style="color: #ff6600;"><strong>Subtype polymorphism, almost universally called just polymorphism in the context of object-oriented programming, is the ability of one type, A, to appear as and be used like another type, B.</strong></span></p></blockquote>
<h1>一、子类型和子类</h1>
<blockquote><p>这里我想先提一下子类型（<a href="http://en.wikipedia.org/wiki/Subtype"><span style="color: #008000;"><strong>Subtype</strong></span></a>）这个词和子类（<a href="http://en.wikipedia.org/wiki/Subclass_%28computer_science%29"><span style="color: #008000;"><strong>Subclass</strong></span></a>）的区别，简单地说，只要是A类运用了extends关键字实现了对B类的继承，那么我们就可以说Class A是Class B的子类，<span style="color: #ff0000;"><strong>子类是一个语法层面上的词，只要满足继承的语法，就存在子类关系。<span id="more-596"></span></strong></span></p>
<p>子类型比子类有更严格的要求，它不仅要求有继承的语法，同时要求如果存在子类对父类方法的改写（override），那么<span style="color: #ff0000;"><strong>改写的内容必须符合父类原本的语义，其被调用后的作用应该和父类实现的效果方向一致。</strong></span></p>
<p>对二者的对比是想强调一点：<span style="color: #ff0000;"><strong>只有保证子类都是子类型，多态才有意义。</strong></span></p></blockquote>
<h1>二、多态的机制</h1>
<blockquote><p>本质上多态分两种：</p>
<blockquote><p><span style="color: #ff6600;"><strong>1、编译时多态（又称静态多态）</strong></span></p>
<p><span style="color: #ff6600;"><strong>2、运行时多态（又称动态多态）</strong></span></p></blockquote>
<p>重载（overload）就是编译时多态的一个例子，编译时多态在编译时就已经确定，运行时运行的时候调用的是确定的方法。</p>
<p><span style="color: #ff0000;"><strong>我们通常所说的多态指的都是运行时多态，也就是编译时不确定究竟调用哪个具体方法，一直延迟到运行时才能确定。</strong></span>这也是为什么有时候多态方法又被称为延迟方法的原因。</p>
<p>在维基百科中多态的行为被描述为：</p>
<blockquote><p><span style="color: #ff6600;"><strong>The primary usage of polymorphism in industry (object-oriented programming theory) is the ability of objects belonging to different types to respond to method, field, or property calls of the same name, each one according to an appropriate type-specific behavior.</strong></span></p></blockquote>
<p>下面简要介绍一下运行时多态（以下简称多态）的机制。</p>
<p>多态通常有两种实现方法：</p>
<blockquote><p><span style="color: #ff6600;"><strong>1、子类继承父类（extends）</strong></span></p>
<p><span style="color: #ff6600;"><strong>2、类实现接口（implements）</strong></span></p></blockquote>
<p>无论是哪种方法，其核心之处就在于对父类方法的改写或对接口方法的实现，以取得在运行时不同的执行效果。</p>
<p>要使用多态，在声明对象时就应该遵循一条法则：<span style="color: #ff0000;"><strong>声明的总是父类类型或接口类型，创建的是实际类型。</strong></span>举例来说，假设我们要创建一个ArrayList对象，声明就应该采用这样的语句：</p>
<pre class="brush:[java]">List list = new ArrayList();</pre>
<p>而不是</p>
<pre class="brush:[java]">ArrayList list = new ArrayList();</pre>
<p><span style="color: #ff0000;"><strong>在定义方法参数时也通常总是应该优先使用父类类型或接口类型</strong></span>，例如某方法应该写成：</p>
<pre class="brush:[java]">public void doSomething(List list);</pre>
<p>而不是</p>
<pre class="brush:[java]">public void doSomething(ArrayList list);</pre>
<p>这样声明最大的好处在于结构的灵活性：假如某一天我认为ArrayList的特性无法满足我的要求，我希望能够用LinkedList来代替它，那么只需要在对象创建的地方把new ArrayList()改为new LinkedList即可，其它代码一概不用改动。</p>
<blockquote><p><span style="color: #ff6600;"><strong>The programmer (and the program) does not have to know the exact type of the object in advance, and so the exact behavior is determined at run-time (this is called late binding or dynamic binding).</strong></span></p></blockquote>
<p>虚拟机会在执行程序时动态调用实际类的方法，它会通过一种名为动态绑定（又称延迟绑定）的机制自动实现，这个过程对程序员来说是透明的。</p></blockquote>
<h1>三、多态的用途</h1>
<blockquote><p>多态最大的用途我认为在于<span style="color: #ff0000;"><strong>对设计和架构的复用</strong></span>，更进一步来说，《<a href="http://book.douban.com/subject/1052241/"><span style="color: #008000;"><strong>设计模式</strong></span></a>》中提倡的针对接口编程而不是针对实现编程就是充分利用多态的典型例子。<span style="color: #ff0000;"><strong>定义功能和组件时定义接口，实现可以留到之后的流程中。</strong></span>同时一个接口可以有多个实现，甚至于完全可以在一个设计中同时使用一个接口的多种实现（例如针对ArrayList和LinkedList不同的特性决定究竟采用哪种实现）。</p></blockquote>
<h1>四、多态的实现</h1>
<blockquote><p>下面从虚拟机运行时的角度来简要介绍多态的实现原理，这里以Java虚拟机（<a href="http://en.wikipedia.org/wiki/Java_Virtual_Machine"><span style="color: #008000;"><strong>Java Virtual Machine</strong></span></a>, JVM）规范的实现为例。</p>
<p>在JVM执行Java字节码时，<span style="color: #ff0000;"><strong>类型信息被存放在方法区中</strong></span>，通常为了优化对象调用方法的速度，方法区的类型信息中增加一个指针，该指针指向一张记录该类方法入口的表（称为方法表），<span style="color: #ff0000;"><strong>表中的每一项都是指向相应方法的指针。</strong></span></p>
<p>方法表的构造如下：</p>
<p>由于Java的单继承机制，一个类只能继承一个父类，而所有的类又都继承自Object类。方法表中<span style="color: #ff0000;"><strong>最先存放的是Object类的方法，接下来是该类的父类的方法，最后是该类本身的方法。</strong></span>这里关键的地方在于，<span style="color: #ff0000;"><strong>如果子类改写了父类的方法，那么子类和父类的那些同名方法共享一个方法表项，都被认作是父类的方法。</strong></span></p>
<p>注意这里只有非私有的实例方法才会出现，并且静态方法也不会出现在这里，原因很容易理解：静态方法跟对象无关，可以将方法地址直接引用，而不像实例方法需要间接引用。</p>
<p>更深入地讲，静态方法是由虚拟机指令invokestatic调用的，私有方法和构造函数则是由invokespecial指令调用，只有被invokevirtual和invokeinterface指令调用的方法才会在方法表中出现。</p>
<p>由于以上方法的排列特性（Object——父类——子类），使得<span style="color: #ff0000;"><strong>方法表的偏移量总是固定的</strong></span>。例如，对于任何类来说，其方法表中equals方法的偏移量总是一个定值，所有继承某父类的子类的方法表中，其父类所定义的方法的偏移量也总是一个定值。</p>
<p>前面说过，方法表中的表项都是指向该类对应方法的指针，这里就开始了多态的实现：</p>
<p>假设Class A是Class B的子类，并且A改写了B的方法method()，那么在B的方法表中，method方法的指针指向的就是B的method方法入口。</p>
<p>而对于A来说，它的方法表中的method方法则会指向其自身的method方法而非其父类的（这在类加载器载入该类时已经保证，同时JVM会保证总是能从对象引用指向正确的类型信息）。</p>
<p>结合<span style="color: #ff0000;"><strong>方法指针偏移量是固定的</strong></span>以及<span style="color: #ff0000;"><strong>指针总是指向实际类的方法域</strong></span>，我们不难发现多态的机制就在这里：</p>
<p>在调用方法时，实际上必须首先完成实例方法的符号引用解析，结果是该符号引用被解析为方法表的偏移量。虚拟机通过对象引用得到方法区中类型信息的入口，查询类的方法表，当将子类对象声明为父类类型时，形式上调用的是父类方法，此时虚拟机会从实际类的方法表（虽然声明的是父类，但是实际上这里的类型信息中存放的是子类的信息）中查找该方法名对应的指针（这里用“查找”实际上是不合适的，前面提到过，方法的偏移量是固定的，所以只需根据偏移量就能获得指针），进而就能指向实际类的方法了。</p>
<p>我们的故事还没有结束，事实上上面的过程仅仅是利用继承实现多态的内部机制，多态的另外一种实现方式：实现接口相比而言就更加复杂，原因在于，<span style="color: #ff0000;"><strong>Java的单继承保证了类的线性关系，而接口可以同时实现多个，这样光凭偏移量就很难准确获得方法的指针。</strong></span>所以在JVM中，多态的实例方法调用实际上有两种指令：</p>
<blockquote><p><span style="color: #ff6600;"><strong>invokevirtual指令用于调用声明为类的方法；</strong></span></p>
<p><span style="color: #ff6600;"><strong>invokeinterface指令用于调用声明为接口的方法。</strong></span></p></blockquote>
<p>当使用invokeinterface指令调用方法时，就不能采用固定偏移量的办法，只能老老实实挨个找了（当然实际实现并不一定如此，JVM规范并没有规定究竟如何实现这种查找，不同的JVM实现可以有不同的优化算法来提高搜索效率）。我们不难看出，<span style="color: #ff0000;"><strong>在性能上，调用接口引用的方法通常总是比调用类的引用的方法要慢。</strong></span>这也告诉我们，在类和接口之间优先选择接口作为设计并不总是正确的，当然设计问题不在本文探讨的范围之内，但显然具体问题具体分析仍然不失为更好的选择。</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.hesey.net/2010/12/significance-and-implementation-of-polymorphism.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>吾生也有涯，而知也无涯</title>
		<link>http://blog.hesey.net/2010/12/eternal-learning.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=eternal-learning</link>
		<comments>http://blog.hesey.net/2010/12/eternal-learning.html#comments</comments>
		<pubDate>Thu, 16 Dec 2010 06:51:28 +0000</pubDate>
		<dc:creator>Hesey</dc:creator>
				<category><![CDATA[思考]]></category>

		<guid isPermaLink="false">http://blog.hesey.net/?p=581</guid>
		<description><![CDATA[昨天有个朋友在 Twitter 上抱怨说不想继续上坑爹的大学了，说实话我也这么想过，总觉得学不到什么真东西，我相信这也是很多大学生的心声。但奇怪的是现在我却越发希望能继续留在学校，能够继续有去图书馆借书的权利，有大把能够自由读书的时间可以支配（当然事实上在学校里并没有这么多空闲的时间，很多时候你不得不去干一些很无聊的事情）。我想工作以后一是没有这么多读书的时间，二是也不会像现在这么有精力和兴致去读好多好多的书，但我仍然希望我能做到这些，你知道，这个行业的知识更新太快，并不是一个学会一项本领就能吃大半辈子的行业。 学的东西越多，越发觉得自己还有好多东西要去学，而时间却越来越少。还能回想起第一次踏进大学的校门，那个新奇的眼神，憧憬着自己的大学生活，心心挂念多年的大学梦终于现在就在眼前，就在脚下。而现在呢，再过半年兴许就要离开这里，去追寻更远的梦。我知道有很多词语可以形容时间过得快，但是这实在太快了，就像睡了一个没有梦的觉一样，前一秒还是睡前的思绪，下一刻就变成了清晨的阳光。 但是我想我还是学到了一些东西，这得益于很多朋友、师长的帮助。甚至是有些人他未必刻意去帮你，但是从他们的习惯、言谈中，你就能够学到很多东西。在这个学习的过程中，我真的爱上了读书。不知道是不是有人能体会这种感觉，每次我从快递手里拿到买的新书时，那种感觉几乎就像是某些人抱着等体积的黄金一样兴奋。 不少人都说国内的书价太高，当然我也曾经那么觉得。但是现在想来，还是看买的是什么书吧，有些书看的时候很刺激，看过一遍之后就再也不会想起来。而有些书则让我废寝忘食，甚至是读完从图书馆借来的以后，实在忍不住再从网上买一本自己收藏，这样的书并不多，但它就像知音一样，让人难舍难分。 另一方面，我相信一本好书带给读者的价值远远超过它本身的价格。拿计算机相关的书籍来说，一本普通小说厚度的专业书往往要卖到50以上，无怪乎有人嫌贵，但是细细想来，如果这本书能够给读者带来哪怕是一两个具有启发性的知识点，那在工作和生活中给读者带来的效益将不可估量，就像大辉老师说的，100本书，每本都能学点什么，那也是个牛人了。即使是经济效益，我想至少也该有上千元（我真觉得这个数说得实在太小了）。但是这里有两个前提，一是书必须是好书，好书的判断取决于读者，这里就牵涉到选书的问题；二是读者能够确实地去认真读书，将书中的知识转化为自己的能力，否则书就只是一堆纸而已。 说回学习来，现在真是感慨之前浪费了多少时间啊，也许早先的时候多读一些书，现在的底气也会更足。当然我更倾向于认为如果早年读了更多书，现在会更加因为对知识的迫切渴望和自身不足而抱憾。但或许这也是另一种形式的逃避？指望着将自己打造成完美的存在以后再去干那些不那么完美的事情。 学习是一辈子的事，特别是当自己喜欢上学习这件事本身的时候。我便问自己，那是不是这辈子就光看书不工作了呢？ 《Dreaming in Code》一书里谈到了很多软件公司当年的故事，书中的经验反复向读者强调着一点：决不能等软件开发出来以后才开始宣传和销售工作。这一点对我的启发很大：你永远不应该等环境都尽善尽美后才开始做事。举例来说，决不能因为软件可能存在Bug就不发行，决不能因为复习资料没有准备周全就不开始复习：） 在创建某学术交流沙龙的时候，曾经有朋友提出是不是等计划周详以后再实施，我马上提出，我们必须现在就开始着手去做，至于问题，边做边解决。还是那句话：你永远不应该等环境都尽善尽美后才开始做事。这也得到了所有人的认可。 既然世界是不完美的，为什么我们非要等一个完美的开端呢？美丽的故事总是由我们自己书写的，不是吗？]]></description>
			<content:encoded><![CDATA[<p>昨天有个朋友在 <a href="https://twitter.com"><span style="color: #008000;"><strong>Twitter</strong></span></a> 上抱怨说不想继续上坑爹的大学了，说实话我也这么想过，总觉得学不到什么真东西，我相信这也是很多大学生的心声。但奇怪的是现在我却越发希望能继续留在学校，能够继续有去图书馆借书的权利，有大把能够自由读书的时间可以支配（当然事实上在学校里并没有这么多空闲的时间，很多时候你不得不去干一些很无聊的事情）。我想工作以后一是没有这么多读书的时间，二是也不会像现在这么有精力和兴致去读好多好多的书，但我仍然希望我能做到这些，你知道，这个行业的知识更新太快，并不是一个学会一项本领就能吃大半辈子的行业。<span id="more-581"></span></p>
<p><span style="color: #ff0000;"><strong>学的东西越多，越发觉得自己还有好多东西要去学，而时间却越来越少。</strong></span>还能回想起第一次踏进大学的校门，那个新奇的眼神，憧憬着自己的大学生活，心心挂念多年的大学梦终于现在就在眼前，就在脚下。而现在呢，再过半年兴许就要离开这里，去追寻更远的梦。我知道有很多词语可以形容时间过得快，但是这实在太快了，就像睡了一个没有梦的觉一样，前一秒还是睡前的思绪，下一刻就变成了清晨的阳光。</p>
<p>但是我想我还是学到了一些东西，这得益于很多朋友、师长的帮助。甚至是有些人他未必刻意去帮你，但是从他们的习惯、言谈中，你就能够学到很多东西。在这个学习的过程中，我真的爱上了读书。不知道是不是有人能体会这种感觉，<span style="color: #ff0000;"><strong>每次我从快递手里拿到买的新书时，那种感觉几乎就像是某些人抱着等体积的黄金一样兴奋。</strong></span></p>
<p>不少人都说国内的书价太高，当然我也曾经那么觉得。但是现在想来，还是看买的是什么书吧，有些书看的时候很刺激，看过一遍之后就再也不会想起来。而<span style="color: #ff0000;"><strong>有些书则让我废寝忘食，甚至是读完从图书馆借来的以后，实在忍不住再从网上买一本自己收藏</strong></span>，这样的书并不多，但它就像知音一样，让人难舍难分。</p>
<p>另一方面，<span style="color: #ff0000;"><strong>我相信一本好书带给读者的价值远远超过它本身的价格。</strong></span>拿计算机相关的书籍来说，一本普通小说厚度的专业书往往要卖到50以上，无怪乎有人嫌贵，但是细细想来，如果这本书能够给读者带来哪怕是一两个具有启发性的知识点，那在工作和生活中给读者带来的效益将不可估量，就像大辉老师说的，100本书，每本都能学点什么，那也是个牛人了。即使是经济效益，我想至少也该有上千元（我真觉得这个数说得实在太小了）。但是这里有两个前提，一是<span style="color: #ff0000;"><strong>书必须是好书</strong></span>，好书的判断取决于读者，这里就牵涉到选书的问题；二是<span style="color: #ff0000;"><strong>读者能够确实地去认真读书</strong></span>，将书中的知识转化为自己的能力，否则书就只是一堆纸而已。</p>
<p>说回学习来，现在真是感慨之前浪费了多少时间啊，也许早先的时候多读一些书，现在的底气也会更足。当然我更倾向于认为如果早年读了更多书，现在会更加因为对知识的迫切渴望和自身不足而抱憾。但或许这也是另一种形式的逃避？指望着将自己打造成完美的存在以后再去干那些不那么完美的事情。</p>
<p>学习是一辈子的事，特别是当自己喜欢上学习这件事本身的时候。我便问自己，那是不是这辈子就光看书不工作了呢？</p>
<p>《<a href="http://www.amazon.com/Dreaming-Code-Programmers-Transcendent-Software/dp/1400082463"><span style="color: #008000;"><strong>Dreaming in Code</strong></span></a>》一书里谈到了很多软件公司当年的故事，书中的经验反复向读者强调着一点：<span style="color: #ff0000;"><strong>决不能等软件开发出来以后才开始宣传和销售工作。</strong></span>这一点对我的启发很大：<span style="color: #ff0000;"><strong>你永远不应该等环境都尽善尽美后才开始做事。</strong></span>举例来说，决不能因为软件可能存在Bug就不发行，决不能因为复习资料没有准备周全就不开始复习：）</p>
<p>在创建某学术交流沙龙的时候，曾经有朋友提出是不是等计划周详以后再实施，我马上提出，我们必须现在就开始着手去做，至于问题，边做边解决。还是那句话：<span style="color: #ff0000;"><strong>你永远不应该等环境都尽善尽美后才开始做事。</strong></span>这也得到了所有人的认可。</p>
<p>既然世界是不完美的，为什么我们非要等一个完美的开端呢？美丽的故事总是由我们自己书写的，不是吗？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hesey.net/2010/12/eternal-learning.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>为什么说思想高于语法</title>
		<link>http://blog.hesey.net/2010/12/why-thought-above-grammar.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=why-thought-above-grammar</link>
		<comments>http://blog.hesey.net/2010/12/why-thought-above-grammar.html#comments</comments>
		<pubDate>Wed, 08 Dec 2010 12:11:59 +0000</pubDate>
		<dc:creator>Hesey</dc:creator>
				<category><![CDATA[思考]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.hesey.net/?p=564</guid>
		<description><![CDATA[在普通人眼中，一名程序员懂的语言越多，做出的界面越华丽，很大程度上便意味着他的编程水平越高，但是从软件工程师的角度来说，只从语言、GUI编程这些角度并不足以窥之全貌。语言只是程序开发相对低层的东西（与“底层”有所区别），语言就像工具，和扳手、钳子一样，会用它们只是干活的起始，语言又跟英语差不多，会说Hello World不代表你能用英语和人探讨人生哲学了，相反，语言是基本关，是程序设计的必要条件。 Pascal之父，结构化程序设计先驱Niklaus Wirth提出了那个经典的等式：Algorithms + Data Structures = Programs. 事实上在程序设计、架构设计的过程中，很少会去考虑相关的语言细节（Don&#8217;t care for the implement, just design!），当然我会考虑这样的设计采用什么样的语言、哪种框架来做可行且对我来说最高效。这两年脚本语言大行其道，不是因为它们的功能之强大可以超越其它任何语言，恰是因其高效，生产力不仅可以用来衡量程序员，也可以用于评估一门语言。没有最好的语言，只有适合的语言，好的开发者应当懂得因地制宜，用最恰当的手段最高效地解决眼前的问题。 武侠小说里的剑客们最厉害的地方绝不是他们拿着什么神兵利器，而是剑法，好的武器固然可以提升战斗力，但是高手过招，一击必杀，往往剑尚未出，胜负已定。 前段时间Google公司首席Java架构师Joshua Bloch接受采访时曾把程序员选择编程语言比作是选择酒吧。 “选择一种语言时，所考虑的不仅仅是一系列技术上的权衡，而是在选择一个社群。这就像选择一个酒吧。没错，你希望去一个提供美酒的酒吧，但是美酒不是最重要的。主要是那个酒吧里都有什么样的人，他们在谈论些什么。选择计算机语言也是这样的。时间一长，就这门语言也形成了一个社群，社群里不仅仅有人群，还有他们的软件成果，如工具、库等。” 与人的接触中最大的交流是什么呢，是思想，是方法，一个成熟的程序员不会整天纠结于语法糖，因为那实在是一件太不值得投入的事了。在于人交流的过程中，我们学习到更多解决问题的方式，包括读书也是。为什么强调不要光盯着一种语言不放？一种语言便是一种思想，是一种解决方案，它们之所以各不相同是因为各具特色。这里说的不是不同语言的不同语法，语法虽然各异，但差异更大的是思想，换句话来讲，你完全可以用A语言去实现B语言的很多特性，A语言的一些用法也完全可以在B语言里套用，语法虽然不同，但是思想高于语言。 好的程序员应该时刻提醒自己不要试图用一种方式解决所有问题，这里包含两点：1、采用不同的工具；2、用同种工具但多种不同方式。这可以拓宽人的思路，并且我们可以有更多的选择，选择多是件好事，大家可以讨论、筛选出最合适的方案，怕的是别无选择，不免让人感到被动。 初学语言的语法之后，再看的书大多就是关于思想的，学习大师的思想，学习前人解决问题的经典算法，这时我们常常会发现书中的代码甚至比语法书里的要“简单”得多，大师们总是尝试用这些简单的代码最简洁地说明思想。初学者和熟手的区别在于，新手容易陷入代码细节中去，而熟手可以在更高的视角上，反观代码，抽象出层次，代码呈现出另外一种结构，更深地思考这种设计的用途和原因。 另外一方面，编码的时间已经被压缩得越来越短。在《梦断代码》中，某公司的统计数据标明，项目的实际编码时间往往不到项目总时间的10%。此外，好的设计和架构通常可以最大程度地简化代码逻辑，也只有好的设计才能帮助程序员以最快的速度编写出优良的代码。在这个意义上，编码已经成为一种翻译，将算法和实现方式翻译成程序语言。 可见，锤炼自己的思想才能使自身得到本质上的提升。有人说过，外语演讲比赛中，评委们对语言流利程度的关心在其次，最关键的是看演讲者讲话是否有内涵，是否包含深刻的思想。那些才是一个人风格和能力的真实体现。 关于学科沉淀，王建硕曾经在博文中写道： “不同人的大学经历差异很大，但这一段经历，和其他经历一样，与一些能力的相关性还是很大的。在经历它的时候，常常以丑陋，无聊，和迷茫的形式出现。大学教育教会我们的东西，不总那么显而易见。” 的确，很多学科在我看来都属于沉淀性的学科，例如编译，例如组成原理，再例如网络。也许某些人这辈子都不会去专门做编译器或是做嵌入式或是组网，但不可否认的是，这些学科提供的最大的帮助在于让人在潜移默化中学到了更多解决问题的经典方式，看看前人遇到问题是是如何处理的。谁说学科之间没有交集呢，这里的交集很大程度上取决于自身对知识的领悟和变通。 开拓视野自然也是一种发散思维的好途径，试想如果没有Lisp那样的函数式编程，我们现在很可能还没有MapReduce。而MapReduce的C或Java实现也印证了我之前所说的，尽管语言语法各异，但思想高于语言，学明白思想，我们就总能有办法在自己的领域里实现它。 前些日子有个朋友跟我说想学习编程，并强调他绝不会去学Java，因为学Java的人现在实在是泛滥了，有民工化趋势。我最感兴趣的是这里“会”Java究竟有多“会”？如果不懂面向对象的思想，对程序员来说，接口和抽象类还有没有那么大的价值和作用？如果不懂设计模式，程序员能不能理解为什么java.io包里要有那么多不同类型的流？如果不懂重构，代码的复用性和可维护性又有几何？ 更直接地说，用面向对象语言写出来的程序，未必是面向对象的程序。 语法终究没有那么难，但是会写字不代表会写文章，会讲话不代表会发言。程序员是写代码的人，而非打字员。更好的思想让软件工程师可以做出更好的设计，并以最高效的方式将其实现。这里的高效取决于两点：第一，技术人员思维的广度，包括其知识面，包括其在平日生活中潜移默化沉淀积累下来的东西；第二，对工具的熟悉程度，这里的工具不仅仅是语言，还包括对以前代码的复用等诸多方面，框架本质上也是复用，且不仅仅是代码复用，还有思想的复用。 在《程序员修炼之道》一书中提倡每个程序员每年学一门新语言，学新语言不单单是为了去用，更是开拓思路的一种方式。什么算是真正懂得一门语言呢？很难说，但起码你得知道它和别的语言不同在哪，它的优势又在何处。 我很不喜欢某些人说的C/C++或者汇编打遍天下的论调，语言在不断发展，不仅是用户有需求，开发人员对语言也有更高的需求，什么都会变，不变的是发展的脚步和前进的方向。]]></description>
			<content:encoded><![CDATA[<p>在普通人眼中，一名程序员懂的语言越多，做出的界面越华丽，很大程度上便意味着他的编程水平越高，但是从软件工程师的角度来说，只从语言、GUI编程这些角度并不足以窥之全貌。语言只是程序开发相对低层的东西（与“底层”有所区别），语言就像工具，和扳手、钳子一样，会用它们只是干活的起始，语言又跟英语差不多，会说Hello World不代表你能用英语和人探讨人生哲学了，相反，语言是基本关，是程序设计的必要条件。</p>
<p>Pascal之父，结构化程序设计先驱<a href="http://en.wikipedia.org/wiki/Niklaus_Wirth"><span style="color: #008000;"><strong>Niklaus Wirth</strong></span></a>提出了那个经典的等式：<span style="color: #ff0000;"><strong>Algorithms + Data Structures = Programs</strong></span>. 事实上在程序设计、架构设计的过程中，很少会去考虑相关的语言细节（Don&#8217;t care for the implement, just design!），当然我会考虑这样的设计采用什么样的语言、哪种框架来做可行且对我来说最高效。这两年脚本语言大行其道，不是因为它们的功能之强大可以超越其它任何语言，恰是因其高效，生产力不仅可以用来衡量程序员，也可以用于评估一门语言。没有最好的语言，只有适合的语言，<span style="color: #ff0000;"><strong>好的开发者应当懂得因地制宜，用最恰当的手段最高效地解决眼前的问题。<span id="more-564"></span></strong></span></p>
<p>武侠小说里的剑客们最厉害的地方绝不是他们拿着什么神兵利器，而是剑法，好的武器固然可以提升战斗力，但是高手过招，一击必杀，往往剑尚未出，胜负已定。</p>
<p>前段时间<strong><span style="color: #0000ff;">G</span><span style="color: #ff0000;">o</span><span style="color: #ffcc00;">o</span><span style="color: #0000ff;">g</span><span style="color: #008000;">l</span><span style="color: #ff0000;">e</span></strong>公司首席Java架构师<a href="http://en.wikipedia.org/wiki/Joshua_Bloch"><span style="color: #008000;"><strong>Joshua Bloch</strong></span></a>接受采访时曾把程序员选择编程语言比作是选择酒吧。</p>
<blockquote><p>“选择一种语言时，所考虑的不仅仅是一系列技术上的权衡，而是在选择一个社群。这就像选择一个酒吧。没错，你希望去一个提供美酒的酒吧，但是美酒不是最重要的。主要是那个酒吧里都有什么样的人，他们在谈论些什么。选择计算机语言也是这样的。时间一长，就这门语言也形成了一个社群，社群里不仅仅有人群，还有他们的软件成果，如工具、库等。”</p></blockquote>
<p>与人的接触中最大的交流是什么呢，是思想，是方法，一个成熟的程序员不会整天纠结于语法糖，因为那实在是一件太不值得投入的事了。在于人交流的过程中，我们学习到更多解决问题的方式，包括读书也是。为什么强调不要光盯着一种语言不放？<span style="color: #ff0000;"><strong>一种语言便是一种思想，是一种解决方案</strong></span>，它们之所以各不相同是因为各具特色。这里说的不是不同语言的不同语法，语法虽然各异，但差异更大的是思想，换句话来讲，你完全可以用A语言去实现B语言的很多特性，A语言的一些用法也完全可以在B语言里套用，语法虽然不同，但是思想高于语言。</p>
<p><span style="color: #ff0000;"><strong>好的程序员应该时刻提醒自己不要试图用一种方式解决所有问题</strong></span>，这里包含两点：1、采用不同的工具；2、用同种工具但多种不同方式。这可以拓宽人的思路，并且我们可以有更多的选择，选择多是件好事，大家可以讨论、筛选出最合适的方案，怕的是别无选择，不免让人感到被动。</p>
<p>初学语言的语法之后，再看的书大多就是关于思想的，学习大师的思想，学习前人解决问题的经典算法，这时我们常常会发现书中的代码甚至比语法书里的要“简单”得多，大师们总是尝试用这些简单的代码最简洁地说明思想。初学者和熟手的区别在于，新手容易陷入代码细节中去，而熟手可以在更高的视角上，反观代码，抽象出层次，代码呈现出另外一种结构，更深地思考这种设计的用途和原因。</p>
<p>另外一方面，编码的时间已经被压缩得越来越短。在《<a href="http://book.douban.com/subject/3142280/"><span style="color: #008000;"><strong>梦断代码</strong></span></a>》中，某公司的统计数据标明，项目的实际编码时间往往不到项目总时间的10%。此外，好的设计和架构通常可以最大程度地简化代码逻辑，也只有好的设计才能帮助程序员以最快的速度编写出优良的代码。在这个意义上，编码已经成为一种翻译，将算法和实现方式翻译成程序语言。</p>
<p>可见，锤炼自己的思想才能使自身得到本质上的提升。有人说过，外语演讲比赛中，评委们对语言流利程度的关心在其次，最关键的是看演讲者讲话是否有内涵，是否包含深刻的思想。那些才是一个人风格和能力的真实体现。</p>
<p>关于学科沉淀，王建硕曾经在博文中写道：</p>
<blockquote><p>“不同人的大学经历差异很大，但这一段经历，和其他经历一样，与一些能力的相关性还是很大的。在经历它的时候，常常以丑陋，无聊，和迷茫的形式出现。大学教育教会我们的东西，不总那么显而易见。”</p></blockquote>
<p>的确，很多学科在我看来都属于沉淀性的学科，例如编译，例如组成原理，再例如网络。也许某些人这辈子都不会去专门做编译器或是做嵌入式或是组网，但不可否认的是，这些学科提供的最大的帮助在于让人在潜移默化中学到了更多解决问题的经典方式，看看前人遇到问题是是如何处理的。谁说学科之间没有交集呢，这里的交集<span style="color: #ff0000;"><strong>很大程度上取决于自身对知识的领悟和变通。</strong></span></p>
<p>开拓视野自然也是一种发散思维的好途径，试想如果没有Lisp那样的函数式编程，我们现在很可能还没有MapReduce。而MapReduce的C或Java实现也印证了我之前所说的，尽管语言语法各异，但思想高于语言，学明白思想，我们就总能有办法在自己的领域里实现它。</p>
<p>前些日子有个朋友跟我说想学习编程，并强调他绝不会去学Java，因为学Java的人现在实在是泛滥了，有民工化趋势。我最感兴趣的是这里“会”Java究竟有多“会”？<span style="color: #ff0000;"><strong>如果不懂面向对象的思想，对程序员来说，接口和抽象类还有没有那么大的价值和作用？如果不懂设计模式，程序员能不能理解为什么java.io包里要有那么多不同类型的流？如果不懂重构，代码的复用性和可维护性又有几何？</strong></span></p>
<p><span style="color: #ff0000;"><strong>更直接地说，用面向对象语言写出来的程序，未必是面向对象的程序。<br />
</strong></span></p>
<p>语法终究没有那么难，但是<span style="color: #ff0000;"><strong>会写字不代表会写文章，会讲话不代表会发言。</strong></span>程序员是写代码的人，而非打字员。更好的思想让软件工程师可以做出更好的设计，并以最高效的方式将其实现。这里的高效取决于两点：第一，技术人员思维的广度，包括其知识面，包括其在平日生活中潜移默化沉淀积累下来的东西；第二，对工具的熟悉程度，这里的工具不仅仅是语言，还包括对以前代码的复用等诸多方面，框架本质上也是复用，且不仅仅是代码复用，还有思想的复用。</p>
<p>在《<a href="http://book.douban.com/subject/1152111/"><span style="color: #008000;"><strong>程序员修炼之道</strong></span></a>》一书中提倡每个程序员每年学一门新语言，学新语言不单单是为了去用，更是开拓思路的一种方式。<span style="color: #ff0000;"><strong>什么算是真正懂得一门语言呢？很难说，但起码你得知道它和别的语言不同在哪，它的优势又在何处。</strong></span></p>
<p>我很不喜欢某些人说的C/C++或者汇编打遍天下的论调，语言在不断发展，不仅是用户有需求，开发人员对语言也有更高的需求，什么都会变，不变的是发展的脚步和前进的方向。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hesey.net/2010/12/why-thought-above-grammar.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>对软件开发道路的一点思考</title>
		<link>http://blog.hesey.net/2010/11/thinking-in-software-development.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=thinking-in-software-development</link>
		<comments>http://blog.hesey.net/2010/11/thinking-in-software-development.html#comments</comments>
		<pubDate>Wed, 10 Nov 2010 13:30:49 +0000</pubDate>
		<dc:creator>Hesey</dc:creator>
				<category><![CDATA[思考]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.hesey.net/?p=493</guid>
		<description><![CDATA[上个周末软件学院组织学生去北京参观一些IT公司，我也在赴京的队伍中。我们一共去了三天，其中路上消耗了一天，所以实际在京时间只有两天。而在这短短两天时间里，我们先后参观了中国软件与技术服务股份有限公司、文思创新软件技术有限公司以及中国科学院计算技术研究所三所单位。 回来以后结合这次的参观和我之前一些零碎的想法，整理以后决定写这篇文章，也算是对之前的一些感悟作个总结吧。另外要强调的是，下文并不一定适合其它行业的同学。 一、对软件专业学生自身的要求 1、不要执着于高报酬 诚然，每个人都希望能有一份好工作，而衡量工作好不好的一个重要指标就是薪水的高低。现在正读大三的我们即将面临找工作的问题，什么样的工作才是好的，可能很多人心里并没有一个标杆，但是有一点相信是大家所认同的：薪水高的工作一定差不到哪去。 这话并不完全正确，首先如果给刚入职的新员工很高的薪水，那么对公司本身的发展是不利的，很难想象这样的公司能有巨大的发展潜力。我们追求高薪没错，但是与此同时必须认识到，至少在一段时间内，个人利益和公司利益是挂钩的，这种关系尤其体现在当你持有公司股票的时候。 每个人都应该清楚地认识到自己的能力范围，自己究竟处于一个什么样的水平之上。 这个行业相比其它行业好的一个地方就在于，你可以不是官二代，你也可以不是富二代，你可以什么后门都不走，只要你有能力，你就能获得自己应得的东西。 能力，这个行业比其它任何地方都更强调能力。 所以在衡量报酬的时候，应该仔细想想，我的能力有多少，这份薪酬是否跟我的能力相匹配。我相信不仅是过低的报酬不好，如果过高的报酬给了你也未必是好事。有些企业的确提供了很高的薪资，但是入职以后你会发现领导安排你完成的任务根本不可能在规定的时间内完成，你必定要加班，而且往往一加就是半夜，更没有加班费，领导也可以非常有底气地告诉你，我支付你这么多薪水就是让你干活的，何况是你自己没能在规定的时间里完成任务，怨不得别人。的确有这样的企业存在。 所以钱不在多，符合和自己能力对等的数目就好。我曾读过一篇文章，题目叫《Don&#8217;t Plan to Get Rich from Your Startup》，就是讲了刚起步时对薪水的态度。 在去文思创新的时候那位经理问我们，如果你去一家公司实习，但是却不给你工资，你去不去。我看着他很果断地说，去。 这根本不用思考，首先我既然申请了去某家公司实习，必定是有较强的愿望去那里，就算不支付实习工资，也就当是体验知名企业的工作，积累经验了，这可是金钱换不来的。对我来说，在这个年纪里，不应该计较太多金钱的问题，注重能力的锻炼才是最重要的。有人看到一些国际知名认证上千的考试费用觉得太贵，其实如果真的拿到了，它为你自己创造的价值又何止区区几千呢？ 盛大网络董事长兼首席执行官陈天桥说过一句话：一切的商业模式，本质上只有一个，最高的工资给最优秀的人才，最优秀的人才创造最大的价值！ 所以，想要拿高薪？很简单，让自己成为高素质人才，一切接踵而来。 2、修炼自身 修炼自身的含义非常朴实，但是很难做到，特别是年轻人，总是希望能得到他人的肯定，或者是被笼罩着某种闪耀的光环。 但是这种肯定，这种光环是否真实，含金量是不是真的高，我想只有当事人自己最清楚。 不论是国内国外，都强调专注，强调不要浮夸，脚踏实地。这的的确确是有道理的，对一个即将从事软件开发的学生来说，提升自己的专业能力比什么都更迫切。公司要的不是你能夸夸其谈，口中各种专业术语（甚至连你自己都未必能深刻明白这些术语的含义），事实上在我的观察中，浮夸的人最忌碰到专业人士，特别是专业面试的时候，口若悬河乱讲一通，专业的人一眼就能看出来被面试者有几斤几两，甚至比一般的情况下更容易识破。 专注意味着把大多数的精力集中于一个领域。这一点非常重要，要在社会上立足，首先要有一项强过别人的手艺。 很多人瞧不起百度，但是百度的老总李彦宏的确是一个杰出的人物，当所有人表示百度应该扩大业务范围时，李彦宏却说，我们的搜索做得还不够好，我们应该继续把搜索这块做好，提出了“框计算”概念，人家的成功不是光凭运气就能走出来的。 前两天看到一群人在网上围观一份简历，其中有一句：精通php、asp、java、mysql、mssql、javascript、css、j2ee体系、mvc架构。众多从事软件行业多年的人纷纷表示膜拜。如果你是企业招聘官，这样的毕业生，你敢不敢要？ 再者，如果你是看简历的人，有个人在大学期间特牛逼，什么学生会主席、社团主席、优秀班干部、某某唱歌比赛第一名……一看应聘职位：研发工程师，这样的毕业生，你又敢不敢要呢？ 在中科院计算所的那位博士生导师非常坦率：我不管你是什么学生干部或者拿过什么奖，我只关心你的算法能力。 也许有人觉得这样的评价标准过于偏颇，但这就是现状，而且我认为这种判断比一般的评价更契合实际，要你干吗，要你做事。 像北京这样的大城市，机会多，人才也多，如何从众多人才中脱颖而出？我想每个人都应该好好想一想，甚至花若干天的时间去思考这个问题。 3、开拓眼界 问一问自己，平时上网都在做什么。当一线城市院校的学生们能够随时随地获得第一手信息，参与最前沿讨论的时候，我们在做些什么？ 我想环境的原因不应该成为借口，现在是互联网时代，特别是对于软件行业而言，信息都是公开流动的，几乎不存在某个网页对某些人敞开，却对另一些人关闭的事情（我忽然觉得这个“几乎”用得太帅了！——编后语）。既然如此，如何把握信息应该是每个人自身的必修课，这一点没有人可以帮助你，只有你自己去发现，去揣摩。 我有一个朋友，他本人不是计算机专业的，当年他有个同学很牛逼，我这个朋友系统坏了都拜托他这位同学去装，但是过了这些年，他现在会使用LaTex、Emacs等软件去完成许多事情，而他那位同学，仍然只会装系统。 4、充实自己 大学里的闲暇时间很多，大家可以尽情参与一些活动或是比赛来充实自己。但是有一点我非常反对，就是参加不干事的比赛。所谓不干事的比赛专指那些你几乎什么都不用做，拿奖了可以给你个名额。这样的比赛名义上可以给你证书和荣誉，但实际上对能力的提高没有丝毫帮助，反而浪费了太多的时间在无谓的奔走上。 前面说过，只要有能力，不用担心别的什么，证书这个事情大抵也差不多，如果你打算考研或是出国，证书必不可少，但是如果打算工作，那么，还是现实点吧。说实话，在软件行业有价值的证书几乎都不是一个应届毕业生可以考取的，其实想想就明白了，一个没有工作经验的大学生都可以拿到的证书，含金量能有多高呢？有计算机专业的学生去考国家计算机等级考试，但是该考试明确指明了是给非计算机专业学生准备的。我曾打算参加国家软件考试，考一个中级职称，于是我问了两个已经取得中级职称的朋友，一个有软件设计师证书，一个有网络工程师证书，问他们值不值得考试，给我的答复很简单：在企业里没人看这玩意儿。在国家颁发的证书中，这个算是质量不那么差的了，可以想见其它的各种证书的价值。 至于什么普通话证书、教师资格证，我想这些同学应该是打算另谋出路吧。 5、富有创造力，敢想敢做 我们常说我们这个国家没有创新力，什么新产品都是外国人做了以后中国再去山寨若干个。YouTube、Facebook、Twitter、Foursquare、Groupon等等莫不是如此。 中国人真的没有创新力吗？不见得，很多时候我们有个想法，但是又不敢去实施，或者是想了想没有可行性，也就作罢了。所以那天我看完记录Facebook创始人Mark Zuckerberg的电影《The Social Network》之后我就想，Facebook的经历在中国是很难成功的。首先如果是中国的大学生，他能不能有闲情逸致去想到这个点子，想到以后能不能马上兴奋地坐下来画图纸、敲代码，做出产品以后有没有人愿意去尝试这种前所未有的社交手段。 每一步都是一个槛，而在学生的头脑里设下这些坎的，不是其它，正是教育。 我们的生活远远没有达到令人称心如意的程度，生活中还有很多不便等着去解决。作为本专业的学生，是不是只有老师布置了作业或是等到有课程设计、毕业设计的任务时，才打开窗口敲击代码呢。如此被动，我想除非有大改变，否则30岁以后仍然难以摆脱代码民工的命运。 当你以后带领一个团队时，如何让你的产品得到用户的青睐，如何做出特色，做得跟别人不一样，敢想敢做是一种必备的品质。 而事实上，只要我们不那么纵容自己的慵懒，很多事情做起来其实没那么困难。 拿我自身的例子来说，当年我任广播社社长的时候，打算做一个点歌节目，大二上学期采取的是让同学把点歌信息每晚送到广播社来，然后由我们播出，同时收取1元的点歌费作为广播社日常开支的经费。事实证明效果并不理想，并不是因为钱的问题，而是太麻烦了，点一首歌要让你跑到广播社（有的人甚至还不知道在哪），而且一天只有一个小时的时间可以送，同学的积极性肯定不高。于是我想能不能有一种办法，让同学能够随时随地都能点歌。第一个想到的是用Google的SpreadSheets表单，给一个地址就能提供一个点歌的表格，填写内容以后就行了。但是由于某些原因，Google的此项服务并不能正常使用，于是我想干脆自己写一个吧。花了一个下午的时间把东西写了出来，放在服务器上就跑了。下学期的时候我们就采取了网上点歌且免费的方式，结果点歌的人一下子多了起来，我们的点歌节目也渐渐火了。 二、对学校的要求 1、项目的供给 培养学生最好的方式就是给他们做项目，但是目前看来在校内只有一少部分人可以接触到真实的项目。我想项目应该来自两个方面，校外和校内。校外的项目多涉及商业，理所应当交给研究生去做。所以针对本科生的重点应当在于校内项目。 [...]]]></description>
			<content:encoded><![CDATA[<p>上个周末软件学院组织学生去北京参观一些IT公司，我也在赴京的队伍中。我们一共去了三天，其中路上消耗了一天，所以实际在京时间只有两天。而在这短短两天时间里，我们先后参观了中国软件与技术服务股份有限公司、文思创新软件技术有限公司以及中国科学院计算技术研究所三所单位。</p>
<p>回来以后结合这次的参观和我之前一些零碎的想法，整理以后决定写这篇文章，也算是对之前的一些感悟作个总结吧。另外要强调的是，下文并不一定适合其它行业的同学。<span id="more-493"></span></p>
<h1>一、对软件专业学生自身的要求</h1>
<blockquote>
<h3>1、不要执着于高报酬</h3>
<blockquote><p>诚然，每个人都希望能有一份好工作，而衡量工作好不好的一个重要指标就是薪水的高低。现在正读大三的我们即将面临找工作的问题，什么样的工作才是好的，可能很多人心里并没有一个标杆，但是有一点相信是大家所认同的：<span style="color: #ff0000;"><strong>薪水高的工作一定差不到哪去。</strong></span></p>
<p>这话并不完全正确，首先<span style="color: #ff0000;"><strong>如果给刚入职的新员工很高的薪水，那么对公司本身的发展是不利的</strong></span>，很难想象这样的公司能有巨大的发展潜力。我们追求高薪没错，但是与此同时必须认识到，至少在一段时间内，个人利益和公司利益是挂钩的，这种关系尤其体现在当你持有公司股票的时候。</p>
<p><span style="color: #ff0000;"><strong>每个人都应该清楚地认识到自己的能力范围，自己究竟处于一个什么样的水平之上。</strong></span></p>
<p>这个行业相比其它行业好的一个地方就在于，<span style="color: #ff0000;"><strong>你可以不是官二代，你也可以不是富二代，你可以什么后门都不走，只要你有能力，你就能获得自己应得的东西。</strong></span></p>
<p>能力，这个行业比其它任何地方都更强调能力。</p>
<p>所以在衡量报酬的时候，应该仔细想想，<span style="color: #ff0000;"><strong>我的能力有多少，这份薪酬是否跟我的能力相匹配。</strong></span>我相信不仅是过低的报酬不好，如果过高的报酬给了你也未必是好事。有些企业的确提供了很高的薪资，但是入职以后你会发现领导安排你完成的任务根本不可能在规定的时间内完成，你必定要加班，而且往往一加就是半夜，更没有加班费，领导也可以非常有底气地告诉你，我支付你这么多薪水就是让你干活的，何况是你自己没能在规定的时间里完成任务，怨不得别人。的确有这样的企业存在。</p>
<p>所以钱不在多，符合和自己能力对等的数目就好。我曾读过一篇文章，题目叫《<a href="http://www.softwarebyrob.com/2010/06/10/dont-plan-to-get-rich-from-your-startup/"><span style="color: #008000;"><strong>Don&#8217;t Plan to Get Rich from Your Startup</strong></span></a>》，就是讲了刚起步时对薪水的态度。</p>
<p>在去文思创新的时候那位经理问我们，如果你去一家公司实习，但是却不给你工资，你去不去。我看着他很果断地说，去。</p>
<p>这根本不用思考，首先我既然申请了去某家公司实习，必定是有较强的愿望去那里，就算不支付实习工资，也就当是体验知名企业的工作，积累经验了，这可是金钱换不来的。对我来说，<span style="color: #ff0000;"><strong>在这个年纪里，不应该计较太多金钱的问题</strong></span>，注重能力的锻炼才是最重要的。有人看到一些国际知名认证上千的考试费用觉得太贵，其实如果真的拿到了，它为你自己创造的价值又何止区区几千呢？</p>
<p>盛大网络董事长兼首席执行官陈天桥说过一句话：<span style="color: #ff0000;"><strong>一切的商业模式，本质上只有一个，最高的工资给最优秀的人才，最优秀的人才创造最大的价值！</strong></span></p>
<p>所以，想要拿高薪？很简单，让自己成为高素质人才，一切接踵而来。</p></blockquote>
<h3>2、修炼自身</h3>
<blockquote><p>修炼自身的含义非常朴实，但是很难做到，特别是年轻人，总是希望能得到他人的肯定，或者是被笼罩着某种闪耀的光环。</p>
<p>但是这种肯定，这种光环是否真实，含金量是不是真的高，我想只有当事人自己最清楚。</p>
<p>不论是国内国外，都强调专注，强调不要浮夸，脚踏实地。这的的确确是有道理的，对一个即将从事软件开发的学生来说，提升自己的专业能力比什么都更迫切。公司要的不是你能夸夸其谈，口中各种专业术语（甚至连你自己都未必能深刻明白这些术语的含义），事实上在我的观察中，浮夸的人最忌碰到专业人士，特别是专业面试的时候，口若悬河乱讲一通，专业的人一眼就能看出来被面试者有几斤几两，甚至比一般的情况下更容易识破。</p>
<p>专注意味着把大多数的精力集中于一个领域。这一点非常重要，要在社会上立足，首先要有一项强过别人的手艺。</p>
<p>很多人瞧不起百度，但是百度的老总李彦宏的确是一个杰出的人物，<span style="color: #ff0000;"><strong>当所有人表示百度应该扩大业务范围时，李彦宏却说，我们的搜索做得还不够好，我们应该继续把搜索这块做好，提出了“框计算”概念，人家的成功不是光凭运气就能走出来的。</strong></span></p>
<p>前两天看到一群人在网上围观一份简历，其中有一句：精通php、asp、java、mysql、mssql、javascript、css、j2ee体系、mvc架构。众多从事软件行业多年的人纷纷表示膜拜。如果你是企业招聘官，这样的毕业生，你敢不敢要？</p>
<p>再者，如果你是看简历的人，有个人在大学期间特牛逼，什么学生会主席、社团主席、优秀班干部、某某唱歌比赛第一名……一看应聘职位：研发工程师，这样的毕业生，你又敢不敢要呢？</p>
<p>在中科院计算所的那位博士生导师非常坦率：我不管你是什么学生干部或者拿过什么奖，我只关心你的算法能力。</p>
<p>也许有人觉得这样的评价标准过于偏颇，但这就是现状，而且我认为这种判断比一般的评价更契合实际，<span style="color: #ff0000;"><strong>要你干吗，要你做事。</strong></span></p>
<p>像北京这样的大城市，机会多，人才也多，如何从众多人才中脱颖而出？我想每个人都应该好好想一想，甚至花若干天的时间去思考这个问题。</p></blockquote>
<h3>3、开拓眼界</h3>
<blockquote><p>问一问自己，平时上网都在做什么。当一线城市院校的学生们能够随时随地获得第一手信息，参与最前沿讨论的时候，我们在做些什么？</p>
<p>我想环境的原因不应该成为借口，现在是互联网时代，特别是对于软件行业而言，信息都是公开流动的，几乎不存在某个网页对某些人敞开，却对另一些人关闭的事情（我忽然觉得这个“几乎”用得太帅了！——编后语）。既然如此，<span style="color: #ff0000;"><strong>如何把握信息应该是每个人自身的必修课</strong></span>，这一点没有人可以帮助你，只有你自己去发现，去揣摩。</p>
<p>我有一个朋友，他本人不是计算机专业的，当年他有个同学很牛逼，我这个朋友系统坏了都拜托他这位同学去装，但是过了这些年，他现在会使用LaTex、Emacs等软件去完成许多事情，而他那位同学，仍然只会装系统。</p></blockquote>
<h3>4、充实自己</h3>
<blockquote><p>大学里的闲暇时间很多，大家可以尽情参与一些活动或是比赛来充实自己。但是有一点我非常反对，就是参加不干事的比赛。所谓不干事的比赛专指那些你几乎什么都不用做，拿奖了可以给你个名额。这样的比赛名义上可以给你证书和荣誉，但实际上对能力的提高没有丝毫帮助，反而浪费了太多的时间在无谓的奔走上。</p>
<p>前面说过，只要有能力，不用担心别的什么，证书这个事情大抵也差不多，如果你打算考研或是出国，证书必不可少，但是如果打算工作，那么，还是现实点吧。说实话，在软件行业有价值的证书几乎都不是一个应届毕业生可以考取的，其实想想就明白了，<span style="color: #ff0000;"><strong>一个没有工作经验的大学生都可以拿到的证书，含金量能有多高呢？</strong></span>有计算机专业的学生去考国家计算机等级考试，但是该考试明确指明了是给非计算机专业学生准备的。我曾打算参加国家软件考试，考一个中级职称，于是我问了两个已经取得中级职称的朋友，一个有软件设计师证书，一个有网络工程师证书，问他们值不值得考试，给我的答复很简单：<span style="color: #ff0000;"><strong>在企业里没人看这玩意儿。</strong></span>在国家颁发的证书中，这个算是质量不那么差的了，可以想见其它的各种证书的价值。</p>
<p>至于什么普通话证书、教师资格证，我想这些同学应该是打算另谋出路吧。</p></blockquote>
<h3>5、富有创造力，敢想敢做</h3>
<blockquote><p>我们常说我们这个国家没有创新力，什么新产品都是外国人做了以后中国再去山寨若干个。YouTube、Facebook、Twitter、Foursquare、Groupon等等莫不是如此。</p>
<p>中国人真的没有创新力吗？不见得，很多时候我们有个想法，但是又不敢去实施，或者是想了想没有可行性，也就作罢了。所以那天我看完记录Facebook创始人Mark Zuckerberg的电影《The Social Network》之后我就想，<span style="color: #ff0000;"><strong>Facebook的经历在中国是很难成功的</strong></span>。首先如果是中国的大学生，他能不能有闲情逸致去想到这个点子，想到以后能不能马上兴奋地坐下来画图纸、敲代码，做出产品以后有没有人愿意去尝试这种前所未有的社交手段。</p>
<p><span style="color: #ff0000;"><strong>每一步都是一个槛，而在学生的头脑里设下这些坎的，不是其它，正是教育。</strong></span></p>
<p>我们的生活远远没有达到令人称心如意的程度，生活中还有很多不便等着去解决。作为本专业的学生，是不是只有老师布置了作业或是等到有课程设计、毕业设计的任务时，才打开窗口敲击代码呢。如此被动，我想除非有大改变，否则30岁以后仍然难以摆脱代码民工的命运。</p>
<p>当你以后带领一个团队时，如何让你的产品得到用户的青睐，如何做出特色，做得跟别人不一样，敢想敢做是一种必备的品质。</p>
<p><span style="color: #ff0000;"><strong>而事实上，只要我们不那么纵容自己的慵懒，很多事情做起来其实没那么困难。</strong></span></p>
<p>拿我自身的例子来说，当年我任广播社社长的时候，打算做一个点歌节目，大二上学期采取的是让同学把点歌信息每晚送到广播社来，然后由我们播出，同时收取1元的点歌费作为广播社日常开支的经费。事实证明效果并不理想，并不是因为钱的问题，而是太麻烦了，点一首歌要让你跑到广播社（有的人甚至还不知道在哪），而且一天只有一个小时的时间可以送，同学的积极性肯定不高。于是我想能不能有一种办法，让同学能够随时随地都能点歌。第一个想到的是用Google的SpreadSheets表单，给一个地址就能提供一个点歌的表格，填写内容以后就行了。但是由于某些原因，Google的此项服务并不能正常使用，于是我想干脆自己写一个吧。花了一个下午的时间把东西写了出来，放在服务器上就跑了。下学期的时候我们就采取了网上点歌且免费的方式，结果点歌的人一下子多了起来，我们的点歌节目也渐渐火了。</p></blockquote>
</blockquote>
<h1>二、对学校的要求</h1>
<blockquote>
<h3>1、项目的供给</h3>
<blockquote><p>培养学生最好的方式就是给他们做项目，但是目前看来在校内只有一少部分人可以接触到真实的项目。我想项目应该来自两个方面，校外和校内。校外的项目多涉及商业，理所应当交给研究生去做。所以针对本科生的重点应当在于校内项目。</p>
<p>可惜校内项目的书目也很有限，谁会整天去折腾新系统呢。但是很多东西我想还是有空间去提升的，例如：</p>
<blockquote><p><span style="color: #008000;"><strong>学院网站在非IE浏览器下糟糕的显示效果问题什么时候可以解决？</strong></span></p></blockquote>
<blockquote><p><span style="color: #008000;"><strong>四六级报名系统的负载问题如何解决？</strong></span></p></blockquote>
<blockquote><p><span style="color: #008000;"><strong>有些学校开发了空闲自习室查询系统，方便同学们查看没课的自习室，我们有没有人去做这样的系统？</strong></span></p></blockquote>
<blockquote><p><span style="color: #008000;"><strong>社团申请教室的时候必须去辅导员和校区办公室老师那里签字盖章，有时会遇到老师不在的情况，那么如果做成在线申请在线审批的系统是不是可以提高双方的效率？</strong></span></p></blockquote>
<blockquote><p><span style="color: #008000;"><strong>学生提交作业需要交到不同的邮箱，上传到不同的FTP，既然课程是相对固定的，有没有一个系统可以让交作业这件事在一个地方就能完成？<br />
</strong></span></p></blockquote>
<p>问题不是没有，问题太多了，这些问题恰恰可以制造一个双赢的局面：<span style="color: #ff0000;"><strong>学生通过项目获得实战经验，学校通过项目提高了生产率。</strong></span></p>
<p>我建议学校可以采取投标的方式，公告待开发系统的需求，让学生自己去做，谁做得好谁的系统就上线，至于奖励不奖励，那由学校自己决定。</p></blockquote>
<h3>2、增强学生兴趣</h3>
<blockquote><p>兴趣是最好的老师，只有学习者本人有兴趣，才能够完成从外界促使自己学习向自己对于知识渴求的转变。兴趣可以从很多方面去培养，例如前面说的做项目，或者是其它方式，总之有一点，必须让学生学以致用，把学生浸泡其中，否则理论和实际的脱节很难让人感受到究竟自己所学有什么用，<span style="color: #ff0000;"><strong>“没用”的东西，谁喜欢呢？</strong></span></p>
<p>更多时候，我们必须从自身角度出发去改变现状，寄希望于别人，那么得到的永远和想象中的有差距。</p></blockquote>
</blockquote>
<p>最后要感谢学长们让我从一个什么都不知道的人开始渐渐了解这个专业，感谢冯大辉先生在我迷茫的时候给予我的点拨，未来的路还长着呢，谁又知道下一个Mark是谁呢？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hesey.net/2010/11/thinking-in-software-development.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Ubuntu系统的备份和还原</title>
		<link>http://blog.hesey.net/2010/10/backup-ubuntu.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=backup-ubuntu</link>
		<comments>http://blog.hesey.net/2010/10/backup-ubuntu.html#comments</comments>
		<pubDate>Thu, 21 Oct 2010 08:33:17 +0000</pubDate>
		<dc:creator>Hesey</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.hesey.net/?p=483</guid>
		<description><![CDATA[用Windows的时候习惯了ghost备份，但是ghost是不支持ext4分区格式的，所以只能寻找另外的备份方法，幸好Ubuntu本身就给我们提供了良好的备份和还原支持，分以下3步： （1）备份已安装软件列表 sudo dpkg --get-selections  &#62; app-backup-list.txt 将会在你的主目录下生成app-backup-list.txt文件，存储了所有当前系统安装的软件名，供恢复时使用。 （2）备份软件源 cp /etc/apt/sources.list ~ 将会把你的软件源文件备份到主目录，若有其它的源文件，请自行备份。 （3）备份用户目录 sudo cp -r ~ [目标目录] 将递归把你的当前用户目录备份到目标目录 恢复分为4步： （1）恢复软件源 sudo cp sources.list /etc/apt/sources.list 将备份的源文件拷贝到系统目录下 （2）更新软件源信息 sudo apt-get update （3）恢复安装备份软件列表 sudo dpkg --set-selections &#60; app-backup-list.txt sudo apt-get -y update sudo apt-get dselect-upgrade 将会自动从源上下载之前备份过的软件（由于备份的时候只是记录了软件名字，所以这时必须重新下载） （4）恢复用户目录 sudo cp -r ./ ~ 至此恢复工作完成，enjoy your own ubuntu [...]]]></description>
			<content:encoded><![CDATA[<p>用Windows的时候习惯了ghost备份，但是ghost是不支持ext4分区格式的，所以只能寻找另外的备份方法，幸好Ubuntu本身就给我们提供了良好的备份和还原支持，分以下3步：<br />
（1）备份已安装软件列表</p>
<pre class="brush:[bash]">sudo dpkg --get-selections  &gt; app-backup-list.txt</pre>
<p>将会在你的主目录下生成app-backup-list.txt文件，存储了所有当前系统安装的软件名，供恢复时使用。</p>
<p>（2）备份软件源</p>
<pre class="brush:[bash]">cp /etc/apt/sources.list ~</pre>
<p>将会把你的软件源文件备份到主目录，若有其它的源文件，请自行备份。</p>
<p>（3）备份用户目录</p>
<pre class="brush:[bash]">sudo cp -r ~ [目标目录]</pre>
<p>将递归把你的当前用户目录备份到目标目录<br />
<span id="more-483"></span>恢复分为4步：</p>
<p>（1）恢复软件源</p>
<pre class="brush:[bash]">sudo cp sources.list /etc/apt/sources.list</pre>
<p>将备份的源文件拷贝到系统目录下</p>
<p>（2）更新软件源信息</p>
<pre class="brush:[bash]">sudo apt-get update</pre>
<p>（3）恢复安装备份软件列表</p>
<pre class="brush:[bash]">sudo dpkg --set-selections &lt; app-backup-list.txt
sudo apt-get -y update
sudo apt-get dselect-upgrade</pre>
<p>将会自动从源上下载之前备份过的软件（由于备份的时候只是记录了软件名字，所以这时必须重新下载）</p>
<p>（4）恢复用户目录</p>
<pre class="brush:[bash]">sudo cp -r ./ ~</pre>
<p>至此恢复工作完成，enjoy your own ubuntu :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hesey.net/2010/10/backup-ubuntu.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>唤出ubuntu下ibus的拼音输入法设置</title>
		<link>http://blog.hesey.net/2010/10/display-ibus-deamon-on-ubuntu.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=display-ibus-deamon-on-ubuntu</link>
		<comments>http://blog.hesey.net/2010/10/display-ibus-deamon-on-ubuntu.html#comments</comments>
		<pubDate>Fri, 15 Oct 2010 05:17:32 +0000</pubDate>
		<dc:creator>Hesey</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.hesey.net/?p=478</guid>
		<description><![CDATA[之前一直纠结于ubuntu10.10下ibus-pinyin无法调出设置窗口，导致我的候选项一直只有5个：（，安装sunpinyin后也是如此，看到 @yongsun 的说法，ubuntu从不知哪个版本开始默认就不显示输入法框（panel）了，不知道是谁想出了这么无语的设计。 解决方案如下： 进入 系统——&#62;首选项——&#62;键盘输入法（ibus deamon），在“显示语言栏”中选择“活动时”。这时再切换拼音输入法，熟悉的panel就在右下角候着你了：）]]></description>
			<content:encoded><![CDATA[<p>之前一直纠结于ubuntu10.10下ibus-pinyin无法调出设置窗口，导致我的候选项一直只有5个：（，安装sunpinyin后也是如此，看到 @yongsun 的说法，ubuntu从不知哪个版本开始默认就不显示输入法框（panel）了，不知道是谁想出了这么无语的设计。</p>
<p>解决方案如下：</p>
<p>进入 系统——&gt;首选项——&gt;键盘输入法（ibus deamon），在“显示语言栏”中选择“活动时”。这时再切换拼音输入法，熟悉的panel就在右下角候着你了：）</p>
<p style="text-align: center;"><a href="http://blog.hesey.net/wp-content/uploads/2010/10/ibus-deamon.jpg"></a><a href="http://blog.hesey.net/wp-content/uploads/2010/10/ibus-deamon.png"><img class="alignnone size-full wp-image-481" title="ibus-deamon" src="http://blog.hesey.net/wp-content/uploads/2010/10/ibus-deamon.png" alt="" width="344" height="108" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hesey.net/2010/10/display-ibus-deamon-on-ubuntu.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>U盘安装Ubuntu</title>
		<link>http://blog.hesey.net/2010/10/install-ubuntu-by-usbdisk.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=install-ubuntu-by-usbdisk</link>
		<comments>http://blog.hesey.net/2010/10/install-ubuntu-by-usbdisk.html#comments</comments>
		<pubDate>Tue, 12 Oct 2010 02:28:38 +0000</pubDate>
		<dc:creator>Hesey</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.hesey.net/?p=432</guid>
		<description><![CDATA[Ubuntu 10.10如期而至，考虑到环保和方便等因素，我安装操作系统一向都是从U盘启动安装。这次早早地下载完毕后却发现将其刻录到U盘之后，U盘启动加载SYSLINUX时就停止下来，Google一下，许多用户都出现了这个问题，查询ubuntu.com发现有人提交该issue，证实是个bug。 经过研究解决方案如下： 找到U盘根目录下Syslinux/Syslinux.cfg文件，找到下面这行： default vesamenu.c32 在之前加上&#8217;#'符号，注释掉该菜单，更改后该行为： #default vesamenu.c32 保存修改后重启采用U盘启动，这时将可以直接进入LiveCD环境，这时再从桌面安装Ubuntu 10.10即可。 感觉Ubuntu 10.10的安装比之前的版本更为人性化和傻瓜化，安装速度也有大幅提高。]]></description>
			<content:encoded><![CDATA[<p>Ubuntu 10.10如期而至，考虑到环保和方便等因素，我安装操作系统一向都是从U盘启动安装。这次早早地下载完毕后却发现将其刻录到U盘之后，U盘启动加载SYSLINUX时就停止下来，Google一下，许多用户都出现了这个问题，查询ubuntu.com发现有人提交该issue，证实是个bug。</p>
<p>经过研究解决方案如下：</p>
<p>找到U盘根目录下Syslinux/Syslinux.cfg文件，找到下面这行：</p>
<pre class="brush:[bash]">default vesamenu.c32</pre>
<p>在之前加上&#8217;#'符号，注释掉该菜单，更改后该行为：</p>
<pre class="brush:[bash]">#default vesamenu.c32</pre>
<p>保存修改后重启采用U盘启动，这时将可以直接进入LiveCD环境，这时再从桌面安装Ubuntu 10.10即可。</p>
<p>感觉Ubuntu 10.10的安装比之前的版本更为人性化和傻瓜化，安装速度也有大幅提高。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hesey.net/2010/10/install-ubuntu-by-usbdisk.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>我们为什么需要言论自由</title>
		<link>http://blog.hesey.net/2010/09/why-we-need-free-speech.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=why-we-need-free-speech</link>
		<comments>http://blog.hesey.net/2010/09/why-we-need-free-speech.html#comments</comments>
		<pubDate>Fri, 17 Sep 2010 02:25:19 +0000</pubDate>
		<dc:creator>Hesey</dc:creator>
				<category><![CDATA[思考]]></category>

		<guid isPermaLink="false">http://blog.hesey.net/?p=404</guid>
		<description><![CDATA[言论自由作为人权重要的组成部分，一直在被国内外的学者所探讨。从通常的视角来看，国家政策取决于掌权组织的决定，人民的意见并没有一种强制性的力量可以主导政策的方向。但是，应该认识到的是，这一自由长期以来都在暗中深刻地影响着时代中一些实践方面的争论，与此同时，它也早已成为国计民生的一项重大问题。从某种意义上来说，自人类最原始的社会开始，言论自由就在划分着人类社会的层次，当人类进入文明社会以后，当人类经过思想启蒙的洗礼之后，这一问题已经以崭新的面貌呈现在人们面前，而且比以往任何时候都迫切地需要被解决。 人们对言论自由最迫切地需求来源于，没有人可以断定什么是绝对正确的，反之，也不存在这么一个人，他可以断言什么是绝对错误的。不难看出，社会的发展是建立在人类群体智慧的基础之上，而绝不是某些个人英雄所造成的。群体智慧尽管在大多数情况下不如个人智慧显得那么具有锋芒，或是那么具有前瞻性，但群体智慧最大的好处在于，分立的个体智慧在群体中产生博弈，最终融合的群体智慧在对事物正确性的判断上具有无与伦比的优势。 在人类心灵未臻完善的状态下，对于同一问题，若其想要探究其中的真理，那么只有通过意见分歧才能使真理的各个方面得到公平竞争的机会。举例来说，如果对于某个问题，某个人的说法得到了多数人的认可，并且假设他的见解的确是正确的，那么，纵使是那些少数人的异议，也总是值得人们去研究，去辨析的，而如果社会将这种异议强制排除，那么，真理必然就会有所缺失，而这种缺憾，竟仍是建立在假设先前那人说法正确的前提下，可见，如果他的意见并没有那么正确，后果将会更加残酷。 这就是说，只要人们愿意甚至是被迫兼听多方意见，那么探寻真理便仍有希望。反之，倘若仅有一种意见主导了社会全局的舆论方向，那么这种单一的认同势必会硬化为偏见，人们心中所以为的真理便会被夸大为谬误，不复真理性。 人们永远不能确信，他们所排斥的意见必然是一个谬误的意见，即使他们确信，那么力图将这种意见拒之门外也是一种罪恶。 有人认为既然人类无法决定孰是孰非，那么就让时间来见证吧。但是必须认识到，无限的时间并没有意义，人们在利用时间去衡量人类发展史上的正确和错误时，势必要将时间切割，变成我们所熟知的“在那个时代”，“在这个时代”。而时间一旦被切割，其被神化的判断力就不显得那么可靠了。就如现在的人看过去的时代，总是能发现那个时代里的种种谬误，而这种谬误，很可能在当时却是社会的主流思想。 总的来说，人类自由的领域至少需要包含以下三方面。第一，思想和精神的自由。第二、言论的自由。第三、人与人之间联合的自由。若这三者有一者不满足，那么，就不可称之为是自由的社会。请注意，这里的自由并非毫无限制（事实上毫无限制根本不是自由），如果能仔细想一想，便可知道，这些都可以并且必须建立在不强迫或伤害他人的前提下。在人们享有自己的自由时，必须保证他人的自由不受侵犯。无论是什么人都无权剥夺这种权利。 如果社会的意识不加适当限制地完全凌驾于个人意识之上，甚至利用舆论和立法力量强行为之。那么，社会的权利也将彻底凌驾于个人权利之上。有人乐观估计，由于现状特殊，在将来，人们的权利将会得到更多的尊重和保证。但必须意识到，这种强制力越严重，这种趋势也将越持久，并且会以越来越快的速度增长。所以如果无为，那么这样的乐观估计就并不值得相信。 言论自由冲击的将是社会群体对知识的认识。就像当年的苏格拉底、哥白尼一号人，当思想的革新如春风一般沐浴着人们时，社会那旧的顽石便会恼羞成怒地将其及其相关的事物抹杀。但是，尽管苏格拉底、哥白尼被当时的社会所扼杀，但是他们的思想却如日中天，散发着真知和求实的光辉，照耀着人们渴望真理的眼神。 在精神奴役的气氛中，曾经有过而且也会再有伟大的个人思想家。但是，在那种气氛中，从来没有也永远不会有智力活耀的人民。 人们应当有自由思考并发表意见的权利，如之前所说，倘若这种权利和自由得不到保障，那么在人类智慧的发展上将会造成毁灭性的后果，而从长远来看，对于社会的进步也没有积极的作用。 有人说现在中国的教育存在问题，学生的个性得不到张扬，所有的问题只有一个正确答案，多少年来，人们反复质疑教育改革，认为我们的教育并没有迎来真正的变革。但是，这种要求改革的声音喊了这么多年，为什么却得不到真切的解决？因为它触及了我们整个社会的风格，如何想象一个发言要经过各种过滤系统的处理才能被放出来的社会，却要去拥有一个充满自主和个性化的教育，如果孩子们都是这样被教育出来的，那么当他们成为这个社会的主导力量时就会发现，要么被扼杀的是旧制度，要么就是他们自己。 人们必须意识到的是，没有一件事不是由某一个人第一个发现或是第一个做出来的，当现代社会所有的成就被细分时，就会发现，每一件事物都必定由一个人最先发现，进而才由其自己或是某个组织去深入研究，得出成果。古人犹此，今人何为？既然现代社会仍然有许多还不尽人意的地方，那么每个人都应该相信，自己也许就是那个第一个发现的人。而建立起全社会的这种风气，势必需要交流的自由，也即言论的自由。 约150年前，一位英国的哲学家曾说过这样一段话： 我们要以中国为前车之鉴。那个国族乃是一个富有才能并且在某些方面甚至也富有智慧的国族，因为他们遇有难得的好运，竟在早期就备有一套特别好的习俗，这在某种范围内也就是一些即使最开明的欧洲人在一定限制下也必须尊称为圣人和智者的人们所做出的事功。他们还有值得注视的一点，就是有一套极其精良的工具用以尽可能把他们所保有的最好智慧深印于群体中的每一心灵，并且保证凡是最能称此智慧的人将得到有荣誉有权力的职位。毫无疑义，做到这个地步的人民已经发现了人类前进性的奥秘，必以保持自己稳稳站在世界运动的前列。可是相反，他们却已变成静止的了，他们几千年来原封未动；而他们如果还会有所改进，那必定要依靠外国人。 再来看看我们现在的自然科学教育、“自主创新”、山寨文化，不禁怅然，每个人都应该思考，我们是否真的需要依靠外国人的成果才能在世界上站稳脚跟？中国的知识分子，你们又在哪里？]]></description>
			<content:encoded><![CDATA[<p>言论自由作为人权重要的组成部分，一直在被国内外的学者所探讨。从通常的视角来看，国家政策取决于掌权组织的决定，人民的意见并没有一种强制性的力量可以主导政策的方向。但是，应该认识到的是，这一自由长期以来都在暗中深刻地影响着时代中一些实践方面的争论，与此同时，它也早已成为国计民生的一项重大问题。从某种意义上来说，自人类最原始的社会开始，言论自由就在划分着人类社会的层次，当人类进入文明社会以后，当人类经过思想启蒙的洗礼之后，这一问题已经以崭新的面貌呈现在人们面前，而且比以往任何时候都迫切地需要被解决。<span id="more-404"></span></p>
<p>人们对言论自由最迫切地需求来源于，没有人可以断定什么是绝对正确的，反之，也不存在这么一个人，他可以断言什么是绝对错误的。不难看出，社会的发展是建立在人类群体智慧的基础之上，而绝不是某些个人英雄所造成的。群体智慧尽管在大多数情况下不如个人智慧显得那么具有锋芒，或是那么具有前瞻性，但群体智慧最大的好处在于，分立的个体智慧在群体中产生博弈，最终融合的群体智慧在对事物正确性的判断上具有无与伦比的优势。</p>
<p>在人类心灵未臻完善的状态下，对于同一问题，若其想要探究其中的真理，那么只有通过意见分歧才能使真理的各个方面得到公平竞争的机会。举例来说，如果对于某个问题，某个人的说法得到了多数人的认可，并且假设他的见解的确是正确的，那么，纵使是那些少数人的异议，也总是值得人们去研究，去辨析的，而如果社会将这种异议强制排除，那么，真理必然就会有所缺失，而这种缺憾，竟仍是建立在假设先前那人说法正确的前提下，可见，如果他的意见并没有那么正确，后果将会更加残酷。</p>
<p>这就是说，只要人们愿意甚至是被迫兼听多方意见，那么探寻真理便仍有希望。反之，倘若仅有一种意见主导了社会全局的舆论方向，那么这种单一的认同势必会硬化为偏见，人们心中所以为的真理便会被夸大为谬误，不复真理性。</p>
<p>人们永远不能确信，他们所排斥的意见必然是一个谬误的意见，即使他们确信，那么力图将这种意见拒之门外也是一种罪恶。</p>
<p>有人认为既然人类无法决定孰是孰非，那么就让时间来见证吧。但是必须认识到，无限的时间并没有意义，人们在利用时间去衡量人类发展史上的正确和错误时，势必要将时间切割，变成我们所熟知的“在那个时代”，“在这个时代”。而时间一旦被切割，其被神化的判断力就不显得那么可靠了。就如现在的人看过去的时代，总是能发现那个时代里的种种谬误，而这种谬误，很可能在当时却是社会的主流思想。</p>
<p>总的来说，人类自由的领域至少需要包含以下三方面。第一，思想和精神的自由。第二、言论的自由。第三、人与人之间联合的自由。若这三者有一者不满足，那么，就不可称之为是自由的社会。请注意，这里的自由并非毫无限制（事实上毫无限制根本不是自由），如果能仔细想一想，便可知道，这些都可以并且必须建立在不强迫或伤害他人的前提下。在人们享有自己的自由时，必须保证他人的自由不受侵犯。无论是什么人都无权剥夺这种权利。</p>
<p>如果社会的意识不加适当限制地完全凌驾于个人意识之上，甚至利用舆论和立法力量强行为之。那么，社会的权利也将彻底凌驾于个人权利之上。有人乐观估计，由于现状特殊，在将来，人们的权利将会得到更多的尊重和保证。但必须意识到，这种强制力越严重，这种趋势也将越持久，并且会以越来越快的速度增长。所以如果无为，那么这样的乐观估计就并不值得相信。</p>
<p>言论自由冲击的将是社会群体对知识的认识。就像当年的苏格拉底、哥白尼一号人，当思想的革新如春风一般沐浴着人们时，社会那旧的顽石便会恼羞成怒地将其及其相关的事物抹杀。但是，尽管苏格拉底、哥白尼被当时的社会所扼杀，但是他们的思想却如日中天，散发着真知和求实的光辉，照耀着人们渴望真理的眼神。</p>
<p>在精神奴役的气氛中，曾经有过而且也会再有伟大的个人思想家。但是，在那种气氛中，从来没有也永远不会有智力活耀的人民。</p>
<p>人们应当有自由思考并发表意见的权利，如之前所说，倘若这种权利和自由得不到保障，那么在人类智慧的发展上将会造成毁灭性的后果，而从长远来看，对于社会的进步也没有积极的作用。</p>
<p>有人说现在中国的教育存在问题，学生的个性得不到张扬，所有的问题只有一个正确答案，多少年来，人们反复质疑教育改革，认为我们的教育并没有迎来真正的变革。但是，这种要求改革的声音喊了这么多年，为什么却得不到真切的解决？因为它触及了我们整个社会的风格，如何想象一个发言要经过各种过滤系统的处理才能被放出来的社会，却要去拥有一个充满自主和个性化的教育，如果孩子们都是这样被教育出来的，那么当他们成为这个社会的主导力量时就会发现，要么被扼杀的是旧制度，要么就是他们自己。</p>
<p>人们必须意识到的是，没有一件事不是由某一个人第一个发现或是第一个做出来的，当现代社会所有的成就被细分时，就会发现，每一件事物都必定由一个人最先发现，进而才由其自己或是某个组织去深入研究，得出成果。古人犹此，今人何为？既然现代社会仍然有许多还不尽人意的地方，那么每个人都应该相信，自己也许就是那个第一个发现的人。而建立起全社会的这种风气，势必需要交流的自由，也即言论的自由。</p>
<p>约150年前，一位英国的哲学家曾说过这样一段话：</p>
<blockquote><p>我们要以中国为前车之鉴。那个国族乃是一个富有才能并且在某些方面甚至也富有智慧的国族，因为他们遇有难得的好运，竟在早期就备有一套特别好的习俗，这在某种范围内也就是一些即使最开明的欧洲人在一定限制下也必须尊称为圣人和智者的人们所做出的事功。他们还有值得注视的一点，就是有一套极其精良的工具用以尽可能把他们所保有的最好智慧深印于群体中的每一心灵，并且保证凡是最能称此智慧的人将得到有荣誉有权力的职位。毫无疑义，做到这个地步的人民已经发现了人类前进性的奥秘，必以保持自己稳稳站在世界运动的前列。可是相反，他们却已变成静止的了，他们几千年来原封未动；而他们如果还会有所改进，那必定要依靠外国人。</p></blockquote>
<p>再来看看我们现在的自然科学教育、“自主创新”、山寨文化，不禁怅然，每个人都应该思考，我们是否真的需要依靠外国人的成果才能在世界上站稳脚跟？中国的知识分子，你们又在哪里？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hesey.net/2010/09/why-we-need-free-speech.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《盗梦空间》观后感（剧透慎入）</title>
		<link>http://blog.hesey.net/2010/09/review-of-inception.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=review-of-inception</link>
		<comments>http://blog.hesey.net/2010/09/review-of-inception.html#comments</comments>
		<pubDate>Mon, 06 Sep 2010 14:52:57 +0000</pubDate>
		<dc:creator>Hesey</dc:creator>
				<category><![CDATA[思考]]></category>

		<guid isPermaLink="false">http://blog.hesey.net/?p=399</guid>
		<description><![CDATA[看完《盗梦空间》，留给观众最大的悬念莫过于剧情结束时的陀螺，影片没有告诉观众陀螺最终是否停下，而停与否则直接决定了最终的场景究竟是梦境还是现实。 在这里不想讨论多层梦境的设定，可能是有过不少梦中梦的经历，对我来说这种设定非常自然，没有什么难以理解的地方，何况所谓的多层梦境也只是层次结构，只是嵌套罢了，如果是递归的话，可能会更新奇。 电影中的同步穿越很有意思，所谓穿越，就是在人进入梦境无法及时脱身时，在外界施以某种刺激来强制唤醒（药剂师说过，药剂不会破坏人的平衡感）。在剧情的最后，主角几人通过三层梦境的同步穿越回到第一层梦境（请注意，在这里不是回到现实之中）。而在这个过程中至关重要的就是三层梦境的同步穿越，分别是第一层梦境的面包车落水、第二层梦境的爆炸引发的加速度、第三层梦境的雪地基地的爆炸。三个同步必须同时进行，否则就会发生像面包车刚从桥上坠落时的情况：无法顺利穿越回来。 这里我设想了两种设定让同步穿越更为方便（当然与此同时影片的刺激程度也会大打折扣）。 第一种是改异步为同步。深层梦境的穿越需要建立在浅层梦境穿越的基础之上。例如之前的1、2、3层同步穿越，第一层穿越需要事先满足第二层穿越的条件（即第二层发生穿越），第二层穿越需要第三层满足穿越条件，如此，先让第三层的人物发生穿越，之后第二层发生穿越，最后第一层发生穿越。这种方式的问题在于，同步时存在穿越时间差，第三层穿越时第二层很可能要过一会儿才能继续穿越。这时第三层就必须持续维持住穿越所需要的刺激，这里第一能想到的就是时间静止，这将引入更多的不可预料因素。 第二种设定是利用量子力学纠缠态。纠缠态是在量子力学中使用一个波函数来同时描述一个系统中的多个对象，简单地说，就是如果一群物体处于纠缠态中，当这个系统中的一个物体的状态发生变化，其它所有物体的状态瞬间也会随之变化。此时如果能使各层梦境中的人物满足量子纠缠的条件，那么当高层梦境中的人物发生穿越的瞬间，所有其上的浅层梦境中的人物均会同时触发穿越条件，从而满足同步穿越的条件。这种方式的问题在于穿越时机不可控，由于深层梦境的人物无法知道浅层梦境是否需要穿越，所以很可能浅层梦境的任务尚未完成，就因为最深层梦境的穿越触发连锁反应，此外，各层梦境的穿越实际上是平等的，所以任何一层的穿越都会引发所有层的同步穿越。 然后再来讲讲最后的陀螺究竟有没有停下。 有人说陀螺停下了，因为陀螺转着转着开始不那么平稳，说明它最终将会倒下。对于这种说法，我想提醒的是，在造梦师初学造梦时，可是扭曲了空间，让人可以像贴着天花板那样走路，盗梦师也说了，在梦境里，一切物理规则是由自己支配的。所以按照通常的物理规则来推算最后陀螺的停下是欠妥的，也许陀螺会停在某个角度以一种奇怪的方式持续旋转呢？ 还有一种说法是盗梦师最后看到了孩子的脸，如果是梦境，他是应该看不到的（因为他没亲眼见过孩子的模样）。这种说法也是建立在已经是处于现实的基础之上，如果是在梦境里，是完全可以看到孩子的脸的。在这里我有一个想法，就是故事从头到尾都是在叙述某一层梦境，从来没有给我们看到“现实”。当然这种假设其实是没有意义的，因为这时从电影角度来说，观众根本不知道如何区分真正的现实和梦境。就像问一个人宇宙外面是什么，对于这种未知，任何回答恐怕对真实都没有意义。 当然我并不是赞同陀螺没有停下的。最重要的一点，如果最后一幕不是现实，那么盗梦师实际上就是在凭自己的记忆造梦，剧情前期曾说过，凭借记忆造梦会让自己分不清现实和梦境。在这一前提下，如果最后一幕是梦境，那么就是在记忆造梦的基础上还要加上虚构的造梦，这种设定会让梦本身极不稳定，极易发生崩塌。 最后，强烈推荐此片，此片已经在IMDB Top250排行榜上名列第四，是不可多得的好片！]]></description>
			<content:encoded><![CDATA[<p>看完《盗梦空间》，留给观众最大的悬念莫过于剧情结束时的陀螺，影片没有告诉观众陀螺最终是否停下，而停与否则直接决定了最终的场景究竟是梦境还是现实。</p>
<p>在这里不想讨论多层梦境的设定，可能是有过不少梦中梦的经历，对我来说这种设定非常自然，没有什么难以理解的地方，何况所谓的多层梦境也只是层次结构，只是嵌套罢了，如果是递归的话，可能会更新奇。</p>
<p>电影中的同步穿越很有意思，所谓穿越，就是在人进入梦境无法及时脱身时，在外界施以某种刺激来强制唤醒（药剂师说过，药剂不会破坏人的平衡感）。在剧情的最后，主角几人通过三层梦境的同步穿越回到第一层梦境（请注意，在这里不是回到现实之中）。而在这个过程中至关重要的就是三层梦境的同步穿越，分别是第一层梦境的面包车落水、第二层梦境的爆炸引发的加速度、第三层梦境的雪地基地的爆炸。三个同步必须同时进行，否则就会发生像面包车刚从桥上坠落时的情况：无法顺利穿越回来。</p>
<p>这里我设想了两种设定让同步穿越更为方便（当然与此同时影片的刺激程度也会大打折扣）。<span id="more-399"></span></p>
<p>第一种是改异步为同步。深层梦境的穿越需要建立在浅层梦境穿越的基础之上。例如之前的1、2、3层同步穿越，第一层穿越需要事先满足第二层穿越的条件（即第二层发生穿越），第二层穿越需要第三层满足穿越条件，如此，先让第三层的人物发生穿越，之后第二层发生穿越，最后第一层发生穿越。这种方式的问题在于，同步时存在穿越时间差，第三层穿越时第二层很可能要过一会儿才能继续穿越。这时第三层就必须持续维持住穿越所需要的刺激，这里第一能想到的就是时间静止，这将引入更多的不可预料因素。</p>
<p>第二种设定是利用量子力学纠缠态。纠缠态是在量子力学中使用一个波函数来同时描述一个系统中的多个对象，简单地说，就是如果一群物体处于纠缠态中，当这个系统中的一个物体的状态发生变化，其它所有物体的状态瞬间也会随之变化。此时如果能使各层梦境中的人物满足量子纠缠的条件，那么当高层梦境中的人物发生穿越的瞬间，所有其上的浅层梦境中的人物均会同时触发穿越条件，从而满足同步穿越的条件。这种方式的问题在于穿越时机不可控，由于深层梦境的人物无法知道浅层梦境是否需要穿越，所以很可能浅层梦境的任务尚未完成，就因为最深层梦境的穿越触发连锁反应，此外，各层梦境的穿越实际上是平等的，所以任何一层的穿越都会引发所有层的同步穿越。</p>
<p>然后再来讲讲最后的陀螺究竟有没有停下。</p>
<p>有人说陀螺停下了，因为陀螺转着转着开始不那么平稳，说明它最终将会倒下。对于这种说法，我想提醒的是，在造梦师初学造梦时，可是扭曲了空间，让人可以像贴着天花板那样走路，盗梦师也说了，在梦境里，一切物理规则是由自己支配的。所以按照通常的物理规则来推算最后陀螺的停下是欠妥的，也许陀螺会停在某个角度以一种奇怪的方式持续旋转呢？</p>
<p>还有一种说法是盗梦师最后看到了孩子的脸，如果是梦境，他是应该看不到的（因为他没亲眼见过孩子的模样）。这种说法也是建立在已经是处于现实的基础之上，如果是在梦境里，是完全可以看到孩子的脸的。在这里我有一个想法，就是故事从头到尾都是在叙述某一层梦境，从来没有给我们看到“现实”。当然这种假设其实是没有意义的，因为这时从电影角度来说，观众根本不知道如何区分真正的现实和梦境。就像问一个人宇宙外面是什么，对于这种未知，任何回答恐怕对真实都没有意义。</p>
<p>当然我并不是赞同陀螺没有停下的。最重要的一点，如果最后一幕不是现实，那么盗梦师实际上就是在凭自己的记忆造梦，剧情前期曾说过，凭借记忆造梦会让自己分不清现实和梦境。在这一前提下，如果最后一幕是梦境，那么就是在记忆造梦的基础上还要加上虚构的造梦，这种设定会让梦本身极不稳定，极易发生崩塌。</p>
<p>最后，强烈推荐此片，此片已经在IMDB Top250排行榜上名列第四，是不可多得的好片！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hesey.net/2010/09/review-of-inception.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

