RSS

Monthly Archives: 二月 2004

Teach Yourself Programming in 10 Years

Teach Yourself Programming in Ten Years

原文在这里(http://www.norvig.com/21-days.html),翻译不完整。

为何每个人都这么急?

走在书店里,你会看到《7天内学会Java》靠在一长排说要在几天或者几小时内学会VB、Windows、Internet…等等的书籍旁。

我在Amazon.com上面搜索了一下,标题符合“pubdate: after 1992 and title: days and (title: learn or title: teach yourself)”的书籍有248本,前面78本都是计算机书籍(第79本是《30天内学会孟加拉语》)。我用“hours”代替“days”再进行搜索,结果有253本书,前面77本是计算机书籍(第78本是《24小时内学会语法和语态》),在前面200本书里面,96%是计算机书籍。

我得到的结论是:1、人们非常急迫的学习计算机;2、计算机比其他的东西都要容易学。没有一本书是关于在多少天内学会贝多芬的音乐、量子物理、甚至学会养狗。

让我们分析一下《3天内学会Pascal》这个书名:

“学会”:3天内你根本没有时间写出一个像样的程序,更没有时间和一个经验丰富的程序员一起做事并明白如何在真正的Pascal开发环境中工作……

“Pascal”:3天内也许你能搞懂Pascal的语法(如果你以前会另外一种语言),但是你不能学会如何利用它的语法。简而言之,假如你是个Basic程序员,你会用Basic风格写Pascal代码,而不能明白为什么Pascal语法会那样设计而有何好处……

“3天内”:很不幸,3天根本不够。

10年内学会编程

各种学者们的学习经历已经告诉我们,大部分领域,都需要10年的时间成为专家,比如下棋、音乐、绘画、演奏钢琴、游泳、网球、心理学研究、地质学研究等等。这说明没有捷径,即使莫扎特,在4岁的时候就已经展示除了音乐天赋,但他直到13年后才写出了世界级的音乐作品。披头士乐队,好像是在1964年突然冒出来的,但其实他们在1957年就开始演出了,并在更早就组成了乐队,他们第一张震撼唱片“Sgt.Pepers”在1967年才发行。Samuel Johnson认为10年可能还不够,“任何领域的卓越成就只有靠穷极一生的努力来获得,别想用更少的代价就得到。”Chaucer感叹到,“生命如此短暂,而要学的东西如此多。”

下面是我对如何在编程上取得成功的建议:

* 对编程感兴趣,认为它很有意思,保证你在10年后都能保持兴趣。

* 和其他程序员交流,阅读其他程序,这比读书和培训重要得多。

* 写程序。最好的学习方法是边做边学。

* 如果你愿意,花4年时间呆在大学里(或者在研究院呆更长的时间)。这会让你能得到那些需要学历的工作,并且会让你对这个领域有更深的理解。但是如果你不喜欢上学,你也可以在工作中得到相同的经验。无论如何,仅有书本知识是不够的。Eric Raymond说,“不像学习了画笔和颜料技巧就能成为一个专业的画家,计算机科学教育不能让任何人成为专业的程序员。”。我雇佣过的最好的程序员之一就只有中学学历,但他写出了许多顶好的软件,拥有他自己的新闻组,并且因为享有股权比我有钱得多。

* 和其他程序员一起做项目,只有在项目过程中才能成为最好的程序员。如果你是最好的程序员,就试着领导一个项目,通过你的远见来启发其他人。如果你是差劲的程序员,就学习其他大牛是如何做的,并且去做那些他们不喜欢做的部分(因为他们让你去给他们做这些部分)。

* 在其他程序员后面接手一个项目,因为这需要你理解其他人写的程序。看看在其他程序员不在的时候你如何理解和修改他们的代码。考虑如何设计你的程序以让接你的手的程序员更能理解你的代码。

* 至少学会6种计算机语言。包括一种支持class abstractions的语言(比如Java和C++),一种支持functional abstraction的语言(比如Lisp和ML),一种支持syntactic abstraction的语言(比如Lisp),一种支持declarative specifications的语言(比如Prolog和C++模板),一种支持coroutines的语言(比如Icon和Schema),一种支持parallelism的语言(比如Sisal)。

* 记住“计算机科学”中有“计算机”这个词。搞懂你的计算机执行一个instruction要多长时间,从内存中取一个Word要多长时间(在Cache命中和没命中的情况下),从磁盘上读连续的Word要多长时间,在磁盘上搜索一个新位置要多少时间…

* 参与制定一种语言标准。可以是ANSI C++委员会,也可以是把你周围人的几种编码风格统一起来。不管是哪种,你都能弄懂其他人喜欢语言中的什么、有多喜欢、为什么喜欢。

做到上面的这些,靠书籍是不够的。我第一个孩子降生前,我几乎看了所有的“How To”系列的书,但是还是感觉像个菜鸟,等我第二个孩子降生后,我又把这些书都又看一遍了吗?不,我没有。我觉得靠我自己的个人经验要比那些专家写到书上的东西有用和可靠得多。

 

Posted by on 2004/02/28 in 未分类

6 Comments

Office Research Service & SharePoint Services

很早就和开心聊过在Office Research Service里面对SharePoint文档库进行全文检索,一直懒得做。今天看Exchange文档看得有点头晕脑涨,于是顺手把这个写了一下,让自己的脑袋暂时得到了解放…:)

实现技术上没什么说的,Office Research Service早已经被博客堂众位玩得很熟了。写Registration方法、Query方法,调用SharePoint Services的文档搜索,返回结果…对RS Task?Panel界面没做什么修饰。

最后再抱怨一下Exchange,对于一个纯粹的邮件服务器来说(尤其是并非作为邮件服务提供商或者大型机构的邮件服务器),太过复杂了,不管是管理还是编码。

这里有一篇讲述用Manage Code来写Exchange Event Sinks的文档和示例代码,对于写Exchange的垃圾邮件过滤器应该有帮助。

这里有一个完全的C#写的开放源码的Mail Server,并非网上常见的使用IMAP来调用其他Mail Server实现的收发界面哦,而是一个真正完整的Mail Server,当然其中也提供了用ASP.NET页面展示收发界面的示例。

 

Posted by on 2004/02/25 in 未分类

11 Comments

Tags:

计算机属于人民

想起从前美国PC革命时的一句口号,“计算机属于人民”,那个时候,只有IBM、DEC这样的大公司才能制造计算机、使用计算机,一台动辄上百万美元,而普通人是没法拥有属于“自己的”计算机的。

看了纯朴的狗熊的文章,才觉得其实很多程序员都不能理解这句话的。

每个人都渴望被崇拜,想想吧,我们在字符命令行下飞快的输入着命令,旁边那些甚至连英文字符都不认识几个的人用崇拜的眼神看着我,多么美好!

可是,计算机的目的是什么?“吓唬”大众的工具?我们的目标是让他们真正的属于人民,服务于人民。微软的广告“your potential, our passion”说明了一个很朴素的道理,一个软件公司的价值不在于它掌握了多少“核心的”、“关键的”技术,而在于它的东西能不能让人民发挥出自己的潜能。有艺术天赋的人能使用PhotoShop发挥自己的天赋,有音乐细胞的人能使用作曲软件展示自己的才华,有商业头脑的人能通过财务软件发展自己的事业…如果那么多有专业天赋的人都把时间和头脑浪费在如何学会和操作计算机上,计算机对他们有什么用呢?我们程序员又有什么价值呢?

在“服务于人民”这点上,有多少公司的理解超过了微软呢?再借用微软那个广告中的一句话,“因为我们知道,我们的强大,在于你(客户)的强大”,诚然如此,软件公司的强大(价值),在于客户的强大(实现客户价值),为什么有那么多人总是攻击,说微软的Windows技术上多么多么差劲,说金蝶的K/3居然用VB写的,等等等等…Windows的价值就在于让无数不懂计算机的人节省了无数的时间就立刻能够使用计算机为自己服务,K/3的价值就在于让企业立刻能够从信息化中获益,.Net/Java的价值就在于让构建软件系统的成本更低,效率更高,客户更节省成本。

 

Posted by on 2004/02/20 in 未分类

8 Comments

ScottGu回答了Whidbey发布的时间问题

和先前的消息一致:

在接着两个月内,将发布一个Beta之前的Interim Builds版本,这个版本将实现Beta版本的所有功能,但品质没有Beta那么高;
六月份推出第一个Public Beta;
在Public Beta之后一段时间,再会有一个修正了Public Beta相关Bug后的第二个Beta版,并且随这个Beta版本将包含“go-live license”,意味着这个版本基本可用了。

相关链接:Scott Guthrie explains the Whidbey release timing

 

Posted by on 2004/02/16 in 未分类

评论关闭

Follow Microsoft Step by Step !? …

 今天发现一家很“厉害”的公司,Vertigo,他们网站上自称是“Experts on the Microsoft platform”,一点都不假。

 

以前一直以为IBuySpyMicrosoft内部的小组为了演示.NET技术而写的,今天在IBuySpyWhitePaper上偶尔发现了“Vertigo Software, Inc.”的标示,上网一查,不得了,不但IBuySpy两个示范程序是这个Vertigo写的,整个ASP.NET Starter Kit5个示范程序其实都是他们写的。

 

Quake II 的引擎代码已经被开发商id software公开了,看看Vertigo做了什么:“首先,他们用四天,将QuakeIIC代码转换成了C++代码,然后,用了一天时间,将C++代码转换为Managed C++代码,最后,他们增加了一个用Managed代码写的雷达扩展插件到游戏中。”

这就是Vertigo做的Quake II.Net,可以在CodeProject下载所有源码。

Vertigo是Microsoft的金牌认证合作伙伴,我们公司也是,可是差距……国内的公司可能没有一家会做出这样的决心,步步紧跟Microsoft,比如我们公司就同时采用Java和.Net技术。

跟Microsoft这么紧,对于一家公司来说,究竟是好事还是坏事呢?

 

Posted by on 2004/02/10 in 未分类

5 Comments

Borland CTO Blake Stone & Chuck J gone to Microsoft

Borland的三個首席科學家:

Blake Stone(JBuilder)
Chuck Jazdzewski(Delphi/C++Builder)
Andreas Vogel(CORBA)

http://forum.vclxx.org/topic.asp?TOPIC_ID=28410&FORUM_ID=40&CAT_ID=7&Topic_Title=Borland+CTO+Blake+Stone+Resigns%3F%21&Forum_Title=%A7%F5%BA%FB%C5%AA%AA%CC%B1M%B0%CF

 

Posted by on 2004/02/08 in 未分类

3 Comments

MacroMedia公司的Flex和其开发工具Brady

Flex,MacroMedia公司推出的一套建立Rich Internet Application的东东,eric.canty介绍过。现在MacroMedia公司正在做一个专门用来写Flex的专用编辑器Brady,现在都在beta阶段。Flex的特征:

1、Flex很类似Asp.Net,比如:
<mx咧嘴笑脸
<mx:DataGrid widthFlex=“1”></mx:DataGrid>
<mx:Link click=“geturl(‘http://blog.joycode.com’, ‘_blank’)” label=“博客堂”></mx:Link>
<mx:WebService wsdl=“…”></mx:WebService>

用来输出一个DataGrid、一个指向博客堂的链接,并提供了一个WebService。这种标签,MacroMedia命名为MXML(Macromedia Flex Markup Language)

2、但是Flex的输出表现力比Asp.Net要丰富得多得多得多,为什么?因为Asp.Net输出的内容最后还是得是能让IE理解的html和js,但是Flex的客户端可是嵌在IE里面的Flash,嘿嘿,表现力如何,可想而知了吧?所以,MacroMedia能毫不惭愧的说,Flex可以建立“Rich Internet Application”,而且适合于“Multi-Step Processes”、“Client-Side Processing”,已经不限于一般的WebForms了,而是更像是Longhorn那样的集成了WebApp和WinApp方式的程序模式。

3、Flex的文件结构包括:
    纯文本的.mxml文件,就像是.aspx文件那样,描述了UI;
    .as文件,类似于.ascx文件,是用ActionScript写的控件,但是是无界面的;
    .css,样式表文件。

4、虽然看起来真的很像Asp.Net,但,Flex服务器必须J2EE/Serlet Container的支持,就是说,需要一个Java App Server来跑,而.Net,属于“Future Release”…

5、虽然MacroMedia公司正在制作一个专门写Flex的工具Brady,但是也在制作一个Eclipse的Flex插件。当然mxml的纯文本特性让你可以用记事本直接写。

Flex相关链接:
Flex官方站点
Christophe’s Blog
An Overview of MXML

 

Posted by on 2004/02/05 in 未分类

4 Comments

Whitehorse视频演示和WilsonORMapper

1、Whitehorse是Microsoft要随Whidbey推出的一个用来构建SOA应用的框架,在Whidbey里面,可以通过图形的方式,直接设计出一个SOA系统来,非常Cool。视频介绍:

The Whidbey Chronicles: Whitehorse

2、WhilsonORMapper是Paul Whilson写的一个在语法和用法上非常非常类似.Net Framework 2.0中的ObjectSpaces的ORM工具,而且支持Access、Oracle和其他符合T-Sql标准语法的数据库,基于.Net Framework 1.1。

Announcing the WilsonORMapper

 

Posted by on 2004/02/02 in 未分类

6 Comments

ASP.NET 2.0 中的SqlCacheDependency特性,and 明天开始上班啦!

ASP.NET中的Page Cache是个很有用的东东,只要简单的在页面上方加上一个OutputCache标签,就可以让页面在制定的Duration内直接把自动保存在缓存中的页面内容输出,而不需要让ASP.NET引擎再次执行页面代码,当然,节省这点执行时间并不是最主要的理由,主要理由是如果页面内容是从数据库中取出,那么就可以省去连接数据库、取数据的步骤,这个好处可大了。

 

PageCache有点小小的问题,比如,很多ASP.NET论坛的首页就用了PageCache,所以在一个版里面贴出的最新的帖子并不会马上反映到首页上,而是需要等上一段时间。虽然有点无可奈何,但在某些场合(比如易趣用来显示物品拍卖状态的页面),这种延迟是不允许的。

 

也即是说,ASP.NET里面的Cache并不能自动根据数据库中相应数据发生了变化,而使相应的Cache过期,ASP.NET 2.0中新增的SqlCacheDependency特性使这成为了可能。(当然,只要我们明白了ASP.NET 2.0中的大致实现方式,我们可以基于ASP.NET 1.0把这个特点实现出来,后面我总结了相应的方法。)

 

要在ASP.NET 2.0中应用SqlCacheDependency特性,步骤如下(基于大家手里的Whidbey PDC版本):

 

1、  使数据库支持SqlCacheDependency

 

.Net Framework 1.2的安装目录下(通常是WINDOWS\Microsoft.NET\Framework\v1.2.30703),有一个aspnet_regsqlcache.exe,这个命令行工具让我们的SqlServer 7.0或者SqlServer 2000能支持SqlCacheDependency特性,

首先:“aspnet_regsqlcache –S 服务器名称 –U 登陆ID –P 密码 –d 数据库名称 –ed”,这个命令使指定数据库支持SqlCacheDependency

 

然后我们再加入要追踪的数据表:“aspnet_regsqlcache –S 服务器名称 –U 登陆ID –P 密码 –d 数据库名称 –t 要追踪的数据表的名称 –et”,这个命令使指定的Table支持SqlCacheDependency

 

它在幕后做了什么事情呢?

 

首先,它在指定的数据库中新建了一个Table,叫做“AspNet_SqlCacheTablesForChangeNotification”,这个表有三个字段,“tableName”记录要追踪的数据表的名称,“notificationCreated”记录开始追踪的时间,“changeId”是一个int类型的字段,每当追踪的数据表的数据发生变化时,这个字段的值就加1

 

它还会在指定的数据库中增加几个存储过程,用来让ASP.NET引擎查询追踪的数据表的情况。

 

然后,它会给我们要追踪的Table加上几个Trigger,分别对应到InsertUpdateDelete操作,这几个Trigger的语句非常简单,就是把“AspNet_SqlCacheTablesForChangeNotification”表中对应“tableName”字段为这个追踪的表的名称的记录的“changeId”字段加上一个1

 

ASP.NET引擎通过执行它加上的存储过程“AspNet_SqlCachePollingStoredProcedure”,这个存储过程直接返回“AspNet_SqlCacheTablesForChangeNotification”表的内容,让ASP.NET引擎知道哪个表的数据发生的变化。默认每500毫秒执行这个存储过程一次,不过可以在web.config里面修改这个间隔时间,我的经验是这个查询操作也是很耗资源的,呵呵。

 

2、  web.config配置

 

web.config里面的配置再简单不过了

 

<configuration>

       <!– 加上合适的数据库连接字符串 –>

       <connectionStrings>

              <add name=”SqlServerConnectionString”

              connectionString=”server=sqlserver1;uid=sa;pwd=

password;database=PortalDB ” />

       </connectionStrings>

       <system.web>

              <!– 配置Cache一段,使之支持SqlCacheDependency –>

              <cache>

                     <sqlCacheDependency enabled=”true” pollTime=”500″>

                            <databases>

                                   <add name=” PortalDB ”

                                           connectionStringName=” SqlServerConnectionString ” />

                            </databases>

                     </sqlCacheDependency>

              </cache>

       </system.web>

</configuration>

 

3、  在页面上的outputCache标签中指定SqlCacheDependency特性:

 

<%@ outputcache duration=”9999″ varybyparam=”None” sqldependency=”PortalDB:追踪的数据表名称” %>

 

只要在这个追踪的Table上执行了InsertUpdateDelete操作,数据表上的Trigger就会将数据库中“AspNet_SqlCacheTablesForChangeNotification”表的相应记录的相应“changId”字段值修改,然后ASP.NET引擎就会通过获取新的值来得知追踪的Table的内容发生了变化,自动使这个页面的cache失效。

 

后话1What about Yukon

 

从上面可以知道,SqlServer并没有内置自动追踪数据表的数据变化,然后通知ASP.NET引擎的功能(这是肯定的,SqlServer都出来N久了),所以ASP.NET 2.0的开发组人为的加上了定制的TableTriggerStoredProcedure等等来实现数据更改追踪。而Yukon已经不必这么麻烦了,Yukon内置了一个Notification Delivery Service,这个服务会通过WebServer80端口直接通知一个IIS内置的监听器,然后这个监听器再通知ASP.NET

 

而且大家可以注意到,上面描述的那种追踪方式只能追踪到表一级的数据更改,即ASP.NET引擎最后只能得知某个表的数据发生了更改,而到底是哪一条记录发生了更改,是追踪不到的,而YukonNotification Delivery Service可以实现记录一级的追踪。

 

后话2、可以在现在的ASP.NET上实现吗?

 

当然可以,我们先按照上面讲的第一个步骤(或者自己定义一套规则来实现在数据库中对Table数据变化的追踪),依照葫芦画瓢来自己添加上这些TableTrigger什么的。

 

ASP.NETPageCache有一个VaryByCustom属性的,这个属性可以实现让我们自己定义“缓存过期”的规则(确切的说,其实它是可以让我们自定义缓存页的版本,但间接可以实现自定义的缓存“过期”啦,呵呵),只要我们在global.asa中重写HttpApplication.GetVaryByCustomString()方法,这个方法根据输入的参数字符串,比如“CheckDBTable=Users”,查询数据库中那个“AspNet_SqlCacheTablesForChangeNotification”(或者你自己定义的某个追踪记录表),直接让这个GetVaryByCustomString()方法返回“changeId”字段的值即可。VaryByCustom的用法MSDN文档上有详细说明。

 

后话3GolfClubShack示范程序

在博客堂前面的某篇文章里面,提供了一个基于ASP.NET 2.0GolfClubShack站点的示范程序,是非常好的东东,在那个里面可以看到包括SqlCacheDependency在内的众多ASP.NET 2.0的特性的体现。现在网上完整的ASP.NET 2.0的示范程序不多,听说MS内部已经把IBuySpy移植到ASP.NET 2.0上面了,不知详情如何。而MS还在alpha阶段的AspNetForums 2.0还是基于.Net Framework 1.1的(我以前一直是以为是基于最新的ASP.NET 2.0的,安装了好半天,晕)。

 

后话4、明天开始上班啦!!!

 

春节假期终于完了,这个春节没有回家,留在深圳过年。今年深圳春节真冷啊,呜呜家里又没有宽带,只能拨号上网,痛苦不堪。从明天开始,又要开始工作了,不知道要几天才能恢复春节颠倒过来的生物钟。悲伤的脸

 

Posted by on 2004/02/02 in 未分类

5 Comments