行者无疆 始于足下 - 行走,思考,在路上

Programming C#

1 课业要求

这半年有一门《C#程序设计》的课程,借着这个契机,匆匆学了下C#,并做了一个极其简陋的“大程”。

程序的要求基本如下:

  • 用C#实现一个数据库操作网页代码生成工具。需要实现的基本功能如下:
    1. 列出数据库中所有表供用户选择
    2. 用户选择一个表后生成若干网页,能对选定的表提供list、add、modify、delete等操作,不能使用GridView控件,需要用标准的HTML元素实现
    3. 能够分析表中每个字段的类型,在add、modify界面上根据字段的类型使用合适的Web组件,需要能正确处理数字、字符、日期等类型
    4. List的时候能够自动处理分页
    5. 为了提交作业方便,数据库使用access,提供对话框让用户选择数据库

我大概花了一周左右的时间完成了程序,这其中包括:三天的时间熟悉C#和Mono,一天的时间复习SQL语法并学习Sqlite的使用,一天的时间学习下ASP.NET,一天时间完成程序,最后一天的时间用来看新版《水浒传》……^_

最终的效果自然是十分“简陋”,只实现了第1、4、5条的需求和第2、3条的部分需求,而且还存在严重的bug。不过时间紧迫,加上我对微软的快餐文化无爱,就匆匆忙忙交了作业,忙下一门考试去了。

简单说下实现思路吧,顺便总结下学习C#过程中的一些心得。

实验的基本条件:

  • OS: Arch Linux
  • IDE: MonoDevelop 2.4.2
  • Language: C# implemented by mono project
  • Web Server: xsp implemented by mono project
  • Database: Sqlite 3.7.4

2 Mono

引用mono-project主页上的说法,mono is "An open source, cross-platform, implementation of C# and the CLR that is binary compatible with Microsoft.NET", MonoDevelop is "An open Source C# and .NET development environment for Linux, Windows, and Mac OS X"。虽然在Linux下用Mono来搞C#是件不怎么“光彩”的事情,但是mono却给我留下了极佳的用户体验。代码补全、重构,多语言支持,内建xsp server,集成调试功能,还有让我欢呼流泪的Editor的Vi-mode的支持。

那么Mono到底是个什么东西呢?直白点的说法就是,Mono是Microsoft .NET的跨平台实现。比如我们可以用C#写如下一个程序winform.cs:

using System;
using System.Windows.Forms;

public class HelloWorld : Form
{
    static public void Main()
    {
        Application.Run(new HelloWorld());
    }

    public HelloWorld()
    {
        Text = "Hello, Mono World";
    }
}

程序的功能十分简单:创建一个窗口并将窗口标题设为"Hello, Mono World"。

我们用如下的命令编译运行此程序:

gmcs -pkg:dotnet winform.cs && mono winform.exe

然后屏幕上就会显示一个窗口。将winform.exe拷贝到一个装有.NET的windows中,程序也是可以运行的。

3 Sqlite

基于程序跨平台的考虑,C#的运行环境我选择了Mono,而数据库则抛弃了MicroSoft Access,选择了Sqlite,也借此契机学习下这个世界上最流行的嵌入式数据库引擎。

什么是嵌入式数据库?传统的数据库,如MySQL,采用的是Client/Server架构。而Sqlite采用的Serverless架构。Sqlite所有的读写都直接应用于一个跨平台的磁盘文件。Sqlite的特性有:

  • ACID事务
  • 零配置 – 无需安装和管理配置
  • 储存在单一磁盘文件中的一个完整的数据库
  • 数据库文件可以在不同字节顺序的机器间自由的共享
  • 支持数据库大小至2TB
  • 足够小, 大致3万行C代码, 250K
  • 比一些流行的数据库在大部分普通数据库操作要快
  • 良好注释的源代码, 并且有着90%以上的测试覆盖率
  • 独立: 没有额外依赖
  • Source完全的Open, 你可以用于任何用途, 包括出售它
  • 支持多种开发语言,C, PHP, Perl, Java, ASP .NET,Python

Sqlite作为一个示范性的学习型开源项目也是一个非常理想的选择。在Sqlite的主页上有sqlite-amalgamation-3070400.zip下载,这是一个组合了所有Sqlite的C代码在一个单独文件中的压缩挡。是学习数据库设计与实现的极好资源。

Sqlite在很多著名的开源软件项目中都有重要的应用。引用《The Definisive Guide to Sqlite》中的一段话:

"If you are a programmer, imagine how much code it would take to implement the following SQL statement in your program:

SELECT AVG(z-y) FROM table GROUP BY x HAVING x > MIN(z) OR x < MAX(y) ORDER BY y DESC LIMIT 10 OFFSET 3;

If you are already familiar with SQL, imagine coding the equivalent of a subquery, compound query, GROUP BY clause or multiway join—in C. SQLite embeds all of this functionality into your application with minimal cost. With a database engine integrated directly into your code, you can begin to think of SQL as a domain-specific language in which to implement complex sorting algorithms in your program. "

记得大二下学期伊始学习Java,要编写一个浙江大学校车查询系统的软件,那个时候还没有学过数据库,就想破脑门地琢磨该怎么样采用Java实现复杂的校车查询算法,甚至想要去研究各种图论算法云云。直到两个月后学习了数据库原理,情况才逐渐明朗。最终的程序采用的是Apache Derby,另一款Java实现的嵌入式数据库。关于Sqlite和Derby的对比,可以参考Sqlite Versus Derby

我们可以用如下的命令找出系统中的Sqlite数据库文件:

sudo updatedb && for file in `locate *.db`
do
file $file
done | grep -i "sqlite" | awk '{print $1}'

Sqlite比较好用的GUI工具有sqlitebrowsersqliteman

Sqlite具有多种语言的bindings,关于C#的binding还有些小小的麻烦,因为Sqlite的binding并不是ECMA C#标准的一部分,所以MS C#和Mono C#对此的实现有些许差别。Mono通过Mono.Data.Sqlite实现访问Sqlite的ADO.NET,具体的示例代码如下所示:

  • 通过IDataReader:
using System;
using System.Data;
using Mono.Data.Sqlite;

public class Test
{
	public static void Main (string[] args)
	{
		string connectionString = "URI=file:/home/lox/test.db";
		IDbConnection dbcon;
		dbcon = (IDbConnection)new SqliteConnection (connectionString);
		dbcon.Open ();
		IDbCommand dbcmd = dbcon.CreateCommand ();
		// requires a table to be created named employee
		// with columns firstname and lastname
		// such as,
		//        CREATE TABLE employee (
		//           firstname varchar(32),
		//           lastname varchar(32));
		string sql = "SELECT * " + "FROM test";
		dbcmd.CommandText = sql;
		IDataReader reader = dbcmd.ExecuteReader ();
		while (reader.Read ()) {
			int FirstName = reader.GetInt32(0);
			string LastName = reader.GetString (1);
			Console.WriteLine ("Name: " + FirstName.ToString() + " " + LastName);
		}
		// clean up
		reader.Close ();
		reader = null;
		dbcmd.Dispose ();
		dbcmd = null;
		dbcon.Close ();
		dbcon = null;
	}
}
  • 通过DataSet:
using System;
using System.Data;
using System.Data.SqlClient;
using Mono.Data.Sqlite;

public class Test
{
	public static void Main (string[] args)
	{
		string connectionString = "URI=file:/home/lox/user.db";
		string commandString = "select * from py_phrase_0";
		
		SqliteDataAdapter dataAdapter = 
			new SqliteDataAdapter(commandString, connectionString);
		
		DataTable dataTable = new DataTable();
		dataAdapter.Fill(dataTable);
		
		foreach (DataRow dataRow in dataTable.Rows)
		{
			Console.WriteLine(dataRow["phrase"].ToString());
		}
	}
}

话说ADO.NET的DataSet和ASP.NET中某些控件的bind功能还真是挺方便的。

4 ASP.NET

ASP.NET?这究竟是个什么东西?大一时学了一门课叫做《WEB数据库设计》,讲的是ASP,诸如如何配置IIS,如何在Dreamweaver中添加Access数据源、连接数据库,以及VBScript的入门语法等等。三年之后我才知道,IIS并不是Apache的对手,Apache在某些方面也不如nginx,LAMP架构才是web服务中基础中的基础;编写html最好用的不是Dreamweaver而是vim;Access充其量只是个不跨平台比Excel强点有限的玩具数据库产品;ASP日薄西山,已经i躺在了历史的博物馆里了;当初对ASP的吹嘘——动态网页技术,如今又成了ASP的最大诟病——代码混杂,无法分离网页设计和业务逻辑——而这又成了ASP.NET横空出世的理由。至于ASP.NET能活多久,我不关心也不在乎,我所在乎的只是用这个东西尽快地完成我的大程序。

理解ASP.NET的核心在于亮点,一是MVC架构的理解,即业务逻辑和页面表现的分离;二是Windows事件机制和消息循环机制。

MVC(Model, View, Control)是当今网站中比较流行的架构。其最大的贡献在于实现了网站业务逻辑与页面表现美工的分离。最初的动态网页,无论是ASP、JSP还是PHP也好,静态的html代码和程序语言代码混杂在一起,造成了大规模web程序非常难于书写和维护。后来Java出现了各种各样的框架如当下流行的SSH(Struts、Spring、Hibernate);微软革了ASP的命推出了ASP.NET,以C#和VB.NET为后端实现MVC架构;PHP也有各种各样现成的数不清的框架。框架这个东西是最容易过时的。所以我觉得框架这个东西就像山东大饼,饱腹可以,太过深究细节就有些得不偿失,重要的还是要掌握柴米油盐。用框架人人都会,但是设计并实现出一个优秀的框架,就不是嘴上说说那么容易了。微软的快餐产品让千百万人踏入了程序设计的大门,也让他们陷入了跟潮流的漩涡。而一切微软技术的核心,定有躲不开的核心,那就是Win32 API和消息循环机制。

深入探讨这个问题已经远远超出了本人的能力。本人也只是窥探了几章《Windows程序设计》,才到这里才大放厥词。什么是消息循环?事实上消息循环绝不向消息循环那么简单,消息循环和OO、结构化程序设计一样,是一种Architectural Patterns。常见的Architectural Patterns(参考Software Architecture in Practice (2nd Edition)有:

  • Layered
  • Generalization(OO)
  • Pipe-and-filter
  • Shared-data
  • Publish-subscribe(event-based)
  • Client-server
  • Peer-to-peer
  • Communicating process
  • ……

消息循环属于Publish-subscribe,它是Windows事件机制的基础。而消息循环中很重要的两点一个是消息队列,另外就是Callback Functions(回调函数)。形像的讲,我们设每个事件为x,而处理事件x的函数为X。假设我们的一个系统软件依次出发a、b、c、d四个事件,那么消息队列中有abcd四个事件,然后由操作系统根据消息队列来决定下一步该做哪些事情。比如Windows看到了消息队列中的第一个事件为a,那么Windows就会调用A来处理事件a,a处理完毕后出队,接下来的事件是b,那么就调用B来处理时间b。没错,ABCD等Callback Function是有操作系统来调用,而不需要程序员在程序中显示调用,这也是它们被叫做Callback Function的原因。

理解消息循环对Windows程序设计是至关重要的,诸如MFC、C# Windows Forms和ASP.NET的所有事件处理机制都是基于消息循环。在一开始写GUI程序的时候常常程序的时候常常无法理解程序的执行流行,一来是结构化编程的思想根深蒂固,二来是没有完全理解Event-based程序的处理模式。那么另一个问题是,回调函数的机制又是怎样的呢?这个问题答案的关键字是函数指针,一个我们在C语言中学过、有点印象却很少用到的东西。函数指针也是C++多态性RTTI的关键所在!(参考《Thinking in C++, Volume 1》)。Java Swing的listener,QT的signal and slots机制,归根到底应该也是消息循环。Publish-subscribe, core of GUI programming。

差不多了。关于ASP.NET的絮叨到此为止吧,再下去就黔驴技穷了。如果再加一句,就是ASP.NET的控件还是挺好用的^_^

5 C#

最后谈到C#。简单的说,C++和Java入门之后,完全没有必要再学C#。C#能做的东西,Java都能做到,而且能做的更好。也算学了若干门Programming Languages,对语言之争已经看的很淡,更谈不上对某一门语言的死忠。在我看来,学习一门编程语言只能有两个结果:

  1. 给你的编程思想打开了新的一道门;
  2. 让你明白或巩固一个道理:trade-off是很重要的!

很不幸,对我来说,C#属于第二种,而Python和Shell Script属于第一种。C语言是指针的艺术,C++则有试图设计一种智能指针,Java抛弃了指针,只有C#,哆哆嗦嗦地使用着指针:unsafe code和delegate;C#的继承控制更为复杂,除了传统的public、protected、private,还有internal和protected internal;Java用import,包和文件目录有统一的物理逻辑关系,C#用using,包和文件目录很混乱,这到底是个优点还是个缺点?C++的class和struct几乎相同,C#却限制了struct的使用;C#还有一种类成员get/set的语法,我觉得这种语法糖特别恶心。更多的语言特性比较可以参考http://tech.it168.com/a2010/0817/1091/000001091254.shtml

写到这里我又想到,为什么会有如此多的Programmig Languages呢。假设把这些编程语言按照字母顺序排一下,让一个人去学,恐怕一辈子也学不完。github上有一个有趣的hello world项目,汇集了众多语言写的hello world程序,你可以通过如下命令获取这些程序:

git pull git://github.com/git/hello-world.git

面对如此多的编程语言,我们又该如何选择呢?著名黑客Eric Raymond给了我们有说服力的答案

"It's best, actually, to learn all five of Python, C/C++, Java, Perl, and LISP. Besides being the most important hacking languages, they represent very different approaches to programming, and each will educate you in valuable ways."

没错。虽然说解决问题是最终目的,方法手段有千千万,语言不是关键,思想是最重要的,但是选择语言往往也决定着你的思想,就比如你不太可能去用Python lambda, map, reduce去实现Functional Programming,也不太可能用lisp去写OO程序等等。

6 Learning Resources

.NET语言并没有C++语言如《The C++ Programming Language》和《C++ Template》这种重量级的传世著作,O'Reilly的《Programmig C#》《Programming ASP.NET》是非常不错的入门教材了。其余一切国内的中文xx教程、xx精通一虑不要看。

理解消息循环和Windows事件机制,最经典的莫过于Charles Petzold的《Programming Windows》,我虽然只看过前几章,但已经受益匪浅。

最终版的程序就不给了。区区几百行,bug一大堆,丢人的。如果实在有需要参考,可以给我发邮件。xiaohanyu1988@gmail.com。谢谢捧场。

永不停歇

2009年的最后一天的下午,和妞去外婆家吃了顿大餐,特别记得那里的青豆泥和黄金鸡翅,还有3块钱的麻辣豆腐。之后元旦的那几天陪妞泡图书馆,妞准备考研,我准备学期末的十几门考试。10号左右考研结束,我回到玉泉,硬着头皮编数值分析的8道题目。月中,漫长考试正式拉开序幕。月末28号早7点,起床看《计算理论基础》,10:30-12:30战斗在计算理论的战场上。然后接下来吃饭填饱肚子,回到寝室收拾行李。两点多出发,四点左右到机场,五点多飞机起飞,八点多到福州,摩的到车站,晚九点多坐上去厦门的大巴,午夜到厦门,饿得发昏,吃了一碗热汤面,夜里一点左右,找到旅馆就寝。

厦门几日参观了厦大,南普陀,在鼓浪屿上闲庭信步,听了一场很感动的吉他演奏。最后一晚特地到鼓浪屿上的小旅馆住了一宿。次日早起赶往车站,9点大巴到福州。半路大巴抛锚,磨蹭下午三点多才到福州。我和妞匆匆感到火车站。两分钟内交换整理了各自行李,妞独自踏上回家的动车——妞的手机坏了,我的手机充电器也丢了。半小时后我也上了回家的车,福州到北京,24小时的硬座。

回家几日,家里闹了点小矛盾,心情十分不好,才初九就提早跑了出来。和妞汇合,正是南方赏梅佳节。杭州植物园、余杭超山,留下了我们匆匆的脚步。而后心情还是不太舒畅,没怎么去上课,白天就在寝室睡大觉,晚上起来折腾Gentoo。实在心情不好就去夜爬宝石山,山顶的清灯古寺,躺在石椅上看看星星也好——虽然杭州的天空本就没有几颗星星。磨磨蹭蹭到3月底,被导师抓到实验室,开始了一个月的苦力生涯。现在想想那一个月的生活,还是挺好玩的。整个组就像个生产软件的小作坊——没有版本控制、没有QA和bug控制、需求总是不断在变、没有统一的代码风格、参差不齐的编码水平,致使项目一再延期。4月初妞去深圳实习,也不知道要多久。我一个人每天早晨从玉泉的最北边走到最南边,午夜在借着月色星光,听着自己的脚步声从最南边走回最北边。含笑开得正盛,晚上出实验室的时候就随手摘一多,清香醒脑,然后装在口袋里。满身的“香蕉味”。含笑,多么示意的一个名字啊。还有云南黄馨,一片片的黄,招蜂引蝶,很温暖。

这一个月仍然是没有去上过几节课。月末的编译原理无奈的放弃掉了,人工智能水了一篇科普文、仗着开卷考试混了过去。月底来了两个初中的朋友,twt和ww。我做东,吃吃喝喝,逛了几个我再熟悉不过的地方——西湖、紫金港等。4月30日下午3点分批赶往火车站,无奈交通大堵塞,退了火车票,大巴赶往上海,与南京来的朋友fx汇合。晚8点左右,南京路,四个初中的铁哥们,拥抱之后,非常不理智的加入了南京路上赶往黄浦江边去看世博会开幕烟火的汹涌人流——事实证明这绝对是个错误的决定。烟火没看到,倒见识到了恐怕这辈子再也不会见到的人口密度,真正的比肩接踵——竟然还有车子在人流里面慢慢的蹭,你说你这司机不是找抽嘛。

两日世博匆匆茫茫。想比较10月100万/天的人流规模,5.1三日20万/天的人流对我们来说已经算是很仁慈了。可是逛了一天我还是感到厌倦。第二天下午我就下定决心以后再也不凑这种热闹了。幸好2日晚上妞来上海,我就找了个理由告别了哥们,提前结束了原本预计三天的世博之旅。3号回到杭州。4号开始着手数模比赛。14号晚上霸占了实验室的小会议室,我主刀文档,ly和lyf负责数据和资料支持,三人通力合作,早9点拿出了最终的论文。结果也没有让我们失望,校赛二等奖,拿到了国赛的资格——虽然国赛铩羽而归。数模完了就开始很功利地刷ZOJ,开始还是很认真的在做,有一周周一早晨进入实验室一直待到周四中午才会,就在不停的刷ZOJ。后来时间上还是来不及,加上题目难度增大,就开始耍一些小花招,比如有些题目回去看别人的代码,然后看懂后自己照着写写就提交等等。最后在月底总算刷够了题目,好歹能去参加选拔赛见识一下了——虽然我承认这样的急功近利很不光彩。我们对人对事常常会有双重标准。比如我们痛恨关系人情,轮到自己的时候却拼了命的去找关系、攀人情;我们痛恨钱的万能,但是却希望自己能有更多的钱。对人对己,一视同仁,这个真的好难做到。

6月初就在补各种课写各种实验报告了。妞在家帮妹妹准备中考、学车、做毕业设计。妞的毕业设计做的也非常匆忙,答辩前还在画图,半夜开始做答辩PPT,早七点半哭哭啼啼的弄醒我,说PPT软件崩溃,夜里做的都没了。上午要第一个答辩。我就安慰着说别慌别慌,跟老师申请下调整下顺序。总算过了这一关。我自己花了半周左右的时间写完了初步的简历。13日我生日,腐败的抽出了半天的时间在九溪逛了逛,中午就感到zjg参加ACM新手上路第二场选拔,还是铩羽而归。15号左右开始找实习。20号左右ACM新手上路第三场选拔,错过旅行者年度散伙饭。选拔赛比完,心里明白,自己所谓的ACM梦想彻底告吹,专心找实习。25号拿下华数淘宝的offer。然后就是漫长的考试。煎熬的日子。恰好又赶上妞的外婆过世,虽然我非常希望妞在身边,但这也是无奈的事情。只有那实验室前的合欢,花如雪,飘落一地。一个人,实验室,软件工程、算法设计、J2EE、嵌入式系统、计算机体系结构实验、计算机组成实验,一门又一门的考试,疲于奔命的我。那个时候真的感觉自己再也不想上学不想考试了。每天心里就想着一个字——“熬”。考试之前完全看不下去,就在youku上看鲁豫有约了。现在想想那段日子实在太痛苦了。

7月12日,妞去上海正式上班,我也需要入职实习,好巧。早六点送妞去火车站,9点公交上睡到淘宝总部,被告知华数淘宝已经搬家。又是一路奔波,总算找对了地方。整个暑假还是一个人。一个人,九点上班,磨磨蹭蹭地八点四十五起床,三分钟洗脸刷牙,五十准点从寝室出发,五十五到古荡,九点坐上公交,四站,十分下车,十二到公司,十五开早会。午十二点聚餐、一点小憩、三点去领餐票、六点吃饭、磨磨蹭蹭六点半出门回玉泉,掏出古董的Nokia 6670,拍下傍晚的天空晚霞,或者路上赌成一排的车,彩信给妞——“妞,我回去啦”。八点到寝,开电脑,调好小音箱,音乐飘荡,书香四溢,一个人静静的享受。十点会给妞打个电话,午夜问声好梦晚安。说不上特别快乐,但是十分享受这样的日子。

9月开学,第一周周末数模国赛,弃赛,铩羽而归,蹭了三天的伙食。15日以后,一年一度的校园招聘正式拉开序幕。请了两次小假,都是中午到三点这样的时段,参加了一次百度的小型交流会,参加了一次有道选拔机试。中秋前几日也是事情不断。跟Ouka说好了要一起去楠溪江徒步三天,怎奈走之前三天胃痛非常,下午在校医院挂了盐水后还是很痛,晚上就直接打车到了省立同德继续挂了盐水,总算好了点。胃痉挛还是很痛苦的,胃镜也是,想想就发抖。Ouka担心还能否去徒步领队,我逞强说肯定没问题。挂完盐水后十一点回到yq,去参观生仪学院的某个实验室,谈到夜里一点,被硬发了一个直博的Offer……老妈在家乡听说我挂了盐水,掉了眼泪,给妞打了电话;妞在上海也怕的要死,兴夜匆匆赶来,午夜到了玉泉毛主席像,一个人等我到夜里一点。好在同德的药很管用。我见到妞的时候已经基本不痛了,反倒比折腾了一程的妞还生龙活虎,妞就说“怎么感觉是你应该照顾我而不是我赶来照顾你呢”。我就说“你难得照顾我一次嘛”。

次日早起回到寝室,千里连音,帮在北京的zhzf同志写简历,三个小时通力合作到中午,总算完成,然后哦zhzf就直接打印简历去面试了。过了几天告诉我被录取了,说是简历起了大作用了。下午去zjg借了一些睡袋和炉头,晚饭后打算打车到火车站,赶往上海。怎奈月到中秋,人们都忙着过节,交通堵塞,打的困难,等了将近一个小时竟然还是打不到车,报废了一张火车票。无奈只能大巴去上海。午夜到上海南站,打车回到住处已经夜里一点多了。次日早起背着两个大包赶往上海南站,我悲剧的没有带公交卡,排队买地铁票花了好长时间,离火车出发一分钟的时候我和妞赶到了检票口。已经迟了。于是Ouka和yy先行一步。我和妞改签至下一斑。下午三点四人终于在温州汇合。紧接着就赶往永兴。三日旅程诸多不顺。天气下雨,徒步溯溪水位暴涨,危险性大大增高;阴天,原本期望的银河也就此泡汤;第三天返程,乡野司机悲剧的开到了温州老站而非动车站,又一次导致火车晚点,四张票改签退票,损失200大洋;去长途站做大巴,只有去上海的大巴而没有去杭州的……于是我一个人被抛弃,仗着身上仅剩下的100元钱买了张到杭州的硬座票。妞比较顺利,晚上九点多就回到住处了;Ouka和yy身上没钱了,错过了若干班车,夜里四点才安全的回到寝室;我呢,铺上防潮垫在火车站大厅地上极其不雅观地睡了三个小时。然后硬座8个小时到杭州,下了火车就直接去上班去了……

9月30日晚上下班收拾东西赶上了回家的火车,一夜拥挤无座,到下午两点下车,到承德,到家,夜里11点了。待几日,9日返上海看妞,10日返杭,13-15日接待zyy和lyh,然后就是各种血淋淋的笔试面试。24日一夜无座到北京,26日百度开放日活动,然后上海->杭州->考试->上海->杭州->北京->承德->家->北京->百度。

一路匆忙,永不停歇。1月中旬的时候我就想:还有两周,挺过去就好了,挺过去咱就出去玩一圈;4月的时候心里想:再挺6个月,什么都能搞定了;8月的时候想:这个时候即使什么都不干也有一个很好的保底Offer了;9月数模三天想:算了就算了吧,时间来不及了;中秋徒步最担心的是:能不能安全准时地赶回去;10月的某日接到百度的面试通知:离下午面试还有七个小时,出去吃饭发呆上厕所还有五个小时,赶紧看书!11月回到杭州:老师,这数电你就给点面子让我过了吧;12月:坏了,今天忘记写日报了,明天得九点之前起床,赶到公司,补上周报………………

总是那么忙;总是闲不下来;总是不懂得拒绝;总是给把自己和别人的期望值抬的特别高。

可不可以睡一天的懒觉晒一天的太阳;可不可以看一天的电影而心里没有浪费时间的愧疚感和负罪感;可不可以逃离各种email、SNS、IM一个人静静地过过有期待有等待的日子;可不可以不要对自己要求那么高,做一个观众,观望看台下激烈的百米赛跑?

我们还是没有勇气,我们停不下来。我们一路匆忙、永不停歇。在这无尽的匆忙中追逐着自己的欲望,却离自己的理想一点点远去。

真的是这样吗?朝九晚五、绩效业绩、技术职称,这些就是我们人生的全部意义?为什么有时候我会很邪恶的以为人生有80%的意义产生在20%的假期里面呢?

说说接下来的计划吧。

  • 学习:
    • hadoop相关,重点看完O'Reilly的《Hadoop: The Definitive Guide : MapReduce for the Cloud》,写读书笔记。
    • python,画一个学习脑图,总结下学习成果,重点研究下lxml、beautifulsoup、urllib模块。
    • c#,完成一张脑图,总结下c#和java的不同,批判的学习,完成大程序作业。
    • 软件架构,看看设计模式吧,过了考试。
    • 运维相关,不断学习不断总结。
    • CMS系统,调查下各种CMS系统,自己动手搭建一个,赶快给出一个小网站设计方案,拖了好久好久,太不应该了。
  • 计划中:
    • Qt,看完《C++ Programming with Qt 4》,计划好久的事情了。
    • Lisp,看完《ANSI Common Lisp》,计划好久的事情了。
    • 网络,看完《TCP/IP详解》一、三卷,计划好久的事情了。
    • 数据库,看完《数据库系统实现》,自己动手实现一个miniSQL,计划好久的事情了。
    • 摄影,看完《纽摄》,拍够十个卷,计划好久的事情了。
    • 文艺,先搞定《温柔的夜》,再去攻坚《三毛全集》,计划好久的事情了。
    • ……,计划好久的事情了。
  • 毕业:
    • 十门课
    • 毕业设计
    • 第二课堂
    • 散伙饭
    • 领到两证
    • 看看能否再抽出三周出去骑两千公里。不过貌似很难有这个时间了。悲剧。




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee