Windows 驱动程序入门

驱动程序入门

从这里开始学习有关驱动程序的基本概念。

你应熟悉 C 编程语言,并且应了解函数指针、回调函数以及事件处理程序的理念。若要基于用户模式驱动程序框架 1.x 编写驱动程序,则应熟悉 C++ 和 COM。

什么是驱动程序?

 

为术语“驱动程序”给出单一的准确定义比较困难。就最基本的意义而言,驱动程序是一个软件组件,可让操作系统和设备彼此通信。例如,假设应用程序需要从设备中读取某些数据。应用程序会调用由操作系统实现的函数,操作系统会调用由驱动程序实现的函数。驱动程序(由设计和制造该设备的同一公司编写)了解如何与设备硬件通信以获取数据。当驱动程序从设备获取数据后,它会将数据返回到操作系统,操作系统将数据返回至应用程序。

图:显示应用程序、操作系统以及驱动程序

 

扩大定义

到目前为止,我们的说明采用以下几种方式进行简单化:

  • 并非所有驱动程序都必须由设计该设备的公司编写。在多种情形下,设备根据已发布的硬件标准来设计。这表示驱动程序可以由 Microsoft 编写,设备设计者无须提供驱动程序。
  • 并非所有驱动程序都直接与设备通信。对于给定的 I/O 请求(如从设备读取数据),通常有一些驱动程序(在堆栈中进行分层)参与该请求。可视化堆栈的传统方式是将第一个参与对象放在顶部,将最后一个参与对象放在底部,如此图所示。堆栈中的某些驱动程序可能通过将请求从一种格式转换至另一种格式来参与。这些驱动程序不会与设备直接通信;它们只操纵请求并将请求传递至堆栈下方的驱动程序。图:显示应用程序、操作系统、3 个驱动程序以及设备
  • 堆栈中直接与设备通信的一个驱动程序称为“函数驱动程序”;执行辅助处理的驱动程序称为“筛选器驱动程序”
  • 某些筛选器驱动程序遵守并记录有关 I/O 请求的信息,但不会主动参与这些请求。例如,某些筛选器驱动程序充当验证程序以确保堆栈中的其他驱动程序正确处理 I/O 请求。

我们可以扩大“驱动程序”的定义,方法是表示驱动程序为遵守或参与操作系统与设备之间通信的任一软件组件。

软件驱动程序

我们的扩大定义相当准确,但仍不完整,原因是某些驱动程序与任何硬件设备根本不关联。 例如,假设你需要编写可以访问核心操作系统数据结构的工具,这些结构仅可以由内核模式下运行的代码进行访问。可以通过将工具拆分成两个组件来执行该操作。第一个组件在用户模式下运行且提供用户界面。第二个组件在内核模式下运行且可以访问核心操作系统数据。在用户模式下运行的组件称为应用程序,在内核模式下运行的组件称为“软件驱动程序”。软件驱动程序与硬件设备不关联。有关处理器模式的详细信息,请参阅用户模式和内核模式

此图说明了与内核模式软件驱动程序通信的用户模式应用程序。

图:显示应用程序和软件驱动程序

其他说明

软件驱动程序始终在内核模式下运行。编写软件驱动程序的主要原因是获取对仅在内核模式下可用的受保护数据的访问权限。但是设备驱动程序不会始终需要访问内核模式数据和资源。因此某些设备驱动程序在用户模式下运行。

有一系列的驱动程序我们尚未提及,“总线驱动程序”。若要了解总线驱动程序,你需要了解设备节点和设备树。有关设备树、设备节点以及总线驱动程序的信息,请参阅设备节点和设备堆栈

到目前为止,我们的说明过度简化了“函数驱动程序”的定义。我们表示设备的函数驱动程序为堆栈中直接与设备通信的一个驱动程序。对于直接连接到外围组件互连 (PCI) 总线的设备而言,以上为真。PCI 设备的函数驱动程序获取映射到设备上端口和内存资源的地址。函数驱动程序通过写入这些地址直接与设备通信。但是在多种情形下,设备未直接连接到 PCI 总线。相反设备连接到的主机总线适配器连接到 PCI 总线。例如,USB toaster 连接到主机总线适配器(称为 USB 主控制器),该适配器连接到 PCI 总线。USB toaster 具有函数驱动程序,USB 主控制器也具有函数驱动程序。toaster 的函数驱动程序与 toaster 间接通信,方法是将请求发送至 USB 主控制器的函数驱动程序。然后,USB 主控制器的函数驱动程序与 USB 主控制器硬件直接通信,该硬件与 toaster 通信。

图:显示 USB toaster 驱动程序和 USB 主控制器驱动程序

 

选择驱动程序模型

Microsoft Windows 提供了多种驱动程序模型,你可以使用这些模型编写驱动程序。最佳驱动程序模型的选择策略取决于你计划编写的驱动程序类型。下文介绍了这些选项:

  • 设备函数驱动程序
  • 设备筛选器驱动程序
  • 软件驱动程序
  • 文件系统筛选器驱动程序
  • 文件系统驱动程序

有关各种类型驱动程序之间差异的介绍,请参阅什么是驱动程序?设备节点和设备堆栈。以下部分说明了如何为每种类型的驱动程序选择模型。

为设备函数驱动程序选择驱动程序模型

当你设计一个硬件设备时,首先要考虑的事项之一就是你是否需要编写函数驱动程序。提出下列问题:

是否可以完全避免编写驱动程序?
如果必须编写函数驱动程序,则最好使用哪个驱动程序模型?

若要回答这些问题,请确定设备的何处可以容纳设备和驱动程序技术中介绍的技术列表。参阅该特定技术的文档,以确定是否需要编写函数驱动程序以及了解哪些驱动程序模型可供设备使用。

某些个别技术具有微型驱动程序模型。在微型驱动程序模型中,设备驱动程序由两个部分组成:一个部分处理常规任务,另一部分处理设备特定的任务。通常,Microsoft 编写通用部分,设备制造商编写设备特定的部分。设备特定的部分具有多种名称,其中大部分名称都共享前缀“微型”。以下是微型驱动程序模型中使用的一些名称:

  • 显示器微型端口驱动程序
  • 音频微型端口驱动程序
  • 电池微型类驱动程序
  • 蓝牙协议驱动程序
  • HID 微型驱动程序
  • WIA 微型驱动程序
  • NDIS 微型端口驱动程序
  • 存储器微型端口驱动程序
  • 流微型驱动程序

有关微型驱动程序模型的概述,请参阅微型驱动程序和驱动程序对

并非设备和驱动程序技术中列出的每项技术都有专用的微型驱动程序模型。特定技术的文档可能会建议你使用内核模式驱动程序框架 (KMDF);其他技术的文档可能会建议你使用用户模式驱动程序框架 (UMDF)。关键点是你应从研究特定设备技术的文档开始。如果你的设备技术具有微型驱动程序模型,则必须使用微型驱动程序模型。否则就遵循技术特定的文档中有关是使用 UMDF、KMDF 还是 Windows 驱动程序模型 (WDM) 的建议。

为设备筛选器驱动程序选择驱动程序模型

一些驱动程序频繁参与单个 I/O 请求(如从设备读取数据)。驱动程序在堆栈中进行分层,并且可视化堆栈的常规方法是将第一个驱动程序放在顶部,将最后一个驱动程序放在底部。堆栈具有一个函数驱动程序并且还可以具有筛选器驱动程序。有关函数驱动程序和筛选器驱动程序的介绍,请参阅什么是驱动程序?设备节点和设备堆栈

如果你准备为设备编写筛选器驱动程序,则确定设备的何处可以容纳设备和驱动程序技术中介绍的技术列表。查看特定设备技术的文档是否有关于选择筛选器驱动程序模型的任何指南。如果设备技术的文档未提供此指南,则首先考虑使用 UMDF 作为驱动程序模型。如果筛选器驱动程序需要访问的数据结构无法通过 UMDF 获取,则考虑使用 KMDF 作为驱动程序模型。在极端少见的情形中,驱动程序需要访问的数据结构无法通过 KMDF 获取,则使用 WDM 作为驱动程序模型。

为软件驱动程序选择驱动程序模型

未与设备关联的驱动程序称为“软件驱动程序”。有关软件驱动程序的介绍,请参阅什么是驱动程序?主题。软件驱动程序很有用,原因是这些驱动程序可以在内核模式下运行,这样为其提供了受保护操作系统数据的访问权限。有关处理器模式的信息,请参阅用户模式和内核模式

有关软件驱动程序,你的两个选项为 KMDF 和旧的 Windows NT 驱动程序模型。使用 KMDF 和旧的 Windows NT 模型,你可以在编写驱动程序时无须考虑即插即用 (PnP) 和电源管理。你可以改为专心于驱动程序的首要任务上。使用 KMDF,你不必考虑 PnP 和电源,因为框架会为你处理 PnP 和电源。使用旧的 Windows NT 模型,你不必考虑 PnP 和电源,原因是旧的驱动程序在与 PnP 和电源管理完全无关的环境中运行。

我们的建议是使用 KMDF,尤其是当你已熟悉 KMDF 时。如果你希望驱动程序与 PnP 和电源管理完全无关,则使用旧的 Windows NT 模型。如果你需要编写注意到电源转换或 PnP 事件的软件,则不能使用旧的 Windows NT 模型;必须使用 KMDF。

Note  在极少情形中,你需要编写注意到 PnP 或电源事件的软件驱动程序,并且驱动程序需要访问无法通过 KMDF 获取的数据,则必须使用 WDM。

为文件系统筛选器驱动程序选择驱动程序模型

有关为文件系统筛选器驱动程序选择模型的帮助,请参阅“文件系统微过滤驱动程序”和文件系统筛选器驱动程序

为文件系统驱动程序选择驱动程序模型

有关为文件系统驱动程序选择模型的帮助,请参阅文件系统微过滤驱动程序。+

 

编写第一个驱动程序

提供了三个练习,指导你完成编写和构建小型驱动程序的整个过程。第一个练习基于用户模式驱动程序框架 (UMDF),其他两个练习基于内核模式驱动程序框架 (KMDF)。

尽管因为稳定性和可靠性的缘故 UMDF 为首选模型,但 KMDF 提供了一个有吸引力的机会,可以编写非常小的 Hello World 驱动程序。使用 KMDF,你可以编写非常简短的驱动程序,仅实现两个函数。

这些练习之间彼此独立,因此你可以采用任何顺序选择仅做其中一个练习或所有练习。 要点是获取一些有关驱动程序代码编写和构建的早期实例体验。

 

windows 环境变量

Getting and setting environment variables

The variables can be used both in scripts and on the command line. They are usually referenced by putting special symbols in front of or around the variable name. For instance, to display the user home directory, in most scripting environments, the user has to type:

echo $HOME

On DOS, OS/2 or Windows systems, the user has to type this:

echo %HOME%

In Windows PowerShell, the user has to type this:

Write-Output $HOME

DOS, OS/2 and Windows (Command Prompt)

In DOS, OS/2 and Windows, the set command without any arguments displays all environment variables along with their values.

To set a variable to a particular value, use:

set VARIABLE=value

However, this is temporary. Permanent change to the environment variable can be achieved through editing the registry (not recommended for novices) and using the Windows Resource Kit application setx.exe. With the introduction of Windows Vista, the setx command became part of Windows.

Users of the Windows GUI can manipulate variables via <Control Panel:System:Advanced:Environment Variables>; through the Windows Registry this is done changing the values under HKCU\Environment (for user specific variables) and HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment (for System variables).

To set a variable whose name is in another variable:

set %VARNAME%=value

This feature allows certain interesting applications. For example, a uni-dimensional array of elements (vector) may be generated this way:

set VECTOR[%I%]=value of element subscript %I%

:MkVec
set VECNAME=%1
set i=0
:loop
    shift
    if "%1" == "" goto exitloop
    set /a i+=1
    set %VECNAME%[%i%]=%1
    goto loop
:exitloop
exit /B %i%

call :MkVec DOWNAME=Monday Tuesday Wednesday Thursday Friday Saturday Sunday

To see the current value of a particular variable, use:

echo %VARIABLE%

or

set VARIABLE

Note: Please take note that doing so will print out all variables beginning with ‘VARIABLE’. Another example is:

C:\> set p
Path=c:\.. ..
PATHEXT=.COM;.EXE;.BAT;
PROCESSOR_ARCHITECTURE=.. ..
PROCESSOR_IDENTIFIER=x8..
PROCESSOR_LEVEL=6..
PROCESSOR_REVISION=1706..
ProgramFiles=C:\Program.. .
PROMPT=$P$G

To see the value of an array element a double expansion is required: one for the subscript value and an additional expansion for the array element. This may be achieved via Delayed !VARIABLE! Expansion this way:

set DOW=value of Day of Week (1..7)
echo !DOWNAME[%DOW%]!

To delete a variable, the following command is used:

set VARIABLE=

Windows PowerShell

To set a system variable:

Set-Content -Path Env:VARIABLE -value value
$Env:VARIABLE = value # alternate form

Examples of DOS environment variables

%COMSPEC%

This variable contains the full path to the command processor, command.com.

%PATH%

This variable contains a semicolon-delimited list of directories in which the command interpreter will search for executable files. Equivalent to the Unix $PATH variable (although note that PATH on Windows additionally performs the same task as LD_LIBRARY_PATH on Unix-like systems). Note that %PATH% can also be set like this PATH=c:\dos; where SET isn’t required.

%TEMP% and %TMP%

These variables contain the path to the directory where temporary files should be stored.

Examples from Microsoft Windows

Discrete value variables

These variables generally expand to discrete values, such as the current working directory, the current date, or a random number. Some of these are true environment variables and will be expanded by all functions that handle environment variables. Others, like %CD% simply look like environment variables and will only be expanded by some functions and shells. They are not case sensitive.

%CD%

This variable points to the current directory. Equivalent to the output of the command cd when called without arguments.

%DATE%

This variable expands to the current date. The date is displayed according to the current user’s date format preferences.

The following is a way of reformatting the date and time for use in file copies. The example assumes UK format of day month year and the time is set for a 24 hour clock.

@echo off
echo %DATE% %TIME%
for /F "tokens=1-3 delims=/" %%a in ("%DATE%") do set MTH=%%a& set DAY=%%b& set YR=%%c
for /F "tokens=1-3 delims=:." %%a in ("%TIME%") do set HR=%%a& set MIN=%%b& set SEC=%%c
if "%HR:~0,1%"==" " set HR=0%HR:~1,1%
set MYDATE=%YR%%MTH%%DAY%-%HR%%MIN%%SEC%
echo %MYDATE%
%ERRORLEVEL%

This variable points to the current error level. If there was an error in the previous command, it is checked against this.

%RANDOM%

This variable returns a random number between 0 and 32767.

%TIME%

This variable points to the current time. The time is displayed according to the current user’s time format preferences.

System path variables

These variables refer to locations of critical operating system resources, and as such generally are not user-dependent.

%AppData%

Contains the full path to the Application Data directory of the logged-in user. Does not work on Windows NT 4.0 SP6 UK.

%LOCALAPPDATA%

This variable is the temporary files of Applications. Its uses include storing of Desktop Themes, Windows Error Reporting, Caching and profiles of web browsers.

%ComSpec%

This variable contains the full path to the command processor; on Windows NT based operating systems this is cmd.exe, while on Windows 9x and ME it is the DOS command processor, COMMAND.COM.

%PATH%

This variable contains a semicolon-delimited (do not put spaces in between) list of directories in which the command interpreter will search for an executable file that matches the given command. Equivalent to the Unix $PATH variable.

%ProgramFiles%

This variable points to Program Files directory, which stores all the installed program of Windows and others. The default on English-language systems is C:\Program Files. In 64-bit editions of Windows (XP, 2003, Vista), there are also %ProgramFiles(x86)% which defaults to C:\Program Files (x86) and %ProgramW6432% which defaults to C:\Program Files. The %ProgramFiles% itself depends on whether the process requesting the environment variable is itself 32-bit or 64-bit (this is caused by Windows-on-Windows 64-bit redirection).

%CommonProgramFiles%

This variable points to Common Files directory. The default is C:\Program Files\Common Files.

%SystemDrive%

The %SystemDrive% variable is a special system-wide environment variable found on Microsoft Windows NT and its derivatives. Its value is the drive upon which the system directory was placed. Also see next item.

The value of %SystemDrive% is in most cases C:.

%SystemRoot%

The %SystemRoot% variable is a special system-wide environment variable found on Microsoft Windows NT and its derivatives. Its value is the location of the system directory, including the drive and path.

The drive is the same as %SystemDrive% and the default path on a clean installation depends upon the version of the operating system. By default, on a clean installation:

  • Windows NT 5.1 (Windows XP) and newer versions use \WINDOWS
  • Windows NT 5.0 (Windows 2000), Windows NT 4.0 and Windows NT 3.1 use \WINNT
  • Windows NT 3.5x uses \WINNT35
  • Windows NT 4.0 Terminal Server use \WTSRV
%WinDir%

This variable points to the Windows directory (on Windows NT-based operating systems it is identical to the %SystemRoot% variable, above). If the System is on drive C: then the default values are:

Note that Windows NT 4 Terminal Server Edition by default installs to C:\WTSRV.

User management variables

These variables store information related to resources and settings owned by various user profiles within the system. As a general rule, these variables do not refer to critical system resources or locations that are necessary for the OS to run.

%AllUsersProfile% (%PROGRAMDATA% for Windows Vista, Windows 7)

The %AllUsersProfile%(%PROGRAMDATA%) variable expands to the full path to the All Users profile directory. This profile contains resources and settings that are used by all system accounts. Shortcut links copied to the All Users’ Start menu or Desktop directories will appear in every user’s Start menu or Desktop, respectively.

%UserDomain%

The variable holds the name of the Workgroup or Windows Domain to which the current user belongs. The related variable, %LOGONSERVER%, holds the hostname of the server that authenticated the current user’s logon credentials (name and password). For Home PCs, and PCs in a Workgroup, the authenticating server is usually the PC itself. For PCs in a Windows Domain, the authenticating server is a domain controller (a primary domain controller, or PDC, in Windows NT 4-based domains).

%UserProfile%

The %UserProfile% variable is a special system-wide environment variable found on Microsoft Windows NT and its derivatives. Its value is the location of the current user’s profile directory, in which is found that user’s HKCU registry hive (NTUSER).

Users can also use the %USERNAME% variable to determine the active users login identification.

Windows GUI forced variable expansion

In certain cases it is not possible to create file paths containing environment variables using the Windows GUI, and it is necessary to fight with the user interface to make things work as intended.

  • In Windows 7, a shortcut may not contain the variable %USERNAME% in unexpanded form. Trying to create shortcut to \\server\share\accounts\%USERNAME% or C:\users\%USERNAME% will be silently changed to replace %USERNAME% with the account name of the currently logged-in user, when the OK button is pressed on the shortcut properties.
    • This can only be overridden if the %USERNAME% variable is part of a parameter to some other program in the shortcut. For example, %SYSTEMROOT%\Explorer.exe C:\Users\%USERNAME% is not expanded when OK is clicked, but this shortcut is treated as unsafe and displays a warning when opened.
  • In Group Policy Management on Server 2008 R2, a profile directory can not be redirected to a custom directory hierarchy. For example, the desktop can not be redirected to \\server\share\accounts\%USERNAME%\custom\path\desktop. Upon pressing OK, this is silently changed to “Create a directory for each user in the root path” with the path \\server\share\accounts\ pointing to “\username\desktop”.
    • This behavior can only be overridden if the path contains a variable or drive letter that is not currently resolvable at the time of editing the GPO. For example if a mapping for drive Z: does not exist on the server, then the path Z:\directory\%username%\CustomTarget is not expanded when OK is selected.
  • A domain user account may not contain a profile path or home directory path containing an unexpanded %USERNAME% variable. Upon clicking OK, this is silently replaced with the user’s account name.
    • This causes problems for new user creation that is performed by copying an existing user account, if there are additional directories listed after the username in the path. For a pre-existing account with a profile path of \server\share\accounts\DomainUser\profile the Microsoft Management Console doesn’t know which part of the path contains the previous user’s name and doesn’t change the path during the copy, resulting in the new account pointing to the other account’s profile/home paths. The profile/home paths must be manually re-edited to point to the correct location.

Default Values on Microsoft Windows

Variable Windows XP Windows Vista/7
 %ALLUSERSPROFILE% C:\Documents and Settings\All Users C:\ProgramData
 %APPDATA% C:\Documents and Settings\{username}\Application Data C:\Users\{username}\AppData\Roaming
 %COMPUTERNAME% {computername} {computername}
 %COMMONPROGRAMFILES% C:\Program Files\Common Files C:\Program Files\Common Files
 %COMMONPROGRAMFILES(x86)% C:\Program Files (x86)\Common Files (only in 64-bit version) C:\Program Files (x86)\Common Files (only in 64-bit version)
 %COMSPEC% C:\Windows\System32\cmd.exe C:\Windows\System32\cmd.exe
 %HOMEDRIVE% C: C:
 %HOMEPATH% \Documents and Settings\{username} \Users\{username}
 %LOCALAPPDATA% C:\Users\{username}\AppData\Local
 %LOGONSERVER% \\{domain_logon_server} \\{domain_logon_server}
 %PATH% C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths} C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths}
 %PATHEXT% .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.WSF;.WSH .com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh;.msc
 %PROGRAMDATA%  %SystemDrive%\ProgramData
 %PROGRAMFILES%  %SystemDrive%\Program Files  %SystemDrive%\Program Files
 %PROGRAMFILES(X86)%  %SystemDrive%\Program Files (x86) (only in 64-bit version)  %SystemDrive%\Program Files (x86) (only in 64-bit version)
 %PROMPT% Code for current command prompt format. Code is usually $P$G Code for current command prompt format. Code is usually $P$G
 %PSModulePath%  %SystemRoot%\system32\WindowsPowerShell\v1.0\Modules\
 %PUBLIC%  %SystemDrive%\Users\Public
{Drive}:\$Recycle.Bin C:\Recycle.Bin C:\$Recycle.Bin
 %SystemDrive% C: C:
 %SystemRoot% The Windows directory, usually C:\Windows, formerly C:\WINNT  %SystemDrive%\Windows
 %TEMP% and %TMP%  %SystemDrive%\Documents and Settings\{username}\Local Settings\Temp  %SystemDrive%\Users\{username}\AppData\Local\Temp
 %USERDOMAIN% {userdomain} {userdomain}
 %USERNAME% {username} {username}
 %USERPROFILE%  %SystemDrive%\Documents and Settings\{username}  %SystemDrive%\Users\{username}
 %WINDIR%  %SystemDrive%\Windows  %SystemDrive%\Windows

In this list, there is no environment variable that refers to the location of the user’s My Documents directory, so there is no standard method for setting a program’s home directory to be the My Documents directory.

QQ登录失败 – 系统维护中

QQ登录失败一例 – 系统维护中

【QQ  版本】Build 15.67.330
【QQ  号码】47404844
【操作系统】Microsoft Windows 2000 Service Pack 4 [Build 5.0.2195]

【网络设置】局域网内使用透明代理
【登录过程】
—————————————————————————
开始登录……时间[2006-08-24 04:38:28]
初始化登录服务器列表,上次的登录方式为【UDP登录方式】
尝试UDP方式登录,先创建UDP网络组件
创建UDP网络组件成功,本地IP【61.52.***.***】,端口【4000】,直接登录上一次登录过的服务器,
确定登录UDP服务器IP【219.133.49.172】,端口【8000】
向登录服务器发送新登录第一步骤数据
收到服务器登录第一步骤的回应,回应成功,发送第二步骤的数据
发送登录第一步骤的数据成功,发送第二步骤的数据
收到登录服务器登录第二步骤的回应,登录失败,原因:登录失败,提示信息: 系统维护中,请稍后再登录

附录: 大学十年 (林锐)

摘自<<软件工程思想>>  附录: 大学十年
作者:林锐

 

写此文使我很为难,一是担心读者误以为我轻浮得现在就开始写自传,二是担心朋友们误以为我得了绝症而早早留下遗作。
不论是落俗套还是不落俗套地评价,我在大学十年里都是出类拔萃的好学生。并且一直以来我对朋友们和一些低年级的学生们都有很大的正面影响。这 十年是一个从幼稚到成熟的过程,交织着聪明与蠢笨、勤奋与懒散、狂热与怯懦、成功与失败。做对了的事可树立为榜样,做错的事可挂作为警钟。我写下经历与感 受,期望以此引导和勉励无数比我年轻的学生们。我资历尚浅,既没有哲学家的深遂,也没有诗人的风华,不足以堂皇地育人,只能讲一些故事以表心愿。

我出生在1973年的春节,属牛,是“牛头”。父母为我起了很好听的名字叫“林锐”。这暗示着上天对我别有用心,将降大任于我,可是这时候上 帝去了一趟厕所。天堂与人间的时差如此之大,就在上帝大小便的几分钟内,我混混沌沌地度过了童年和少年,天才因此成为凡人。我小时候生长在浙江黄岩的偏僻 山区。父母都是中学教师,由于山区师资缺乏,父母经常要从一个山头调到另一个山头教学。我换读过的小学的数目比我的年龄还大,没有伙伴,也没有家的概念。 我就象活在货郎担里的小鸡,缩成一团,在高兴或恐惧时至多“啾”“啾”地叫几声。我在读小学与初中的8年里,既不聪明活泼,也不调皮捣蛋,确切地说象块木 头,简直是我名字的反义词。在学习上我没有受过一次表扬,也没有任何值得留念的人或事。唉,无论我现在多么努力都已无法追回失去的8年金色年华,好心痛!
我草草地并且稀里糊涂地在13岁时从初中毕业,无处可去。这下我发慌了,开始渴望学习。我灰溜溜地离开山区,可怜巴巴地到一个比较好的乡下中 学重读初三。我勤快得早晨4:30就起来读英语,脑袋似乎也被吓开窍了,“数理化”学得很好,并且生平第一次在物理考试中得了满分。当我“再一次”从初中 毕业时,我以全校第一的成绩考入了黄岩中学读高中。
黄岩中学分农村班与城市班,我当然是农民阶级。“阶级区别与歧视”对我是相当有促进作用的。我连任了几年的卫生委员,星期六和星期天同学们习 惯地把活留给我,我这小官当得有滋有味。《物理》学得极好,有一种直觉帮我快速准确地解题,常常是老师刚把题目写完我就报出答案来。上物理课时我没法讲废 话,因为我一开口就是标准答案。
可惜我的文科成绩极差。那时期盛传“学好数理化,走遍天下都不怕”,我们年少不懂事,糟踏了学文科的好时光。我写作文的最高目标就是不逃题, 考试前我总是反复祈祷:我没干过坏事,保佑我作文不逃题吧!历史考试时填写“任课老师某年某月某日在我家乡英勇就义”,比谁的成绩更接近零分。更让我沮丧 的是,这些行径都不是我发明的,我顶多是个跟屁虫而已,一点回忆的自豪感都没有。我现在认为文科教育实质是素质教育,如果素质不高,男孩再聪明也难以成大 器,当然也难以吸引好女孩。
高考时我语文得了54分(是班里的中上水平),总分只比重点线高十几分。我不敢报考好地方,只好选择内地。选来选去觉得西安与成都两个城市还 不错,我拿把尺子在地图上一量,发现我家乡离西安的直线距离较短,于是就选了西安。老师们只听说过西安交通大学比较有名气,但谁也不了解。我以为在西安交 通大学是学习开火车、开轮船的,尽管我也很渴望能开车开船,但考虑到自己的身材单小,就忍痛割爱了。我觉得西安电子科技大学的名字很好听,符合我做科学家 的梦想,于是就报考西安电子科技大学(以下简称西电)技术物理系。
上帝精神拌擞地从厕所回来,发现我已经上大学。也许他原先想把我安排在清华或者北大的,但事已至此,干脆也就撒手不管了。他这一偷懒反而是好事,我在读大学的十年中自由发展,成了卓而不群的学生。

刚进西电,首先吸引我的是麻雀和馍。那麻雀滚圆滚圆的,简直是会飞的肉弹。它们不怕人,成堆聚集吵闹,常让我误以为是没有人管教的一群小鸡。 那馍又白又大,既不放盐也不放糖,既不象馒头也不象包子。馍凉了后贼硬,据说有同学被楼上扔下的半块馍砸中脑袋,当场长出一个“肉包子”。最好笑的是人们 把“馍夹肉 ”叫成“肉夹馍”,那东西实在好吃。
西电原是军校,作风严谨,校园并不华丽,生活有些单调。尽管我来自山清水秀的地方,可我的确喜欢西电的粗犷与憨厚。有一天我看到一个新生写的 很肉麻的赞美西电的大字报,有一句是“我踏上了东去的列车”,我不禁笑掉牙。这一笑意味着“大个子欺负小个子”历史的结束,“小个子欺负大个子”新纪元的 开始。
上大学的第一个学期刚好碰上美国打伊拉克(“沙漠风暴”行动)。那时全国都在谈电子战,我们全校都是研究电子的,而且以军事应用为主。在那种气氛里,同学们都有很强的使命感,并且被鼓动得信心十足。
一日,系主任视察早读,偏偏有同学迟到。系主任喝问:“你为什么迟到了?”“因为我来迟了,”同学毫不含糊地回答,昂然入座。那时候的学生充满了理由。
我在班里年龄小个子也小,上课时就象猩猩堆里的猴子那么显眼。由于我们是物理系学生,第一学期的《普通物理》课程就显得非常重要。系副主任给 我们上课,他长得象叶利钦,口若悬河,板书极快。象在高中上物理课那样,我常在“叶利钦”刚写完题目时就报出答案。开头几次,“叶利钦”满脸疑狐地扫视我 们,好像是要抓住拔掉他自行车气门芯的那个捣蛋鬼。后来他在第一排发现了我,我俩乐得裂了嘴。课间休息时,“叶利钦”常坐在我旁边,乘他给同学们答疑时, 我就用笔拔弄他硕大无比的手指,在他指甲上涂点什么。
在第一学年,我就象乱草丛中的野花那样脱颖而出,倍受老师和同学们的关怀。就在我光荣到感觉屁股都能绽放光彩的时候,发现了令我胆战心惊的学 习缺陷——不会做实验。一进实验室,我就束手无策,浑身发抖。我相信大一的学生们都有虚荣心,为了维护“最聪明”这个荣耀,我完全可以掩盖、躲避甚至偷偷 地弥补实验能力的不足。我做了一件了不起的事:为了对抗虚荣的引诱,我夸大其辞地把“缺陷”告诉每一个我认识的人,让我没有机会欺骗自己。
聪明的人并不见得都有智慧,他可能缺乏“真实”这种品质。虽然我是在硕士毕业的时候才立下誓言——“做真实、正直、优秀的科技人员”,但我在18岁的时候就已经做到了“真实”,我必定一生保持。
第一年暑假回家,得到一个惊喜:家里竟然有了电路实验室!因为我常在信中鼓吹自己实验能力何等之差,“长此以往,下场将极为悲惨”。父母经不 起这种“恐吓 ”,当英语教师的父亲将半年的工资连同“私有财产”全部捐出,每周到很远的商品交易市场购买电子元件以及器材,在家里建立了实验室。父亲很威严,我从小就 怕他,但那个暑假我一点也不怕他。我们一起做实验,都从零学起,话不投机就用电烙铁“交流”,完全是同事关系。后来,我的兴趣转向了计算机,家里的实验室 就由父亲独掌,继续发扬光大。现在父亲修理电器的水平在家乡远近闻名,学生们都忘了他是英语教师。
母亲是数学教师,年轻时略有姿色,智力远胜我父亲。当她与他在山头的学校里相遇时,他一顿热情洋溢的饭菜就把她缴械了。我小时候家里很贫穷, 家就象一条飘荡的小船,父亲划桨,母亲掌舵。当我6岁上学时,母亲就说:“儿子啊,你将来只能靠笔吃饭而不能靠锄头吃饭。”小时候,母亲怕我变狡诈而不允 许我学下棋。尽管我在大学里已经相当出色,母亲来信总不忘叮嘱“德智体全面发展”。她常用独特的方式检查我:
(1)看我是否变胖。如果我胖了,表明我懒了。因为勤奋的人没有理由变胖。
(2)看我说话是否还快。如果我说话慢条斯理,表明我变笨了。因为脑子灵活的人没有理由说话不快。
我读博士研究生时,母亲的眉头才舒开。她经常在师生中发表自由言论:“儿子的智力与性格完全是我遗传的,他爸毫无半点功劳。”

本科第三学期的主要课程是电路分析。电路题目常常很滑稽,当你满头大汗地解完方程式时,答案往往是零。我归纳了不少公式用于简化计算,所以照样能在老师画完电路图时报出答案。学习是如此的轻松以致于我有太多的课余时间。在课余我常做两件有意思的事:
(1)我为学习较差的十几名同学办了补习班,给他们讲课,改作业,出考题。我就象老母鸡那样看护着一群小鸡,使班长、学习委员等班干部形同虚设。我这样做既提高了自己的表达能力,又帮助了同学。这事不是老师叫我干的,是我自己的主意。
(2)我经常在宿舍里焊接电子线路,技艺渐精。我曾花了两天时间,把磁带盒做成能发声、发光的精美礼物,乐颠颠地送给一个女孩子。可惜不久后我迷上了计算机,从此再也没亲手做过好玩的东西。
上大学以前我根本没见过计算机。在第四学期时我遇到了十年来最敬爱的老师周维真,从而对编程产生了强烈的兴趣。他教我们Fortran语 言,Fortran语言本身对我没有影响,影响我的是周老师高尚的师德以及他在教学和科研中的敬业精神。我从他那里学到的是怎样做人,怎样做事。
很多计算机系老师改作业时喜欢打“√”或打“×”了事。周老师不仅把作业里的错误都找出来,而且逐一评注“好在哪里”和“差在哪里”。为了不让周老师过于劳累,全系同学有一个约定:上课时不准吵闹,否则别来;作业必须清楚,否则别交;提的问题必须有质量,否则闭嘴。
Fortran语言期末考试,我的卷面成绩是97分,有个女同学考了99分。我当时官为课代表,想不到被一个女生超过,甚为沮丧。可是报到系里的成绩单 上,我的成绩是99分,那个女同学是97分。我以为周老师搞错了,跑去问他。周老师笑笑说:“你平时的学习表现,该得满分。不能因为考试中的一个失误而打 击你的积极性,所以给你加2分作为鼓励。而她一上机就束手无策,要让她知道考试成绩高并不表示已经学好了,扣她2分以示警告。你本来就是第一名。”这时又 跑来一个“查”成绩的同学,他得了59分,哀求周老师让他及格。周老师说:“你的试卷我看了好几遍,的的确确是59分。而你平时的学习表现也不会超过59 分。这一分不能加,否则我会害你一生。”在我这一级(90级),周老师至少为技术物理系教出两名软件高手——我和马佩军。我和马佩军读到硕士时已在软件方 面雄霸西电,计算机系学生毫无翻身之望。由于马佩军
不好名利,风头让我一人独得。我离开西电数年后,余威尚在。可惜我和周老师相处不到一年,他便调到北京信息工程学院。然而师恩的厚薄不在于时间长短,好的老师会让人想念、感激一辈子。

在上大学的前三个学期,学习如同表演,有趣而且轻松。自从第四学期学习了计算机课程,我就有了新的追求,我多么渴望拥有一台计算机,可以天天编程。如果挨一个巴掌能换取一分钟上机时间的话,我愿意每天挨1440个巴掌。如果非得加上一个期限不可,我希望是一万年。
我本科的专业是半导体物理,一二年级由系里负责教学,三四年级由微电子所负责教学。在第四学期末,我央求系里把我推荐到微电子所参加科研,贾 新章教授“收留”了我。我踏进微电子所的那一脚,让我从纯粹学习转向了科研,从“高分低能”转向了“低分高能”。我终于有了一台286电脑,那个暑假我就 睡在实验室里,时时刻刻守着它,深夜里我一个人冲着它发笑,一会儿盖上布,一会儿掀开布,一会儿摸摸它的“脸”,一会儿理理它的“辨子”。我很快地完成了 任务:设计一个“立方运算”的模拟电路,并且学会了C语言。
西电有个好传统,每年冬季举办一次全校性的“星火杯”学生科技作品竞赛。每届都有六七百件作品展示,低年级的学生看后无不热血沸腾,跃跃欲 试。我很希望能独立开发一套软件,参加本届“星火杯”竞赛。贾新章老师是研究集成电路可靠性的,见我如此热切,就让我开发“集成电路可靠性分析软件”。
我开始一边研究数值算法,一边设计软件。从炎热的8月份到发冷的十一月,几乎天天通宵编程,程序很快增长到一万多行。在离竞赛还剩一个月左右 的时候,出现了大量的问题。不仅程序老是出错误,而且发现原先的算法并不有效。此时已经没人能够“救”我。贾老师不会编程,不知道问题究竟出在程序上还是 出在算法上(实质上两者都有问题)。而那些懂软件开发的年青教师,实在看不明白我的上万行程序是如何组织的。他们只能悲伤地看着我挣扎。由于我经常逃课, 好学生变成了坏学生。系里意见极大,贾老师十分为难。不少老师和同学劝我赶紧“改邪归正”,放弃项目,不值得因小失大。当时我有个无法动摇的信念:如果放 弃一次,那么碰到下一个挫折时我就会继续放弃;如果坚持而成功,那么碰到下一个挑战时我会激励自己再取成功。
在压力面前,我依然坚挺。每当略有进展时,心里就一阵狂喜,但很快又会碰到新的困难,有时一坐就是20个小时。每天在喜悦的颠峰与苦恼的深渊 之间反复折腾。在竞赛前两天,我终于成功地完成了软件研发,结果获得软件与论文两个二等奖。这个荣誉本身不值得一提,并且我付出很重的代价——对物理专业 失去兴趣而彻底抛弃了它。但那时我才19岁,在极限状态下,我磨练了意志,使我日后充满激情。在本科四年级,我认识了微电子所的郝跃老师。他是数学博士, 是微电子所最有才华、最潇洒、最有领导风范的青年学者。我常去向他请教数学问题,他讲得意气风发,我听得如痴如醉。我俩一个月的“交流量”很多硕士花一年 时间也得不到。有一天,郝老师说:“你做我的学生吧。”我就毫不迟疑地从贾老师门下“跳槽”到郝老师门下。郝老师后来是我的硕士导师,他高兴时喜欢说: “好,很好,非常好!”我看着他升教授,
升博导,升副校长,师生两人分别在各自的阶层中名声显赫。
在三四年级,我的专业课程没有一门及格过。但由于微电子所的老师们已经认可了我,就把我的卷面成绩作为及格线,“水涨船高,水落船低”,我对 同学们的帮助莫大于此!如果要我考研究生,我绝对考不上。系主任安毓英觉得我将来很有前途,于是不顾别人反对,一锤定音让我免试读硕士研究生。

读硕士研究生时,我的科研条件相当好。导师十分开明,任我自由发展。我最喜欢做的事是设计图形用户界面和开发数据可视化软件。图形软件的最大 魅力是即便它毫无用处,你也可以自我欣赏。总有人担心“花很多精力、物力让界面那么漂亮,图形那么逼真是否值得?”这种问题不能强求别人与你一致。我当时 赞美女孩子的最高境界就是把她和我的图形软件相提并论。
我喜欢设计用户界面是因为自己有相当好的美感。在读本科时我模仿过六七个流行软件的界面。那时期大家编程都用Turbo C 2.0,我伪造了一个“Turbo C 2.6”。有个北大的博士生来实验室参观,看“Turbo C 2.6”后对我导师说:“郝老师,你们的工具比我们的先进多了”。
我常常向同学演示、卖弄自己开发的软件。觉得还不过瘾,就写了一篇名为“用户界面设计美学”的短文。凡是路过我实验室的同学都被我逮住,被迫 听完我得意之极的朗读,茫然者与痛苦者居多。不久我的朗读便所向披糜,闻声者逃之夭夭。这篇文章我6年后照搬到博士学位论文中,可见当初写时的确有所“超 前”。
我的研究工作基本上以集成电路的数值计算为主,数值计算产生的一堆数据常把我搞得晕头转向。我发现用图形来表征、解释数据可以让自己不再迷糊 下去,那感觉就象刚睡醒时冲凉水一样。我硕士学位论文中的软件就是用图形来仿真集成电路生产过程中“缺陷”对成品率的影响。我并不是在看了学术论文后才开 始研究可视化技术的,我是在做了工作后才发现那些好玩的技术叫做“可视化”。由于我肚子里头的确有货,在硕士一年级,我没有使用“剪刀”与“浆糊”(这是 很多人写书的法宝),只化了三个月时间就写完第一本著作《微机科学可视化系统设计》。
我在读硕士期间的工作强度与本科时的相当,但工作方式有很大不同。我有了明确的目标:(1)开发自主版权的软件产品;(2)培养做领导的才 能。这个目标可以通过团队工作,参加全国性大学生科技竞赛而实现。我在西电成立了“可视创意软件小组”,马佩军、戴玉宏、马晓宇是我的主要技术伙伴,帮手 很多。有几个漂亮的女生负责宣传(有一个长得像孟庭苇)。办公室里贴满了标语,如“创造性的事业要靠激情来推动”,“生于忧患,死于安乐”,“让春天消 失”。还有大幅的 “作战图”,倒计时牌。每个伙伴写了一张“军令状”放在机器上,我迄今还记录着那些纯真、活泼、充满激情的文字。那是多么艰苦而幸福的日子,夜里放震耳欲 聋的音乐、咬尖辣椒提神,有伙伴累得蹲在厕所里睡着了。
在1994年和1995年的冬季,我们的软件作品分别获中国大学生应用科技发明大奖赛二等奖和全国大学生“挑战杯”学术科技作品竞赛二等奖。 在西北地区,我们是“老大”。我成了西电学生的榜样,仰慕我的学生有一大批,我刚到浙大读博士时,收到一个西电计算机系学生的信,他说:“你走了,我呆在 西电没有意思,我准备考浙大的硕士生,你到哪里我就跟到哪里。”
在硕士毕业前,我在鉴定表上这样写道:“我热爱科技事业,如同热爱生命一样。近5年的科研工作带给我最充实的生活,也寄托着我美好的向往。可我同时也感到了痛苦,因为5年来我耳闻目睹科研中太多的弄虚作假。我发誓做一名真实、正直、优秀的科技人员,以正身自勉。”

我在西电度过了幸福的6年半,最让我牵肠挂肚的是“吃”、“友情”和“爱情”。当我第一次吃红红的和青青的辣椒时,“感动”得满脸是泪,那滋 味让我觉得前 17年白活了。我在读硕士时已经能自力更生,我开发的软件不仅竞赛获奖争了名气,而且还挣了钱(卖了二十多份软件,平均每份挣500元)。写书得稿费 7000元,那时我简直就是富翁。这些钱的小部分用来给女孩子买礼物,大部分用于和与哥儿们吃香的喝辣的。
我相信自己已经尝遍了西安的小吃,并且发现了一个“秘密”:最好吃的东西都在地摊上,最香的东西一定是辣的,最辣的东西一定是的。曾经沧海难 为水,我在浙大的三年里很少再吃辣椒,因为怕它玷污我心目中的辣椒。在我小时候,我爸很讨厌土豆(在困难时期他吃了太多的土豆),他竟然因此不让我吃土 豆。我哪敢跟他论理,于是忍啊忍,一直忍到我上大学“远走高飞”。如果说辣椒是我新交的女朋友,那么土豆就是我天生的命。我在西电经常用电炉(从来都没被 抓住过)做“以土豆为核心”的菜,天长日久,朋友们干脆叫我“土豆”。我吃饱土豆和辣椒后不免深思而感叹,人要是认认真真地吃,真的花不了多少钱,那些贪 官究竟是怎么吃掉巨款的?我将来怎么吃得掉自己挣来的钱?我在读中学与本科时,满头白发,脑袋可以当白炽灯泡用。当我硕士毕业再照镜子时,吓了一跳,白头 发不见了!我不知道究竟是哪种食物起的作用(估计是辣椒)。那些早生白发的小伙子们,你们就到西安上学吧。

马佩军是我在西电最早的朋友。刚入学时我们分到一个宿舍,他象国民党兵盘问良家妇女那样上下打量我,问:“喜欢干啥?”我怯生生地回答:“打 乒乓球。”他再问:“什么风格。”我答:“快球。”他突然象阎锡山那样怪笑,拍拍我的肩膀说,“好!我喜欢,以后你就是我的朋友。我是陕西人,农民,会开 拖拉机和卡车。这里是我的家,以后你有啥事,就对我吱一声。”
马佩军和我打乒乓球时口中念念有词:“哼!你对我狠,我对你更狠;你对我好,我对你更好。”他好几次说要把世上最好吃的板栗送给我一袋,这一 袋板栗我到现在都没拿到。马佩军夜里极能侃,吹他家乡的人跑得快,常把野兔追断气。有时他吹得太离谱,常令我们6个舍友群起而攻之。为了把我们一举歼灭, 他白天到图书馆查“资料”,夜里再挑起事端。双方就象印度与巴基斯坦,常干两个秃子争一把梳子的事。马佩军上大学前也没见过计算机,但他对计算机技术有极 强的领悟力。我们第一次上机时,他把我拉到打印机旁边说:“帮我防着管机房的,我要修理这台打印机 ”。还没等我反应过来,他就开始“肢解”打印机。我无比深刻地体会到:歹徒在作案时都不害怕,最提心吊胆的就是那个放风的。他在5分钟内修好了打印机,我 佩服得五体投地,甘愿下次再跟他干“坏事”。
我们读本科和硕士时主要用DOS操作系统,那时期病毒泛滥。马佩军杀病毒不用软件,用手杀。看他杀病毒简直是一种享受:噼里啪啦地敲一阵子汇编命令,然后机器就好了。求救电话太多,他经常无怨无悔地带着那双铁手游荡于西电各个角落,却不知道编写个杀病毒软件来赚钱。
我一直认为马佩军是西电编程第一高手,他编程的时候根本不是人,是指针。之所以我的名气大,一是因为他不好名利,二是我把他的程序写上了我的名字(并且卖了不少钱)。
马佩军的女朋友是我介绍的,我一眼就看出她将嫁给他。后来俩人果真结婚了,只是他嫁给了她,现在他还有了一只“小马驹”。硕士毕业后,马佩军 留在西电读博。前年我再见到他时,他说我害死他了,快乐得要宰了我。马佩军在西电已经呆了十年,禀承了西电所有的优点与缺点——“很土但结实耐用”。我在 西电时很土气,离开西电后变得“半土不洋”。马佩军简直就是西电人自己的“兵马俑”,每次看到他或者想起他时,我就明白自己的“根”还在西电。我喜欢陕西 人源于马佩军。

宋任儒是我们的班长,也是班里最早的党员,满口仁义之道,比唐僧还让人受不了。在二年级时,我迷上一个比我大一岁有了男朋友的女同学,多日沮 丧。他看在眼里痛在心里,跑去把那女同学教育了一通。苏联解体的时候他十分沉痛,在思想教育课上,他向我们作了深刻的检讨,好象是他没有管教好戈尔巴乔夫 那小子。最后他为我们点燃了希望:在不久的将来,“苏联”将重新成为苏联,共产主义旗帜将继续在全世界飘扬。
在本科三四年级,他对跳舞十分入迷,连上厕所都滑翔而去。我那时常把自己关在实验室里搞科研,极少有空与他玩乐,等到本科毕业时,猛地发现他 已经风度翩翩。宋任儒在读本科时学习既不好也不差,我们从来没有合作研究过什么。我喜欢他是因为他很有情趣,不落俗套,并且刚正不阿。也许,我俩本来就有 相似的秉性,只是表现不同而已。
本科毕业时,他分到威海工作,走之前我为他饯行。可在硕士开学时,我的房门被人一脚踢开,他对我喊了一声“林子啊,我又回来了”。我就象祥林嫂见到了被狼叼走的孩子那样惊喜。
宋任儒读硕士时被发配到临憧771所,他在那里过上了乐不思蜀的日子。有一天,他带来两个看上去很文静的女孩子(一个读硕士,一个读本科)来 串门。就在我洗水果的几分钟里,三个人已玩得乐翻了天,两个女孩满屋子追他,一会儿把他按到桌子上打,一会按到床上打。我惊诧至极而又羡慕至极,恨不得挨 打的人是我。想不到上学竟然会有这等欢乐,看来我读硕士的日子白过了。
后来,那个大一点的女孩子嫁给了他。当他带她去见公婆时,公公长叹一声:“把儿子交给你,我就放心了。”而婆婆已乐得合不拢嘴,竟然无法叹气。
现在,宋任儒已从复旦大学获得博士学位,比我更早地成家立业。他和她既是夫妻,又象兄妹,还象伙伴。他叫她“聪聪”,她叫他“笨笨”。
“聪聪”问“笨笨”:“老公啊,人活着为了什么?”
“笨笨”答:“就是让咱们每天快快乐乐。”
我亲眼看到的幸福莫过于此。

我在大二时曾为系里学习最差的十几名同学办了补习班,谢伟在这个补习班里名列倒数前茅。在他睡懒觉时,我象催命鬼那样喊他捅他。他无比吃力地抬起沉重的眼皮,就象软弱无力的举重运动员,还没有挺起来就趴下了。
他开始呻吟:“这一次就饶了我吧,下一次我一定,一定会去的,求你了。”我不肯。
“那么让我再睡5分钟,”他不死心。
我仍不同意。
“那么你就从1数到10,要慢一点,”他讨价还价。
当我数到9时,他就接着数9.1,9.2, 9.3 ……
一开始他觉得我很好玩,后来他就离不开我了。并不是因为我学习好,而是那时侯我天真并且充满活力。在三四年级我忙于科研时,他照顾我的生活, 叫我“少爷 ”,既做管家又做兄长。我们不仅共用饭菜票,并且共用仅有的一个碗,总是他买饭菜和洗碗。我们那一级的学生大多崇拜巨人公司的创始人史玉柱,我问谢伟:“ 我是不是和史玉柱一样能吃苦?”他说:“如果考虑年龄因素,你已经比他更能吃苦。你将来一定能做大事业,我就把希望寄托于你了。”
在我们都还不成熟的时候,我成了他心中的灯塔,只要灯不灭,希望就在。现在他为了娶一个日本姑娘,披荆斩棘追到日本,有了新的希望。二十几年来,我就为一个男人哭过,那时他本科毕业离校。

我读硕士研究生时,由于受我的影响,本系三四年级的学生蜂涌至微电子所参加科研。夜里看十二层高的科技大楼,灯火通明、热闹非凡的那一层就是微电子所。那时,我在微电子所学生中的地位仿佛伊拉克的萨达姆,手下兵将极多。
我写第一本书时,有好几个人帮我输入稿子,使我没时间慢腾腾地打草稿。我就象金庸写小说,有如神来之笔,想到那里就写到那里,写了一段他们马上输入一段,一气呵成。那本科技书写得很滑稽,同学们看得笑出眼泪,编辑看了拍案叫绝,只改了几个字就出版了。
那时侯我的心情是如此之好,为一男同学乱蓬蓬的头发写了一篇散文,并送他一把梳子。又把一女同学的实验报告写成评书。我的文笔大概就是这样练出来的。
这一群学生中,戴玉宏、史江一和马晓华是我最好的伙伴(我们都属于牛)。戴玉宏其貌甚帅,眉中有一根白毛闪闪发光,因此号称“白眉鹰王”。 “白眉鹰王”武功了得,是我软件产品的核心开发人员,我们合作最深最久。后来我开公司,他就从广州辞职到杭州为我助威,令我感动不已,可见读大学时期我们 有多铁!戴玉宏有一次打饱嗝,整整打了两天两夜,我差点心疼死。
我尚未发迹之日曾与戴玉宏在校园里卖花,无人问津,就请电子工程系的鲁洁救助。鲁洁温柔貌美,她一言一笑尤如春风吹拂苏堤的杨柳,令人心里一 荡再荡。顷刻间就有男生围观,有人看花,有人看“贵妃”,鲁洁一走,我和戴玉宏可怜得就象两根蜡烛。鲁洁读大学时调皮捣蛋,到四年级时还不太会编程。她的 本科毕业设计是仿真“雷达跟踪飞行物”,程序基本上全是我编写的。我已记不起用了什么公式,只知道每次计算后都弹出一个对话框“报告长官,击中目标”。鲁 洁毕业后到深圳的一家软件公司工作,几年一过,她成了行家。再与她交谈时,我只有听的份,象鸡啄米一样点头。
史江一和马晓华都是陕西人,和马佩军一样厚道热情。史江一性格稳重,属于“你办事我放心”的那类人。我对微电子专业一窍不通,全靠他帮我混过实验这一关。后来我开公司失败,陷入经济危机,就把希望工程的一个小孩托给了他。
马晓华是我最不放心的人。他常常为别人做事情,但热情过头就忘了自己的事情。有几个不道德的学生就利用他的这个缺点,经常使唤他,并且借他的 钱不还。马晓华喜欢为那些人“卖命”并且挨训,他总是在受虐待够了的时候再跟我们嘀咕,我们实在气不过,只好对着他的屁股追加一顿拳脚,并给他一个绰号 “受虐狂”。但愿他找个好老婆,我可以早日放心。
我们这一群小伙子同时喜欢上一个女孩子,她叫姜姗,是她班里的四大美人之一。我们不仅没有争风吃醋,而且心甘情愿地让她坐遍每个人的脖子。姜 姗小姐5岁时她爸姜晓鸿成了我的同事,我们经常一起去钓鱼,亲得象一家人。姜姗喜欢大喊大叫,声音高过帕瓦罗蒂,我们教唆她喊她爸“姜球球”。我常带姜姗 到小吃摊去吃女孩子不敢吃的东西,并哄她:“世上最好吃的东西是鸡屁股。”
她无师自通地加上一句:“世上最好听的屁是鸡放的屁。”
我常想着将来生个儿子并把他培养成天才,但如果能有姜姗这样的女儿,不要儿子也罢。

在本科三年级我第一次参加“星火杯”竞赛并获得软件二等奖后,马上成为低年级学生眼中的明星。我义务当上了一年级学生的上机辅导员。一天晚上我巡视机房,一女生请求帮助。
我见屏幕上空白一片,根本没有一行程序,十分疑惑地问:“什么问题?”
“没有问题。”她把书往我手上一塞说:“这些作业你帮我做。”然后就自个子跟她的同学玩乐,把我撇在一边,似乎我辛辛苦苦地学习就是为了给她做作业。
我定神对她细看,发觉她简直就是《射雕英雄传》里的黄蓉再世,顿时心就“突突突”直跳。当天晚上我没睡着,接下几天的课不知所云。在选修课《操作系统》考试时,我给家里写了一封超短信:请快寄钱来,我谈恋爱了。我交了白卷直奔她去。
我的初恋只有两个月,却让我思念了8年。她离我而去时没有任何理由,而我却失魂落魄。在我本科毕业前的18个月里,白天我狂热工作强作笑容, 夜深人静时心痛如刀割而无法抑制。没有人为我“疗伤”,我是硬挺过去的,这一段经历使我日后心理承受能力极强。后来我开公司的失败虽然对信心有所打击,但 根本无痛可言。
我们分手后并未成为陌生人,就象两只刺猬,离得远了就有点留恋,离得近了,就刺着对方。认识她时我虽然已略显才气,但并不具备成熟男人的魅力,很多事情我并不知道怎么去把握。有时“喜欢”并不能成为“爱”,感情也许是永远研究不透的学问。

我读硕士研究生时有了一群生机勃勃的朋友,感情的伤痛被淹没了。朋友堆里夹着一位女生,她文雅而富有气质。平日里无拘无束,大伙戏称她是我的 秘书。我的言行举止和穿着都经过她的调教,俩人出双入对,十分亲近,不知不觉有了感情。别人已经把我们当成恋人,我和她牵着小姜姗散步时,简直就象一家 人。
可是我当时着迷于事业,认为自己不久将干一番惊天动地的事。鉴于史玉柱在创业时就离过婚,所以我认为感情是事业的累赘,两者不可得兼。更糟糕 的是,我和第一个朋友藕断丝连,偏偏她俩是同班同学。我知道脚踩两只船没有好下场,可我的的确确同时喜欢着两个人,并梦想她俩能合二为一。我情愿被人指 责,也不愿掩饰真实的感觉。有时她俩一同走过,我站在路上丢了魂似的看着俩人的背影,任凭看热闹的人指指点点。
我和第二个朋友已经有了很深的感情,她毕业后我曾坐火车千里送鲜花给她,让她感动过。而我固执的性格和对初恋的思念终于让她心碎。尽管我们已经几年没见,我依然看得见她留在我心里的那颗眼泪。

我在西电六年半的学习和生活也许是一生中最珍贵的,叫我怎能不爱西电。两年前我回西电,惊奇地发现校园里房前屋后长满了待收割的小麦!这所大学是从事电子科技的,种小麦干啥呀?朱总理曾讲过:“目前国家粮食充足,再来三年自然灾害也不怕。”现在国泰民安,似
乎用不着“深挖洞,广积粮”吧。我素知西电提倡勤俭节约、自力更生,但与其种小麦还不如种蔬菜呢。老同学告诉我,种小麦是为了应付“211” 工程(为21世纪选拔100所重点大学)的检查团,因为“211”工程有较高的绿化指标。偏偏检查赶在冬天,那时的西北极难长草。西电本来就人多地少,地 上一长草马上就会被谈恋爱的学生给折磨死。一到冬天,整个校园就光秃秃一片。小麦在年轻的时候还真和青草长得一个模样,用小麦绿化校园可谓千古绝笔,检查 团的那些权贵人士早已五谷不分,岂知所见的“草坪”乃是麦田。

浙江大学依山而傍西湖,是个美丽而高贵的大学。1997年春天,我就象干儿子那样挤进她的怀抱,并期望得到关爱。我到了向往已久的计算机辅助 设计与图形学(CAD&CG)国家重点实验室读博士学位。导师是石教英教授,石老师虽然年过六旬,但精力充沛,红光满面,施拉普纳不及他半分精 神。
我幸福地幻想着大干一番自己喜爱的专业,并计划在35岁左右成为实验室主任。开学的第一天,我兴冲冲地奔向实验室。进门不到5分钟,就因不懂规矩被看门的年青女子训了几次。为了不再冒犯规矩,我就老老实实地抓起一份计算机报纸并且站着阅读,心想这下不得罪谁了吧!
突然一个气得脸色铁青的男人(机房管理员之一)对我断喝:“你在干什么!你怎么可以不经允许就翻看别人的报纸!”似乎我是他一生中见到的最无耻的人。
我就象一个情窦初开的少年飘飘然地去拥抱梦中情人,不料迎来两个耳光,此下场比《猫和老鼠》中的猫还惨。如果这两个年轻人有幸看到我这篇文 章,应该好好悔过自新,她与他的工作态度打击过数十个学生的积极性。我本是因为向往CAD&CG实验室而来的,得到的却是极坏的第一印象。(我博 士毕业后,这两人也离开了实验室,我替后来的学生们谢天谢地。)
CAD&CG实验室在理论研究方面很有名气,但我的兴趣是开发实用的软件,“嫁错人”了。我颇费周折地考入CAD&CG实验室,却尚未热身就全力而退,决心自立门户。至今我都没有用实验室的计算机编过一行程序。

刚读博士时我穷困潦倒,只有一床,一盆,一壶,一碗。我那些穷朋友们象挤牙膏一样挤一些钱资肋我。我买了一台计算机,在宿舍里开发软件产品 “可视化软件开发工具 VA 4.0”。1997年8月,我去北京参加首届中国大学生电脑大赛软件展示,路费也是借的。同学为我壮胆时说:“如果不能获奖,就回到实验室干活吧。”我说 一定会拿第一名,不然去干啥。
在软件展示时,我们发现很多好的作品是国家的科研项目,根本不是学生个人的作品,违背了竞赛的宗旨。如果允许这样做的话,学校可以运几条生产 线过来。我写了一份抗议书,找了十几个人签名(很多人敢恨而不敢签)。但抗议能顶屁用,我参加过的科技竞赛、听过见过的科研鉴定多了,哪一次我没看到虚 假?我写抗议书是因为眼里容不得沙子。如果我在北大读政治,恐怕早就遭殃了。这次竞赛选出十个“软件明星”,只有我的软件和清华大学博士生的项目值得一 看。他的项目水平很高,但那不是他个人的作品(评委甚至认识他的导师,知道项目的来龙去脉)。综合诸多因素,我的作品被评为第一,他的项目被评为第二。组 委会来拍电视,可是找不到浙江大学的展板。因为浙江大学没有任何准备,我是一个人来的,我的作品夹在杭电的作品之中,没名没姓。我只好从塑料袋上剪下“浙 江大学”四个字,贴在展板上撑撑门面。自新中国成立以来,清华大学就一直在浙江大学头上“作威作福”,我好歹也争了一口气。可是颁奖时,组委会竟按地方顺 序从北京念起,我沦落到第七,差点咽气。
我曾在上海的一辆公共汽车上与一位北京来的旅客聊天,此公极健谈。似乎他到上海旅游的目的就是为了发掘北京的优越性。见我挂着浙江大学的红色 校徽,且对清华、北大并不神往,不禁十分迷惑,就问:“浙江大学在浦东还是浦西?我要去看看。”北京已经是极度优越了,就请不要把什么鸡毛蒜皮的好东西都 拿走。

1997年11月,在穷得快挨饿的时候,我获得了中国大学生跨世纪发展基金特等奖(全国共20名,奖金1万元),到人民大会堂领奖。给我们出钱的是一个靠 资本运作发财的集团,在宴会前,该集团领导人和我们座谈,他什么不好吹偏偏吹自己是个高科技企业:“我们主要从事生物工程,几年前就掌握了克隆技术,英国 的‘克隆羊’简直是小菜一碟。……我们在东北有个农场,新品种的小麦长得比人还高,麦粒跟葡萄一样大,你们不久都会喝到用这种小麦酿的啤酒。……我如果去 美国炒个总统,那就跟玩似得。”
我们几个获奖的博士生吃饱喝足、拿了钱后,关起门来把那个老板臭骂一通,扬长而归。别以为给钱就能让我们说好话!
刚拿了“跨世纪发展基金”,又马上获得“浙江省青少年英才奖”,浙江大学也给我发奖学金。比起那些一个月只有300元工资的博士生们,我简直 是“暴富”。还了朋友们给我的“救济款”后,仍然是个“富翁”。我老是觉得手头的钱是“抢劫”来的,心里不踏实。于是找浙江大学校团委“诉苦”,请校团委 把我的“不义之财”捐给浙大的贫困学生。校团委的老师热情而坦诚,说愿意等我成为真正的富翁时再接受捐款,现在不能让我“杀鸡取卵”。但为了能让我表达心 意,建议我资助“希望工程”的中学生,让我选了5个初一的学生,每个学生500元。我轻浮地以为自己真的帮助了5个中学生,直到1998年暑假我见到了其 中的一个中学生,才发现自己做的好事只不过杯水车薪而已。我是到了自己贫困失意时才真正去帮助那些孩子的。

在1997年,我在学生时期的荣誉已登峰造极,觉得自己的翅膀已经硬了,不想再混下去。我总以为自己是第二个史玉柱,应该开个软件公司来振兴 民族软件产业。我曾到东软集团(沈阳)参加“民族软件产业青年论坛”,大不咧咧地作了一次演讲(现在发现演讲的内容没有一项是可以操作的)。杭州有一个记 者来采访我,我谈了一天的理想,记者还是没听明白,干脆自己写新闻报道,并且含蓄地做了一个广告:万事俱备,只待投资。
由于我能说会道,频频上电视,引来近10个投资者。我选择了一位年龄比我大一倍、非常精明的商人作合伙人,成立了“杭州临境软件开发有限公 司”。彼时,我可谓光芒四射,名片上印着“以振兴民族软件产业为已任,做真实、正直、优秀的科技人员。”浙江大学有关部门想开除我,被我“晓之以理、动之 以情”安抚住。
我当时想开发一套名为Soft3D的图形系统,此系统下至开发工具,上至应用软件,无所不包。公司名字起为“临境”有两个含义:一是表示身临 其境,这是我对图形技术的追求;二是表示快到了与SGI公司称兄道弟的境界,这是我对事业的追求。“临境”这个名字我在读本科时就已经想好了,1997年 底公司成立的那一天,我有一种“媳妇熬成婆”的悲壮感觉。
我从实验室挖来一位聪明绝顶的硕士生做技术伙伴。他叫周昆,年龄很小(1978年出生),研究能力极强。如果按照浙江大学计算机系博士生毕业 的论文要求,他入学读硕士的那一天就可以博士毕业。周昆的头明显比我的大,估计其脑容量至少是我1.5倍。我曾经以师兄的身份为他洗过一双袜子,他因此觉 得我是个好人。我俩一拍即合,常常为Soft3D的设计方案自我倾倒。一想到Microsoft公司的二维Windows系统即将被Soft3D打击得狼 狈不堪时,我们就乐不可支,冲劲十足。
我已经把“振兴民族软件产业”列入日程,并且提前担忧将来钱挣得太多用不完该怎么办。1998年5月份,我们做了一套既不是科研又不全象商品 的软件。软件产品宣传了几个月,并没有出现订单如潮、接应不暇的局面(事实上压根就没有反应)。我意识到没有找对市场,但仍觉得产品中的一些技术很有价 值,将它改装成其它软件也许能开创“东方不亮西方亮”的新局面。
于是我向只有一面之缘尚在北大方正工作的周鸿袆求助。他是真正的软件高手,当我小心翼翼地展示约10万行C++代码的软件时,他竟在十几分钟内就指出多处重大的设计错误,使我目瞪口呆地意识到整个软件系统的价值为零。那种心痛啊,就象眼睁睁看着孩子被狼吃掉一样。
到1998年10月,我用光了30万元资金。周鸿袆再一次从北京飞到杭州,三下五除二替我把只活了一年的公司关闭掉。他放心不下,觉得我“恶病需用猛药治”,于是意犹未尽地把我捉到北大方正插在他管辖的部门,让我学习怎样做事情。
北京寒冷的冬天可以营造一种凄凉的气氛,冲去一切可以自我原谅的借口。我并不是太爱虚荣的人,知道这次失败是我的毛病积累到一定水准忍不住喷发出来的结果。我绝不能以年纪尚轻不太懂市场与管理为理由轻率地敷衍过去。
从北大方正“劳改”了两个月回来,我心服口服地承认失败了。我把察觉到的数十个毛病列出来,日后一个一个克服掉。现在我能比较清醒地分析我和投资方所犯的主要错误,以祭我那幼年夭折的软件公司。
我的主要错误:
(1)年青气盛,在不具备条件的情况下,想一下子做成石破天惊的事。我的设计方案技术难度很大(有一些是热门的研究课题),只有30万元资金的小公司根本没有财力与技术力量去做这种事。
(2)我以技术为中心而没有以市场为中心去做产品,以为自己喜欢的软件别人也一定喜欢。我涉足的是在国内尚不成气候的市场,我无法估计这市场有多大,人们到底要什么。伙伴们跟着我瞎忙乎一整年,结果做出一个洋洋洒洒没人要的软件。
(3)我做到了“真实、正直”,但并没有达到优秀的程度。我曾得到很多炫目的荣誉,但学生时代的荣誉只是一种鼓励,并不是对我才能和事业的确认。正因为我不够优秀,学识浅薄,加上没有更高水平的人指点我,才会把事情搞砸了。
投资方的主要错误:
(1)投资方是个精明的商人,他把我的设计方案交给美国的一个软件公司分析,结论是否定的。但他觉得我这个人很有利用价值,希望可以做成功其它事情,即使Soft3D软件做不成功,只要挣到钱就行。这种心态使得正确的可行性分析变得毫无价值。
(2)由于我不懂商业,又象所有单纯的学生那样容易相信别人。他让我写下了不公正的合同,我竟然向他借钱买下本来就属于我的30%技术股份。 他名为投资方,实质上双方各出了一半的资金(他出51%,我出49%)。他在明知Soft3D软件不能成功的情况下,却为了占我的便宜而丧失了应有的精 明,最终导致双方都损失。关闭公司时,他搬走了所有东西。我明明投入了技术,又亏了15万元,却一无所得。几个月后当我意识到不公平而找他协商时,他说: “只能怨你自己愚蠢,读到博士,连张合同都看不懂。”此事充分地显示了我的无知与愚蠢。自己的奋斗没有必要后悔太多,
学到的远比失去的多,我相信下一次会做得更好。

公司关闭后,我就面壁反省,补习基础,准备为几年之后“东山再起”养精蓄锐。1999年1月,有一个民营企业家G先生向我请教一个问题:“我 给一个年轻人投资了100万元,建立一家从事环保信息应用开发的软件公司。他曾许诺一年内创利润上千万元,可是才过去5个月,他就把100万元用完了,什 么也没挣到。我实在不明白是怎么回事,请你帮我分析分析。”这位G先生年龄有我的2.5倍,曾在西北当过几十年的技术兵,性格豪爽。他投资的那个年轻人叫 Y(以下称Y 经理),自称有英国的管理学文凭,能对公司的市场、技术、管理一把抓。G先生喜欢说“钱我没问题”,于是想也不想就投了100万元,并且给Y经理40%的 股份。
G先生请Y经理到家里座谈。我那时突然狡猾起来,自称是G先生的远房亲戚,在浙大读半导体物理,特羡慕那些做软件的同龄人,渴望听听Y经理的高见。Y经理 果然信口开河,滔滔不绝,连绵不断,如黄河泛滥,一发而不可收拾。我激动地想去参观他的公司和产品,并表示要抛弃物理专业,立马转向软件专业。
Y经理得意而笑:“对于IT行业你就不懂了,我们经营的是一种理念而不是产品,这是国外最先进的思想。你可以来参观我的公司,但你看不到具体的东西,只能用心去领会。”
这屁话比曹元朗的诗还臭(《围城》)。我搞软件只有8年功夫,说我不懂IT行业并不过分。可我读了10年大学都没听到过如此“先进”的思想。如果这是英国管理学教育的成果,我认为自己已经发现了这个曾经是“日不落帝国”的衰败的真正原因,有必要找英国首相切磋一番。
我对G先生说:“Y经理根本不懂技术,为人极其浮夸。应马上关闭公司,以绝后患。那100万元你也亏得起,就买个教训吧。”
G先生说:“钱我没问题,那100万元就算我在澳门赌博输掉了。”
1999年5月,G先生又来找我请教另一个问题。他说:“小林啊,你上次说得很有道理,我接受了教训。”
我说:“那是好事,不论年龄大小,知错就改总是好孩子嘛。”
他叹了一口气:“最近几个月,Y经理又花了我100万元。”
我当时差点给噎死,气凶凶地训G先生:“我早跟你讲过,Y经理不是好东西,叫你关闭公司你不听,你老说钱没问题,亏你200万元活该。”
老先生象犯了错误的小孩子:“Y经理每一次向我要钱时,都拍拍胸脯保证下个月就有利润,所以我一而再、再而三地掏钱给他,希望能救活软件公司。现在该怎么办?”
一个有20名职员的软件公司,程序员只有三四个,连“十羊九牧”都不如。200万元的财务报表中,有100多万元用于吃喝玩乐和行贿。这种公 司完全无药可救。台湾作家李敖曾说过:“当你没法扶一个人上马时,也许应该拉他下马”。从5月份到8月份,我行侠仗义,替G先生清理软件公司,根除Y经理 这些败类。
可是难哪,因为G先生投资的公司根本不把G先生放在眼里,又岂能让我插手。就在我想方设法卡住Y经理的脖子时,Y经理总能从G先生那里挖出钱。G先生就象被吸血鬼附身,却仍存幻想:“如果吸血鬼能治好我的病,就让它再吸些血吧。”
Y经理又和一个来自深圳的骗子H想了注意,教唆G先生再投资100万元新建一个“指纹”公司,说利润将比开发环保信息更加可观(估计要用亿来度量)。就在他们准备签合同之际,我偶尔路过,发现异常,便强行阻止。
G先生是个好人,但太顽固。好几次我气极想撒手不管,但又不忍心好人被坏人欺负。我曾请求G先生:“我求您别再说钱没有问题,您的私人财产会被人骗光。请让我把这漏洞堵住吧,好让我安心地回学校做完博士学位论文。”
到8月份,我和G先生的两个儿子,伙同“黑社会”的朋友,强行把那个软件公司搬回G先生的工厂中,辞退所有员工。现在那个软件公司被别人接管,仍然半死不活,好在每月亏损不过几万元,G先生承受得起,我就不再去碰G先生的伤疤。
我以前从未玩过与人勾心斗角的游戏,此三个月的经历让我疲惫不堪。那个软件公司的员工曾透露,Y经理的英国文凭大约是在上海或杭州某个大专培 训班里混来的。方鸿渐买美国克莱顿大学博士文凭尚知羞耻(《围城》),而Y经理却趾高气扬。害得我平白无故为英国教育界担心,回想起英国鬼子曾打劫过中 国,倍感耻辱。
G先生是正人君子,不防小人,实在不是现代的商人。我和他成了忘年交。G先生第一次见到我时问我工资几何,我答曰:“300元,够买几本书。”G先生甚为 着急:“这样的条件怎么能生活?你就搬到我家来住吧,我家条件好,你可以安心地学习,将来可为国家多作贡献。”后来他几次相邀,我就看在国家的份上住入他 家,一直住到博士毕业。
自从读中学以来,我第一次享受食来张口,不用洗衣服的奢侈。唯一的麻烦是我得向很多朋友解释:“我不是被别人养起来了,是为了国家的利益,不得已才这么做的。G先生是男的不是女的,并且没有待出嫁的女儿。”

我在读博士学位的三年半里,经历有点奇特。我遗憾的是“真才实学”没有长进多少,并且没有了在西电那样的纯真友情。略为欣慰的是我做了几件有意义的事情。

我很想讲一讲自己参加希望工程的经历与感受。
1998年暑假,浙江省云和县梅源中学的老师们带着希望班几名优秀学生来到浙江大学,其中有受我资助的何晓丽同学。我才知道初中学生一个学期的学杂费就要 600元。何晓丽哭诉下学期不能再上学,其它的学生处境相似。我以前资助的2000元是5个人3年平均分派的,根本不起作用。
那时侯,公司倒闭使我债务累累,并且自信心遭受十年来最大的打击。我在入不敷出、心事重重的情况下,没有推卸义务,而是“变本加厉”的去尽这 个义务。我在西电的好朋友史江一替我“接管”了一个中学生。有一个小姐追求我,我乘机给她一个活生生的“见面礼”。1999年7月份,我把饭卡送给了一个 大学生,自己成了无产阶级。从1997年11月起到我博士毕业期间,我直接或间接地为7个贫困学生捐助了约1万元。我有了几点感受:
(1)对人的帮助莫过于给予希望。
(2)人在任何时候都能够帮助比自己更困难的人,哪怕自己处于困境。
(3)帮助是要负责任的,一定要设法做成有意义的结果。不负责任的帮助就是“施舍”。“施舍”缺乏诚意,不配称为“帮助”。不少人曾对我说:“你是做大事的人,不要在小事上浪费精力,更不要为了别人而害了自己。”
很多人总以为自己将来是伟大人物而不愿做小事,从而到死也没做成什么有价值的事。也有很多人希望自己成功后再去帮助别人,无论他最终成功还是 失败,一辈子也没有帮助过人。还有很多人略有权势或略有名气后,便觉得自己吃喝玩乐、放屁、上厕所都是重要的事,在他们最能够帮助人的时候却以“太忙” “没空”为理由不去做好事。
我也在忙碌、在奋斗,也渴望成为伟大人物,但我希望让有意义的小事充实一生。

我还要讲另一件我常干的小事。
很多受过高等教育的人保留了随地扔垃圾的“风俗习惯”,这恶习就象脚气那样虽然不致人于死地,但能遗臭万年。即便象浙江大学这等典雅的地方, 你都经常可以看见草坪、校门口的废纸、果皮和塑料袋等,垃圾就如同天使脸上的一砣狗屎那样鲜艳,人们竟然无动于衷。我记不请自己多少次当众、当道捡垃圾, 可是几年来我都没有在大学里发现第二个做这种事的人。我很想对所有的教授、博士、硕士、学士们讲句话:“救人并不只是医生干的事,保护环境也不只是清洁工 干的事。只要你多花几秒钟,弯几次腰,就能让环境更加清洁,让心灵更加清洁。我们不必个个道貌岸然,但至少应该做到‘读书明理’。”那些正在追我和将要追 我的小姐们,你多捡一次垃圾就多一份希望,你丢一次垃圾就不再有希望。
我这样喋喋不休地讲“希望工程”和“捡垃圾”,并不是在沽名钓誉,也不是在布道,只是希望我这些“金玉良言”能触动更多的自以为自己是高素质的人们。

在浙大的三年半里,我没有对感情“播种”,所以也没有收获,但有一次“艳遇”。在关闭公司的那天晚上,人去楼空,我象严监生断气前那样盯着尚 未熄灭的灯。这时某大学的一位四年级女生来找我。一年前她曾作为实习记者采访过我,谈得很投机。我知道她是聪明好学的学生,曾大言不惭地教导过她几次。我 开公司的一年里几乎没与她来往过,想不到当我成了光杆司令时她还能“兔死狐悲”地来看望我,着实让我感动。
我不无自嘲地对她说:“你不用安慰我了,这次失败我还能挺得住。”
她说:“我不是来安慰你的。我一直盼望你的公司倒闭,等了整整一年。在你去北京之前,我有话跟你说。”
我心下一凉,搞不清什么地方得罪她了,让她如此记恨我。大概是我得意之日教导她时言语过重,伤了她的自尊心。好在我是知错就改的人,当下惭愧地向她道歉。
她不理会我,说:“你开公司时光环重重,我根本无法靠近你。即便那时我成了你的好朋友,你也不会把我放在眼里。我暗恋你一年了,一直都没跟你 讲。我早知道你会失败的,失败时你就剩下一个人,你才会知道我是真心爱你的,而不是冲着其它来的。你是个优秀的理科学生,我是个优秀的文科学生,门当户 对,珠帘壁合。请你不要觉得女的追男的很荒唐,我是认真的,请你给我一次机会。”
我虽然评不上情场高手,好歹也在爱河里游过泳,呛过水。想不到仓促之下,被一女子说得脸红耳赤,无法掩盖窘相。
我一直认为男人应该勤劳一辈子,好让柔弱的女子舒舒服服地在大树下乘凉。而学习、工作出色的女子只能做朋友,不能做夫人。
她从小习诗弄文,读大学时蜚声校园。我见到她第一面时就把她归类为事业上的朋友,所以才会正儿八经地与她交谈并教导她。我在西电的两个女朋友 就属于读书不太好但比较有魅力的女生,我从来也没有指导过她们学习。如果我喜欢一个女孩子并希望她成为我的女朋友,我早就去追求她了,岂能轮到她追我。
她见我彷徨不安,便滔滔不绝地例举爱我的“证据”。我开公司一年来发生的事她了如指掌,就象在我的房间里放了窃听器,在我的朋友中安插了间 谍。她甚至趁着实习机会跑到团中央去查阅我的老底,有些“光辉记录”我过去的伙伴都未必知道。她思念我时,写了很多诗,留了很多泪……
我早知道有些人不编程序、不做实验就能写出论文,难道男女之间不接触也能滋生感情?
第一回合我就被她挑翻在地,我莫名其妙地成了“负心郎”,无地自容地把她送走。我以为这是文科女生的风格,就当作一个趣事不放在心上。
我从北大方正“劳改”回来不久后,她提着一篮鲜花来找我,并对我说了她的梦想:在寒冷的冬天,大地铺满积雪,四野人鸟绝迹。我孤独求败地深居 在冷冰冰的小木屋里。在一个狂风呼啸的黄昏,她一手拎着亲手做的饭菜(我想应该有土豆和辣椒),一手拎着一捆木柴,敲开了那扇紧闭的门和心房。终于木屋四 壁生辉……
我曾对第一个朋友最好的赞美是:“黄蓉很象你。”
我曾对第二个朋友最深情的话是:“将来咱们老了,我回黄岩当物理老师,你当语文老师。”
相比之下,我的确不及她浪漫。此后她再找过我几次,当我意识到她动真格的时候,她已不能自拔。爱情是很怪的东西,并不是两个好人在一起就能碰出火花。与其让她长痛,还不如让她狠痛一次。
我对她说:“我们真的不能在一起。”
她问为什么?
我说:“不为什么,我没有心跳的感觉。”
她说十年之后再找我。
我知道她会奋发图强,因为她会一直想着“为什么”,期望让自己有个满意的答案。 这条路8年前我已经走过了。后来她读硕士时我曾再见过她,她在文学上已经有了长足的进步。
她说将会送给我她的第一本著作,书中开头的几个故事是关于我和她。
我说看了她的书后一定会写一篇读后感给她。
她仍然提醒我不要忘记十年后的相约。

我在浙大有一个值得怀念的人,她是管宿舍楼的大妈。在1999年1月至5月,我在博士生宿舍静心修炼内功,大妈就象我的“”。晚上九点钟时, 她就会烧些东西给我吃。我和大妈非亲非故,同学们都不明白大妈为什么待我好。我想那是因为我没把自己当成“博士”来看,而是当成“人”来看。
5月份后,我看在国家的份上搬到一个千万富翁家里去住,大妈也调到“熊猫馆”当掌门人。我一般隔几个月去看望大妈一次,中秋节我就和她在一起。朋友们知道我和大妈有这层关系,就纷纷托大妈物色女朋友。
大妈果然称职,她就象特务那样审视大楼里的女生。可大妈毕竟是大妈,她采用的“标准”是几十年前的版本,无法与现今的兼容。她盯住了不该盯的,却漏掉了不该漏的,至今都未“推销”成功一个。
这件事让我又明白了关于软件的一个道理:光有完善的数据库还不够,还应该提供很好的搜索引擎。

我相信生活、科学、艺术中的很多道理是相通的,于是就不嫌人笑,写下了十年来的故事,交最后一次作业。
大学十年给我留下了很多美好的回忆,现在可以打上漂亮的句号了。尽管我即将告别大学,但我会终生学习。也许我成不了天才,但还有机会成为天才的爸爸。
我想大声呼喊出那种可以用双手把握未来的自豪。
我要对年轻的朋友们说两句肺腑之言:
一、主动去创造环境,否则你无法设计人生。
二、生活和工作要充满激情,否则你无法体会到淋漓尽致的欢乐与痛苦。
如果我碰到上帝,只会对他说一句话:“你看厕所去吧。”

2000年7月份,我从浙江大学博士毕业后到上海贝尔有限公司工作。从2000年8月至2001年底,大约一年半时间,我在网络应用事业部从事软件工程与 CMM的研究与推广工作。从2002年初至今,我调到公司总部从事企业研发管理的研究。我在上海贝尔没有发财,没有当官,那么工作近两年来我都在做些什么 呢?
我在心平气和、踏踏实实地做学问。
我读本科的专业是半导体物理,硕士专业是集成电路,博士专业是计算机图形学。十年之内我换了三个专业,哪一个专业都没有学精通。我觉得自己在软件工程方面有些悟性,可是没有当成专业来系统地学习。所以博士毕业时,除了有点虚名外,我的确没有什么过人的才能。
如今大学里的博士、教授中“水货很多”,我不幸是其中之一。象我这样的好苗子沦落为“水货”,是中国大学学术腐败、堕落的恶果。
在公司里,很多员工恭谨地叫我“林博士”,甚至还有年轻人特意来看看我这个“好榜样”。虽然我也爱慕虚荣,可是良心未泯,彼时我那有博士的真才实学,多么羞耻啊。

刚到公司时,我有两类工作可选择:一是开发产品,二是研究并解决企业存在的软件工程问题。
我在开发产品方面比绝大部分应届毕业生和员工们有经验,当项目经理可谓熟能生巧。软件工程则是我的研究兴趣。前者可能会有更高的经济收入,后者能提高自己的学问。当时我的想法很简单:趁着自己还年轻,赶紧好好做学问,弥补读博士期间浪费的三年青春,让自己有真才实学。
在企业里做学问与高校里很不一样。如今学校里的学者们越来越浮躁,聪明才智大多建立在“纸上谈兵”之上,做学问变成了造文章。而企业特别讲究“务实”,所有的工作围绕一个目标:努力让企业活下去并且活得更好。
我在公司里没有象在学校里那么“兴风作浪”,日子过得很简单,不停地调研、写规范和培训。就象少林寺藏经阁里的修练者。上海贝尔提供了一流的 软件工程研究与实践环境(不是现成的,是争取来的,这就是我信奉的“创造环境”)。在这种环境下,只要人不笨,认真工作,谁都能成为软件工程专家。
在博士毕业前,我写了一本薄薄的书叫《软件工程思想》。这本书与《大学十年》一样在网上流传,我曾经自鸣得意。最近我要出版一些研究成果,便重新阅读了那本《软件工程思想》。发现此书真的是彻底地“纸上谈兵”,不仅对企业毫无用处,并且会误导读者。
我真是悲喜交加,悲的是和我同类的一大批“假博士”长期干些“自欺欺人”的研究工作,浪费生命并且浪费国家财产。喜的是我终于跳出了虚假学术的火炕。我不敢说现在自己的水平有多高,但至少能够拿出一些对企业有价值的东西来。
我在公司是一名自由自在的软件工程专家,公司待我不薄。如果不给自己一些事业上的压力,人很容易在安逸中堕落。我的目标是创作出可以与 Rational公司RUP相媲美的软件过程规范,并且开发出物美价廉的适合于中国IT企业的项目管理软件。基于大量实践的基础上,我和合作者研制了一套 “软件过程改进解决方案”(Software Process Improvement Solution, SPIS)。SPIS的主要组成部分:有基于CMMI 3级的软件过程改进方法与规范,称之为精简并行过程(Simplified Parallel Process, SPP)。一系列培训教材,包括软件工程、项目管理、高质量编程等。基于Web的项目管理工具,包括项目计划、项目监控、质量管理、配置管理、需求管理等 功能,命名为Future。
以我们研究小组的实力本来是可以顺利完成SPIS的。但遗憾的是,SPIS不是公司产品发展战略范畴之内的东西,不能作为正式项目开发,我的组员们都被分配了其它的任务。我只能在公司之外组织一些朋友共同开发SPIS。虽然困难很大,但是工作很有意义,很鼓舞人。
我依然相信“创造性的事业要靠激情来推动”。最近我又重新修订了以前写的《高质量C++/C编程指南》一书,增加了不少精彩章节,更名为《高 质量程序设计指南——C++/C语言》,2002年5月底会在电子工业出版社出版。希望在今后的一年内,我能结识不少志同道合的朋友,共同把事业做好。

 

(全文完)

关于 Windows 2003 的负载平衡的安装与配置

 

负载平衡是一项综合的技术,在实施过程中往往伴随着其他技术的应用。比如网络负载平衡群集和服务器群集的结合,甚至与存储区域网络或网络附加存储相关联都是一个不错的主意。

 

相关文章及参考:

网络负载平衡常见问题

如何在 Windows Server 2003 中配置网络负载平衡参数

如何在 Windows Server 2003 中为网络负载平衡设置 TCP/IP

HOW TO:在 Windows Server 2003 中执行基本网络负载平衡过程

HOW TO:在 Microsoft Windows Server 2003 中创建“系统策略”设置

网络负载平衡事件消息

配置网络负载平衡

红客联盟论坛 -> Windows -> Windows Server 2003网络负载均衡的实现

微软支持知识库文章(KB)搜索

微软出错消息和错误代码搜索

Google -> windows 2003 负载平衡 配置

 

QQ登录失败 – 异常情况,限制登录保护,需激活

QQ登录失败又一例 – 限制登录,需激活
您的号码[47404844]可能存在异常情况,已受到限制登录保护,需激活后才能正常登录。激活网址:
http://im.qq.com/jh
【QQ  版本】Build 15.63.310
【QQ  号码】47404844
【操作系统】Microsoft Windows
2000 Service Pack 4 [Build 5.0.2195]
【网络设置】局域网内使用透明代理
【登录过程】
—————————————————————————
 开始登录……时间[2006-05-30
15:37:32]
 初始化登录服务器列表,上次的登录方式为【初始登录方式】
 尝试UDP方式登录,先创建UDP网络组件
 创建UDP网络组件成功,本地IP【61.52.***.***】,端口【4001】,准备连接登录服务器
 UDP登录服务器【sz.tencent.com】需要域名解析…
 UDP登录服务器【sz2.tencent.com】需要域名解析…
 UDP登录服务器【sz3.tencent.com】需要域名解析…
 UDP登录服务器【sz4.tencent.com】需要域名解析…
 UDP登录服务器【sz5.tencent.com】需要域名解析…
 UDP登录服务器【sz6.tencent.com】需要域名解析…
 UDP登录服务器【sz7.tencent.com】需要域名解析…
 UDP登录服务器【sz8.tencent.com】需要域名解析…
 UDP登录服务器【sz9.tencent.com】需要域名解析…
 UDP登录服务器【sz.tencent.com】域名解析成功,解析为【219.133.49.171】
 UDP登录服务器【sz2.tencent.com】域名解析成功,解析为【219.133.60.31】
 UDP登录服务器【sz3.tencent.com】域名解析成功,解析为【219.133.48.87】
 UDP登录服务器【sz4.tencent.com】域名解析成功,解析为【219.133.40.138】
 UDP登录服务器【sz5.tencent.com】域名解析成功,解析为【219.133.49.169】
 UDP登录服务器【sz6.tencent.com】域名解析成功,解析为【219.133.60.37】
 UDP登录服务器【sz7.tencent.com】域名解析成功,解析为【219.133.48.89】
 UDP登录服务器【sz8.tencent.com】域名解析成功,解析为【219.133.40.37】
 UDP登录服务器【sz9.tencent.com】域名解析成功,解析为【219.133.60.39】
 UDP服务器域名解析过程完成,开始连接服务器
 尝试连接UDP服务器IP【219.133.49.169】,端口【8000】……
 尝试连接UDP登录服务器超时,转尝试连接下一组服务器
 尝试连接UDP服务器IP【219.133.60.37】,端口【8000】……
 尝试连接UDP服务器IP【219.133.49.171】,端口【8000】……
 连接UDP服务器成功,服务器IP【0.0.0.0】,端口【0】
 确定登录UDP服务器IP【219.133.60.37】,端口【8000】
 向登录服务器发送新登录第一步骤数据
 收到服务器登录第一步骤的回应,回应成功,发送第二步骤的数据
 发送登录第一步骤的数据成功,发送第二步骤的数据
 收到登录服务器登录第二步骤的回应,服务器要求重新登录到另外一台服务器,IP【202.96.170.164】,端口【8000】
 尝试连接UDP服务器IP【202.96.170.164】,端口【8000】……
 开始重新登录到指定的另外一台服务器,IP【202.96.170.164】,端口【8000】
 连接UDP服务器成功,服务器IP【0.0.0.0】,端口【0】
 确定登录UDP服务器IP【202.96.170.164】,端口【8000】
 发送登录第一步骤的数据成功,发送第二步骤的数据
 收到登录服务器登录第二步骤的回应,登录失败,原因:服务器返回不成功,提示信息:
您的号码[47404844]可能存在异常情况,已受到限制登录保护,需激活后才能正常登录。激活网址:
http://im.qq.com/jh

technorati 标签:QQ, 异常, 保护, 激活, 限制登录, 登录失败

使用 Flock 写作

关于清除QQ空间人气精灵V3.5生成的isignup.dll和isignup.sys病毒文件

“QQ空间人气精灵”是TT86开发的一款免费刷QQ空间人气的软件.
本来是件很好的事,3.4版我就一直用它,可不幸的是更新的v3.5版却捆绑了恶意的盗号木马!
运行QQ空间人气精灵后,卡巴斯基(Kaspersky)提示:

被感染: 木马程序 Trojan-Dropper.Win32.Agent.wf
C:\Documents and Settings\Administrator\桌面\v3.5\QQ空间人气精灵.exe 350 KB
被感染: 木马程序 Trojan-PSW.Win32.Hangame.dz
c:\program files\internet explorer\connection wizard\isignup.dll 40.3 KB
被感染: 木马程序 Trojan-PSW.Win32.Hangame.ea
C:\Program Files\Internet Explorer\Connection Wizard\isignup.sys 54.3 KB

我在此重点只是告诉大家是为什么感染的该病毒,
至于清除方法,安装卡巴斯基(Kaspersky)的用户不用手动清除,杀毒软件会在提示几次后自动重启,重启后的文件已经不被系统再调用,可以直接删除病毒文件isignup.dll和isignup.sys,或者再扫描一遍
C:\Program Files\Internet Explorer\Connection Wizard 文件夹.
如果你不是卡巴斯基(Kaspersky)用户,建议先恢复注册表的EXE文件关联

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks]
“{B8A170A8-7AD3-4678-B2FE-F2D7381CC1B5}”
[HKEY_CLASSES_ROOT\CLSID\{B8A170A8-7AD3-4678-B2FE-F2D7381CC1B5}]
[HKEY_CURRENT_USER\Software\Microsoft\qqjdd]

重启系统,然后手动删除病毒文件isignup.dll和isignup.sys.
更详细的说明可以搜索 Google 或 Baidu !!