2006年9月30日星期六

Windows 程序设计 - 该教 MFC 还是 WPF

上个学期我们上“Windows程序设计”这门课程,主要讲的是MFC,当然也包括GDI/GDI+绘图,同时普及了C++历史和STL使用等知识。我当时是比较反对讲MFC的,任课老师以前曾经教过VC6和VB6,现在为什么选择VC2005而不选择VB.NET呢?如果觉得VB.NET显得“幼稚”,那么可以选择C#。现在MFC已经是过时的技术,易用性比不上WinForm,等Windows Vista出来又有WPF了。

我反对讲MFC的理由是,培养一个熟练的MFC程序员和一个熟练的WPF程序员同样需要5年,然而从现在算起5年之后MFC肯定已经在收缩而对WPF程序员的需求将会增加。任课老师反对讲WPF的理由是不能够将Beta阶段的技术拿到课堂上来讲。

现在我反思过这个问题,对于还有2年就毕业的学生来说,他们是否拥有“成为熟练WPF程序员所需要的5年”是不确定的,因为2年后别人对他们的选择会在一定程度上决定了他之后的3年怎么过。对比一个不太熟练的MFC程序员和一个不太熟练的WPF程序员,显然2年后前者会比较受欢迎,或者称之为“更容易被接受和选择”。

站在学生的角度,一些人会希望学习MFC而另一些人则会希望学习WPF,这时候学校应该视乎学生的需求程度而开课,任何一门课程只要学生的需求相当学校都应该尽力去开。而“Windows程序设计”这是一门选修课,所以老师是完全有权自己选择讲授内容的,况且MFC的学习需求也不低。至于为什么不开WPF相关课程,就只能解释为需求不足或者学校无法满足此需求了。

2006年9月28日星期四

ASP.NET 2.0 中的 DataSource 系列控件

在ASP.NET 2.0中,引入了DataSource系列控件,扔一个到页面上并且选择性的配置好SELECT/UPDATE/INSERT/DELETE对应的操作,它就能够和数据空间无缝合作自动处理查询与更新,并且提供分页、排序等支持。

有一些ASP.NET 1.x的程序员,并不喜欢使用DataSource控件,觉得还是按找1.x的写法在Page_Load里面设定数据控件的DataSource属性然后执行DataBind好,但实际上2.0的数据控件为DataSource控件做了不少优化所以应该尽量使用DataSource控件。我在使用2.0的过程中DataSource控件和手动DataBind都尝试过了,并且借助Reflector分析.NET自带控件的代码,发现了其中的一些差异。

首先要说的是,数据控件对于是否使用DataSource控件是非常敏感的,很多操作数据控件都会检查自己的DataSourceID属性是否为空,如果不为空则很多事情都能够配合DataSource控件自动化完成,如果为空则通过事件通知用户需要手动完成一些操作。

例如GridView的分页,在使用DataSource控件的时候是能够自动运作的,在翻页时GridView会自动将PageIndex设置为GridViewPageEventArgs.NewPageIndex,同时设置RequiresDataBinding为true,接下来的事情就如魔术般自动发生——GridView会重新执行DataBind,这时候它会懂得自己去找DataSource控件获取DataSourceView,然后从DataSourceView中获取本页数据并进入创建子控件环节。如果你提供给DataSource控件的SELECT方法本身就支持通过传递参数选择仅获取某一页的数据,那么DataSource控件就懂得仅获取GridView所需页的数据以及总页数。

但如果没有DataSource控件,只是指定DataSource并且DataBind,那就会提示GridView未设置OnPageIndexChanging事件,其实意思就是你必须自己手动处理这个事件。对于DataSource从来都是整个GridView显示的数据这种情况来说,自己添加一个OnPageIndexChanging事件并在其中手动更改PageIndex属性和重新DataBind就可以解决问题了。但如果你想优化SELECT方法为仅获取当前页的数据,那就没办法了,因为你无法手动设置GridView的PageCount属性。

2006年9月25日星期一

Atlas 正式命名发布

发一则晚了两个星期的新闻,Altas已经有了正式命名,详细可以看这篇"Atlas" 1.0 Naming and Roadmap。大概包括以下几个变更:

  1. Atlas 1.0正式版将于2006年底发布,作为MS官方发布的产品将受到MS技术支持。无论是企业还是个人都可以放心的将正式版的Atlas应用于重要的场合,因为如果用户反馈bug存在则MS将会提供相应的hotfix。
  2. Altas 1.0将是一个“核心”版本,包括现在Altas的一些核心功能。部分现有的Atlas功能将在Atlas 1.0“核心”版本中剥离出来,成为独立的下载项目,这样做是为了能够确保“核心”的功能的质量以及能够赶在年底之前发布正式版。
  3. Atlas的客户端JavaScript库将命名为Microsoft AJAX Library,可用于任何AJAX项目而不仅限于ASP.NET;Atlas的基础服务器端控件库将命名为ASP.NET 2.0 AJAX Extensions,这些控件的标签前缀将由<atlas:>改为<asp:>,并且在ASP.NET的之后版本中成为内置控件;Atlas Control Toolkit这个免费的服务器端控件集将命名为ASP.NET AJAX Control Toolkit。

Atlas发布正式版是一件好事情,因为稳定而且受到官方技术支持意味着会被更多人选择,这样就能够有更多的Atlas技术资料也有更多人参与到Altas技术讨论中来。

2006年9月22日星期五

Script# - 把 C# 编译为 JavaScript

原来有一样东西叫做Script#,是Atlas的主要开发者之一的Nikhil Kothari自己编写的一个小框架,目标就是制作一个C#编译器让C#可以直接编译为JavaScript,并且是不经过编译为IL这个步骤。

之前我就说过,以MS的做法如果要想继续宠着那群很RAD的ASP.NET程序员,并且确保他们继续think inside MS's box,那就必须做一个C#到JavaScript的编译器,让ASP.NET程序源可以继续以C#语法和服务器端控件编写方式来制作客户端控件,然后如服务器端拖放控件一个制作Ajax应用。不过我当时的想法是,先编译为IL再编译为JavaScript,这样其他语言也都能兼容近来,不过Script#的做法就是C#直接编译。我当时还想过要有一个控件树和HTML DOM影射的模型,不过在Atlas里面这个应该是xml-script的DOM而非HTML DOM。

回头看Atlas,为什么它设计得那么像C#,让大家可以用C#的对象设计方法来写JavaScript(当然代码要写对一些),同时把C#能实现的都尽量实现了,原来就是为了Script#铺路。其实这个编译器不难做,C#每一条关键所表达的语义要在JavaScript找一个对应的表达方式是肯定做得到的,不过如果对应的JavaScript表达方式如编译为二进制代码一样难读,那就难以编译后修改再用了,所以Script#有一个关键的目标就是编译出来的JavaScript是高可读性的。

其实很好的主意天天都会降临在不同的人身上,只是你会不会愿意抓住它然后做一个大家都看好的东西来,而你的价值取向很大程度上决定了这个东西最后是否被看好。当然,价值取向只是一个决定因素,如果你有适当的价值取向,但是你没有足够的技术来按照这个价值取向实现,最后还是会走弯路,甚至选择放弃。

最后,抢占时机也是很关键的,在Script#正式公布的同时能将Java编译为JavaScript的Google Web Toolkit也出来了,结果Nikhil Kothari有点后悔为什么不提前几周正式公布。

2006年9月21日星期四

Google Camp Kick Off Day

今天是Google Camp的开营仪式,主要包括下午Tech Day的游园式活动和晚上的李开复讲座。由从Google Camp进驻的idea出现到开营仪式仅仅不过40天时间,所以工作看起来都挺仓促的,没什么独家的精心准备。

有趣的是,开营活动竟然是有模板的,所以就算时间仓储,也能按模板完成开营仪式及前期活动。模板是怎样的,就不便公开了,因为那是印着“Confidential”的东西,我只能按照今天的活动情况大致介绍一下。

今天下午是Tech Day活动,也就是6个需要使用Google产品或帮助大家了解Google的小游戏,并且有礼品派发给获胜者,包括笔、笔记本、文件夹之类的小文具,杯子也有一些,非常多人想要的Lava Lamp也来了一只,理所当然地给某获胜队伍抢去了。晚上是Kick Off Day,也就是开营仪式,包括赠旗仪式和李开复演讲等。演讲主题是“21世纪人才需要具备的7种素质”,这算是他讲过多次的题目了,不过由他亲自来讲还是十分精彩的。

Google Camp开营仪式的整个活动,并不是由Google负责所有工作的,而是雇佣PR(公关)公司负责的,所以前期准备工作我们需要分别联系Google和PR公司,导致沟通有点问题,工作看起来也就很赶。可能因为Google刚刚进入中国吧,外国的PR方式不可能照搬,所以在有自己一套PR方式之前还是要雇佣本土的PR公司。MS Club以前的活动都是直接和MS负责高校活动的人直接联系的,PR直接由MS负责,这就省去了和PR公司沟通的麻烦。我们只能期待本土的Google成长起来,做到既能够适应本土环境也为本土环境注入新的力量。

2006年9月20日星期三

大学牢 - 本科的四年有期徒刑还剩两年

最近都没有时间写blog了,因为在忙着Google Camp的开营仪式以及有关的前期活动。南校区Google Camp的几个发起人都是研究生来的,我大三也就成了学历最低的。然后我们在学校BBS上公告招募第一批核心成员,结果东校区投稿的只有大三的,看来BBS在大二的宣传和人气都严重不足,以后可能越来越少人上BBS。其实我不想负责带大三的人,因为同一年级的往往不怎么听你的,很难调动,如果一个组织都是同一年级的话那些苦累活往往没有人干,变成部长级才是真正干活的。

现在大陆的高等教育,其实是在起监狱的作用。为了避免那么多人涌到人才市场上,所以就想方设法把人锁在学校里。正规的监狱囚犯通过劳动自给自足,大学这监狱不要求学生劳动,还为大家提供所谓的知识,当然要通过收钱才能让帐面平衡,所以叫做“教育产业化”。很多人不希望教育产业化,但是社会环境就是给机会学校摆出产业化的态度。以前学校从国家拿钱,是为了好好培养学生,国家可以说艰苦的环境也能培养人才嘛;现在学校从国家拿钱,态度跟监狱一样,就是为了帮国家所住一群奋青,国家可不能够轻易降低监狱的预算,所以也就只能任学校扩招。

总之,我还有两年就完整这四年的本科有期徒刑了,然后绝对不会再尝试在中国的学校里浪费时间。要读书,就算远的不能去也要去香港读。

2006年9月6日星期三

我喜欢的教材与我讨厌的教材

中国的数学教材都是这样写的:
   引理 5.3.14.1
      ...
   引理 5.3.14.2
      ...
   定理 5.3.14
      ...
   推论 5.3.14.1
      ...
   推论 5.3.14.2
      ...
这样写的书我觉得不是教材,而是referrence,作者仅仅是列举了他脑袋和其他参考书上的理论,然后根据依赖关系进行拓扑排序,最后写在一本书上面。例如矩阵,可能你整本书学完了你就会解书上的习题,除此之外你无法把知识和你之前(例如是高中)学过的任何数学问题联系起来,而老师则很可能告诉你这是“专业基础课程”所以这些知识“以后才有用”。

国外教材是不会这样写的。国外教材开头总会用一些你熟悉的而且能引起你兴趣的东西来给予你感性认识,例如通过解方程组的方法的对比来引入矩阵。可能你花了一些时间才弄懂了解方程组这个例子中的矩阵乘法运算是怎么算的,然后又花了一些时间发现要弄懂矩阵的逆怎么求并不容易,但你会乐意把这本书看下去。

我觉得国外的教材对于读者来说显得友善很多,因为在给出理性认识之前,提供一个感性认识是很有必要的,这样才能让读者产生兴趣,并且在读到后面章节遇到任何他无法独立思考理解的问题时,至少他还是可以马上联系开头的感性认识为该问题建立一个感性认识。而如果读中国的教材,一旦有一个问题你无法理解,那就是无法理解,你无法在大脑里面形成一个感性认识“大概就是这样推导的吧”,这时候你会面临两种选择:要么自己摸索着为该问题建立一个感性认识;要么死记硬背。大多数中国人会选择后者,而我个人极度不喜欢后者所以通常选择前者。

至于中国教材的作者,不是读死书的就是懒人,因为他们写书时跳过了引起读者感性认识的章节。读死书的不用说,他们根本不懂得如何写吸引人的东西,他们只能将自己脑袋里已经高度抽象化的概念写出来。而懒人则是大多数,他们有能力写吸引人的东西,可是他们懒,他们也想着节省纸张和读者的钱,所以决定不要写那么多。正确的叙述方式是“描述常见的现实例子 - 归纳出抽象的概念 - 应用概念到现实中”,懒的作者就会认为,这其中的第一部分可以省掉,或者合并到第三部分中,但这样做是违反了人的认知原理的,这样写的教材只会害了读者。

正如一个人类胚胎的发育会重新走一次人类进化的途径一样,一个人对某个概念的认知肯定也要走一次人类历史上对该概念认知的过程,虽然弯路可以少走一些,走的速度也可以快一些,但起点和终点还是一样,不能把起步的感性认识给去掉。