<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Rex Wang</title>
        <link>https://rexwang.cc</link>
        <description>Your blog description</description>
        <lastBuildDate>Thu, 11 Jun 2026 19:00:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Rex Wang</title>
            <url>https://rexwang.cc/favicon.ico</url>
            <link>https://rexwang.cc</link>
        </image>
        <copyright>All rights reserved 2026</copyright>
        <item>
            <title><![CDATA[My Java Design Patterns Learning Notes]]></title>
            <link>https://rexwang.cc/articles/2017-java-design-patterns</link>
            <guid>https://rexwang.cc/articles/2017-java-design-patterns</guid>
            <pubDate>Thu, 19 Jan 2017 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<h2>Design Principles</h2>
<blockquote>
<ol>
<li>Identify the aspects of your application that vary and separate them from what stays the same.</li>
<li>Program to an interface, not an implementation.</li>
<li>Favor composition over inheritance.</li>
<li>Strive for loosely coupled designs between objects that interact.</li>
<li>Encapsulate what varies.</li>
<li>Classes should be open for extension, but closed for modification.</li>
<li>Depend upon abstractions, do not depend upon concrete classes.</li>
<li>Principle of Least Knowledge talk only to your immediate friends. (When designing a system, for any object be careful of the number of classes it interacts with and also how it comes to interact with those classes)</li>
<li>Don't call us, we'll call you. (High-level components give the low-level components this principle)</li>
<li>A class should have only one reason to change.</li>
<li>A Pattern is a solution to a problem in a context.</li>
</ol>
</blockquote>
<img alt="" loading="lazy" width="3840" height="5760" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fricardo-gomez-angel-5YM26lUicfU-unsplash.17c65a89.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fricardo-gomez-angel-5YM26lUicfU-unsplash.17c65a89.jpg&amp;w=3840&amp;q=75">
<h2>Design Patterns</h2>
<h3><code>Strategy</code></h3>
<ul>
<li>
<p>The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. (Encapsulate interchangeable behaviors and use delegation to decide which behavior to use)</p>
</li>
<li>
<p>Example: Duck Simulator</p>
</li>
</ul>
<h3><code>Observer</code></h3>
<ul>
<li>
<p>The Observer Pattern defines a one-to-many (one subject to many observers) dependency between objects so that when one object changes state, all of its dependents are notified and updated automatically.</p>
</li>
<li>
<p>Example: Weather Displayer / Newspaper Subscribers</p>
</li>
<li>
<p>Bad things of <code>java.util.Observable</code> and <code>java.util.Observer</code>:</p>
<ul>
<li>
<p>Observable is a class not an interface, you can't add on the Observable behavior to an existing class which already extends another superclass.</p>
</li>
<li>
<p>Observable is not an interface, so you can't use that built-in API with ease.</p>
</li>
<li>
<p><code>setChanged()</code> is protected, unless subclass the Observable, you cannot use it.</p>
</li>
</ul>
</li>
</ul>
<h3><code>Decorator</code></h3>
<ul>
<li>
<p>The Decorator Pattern attahches additional respnsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.</p>
</li>
<li>
<p>Example: StarBuzz Coffee/ Java I/Os</p>
</li>
</ul>
<h3><code>Factory</code></h3>
<ul>
<li>
<p>The Factory Method Pattern defines an interface for creating an object, but lets subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses. (Use this to decouple your client code from the concrete classes you need to instantiate, or you don't know ahead of time all the concrete classes you are going to need. Just subclass Factory Method and implement the factory method) (Subclasses decide which concrete classes to create)</p>
</li>
<li>
<p>In design patterns, the phrase "implement an interface" does NOT alsways mean "write a class that implements a Java interface, by using the 'implements' keyword in the class declaration". In the general use of this phrase, a conrete class implementing a smethod from a supertype(which could be a class OR interface) is still considered to be "implementing the interface" of that supertype.</p>
</li>
<li>
<p>The Abstract Factory Pattern provides an interface for creating families of related or dependent objects without specifying their concrete classes. (Use this whenever you have families of products you need to create and you want to make sure your clients cerate products that belong together)</p>
</li>
</ul>
<h3><code>Singleton</code></h3>
<ul>
<li>
<p>The Singelton Patten ensures a class has only one instnce, and provides a global point of access to it.</p>
</li>
<li>
<p>A very smart example to get familiar with Singleton:</p>
</li>
</ul>
<p>For a class like this:</p>
<pre class="language-java"><code class="language-java">
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Chicken</span> <span class="token punctuation">{</span>
    <span class="token class-name">String</span> description<span class="token punctuation">;</span>

    <span class="token keyword">private</span> <span class="token class-name">Chicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        description <span class="token operator">=</span> <span class="token string">"This is a chick!"</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Main</span> <span class="token punctuation">{</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span> args<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token class-name">Chicken</span> chicken1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Chicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>chicken1<span class="token punctuation">.</span>description<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>The class "Chicken" cannot be instantiated because it has a private constructor. Private means the code in class "Chicken" is the only code that could call it, and we'd have to have an instance "the chicken1" to call it, but we can't have that instance because no other class can instantiate it. It's a chicken and egg problem: we can use the constructor from an object of type Chicken, but we can never instantiate a Chicken because no other object (including Main) can use "new Chicken".</p>
<p>To solve it, we can do this:</p>
<pre class="language-java"><code class="language-java">
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Chicken</span> <span class="token punctuation">{</span>
    <span class="token class-name">String</span> description<span class="token punctuation">;</span>

    <span class="token keyword">private</span> <span class="token class-name">Chicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        description <span class="token operator">=</span> <span class="token string">"This is a chick!"</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token class-name">Chicken</span> <span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Chicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Main</span> <span class="token punctuation">{</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span> args<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token class-name">Chicken</span> chicken2 <span class="token operator">=</span> <span class="token class-name">Chicken</span><span class="token punctuation">.</span><span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>chicken2<span class="token punctuation">.</span>description<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>By using the class method <code>getInstance()</code>, we can access the private constructor then. To modify it to a singleton demo, just need to do like below:</p>
<pre class="language-java"><code class="language-java">
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Chicken</span> <span class="token punctuation">{</span>
    <span class="token class-name">String</span> description<span class="token punctuation">;</span>

    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token class-name">Chicken</span> uniqueInstance<span class="token punctuation">;</span>

    <span class="token keyword">private</span> <span class="token class-name">Chicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        description <span class="token operator">=</span> <span class="token string">"This is a chick!"</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token class-name">Chicken</span> <span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>uniqueInstance <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
            uniqueInstance <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Chicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">return</span> uniqueInstance<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Main</span> <span class="token punctuation">{</span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span> args<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token class-name">Chicken</span> chicken3 <span class="token operator">=</span> <span class="token class-name">Chicken</span><span class="token punctuation">.</span><span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>chicken3<span class="token punctuation">.</span>description<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<ul>
<li>To deal with <strong>multi-thread-trap of Singleton</strong>, we have three ways:</li>
</ul>
<p>I. Use Synchronization:</p>
<pre class="language-java"><code class="language-java">
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Chicken</span> <span class="token punctuation">{</span>
    <span class="token class-name">String</span> description<span class="token punctuation">;</span>

    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token class-name">Chicken</span> uniqueInstance<span class="token punctuation">;</span>

    <span class="token keyword">private</span> <span class="token class-name">Chicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        description <span class="token operator">=</span> <span class="token string">"This is a chick!"</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">synchronized</span> <span class="token class-name">Chicken</span> <span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>uniqueInstance <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
            uniqueInstance <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Chicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">return</span> uniqueInstance<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>II. Move to an eagerly created instance ranther than a lzily created one by:</p>
<pre class="language-java"><code class="language-java">
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Chicken</span> <span class="token punctuation">{</span>
    <span class="token class-name">String</span> description<span class="token punctuation">;</span>

    <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token class-name">Chicken</span> uniqueInstance <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Chicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">private</span> <span class="token class-name">Chicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        description <span class="token operator">=</span> <span class="token string">"This is a chick!"</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token class-name">Chicken</span> <span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token keyword">return</span> uniqueInstance<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>III. Use "double-checked locking" to reduce the use(cost) of synchronization, in this case the synchronization will happen just for once (<strong>volatile keyword's JVM implementations are not stable in Java 4 and earlier editions!</strong>):</p>
<pre class="language-java"><code class="language-java">
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Chicken</span> <span class="token punctuation">{</span>
    <span class="token class-name">String</span> description<span class="token punctuation">;</span>

    <span class="token keyword">private</span> <span class="token keyword">volatile</span> <span class="token keyword">static</span> <span class="token class-name">Chicken</span> uniqueInstance<span class="token punctuation">;</span>

    <span class="token keyword">private</span> <span class="token class-name">Chicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        description <span class="token operator">=</span> <span class="token string">"This is a chick!"</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token class-name">Chicken</span> <span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>uniqueInstance <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
            <span class="token keyword">synchronized</span> <span class="token punctuation">(</span><span class="token class-name">Singleton</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
                <span class="token keyword">if</span> <span class="token punctuation">(</span>uniqueInstance <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
                    uniqueInstance <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Chicken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                <span class="token punctuation">}</span>
            <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">return</span> uniqueInstance<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<ul>
<li>
<p>Also, be careful about classloaders when using Singleton.</p>
</li>
<li>
<p>In Java 1.2 JVM, the bugs of garbage collector will "eat" the reference of Singleton!</p>
</li>
</ul>
<h3><code>Command</code></h3>
<ul>
<li>
<p>The Command Pattern encapsulates a request as an object, thereby letting you parameterize other objects with different requests, queue or log requests, and support undoable operations.</p>
</li>
<li>
<p>An example of a <code>Null Object</code>:</p>
</li>
</ul>
<pre class="language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">interface</span> <span class="token class-name">Command</span><span class="token punctuation">{</span>
    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token comment">//To do something</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">NoCommand</span> <span class="token keyword">implements</span> <span class="token class-name">Command</span><span class="token punctuation">{</span>
    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token comment">//Nothing</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

</code></pre>
<h3><code>Adapter</code></h3>
<ul>
<li>
<p>The Adapter Patten converts the interface of a class into another interface the clients expect. Adapter lets classes work together that counldn't otherwise because of incompatible interfaces.</p>
</li>
<li>
<p>The Facade Pattern provides a unified interface to a set of interfaces in a subsystem. Facade defines a higher level interface that makes the subsystem easier to use.</p>
</li>
<li>
<p>The Adapter Pattern’s role is to convert one interface into another, how the client uses the Adapter:</p>
<blockquote>
<p>The client makes a request to the
adapter by calling a method on it using
the target interface.</p>
</blockquote>
<blockquote>
<p>The adapter translates the request into
one or more calls on the adaptee using
the adaptee interface.</p>
</blockquote>
<blockquote>
<p>The client receives the results of the
call and never knows there is an adapter
doing the translation.</p>
</blockquote>
</li>
<li>
<p>There are actually two kinds of adapters: object adapters(using composition) and class adapters(using multiple inheritance to implement, very rare in Java).</p>
</li>
<li>
<p>Example: Duck-Turkey, Enumeration(no remove() method)-Iterator(with remove() method)</p>
</li>
</ul>
<h3><code>Template</code></h3>
<ul>
<li>
<p>The Template Method Pattern defines the skeleton of an algorithm in a method, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure. (Subclasses decide how to implement steps in an algorithm)</p>
</li>
<li>
<p>Example: Coffee/Tea preparing, Most Frameworks(gets something done and leave others to be specified by you)</p>
</li>
</ul>
<h3><code>Iterator</code></h3>
<ul>
<li>
<p>The Iterator Pattern provides a way to access the elements of an aggregate object sequentially without exposing its underlying representation.</p>
</li>
<li>
<p>Start from Java 5, there is an improved loop statement to iterate over a collection or an array without creating an iterator explicitly:</p>
</li>
</ul>
<pre class="language-java"><code class="language-java"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">Object</span> obj<span class="token operator">:</span> collection<span class="token punctuation">)</span><span class="token punctuation">{</span>
    <span class="token comment">// Do something about obj</span>
    <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token punctuation">}</span>
</code></pre>
<ul>
<li>The NULL Iterator: handle that a collection has nothing to iterate over:</li>
</ul>
<pre class="language-java"><code class="language-java"><span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">Iterator</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">NullIterator</span> <span class="token keyword">implements</span> <span class="token class-name">Iterator</span><span class="token punctuation">{</span>
    <span class="token keyword">public</span> <span class="token class-name">Object</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">hasNExt</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">remove</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
        <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">UnsupportedOperationException</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<ul>
<li>Example: Waitress iterates Menu, java.util.Iterator</li>
</ul>
<h3><code>Composite</code></h3>
<ul>
<li>
<p>The Composite Pattern allows you to compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.</p>
</li>
<li>
<p>Use this pattern means you have a collections of objects with whole-part relationships and you want to treat those objects uniformly, with 'transparency'.</p>
</li>
</ul>
<h3><code>State</code></h3>
<ul>
<li>The State Pattern allows an object to alter its behavior when its internal state changes. The object will appear to change its class.</li>
</ul>
<h3><code>Proxy</code></h3>
<ul>
<li>The Proxy Pattern provides a surrogate or placeholder for another object to control access to it.</li>
</ul>
<h3><code>Compound</code></h3>
<ul>
<li>
<p>A Compound Pattern combines two or more patterns into a solution that solves a recurring or general problem.</p>
</li>
<li>
<p>MVC is the most popular compound pattern (Involved with Strategy, Observer and Composite)</p>
</li>
</ul>
<hr>
<ul>
<li>Cover photo credit to <a href="https://unsplash.com/photos/5YM26lUicfU">Unsplash</a></li>
</ul>]]></content:encoded>
            <author>rexwangcc@gmail.com (Rex Wang)</author>
        </item>
        <item>
            <title><![CDATA[A Dependency Hell issue in Clojure]]></title>
            <link>https://rexwang.cc/articles/2020-clojure-deps-hell</link>
            <guid>https://rexwang.cc/articles/2020-clojure-deps-hell</guid>
            <pubDate>Tue, 21 Jan 2020 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<img alt="" loading="lazy" width="5184" height="3336" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmaxime-valcarce-mAj8xn5zXsk-unsplash.a8e5ee9d.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmaxime-valcarce-mAj8xn5zXsk-unsplash.a8e5ee9d.jpg&amp;w=3840&amp;q=75">
<h2>The story</h2>
<p>We have a Clojure application that uses Jetty and Ring to serve itself as a web service. Recently, I'm thinking about adding a Swagger UI (or OpenAPI) to it, without having to manage a lot of Swagger assets by ourselves. luckily since we are using <code>reitit</code> as the server router, it provides some built-in support for Swagger, even though it only supports up to Swagger 2.0. Everything is smooth until suddenly we hit a snag when trying to make it work:</p>
<ol>
<li>Following the instructions here: <a href="https://cljdoc.org/d/metosin/reitit/0.3.10/doc/ring/swagger-support#examples">reitit docs for adding Swagger</a></li>
<li>When try to <code>boot build</code>, some errors popped up:</li>
</ol>
<pre class="language-shell"><code class="language-shell"><span class="token punctuation">..</span>.
java.lang.ClassNotFoundException: com.fasterxml.jackson.core.exc.InputCoercionException
java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/exc/InputCoercionException
clojure.lang.ExceptionInfo: com/fasterxml/jackson/core/exc/InputCoercionException
</code></pre>
<ol start="3">
<li>There is a few useful related information for debugging:<!-- -->
<ul>
<li><a href="http://fasterxml.github.io/jackson-core/javadoc/2.10/com/fasterxml/jackson/core/exc/InputCoercionException.html">http://fasterxml.github.io/jackson-core/javadoc/2.10/com/fasterxml/jackson/core/exc/InputCoercionException.html</a></li>
<li><a href="https://github.com/metosin/reitit/issues/331">https://github.com/metosin/reitit/issues/331</a></li>
</ul>
</li>
<li>By running <code>lein deps :tree</code> and looking at the results, it turns out the <code>vault-clj</code> library is using <code>cheshire</code>, which specifies a different version of <code>com.fasterxml.jackson.core/jackson-core</code>as its dependency from <code>reitit</code>'s. Here is the related parts of the output:</li>
</ol>
<pre class="language-clojure"><code class="language-clojure"><span class="token punctuation">[</span>amperity/vault-clj <span class="token string">"0.5.1"</span><span class="token punctuation">]</span>
   <span class="token punctuation">[</span>amperity/envoy <span class="token string">"0.3.1"</span><span class="token punctuation">]</span>
     <span class="token punctuation">[</span>environ <span class="token string">"1.1.0"</span><span class="token punctuation">]</span>
     <span class="token punctuation">[</span>table <span class="token string">"0.5.0"</span><span class="token punctuation">]</span>
   <span class="token punctuation">[</span>cheshire <span class="token string">"5.7.1"</span><span class="token punctuation">]</span>
     <span class="token punctuation">[</span>com.fasterxml.jackson.core/jackson-core <span class="token string">"2.8.6"</span><span class="token punctuation">]</span>
     <span class="token punctuation">[</span>com.fasterxml.jackson.dataformat/jackson-dataformat-cbor <span class="token string">"2.8.6"</span><span class="token punctuation">]</span>
     <span class="token punctuation">[</span>com.fasterxml.jackson.dataformat/jackson-dataformat-smile <span class="token string">"2.8.6"</span><span class="token punctuation">]</span>
     <span class="token punctuation">[</span>tigris <span class="token string">"0.1.1"</span><span class="token punctuation">]</span>
   <span class="token punctuation">[</span>com.stuartsierra/component <span class="token string">"0.3.2"</span><span class="token punctuation">]</span>
     <span class="token punctuation">[</span>com.stuartsierra/dependency <span class="token string">"0.2.0"</span><span class="token punctuation">]</span>
   <span class="token punctuation">[</span>org.clojure/tools.logging <span class="token string">"0.3.1"</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span>metosin/reitit-swagger-ui <span class="token string">"0.3.10"</span><span class="token punctuation">]</span>
   <span class="token punctuation">[</span>metosin/jsonista <span class="token string">"0.2.5"</span><span class="token punctuation">]</span>
     <span class="token punctuation">[</span>com.fasterxml.jackson.core/jackson-databind <span class="token string">"2.10.0"</span><span class="token punctuation">]</span>
       <span class="token punctuation">[</span>com.fasterxml.jackson.core/jackson-annotations <span class="token string">"2.10.0"</span><span class="token punctuation">]</span>
     <span class="token punctuation">[</span>com.fasterxml.jackson.datatype/jackson-datatype-jsr310 <span class="token string">"2.10.0"</span><span class="token punctuation">]</span>
   <span class="token punctuation">[</span>metosin/ring-swagger-ui <span class="token string">"2.2.10"</span><span class="token punctuation">]</span>
</code></pre>
<ol start="5">
<li>Looking at <a href="https://github.com/dakrone/cheshire/blob/master/ChangeLog.md#changes-between-cheshire-581-and-590">cheshire's issue</a>, it seems even the latest version of <code>cheshire</code> does not point to <code>jackson.core "2.10.0"</code> yet.</li>
<li>It is awkward, but for now the easiest solution for me is to force specify the version of <code>jackson.core</code> in my <code>boot.build</code> file, part of which now looks like this:</li>
</ol>
<pre class="language-clojure"><code class="language-clojure"><span class="token punctuation">(</span><span class="token function">set-env!</span>
 <span class="token symbol">:dependencies</span>
 '<span class="token punctuation">[</span><span class="token punctuation">[</span>com.fasterxml.jackson.core/jackson-core <span class="token string">"2.10.0"</span><span class="token punctuation">]</span>
  <span class="token punctuation">[</span>amperity/vault-clj                <span class="token string">"0.5.1"</span><span class="token punctuation">]</span>
  <span class="token punctuation">[</span>metosin/reitit                    <span class="token string">"0.3.10"</span><span class="token punctuation">]</span>
  <span class="token punctuation">[</span>metosin/reitit-swagger            <span class="token string">"0.3.10"</span><span class="token punctuation">]</span>
  <span class="token punctuation">[</span>metosin/reitit-swagger-ui         <span class="token string">"0.3.10"</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
</code></pre>
<p>Apparently, most of the people who have run into this "Jackson" error ended up listing it explicitly like what I did... Check here for more discussions about this on <a href="https://clojureverse.org/t/depending-on-the-right-versions-of-jackson-libraries/5111">Clojureverse</a></p>
<h2>One more thing</h2>
<p>Different languages/communities have different ways to manage the dependecies, e.g. JavaScript has the <code>package-lock.json</code>, Python is still figuring out (there is a great potential tool I really liked: <a href="https://github.com/python-poetry/poetry">poetry</a>, but it's still not yet widely adopted). Someone has proved that <a href="https://research.swtch.com/version-sat">the dependency hell is a NP-Complete problem</a>. While people are actively trying to improve on this problem, we should really stick with a minimum set of dependencies and avoid using unnecessary tools in our projects, i.e. don't re-invent wheels, but always use the indispensable wheels.</p>
<hr>
<ul>
<li>Cover photo credit to <a href="https://unsplash.com/photos/mAj8xn5zXsk">Unsplash</a></li>
</ul>]]></content:encoded>
            <author>rexwangcc@gmail.com (Rex Wang)</author>
        </item>
        <item>
            <title><![CDATA[MacBook Pro 16 历险记]]></title>
            <link>https://rexwang.cc/articles/2020-macbook-adventure</link>
            <guid>https://rexwang.cc/articles/2020-macbook-adventure</guid>
            <pubDate>Wed, 16 Sep 2020 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<img alt="" loading="lazy" width="684" height="649" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmbp.cc4ed0b9.jpg&amp;w=750&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmbp.cc4ed0b9.jpg&amp;w=1920&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmbp.cc4ed0b9.jpg&amp;w=1920&amp;q=75">
<p>今年初新冠疫情刚爆发的时候，新入手了眼馋已久的新 16-inch 的 MacBook Pro，幸运地没有遇到网上盛传的 “display ghosting” 问题，于是愉快地享受起了新一代 MBP 的<del>本来好好的剪刀键盘为什么非要折腾成蝴蝶又换回来的</del>全新剪刀键盘和效果拔群的内置环绕声音响。事实证明，插旗每每成真，真香次次打脸，3 月份左右到手的机器 5 月份就开始出现各种问题。</p>
<p>首先到来的是薛定谔的 Wi-Fi 问题，具体表现为电脑的 Wi-Fi 经常突然断线，图标显示为灰色并有惊叹号覆盖其上。短期解决方法其实也很简单，只要直接禁用再启用 Wi-Fi 等待自动重连一般就会自动恢复连接，然而这种坑爹问题发生在开会或者视频面试的时候，后果简直就是灾难性的。<del>曾经以为</del>幸运地是，原地重装 macOS，即在遵循<a href="https://support.apple.com/en-us/HT204904">文档</a>的基础上，注意选择<strong>不要</strong>擦除硬盘（don't erase your disk），似乎解决了这个问题。</p>
<p>事实证明，早起的鸟儿有翔吃，尝鲜入了第一代 16inch MBP 的我还是太天真了，在 Wi-Fi 问题修复后的 1 个月之后，更离奇的问题出现了 -- 恕我才疏学浅，难以完美地描述这个问题，在此贴出某网友的描述：</p>
<pre><code>If I close the lid and open it up in a couple of hours it always does a cold boot. After I insert the password, I get a black screen and all the fans got 100% for one second. Then it boots again, I insert the password and I get logged in. I always get a crash report from the OS.
</code></pre>
<p>基本上这个问题可以理解为，如果合上电脑屏幕一段时间再打开屏幕，不同于正常的从待机回复，电脑会进行一次亲切友好的冷启动，并狂转 CPU 风扇，让不知情的我以为新 MBP 内置了四路泰坦。之后 macOS 就会弹出友好但是并没有什么用的崩溃报告（事实证明，确实没啥用，但是当时的我还是保存了下来以备后需）：</p>
<pre><code>panic(cpu 0 caller 0xffffff7f96e44953): GPU Panic: mux-regs 4 3 3f 1f 0 0 severity 3 WS-ready 0 switch-state 0 IG FBs 1 EG FBs 0:0 power-state 4 3D idle HDA idle system-state 2 power-level 15:0 power-retry 0:0 connect-change 0 : [3:0:0][PPLIB] PowerPlay Failed Resume. TTL Error Message: .

Backtrace (CPU 0), Frame : Return Address
0xffffffa3fac7b700 : 0xffffff8012b1a65d
0xffffffa3fac7b750 : 0xffffff8012c54a75
...
</code></pre>
<p>这个问题出现之后就变得越来越严重，直到恶化到每天电脑自动关机 5 次以上，实在受不了的我采取的第一步措施是查看系统关机记录：</p>
<div><img alt="" loading="lazy" width="2420" height="1448" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fshutdown.d0b2c6d8.png&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fshutdown.d0b2c6d8.png&amp;w=3840&amp;q=75"><p class="flex justify-center text-sm"><em>Shutdown record / 系统关机记录</em></p></div>
<p>虽然发现了很多异常关机记录，然而并没有什么 luǎn 用。</p>
<p>接下来使出万能 Google 大法，搜到了 Apple 官方论坛上的一个<a href="https://discussions.apple.com/thread/250991137?answerId=251875862022&amp;page=9">神贴（受害者控诉贴）</a>。事实证明，这个贴子基本指出了修复这个问题的唯一的一条明路 --- <strong>不要犹豫，一旦在 16-inch MBP 上发生类似的 Kernel Panic，不要寄希望于能够通过重装系统等软件修复方式摆脱这个问题，立刻马上联系 Apple 客服，并且尽一切可能让 MacBook 返厂硬件维修!</strong> 贴子里网友们的讨论结论总结来说基本就是这个错的问题出在集成显卡和 AMD 独显的切换过程中。虽然不知道具体出现在哪里，但是最后解决问题的方案都是寄回 Apple 更换了 Logical Board (等同于 PC 上的主板)。</p>
<p>接下来的步骤就比较简单了，马上 Time Machine 备份了整个电脑，就近约了波屯 Apple Store 的 Genius Bar 然后与苹果店小哥进行了亲切友好的交流并努力说服他这绝对是个硬件问题。虽然电脑通过了各种 Genius Bar 现有的硬件检测，但是依然很给力地当场重启。小哥在重装了系统（这里需要我远程关闭这个机器对应的 Find My 服务）后依然能复现这个问题时当机立断帮我寄到了远在德州的 Repair Center。经过长达两周的修理之后，电脑被 UPS 加急寄了回来。当然还随机附带了维修清单：</p>
<div><img alt="" loading="lazy" width="2938" height="3090" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fapple.43282829.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fapple.43282829.jpg&amp;w=3840&amp;q=75"><p class="flex justify-center text-sm"><em>Apple fix record / 苹果维修记录</em></p></div>
<p>可以<del>惊喜</del>无语地看到，这个 Kernel Panic 的错误果然如帖子所说，是个严重的硬件错误，主板以及上面安装的 CPU，内存，独显，硬盘以及指纹识别触控条全部被换了个遍。。万幸的是这毕竟是刚入手几个月的新机器，Apple Care 包含了所有费用，不用我自掏腰包。</p>
<p>折腾了一圈，有操作系统级洁癖的我实在狠不下心从 Time Machine 的备份恢复，只好重新开始装机，下一篇就重新记录一下装机步骤，然后祈祷不要再遇到 Kernel Panic 了吧。。</p>
<hr>
<ul>
<li>封面图片来自无版权图站 <a href="https://pixabay.com/photos/notebook-laptop-macbook-conceptual-1280538/">pixabay</a></li>
</ul>]]></content:encoded>
            <author>rexwangcc@gmail.com (Rex Wang)</author>
        </item>
        <item>
            <title><![CDATA[I survived | 在美急性阑尾炎就医实录]]></title>
            <link>https://rexwang.cc/articles/2021-i-survived</link>
            <guid>https://rexwang.cc/articles/2021-i-survived</guid>
            <pubDate>Wed, 28 Apr 2021 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>虽然从现实来看，急性阑尾炎的风险实在够不上“逃得一命”这样的描述，标题用 I survived 也似乎稍显夸张，但是整个过程中的病痛和我的心路历程 -- 尤其是在异国他乡经历人生中第一次手术，对我自己而言也确实有些侥幸与后怕。
因此在此使用这个略显耸人听闻的标题来给未来的自己提个醒：一切状况在身体状况面前都不算大状况，以后任何时候都勿要好了伤疤忘了疼地作死。</p>
<p><em>本文写于手术后恢复期的第四天。</em></p>
<img alt="" loading="lazy" width="1920" height="1280" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcamilo-jimenez-vGu08RYjO-s-unsplash.d4deb80e.jpg&amp;w=1920&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcamilo-jimenez-vGu08RYjO-s-unsplash.d4deb80e.jpg&amp;w=3840&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcamilo-jimenez-vGu08RYjO-s-unsplash.d4deb80e.jpg&amp;w=3840&amp;q=75">
<h2>起因与背景</h2>
<p>从回顾的视角来看其实也许这次阑尾炎早有征兆。在一年多以前新冠疫情还未爆发时，我曾有一次在 Gyukaku 牛角暴饮暴食的经历，基本上就是烤牛肉和啤酒一次性地吃了太多，导致腹痛卧床了几天。
那次之后我侥幸自然恢复了正常状态，但确实让我对饮食，尤其是荤腥油腻有了一定的注意，我也在卧床期间查询了类似阑尾炎的症状和后果，这可能也间接对我这次的就医起到了一定帮助。</p>
<p>时间回到几天前，在周二打完 Pfizer 的新冠疫苗之后，整周时间我都忙于工作上一个较为重要的 deadline，这可能使得我的免疫水平整体处于较低的位置。周五时我因为专注于一个 feature，
晚上跳过了晚餐，并在稍稍熬夜（凌晨 1 点左右）后入睡。周六清晨起床时还没有异常，只是感觉到有一些腹痛，在怀疑是跳过晚餐导致的饥饿后我进食了一碗燕麦粥和一碗小米粥。然而在那之后腹痛急转直下，
先是肚脐中心位置的胀痛，在接下来的几个小时内疼痛扩散到整个下腹部并且加剧到额头冒汗。在使用了热水袋热敷、壁炉直接烤火均无效后，妻子在母亲的远程建议下终于和我收拾东西准备出发去医院。</p>
<p>这里实在想要吐槽一下害人的老观念，其中之一就是所谓从小听到的“饭后不要跑步，会得阑尾炎”，这句话也许是一个必要条而非充分条件，但实际上在我们大多数人脑海中都灌注了“我没饭后运动，不太可能是阑尾炎”的潜意识，
事实上，在与医生的沟通中我了解到，大多数在二十多岁青年都是因作息和饮食不规律而犯急性阑尾炎的。</p>
<h2>就医</h2>
<p>及时就医也许是整个事件中我们做的最正确的事情了，否则后果可能会不堪设想，这点在后面复盘时会提到。然而，就医本身在目前美国新冠疫情依然肆虐的情况下确实是一种让人紧张的选择。自去年3月新冠疫情在美爆发以来，
为了降低暴露风险，我们甚至停止了定期的牙医门诊预约，更别提登门去风险更大的医院了，不过当时的疼痛程度让我们别无选择。我们首先打电话询问了家附近的 <a href="https://www.afcurgentcare.com/watertown">Urgent Care</a>，通常来说，这类 UC 门诊都是连锁或私人经营的面向社区大众的 walk-in 门户，在大医院/医疗中心排队时间较长，或没有家庭医生的情况下，类似发烧、腹泻等症状通常会先找 UC 就诊。Urgent Care 在简单询问病情后就回复我他们的图像设备由于在检修，当天无法帮我确诊任何情况，由于指压反跳痛（指头按到痛处，快速收回时有反射性跳痛）的存在，此时家人和我自己已经初步判断这是急性阑尾炎；考虑到我们还没有自己的家庭医生，也没有直接去医院的 Emergency Room 的经验，我们还是硬着头皮地先开车去了 UC。</p>
<blockquote>
<p>UC 在联系的时候询问了我需不需要救护车来接，在脑中浮现了 “留学生因叫救护车欠下几万美元的负债” 等新闻后，
我忍痛拒绝了这个选项。时候复盘时想到，如果当时没有妻子开车，叫救护车一定是最正确的保命选项。因此提醒广大在美
朋友，在遇到紧急医疗状况时，在无人陪伴、或无法及时就医的情况下，请一定立马通过医院电话或 911 叫救护车！</p>
</blockquote>
<p>在 UC 门诊的 1 个小时较为痛苦，其中 30 分钟的时间在排队等待办理手续，此时距离症状产生已经有 5 个小时左右，腹痛已经加剧并且转移到了下腹部，而 UC 门诊也不出所料地在测了我的血压和心跳后没有给出任何建设性的诊断。比较有意思的是，他们会让患者自己给出从 1 到 10 量化的“疼痛指数”，我像大多数患者一样，在这种时候毫不犹豫地给出了 10 分，随后终于被 UC 推荐到了在各大医疗美剧中频繁出现、传说中的 ER，也即 <a href="https://www.mountauburnhospital.org/about-us/">Mount Auburn Hospital of Harvard Medical School</a> 下属的急诊室。</p>
<p>到达 ER 后的流程非常简单，在和登记处的阿姨说明了情况的紧急后，我迅速被带往了 ER 的观察室等待。进入 ER 后，看到了疑似车祸、烧伤伤患后我就感觉到自己的情况可能不是不会被优先处理，事实也是如此，在躺在观察室的小床上长达30 分钟后，我才终于迎来了护士大叔和值班医生的询问，过程也和在 UC 做过的基本问询一模一样。也许是身体已经达到了疼痛的临界值，在医生询问我是否感到恶心时，本想说不的我腹中一阵翻滚，反射性地直接 vomit 了。。。虽然有点丢人，但是也迅速地让护士确认
了我疼痛的糟糕状态并开始给我进行临床处理，包括安排 CT scan、抽整整 4 大管血液做化验以及打了一针强效镇痛剂。</p>
<div><img alt="" loading="lazy" width="4032" height="3024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fer-waiting-room.48adeaf8.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fer-waiting-room.48adeaf8.jpg&amp;w=3840&amp;q=75"><p class="flex justify-center text-sm"><em>小小的 ER 等候/观察室</em></p></div>
<p>值得一提的是，到现在我都很好奇当时的镇痛剂是什么（并怀疑是芬太尼等强效阵痛类药物），因为它真的很管用，打完后的 30 秒内直感觉有一阵血液从脚底涌向脑中，然后整个身体的痛觉都像是被隔离在了感知之外，思维好像成为了旁观者；唯一的缺点就是在 30 分钟后疼痛感就回归了身体，之后每隔几个小时都需要求护士大叔帮我加打稍弱一些的杜冷丁来压制疼痛。</p>
<p>在这个环节我终于体验了医疗剧中的万能病床：在等候室的病床直接被无障碍地推到了 CT 室。上一个从 CT 出来的大叔不知出了什么事故，半个头都扁了下去，看的我着实心慌；好在整个 CT 过程比较顺利，并没有之前看的其他经历那样需要吃钡餐，而是直接躺进环形机器里，感受从脚底到腰部的一阵暖流飘过。回到观察室后，已经打了强效镇痛剂的身体也渐渐没有了之前那种难忍的阵痛，由于新冠期间的特殊政策，此时已经是晚上 8 点，家属被 ER 的护士打发回家，于是我就治好默默躺在观察室里等待诊断结果，顺便感受传说中急诊室紧张的 night shift 氛围。</p>
<h2>手术</h2>
<p>在 CT 后大约 2 小时，我终于等来了化验和诊断结果，基本上和预计中一样，需要尽快进行阑尾切除手术。幸运的是，因为就医及时，我的阑尾炎症还没有恶化到最坏的情况 -- 穿孔，所以可以进行 laparoscope （微创腹腔镜）手术：在腹腔上开 3 个微型小洞，分别负责打入气体以撑大腹腔、探入腹腔镜和取出阑尾。让我心中一紧的是，医生通知我这个手术必须要等到第二天再做，这也就意味着：1. 我需要住院观察一晚（而住院在医疗费用高昂的美国意味着可能的天价账单）2. 我还需要忍耐一晚的疼痛？</p>
<p>好在我的第二个担忧马上被驱散：在被捅过了酸爽的新冠鼻拭子后，我连人带病床一起被推过了很多个区域，直接来到了 ER 之外的住院部，手臂上被插入了可复用的静脉留置针（这样就不担心手臂被扎地千疮百孔），肚子上也被扎了一针（镇痛剂？）后，就躺到了极为舒适的智能病床上。病房本身非常舒适，还毗邻查尔斯河，夜晚甚至可以看到月亮倒映在河水中的景色，可惜此时的我充满了对手术的担忧，无心赏景。</p>
<div><img alt="" loading="lazy" width="4032" height="3024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fretaining-needle.4a4a9f6c.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fretaining-needle.4a4a9f6c.jpg&amp;w=3840&amp;q=75"><p class="flex justify-center text-sm"><em>静脉留置针</em></p></div>
<p>在安顿到了病房之后，我开始了静脉输液，并且之后每隔 3 到 4 个小时，都会有夜班护士来测量 vitals （心率、血压等的统称，窃以为 vitals 是个非常生动的统称），并帮我注射一定剂量的抗生素、消炎药和其他药物，据说这是为了稳定我的阑尾炎症，为第二天的手术做准备。虽然我被告知可以随时要求继续注射镇痛剂，但似乎是抗生素和消炎药起到了很大作用，我自住院后到第二天都没有再感受到很强的痛感，出于对镇痛剂那种上瘾感的恐惧，也就没有要求更多剂量了。也许是白天的疼痛实在耗费精力，在病房的这一整晚我都睡得比较舒适，唯一尴尬的就是夜间需要在指定容器中 pee ，用以送到实验室化验，换上了过于宽大病号服的我为此着实费了一番功夫。</p>
<div class="grid grid-cols-3 justify-center items-center self-stretch gap-3"><img alt="" loading="lazy" width="4032" height="3024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fthe-room-at-night.839842f8.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fthe-room-at-night.839842f8.jpg&amp;w=3840&amp;q=75"><img alt="" loading="lazy" width="4032" height="3024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fthe-room-daytime.66f5008d.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fthe-room-daytime.66f5008d.jpg&amp;w=3840&amp;q=75"><img alt="" loading="lazy" width="4032" height="3024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Froom-details.7201d14b.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Froom-details.7201d14b.jpg&amp;w=3840&amp;q=75"></div><p class="flex justify-center text-sm"><em>毗邻查尔斯河的住院病房</em></p>
<p>到了第二天清晨 7 点左右，负责手术的医生早早来到了病房，和我讲解了手术的原理，并非常轻松地告知我他是手术部门的 chair，而这是个非常 routine 而简单的手术，不要害怕，全麻后我会毫无知觉，再醒来就大功告成了。我将信将疑地被一路推送到了手术室等待，而一位华裔麻醉医生也在这里对我进行了评估和另一番安慰；事后做研究才得知，Anesthesiologist 是一个相当稀缺而技术含量极高的职业，尤其对于全麻手术而言，要根据病人的身体素质、重量等来实施麻醉，否则可能会有后遗症甚至是很高的风险。麻醉医生主要问到我日常有服用任何药物，而听到我仅长期服用 Zyrtec 后便摆了摆手示意没有问题了。</p>
<blockquote>
<p>提到 Zyrtec（盐酸西替利嗪）与过敏，一种常见的观念是“美国的空气好，在国内较低空气质量下生活的过敏患者到了美国就绝对会有所好转”。然而根据亲身经历，我本人在 6 年前出国前没有对任何已知的过敏原有反应，而在美国生活 5 年后却开始产生了强烈的过敏反应，也即喷嚏不止、呼吸堵塞等。在与一位印度大叔交流过后才知道，他也是在加拿大生活 3 年后才开始产生了各种过敏反应；而据给我打新冠疫苗的海军陆战队小哥所言，他从 8 岁起服用 Zyrtec，到今年已经是第十三个年头了。由此可见，除非过敏原是空气中的颗粒物，否则产生过敏反应时，还是需要在医生的指导下仔细筛查过敏原，而不要单纯寄希望于“换个地方”。顺带一提，虽然还没有做过更细致的过敏原测试，但美国公寓中常见的毛绒地毯是我目前的第一怀疑对象。</p>
</blockquote>
<p>在缓解过敏症状方面，除 Zyrtec 之外，我还推荐 gsk 出品的 <a href="https://www.gskhealthpartner.com/en-us/respiratory-health/brands/flonase-products/flonase/allergy-relief-flonase">FLONASE Allergy Relief</a> 系列喷雾，有着不会致困的好处，但是相对来说较为昂贵，一小瓶可以用一个月的喷雾价格在 30 美元以上，建议从 Costco 购买大包装。</p>
<p>被推上手术台后的记忆现在已经相当模糊了，只记得有一个“氧气面罩”被戴在了脸上，然后在医生问我出生年月的那一瞬间便失去了知觉。</p>
<h2>术后</h2>
<p>从麻醉醒来的过程很神奇但又让我有些后怕和恐惧，像是鬼压床的感觉，却又没有那么清晰的思维，只是隐隐听到心率监控仪滴滴的响声，在还没有能睁开沉重的眼皮时便被看护护士递上了满满一杯碎冰块（冰沙冰水不愧是美国传统）和一个勺子来吃，视线是如此地模糊以致于我还狠狠地咬了自己的舌头。再然后便是睁开眼睛，略带着睡意地回复着护士的问题。</p>
<p>我苏醒后很快便被从术后观察室退回了自己的病房。此时腹部还处于被充入气体胀大的状态，但让人惊讶的是我竟然可以随意地给自己点餐，不知是否是饿死鬼附体，我点了 scrambled egg 和 oatmeal 这两种事后查询时才知道并不“术后友好”的饭食，护士阿姨更是给我拿了相当多的医院特产蜂蜜消化饼来吃；狼吞虎咽吃完后才被告知准备当天下午即可出院，而
由于内心里对当天出院抱着怀疑的态度，我还是磨磨蹭蹭地到了下午 5 点左右才电话了我妻子来接我出院。</p>
<p>由于术后腹部要避免强烈震动，整个白天我都在和（过敏反应的）喷嚏做着激烈斗争，好在护士看出了我的窘境，直接送了我一个非常好用的咳嗽/喷嚏枕垫在腹部，这样打喷嚏时对腹部的震动就会降至最小了。而在记下了下面的医嘱之后，我便在妻子的陪同下在当天晚上 6 点顺利出院了：</p>
<ul>
<li>6 个星期内不能提超过 10 pounds 的重物</li>
<li>尽可能多走动来放置肠粘连、可以适当服用 Amazon 上即可买到的 Colace 药物来帮助，但如果在 3 天内还是没有排泄，则需要赶紧告知医生</li>
<li>持处方去附近的 CVS、Walgreens 等 Pharmacy 购买一种术后镇痛剂，用于缓解肚子胀大和手术伤口的痛楚</li>
</ul>
<p>回家后的两天我的精力都相当萎靡，白天非常嗜睡，基本上只能躺在沙发上看看 Netflix 喝喝粥，但是从第三天开始身体便渐渐恢复了行动能力，可以慢慢走动。经过了两周的休息后（头铁地）按计划去打了第二针新冠疫苗，并回医院做了复检。两周后，当“一切正常”的检查结果出来后，我才总算松了一口气：捡回了一条狗命！</p>
<div class="grid grid-cols-3 justify-center items-center self-stretch gap-3"><img alt="" loading="lazy" width="4032" height="3024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fa-cool-bed.ad03dab7.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fa-cool-bed.ad03dab7.jpg&amp;w=3840&amp;q=75"><img alt="" loading="lazy" width="4032" height="3024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fpost-surgery-menu.00c51db7.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fpost-surgery-menu.00c51db7.jpg&amp;w=3840&amp;q=75"><img alt="" loading="lazy" width="4032" height="3024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fpost-surgery-meal.a509f1f9.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fpost-surgery-meal.a509f1f9.jpg&amp;w=3840&amp;q=75"><img alt="" loading="lazy" width="4032" height="3024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fpost-surgey-crackers.b703b6a2.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fpost-surgey-crackers.b703b6a2.jpg&amp;w=3840&amp;q=75"><img alt="" loading="lazy" width="4032" height="3024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmy-bed.a8429e05.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmy-bed.a8429e05.jpg&amp;w=3840&amp;q=75"></div><p class="flex justify-center text-sm"><em>智能病床/术后菜单/术后大餐/护士赠送的 cracker/陪伴了我一天一夜的病房</em></p>
<h2>复盘 （写于术后 3 个月）</h2>
<p>手术几周后，我收到了医院和 UC 分别发来的账单，令人难以置信的是，手术费用竟然出乎意料地便宜 --- 这并非指
手术费用是白菜价，而是相比较在新闻上看到的动辄上万的美国医疗账单（甚至以前某朋友在 ER 高达 800 美元的烫伤包扎费用），我收到的账单费用可以说是相当亲民了：尤其是考虑到我还在查尔斯河畔优质的病房躺了一晚后。经过多方打探，原来是我公司投保的保险（Massachusets Blue Cross Blue Shield 下的一种）是最优质的一种保险，而众所周知地，美国医疗的账单会根据你是否有保险，以及保险的质量而动态变更，而优质的保险不仅需要被保人从腰包内掏出的钱少，甚至总金额也会更贴近实际价值而非夸张地成千上万；以此来看，Urgent Care 仅仅给我量了血压和心率的却收费高达上百的账单就显得非常夸张了。</p>
<div><img alt="" loading="lazy" width="4032" height="3024" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmy-worrying-cat.bfe1ad01.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmy-worrying-cat.bfe1ad01.jpg&amp;w=3840&amp;q=75"><p class="flex justify-center text-sm"><em>担心的小猫</em></p></div>
<p>收到账单后心中大石终于落下，我自己只需支付手术和住院费用的 $200 和 UC 门诊的 $250。图为术后恢复时家庭成员担心的眼神。</p>
<p>从身体状况的角度来复盘，在并发前一年的暴饮暴食可能为这次事件埋下了祸根，而近期一段时间的饮食和睡眠不规律则直接引发了身体的急性阑尾炎（多次询问医生后我基本排除了这是由 mRNA 接种新冠疫苗引起的免疫反应）。这也给我的身体敲响了警钟，回顾在手术室前的那几分钟，抬头望着刺眼的白色灯光，能想到的不是什么项目、工作、论文，而是家人和自己的身体；本文尽可能如实记录了这次就医和手术过程，但却没有办法完全将当时远在他乡的无助与病痛一起记录下来，只希望未来的我自己以此为戒，勤加锻炼，作息规律，照顾好身体这具唯一的渡世宝筏。</p>
<p><em>在此特别感谢我的妻子和父母在整个过程中对我的陪伴，帮助与照料</em></p>
<hr>
<ul>
<li>封面图片来自无版权图站 <a href="https://unsplash.com/photos/vGu08RYjO-s">Unsplash</a></li>
</ul>]]></content:encoded>
            <author>rexwangcc@gmail.com (Rex Wang)</author>
        </item>
        <item>
            <title><![CDATA[《Rework》 Reading notes | 《Rework 重来》读书笔记]]></title>
            <link>https://rexwang.cc/articles/2022-rework-reading-notes</link>
            <guid>https://rexwang.cc/articles/2022-rework-reading-notes</guid>
            <pubDate>Fri, 25 Nov 2022 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>必须承认，在比较忙的时间花额外的三个小时去读一本书是有些奢侈的，但是这本短小精悍的创业“导引”对这个时间点的我确实
有着非同寻常的意义；如果是一年前刚加入创业冒险的我，如果遇到这本书估计翻不了几页就会一脸嫌弃地直接丢掉，然而经历了那么多大大小小、磕磕绊绊的（有些甚至是早期创业公司才会独有的）问题现在读起来看却似乎字字珠玑。它像一本鸡血书，一边扇你巴掌却一边给你打营养液，让你恨不得就想把书拆成便签贴在墙上。</p>
<img alt="" loading="lazy" width="1920" height="1440" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fblaz-photo-zMRLZh40kms-unsplash.b9c1b298.jpg&amp;w=1920&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fblaz-photo-zMRLZh40kms-unsplash.b9c1b298.jpg&amp;w=3840&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fblaz-photo-zMRLZh40kms-unsplash.b9c1b298.jpg&amp;w=3840&amp;q=75">
<h2>背景</h2>
<ul>
<li>本书的作者的是 <a href="https://37signals.com">37Signals</a> 的创始人，这个公司规模较小，但是出了很多高盈利、高知名度的产品、技术框架，比如大名鼎鼎的 MVC 框架 Ruby On Rails。</li>
<li>公司创始人坦言，自己自豪的事情就是公司经历过两次经济衰退、一次经济泡沫破裂、数次商业模式转变，但过程中始终保持盈利。</li>
<li>本书作者迷恋小而美的组织，坚信小规模和实战经验、以及效率至上。</li>
<li>作者痛恨“互联网公司”这个标签，认为“互联网公司素来以疯狂招聘、大把烧钱、华丽落败广为人知，我们不一样，我们很小（16 人）、开支甚少、盈利颇丰”。</li>
<li>作者认为自己公司在“拒绝变大、唾弃会议、没有预算、踢开董事会、不用广告、远离销售和现实状况”之后还能成功的事实打脸了很多人，本书基本从这些经验给出“指导式的”分享，简单粗暴。</li>
<li>英文版很多用词生动形象。</li>
<li>基本每一页（正反面）都是一句指导、配合一些例子。</li>
</ul>
<p>从这些背景出发，不难想象，本书将会是从一个“小而美”公司的视角、以硅谷（虽然公司 HQ 在 Chicago）那种简单干练的 tech Geek、仇视华尔街盲目扩张的风气所阐述的一些公司经营、创业理念。在两个半小时的阅读过程中，这本书的很多<strong>虽然缺乏论据、但由于论点和论证过于直接而富有冲击力，进而使得可信度大大升级</strong>的所谓“经验”确实让我深度反思了过去一年中的在创业公司的冒险、探索和踩过的坑，可以说，有很多论点是只有你经历过才能感同深受且深以为然的，而这些论点通过精炼的单词或句子冲击给你，其实也不再需要额外地赘述论据了。</p>
<blockquote>
<p>本文有很多我个人从书中而来的摘抄笔记，如果有版权争议，还望告知，我会及时采取措施</p>
</blockquote>
<hr>
<div class="justify-center flex"><p class="italic">读书笔记由此开始</p></div>
<hr>
<h2>Takedowns | 卸负</h2>
<h3>Ignore the real world 忘了“现实世界”</h3>
<ul>
<li>“这在现实世界中完全行不通。”当你向人们介绍一个新创意时，人们总是这么说。</li>
<li>这个“现实世界”听起来如此令人沮丧，貌似所有的新创意、新提案以及外来概念总是会在“现实世界”中碰壁。在这里，能够立于不败之地的都是那些人们耳熟能详、习以为常的事物，即使这些东西已经漏洞百出或陈腐低效。</li>
<li>撕开这个“现实世界”的遮羞布后，你会发现栖居其中的人们都充满着悲观和绝望的情绪。</li>
</ul>
<h3>Failure is not a rite of passage 哪来的从错误中学习</h3>
<ul>
<li>相比之下，你更应该从成功中汲取养分。成功才是真正靠得住的教材。</li>
<li>一份来自哈佛商学院的研究报告表明，那些已经成功的企业家们再创辉煌的可能性远比常人大得多（他们今后创办公司的成功率为34%）。</li>
<li>成功是一种极具现实价值的宝贵经验。</li>
</ul>
<h3>Planning is guessing 计划即瞎猜</h3>
<ul>
<li>你不能掌控的因素太多了：市场环境、竞争对手、客户群体、经济状况，等等。撰写计划会让人感觉自己把握住了某些东西，但实际上这都是完全不可控的。</li>
<li>现在我们就开始把你的商业计划称为“商业猜想”，把财务计划叫做“财务猜想”，把战略计划命名为“战略猜想”。现在咱们就可以不用为这些玩意儿操那么多心了。在这方面操心只能是得不偿失。</li>
<li>你必须能够即兴发挥，你必须抓住每一个迎面而来的机遇。有时候你得说服自己：“我们要换个新方向了，因为现在这么做比较靠谱。”</li>
<li>大多数情况下，人们不会再去多看一眼自己长篇大论写下的计划，篇幅庞大的计划书最终都会成为文件柜里的化石。</li>
<li>无计划地工作看上去挺悬，但是盲目遵循不切实际的计划，后果则更可怕。</li>
</ul>
<h3>Why grow? 何必壮大？</h3>
<ul>
<li>人们往往会问：“你的公司有多大？”话题虽小，可人们期待的答案却不是越小越好。</li>
<li>为什么会这样？与企业成长和业务有何关联？为什么人们总把扩张当做奋斗目标？除了满足虚荣心外，“大”还有什么好处？（你最好能给我一个比“规模经济”更好的答案。）选择并保持合适的规模又有何不妥？</li>
<li>小公司并不只是一块跳板。小公司本身就是一个伟大的目标。</li>
<li>你有没有发现小公司都想要变大，而大公司却梦想变得更敏捷、更灵活？记住，一旦公司做大了，要想再缩小，就在所难免地要进行裁员、打击士气，还要完全改变业务模式。</li>
<li>无论是谁，只要他所运营的公司能够持续发展、保持盈利，不管规模大小，都是值得骄傲的。</li>
</ul>
<h3>Work... 工作狂</h3>
<ul>
<li>沉迷工作是企业文化中广受赞颂的一种“优良做派”。</li>
<li>过多的工作并不代表你对项目更关注，也不代表你作了更多贡献，这仅仅意味着你干了更多活而已。</li>
<li>他们花费大把时间去解决问题，他们以为能靠蛮力来弥补思维上的惰性，其结果就是折腾出一堆粗略无用的解决方案。</li>
<li>工作狂的存在使那些不以加班为乐的员工感到无所适从。</li>
<li>工作狂不是英雄。他们没有力挽狂澜，不过是浪费时间而已。真正的英雄早已想出办法、搞定一切，然后回家了。</li>
</ul>
<h3>Be a starter! 受够了“企业家”</h3>
<ul>
<li>不要再叫别人企业家了，管他们叫创始人吧。每个创立了自己事业的人都是创始人。</li>
</ul>
<h2>Go | 行动</h2>
<h3>Scratch your own itch 挠自己的痒处</h3>
<ul>
<li>想要创造一个伟大的产品或某项卓越的服务，最简单直接的办法就是做你自己想用的东西。设计你了解的产品——你就能很快发现它到底好不好用。</li>
<li>一旦发明一种产品或服务，你每天就得为上百个微不足道的决策去劳神费力。如果是帮别人解决问题，就会像瞎子一样在黑暗中不断摸索。但如果你解决的是自己的问题，希望之光就出现了。你非常清楚怎样做才是正确的。</li>
<li>詹姆斯·戴森（James Dyson）就是一位自产自销的发明家。当他打扫房间时，发现袋式真空吸尘器总是失灵——灰尘总把袋子里的气孔堵塞，阻断气流。这不是随便什么人凭空想象出来的问题，恰恰就是他本人的亲身经历。为了解决自己的问题，世界上第一个免纸袋涡卷式真空吸尘器诞生了。</li>
<li>田径教练比尔·鲍尔曼（Bill Bowerman）认为他的队员需要更好、更轻的跑鞋。于是他走出训练场，在工作室里尝试着往家用蛋奶烘饼模具里注入橡胶，于是耐克最著名的铁模鞋底便应运而生了。</li>
<li>这种“解决自己实际问题”的方法最大的优势就在于能让你爱上自己的产品。你十分了解其中存在的问题以及其价值所在。除此之外别无他途。毕竟你（很有可能）会为这件事奋斗很多年，甚至付出余生，所以，最好还是做自己真正关心的东西。</li>
</ul>
<h3>Start 着手做点什么</h3>
<ul>
<li>斯坦利·库布里克（Stanley Kubrick）曾经这样激励电影制片人：“找个摄像机和一些胶片吧，随便拍个什么样的片子出来都成。”([7])库布里克明白，当你刚开始一项工作时，你必须开始创造自己的东西。最重要的事情就是起而行之。所以，拿起摄像机，灌张唱片，开始拍摄吧。</li>
<li>创意这玩意，价廉物美，应有尽有。最开始的鼓槌音高的创意也不过是业务中几乎可以被忽视的极小一部分。真正的问题在于你执行的好坏。</li>
</ul>
<h3>Time is not an excuse “没时间”不是借口</h3>
<ul>
<li>人们最常用的借口就是：“时间不够。”他们声称自己非常想开一家公司、学习一种乐器、推广一项发明、写一本书，等等，但就是没有时间去做。</li>
<li>拜托，只要你善加利用，时间总是有的</li>
<li>如果你总是为找不到完美的时刻而困扰，那么，完美的时机永远不会出现。</li>
</ul>
<h3>Drawing a line in the sand 画沙为界，立场明确</h3>
<ul>
<li>起步之后，你必须一直牢记自己到底为什么要做这件事。</li>
<li>有主见方能成大事，创业并不只是一个产品或一项服务那么简单。你必须心怀信念，要有主心骨，要了解自己到底是为什么而奋斗，并且要让世人明白你的信念。</li>
<li>强大的主见也是要付出代价的。在这个过程中你得解雇某些人，他们会诋毁你，说你傲慢、冷漠。没办法，这就是人生，有人喜欢你，就会有人憎恨你。如果你的说法没有引起任何人的心烦意乱，只能说明你的推广力度可能不够。（也可能代表你比较无趣。）</li>
<li>很多人讨厌我们，因为我们的产品功能不像竞争对手那么多。因为我们拒绝在软件中添加他们宠之有加的特色功能，而让这些人恼羞成怒。然而，对于我们来说，我们的产品所不能处理的和我们的产品所能处理的一样令人感到骄傲。</li>
<li>我们追求简洁的设计，因为大多数软件都过于复杂：太多特性、太多按钮、太多困惑。我们要做与之不同的软件。如果我们的产品不适合于每一个人，没有关系，我们愿意为了那些更加深爱我们产品的客户而放弃另一部分客户。这就是我们的立场。</li>
<li>例如，全食超市（Whole Foods）坚持向顾客销售最优质、最天然的有机食品。他们绝不会浪费时间去一遍遍地讨论该如何决策。没有人会问：“我们能卖些带人造香料的产品吗？”毋庸置疑，答案非常明确。这就是为什么人们在这家公司买不到可口可乐或士力架的原因。</li>
<li>这种信念就意味着全食超市出售的食物更昂贵。</li>
<li>另一个例子是坐落在芝加哥街头的维尼夹馅面包店（Vinnie's Sub Shop），就在我们公司楼下。他们在优质的面包（一种类似于赛百味的夹馅面包）上涂抹自制的罗勒酱，然后出售。想要吃他家的面包，你最好早点儿去。想知道他们啥时候关门？柜台里的女士会告诉你：“面包卖完了我们就收工。”</li>
<li>真的吗？“没错！我们都是一大早从街边的面包房进货，拿最新鲜的面包回来做原料。这批面包一卖光（通常是下午2～3点左右），我们就关门。我们当然也可以再去进一批面包回来接着做生意。但这批面包就不如早上的新鲜了。如果面包不新鲜，就做不出绝味的三明治。如果不能卖让我们倍儿有面子的食物，那赚再多钱又有什么意思呢？”</li>
</ul>
<h3>Live it or leave it 不可能的宗旨</h3>
<ul>
<li>在“真正坚定立场”和“在宣言书中声称自己秉持某种立场”之间，是有天壤之别的。
这就好像是当你打电话到一家公司时，接线的是一个语音应答机，不断地在电话那头告诉你他们公司如何如何重视客户。果真如此？那就多雇些技术支持人员好了，不要让人在电话边苦等30分钟后才获得帮助。
或者一言不发也行，就是别拿一个自动语音应答机来糊弄我，说你们有多关心我。那不过是个机器人而已。一种是真情实意，另一种是被设定成只说好话的机器人，我非常清楚这其中的差别。</li>
</ul>
<h3>Plan $ 万不得已不筹资</h3>
<ul>
<li>事实上，不管你创办的是什么类型的企业，都要尽可能少花别人的钱。花别人的钱听起来很美，实际上是你落入了圈套。理由如下：<!-- -->
<ul>
<li>失去控制权。</li>
<li>“套现离场”的想法会压倒“创建优秀公司”的梦想。投资人想拿回他们的钱——越快越好（通常是3～5年）。</li>
<li>用别人的钱容易上瘾。再没有比花别人的钱更痛快的事情了。但是等你花光了再去要时，每去一次，他们就会从你手中多拿走一些股份。</li>
<li>融资都不是好买卖。当你刚刚起步时，在谈判中完全没有优势。在财务交易中往往举步维艰。</li>
<li>客户不再荣登“图腾柱”。花别人的钱，会使你的事业最终去迎合投资人，而不是客户。</li>
<li>筹钱极其费神。融资是一件困难重重、耗费精力的事情。得花费数月时间开会讨论、研究法律、签订合同，等等。这些烦琐的事情会浪费你大量的精力，而这些时间本来就应该被用于创建伟大的事业。</li>
</ul>
</li>
</ul>
<h3>Do you really need it? 你的需求没有想象的那么多</h3>
<ul>
<li>你真的需要雇10个人吗，还是先雇2～3个应付当前局面就可以了？</li>
<li>你真的需要50万美元吗，还是目前只要5万或5000就够了？</li>
<li>你真的需要花6个月时间吗，还是可以同时进行两件事情？</li>
<li>你真的需要一间大办公室吗，还是可以暂时和别人共用一间办公室或在家办公？</li>
<li>你真的需要一个仓库吗，还是可以租一个小的存储室（也可以利用你的车库或地下室）或是把这部分工作完全外包？</li>
<li>你真的需要投放广告或聘请公关公司吗，有没有其他方法进行推广？</li>
<li>你真的需要建一个工厂吗，还是可以让其他人来生产你的产品？</li>
<li>你真的需要会计吗，还是可以自己用Quicken软件记账？</li>
<li>你真的需要IT部门吗，还是可以把这部分工作外包？</li>
<li>你真的需要招一个全职的技术支持人员吗，还是你可以亲力亲为？</li>
<li>节俭不是罪过。当我们推出第一个产品时，是非常节省的。我们没有自己的办公室，得和其他公司共用办公空间。我们没有一堆服务器，只有一台。我们没有做广告，只是通过网上经验分享来传播。我们没有雇专人来回复客户邮件，公司的创始人亲自答复客户邮件。一切都运作良好。</li>
</ul>
<h3>Startup 要成就事业，不能只是创业</h3>
<ul>
<li>啊，创业了！有这样一种公司，他们在启动的时候往往备受瞩目（尤其是在科技领域）。</li>
<li>创业是一块神奇的地域，创业的时候，花钱是别人的事情，令人烦恼的收入问题也不会在此时来败兴。你可以在初创时期一直花别人的钱，直到你找到自己的盈利之路。此处不讲求经营法则。</li>
<li>这个神奇之地的问题在于，它是个神话。而真相是业务不论新老，都是由相同的市场力量和经济规则所主导。人们得创造收入、承担花销，公司要么盈利，要么倒闭。</li>
<li>任何人如果在创业初期抱着“我们以后会想到办法赚钱”的态度，他们的创业终将成为笑谈。这就好像在开始制造太空船时，自欺欺人地说“让我们假设地心引力不存在”一样可笑。无法通往盈利之路的事业不能称为事业，只是嗜好。</li>
<li>一开始就要去做真正的事业，这样才能大大提高成功率。</li>
</ul>
<h3>You need a commitment strategy not an exit strategy  破釜沉舟</h3>
<ul>
<li>你需要的是承诺策略，而不是退出策略。你应该考虑的是如何把项目做起来，而不是如何跳船逃生。如果你的整个策略都是建立在逃跑的基础上，那么你一开始就不会走得太远。</li>
<li>假设你不接受我们的这些建议，就是要去做这么一个跳板。你创立了自己的公司，然后把它卖掉了，你拿到了一大笔钱，接下来怎么办？移居到一个小岛上整天喝着朗姆酒度日？你真的会满足于这样的生活吗？你确定你更喜欢这样过日子，而不是去经营一家你真正喜爱并信赖的企业？</li>
<li>正是由于这样的原因，我们常常听说有些老板卖掉了自己的公司，退休六个月后，又重返市场继续战斗。他们怀念那些已经失去的东西。而且，他们再次创办的企业，往往都不如第一次创办的好。</li>
</ul>
<h3>轻装上阵</h3>
<ul>
<li>一定要轻装上阵。此时，你正处于最小巧、最轻松、跑得最快的阶段。从现在开始，你会在接下来的旅程中背上种种负累。一个物体越大，想要改变它的运行轨迹就越费劲。物理世界中的规则在商业世界中同样适用。</li>
<li>负担来自于……</li>
<li>·长期合约</li>
<li>·人员过剩</li>
<li>·永久性的决定</li>
<li>·会议</li>
<li>·繁琐的流程</li>
<li>·资产（物理上和精神上的兼而有之）</li>
<li>·被硬件、软件和技术“套牢”</li>
<li>·长期路线图</li>
<li>·办公室政治</li>
<li>航母级的公司想要作出改变，得花上很多年的时间。他们说得多、做得少；会议多、实干少。但如果你始终保持轻装上阵，就能快速作出改变：包括你的整个业务模式、产品、特性设置以及/或者营销手段。一旦出错，都能够很快修正。还能随需改变优先级、产品组合或关注点。最重要的是，你可以随时改变主意。
Progress | 进阶
Less is a good thing 条件受限是好事</li>
<li>“我没有足够的时间/钱/人手/经验。”不要再做无谓的抱怨了，“少”不是什么坏事。“条件受限”貌似缺陷，实为优势。有限的资源能激发你在现有条件下完成任务的能力。没有一点浪费的空间，一切都需要你发挥最大的创造力。
当我们开发Basecamp软件时，也面临重重限制。我们让一家设计公司来为现有的客户服务，产品的主要负责人和我们有7个小时的时差（戴维在丹麦做编程工作，其余的人都在美国），我们的团队规模很小，没有外部投资。这些限制让我们必须力保产品的简洁性。
如今，公司的资源和员工人数都有了增长，但是我们仍然主动作出限制。每个产品同时只能有1～2个人去设计。我们还尽量精简产品特性。这样的自我打压能防止我们生产出臃肿的产品来。</li>
</ul>
<h3>You are better off with a kick-ass half than a half-assed whole 与其做个半成品，不如做好半个产品</h3>
<ul>
<li>同时做N件事情的结果就是：一大把绝妙的点子最后被转化成一个蹩脚的产品。</li>
<li>人不可能同时做所有的事情，并把事情做好。你的时间、资源、精力、注意力都是有限的。一次做好一件事就已经不容易了。想一次做十件事？拉倒吧！</li>
<li>有舍才有得，砍掉多余的野心，你就会发现慢慢做一件正事要胜过毛毛躁躁做一堆傻事。</li>
<li>毕竟，在有远见的人看来，大多数令人引以为傲的点子，其实都没有那么伟大。再说了，如果这些点子真的很不错，以后再下手也不迟。</li>
</ul>
<h3>Start from core 从核心出发</h3>
<ul>
<li>当你开始着手做一件事情时，总有一些力量将你拉向不同的方向。这当中包括你能做的、你想做的以及你必须做的事情。你应该从必须做的事情开始下手，即从核心出发。</li>
<li>例如，如果你想开家热狗摊，你可能要考虑调味品、售货车、名称、装饰，等等。但是最应该关注的是热狗。热狗就是中心，其他事情都退而次之。</li>
<li>寻找中心的方法就是问自己：“如果把这样东西去掉了，我还做得成买卖吗？”你可以不要洋葱、不要调味品、不要芥末……但一家热狗摊肯定不能是一家没有热狗的摊子。也许有人不喜欢你这种没有浇料的热狗，但你仍然是个卖热狗的。而没有了热狗，你连卖热狗的都不是。</li>
<li>所以，要判断出你的事业的中心。在你的创业等式中，哪个部分是绝对不能被拿掉的？</li>
</ul>
<h3>不要过早关注细节</h3>
<ul>
<li>细节会导致差异，但过早纠结于细节则会引来异议、多如牛毛的会议以及延期。</li>
<li>当开始设计规划时，我们会用大号粗体白板笔——而不是圆珠笔——把想法大致描绘下来。为什么呢？圆珠笔太完美了，分辨率太高了，会让你不自觉地去关注那些还不需要关注的东西，比如如何美化底纹、是用虚线还是用实线，等等。结果让你把注意力放在次要的事情上了。</li>
<li>用白板笔可不能进行这种深入的描绘。你只能用它来画形状、线条、方框。这就够了。你在起步阶段要操心的就是综观全局。</li>
<li>此外，你只有在真正开始后，才能认清到底哪些细节才是最重要的。到那时你才能看清哪些方面需要多花些时间。缺什么补什么，不要操之过急。</li>
</ul>
<h3>Decisions are progress 作出决定就是取得进展</h3>
<ul>
<li>当你推迟决定时，事情就会堆积起来，最后落到被遗忘、被草草处理或是被抛开的下场。结果，这堆问题仍然没有一个得到解决。</li>
<li>你要让自己进入“选择”进行曲中，当你进入状态，开始一个接一个地作出决定时，就为自己的事业注入了动力、鼓舞了士气。决定就是进步。你作的每一个决定都构成了伟大事业的基础。事业不是建立在“回头再说”之上，而是建立在“搞定”之上的。</li>
<li>一旦为了等待完美答案而推迟决定，问题就会接踵而来。而那个完美答案却迟迟没有出现。今天作决定或明天作决定，结果没有什么不同。</li>
<li>做多少计划不重要，人总是难免犯错。不要因为事前的过度分析和犹豫不决而把事情搞砸。</li>
<li>项目周期过长会打击士气。项目开发时间越长，成功的可能性越小。只要有足够的动力和士气，就要趁热打铁，积极决策，果断推进，现在就把事情做出来。</li>
</ul>
<h3>当好博物馆长</h3>
<ul>
<li>一个伟大的博物馆，不必在一间房子里挂满全世界的艺术品，那不是博物馆，是仓库。真正成就一个伟大博物馆的，是那些不在墙上展出的物品。要是有人不认同，这就涉及要请博物馆长出面，清醒地决定哪些东西该留下，哪些东西该放弃。这是一个取舍的过程。</li>
<li>真正有意义的是那些挂在墙上的东西。因此你需要不断地审视它们，随时取走一部分、简化一部分、使之合理化。要做一个称职的博物馆长，坚守真正重要的东西。把其他东西拿下来，直到留下最重要的作品。然后再来一次。以后有需要时，你还是能把拿下来的东西放回去的。</li>
</ul>
<h3>在问题上少投入点精力</h3>
<ul>
<li>拜读一下厨师戈登·拉姆齐（Gordon Ramsay）的《厨房噩梦》，你就会发现一个模式：在失败餐馆的菜单上，菜品总是太多。餐馆老板认为做尽天下名菜就能提升餐厅的美誉度，然而上天总是报之以蹩脚的菜品（并带来让人头疼的库存）。</li>
<li>当遇到困难时，人们的本能反应都是加大投入：增加人手、延长时间、加大投资，这一切做法只是使问题变得越大。正确的方法应该是反其道而行之：削减。</li>
<li>所以，少做一点，你的项目遭受的损失不像你想象的那么大。</li>
<li>事实上，这是一个使情况好转的绝佳机会。你要被迫使出雷霆手段，筛选出真正有价值的东西来。</li>
<li>如果你不断推迟最后期限、提高预算，你就会在这条错误的道路上一直走下去。</li>
</ul>
<h3>Focus on what won't change 关注不变因素</h3>
<ul>
<li>很多公司都关注即将到来的大事件。它们热衷于新鲜热辣的事物，追逐最新的潮流和技术。</li>
<li>这是一条愚人之路。一旦踏上这条路，你就会关注时髦、放弃本质；把注意力放在不断变化的事物上，而不是持久的事物上。</li>
<li>对于37signals来说，像速度、简洁性、易用性以及清晰度都是我们关注的焦点。这是我们无止境的追求。10年后，不会有人突然醒悟过来，说：“哥们，我觉得软件还是难用一点儿好。”也没人会说：“我希望我的应用程序跑慢一点儿。”</li>
<li>要记住，时尚会凋零。</li>
</ul>
<h3>Gear doesn't matter 音乐就在你的指尖流淌</h3>
<ul>
<li>人们总忍不住要执著于工具，而不关注要用这些工具去做的事情。你见过这类人：能玩转一大堆震撼的艺术字体和漂亮的Photoshop滤镜效果的设计师，却不知道该表达什么。业余摄影爱好者总为使用胶片相机还是数码相机而争论不休，却没人关注拍出绝妙的照片的决定因素是什么。</li>
<li>在商业领域，太多人纠结于工具的好坏、软件技巧、规模大小、舒适的办公环境、豪华的家具以及其他浮华的东西，而不去关注真正的要点。真正的要点就是怎样赢得客户、如何赢利。</li>
</ul>
<h3>You can't make just one thing  卖掉副产品</h3>
<ul>
<li>当你去做某件事时，总会同时做出其他的东西来。你不会只做一样东西。副产品无处不在。一个善于观察、富于创意的商业头脑能够注意到这些副产品，并从中挖掘出商机。</li>
<li>我们的上一本书《实打实干》（Getting Real），就是一个副产品。我们是在不知不觉中写成这本书的。对于创办公司和开发软件这项实际工作来说，从中获取的经验就是副产品。我们把这些知识打包起来，首先是贴在博客上，其次集结成一个工作室系列，然后做成PDF文档，最后印刷成书。这个副产品为37signals赚取了超过100万美元的直接利润，后来又赚取了超过100万美元的间接利润。你现在正在阅读的这本书，也是一个副产品。</li>
</ul>
<h3>Get it out there! 立马就上线</h3>
<ul>
<li>你的产品或服务什么时候能做出来？你打算什么时候把它推向市场？什么时候能让人们拥有它？可能比你想象的要早得多。一旦你的产品实现了基本的功能，就要迅速把它亮出来。</li>
<li>这样做只是因为，也许你的产品有很多需要改进的地方，但不代表它不能使用。不要因为一些遗留问题而把整个产品扣留下来。那些遗留的问题可以等事后再解决，往后放一放也可能意味着能找到更好的解决办法。</li>
<li>为了迅速上线，要砍掉一切不必要的东西。现在就把必要的部分做出来，以后再去考虑花哨的部分。如果你真的这么想了，你就能找出一大堆无须在第一天上线时就完成的东西。</li>
<li>当我们推出Basecamp软件时，连收费功能都没有完成！因为这个产品是按月收费的，我们明白还有30天的空档期可以用来完成这项功能，于是我们把宝贵的时间用于解决更紧迫的、上线当天就得解决的问题。而30天后才需要用到的功能，可以再等等。</li>
<li>不要误解，这种做法不是偷工减料。你要做的仍然是件很棒的东西。这个做法只是告诉你，最有效的成功方法就是不断尝试。不要再臆测到底会发生什么事了，到现实中去寻找答案吧。</li>
</ul>
<h2>Productivity | 效率</h2>
<h3>Get real! 赞同的错觉</h3>
<ul>
<li>商业世界中充斥着各种无用的文件，这些文件除了浪费人们的时间外，一点意义也没有。没有人读的报告、没有人看的图表、无法完成的细则。这些东西做起来颇费工夫，但是人们一回头就能把它给忘了。</li>
<li>抽象事物（比如报告和文件）会给人造成认知错觉。让100个人读同一段话时，他们的脑子里会想象出100种不同的意思。</li>
<li>当阿拉斯加航空公司的设计团队在策划未来要筹建的新机场时，他们并没有依靠蓝图和草图，而是在一个仓库里建了个实体模型，用厚纸箱做成围墙、机楼、跑道。然后，这个团队在安克雷奇市建了一个小型的机场原型，开始雇用职员、接待乘客，以此来测试系统的性能。这种在现实中进行测试的设计理念大大减少了项目投产的等待时间，提高了公司的生产力。</li>
</ul>
<h3>退出的理由</h3>
<ul>
<li>一头扎进去，埋头干你自己认为应该干的事情，这很简单。而要从中抬起头来问问自己为什么要这么做，则难得多。你需要问自己几个重要的问题，以确定你是否在做真正有意义的事情：<!-- -->
<ul>
<li>为什么要这么做？有没有发现自己正在做一些完全不知道为什么去做的工作？只是因为有人叫你去做。</li>
<li>你在解决什么问题？当前的问题是什么？客户感到困扰了吗？你感到困扰了吗？有什么不太清楚的地方吗？是不是有些东西过去是做不了的，但现在应该得做了？</li>
<li>这真的有用吗？</li>
<li>你加上去的东西有价值吗？画蛇添足很容易；画龙点睛却很难。</li>
<li>这种改变真的会起作用吗？</li>
<li>这种方法更简单吗？</li>
<li>有其他更值得做的事情吗？</li>
<li>这样做值吗？你现在正在做的事情是否真的值得去做？这次会议值得让6个人牺牲1小时的工作时间来参加吗？这项任务值得我们今天为之熬夜吗？还是可以留到明天早上再来处理？有必要为了竞争对手的一次公开发布而让整个团队压力倍增吗？</li>
</ul>
</li>
<li>以上列出的问题，你得不停地问自己（以及其他团队成员）。当然没必要把这列为常规流程，但是也别把这些问题搁置不理。</li>
<li>同样，要勇于亮出你的结论。有时候放弃其实是一步好棋，即使你已经为之投入很多努力，也不要继续把大好的时间浪费在不值得做的事情上。</li>
</ul>
<h3>打岔是效率的敌人</h3>
<ul>
<li>如果你总是为了工作而熬夜或者牺牲周末时光，其实并不是因为你有很多工作要做，而是因为你的工作状态不佳。而工作状态不佳就是由打岔引起的。</li>
<li>仔细想想：你大部分的工作是什么时候完成的？如果你和大多数人一样，选的是夜里或凌晨，那就绝不是巧合，这些时段通常都是身边没人的时候。</li>
<li>你应该达到一种旁若无人的境界。长时间的单独工作能使你达到最高效率。当你不再为了不同的任务去切换思维时，你能干完一整车活儿。（有没有注意过自己在飞机上那种零打扰、无网络的状态下能达到怎样的工作效率？）</li>
<li>当然，你不必非得在凌晨去享受这种灵感迸发、精神高度集中的独立境界。你可以在工作中定下规矩，比如上午十点到下午两点间，任何人不得串岗闲聊（午餐时间例外）。也可以把整个上午或整个下午设成你自己的独立时段。或者把“休闲星期五”改成“噤声星期三”，你要做的就是保证这个工作时段完全不受打扰，确保彻底消灭以任何借口扼杀生产力的打岔。</li>
<li>就这样一直下去，一个成功的独立时段意味着戒掉八卦瘾。在这个时段内，封锁即时聊天工具、挂掉电话、关闭邮箱、叫停会议。唯一能做的就是闭嘴、干活。你会惊讶于自己居然能干这么多活。</li>
<li>你的生活被各种干扰包围着，只有你自己才能去发起反击。</li>
</ul>
<h3>会议有毒</h3>
<ul>
<li>世界上最可恨的打扰莫过于开会。原因如下：</li>
<li>·会议中充斥着纸上谈兵和抽象的概念，多是不切实际的。</li>
<li>·会议中能够传达的信息量少之又少。</li>
<li>·人们在会上最容易跑题，比暴风雪中的芝加哥出租车还容易迷失方向。</li>
<li>·会议要求人们作好充分准备，但大多数人根本没时间准备这些。</li>
<li>·会上制订的日程常常模棱两可，根本就没有人真正了解目标是什么。</li>
<li>·会议中总难免轮到那么一个低能人士发言，于是大家的时间都被浪费在他们的扯淡上。</li>
<li>·会议具有自我繁殖功能。一次会议总能引出下一次会议，以及再下一次的会议，并生生不息……</li>
<li>如果一场会议只需要花7分钟就能达到目的，那就只花7分钟去开会得了。不要把7分钟硬拉成30分钟。</li>
<li>如果你觉得你们“必须”聚在一起讨论些事情，那么请坚持以下几条简单的原则，让会议变得更有效率：</li>
<li>·放一个闹钟，当闹钟响起时，会议结束。散会！</li>
<li>·与会人员尽量精简。</li>
<li>·议程尽量明晰。</li>
<li>·从明确的问题开始讨论。</li>
<li>·不要去会议室，就在出现问题的地点开会，直面现实，提出切合实际的改进建议。</li>
<li>·以明确的解决方案结束会议，并安排好由谁负责实施。</li>
</ul>
<h3>Good enough is fine 刚刚好就是真的好</h3>
<ul>
<li>很多人沉迷于用复杂的方法去解决问题。人们常常陶醉于做脑力体操，然后就会开始寻找下一个让你心驰神往的大挑战，不管这是不是个好主意。</li>
<li>更好的做法是：找一个四两拨千斤的解决方案，以最小的投入获得最大的产出。</li>
<li>我们总能用简单平常的方法去解决问题。</li>
<li>当找到合适的解决办法后，就用它了。总比浪费资源、甚至因为无法承担复杂的解决方案而在那干等要强。记住，以后你随时都可以把“刚刚好”变成“特别棒”。</li>
</ul>
<h3>Quick wins 速战速决</h3>
<ul>
<li>积累动力的方法就是完成一项任务，然后紧接着去完成下一项任务。没人愿意被困在一个看不到尽头的任务中。把人困在长达9个月并且毫无成就的项目中，等于是拿钝刀子杀人，迟早会耗尽你全部精力。想要保持良好的势头和持续的动力，就要养成“积跬步以致千里”的习惯。哪怕是微小的进步也能让你士气大振。</li>
<li>有些东西拖得越久，越难完成。</li>
<li>激情来自于做出东西来让人使用。</li>
<li>现在问问自己：“我们在两周内能做点什么？”然后就去做吧。做出来就拿给人们去使用、去尝试、去把玩……随便怎样都好。客户越快拿到新产品，你的事业就越稳定。</li>
</ul>
<h3>Don't be hero 不要逞英雄</h3>
<ul>
<li>很多时候，知难而退比逞英雄实在。</li>
<li>要谨记：最明显的解决方案有可能就是适时退出。</li>
</ul>
<h3>Go to sleep 该睡觉时就睡觉</h3>
<ul>
<li>废寝忘食可不是什么好主意。没错，熬夜确实能立马挤出不少时间，但是以后你得为此付出沉痛的代价：你的创造力、士气和心态都将遭到毁灭性的打击。</li>
<li>如果长期熬夜，你付出的代价就会不断攀升：<!-- -->
<ul>
<li>顽固不化</li>
<li>缺乏创意</li>
<li>士气低落</li>
<li>情绪失控</li>
</ul>
</li>
</ul>
<h3>Your estimations suck 预估的都是垃圾</h3>
<ul>
<li>我们都是蹩脚的估算师。我们自以为能预测一项任务会耗时多久，但实际上我们一无所知。</li>
<li>所以，提前几周、几个月甚至几年就去预测未来，简直就是在说梦话。事实是，你根本不知道那么远的将来会发生什么。</li>
<li>还有，我们在估计项目时间时，错的不是一星半点——而是大错特错。这意味着如果你预计要花6个月时间，你可能已经谬以千里了：我们要说的不是从6个月拖到7个月，而是从6个月拖成1年。</li>
<li>正是由于这个原因，美国波士顿“大开挖”高速公路工程比原先预想的多花了5年时间，超支数十亿美元；而丹佛国际机场延迟了16个月才开张，成本超支20亿美元。</li>
<li>解决方案就是：把大项目分解成小任务。越小的任务越容易预计。你可能还是会犯错，但错得肯定不会像预测大项目那么离谱。如果某个任务所用的时间比预计的长两倍，那么最好把它从长达数月的大项目拆解成耗时几周的小项目。</li>
<li>不断地把你的计时范围拆分成小块，把一个长达12周的项目重整成12个耗时1周的小项目。不要妄自揣测某个任务大概需要30个小时以上的时间来完成，直接把它砍成几个大约6～10小时的小任务。然后一步一个脚印地努力前进。</li>
</ul>
<h3>Long list don't get done 罗列问题，不得解决</h3>
<ul>
<li>列一个更小的待办事务清单。长篇大论的清单只能徒惹尘埃。</li>
<li>长篇任务清单会将你带上愧疚之旅。</li>
<li>我们有一个更好的办法。把长串的清单分解成一堆小任务列表。例如，把一个列了100个项目的大清单分解成10份清单，每份清单上面列出10个项目。</li>
<li>在此我们对事务的优先级别也有个小小的建议：不要按照序号或标签来排序。</li>
<li>相反，要把看起来最重要的事情放在清单的上端。然后把第二重要的事情放在清单中挨着上端的位置。这样一来，你就能够按照事情的轻重缓急来进行排序，这样就足够了。</li>
</ul>
<h3>Make tiny not big decisions 决策宜小不宜大</h3>
<ul>
<li>重大决策很难落实，也很难修正。一旦作出重大决策，你倾向于认为自己的选择是对的，即使错了，你也无法对其作出客观判断。</li>
<li>一旦自负和骄傲占了上风，不撞南墙你就回不了头。挣面子的念头压倒了走正道的念头。然后就会产生惯性：你朝一个方向使的劲儿越大，就越难改变方向。</li>
<li>作小决策并不代表要和远大计划、宏伟梦想绝缘。</li>
<li>极地探险家本·桑德斯（Ben Saunders）说起他独自前往北极探险的时候（相当于在72天的时间里连续进行了31次马拉松式的行进），感到“重大决策”总是令人不寒而栗，于是他每天都只作出一个“向前方的冰面再行进几十英尺”的小决定，很少再去作比这更大的决定。</li>
<li>易于实现的目标就是最好的目标。你能真正完成这些任务并有所建树</li>
</ul>
<h2>Competitors | 对手</h2>
<h3>拒绝照搬</h3>
<ul>
<li>有时候，照猫画虎也是一种学习的过程, 不幸的是，商业战场上的模仿却不招人待见。</li>
<li>然而，这是一个失败定式。这样做的问题在于，简单复制扼杀了深层的理解——而理解才能激发成长。你不但要知其然，还要知其所以然。当你复制、粘贴时，就会忽视这一点。你照搬的只是表面现象，而不是其深层的本质。</li>
<li>原创者为其作品付出的很多努力是外人看不到的。这些都隐藏在表面之下。盲从者是不知其所以然的。复制只是表面上完成了任务，但是这样做无法触及事物的本质，产生不了深层理解，也成就不了未来决策的基础。</li>
<li>怎样判断自己是否在盲目模仿别人？如果同一种产品，别人已经完成了绝大部分的工作，那你就是在模仿。你可以受别人影响，但不要去剽窃。</li>
</ul>
<h3>Put yourself into your product 将你的产品去商品化</h3>
<ul>
<li>一旦你扬名立万，模仿者便会蜂拥而上，这就是生活。但是你可以用一种绝佳的方法来保护自己不被盲从者们吞没：让你自己成为你的产品或服务的一部分。将你独一无二的想法注入你的产品中，让它与众不同。把它变成一件别人做不到的东西。</li>
<li>在Zappos，客服员工从不使用规范化的应答语言，他们可以和客户长时间唠嗑。</li>
<li>在你的特点融入你的产品以及和你的产品有关的一切事物当中去：你的销售方式、支持模式、说明方式、递送方式。竞争者们是无法复制你的产品中的独特性的。</li>
</ul>
<h3>Pick a fight 向对手挑战</h3>
<ul>
<li>如果你觉得某个竞争对手不厚道，只管大声说出来。当你这么做的时候，你会发现有一拨支持者聚集在你身边。当一个反对者是标新立异和吸引跟随者的捷径。</li>
<li>例如，唐恩都乐咖啡馆（Dunkin' Donuts）就热衷于跟星巴克作对。它在广告中嘲笑星巴克用“Fritalian”这个词汇来代替小、中、大的规格。唐恩都乐的另一次挑衅则是围绕着其在某一次品尝测试中击败星巴克而展开，他们甚至做了个名为“唐恩都乐大胜星巴克”的网站（DunkinBeatStarbucks.com），在这个网站上，访客们可以发送写有“是朋友，就别让朋友喝星巴克”字样的电子贺卡。</li>
<li>拥有对手，就等于为客户制造出了讲故事的素材。驻足观望者只能站在外围，人们热衷于看到冲突，喜欢偏袒一方，乐于被点燃激情。而这正是吸引人们眼球的绝佳办法。</li>
</ul>
<h3>Underdo your competition 给竞争力做减法</h3>
<ul>
<li>传统的智慧告诉我们，要想打败竞争对手，就要胜人一筹。如果他们的产品有4种功能，你就得做出5种来（或者15种，甚至25种）。如果他们花两万美元来办事，你就得花3万。如果他们有50名员工，你就得雇100名。</li>
<li>这种冷战式的攀比思维会把人引上绝路。一旦被卷入“军备竞赛”，你就陷入了一场永无止境的战争，这场战争会消耗大量的金钱、时间以及动力。并且使你陷入长期的防御战中。处于防御状态的公司是没有预见力的；他们只能后知后觉；他们无法领跑，只能尾随。</li>
<li>那么你该怎么做呢？要做得比你的对手少，并以此来击败他们。</li>
<li>一个通过削减产品功能而成就产品销量的强大案例就是：Flip，一种超简单的傻瓜式摄像机，该产品在短时间内迅速占领了大块市场。让我们看看Flip是如何削减产品功能的吧：<!-- -->
<ul>
<li>·没有大屏幕（只有一个自拍时不能转动的小屏幕）。</li>
<li>·没有照相功能。</li>
<li>·没有录像带或磁盘（你得把影像下载到电脑中）。</li>
<li>·没有功能菜单。</li>
<li>·没有设置选项。</li>
<li>·没有视频灯。</li>
<li>·没有取景器。</li>
<li>·没有特效。</li>
<li>·没有耳机插孔。</li>
<li>·没有镜头盖。</li>
<li>·没有存储卡。</li>
<li>·不带光学变焦。</li>
</ul>
</li>
<li>Flip之所以赢得无数粉丝，原因就在于它只做几件简单的事情，并且做得非常棒。它使用起来轻松有趣，和大块头的摄影器材相比，它能用到的地方更多，那些从不使用高档摄影器材的人们会乐于使用Flip。</li>
<li>不要因为你的产品或服务不如别人的花哨就感到自惭形秽。要高调一些，要引以为豪。要像你的对手推广他们的多功能产品一样充满激情地推销你的简约产品。</li>
</ul>
<h3>Focus on yourself instead of they 谁管他们在做什么？</h3>
<ul>
<li>最后要提到的是，你的竞争对手不值得去关注。为什么呢？因为为对手操心会转化为一种纠结的状态，你会关注他们现在在做什么？他们下一步要做什么？我们该如何应对？</li>
<li>对方的每一个小动作都落入你的精密算计之中，这种心态很恐怖，会让人沉浸在紧张和焦虑之中。这种心态构思不出任何好想法。</li>
<li>把目光放到你自己身上来吧。你自己本身的变化比外界的变化更为重要。当你把时间浪费在关注他人身上时，就没有时间去自我提高了。</li>
<li>过多关注竞争对手会分散你的视线。</li>
<li>如果你尽想着去折腾个什么“iPod杀手”或“下一个Pokemon”，你死定了。你已经为自己设下了限制条件。你无法创造出超越苹果公司的苹果产品，因为游戏规则是他们定下的，而你是无法打败游戏规则制定者的。你得制定自己的游戏规则，而不是仅仅去做一件稍微好一点的产品。</li>
</ul>
<h2>Evolution | 进化</h2>
<h3>养成对客户说“不”的习惯</h3>
<ul>
<li>如果一味听顾客的，我就只能给他们弄一匹快马。——亨利·福特</li>
<li>唯唯诺诺很容易。人们很容易同意添加一项新功能、接受一个过于乐观的最后期限、笑纳一个平庸的设计。很快，这些轻易过关的事物堆积起来，在你眼前越堆越高，你甚至都看不到现在该做的事情了。</li>
<li>人们不愿意开口拒绝，是因为针锋相对的感觉并不舒服。但是另一个选择的后果会更糟。你自找麻烦，把事情弄得更复杂，最后连你自己都不知道自己在干什么。</li>
<li>不要相信“客户永远是正确的”这种废话。假设你是个厨师，如果很多食客说你炒菜太咸、太辣，你可以改变这一状况。但是如果某些挑剔的美食家叫你在宽面里面加点香蕉，千万别搭理他们，那样就很好。为迎合某些客户而与大多数人背道而驰，就得不偿失了。</li>
<li>不要觉得“不”字难以出口，坦然些，如果你不愿意迎合某个客户的需求，只要彬彬有礼地解释清楚就可以了。当你花时间解释自己的想法后，人们的谅解能力通常会超出你的想象。你甚至可能会让他们赞同并追随你的思路。如果行不通，就推荐一个能提供更好的解决方案的竞争对手。让客户开心地使用别人的产品，强过让人憋屈地使用你的产品。</li>
<li>这样做的目标是确保你的产品就是你自己的产品，你是自己产品最忠实的粉丝。这样一来，你就能宣称：“我觉得你会爱上它的，因为我爱上它了。”</li>
</ul>
<h3>不要攀客户的高枝</h3>
<ul>
<li>也许你见过这样的情形：某个客户给一家公司投了很多钱，这家公司就尽一切可能去满足客户的要求。为了迎合这个客户的要求而改变自己的产品，渐渐开始脱离了普遍的客户基础。</li>
<li>然后有一天，这个大客户绝尘而去，这家公司拿着袋子站在原地——袋子里的产品是为某个不再需要这个产品的人量身打造的。现在这个产品已经不适合任何人了。</li>
<li>人在变，环境也在变，你不可能满足所有人的所有要求。公司要对某一类型的客户全情投入，而不是对某一个善变的客户唯唯诺诺。</li>
</ul>
<h3>Don't confuse enthusiasm with priority 头脑发热不等于当务之急</h3>
<ul>
<li>突然想到一个绝妙的主意时，人们都会陷入一时的狂热之中，开始幻想着其中的无限可能和巨大利益。当然，还有马上就要实现的冲动。于是你放下手头所有的事情，开始实施这个最新、最棒的想法。</li>
<li>臭棋一招！一个新创意的撩人程度并不代表其真实价值。有些东西现在看上去是“非要不可”，但是到了第二天早上，可能就会降级为“可有可无”。而“可有可无”的东西是不值得你不顾一切去做的。</li>
</ul>
<h3>At-home good 家用便利就是好</h3>
<ul>
<li>你买的是“镇店之宝”型的产品，这类产品就是应该放在店里让人向往的，而不是真正能买回来让人实际使用的。</li>
<li>聪明的公司就会生产与之相反的产品——可以做“镇宅之宝”。当你把这种产品拿回家后，会比在店里看到时更喜欢它。它融入了你的生活并且你越来越喜欢它。而且，还会把它推荐给你的朋友。</li>
<li>当你制造出一个能成为“镇宅之宝”的产品时，可能要因此牺牲一些“镇店”的噱头。一个能够完美演绎基本功能的产品，势必在花哨程度上要略逊对手一筹。长于某些功能的产品，远远看上去肯定不是那么面面俱到。这没什么，毕竟你的目标是与它建立长期关系，而不是“一夜情”。</li>
<li>广告和宣传做得再好，也无法弥补一次糟糕的客户体验所带来的损失。</li>
</ul>
<h3>不必逐字记下客户需求</h3>
<ul>
<li>你应该怎样跟踪、了解客户的需求？完全不必！倾听，然后忘掉他们说的话就行了。这可不是开玩笑！</li>
<li>你根本不需要用电子表格、数据库或录入系统去记录这些东西。真正有意义的需求，客户会一次又一次地跟在你屁股后面提出来。你根本就不可能忘记。你的客户就是你的记事本，他们会反复提醒你，会展示给你哪些事情是真正需要去考虑的。</li>
<li>如果某个要求被你一次一次地遗忘在脑后，这就说明这个要求并不是太重要——真正重要的东西是忘不掉的。</li>
</ul>
<h2>Promotion | 推广</h2>
<h3>甘于低微</h3>
<ul>
<li>现在的你籍籍无名，这是件好事。籍籍无名就是一个绝佳的状态，你要庆幸自己目前还身在暗处。</li>
<li>要充分利用这段时间，这时犯再大的错也没人知晓。要保持低调，你可以利用这段时间继续调整你的策略，解决纠结的问题、测试各种创意、尝试新事物。没有人认识你，所以弄砸了也没关系，起于浮萍之末，能最大限度地保住你的自尊和自信。</li>
<li>百老汇演出也是先在小剧场试水的。在进军纽约之前，他们会先把剧目放在一个较小的城市进行试演。小城市的试演能让演员们在面对更为苛刻的评论家和高品位观众之前，先在普通观众当中树立一定影响。</li>
<li>如果有上百万的用户在使用你的产品，那么你做的每一点改变都会产生放大效应。在此之前，你作出的改变可能只会让一百来人感到不爽，现在，则可能会让好几千人感到纠结。面对100个人你还能解释，面对上万个愤怒的顾客，你就只能躲到防暴盾牌后面去了。</li>
<li>这样籍籍无名的日子一去就不会再回来。现在就是毫无顾忌地进行冒险的绝佳机会。</li>
</ul>
<h3>培养自己的拥趸</h3>
<ul>
<li>所有的公司都有顾客，幸运的公司有粉丝，而最幸运的公司则有一帮观众。观众能成为你的秘密武器。</li>
<li>如今最聪明的公司都更有办法。与走出去接触群众相反，他们让人们过来找自己。观众就会经常回来——完全出于自愿——看看你要说什么。这将是你见过的接受能力最强且最具潜力的一批顾客。</li>
<li>在过去的10年里，我们通过Signal vs.Noise博客，培养了超过10万名的每日浏览用户，这就是一个庞大的观众群体。</li>
<li>所以，赶快培养观众群体吧。说些什么、写点儿什么、开个博客、整个微博、制作视频——总之，想尽一切办法。大方地分享有价值的信息，你就会慢慢建立起忠实的观众群体。然后，当你想传达消息时，自然就会有人在那儿等着倾听了。</li>
</ul>
<h3>Don't out-spend, out-reach 普及知识，赢得竞争</h3>
<ul>
<li>你可以做广告，可以雇用销售人员，可以投赞助。但是你的竞争对手也能做这些事情，那么你靠什么出位呢？不要在消费、销售或赞助上和竞争对手去攀比。也许你的竞争对手根本还没考虑过去传授别人些什么呢。绝大多数公司都在关注销售或服务，但是从未想过传授知识。</li>
<li>传道授业能为你建立起凝聚力，这是传统市场策略不可望其项背的。通过杂志或网络广告去赚取眼球是一回事；通过讲授知识来赢得人们的忠诚则建立起了一种截然不同的关系。后者会更加相信你、尊重你。即使他们不使用你的产品，也仍然是你的粉丝。</li>
<li>个人和小企业适合去传授知识，而大公司则不适合。大公司支付得起超级碗（美国橄榄球超级杯大赛）广告，而你不能。你能在传授知识方面大力投入，而大公司不能。因为大公司受制于保密政策，公司里的每一款条文都得经由律师过目，并且再经层层严格审查。传授客户知识是专属于你的绝佳制胜机会。</li>
</ul>
<h3>效仿大厨</h3>
<ul>
<li>你也许听说过艾梅里尔·拉加西（Emeril Lagasse），马里奥·巴塔利（Mario Batali），巴比·福雷（Bobby Flay），朱莉娅·蔡尔德（Julia Child），保尔·迪恩（Paula Deen），瑞克·贝里斯（Rick Bayless），还有雅克·佩平（Jacques Pépin）。他们都是优秀的厨师，但是优秀厨师那么多，为什么你对这些人的了解要超过其他厨师呢？因为他们乐于与别人分享他们知道的一切。他们把自己的秘方写在烹饪书籍上，在烹饪节目里大秀厨艺技巧。</li>
<li>向大厨学习吧。他们烹饪美食，所以他们就写了美食书籍。你该做什么呢？</li>
</ul>
<h3>Go behind the scenes 转到幕后看看</h3>
<ul>
<li>让人们到你公司的后台巡游一番，看看你的业务到底是如何运作的。想象一下，如果有人要给你的公司拍一部写实纪录片，他们能把什么东西分享给观众？现在不要等待那个想象中的制片人了，你可以亲自操刀。</li>
<li>人们对产品的制作过程充满了好奇。</li>
<li>让人们走入幕后，能改善你和他们之间的关系。他们会感到与你亲近起来，将你视为一个常人，而不是一个面目模糊的公司。</li>
</ul>
<h3>没人喜欢塑料花</h3>
<ul>
<li>商业世界充斥着身着正装、努力使自己看上去完美的“专家”。实际上他们头脑僵化、思想乏味。没人喜欢这样的家伙。</li>
<li>不要害怕让人看到你的缺点。不完美才真实，真实才能激起人们的共鸣。</li>
<li>所以，你大可直言不讳，畅谈那些别人不愿意讨论的东西。直面你的弱点，向人们展示你最近的工作状况，即使你还没完全搞定它。不完美没关系，也许你看起来不专业，但你却更真实。</li>
</ul>
<h3>Press releases are spam 媒体发布就是垃圾邮件</h3>
<ul>
<li>那种向无数陌生人发送的没有任何新意的广告，希望其中有个把人能对广告产品感兴趣。你把它们叫做什么？垃圾邮件。新闻稿也是一样：把没有任何新意的新闻报道发给上百个你不认识的记者，希望其中一个能为你写篇专题。</li>
<li>如果你想吸引他人的注意，却做着和其他人毫无差别的事情，绝对是愚蠢之极。</li>
<li>换个方法，给人家打个电话，写一份私人信件。</li>
</ul>
<h3>Emulate drug dealers 药贩子最精明</h3>
<ul>
<li>药贩子是最精明的，他们知道自己的产品具有优势，愿意先拿出一些来给人免费试用。他们知道你会回来——并且会花钱购买。</li>
<li>要效法药贩子，把你的产品包装成完美的、令人上瘾的、“不能错过”的灵丹，让人浅尝之后都忍不住要拿着真金白银回来向你购买。这样一来，你必须得花点工夫，把产品做成小份儿试用装，还得为它准备一份易于阅读理解的产品说明书。</li>
<li>只要你有东西可卖，就不要怕给人一点点让其试用。要对自己的产品抱有信心。你应该知道人们会回来购买更多，如果你连这样的信心都没有，只能说明你的产品做得不够好。</li>
</ul>
<h3>Everything is marketing 市场营销不是一个部门的事</h3>
<ul>
<li>你有市场部吗？没有？恭喜你！如果你有，不要以为只有市场部的人才有责任去做产品营销。</li>
<li>财务部是一个独立部门，而市场营销不是，市场营销是需要你公司的全体员工一年365天、一周7天、一天24小时时刻要去做的工作。</li>
<li>人不能不交流，同理，人也不能不去做营销工作：<!-- -->
<ul>
<li>·每次你接电话，这就是市场营销。</li>
<li>·每次你发出一封邮件，这就是市场营销。</li>
<li>·每次有人使用你的产品，这就是市场营销。</li>
<li>·你在网站上写下的每个字，都是市场营销。</li>
<li>·如果你在设计软件，每条错误提示就是市场营销。</li>
<li>·如果你开的是一家餐馆，那么餐后的薄荷糖就是市场营销。</li>
<li>·如果你从事零售业，收银台也能进行市场营销。</li>
<li>·如果你从事服务业，在给客户的账单上也能进行市场营销。</li>
</ul>
</li>
<li>市场营销不是几个人的工作，它是你做的所有工作的总和。</li>
</ul>
<h2>Hiring | 招聘</h2>
<h3>DIY 亲力亲为</h3>
<ul>
<li>在你亲自尝试做这份工作之前，永远不要雇人去做。只有这样，你才能了解这项工作的本质。你才会懂得如何判断工作完成的好坏，才会知道怎样写出符合实际的岗位招聘要求，也才会清楚在面试中该问什么问题。</li>
<li>在37signals，我们一直没有雇用系统管理员，直到我们当中的一个人花了整整一个夏天的时间去设置一大堆服务器为止。</li>
<li>另外，你应该让自己密切融入业务的方方面面。否则你就会陷入一片茫然，把自己的命运交到别人的手上，这是非常危险的。</li>
</ul>
<h3>Hire when it hurts 受不了时再招人</h3>
<ul>
<li>不要为了贪图一时高兴而招人，招人是为了解除痛苦的。</li>
<li>同理，如果有人离职了，不要立即招人来顶替他。看看如果没有人在这个职位上，你们能坚持多久。你往往会发现自己需要的人远没有想象得那么多。</li>
<li>当你在很长一段时间内都被超负荷的工作所困扰，这才是招人的正确时机。此时出现了一些你无法再亲力亲为的事情，你发现工作质量有所下滑，令你感到受不了了，这时才是招人的最佳时机，不要提前招人。</li>
</ul>
<h3>Pass on great people 放弃牛人</h3>
<ul>
<li>有些公司沉迷于招聘。有些公司甚至在没有招聘计划时还在吸纳员工。当他们一听说某个牛人时，就特地设置一个职位或设定一个头衔，来吸引他们。这些牛人就被安放在这些位置上——他们的职位毫无意义，他们的工作也无关紧要。</li>
<li>把有能力的人招进来，却让其无所事事，这对公司来说是有害无益的。</li>
<li>一旦人浮于事，问题就会显现出来。你得开始没事找事地设计出一些工作，好让所有人都忙碌起来。虚无的工作带来的是虚无的项目，而虚无的项目花费的却是实实在在的成本，带来的也是实实在在的麻烦。</li>
<li>牛与不牛没有任何意义，不需要就是不需要。</li>
</ul>
<h3>鸡尾酒会上的陌生人</h3>
<ul>
<li>如果你去参加一个全是陌生人的鸡尾酒会，就只能谈些无聊枯燥的内容，只能寒暄一下天气、体育运动、电视节目之类的话题，你得回避那些严肃的交谈或者有争议的观点。</li>
<li>老朋友之间的亲密小聚会则完全不同。其中充满了真正有意思的话题和热火朝天的辩论。等那晚的聚会结束后，你会感觉大有所获。</li>
<li>短期内大批招人的后果就同陷入“全是陌生人的鸡尾酒会”一样。你身边充斥着新面孔，每个人都彬彬有礼，每个人都努力避免矛盾或冲突，没有人说：“这点子真烂。”人们一团和气，互不攻击。</li>
<li>这种一团和气的氛围就是公司陷入麻烦的根源。当有人把事情弄得一团糟时，总得有人直言不讳地说出来。否则，你就是在经营一个既不惹人恨、又不招人爱的公司。</li>
<li>因此，放慢招聘脚步，这是避免公司陷入“陌生人的鸡尾酒会”的唯一办法。</li>
</ul>
<h3>可笑的求职简历</h3>
<ul>
<li>我们都知道简历就是个笑话。它们都十分夸张，上面充斥着毫无意义的“行为动词”，罗列着一堆的工作职位和岗位责任，却空有头衔，实际内容模糊不清，并且上面的大部分信息是无法验证的，整个就是一场闹剧。</li>
<li>那么，该如何找到合适的人选呢？第一步就是要看求职信。在求职信里你能看到真正的交流，而不是一堆技巧、动词以及无关经历的罗列。一个求职者不可能炮制几百份不同的求职信。</li>
<li>要相信自己的本能反应。如果求职信的第一段就写得很烂，那么后面可能更糟糕。</li>
</ul>
<h3>What does 5 years experience mean anyway? 多年的无关经验</h3>
<ul>
<li>我们经常在招聘广告上看到诸如“要求5年工作经验”之类的描述。这只是给出了一个数字，但是没有任何实质意义。</li>
<li>当然，招聘时要求具有基本经验水平是没错的。可以把目标放在那些具有半年至1年工作经验的应聘者身上。要养成一定的工作习惯、掌握工作方法、学习相关技巧什么的，确实至少需要这么长的时间。</li>
<li>一个具有6个月工作经验的应聘者和一个具有6年工作经验的应聘者相比，其差别小得令人吃惊。真正的差别来自于个人的努力程度、性格差异以及智力水平。</li>
</ul>
<h3>Delegations are dead weight 人人都得干活</h3>
<ul>
<li>在一个小团队里，你需要的是干活的人，而不是监工。每个人都得做事，没有人可以袖手旁观。</li>
<li>这就意味着你在招聘中要避免招到监工型的人物，这些人喜欢对别人谆谆教导。对于小团队来讲，监工型的人就是累赘。他们想出各种事情让别人去做，在丢下自己的工作去安排别人时，他们制造出了更多的工作——不管这些工作是否需要去做。</li>
<li>监工们还喜欢把人拖去开会。实际上，会议是监工们最好的朋友，因为只有在开会时才显示出他们的重要。与此同时，每个被他们拉去开会的人都没办法踏实干活了。</li>
</ul>
<h3>Hire managers of 1 聘用独当一面的经理人</h3>
<ul>
<li>独当一面的经理人有自己的目标，并能够坚定地执行这些目标。他们不需要过多的指导，也不需要每天检查。他们做的都是经理人该做的事情——定基调、派任务、作决策，等等——但都是亲力亲为，自我审查。</li>
<li>你需要那种能够变图纸为实物、并能实干到底的人。一旦找到这样的人，你的团队就能从管理中解脱出来去做更多的工作了。</li>
</ul>
<h3>Hire the better writer 招聘笔杆子</h3>
<ul>
<li>如果你准备在一堆人中挑出一个人来做某份工作，那就挑文章写得最好的那个。至于他有没有做过市场、销售、设计、编程或其他什么工作，倒并不重要。这种人的写作才华就值得雇用。</li>
<li>这是因为，一个优秀的写手，其优点并不仅仅在于写作。文法清晰代表思路明晰。优秀的写手都懂得如何与人沟通。他们使事情变得易于理解，他们善于换位思考，懂得抓重点、砍枝节，这些都是合格的应聘者身上应具备的特点</li>
<li>如今，会写就代表会思考。</li>
</ul>
<h3>The best are everywhere 高手遍布世界各地</h3>
<ul>
<li>要想使你的远程团队彼此保持联系，每天就得安排几小时的共同在线时间。如果大家住在不同的时区，那么这样做就比较困难。</li>
<li>团队成员应该时不时地见一下面。你们彼此应该至少每隔几个月见一次面。我们一般会尽力确保我们的团队在一年之中能见几次面。这几次碰面是我们讨论程序、评议对错、计划未来、加深感情的绝佳机会。2～4小时的共同工作时间就足够了。</li>
<li>地理上的距离不重要，不管距离多远，你都可以把最好的人才引入你的团队。</li>
</ul>
<h3>试用期必不可少</h3>
<ul>
<li>面试的作用毕竟有限，有些人看起来很专业，但做起事来却很雷人。你得评估他们的实际工作能力，现在能做什么，而不是迷信他们自称过去做过什么。</li>
<li>你甚至可以建立一个虚拟的项目。在南卡罗莱纳的工厂里，宝马公司建立了一条模拟装配生产线，让那些求职者在这里实际操作90分钟，完成和汽车有关的各种工作。</li>
<li>这些公司都十分清楚，一旦进入实际工作环境当中，一个人的真实水平就会体现出来。翻看作品、阅读简历、约见面试，那是一回事；实际和人搭档干活，那又是另一回事。</li>
</ul>
<h2>Damage Control | 救灾</h2>
<h3>Own your bad news 主动掌控负面新闻</h3>
<ul>
<li>一旦出了事故，就会有人出来爆料。但如果是由你亲自来说，结果会好得多。否则，你就只能眼睁睁地看着流言四起、传闻满天、假相频传。</li>
<li>出现问题时，应该马上告诉你的客户（即使他们一开始并未察觉）。不要以为自己可以掩盖真相，纸是包不住火的，你不出来承担，就会有人揭发你。</li>
<li>如果你够坦荡，够诚实，够公开，危机应变速度够快，人们就会更加尊重你。不要把头缩回去，也不要苦苦压制坏消息，应该让你的顾客尽可能地拥有知情权。</li>
<li>针对如何自行掌控负面新闻，我们接下来给出一些小贴士：</li>
<li>·要由公司高层来发布消息，而且要由公司内职位最高的人来强有力地控制局面。</li>
<li>·消息要广为传播，想尽一切办法将消息传递出去，别尝试隐瞒事实真相。</li>
<li>·千万别说“无可奉告”。</li>
<li>·要真情实意地表达歉意，要尽量详细地说明情况。</li>
<li>·要真切地关心客户的遭遇——然后要证明自己真的在为客户负责。</li>
</ul>
<h3>Speed changes everything 速度改变一切</h3>
<ul>
<li>“您的来电对我们非常重要，感谢您的耐心等候，我们将在16分钟内给您回复。”劝你还是省省吧！</li>
<li>当你针对客户的个体情况予以回复时，这一点尤其明显。客户们厌倦了千篇一律的标准答案，你只要在回答时稍微用用脑子，让客户知道你在认真倾听，就会让人觉得你与众不同。即使你还不能找出一个完美的答案，说一句：“我们会研究一下您说的问题，回头再联系您，好吗？”也会收到意想不到的效果。</li>
</ul>
<h3>如何道歉</h3>
<ul>
<li>这个世界上没有绝妙的道歉法则，却有着无数雷人的道歉方式。</li>
<li>最糟糕的一种就是非道歉式的道歉，它听起来像是在道歉，实际上并没有真正接受人们的指责。例如，“如果让您感到失望，我们非常遗憾”，或“如果您觉得我们没有达到您的要求，非常抱歉”诸如此类的话语。</li>
<li>一句真诚的道歉，是要承担责任的。这里面不能附加任何“如果”之类的条件。道歉时要详细解释发生的一切，要说明你将采取什么措施来防止这样的事情再次发生。道歉就是要找到一个办法去纠正错误。</li>
</ul>
<h3>Everyone on the front lines 让每个人都上前线</h3>
<ul>
<li>让我们看看小朋友的“传话”游戏，十个小朋友坐成一圈，一句悄悄话从第一个小朋友开始往后传。当传到最后一个小朋友时，原来的信息已经面目全非——往往变得十分有趣。开始的时候句子很正常，但到了最后却成了“通心粉哈密瓜能知晓未来”。参与游戏的人越多，最后的信息越离谱。</li>
<li>在你的公司也是一样。你和客户之间传话、干活的人越多，信息在传递途中就越容易丢失或被扭曲。</li>
<li>团队中的每一个人都应该直接与客户联系——也许不需要每天如此，但是至少每年得联系几次。这是让你的团队直接了解客户内心感受的唯一途径。感同身受的团队才有动力去解决问题。从另一个方面说，帮助客户解决问题后的愉悦感和成就感，也能大大提高队员士气。</li>
</ul>
<h3>Take a deep breath 深深深呼吸</h3>
<ul>
<li>当你改变现状的时候，就会激起波浪。当你推出新功能、改换新政策或去掉什么东西时，就会引发膝跳式思维反应。一定要克制住恐慌或马上应对的冲动。一开始都会有情绪波动，这很正常，但是当你安然渡过前面几天的困境后，事情就自然而然地解决了。</li>
<li>因此，当听到人们的抱怨时，可以搁置一会儿。让人们知道你在倾听，让他们明白你了解他们的想法，让他们清楚你理解他们的不满。但要告诉他们，你打算继续一段时间，看看会发生什么。也许最后你会发现人们改变了观点，一旦习惯了新事物后，他们更有可能喜欢上你作出的改变。</li>
</ul>
<h2>Culture | 文化</h2>
<h3>Culture is the by-product of consistent behavior 文化不是由谁创造的</h3>
<ul>
<li>快餐式的企业文化是人为制造的，它们由大量的使命宣言、声明、条条框框所组成，它们如此肤浅、丑陋和虚伪。人为制造出的企业文化只是一幅画，而真正的企业文化却是时光打磨出的佳作。</li>
<li>你创造不了企业文化，企业文化是自然生成的。这就是新公司往往没有企业文化的原因。企业文化是一贯行为的副产品。如果你鼓励人们去分享，那么分享就会成为你公司文化的一部分；如果你回报他人的信任，那么信任就会成为企业文化的一部分；如果你善待客户，那么善待客户也会成为你的企业文化。</li>
<li>所以，不要过多担心企业文化的事情，不要去强求，你无法给企业安装一种文化。企业文化就像上好的苏格兰威士忌一样，你得给它时间去酝酿。</li>
</ul>
<h3>Decisions are temporary 决策都是临时性的</h3>
<ul>
<li>不要为还没发生的事情自寻烦恼了。没有真正出现的问题统统不是问题。再说了，你担心的大多数事情都不会真的发生。</li>
<li>尤其对小企业来说。环境变了，决策也会随之改变，决策都是临时性的。</li>
<li>保持公司规模小的最大优势之一，就是具有强大的转向能力。和大型公司相比，你更容易作出快速、彻底的转变。</li>
</ul>
<h3>They are not 13 员工不止13岁</h3>
<ul>
<li>当你把员工当孩子看时，人们就会像孩子一样行事。然而很多公司以及经理人正是这样对待自己的员工的。员工们在做任何事情之前都必须向上申请以求批准。他们的每一笔小额开销都得上报审批。我很吃惊他们居然可以不经批准就去上厕所。</li>
<li>当公司里事事都要上报审批时，你就创造出了一种无脑文化。你成功地制造出了老板和员工之间的对立关系，这种关系在咆哮着：“我不相信你！”</li>
<li>当你处处限制员工，比如说，禁止他们在上班时访问外部网站或上YouTube看视频，你会得到什么好处？什么都得不到。这段开小差的时间不会奇迹般地变成努力工作的时间，他们会找出其他的方法来消磨时光。</li>
<li>接下来我们再谈谈你要花多少时间和金钱来监管员工。安装监控软件得花多少钱？IT员工得浪费多少时间去监视员工，而不是去做更有价值的实用项目？你浪费了多少时间去写无人看的规章制度？看看这些成本，你很快就会意识到：对员工的不信任才是最大的开销。</li>
</ul>
<h3>Send people home at five 5点准时放人</h3>
<ul>
<li>当人们家里有事时，他们会在办公时间内把活儿干完，因为家里还有事情等着他们去做。他们要接孩子、要参加唱诗班的活动，所以必须聪明地安排时间。</li>
<li>就像谚语说的：“想要做成一件事，就去找你能找到的最忙碌的人。”你需要忙忙碌碌的人、需要有业余生活的人、需要关注好几件事情的人。你不能期望工作成为一个人生命的全部——至少你不愿意长期和这样的人共处。</li>
</ul>
<h3>Policy is scar 不要矫枉过正</h3>
<ul>
<li>人们容易犯的第二个错误就是出于本能去制定规章制度。“有人穿短裤上班！？我们得制定一个着装规定！”不，没必要。你只要告诉约翰不要再穿短裤上班就行了。</li>
<li>规章制度是组织机体上的伤疤。它们是针对一种不太可能再次发生的情况而作出的过激反应，是对个人过失的一种集体惩罚。</li>
<li>只有当一件事情反复发生时，才需要为之制定规章制度。</li>
</ul>
<h3>Sound like you 发出你的心声</h3>
<ul>
<li>生意人虚张声势的时候会给人什么感觉？都是些僵硬的措辞、官方的腔调、虚伪的友善、法律术语等。你一定看过这些玩意儿，就好像是机器人写出来的东西，这些公司在向你发话，而不是和你对话。</li>
</ul>
<h3>需要避开的词汇</h3>
<ul>
<li>在生意场上有些词汇永远不要去使用。它们不是那些不文明用语，而是“得”、“必须”、“不能”、“简单”、“只要”、“只有”以及“赶快”。这些词会损害交流。它们就像憎恨的代名词，为良好的互动交流埋下了一个个地雷，耽误了项目的进展。</li>
<li>得。很少有什么东西是“得”去做的。不要说“得”，最好说“也许”或“你对这个是什么看法？”或是“这个主意听起来怎么样？”或是“你觉得我们能不做这个吗？”</li>
<li>不能。当你说“不能”时，其实也许能行。有时候“不能”是相对的，比如，“我们不能这样开始，因为这样不对”，另一种说法则是“我们不能再花时间在这上面了，因为我们必须开始”。这两种说法都不是实情。或者可以再等等看，是吗？</li>
<li>简单。简单是用来形容别人工作的一个词。“你做起来一定很简单，对吗？”但是你要注意，很少有人用简单来形容自己的工作。对你来说，这表示“让我们来看看该怎么做吧”——但是对别人来说，这个词意味着“给我搞定它！”</li>
<li>尤其是当你把这些词连在一起使用时：“我们现在就得把这个功能加进去，没有这个功能我们就不能做了，每个人都想要它，这只是小事一桩，所以应该很简单，你应该能够很快把它做出来。”就这么区区60个字，却可引出100种假设，这就是祸端。</li>
</ul>
<h3>ASAP is toxic | 越快越好是毒药</h3>
<ul>
<li>当你事事要求别人“越快越好”时，你就是在表示每件事都是优先级别最高的，如果每件事都是急事，那就没有急事了。（这点比较搞笑，在你真正开始区分轻重缓急之前，怎么可能事事都是最高优先级别呢？）</li>
<li>因此，慎用你的紧急命令，留到真正有急事时再说，也就是在那种如果无动于衷就会引起直接的巨大反应情况发生时再说。而对于其他的事情呢，就要放轻松。</li>
</ul>
<hr>
<ul>
<li>封面图片来自无版权图站 <a href="https://unsplash.com/photos/zMRLZh40kms">Unsplash</a></li>
</ul>]]></content:encoded>
            <author>rexwangcc@gmail.com (Rex Wang)</author>
        </item>
        <item>
            <title><![CDATA[《决战美杜莎》]]></title>
            <link>https://rexwang.cc/articles/2023-duel-medusa</link>
            <guid>https://rexwang.cc/articles/2023-duel-medusa</guid>
            <pubDate>Sat, 30 Dec 2023 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>本篇《决战美杜莎》是我中学时期读王晋康老师时最喜欢的一篇短篇小说，它开启了我对生命永恒和时间的一系列思考。如今年过三十，又恰好与友人聊起来，特此摘录，如有侵权请联系删除。</p>
<img alt="" loading="lazy" width="7514" height="4227" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmedusa-cover.c4c8591f.jpg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fmedusa-cover.c4c8591f.jpg&amp;w=3840&amp;q=75">
<hr>
<div class="justify-center flex"><p class="italic">01</p></div>
<hr>
<p>钱三才先生是全国房地产界的大鳄，他白手起家，经过45年的拼搏，挣得近千亿的家产，在福布斯中国富豪排行榜上一向名列前五位。此老性格乖张，特立独行，从不在乎社会舆论。他今年65岁，准备退休了，但他的千亿家产如何处置成了悬念。他曾公开声明不会学比尔·盖茨的“裸捐”（家产不留给后代，全部捐给慈善基金会）。在回答一个记者的追问时，他冰冷地说：</p>
<p>“那是我自己的钱，我想花到哪儿就花到哪儿，用不着你来教我该怎么做。”</p>
<p>当然，这番话激起了社会上一片讨伐之声。</p>
<p>他只有一个独子。那家伙倒真正是乃父的肖子，同样是个性格叛逆的角色，与其父一向不和。他早就公开声明，不会要父亲一个子儿的遗产。那么，钱先生该如何处置他的千亿家产呢？</p>
<p>在他过了65岁生日并正式退休后，他的家产处置方案终于浮出水面。那天他邀请七位学界精英开了一次“七贤会”，包括数学家陈开复、材料学家迟明、考古学家林青玉女士、物理学家徐钢、语言学家刘冰女士、电脑专家何东山和社会学家靳如晦。这七人有两个共同特点：第一，才气横溢，都是本专业的顶尖人物；第二，年龄大都在32—35岁之间（仅靳先生年过四旬）。外界合理推测，他将对这七位学界精英给予巨额资助，很可能是天文数字的资助。但他依据什么标准选中这几位？七个人的专业似乎风马牛不相及。媒体为此热热闹闹讨论了很久。</p>
<p>不过这对我不是秘密，因为我也是与会人员之一。当然，以我的年龄、工作和学力——25岁的自由记者，偶尔写些科幻小说，自我评价只能算是二三流的作家——是不够与会资格的。但物理学家徐钢是我的未婚夫，他酷爱室外运动，前不久攀岩时摔断了左腿，在石膏绷带还没取下来前，如果有非得参加的活动，都是由我推着轮椅送他，这次仍是如此。后来，歪打正着的，“七贤会”变成了“八仙会”，而且我——“头发长见识短”（徐钢语）的易小白，还被推举为研究小组的发言人和组长，成了徐钢的顶头上司，这让他大呼不平。</p>
<p>会议是在腾格里沙漠举行的。这儿有钱先生种植的防护林，是他不声不响做下的慈善工程之一，而且做得相当不错。方圆数百平方公里内郁郁葱葱，沙漠变成了真正的沃野绿洲，仅剩下100亩原生态沙漠作为样本，罩在透明的穹盖下。这是一座顶部透明的穹隆形建筑，是钱先生建的博物馆。博物馆名由钱先生亲自拟定并书写，但馆名颇有点不伦不类：浪淘沙。他与媒体一向不和，媒体自然不放过这个拿他开涮的机会，都说这么一个花里胡哨的名字，更适合于命名洗浴中心而不是博物馆。这话虽然刻薄，但说得也不为错，确实在不少城市中都有以“浪淘沙”命名的洗浴中心。</p>
<p>博物馆的展品也五花八门，有些直接摆放在沙面上，有些半埋在沙里。讲解员是一位本地姑娘，脸蛋上带着高原红，普通话不太标准，带着西北口音的艮劲儿。她介绍的头一件展品是一架风箱，过去家庭妇女做饭用的，现代社会在两三代之前就淘汰了。这架风箱的桐木箱体保存得基本完好，但枣木的风箱把手已经磨去大半，变成细细的一条月牙，令人感叹岁月之沧桑。讲解员说，这件器物是钱总的奶奶传下来的。你们猜一猜，风箱把手磨到这个程度花了多长时间？答案有点出乎观众预料：仅仅40多年。</p>
<p>前边沙面上放着一件六边形中空石器，讲解员说这是钱总家乡一口水井的井口。井口材质是坚硬的花岗岩，各边都磨出了深深的绳槽，光可鉴人，最深处可达壁厚的一半。柔软的井绳需要多少年才能在花岗岩上磨出这样深的沟槽？这个井口一共磨断过多少根绳子？耗去了打水人的多少光阴？讲解员说，虽然精确时间不可考，但从钱总故乡的村史分析，应该是在150～180年之间，这个时间也不算多么漫长。</p>
<p>然后是一块青石板，是钱家祖宅屋檐下的接水板。雨滴年复一年的迸击在石面上留下了明显的凹坑，最深处竟有一指深。水是天下至柔之物，而且只不过是小小的雨滴在敲击，并非凶暴的瀑布，那么，需要多长时间才能在坚硬的石板上“舔”出这样的凹坑？讲解员笑着说，这个时间倒是容易追溯的，只用查查钱家祖屋的建造时间就知道了——150年。</p>
<p>再往前，沙面上摆放着一个精致的水晶盒子，昭示里面的展品比较贵重。那是一块形状奇特的石头，长圆形，中间弯成90度。说它奇特，奇在它的“驼背”是天生的，并非人工雕琢，从弯曲的石纹可以清楚地看出这一点。讲解员兴奋地说：</p>
<p>“知道吗？这件展品是著名地质学家李四光珍藏过的，李先生说它是中国第四纪冰川运动一个绝好的实证：这块长形石头原来应该是直的，半截嵌在坚硬的基岩里，凸出的半截正好被冰川包围。因为冰川有极缓的运动，石头被冰川缓慢地推挤着。在漫长的时间中，坚硬的石头会表现得像面团一样柔软，最终成就了这个90度的弯腰，就像它在向时间女巫膜拜。李先生十分钟爱这块石头，当年丢失过一次，李先生特意登报求告，说它只有学术上的意义而没有金钱上的价值，窃贼良心发现，悄悄还了回去。李先生仙逝后，他的后人也一直珍藏着它。至于钱先生如何讨来这块宝贝，就不得而知了，所谓精诚所至金石为开吧。”</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>钱先生冷冷地一下子顶回去：“不，徐钢先生不必违心地面谀。我知道这个追求既不伟大，也不高尚。但人类文明史大半是由不高尚所组成的。像著名的金字塔、兵马俑、泰姬陵、巴格达空中花园、曾侯乙编钟等，都是帝王私欲的产物，就连造福后代的京杭大运河，其初衷也是为了隋炀帝南下巡幸。人类文明中有没有‘本质高尚’的遗迹！有，像李冰修都江堰，像印度的阿育王塔，不过实在屈指可数。既然历史就是如此不干净，既然我有干亿家产无处可花，那就让我当一回胡夫、秦始皇和隋炀帝，又该如何？”</p>
<p>徐钢仍面带微笑（我从中看到不祥的寒意），平静地说：</p>
<p>“当然可以啊，没人反对你‘流芳百世’，更不会干涉你如何花自己的钱。不过我觉得你的要求档次太低，不符合你的尊贵身份。你为什么不要求把整个月球雕成你的肖像呢？有一千亿金钱做后盾，再加上现代科技，这并不是办不到的事。”</p>
<p>钱先生淡然一笑：“现代科技什么都能办到吗？”</p>
<p>“至少，对你提的那种要求来说易如反掌。它太简单了，太小儿科了，不值得拉上我们七个来陪你一块玩儿。我提一个既快又省的建议，你不妨放了我们，改去雇用石匠。500元就管雕出一个很像样的花岗岩脑袋，外加刻上你的大名。你不妨雇他几百人，雕他几万件，分散埋到世界各地。这就能达到你的目的了，可以确保几千年、几万年后，后人还能在哪块地里刨出一个囫囵脑袋。”</p>
<p>我使劲扯徐钢的衣襟——他的话太刻薄。不管怎么说，我们今天是客人，我不想他和主人彻底撕开脸面。而且我的意识深处也有隐隐的怀疑——钱先生虽然为人乖张，但终究是商界耆宿，人情练达，老眼如刀，不会贸然提出这个显然会被拒绝的要求来自取其辱吧。那么，也许他另有深意？</p>
<p>其他六位默然不语，从感情上说明显倾向于徐钢这边。现在只有我出面转圜了。我仍然扮演一个毫无心机的天真姑娘，笑嘻嘻地说：</p>
<p>“徐钢你先别吹牛，别把话说得太满。钱伯伯的要求中还有一个重要参数没提到呢，那就是——时间长短。钱伯伯，你说的‘千秋之后’，究竟是多长？是1000年，1万年，还是10万年？”</p>
<p>钱先生深深看我一眼，唇边再次浮出笑意。他赞许地对我点点头，然后说：</p>
<p>“我要求的时间是——150亿年。”</p>
<p>“多——少？”</p>
<p>“150亿年。我希望我的石头脑袋，还有名字，至少能保存到150亿年后。我的要求很简单，具体内容也可商榷，但这个时间点一定得保证。”</p>
<p>周围的气氛又有一个突然的转变，而且是逆向的转变。七个人同时抬头看着钱先生，刚才的不屑目光已经变了，变得非常复杂，有迷茫，也有敬畏。七个人你看我，我看你，默然不语，一种隐隐的亢奋在暗中搏动。社会学家靳先生喃喃地说：</p>
<p>“150亿年。按比较公认的预测，宇宙在150亿年后已经灭亡了。至少说，地球人类肯定灭亡了。”</p>
<p>钱先生轻松地说：“那倒没关系。我不在乎150亿年后是谁刨出我的脑袋，是地球人，还是外星人。”</p>
<p>“也许那时一片混沌，已经没有任何生物，更不用说智能种族了。”</p>
<p>“那同样没关系，就让我的脑袋独自飘浮在混沌中吧。我只求留名，不怕寂寞。”他用尖利的目光看看徐钢，讥讽地说，“不过对于现代科技来说，这件事肯定太过轻易，不值得拉上你们七个来陪我玩儿，是不是？”</p>
<p>我幸灾乐祸地看看徐钢——谁让他刚才那么狂？他这会儿完全陷入深思之中，对钱先生的讥讽毫无应战之意。我毕竟是写科幻小说的，对各类知识多有涉猎，知道七位科学家为什么有如此的震动。150亿年——对于1000年、10万年这样的时间段来说，150亿年绝不是单纯的加长。它的漫长足以让事情发生质变，让可能变成不可能，让不可能变成可能，甚至能让坚硬的科学理性变得软如面团，就如那块冰川中的弯腰石头，对时间女巫低头膜拜。我想起辛弃疾的一句诗：“了却君王天下事，赢得生前身后名。”钱先生的提议为这句话赋予新的含意。此前的世人，包括人类历史上最厉害的英雄枭雄，也不过关注于“生前之名”，即在地球人文明中的声名；唯有钱先生第一次认真提出要博得“身后之名”，即在地球文明之后，甚至“这个宇宙”之后的声名。</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>“不，是徐钢、是我们太狂妄了！”我苦笑着大声说，“钱伯伯，我们曾以为科学无所不能，至少未来的科学无所不能。但自打五天前听了你的要求，促使我们回过头来，清醒地理了理它到底有多大能耐。现在我们承认，你那项要求虽然非常非常简单，但是，只要现代科学的框架没有革命性的突破，就没有任何技术手段能够实现它。我们非常佩服你，五体投地。你聪明地使用了‘极端归谬法’，让我们猛省到，科学在时间女巫前是何等渺小。”我补充一句，“钱伯伯，这些话可不是我个人的看法，而是我们八个人的共识。”</p>
<p>“是吗？这可让我太失望了。提个建议吧，我看美国‘先锋’号飞船采取的办法就不错，你们可以把我的肖像和名字镌刻在镀金铝板上，或者刻在更稳定的铂铱合金上。据设计者说，这种金属板在太空环境中能保存几亿年。”</p>
<p>我看看材料学家迟明，摇摇头说：“我们讨论过这个办法，不行。迟先生说，这种方法只能保证几千万年的稳定，但在150亿年的漫长时间里，金属原子会发生显著的蠕变，甚至质子湮灭效应也不能再忽略，这两种效应肯定会破坏信息的精确传递。再说，这个金属板或金属头像能储存到哪儿？150亿年后，地球肯定已经不存在，所有的星体可能也不存在了。在星体的大崩解中，没有任何物体能独善其身，正所谓覆巢之下无完卵。考古学家林女士、语言学家刘女士和社会学家靳先生还说，退一万步说，即使它能保存下来，又怎么保证你的名字和肖像被人读懂呢？也许那时的智能生命是一种混沌体，根本没有视力，不理解头像和人类文字是哈东西。即使他们有语言文字，但我们无法事先设计一个罗塞塔石碑，来沟通两种语言。”</p>
<p>“不至于吧，据我所知，很多科学家说可以用数学做星际交流的中介，因为在整个宇宙中，数学有唯一性。”</p>
<p>“不，数学家陈先生说，关于这一点——数学究竟是先验的绝对真理，抑或仅仅是对客观世界深层机理的高度提炼——并无定论。所有数学都离不开公理，但150亿年后的文明会不会认同今天的公理？在那个趋于混沌的宇宙里是否还会提炼出今天的数学？陈先生说不敢保证。”</p>
<p>“想想另外的办法嘛。用句孙猴子的话：怕龙宫没宝哩。人类科技这么发达，肯定有办法。”</p>
<p>“这五天里，我们讨论了各种办法，非常异想天开的办法，非常科幻的办法，不过最后都行不通——说句题外话，钱伯伯我非常感谢你，不管你的课题能否成功，至少我已经得到了很多绝妙的科幻构思，是七个一流科学家免费为我提供的，这样的机会太难得了！用它们当素材，我一定能写出一篇惊世之作。”</p>
<p>钱先生笑着说：“那好，如果成功了，你得用稿费和奖金请客，我们八个人都去。”</p>
<p>“不，九个，钱伯母也要去。”</p>
<p>“哈哈，你真是个细心的好姑娘。对，让你伯母也去。现在不妨说说你们那些‘行不通’的设想，算是为我进行启蒙教育吧。”</p>
<p>“比如，电脑专家何先生曾设想造一个‘终极计算机’，把有关你的信息数字化，输入计算机中，然后设计一个非常严格的纠错程序，在信息受到任何微干扰时及时校正。这正是数字化信息最根本的优点，从理论上说可以保证信息在150亿年时间里精确传递。可惜，这种纠错程序，从本质上说，是以外来能量流来维持一个小系统的有序状态，它离不了外来能量流。但150f2年后，在宇宙陷入混沌状态时，谁敢保证一定有外来能量流？再说，计算机硬件本身也同样受到原子蠕变和质子湮灭的威胁。”</p>
<p>“我也觉得这个方法过于复杂，肯定不可行。另外的设想呢？”</p>
<p>“有很多很多。比如在光子的亚结构中嵌入特定信息，对于以光速运动的光子来说，其固有时间是停滞的，信息不会随时间漂移。但这种方法又受刭量子不确定性的限制，还是行不通。”</p>
<p>“嗯，还有呢？”</p>
<p>“徐钢设想建一个近光速飞船，当飞船速度非常接近光速时，船上的固有时间也就非常接近停滞，可以保证飞船中的金属雕像不会发生蠕变。当然，此时飞船质量接近无限大，对其加速所需能量也接近无限大。但如果飞船能随时从太空中捕捉氢原子，以核聚变的方式提供能量，对飞船永久性持续加速，还是能够接近光速的。”</p>
<p>“这办法似乎可行。为什么行不通？”</p>
<p>“因为我们又想到，对于近光速飞船来说，静止的太空粒子具有同值的反向速度，它所具有的阻碍运动的动能，远大于它在核聚变中放出的能量！”</p>
<p>“且慢——能不能想办法利用这种反向动能？我不懂牛顿力学和相对论，但据我所知，帆船就能利用逆风行驶，只需走‘之’字形路线就行。”</p>
<p>“钱伯伯，这儿可是质量接近无限大的近光速飞船！要想让它走‘之’字形路线，也就是产生横向加速度，所耗用的动力也是接近无限大的。”我加了一句，“这还牵涉到另一项无法克服的困难——近光速飞船在150乙年的飞行中总会与什么天体相撞吧，但它根本无法转向规避，因为飞船的固有时间为零。”</p>
<p>钱先生摇摇头：“绕来绕去，仍是行不通，好像有一个无处不在的毒咒在罩着咱们。”</p>
<p>我迅速看大伙一眼：“钱伯伯你说得对，你太厉害了，一句话就戳到要害之处。这正是我们在五天深入讨论之后的强烈感受。宇宙中确实有这么一个无处不在的毒咒——熵增定律。它魔力无边，无处不在，无时不在。它让任何信息在时间长河中都归于无序，再巧妙的办法也绕不开它。其实刚才我们说的还只涉及‘宇宙之内’，没有涉及‘宇宙之后’。科学家相信，150亿年之后，也许已经是另一个宇宙了。但什么是不同宇宙的分界？最本质的定义就是信息的隔绝。新宇宙诞生时会抹平一切。所有母宇宙的信息，哪怕是一个简单的石头像和名字，都甭想传递到另一个宇宙。”</p>
<p>“小白，你快把我弄得灰心丧气了。这么说，你们打算拒绝这个活儿？”</p>
<p>“不！我们一定要接！即使最终的结果是完全失败，我们也要做下去，至少可以为后人指出此路不通。这么说吧，这绝对是人类古往今来最伟大的课题，它甚至已经超越了科学，成为哲学命题和宗教追求。我们怎么舍得放弃呢。”</p>
<p>“那好，如果你们‘投入整个人生’之后仍然失败，让我的一千亿打了水漂，我也认了，心甘情愿。现在，咱们是不是该谈谈待遇？”</p>
<p>“不必了，我们对待遇毫无要求，能进到这个研究小组，已经是我们极大的荣幸。再说，你那区区千亿家产可不够这项研究的开支，只够做启动资金，我们得省着花呀。最乐观的预计，这项研究要想得出基本确定的结论，至少得一万年吧。至于总的花费，我们现在都不敢去算。”</p>
<p>“那好，待遇的问题就由我单方面决定吧。这么说，今天我们就可以签聘用合同？”</p>
<p>七个人，不，带上我是八个人，依次庄重点头。</p>
<p>“好，能有这个结果，我很满意。”钱先生环视众人，把目光落在徐钢身上，似笑非笑地说，“徐钢先生你输啦！你说绝不要我一个子儿的遗产，但我还是把它变着法儿交到了你们几位的手中。算起来，你接受了我家产的七分之一，不，算上小白那份儿是八分之二。”</p>
<p>其他六人一时愣住。我笑着解释：“徐钢是钱伯伯的独子，10年前就和老爹闹翻。为了和老爹划清界限，连姓都改啦，是随妈妈的姓。这些年，我和钱伯母没少在这爷儿俩之间当和事老，所以，有今天的结果，我很欣慰。”</p>
<p>徐钢虽然和父亲闹翻，但当初接到父亲的邀请函时并没有拒绝。他这样做自有他的道理：作为儿子他拒绝了父亲的遗产，但作为科学家他不会拒绝慈善捐赠。公平说来，钱伯伯刚才判他“输”，其实有点强词夺理，有点耍赖，属于阿Q的胜利。不过这会儿徐钢也变成“乖乖宝”了，不再和老爹逞口舌之利，平和地说：</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>“你先猜一猜嘛。让你猜三次，看能不能猜中。”</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>我笑着挂断电话。</p>
<hr>
<div class="justify-center flex"><p class="italic">02</p></div>
<hr>
<p>地球飞船“浪淘沙”号停泊在“时母”双星的拉格朗日点，即双星引力的平衡点，严密监视着这个系统的剧烈活动。自打两万年前（指地球时间），易小白项目组提出了“躲开美杜莎”的办法并从理论上验证之后，后人用1500年时间才找到这个最合适的双星星系。之后，又花1.6万年时间乘飞船赶到这里。到现在，飞船已经在这儿守候了3000年。</p>
<p>从近距离观看，这儿的天象异常绚烂，漂亮得无以复加。时母双星的伴星是一个明亮的气态蓝巨星，而主星是一个小小的中子星。后者就像印度神话中的黑暗之神时母，以强大的引力贪婪地吞食着它的伴星。气雾从伴星上被撕裂，发着淡淡的蓝光，沿着一个长达数千万公里的弧形旋臂落向主星，在它周围变形为旋转的扁平的吸积盘。在这儿，气雾因压缩和摩擦而发热，升温到几百万摄氏度，蓝光变为明亮的白炽光，隐隐照出主星的轮廓。主星已经不发光了，但主星边缘，即气雾摩擦最厉害的地方，发射出强烈的x射线和y射线。</p>
<p>根据观测和计算，中子星塌缩为黑洞的临界时刻即将来到，该唤醒中子星上的“老祖宗”了。那是提前放置在中子星上的一个圆球，用中子制成，直径不过5厘米，但重量在1万亿吨以上。球内镂刻着精细复杂的电子通道。它其实是一个特殊的电脑，里面储存着老祖宗钱三才大脑中的所有信息。</p>
<p>船员们早就盼着这一天。1.6万年的旅途再加3000年的守候确实太枯燥了，现在他们渴盼回家，盼着看到地球的青山绿水——虽然这些美景谁也没有亲历过，只见于电脑资料或200多代船员一代代的口传（飞船中平均传代周期为90年）。现任船长NGC4258-徐耳干戈是钱三才的直系后代，他比船员们多了一些惆怅，飞船返回后，老祖宗就要独自留在这地老天荒之处了。</p>
<p>他启动唤醒程序，一束无线电波飞向中子星。</p>
<p>钱三才的意识慢慢浮出，挣脱了黏稠的黑暗。他醒了，但睁不开眼，听不见，手脚不能动，连说话也发不出声音。他努力聚拢意识思索着，这是怎么啦？我是在昏迷中，还是在噩梦里？</p>
<p>他的思维转化为无线电波，飞向太空中的飞船。无线电信号因强大引力产生强烈的畸变，但在飞船主电脑里经过自动校正，转换为略带沙哑的老人声音：</p>
<p>“这是哪儿？怎么什么都看不见。老伴儿！小白！亮亮！”</p>
<p>船长柔声说：“老祖宗您好，我在用思维波与您交流。”</p>
<p>“你是谁？”</p>
<p>“我是‘浪淘沙’号飞船船长，是您第209代玄孙，我的名字叫——现代命名法比较烦琐，您简单叫我小戈就行。此刻我的飞船位于时母双星附近，而您此时位于双星的主星表面。咱们离地球有2450光年。至于时间——现在寓您去世已经有两万地球年。”</p>
<p>钱三才的声音略有停顿：“小戈，这么说我已经死了，所以我不是我，只是我的石头脑袋？”</p>
<p>“是中子脑袋，但其中储存着您的完整意识，是在您去世10年前复制的，之后有少许补充。所以可以说您仍然活着。”</p>
<p>“我什么也看不见，太急人了，能不能开启视觉功能？”</p>
<p>徐耳干戈歉然说：“老祖宗，中子星的引力实在太强大了，只有全封闭的中子球才能勉强承受。我们无法为您安装眼睛、耳朵、嘴巴和鼻子。请您理解。”</p>
<p>钱三才沉默了，徐耳干戈在数千万公里外担心地听着他的心声。少顷，钱三才笑道：</p>
<p>“徐钢这臭小子！他到底没能实现我的要求。这能算啥头像？一个没有五官的圆球球！不过他们保存了我的意识，亏中有补，也算是履行了合同约定吧。”他疑惑地问，“你们为啥不把我留在地球，万里迢迢弄到这儿干啥？”</p>
<p>“老祖宗，说来话长，您听我慢慢解释……”</p>
<p>钱三才突然打断他：“噢，我想起来了！小白早就给我解释过，我还看过她那篇科幻小说。别慌，让我回忆一下。喂，小戈你先别说，看我自己能不能想出来。噢，我想起来了，小白是这样说的：为了把有关我的信息保存到150亿年后，为了躲开美杜莎无处不在的毁灭之眼，只能用一个办法。这个办法的关键，是要找到一个快变成黑洞的恒星。”</p>
<p>“对，我们找到了。眼前这个双星系统中，主星的质量和密度就非常接近于形成黑洞。”</p>
<p>“然后，趁它没有塌缩成黑洞之前——这时它和咱们宇宙还有正常的通道——把我的石头脑袋或电子脑袋，送到这个星球上。”</p>
<p>“对，我们在1000年前把您送去了。”他叹息道，“那可不是件容易的事，为了抵抗中子星的强大引力，不让您在降落过程中坠毁，我们可以说已经达到了技术的极限。”</p>
<p>“谢谢，让你们费心了。我接着说下去。小白说还得有一个条件：这颗恒星应该正在剧烈地吞食伴星，质量急剧增加，很快就会发生猛烈塌缩，形成黑洞。”</p>
<p>“对。按计算，时母主星的塌缩将在30天之内发生，所以我们唤醒了您。”</p>
<p>“但黑洞的塌缩只是对‘外面’而言，视界内一切照旧，我不会感到任何异常。黑洞闭合后内部时间接近停滞，所以我的电子脑袋不会衰老。但我个人并不能感觉到时间的停滞，在我眼里，时钟的秒表还在照样滴答滴答往前走。小白还说，按母宇宙的时间，恒星级黑洞的寿命一般不小于150亿年，所以‘洞内一滴答，世上百亿年’——这样就实现了我在那个合同中的要求。我说得对不对？”</p>
<p>“对，您说得都对。只是，”面对自己的直系祖宗，船长抑制不住伤感之情，“当黑洞的边界封闭之后，我们永远不会收到您的任何信息，不知道您是否安全，是否快乐，也无法把亲人的思念和母宇宙的情况向您通报。您同样无法向我们问好，无法得知地球是否健在，只能孤独地活下去，直到地老天荒。咱们一朝分手就是永别，各自生活在不同相的两个宇宙中，绝无重逢的机会。老祖宗，这是美杜莎的阴险报复，根本无法逃脱的——否则熵增定律就失效了。不，这道魔咒永远不会失效的，我们杀不死她，充其量只能在她的淫威下玩点小花招。”</p>
<p>“不必为我难过。既然这个要求是我自己提出来的，我已经做好了心理准备。”</p>
<p>“现在我交代一些琐事。您的电子大脑中，除您自己的意识外，还储存着海量的知识信息，有各种有趣的游戏，闲暇时您可以浏览，具体操作办法随后会自动显现的。您的大脑内配有核能源，它的寿命在黑洞中同样会近乎无限，至少在150亿年之内（指母宇宙时间）会正常工作，您不必担心。我们衷心希望您老在这150亿年中过得快活。至于您的‘后事’，即恒星级黑洞150亿年寿命之后的情景，还无法精确预测。据一种比较可靠的理论，恒星级黑洞一般会作为胚芽，发育成一个新宇宙。那么，但愿在新宇宙诞生的过程中，您的大脑完好无恙，一直保持着有序状态。那样您的中子脑就会成为新宇宙的文明之核，让宇宙演化从高起点上开始。”</p>
<p>“哈哈，那对我的虚荣心可是极大的满足。古来帝王算什么？我是新宇宙之祖！我的一千亿花得太值了。”</p>
<p>船长也笑了：“只有一点，很可惜的，您可别指望‘衣锦荣归’，您的赫赫威名绝对不会传到母宇宙来。”</p>
<p>“我的好玄孙，不必伤感。俗话说针没两头尖，世上事哪能十全十美呢。我把名声留到新宇宙就行了。”</p>
<p>“还有一件大事。其实您的中子脑袋里还储存有您家人的意识和人格，有您夫人、徐钢、易小白和您孙子亮亮，在复制您的意识那年，同时为他们做了复制。您的家人都签字同意，愿在150亿年的时间里陪您，就连亮亮也在成人之后进行了追认签字。但是，因为在原始合同中，只有您有权享受那个待遇——留名于150亿年后——所以是否让他们‘活到’中子脑里，必须征得您的同意。现在，如果您没有异议，我就对他们启动唤醒程序。”</p>
<p>钱三才的电子合成声音中透出笑意：“对，我记得这件事。亮亮那年三岁，他问大人们签字干哈，他妈妈说是等爷爷老得不会动时，大人们要到敬老院陪爷爷。当时亮亮缠着非要签字，说他也要去陪爷爷，给爷爷拿拖鞋、讲故事、捶背，最后让他按了个手印才满意。那个小东西。”</p>
<p>“我们都知道他小时候与您最亲近，连他妈妈、奶奶都赶不上。”</p>
<p>“没错，长大后也没变。不过他进入青春期后，对他父亲徐钢可是很叛逆的，就像徐钢对我那样。哼，也算是徐钢的现世报吧。”</p>
<p>船长笑着说：“这件事上我可不敢乱插嘴，他们无论哪个都是我的老祖宗，我不敢有不敬之语。那么——现在我就启动？”</p>
<p>“不，我当时就没同意这件事，现在也是如此。我不想让他们，尤其是三岁的亮亮，一辈子关在这个黑洞里。有我一人承受孤独就够了。”</p>
<p>船长小心地劝解：“您不妨想开一点，那只是亮亮的电子版。”</p>
<p>钱三才冷冷地说：“是吗？我也只是钱三才的电子版。”</p>
<p>“对不起，对不起，我说错话了，老祖宗您别生气。要不我先不启动，什么时候您变了主意，可以自己启动。在您大脑的‘帮助’栏中载有启动说明。”</p>
<p>“不，我怕的就是自己会改变主意，现在你干脆把他们的意识删除，永久性删除。”他微笑着说，“小戈你不用为我担心，单凭咀嚼我对亲人的回忆，我就能度过150亿年。”</p>
<p>船长犹豫着，想劝，没有敢开口，在钱三才再次强令下，狠下心输入了删除程序。然后他说，飞船会一直泊在这儿，继续与老祖宗对话，直到黑洞的视界关闭。此后双方一直进行着对话，天南地北地闲聊着。钱三才的中子脑袋不用休息，飞船船员们就轮班和他聊天。双星系统的吞食活动仍在进行，引力造成的信息畸变也越来越重。慢慢地，钱三才不再能听到船员们的声音，他听到的最后一句话是船长的：</p>
<p>“老祖宗，……宗！祝……长寿……”</p>
<p>钱三才呼唤对方，但不再有回音。看来视界已关闭，黑洞内的无线电波再也发不出去了。视界外的电波倒是应该能传进来，但已经被剃光毛发（指失去任何信息），他只能接收到一片白噪。他不死心，隔一段时间就呼唤一次。直到某一刻，他突然意识到，虽然他的感觉没有异常，但黑洞内的时间（相对于视界外来说）应该已接近停滞。也就是说，在他的一声呼唤中，外面已经过了1万年、100万年，甚至100亿年。“浪淘沙”号飞船肯定早就离开这里，返回地球了。现在，太阳变红变大了，碧水蓝天的地球被红巨星吞噬了，整个宇宙开始陷入混沌了……</p>
<p>只有他，钱三才的电子版的意识，那个宇宙中仅存的信息团，躲过了美杜莎毁灭一切的魔眼，存活下来。他赢了，易小白他们赢了，或者说人类文明赢了。当然他最终也没躲过美杜莎的阴险报复，因为他终生面临着双重禁锢，第一重是直径5厘米的完全封闭的中子球，第二重是这个恒星级黑洞。他逃过了那边的毁灭，却掉进天地中最可怕的监牢。</p>
<p>这么说，两边斗到底，只是扯了一个平手。他笑着摇摇头（想象中的摇头），不再想这些费脑筋的事了，转而翻检中子大脑资料库中的亲切记忆，妻子的，儿子的，小白的，亮亮的。在记忆中亮亮仍然三岁，正是最讨人爱的年龄，亮亮妈也娇艳如昔……正像他对那位玄孙船长说过的，他将咀嚼着这些记忆，打发150亿年的岁月。</p>
<hr>
<div class="justify-center flex"><p class="italic">03</p></div>
<hr>
<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>
<p>“就是嘛。说正经事吧，定哪家酒店？”</p>
<p>“别慌。小白，你刚才说是哪年的银河奖？”</p>
<p>“去年的啊。”</p>
<p>“那你哪年和徐钢结的婚？你不是说工作太忙，三年内不要小孩吗？”</p>
<p>“哎哟——我知道你是在琢磨哈了，爸爸你真要笑死我了！亮亮，你爷爷老糊涂了，他怀疑你还没生出来呢。哈哈，妈你快过来，我爸竟然怀疑亮亮还没有出生！”</p>
<p>“小白！别大喊大叫，我认输还不行吗？就算是我糊涂了——哼，糊涂也不是我糊涂，是你们设计的那个中子脑变混沌了——哼，我哪儿是糊涂，我刚才只是和你们开玩笑！来，亮亮过来，我知道你是真亮亮，我也是真爷爷。咱俩商量一下，到底挑哪家酒店？”</p>]]></content:encoded>
            <author>rexwangcc@gmail.com (Rex Wang)</author>
        </item>
        <item>
            <title><![CDATA[年终总结 | 2024]]></title>
            <link>https://rexwang.cc/articles/2024-eoy</link>
            <guid>https://rexwang.cc/articles/2024-eoy</guid>
            <pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<img alt="" loading="lazy" width="11656" height="4302" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Feoy2024.6eafa2ac.jpeg&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Feoy2024.6eafa2ac.jpeg&amp;w=3840&amp;q=75">
<p>白驹过隙，又到了写每年写年终总结的时候，今年换了一个思路，打算把总结放在公开的地方（aka 我的博客上）；一来是发现维护各种数字信息的精力渐渐变得有限，我希望通过减少需要管理的平台和工具来给自己减负 (最近几年也深刻地认识到认知减负在 coding 甚至所有领域都是很重要的，见 <a href="https://minds.md/zakirullin/cognitive">Cognitive load is what matters</a>)，二来也是希望借此倒逼自己的写习惯，重新培养一下公开输出内容的能力，如果有读者偶然路过，且花了一点时间读完，希望对你来说不至于是浪费时间。</p>
<h2>1. 关于旅行</h2>
<p>我一直认为，人的思想和身体总需要有一个走在路上来保持适当的活力，所以总是坚持 push 自己 （&amp;&amp;队友）去定期/非定期地旅行；回顾今年的脚步，在空间上走过了很多地方，甚至有很多城市和地区的面貌是我前所未见的：</p>
<ul>
<li>三月份在雅加达进行了深度的 city-walk</li>
<li>5 月在新西兰环绕整个南岛进行了一次自驾 road trip，也是我首次在 left hand drive 的地区进行长途自驾</li>
<li>7 月走遍了伦敦、南法、西班牙，徒步了白崖和蔚蓝海岸的高山，漂流了凡尔登大峡谷的溪流，也逛了心心念念的阿尔罕布拉宫和普拉多博物馆</li>
<li>整个 8 月的白天和夜晚都在巴黎参加马格南图片社的摄影学校课程并制作第一部自己还算满意（并被马格南摄影师们认可）的摄影作品</li>
<li>10 月在九州岛跑了火山温泉，做了玉手箱小火车，吃到了正宗的博多拉面，回来又去烟台跑了一个迷你马拉松</li>
<li>11 月去上海溜达了一圈听了藤井风的演唱会，12 月份又跑了一趟天津见老朋友们</li>
</ul>
<p>这么想来，好像一整年都在路上，除了让我保持对世界的新鲜感之外，也帮助我打破了一些固有的认知局限，甚至在这之前，很多时候我没有认识到局限本身的存在。</p>
<p>长期生活在英语世界里，不知不觉中形成了一种思维定式 —— 无论是考虑潜在市场还是规划旅行目的地，总是习惯性地把中美 （or 美中，anyways）两国放在首位。直到在法国度过的这个夏天，和来自欧洲各地的朋友交流，才让我意识到这种思维的局限。世界很大，除了中美之外，还有太多值得探索的可能性，无论是生活、创新的机会，还是工作。（当然，从现实的角度来讲，tech 领域最先进的人才、创意和 funding 确实还是更集中在中美，特别是后者，最近几年来，日本有一些不错的苗头，这个趋势还有待观望）</p>
<p>雅加达和九州的旅行很有意思，前者像是我所感知的中国的过去，充满了包括人口、交通、基础设施等各种各样的问题，但是人们充满了一种在国内，即使是年轻人中都已经不再常见的对于生活本身的热情和对未来的向往，后者似乎像是一个发展中国家“期许的”未来，大部分社会运转机制都有这良好的规则，环境优美，亲近自然，基础设施完善，但是作为一个社会最重要的人，不仅人口本身流失严重，更似乎少了一些对未来的憧憬。我似乎能想象自己作为一个数字游民游走在东南亚的生活，但也似乎享受在类似日本这种基础设施和服务业发达的社会养老的生活。开始思索这一切的背后，自然是年过三十、职业发展中期带来的一种对未来规划的焦虑和思考，无论如何，找回了思考这种”思考“本身的能量和时间，已经让我颇为惊喜了。</p>
<h2>2. 关于意义和使命感</h2>
<p>23 年底的时候就和自己聊了聊 AI，可能被从 RNN/CNN/GAN 时代留下来的对 AI-hype 先天的悲观和保守影响吧，今年的 AI 生态（toolchain、infra、垂类 AI 的）发展远远超出了超出了我当时甚至最乐观的预期，但是在”落地” 或者说 AGI/ASI 上好像又真的撞到了墙一样，没有 LLM 或者更精确地说 ChatGPT 问世之初给我带来的 mind-blowing 的震撼（<em>当然我不否认 o-3、deekseek、Evo、Cursor、Sakana、11x、WorldLabs… 这些工作或者平台的创意和实现在各自的领域或者横向比较都是让人惊喜的，也不认我浅薄的行业认知能够触及到所有工作或者我提到的工作的前瞻性，此句手动保命</em> :P ）。</p>
<p>今年聊 AI 前可以先聊聊生物或者说生物行业。我自认为除了在生活上拖延一些，大多数时候还是一个知行合一的人，家庭的背景加上我对生物的兴趣让我在当年实习 Bloomberg / Pfizer 二选一的时候就选择了后者，后来在生物行业里相当正面的行业经历让我对 bio/pharma/bioinformatics 甚至扩大到对 NPO/基金会的工作产生了一种”白月光“的印象，这同时养成了我后面找寻新的机会或者职场发展的时候把“意义感”或者说“使命感”放在了很重的位置，回过头看，这一方面给予了我在一些领域无与伦比的热情和能量，另一方面，也让我对很多事情失去了该有的判断和行动力。</p>
<p>进一步说，通过深度参与/面试/coffee chat/阅读等方式或深或浅地了解了包括法律、生物、教育、旅行、能源等行业在内的 AI 应用来看，即使会有短期的波动，无论中美，各类垂直行业 AI 的发展在可预见的未来都会是不可逆的，比起去思考我做的 infra 是不是高可用的、不复用有什么意义、这个领域有什么意义…. 等一系列问题，在一个无论如何都会计入史册的时间段（也许不仅仅是 AI，还有已经进入周期的衰退，生命科学/能源突破的前夕）尽力在世界上打出一点水花，本身就已经很有意思了。在这一点上，gap 这段时间确实让我更深刻地思考了这个问题，”能去做“ over ”做不做有没有意义“可能是未来很长一段时间里我会秉持的态度，毕竟，也许人生最大的意义就是接纳毫无意义这个事实呢？（好吧，说句人话，与年初的认知相反，短期的未来我个人会看空生命科学/新能源/AGI 并看多 web3，长期则相反，并尽一切可能 all-in 看好的机会）</p>
<h2>3. 关于摄影</h2>
<p>今年离开既定的 career path 去 all-in 探索的最大的事情就是摄影了，从十多年前用 600D 开始拍第一张照片的时候就开始享受作为”快门背后的低存在感的旁观者“（大卫·霍恩喜欢的描述） aka 摄影<del>师</del>爱好者的那种捕捉美、创作和记录的纯粹的感觉，所以得知能够在马格南图片社 (<a href="https://www.magnumphotos.com/">Magnum Photos</a>) 参加一个月的暑期课程的时候（曾经怀疑过它这个作品集筛选机制，不过鉴于同期学员的水平之高，我感觉还是可以自信点儿）几乎是毫不犹豫地就参加了，当然，我是带着很多很多问题去的：</p>
<ol>
<li>
<p>布列松提出并实践的“决定性瞬间”，到底是否还适用与当今世界和人文环境？如果是，我们应该怎么解读这一点？或者，我们甚至是否应该学术性、机械性地尝试解读它以及各种“机械的定义”？</p>
</li>
<li>
<p>私以为，学习任何事情性价比最高的方式就是观察这个领域最顶级的人群是如何工作的，那么在马格南图片社切身观察顶级摄影师的工作流之后，我是否应该、或者可以成为一个全职摄影师呢？</p>
</li>
<li>
<p>拍摄单张和拍摄主题（shooting the single picture v.s. the picture essay）都应该如何实践？</p>
</li>
<li>
<p>摄影到底是什么？在技术发展到今天的地步，它还有哪些意义？</p>
</li>
<li>
<p>…</p>
</li>
</ol>
<p>我想，当我和亚琛工业大学毕业的勇敢的「全职摄影师，机械师、康师傅」在穿梭往返于物业巴黎的地铁、“危险的”圣丹尼斯、蒙马特高地的时候，当我和巴黎偶遇的战地摄影记者 <a href="https://www.mathiasheng.com/">Mathias Heng</a> 在巴黎街头学习”高阶“街拍技巧、当我被马格南导师 <a href="https://www.magnumphotos.com/photographer/newsha-tavakolian/">Newsha Tavakolian</a>、<a href="https://www.magnumphotos.com/photographer/lua-ribeira/">Lúa Ribeira</a>、<a href="https://www.magnumphotos.com/photographer/peter-van-agtmael/">Peter van Agtmael</a> 从最开始的批评地一无是处 — “your photos are lifeless to me” 到最后认可为 “your project is full of creativity and emotions, they are alive”时，当我当面对神交已久的彩色叛逆大师 <a href="https://www.magnumphotos.com/photographer/harry-gruyaert/">Harry Gruyaert</a> 对谈提问、当我在马格南图书馆亲眼看到 <a href="https://www.magnumphotos.com/photographer/elliott-erwitt/">Elliott Erwitt</a>、<a href="https://www.magnumphotos.com/photographer/david-hurn/">David Hurn</a> 等前辈的佳作展览甚至底片时、当我深度了解了摄影行业的排版、选题、制片、印刷等流程、当我在巴尔扎克故居请老潘帮忙对项目的排版做建议的时候、当我看到同期来自 NYC 的学员给珠宝行业拍摄的项目的时候、当… 我想我已经有了一些答案，正如 《On being a Photographer, a Practical Guide》所写，”的确，这是一本关于摄影的书 — 但摄影是关于人生的“，我清晰地认识到，我可能在相当长甚至全部的人生中都很难作为全职摄影师去生活和创作（<em>在当下，很多马格南摄影师也很难有充分的自由尽情地创作个人项目</em>），但是我希望继续健康地坚持这项爱好，或者说创作。</p>
<p>作为一个之前不那么忠实（纯从收听时长来说）的听众，我有幸能和老潘、其他伙伴能够一起开始 build <a href="https://www.xiaoyuzhoufm.com/podcast/63e742b078ae5a9dfc7e55b8">「Photo Reason」</a> 这个泛摄影内容品牌，在接下来的一年或者 N 年中，一起实践、探讨并认真用行动来回答关于摄影的种种问题。</p>
<h2>4. 关于职业发展和至今为止的探索</h2>
<p>有意思的是，纠结了很久之后，今年还是 endup exitting 了一起摸爬滚打，从头成长起来的、甚至一切已经近乎习以为常的 team/startup/runway，就像离开我的第一份工作那样，也许归根到底没有什么能够 articulate 出来的 reason A / reason B / reason C… 对于自己能 contribute 的事情变少、慢慢对于带队或者 allocate 大量时间在重复且渐渐失去能量的事情上，再叠加上对于天时地利人和的和解和认知，最终让我迈出了这一步，当时—直到现在的心态，似乎可以用 Naval 一句很 “PUA”的话来总结和描述：“Be a creator and you won’t have to worry about jobs, careers, and AI.”</p>
<p>当然，sabbatical/gap 期间，秉持我闲不下来的风格，还是 stretch 了自己去尝试了几件事儿：</p>
<ul>
<li>
<p><strong>摄影</strong>：这是我今年最意外自己会去 all-in 的一件事儿，当然除了结果算让自己满意之外，也真正让我得到了心理上的休息，上个段落有提过，此处就略过了</p>
</li>
<li>
<p><strong>尝试 relocate 回湾区/生物行业</strong>：这件事对我来说是“找机会容易”、“长期看好” 但是短期试错和生活成本巨大的事情，在美国大选+生物行业整体低迷的情况下，我其实没有想到生物行业，即使是 AI + 制药的 top VC back 的全明星 startup（Google Brain 背景那种，哪家我就不提了）也会面临谈好的 offer 转岗/职责调整、整个公司级别的收缩、 re-org 的动荡局面的，考虑到宏观形势、家庭和已经可以看到的会持续几年的整体的行业的低迷和不确定性，最后思来想去还是"友好协商地"撕了 offer 暂时放弃了这条路</p>
</li>
<li>
<p><strong>尝试找找 global remote 的打工工作</strong>：在这个时间点还继续找打工工作不否认是为了取悦自己（的求稳的那部分倾向）和"父母"（我认知中的），在不必须背负短期经济压力的前提下，其实主要还是对自己其他尝试不够自信，想找 backup plan 的心态作祟，说到底，人还是需要一些正反馈才能持续走下去，global remote 的好处是可以体验一下所谓 “digital nomad”的生活，看看时间相对自由安排的环境下，能不能找到一些 WLB 或者有余力 focus 在想探索的路上，不过目前的数据和情形比较悲观，目前的计划是给自己一个 deadline，这之前如果没有 match 的机会，就暂时放弃这条路了：</p>
<ul>
<li>海投 90+ 和内推 10+ （是的，我在探索这条路的过程中被迫变成了 J 人…）的结果是个位数的面试和 3-4 + 面试轮次后的 rejection，大概 1/300 的竞争激烈程度</li>
<li>粗略估算 70% 的 global remote 是 web3-only（趁此机会也了解了一下这个行业，去除了我以前的一些偏见，但对是否肉身进入这个行业依然相当犹豫）</li>
</ul>
</li>
<li>
<p><strong>实体/做生意</strong>：探索了一下追关键词、追流量 + 实体的方向，aka 入境游、工具站、独立站等，这个事儿目前看会是比较长期且长尾效应严重的工作，因为合作的朋友比较靠谱，我计划一直做下去，看看能有什么反馈，毕竟我的认知之一就是经济下行的节点，与其在稳定环境吃少到可怜的 β，不如趁着试错成本低，多去看看平时很难真正花精力去做的方向，这可能也是为啥我很难下决心回去读个 PhD 的矛盾根源？</p>
</li>
<li>
<p><strong>独立开发/外包</strong>：蛮有意思的是我虽然心水独立开发，厌恶外包（厌恶的实际上也许是胡乱指挥的外行甲方，幸运的是目前的甲方大多数既专业又善于沟通），但是在今年的 diversified income 中，前者成为了 cost-center 而相应的，后者成为了主力，也是我 gap 期间正反馈的重要来源之一；非要反思起来，还是归结为自己发现需求的能力不足，需要借助靠谱的 BD 前辈的原因吧；不过临近 2024 的尾声，独立开发的项目反而有了慢慢有了更好的反馈，新的一年希望还是能做下去看看结果</p>
</li>
<li>
<p><strong>PhD</strong>：看了一些 PhD programs，包括岗位制和全职研究相关的项目，总体还是没有让我动心到 relocate 去 all-in 的，归根到底，算是一个取悦自己和”父母“（现实中的）的试错/尝试吧；（多说一句，其实类似 Sakana AI 这种 research group 相当有意思且有吸引力，但是工作日语果然还是 もういい…）</p>
</li>
<li>
<p><strong>开源</strong>：心有余而力不足，太长时间没折腾了，这条路没怎么尝试，不过还是给 2025 规划了一部分时间在开源社区逛逛，有一说一，跌宕起伏的创业之路走完之后，开源社区的节奏和合作模式确实需要我再适应一段时间</p>
</li>
</ul>
<p>写到这里其实和职业发展没啥关系，可能潜意识了已经认定了“careers”这东西往后十年有没有还是一会儿事儿呢，说服自己再去爬 laddar 好像毫无意义？不由感叹一句，也许某 JIN 姓友人说的不错，我可能会被一时的新奇感影响而去不断尝试各种各样的事情，把自己折腾地累得够呛，但是到头来，还是作为一个 ic engineer、不带人、不用去追各种流程，低头写写代码最能让我找到内心的平静… 了吧？</p>
<h2>5. 最后瞎聊几句</h2>
<p>我一直不太信任自己对宏观形势和未来的判断，可能有一部分原因是来自于我性格底色上偏向 “listener/coordinator” 而非 “decision maker” 的倾向，但今年还是想多聊一句，权当明年今日的笑料吧。</p>
<p>记得年初的时候，在和同事的讨论中得出一个略显粗糙的观点 — "这次 AI hype 无论 AGI 结果如何，都很有可能会取代一大部分初级脑力劳动工作者，只不过当时我和参与讨论的同事的分歧在于如何定义"初级脑力劳动者"— 是像工业革命中被淘汰的纺织工、马车夫等初级体力劳动者那样的初级程序员、法院助理、文字工作者么？也许不仅仅如此，可能在还未到来的 AGI 的定义里，一切脱离实体的逻辑性工作者都可以被认为是"初级的"，包括但甚至不限于 Software Engineers、Computational Scientists, … 等目前意义上的"高级工种"，可能性更大的也许是像过去几十年中的无数次类似的 lambda waves、AI hypes 一样，在某一个节点 LLM 撞墙、发展陷入停滞；无论走向如何，即使是利用已有的工具和算力，在能源危机没有大规模出现之前的今天，超级个体和"公司"这种商业结社的各种不同的变体和形式都已经越来越多了；以前头铁会有点 ego / 社会达尔文主义，总觉得有条件的话无论个体还是组织，肯定要发展成 Wayland （除去作为反派组织）那样的巨头来拓宽人类文明的边界，即使代价是我们的未来成为类似银翼杀手/异形那样的世界，但今年以来，我认识到，也许一个个小而美的超级个体们组成的网状协作群才是更好的未来。</p>
<h2>结 | 2025</h2>
<p>回顾了一整年，好像 2025 年又变得“会相当<strong>充实</strong>”且“<strong>迷茫</strong>中需要不断探索”了起来，有所长进的更多的是自己与自己在人生规划、意义感、FOMO 等事情上的放下与和解。</p>
<p>写下这句话的时候，一周内的空难创下了记录，海恩法则似乎预示着水面之下潜藏了更严重的问题；在如今的世界，也许”<strong>愿世界和平，各位读者和家人朋友平安喜乐</strong>“不再是一句虚伪的祝福；也希望大家在各自探索人生的道路上即使遇到风浪也能开心、无恙前行。</p>
<p>以上洋洋洒洒几千字，作为笔者对自己的 2024 年一点絮絮叨叨的总结吧。</p>
<p><em>（全文没有使用 LLM 润色，各种文不达意见谅）</em></p>
<hr>
<p>补充一句，30 号发上来之后有朋友过来关心，觉得我是不是有什么想不开的，读出了焦虑，感谢关心，不过还是在这里澄清一下，因为本文主要是流水账式地记录，写着写着文青病犯了就不知所云了，列几个我今年对自己比较认可的成就数字作为结尾吧：</p>
<ul>
<li>走过了 8 个的国家/地区</li>
<li>拍摄了 20,000+ 单张照片和组图</li>
<li>在摄影圣殿马格南图片社圆满完成了一次课程</li>
<li>算外包项目在内，业余写了 5+ 个正经 web2 网站，总访问量 100,000+</li>
<li>开始独立开发，不算主页和外包副业收入 $200+，少的可怜，但是在“挣钱能力上” 实现了零的突破</li>
<li>开始参与和尝试 2 个实体生意，算是对“做生意”这件事儿有了初步的了解</li>
<li>算黑神话在内终于打完并享受了 2+ 三 A 游戏</li>
<li>年跑量突破 100km</li>
</ul>
<p>看上去微不足道，但是对我来说，在跨越各种虚无的障碍的过程中，都是些值得纪念的数字。</p>]]></content:encoded>
            <author>rexwangcc@gmail.com (Rex Wang)</author>
        </item>
        <item>
            <title><![CDATA[Issues with React 19, TailwindCSS v4, and NextJS]]></title>
            <link>https://rexwang.cc/articles/2025-issues-with-tailwind-v4</link>
            <guid>https://rexwang.cc/articles/2025-issues-with-tailwind-v4</guid>
            <pubDate>Mon, 17 Mar 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<img alt="" loading="lazy" width="2048" height="1366" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcover.a8a58766.webp&amp;w=2048&amp;q=75 1x, /_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcover.a8a58766.webp&amp;w=3840&amp;q=75 2x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcover.a8a58766.webp&amp;w=3840&amp;q=75">
<h1>Some background</h1>
<blockquote>
<p>The first person who ate crab was truly brave. They looked at this armored sea creature and thought "Yes, I'm going to crack this open and eat what's inside." That pioneering spirit is what we need when tackling new technologies.</p>
</blockquote>
<p>I'm working on a project that uses React 19, TailwindCSS v4, and NextJS 15 (canary stable). While I have the OCD to always be using the latest stable versions of everything, I recently ran into an issue that I hadn't encountered before, mainly because I've been using TailwindCSS v3 for a while and V4 had a dramatic breaking change. I decided to keep this post an open and continuous note to myself and whoever struggles with the same issues for future reference.</p>
<p>Oh, one more thing, since I enjoy "vibe coding" recently, based on my shallow observation, a lot of issues have come from the fact that Cursor is not able to keep up with the latest version of the codebases.</p>
<h2>The TailwindCSS v4 Issues</h2>
<h3>1. use @reference over @apply</h3>
<p>In TailwindCSS v4, everything has come into <code>global.css</code> from the previous <code>tailwind.config.js</code>, and Cursor and some other "LLM-aid IDEs" have this intentions to use:</p>
<pre class="language-css"><code class="language-css"><span class="token atrule"><span class="token rule">@layer</span> base</span> <span class="token punctuation">{</span>
  <span class="token selector">*</span> <span class="token punctuation">{</span>
    <span class="token atrule"><span class="token rule">@reference</span> border-neutral-200 <span class="token property">dark</span><span class="token punctuation">:</span>border-neutral-800<span class="token punctuation">;</span></span>
  <span class="token punctuation">}</span>
  <span class="token selector">body</span> <span class="token punctuation">{</span>
    <span class="token atrule"><span class="token rule">@reference</span> bg-background text-foreground<span class="token punctuation">;</span></span>
    <span class="token property">font-feature-settings</span><span class="token punctuation">:</span> <span class="token string">"rlig"</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">"calt"</span> <span class="token number">1</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>which will lead to the error <code>Cannot apply unknown utility</code>:</p>
<pre><code>Error: Cannot apply unknown utility class: border-border
</code></pre>
<p>The solution is to simply use <code>@reference</code> instead of <code>@apply</code>, to avoid shadowing TailwindCSS generated classes.</p>
<h3>2. Build failures (on Vercel)</h3>
<p>I personally use a macOS for development, so some issues can only be caught on Vercel, at build time. This time I run into a new issue saying:</p>
<pre><code>Can't build on Linux ARM -&gt; cannot find module '@tailwindcss/oxide-linux-arm64-gnu'
Cannot find module '../lightningcss.linux-x64-gnu.node
</code></pre>
<p>After some digging on <a href="https://github.com/tailwindlabs/tailwindcss/issues/15806">Github</a>, it seems like we need to add optional dependencies to <code>package.json</code> and reinstall the dependencies:</p>
<pre class="language-json"><code class="language-json"><span class="token property">"optionalDependencies"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token property">"@tailwindcss/oxide-linux-x64-gnu"</span><span class="token operator">:</span> <span class="token string">"^4.0.14"</span><span class="token punctuation">,</span>
    <span class="token property">"lightningcss-linux-x64-gnu"</span><span class="token operator">:</span> <span class="token string">"^1.29"</span>
<span class="token punctuation">}</span>
</code></pre>]]></content:encoded>
            <author>rexwangcc@gmail.com (Rex Wang)</author>
        </item>
        <item>
            <title><![CDATA[《674 号公路》]]></title>
            <link>https://rexwang.cc/articles/2025-route-674</link>
            <guid>https://rexwang.cc/articles/2025-route-674</guid>
            <pubDate>Tue, 09 Sep 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<p>本篇《674 号公路》是我中学时期在「科幻世界」杂志上最喜欢的短篇小说之一，作者长铗也一度成为我长期关注的青年科幻作家。有意思的是，我在十多年后机缘巧合之下进入到了最前沿的人类基因与药物发现领域，自己参与的项目获得了「Cell」、「Bioinformatics」等多个顶级期刊的收录，也算接触了小说中提到的所谓手性对称与蛋白表达等概念，而长铗则进入了 Web3 领域在币圈叱咤风云，也算是以身践行了他当年的「走在时代前列」的预言。想起这篇小说，特此摘录，如有侵权请联系删除。</p>
<img alt="" loading="lazy" width="3824" height="2149" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Froute674-cover.5242915d.webp&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Froute674-cover.5242915d.webp&amp;w=3840&amp;q=75">
<p>“嗨，伙计，去过674号公路吗？”红头发一条腿搭在保时捷敞篷车车门上，一只手在一个姑娘身上游走。</p>
<p>　　674号公路？外乡人露出迷惘的神情，轻轻抽着鼻子，似乎不习惯尘土里弥漫的橡胶焦煳味。</p>
<p>　　“啊哈!他居然不知道674号公路!”红头发怪叫一声，他的同伴应声发出刺耳的唿哨。红头发在姑娘丰腴的屁股上拍了一下，以印度仪仗兵一般夸张的姿势一脚踩在油门上。保时捷喷出一股黑烟，两条深深的辙印像蛇信子般迅猛窜出，汹涌的尘土扑打着外乡人的车窗。</p>
<p>外乡人缓缓摇上车窗，打开车内唯一的电子设备：美国卫星地图。手指在屏幕上轻叩，轻松地找到了那个模糊的标记：卡里寇。若不是一百七十英里外那个著名的白银矿，这个小镇也许早已从地图上消失了。</p>
<p>　　这里没有连锁店，没有大公司开的煤气站，没有几乎遍布美国每个小城镇的快餐分店，没有沃尔玛，没有得克萨科加油站，没有壳牌石油公司，没有麦当劳和伯格金，也没有玩偶盒商店。这儿就是卡里寇。</p>
<p>　　外乡人走进小镇唯一的一家酒吧"拓殖者之家"，里面喧闹的气氛顿时安静下来。酒鬼们把目光投向他，他们大多是矿工的儿子，目光就像探照灯般灼亮。外乡人脱掉他的皮外套，交给门口的侍应生。像是老顾客般径直朝吧台走去。德·丽尔夫人就站在吧台后面，她每天晚上都在这里，这儿的每个人都知道她，那些匆匆过客也惦记着她，还把她的芳名远播他乡。没错，她就是卡里寇最引人注目的存在：酒吧的老板娘。</p>
<p>　　"我想，你一定知道杰克·汉弥尔顿的故事，小姑娘。"外乡人抿出老到的微笑，他有一个棱角分明、泛着钢灰色的坚硬下巴。</p>
<p>　　"哈，他居然叫我小姑娘！不过，老娘喜欢这个称呼，"德·丽尔夫人环顾左右，夸张地向她的顾客们炫耀她的新昵称。男人们敌意的目光射向外乡人，这里面包括那个红头发，外乡人一进门就被他盯上了——那个不知道674号公路的愣头青居然敢来"拓殖者之家"！</p>
<p>　　"当然，这方圆五百英里之内的陈芝麻烂谷子我全知道。说吧，帅哥，你想听哪一段？"德·丽尔夫人摇曳着腰肢，玻璃杯里的红色液体漾了出来，有几星泡沫洒到了外乡人的脸上。</p>
<p>　　"674号公路。"外乡人一字一顿地说。</p>
<p>　　"哦，又是674号公路，每一个远道而来的小伙子都要听这一段，就像没断奶的孩子围在祖母的膝下要听格林童话。"老板娘故意提高声调让周围的人都能听到他们的交谈内容。男人们露出鄙夷的神色。的确，674号公路追捕的故事早已传遍远方，只有那些开着红色法拉利拉风的毛头小子才会兴冲冲地打听这些。</p>
<p>　　十九世纪下半叶，美国西部淘金热热气未消的时候，在南加州的东部，又传出了发现银矿的消息。而且据说银蕴藏量十分丰富。1881年3月的一天，三个探矿的人来到卡里寇安营扎寨，他们要在这里试一试运气。一天、两天、三天过去了，他们一无所获。第四天，随着一声欢呼，卡里寇的光辉历史拉开了帷幕。矿工们在这片赭红色的干燥土地上建立了三个小镇，卡里寇是其中最大的一个。卡里寇在英语里是粗印花棉布的意思，因为这里的山峦就像姑娘们的印花裙子一样漂亮。三个大型银矿、硼砂矿分布在三个小镇周围，从每个小镇到任一个矿山都有一条路况不佳的公路连通，一共九条，构成这荒凉之境的交通网。</p>
<p>　　674号公路是九条公路中的一条，它连接了卡里寇和最大的那个矿山：白银谷。这条路为什么叫674号公路呢？这个数字并不是美国公路交通网的顺序编号；也许是为了纪念某个棒球明星的本垒打纪录，天知道。但有一点是可以肯定的，这是个不祥之数。在这短短一百七十英里长的公路上，发生的交通事故难以计数，甚至，它从建成的第一天起就被废置了。第一辆通过它的是一辆运砂车，人们还来不及称颂它在修建公路中的功勋，它便不争气地滚到深不可测的大峡谷里去了，于是人们相信这条沙石路是被魔鬼诅咒过的。有传说称印第安人的祖先沉睡在这条路下，他老人家打个哈欠就能把道奇卡车吹上天。住在卡里寇镇的矿工们要去白银谷，宁愿绕道走其他的路。</p>
<p>　　但是，真正使674号公路声名远播的，是三十年前那场惊动CNN的荒野大追捕。美国第153号通缉犯——赛车手出身的杰克·汉弥尔顿，在五十辆警车的驱赶下，发疯般冲进了674号公路。警察们得意洋洋地看着他们的猎物绝尘而去，没有追赶，而是在674号公路与其他几条公路的交叉口设了路障，在公路两头的白银谷与卡里寇镇张开口袋，然后，警长先生就带领他的手下到"拓殖者之家"喝酒去了。</p>
<p>　　“他会后悔的，他会吓得尿裤子，当他看到满路的汽车残骸……”警长向酒吧里的所有观众如此宣布。</p>
<p>　　但是，后来后悔的是警长：杰克·汉弥尔顿在这条盲肠一样短的窄小公路上消失得无影无踪，蜿蜒在大峡谷边沿的674号公路，除了几个分岔口不可能有其他的出口，但是在路障处守候的警察却一无所获。有个蠢蛋发誓说自己听到了呼啸而过的引擎声，那剧烈的声波甚至吹动了他猪鬃一般粗的眉毛，可他却连个汽车影子也没见着。杰克·汉弥尔顿驾驶的是一辆1953年制造的克尔维特，黑色车身漆配以抛光处理底辐式车轮，嚣张的折叠式车顶就像响尾蛇的毒牙一般伸缩自如。搭载7.0升V8引擎，高达500马力的最大输出马力与550牛米的扭矩令人瞠目。这辆速度怪兽是"通用"汽车设计大师哈里·厄尔的失败作品，只推出了三百多辆便被迫停止生产，因为它暴烈的脾气、复杂而别扭的操控性能、单薄的安全系统令人望而生畏——杰克·汉弥尔顿却对它情有独钟。按理说，杰克·汉弥尔顿驾驶着这样一辆奇特的车逃亡天涯应是很引人注目的。但他的确是连人带车蒸发了，直升机把这块巴掌大的满目疮痍的土地搜寻了个遍，最后悻悻而归。警长只好向追踪而来的失望透顶的CNN记者宣布，那个坏蛋被大峡谷吞没了，连个响屁也没闻着。</p>
<p>　　"这还不是故事的全部。"老板娘慵懒地喷了口酒气，脸上泛出红潮，几颗雀斑在红潮里若隐若现。她说，"最精彩的一段不属于杰克·汉弥尔顿那个疯子，而是阿弗莱·切。当然，不是每个人都能像我这样亲昵地叫他切，你懂吗，帅哥？"</p>
<p>　　"切？那个拙劣的赛车手阿弗莱·切？"外乡人讥诮道。</p>
<p>　　老板娘愠怒地扫了他一眼，"你懂什么，毛头小子！切是他那个时代最伟大的赛车手，没人能比他更优秀！他是唯一跑完674号公路全程的人，我见证了他的辉煌！"</p>
<p>　　外乡人把宽大的手掌放在德·丽尔夫人的手上，安抚她胸脯内波涛起伏的激动情绪，“慢慢说，我洗耳恭听。”</p>
<p>　　德·丽尔怔怔地打量着外乡人骨节粗大的手指，目光柔和地笼罩在他壮硕的脖颈上，微微一笑："你也是个行家，小子。赛车手需要健硕的体魄，急转弯时脖子需要承受五倍于自身重量的离心力。切常给我说一些赛车常识，但我常记不住，哈哈。那时我还是个小姑娘，他把我塞到他的赛车尾厢内，他说没有姑娘敢坐在他旁边，他要让我清醒着见证他越过674号公路。他做到了！我虽然藏在车尾厢里，身体被绳子牢牢固定着，但还是吓了个半死。小子，坐过过山车吗？虽然你眼睛闭着，但你还是能感觉到那种忽上忽下、心仿佛要从胸口冲出般的惊心动魄，不是吗？"</p>
<p>　　“我好奇的是，既然你待在车尾厢里，你怎么知道他不是在别的什么马路上兜了一圈呢？”</p>
<p>　　“你怀疑他？”德·丽尔夫人的目光变得严厉起来。</p>
<p>　　"不是，我只是觉得这个世界太荒谬了。如果阿弗莱·切是纽格博林十二小时耐力赛纪录的保持者，他还全程跑完过魔鬼之路674号公路，那他怎么会在亚利桑那州宽阔的高速公路上飞出他的挡风窗玻璃呢？要知道，在那次交通事故中，他负全部责任。"</p>
<p>　　"够了！"德·丽尔夫人怒不可遏地一把将酒泼到外乡人的脸上。两个彪形大汉马上围拢过来。</p>
<p>　　“北方佬，你对我们的老板娘做了什么？你不介意坐一回地道的‘矿井电梯’吧？”那两个大汉把粗壮的手臂探进外乡人的腋下，企图把这个北方口音的小子扔出去。外乡人的身子却纹丝不动。</p>
<p>　　"放下他！"黑暗中一个夹着浓痰的嘶哑嗓音说。</p>
<p>　　闹哄哄的四周立即安静下来，密集的人群闪出一条过道，一个人蹒跚着缓缓走近，来人满头苍发，脸上长满了肉疣，就像是铺了一层油亮的卵石。</p>
<p>　　“可是——”两个壮汉想解释什么，却又戛然而止。因为他们被来人犀利的目光刺得一噤。</p>
<p>　　"年轻人，跟我走一趟。"</p>
<p>　　外乡人面无表情地望望左右，跟着那个蹒跚的步子走出酒吧。</p>
<p>　　红头发扒开百叶窗望向窗外，"嗨，大家看，那小子的车没有后视镜！"</p>
<p>　　男人们挤到窗前观看，有人把啤酒瓶愤怒地摔在地上，因为这个新发现是一个巨大的挑衅。</p>
<p>　　没有后视镜！因为没有人能赶上他！这里的顾客没有一个不是狂热的车手，矿山早已告别淘金时代的繁荣，674号公路却把全世界的飙车小子都召集到了这里。</p>
<p>　　"那是一辆破车！"红头发鄙夷地朝窗外吐了口唾沫。诚然，相比他那辆鲜亮的御林军一般神气的红色保时捷，外乡人的车就像一个寒伧的乡巴佬。</p>
<p>　　“也许，那厚重的车厢改装一下可以装土豆。”红头发的调侃引起一阵哄笑。</p>
<p>　　"那是一辆好车。"一个悠长的声音说，但是自得其乐的人没有听到这句评断。挤在男人中间的德·丽尔夫人回过头来，看到一个衣衫褴褛的糟老头儿正在自斟自饮，他的脸像是用砂纸磨掉了半边，鼻子与眼睛连成一块，样子恐怖吓人。德·丽尔夫人认识这个老头儿，他肯定是这个小镇上的人，常常能在酒吧最偏僻的一张小桌上找到他的身影。有喝酒的主顾认出这个老头儿是在教堂里打杂的，雷耶博士收留了他。他是个酒鬼，却没有好的信誉，赖了不少酒账，都是雷耶博士帮他偿付的。</p>
<p>　　德·丽尔夫人很鄙夷这个老酒鬼的疯话，那是辆好车？狗屁！灰白色的车体，不少地方还脱了漆，都不知道多久没打蜡了，不过也确实打不了蜡了，该报废了。但是，它的排气管真粗！德·丽尔夫人的眼珠都快蹦出来了，她从来没有见过这么粗的排气管。不，她见过，那还是她风姿绰约的少女时代，同样风华正茂的切驾驶的跑车，就有如此夸张的排气管。她亲眼看见切给他心爱的四驱车装上这个丑陋的装置，就像机械师给大炮装上大口径炮管一样得意。</p>
<p>　　“他们叫我雷耶博士，但我宁愿你叫我牧师，我是这个小镇唯一的牧师。在宗教活动之余，我还兼供应汽车零配件。”这个硕大的头颅说。他苍白的头发愤怒地直立着，像雄狮般威严，下巴垂着薄而密的褶皱，就像是公鸡的肉垂。</p>
<p>　　“您是个多面手。”外乡人谦卑地恭维道。</p>
<p>　　“没办法，这个小镇人口太少。人们不得不身兼数职才能应付过来。”</p>
<p>　　"这里甚至有消防队！我来的时候看到了。消防队门口有一块小牌子，上面记载着卡里寇不同年份的人口。1881年，40人；1887年，1200人；1890年，810人；1951年，20人……"外乡人说。</p>
<p>　　“你的记忆力不错，小伙子，干哪行的，介意我问吗？”雷耶博士揭开一瓶窖藏葡萄酒，“嘣”的拔盖声在房间里显得格外悠长，余音消弭后整个房间便陷入令人窒息的沉默。</p>
<p>　　“我是个推销员，推销《圣经》。”</p>
<p>　　“你的业绩一定不错，买得起一辆好车。”雷耶博士的目光割过外乡人紧绷的脸皮。</p>
<p>　　外乡人脸一红，迅即恢复一个推销员才有的老练和镇静，“这辆车是父亲的遗产，我不是个好推销员，因为我这副面孔不讨乡下主妇们喜欢。”他似乎被自己的幽默逗乐了，他的爽朗大笑与他的口音一样，带有独特的北方风格。</p>
<p>　　雷耶博士递给外乡人一杯酒，“卡里寇不是你应该来的地方，北方人，这里总共只有八十个常住人口。”</p>
<p>　　外乡人止住笑，不自然地说：“是的，和那些不知天高地厚的飙车小子一样，我也是慕674号公路之名而来，我是个赛车爱好者。”</p>
<p>　　"改装是多余的，懂吗，年轻人？比如你那辆宾利，它拥有一个英国克鲁的本特利工厂纯手工打磨的发动机，纯种大不列颠皇家血统，你为什么要把它伪装成笨重的德国货呢？"</p>
<p>　　“也许我是个外行。我本以为把发动机的位置后移七英寸，降低传动系统的高度，会带来更可靠的操控性。”外乡人波澜不惊地解释道。</p>
<p>　　“你是对的，这可以带来更低的车身重心，但这不是无限制高速公路，对于674号公路而言，过低的底盘无异于自杀。你想跑674号公路？”</p>
<p>　　外乡人坚毅地点点头。</p>
<p>　　雷耶博士凝神注视外乡人灰色的眸子良久，说："跟我来。"</p>
<p>　　外乡人跟在博士沉重的步伐后，走过教堂大厅的一排排长椅，进入一个堆满杂物的侧房，推开一道严实的铁门，沿简陋的梯子下到地下室。</p>
<p>　　"嗯？牧师，收购废铁也是您的业务之一？"</p>
<p>　　"如果你真的懂行的话，就知道这是另一个'白银谷'。"博士费力地俯下身子，吭哧吭哧地搬起一个增压涡轮，"1985年，原产加拿大安省圣嘉芙莲市……这个，V12 4.8升引擎，兰博基尼，1972年产，全世界只剩下十二台。这些都是674号公路上失事的汽车残骸，希望你的宾利不会成为我新的收藏。"</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>　　"行了行了。"德·丽尔夫人打断他，"这是你多少次重复自己的故事了？"</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>　　"除了尾灯，什么也没有……"一个嘶哑苍凉的男低音舒缓地流淌出来，这音乐怎么这么耳熟呢？德·丽尔夫人偷望外乡人的侧面轮廓，阳光给他冷峻若削的脸庞笼上一层金边，那硬线条显得柔和了不少。</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>　　"也许你应该下车检查一下车况，比如查看一下弹簧上的楔片，紧紧轮胎上的螺母什么的。"德·丽尔夫人看着窗外，红头发的几个朋友正扬着扳手，围拢在保时捷的旁边，上上下下地忙活。</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>　　还很嫩，她心想。不知怎么，有一种叫作愁绪的东西悄悄笼上她的眉间，她开始担心什么、害怕什么、怜悯什么。懂吗？年轻人，在这里年轻是最大的错误。她想起了切，那个二十五岁便名噪天下不可一世的切，他死的时候才三十三岁，有人说他的死只是意外，但她知道那绝不是意外，那是一个阴谋。唉，二十年过去了，回忆这些干什么呢？她有些抱怨自己，目光却落在外乡人的肩膀上，久久没有移开。</p>
<p>　　天色暗下来了，高原的阳光消退得像响尾蛇一样迅速，逐渐浓重的夜幕加重了她内心的忧郁。</p>
<p>　　"还等什么，胆小鬼？"红头发亚当朝车窗外吐了口唾沫。</p>
<p>　　"你先，674号公路。"外乡人面无表情地回答。</p>
<p>　　"674号？"亚当不敢相信自己的耳朵，在轰鸣的引擎声中，他撕破喉咙喊道，"那是条死路！"</p>
<p>　　外乡人没有回答，只是冷冷地笑着。</p>
<p>　　红头发亚当把口香糖狠狠拍在后视镜上："娘的，老子奉陪！"</p>
<p>　　保时捷像一条猩红的火舌喷了出去，卷起铺天盖地的尘土，空气里充斥着汽油味和焦糊的橡胶味。灰白色的宾利低吼一声，轮胎发出惨烈的嘶鸣，震得地面簌簌抖动。德·丽尔夫人上身猛一下撞在椅背上，一种令人窒息的推背感扑面而来，她的喉咙里蹦出一个尖细的声音——你还是小姑娘吗？她不禁有点懊恼了。其实没有人能听到她的声音，高达一百五十分贝的噪音早已堵塞了所有人的耳孔。</p>
<p>　　世界在顷刻间变得模糊，窗外三角叶杨嗖嗖飞过，此刻，它们的影子紧密得就像自行车轮上旋转的辐条。在颠簸与喧嚣中她终于明白了许多问题的答案：为什么不装转速表，为什么不装GPS，为什么不装车控电脑……这些问题的答案是如此清晰，因为你的眼睛根本来不及关注这些，就连一眨眼、一侧目，都可能让汽车瞬间陷入失控。对手车尾甩下的尘雾遮蔽你的视线，层出不穷的弯道紧逼上来，你甚至来不及喘息，你所要做的便是紧盯路面，它就像一条暴戾恣睢的蟒蛇，它不停地扭动身躯，时不时回头吐出冷嗖嗖的毒信子：一个高坎，一个水坑，或者干脆一道悬崖。</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>　　他的女朋友无力安抚他的愤怒，她被颠了个七荤八素，保时捷豪华的车厢被她吐了个一塌糊涂。</p>
<p>　　他左右扳动方向盘，却发现前面的宾利忽左忽右，亲密地堵在他面前，两条车轨缠绵得不可开交，使他无法超车。</p>
<p>　　"大爷踢你屁股！"红头发亚当咆哮道，回头一看他有气无力的女朋友，又无奈地松开了油门踏板上的脚。他焦灼地瞥了一眼窗外，前车的尾灯光柱正好扫过这一片天空，他的瞳孔突了出来，"那是什么？"红头发恐慌的声音迅速被深不可测的夜空吞没了。</p>
<p>　　仿佛一种冥冥中的感应，前面宾利的前轮突然抱死，在路面硬生生地刮出两道深沟。德·丽尔夫人觉得自己的心似要飞出挡风玻璃，却又被安全带扯了回来。</p>
<p>　　"发生了什么？"</p>
<p>　　回答她的是一声巨响，她看得真真切切，正前方摔下一个庞然大物，把路面撞出一个大窟窿，金属零件四处飞散，其中一个把宾利的挡风玻璃砸出一朵拳头大的雪花。</p>
<p>　　从天而降的是那辆色彩艳丽的保时捷，它的车前灯依旧忠实地工作着，斜射着漆黑的天空，车尾则撞了个稀巴烂。前轮兀自在半截斜支着的断轴上旋转着。</p>
<p>　　外乡人从残骸中拖出血肉模糊的红头发，把抽泣的他塞进宾利的车尾厢。"她死了，她死了！"红头发亚当张牙舞爪地要与外乡人拼命，但很快被轻易地制服了。外乡人检查了保时捷，那个女孩的胸腔破了个大洞，血液泛着泡泡涌出来，人已经没气了。</p>
<p>　　外乡人怔怔地伫立良久。他想起三岔口老酒鬼的忠告，不禁问自己，那种不可一世的自信、争勇斗狠的张狂是否来得正常？我还能继续前进吗？或者我还可以掉转车头？但是车后的景象让他凄然一笑，尾灯所指示的方向分明是黑黢黢的深渊，后轮胎甚至是悬空的。</p>
<p>　　"啊，那里！"德·丽尔夫人颤抖着伸出手臂。外乡人顺着她指的方向望去，正好看到一个黑影经过保时捷前车灯的光柱，那是一辆漆黑如墨的双座跑车。它在窄小的光柱里转瞬即逝，但它的红色尾灯依旧留在夜色中，忽明忽灭，外乡人明白了什么，迅速登车启动引擎，向那辆幽灵般的车追去。</p>
<p>　　这是个漫长的夜晚。外乡人记得很清楚，卫星地图上显示674号公路只有区区一百七十英里长，但他的宾利却以一百英里的时速行驶了整整一晚，火花不停地从引擎盖边上蹦出来，火花塞"噗噗噗"地吭哧着。很多次他几乎已经被黑色跑车甩掉了，但不久，那红色的尾灯又及时亮起，像是暮色里缥缥缈缈的亚历山大灯塔。天微微亮时，它又隐没在晨光之中。它就像是一个怪梦，消退得无影无踪，让清醒过来的他禁不住怀疑那是幻觉。</p>
<p>　　宾利跌跌撞撞地回到卡里寇镇，它的引擎爆掉了六个汽缸，引擎盖已经灼红了，烫得可以点燃香烟。外乡人怔怔地坐在驾驶座上，沉浸在迷惘的思绪之中。红头发拼命地踢车尾厢，外乡人却浑然不觉。突然，他从凝固的思考中苏醒，扭头轻吻了下女人的脸颊。</p>
<p>　　德·丽尔夫人"哎呀"一声，面红耳赤。上帝，发生了什么？我大得可以当他妈。她的胸膛里像是有只兔子在上窜下跳，她深深地吸入一口气，顿时，一股初恋般的眩晕击中了她。</p>
<p>　　"柠檬味？这车厢里有柠檬味。"她肯定地说。</p>
<p>　　外乡人缓缓地扭过头来，"你确定不是橘子味？"</p>
<p>　　没有人能真实地描述这场夜幕下的惊魂迫逐，三个亲历者回来后居然都病倒了。很难用恐惧和精神上的刺激来解释他们莫名其妙的病症。他们的胃口变大了，身子却在急剧消瘦，像是有幽灵在悄悄摄取他们的魂魄与营养。</p>
<p>　　雷耶博士带走了他们——这个小镇上每一个濒临死亡的人都会被交给雷耶博士，他是唯一的牧师。在雷耶博士的精神治疗与老酒鬼的悉心照料下，他们竟奇迹般地恢复了健康。或许雷耶博士还有另一个职业：医生。</p>
<p>　　"真不知道该如何感谢您。"外乡人真诚地说。</p>
<p>　　"感谢死神吧，感谢它没有带走你。"雷耶博士埋头在一堆玻璃仪器中，娴熟地配制着溶液。仪器上空弥漫着可疑的白汽，蒸发皿里黄绿色的液体沸腾着，泛出油亮的泡泡，泡泡破碎之后，便有刺鼻的气味溢出。外乡人把目光从那不知名液体上收回，落在雷耶博士长满肉疣的丑脸上。</p>
<p>　　“死神也开车吗？”外乡人似笑非笑地问。</p>
<p>　　雷耶博士的目光盯在他的滴管上，似乎没有听见这句话。外乡人走近博士的工作桌，饶有兴致地观察着他的工作。</p>
<p>　　“你是历史上第二个成功跑完674号公路的人。第一个，想必你已经熟知他的故事……”</p>
<p>　　“可是他付出了生命。”</p>
<p>　　“那只是个意外。”博士举起一个锥形瓶，在眼前耐心地晃动着。</p>
<p>　　“不，这个世界有太多追逐的游戏，一毫秒的领先也许需要用一生来偿付。这样的速度又有何意义呢？”</p>
<p>　　外乡人平静地说。</p>
<p>　　"不！"博士把毛细管插入溶液，"生活中的交通规则对于一个车手来说是不适用的。在车手的词典里只有一个词汇：超车！"</p>
<p>　　似乎有什么触动了外乡人的内心，他安静地伫立着。</p>
<p>　　博士从壁炉里取出一个火红的玻璃半成品，用铁钳夹住瓶颈，"我需要一个水冷循环器，你可以帮我一个忙吗？"</p>
<p>　　外乡人帮博士夹住瓶身。博士则用凿子在瓶身钻了个孔，然后，用另一把铁钳夹住瓶颈，从瓶身小孔里穿进，又巧妙地粘合在内瓶底。</p>
<p>　　瓶身里的热水流经瓶颈，被瓶外冷空气冷却，再次进入瓶身，冷却瓶身内的热水，最后从瓶底流出，真是完美的设计。外乡人痴痴地欣赏着博士的玻璃工艺，心想老头子真是个多面手。但他很快发现这个水冷循环器不能工作，因为瓶颈要进入瓶身不得不在瓶身上凿个孔，但这样在水压下，热水会溢出。外乡人困惑地望向博士。</p>
<p>　　博士似乎读懂了他的心思，说："只是实验品，有应用价值。我这辈子无时无刻不在与这个我所寄居的世界抗争着，但都失败了，原因很简单，因为我生活在这里。深陷泥潭的人不可能攀自己的鞋帮以自救。其实你也一样。"</p>
<p>　　“我？”</p>
<p>　　"不错。对于一个赛车手来说，他也是在与摩擦之源——这个人类生活其中的世界努力抗争着。他想超越，他想极速，可他不是一个光子。上世纪有个想与时间过不去的老头创立了相对论，让人看到了时间倒流的希望。现代科学否定了这种可能性，但肯定了另一种与时间赛跑的方法——我们回不到过去，但我们却可以跳跃到将来。一个较高速运动状态物体的时间流逝得比较低速的参考者更慢，从这层意义上，我们是活在将来，不是吗？"博士咧嘴笑了，但这笑有几分怆然。正确的理论反照着可怜的现实，一个每天以F1赛车速度运动的车手的时滞效应累积起来也不会超过一毫秒吧，但是博士的话里却暗示着一种象征，一个车手生命意义的证明。</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>　　"我不信，我不信！我怎么会失手？才一百英里的时速，我会控制不住？"亚当痛苦地摇着头，那晚噩梦般的情景像一条冰冷的蛇爬上他的后背。</p>
<p>　　"你的失控是因为你看到了不该看的东西。你自己想想你那晚看到了什么！"老酒鬼严厉地诘问道。</p>
<p>　　"不，不，我什么也没看见。我，呜……我什么也想不起来了。"亚当双手抓着头发，坐在地上，号啕大哭起来。他的伙伴面面相觑，手足无措。</p>
<p>　　“他到底看到了什么？”外乡人走出人群，轻声问老酒鬼。</p>
<p>　　“山、树、戈壁，加州大漠风景而已。”老酒鬼似笑非笑地回答。</p>
<p>　　外乡人一愣，“可是……”</p>
<p>　　外乡人想要追问什么，但老酒鬼已踉踉跄跄地走远，扬着一个方形铁皮酒罐冲德·丽尔夫人邪邪一笑：</p>
<p>　　“老板娘。酒账记他的。”</p>
<p>　　“你不该来这里。”德·丽尔夫人轻轻揩拭外乡人脸上的血迹。</p>
<p>　　“674号公路是赛车的圣地，而我是一名车手。”</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>　　1849年，一队寻找金矿的牛仔误入美国内华达山脉东麓的一块长二百零八千米、宽八到十八千米的山间盆地，几经磨难，方才脱险。从此，"死亡谷"之名不胫而走。死亡谷是北美最干燥的地方，年降水量不足一百毫米。它又是全美最热的地方，最高气温达56.6摄氏度。而死亡谷中最与众不同的还要算它的石头：有人发现谷中的石头竟像动物一样能够爬动。1969年，科学家们对谷中石头进行仔细观察后发现，所有的石头在一年中都离开了原来的位置，移动距离最大达三百六十四米。是什么力量赋予了石头神奇的生命呢？</p>
<p>　　后来，一些采矿者在这一带发现了金、银、铜等各种矿产。到十九世纪八十年代，又发现了硼砂，不少人前来此地开采，时至今日还可以看到当年硼砂厂的废墟。至于炭窑，则大约建于1875年，炭窑的修筑主要是为了提炼矿石中的纯银，十个窑一列排开，平均高度为二十五英尺六英寸，直径约三十英尺，炭窑的外形就像是东正教建筑的圆形尖顶，迄今窑洞内部仿佛仍隐约可以闻到燃烧杜松的气味。因此在那一段期间死亡谷还出现了小市镇，卡里寇是其中最大的一个。</p>
<p>　　卡里寇位于死亡谷西北缘，毗邻莫哈韦沙漠，原是印第安保留地。1881年，大量采矿工人会集此地，在福克斯河畔建立了卡里寇小镇。鼎盛时期，卡里寇有二十多家酒馆，皮革厂、蜡烛作坊、铁匠铺、消防队一应俱全。卡里寇镇原有崎岖小径攀附于大峡谷、河谷边沿，通至六十七英里外的白银谷，后来拓荒者把小径加宽重建，铺以沙石，命名为674号公路。但因为公路弯急路险，地质条件复杂，建设之初便缺乏实地勘测与规划，投入使用后多有交通事故发生，不久便被废置。采矿工人宁愿绕道卡林硼砂矿、福克斯镇，再辗转至白银谷。</p>
<p>　　外乡人合上《美国西部小镇旅游词典》，目光在一排排书脊上游走，突然停留在书架最顶层一摞牛皮纸包装的案卷上。他取下案卷，拭去密布的尘埃，一行蓝黑墨水字迹映入眼帘。墨水里的金属色素氧化后，字迹已经像水浸过般变得漫漶不清，但依稀还可以辨认出封面上的几个单词，"674号公路"、"交通记录"等字样，记录者不明。</p>
<p>　　1909年5月13日；车型：福特；车牌号：RMBRWTC911；罹难者：北星矿业公司老板亨利·莱斯；失事原因：不详。</p>
<p>　　1933年6月19日；车型：道奇货车；车牌号：GEOP.GE51237；罹难者：路易斯·卡罗琳，阿尔卡特·甄尼；幸存者：山姆·道格拉斯；失事原因：仪表失常，车体倒置……</p>
<p>　　1935年9月9日；车型：普利茅斯；车牌号：LANDOFLINCOLN1984；幸存者：亨利·利蓝；失事原因：换挡时发动机熄火，仪表不灵……</p>
<p>　　外乡人合上卷宗，小心地把它复归原位，重新抹上一层厚灰。然后，他移开靠里墙的一排书架，立刻，他按部就班的动作凝固了，书架后一个胡桃木相框撞进他的视线。他打燃打火机凑到相框前，看到上面写着：1954，纽格博林。照片中的男人站在一辆赛车前，高举</p>
<p>　　着香槟。照片已经非常陈旧，霉菌与水汽侵蚀了它的表面，但照片上那辆漆黑的赛车依旧反射着白冷的光，寒意透过玻璃镜面，让他看得出神。</p>
<p>　　外乡人从牛皮靴里取出一把短小的匕首，小心翼翼地刮掉地板砖缝隙里的石灰，没多大工夫，便取下了一块一平方英尺大小的地板砖。他敲了敲地板砖下的水泥，传来中空的脆音。外乡人用肩膀蹭蹭腮帮，露出欣慰的笑。他用盖书架的布一层层包裹铁锤，对着那块正方形区域砸下去，在沉闷的崩裂声中，水泥块碎了。外乡人细心地搬开水泥块，以防止它们下坠到地下室发出刺耳的撞击声。外乡人清理出一个一英尺见方的窟窿，灵活地攀爬了下去。他对自己的方位感非常自信，他甚至能判断出自己着地的位置。</p>
<p>　　地下室里堆满了汽车零件，而且一团漆黑，要找一个合适的"着陆"点还真不容易。外乡人踩在一个变速箱上，"铿"一声打燃他的打火机，在那团昏黄的光晕里，他的目光迅速扑到角落里一张很大的帆布上。这光亮虽然幽微，但是那帆布下展露的漆黑一角仍旧显示着令人肃然起敬的威仪。外乡人走近那个庞然大物时步子有一点儿踉跄，靴子不时碰上四下散落的金属零件——他明白自己是在逼近一个传奇、一个真相，他已经顾不得那么多了。</p>
<p>　　他颤抖着抓起帆布一角，以牛仔甩套绳的姿势掀起了它。在漫天飞舞的尘埃之中，一辆纯黑双座跑车赫然入目。这辆可敬的美国跑车鼻祖——克尔维特制造于1953年，几十年过去了，它光洁的表面仍旧像刚出厂时那般崭新锃亮，昏暗的地下室因它的存在而显得明亮一些。它拥有一个庞大的轮距，轮拱近乎夸张地向外抛起，一个巨大的扰流尾翼装在车身后部以提供更强的高速稳定性能。发动机盖板上，"鲨鱼嘴"进气栅格就像一头猛兽翻着鼻孔，高尾鳍式车尾嚣张地耸起，就像在向不自量力的追赶者竖起中指。蛮横无理的正宗美式跑车，原始的机械结构，锋利的线条，令人心悸的大排量引擎，不可一世的马力与扭矩，浑身每一个零件都在诠释简单粗暴的设计理念。外乡人静静地欣赏着这头猛兽，似乎听到了它撕破空气的咆哮。</p>
<p>　　“该结束了。”一个苍凉的声音响起。车尾灯应声而亮。刺目的光柱让外乡人目眩神迷。这辆本应陈列在汽车博物馆的经典跑车突然从沉睡中苏醒，引擎的轰鸣震得地下室顶棚的尘土纷纷坠地。</p>
<p>　　雷耶博士从车窗里探出头来，"你是个好车手，但不是一个好的警官。当我的引擎启动，没人能追上我，没人！"</p>
<p>　　外乡人微微抖动嘴唇："莫尔斯警长与他昔日的伙计们正在教堂外的每一个方向恭候着您。博士，不，尊敬的杰克·汉弥尔顿先生。"</p>
<p>　　“莫尔斯警长？”</p>
<p>　　“曾经被你在674号公路上戏耍过的莫尔斯警长先生，他是您的老朋友，他托我给您带个口信，感谢您三十年来为他垫付的酒账。”</p>
<p>　　博士斑白的胡子里蹦出“哼”的一声：“你以为那群蠢猪也可以围剿我？”</p>
<p>　　话音未落，"轰"的一声巨响，面朝公路的那堵墙颓然崩塌，在克尔维特致命的动力下，五英寸厚的砖墙像泡沫板一样不堪一击。转瞬之间，克尔维特已狂奔在空寂的旷野之中。排成群狼阵形的警车啸叫着围追堵截。三岔路口，克尔维特急刹在674号公路口画着骷髅头的警示牌前，像一头决绝的斗兽，昂首向它的仇敌告别。</p>
<p>　　警车们闪出一条笔直的通道，灰白色的宾利狂飙猛进至最前沿，闻讯而来的CNN记者的镁光灯也无法追踪它风驰电掣般的速度，他们的底片上遗憾地拖曳出长长的尾迹。宾利在克尔维特后五十米停住了，像是在为一位尊敬的长者致意。</p>
<p>　　“三十年前，那辆幽灵般的克尔维特便是从这条674号公路上神秘地消失了，今天，它重现江湖，速度依旧那么的可怖。”CNN记者紧锣密鼓地对着摄像机报道着。</p>
<p>　　在簇拥过来的话筒前，曾经的莫尔斯警长、今天的老酒鬼那张恐怖的脸笑得面目全非。</p>
<p>　　"莫尔斯警长，您是怎么发现克尔维特的踪迹的？三十年来您一直在锲而不舍地寻找这条漏网之鱼吗？"</p>
<p>　　"莫尔斯警长，观众朋友对三十年前杰克·汉弥尔顿那次蹊跷的逃脱很感兴趣，您能详细为我们介绍一下当年的情形吗？"</p>
<p>　　"警长先生，您曾经因为那次失败的抓捕被当局处分。请问，这一事件是否影响到您的人生？还有您后来曾在674号公路上遭遇不幸的车祸，请问这一车祸真实的情形您还记得吗？"</p>
<p>　　"不，请不要称呼我警长先生，我现在并无任何公职在身，现在我是酒鬼莫尔斯，他们都这样叫我。我与杰克·汉弥尔顿过不去，是出于一段私人恩怨。当年，杰克这个混蛋从我的手掌中侥幸逃脱，给我的职业生涯带来了灾难性的后果。而后来，我在674号公路遭遇车祸，又是杰克先生救了我的小命。所以，我与他有一段说不清道不明的过节。"老酒鬼抿了口酒，蒜头鼻上泛出红潮，一段陈年往事涌上心头，就像一个腹底泛出的酒嗝一般充斥着复杂的气味。</p>
<p>　　外乡人示意警车停止警鸣，这午夜的小镇立刻陷入了地狱般的宁静。</p>
<p>　　三十多年前，两个传奇车手如双子星横空出世，赛车界无法评价两人的优劣。正如有人偏爱简单粗暴的美式车，有人偏爱操作性能优异的日系车。杰克·汉弥尔顿与阿弗莱·切便是赛车领域的两个美的极致。杰克·汉弥尔顿像狼嗜血般迷恋速度，他的车采用压缩能力巨大的单涡轮，他毫不在乎低转速下的涡轮迟滞效应，一旦他的车进入直赛道，在单涡轮令人恐惧的压缩能力下，低转不足的差距在高转时可以轻易挽回。阿弗莱·切是弯道之王，他的车排斥一切现代电子辅助设备，甚至在高科技多气门引擎大行其道的时代，仍旧义无反顾地坚持使用旧式推杆式V8引擎。为了追求赛车转弯时的灵敏性，他完全不考虑一个车手所能承受的颠簸极限，而使用硬得不能再硬的弹簧以减小车身的侧向滚动。杰克·汉弥尔顿与阿弗莱·切，谁才是那个时代的速度之王？纽格博林耐力赛成为两人正面碰撞的第一站。那次盛况空前的角逐中，杰克·汉弥尔顿赢得了胜利。阿弗莱·切在逼近终点的一刹那赛车失控，撞上了轮胎防护墙，差点丧了命。但二十天后，杰克·汉弥尔顿被剥夺了冠军资格，并被指控蓄意谋杀。原来，机械师出身的他赛前在阿弗莱·切的车上做了手脚。从此，杰克·汉弥尔顿开着他漆黑的克尔维特踏上了逃亡的不归路……</p>
<p>　　加州的莫尔斯警长在卡里寇小镇发现了杰克的踪影，这才有了CNN追踪报道的那场惊心动魄的荒野大追捕。十年后，名噪天下的车王阿弗莱·切慕名来到674号公路，在直升机的跟踪拍摄下，以他高超绝伦的弯道技术跑完了全程。但他完成这一壮举不久，便莫名其妙地撞上一辆野营归来的校车，七名可爱的四年级学生因此不幸遇难。阿弗莱·切以这样不光彩的方式结束了他传奇的一生，以车技闻名于世的他竟然丧身于车祸，这真是个莫大的讽刺。没有人思考过这讽刺下更深一层的意义，除了他的儿子，那一年，他九岁。</p>
<p>　　外乡人从一名警官手里拿过扩音器，冷静地问道："你为什么要救我？我认出了它，那天晚上是它引领我跑完了674号公路。"</p>
<p>　　一阵怆恻的狂笑在夜空里飘荡，就像是魔鬼的嘲讽；笑声过后的嗓音却又恢复了一个牧师才有的悲悯与慈爱：</p>
<p>　　"因为你是一名车手。我相信任何一名伟大的赛车手都不愿自己的后视镜里寥无人迹，他渴望有人同道，甚至赶超自己！"</p>
<p>　　"可是，你差点谋杀了我父亲！"外乡人手里的扩音器微微颤抖着。</p>
<p>　　"不是差点，是已经。你以为切是怎么死的？哈哈哈哈，他为什么莫名其妙来到卡里寇镇？是想像开宝马的毛头小子那样兜风吗？当然不。是我给他下了战书，这才策动了他来向魔鬼的跑道挑战。他真蠢，他难道不知道除了我之外，这个世界没人能驾驭674号公路吗？他试图挡在我前面，我欣赏他，但是我绝不能容忍有人比我更快，在纽格博林不行！在巴纳维亚盐滩不行！在674号公路，更不行！当然，那是许久以前的事了，那个年少轻狂的年代……事实上，我第一眼便知道了你的身份，因为我认出了他的车。"老杰克的声音像河谷里斗折直下的湍流淌入宽阔的平原，变得波澜不惊，就像一个阅尽沧桑的人，言谈中不再有爱、恨、遗憾与向往，只有淡而悠长的平静。</p>
<p>　　该死！他的父亲是切。我爱过切，又爱上了他的儿子！德·丽尔夫人不安地环顾四周，幸好夜幕为她掩盖了双腮的羞赧。</p>
<p>　　“不管怎样，我感谢你救了我，还有那特制的葡萄糖。”外乡人的言辞中不无讥诮。</p>
<p>　　"黑色克尔维特"没有回答，片刻后，他说："很好，你已经发现了那个秘密。有个伟人说过，你不能在所有的时间欺瞒所有人，更何况是这么一个机灵的脑袋。我曾告诫你，改装是多余的，一辆外表寒伧的宾利，也注定拥有一种与生俱来的贵族气质。而我，用强酸溶液腐蚀了自己的容貌，却腐蚀不了那颗迷恋速度的心脏。那确是特制的葡萄糖液，经过手性分离后的葡萄糖。因为你们的身体并不能吸收普通营养物质。"</p>
<p>　　四下一片哗然，了解内情的人纷纷交头接耳，原来那奇怪的病症是因为身体不能吸收普通营养物质。可是，为什么会这样？</p>
<p>　　“是什么启发了你，年轻人？”老杰克问道。</p>
<p>　　"我父亲的车祸。那时，他的死带给我家的除了巨额的赔偿债务，还有巨大的耻辱：车手家族竟然要为一起恶性交通事故负全责。我恨我父亲！直到后来我长大成人，才慢慢明白一些事理，我想，以我父亲镇静沉稳的驾车方式，那次事故肯定隐藏着什么。于是，我参考现场照片用石膏复制了车祸时宾利里的情形，结果发现，我的父亲变成了一个左撇子，他在急转弯时偏错了方向，我推测，一定是他的身体发生了什么变化……"</p>
<p>　　现场寂静得只听见CNN的录音设备工作的"沙沙"声，新闻栏目负责人龇牙咧嘴地冲他的手下做着手势。</p>
<p>　　"为了亲身体验我父亲所经历的变化，我决定重温父亲的纪录，这便是我来到卡里寇镇的原因。父亲曾告诫我，在一条危险的跑道上应采用低的底盘。谁都知道，低底盘有利于操控，但是车身高度还受限于另一个因素：空气动力。我很怀疑父亲的经验，因为气流从汽车上部流过和从底部流过的速度差造成了下压力，如果底盘离地间隙过小，会造成气流不能顺畅流过。也就是说，这是以牺牲速度的代价换来赛车的稳定性。后来我才明白父亲的告诫，在这个世界速度并不是最重要的，让轮胎死死抓住地面才是至关重要的。正因为我使用了很低的底盘，才让我避免了亚当从高空跌下的厄运。要知道，674号公路是一条'空中索道'。甚至，它根本不属于我们这个世界……"</p>
<p>　　喂喂喂，小伙子，这不是“天方夜谭”节目，新闻栏目负责人暗暗叫苦，这话越说越离谱了。</p>
<p>　　“他不仅要感谢他的父亲，还得谢谢我。”老酒鬼莫尔斯对德·丽尔夫人神经兮兮地说。</p>
<p>　　“为什么？”</p>
<p>　　“是我忠告他要在夜幕里驾驭674号公路。”</p>
<p>　　“夜晚岂不是更危险？”</p>
<p>　　“不。如果你了解到674号公路是长在天上的话就不会这样认为了。有时候蒙着眼睛过钢丝比睁开眼更安全。不是吗？”</p>
<p>　　"长在天上？"德·丽尔夫人一脸茫然。她想起那辆在光柱里一闪而逝的幽灵车，它似乎也行驶在天上。</p>
<p>　　"没错，如果是白天的话，你会发现自己就好像是驶在天花板上，戈壁与天空倒置了。"</p>
<p>　　他喝醉了吗？德·丽尔夫人怀疑地打量双眼迷离的老酒鬼，问："那你是怎么知道的？"老酒鬼摸了摸自己惨不忍睹的脸，皮笑肉不笑地说："这便是我与674号公路亲热时留下的纪念。至于这公路为什么长成这样，我也不知道。"他自言自语道："太奇怪了，这又不是过山车。"——这是他三十年未解的疑惑。</p>
<p>　　外乡人对四周的议论置之一笑，接着说：“我查阅了这条公路上自1883年来所有交通事故的卷宗，结果从少数几个幸存者的笔录中发现一个现象，那就是所有失事的车都出现了仪表失常现象，指针指向莫名其妙的红线区域一动不动。另一个来自《美国加州地质调查》的发现是，在这片内华达山脉东麓的三角盆地里，存在一个极大的磁异常，这个磁异常也许便是仪表失灵的原因，死亡谷石头的奇怪自移现象也可以得到解释，如果那些是铁磁性石头的话。但这还只是674号公路奇妙特性中微不足道的一个。”</p>
<p>　　克尔维特传来沉重的呼吸声，似乎连老杰克也被外乡人神奇的叙述吸引住了。</p>
<p>　　"就像一个玻璃球在天鹅绒桌面上滚动，它的底下会出现一个小坑一样，二十世纪的物理学表明，我们的宇宙空间也是弹性的。一个质量巨大的天体会在其周围形成一个黎曼几何描述的'小坑'。在这个小坑内光线发生了弯曲。同样，在674号公路之下这个强大的磁性能量场里，表现出了一些奇异的拓扑性质。比如，674号公路弯成了一个莫比乌斯环。"</p>
<p>　　莫比乌斯环？这是魔术师经常玩的小玩意儿，在乡人中间拥有很高的知名度，而外乡人也正像一个魔术师，悄悄揭开一个奇妙的帷幕。新闻栏目负责人激动得手都颤抖了。</p>
<p>　　"莫比乌斯环只有一个面，而且它是闭合的，这便是我的宾利以时速一百英里行驶了一整晚仍旧没有到达尽头的原因。但674号公路并不是一个三维世界的莫比乌斯环纸带，事实上，在我们的空间设计一条莫比乌斯公路是行不通的，因为我们无法想象公路的背面是什么。而在更高的维度上，674号公路却有它的另一面，我们就像是莫比乌斯纸带上的蚂蚁，可以浑然不觉地爬到纸带的另一面去——但前提是你最好不要看你的车窗，因为窗外倒置的景象足以让一个高超的车手神志昏聩。"</p>
<p>　　红头发亚当心悦诚服地点点头，他曾经自认为自己的车技能比肩杰克·汉弥尔顿，现在才发现自己就像是纸带上一只蚂蚁般渺小不堪。</p>
<p>　　"是的，我们无法想象674号公路在四维空间里是怎样扭曲的，但是我们可以借助三维莫比乌斯纸带上的扁形虫来理解它的另一个性质。扁形虫跟我们的手套一样，不存在一个对称面可把它割成两个相同的部分，即是说它是非对称的，手性的。让我们看看一只扁形虫沿莫比乌斯纸带爬一圈会发生什么。魔术师会告诉你，扁形虫爬一圈回到原地，它竟然会整个翻了个边，它的左脚变成了右脚，它的右触角变成了左触角。我们在三维空间固然不是扁的，但在四维的空间上，我们却是'扁'的。而且，我们也是有左右之分的，这样当你成功沿674号公路跑完一圈，你会发现自己整个儿颠倒了，右撇子变成了左撇子，甚至你身体内那螺旋着的氨基酸和DNA也转了向，以至于你的身体不再能吸收自然界的左旋氨基酸和右旋糖，所以我们这些可怜的扁形虫，不得不依靠杰克博士生产的'特殊营养液'才能苟延残喘……"</p>
<p>　　众人一片哗然，原来，博士的灵丹妙药不过是手性分离过的葡萄糖液和氨基酸而已。</p>
<p>　　"你现在明白为什么我要给杰克那混蛋干活了吧？"老酒鬼问德·丽尔夫人。</p>
<p>　　"因为你同我们一样。"德·丽尔夫人眨眨聪慧的睫毛，"真有意思，三十年前他从你手掌里逃脱，结果后来你反倒栽在他手心里。"</p>
<p>　　酒鬼莫尔斯脸一红，气急败坏地辩解道："我忍气吞声帮他干活是为了收集他的犯罪证据，你以为我真的是个老糊涂？你以为！"</p>
<p>　　他气冲冲地跑到宾利前。"还等什么，年轻人？把老杰克抓捕归案吧！"</p>
<p>　　“你以为你能跟上他的速度？”外乡人反问他。</p>
<p>　　老酒鬼摊开一张地图，"我已经在各个交叉路口设下重重路障，老狐狸这次插翅难飞！"外乡人一笑："你还想重蹈覆辙？"</p>
<p>　　老酒鬼一愣："怎讲？"</p>
<p>　　"674号公路与这块地方的其他八条公路根本没有交点！"</p>
<p>　　"不可能！"老酒鬼指着地图。</p>
<p>　　诚然，至少有两条公路与674号公路交错着，看起来如此。外乡人想起那个“水冷循环器”，看起来必须在瓶身上凿个孔才能让瓶颈弯进去。在三维世界这三条公路必然是交错的，但是在更高的维度呢……</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>　　“坐后面？”</p>
<p>　　“是的。我需要有双灵敏的手放在我的肩膀上，当前面出现左转弯时，便用你的左手掐我的左肩膀，右转弯时则用右手掐我的右肩膀。有位哲人说，习惯使我们的双手变得灵巧，却使头脑变得简单。我的父亲因为可怕的习惯送了命，并因此导致不可原谅的悲剧。我不想</p>
<p>　　重蹈他的覆辙。”</p>
<p>　　“我明白了。对于一个高明的车手来说，一些随机应变的操纵在专业训练下变得像本能一般迅捷，但是当左右反置后，这‘本能’却是极其危险的，因为这种反应根本没有经过大脑。”德·丽尔夫人长长的睫毛下明波流转。</p>
<p>　　“很对。那还得看我肩膀上的疼痛能否战胜强大的本能反应。”本意味深长地说。</p>
<p>　　"当然，老娘的手指可不是吃素的！没少掐那些想揩我油的臭男人。"德·丽尔夫人笑得花枝乱颤。引擎在同一时间启动，震耳欲聋的轰鸣声让现场的气氛一下子沸腾了。其他的警车却保持着难堪的沉默，因为他们知道674号公路不是他们所能驾驭的跑道，传奇的杰克·汉弥尔顿更是他们望尘莫及的遥远背影。</p>
<p>　　德·丽尔夫人把手轻放在本宽厚的肩膀上，她的手指就像灵敏的探针，可以把本的内心清晰地读出来。他真像他的父亲，我早就应该看出来，唉，晚了，我竟然会……</p>
<p>　　幸好，难以启齿的心理活动很快被撕破空气的啸叫打断了。</p>
<p>　　克尔维特轮胎在地面上疯狂地原地旋转，眨眼间便射了出去，漆黑的身躯很快便与沉沉夜幕融为一体。那是一辆魔鬼的跑车，只有在黑暗中，它才会爆发出令人望而生畏的力量。灰白色的宾利那粗大的排气管喷出愤怒的火焰，1600转就迸发650牛米的最大扭矩让它拥有一种与它的贵族血统极不相符的暴烈脾气。它化作一枚制导导弹紧紧咬住克尔维特的尾巴，身后的地平线与人群迅即像长镜头一般拉远……1954年，美国犹他州，巴纳维亚盐滩。电子表定格在4.996秒，这555米直线距离诞生了一条崭新的纪录。福特车手、摩托车手，甚至4000马力V10柴油发动机集装箱货车司机都疯狂地与年轻的杰克拥抱，只有一个冷峻清瘦的脸庞面朝着雪白的盐泽，冷冷地笑着。</p>
<p>　　"切，你知道'雷电'战斗机的时速是多少吗？每小时380千米。我在550米距离内跑进了5秒，我比它快！"杰克欣喜若狂地向他的伙伴历数世界的各项记录。</p>
<p>　　"你见过蝰蛇的行进路线吗？"切挂着意味不明的笑。</p>
<p>　　"什么？"</p>
<p>　　"沙漠中的蝰蛇行进的路线，那是多么美妙的波浪形，而你，只会让你的轮胎在一望无垠的盐泽上惯性前进，看那丑陋的笔直的辙印，不觉得羞耻吗？"</p>
<p>　　杰克呆住了，庆祝的人群把香槟洒在他头上，他却浑然不觉。</p>
<p>　　"弯道上的冠军才是真正的速度之王！"切丢下这句掷地有声的话，坐进他那辆与盐泽浑然一体的宾利绝尘而去，激起的细碎盐粒扑打在杰克僵硬的脸庞上，他舔到了满嘴的咸腥与苦涩。</p>
<p>　　"弯道上的冠军才是真正的速度之王！"三十多年前的那句话似乎从宽阔的盐湖泽上飘来，在这深壑空谷里激荡回响，老杰克的嘴角挤出一丝狞笑。他打开车载电脑，智能电脑迅速用醒目的红色标示着一个急剧的发夹形弯道。老杰克连减两个挡，右脚本能地大踩一脚刹车，克尔维特的尾部伴随一声嘶叫，向右滑移，他快速地回转方向盘，并重压油门，后轮乖巧地恢复抓地，停止横滑，两个固特异轮胎冒着青烟，几乎变形到它的物理极限，强行制止住惯性飘移，回归到正确的路线上。</p>
<p>　　连续几个缓弯与简单直角弯后，车手不祥的直觉袭遍了本的全身。前面几道深深的刹车痕迹划过他的眼球，"坐稳了！"他大喝一声。</p>
<p>　　在直升机上密切跟踪的CNN记者突然扯掉耳机，跳了起来："那小子在干什么？他的车速至少挂到四挡以上。他跟他的父亲一样是个疯子！他竟然想以全速穿过那个发夹弯！"机载雷达很快确定了宾利的车速：每小时180英里。</p>
<p>　　"当车达到一定加速度，人类眼球的晶状体就会像一个弹簧压缩至它的极限，这时眼睛四周的景物会模糊一片，我们只能看到两眼之间极狭小的一块，那也许就是你鼻尖上恐惧的汗珠。"三十年前父亲的声音萦绕在他的耳旁，就像变速箱内同步锁环内锥面与齿轮外锥面的摩擦音一般清晰。他毅然闭上眼睛，视网膜残留着前车尾灯的拖曳，让最后一帧嘲笑的画面见鬼去吧！他默数着三、二、一……他猛地将方向盘扭转了270度。</p>
<p>　　宾利发出协和客机着陆般可怖的摩擦音，车底盘的优质空气弹簧“铿”的一声断裂了——转弯时的侧倾超出了它的弹性极限。德·丽尔夫人尖叫一声，从安全带里飞出去横撞在钢制车身上，亏得德国莫泽尔工厂优良的历史传统，特型钢的车身承受住了她的撞击。尖利的石壁棱角像电锯一般切割着宾利碳纤维的车门，德·丽尔夫人的腮帮咯吱作响，就像有一把钢锉啮噬着她可怜的牙床。窗外火花飞溅，像礼花般绚烂。</p>
<p>　　CNN记者激动地一抖，尖叫道："他成功了！他牺牲掉一扇车门，让车身与石壁强行磨合，强大的摩擦修正了宾利的路线，现在他开始全速狂飙……宾利现在就像一头尖角涂着鲜血的公牛，它前进的呼啸甚至带动了道路旁的有刺灌木丛！现在已没有什么障碍可以阻挡它</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>　　德·丽尔夫人的嘴巴张成O状，眼睛一眨不眨地望着这个神奇的车手，似乎他浑身都在释放魔术般神秘莫测的气息。</p>
<p>　　一向少年老成的本在这火热的目光里也不禁有些发窘了。他下意识地挠挠肩膀，又左张右望一下，说：“小姑娘，如果你愿意的话，你可以一直搭我的顺风车，走遍这个世界的每一个地方。”</p>
<p>　　哦！上帝。德·丽尔夫人的胸口像引擎盖一样"突突突"跳动，心脏蹦得比昨晚那场弯道惊魂还要难以控制。她一脚把一个试图爬上车来的记者踢下去，目光落在本惨不忍睹的肩膀上，莞尔一笑，用小姑娘的声音说："我当然愿意。只是，你真的不怕我掐吗？"</p>]]></content:encoded>
            <author>rexwangcc@gmail.com (Rex Wang)</author>
        </item>
        <item>
            <title><![CDATA[(转译) Bun 炒作：我们从 Yarn 中学到了什么]]></title>
            <link>https://rexwang.cc/articles/2025-yarn-tragedy</link>
            <guid>https://rexwang.cc/articles/2025-yarn-tragedy</guid>
            <pubDate>Sun, 16 Mar 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<img alt="" loading="lazy" width="3932" height="2622" decoding="async" data-nimg="1" style="color:transparent" srcset="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fyarn-tragedy-cover.12fb21d5.webp&amp;w=3840&amp;q=75 1x" src="/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fyarn-tragedy-cover.12fb21d5.webp&amp;w=3840&amp;q=75">
<p>最近被迫需要摸一下 yarn 和 bun 的项目，在作对比的过程中发现了一篇很有意思的观点文章，通读之后感觉蛮有意思，因此让克劳德翻译了一下全文贴在这里；原作者是
The Jared Wilcurt，原文地址在 dev.io 上，如果有兴趣建议<a href="https://dev.to/thejaredwilcurt/bun-hype-how-we-learned-nothing-from-yarn-2n3j">阅读原文</a>。</p>
<hr>
<div class="justify-center flex"><p class="italic">译文如下</p></div>
<hr>
<h2>Bun 炒作：我们从 Yarn 中学到了什么</h2>
<h3>bunjs | javascript | node | npm</h3>
<p>历史再次重演，我们正在犯同样的错误。我经常被提醒，每5年全球程序员数量就会翻一番，这意味着在任何时候，行业中50%的人员经验不足5年。这可能就是为什么我们不断被 Bun 这类东西所吸引的原因。但我曾经见过这种情况，我知道结局如何。</p>
<h3>第一部分 - Yarn 的故事</h3>
<p>我看到 Yarn 和 Bun 之间有很多相似之处。两者都针对现有的开源系统，但不是实际贡献，而是创建了自己的竞争技术。两者都以速度更快为卖点。两者都以分裂生态系统为目标。两者都没有良好的向后兼容支持。两者都宣布他们已经正式发布 v1.0 并可用于生产环境！...但实际上却不支持 Windows（也就是说：实际上根本就不能称为生产就绪）。</p>
<p>那么 Yarn 后来怎么样了？它推出了十几个 npm 没有的新功能。它的速度比 npm 快了好几倍。但是...仅仅一年后，npm 已经比 Yarn 更快了。又一年后，Yarn 发布了一篇博客文章，解释了为什么他们最终不可能比 npm 更快，因为 npm CLI 是由负责存储和下载包的 npm 服务器的同一批人创建的。时至今日，这一点仍然成立。在2023年，npm 仍然比 Yarn 更快。它最初的主要卖点...在5年内都不再相关。</p>
<p>但是 Yarn 提供的其他功能呢？随着时间的推移，越来越多的功能被实现并在 npm 中发布，截至今天，Yarn 曾经提供的所有独特功能都已内置到 npm 中。当然，这些功能的实现方式略有不同，对于那些真正关心 Yarn、Lerna、Turbo 和 npm 处理单仓库管理的细微差别的人来说，可能更喜欢其中一个。但对于绝大多数用例来说，npm 实现这些功能的方式对几乎所有用户来说都足够好。</p>
<p>啊，但是 Bun 肯定不同，对吧？毕竟，它是用 ZIG 编写的！而 ZIG 超级快...对吧？呃，不完全是。它没有做任何魔法般的事情，最终您可以用 ZIG 实现的任何性能也可以用 C++（Node.js 的编写语言）实现。所以，就像旧的缓慢的 npm 的故事一样，一旦性能被优先考虑，npm 就能达到与竞争对手相同（甚至更快）的速度。我可以看到 Node 也会发生类似的情况。如果给予适当的关注，应该可以达到大致相当的速度，直到差异变得可以忽略不计。好吧...某种程度上。我们应该承认，Bun 吹嘘的一些基准测试是精心挑选或具有误导性的。所以，即使 Bun 也不能达到它自己营销炒作的水平。但您明白我的意思。</p>
<p>回到 Yarn 的寓言。当 Yarn 出现时，它声称支持 Windows。但是没有一个为 Yarn 工作的 Facebook 开发人员将 Windows 作为他们的主要操作系统。所以他们很快发现，Yarn 实际上在发布时不能在该平台上运行。</p>
<p>简短的题外话：你好，Primagen（其他人可以跳过这段）。我知道，你已经对 Windows 做了一个刻薄的评论。但也许你应该尝试真正重视我们社会中的多样性，接受不同的生活方式。我的意思是，我理解。我完全理解，Windows 用户只占计算机用户的一个非常非常小的少数，仅90%。但也许...我们应该尊重这个几乎不引人注意的少数群体。:)</p>
<p>回到故事。</p>
<p>所以大约两周后，他们终于"修复"了它，Yarn 可以在 Windows 上安装和运行了...勉强可以。实际上，直到他们转向使用 corepack，我才能在 Windows 上可靠地运行 Yarn。一旦您可以通过 npm 安装 corepack，然后在上面安装 Yarn（或 pnpm），它终于以可靠、无错误、不崩溃的方式与 Windows 兼容了。但到那时，Facebook 已经放弃了 Yarn，慢慢地，其他人也放弃了，当它开始在 Windows 上运行时，它已经开始衰落了。</p>
<p>直到今天，我仍然无法在 Windows 上运行 Yarn 单仓库。我确信这是不可能的。任何声称他们成功运行的人都在骗你。当然，也许在某些没有安装任何东西（甚至没有 Windows 更新）的 Windows 虚拟机中，也许有人让 Yarn 单仓库在 Windows 上运行了几秒钟。也许他们还在森林里看到了大脚怪。任何事情都可能发生。但在真正的开发人员笔记本电脑上，PATH 中有随机内容，安装了 Node 和 nvm-windows 和 volta 以及谁知道还有什么其他随机东西，不，它不工作。</p>
<p>好吧，所以 Yarn 出现了，迫使 npm 变得更好，然后消亡了。有什么问题呢？如果这就是它所做的一切，那么 Yarn 会很棒，但可悲的是事实并非如此。npm 专注于开发和发布绝大多数用户需要的功能。但 Yarn 专注于 Facebook 需要的功能。其中许多对99%使用 npm 的人来说并不重要。然而，一旦人们开始使用 Yarn，npm 不得不重新优先考虑他们要开发和发布的功能。与其提供对更多用户更相关的更高价值功能，他们不得不迅速追赶并添加与 Yarn 提供的功能相当的功能，以避免生态系统分裂。但 Yarn 营销得很好，人们买账了。当它出现时，即使是我也对 Yarn 充满期待，直到我发现它实际上不能在 Windows 上运行。但其他人没有意识到这一点，或者不关心这一点，并采用了它...然后...然后...</p>
<p>...然后 Yarn 变成了部落化。愚蠢的人类。一切都必须变成部落化。几年来，有成千上万的 README 文件创建在项目上，它们只告诉你 Yarn 安装项目的指令。这让新开发人员感到困惑。我无法告诉你有多少初级开发人员来找我，询问这个"Yarn 东西"是什么，以及他们是否需要它。以为他们发现的项目只能与 Yarn 一起工作。这浪费了所有人的时间和精力。</p>
<p>我一直认为 Facebook 的某个人发现，说服他们的老板让他们花时间为他们不能获得荣誉的开源项目添加功能是一个很难的卖点。如果他们可以将其用于招聘营销或类似目的，那么获得批准从事这些功能的工作可能更容易。它总是散发着"不是在这里发明的"综合症的气味。</p>
<p>如果 Facebook 只是为 npm 贡献他们想要的功能，那么他们的功能就会与 npm 已经在开发的功能一起发布。但相反，它延迟了这些其他功能的发布多年，导致重复工作。而这一切是为了什么？Yarn 基本上已经死了，除了少数特殊情况。但在过去一两年里，我没有在 README 中看到 yarn add。这是过去时代的标志。</p>
<h3>第二部分 - Bun 实际上更糟糕</h3>
<p>与 Yarn 不同，Yarn 提供速度和十几个新功能，Bun 提供速度和大约3个新功能。让我们简要地回顾一下它们。</p>
<p>宏（Macros）- 在构建过程中使用。有些人称其为错误。我最大的担忧是，您的构建过程现在被 Bun 卡住了。除非其他工具有等效的宏系统，否则您无法切换到其他工具，或者您需要重写构建过程。您正在选择未来的技术债务。</p>
<p>bun.x APIs - 这些是新的 API，它们字面上做与 Node.js API 相同的事情，但"更快"。这比宏更糟糕，因为现在您的代码是 Bun 病毒。如果我 npm install 您的包并在 Node 中运行它，当尝试使用您的库时，我会得到 ReferenceError: Bun is not defined。迫使您库的所有用户采用 Bun。这是对生态系统的另一次强制分裂，类似于 Yarn 所做的，但更糟糕。</p>
<p>我也许可以看到一些包装库，您导入它，检查 bun 是否存在，如果存在则使用更快的 API，如果不存在则回退到 Node。如果 Bun 变得稍微流行，我想这将非常普遍。但这只是您项目中需要维护的另一个依赖项，这在某种程度上违背了"一体化"系统的目的，如果使用它的每个人都必须安装额外的工具库来使其更易于使用，那么您可以跳过拥有工具依赖项。</p>
<p>元语言支持 - Node.js 应该内置 Vue-Template-Compiler 吗？问这个问题听起来绝对疯狂。Markdown、Sass 或 CoffeeScript 呢？是的，让所有东西都建立在上面的主平台内置这些将是非常愚蠢的。这会让人感觉非常短视。</p>
<p>元语言的存在是为了填补原始语言中的空白，它们本质上是非永久性和灵活的。它们就像在您驾驶经过原始语言中的坑洼时为您的车添加非常好的悬挂系统。直到原始语言能够填补这些坑洼。我们不再使用 CoffeeScript 是有原因的，它提供的大多数功能都在 ES6 中被添加到语言中。CSS 已经慢慢添加了一些"足够好"的等效功能来对应 Sass 的高价值功能，之后我们看到 Sass 使用量首次下降。但是我们现在有了最糟糕的模板系统 JSX 和最有争议的前端工具 TypeScript 内置到 Bun 中。</p>
<p>TypeScript 的使用在2020年左右达到平稳期（JS 生态系统中有三分之一多一点采用了它），在过去一年中，随着更好、更简单的替代方案如 eslint-plugin-jsdocs（从这里开始）和潜在的基于注释的 ES202X 官方类型系统取代它，它终于显示出第一个衰退迹象，这可能导致创建 .ts 文件的需求迅速下降。随着这些坑洼被填补，TypeScript 将需要寻找新的坑洼来尝试平滑并证明其存在的必要性，或者接受它的工作已经完成并慢慢消失。就像所有其他我们已经超越其实用性的曾经有用的技术一样（LESS、Stylus、Sass、CoffeeScript、Yarn、Grunt 等），它永远不会真正消亡。</p>
<p>Sass 是一个很好的例子。在某个时候，约96%的前端开发者使用它，满意度超过90%（2019年CSS状态）。但随着元语言的API演变为变得更加复杂以解决更复杂的问题，它的使用和满意度都下降了。它不再专注于成为适合所有人的简单工具，而是专注于成为适合做非常高级事情的人的非常高级工具。一个更加小众的用途。</p>
<p>我一直在想，如果 Bun 在前几年出现，它会由什么奇怪的技术混合体组成，今天它们会被困在维护什么样的遗留代码。如果它在2019年 Sass 的巅峰时期出现，基本上每个人都在使用它，将其内置到 Bun 中完全有意义，对吧？但是当所有 Sass API 更改并且旧的导入系统完全被弃用时，你会怎么做？通常，您只需为项目 npm install 您需要的 Sass 版本，如果这是您的代码工作的版本并且您不想升级，则固定旧版本。但是如果您为此使用 Bun，然后几年后回来，现在项目就无法构建了，因为 Bun 中的 Sass 版本与您编写的 Sass 代码不兼容，您需要花一天时间尝试弄清楚您的代码实际需要什么版本，并手动安装正确版本的 Sass 以使您的项目再次运行。这就是为什么将元语言内置到 Node.js 或扩展的 Bun 中是疯狂的原因。但这是他们所做的，我预见未来对那些严重依赖它而不是简单快速方便的人会有痛苦。</p>
<p>最后一个，内置的元语言，有点倾向于 Bun 真正是什么。它只是一堆技术的抽象层。它不是一个真正的替代品或竞争对手，它实际上是完全相同的东西，只是已经内置了。这在纸面上听起来不错，但最终相当糟糕。</p>
<p>抽象可以很好，并简化事情。让我们以 Webpack 为例。Webpack 是...嗯，就是可怕的。没有人喜欢处理它。这就是为什么每个 JS 框架都必须为它构建一个抽象层，因为没有人想接触 Webpack。像 Angular-CLI、Create-React-App、Svelte-CLI 或出色的 Vue-CLI（甚至有一个 GUI）。我们以 Vue 为例，因为它在所有这些抽象中做得最好。vue.config.js 文件是一个简单的配置，它抽象了 Webpack 的所有复杂性，同时如果需要，仍然给您相同级别的控制。它还将依赖项数量从大约30个减少到大约3个。但后来 Vue 的创建者 Evan You 制作了 Vite。vite.config.js 基本上与 vue.config.js 具有相同级别的复杂性，只是不需要他们维护一个完全独立的项目（Vue-CLI）来使其变得这样。从 Vue-CLI 切换到 Vite，我最终拥有相同数量的依赖项和相同数量的配置代码。最终结果是 Vite 是 ESBuild 的抽象层，使用起来与它所替代的最佳抽象层一样简单。</p>
<p>但 Bun 没有这样做。它不是将困难的事情变成更简单的抽象。它接受 ESBuild 并像 Vite 一样抽象它。这不是一个改进，它基本上是相同的东西。对于单元测试也是这种情况。他们甚至不假装提供新东西，而是告诉您像正常的 Jest 或 Vitest 那样编写代码，他们只会劫持导入并在幕后用自己更快的代码替换它们。</p>
<p>Bun 只是我们已经拥有的工具之上的抽象层。这意味着它将始终落后于曲线，并可能在该层引入额外的错误。对于安装依赖项、测试代码和构建要发送到生产的代码等关键系统来说，这不是理想的。</p>
<p>但我们甚至还没有讨论 Bun 做的最糟糕的两件事，以及真正可怕的部分。</p>
<h4>Windows</h4>
<p>我挑剔 Yarn 对 Windows 的糟糕支持。但与 Bun 相比，它们看起来很棒。至少当他们发布它时，他们有某种程度的 Windows 支持。它只是偶尔勉强工作，但它存在。然而，在 Bun 吹嘘的几十个功能中，当它作为"版本1.0"发布时，甚至没有一个在 Windows 上受支持。</p>
<p>"Windows 构建是高度实验性的，不适合生产环境。只启用了 JavaScript 运行时；包管理器、测试运行器和打包器已被禁用。性能未优化。" - 官方 Bun 1.0 博客文章</p>
<p>所以想象一下，他们刚刚发布并展示了所有这些他们感到兴奋并希望人们使用的酷功能。更可能发生的是什么？随着成千上万的人开始使用它并提供反馈、发现错误、请求功能、需要支持，您认为他们会：</p>
<p>A. 在接下来的一年中完全忽略所有新用户，专注于实现完整的功能对等性并制作一个经过打磨的、坚固的、可靠的、超快的、与 Windows 兼容的构建。可能会扼杀他们从初始炒作周期中建立的任何动力，甚至可能失去他们一直依赖的风险投资资金。</p>
<p>B. 将他们非常小的团队的几乎所有精力集中在保持现有用户满意上，通过改进已经基本工作的 Linux/OSX 版本，使产品看起来维护良好并可以在这些社区中慢慢获得采用，同时被部落开发者病毒式传播，他们故意创建不可移植的代码，知道它在 Node 中甚至在 Windows 上都不会工作。</p>
<p>我真诚地相信他们有意在 Windows 上构建和运行版本。我只是一秒钟都不相信在1.0版本发布一年后，他们将在 Windows 版本中实现功能对等。也许到那时 Windows 版本将与版本1.0具有功能对等性，但我怀疑他们会停止一年的 Linux 版本的所有工作。在那一点上，两种 Bun 口味将彼此不同步，导致混乱。</p>
<p>这让我们进入 Bun 最大的缺失功能。</p>
<h4>没有 Bun 版本管理器</h4>
<p>在他们放入 Bun 的所有工具中，他们没有内置的一个工具是版本管理器。对我来说，这是疯狂的。我认为 Node.js 没有内置版本管理器实际上也是疯狂的。让我们分解一下。在 Node.js 上，我有：</p>
<ul>
<li>nvm - 在 linux/osx 上基本上工作正常，但有一些烦恼。</li>
<li>nodist - 很棒，但只适用于较旧版本的 Windows。</li>
<li>nvm-windows - 适用于较新的 Windows 版本，但几乎无法工作并且充满错误。</li>
<li>volta - 具有所有版本中最糟糕的 API，但也是最稳定和可靠的，可在所有操作系统上运行，甚至是非常旧的 Windows 版本。</li>
</ul>
<p>为什么我必须了解这4个工具？这很愚蠢。但比必须处理4个做同样事情的工具更糟糕的是根本没有任何工具。</p>
<p>Node.js 比 Bun 更专注于向后兼容性。但随着时间的推移，即使是 Node 也废弃了它们 API 的部分内容。很多时候，这是 V8 引擎本身废弃功能的结果。Node.js 实际上在某种程度上参与了 V8 的方向，即使有一定程度的输入，他们也不可能避免所有的破坏性变更和废弃，导致旧的 Node.js 代码在较新版本的 Node 上根本无法工作。</p>
<p>所以我一秒钟都不相信 Bun 在第一次尝试时就把所有事情都做对了，并且它的任何部分都不会随着时间而改变，以及您在其中编写的所有代码将永远工作。特别是因为他们继承了将会出现在他们使用的 Apple Webkit JS 引擎中的任何废弃。</p>
<p>一年后当 Linux 上的 Bun 1.8 出来，但 Windows 刚刚达到1.0会怎样。在我工作的地方，我团队中的开发人员使用不同的操作系统（Linux、OSX、Windows）。如果我们不能自由地在 bun 版本之间切换，那么我们的 Linux 用户将无法降级到版本1.0，这样我们就可以使用相同的功能（慷慨地假设到那时会发布 Windows 版本）。</p>
<p>我们作为 Web 开发人员使用 Grunt 进行构建工具。然后 Gulp 出现并简化了这个过程，我们转向了它。然后 Gulp 4 出现并完全改变了 API，没有人想处理这个问题，所以我们转向 npm 脚本进行基本的构建自动化。但后来我们想要实际的打包能力和树摇动。所以，作为整个 JS 社区，我们转向了 Webpack（或更准确地说，它之上的抽象）。但 Webpack 很慢且烦人，所以当 Vite 出现时，我们都转向了它。</p>
<p>但是你知道吗？我并不热爱 Vite。现在它是最好的吗？是的，它是。但有些地方我希望更好。随着时间的推移，将会确定越来越多的这些问题，有人会不可避免地制作一个比 Vite 更好的新工具，我将愉快地转向它。不是因为我喜欢改变工具，而是因为从实用的角度来看，它会更好，我会看到其中的价值并转向它。就是这样。</p>
<p>即使您认为"不，我们的工具没有什么可做的了，我们已经完善了压缩"。您认为我们已经完善了网络上的一切吗？今天存在的网络功能在10年前不存在的是什么？假设10年后，我们终于在浏览器中有了一些替换 Web 组件且不糟糕的东西？我们难道不需要某种形式的新构建工具来转换我们的代码并利用这些原生功能吗？就像我们今天所做的那样？随着网络和互联网协议的变化和改进，我们如何为它们优化我们的包也会改变。网络一直在变化和进化。它从未停止。它将继续变化，我们的工具将继续对这些变化做出反应。</p>
<p>Bun 正在抽象的一切也将如此。它什么时候决定放弃其 ESBuild 抽象并切换到那个新东西？如果它切换得太早，而社区转向其他东西，它需要再次切换怎么办？你只能做这么多来保护你的终端用户免受 API 变更的影响。如果所有 Bun 用户都需要维护一堆 ESBuild 插件来与 Bun 一起工作，然后 ESBuild 从底层移除并替换，那么这些用户就会被困在旧的 Bun 版本上。</p>
<p>当您使用 Bun 来处理您的构建和您的核心 JS 运行时和您的测试工具时会发生什么。然后 Bun 对这些系统之一进行重大破坏性更改，需要大量技术债务来更新您的代码库以能够切换过去。也许您的所有测试都需要升级才能与新系统一起工作（我在工作代码库中进行了3次重大测试重构，最长的一次花了约6个月才完成，这种事情会发生）。升级所有代码可能需要数月，甚至整整一年。在此期间，您被困在旧版本的 Bun 上，直到所有内容都与新版本一起工作。但是，哦不！在 JS 运行时中发现了一个重大安全问题。所以您需要更新 JS 运行时，但您不能这样做，因为您的 JS 运行时和您的构建工具和您的测试工具都是相同的。在您的重大测试重构完成之前，您的代码是有漏洞的。在某些行业，您需要在一定时间窗口内解决安全问题。对这些人来说，Bun 是不可行的。</p>
<p>他们有办法处理这个问题，比如提供多个构建工具或测试工具，让您通过 CLI 参数切换到新的或旧的。但他们支持多个内置的替代工具多长时间？他们能负担得起支持所有这些吗？</p>
<p>随着他们内置到 Bun 中的所有各种工具抽象，只是时间问题，将所有这些粘合在一起的东西将变得太难以管理。Node、npm、Jest、Vite 等。这些都是每个工具单独解决的大型且非常复杂的问题空间。甚至 Vitest，在底层与 Jest 共享约80%的代码，仅尝试处理另外20%就是一项重大努力。</p>
<p>当 JavaScript Shadow Realms 发布时会发生什么？Vitest 已经计划采用 Shadow Realms 作为隔离 JavaScript 测试而不必启动新 Node 进程的方法。如果我的 Vitest 代码依赖于在这种隔离模式下运行，而 Bun 决定劫持我的导入而不是使用实际的 Vitest 导入，突然我的测试可能会开始随机失败，除非从等式中移除 Bun，否则我无法做任何事情，直到他们可以更新他们底层的代码以使用 Shadow Realms。但如果 realm 被添加到 V8 中，但是 Apple 拖延几年在 Safari 中添加支持（他们经常这样做）怎么办？在这种情况下，Bun 除了制作自己的内部原生 shadow realm 实现直到该功能内置到 Webkit 中外，别无选择。这将是一项相当大的工作，而且对于可能出现的其他类似问题来说，从长期来看不是一个非常可扩展的解决方案。</p>
<p>所有这些原因以及更多，就是为什么 Bun 版本管理如此重要。以及为什么将这么多工具合并为一个在纸面上听起来没有那么好。</p>
<h3>第三部分 - 随机想法</h3>
<ul>
<li>如果 Bun 在2012年出现，它会内置 Grunt。</li>
<li>如果 Bun 在2014年出现，它会内置 Gulp。</li>
<li>如果 Bun 在2016年出现，它会内置 Webpack。</li>
<li>如果 Bun 在2018年出现，它会内置 Rollup。</li>
<li>如果 Bun 在2020年出现，它会内置 ESBuild。</li>
<li>2026年会发生什么？</li>
</ul>
<p>2014年，Meteor JS 出现并承诺在一个前端/后端框架中完成所有事情。它会为您处理 websockets，并进行 DOM 的响应式更新，假设后端成功但如果请求失败则自动回滚 UI，使 UI 感觉非常快速和敏捷。它允许多人在同一页面上实时交互内容。而您所要做的就是使用他们的一体化 CLI 在本地运行您的项目，并使用您自己的自定义项目名称部署到免费的在线测试床。</p>
<p>2023年，我尝试再次运行我的2014年 Meteor 项目，与项目兼容的 CLI 版本不再存在，没有完全重写整个项目到最新版本的 Meteor，该项目无法在本地运行或部署。2014版本的所有文档都消失了。</p>
<p>我以前看过这部电影，我知道它如何结束。</p>
<h3>第四部分 - 最终想法</h3>
<p>在这篇文章中我对 Bun 非常苛刻，不是因为它很糟糕，而是因为它几乎是好的。人们会很兴奋地尝试它，却没有意识到所有的缺点。再次，就像 Yarn 一样，我对 Bun 也相当兴奋。但我已经控制了我的兴奋，从实用和历史的角度看待它。</p>
<p>如果 Bun 真的做到了它声称的一切，那么我100%会支持它。但是不可移植的代码，完全缺乏 Windows 支持，以及他们做出的一些短视选择让我回到现实。</p>
<p>我希望这些批评会导致 Bun 的改进。我希望这种思考过程将允许其他人从更谨慎和深思熟虑的角度看待 Bun。我希望这些关于 Yarn 和 Meteor 的故事能让我们作为一个社区从过去中学习。</p>
<h3>第五部分 - 我对未来的预测</h3>
<ul>
<li>Bun 挑选的大多数项目将在未来一年左右获得性能改进，缩小它们与 Bun 之间的差距。</li>
<li>您将开始看到越来越多的仓库在它们的 README 中提到 Bun，可能是独家的。</li>
<li>所有在6个月后辞职第一份开发工作成为 YouTube 编码影响者的开发人员都会制作一个"BUN 是未来 OMG"视频，并带有这个缩略图。希望它能诱使人们观看他们关于 Bun 的12部分教程系列。点赞并订阅。</li>
<li>我们还没有完善我们的工具。随着我们继续发展并发明更新更好的选择，Bun 将难以跟上，人们将慢慢减少使用它，因为他们变得不耐烦，愿意安装依赖项，如果这意味着一个比他们拥有的更好、更实用的解决方案。</li>
<li>Bun 可能会存在大约5年。这似乎是大多数类似工具的寿命。</li>
<li>Bun 最终会有非常非常好的 Windows 支持...可能就在人们停止使用它的时候。</li>
<li>由于某种原因，Bun 从不添加版本管理器，而是出现4个竞争选项，都以不同方式糟糕。</li>
<li>20XX年，我们终于将最后一个 CJS Node 模块转换为 ESM。这只有在人类最终屈服让 AI 接管后才可能实现。值得吗？</li>
<li>乔拜登将获得第二个任期，但是，没有人真正对此感到高兴。</li>
<li>事实证明，那个 Yarn 家伙确实看到了大脚怪。现在我为取笑他感到难过。老实说，《哈里与亨德森一家》可能值得重看。</li>
<li>Vue 仍然比其他一切都好，但人们只会使用 YouTube 编码者说的热门新事物，因为如果不是，他们为什么要制作20个关于它的教程视频？</li>
<li>他们将重拍《绝命毒师》，而且不会很好。</li>
<li>Primagen 聊天中的某个人实际上第一次是对的。你知道他在 Netflix 工作吗？</li>
</ul>]]></content:encoded>
            <author>rexwangcc@gmail.com (Rex Wang)</author>
        </item>
    </channel>
</rss>