<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>培训演讲 - 老赵点滴 - 追求编程之美</title>
    <link>http://blog.zhaojie.me/speech/</link>
    <description>先做人，再做技术人员，最后做程序员。打造国内最好的.NET技术博客。</description>
    <language>zh-cn</language>
    <managingEditor>jeffz@live.com (老赵)</managingEditor>
    <webMaster>jeffz@live.com (老赵)</webMaster>
    <pubDate>Wed, 25 Nov 2009 02:12:00 GMT</pubDate>
    <lastBuildDate>Wed, 25 Nov 2009 02:12:00 GMT</lastBuildDate>
    <ttl>60</ttl>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/news/">新闻信息</category>
      <category domain="http://blog.zhaojie.me/dotnet/">.Net框架</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <title>第三届nBazaar技术交流会开始报名</title>
      <link>http://blog.zhaojie.me/2010/12/3rd-nbazaar-meeting-sign-up.html</link>
      <guid>http://blog.zhaojie.me/2010/12/3rd-nbazaar-meeting-sign-up.html</guid>
      <description>&lt;p&gt;为了错开年底密集的技术会议，第三届&lt;a href="http://nbazaar.org/"&gt;nBazaar技术交流会&lt;/a&gt;（即前“盛大创新院赞助的.NET技术交流会”）将于2011年1月15日举行。第三届的交流会将继续以往四场高质量的演讲，这也是确定nBazaar名称之后的第一次活动，希望nBazaar能够真正&lt;a href="http://blog.zhaojie.me/2010/10/status-of-iron-languages-and-nbazaar.html"&gt;成为“集市”般热闹的社区活动&lt;/a&gt;。从现在开始，nBazaar技术沙龙的相关信息将逐渐集中至独立域名中，欢迎关注。&lt;/p&gt;

&lt;h1&gt;志愿者招募&lt;/h1&gt;

&lt;p&gt;为了留下每次的活动资料，我们希望为每场演讲进行拍摄。如果您有这方面的志愿请发邮件至&lt;a href="mailto:jeffz@nbazaar.org"&gt;jeffz@nbazaar.org&lt;/a&gt;与我联系。&lt;/p&gt;

&lt;h1&gt;时间及议程安排&lt;/h1&gt;

&lt;p&gt;本次交流会首次向社区征集议题，我们在回复中挑选了三场：面向iPad平台的网站架构、面向企业应用语言ABAP、基于.NET的轻量级分布式框架，以及在创新院内部分享会上倍受好评的“分布式版本管理”话题。四位演讲者都是业界一线技术高手，四场话题都是他们的实战心得，希望能够让您满意。&lt;/p&gt;

&lt;table style="text-align: center" border="1" cellspacing="0" cellpadding="5"&gt;&lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;时间&lt;/th&gt;

      &lt;th&gt;议程&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;12:30 ~ 13:00&lt;/td&gt;

      &lt;td&gt;签到&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;13:00 ~ 14:00&lt;/td&gt;

      &lt;td&gt;针对iPad平台的高性能网站架构&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;14:00 ~ 14:10&lt;/td&gt;

      &lt;td&gt;短休&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;14:10 ~ 15:10&lt;/td&gt;

      &lt;td&gt;分布式版本管理&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;15:10 ~ 15:40&lt;/td&gt;

      &lt;td&gt;茶歇&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;15:40 ~ 16:40&lt;/td&gt;

      &lt;td&gt;企业开发领域的语言特性&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;16:40 ~ 16:50&lt;/td&gt;

      &lt;td&gt;短休&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;16:50 ~ 17: 50&lt;/td&gt;

      &lt;td&gt;使用.NET构建轻量级分布式框架&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;h1&gt;演讲内容&lt;/h1&gt;

&lt;p&gt;以下为是四场演讲的信息：&lt;/p&gt;
&lt;a href="http://nbazaar.org/_media/%E8%AE%B2%E5%B8%88/mashijie-450x600.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://nbazaar.org/_media/%E8%AE%B2%E5%B8%88/mashijie-450x600.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;h2&gt;针对iPad平台的高性能网站架构&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;马士杰，EF英孚教育，Tech Leader。关注高性能网站架构和前沿技术在线教育领域的应用创新。曾经重点关注的技术领域包括ORM，AOP和SOA。近期的关注重点是针对移动平台的高性能网站架构。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;iPad的横空出世，几乎使得2010年成为全球IT领域的平板电脑之年。摩根士丹利发布的《移动互联网报告》认为移动互联网周期是50年来的第5个新技术周期，以Apple的iPad平板电脑和手机上网为代表的移动互联网的增长势头将超过电脑上网。本演讲的目的是和听众分享本人近一年在针对iPad平台的高性能网站架构方面的一些经验，包括兼容不同平台桌面和移动浏览器的表现层设计模式，针对iPad Mobile Safari浏览器的Web页面性能优化和iPad本地程序和在线网站的无缝整合等。&lt;/p&gt;
&lt;a href="http://nbazaar.org/_media/%E8%AE%B2%E5%B8%88/lijun-400x600.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://nbazaar.org/_media/%E8%AE%B2%E5%B8%88/lijun-400x600.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;h2&gt;分布式版本管理&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;李骏，中国第一批J2EE开发者，大中华区第一个中间件和SOA领域的Oracle ACE Director。有着10年以上企业级应用系统咨询/设计/实施以及软件公司管理经验的行业老兵，因为喜欢创造能影响人们日常生活的东西，所以来到盛大创新院，梦想能找到“正确的把软件作成业务”的方法。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;演讲：&lt;/strong&gt;源代码和其它软件工程产物的版本管理，是每个开发者每天都会碰到的问题，经过数十年的发展，CVS、SVN等上一代版本管理系统中的一些问题，催生着新的技术及其应用模式。在过去几年中以Git和Mercurial为代表的分布式版本管理工具有了较大的发展，已经基本具备了普及应用的基础。这里将介绍分布式版本管理欲解决的问题及其关键价值，并以Mercurial为例介绍具体使用的方法和流程。&lt;/p&gt;
&lt;a href="http://nbazaar.org/_media/%E8%AE%B2%E5%B8%88/shijianzhuo-576x432.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://nbazaar.org/_media/%E8%AE%B2%E5%B8%88/shijianzhuo-576x432.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;h2&gt;企业开发领域的语言特性&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;师建茁（Amos Shi），GRC软件工程师，SAP Labs China。中学时代在 286、486 系统上学会了 12个DOS内部命令，若干外部命令；使用QBasic开始程序生涯，半夜起来在图画本上设计流程图。后来跟着谭浩强的C语言课本和Borland的TC 2.0进入 Windows CMD 时代，后来有了 C++、Delphi、Python、.NET、Java，排名不分先后，意识到语言并非那么重要； 直到有一天，遇到了 ABAP，以及 Web Dynpro，意识到，对于优秀的软件，高级语言特性还是有所帮助的。2007年加入SAP Labs China，从事GRC软件产品的研发。日常工作涉及GRC 的多个部分。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;演讲：&lt;/strong&gt;作为一个程序员，在加入SAP之前用过一些各种各样流行的技术来写软件产品，到了Labs之后开始使用一种不广为所知的ABAP语言开发GRC软件产品。在学习和使用ABAP语言的过程中，经常会有类似“啊！对了，以前我就想过应该是这样的”、“是的！就是应该这样集成！”、“本来嘛，已经有足够的信息在那里了，她就是应该自动生成，一行代码都不应该写！”这样的感叹，对很多特性总是有相见恨晚的感觉。回想到以前的产品开发中遇到的种种问题，觉得如果这些特性已经有了的话，可以大大提高效率，降低错误。后来逐渐接触到其后面的NetWeaver平台，和Web Dynpro之后，更觉得这一整套东西为企业应用进行了精心设计。又回想起了“程序员如何在非洲捕捉大象？”这个经典笑话，哈哈哈哈。如果你要开发企业应用的话，确实有很多东西可以从这里借鉴，希望对你能有所裨益。&lt;/p&gt;
&lt;a href="http://nbazaar.org/_media/%E8%AE%B2%E5%B8%88/qiaojie-400x622.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://nbazaar.org/_media/%E8%AE%B2%E5%B8%88/qiaojie-400x622.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;h2&gt;使用.NET构建轻量级分布式框架&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;乔捷，瓦格纳比罗舞台系统公司，技术主管。热爱技术，对多种技术领域都有涉猎，目前主要从事剧院舞台控制系统和虚拟舞台系统的设计和研发工作，主要涉及到分布式系统、实时控制系统、虚拟现实系统、3D实时/离线渲染等技术领域。主要的编程语言为C++/C#/JavaScript，喜爱.NET技术，最近比较关注分布式计算和并行计算技术，并已在实际的项目应用中取得了初步的成功。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;演讲：&lt;/strong&gt;分布式系统的设计和构建是一项复杂多变而很具有挑战性的任务，设计的目标包括服务的伸缩性、可靠性、安全性、实时性、性能、容错等多个方面，同时还可能需要面对各种异构平台的集成和整合。目前市面上已有的分布式框架包括.NET提供的Remoting和WCF，都不能很好的满足上述所有的这些需求。因此，打造一套轻量级的、高度可定制的、符合自身项目需求的分布式框架变得很有现实意义。本演讲就来讨论如何应用.NET技术构建这样一套轻量级的分布式框架。&lt;/p&gt;

&lt;h1&gt;地点&lt;/h1&gt;

&lt;p&gt;本次交流会举办地为&lt;strong style="color: red"&gt;上海市浦东新区碧波路888号畅星大厦&lt;/strong&gt;（地铁二号线张江高科站下，步行10分钟可达）3楼会议厅，地图如下：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-map.png"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-map.png" width="400" /&gt;&lt;/a&gt; 

&lt;p&gt;鸟瞰图：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-hybrid.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-hybrid.jpg" width="400" /&gt;&lt;/a&gt; 

&lt;p&gt;畅星大厦外观：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-building.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-building.jpg" width="400" /&gt;&lt;/a&gt; 

&lt;p&gt;会场实景照片：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-room.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-room.jpg" width="400" /&gt;&lt;/a&gt; 

&lt;p&gt;会场容量可以容纳超过200人，希望到时候不会显得太过空旷。:)&lt;/p&gt;

&lt;h1&gt;报名信息&lt;/h1&gt;
&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/sign-up-now.jpg" /&gt; 

&lt;p&gt;本次交流会&lt;a href="http://diaochapai.com/survey518744"&gt;现已开始报名，请填写报名表&lt;/a&gt;。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2010/12/3rd-nbazaar-meeting-sign-up.html#comments</comments>
      <pubDate>Mon, 20 Dec 2010 16:45:46 GMT</pubDate>
      <lastBuildDate>Mon, 20 Dec 2010 16:45:46 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/dotnet/">.Net框架</category>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <category domain="http://blog.zhaojie.me/parallel/">并行处理</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>演出季上“异步编程模型的演变”幻灯片</title>
      <link>http://blog.zhaojie.me/2010/12/event-season-async-evolution-slides.html</link>
      <guid>http://blog.zhaojie.me/2010/12/event-season-async-evolution-slides.html</guid>
      <description>&lt;p&gt;&lt;a href="http://blog.zhaojie.me/2010/11/the-coming-talks-and-jscex.html"&gt;演出季&lt;/a&gt;终于过去了，现在就来做一个收尾吧。这次的主题是“异步编程模型的演变”，主要回顾了微软在.NET平台上异步编程上的进化：基于回调，基于迭代生成器，基于类库，基于语言。不过这样的编程模型其实并非微软独有，而是一些运用比较广泛的异步编程方式，因此在SD 2.0大会上我其实完全用JavaScript进行演示。从结果上来看，除了最早的TUP，其他两场演讲（&lt;a href="http://www.net-china.org/"&gt;.NET技术大会&lt;/a&gt;和&lt;a href="http://sd2china.csdn.net/"&gt;SD 2.0&lt;/a&gt;）的反响都不错。&lt;/p&gt;

&lt;p&gt;严格说来，这场演讲在过去一个月中讲了四次，其中第一次是在CSDN举办的&lt;a href="http://tup.csdn.net/"&gt;TUP&lt;/a&gt;活动上。您可能注意到“异步编程”是我后半年关注的重点，例如在&lt;a href="http://nbazaar.org"&gt;创新院赞助的nBazaar交流会&lt;/a&gt;上我分享的话题都是关于异步编程的，这次要在1小时内覆盖之前两场演讲，自然信息量很大。于是在TUP活动上的演讲便不太理想，因为内容实在太多，结果绝大部分内容几乎都是匆匆扫过。不幸中的万幸，这次演讲的幻灯片倒成了一个“阅读材料”（&lt;a href="http://files.zhaojie.me/slides/async-evolution/async-evolution-full.pdf"&gt;下载&lt;/a&gt;）。&lt;/p&gt;

&lt;div style="width: 425px" id="__ss_6103768"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="The Evolution of Async-Programming on .NET Platform (TUP, Full)" href="http://www.slideshare.net/jeffz/async-evolutionfull"&gt;The Evolution of Async-Programming on .NET Platform (TUP, Full)&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse6103768" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=async-evolution-full-101210113950-phpapp02&amp;stripped_title=async-evolutionfull&amp;userName=jeffz" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse6103768" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=async-evolution-full-101210113950-phpapp02&amp;stripped_title=async-evolutionfull&amp;userName=jeffz" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

  &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;我将异步编程模型的演变过程分为四个部分：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;基于回调：&lt;/strong&gt;这是最传统的异步编程模型，“回调”是“异步”的天然属性，例如.NET里的Begin/End异步模型或是基于事件的异步模型。在前端开发中，XMLHttpRequest或是DOM事件，事实上都是基于事件的异步编程模型。这种编程模型破坏了代码的局部性，写起来非常麻烦，更别说是异步操作的组合、异常处理、取消等操作了。 &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;基于迭代生成器：&lt;/strong&gt;我把这个单独提出来说，是因为迭代生成器几乎已经成为现代语言的标配了，&lt;a href="http://blog.zhaojie.me/2010/11/asynciterator-the-asyncenumerator-in-javascript.html"&gt;在JavaScript 1.7里也有相应的特性&lt;/a&gt;——自然，可怜的Java语言是不曾提供支持的。有了迭代生成器，我们就可以在发起异步操作的时候，将控制权交给外部，由外部来决定代码什么时候继续执行，这就在一定程度上保持了代码的局部性。 &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;基于类库：&lt;/strong&gt;由于异步编程十分困难，有时候语言层面的支持有限，聪明的程序员们想尽了各种办法来简化异步编程。其中主要的办法就是总结出一种异步模型，并围绕这种模型提供一种异步类库。其中的典型便是&lt;a href="http://blog.zhaojie.me/2010/09/async-programming-and-reactive-framework.html"&gt;“推集合模型”以及“响应式编程”&lt;/a&gt;。只可惜想要基于死板的Java语言开发出好用的异步类库也总是使不出劲，与它形成鲜明对比的便是Scala语言，基于同样的平台，生产力却天下地下。 &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;基于语言：&lt;/strong&gt;有时候，语言设计者会直接在语言层面上简化异步编程的问题，其中的典型便是Erlang语言以及&lt;a href="http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-1.html"&gt;下个版本的C#&lt;/a&gt;。不过这里我主要讨论的是&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-all-slides.html"&gt;F#语言里的异步工作流&lt;/a&gt;。不过严格来说，F#的异步工作流是个类库，它使用了F#的“计算表达式”特性，这才是个语言特性。我参考了F#的异步工作流，开发Jscex（一个JavaScript至JavaScript编译器）以及Jscex.Async组件（基于Jscex的异步类库）。 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;由于TUP上的失策，我为一个星期后的.NET技术大会上重新组织了内容，减少了“代码赏析”的数量，增加了演示用的示例。我的演示是在Mac OS上基于Mono 2.8和MonoMac编写的带有Mac OS原生界面的应用程序，以此体现异步编程对于各平台上UI编程的重要性。有了TUP的经验，这次的演讲反响不错，我也被评为这次会议Top 5讲师。幻灯片如下（&lt;a href="http://files.zhaojie.me/slides/async-evolution/async-evolution-netchina.pdf"&gt;下载&lt;/a&gt;）：&lt;/p&gt;

&lt;div style="width: 425px" id="__ss_6103757"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="The Evolution of Async-Programming on .NET Platform (.Net China, C#)" href="http://www.slideshare.net/jeffz/async-evolutiondotnetconf"&gt;The Evolution of Async-Programming on .NET Platform (.Net China, C#)&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse6103757" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=async-evolution-dotnetconf-101210113849-phpapp02&amp;stripped_title=async-evolutiondotnetconf&amp;userName=jeffz" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse6103757" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=async-evolution-dotnetconf-101210113849-phpapp02&amp;stripped_title=async-evolutiondotnetconf&amp;userName=jeffz" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

  &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;我为SD 2.0大会使用JavaScript重新编写了所有的示例，并在创新院内部的分享交流会上进行了试讲。试讲的反馈是“干货太多”，这使得我重新提炼了一下示例。不过在大会的前一天，我还是补充了一个基于node.js开发的最简单的静态文件服务器，以此表示Jscex并非只能在浏览器里使用。幻灯片如下（&lt;a href="http://files.zhaojie.me/slides/async-evolution/async-evolution-sd2.pdf"&gt;下载&lt;/a&gt;）：&lt;/p&gt;

&lt;div style="width: 425px" id="__ss_6103746"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="The Evolution of Async-Programming (SD 2.0, JavaScript)" href="http://www.slideshare.net/jeffz/async-evolutionsd2"&gt;The Evolution of Async-Programming (SD 2.0, JavaScript)&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse6103746" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=async-evolution-sd2-101210113722-phpapp01&amp;stripped_title=async-evolutionsd2&amp;userName=jeffz" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse6103746" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=async-evolution-sd2-101210113722-phpapp01&amp;stripped_title=async-evolutionsd2&amp;userName=jeffz" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

  &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;有趣的是，在我之前的一场演讲接近尾声的时候，会场里大约只坐了一半人，因此我一开始还担心没人来听。幸运的是在演讲开始时位子已经基本坐满了，后来还有一些人站在一旁。演讲之后的反馈很少，不过都是正面的。会后我还和业界的一些JavaScript大牛交流了一下Jscex，这也是我接下来一段时间的一个工作重点，希望能够做大做好。&lt;/p&gt;

&lt;p&gt;这个演出季已经过去了，接下来又到了nBazaar交流会的时间了。第三届交流会将在1月15日举行，具体消息将在不久之后公开，敬请关注。我们又准备了四场有价值的演讲，一定能让您满意。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2010/12/event-season-async-evolution-slides.html#comments</comments>
      <pubDate>Sat, 11 Dec 2010 14:01:05 GMT</pubDate>
      <lastBuildDate>Mon, 13 Dec 2010 07:16:55 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/parallel/">并行处理</category>
      <category domain="http://blog.zhaojie.me/news/">新闻信息</category>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <title>关于即将到来的“演出季”以及Jscex类库</title>
      <link>http://blog.zhaojie.me/2010/11/the-coming-talks-and-jscex.html</link>
      <guid>http://blog.zhaojie.me/2010/11/the-coming-talks-and-jscex.html</guid>
      <description>&lt;p&gt;又到了一年一度的“演出季”，接下来将是各式会议扑面而来的一个月。作为“与会爱好者”我自然也进入了繁忙的准备工作。接下来我将在&lt;a href="http://tup.csdn.net/"&gt;TUP&lt;/a&gt;（11月27日）、&lt;a href="http://www.net-china.org/"&gt;2010年第二届.NET技术大会&lt;/a&gt;（12月4~5日）以及&lt;a href="http://sd2china.csdn.net/"&gt;CSDN软件开发2.0大会&lt;/a&gt;（12月9~10日）上与大家分享四场演讲。不过除了一场是关于Windows并发编程的基础以外，其余三场的话题都是围绕“微软在异步编程方面的演变”。在这场演讲中，我还会引入一个与该话题密切相关的JavaScript类库：Jscex。&lt;/p&gt;

&lt;p&gt;并发编程已经成为我们无法回避的一点，但是传统的编程语言在并发、异步等方面的支持非常有限，除了一些面向并发的编程语言（如Erlang），我们只能使用回调的方式，这样代码则被拆得支离破碎。如今的一些新语言，如F#，Scala，Go以及未来的C#都会在这方面有直接的支持。就我个人而言，用过了这些语言之后，就几乎无法回头，因为我实在无法体会到编程的快感。&lt;/p&gt;

&lt;p&gt;如今微软的.NET平台在异步编程领域已经开始发力，从最初十分原始的Begin/End的异步模型和基于事件的异步模型，到后来&lt;a href="http://blog.zhaojie.me/2010/03/async-and-parallel-design-patterns-in-fsharp-1-parallelizing-cpu-and-io-computations.html"&gt;F#中的异步工作流&lt;/a&gt;，.NET 4.0中的&lt;a href="http://blog.zhaojie.me/2010/09/async-programming-and-reactive-framework.html"&gt;Observable及响应式框架&lt;/a&gt;，以及&lt;a href="http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-1.html"&gt;未来C#中将要出现的异步特性&lt;/a&gt;，.NET平台上涌现了各种与并发和异步编程的机制。未来几场演讲的主要话题，便是关于这些异步编程模型的演变。&lt;/p&gt;

&lt;p&gt;只可惜，在某些和异步密切相关的平台上，例如使用JavaScript的浏览器平台，开发人员还是不得不利用最传统的开发模型。响应式框架通过引入一个“推模型”改进了这一点，不过我最欣赏的异步编程支持还是F#上的异步工作流。首先，它是一套“类库”（基于F#中的计算表达式特性）；其次，它让异步编程变得像传统的顺序式开发那样简单。有天我突然意识到，JavaScript其实提供一个很强大的机制：它可以使用toString方法得到一个函数的原始代码，于是我们可以对此解析并生成新的代码，最后使用eval得到新的函数。通过这个手法，JavaScript语言几乎得到了无限的灵活性。&lt;/p&gt;

&lt;p&gt;于是在未来的演讲中，我将会展示一个JavaScript类库的原型：&lt;a href="https://github.com/JeffreyZhao/jscex"&gt;Jscex&lt;/a&gt;（目前还未提交任何代码）。Jscex是&lt;font color="#ff0000"&gt;J&lt;/font&gt;ava&lt;font color="#ff0000"&gt;S&lt;/font&gt;cript &lt;font color="#ff0000"&gt;C&lt;/font&gt;omputation &lt;font color="#ff0000"&gt;Ex&lt;/font&gt;pressions的缩写，即“JavaScript的计算表达式”。计算表达式的原理，便是将一段顺序式的代码，重新编译成另外一个表达式，它便是F#中异步工作流的基础。&lt;/p&gt;

&lt;p&gt;例如，它会将下面这段JavaScript函数：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;function &lt;/span&gt;(urlA, urlB) {
    &lt;span style="color: blue"&gt;var &lt;/span&gt;reqA = &lt;font color="#ff0000"&gt;$await&lt;/font&gt;(Jscex.Async.sendRequest(urlA, &lt;span style="color: maroon"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;));
    &lt;span style="color: blue"&gt;var &lt;/span&gt;lengthA = reqA.responseText.length;

    &lt;span style="color: blue"&gt;var &lt;/span&gt;reqB = &lt;font color="#ff0000"&gt;$await&lt;/font&gt;(Jscex.Async.sendRequest(urlB, &lt;span style="color: maroon"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;));
    &lt;span style="color: blue"&gt;var &lt;/span&gt;lengthB = reqB.responseText.length;

    &lt;span style="color: blue"&gt;return &lt;/span&gt;lengthA + lengthB;
}&lt;/pre&gt;

&lt;p&gt;编译成另一段代码：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;function&lt;/span&gt; (urlA, urlB) {
    &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Delay(&lt;span style="color: blue"&gt;function&lt;/span&gt;() {
        &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Bind(Jscex.Async.sendRequest(urlA, &lt;span style="color: maroon"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;), &lt;span style="color: blue"&gt;function&lt;/span&gt;(reqA) {
            &lt;span style="color: blue"&gt;var &lt;/span&gt;lengthA = reqA.responseText.length;
            &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Bind(Jscex.Async.sendRequest(urlB, &lt;span style="color: maroon"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;), &lt;span style="color: blue"&gt;function&lt;/span&gt;(reqB) {
                &lt;span style="color: blue"&gt;var &lt;/span&gt;lengthB = reqB.responseText.length;
                &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Return(lengthA + lengthB);
            });
        });
    });
};&lt;/pre&gt;

&lt;p&gt;对于$async这个构造器来说，$await便是一个bind函数，在此处则会形成一个回调。此外，Jscex也必须能够正确处理循环操作，例如这个&lt;a href="http://files.zhaojie.me/demos/jscex-prototype/clock.html"&gt;时钟示例&lt;/a&gt;（建议使用IE 9，Chrome或Firefox等支持canvas的浏览器观看）其实是这样实现的：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;drawClockAsync = eval(Jscex.compile(&lt;span style="color: maroon"&gt;&amp;quot;$async&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;function &lt;/span&gt;(interval) {
    &lt;span style="color: blue"&gt;while &lt;/span&gt;(&lt;span style="color: blue"&gt;true&lt;/span&gt;) {
        drawClock(&lt;span style="color: blue"&gt;new &lt;/span&gt;Date());
        &lt;font color="#ff0000"&gt;$await&lt;/font&gt;(Jscex.Async.sleep(interval));
    }
}));

Jscex.Async.start(drawClockAsync(1000));&lt;/pre&gt;

&lt;p&gt;对于时钟来说，我们往往会不断使用window.setTimeout来更新界面。不过有了Jscex，一切都变得“顺其自然”。我们只要写一个“死循环”，在需要“等待”的时候，直接$await一个sleep操作即可。这种看似“阻塞”的代码，其实最终会被重新编译成新的函数：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;function&lt;/span&gt;(interval) {
    &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Delay(&lt;span style="color: blue"&gt;function&lt;/span&gt;() {
        &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.While(
            &lt;span style="color: blue"&gt;function&lt;/span&gt;() { &lt;span style="color: blue"&gt;return true&lt;/span&gt;; },
            $async.Delay(&lt;span style="color: blue"&gt;function&lt;/span&gt;() {
                drawClock(&lt;span style="color: blue"&gt;new &lt;/span&gt;Date);
                &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Bind(Jscex.Async.sleep(interval), &lt;span style="color: blue"&gt;function&lt;/span&gt;() {
                    &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Return();
                });
            })
        );
    });
};&lt;/pre&gt;

&lt;p&gt;实际上，它们都是异步的。&lt;/p&gt;

&lt;p&gt;其实在浏览器上有太多的异步场景。例如一个AJAX请求，或者是一段动画效果。这里我还准备了&lt;a href="http://files.zhaojie.me/demos/jscex-prototype/animation.html"&gt;第二个示例&lt;/a&gt;，其中有一段移动元素的方法（将元素e在duration时间内从startPos移动至endPos）是这样编写的：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;moveAsync = eval(Jscex.compile(&lt;span style="color: maroon"&gt;&amp;quot;$async&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;function &lt;/span&gt;(e, startPos, endPos, duration) {
    e.style.left = startPos.x;
    e.style.top = startPos.y;

    &lt;span style="color: blue"&gt;var &lt;/span&gt;time = 0;
    &lt;span style="color: blue"&gt;while &lt;/span&gt;(time &amp;lt; duration) {
        &lt;font color="#ff0000"&gt;$await&lt;/font&gt;(Jscex.Async.sleep(50));
        time = time + 50;
        e.style.left = startPos.x + (endPos.x - startPos.x) * time / duration;
        e.style.top = startPos.y + (endPos.y - startPos.y) * time / duration;
    }
}));

&lt;span style="color: blue"&gt;var &lt;/span&gt;moveBox = document.getElementById(&lt;span style="color: maroon"&gt;&amp;quot;moveBox&amp;quot;&lt;/span&gt;);
Jscex.Async.start(moveAsync(moveBox, { x: 0, y: 0 }, { x: 300, y: 0 }, 1000));&lt;/pre&gt;

&lt;p&gt;没有回调，只有最普通的顺序式编程。甚至我们还可以将moveAsync方法组合到另一个方法中去：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;moveSquareAsync = eval(Jscex.compile(&lt;span style="color: maroon"&gt;&amp;quot;$async&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;function &lt;/span&gt;(e) {
    &lt;font color="#ff0000"&gt;$await&lt;/font&gt;(moveAsync(e, { x: 100, y: 100 }, { x: 400, y: 100 }, 1000));
    &lt;font color="#ff0000"&gt;$await&lt;/font&gt;(moveAsync(e, { x: 400, y: 100 }, { x: 400, y: 400 }, 1000));
    &lt;font color="#ff0000"&gt;$await&lt;/font&gt;(moveAsync(e, { x: 400, y: 400 }, { x: 100, y: 400 }, 1000));
    &lt;font color="#ff0000"&gt;$await&lt;/font&gt;(moveAsync(e, { x: 100, y: 400 }, { x: 100, y: 100 }, 1000));
}));

&lt;span style="color: blue"&gt;var &lt;/span&gt;moveSquareBox = document.getElementById(&lt;span style="color: maroon"&gt;&amp;quot;moveSquareBox&amp;quot;&lt;/span&gt;);
Jscex.Async.start(moveSquareAsync(moveSquareBox));&lt;/pre&gt;

&lt;p&gt;如何让一个元素沿方形移动？“连续执行”四遍moveAsync方法即可。当然，moveSquareAsync方法最终还是由“回调”组成的：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;function &lt;/span&gt;(e) {
    &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Delay(&lt;span style="color: blue"&gt;function &lt;/span&gt;() {
        &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Bind(moveAsync(e, {...}, {...}, 1000), &lt;span style="color: blue"&gt;function &lt;/span&gt;() {
            &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Bind(moveAsync(e, {...}, {...}, 1000), &lt;span style="color: blue"&gt;function &lt;/span&gt;() {
                &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Bind(moveAsync(e, {...}, {...}, 1000), &lt;span style="color: blue"&gt;function &lt;/span&gt;() {
                    &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Bind(moveAsync(e, {...}, {...}, 1000), &lt;span style="color: blue"&gt;function &lt;/span&gt;() {
                        &lt;span style="color: blue"&gt;return &lt;/span&gt;$async.Return();
                    });
                });
            });
        });
    });
};&lt;/pre&gt;

&lt;p&gt;我以前在许多地方说过，目前浏览器上的开发效率已经受限于JavaScript的语言特性了。不过，正如我刚才所提到的那样，JavaScript语言的灵活性几乎是无穷的。我认为，Jscex会是一个突破。当然，现在您看到的演示只不过是个原型，如果要提供一个完整的解决方案还有太多的路要走。例如现在的Jscex还不支持for，if，try...catch等常见语言特性，代码也丑陋得很。与此对应的Jscex.Async也只是个初步的模型，且只有寥寥无几的辅助方法。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2010/11/the-coming-talks-and-jscex.html#comments</comments>
      <pubDate>Mon, 22 Nov 2010 12:30:57 GMT</pubDate>
      <lastBuildDate>Mon, 29 Nov 2010 14:28:28 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <title>PDC 2010：C#与Visual Basic的未来（下）</title>
      <link>http://blog.zhaojie.me/2010/11/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-3.html</link>
      <guid>http://blog.zhaojie.me/2010/11/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-3.html</guid>
      <description>&lt;p&gt;前几天在PDC 2010会议上Anders Hejlsberg发表了一场名为“The Future of C# and Visual Basic”的演说，谈论了未来C#和VB中最为重要的两个特性：“异步（Async）”及“编译器即服务（Compiler as a Service）”。我现在对这场演讲进行总结，但不会像上次《&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html"&gt;编程语言的发展趋势及未来方向&lt;/a&gt;》那样逐句翻译，而是以Anders的角度使用一种简捷合适的方式表述其完整内容。上一篇Anders对async和await的的实现及效果作更进一步的解释，本篇则是对“编译器即服务”做了些最表面的尝试。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/36.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/36-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;你们某些人可能参加了PDC 2008，那时我谈到了“编译器即服务（Compier as a Service）”，也作了点演示。现在我来演示一点这方面的进展。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/37-1.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/37-1-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;编译器即服务的关键，在于目前的编译器是个黑盒，输入源文件，输出.NET程序集。至于它是如何工作的，你不能参与进去。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/37-2.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/37-2-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;为了打造更灵活工作过程，我们把编译器展开，把其中的信息展示出来并加以利用，这样就能做到实现元编程、REPL，把C#和VB作为内嵌的DSL，或是根据语言对象模型实现重构，代码生成器等语义相关的工作。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/38.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/38-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;我最后的示例便是些这方面的展示。（译注：这个示例展示的代码非常复杂，但并不重要，它的主要目的便是根据编译器提供的语言对象模型，判断其中的if/else逻辑，并在Visual Studio中显示出轮廓（就像方法的折叠功能一样）。有趣的是，这个演示失败了……） &lt;/p&gt;

&lt;p&gt;这里的语言对象模型，就是C#和VB编译器内部所使用的，包含了完整的语义，可用于理解代码的工作目的。有了这些数据，我们就能作一些非常有趣的事情了。例如，我们有两个语言，它们的语法非常接近，不是吗？那么我们理解了其中一个语言，把它转化成另外一个应该也不太困难。 &lt;/p&gt;

&lt;p&gt;这里还有一个简单的C#到VB的代码转换器（译注：又一个演示），你可以把C#代码复制到剪贴板里，然后粘贴成VB代码。在实现时，只不过遍历了C#语法树，生成另一个对象模型。当然，这个程序也不是太简单，实际上还是要有几千行代码的，这里只是个最简单的实现。那么我这里来试着把那段没法工作的代码，粘贴到VB文件中……砰，这就出现了功能一致的VB代码（掌声）。这就是利用这种技术可以做到的事情。我们也已经发布了CTP版本的编译器，也包含了这些示例。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/39.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/39-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;我答应过，这里是Visual Studio Async CTP的下载地址，它基于Visual Studio 2010安装。其中包含了所有我演示过的示例，有C#也有VB。此外还有一些相关的讲座，例如LINQ，我也会参加下午的语言话题讨论。接下来还有点时间，可以回答一两个问题。 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;提问：&lt;/strong&gt;除了这里您提到的这些，C#和VB还会包含其他功能吗？ &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anders：&lt;/strong&gt;呃，现在说起C#和VB最终是什么样的为时尚早，不过的确还有些其他的功能。 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;提问：&lt;/strong&gt;我想知道您对于数据并发和数据共享的看法。 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anders：&lt;/strong&gt;并发有许多令人头痛的地方，你说的就是其中之一。我们在内部有些研究是关于不可变性，状态隔离，纯函数式编程，还有其他一些编译器方面的工作。现在还没有准备好公开，不过我们正在取得些不错的进展。我相信接下来的几十年间并发会一直是个课题，这里的异步功能是其中的一小步，我肯定还会有更多进展。 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;提问：&lt;/strong&gt;从反射的视角来说，异步方法和普通方法有什么区别？ &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anders：&lt;/strong&gt;对于反射来说，异步方法就是普通的方法，调用方法也一样。不过它会在第一个await的地方返回，等异步任务完成之后，它再继续执行下去。所以它其实和普通方法没有任何区别，但如果你要知道它什么时候结束，那么就必须去关注它返回的Task对象了。你还看到我写过一些void方法，可能你根本不会在乎它什么时候结束，不过原理上它还是一样的。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/40.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/40-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;就到这里，非常感谢各位参与。&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-1.html"&gt;PDC 2010：C#与Visual Basic的未来（上）&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-2.html"&gt;PDC 2010：C#与Visual Basic的未来（中）&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;PDC 2010：C#与Visual Basic的未来（下） &lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/11/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-3.html#comments</comments>
      <pubDate>Mon, 15 Nov 2010 09:47:47 GMT</pubDate>
      <lastBuildDate>Wed, 17 Nov 2010 12:56:01 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <title>PDC 2010：C#与Visual Basic的未来（中）</title>
      <link>http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-2.html</link>
      <guid>http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-2.html</guid>
      <description>&lt;p&gt;前几天在PDC 2010会议上Anders Hejlsberg发表了一场名为“The Future of C# and Visual Basic”的演说，谈论了未来C#和VB中最为重要的两个特性：“异步（Async）”及“编译器即服务（Compiler as a Service）”。我现在对这场演讲进行总结，但不会像上次《&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html"&gt;编程语言的发展趋势及未来方向&lt;/a&gt;》那样逐句翻译，而是以Anders的角度使用一种简捷合适的方式表述其完整内容。上一篇Anders讲述了async和await的使用方式，而这篇则是对这两个关键字的实现及效果作更进一步的解释。&lt;/p&gt;

&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/11.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/11-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;异步方法的目标，是为了让代码与同步方法保持一致。微软要让代码充斥着回调函数，混乱不堪，它们完全不是逻辑上你想做的事情。可能您的代码中包含着一个核心模型，你也已经实现了，只是您现在想把它的执行过程变得异步化。您自己就可以享受到这一点。&lt;/p&gt;

&lt;p&gt;与我们之前做的一些扩展一样，工作分为语言和框架两部分。语言的异步功能基于框架中的Task&amp;lt;T&amp;gt;，我们会围绕着Task&amp;lt;T&amp;gt;扩展框架，将它作为异步模型的核心。事实上，从Begin/End，或是基于事件的异步模型进行扩展往往只需要一两行封装的代码，于是您也可以得到自己的Task&amp;lt;T&amp;gt;模型。&lt;/p&gt;

&lt;p&gt;而在语言方面，我们添加了两个新的关键字。一个是async关键字，用于把方法标记为异步。还有一个是await方法，用于等待异步工作完成，或者说是把控制权交换给调用方继续执行其他工作。这两个功能在C#和VB种均有体现。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/12.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/12-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;那么什么是Task&amp;lt;T&amp;gt;呢？它表现的是一个“后续会继续进行的操作”，这可以是许多东西，Task&amp;lt;T&amp;gt;并不做任何限制，例如是一个异步I/O，后台工作线程等等，甚至可以是UI上的一个按钮，在用户点击之后任务就结束了。&lt;/p&gt;

&lt;p&gt;Task&amp;lt;T&amp;gt;的优势在于，它使用一个对象封装了整个概念，您可以查询其结果或是状态，或是这个任务所引发的异常。您可以用它来构造一个可组合的异步模型，这正式我们目前的异步编程模型所不足的地方。&lt;/p&gt;

&lt;p&gt;此外，它还提供了一个可组合的回调模型，您可以对一个任务指定说，在它结束之后执行另外一段代码，然后还可以对这个新的任务继续进行设定。这便构造出一个完整的逻辑流，框架会自行帮你完成这些工作。事实上await操作符便会自动把您的逻辑改写成这样的代码，它将您从Lambda表达式及回调函数中的逻辑里解放了出来，一切都交给编译器去做了。您可能会有些疑惑，不过其实这些都是编译器所擅长的事情。&lt;/p&gt;

&lt;p&gt;由于我们统一了异步模型，我们就可以在此之上构建组合工具。例如WhenAll，它接受一系列的Task对象，并在全部结束之后返回所有结果。还有WhenAny，则等待第一个完成的任务，返回其结果。我们还有Delay，可以等待一段时间，但不占用任何资源。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/13.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/13-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;沿着这个过程走一遍可能就会清晰一些。这里有个例子，一个异步方法调用另一个异步方法。我们假设这是在UI线程上执行的，消息会一个一个发送至UI线程上。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/14.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/14-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;好，有人调用了DoWorkAsync，于是出现了一些任务。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/15-1.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/15-1-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;DoWorkAsync的第一件事，是调用了ProcessFeedAsync。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/15-2.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/15-2-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;ProcessFeedAsync方法是一个异步方法，所以它做的第一件事是构造一个表示任务的Task对象。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/16.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/16-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;然后它调用了DownloadFeedAsync，这会创建另一个Task对象。然后，我们遇上了await操作符，这意味着ProcessFeedAsync后面的部分，将作为DownloadFeedAsync完成后的回调函数/continuation里的工作。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/17.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/17-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;于是任务返回至DoWorkAsync，我们得到了t1这个对象。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/18.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/18-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;同样的过程会再次出现，是为t2。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/19.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/19-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;然后便调用了Task.WhenAll，这会创建一个新任务，表示前两个任务全部完成。于是这里的await操作符表示接下去的代码会在前两个任务完成后再继续下去。此时控制权便还给了DoWorkAsync的调用者，不会对线程造成负担。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/20.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/20-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;在未来某一时刻t1和t2会执行完，我们假设t2先结束。此时它会说：我完成了，执行回调函数/continuation吧。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/21.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/21-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;于是它会和发起线程的SynchronizationContext交互，给UI线程发一个消息，让后续任务在UI线程上继续执行──您的代码不用关注这些。现在代码运行至SaveDocAsync上了，这是另外一个异步任务。await让代码在这里返回，线程又可以执行目前还未结束的任务了。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/23.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/23-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;于是SaveDocAsync任务完成了，UI线程又获得了一个消息执行后续工作。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/24.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/24-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;此时任务便到达了ProcessFeedAsync的末尾，于是t2任务结束了。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/27.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/27-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;继续等待，上面的过程会再次出现，最终t1也结束了。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/29.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/29-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;当t1和t2完成以后，最后DoWorkAsync任务也终于结束了。可以看到，我们逻辑流程，无论是循环还是异常捕获都是同步的，但是其中的执行过程完全是异步的。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/30.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/30-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;但是这又是如何实现的？我不会在这里说太细，这又是个完整的话题了。这里有一个例子，是一个异步方法，它会调用并await另一个异步方法。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/31.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/31-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;而编译器则最终则生成类似于这样的代码。我只会提几点，首先，这是个状态机，编译器构造的其实就是个状态机，例如迭代器就是个状态机，事实上这里编译器的工作和yield之余迭代器的重写本质上没有太大区别。&lt;/p&gt;

&lt;p&gt;其次就是关于任务的执行和等待，假如在等待时任务已经完成了，那么其实您是在同步地执行后续代码。我们没有必要交还控制，反正已经完成了，我们不妨就直接进行下去了。await有自己的模式，会决定这一任务是同步还是异步地执行。对于同步执行的任务，一切就继续执行下去了，直到某个需要异步执行的地方，便把控制权交还给调用方。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/32.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/32-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;那么我们再来看一下异步之于Web服务的意义。这里有个ASP.NET页面，它会向数据库里获取许多RSS地址，然后下载到本地并解析：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;ProcessData()
{
    &lt;span style="color: green"&gt;// ...

    &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;urls = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();
    &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;conn = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SqlConnection&lt;/span&gt;(connectionString))
    {
        conn.Open();
        &lt;span style="color: blue"&gt;var &lt;/span&gt;cmd = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SqlCommand&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;GetUserFeeds&amp;quot;&lt;/span&gt;, conn);
        cmd.CommandType = &lt;span style="color: #2b91af"&gt;CommandType&lt;/span&gt;.StoredProcedure;
        cmd.Parameters.AddWithValue(&lt;span style="color: #a31515"&gt;&amp;quot;@UserID&amp;quot;&lt;/span&gt;, user);
        &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;reader = cmd.ExecuteReader())
        {
            &lt;span style="color: blue"&gt;while &lt;/span&gt;(reader.Read()) urls.Add(reader[&lt;span style="color: #a31515"&gt;&amp;quot;FeedURL&amp;quot;&lt;/span&gt;].ToString());
        }
    }

    &lt;span style="color: blue"&gt;var &lt;/span&gt;feeds = (&lt;span style="color: blue"&gt;from &lt;/span&gt;url &lt;span style="color: blue"&gt;in &lt;/span&gt;urls &lt;span style="color: blue"&gt;select &lt;/span&gt;CreateWebClient().DownloadString(url)).ToArray();

    &lt;span style="color: green"&gt;// ...
&lt;/span&gt;}&lt;/pre&gt;

&lt;p&gt;这里用到了DownloadString这个同步下载数据的方法。执行下来大约要花费1秒多的时间。这里我不再演示令人痛苦的异步写法了，你必须在Page_Load和Page_PreRender各写一些逻辑，注册一些异步工作，或者就要启用一些后台线程，但这又会影响后台的线程池，对系统的表现会带来影响。&lt;/p&gt;

&lt;p&gt;现在我来演示一些简单的异步化工作：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private &lt;span style="background-color: #ffff00"&gt;async&lt;/span&gt; void &lt;/span&gt;ProcessData()
{
    &lt;span style="color: green"&gt;// ...

    &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;urls = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;&amp;gt;();
    &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;conn = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SqlConnection&lt;/span&gt;(connectionString))
    {
        conn.Open();
        &lt;span style="color: blue"&gt;var &lt;/span&gt;cmd = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SqlCommand&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;GetUserFeeds&amp;quot;&lt;/span&gt;, conn);
        cmd.CommandType = &lt;span style="color: #2b91af"&gt;CommandType&lt;/span&gt;.StoredProcedure;
        cmd.Parameters.AddWithValue(&lt;span style="color: #a31515"&gt;&amp;quot;@UserID&amp;quot;&lt;/span&gt;, user);
        &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;reader = &lt;span style="background-color: #ffff00"&gt;&lt;span style="color: blue"&gt;await &lt;/span&gt;cmd.ExecuteReaderAsync()&lt;/span&gt;)
        {
            &lt;span style="color: blue"&gt;while &lt;/span&gt;(reader.Read()) urls.Add(reader[&lt;span style="color: #a31515"&gt;&amp;quot;FeedURL&amp;quot;&lt;/span&gt;].ToString());
        }
    }

    &lt;span style="color: blue"&gt;var &lt;/span&gt;feeds = &lt;span style="background-color: #ffff00"&gt;&lt;span style="color: blue"&gt;await &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskEx&lt;/span&gt;.WhenAll&lt;/span&gt;(
        &lt;span style="color: blue"&gt;from &lt;/span&gt;url &lt;span style="color: blue"&gt;in &lt;/span&gt;urls &lt;span style="color: blue"&gt;select &lt;/span&gt;CreateWebClient().&lt;span style="background-color: #ffff00"&gt;DownloadStringTaskAsync&lt;/span&gt;(url));

    &lt;span style="color: green"&gt;// ...
&lt;/span&gt;}&lt;/pre&gt;

&lt;p&gt;我们将DownloadString修改为DownloadStringTaskAsync，这样LINQ返回的就是一系列表示下载任务的Task对象，然后使用await及WhenAll等待它们全部完成。数据库查询也可以如此。这就是所有我们要做的事情。如今页面的执行效率有了很明显的提高。使用这个做法，我们可以很轻松地提高Web系统的伸缩能力。如今我们需要调用很多互相独立的服务的情况越来越多了，异步方法对此有很大帮助。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/33.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/33-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;如今的异步场景有许多种，例如在后台执行一个计算任务，这是基于CPU的异步，还有基于网络或I/O的异步任务。这些都能用Task来表示出来，因为Task表示的就是未来会完成的异步任务。此外，有了async和.NET框架，我们则出现了另外一种任务，既基于某些任务组合而成的异步任务。这也就是async方法所体现出的异步任务，它可以让你使用传统的语句来构造异步执行过程。&lt;/p&gt;

&lt;p&gt;例如有这么一个场景：获取链接，根据链接下载Youtube视频，根据下载到的视频创建mashup并组合起来。在执行这些工作的时候，我们也希望UI可以响应用户操作。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/34.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/34-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;而要完成这些工作，代码可能只需要这么简单，完全就像同步代码一样。而这里也体现了多种异步任务：ScrapeYoutubeAsync是网络密集型任务，然后同时下载两个视频并等待它们结束。然后MashupVideosAsync是CPU密集型任务，然后最后则是I/O密集型的的SaveAsync操作。对于异常处理来说，我们可以简捷地使用一个try...catch，就像传统编程那样。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/35.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/35-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;总结一下，一个异步方法可以让代码和同步实现一样简单，并统一了计算、网络及I/O的异步化。这可以用来创建高度伸缩的服务器程序，自然还有响应度高的UI程序。&lt;/p&gt;

&lt;p&gt;在演讲的末尾，我会给出Visual Studio Async CTP的下载链接，我很乐于得到大家的反馈。&lt;/p&gt;

&lt;h1&gt;相关文章 &lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-1.html"&gt;PDC 2010：C#与Visual Basic的未来（上）&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;PDC 2010：C#与Visual Basic的未来（中）&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/11/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-3.html"&gt;PDC 2010：C#与Visual Basic的未来（下）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-2.html#comments</comments>
      <pubDate>Sun, 31 Oct 2010 13:49:48 GMT</pubDate>
      <lastBuildDate>Wed, 17 Nov 2010 12:55:19 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <title>PDC 2010：C#与Visual Basic的未来（上）</title>
      <link>http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-1.html</link>
      <guid>http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-1.html</guid>
      <description>&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/01.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/01-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;PDC不愧为微软最高级的技术人员专业会议，看得我直呼过瘾。前几天在PDC 2010会议上Anders Hejlsberg发表了一场名为“The Future of C# and Visual Basic”的演说，谈论了未来C#和VB中最为重要的两个特性：“异步（Async）”及“编译器即服务（Compiler as a Service）”。我现在对这场演讲进行总结，但不会像上次《&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html"&gt;编程语言的发展趋势及未来方向&lt;/a&gt;》那样逐句翻译，而是以Anders的角度使用一种简捷合适的方式表述其完整内容。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/02.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/02-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;在2000年的PDC上，我们给大家带来了一个全新的平台“.NET”，以及一个语言“C#”。.NET与C#每次发布时都有一个“主题”，一开始是“托管代码”，接着是“泛型”，然后是“LINQ”，直到最近的“动态性”，这就是C#和VB的演变过程。这两种语言面向的用户比较相近，微软也承诺会同时发展两种语言。因此这个演讲虽然以C#作为主题，但其实也会在VB中得以体现。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/03.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/03-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;作为语言的设计者，要设法将工业界所重视的内容，使用语言表现出来，因此也有了这样的分类。“声明式”代表了一种编程的趋势，尽可能表现出“做什么”而不是“怎么做”，于是有了函数式编程与DSL等等。然后，目前研究的热门之一则是动态语言，如Python，Ruby，JavaScript等等，以及它们是如何影响静态语言的。还有便是“并发”，这里所指的广义的“并发”，包括单机上多核以及云或是数据中心上分布式系统等等，也就是各种“同时处理”的方式。&lt;/p&gt;

&lt;p&gt;我们可以清楚地看到，C# 3.0和VB 9中的函数式编程，LINQ等特性体现了“声明式”，而C# 4.0和VB 10则出现了动态性，但都没有太多关于“并发”的成分在里面──它都体现在框架中了，例如.NET 4包含了任务并行库（Task Parallel Library），但对于语言来说，除了lock似乎就没有什么这方面的支持了。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/04.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/04-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;如今对“并发”的需求已经是毋庸质疑的，很少有一个应用程序或是服务不需要连接外部系统。这种与外部系统，例如互联网进行交互的行为则增加了应用程序的延迟，这可能导致UI在和外部服务交互时长时间失去响应。而对于一个数据中心的服务，您可能就会发现CPU的利用率不高，因为系统都在等待其他服务的回复了。 &lt;/p&gt;

&lt;p&gt;为了解决这个问题，我们往往会使用“异步”的编程方式，它逐渐已经成为“高响应度”，“高伸缩性”的代名词了。此外还有一些API只提供了异步的版本，例如在JavaScript中发起HTTP请求，或是Silverlight的网络交互方面。这种情况以后只会越来越普遍。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/05.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/05-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;于是下一版本的C#和VB就会在这里有所行动，目前会展示一下我们的早期工作，希望可以得到一些反馈。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/06.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/06-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;说到异步化，您可以简单认为“一起运行”。一个同步方法，好比DownloadString，应用程序会执行这个方法，并等待结果返回，但是你不能把工作的执行过程与结果的送达区分开来。而对于异步编程来说，DownloadStringAsync在调用之后便会立即返回，过了一段时间，结果就会传递过来，于是执行过程和结果的送达便完全是可分离的了。而对于如今典型的异步模型来说，结果通过一个回调函数传递过来。 &lt;/p&gt;

&lt;p&gt;异步化可以的得到高度的响应能力，因为在等待任务的结果时我们可以做其他一些事情。而对于服务器来说，异步可以带来很好的伸缩性，因为线程得到释放了，而不需要等待请求返回结果。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/07.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/07-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;通过图示可以更清楚地了解这点。例如有段代码叫做DownloadData，调用以后可以得到一些数据。在执行时，线程会有长时间的终止，它被阻塞了，要等到结果返回之后才能继续处理数据。与此相对的是其异步的版本，我们调用DownloadDataAsync方法之后，它立即将控制权交还给我们，过了一段时间，它会把结果传递给回调函数，让我们继续处理下去。但是在DownloadData和ProcessData之间，我们可以处理其他一些工作。如果这是UI线程，那么就可以用于响应其他用户操作。如果这是个服务器线程，那么在等待结果时这个线程可以用来处理其他请求。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/08.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/08-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;那么，如果我们要执行多个请求，例如要调用两遍，对于同步的版本就会获得双倍的阻塞，即便两个请求是完全独立的。而在异步的情况下，我们可以快速地发出两个请求，这样便形成的并发，即便这里并没有使用额外的线程。于是便可以更快地得到结果，也能保证响应能力。&lt;/p&gt;

&lt;p&gt;有人可能会说，我们可以利用后台线程来得到响应。没错，不过就引入了多线程模型，于是就要处理同步等线程安全问题。而且，在开发带有UI的应用程序时，我们不能在后台线程里操作UI，这样又出现了其他的复杂情况。而在服务器应用中，我们又不希望创建更多的线程，因为这会给线程池带来压力，线程之间会有竞争，就会降低请求的处理能力。&lt;/p&gt;

&lt;p&gt;以上便是对异步编程的概述，您可能会问，既然异步有那么多好处，那么为什么不把所有的应用程序都写作异步的呢？那么现在我们就来看一下异步编程大概是什么样子的。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/09.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/09-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;这里有个简单的应用程序，输入年份，可以下载到那一年的电影。现在这个程序是同步的写法。在搜索的时候UI会失去响应，这样的结果显然无法令人接受，我们要做的更好。我们可以将其改写为异步的形式。 &lt;/p&gt;

&lt;p&gt;同步的写法是这样的：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;searchButton_Click(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;RoutedEventArgs &lt;/span&gt;e)
{
    LoadMovies(&lt;span style="color: #2b91af"&gt;Int32&lt;/span&gt;.Parse(textBox.Text));
}

&lt;span style="color: blue"&gt;void &lt;/span&gt;LoadMovies(&lt;span style="color: blue"&gt;int &lt;/span&gt;year)
{
    resultsPanel.Children.Clear();
    statusText.Text = &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;pageSize = 10;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;imageCount = 0;

    &lt;span style="color: blue"&gt;while &lt;/span&gt;(&lt;span style="color: blue"&gt;true&lt;/span&gt;)
    {
        &lt;span style="color: blue"&gt;var &lt;/span&gt;movies = QueryMovies(year, imageCount, pageSize);
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(movies.Length == 0) &lt;span style="color: blue"&gt;break&lt;/span&gt;;
        DisplayMovies(movies);
        imageCount += movies.Length;
    }

    statusText.Text = &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0} Titles&amp;quot;&lt;/span&gt;, imageCount);
}

&lt;span style="color: #2b91af"&gt;Movie&lt;/span&gt;[] QueryMovies(&lt;span style="color: blue"&gt;int &lt;/span&gt;year, &lt;span style="color: blue"&gt;int &lt;/span&gt;first, &lt;span style="color: blue"&gt;int &lt;/span&gt;count)
{
    &lt;span style="color: blue"&gt;var &lt;/span&gt;client = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WebClient&lt;/span&gt;();
    &lt;span style="color: blue"&gt;var &lt;/span&gt;url = &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(query, year, first, count);
    &lt;span style="color: blue"&gt;var &lt;/span&gt;data = client.DownloadString(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(url));

    &lt;span style="color: blue"&gt;var &lt;/span&gt;movies =
        &lt;span style="color: blue"&gt;from &lt;/span&gt;entry &lt;span style="color: blue"&gt;in &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt;.Parse(data).Desendanies(xs + &lt;span style="color: #a31515"&gt;&amp;quot;entry&amp;quot;&lt;/span&gt;)
        &lt;span style="color: blue"&gt;let &lt;/span&gt;properties = entry.Element(xm + &lt;span style="color: #a31515"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;)
        &lt;span style="color: blue"&gt;select new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Movie
        &lt;/span&gt;{
            &lt;span style="color: green"&gt;/* ... */
        &lt;/span&gt;};

    &lt;span style="color: blue"&gt;return &lt;/span&gt;movies.ToArray();
}&lt;/pre&gt;

&lt;p&gt;在点击按钮以后会调用LoadMovies方法，它会在一个循环中不断使用QueryMovies方法进行查询，在QueryMovies方法中我们使用WebClient下载一个XML，解析，构造Movie对象并返回，最终呈现在界面上。&lt;/p&gt;

&lt;p&gt;下载时我们使用DownloadString方法，这是个同步方法，我们要把它修改成异步的方式。事实上还真有个异步的方法，叫做DownloadStringAsync，不过这就需要我们修改代码，例如要把QueryMovies中的大部分放入DownloadStringCompleted事件的处理函数中。同时，异步编程的痛苦慢慢体现出现了，我们无法返回数据，而必须传递到某个地方，于是QueryMovies方法则要返回void，并接受一个回调函数。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;void &lt;/span&gt;QueryMovies(&lt;span style="color: blue"&gt;int &lt;/span&gt;year, &lt;span style="color: blue"&gt;int &lt;/span&gt;first, &lt;span style="color: blue"&gt;int &lt;/span&gt;count, &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Movie&lt;/span&gt;[]&amp;gt; action)
{
    &lt;span style="color: blue"&gt;var &lt;/span&gt;client = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WebClient&lt;/span&gt;();
    &lt;span style="color: blue"&gt;var &lt;/span&gt;url = &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(query, year, first, count);

    client.DownloadStringCompleted += (sender, e) =&amp;gt;
    {
        &lt;span style="color: blue"&gt;var &lt;/span&gt;data = e.Result;
        &lt;span style="color: blue"&gt;var &lt;/span&gt;movies =
            &lt;span style="color: blue"&gt;from &lt;/span&gt;entry &lt;span style="color: blue"&gt;in &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt;.Parse(data).Descendants(xs + &lt;span style="color: #a31515"&gt;&amp;quot;entry&amp;quot;&lt;/span&gt;)
            &lt;span style="color: blue"&gt;let &lt;/span&gt;properties = entry.Element(xm + &lt;span style="color: #a31515"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;)
            &lt;span style="color: blue"&gt;select new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Movie
            &lt;/span&gt;{
                &lt;span style="color: green"&gt;/* ... */
            &lt;/span&gt;};

        action(movies.ToArray());
    };

    client.DownloadStringAsync(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(url));
}&lt;/pre&gt;

&lt;p&gt;然后我们还需要处理QueryMovies的调用者，这里实在麻烦到家了，因为我们使用了一个while循环来查询电影，那么我们又该如何反复调用一个异步方法？&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;void &lt;/span&gt;LoadMovies(&lt;span style="color: blue"&gt;int &lt;/span&gt;year)
{
    resultsPanel.Children.Clear();
    statusText.Text = &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;pageSize = 10;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;imageCount = 0;

    &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Movie&lt;/span&gt;[]&amp;gt; action = &lt;span style="color: blue"&gt;null&lt;/span&gt;;
    action = movies =&amp;gt;
    {
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(movie.Length &amp;gt; 0)
        {
            DisplayMovie(movies);
            imageCount += movies.Length;
            QueryMovies(year, imageCount, pageSize, action);
        }
        &lt;span style="color: blue"&gt;else
        &lt;/span&gt;{
            statusText.Text = &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0} Titles&amp;quot;&lt;/span&gt;, imageCount);
        }
    };

    QueryMovies(year, imageCount, pageSize, action);
}&lt;/pre&gt;

&lt;p&gt;你一定已经发现了，现在的代码已经很难让人保持愉快了。不过它的确是异步的了，运行时界面响应良好。效果是有了，不过这代码变得乱七八糟。想象一下，如果要加上异常处理该怎么做？我们可能要提供两个回调函数，一个处理正常情况，一个处理错误，还到处需要有try...catch，很快麻烦就会接踵而来了。如果不想面对这些麻烦，你可能就要去启用后台线程，这样又有了线程方面的问题。 &lt;/p&gt;

&lt;p&gt;显然我们可以做的更好。首先让我们回到原来的同步代码，然后再用上我们为异步编程设计的新特性。&lt;/p&gt;

&lt;p&gt;如果要把QueryMovies变为异步，则先把它的返回值改为Task&amp;lt;Movie[]&amp;gt;，你如果了解.NET 4则一定已经知道这个类型是任务并行库的一部分。事实上Task类型只是表示一个“开始计算并在未来返回结果”的任务，因此Task&amp;lt;T&amp;gt;表示一个会在将来返回T类型的计算任务，在科学计算领域这通常被称为Future或是Promise。现在方法的返回值是Task&amp;lt;Movie[]&amp;gt;，而最后返回的是Movie[]，这显然不匹配，但我们可以将其标记为一个async方法。对于async方法，编译器会重写整个方法实现来表示一个异步任务，以后我们会来观察它是如何实现这点的。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&lt;span style="background-color: #ffff00"&gt;async&lt;/span&gt; &lt;/span&gt;&lt;span style="background-color: #ffff00"&gt;&lt;span style="color: #2b91af"&gt;Task&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Movie&lt;/span&gt;[]&amp;gt;&lt;/span&gt; QueryMoviesAsync(&lt;span style="color: blue"&gt;int &lt;/span&gt;year, &lt;span style="color: blue"&gt;int &lt;/span&gt;first, &lt;span style="color: blue"&gt;int &lt;/span&gt;count)
{
    &lt;span style="color: blue"&gt;var &lt;/span&gt;client = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WebClient&lt;/span&gt;();
    &lt;span style="color: blue"&gt;var &lt;/span&gt;url = &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(query, year, first, count);
    &lt;span style="color: blue"&gt;var &lt;/span&gt;data = client.DownloadString(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(url));

    &lt;span style="color: blue"&gt;var &lt;/span&gt;movies =
        &lt;span style="color: blue"&gt;from &lt;/span&gt;entry &lt;span style="color: blue"&gt;in &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt;.Parse(data).Descendants(xs + &lt;span style="color: #a31515"&gt;&amp;quot;entry&amp;quot;&lt;/span&gt;)
        &lt;span style="color: blue"&gt;let &lt;/span&gt;properties = entry.Element(xm + &lt;span style="color: #a31515"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;)
        &lt;span style="color: blue"&gt;select new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Movie
        &lt;/span&gt;{
            &lt;span style="color: green"&gt;/* ... */
        &lt;/span&gt;};

    &lt;span style="color: blue"&gt;return &lt;/span&gt;movies.ToArray();
}&lt;/pre&gt;

&lt;p&gt;不过只做到这点还不够，我们的方法还没有异步化，这还是个同步任务。不过，如今在一个async方法中，我们有能力组合调用另一个async方法，并异步地等待。这里使用了一个扩展方法DownloadStringTaskAsync，以后也会包含在框架中。这个方法返回Task&amp;lt;string&amp;gt;类型，表示未来某一时刻将会得到一个string对象。于是在async方法中，我们使用一个新的await操作符来等待其返回。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;async &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Task&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Movie&lt;/span&gt;[]&amp;gt; QueryMoviesAsync(&lt;span style="color: blue"&gt;int &lt;/span&gt;year, &lt;span style="color: blue"&gt;int &lt;/span&gt;first, &lt;span style="color: blue"&gt;int &lt;/span&gt;count)
{
    &lt;span style="color: blue"&gt;var &lt;/span&gt;client = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WebClient&lt;/span&gt;();
    &lt;span style="color: blue"&gt;var &lt;/span&gt;url = &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(query, year, first, count);
    &lt;span style="color: blue"&gt;var &lt;/span&gt;data = &lt;span style="color: blue"&gt;&lt;span style="background-color: #ffff00"&gt;await&lt;/span&gt; &lt;/span&gt;client.&lt;span style="background-color: #ffff00"&gt;DownloadStringTaskAsync&lt;/span&gt;(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(url));

    &lt;span style="color: blue"&gt;var &lt;/span&gt;movies =
        &lt;span style="color: blue"&gt;from &lt;/span&gt;entry &lt;span style="color: blue"&gt;in &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt;.Parse(data).Descendants(xs + &lt;span style="color: #a31515"&gt;&amp;quot;entry&amp;quot;&lt;/span&gt;)
        &lt;span style="color: blue"&gt;let &lt;/span&gt;properties = entry.Element(xm + &lt;span style="color: #a31515"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;)
        &lt;span style="color: blue"&gt;select new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Movie
        &lt;/span&gt;{
            &lt;span style="color: green"&gt;/* ... */
        &lt;/span&gt;};

    &lt;span style="color: blue"&gt;return &lt;/span&gt;movies.ToArray();
}&lt;/pre&gt;

&lt;p&gt;在执行时，方法会执行到await操作符这里，并确保接下来的代码是在一个回调函数/continuation中执行的。编译器会在这里重写这个方法，就像为yield重写迭代器那样，于是我们就不需要做其他事情了，任务结束后自然会执行await后面的代码。&lt;/p&gt;

&lt;p&gt;这里的美妙之处在于可以任意组合，对于LoadMovies方法来说，我们也可以将其转化为async方法，并await之前的QueryMoviesAsync方法返回。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&lt;span style="background-color: #ffff00"&gt;async&lt;/span&gt; void &lt;/span&gt;LoadMoviesAsync(&lt;span style="color: blue"&gt;int &lt;/span&gt;year)
{
    resultsPanel.Children.Clear();
    statusText.Text = &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;pageSize = 10;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;imageCount = 0;

    &lt;span style="color: blue"&gt;while &lt;/span&gt;(&lt;span style="color: blue"&gt;true&lt;/span&gt;)
    {
        &lt;span style="color: blue"&gt;var &lt;/span&gt;movies = &lt;span style="color: blue"&gt;&lt;span style="background-color: #ffff00"&gt;await&lt;/span&gt; &lt;/span&gt;QueryMoviesAsync(year, imageCount, pageSize);
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(movies.Length == 0) &lt;span style="color: blue"&gt;break&lt;/span&gt;;
        DisplayMovies(movies);
        imageCount += movies.Length;
    }

    statusText.Text = &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0} Titles&amp;quot;&lt;/span&gt;, imageCount);
}&lt;/pre&gt;

&lt;p&gt;于是异步实现就这么完成了，代码和之前几乎完全一致。您可以看出，这使得我们在执行异步代码时保留原本的逻辑实现。&lt;/p&gt;

&lt;p&gt;那么再为应用程序添加一点功能吧。首先是异常处理：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;async void &lt;/span&gt;LoadMoviesAsync(&lt;span style="color: blue"&gt;int &lt;/span&gt;year)
{
    resultsPanel.Children.Clear();
    statusText.Text = &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;pageSize = 10;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;imageCount = 0;

    &lt;span style="color: blue"&gt;try
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;while &lt;/span&gt;(&lt;span style="color: blue"&gt;true&lt;/span&gt;)
        {
            &lt;span style="color: blue"&gt;var &lt;/span&gt;movies = &lt;span style="color: blue"&gt;await &lt;/span&gt;QueryMoviesAsync(year, imageCount, pageSize);
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(movies.Length == 0) &lt;span style="color: blue"&gt;break&lt;/span&gt;;
            DisplayMovies(movies);
            imageCount += movies.Length;
        }

        statusText.Text = &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0} Titles&amp;quot;&lt;/span&gt;, imageCount);
    }
    &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;XmlException&lt;/span&gt;)
    {
        statusText.Text = &lt;span style="color: #a31515"&gt;&amp;quot;Data Error&amp;quot;&lt;/span&gt;;
    }
}&lt;/pre&gt;

&lt;p&gt;我们无需分离代码或是逻辑，这一切都和同步代码完全一致。再来看看“取消（cancellation）”，对于async方法来说，我们可以传递一个CancellationToken，表示任务需要监听这个对象的改变。如QueryMoviesAsync便可以增加一个参数：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;async &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Task&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Movie&lt;/span&gt;[]&amp;gt; QueryMoviesAsync(&lt;span style="color: blue"&gt;int &lt;/span&gt;year, &lt;span style="color: blue"&gt;int &lt;/span&gt;first, &lt;span style="color: blue"&gt;int &lt;/span&gt;count, &lt;span style="background-color: #ffff00"&gt;&lt;span style="color: #2b91af"&gt;CancellationToken &lt;/span&gt;ct&lt;/span&gt;)
{
    &lt;span style="color: blue"&gt;var &lt;/span&gt;client = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WebClient&lt;/span&gt;();
    &lt;span style="color: blue"&gt;var &lt;/span&gt;url = &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(query, year, first, count);
    &lt;span style="color: blue"&gt;var &lt;/span&gt;data = &lt;span style="color: blue"&gt;await &lt;/span&gt;client.DownloadStringTaskAsync(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;(url), &lt;span style="background-color: #ffff00"&gt;ct&lt;/span&gt;);

    &lt;span style="color: blue"&gt;var &lt;/span&gt;movies =
        &lt;span style="color: blue"&gt;from &lt;/span&gt;entry &lt;span style="color: blue"&gt;in &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt;.Parse(data).Descendants(xs + &lt;span style="color: #a31515"&gt;&amp;quot;entry&amp;quot;&lt;/span&gt;)
        &lt;span style="color: blue"&gt;let &lt;/span&gt;properties = entry.Element(xm + &lt;span style="color: #a31515"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;)
        &lt;span style="color: blue"&gt;select new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Movie
        &lt;/span&gt;{
            &lt;span style="color: green"&gt;/* ... */
        &lt;/span&gt;};

    &lt;span style="color: blue"&gt;return &lt;/span&gt;movies.ToArray();
}&lt;/pre&gt;

&lt;p&gt;这样便得到了一个可取消的async方法。对于逻辑流来说，取消操作就相当于一个异常，代码里需要处理一个TaskCanceledException：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="background-color: #ffff00"&gt;&lt;span style="color: #2b91af"&gt;CancellationTokenSource&lt;/span&gt; cts;&lt;/span&gt;

&lt;span style="color: blue"&gt;async &lt;/span&gt;&lt;span style="color: blue"&gt;void &lt;/span&gt;LoadMoviesAsync(&lt;span style="color: blue"&gt;int &lt;/span&gt;year)
{
    resultsPanel.Children.Clear();
    statusText.Text = &lt;span style="color: #a31515"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;pageSize = 10;
    &lt;span style="color: blue"&gt;var &lt;/span&gt;imageCount = 0;

    &lt;span style="background-color: #ffff00"&gt;cts = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CancellationTokenSource&lt;/span&gt;();&lt;/span&gt;
    &lt;span style="color: blue"&gt;try
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;while &lt;/span&gt;(&lt;span style="color: blue"&gt;true&lt;/span&gt;)
        {
            &lt;span style="color: blue"&gt;var &lt;/span&gt;movies = &lt;span style="color: blue"&gt;await &lt;/span&gt;QueryMoviesAsync(year, imageCount, pageSize, &lt;span style="background-color: #ffff00"&gt;cts.Token&lt;/span&gt;);
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(movies.Length == 0) &lt;span style="color: blue"&gt;break&lt;/span&gt;;
            DisplayMovies(movies);
            imageCount += movies.Length;
        }
        statusText.Text = &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;{0} Titles&amp;quot;&lt;/span&gt;, imageCount);
    }
    &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;TaskCanceledException&lt;/span&gt;) { }

    &lt;span style="background-color: #ffff00"&gt;cts = &lt;span style="color: blue"&gt;null&lt;/span&gt;;&lt;/span&gt;
}

&lt;span style="color: blue"&gt;private void &lt;/span&gt;cancelButton_Click(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;RoutedEventArgs &lt;/span&gt;e)
{
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(cts != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
    {
        cts.Cancel();
        statusText.Text = &lt;span style="color: #a31515"&gt;&amp;quot;Canceled&amp;quot;&lt;/span&gt;;
    }
}&lt;/pre&gt;

&lt;p&gt;那么超时又怎么说？超时其实就类似一段时间之后的取消。于是我们可以另写一个小方法来处理这个问题：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;async &lt;/span&gt;&lt;span style="color: blue"&gt;void &lt;/span&gt;StartTimeoutAsync()
{
    &lt;span style="color: blue"&gt;await &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskEx&lt;/span&gt;.Delay(5000);
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(cts != &lt;span style="color: blue"&gt;null&lt;/span&gt;)
    {
        cts.Cancel();
        statusText.Text = &lt;span style="color: #a31515"&gt;&amp;quot;Timeout&amp;quot;&lt;/span&gt;;
    }
}

&lt;span style="color: blue"&gt;private void &lt;/span&gt;searchButton_Click(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;RoutedEventArgs &lt;/span&gt;e)
{
    LoadMoviesAsync(&lt;span style="color: #2b91af"&gt;Int32&lt;/span&gt;.Parse(textBox.Text));
    &lt;span style="background-color: #ffff00"&gt;StartTimeoutAsync();&lt;/span&gt;
}&lt;/pre&gt;

&lt;p&gt;第一步，我们先等待5秒钟，如果任务还在执行，那么我们就取消掉。所以无论是超时，取消还是错误处理，程序的逻辑结构都得以最大限度的保留，就好比编写普通的代码一样。例如上面的Delay，看上去是顺序逻辑流，但实际上是异步的。为了表现出这点，我们可以为程序新加上一个有趣的功能：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;async void &lt;/span&gt;ShowDateTimeAsync()
{
    &lt;span style="color: blue"&gt;while &lt;/span&gt;(&lt;span style="color: blue"&gt;true&lt;/span&gt;)
    {
        Title = &lt;span style="color: #a31515"&gt;&amp;quot;Movie Finder &amp;quot; &lt;/span&gt;+ &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now;
        &lt;span style="color: blue"&gt;await &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskEx&lt;/span&gt;.Delay(1000);
    }
}

&lt;span style="color: blue"&gt;public &lt;/span&gt;MainWindow()
{
    InitializeComponent();
    textBox.Focus();
    &lt;span style="background-color: #ffff00"&gt;ShowDateTimeAsync();&lt;/span&gt;
}&lt;/pre&gt;

&lt;p&gt;于是在标题栏上便会每隔一秒刷新显示当前时间，与此同时搜索也好，超时也罢，在程序执行时UI都可以获得响应。&lt;/p&gt;

&lt;p&gt;值得强调的是，上面实现的这些功能都没有启用额外的线程，所有这些都在UI线程上执行。那么什么时候需要额外的线程呢？这便是计算密集型操作。例如这里我要执行五千万次平方根计算，这需要耗费一段时间。不过这样的操作，对于UI线程来说，这也不过是一个异步操作，不是吗？启动操作，然后等待其完成，在它完成之后再对结果做些处理：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;async void &lt;/span&gt;ComputeStuffAsync()
{
    &lt;span style="color: blue"&gt;double &lt;/span&gt;result = 0;
    &lt;span style="color: blue"&gt;await &lt;/span&gt;&lt;span style="color: #2b91af"&gt;TaskEx&lt;/span&gt;.Run(() =&amp;gt;
    {
        &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;i = 1; i &amp;lt; 500000000; i++)
        {
            result += &lt;span style="color: #2b91af"&gt;Math&lt;/span&gt;.Sqrt(i);
        }
    });

    &lt;span style="color: #2b91af"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515"&gt;&amp;quot;The result is &amp;quot; &lt;/span&gt;+ result, &lt;span style="color: #a31515"&gt;&amp;quot;Background Task&amp;quot;&lt;/span&gt;,
        &lt;span style="color: #2b91af"&gt;MessageBoxButton&lt;/span&gt;.OK, &lt;span style="color: #2b91af"&gt;MessageBoxImage&lt;/span&gt;.Information);
}

&lt;span style="color: blue"&gt;private void &lt;/span&gt;searchButton_Click(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;RoutedEventArgs &lt;/span&gt;e)
{
    LoadMoviesAsync(&lt;span style="color: #2b91af"&gt;Int32&lt;/span&gt;.Parse(textBox.Text));
    StartTimeoutAsync();
    &lt;span style="background-color: #ffff00"&gt;ComputeStuffAsync();&lt;/span&gt;
}&lt;/pre&gt;

&lt;p&gt;TaskEx.Run方法会构造一个后台线程，并返回异步操作，我们使用await等待其返回，这体现了绝佳的组合能力。启动后在任务管理器中便会发现CPU占用率明显上升。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/10.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/pdc2010-future-of-csharp-vb-anders/10-s.png" /&gt;&lt;/a&gt; 

&lt;p&gt;我在这里宣布，之前演示的技术预览版已经可以下载了。我们已经创建了C#和VB编译器的原型，并提供了一些示例。您可以在开发者中心下载，我在演讲最后会给出URL。&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;PDC 2010：C#与Visual Basic的未来（上） &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-2.html"&gt;PDC 2010：C#与Visual Basic的未来（中）&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/11/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-3.html"&gt;PDC 2010：C#与Visual Basic的未来（下）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/10/pdc2010-the-future-of-csharp-and-vb-by-anders-hejlsberg-1.html#comments</comments>
      <pubDate>Sat, 30 Oct 2010 18:43:29 GMT</pubDate>
      <lastBuildDate>Wed, 17 Nov 2010 12:55:05 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/parallel/">并行处理</category>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>盛大创新院赞助第二届.NET技术交流会 - 演讲录像及下载</title>
      <link>http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-videos.html</link>
      <guid>http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-videos.html</guid>
      <description>&lt;p&gt;经过一个多星期的努力，我们在此为大家奉上&lt;a href="http://blog.zhaojie.me/2010/01/1651772.html"&gt;盛大创新院&lt;/a&gt;赞助&lt;a href="http://blog.zhaojie.me/2010/08/2nd-snda-dotnet-conference-sign-up.html"&gt;第二届.NET技术交流会&lt;/a&gt;的演讲录像。由于录像过程中的一些失误，我们在在讲师录像方面存在着很大问题，经过补救，也只能得到后两场演讲中使用手持设备拍摄下来的录像。在此向大家表示深深的歉意，有了这次的教训，我们以后会更加重视每一个环节的预防及补救措施，尽力避免如现在这样无可挽回的结果。&lt;/p&gt;

&lt;h1&gt;响应式编程与响应式框架&lt;/h1&gt;

&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/zhaojie.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/zhaojie.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;p&gt;讲师：赵劼，盛大创新院，研究员。关注前沿技术，并致力于开源社区与微软平台的组合优化。对函数式编程，并行程序开发，代码之美以及程序员能力与修养等相关问题也有着浓厚的兴趣，同时非常希望能够写程序到60岁。最近致力于F#，Scala语言及mono平台在社区中的推广。&lt;/p&gt;

&lt;p&gt;简介：异步编程改变了我们的编程方式，也为我们带来的许多挑战，同时让一些编程模型重新焕发了生机。与传统的“拉”模型不同，响应式编程将异步事件流视为可观察的集合，这是一种“推”模型。微软为了提高云时代的编程体验而设计了响应式框架，其目的是为了简化复杂事件处理之间混合操作。从中我们了解到一些异步编程的模式与LINQ使用技巧，并可以将这种编程模型普及到JavaScript等其他平台上去。&lt;/p&gt;
&lt;embed src="http://player.youku.com/player.php/sid/XMjA3OTIzNzI0/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"&gt;&lt;/embed&gt; 

&lt;p&gt;&lt;a href="http://dlc2.sdo.com/FTP/cop/20100928/1/rx.mov"&gt;高清格式下载&lt;/a&gt;（mov格式，1280 * 720，265M）&lt;/p&gt;

&lt;h1&gt;大话程序员可用的算法&lt;/h1&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/chengshaofei.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/chengshaofei.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;p&gt;讲师：程劭非，盛大创新院，研究员。网名winter，无忧脚本版主。Web前端技术的积极倡导者。学生时代曾经热衷于参加ACM/ICPC。目前工作在Bambook电子书项目，主要负责文字排版和浏览器引擎WebKit相关。之前曾负责在Windows CE系统上的IE开发。&lt;/p&gt;

&lt;p&gt;简介：俗话说“数据结构+算法=程序”，算法是什么？算法书里满篇是看不懂的形式化推导，网上一些&amp;quot;高人&amp;quot;写的关于算法文章高深莫测，大公司面 试最让人讨厌的就是考算法题，“我做了这么多年，跟本在实际开发中就没用过算法！”，算法真的是距离我们如此遥远的东西吗？且听这回演讲， 算法究竟如何影响我们的开发。&lt;/p&gt;
&lt;embed src="http://player.youku.com/player.php/sid/XMjA3OTI3MjAw/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"&gt;&lt;/embed&gt; 

&lt;p&gt;&lt;a href="http://dlc2.sdo.com/FTP/cop/20100928/1/algorithms.mov"&gt;高清格式下载&lt;/a&gt;（mov格式，1280 * 720，128M）&lt;/p&gt;

&lt;h1&gt;Windows内核技术介绍&lt;/h1&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/panaimin.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/panaimin.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;p&gt;讲师：潘爱民，盛大创新院专家，微软学者，集团COO专家顾问。长期从事软件和系统技术的研究和开发工作，撰写了大量软件技术文章，并著译了多部经典计算机图书。在MSR/清华等从事多年科研工作，在北大和清华多年执教经验。数学学士学位和计算机科学博士，主要研究领域包括软件设计、信息安全、操作系统和Internet技术。&lt;/p&gt;

&lt;p&gt;简介：Windows操作系统经过二十年的发展，已臻成熟。Microsoft在推动Windows内核方面做了大量工作，譬如于2006年夏季向教育界开放了当时最为先进的内核源代码（Windows Research Kernel）。主讲者在这次讲座中，结合这些可利用的资源，分享对Windows内核研究的体会，尤其将重点讨论Windows中的I/O模型和环境子系统。&lt;/p&gt;
&lt;embed src="http://player.youku.com/player.php/sid/XMjEyOTkyMzgw/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"&gt;&lt;/embed&gt; 

&lt;p&gt;&lt;a href="http://dlc2.sdo.com/FTP/cop/20100928/1/win-kernal.mov"&gt;高清格式下载&lt;/a&gt;（mov格式，1280 * 720，480M）&lt;/p&gt;

&lt;h1&gt;面向对象与生活&lt;/h1&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/gaoxiang.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/gaoxiang.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;p&gt;讲师：高翔，5173.com&amp;#160; 项目经理。关注前沿技术和技术人员的非技术生活。对面向对象、模式和建模技术有浓厚兴趣，并对游戏设计和图形学方面也比较感兴趣。最近在学习F#，Lua以及关注一些关于职业生涯规划方面的话题。&lt;/p&gt;

&lt;p&gt;简介：面向对象这个话题虽然很热，但与哲学一样，很难给其一个很准确的定义。也因为如此，每个人对它都有自己的理解。本次演讲将从一个实际的例子出发，逐步引入面向对象的三个特征，结合对象的生命周期，以及基于事件的对象扩展方式等方面，探讨其与设计模式，与生活之间的联系。&lt;/p&gt;
&lt;embed src="http://player.youku.com/player.php/sid/XMjA2NjIxMzky/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"&gt;&lt;/embed&gt; 

&lt;p&gt;&lt;a href="http://dlc2.sdo.com/FTP/cop/20100928/1/ooad.mov"&gt;高清格式下载&lt;/a&gt;（mov格式，1280 * 720，320M）&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/08/2nd-snda-dotnet-conference-sign-up.html"&gt;盛大创新院赞助第二届.NET技术交流会开始报名了！&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-is-coming.html"&gt;盛大创新院赞助第二届.NET技术交流会即将召开&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-all-slides.html"&gt;盛大创新院赞助第二届.NET技术交流会 - 各场演讲幻灯片&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;盛大创新院赞助第二届.NET技术交流会 - 演讲录像及下载 &lt;/li&gt;

  &lt;li&gt;盛大创新院赞助首届.NET技术交流会：&lt;a href="http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html"&gt;报名&lt;/a&gt;、&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-is-coming.html"&gt;预告&lt;/a&gt;、&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-all-slides.html"&gt;幻灯片&lt;/a&gt;、&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-videos.html"&gt;演讲录象及下载&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-videos.html#comments</comments>
      <pubDate>Tue, 21 Sep 2010 03:27:11 GMT</pubDate>
      <lastBuildDate>Tue, 21 Sep 2010 03:27:11 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/parallel/">并行处理</category>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>盛大创新院赞助第二届.NET技术交流会 - 各场演讲幻灯片</title>
      <link>http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-all-slides.html</link>
      <guid>http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-all-slides.html</guid>
      <description>&lt;p&gt;昨天有160多位朋友参加了&lt;a href="http://blog.zhaojie.me/2010/01/1651772.html"&gt;盛大创新院&lt;/a&gt;赞助的&lt;a href="http://blog.zhaojie.me/2010/08/2nd-snda-dotnet-conference-sign-up.html"&gt;第二届.NET技术交流会&lt;/a&gt;，再次感谢各位对我们的支持。比较遗憾的是，这次的讲师录像方面有着很大问题，我们正在想办法进行修补，希望可以有“差强人意”的结果。现在，大家请在第一时间浏览本次活动新鲜出炉的幻灯片。&lt;/p&gt;

&lt;h1&gt;响应式编程与响应式框架&lt;/h1&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/zhaojie.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/zhaojie.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;p&gt;讲师：赵劼，盛大创新院，研究员。关注前沿技术，并致力于开源社区与微软平台的组合优化。对函数式编程，并行程序开发，代码之美以及程序员能力与修养等相关问题也有着浓厚的兴趣，同时非常希望能够写程序到60岁。最近致力于F#，Scala语言及mono平台在社区中的推广。&lt;/p&gt;

&lt;p&gt;简介：异步编程改变了我们的编程方式，也为我们带来的许多挑战，同时让一些编程模型重新焕发了生机。与传统的“拉”模型不同，响应式编程将异步事件流视为可观察的集合，这是一种“推”模型。微软为了提高云时代的编程体验而设计了响应式框架，其目的是为了简化复杂事件处理之间混合操作。从中我们了解到一些异步编程的模式与LINQ使用技巧，并可以将这种编程模型普及到JavaScript等其他平台上去。&lt;/p&gt;

&lt;div style="width: 425px" id="__ss_5183111"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="响应式编程及框架" href="http://www.slideshare.net/jeffz/reactive-programming-and-framework"&gt;响应式编程及框架&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5183111" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rx-100912025913-phpapp01&amp;stripped_title=reactive-programming-and-framework" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5183111" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rx-100912025913-phpapp01&amp;stripped_title=reactive-programming-and-framework" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

  &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;相关下载：&lt;a href="http://files.zhaojie.me/slides/snda-dotnet-conf/20100911/rx-zhaojie.pdf"&gt;幻灯片&lt;/a&gt;、&lt;a href="http://files.zhaojie.me/slides/snda-dotnet-conf/20100911/rx-demo-zhaojie.zip"&gt;示例程序&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;大话程序员可用的算法&lt;/h1&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/chengshaofei.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/chengshaofei.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;p&gt;讲师：程劭非，盛大创新院，研究员。网名winter，无忧脚本版主。Web前端技术的积极倡导者。学生时代曾经热衷于参加ACM/ICPC。目前工作在Bambook电子书项目，主要负责文字排版和浏览器引擎WebKit相关。之前曾负责在Windows CE系统上的IE开发。&lt;/p&gt;

&lt;p&gt;简介：俗话说“数据结构+算法=程序”，算法是什么？算法书里满篇是看不懂的形式化推导，网上一些&amp;quot;高人&amp;quot;写的关于算法文章高深莫测，大公司面 试最让人讨厌的就是考算法题，“我做了这么多年，跟本在实际开发中就没用过算法！”，算法真的是距离我们如此遥远的东西吗？且听这回演讲， 算法究竟如何影响我们的开发。&lt;/p&gt;

&lt;div style="width: 425px" id="__ss_5183325"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="大话程序员可用的算法" href="http://www.slideshare.net/jeffz/programmers-and-algorithms"&gt;大话程序员可用的算法&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5183325" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-100912045100-phpapp01&amp;stripped_title=programmers-and-algorithms" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5183325" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-100912045100-phpapp01&amp;stripped_title=programmers-and-algorithms" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

  &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;相关下载：&lt;a href="http://files.zhaojie.me/slides/snda-dotnet-conf/20100911/algorithms-chengshaofei.pdf"&gt;幻灯片&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;Windows内核技术介绍&lt;/h1&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/panaimin.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/panaimin.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;p&gt;讲师：潘爱民，盛大创新院专家，微软学者，集团COO专家顾问。长期从事软件和系统技术的研究和开发工作，撰写了大量软件技术文章，并著译了多部经典计算机图书。在MSR/清华等从事多年科研工作，在北大和清华多年执教经验。数学学士学位和计算机科学博士，主要研究领域包括软件设计、信息安全、操作系统和Internet技术。&lt;/p&gt;

&lt;p&gt;简介：Windows操作系统经过二十年的发展，已臻成熟。Microsoft在推动Windows内核方面做了大量工作，譬如于2006年夏季向教育界开放了当时最为先进的内核源代码（Windows Research Kernel）。主讲者在这次讲座中，结合这些可利用的资源，分享对Windows内核研究的体会，尤其将重点讨论Windows中的I/O模型和环境子系统。&lt;/p&gt;

&lt;div style="width:425px" id="__ss_5183269"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/jeffz/win-os-kernel-tech" title="Windows内核技术介绍"&gt;Windows内核技术介绍&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5183269" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=winos-kernel-techforsnda2010-9-100912042602-phpapp01&amp;stripped_title=win-os-kernel-tech&amp;userName=jeffz" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5183269" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=winos-kernel-techforsnda2010-9-100912042602-phpapp01&amp;stripped_title=win-os-kernel-tech&amp;userName=jeffz" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;相关下载：&lt;a href="http://files.zhaojie.me/slides/snda-dotnet-conf/20100911/win-kernel-panaimin.pdf"&gt;幻灯片&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;面向对象与生活&lt;/h1&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/gaoxiang.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/gaoxiang.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;p&gt;讲师：高翔，5173.com&amp;#160; 项目经理。关注前沿技术和技术人员的非技术生活。对面向对象、模式和建模技术有浓厚兴趣，并对游戏设计和图形学方面也比较感兴趣。最近在学习F#，Lua以及关注一些关于职业生涯规划方面的话题。&lt;/p&gt;

&lt;p&gt;简介：面向对象这个话题虽然很热，但与哲学一样，很难给其一个很准确的定义。也因为如此，每个人对它都有自己的理解。本次演讲将从一个实际的例子出发，逐步引入面向对象的三个特征，结合对象的生命周期，以及基于事件的对象扩展方式等方面，探讨其与设计模式，与生活之间的联系。&lt;/p&gt;

&lt;div style="width: 425px" id="__ss_5183310"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="面向对象与生活" href="http://www.slideshare.net/jeffz/object-orientation-and-life"&gt;面向对象与生活&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5183310" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-100912044502-phpapp01&amp;stripped_title=object-orientation-and-life" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5183310" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-100912044502-phpapp01&amp;stripped_title=object-orientation-and-life" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

  &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;相关下载：&lt;a href="http://files.zhaojie.me/slides/snda-dotnet-conf/20100911/ooad-gaoxiang.pdf"&gt;幻灯片&lt;/a&gt;、附加资料“&lt;a href="http://files.zhaojie.me/slides/snda-dotnet-conf/20100911/%e4%b8%96%e7%95%8c%e7%9a%84%e5%ae%8f%e8%a7%82%e5%92%8c%e5%be%ae%e8%a7%82.pptx"&gt;世界的宏观和微观&lt;/a&gt;”&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/08/2nd-snda-dotnet-conference-sign-up.html"&gt;盛大创新院赞助第二届.NET技术交流会开始报名了！&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-is-coming.html"&gt;盛大创新院赞助第二届.NET技术交流会即将召开&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;盛大创新院赞助第二届.NET技术交流会 - 各场演讲幻灯片 &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-videos.html"&gt;盛大创新院赞助第二届.NET技术交流会 - 演讲录像及下载&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;盛大创新院赞助首届.NET技术交流会：&lt;a href="http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html"&gt;报名&lt;/a&gt;、&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-is-coming.html"&gt;预告&lt;/a&gt;、&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-all-slides.html"&gt;幻灯片&lt;/a&gt;、&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-videos.html"&gt;演讲录象及下载&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-all-slides.html#comments</comments>
      <pubDate>Sun, 12 Sep 2010 14:32:31 GMT</pubDate>
      <lastBuildDate>Sun, 19 Dec 2010 17:32:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/parallel/">并行处理</category>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>盛大创新院赞助第二届.NET技术交流会即将召开</title>
      <link>http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-is-coming.html</link>
      <guid>http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-is-coming.html</guid>
      <description>&lt;p&gt;由&lt;a href="http://blog.zhaojie.me/2010/01/1651772.html"&gt;盛大创新院&lt;/a&gt;赞助的第二届.NET技术大会将于9月11号下午1点召开，本次交流会请到了四位讲师，议题覆盖了响应式编程、算法、面向对象设计及Windows内核等多个方面，其中最为突出的莫过于由潘爱民老师为大家带来的Windows内核方面的话题。我已经看过了各场演讲的幻灯片终稿，也很期待各位讲师在正式演讲中的表现。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/conf-2-600x850.jpg" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/conf-2-600x850.jpg" width="300" /&gt;&lt;/a&gt; 

&lt;p&gt;本次大会中，我们还获得了人民邮电出版社&lt;a href="http://www.turingbook.com/Homepage/Default.aspx"&gt;图灵教育&lt;/a&gt;赠送的15册图书、数枚书签、几件T恤，再加上由会务经费购买的两本潘老师的著作，将会作为各场次的奖品，赠送给在交流会中表现积极的听众。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/turingbook.jpg" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/turingbook.jpg" width="300" /&gt;&lt;/a&gt; 

&lt;p&gt;同样，我们还请到了&lt;a href="http://www.ku6.com/"&gt;酷六网&lt;/a&gt;的专业摄影师对演讲过程进行全程拍摄，并配合各位讲师自身的屏幕录像，将在后期合成为适合独立观看的演讲视频（&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-videos.html"&gt;效果&lt;/a&gt;），让不能到场的朋友在线或是下载后观看。&lt;/p&gt;
&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/ku6-logo.jpg" /&gt; 

&lt;p&gt;最后，本次活动中我们还邀请了&lt;a href="http://renjian.com/"&gt;人间网&lt;/a&gt;为我们进行线上直播，我们会有专人负责直播信息的管理和发布。您也可以在活动现场，甚至在场外通过会场的无线网络或者短信发布消息。这些信息都会显示在会场的大屏幕上。&lt;/p&gt;
&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/renjian-logo.jpg" /&gt; 

&lt;p&gt;以下是直播效果：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/renjian-live-demo.jpg" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/renjian-live-demo.jpg" width="300" /&gt;&lt;/a&gt; 

&lt;p&gt;本次会议的邀请函已经发给各位报名者，请携带邀请函至会议现场签到，没有报名的朋友可以在现场直接报名。&lt;a href="http://blog.zhaojie.me/2010/08/2nd-snda-dotnet-conference-sign-up.html"&gt;关于会议的时间、地点、交通、议程等更多信息，请关注会议的报名信息&lt;/a&gt;。&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/08/2nd-snda-dotnet-conference-sign-up.html"&gt;盛大创新院赞助第二届.NET技术交流会开始报名了！&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;盛大创新院赞助第二届.NET技术交流会即将召开&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-all-slides.html"&gt;盛大创新院赞助第二届.NET技术交流会 - 各场演讲幻灯片&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-videos.html"&gt;盛大创新院赞助第二届.NET技术交流会 - 演讲录像及下载&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;盛大创新院赞助首届.NET技术交流会：&lt;a href="http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html"&gt;报名&lt;/a&gt;、&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-is-coming.html"&gt;预告&lt;/a&gt;、&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-all-slides.html"&gt;幻灯片&lt;/a&gt;、&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-videos.html"&gt;演讲录象及下载&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-is-coming.html#comments</comments>
      <pubDate>Thu, 09 Sep 2010 03:14:43 GMT</pubDate>
      <lastBuildDate>Thu, 09 Sep 2010 03:14:43 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/parallel/">并行处理</category>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>盛大创新院赞助第二届.NET技术交流会开始报名了！</title>
      <link>http://blog.zhaojie.me/2010/08/2nd-snda-dotnet-conference-sign-up.html</link>
      <guid>http://blog.zhaojie.me/2010/08/2nd-snda-dotnet-conference-sign-up.html</guid>
      <description>&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-in.png" /&gt; 

&lt;p&gt;自上次&lt;a href="http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html"&gt;盛大创新院&lt;/a&gt;赞助的&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-videos.html"&gt;首届.NET技术交流会&lt;/a&gt;到现在已经有两个月，这意味着按照原来的“一季一次”的计划也已经离第二次的活动不远了，考虑到9月份的中秋和国庆假期将工作日和休息日搞的支离破碎，于是交流会的时间会略微有些提前。第二届交流会的形式与上次相同，将为您献上四场高质量的技术演讲。当然这次在内容上有了新的尝试，除了引入了算法及面向对象设计的内容之外，这次更是请到了“传说中的大侠”为大家带来有关Windows内核的深度内容。&lt;font color="#ff0000"&gt;人数暂定为200人，事不宜迟，赶快报名吧&lt;/font&gt;。除了.NET社区的群众以外，也欢迎其他技术社区的朋友前来参与交流。事实上，我组织技术交流会的目的之一便是希望能够促进.NET社区与其他技术社区的交流及相互学习。&lt;/p&gt;

&lt;h1&gt;时间及议程安排&lt;/h1&gt;

&lt;p&gt;第二次交流会定于&lt;strong style="color: red"&gt;2010年9月11日&lt;/strong&gt;（周六）举行，具体时间及议程安排如下。本次依然安排了四场演讲，不过在内容上有了新的尝试：在与一些朋友和同事进行沟通之后，我决定在第二次交流会上引入与算法相关的议题，由创新院内部的ACM/ICPC达人来谈一下日常工作中的算法，如果您对于算法在工作的处境所有疑惑的话，这也是个共同探讨的好机会；此外，我也邀请了&lt;a href="http://www.5173.com/"&gt;5173.com&lt;/a&gt;的技术专家来讨论面向对象设计方面的问题，我看过他过去在内部演讲时使用的PPT，内容很充实；而这次的“重头戏”，便是请到了传说中的&lt;font color="#ff0000"&gt;潘爱民&lt;/font&gt;老师为大家演讲Windows内核方面的问题。潘老师是业界著名技术专家，不久前加入了盛大创新院，可谓“镇院之宝”。事实上，在9月初潘老师便会回到北京工作，而这次他也是为了交流会专门出差至上海，您怎能错过这次机会？&lt;/p&gt;

&lt;table style="text-align: center" border="1" cellspacing="0" cellpadding="5"&gt;&lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;时间&lt;/th&gt;

      &lt;th&gt;议程&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;12:30 ~ 13:00&lt;/td&gt;

      &lt;td&gt;签到&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;13:00 ~ 14:00&lt;/td&gt;

      &lt;td&gt;响应式编程与响应式框架&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;14:00 ~ 14:10&lt;/td&gt;

      &lt;td&gt;短休&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;14:10 ~ 15:10&lt;/td&gt;

      &lt;td&gt;大话程序员可用的算法&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;15:10 ~ 15:40&lt;/td&gt;

      &lt;td&gt;茶歇&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;15:40 ~ 16:40&lt;/td&gt;

      &lt;td&gt;面向对象与生活&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;16:40 ~ 16:50&lt;/td&gt;

      &lt;td&gt;短休&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;16:50 ~ 17: 50&lt;/td&gt;

      &lt;td&gt;Windows内核技术介绍&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;h1&gt;演讲内容&lt;/h1&gt;

&lt;p&gt;以下是关于四场演讲的详细描述。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/zhaojie.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/zhaojie.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;h2&gt;响应式编程与响应式框架&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;赵劼，盛大创新院，研究员。关注前沿技术，并致力于开源社区与微软平台的组合优化。对函数式编程，并行程序开发，代码之美以及程序员能力与修养等相关问题也有着浓厚的兴趣，同时非常希望能够写程序到60岁。最近致力于F#，Scala语言及mono平台在社区中的推广。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;异步编程改变了我们的编程方式，也为我们带来的许多挑战，同时让一些编程模型重新焕发了生机。与传统的“拉”模型不同，响应式编程将异步事件流视为可观察的集合，这是一种“推”模型。微软为了提高云时代的编程体验而设计了响应式框架，其目的是为了简化复杂事件处理之间混合操作。从中我们了解到一些异步编程的模式与LINQ使用技巧，并可以将这种编程模型普及到JavaScript等其他平台上去。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/chengshaofei.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/chengshaofei.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;h2&gt;大话程序员可用的算法&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;程劭非，盛大创新院，研究员。网名winter，无忧脚本版主。Web前端技术的积极倡导者。学生时代曾经热衷于参加ACM/ICPC。目前工作在Bambook电子书项目，主要负责文字排版和浏览器引擎WebKit相关。之前曾负责在Windows CE系统上的IE开发。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;俗话说“数据结构+算法=程序”，算法是什么？算法书里满篇是看不懂的形式化推导，网上一些&amp;quot;高人&amp;quot;写的关于算法文章高深莫测，大公司面 试最让人讨厌的就是考算法题，“我做了这么多年，跟本在实际开发中就没用过算法！”，算法真的是距离我们如此遥远的东西吗？且听这回演讲， 算法究竟如何影响我们的开发。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/gaoxiang.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/gaoxiang.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;h2&gt;面向对象与生活&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;高翔，5173.com&amp;#160; 项目经理。关注前沿技术和技术人员的非技术生活。对面向对象、模式和建模技术有浓厚兴趣，并对游戏设计和图形学方面也比较感兴趣。最近在学习F#，Lua以及关注一些关于职业生涯规划方面的话题。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;面向对象这个话题虽然很热，但与哲学一样，很难给其一个很准确的定义。也因为如此，每个人对它都有自己的理解。本次演讲将从一个实际的例子出发，逐步引入面向对象的三个特征，结合对象的生命周期，以及基于事件的对象扩展方式等方面，探讨其与设计模式，与生活之间的联系。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/panaimin.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/panaimin.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;h2&gt;Windows内核技术介绍&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;潘爱民，盛大创新院专家，微软学者，集团COO专家顾问。长期从事软件和系统技术的研究和开发工作，撰写了大量软件技术文章，并著译了多部经典计算机图书。在MSR/清华等从事多年科研工作，在北大和清华多年执教经验。数学学士学位和计算机科学博士，主要研究领域包括软件设计、信息安全、操作系统和Internet技术。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;Windows操作系统经过二十年的发展，已臻成熟。Microsoft在推动Windows内核方面做了大量工作，譬如于2006年夏季向教育界开放了当时最为先进的内核源代码（Windows Research Kernel）。主讲者在这次讲座中，结合这些可利用的资源，分享对Windows内核研究的体会，尤其将重点讨论Windows中的I/O模型和环境子系统。&lt;/p&gt;

&lt;h1&gt;地点&lt;/h1&gt;

&lt;p&gt;本次交流会举办地为&lt;strong style="color: red"&gt;上海市浦东新区碧波路888号畅星大厦&lt;/strong&gt;（地铁二号线张江高科站下，步行10分钟可达）3楼会议厅，地图如下：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-map.png"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-map.png" width="400" /&gt;&lt;/a&gt; 

&lt;p&gt;鸟瞰图：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-hybrid.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-hybrid.jpg" width="400" /&gt;&lt;/a&gt; 

&lt;p&gt;畅星大厦外观：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-building.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-building.jpg" width="400" /&gt;&lt;/a&gt; 

&lt;p&gt;会场实景照片：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-room.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-room.jpg" width="400" /&gt;&lt;/a&gt; 

&lt;p&gt;会场容量可以容纳超过200人，希望到时候不会显得太过空旷。:)&lt;/p&gt;

&lt;h1&gt;报名信息&lt;/h1&gt;
&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/sign-up-now.jpg" /&gt; 

&lt;p&gt;本次交流会&lt;a href="http://www.diaochapai.com/survey504720"&gt;现已开始报名，请填写报名表&lt;/a&gt;，&lt;strike&gt;报名截止日期为2010年9月5日&lt;/strike&gt;人数已满，多谢大家支持。&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;盛大创新院赞助第二届.NET技术交流会开始报名了！ &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-is-coming.html"&gt;盛大创新院赞助第二届.NET技术交流会即将召开&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-all-slides.html"&gt;盛大创新院赞助第二届.NET技术交流会 - 各场演讲幻灯片&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/09/2nd-snda-dotnet-conference-videos.html"&gt;盛大创新院赞助第二届.NET技术交流会 - 演讲录像及下载&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;盛大创新院赞助首届.NET技术交流会：&lt;a href="http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html"&gt;报名&lt;/a&gt;、&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-is-coming.html"&gt;预告&lt;/a&gt;、&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-all-slides.html"&gt;幻灯片&lt;/a&gt;、&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-videos.html"&gt;演讲录象及下载&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/08/2nd-snda-dotnet-conference-sign-up.html#comments</comments>
      <pubDate>Mon, 16 Aug 2010 03:02:30 GMT</pubDate>
      <lastBuildDate>Mon, 16 Aug 2010 03:02:30 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/dotnet/">.Net框架</category>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>NDC 2010视频下载：看看其他微软平台程序员们都在做什么</title>
      <link>http://blog.zhaojie.me/2010/07/ndc-2010-videos.html</link>
      <guid>http://blog.zhaojie.me/2010/07/ndc-2010-videos.html</guid>
      <description>&lt;p&gt;&lt;a href="http://www.ndc2010.no/"&gt;NDC&lt;/a&gt;（Norwegian Developers Conference，挪威开发者大会）是一年一度的挪威最大的微软平台开发者大会，&lt;a href="http://www.ndc2010.no/agenda.aspx?cat=1071"&gt;内容丰富&lt;/a&gt;，&lt;a href="http://www.ndc2010.no/index.aspx?cat=1070"&gt;讲师阵容强大&lt;/a&gt;。NDC与&lt;a href="http://blog.zhaojie.me/2009/11/videos-of-pdc09-algorithms-data-structure-visual-studio-documentary.html"&gt;PDC&lt;/a&gt;同为高端技术会议，但NDC与PDC的不同之处在于，PDC是微软官方会议，主要是面向微软资深产品的深入探讨。而NDC涉及的内容则广泛的多，包括了我所感兴趣的Java、Mono、IronRuby/Ruby on Rails、NoSQL方面的内容。这也就像我一直强调的那样，微软技术社区非常开放，微软平台上的太多程序员都能够非常热情地拥抱其他平台的技术。那些认为微软技术社区是井底之蛙的兄弟，殊不知&lt;a href="http://blog.zhaojie.me/2010/03/microsoft-technology-and-the-attitude.html"&gt;你们的嘲笑只能体现出自身的狭隘&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;总而言之，NDC是我理想中的微软平台技术大会。&lt;/p&gt;

&lt;p&gt;如今&lt;a href="http://streaming.ndc2010.no/tcs/"&gt;NDC 2010的视频已经全部公开&lt;/a&gt;，可以在线观看（使用Silverlight），也可以下载。为了便于大家浏览和下载，我写了一段小程序整理出了所有的视频简介以及下载链接，共计123条，&lt;a onclick="$(&amp;#39;#ndc-video-list&amp;#39;).show(); return false;" href="#"&gt;请点击这里&lt;/a&gt;。&lt;/p&gt;

&lt;table style="display:none;" id="ndc-video-list" border="1" cellspacing="0" cellpadding="5"&gt;&lt;tbody&gt;
    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/919676F9-9BEB-4370-B9CA-F7EADB515143/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=919676F9-9BEB-4370-B9CA-F7EADB515143" target="_blank"&gt;Fubu MVC 18 Jun 10 4:20 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;FubuMVC is an open source framework for web development using the ModelView Controller (MVC) pattern. FubuMVC is built in C# and depends on theSystem.Web.Routing subsystem of the base CLR, but has no dependency on the ASP.Net MVC framework. In this talk I will highlight the architectural design of FubuMVC, how it works and more importantly the reasoning behind it. I will not make this into a comparison match with ASP.NET MVC, but there are so many interesting patterns being used in the FubuMVC code base that in its self should make this a very interesting talk. The FubuMVC code base has been an example for many others even in different areas outside of web development.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/0F6607A2-4202-451C-95C6-51A3BC10D907"&gt;iPod Video 320x240 (71 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/32DA3486-A0A7-4561-9CC7-2D624E325E51"&gt;MPEG-4 for QuickTime Medium 1280x480 (330.7 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/A065D732-92B5-4965-A8E8-B91491B0D796/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=A065D732-92B5-4965-A8E8-B91491B0D796" target="_blank"&gt;Leading a Self-Organizing Team 18 Jun 10 3:20 PM&lt;/a&gt;&lt;/p&gt;

        

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/D348B96D-330E-4453-B6B2-81EA2873C22E"&gt;iPod Video 320x240 (147.7 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/88A55AE0-6276-4980-8780-E2B38B78C5D6"&gt;MPEG-4 for QuickTime Medium 1280x480 (395.2 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/42B4E3B9-C0D3-4C34-AA29-115C5D322CF9/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=42B4E3B9-C0D3-4C34-AA29-115C5D322CF9" target="_blank"&gt;State vs. Interaction Testing 18 Jun 10 3:19 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Mocking frameworks allow you to stub out behaviour in order to perform tests of individual peices of functionality in isolation. However, there are times when performing certain actions and assert a result is not sufficient. In this session we will drill deep into unit testing and explain the differences between state and interaction-based testing. We will examine the role of stubs versus mocks and how to correctly write unit tests that are not fragile or counter-productive.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/09EA0A40-8964-4677-83F2-F315E7DF73FC"&gt;iPod Video 320x240 (94.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/7579BDFE-7278-44D3-A4DB-598770BDCCDB"&gt;MPEG-4 for QuickTime Medium 1280x480 (349.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/575B06E8-755D-41B6-BC8A-22908491B66D/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=575B06E8-755D-41B6-BC8A-22908491B66D" target="_blank"&gt;Bridging code between Java &amp;amp; .NET 18 Jun 10 3:18 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Frustrated .NET developer forced to work with old, boring java? Or are you a java developer having to work with the incompatible and evil .NET technology? With IVKM.NET you can compile your java byte code to the .NET IL and run your favorite java code on .NET and maybe even your Java applications will run faster under IVKM.NET than under SUNs JVM? We take a look at IKVM.NET and how it can be used to bridge your java libraries to your .NET application and the other way around, reusing .NET APIs in your java code. We also show how to use IVKM.NET for creating java-stubs from already existing .NET libraries in order to access your .NET code in java.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/ECD741DD-BD17-4960-A3BA-957E788AA8A8"&gt;iPod Video 320x240 (120.1 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/EC41B80B-D810-40E8-8B18-03EEA09A369B"&gt;MPEG-4 for QuickTime Medium 1280x480 (410.8 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/A4176987-8DF0-491F-B25E-951925F755C3/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=A4176987-8DF0-491F-B25E-951925F755C3" target="_blank"&gt;Rough Cuts in Legacy Code 18 Jun 10 3:17 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Getting legacy code under test is hard, particularly when it is deeply intertwined. In some of the worst code bases, there are no real components, the code is just one large soup.In this session, Michael Feathers will describe a series of strategies and techniques that you can use to separate clusters of classes from your application, characterize them and write tests for them to enable deterministic change.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/732E92BE-DE16-4516-8EF9-2F2FE0852B58"&gt;iPod Video 320x240 (57 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/1D23F326-1241-4350-B873-74F799AA53F3"&gt;MPEG-4 for QuickTime Medium 1280x480 (223.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/6118D38B-9A20-4601-A470-1752FFE1BF30/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=6118D38B-9A20-4601-A470-1752FFE1BF30" target="_blank"&gt;The SharePoint 2010 Business Intelligence Soup 18 Jun 10 4:17 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;SharePoint 2010 has rich BI capabilities, much more enhanced than what SharePoint 2007 provided. Did you try using SharePoint 2007 as a BI delivery mechanism? How was the experience? Was it too difficult to setup? Did you feel you were limited on the lines of performance, capabilities, diagnosis ability? Did you think the featureset was great, and made for good demos ?C but delivering real solutions was a whole another story? Well is SharePoint 2010 any better? Come over and let??s talk about it. In this session, Sahil will talk about the various BI specific improvements in SharePoint 2010, with specific emphasis on what is new compared to SharePoint 2007.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/1CBBCF81-6F06-410A-AA7A-53C8609D1A01"&gt;iPod Video 320x240 (131.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/C5CBFADF-B8BA-4616-881C-141F39440053"&gt;MPEG-4 for QuickTime Medium 1280x480 (606.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/DDE1EF15-1290-4AD8-B8F5-E7B3EBF6B61B/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=DDE1EF15-1290-4AD8-B8F5-E7B3EBF6B61B" target="_blank"&gt;LINQ - Beyond Queries18 Jun 10 4:14 PM&lt;/a&gt;&lt;/p&gt;

        

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/FB02936E-A742-42FB-9510-4BBA680C3B5D"&gt;iPod Video 320x240 (115.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/B6530547-1CFB-4D80-AF39-F01FFCB5A0F8"&gt;MPEG-4 for QuickTime Medium 1280x480 (523.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/66BF46DF-0BB6-4A52-831C-28165F048D6E/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=66BF46DF-0BB6-4A52-831C-28165F048D6E" target="_blank"&gt;Scaling Agile to Work with a Distributed Team 18 Jun 10 2:00 PM&lt;/a&gt;&lt;/p&gt;

        

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/F8E1F30D-6377-447A-BB02-6E1CE27D377C"&gt;iPod Video 320x240 (145.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/0299E29A-0D32-42D1-B5BE-491F0C358D2F"&gt;MPEG-4 for QuickTime Medium 1280x480 (398.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/C95AB956-D65D-4F80-A75D-84E48767D061/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=C95AB956-D65D-4F80-A75D-84E48767D061" target="_blank"&gt;Get Your Business Out of My Face: Legacy Refactorings for Testable User Interface Code 18 Jun 10 1:58 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Traditional acceptance testing works at the front-end of a fully-integrated system. There is a need for this kind of testing, however the need accounts for a comparatively small amount of the overall checking you should do on your system. Unfortunately, effectively checking your system requires some basic design principles, which are typically not applied.This session will give you an idea of the kinds of design changes you?ll need to make to improve the testability of your system through a demonstration of legacy refactoring techniques targeted at getting business logic out of UI code.This session will be code-driven. I?ll begin with some example code, displayed for the audience. We will begin by writing automated tests to verify some of the business logic leaving the code as is.After writing a few tests, we will review the pros and cons of the testing approach.I will then provide a few basic design principles that apply to the particular situation: dependency inversion principle, single responsibility principle, not mixing enabling code with business logic.We will then make some ?obvious? legacy refactorings, done badly. Review the results. This first round will be an application of the Single Responsibility Principle. Then we will discuss the Dependency Inversion Principle and do the refactoring more effectively.We will continue with a comparison of the first tests with their final form and the first version of the business logic with the refactored version. We will review&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E3458620-1B2B-422A-87D6-93D58736580D"&gt;iPod Video 320x240 (92.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/7D609906-A58D-4543-BFFF-11C0223E1723"&gt;MPEG-4 for QuickTime Medium 1280x480 (396.8 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/94B33824-779E-44D9-803B-BE462815A5D5/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=94B33824-779E-44D9-803B-BE462815A5D5" target="_blank"&gt;No Source Code, No Problem - Reverse Code Engineering in Product Development 18 Jun 10 2:58 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Reverse Code Engineering (RCE) is commonly applied to solve security-related challenges. It is all about understanding the behavior of software without access to its source code. This often means studying low-level machine code generated from a higher level language like C or C++. Such translation is lossy and highly architecture and compiler dependent, which makes going in the reverse direction quite challenging.In this talk I'm going to discuss RCE from a product development perspective, where interoperability with platform-specific undocumented APIs could be a necessity. First some background including practical examples of key challenges solved by RCE from my own experience, followed by a live demonstration of some tools and techniques.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/8E8FAC98-DC07-4CF3-955C-8003D05E35EE"&gt;iPod Video 320x240 (182.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/DD5BD460-8404-4535-B640-28797F6257C9"&gt;MPEG-4 for QuickTime Medium 1280x480 (735.8 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/C44B65E2-980B-4406-B2AB-3E079E5CA804/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=C44B65E2-980B-4406-B2AB-3E079E5CA804" target="_blank"&gt;Collaboration in ABB - from drawing board to real-life solution using SharePoint 2010 18 Jun 10 2:57 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;ABB is a global leader in power and automation technologies, operates in around 100 countries and employs about 117,000 people. ABB's global intranet is a complex and highly tailored solution containing several hundred thousand pages in more than fifty country sites. The intranet was named one of "The Ten Best Intranets of the Year" by Nielsen Norman Group in 2002, but the general concept of the intranet has not evolved substantially since then. For several years ABB worked on new concepts for making the intranet more valuable to users, by increasing findability, quality of content and opportunities for collaboration. Late last year, SharePoint 2010 was selected as the technical platform to achieve these goals. This talk will outline the collaboration concept that ABB envisioned, and what happened when the concept from the drawing board met the real-life platform SharePoint 2010. The talk will focus on the "social" aspects of the solution such as profiles, networking with colleagues, sharing of information through status updates, activity feeds, social tagging and commenting. It will describe, feature by feature, which parts of SharePoint were used as they are, and which were tailored to achieve a more interactive and collaborative intranet for ABB. The talk will focus both on functionality and on hands-on technical implementation.The speakers will share their experiences of what worked well and what not in terms of conceptual design, development of improved or new social fea&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/6AC313B1-389D-4BB2-80E1-7D682CF30D1B"&gt;iPod Video 320x240 (131.9 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/480C2CC2-DDBF-4198-8924-37573ED287AA"&gt;MPEG-4 for QuickTime Medium 1280x480 (614.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/6F6790C2-BB0F-46C8-8373-E00341777A59/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=6F6790C2-BB0F-46C8-8373-E00341777A59" target="_blank"&gt;Creating Web Sites with Open Rasta 18 Jun 10 2:57 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;OpenRasta is a framework built from the ground?Cup to unleash the power of HTTP. Be it web sites, forms or web services, OpenRasta lets you build your application quickly and efficiently, without the hassle of complicated APIs and god objects.
          &lt;br&gt;Come and discover why OpenRasta is the most talked about ReST framework on .net, and how it can help you deliver better, more http?Cfriendly systems.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/BE49FF2E-99C2-4BFC-9EDF-60AF8991AC65"&gt;iPod Video 320x240 (137 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/2B25C121-C445-432A-9742-CE0AA63CE664"&gt;MPEG-4 for QuickTime Medium 1280x480 (679.4 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/002F9CBC-CBED-4D71-83A5-08C0EBED02BC/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=002F9CBC-CBED-4D71-83A5-08C0EBED02BC" target="_blank"&gt;Product Development in TANDBERG 18 Jun 10 1:57 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;TANDBERG has never cared much about documentation, procedures, methodologies and risk reduction. However, we do care very much about our culture and our principles. This has enabled us to outperform all competition in the video conferencing and telepresence market during the last decade.In retrospect, we realize that TANDBERG has for 10-15 years built a culture that is quite compatible with Agile and Lean ideas.This talk will give a glimpse into how we do product development in TANDBERG R&amp;amp;D at Lysaker. I will show an example of how we developed a particular product with emphasis on software development, before I dive into the principles that we follow.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E1EDF859-7EFB-43CC-829A-C75532A0AD85"&gt;iPod Video 320x240 (112.7 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/8C9D31C1-411E-4E03-8F27-470D592ABDCB"&gt;MPEG-4 for QuickTime Medium 1280x480 (320.4 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/4AC3CE10-48E7-476B-9238-D7FC946DB8E3/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=4AC3CE10-48E7-476B-9238-D7FC946DB8E3" target="_blank"&gt;Clean Code III: Functions 18 Jun 10 1:51 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Get ready for a challenge as Robert Martin dives deep into the topic of clean Java code by examining what makes a good function. In this talk you will look at a lot of code; some good and some bad. You will experience how such code is analyzed, critiqued, and eventually refactored. You will understand the decisions made by an expert in the field as bad code is gradually transformed into good code. How big should a function be? How should it be named? How should it be documented. How many indent levels should it have? How should it deal with exceptions, arguments, and return values. This talk is all about code at the lowest level. And yet the principles and techniques presented have far reaching implications.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E2EEF5A5-8421-4818-9CA1-7A3F15484378"&gt;iPod Video 320x240 (149 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/AF569962-C936-4542-9461-B51C4F6CAF86"&gt;MPEG-4 for QuickTime Medium 1280x480 (449.2 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/6EB9A2DD-E1F2-4E90-9DAE-E4BDA2FF7A8D/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=6EB9A2DD-E1F2-4E90-9DAE-E4BDA2FF7A8D" target="_blank"&gt;Advanced Topics in Agile Planning 18 Jun 10 12:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Velocity is perhaps the most useful metric available to agile teams. In this session we will look at advanced uses of velocity for planning under special but common circumstances. We will see how to forecast velocity in the complete absence of any historical data. We will look at how a new team can forecast velocity by looking at other teams. We will see how to predict the velocity of a team that will grow or shrink in size. Most importantly we will look at the use of confidence intervals to create plans we can be 90% confident in, even on fixed-price or fixed-date contracts.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E449FDDF-8954-4445-8539-9882B3D6276B"&gt;iPod Video 320x240 (143.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/721E1266-5F00-489A-B262-1BFEA4605EC5"&gt;MPEG-4 for QuickTime Medium 1280x480 (396.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/9147ECD9-4F4B-48B2-95E6-B2602BDA37B0/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=9147ECD9-4F4B-48B2-95E6-B2602BDA37B0" target="_blank"&gt;SharePoint 2010 - Is it Scalable or not? 18 Jun 10 12:38 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;If there is any topic that has generated more debate, it is the scalability of SharePoint lists and document libraries. In this session, Sahil will talk about the new and improved details around the scalability, and performance aspects of SharePoint 2010. Topics covered will include List management infrastructure, content database schema improvements, and RBS capabilities, with practical gotchas and things to watch out for.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/FA1C656E-F92E-48D3-8CF9-52B8A970CDFC"&gt;iPod Video 320x240 (98 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E09DE432-8F2D-447D-BE34-046D99A5C4DE"&gt;MPEG-4 for QuickTime Medium 640x480 (186 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/2E806A0F-059E-4D8C-B47C-F2D30B1FAFB4/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=2E806A0F-059E-4D8C-B47C-F2D30B1FAFB4" target="_blank"&gt;Aspect Oriented Programming: Learning by Re-Invention 18 Jun 10 1:38 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;This talk aims to provide an in-depth understanding of the concept of Aspect Oriented Programming and how an AOP framework does what it does, by taking the audience through the implementation of (a simple) one from scratch.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/B38D034D-864A-4D51-8021-9DA3875EEC83"&gt;iPod Video 320x240 (154.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/BDA7204A-2953-42D7-A096-785D4A693CC4"&gt;MPEG-4 for QuickTime Medium 1280x480 (616.3 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/9FC4E2E6-9A9F-49C0-803B-A91E6AF41312/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=9FC4E2E6-9A9F-49C0-803B-A91E6AF41312" target="_blank"&gt;Agile Release Strategy 18 Jun 10 12:37 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Releasing often is probably the most important practice in agile development. In many projects it can also be the hardest practice. This talk will give you hands on advice on how to reliably reduce your release cycle.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/3992E103-507B-4D1D-A391-9689F886B062"&gt;iPod Video 320x240 (62.9 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/9B396E05-C208-4E56-9351-95480160831F"&gt;MPEG-4 for QuickTime Medium 1280x480 (244.9 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/C6611670-4B70-42B3-9C2B-86D576338350/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=C6611670-4B70-42B3-9C2B-86D576338350" target="_blank"&gt;Testing C# and ASP.NET Applications with Ruby 18 Jun 10 1:37 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;With the reach and diversity of different programming languages andparadigms at the moment, it's possible to use the appropriate languagefor the appropriate task. In my case, I develop applications using C# but test the code using Ruby. The Ruby community has always understood the importance of testing. They strive to make applications more testable while improving the approaches and tools they use. As aresult, they have created some amazing frameworks and a series of best practices to support testing. While this is great for Ruby developers, C# and ASP.net developers can take full advantage for their own applications. This session provides an insight into the Ruby world and how you can take advantage to create readable, maintainable and valuable tests for ASP.net based web applications, from the business logic up to the user interface. Taken from my own experiences of using this approach, the session will demonstrate how to integrate Ruby frameworks such as RSpec and Cucumber into your application development cycle, and how different frameworks combined with Ruby can solve a number of problems traditionally faced when using C#. There will also be discussionaround IronRuby and JRuby and their implications for the future andthe future of Testing ASP.net applications in general.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E6ED8E7D-AC7B-41EE-A43E-AC43DA25AAE7"&gt;iPod Video 320x240 (98.4 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/C547E00D-FB1A-4E07-AD76-AF4EEE00FEE3"&gt;MPEG-4 for QuickTime Medium 1280x480 (523.3 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/8FFAC6DC-C74E-4001-9908-9B3188A4569D/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=8FFAC6DC-C74E-4001-9908-9B3188A4569D" target="_blank"&gt;The Art of the Method 18 Jun 10 12:35 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Have you ever looked at a method or function in someone else's code and felt that you've seen it before? Methods don't come in infinite varieties. There are some very common structural and semantic patterns which recur in code. Some of them occur because teams have adopted good coding and design conventions. others occur because methods tend to fall apart and degrade in similar ways.In this session, Michael Feathers will name and describe various types of methods seen in the field and talk about how a nomenclature for these methods can simplify and focus design.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/4C88314B-CE08-4159-81D5-B67E15A7482A"&gt;iPod Video 320x240 (75.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/90C5D5F4-746A-4ADF-AD7B-A68739368E7D"&gt;MPEG-4 for QuickTime Medium 1280x480 (285.2 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/44950364-77F8-49AA-91D7-13441F398DD0/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=44950364-77F8-49AA-91D7-13441F398DD0" target="_blank"&gt;ASP.NET MVC vs Ruby on Rails - The .NET Rocks Smackdown 18 Jun 10 1:18 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Shay Friedman's comparison of ASP.NET MVC and Ruby on Rails gets redesigned for an NDC 2010 exclusive.
          &lt;br&gt;Carl Franklin and Richard Campbell joins in and moderates a smackdown between the two leading web frameworks featuring Rob Conery, Chris Hardy, Hadi Hariri, Scott Bellware and of course Shay Friedman.

          &lt;br&gt;This is you're chance to be part of a lively discussion which will be broadcasted on the leading .NET talkshow .NET Rocks this summer.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/66253B2B-7E0B-4986-8751-6EAA21110681"&gt;iPod Video 320x240 (286.4 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/D470DFFF-AB8F-4409-BE2A-389107460641"&gt;MPEG-4 for QuickTime Medium 320x240 (209 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/A8883298-AAF9-4E5A-91B1-2F7A31241F34/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=A8883298-AAF9-4E5A-91B1-2F7A31241F34" target="_blank"&gt;Spark Deep Dive 18 Jun 10 11:40 AM&lt;/a&gt;&lt;/p&gt;

        

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/7CFA11A7-6E2B-40C7-BC36-5E9F46D4EE04"&gt;iPod Video 320x240 (173.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/A899D0DA-E3C0-4885-9312-1D71C8AD8E08"&gt;MPEG-4 for QuickTime Medium 1280x480 (619.7 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/4DE02ACE-8B75-4807-B135-5B0E260FEEDC/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=4DE02ACE-8B75-4807-B135-5B0E260FEEDC" target="_blank"&gt;SharePoint 2010 - Business Connectivity Services 18 Jun 10 10:39 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Business connectivity services, now enables you to bring external data into SharePoint and office with full CRUD (Create/Retrieve/Update/Delete) capabilities. This talk explains BCS in SharePoint 2010 in an end-to-end fashion, covering from the browser, through SPD, to the Visual Studio 2010 story&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/A3C836AF-7328-41BB-80AE-420F7D70858D"&gt;iPod Video 320x240 (95.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/065C76BD-1683-49B1-93A3-5E28FB50C9CE"&gt;MPEG-4 for QuickTime Medium 1280x480 (442.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/222F58E0-D553-456A-B76F-BA566D351145/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=222F58E0-D553-456A-B76F-BA566D351145" target="_blank"&gt;Agile Estimating 18 Jun 10 10:38 AM&lt;/a&gt;&lt;/p&gt;

        

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/71E23FCC-FDDC-4ED6-8546-FC2E85273F16"&gt;iPod Video 320x240 (126.5 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/32B1EDB6-92AF-432C-9EA1-E92CF0B9F518"&gt;MPEG-4 for QuickTime Medium 1280x480 (247.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/A8B70AC9-947E-49B1-AC5C-53F63CFD89BB/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=A8B70AC9-947E-49B1-AC5C-53F63CFD89BB" target="_blank"&gt;Using ReST to design a better OData 18 Jun 10 11:40 AM&lt;/a&gt;&lt;/p&gt;

        

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E68630A5-D7F6-4FF9-8DEC-1D260FBBB520"&gt;iPod Video 320x240 (162.9 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/57133307-C4DA-4CF0-A548-28ED270F03FE"&gt;MPEG-4 for QuickTime Medium 1280x480 (777.7 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/DCFE1E9A-6DFA-4AFD-BA77-42C534E3894E/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=DCFE1E9A-6DFA-4AFD-BA77-42C534E3894E" target="_blank"&gt;Code Contracts 18 Jun 10 11:36 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Code Contracts are a new feature of .NET 4 and present themselves as a way of greatly simplifying our code by using the concepts of Design by contract. In this talk we will cover the basics of Code Contracts and see how they can be used in real-world applications, how they can be tested, and see if they are all they are cut out to be.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/DCA3C0F8-139F-4E98-AFBD-AB98491FAFB8"&gt;iPod Video 320x240 (139.5 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/EBD4AE5C-F5F7-4281-B8CE-5D34098C9E69"&gt;MPEG-4 for QuickTime Medium 1280x480 (633 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/AD824D8A-F579-4CF1-9A7D-B167CC11076A/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=AD824D8A-F579-4CF1-9A7D-B167CC11076A" target="_blank"&gt;Clean Code I: Arguments 18 Jun 10 10:35 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Keeping code clean is a simple matter of professional ethics. In this talk Robert Martin shows how a Java module can start clean, grow to become messy, and then be refactored back to cleanliness. Be forewarned: his tutorial is about CODE. We will put code on the screen and we will read and critique it. And then, one tiny step at a time, we will clean it. In this tutorial you will participate in the step by step improvement of a module. You will see the techniques of the Prime Directive (Never Be Blocked), and Agile Design Principles brought into play. You will witness the decision making process that Agile Developers employ to write code that is expressive, flexible, and clean. Finally, you learn an attitude of professional ethics that defines the software developer??s craft.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/3D8BC681-77E2-4581-B7C5-CFE60A0FE4B9"&gt;iPod Video 320x240 (111.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/89664554-99D7-44E5-A2B6-CDA9396C9411"&gt;MPEG-4 for QuickTime Medium 1280x480 (309.4 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/E524650B-F5BD-4450-8B39-502AAD7FC053/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=E524650B-F5BD-4450-8B39-502AAD7FC053" target="_blank"&gt;The Deep Synergy Between Testability and Good Design 18 Jun 10 10:34 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Many people moan about it the fact that their code is hard to test. They hack their code to make it testable and then they moan some more about how unit testing is an irritant, it makes code ugly. The fact of the matter is, it isn't true. There's a deep synergy between testability and good design. All of the pain that we feel when writing unit tests points at underlying design problems. In this session, Michael Feathers will, through a series of examples, show how you can use testability challenges to reconsider and improve your design.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/FAB20016-6162-4712-9868-41656B8976B2"&gt;iPod Video 320x240 (79.4 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/C1FD8E8B-5010-4F4E-A8B9-556BF8293189"&gt;MPEG-4 for QuickTime Medium 1280x480 (283.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/9DE90613-B2A2-4C0C-ADCC-DFC72E45D087/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=9DE90613-B2A2-4C0C-ADCC-DFC72E45D087" target="_blank"&gt;User Stories for Agile Requirements 18 Jun 10 9:20 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;The technique of expressing requirements as user stories is one of the most broadly applicable techniques introduced by the agile processes. User stories are an effective approach on all time constrained projects and are a great way to begin introducing a bit of agility to your projects. In this session, we will look at how to identify and write good user stories. The class will describe the six attributes that good stories should exhibit and present thirteen guidelines for writing better stories. We will explore how user role modeling can help when gathering a project??s initial stories. Because requirements touch all job functions on a development project, this tutorial will be equally suited for analysts, customers, testers, programmers, managers, or anyone involved in a software development project. By the end of this tutorial, you will leave knowing the six attributes of a good story, learn a good format for writing most user stories, learn practical techniques for gathering user stories, know how much work to do up-front and how much to do just-in-time.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/B70ECBFF-9581-4A1E-B56B-F8BB02428B8F"&gt;iPod Video 320x240 (132.4 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/DC45E89C-7FF6-4BE2-B7D3-20D1B0322C83"&gt;MPEG-4 for QuickTime Medium 1280x480 (340.9 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/E241ACE5-D26B-41FA-8FA1-FBB3AD8DF5B3/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=E241ACE5-D26B-41FA-8FA1-FBB3AD8DF5B3" target="_blank"&gt;The Solid Principles of OO &amp;amp; Agile Design 18 Jun 10 9:19 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;What happens to software? Why does is rot over time? How does an Agile development team prevent this rot, and prevent good designs from becoming legacy code? How can we be sure our designs are good in the first place? This class presents the agile S.O.L.I.D. principles for designing object oriented class structures. These principles govern the structure and interdependencies between classes in large object oriented systems. The principles include: The Open Closed Principle, The Liskov Substitution Principle, and the Dependency Inversion Principle, among others.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/07841105-200B-4F85-BCAD-FFFF1F82D407"&gt;iPod Video 320x240 (140 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/3F8944E1-F57B-46AA-83CD-37E5297245A8"&gt;MPEG-4 for QuickTime Medium 1280x480 (579.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/FEAA8270-AA9A-49CC-8CEA-ECB47B238F13/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=FEAA8270-AA9A-49CC-8CEA-ECB47B238F13" target="_blank"&gt;Being an effective team leader 18 Jun 10 9:18 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;In this talk we'll review practices and principles that make good team leaders into great ones. from basic communication and influencing skills to essential day to day practices and things to look out for - this is a session every team lead should be interested in.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/5919CA3D-88CB-47FD-A289-3BAF710976C7"&gt;iPod Video 320x240 (108.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/896ED493-B83B-452E-8FCA-1FF2A066CB64"&gt;MPEG-4 for QuickTime Medium 1280x480 (509.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/4087616A-3B88-4DA5-9B9E-CE2FE2887F09/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=4087616A-3B88-4DA5-9B9E-CE2FE2887F09" target="_blank"&gt;The Dependency Inversion Principle Applied 18 Jun 10 10:17 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;This is a talk which aims to explain the Dependency Inversion Principle in practice. It is not a one hour theoretical explanation of what the principle states, but rather a real life demonstration of how it becomes a natural pattern to apply in the pursuit of a clean, maintainable design within the boundaries of a statically typed language. This is a ??code and commentary?? talk, with virtually no slides. Though the code demonstrated is C#, this is not a technology-specific talk.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/A6038941-AC88-4CA4-B61A-2101789D0805"&gt;iPod Video 320x240 (154.6 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/C1070B19-4AFE-433E-A326-54ADEDE09AE4"&gt;MPEG-4 for QuickTime Medium 1280x480 (637 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/D8EC7885-B8D2-447B-AE10-DF5FAE0F626D/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=D8EC7885-B8D2-447B-AE10-DF5FAE0F626D" target="_blank"&gt;Testable C# 18 Jun 10 9:16 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Unit testing is valuable, but it's hard to go very far with it without realizing that sometimes languages make it easy and sometimes they make it hard. In this code rich presentation, Michael Feathers will present a series of testability traps in the C# language: features and ways of using them which make unit testing impossible without specialized tooling. He will also present a simple rule along with supporting concepts that you can use to sidestep all of them and produce C# code which is always easily testable.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/56B0175F-14F2-43D6-93C5-3703F4641F8C"&gt;iPod Video 320x240 (22.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/59C524C6-4073-482D-8196-C980B1DD2574"&gt;MPEG-4 for QuickTime Medium 1280x480 (234.8 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/74F9C23C-BCF0-4863-9968-BB53C3C677D5/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=74F9C23C-BCF0-4863-9968-BB53C3C677D5" target="_blank"&gt;Developing Testable Web Parts for SharePoint 18 Jun 10 10:15 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;The development of components for use in SharePoint is a complex process, and often seems to fly in the face of what is considered good development practice in a Test Driven Development world.In this session I will show how using some good design practices and tools such as Typemock Isolator you can develop testable components for SharePoint (2007 &amp;amp; 2010); often without even having to have SharePoint on your development PC.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/5EA24C36-8D98-4AEA-9278-6954AD28850A"&gt;iPod Video 320x240 (145.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/72B7DC54-080D-4A61-85F4-48BE0C7ABD9A"&gt;MPEG-4 for QuickTime Medium 1280x480 (702.8 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/22ECAB7E-431D-4CAF-813D-DC3B36BFA601/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=22ECAB7E-431D-4CAF-813D-DC3B36BFA601" target="_blank"&gt;Introducing Spark View Engine 18 Jun 10 10:08 AM&lt;/a&gt;&lt;/p&gt;

        

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/6AB73F67-5C72-402F-BBC5-BEDA93CB6DB2"&gt;iPod Video 320x240 (134.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/8B98994B-2226-4774-86DA-3585F6C72EC3"&gt;MPEG-4 for QuickTime Medium 1280x480 (481.9 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/62309161-262E-44BA-BDA0-B5653698089B/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=62309161-262E-44BA-BDA0-B5653698089B" target="_blank"&gt;Getting Agile with Scrum 18 Jun 10 8:00 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Scrum is one of the leading agile software development processes. Over 12,000 project managers have become certified to run Scrum projects . Since its origin on Japanese new product development projects in the 1980s, Scrum has become recognized as one of the best project management frameworks for handling rapidly changing or evolving projects. Especially useful on projects with lots of technology or requirements uncertainty, Scrum is a proven, scalable agile process for managing software projects.Through lecture, discussion and exercises, this fast-paced tutorial covers the basics of what you need to know to get started with Scrum. You will learn about all key aspects of Scrum including product and sprint backlog, the sprint planning meeting, the sprint review, conducting a sprint retrospective, activities that occur during sprints, measuring and monitoring progress, and scaling Scrum to work with large and distributed teams. Also covered are the roles and responsibilities of the ScrumMaster, the product owner, and the Scrum team.This session will be equally suited for managers, programmers, testers, product managers and anyone else interested in improving product delivery.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/73B922DE-AF72-4B27-8CFF-B49766D74A08"&gt;iPod Video 320x240 (108.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/A476A315-A6AB-40D1-9CBA-1DA278999726"&gt;MPEG-4 for QuickTime Medium 1280x480 (330.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/373CB716-5F6B-4233-A5C0-7E91CB5FB89F/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=373CB716-5F6B-4233-A5C0-7E91CB5FB89F" target="_blank"&gt;Introduction to GIT 18 Jun 10 9:00 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;An introduction to distributed version control using Git, and how your VCS should work with you and not against you. How DVCS can completely alter your development process, streamline it, and help you produce better software, faster. Covering how local repositories speed up your development, multiple authoritative sources, distributed teams, multiple workflows, and some of the more distinct features of Git. With experiences from an OSS team on how the migration from SVN to Git has helped the project and changed how the team works (Fluent NHibernate).&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/AAF63449-316A-45CB-A97A-7C6D8877B655"&gt;iPod Video 320x240 (152.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/C6F26DA8-6A6A-44AF-A59F-FFD2197BD557"&gt;MPEG-4 for QuickTime Medium 1280x480 (717.4 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/B6E99D3E-FA79-4915-B5E2-CBF1A4E0D5C2/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=B6E99D3E-FA79-4915-B5E2-CBF1A4E0D5C2" target="_blank"&gt;Riding IronRuby on Rails 18 Jun 10 9:00 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;The most famous Ruby?Cdriven framework is, by far, Ruby on Rails. With IronRuby, .NET developers can now take advantage of this incredible web framework without leaving their comfort zone. In this session, Shay Friedman will build an entire Web 2.0 site from scratch while using and explaining the key features of Ruby on Rails.
          &lt;br&gt;Come and see what Ruby on Rails is all about and what's made it the success it is today.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/92483947-503D-4840-8634-7DA959B54272"&gt;iPod Video 320x240 (108.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/00079578-7C66-4D7D-9C78-9547E4571317"&gt;MPEG-4 for QuickTime Medium 1280x480 (468.2 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/3DEF9777-6E67-4DF5-A0B6-BD274A17B610/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=3DEF9777-6E67-4DF5-A0B6-BD274A17B610" target="_blank"&gt;Developing for SharePoint 2010 18 Jun 10 8:57 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Sure you're a .NET developer. Maybe you are even a SharePoint developer. But have you seen development for SharePoint 2010? It comes with full tooling support in VS2010, and massive improvements in the platform itself. Developing for SharePoint is finally manageable, but is it easy to be a SharePoint developer? Come and find out!&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/030F0119-18CA-40DD-8BBC-DBA2D0C229A3"&gt;iPod Video 320x240 (154.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/3657FB2E-DE46-4EE6-A261-1B4EDB3985E1"&gt;MPEG-4 for QuickTime Medium 1280x480 (794.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/67F7C9FF-0F0D-4F2E-91C0-49C84FF19109/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=67F7C9FF-0F0D-4F2E-91C0-49C84FF19109" target="_blank"&gt;The Three Laws of TDD 18 Jun 10 9:00 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;The jury is in, the case is closed. TDD works, and works well. In this talk Uncle Bob makes the point that TDD is not a testing technique at all. Rather, TDD is a way to ensure good architecture, good design, good documentation, and that the software works as the programmer intended. TDD is a necessary discipline for those developers seeking to become professionals. This talk is half lecture and half demonstration. Examples are in Java and Junit.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/6B224D9C-5AC2-47A5-A6FF-04FC6F17E235"&gt;iPod Video 320x240 (186.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/DEE43269-466E-495F-90BF-C018F4A9435E"&gt;MPEG-4 for QuickTime Medium 1280x480 (622.3 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/D75877EB-3F20-4A9A-8B39-B016EE0419D5/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=D75877EB-3F20-4A9A-8B39-B016EE0419D5" target="_blank"&gt;The Next Big Thing Or Cool-Kid Koolaid? Slicing Through The Rhetoric of MVC vs. WebForms 18 Jun 10 9:00 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;In this presentation Rob Conery dissects the arguments that are polluting the blogosphere, surrounding the discussion of whether ASP.NET MVC is "right" for you and your team. Passion, misinformation, assumptions and fear have pushed people into entrenched positions, leaving little room for intelligent thought. The goal of this presentation is to "shake loose" the rhetoric and give you some concrete ideas to think about if you're considering a move to ASP.NET MVC. In addition, Rob will try to offer an answer to the question: "Is WebForms Dead?"&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/A9076CC9-36AB-4268-95CA-61093899D2FF"&gt;iPod Video 320x240 (104.7 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/4B633AE1-54CF-4EDF-A790-F3B9B7EBFEFB"&gt;MPEG-4 for QuickTime Medium 1280x480 (592.8 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/29649A14-2F1B-428E-BB12-9A43A1676221/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=29649A14-2F1B-428E-BB12-9A43A1676221" target="_blank"&gt;C# Quo Vadis? 17 Jun 10 4:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;What??s next for C#? This session will not answer that question! Mads will open with about 10 minutes about the challenges and constraints of language design, followed by an open discussion on where to take C# involving fellow C# designers Eric Lippert and Neal Gafter, C# author and luminary Jon Skeet as well as you in a lively free-form discussion that can take us anywhere and will be absolutely once-in-a-lifetime.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/8519E157-0163-4764-B005-19E00AEBD895"&gt;iPod Video 320x240 (75.5 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/7CCBD189-9996-46CA-AFAA-045482B11CC7"&gt;MPEG-4 for QuickTime Medium 1280x480 (256.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/D57D0BF0-E555-44CA-B9B5-DA42B211836D/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=D57D0BF0-E555-44CA-B9B5-DA42B211836D" target="_blank"&gt;ASP.NET performance for free using caching 17 Jun 10 5:39 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Is your ASP.NET application not performing like you wished it would? Performance not what it has to be? Have you considered caching? While many developers know the basics of caching in ASP.NET, there's actually a lot more possible than initially thought. Also, not every technique is good to solve every problem. In this session, we'll do an overview of all the options ASP.NET has to offer for caching and state management, helping you to get a better performing application.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/5508E549-95EE-4279-8DEB-FB75E41A2BCC"&gt;iPod Video 320x240 (156.6 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/58481C42-44C0-4A13-9FA8-156AE1EB123A"&gt;MPEG-4 for QuickTime Medium 1280x480 (637.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/921B0A59-558B-411E-B77B-E384F4162661/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=921B0A59-558B-411E-B77B-E384F4162661" target="_blank"&gt;jQuery: Write less, do more 17 Jun 10 4:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;jQuery is a JavaScript library which allows you to develop solutions with less code, in less time. You can build interactive prototypes for your prospective clients, or take an existing solution and add new dynamic behaviour with little effort.We will see how jQuery can be used to quickly and concisely apply JavaScript behaviour to your web app. It will cover selectors, Ajax, DOM manipulation and more. The aim: to produce lean unobtrusive JavaScript with jQuery&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/6DF9A5DF-0AC2-4894-875E-89DF042143E4"&gt;iPod Video 320x240 (73.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/41FBB71C-159A-4F82-9F4D-F545354E805A"&gt;MPEG-4 for QuickTime Medium 1280x480 (273.3 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/43BE894B-DB27-4B0C-897F-D75ED6FDCFFA/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=43BE894B-DB27-4B0C-897F-D75ED6FDCFFA" target="_blank"&gt;Beautiful Teams &amp;amp; Leaders 17 Jun 10 4:38 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;A look at what makes teams productive, and what makes team leaders effective. from team practices such as automation and communication, to team leads that grow and coach their people, confront problems and finds ways to make people better. this is an overview session. specific issues are elaborated in other sessions.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/2F1C583E-947D-40D6-BCE7-672CAA5FB42D"&gt;iPod Video 320x240 (107 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/9D2AF5FD-6B26-415F-9979-9153A71FFB78"&gt;MPEG-4 for QuickTime Medium 1280x480 (516.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/F552E0B6-C036-4A8D-BEEA-64E4B1B005CE/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=F552E0B6-C036-4A8D-BEEA-64E4B1B005CE" target="_blank"&gt;5 reasons why projects using DDD fail 17 Jun 10 4:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Many people try applying Domain Driven Design and #fail miserably.This presentation looks at five top reasons for failure and discusses how to avoid them.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/2A7C85FA-CEC9-4253-AD88-EFD57FE69A6A"&gt;iPod Video 320x240 (140.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/4F985E73-D2EC-49ED-B2CE-47ED4C17DDE2"&gt;MPEG-4 for QuickTime Medium 1280x480 (459.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/FF182A3A-3793-488C-BCEC-5F644640DF19/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=FF182A3A-3793-488C-BCEC-5F644640DF19" target="_blank"&gt;Introducing the .NET Service Bus 17 Jun 10 5:37 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;The .NET services bus is part of the new Microsoft Cloud Computing Windows Azure initiative, and arguably, it is the most accessible, ready to use, powerful, and needed piece. The service bus allows clients to connects to services across any machine, network, firewall, NAT, routers, load balancers, virtualization, IP and DNS as if they were part of the same local network, and doing all that without compromising on the programming model or security. The service bus also supports callbacks, event publishing, authentication and authorization and doing all that in a WCF-friendly manner. This session will present the service bus programming model, how to configure and administer service bus solutions, working with the dedicated relay bindings including the available communication modes, relying on authentication in the cloud for local services and the various authentication options, and how to provide for end-to-end security through the relay service. You will also see some advanced WCF programming techniques, original helper classes, productivity-enhancing utilities and tools, as well as discussion of design best practices and pitfalls.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/EEEC5FCF-389A-4C1D-A003-3D9D69A03CE0"&gt;iPod Video 320x240 (146.4 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/C53E66C4-A805-40DB-9002-7CF7F0037E4A"&gt;MPEG-4 for QuickTime Medium 1280x480 (674.7 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/7CE9268F-045F-4AC1-AA46-6362276862BE/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=7CE9268F-045F-4AC1-AA46-6362276862BE" target="_blank"&gt;Architecting for the .NET Event Model 17 Jun 10 5:25 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;You may have a basic understanding of .NET's event model, but how can you best architect your applications to take advantage of .NET events? This session spends a few minutes on the basics, then provides real-world examples showing how you can design your applications to take advantage of the .NET event model for things such as:* Custom data binding in Windows Forms and Web Forms* Establishing relationships between business components* Creating world-class, end-user-configurable security* Localizing the user interface dynamically at run time&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/306C679F-CE26-4B71-8CE1-E3254AA2EF04"&gt;iPod Video 320x240 (123.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/4BC61FCB-3C07-4199-B87B-B4EFAB733A70"&gt;MPEG-4 for QuickTime Medium 1280x480 (660.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/DF0361BF-1AE6-42CE-AAB3-963E424A1BBD/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=DF0361BF-1AE6-42CE-AAB3-963E424A1BBD" target="_blank"&gt;The Purpose of Leadership and Governance 17 Jun 10 4:21 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;There are three types of organizations: ordered, chaotic, and complex organizations. The best management approach depends on the type of organization, and the amount of rule?Cmaking a development manager?team leader should concern himself with. However, this distinction is a false (but useful) metaphor. In reality, development teams are complex _adaptive_ systems, meaning that they should be doing their own rule?Cmaking, as self?Corganizing systems.
          &lt;br&gt;However, self?Corganization alone is not enough. Management is needed for imposing boundaries and constraints. There's a great checklist available to managers and team leaders for defining boundaries to authority in self?Corganizing teams.

          &lt;br&gt;There are two kinds of purpose: archeo?Cpurpose and neo?Cpurpose. Both the team itself and the manager can assign a neo?Cpurpose to a team. This neo?Cpurpose is not the same as the goal of the project they are working on, or the goals of any of the stakeholders. One thing a manager?leader can do is to assign purpose to a self?Corganizing team. We will discuss how to do that.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/949994EB-AD53-4896-8F32-14E0CEE6C120"&gt;iPod Video 320x240 (129.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/0F9AFB61-056F-4DE1-B24A-AD3AFAA831FC"&gt;MPEG-4 for QuickTime Medium 1280x480 (733.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/8114E030-D145-4C7E-B34C-B92312BFC87B/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=8114E030-D145-4C7E-B34C-B92312BFC87B" target="_blank"&gt;Building Applications with Silverlight 4 17 Jun 10 3:20 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Now that Silverlight 4 is released, find out what is new?changed and how to write great data-driven applications with Silverlight 4. Learn about how you can leverage Silverlight 4 for rich desktop applications using the new ??trusted application?? model and how to best take advantage of these features. Accessing data using RIA Services makes data-driven applications easier and can support a ViewModel development pattern approach. This session will be faced pace in overview, but deep in code. Few slides, mostly code.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/AAC3D1FC-8980-4790-9245-80D3D5A9A923"&gt;iPod Video 320x240 (131.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/EFC36FEC-ADD3-42FD-A098-CCF2FF86E279"&gt;MPEG-4 for QuickTime Medium 1280x480 (323.4 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/D4CE2890-99BC-49C5-A668-485D952A894D/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=D4CE2890-99BC-49C5-A668-485D952A894D" target="_blank"&gt;From one web server to two: Making the leap to web farms 17 Jun 10 4:20 PM&lt;/a&gt;&lt;/p&gt;

        

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/887B2602-DD14-412A-86E6-4DC9E7D63786"&gt;iPod Video 320x240 (143.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/C3FF5782-F356-4D9B-BE63-B3A4AC8EFF37"&gt;MPEG-4 for QuickTime Medium 1280x480 (709.9 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/F87D064C-09C8-4380-B1FE-17E526199C0C/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=F87D064C-09C8-4380-B1FE-17E526199C0C" target="_blank"&gt;Code Excavations, Wishful Invocations, and Domain Specific Unit Test Frameworks 17 Jun 10 3:20 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;In this talk I'll describe a technique for unit-testing code embedded in an impenetrable framework (such as Sharepoint, Silverlight, and BizTalk) that make such code inaccessible. We know we should write code that is easy to test because it has clean boundaries, but sometimes the vendors we work with make that kind of modularity just too hard. I will talk about how we can test such plug-in code by faking its environment in memory, simulating the underlying engines. As an example, I'll be showing SilverUnit, a framework to test code written for the Silverlight framework without driving through the browser. I'll talk about how the need for this sort of testing arose during silverlight development and how it allowed me to make sure my silverlight code worked as expected. even the UI logic.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/90A3BEBE-7A7B-4939-8285-4BF359DD4CA5"&gt;iPod Video 320x240 (102.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/4223DA88-7FB5-40C4-996E-2D143531A276"&gt;MPEG-4 for QuickTime Medium 1280x480 (475.7 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/AFDB4098-C5C8-49DF-8C2A-7E317F63E72D/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=AFDB4098-C5C8-49DF-8C2A-7E317F63E72D" target="_blank"&gt;If I Ruled the World - C# 5.0 According to Jon 17 Jun 10 3:20 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Now that C# 4 is out, thoughts are naturally turning towards what C# 5 might hold. Speaking from a position of breathtaking ignorance of what the team is actually planning, and without the safety net of a working implementation, I will outline a few ideas about what could be in C# 5. Some will be wacky, some mundane and perhaps even obvious. One thing's almost certain: this won't be the feature set of the real C# 5. Even so, it will provide some food for thought.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/7B88225D-8837-4650-8451-2488B664F828"&gt;iPod Video 320x240 (126.4 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/55B05224-8CE6-479C-8AC3-89675931E559"&gt;MPEG-4 for QuickTime Medium 1280x480 (529.2 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/0C981B83-1787-4D62-B395-4016989F52C3/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=0C981B83-1787-4D62-B395-4016989F52C3" target="_blank"&gt;Domain Driven Entity Framework 17 Jun 10 3:20 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;If you think of your database as an "implementation detail", it is likely that you are not interested in building your all important domain classes based on a database or being bound by the limitations of a modeling tool. In the U.S., Telemark skiers cry "Free the Heel". In this session we'll make that a call to "Free the Domain Classes". We'll take a look at the different mechanisms that do not involve reverse engineering a database. In VS2010, EF's Model-First support and in the Entity Framework Feature CTP, the completely model-less Code Only support. We'll finish with a quick look at SQL Server Modeling's M language, which provides yet another option for defining entity classes without the EDM designer .&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/772818E8-B827-403F-ACF5-4121883C7241"&gt;iPod Video 320x240 (121.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/6FC4CB4C-8D8B-4921-9854-077420D0311A"&gt;MPEG-4 for QuickTime Medium 1280x480 (422 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/434A8AAD-2209-48A9-A2A5-9E135FBD9648/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=434A8AAD-2209-48A9-A2A5-9E135FBD9648" target="_blank"&gt;Top Security Scenarios for WCF Services: On Premise &amp;amp; In The Cloud 17 Jun 10 4:20 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Today you will be hard-pressed to find an enterprise application that does not rely on distributed messaging and service-orientation. Client applications such as rich clients, Rich Internet Applications (RIAs) built with Silverlight or some flavor or AJAX, and those targeting mobile devices all access resources via services exposed to the intranet or Internet. Oftentimes the middle tier also includes layers of services living in the DMZ or behind it. There are many possible security models available for scenarios involving the various client technologies and service tiers - and Windows Communication Foundation (WCF) supplies the tools necessary to implement each and every possibility. In this session, you will learn the most common and practical security scenarios that involve WCF services within the intranet or exposed to the Intranet including classic Windows security, username and password, certificates, federated identity, REST-based and securing calls between tiers. The session will also discuss scenarios that can benefit from aspects of Windows Azure platform including AppFabric Service Bus and Access Control - such as for securing services behind the DMZ and enabling federation for REST-based services. All examples will cover requirements for the client and service, give you a formula to achieve each scenario, and show you custom components that simplify implementation. You??ll leave this session with a recipe for the most common security scenarios including sample code&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/007682F1-899E-4F92-A036-1E0DFB338C24"&gt;iPod Video 320x240 (152.7 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/FABD9586-E4EC-4890-A59A-A2C24089F4C0"&gt;MPEG-4 for QuickTime Medium 1280x480 (727.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/815EADB7-066D-4516-A70F-31EEFDFB1DE2/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=815EADB7-066D-4516-A70F-31EEFDFB1DE2" target="_blank"&gt;MonoTouch Deep Dive 17 Jun 10 2:00 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;A deep dive into developing applications with MonoTouch. Learn about the different UI components available on the iPhone and iPad and how to use these with MonoTouch as well as how you can create interoperability with your .Net libraries within MonoTouch.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/025D02B1-ECF6-45EE-A5DC-13C25A210FD4"&gt;iPod Video 320x240 (108.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/2DB58A2E-126D-468B-A53B-8DB6E03194AB"&gt;MPEG-4 for QuickTime Medium 1280x480 (294.4 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/29F8ADBD-2479-4DC1-A2D2-B4D6BFF13C31/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=29F8ADBD-2479-4DC1-A2D2-B4D6BFF13C31" target="_blank"&gt;What I've learned About DDD Since the Book 17 Jun 10 2:00 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;In the 5 years since the book was published, I've practiced DDD on various client projects, and I've continued to learn about what works, what doesn't work, and how to conceptualize and describe it all. Also, I've gained perspective and learned a great deal from the increasing number of expert practitioners of DDD who have emerged.The fundamentals have held up well, as well as most patterns, but there are differences in how I do things and look at things now. I will try to describe them, very informally, in this talk.Over this time, I have folded in a couple of additional patterns, and essentially come to ignore a few, but the biggest change has been a subtle shift of emphasis. Ubiquitous Language and Context Mapping and Core Domain are at the center, with aggregates in close orbit. Why, I ask myself, did I put context mapping in Chapter 14? Core domain in Chapter 15?! Before the book, it seemed self-evident to me that SOA fit well with DDD, but five years of questions on that topic have made it clear that my early explanations were inadequate and helped me clarify how it fits. Increased emphasis on events and distributed processing have crystallized the significance of aggregates and refined the building blocks.The talk cannot go into depth on all these topics, but the goal will be to give a quick look at where my view of DDD has been heading.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/1D0BC65F-5272-4EC2-889F-84AB41CAB3A6"&gt;iPod Video 320x240 (117.1 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/2318F2BA-25D5-4739-A29A-FED9715814C7"&gt;MPEG-4 for QuickTime Medium 1280x480 (448.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/6750B4DA-632C-4888-B9BD-2F1D44D4C930/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=6750B4DA-632C-4888-B9BD-2F1D44D4C930" target="_blank"&gt;Advanced Tips &amp;amp; Tricks for ASP.NET MVC 2 17 Jun 10 1:57 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;In this session we??ll not only look at improving the maintainability and performance of an MVC application, but also how to increase your productivity. Topics include model binding, meta-data providers, and T4 Templates.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/1FF232FC-BA01-45D8-9398-59587B1AEF84"&gt;iPod Video 320x240 (111.5 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/B9D2CB7C-FF4D-4C5C-9C16-011EA9AE3DBE"&gt;MPEG-4 for QuickTime Medium 1280x480 (416 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/1D104BB5-4312-4ABE-A6B1-23AF9FB02D39/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=1D104BB5-4312-4ABE-A6B1-23AF9FB02D39" target="_blank"&gt;C# in the Big World 17 Jun 10 1:57 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;C# 4.0 focuses on being a good citizen in a big world. In this talk we look at named and optional arguments, as well as the much improved COM interaction. We pay special attention to the new dynamic feature and the Dynamic Language Runtime (DLR) that it builds on: How do they work, how can you use them and why did we design them this way. We??ll also interoperate with COM and the HTML DOM, and build our own dynamic objects.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E2BAD064-94AB-4EE0-B3FC-5A8D5C9E7817"&gt;iPod Video 320x240 (110.7 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/A5BD7F69-EFC7-4D81-BA75-CE26620E2961"&gt;MPEG-4 for QuickTime Medium 1280x480 (365.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/0054B7C0-A854-485D-8BE2-0E2DC7D3D738/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=0054B7C0-A854-485D-8BE2-0E2DC7D3D738" target="_blank"&gt;Tasks &amp;amp; Threading in .NET 4.0 17 Jun 10 3:00 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Writing multi-threaded applications is hard - making them work is even harder. Scaling applications to the current and future multiple-core machines can really be a daunting task --- but it doesn't have to be! In this session, Ingo Rammer shows you the new task-based API and how it simplifies the creation of multi-core supporting applications. You will learn how you can take advantage of the fine-grained parallelism and control which is offered by this new .NET feature. Ingo will also show you how to extend your in-memory LINQ query to run in parallel, and how the new Visual Studio 10 debugging tools will make troubleshooting this kind of applications a lot easier.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/2BD48D9B-02EF-477C-8CF5-251777A751FB"&gt;iPod Video 320x240 (158.9 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/2BFDE6B9-30AA-437F-BE2B-FE99B0D14C7A"&gt;MPEG-4 for QuickTime Medium 1280x480 (579.7 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/54B70126-AF2C-4627-B47B-CDBE2BDEC8B1/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=54B70126-AF2C-4627-B47B-CDBE2BDEC8B1" target="_blank"&gt;Making Manual Testing a Part of Your Development Process 17 Jun 10 3:00 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Software has always needed to be tested manually, automation can help, but it is never going to replace the need for manual testing totally. How a team manages this requirement for manual testing can be key to a projects success or failure.In the 2010 release of Visual Studio, Microsoft have provided a whole new set of tools to aid in this process - Microsoft Test Manager. In this session I will show how MTM can be used to assist a tester in creating detailed, accurate and repeatable testing that are a joy to use (well might be stretching a point there!). Also I will show how the tooling can allow these manual tests can become the basis for automated tests and Coded UI tests, and how the advanced logging features of the tools allow bugs to be accurately passed back to developers for speed the production of fixes.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E162C105-0D34-4DB1-BCD9-47F94256CB3B"&gt;iPod Video 320x240 (137.6 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/0B0342C0-CA91-4332-A319-C5D7C0FD871B"&gt;MPEG-4 for QuickTime Medium 1280x480 (644.4 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/2E7AD1AC-9998-47B7-95FB-8DE7B6E1041B/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=2E7AD1AC-9998-47B7-95FB-8DE7B6E1041B" target="_blank"&gt;Windows Identity Foundation and Windows Azure 17 Jun 10 3:00 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Claims-based identity provides an open and interoperable approach to identity and access control that can be consistently applied both on-premises and in the cloud. Come to this session to learn about how Windows Identity Foundation can be used to secure your Web Roles hosted in Windows Azure, how you can take advantage of existing on-premises identities and how to make the best of features in our cloud offering, such as certificate management and staged environments.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/2CF8F8D0-4F6B-4E19-8C05-57D11CAD970C"&gt;iPod Video 320x240 (110.5 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/3D2CE3C3-DC4C-40B6-8A49-7FB0A670EEB1"&gt;MPEG-4 for QuickTime Medium 1280x480 (572.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/CB98EEE9-56A1-44BB-834B-6F8806A79B55/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=CB98EEE9-56A1-44BB-834B-6F8806A79B55" target="_blank"&gt;Software Is Not Manufacturing 17 Jun 10 12:45 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;While we assert that software development is not manufacturing, we often slip into manufacturing metaphors and analogies and then fail to extricate our explorations of how software development unfolds from manufacturing. Some of these analogies are so deeply-rooted into our customs that we readily contradict our own assertions. This presentation looks at just how handicapped your software development becomes at the hand of these engrained manufacturing perspectives. It looks at product development theory as a better analogy to software development and a more practicable body of knowledge for software development. And it looks at how even product development theory fails to illuminate software development when we backslide into manufacturing-specific product development. Lean and Agile methods are framed in terms of product development and software development productivity problems are laid open under the surgical precision of product development analogies to building software machines.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/4CFECB5D-59FA-42F0-9FB6-D8966060FEA3"&gt;iPod Video 320x240 (62.1 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/6D1E1D79-E553-467C-8E56-3D069878C8E9"&gt;MPEG-4 for QuickTime Medium 1280x480 (255.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/65BE4F1E-4CA8-44E0-8285-973DDE22AC94/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=65BE4F1E-4CA8-44E0-8285-973DDE22AC94" target="_blank"&gt;Introduction to MonoTouch 17 Jun 10 12:39 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;An overview of what's possible using Monotouch, Novell's tool to enable C# and .Net based applications for the iPhone, iPod touch and iPad. Find out what you need to start using Monotouch and how to create a sample application. If you have any questions on why you'd use this, what are the benefits and downsides of using Monotouch then this is your place!&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/56695511-6E17-4709-AD44-AEDF8FAF7093"&gt;iPod Video 320x240 (90.9 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/ECAC6BFF-B513-48B7-900B-B90E5502A650"&gt;MPEG-4 for QuickTime Medium 1280x480 (251.7 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/327039DB-BFD5-4465-BE31-A13BE5EAAF47/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=327039DB-BFD5-4465-BE31-A13BE5EAAF47" target="_blank"&gt;Technology Supported Requirement Handling and Estimation 17 Jun 10 1:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Lindorff Group is a leading outsourced receivables management company in Europe, and one of the leading on a global basis. For the past three-four years, they have increasingly adopted agile practices, especially in a large scale project converting and improving an old system written in Powerhouse to new .Net-technology.The results from adopting agile practices have been mostly positive, however, there were challenging issues related to requirement handling and estimation that needed attention. In 2008, Lindorff joined a project with Symphonical funded by Innovation Norway. The purpose of the project was to develop software for requirements handling, estimation and knowledge management for the Symphonical platform. Symphonical is a flexible web-based collaboration platform, where users can brainstorm, plan, organize and coordinate any process.This talk presents results from a case study detailing the challenges faced by Lindorff as they simultaneously adopted agile practices and introduced a new system for requirement handling and estimation. According to the respondents of the case study, Lindorff appears to have improved on two of the main points of concern presented in the 2007 study: requirement handling and estimation. Many users report that the introduction of agile methods and the platform Symphonical has improved the quality of important work processes. Furthermore, they report that the introduction of Symphonical has provided a framework for structured discussions re&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/03FEC611-7B4D-411F-A308-5DC675381D84"&gt;iPod Video 320x240 (124.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/190BED7E-FF81-4AEB-8C50-30B9BF466EA4"&gt;MPEG-4 for QuickTime Medium 1280x480 (594.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/316D856E-9734-473E-BD75-D6A675BDAEB7/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=316D856E-9734-473E-BD75-D6A675BDAEB7" target="_blank"&gt;Rocking AppFabric Access Control: Practical Scenarios, Killer Code and Wicked Tools 17 Jun 10 12:38 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;AppFabric Access Control is a feature of the Windows Azure platform that makes it easy to secure web resources such as REST-based services using a simple set of standard protocols. In fact, AppFabric Access Control uniquely facilitates several scenarios not previously possible including a standards-based mechanism for securing web resources, identity federation for REST, and secure calls from Silverlight and AJAX clients to web resources including REST-based WCF services or REST-based MVC implementations. In this session you will get a tour of the AppFabric Access Control feature set and learn how to implement these key security scenarios with the help of some custom tools that encapsulate common functionality exposing a simple object model for working with the protocols underlying Access Control. In addition, you will learn how to integrate typical Windows Identity Foundation (WIF) authorization techniques such as ClaimsPrincipal to decouple the authentication and authorization mechanism from the business logic.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/D10B3B51-9157-4FD3-822B-449AA11EBEA7"&gt;iPod Video 320x240 (138.5 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/48237FF8-8CCF-43D4-B3C5-6B6335AFE57E"&gt;MPEG-4 for QuickTime Medium 1280x480 (570.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/06AF739D-271D-4D24-9058-1935D9E304F9/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=06AF739D-271D-4D24-9058-1935D9E304F9" target="_blank"&gt;Unleash Your Domain 17 Jun 10 12:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Our application runs over 10,000 sustained transactions per second with a rich model. The key? Modeling state transitions explicitly.In today's world many systems have non-functional requirements that prevent them from being single database centric. This presentation looks at how Domain Driven Design can fit into such environments including extremely large scale web sites, batch processing, and even using highly scalable backing stores such as CouchDb or HyperTable.Event streams, a different way of storing the current state of an object, open many doors in this session not only in how we scale and store our domain but also in how we rationalize about it.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/2DDA5370-3246-4442-802D-D131512D696A"&gt;iPod Video 320x240 (112.6 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/72B5743C-570D-4A93-B315-A78A859F67CC"&gt;MPEG-4 for QuickTime Medium 1280x480 (410 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/BB983DB3-FBB5-4898-848E-40CBB8794169/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=BB983DB3-FBB5-4898-848E-40CBB8794169" target="_blank"&gt;Testers Are Not Your Enemy 17 Jun 10 1:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Manual testing has been marginalized in agile development. Usdevelopers seems to think that manual testing is outdated and shouldnow be replaced by automatic test scripts. I think that manual testingshould still be a part of the development process, and in this talk,you will learn why that is and how we can integrate manual testers onagile teams.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/DAE1B9CB-6ABC-4DF7-849E-2DBD1FE2669A"&gt;iPod Video 320x240 (66.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/0F857841-5D33-49FA-9A35-E2FCB80607F8"&gt;MPEG-4 for QuickTime Medium 1280x480 (330.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/6660D5A9-C231-4EE3-8F9A-D359F15CCABB/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=6660D5A9-C231-4EE3-8F9A-D359F15CCABB" target="_blank"&gt;Improving Your ASP.NET Application Performance with Asynchcronous Pages and Parallel Extensions 17 Jun 10 1:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Asynchronous pages and handlers can be used in ASP.NET to improve the performance of the application, especially the throughput, but wrongly used can lead to unexpected behavior, including a degraded performance. One of the key technologies that are part of the Visual Studio 2010 is Parallel Extensions. So come to this interactive session to see how you can benefit from those new technologies and how they can help you to mitigate some of the problems.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/AC43AF8E-6F1F-4E12-AE44-574740C6601E"&gt;iPod Video 320x240 (141.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/03F4B3EA-4E22-45E7-989D-8FF1A67BF475"&gt;MPEG-4 for QuickTime Medium 1280x480 (674.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/B663FE0E-7F19-482E-95BF-D7AB9A4C9CBE/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=B663FE0E-7F19-482E-95BF-D7AB9A4C9CBE" target="_blank"&gt;Fluent Nhibernate 17 Jun 10 11:40 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;(misses 4 minutes in the start)An introduction and overview to object?relational mapping using Fluent NHibernate. See how Fluent NHibernate can help you map your domain with the least amount of effort, how you can remain flexible with your database, and how to drive your design through convention?Cover?Cconfiguration; all without writing a single line of XML.
          &lt;br&gt;The talk is an introduction to Fluent NHibernate for those that aren't familiar with it, and assumes some NHibernate experience and is for .Net developers primarily. The goal is to show people how low?Cimpact NHibernate can be with Fluent NHibernate, and how it can actually speed up development in rapid?Cchange environments.

          &lt;br&gt;I'll cover an overview of what Fluent NHibernate is, the various parts of it (the fluent interface, the conventions, and the auto?Cmappings, and the configuration aspect), then expand on how these features can be utilised to improve your NHibernate experience and simplify your development process.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/715B25D0-4BA3-496D-996B-2328D03F336F"&gt;iPod Video 320x240 (94.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/A0DE0481-5A63-4046-9442-35F20D826175"&gt;MPEG-4 for QuickTime Medium 1280x480 (512.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/C567290C-750D-4597-96F2-44699BD20F35/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=C567290C-750D-4597-96F2-44699BD20F35" target="_blank"&gt;Folding Design to Agile 17 Jun 10 10:40 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;After a decade of heavy process, the Agile revolution of the late '90s threw off the dead hand of big upfront design. The bloody purge that followed was needed!There were unintended consequences. Too many teams interpret "Agile" as a permit to not think about design. But if they have ambitious goals, Agile teams need more than standup meetings and iterations. Many teams get off to a quick start, building lots of features in early iterations, but end up with a "Big Ball of Mud". Without clear and well-structured code, they cannot sustain their pace and also put themselves at risk of, one day, encountering a critical feature they simply cannot deliver. Without the common understanding between developers and stakeholders that is forged in domain analysis, one of the greatest benefits of iteration, the deepening communication about what the software should do and how it should do it, is never realized.We must not return to the "Analysis Paralysis" that we used to endure (and that many teams still do), but interpreting "Do the Simplest Thing" as "Do the Easiest Thing" doesn't work either.This talk will consider ways of incorporating modeling and design into the iterative process in a lightweight way that increases communication with stakeholders and decreases the likelihood of painting ourselves into corners, without returning to the dead-hand of the analysis phase. As a concrete example of how such techniques can be incorporated into the Agile framework, we'll have an overview of&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E45EE484-17D1-457C-8E6E-9FE0A4009D56"&gt;iPod Video 320x240 (88.4 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/7157FD1C-F6FA-49D5-A89A-D51EFF373CC6"&gt;MPEG-4 for QuickTime Medium 1280x480 (234.3 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/9569A807-9FF8-45F7-B076-566EB839EDE5/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=9569A807-9FF8-45F7-B076-566EB839EDE5" target="_blank"&gt;Silverlight data access and services not for the faint of heart 17 Jun 10 10:40 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;For data needs, Silverlight can talk to services like WCF or REST enabled services. These service types are sufficient for most scenarios. But what if it isn't? Most examples that can be found out there cover the basics, but in the real world, that's sometimes not enough. In this session, we'll explore the dark corners of Silverlight??s service access. Among others, we??ll cover duplex communication, debugging services, the HttpWebRequest, TCP communication and securing service communication from Silverlight.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E128F1C5-4334-4A85-972E-054F356D8944"&gt;iPod Video 320x240 (126.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/8E5C9B51-C6FA-48F9-B71D-0924A7150390"&gt;MPEG-4 for QuickTime Medium 1280x480 (414.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/3F9663A1-95AD-49D4-BF60-B248EB7B7824/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=3F9663A1-95AD-49D4-BF60-B248EB7B7824" target="_blank"&gt;Zen of Architecture 17 Jun 10 10:37 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Wonder about architecture best practices, guidelines and pitfalls? Wonder how to design world?Cclass systems? You understand the concepts but not how to apply them? In the first half of this high pace session, Juval will explain his original approach to large system analysis design. Then, he will discuss logical tiers, security, interoperability, scalability, transactions, and other aspects of a modern application. You will see how to approach rarely discussed topics such as allocation of services to assemblies, allocation of services to processes, transaction boundaries, identity management, authorization and authentication boundaries and more.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/23E152C9-A082-47A7-9752-CF4E6E763CB4"&gt;iPod Video 320x240 (101.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/6DE2F70E-E9EA-467F-987B-CA60D0832EC6"&gt;MPEG-4 for QuickTime Medium 1280x480 (393.9 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/D55B1D6D-1B66-4AE3-90C0-4A299CFDD207/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=D55B1D6D-1B66-4AE3-90C0-4A299CFDD207" target="_blank"&gt;Modularization, Testing &amp;amp; Technical Debt in a Large Agile Project 17 Jun 10 10:40 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;This experience reports focuses on the major scrum?Crelated technical challenges that arose during a 120 000 hour scrum controlled project. For each of them, we try to identify the cause and the consequence, and then follow up with any solutions we tried. Finally we sum up and assess whether the problem was successfully solved or not.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/4ECFFFF5-F771-4AFF-BF19-E9EC4CD36913"&gt;iPod Video 320x240 (66 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/4B65502D-0303-4A4C-9649-76FAC5D4BAC6"&gt;MPEG-4 for QuickTime Medium 1280x480 (294.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/7CA2DE20-2C1E-4E15-B962-5A61426B2218/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=7CA2DE20-2C1E-4E15-B962-5A61426B2218" target="_blank"&gt;Hardcore .NET Production Debugging 17 Jun 10 11:40 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;But ... it used to work yesterday! In this newest version of his classic session, Ingo Rammer will introduce the hardcore and low-level tools used for production debugging of .NET applications. You'll learn how to attack the nastiest bugs in your applications, how to look at what's causing that grinding halt of your ASP.NET application and how to find the cause of that horrible memory leak in your Windows Forms application. Knowledge of these production debugging tools like WinDbg and SOS is not only important for cases when you really don't have access to Visual Studio and your source code, but these tools also reveal a lot more information than just the regular managed code debuggers.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/02A5543D-E2A8-49F9-813B-86629B1505A7"&gt;iPod Video 320x240 (165.9 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/7D7AC028-F469-441A-B9F6-3694E2259AAF"&gt;MPEG-4 for QuickTime Medium 1280x480 (697 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/B28EBB6E-460F-4951-90A8-C4F10E3E368A/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=B28EBB6E-460F-4951-90A8-C4F10E3E368A" target="_blank"&gt;Solid C++ code by example 17 Jun 10 11:36 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Sometimes you see code that is perfectly OK according to the definition of the language, but which is flawed because it breaks too many established idioms and conventions. On the other hand, a solid piece of code is something that looks like it is written by an experienced person who cares about professionalism in programming.
          &lt;br&gt;This will be an interactive discussion about good vs bad C++ code. We will discuss simple C++ idioms and coding conventions, but we will also touch upon best practices when working with C++ in large codebases with lots of developers with mixed skills.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/5B9E29D6-C172-49A7-B59C-8E5C0678DA3D"&gt;iPod Video 320x240 (98.9 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/AD7A5C8E-F267-466B-AAC4-DE2A9C925EFB"&gt;MPEG-4 for QuickTime Medium 1280x480 (337.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/33E5A226-B72F-425A-AFE1-A0F10324EF5E/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=33E5A226-B72F-425A-AFE1-A0F10324EF5E" target="_blank"&gt;Silverlight Applications for Windows Phone 7 17 Jun 10 9:20 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Windows Phone 7 is brand new, totally fresh operating system that will appear in phones before Christmas. The new platform is a complete rewrite and offers lots of interesting opportunities to third party developers. The development platform for Windows Phone 7 is all based around managed code and the tools and frameworks you already know and love. This presentation you will give you an overview of the Windows Phone 7 development platform, and how you can leverage your existing Silverlight skills to build great applications for the Windows Phone 7 marketplace. The session assumes some prior knowledge of Silverlight, as the focus of this presentation will be features that are specific to the phone. It will not only cover the basics of the Windows Phone 7 platform, but also how you can re-use many of the same patterns, frameworks, techniques and practices that you use when building regular Silverlight applications.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/DB82EF1C-7FE5-4149-AF3D-8A9C5E769E9B"&gt;iPod Video 320x240 (115.6 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E358E185-84EA-486D-9797-34EA9DC733F5"&gt;MPEG-4 for QuickTime Medium 1280x480 (366.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/BCEF7A82-56FF-45FE-9580-2DED9406FB9A/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=BCEF7A82-56FF-45FE-9580-2DED9406FB9A" target="_blank"&gt;Entity Framework Persistance Ignorance 17 Jun 10 9:20 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Entity Framework in .NET 4 has finally embraced agile development. Thanks to it's new POCO support, you can now build completely persistent ignorant entity classes. In this session, we'll look at building an intelligent repository from entity classes and mocking up some extra classes in order to build unit tests against methods that have some dependency on the Entity Framework without touching the EF APIs. A prior understanding of the PI and Unit Testing should keep your head from spinning too much.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/340C88A5-8F8C-460A-ABD2-A1A92315FDBC"&gt;iPod Video 320x240 (115.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/47A57CCD-C1B6-4230-B677-A2995D00773F"&gt;MPEG-4 for QuickTime Medium 1280x480 (425.7 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/EE42F3A4-4B04-43A1-962E-22870D7C1877/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=EE42F3A4-4B04-43A1-962E-22870D7C1877" target="_blank"&gt;Service Oriented Development Process 17 Jun 10 9:20 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;When you develop a service-oriented application, it would be naive of you to expect that the only things you will do differently will be limited to design and technology. The development process itself needs to be service-oriented. You cannot "stare into the fire" of WCF without a mature service-oriented development process supporting your effort. This talk presents you with a service-oriented development process that you can apply to your WCF-based products to achieve robust applications, manage requirements and ensure faster time to market.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/5AC07B0F-EFE3-4871-ABCF-B36B87842B06"&gt;iPod Video 320x240 (90.7 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/97F3A10F-0EE7-49BF-B738-031C8D4F51EA"&gt;MPEG-4 for QuickTime Medium 1280x480 (324.9 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/7A0F3A2B-AD46-47E8-8748-5BAF9611B4E3/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=7A0F3A2B-AD46-47E8-8748-5BAF9611B4E3" target="_blank"&gt;IronRuby - A Brave New World for .NET 17 Jun 10 10:18 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;.NET developers are about to enter a brave new world. With Microsoft'sDynamic Language Runtime (DLR) developers can start taking advantageof dynamic languages, such as IronRuby and IronPython, on top of the.Net platform and integrating the language into their existing .netbased applications. However, why is this important?In this session, Ben will provide an insight into the deep darksecrets of why he loves the Ruby language and how it can result in amore effective solution when compared to C#. After demonstrating thepowerful capabilities, Ben will explain how the DLR with IronRubyallows you to take full advantage of Ruby from C# applications,resulting in you choosing the appropriate language (C# or Ruby) forthe appropriate feature. The combination results in a powerfultool-set and opens some amazing possibilities for both C# and Rubydevelopers. With C# 4.0, these capabilities are taken a step further.But the advantage is not just one way, there are also advantages forRuby developers by allowing them to develop against the .Netframework.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/D2A3C378-E023-4234-916D-B0EADEC66892"&gt;iPod Video 320x240 (119.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/56485999-04EC-43C1-95AC-BA04E3F56C25"&gt;MPEG-4 for QuickTime Medium 1280x480 (570.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/7CB648EE-545B-4184-9DFF-2FA37DBD7943/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=7CB648EE-545B-4184-9DFF-2FA37DBD7943" target="_blank"&gt;jQuery for ASP.NET developers 17 Jun 10 9:20 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;This session is a practical tour of the ??write less, do more?? JavaScript library - jQuery. In this session we will build an application using ASP.NET and jQuery while learning about CSS selectors, DOM manipulation, and asynchronous communications using the jQuery library. We??ll also look at the jQuery plug-in model, examine common jQuery programming paradigms, and see how to invoke WCF web services using jQuery.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/552627F4-8EC0-4CD9-B9CC-794EEB8879EA"&gt;iPod Video 320x240 (97.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/5F2A05DA-A1D1-49E3-A40B-B2117B726B00"&gt;MPEG-4 for QuickTime Medium 640x480 (190.4 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/B25D60E8-48C1-4514-9276-608859B4CC72/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=B25D60E8-48C1-4514-9276-608859B4CC72" target="_blank"&gt;Advanced Debugging with Visual Studio 17 Jun 10 10:17 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Basically every .NET developer knows the Visual Studio debugger, but only few know its little secrets. In this session, Ingo shows you what you can achieve with this tool beyond the setting of simple breakpoints. You will learn how advanced breakpoints, debugger macros and visualizers, interactive breakpoints, tracepoints and interactive object instantiation at development time can support your hunt for bugs in your applications. Ingo will also show you the new crash-dump debugging features of Visual Studio 2010 which allow you to get closer to your problem even if you don't have access to Visual Studio on the machine which exhibits the unexpected behavior.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/507CBC74-B2A6-46DD-852D-69F83FFE9C1A"&gt;iPod Video 320x240 (177.7 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/0F217368-0162-4866-B63A-E9AB0D1C43FE"&gt;MPEG-4 for QuickTime Medium 640x480 (176.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/4DEB5112-B18A-44A8-AA01-56EDD95EB0EF/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=4DEB5112-B18A-44A8-AA01-56EDD95EB0EF" target="_blank"&gt;Unit Testing Best Practices &amp;amp; Test Reviews 17 Jun 10 10:20 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;In this session we look at existing .NET code form open source projects and discuss anti patterns worst practices when doing unit testing in the wild. From abuse of mock objects, unmaintainable tests and unreadable tests to checking interactions vs. state - this talk will take you deep into the real ugly world of unit testing.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E2232282-BD09-4B7B-9ADF-81206FEDF545"&gt;iPod Video 320x240 (134.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/B78EE753-34E3-476D-A9D1-97A00381D43E"&gt;MPEG-4 for QuickTime Medium 1280x480 (664.2 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/874B6020-4A57-472A-807C-1B6E66FB308D/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=874B6020-4A57-472A-807C-1B6E66FB308D" target="_blank"&gt;Ruby for .NET developers 17 Jun 10 9:00 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;After having spent many years coding in C#, and after having spent equally as much time in the C# language culture, Ruby seemed like a lot of bad ideas and heresy. In fact, much of Ruby is heretical to a C# or VB.NET mono-culture, but the productivity gains demonstrated by Ruby on Rails teams remains an unavoidable elephant in the room. This presentation looks at C# code examples side by side with some equivalent Ruby code and shines a little light on what it means to have either "ceremony" and "essence". It challenges the claims of static typing's effect on tooling to deliver "developer productivity". And finally, some examples of Ruby meta programming are given to demonstrate direct solutions to programming problems that would require much ado with restrictions in C# that don't end up doing much more than reducing the efficiency of software development efforts.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/646691C3-E4FB-4F22-BBC0-2A0977273BF9"&gt;iPod Video 320x240 (2.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/CFEFCB53-4D3D-4F80-B650-A13426355759"&gt;iPod Video 320x240 (22.5 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/D9ADEB9E-8C47-49E1-A138-CE4E227A2E12"&gt;iPod Video 320x240 (98 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/94C4A832-6CCC-4494-9F6F-BE516C1DD556"&gt;MPEG-4 for QuickTime Medium 1280x480 (384.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/DEC10BA7-5065-4A8E-8508-B2778EDE04E5/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=DEC10BA7-5065-4A8E-8508-B2778EDE04E5" target="_blank"&gt;Silverlight for Windows Phone 17 Jun 10 9:00 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Windows Phone 7 Series is coming??and if you are a Silverlight developer there is good news: Silverlight *is* the development platform for Windows Phone applications. This session will provide an overview of the tools, the emulator, and the core APIs for Silverlight for Windows Phone development. Find out what is (and is not) possible in creating and porting your Silverlight applications ready for Windows Phone 7.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/44C70EDA-7DDE-481D-9AAD-11BD2AEEF246"&gt;iPod Video 320x240 (130.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/86E4E98C-245F-447C-A136-AD595F0A16A3"&gt;MPEG-4 for QuickTime Medium 1280x480 (316 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/FE7C8B56-42E7-4F99-9C1C-F2BB0980F520/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=FE7C8B56-42E7-4F99-9C1C-F2BB0980F520" target="_blank"&gt;Putting Some Testing Into Your TFS Build 17 Jun 10 9:00 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Continuous Integration and scheduled builds are an important part of any development process. To get the best out of these tools, as much testing as possible should be wired into the post build process. With the 2010 release of Visual Studio we get the Lab Manager product that allows us to deploy our automated build to a virtualised test environment for either manual and?or automated testing. In this session I will show by doing an end to end demo, showing how an application can be build, deployed and tested with the Lab Manager environment.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/551EBB80-E427-4ED1-9E55-77180F1C8985"&gt;iPod Video 320x240 (132.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/11636CFA-4AEF-4F0E-9715-05DD4052A7E1"&gt;MPEG-4 for QuickTime Medium 1280x480 (578.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/522865A3-FB1B-44F2-8528-214D8D73B333/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=522865A3-FB1B-44F2-8528-214D8D73B333" target="_blank"&gt;Big-Ass View on Competency 17 Jun 10 9:00 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Agile team members create their own rules, based on constraints imposed by the environment. But something else is needed for good results: some call it discipline, craftsmanship, or competence. Traffic management teaches us that there are 7 approaches to achieving competence in a self-organizing system. We are going to look at all of them.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/932D6A04-9721-43B3-A2C5-DD07C0C4DBF3"&gt;iPod Video 320x240 (129.4 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/C0CB578F-0F6D-47E3-BE6B-FE566624D872"&gt;MPEG-4 for QuickTime Medium 1280x480 (699.8 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/F931D805-3B03-432A-A0FE-26F7E9CAF721/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=F931D805-3B03-432A-A0FE-26F7E9CAF721" target="_blank"&gt;Strategic Design 17 Jun 10 9:00 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;As software development leaders, we need to think more strategically. Some design decisions affect the trajectory of the whole project or even the organization. These decisions arise in early chartering and throughout development, and they are about much more than architecture. This talk will examine these issues through the lens of the Strategic Design principles of domain-driven design, which systematize a few critical practices some successful teams do intuitively.It is common for skilled teams to deliver software they are not proud of, due to compromises with legacy designs. Others toil for years, producing a platform that is never used to good advantage. These are strategic failures. On the other hand, there are projects with a direct explanation of how the software contributes to business goals. There are projects where designers work with a realistic view of the context of their development within the larger system, allowing them to maintain design clarity and integrity. These are strategic successes. Winning strategy starts with the domain.Two domain-driven design principles, "Context Mapping" and "Distilling the Core Domain", help you see your strategic situation more clearly and approach strategic design decisions more systematically. These techniques require extensive interaction with domain experts as well as the leaders of the organization, in discussions broader than functional requirements. They sometimes lead to priorities quite different from our most comfort&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/EEC4043E-D680-4686-A431-B0FCA258A408"&gt;iPod Video 320x240 (130.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/A3A05BA3-0B0C-4ED9-80D1-D9D705C0F1CA"&gt;MPEG-4 for QuickTime Medium 1280x480 (603.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/F36BD4C5-4FB7-4C1B-A0E1-990DA59308F5/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=F36BD4C5-4FB7-4C1B-A0E1-990DA59308F5" target="_blank"&gt;Co- and contra-variance in C# 17 Jun 10 7:57 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;What's the difference between a bunch of bananas and a fruit bowl? Why can't I order a collection of circles by area? Why is the Hokey Cokey invariant? These questions (and some rather more sensible ones) will be answered in this session on variance. C# has supported variance to different degrees over different versions; C# 4 introduces covariance and contravariance to generic delegates and interfaces. Many developers may well use these features without even being aware of them - but as ever, it's useful to know what's going on for the times where things go wrong. Pre-requisites: a strong cup of coffee for when we discuss higher order functions, and a reasonable grasp of generics. Understanding Func, Action, IEnumerable and IComparer would be a good start.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/6E75B535-23C7-46FC-A163-B14216AAAEF7"&gt;iPod Video 320x240 (132.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/9B1AEFFD-C380-43D3-B458-4022FDEB7D42"&gt;MPEG-4 for QuickTime Medium 640x480 (139.9 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/72AF92FC-C72C-4CFF-A9F3-2F51DDC5B08C/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=72AF92FC-C72C-4CFF-A9F3-2F51DDC5B08C" target="_blank"&gt;Windows Identity Foundation Overview 17 Jun 10 8:51 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Hear how Windows Identity Foundation makes advanced identity capabilities and open standards first class citizens in the Microsoft .NET Framework. Learn how the Claims Based access model integrates seamlessly with the traditional .NET identity object model while also giving developers complete control over every aspect of authentication, authorization, and identity-driven application behavior. See examples of the point and click tooling with tight Microsoft Visual Studio integration, advanced STS capabilities, and much more that Windows Identity Foundation consistently provides across on-premise, service-based, ASP.NET and Windows Communication Foundation (WCF) applications.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/23C83C49-DD49-41D5-9CB9-4B91DBC82906"&gt;iPod Video 320x240 (119.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/C191BAF1-5EFD-4306-AB9B-0ECD8E14E513"&gt;MPEG-4 for QuickTime Medium 1280x480 (608.3 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/163E9CCC-7317-41A5-B772-81595467BBAF/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=163E9CCC-7317-41A5-B772-81595467BBAF" target="_blank"&gt;Browsers with Wings: HTML5 APIs for webapp developers 16 Jun 10 4:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;HTML5 is all the rage with the cool kids, and although there's a lot of focus on the new language, there's plenty for web app developers with new JavaScript APIs both in the HTML5 spec and separated out as their own W3C specifications. This session will take you through demos and code and show off some of the outright crazy bleeding edge demos that are being produced today using the new JavaScript APIs. But it's not all pie in the sky - plenty is useful today, some even in Internet Explorer!Specifically we'll be looking at scripting the video media element, 2D canvas and some of the mashups we can achieve. How to take our web apps completely offline, going beyond the cookie and HTML5's answer to threading: web workers.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/6C10CEF6-5D4D-474A-B3D1-7E8F3B70D81F"&gt;iPod Video 320x240 (95.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/0A7C3DCF-8883-4C17-98C0-24E9DC6F512D"&gt;MPEG-4 for QuickTime Medium 1280x480 (370.2 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/30DC4F1D-3867-41FD-944E-167872AE4EF2/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=30DC4F1D-3867-41FD-944E-167872AE4EF2" target="_blank"&gt;Test-Driven JavaScript 16 Jun 10 4:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Javascript becomes much more important to interactive website development then before (ok it has been for a while already) but the notion of testing that logic seems even further fetched then testing the code written in C#, Java. And this is something that is wrong as well. How do you test drive your javascript development, what do you need to think about to make it testable? How can you deal with timers, async calls and the dom. Demonstrate all these things including how easy it is to make your own fakes for testing. Demonstrate the refactoring and changing behaviour becomes so much easier.And not to forget that the design of the code is much better as well. Basically that you gain all the benefits that TDD gives you in other languages also when doing TDD for javascript development.Building a feature without ever loading up a web-page to physically look at it and when you finally do it does exactly what you intended it to do, that is magic :-)&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/5749CE3E-EBE0-4A72-9FBE-BB56FDFCDD9B"&gt;iPod Video 320x240 (123.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/844C4775-CC44-418A-81F7-FC3FFF16CB45"&gt;MPEG-4 for QuickTime Medium 1280x480 (326.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/0CB02DD9-8B8E-43CF-BA75-5C3FEA3BDCEF/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=0CB02DD9-8B8E-43CF-BA75-5C3FEA3BDCEF" target="_blank"&gt;Windows Azure AppFabric 16 Jun 10 4:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;As one of the key platform providers for enterprise solutions today, Microsoft realizes that there are very many assets in corporate datacenters that are not easily moved to the cloud. A lot of data is subject to government or corporate regulation about data protection that does not allow for the data to be hosted off-site and over the past decade, companies have made enormous investments in streamlining and integrating their applications in ways that make it not particularly attractive to break out parts of that integration chain and move them off into the cloud as insular solutions. The Windows Azure AppFabric??s Service Bus and Access Control services which Clemens will introduce in this session are about bridging these gaps and to provide application-to-application connectivity and access control federation across network and trust scopes.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/9A5D8386-E0F0-4431-9742-5FF75638EDEA"&gt;iPod Video 320x240 (120.7 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/FE8D7A25-2ACB-4A45-AFB7-90515A70C7E5"&gt;MPEG-4 for QuickTime Medium 1280x480 (379.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/F6DB36EA-62CE-466E-9E8F-778261513777/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=F6DB36EA-62CE-466E-9E8F-778261513777" target="_blank"&gt;The Parallel Task Library in .NET 4.0 16 Jun 10 5:b40PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Introduced with .Net 4.0, the Parallel Task Library gives a new approach to task-parallel programming. In this session we dive into the details of the library, looking at the various ways that it can be utilised. We will cover a number of areas, including:? Data Parallelism, using Parallel.For and Parallel.ForEach? Task Parallelism, using Parallel.Invoke and the Task class? Exception Handling? Cancellation? Asynchronous continuation patterns? PLinq The session is aimed at the intermediate developer - a good understanding of basic threading principles is a requirement.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/768EFCE0-884D-4CA1-8D73-A53554862A6F"&gt;iPod Video 320x240 (153.5 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/F9F4FFFE-C760-4DD0-A127-494D0BD94F0B"&gt;MPEG-4 for QuickTime Medium 1280x480 (651.2 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/EC40F1C9-6A3D-4920-B57C-42316D7B5875/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=EC40F1C9-6A3D-4920-B57C-42316D7B5875" target="_blank"&gt;The Whole Team Approach to Testing 16 Jun 10 5:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Many test teams find themselves ??squeezed to the end??, with code delivered too late to complete all the testing before the release deadline. They can??t get traction on critical activities such as test automation, and find themselves falling further and further behind. The software development organization is weighed down by increasing technical debt. Customers aren??t getting the software they wanted. Serious bugs get out to production, slowing the team down more as fixing one bug might cause two more. It can seem impossible to break out of this downward spiral.One way to turn this trend around is to get the whole team involved in building quality into the application, and solving testing problems together. In this session, Lisa Crispin will explain how to make quality a team responsibility, and testing a team??s problem to solve. She??ll explain how the ??whole team?? approach, leveraging multiple skill sets and planning in time for testing activities, leads to more testable code, better testing solutions. Participants will leave with some practical ideas to try right away.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/C52CE5CD-5DE1-4ECA-B797-09FB737ACE4F"&gt;iPod Video 320x240 (101.6 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/BB31F99E-1E3D-4D27-AF4F-EEB02030306D"&gt;MPEG-4 for QuickTime Medium 1280x480 (422.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/302740C4-D6FD-40D1-BF97-A0D21392EEFD/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=302740C4-D6FD-40D1-BF97-A0D21392EEFD" target="_blank"&gt;Real-World Design with the Visual Studio 2010 Modelling Tools 16 Jun 10 3:21 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Visual Studio 2010 introduces new Layer, Class, Activity, Use Case, Sequence, and Component diagrams. This session provides an overview of each of these diagrams and demonstrates practical examples of when they are useful, and when they are not! You will see how VS 2010 allows you to reverse-engineer your existing .NET code and generate sequence diagrams that graphically depict the object interaction in your applications. You??ll also get a tour of the new Architecture Explorer, and learn how you can best fit these design tools into your software development processes - including agile software processes.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/0FC91B77-AB31-49A9-AFD9-030364B418B4"&gt;iPod Video 320x240 (103.9 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/9EF81C68-C1B9-4A45-80AF-F997FA49EF38"&gt;MPEG-4 for QuickTime Medium 1280x480 (299.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/903C3339-7F84-4626-B30D-476E74517929/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=903C3339-7F84-4626-B30D-476E74517929" target="_blank"&gt;Building a Real-World, E-Commerce, Data-Driven Web Site 16 Jun 10 3:20 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;In this session, I'll take you on a tour of what it took to go from an empty space in my ISPs web farm and turn it into a functional ecommerce web site. We'll include a discussion of how the domain was attached, how the site was built in ASP.NET, where the graphics and layout came from, how the products and site settings were managed in SQL Server, how the site was published, how shipping, taxes and handling are calculated, how money is collected and how the site is maintained. If you've ever wanted to see what it takes to start from scratch and build a real-world ecommerce web site, this is the place for you.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/95BED923-EE0E-475B-BB86-0F59EC1AC206"&gt;iPod Video 320x240 (103.7 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/1412E8B9-3876-45AD-83FA-FC43356886BD"&gt;MPEG-4 for QuickTime Medium 1280x480 (325.9 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/5E52750E-D4FC-41AA-9164-427A00BBC49D/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=5E52750E-D4FC-41AA-9164-427A00BBC49D" target="_blank"&gt;Distributed Computing 2.0 16 Jun 10 4:19 PM&lt;/a&gt;&lt;/p&gt;

        

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/7188E52A-58A4-40AA-A1C3-03186BD0E40C"&gt;iPod Video 320x240 (164.5 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/AFAE6D66-4F22-4C3C-940F-C706DE5CB28A"&gt;MPEG-4 for QuickTime Medium 1280x480 (864.3 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/80B9DFA5-672A-4773-BDA2-72B2B9ED3B68/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=80B9DFA5-672A-4773-BDA2-72B2B9ED3B68" target="_blank"&gt;Windows Azure Platform Compute &amp;amp; Storage 16 Jun 10 3:20 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;At the heart of Windows Azure are its compute and management capabilities, which are foundational not only for ISV and enterprise solutions, but also for the Windows Azure platform components themselves. In this session Clemens will introduce Windows Azure??s notion of service and configuration models, the deployment and upgrade mechanisms, and introduce the diagnostics and management capabilities. You will furthermore learn about the various storage capabilities including the relational SQL Azure database service. Clemens will also show how Windows Azure??s different roles provide an architectural guidance framework for building scalable apps.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/14DF94D5-04AD-4513-BEAA-9FE7C50C2666"&gt;iPod Video 320x240 (147.7 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/AC095D5A-B799-4FEA-8CE1-2CFBA2952047"&gt;MPEG-4 for QuickTime Medium 1280x480 (40.5 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/7F971DA3-985E-48B0-A31E-3A3E50B2DF61"&gt;MPEG-4 for QuickTime Medium 1280x480 (690.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/84E5914B-BC2F-44B7-8276-C19C65833313/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=84E5914B-BC2F-44B7-8276-C19C65833313" target="_blank"&gt;Noda time: An Alternative Date &amp;amp; Time Framework 16 Jun 10 3:20 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;The date and time API within the .NET framework has certainly improved over time, but it's still not as rich as it might be. Noda Time is an open source project porting the popular "Joda Time" framework from Java to .NET, and improving it along the way. I'll explain why DateTime and DateTimeOffset aren't always enough, the main concepts in Noda Time, and some lessons we've learned about .NET, porting in general, and running an open source project.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/8B620277-9794-4EB9-B903-67D889CA9F66"&gt;iPod Video 320x240 (140 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/3683519C-A600-4FCB-9DC3-4875371D74A7"&gt;MPEG-4 for QuickTime Medium 1280x480 (611.2 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/7242BEA2-BE20-4A74-B47C-33DF1C20F4F5/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=7242BEA2-BE20-4A74-B47C-33DF1C20F4F5" target="_blank"&gt;Does Self-Organization Actually Work &amp;amp; Are Agile Teams Actually Motivated By It? 16 Jun 10 4:20 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Self-organising teams are a key component of all of the agile methodologies, but do teams and organisations know what they are actually letting themselves in for when signing up for things like Scrum? In my experience the definition of "self-organisation" is widely different from organisation to organisation, team to team and even individual to individual within a team. This leads to fear, sub-optimisation and in a lot of cases subversion of the principle such that teams are being directed to work in sprints or iterations. In this session, Geoff will share his experiences of self-organisation, the common characteristics that are required for self-organisation to work and how commonly these characteristics are found in organisations that say that are "doing agile".&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/18AC3332-46AA-4F9C-BEFB-E12B9C4244ED"&gt;iPod Video 320x240 (103.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E951C1EA-774E-4DFA-AE5B-5B74B712EA87"&gt;MPEG-4 for QuickTime Medium 1280x480 (439.4 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/E0F27D82-039B-4CE8-839C-DD69D641CB58/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=E0F27D82-039B-4CE8-839C-DD69D641CB58" target="_blank"&gt;Mono - A Great Platform for .NET in the Cloud 16 Jun 10 2:00 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;ASP.NET WebForms and MVC apps run out-of-the-box on Mono on a variety of platforms. With so many options for hosting Linux servers on services such as EC2 and Linode, Mono has become an attractive platform for cloud deployment. This presentation will walk through several approaches to developing, debugging, and deploying .NET applications to the cloud with Mono.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/FA27ACC7-3833-43A0-AA41-361861EFD3F4"&gt;iPod Video 320x240 (92.9 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/604C5AAA-F90B-4B4C-BA1C-74DDD385800A"&gt;MPEG-4 for QuickTime Medium 1280x480 (294.8 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/D034F11E-646B-4A8A-94F7-64231F2C882D/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=D034F11E-646B-4A8A-94F7-64231F2C882D" target="_blank"&gt;I Can't Hear You - There's an ORM In My Ear: Effective Use of NoSQL In an ASP.NET MVC Web Application 16 Jun 10 2:00 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;The NoSQL movement is gaining momentum (to many people's annoyance) and gaining many fans. For developers who haven't used a NoSQL solution (Object Database, Document Database, etc) it's a bit awkward to conceive of how you might do common tasks - like querying or generating application reports. In this talk Rob Conery shows how you can build an effective data access strategy using both NoSQL and traditional Relational Databases, focusing on using each system for its strengths rather than compensating for its weaknesses.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/CD9C9B96-6AD6-4682-901F-DECFC8963A2B"&gt;iPod Video 320x240 (364.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/30B6030D-0B5A-4EAE-BA35-730484A52D45"&gt;MPEG-4 for QuickTime Medium 320x240 (230.8 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/10ED66AB-C227-41DF-9943-03DF3F34686A/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=10ED66AB-C227-41DF-9943-03DF3F34686A" target="_blank"&gt;Lean Quality Assurance 16 Jun 10 3:00 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Quality Assurance (QA) in software worldwide has in fact degenerated into testing alone. Software?IT management has ignorantly allowed this to happen.Of course many parts of the industry have been well-aware of more cost-effective ways of delivering required quality in practice, but this has in fact been largely ignored; while granting very large resources to testing alone.It is time for a wakeup call!This manifesto is here to tell the industry that;testing alone is 10x more costly than doing Real QA. testing alone is not good enough, this can and need not go on. We know how to do real QA much much better than testing alone, using smarter upstream engineering practices, based on design, prevention and upstream inspections.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/9108952D-9CB6-4E5E-A227-95735D90C744"&gt;iPod Video 320x240 (145 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/FACABF23-1BF7-4CFB-B631-BB0E6D8DA904"&gt;MPEG-4 for QuickTime Medium 1280x480 (399.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/EEF24F50-5532-4F29-8313-3E5A87166282"&gt;MPEG-4 for QuickTime Medium 1280x480 (689.7 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/376DFD42-5231-48E0-AC24-0FB883A2166A/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=376DFD42-5231-48E0-AC24-0FB883A2166A" target="_blank"&gt;Design, Don't Decorate 16 Jun 10 3:00 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Putting the advanced capabilities of WPF and Silverlight to full use requires collaboration, experimentation, and iterative prototyping. In this session, you??ll see all five sequential prototypes for the acclaimed StaffLynx application (as seen on .NET Rocks TV), and discuss practices that worked and didn't work in real-world advanced UI development. We'll also discuss the role of visual and interactive designers in creating new era user interfaces, give some tips on how to think about using WPF and Silverlight capabilities to make interfaces feel natural and less stressful to users, and cover the most valuable lessons learned from a real-world project using advanced, next generation user interface technology.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/11B44CD9-7A55-4FDE-BA57-AEACA6F3F1E7"&gt;iPod Video 320x240 (109.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/CD0B714C-FC9B-49C6-9E7A-63BACAF1A4BD"&gt;MPEG-4 for QuickTime Medium 1280x480 (457.9 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/317A8278-F06C-4D24-AB31-330565EC0AE3/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=317A8278-F06C-4D24-AB31-330565EC0AE3" target="_blank"&gt;Inside modern JavaScript 16 Jun 10 2:00 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;JavaScript is a dynamic, functional, ubiquitous language that has many hidden secrets. In this session we will take a deep look at the core JavaScript features that many contemporary libraries leverage, including constructor functions, prototypical inheritance, closures, hash parameters, method chaining, and more. Having a solid grasp of these features will not only help you write more maintainable JavaScript code, but also allow you to take greater advantage of today??s JavaScript libraries.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/6B6DBBAE-B439-4845-97B0-61962D8A2D20"&gt;iPod Video 320x240 (94.6 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/774FBBD6-2282-4E7A-9071-7B01CB835FE9"&gt;MPEG-4 for QuickTime Medium 1280x480 (390.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/2377CA9F-F9F8-418F-879A-17BCE95ED916/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=2377CA9F-F9F8-418F-879A-17BCE95ED916" target="_blank"&gt;CHESS - Finding &amp;amp; Reproducing Heisenbugs in Concurrent Programs 16 Jun 10 2:55 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;CHESS is a tool from Microsoft Research that aims to find and reproduce hard to locate concurrency bugs. It does so by repeatedly running tests, systematically enumerating how the various threads are interleaved on each run. When (if) errors occur, CHESS can also then re--?]run the specific interleaving that resulted in the error, massively simplifying the debugging effort.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/1F52A581-6AF6-42BD-9CA3-CAD83E92CC42"&gt;iPod Video 320x240 (155.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/0B9F8812-C9A7-45FC-8E0B-FB90219E646A"&gt;MPEG-4 for QuickTime Medium 1280x480 (663.1 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/806323A0-D35F-4F60-A71B-37347C89176D/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=806323A0-D35F-4F60-A71B-37347C89176D" target="_blank"&gt;Windows Azure Overview 16 Jun 10 1:54 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;HASH(0x1060cd48)&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/95568687-743E-4041-9FCB-ED4E5D92F335"&gt;iPod Video 320x240 (149.6 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/EA907797-D580-4234-98E5-0546C7F1022F"&gt;MPEG-4 for QuickTime Medium 1280x480 (709.7 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/95F528ED-572D-41ED-AEFD-C014731A55FE/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=95F528ED-572D-41ED-AEFD-C014731A55FE" target="_blank"&gt;What has Mono done for .NET developers Lately? 16 Jun 10 12:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Mono is an open-source, cross-platform implementation of the .NET framework based on the ECMA standards for C# and the Common Language Infrastructure. With Mono, users can run .NET applications written and compiled in Visual Studio on Windows, Linux, and Mac OS X. This session will provide an introduction to cross-platform development and deployment with Mono. Participants will see how they can leverage their existing skills and tools to write .NET applications that will run on multiple platforms and architectures with Mono. The presentation will also include a discussion of cross-platform considerations for leveraging Mono, and demonstrate how to use MoMA, the Mono Migration Analyzer, to determine how ready anapplication is for cross-platform deployment. Additional demonstrations will examine how best to leverage Visual Studio to develop and deploy to Linux and OS X, and take a peek at the current state of Moonlight 3 and 4.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/186869AD-5769-470B-8BEE-9A81A9874E72"&gt;iPod Video 320x240 (78.5 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/2ECAEE91-16B8-47E3-9E6D-9BC940047FD4"&gt;MPEG-4 for QuickTime Medium 1280x480 (245.7 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/D191A552-A38A-4870-8AB8-DE96203A581B/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=D191A552-A38A-4870-8AB8-DE96203A581B" target="_blank"&gt;Patterns for Parallel Programming 16 Jun 10 1:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Every five to ten years the world of computer programming is facing now a new paradigm shift, like GUI, object orientation, or generics. Right now we are facing a new paradigm shift, the multi-core one. Successful research in this area has been done for the past 30 years, but we are still not using the results efficiently. A pattern is a working solution to a recurring problem, and parallel?multi-core programming has its own problems which led to a set of patterns. Come and see in this session about which patterns exists in the area of parallel?multi-core programming and how they can be used with Visual Studio 2010.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/C58B6D44-2803-4907-BA44-72A1B06768B5"&gt;iPod Video 320x240 (176.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/965B1D6A-C262-41C0-941B-FF2750620274"&gt;MPEG-4 for QuickTime Medium 1280x480 (936.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/464F8EB9-9399-432A-A0B7-BCB17757BE46/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=464F8EB9-9399-432A-A0B7-BCB17757BE46" target="_blank"&gt;Programming with GUTs on 16 Jun 10 1:38 PM&lt;/a&gt;&lt;/p&gt;

        

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/CE3C1B66-A831-4FFD-8AFF-D877781A30B6"&gt;iPod Video 320x240 (112.4 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/F7B14893-DF7E-43FB-8ABD-44F11A648009"&gt;MPEG-4 for QuickTime Medium 1280x480 (483 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/91A8D9BC-4D17-4DB0-85DF-D8E573C0461D/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=91A8D9BC-4D17-4DB0-85DF-D8E573C0461D" target="_blank"&gt;CouchDB for .NET Developers 16 Jun 10 1:37 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;RDBMS has been the standard for many years, when it has come to data storage. However, recently there has been an increase in document databases. In this talk we are going to cover the basics of CouchDB and how to consume this kind of database from .NET applications.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/4DFFDE4B-FBA8-43E9-9BEB-672B9BE36807"&gt;iPod Video 320x240 (132.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/DACDB1ED-CEF6-47EB-9180-6458BD4EA1C0"&gt;MPEG-4 for QuickTime Medium 1280x480 (684.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/F8D7D4BC-686F-4865-A4B2-C3211D246C8E/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=F8D7D4BC-686F-4865-A4B2-C3211D246C8E" target="_blank"&gt;How to Get the Best ROI From a Scrum Team as a Product Owner 16 Jun 10 12:37 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;The Product Owner is probably the role that has received the least attention and help of all the three Scrum roles but it is paramount to an organisation's success with Scrum. While most projects benefit immediately from switching or adopting Scrum, to get the best out of the project a Product Owner really needs to understand both the team and the Scrum framework. In this tutorial Geoff will share his views and experiences of working with Scrum teams to provide you with a number of tips to improve your ROI.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/B8080CFA-585F-459D-8779-4A200D49FFF5"&gt;iPod Video 320x240 (205.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/AADA154E-622A-4EB1-BB0A-167A0D32794F"&gt;MPEG-4 for QuickTime Medium 1280x480 (516.8 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/1C166DD2-560F-4CE2-97CB-608C4F78866C/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=1C166DD2-560F-4CE2-97CB-608C4F78866C" target="_blank"&gt;.NET Design Patterns for Agile Software Processes 16 Jun 10 12:40 PM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;In the world of agile programming techniques, one of your best tools is design patterns. This session provides practical examples and implementation of design patterns in .NET. Familiarizing yourself with patterns such as Model-View-Controller, Observer, Abstract and Concrete Factories, and concepts such as programming to an interface rather than an implementation will help you build applications quickly that can easily adapt to your customer??s changing needs.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/52A75902-5E75-4D24-9C1D-59D5F09B2629"&gt;iPod Video 320x240 (131 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/29C798E1-AD5B-4275-A746-F64A3098BD72"&gt;MPEG-4 for QuickTime Medium 1280x480 (578 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/E915B78B-D9B7-4CE9-96DA-2B794391AD2F/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=E915B78B-D9B7-4CE9-96DA-2B794391AD2F" target="_blank"&gt;C# Puzzlers 16 Jun 10 12:32 PM&lt;/a&gt;&lt;/p&gt;

        

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/CD2DBF38-EECD-4B27-829E-4CEB2C10B189"&gt;iPod Video 320x240 (105.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/9908F342-50FD-4606-8AB2-59A5EFD97AC1"&gt;MPEG-4 for QuickTime Medium 1280x480 (505.3 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/5C145BA1-0861-478D-A467-AFF3A5089E03/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=5C145BA1-0861-478D-A467-AFF3A5089E03" target="_blank"&gt;Architecture of the Client Tier for WPF &amp;amp; Silverlight 16 Jun 10 10:40 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Stateful client-based technologies for user interfaces, such as WPF and Silverlight, require more sophisticated design and architecture for the client tier than typical web applications. This session discusses the construction of a client-based navigation shell that replaces server-based navigation for a cleaner, more responsive user experience in multi-page applications. Implementation of capabilities such as data validation, temporary caching of unsaved data to allow for network downtime, and graceful shutdown will all be discussed. The session features a working model that attendees can use as a starting point for their own projects.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E0A937F9-4078-44AD-B59C-E84FA66EEE76"&gt;iPod Video 320x240 (118.4 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/B5F1412F-0761-4935-8023-4824F42A6A21"&gt;MPEG-4 for QuickTime Medium 1280x480 (340.6 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/1272299E-1DD1-4C11-B7A3-EBDE5B11A5B7/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=1272299E-1DD1-4C11-B7A3-EBDE5B11A5B7" target="_blank"&gt;Individuals &amp;amp; Interaction Over Processes and Tools 16 Jun 10 10:40 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Although it is a simple value, the idea that individuals and interactions are more significant than processes and tools is overlooked perhaps more often than it is valued. Of course, processes and tools make a difference -- sometimes a very big difference -- but what determines whether a process or tool is effective is related to the individuals and interactions. To best achieve agility you need to start with the current context and understand how people actually behave in response to their environment, their beliefs and one another. What actually motivates and demotivates people, developers in particular? What actually makes their work easier or harder? Does making "business value" the centrepiece of what they do actually motivate the people who ultimately produce such business value? Or is it more about the individuals and interactions?&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/20B40A5F-AF56-4849-81A7-A7A0735C1CE5"&gt;iPod Video 320x240 (119.2 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/60AC1636-0002-45EB-B6BA-C299B106EFE5"&gt;MPEG-4 for QuickTime Medium 1280x480 (385.3 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/2C3F6822-1694-48A6-9C49-8B3E3D4C6CE5/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=2C3F6822-1694-48A6-9C49-8B3E3D4C6CE5" target="_blank"&gt;Reactive Extensions (Rx) 16 Jun 10 10:37 AM&lt;/a&gt;&lt;/p&gt;

        

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/E91A35E6-2221-41A1-B88D-37AA6C35A79C"&gt;iPod Video 320x240 (123.3 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/8AFD1B19-6EED-45CF-B34D-CC3046ABB684"&gt;MPEG-4 for QuickTime Medium 1280x480 (534.9 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/38AD648E-835D-4FD4-91E8-B34E1D437D89/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=38AD648E-835D-4FD4-91E8-B34E1D437D89" target="_blank"&gt;Practical IronRuby 16 Jun 10 9:21 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Ruby has been a home for some great innovative frameworks like Ruby on Rails, Cucumber and Rake. IronRuby version 1.0 will soon be released, unleashing the power of Ruby to the .NET world. 
          &lt;br&gt;In this session you will get familiar with the Ruby language and its amazing ecosystem and you will learn to take advantage of it in your everyday development tasks. Come and see how this great new addition to the .NET family makes your development process faster, clearer and happier!&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/445362FF-8CA1-494C-976F-06864CABA19D"&gt;iPod Video 320x240 (90.8 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/09B77798-02C0-4A6C-A167-9B1CC0765A62"&gt;MPEG-4 for QuickTime Medium 1280x480 (308.2 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/4E353FF7-ACDA-428B-99C9-9EACBC7C471C/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=4E353FF7-ACDA-428B-99C9-9EACBC7C471C" target="_blank"&gt;Strategies Against Architecture 16 Jun 10 9:18 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Good architecture requires good vision and good people, but there are times when actions and decisions taken with the best of intent begin to work against an architecture. Instead of helping a system achieve a long life, speculation about reuse, flexibility and generality can bring a system to an early grave, weighing the codebase down with accidental complexity that invites workarounds and, ultimately, a new ad hoc architectural style. Documentation intended to be helpful becomes shelfware, ignored equally by its authors and its prospective readership. Dysfunctional memes in code and tests go unchecked because the detail of code is not considered a part of the architecture. Instead of stability and responsiveness, an architecture achieves stasis and loses reflex.This session looks at the reality of how development process and practices interact with the grander vision of architecture, the pitfalls of "architect as cop" and how to employ speculation and uncertainty to a system's advantage.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/AB9B343F-8332-4028-A7B5-CABE45BB2053"&gt;iPod Video 320x240 (113.6 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/B28AFB59-FDCD-4F26-AC2D-3C33C0508BAE"&gt;MPEG-4 for QuickTime Medium 1280x480 (36 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/9F36B1C3-E917-41BC-AF9F-2E8E0FB4D3E4"&gt;MPEG-4 for QuickTime Medium 1280x480 (376.8 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/C21C13ED-8657-4D10-9A21-213BA1031F90/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=C21C13ED-8657-4D10-9A21-213BA1031F90" target="_blank"&gt;A Style of Programming 16 Jun 10 9:17 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;This talk describes a set of coding principles that constitutes a style of programming that focuses on ease of coding, ease of changing the code, and ease of testing the code. The presentation aims at helping programmers understand how the principles relate to actual code. Every principle is made concrete through examples. This style of programming is influenced by leading object oriented and agile developers, and it is perfect for applying on object oriented languages such as C#.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/63D6EAB4-1ABD-4D6D-9D1D-84513B4BF893"&gt;iPod Video 320x240 (154.5 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/82055901-F9EF-4181-8A10-6CA548166E95"&gt;MPEG-4 for QuickTime Medium 1280x480 (753.5 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/0F97309E-B237-4CEF-A4D9-9E4DCD790F4B/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=0F97309E-B237-4CEF-A4D9-9E4DCD790F4B" target="_blank"&gt;Multicore - The Future of Computing 16 Jun 10 10:16 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Since hitting both the memory and power wall about 3-5 years ago, all cpu vendors have been forced to turn from making the fastest possible single-thread cpu to instead putting several (sometimes simpler) cores on a single chip.Reducing the clock frequency by 50% can reduce power usage by 80%, so actual throughput per watt can improve a lot, as long as the code can be parallelized.Existing GPUs from Nvidia and AMD, Cell processors as used in the PS3 and Intel's announced Larrabee architecture can all supply an order of magnitude more fp processing power per watt than what is currently available from normal cpus.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/2785FDD1-BC5B-4754-856D-E26C1CCCA73F"&gt;iPod Video 320x240 (116.6 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/385CAC19-A22D-4C8C-A599-D3D468D9018F"&gt;MPEG-4 for QuickTime Medium 1280x480 (571.8 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr style="vertical-align: top"&gt;
      &lt;td&gt;&lt;img src="http://streaming.ndc2010.no/tcs/slides/DD7F9AD4-50AF-4B66-8A05-A9465C4F19BF/thumbnails/thumbnail.jpg"&gt;&lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;a href="http://streaming.ndc2010.no/tcs/?id=DD7F9AD4-50AF-4B66-8A05-A9465C4F19BF" target="_blank"&gt;Seven Key Factors for Agile Testing Success 16 Jun 10 10:13 AM&lt;/a&gt;&lt;/p&gt;

        &lt;p&gt;Agile development approaches present unique challenges for testers and test teams. Working in short iterations, often with limited written requirements, agile development teams can leave traditional testers behind. Common testing-related activities such as user acceptance testing, testing inter-product relationships, and installation testing need different approaches to fit into agile projects. Lisa Crispin explains seven key factors for testing success within agile projects that you can also apply to more traditional methodologies. Using a whole team approach and adopting an agile testing mindset are among the important components of a successful agile testing strategy. Learn how to overcome cultural and organizational obstacles and barriers to success in areas such as test automation. Discover the seven critical factors that provide a foundation for building your team's focus on quality and that deliver maximum value to your business.&lt;/p&gt;

        

        &lt;ul&gt;
          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/415AABE2-F055-406F-94F5-2B5C25A63FA4"&gt;iPod Video 320x240 (126 MB)&lt;/a&gt;&lt;/li&gt;

          &lt;li&gt;&lt;a href="http://streaming.ndc2010.no/tcs/download/D5225EC6-A679-4F7B-B4F8-9A27B3B9EAB2"&gt;MPEG-4 for QuickTime Medium 1280x480 (661.3 MB)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;

        
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;</description>
      <comments>http://blog.zhaojie.me/2010/07/ndc-2010-videos.html#comments</comments>
      <pubDate>Tue, 13 Jul 2010 07:13:12 GMT</pubDate>
      <lastBuildDate>Tue, 13 Jul 2010 07:13:12 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/parallel/">并行处理</category>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>盛大创新院赞助首届.NET技术交流会 - 演讲录像及下载</title>
      <link>http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-videos.html</link>
      <guid>http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-videos.html</guid>
      <description>&lt;p&gt;经过几天的努力，终于将&lt;a href="http://blog.zhaojie.me/2010/01/1651772.html"&gt;盛大创新院&lt;/a&gt;赞助的&lt;a href="http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html"&gt;首届.NET技术交流会&lt;/a&gt;的演讲录像制作完成了。本来在现在的高清视频以外，我还想像Channel 9一样提供一些低码率的格式下载，但多次尝试都以失败告终，各中滋味难以言喻。因此目前只能给大家提供mov格式的高清视频下载，对于Windows下各类强大的播放器都不成问题。您也可以在线观看这些视频，不过上传至优酷后，发现除了清晰度较低外，甚至还有音画不同步的问题。我正在联系&lt;a href="http://www.ku6.com/"&gt;酷六网&lt;/a&gt;，会尽快用上质量更好的视频。&lt;/p&gt;

&lt;h1&gt;F#语言对异步程序设计的支持&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;赵劼，盛大创新院，研究员&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;如今的Web应用、 Silverlight以及各种分布式系统让异步解决方案有了更进一步的需求。F#是微软.NET平台上的函数式编程语言，并添加了不少让并行及异步编程变得有趣且轻松的特性。本次演讲将讨论F#的核心概念，并探讨F#中的不可变性、函数式设计、异步工作流、代理等特性是如何应对真实应用中的异步挑战的。&lt;/p&gt;
&lt;embed src="http://player.youku.com/player.php/sid/XMjEzMDM1MDgw/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"&gt;&lt;/embed&gt; 

&lt;p&gt;&lt;a href="http://dlc2.sdo.com/FTP/cop/20100624/1/fsharp-async-20100619-high.mov"&gt;高清视频下载&lt;/a&gt;（mov格式，1280 * 720，495M）&lt;/p&gt;

&lt;h1&gt;Rails: Better Framework, Better Life&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;吕国宁，Intridea.com，高级工程师&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;RoR是Ruby on Rails的缩写，是一个用于编写Web应用的框架。它基于Ruby语言，给开发人员提供了强大便利的框架支持。Ruby有很多优点，但是一直以来其流行范围仅局限于日本。2004年，当Rails框架横空出世，让人们认识到了一个更符合实际需要并且高效的web框架，在其出现不久就受到了业内的广泛关注。吕国宁将结合自己三年的Rails开发经验，给大家介绍一些Rails的优点，背后的设计文化，以及Rails的前景发展等内容。&lt;/p&gt;
&lt;embed src="http://player.youku.com/player.php/sid/XMTg0MTI0NjU2/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"&gt;&lt;/embed&gt; 

&lt;p&gt;&lt;a href="http://dlc2.sdo.com/FTP/cop/20100624/1/ror-20100619-high.mov"&gt;高清视频下载&lt;/a&gt;（mov格式，1280 * 720，432M）&lt;/p&gt;

&lt;h1&gt;大众点评网的技术变迁之路&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;王宏，大众点评网，架构师&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;大众点评网从2003年创建以来，已经经历了7个年头，在技术方面从最初构建时期的简单的、低成本的方案，到发展阶段不断“痛苦”的转型演变，到目前比较复杂的技术架构，大众点评网的技术团队一直在关注业界新技术，力求提高可用性、降低成本、优化用户体验，并针对“点评”这一第三方参与的特点，摸索出一些特有的解决方案，借此机会希望能够分享给大家。&lt;/p&gt;
&lt;embed src="http://player.youku.com/player.php/sid/XMTg0MTA5MTY0/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"&gt;&lt;/embed&gt; 

&lt;p&gt;&lt;a href="http://dlc2.sdo.com/FTP/cop/20100624/1/dianping-20100619-high.mov"&gt;高清视频下载&lt;/a&gt;（mov格式，1280 * 720，486M）&lt;/p&gt;

&lt;h1&gt;Q &amp;amp; A&lt;/h1&gt;

&lt;p&gt;按照计划，原本还会有一场关于C#的演讲，但该场的讲师由于突然有急事只得作罢。于是我在最后增加了“演讲嘉宾问答”的环节，您可以在&lt;a href="http://www.ku6.com/"&gt;酷六网&lt;/a&gt;上进行在线观看。&lt;/p&gt;

&lt;p&gt;第1段：&lt;/p&gt;
&lt;embed src="http://player.ku6.com/refer/QFX3kb6ZJ8Wqge-w/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="always" allowfullscreen="true" type="application/x-shockwave-flash"&gt;&lt;/embed&gt; 

&lt;p&gt;第2段：&lt;/p&gt;
&lt;embed src="http://player.ku6.com/refer/wmD_kenujbB6gxnM/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="always" allowfullscreen="true" type="application/x-shockwave-flash"&gt;&lt;/embed&gt; 

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html"&gt;盛大创新院赞助首届.NET技术交流会开始报名了！&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-is-coming.html"&gt;盛大创新院赞助首届.NET技术交流会即将召开&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-all-slides.html"&gt;盛大创新院赞助首届.NET技术交流会 - 各场演讲幻灯片&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;盛大创新院赞助首届.NET技术交流会 - 演讲录像及下载 &lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-videos.html#comments</comments>
      <pubDate>Thu, 24 Jun 2010 06:40:51 GMT</pubDate>
      <lastBuildDate>Thu, 24 Jun 2010 06:40:51 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/parallel/">并行处理</category>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>盛大创新院赞助首届.NET技术交流会 - 各场演讲幻灯片</title>
      <link>http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-all-slides.html</link>
      <guid>http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-all-slides.html</guid>
      <description>&lt;p&gt;今天是近期最热的一天，气温高达35度，异常闷热，但是依然有160多位朋友冒着酷暑参加了&lt;a href="http://blog.zhaojie.me/2010/01/1651772.html"&gt;盛大创新院&lt;/a&gt;赞助的&lt;a href="http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html"&gt;首届.NET技术交流会&lt;/a&gt;，这让我感到很欣慰，因此这里首先要感谢大家的支持。我刚才浏览了一下三场演讲的桌面录像，可谓异常完美，现在只等酷六网的摄影师的讲师录像到手，便可以合成为最终的演讲视频了，希望能够尽快展示给大家。不过现在，大家可以在第一时间浏览本次活动新鲜出炉的幻灯片。&lt;/p&gt;

&lt;h1&gt;F#语言对异步程序设计的支持&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;赵劼，盛大创新院，研究员 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;如今的Web应用、 Silverlight以及各种分布式系统让异步解决方案有了更进一步的需求。F#是微软.NET平台上的函数式编程语言，并添加了不少让并行及异步编程变得有趣且轻松的特性。本次演讲将讨论F#的核心概念，并探讨F#中的不可变性、函数式设计、异步工作流、代理等特性是如何应对真实应用中的异步挑战的。&lt;/p&gt;

&lt;div style="width: 425px" id="__ss_4546454"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="F#语言对异步程序设计的支持" href="http://www.slideshare.net/jeffz/f-4546454"&gt;F#语言对异步程序设计的支持&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4546454" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=f-100619111719-phpapp01&amp;stripped_title=f-4546454" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4546454" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=f-100619111719-phpapp01&amp;stripped_title=f-4546454" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

  &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;

&lt;h1&gt;Rails: Better Framework, Better Life&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;吕国宁，Intridea.com，高级工程师 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;RoR是Ruby on Rails的缩写，是一个用于编写Web应用的框架。它基于Ruby语言，给开发人员提供了强大便利的框架支持。Ruby有很多优点，但是一直以来其流行范围仅局限于日本。2004年，当Rails框架横空出世，让人们认识到了一个更符合实际需要并且高效的web框架，在其出现不久就受到了业内的广泛关注。吕国宁将结合自己三年的Rails开发经验，给大家介绍一些Rails的优点，背后的设计文化，以及Rails的前景发展等内容。&lt;/p&gt;

&lt;div style="width: 425px" id="__ss_4545483"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="Better Framework Better Life" href="http://www.slideshare.net/jeffz/better-framework-better-life"&gt;Better Framework Better Life&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4545483" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=better-framework-better-life-100619101625-phpapp01&amp;stripped_title=better-framework-better-life" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4545483" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=better-framework-better-life-100619101625-phpapp01&amp;stripped_title=better-framework-better-life" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

  &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;

&lt;h1&gt;大众点评网的技术变迁之路&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;王宏，大众点评网，架构师 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;大众点评网从2003年创建以来，已经经历了7个年头，在技术方面从最初构建时期的简单的、低成本的方案，到发展阶段不断“痛苦”的转型演变，到目前比较复杂的技术架构，大众点评网的技术团队一直在关注业界新技术，力求提高可用性、降低成本、优化用户体验，并针对“点评”这一第三方参与的特点，摸索出一些特有的解决方案，借此机会希望能够分享给大家。&lt;/p&gt;

&lt;div style="width: 425px" id="__ss_4545503"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="大众点评网的技术变迁之路" href="http://www.slideshare.net/jeffz/ss-4545503"&gt;大众点评网的技术变迁之路&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4545503" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-100619101718-phpapp02&amp;stripped_title=ss-4545503" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4545503" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-100619101718-phpapp02&amp;stripped_title=ss-4545503" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

  &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt;

&lt;/div&gt;&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html"&gt;盛大创新院赞助首届.NET技术交流会开始报名了！&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-is-coming.html"&gt;盛大创新院赞助首届.NET技术交流会即将召开&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;盛大创新院赞助首届.NET技术交流会 - 各场演讲幻灯片 &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-videos.html"&gt;盛大创新院赞助首届.NET技术交流会 - 演讲录像及下载&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-all-slides.html#comments</comments>
      <pubDate>Sat, 19 Jun 2010 15:48:23 GMT</pubDate>
      <lastBuildDate>Sat, 19 Jun 2010 15:48:23 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/parallel/">并行处理</category>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>盛大创新院赞助首届.NET技术交流会即将召开</title>
      <link>http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-is-coming.html</link>
      <guid>http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-is-coming.html</guid>
      <description>&lt;p&gt;由&lt;a href="http://blog.zhaojie.me/2010/01/1651772.html"&gt;盛大创新院&lt;/a&gt;赞助的首届.NET技术大会将于6月19号下午1点召开，本次交流会请到了四位讲师，议题覆盖了F#、C#、Rails及架构等多个方面。我已经看过了各场演讲的幻灯片草稿，也很期待各位讲师在正式演讲中的表现。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/conf-1-600x850.jpg" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/conf-1-600x850.jpg" width="300" /&gt;&lt;/a&gt; 

&lt;p&gt;本次大会中，我们还获得了人民邮电出版社&lt;a href="http://www.turingbook.com/Homepage/Default.aspx"&gt;图灵教育&lt;/a&gt;赠送的20册图书，将会作为奖品赠送给在交流会中表现积极的听众。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/turingbook.jpg" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/turingbook.jpg" width="300" /&gt;&lt;/a&gt; 

&lt;p&gt;此外，我们还请到了&lt;a href="http://www.ku6.com/"&gt;酷六网&lt;/a&gt;的专业摄影师对演讲过程进行全程拍摄，并配合各位讲师自身的屏幕录像，将在后期合成为适合独立观看的演讲视频，让不能到场的朋友在线或是下载后观看。&lt;/p&gt;

&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/ku6-logo.jpg" /&gt; 

&lt;p&gt;本次会议的邀请函已经发给各位报名者，请携带邀请函至会议现场签到，&lt;span style="color:red;"&gt;没有报名的朋友可以在现场直接报名&lt;/span&gt;。&lt;a href="http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html"&gt;关于会议的时间、地点、交通、议程等更多信息，请关注会议的报名信息&lt;/a&gt;。&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html"&gt;盛大创新院赞助首届.NET技术交流会开始报名了！&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;盛大创新院赞助首届.NET技术交流会即将召开 &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-all-slides.html"&gt;盛大创新院赞助首届.NET技术交流会 - 各场演讲幻灯片&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-videos.html"&gt;盛大创新院赞助首届.NET技术交流会 - 演讲录像及下载&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-is-coming.html#comments</comments>
      <pubDate>Thu, 17 Jun 2010 03:45:06 GMT</pubDate>
      <lastBuildDate>Thu, 17 Jun 2010 03:45:06 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>编程语言的发展趋势及未来方向（7）：总结</title>
      <link>http://blog.zhaojie.me/2010/06/trends-and-future-directions-in-programming-languages-by-anders-7-conclusion.html</link>
      <guid>http://blog.zhaojie.me/2010/06/trends-and-future-directions-in-programming-languages-by-anders-7-conclusion.html</guid>
      <description>&lt;p&gt;这是&lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;Anders Hejlsberg&lt;/a&gt;（不用介绍这是谁了吧）在&lt;a href="http://channel9.msdn.com/posts/adebruyn/TechDays-2010-Developer-Keynote-by-Anders-Hejlsberg/"&gt;比利时TechDays 2010所做的开场演讲&lt;/a&gt;。由于最近我在博客上关于语言的讨论比较多，出于应景，也打算将Anders的演讲完整地听写出来。在上一部分中，Anders谈论了“并发”，这也是他眼中编程语言发展的三种趋势之一，并演示了.NET 4.0中并行库的神奇效果。现在则是此次演讲的最后一部分，Anders对整场演讲内容进行了总结和回顾（本文较短，主要内容请参考之前的文章）。&lt;/p&gt;

&lt;p&gt;如果没有特别说明，所有的文字都直接翻译自Anders的演讲，并使用我自己的口语习惯表达出来，对于Anders的口误及反复等情况，必要时在译文中自然也会进行忽略。为了方便理解，我也会将视频中关键部分进行截图，而某些代码演示则会直接作为文章内容发表。 &lt;/p&gt;

&lt;p&gt;（听写开始，接&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-6-concurrency.html"&gt;上篇&lt;/a&gt;）&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/49.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/49-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;OK，我想现在已经讲的差不多了，我来做个总结吧。&lt;/p&gt;

&lt;p&gt;在我看来，对于编程语言来说，现在出现了许多有趣的东西，也是令人激动的时刻。在过去，大约1995-2005年，的确可以说是一个有些特别的编程语言的黄金时期。你知道，当Java出现的时候，编程语言的门槛变得平坦了，一切都是Java，天啊其他编程语言都完蛋了，我们也没什么可做的了。然后我们又逐渐发现，这远没有结束，现在回顾起来，会发现又出现了许多有趣的编程语言。我很兴奋，因为新语言代表了我们在编程领域上的进步。 &lt;/p&gt;

&lt;p&gt;如果要我概括在未来十年编程语言会变成什么样，首先，我认为编程语言应该变得更加“声明式”，我们需要设法为语言引入一些如元编程，函数式编程的能力，同时可能也要寻找让用户有办法扩展语法，使他们可以构造领域特定语言等等。我想在十年以后，动态语言和静态语言的区别也差不多会消失了，这两者会合并为一种单一的常见的编程范式。在并发方面，语言会采纳一些特性，可以利用起隔离性，函数式的纯粹性，以及更好的不可变数据类型的编写方式。不过总体来说我想强调的是，对于编程语言，新的范式则是“多范式”编程语言。 &lt;/p&gt;

&lt;p&gt;这就是我现在对编程语言的看法，希望我没有给你带来过多内容。如果你对C# 4.0有更多兴趣，今天下午一点我还有一个讲座。多谢捧场，希望你对这次会议感到满意。谢谢。&lt;/p&gt;

&lt;p&gt;（全场演讲到此结束）&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html"&gt;编程语言的发展趋势及未来方向（1）：历史回顾及趋势概述&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-2-declarative-programming-and-dsl.html"&gt;编程语言的发展趋势及未来方向（2）：声明式编程与DSL&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-3-functional-programming-and-fsharp.html"&gt;编程语言的发展趋势及未来方向（3）：函数式编程&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-4-dynamic-languages.html"&gt;编程语言的发展趋势及未来方向（4）：动态语言&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-5-meta-programming.html"&gt;编程语言的发展趋势及未来方向（5）：元编程&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-6-concurrency.html"&gt;编程语言的发展趋势及未来方向（6）：并发&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;编程语言的发展趋势及未来方向（7）：总结&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/06/trends-and-future-directions-in-programming-languages-by-anders-7-conclusion.html#comments</comments>
      <pubDate>Sat, 05 Jun 2010 07:53:13 GMT</pubDate>
      <lastBuildDate>Sat, 05 Jun 2010 07:53:13 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/dotnet/">.Net框架</category>
      <title>编程语言的发展趋势及未来方向（6）：并发</title>
      <link>http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-6-concurrency.html</link>
      <guid>http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-6-concurrency.html</guid>
      <description>&lt;p&gt;这是&lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;Anders Hejlsberg&lt;/a&gt;（不用介绍这是谁了吧）在&lt;a href="http://channel9.msdn.com/posts/adebruyn/TechDays-2010-Developer-Keynote-by-Anders-Hejlsberg/"&gt;比利时TechDays 2010所做的开场演讲&lt;/a&gt;。由于最近我在博客上关于语言的讨论比较多，出于应景，也打算将Anders的演讲完整地听写出来。在上一部分中，Anders谈论了“元编程”及他正在努力的“编译器即服务”功能。在这一部分中，Anders则谈论了“并发”，这也是他眼中编程语言发展的三种趋势之一，并演示了.NET 4.0中并行库的神奇效果。&lt;/p&gt;

&lt;p&gt;如果没有特别说明，所有的文字都直接翻译自Anders的演讲，并使用我自己的口语习惯表达出来，对于Anders的口误及反复等情况，必要时在译文中自然也会进行忽略。为了方便理解，我也会将视频中关键部分进行截图，而某些代码演示则会直接作为文章内容发表。 &lt;/p&gt;

&lt;p&gt;（听写开始，接&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-5-meta-programming.html"&gt;上篇&lt;/a&gt;）&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/39.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/39-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;好，最后我想谈的内容是“并发”。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/40.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/40-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;听说过摩尔定律的请举手……几乎是所有人。那么多少人听说了摩尔定律已经结束了呢？嗯，还是有很多人。我有好消息，也有坏消息。我认为摩尔定律并没有停止。摩尔定律说的是：可以在集成电路上低成本地放置晶体管的数目，约每两年便会增加一倍。有趣的是，这个定律从60年代持续到现在，而从一些迹象上来看，这个定律会继续保持20到30年。 &lt;/p&gt;

&lt;p&gt;摩尔定理有个推论，便是说时钟速度将根据相同的周期提高，也就是说每隔大约24个月，CPU的速度便会加倍──而这点已经停止了。再来统计一下，你们之中有谁的机器里有20GHz的CPU？看到了没？一个人都没有。但如果你从五年前开始计算的话，现在我们应该已经在使用20GHz的CPU了，但事实并非如此。这点在五年前就停止了，而且事实上最大速度还有些下降，因为发热量实在太大了，会消耗许多能源，让电池用的太快。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/41.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/41-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;有些物理方面的基础因素让CPU不能运行的太快。然而，另一意义上的摩尔定理出现了。我们还是可以看到容量的增加，因为可以在同一个表盘上放置多个CPU了。目前已经有了双核、四核，Intel的CTO在三年前说，十年后我们可以出现80核的处理器。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/42.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/42-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;到了那个时候，你的任务管理器中就可能是这样的。似乎有些吓人，不过这是我们实验室中真实存在的128核机器。你可以看到，计算能力已经完全用上了。这便是个问题，比如你在这台强大的机器上进行一个实验，你自然希望看到100%的使用状况，不过传统的实验都是在一个核上执行的，所以我们面临的挑战是，我们需要换一种写程序的方式来利用此类机器。 &lt;/p&gt;

&lt;p&gt;我的一个同事，Herb Sutter，他写过一篇文章，谈到“&lt;a href="http://www.gotw.ca/publications/concurrency-ddj.htm"&gt;免费的午餐已经结束了&lt;/a&gt;”。没错，我们已经不能写一个程序，然后对客户说：啊，未来的硬件会让它运行的越来越快，我们不用关心太多──不，已经不会这样了，除非你换种不同的写法。实话说，这是个挑战，也是个机遇。说它是个挑战，是因为并发十分困难，至今我们对此还没有简单的答案，稍后我会演示一些正有所改善的东西，但……这也是一个机遇，在这样的机器上，你的确可以用完所有的核，这样便能获得性能提高，不过做法需要有所不同。 &lt;/p&gt;

&lt;p&gt;多核革命的一个有趣之处在于，它对于并发的思维方式会有所改变。传统的并发思维是在单个CPU上执行多个逻辑任务，使用旧有的分时方式、时间片模型来执行多个任务。但是，你想一下便会发现如今的并发情况正好相反，现在是要将一个逻辑上的任务放在多个CPU上执行。这改变了我们编写程序的方式，这意味着对于语言或是API来说，我们需要有办法来分解任务，把它拆分成多个小任务后独立的执行，而传统的编程语言中并不关注这点。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/43.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/43-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;使用目前的并发API来完成工作并不容易，比如使用Thread，ThreadPool，lock，Monitor等等，你无法太好的进展。不过.NET 4.0提供了一些美妙的事物，我们称之为.NET并行扩展。它是一种现代的并发模型，将逻辑上的任务并发与我们实际使用的的物理模型分离开来。以前我们的API都是直接处理线程，也就是（上图）下方橙色的部分，不过有了.NET并行扩展之后，你可以使用更为逻辑化的编程风格。任务并行库（Task Parallel Library），并行LINQ（Parallel LINQ）以及协调数据结构（Coordination Data Structures）让你可以直接关注逻辑上的任务，而不必关心它们是如何运行的，或是使用了多少个线程和CPU等等。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/44.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/44-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;下面我来简单演示一下它们的使用方式。我带来了一个PLINQ演示，这里是一些代码，读取XML文件的内容。这有个50M大小的popname.xml文件，保存了美国社会安全数据库里的信息，包含某个洲在某一年的人口统计信息。这个程序会读取这个XML文件，把它转化成一系列对象，并存放在一个List中。然后对其执行一个LINQ语句，查找所有在华盛顿名叫Robert的人，再根据年份进行排序：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;Loading XML data...&amp;quot;&lt;/span&gt;);
&lt;span style="color: blue"&gt;var &lt;/span&gt;popNames =
    (&lt;span style="color: blue"&gt;from &lt;/span&gt;e &lt;span style="color: blue"&gt;in &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;.Load(&lt;span style="color: #a31515"&gt;&amp;quot;popnames.xml&amp;quot;&lt;/span&gt;).Elements(&lt;span style="color: #a31515"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;)
     &lt;span style="color: blue"&gt;select new
     &lt;/span&gt;{
         Name = (&lt;span style="color: blue"&gt;string&lt;/span&gt;)e.Attribute(&lt;span style="color: #a31515"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;),
         State = (&lt;span style="color: blue"&gt;string&lt;/span&gt;)e.Attribute(&lt;span style="color: #a31515"&gt;&amp;quot;State&amp;quot;&lt;/span&gt;),
         Year = (&lt;span style="color: blue"&gt;int&lt;/span&gt;)e.Attribute(&lt;span style="color: #a31515"&gt;&amp;quot;Year&amp;quot;&lt;/span&gt;),
         Count = (&lt;span style="color: blue"&gt;int&lt;/span&gt;)e.Attribute(&lt;span style="color: #a31515"&gt;&amp;quot;Count&amp;quot;&lt;/span&gt;)
     })
    .ToList();

&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(popNames.Count + &lt;span style="color: #a31515"&gt;&amp;quot; records&amp;quot;&lt;/span&gt;);
&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine();

&lt;span style="color: blue"&gt;string &lt;/span&gt;targetName = &lt;span style="color: #a31515"&gt;&amp;quot;Robert&amp;quot;&lt;/span&gt;;
&lt;span style="color: blue"&gt;string &lt;/span&gt;targetState = &lt;span style="color: #a31515"&gt;&amp;quot;WA&amp;quot;&lt;/span&gt;;

&lt;span style="color: blue"&gt;var &lt;/span&gt;querySequential =
    &lt;span style="color: blue"&gt;from &lt;/span&gt;n &lt;span style="color: blue"&gt;in &lt;/span&gt;popNames
    &lt;span style="color: blue"&gt;where &lt;/span&gt;n.Name == targetName &amp;amp;&amp;amp; n.State == targetState
    &lt;span style="color: blue"&gt;orderby &lt;/span&gt;n.Year
    &lt;span style="color: blue"&gt;select &lt;/span&gt;n;&lt;/pre&gt;

&lt;p&gt;我们来执行一下……首先加载XML文件，然后进行查询。利用PLINQ我们可以做到并行地查询。我们只要拷贝一份代码……改成queryParallel……现在我唯一要做的只是在数据源上使用AsParallel扩展方法，这样便会引入一套新的类型和实现，此时相同的LINQ操作使用的便是并行的实现：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;queryParallel =
    &lt;span style="color: blue"&gt;from &lt;/span&gt;n &lt;span style="color: blue"&gt;in &lt;/span&gt;popNames&lt;span style="background-color:yellow;"&gt;.AsParallel()&lt;/span&gt;
    &lt;span style="color: blue"&gt;where &lt;/span&gt;n.Name == targetName &amp;amp;&amp;amp; n.State == targetState
    &lt;span style="color: blue"&gt;orderby &lt;/span&gt;n.Year
    &lt;span style="color: blue"&gt;select &lt;/span&gt;n;&lt;/pre&gt;

&lt;p&gt;我们重新执行两个查询。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/45.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/45-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;再次加载XML数据……并行实现使用了1.5秒，我们再试着运行一次，一般结果会更好一些，现在可能刚好在执行一些后台任务。一般我们可以得到更快的结果……这次比较接近了。现在你可以观察到，我们并不需要做太多事情，便可以在我的双核机器上得到并发的效果。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/46.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/46-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;这里我无法保证说，我们只要随时加上AsParallel便可以得到两倍的性能，有时可以有时不行，有些查询能够被并行，有的则不可以。然而，我想你一定同意一点，使用如LINQ这样的DSL能够方便我们编写并行的代码，也更有可能利用起并行效果。虽然不是每次都有效，但是尝试的成本也很低。如果我们使用普通的for循环来编写代码，在某个地方使用线程池等等，便很容易在这些API里失去方向。而这里我们只要简单地尝试一下，便能知道是否可以提高性能了。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/47.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/47-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;这里你已经看到我使用的LINQ查询，而现在也有很多工作是通过循环来完成的。你可以想象主要的运算是从哪里来的，很自然会是在循环里操作数据。如果循环的每个迭代都是独立的，便有很大的机会可以利用并发操作──我知道这里是“如果”，不过长期来看则一定会出现这样的情况。这时候便可以使用并行扩展，或者说是.NET并行扩展里的新API，把循环转化成并行的循环，只要简单的改变……几乎只要用同样的循环体把for重构成Parallel.For就行了。如果你有foreach操作就可以使用Parallel.ForEach，或是一系列顺序执行的语句也可以用上Parallel.Invoke。此时任务并行库会接管并执行这些任务，根据你的CPU数量使用最优化的线程数量，你不需要关注更深的细节，只需要编写逻辑就可以了。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/48.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/48-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;就像我说的那样，可能你会有独立的任务但也可能没有，所以很多时候我们需要编程语言来关注这方面的事情。比如“隔离性（Isolation）”。例如，编译器如何发现这段代码是独立的，可以安全地并发执行，好比我创建了一个对象，在分享给其他人之前，我对它的改变是安全的。但是我一旦把它们共享出去了，那么它们便不安全了。所以如果我们的类型系统可以跟踪到这样的共享，如&lt;a href="http://en.wikipedia.org/wiki/Linear_type_system"&gt;Linear Types&lt;/a&gt;──这在学术界也有一些研究。我们也可以在函数的纯洁性（Purity）方面下功夫，如关注某个函数是否有副作用，有些时候编译器可以做这方面的检查，它可以禁止某些操作，以此保证我们写出纯函数。还有便是不可变性（Immutability），目前的C#或VB，我们需要额外的工作才能写出不可变的代码──但本不该这样，我们应该在语言层面上更好的支持不可变性。这些都是在并发方面需要考虑的问题。 &lt;/p&gt;

&lt;p&gt;如果说有哪个语言特性超出这个范畴，我想说这里还有一个原则：你不该期望C#中出现某个特别的并发模型，而应该是一种通用的，可用于各种不同的并发场景的特性，就像隔离性、纯洁性及不可变性那样。语言拥有这样的特性之后，就可以用于构建各种不同的API，各种并发方式都可以利用到核心的语言特性。&lt;/p&gt;

&lt;p&gt;（未完待续）&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html"&gt;编程语言的发展趋势及未来方向（1）：历史回顾及趋势概述&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-2-declarative-programming-and-dsl.html"&gt;编程语言的发展趋势及未来方向（2）：声明式编程与DSL&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-3-functional-programming-and-fsharp.html"&gt;编程语言的发展趋势及未来方向（3）：函数式编程&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-4-dynamic-languages.html"&gt;编程语言的发展趋势及未来方向（4）：动态语言&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-5-meta-programming.html"&gt;编程语言的发展趋势及未来方向（5）：元编程&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;编程语言的发展趋势及未来方向（6）：并发&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/trends-and-future-directions-in-programming-languages-by-anders-7-conclusion.html"&gt;编程语言的发展趋势及未来方向（7）：总结&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-6-concurrency.html#comments</comments>
      <pubDate>Sun, 30 May 2010 14:53:05 GMT</pubDate>
      <lastBuildDate>Sun, 30 May 2010 14:53:05 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>编程语言的发展趋势及未来方向（5）：元编程</title>
      <link>http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-5-meta-programming.html</link>
      <guid>http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-5-meta-programming.html</guid>
      <description>&lt;p&gt;这是&lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;Anders Hejlsberg&lt;/a&gt;（不用介绍这是谁了吧）在&lt;a href="http://channel9.msdn.com/posts/adebruyn/TechDays-2010-Developer-Keynote-by-Anders-Hejlsberg/"&gt;比利时TechDays 2010所做的开场演讲&lt;/a&gt;。由于最近我在博客上关于语言的讨论比较多，出于应景，也打算将Anders的演讲完整地听写出来。在上一部分中，Anders谈及了他眼中编程语言的另一个发展趋势：动态性。在这一部分中，Anders则讨论了动态语言所擅长的“元编程”，并简单介绍了他为静态类型语言所设计的一种改进方案：编译器即服务。&lt;/p&gt;

&lt;p&gt;如果没有特别说明，所有的文字都直接翻译自Anders的演讲，并使用我自己的口语习惯表达出来，对于Anders的口误及反复等情况，必要时在译文中自然也会进行忽略。为了方便理解，我也会将视频中关键部分进行截图，而某些代码演示则会直接作为文章内容发表。&lt;/p&gt;

&lt;p&gt;（听写开始，接&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-4-dynamic-languages.html"&gt;上篇&lt;/a&gt;）&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/36.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/36-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;动态语言的另一个关键和有趣之处在于“&lt;a href="http://en.wikipedia.org/wiki/Metaprogramming"&gt;元编程&lt;/a&gt;”。“元编程”实际上是“代码生成”的一种别称，其实在日常应用中我们也经常依赖这种做法。观察动态语言适合元编程的原因也是件十分有趣的事情。 &lt;/p&gt;

&lt;p&gt;在这个蓝框中是一段Ruby on Rails代码（见上图）。简单地说，这里定义了一个Order类，继承了ActiveRecord，也定义了一些关系，如belongs_to和has_many关系。Ruby这种动态语言的关键之处，在于一切事物都是通过执行而得到的，包括类型声明。比如这里的类型申明执行了belongs_to和has_many方法的调用，执行belongs_to会截获一对多或一对一关系所需要的信息，因此在这里语言是在运行的时候，动态为自身生成了代码。 &lt;/p&gt;

&lt;p&gt;实现这点在动态语言里自然会更容易一些，因为它们没有编译期和执行期的区别。静态类型语言在这方面会比较困难。例如在C#或Java里使用ORM时，传统的做法是让代码生成器去观察数据库，生成一大堆代码，然后再编译，有些复杂。不过我时常想着去改善这一点。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/37.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/37-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;其中一种做法，是我们正在努力实现的“编译器即服务”，我现在先对它进行一些简单的介绍。传统的编译器像是一个黑盒，你在一端输入代码，而另一端便会生成.NET程序集或是对象代码等等。而这个黑盒却很神秘，你目前很难参与或理解它的工作。 &lt;/p&gt;

&lt;p&gt;你可以想象，一些代码往往是不包含在源文件中的。如果你想要交互式编程的体验，例如一个交互式的提示符，那么代码不是保存在源文件中而是由用户输入的。如果您在实现一个DSL，例如Windows Workflow或是Biztalk，则可能用C#或VB实现了一些需要动态执行的规则，它们也不是保存在源文件中，而可能是放在XML属性中的。此时你想编译它们却做不到，你还是要把它们放入源文件，这就变的复杂了。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/38.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/38-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;另一方面，对于编译器来说，我们不一定需要它生成程序集，有时候需要的是一些树状的表现形式。例如一些由用户反射生成的代码，便可能不要程序集而是一个解析树，然后可以对它进行识别和重写。因此，我们可能越来越需要的是一些API，以此开放编译器的功能。 &lt;/p&gt;

&lt;p&gt;例如，你可以给它一小段代码，让它返回一段可执行的程序，或是一个可以识别或重写的解析树。这么做可以让静态类型语言获得许多有用的功能，例如元编程，以及可操作的完整的对象模型等等。我们正在朝这方面努力，我也会在下午1点的C# 4.0演讲中谈论更多这方面的内容。&lt;/p&gt;

&lt;p&gt;（未完待续）&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html"&gt;编程语言的发展趋势及未来方向（1）：历史回顾及趋势概述&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-2-declarative-programming-and-dsl.html"&gt;编程语言的发展趋势及未来方向（2）：声明式编程与DSL&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-3-functional-programming-and-fsharp.html"&gt;编程语言的发展趋势及未来方向（3）：函数式编程&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-4-dynamic-languages.html"&gt;编程语言的发展趋势及未来方向（4）：动态语言&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;编程语言的发展趋势及未来方向（5）：元编程&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-6-concurrency.html"&gt;编程语言的发展趋势及未来方向（6）：并发&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/trends-and-future-directions-in-programming-languages-by-anders-7-conclusion.html"&gt;编程语言的发展趋势及未来方向（7）：总结&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-5-meta-programming.html#comments</comments>
      <pubDate>Sun, 30 May 2010 09:42:13 GMT</pubDate>
      <lastBuildDate>Sun, 30 May 2010 09:42:13 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>编程语言的发展趋势及未来方向（4）：动态语言</title>
      <link>http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-4-dynamic-languages.html</link>
      <guid>http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-4-dynamic-languages.html</guid>
      <description>&lt;p&gt;这是&lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;Anders Hejlsberg&lt;/a&gt;（不用介绍这是谁了吧）在&lt;a href="http://channel9.msdn.com/posts/adebruyn/TechDays-2010-Developer-Keynote-by-Anders-Hejlsberg/"&gt;比利时TechDays 2010所做的开场演讲&lt;/a&gt;。由于最近我在博客上关于语言的讨论比较多，出于应景，也打算将Anders的演讲完整地听写出来。在上一部分中，Anders谈及了声明式编程的另一个重要组成部分：函数式编程，并使用.NET平台上的函数式编程语言F#进行了演示。在这一部分中，Anders讨论了动态语言及JavaScript的相关内容，“动态性”也是Anders眼中编程语言的发展趋势之一。&lt;/p&gt;

&lt;p&gt;如果没有特别说明，所有的文字都直接翻译自Anders的演讲，并使用我自己的口语习惯表达出来，对于Anders的口误及反复等情况，必要时在译文中自然也会进行忽略。为了方便理解，我也会将视频中关键部分进行截图，而某些代码演示则会直接作为文章内容发表。&lt;/p&gt;

&lt;p&gt;（听写开始，接&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-3-functional-programming-and-fsharp.html"&gt;上篇&lt;/a&gt;）&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/26.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/26-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;我下面继续要讲的是动态语言，这也是我之前提到的三种趋势之一。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/27.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/27-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;我还是尝试着去找到动态语言的定义，但是你也知道……一般地说，动态语言是一些不对编译时和运行时进行严格区分的语言。这不像一些静态编程语言，比如C#，你先进行编译，然后会得到一些编译期错误，稍后再执行，而对于动态语言来说这两个阶段便混合在一起了。我们都熟悉一些动态语言，比如JavaScript，Python，Ruby，LISP等等。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/28.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/28-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;动态语言有一些优势，而静态语言也有着另一些优势，这也是两个阵营争论多年的内容。老实讲，我认为结果不是两者中的任意一个，它们都有各自十分重要的优点，而长期来看，我认为结果应该是两者的杂交产物，我认为在语言发展中也可以看到这样的趋势，这两部分内容正在合并。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/29.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/29-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;许多人认定动态语言执行起来很慢，也没有类型安全等等。我想在这里观察并比较一下，究竟是什么原因会让静态语言和动态语言在这方面有不同的性质。这里有一段有趣的代码，它的语法在JavaScript和C#里都是正确的，这样我们便能比较两种语言是如何处理这段代码的。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/30.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/30-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;首先我们把它看作是一段C#代码，它只是用for循环把一堆整数相加，你肯定不会这么做，这只是一个示例。在C#中，当我们使用var关键字时，它表示“请为我推断这里的类型”，所以在这里a和i的类型都是int。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/31.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/31-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;这断代码在执行的时候，这两个值都是32位整数，而for循环只是简单的使用ADD指令即可，执行起来自然效率很高。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/32.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/32-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;但如果从JavaScript或是动态语言的角度来看……或者说对于动态类型的语言来说，var只代表了“一个值”，它可以是任意类型，我们不知道它究竟是什么。所以当我们使用var a或var i时，我们只是定义了两个值，其中包含了一个“类型”标记，表明在运行时它是个什么类型。在这里它是一个int，因此包含了存储int值的空间。但有些时候，例如要存储一个double值，那么可能便需要更多的空间，还可能是一个字符串，于是便包含一个引用。 &lt;/p&gt;

&lt;p&gt;所以两者的区别之一便是，表示同样的值在动态语言中会有一些额外的开销，代价较高。而在如今的CPU中，“空间”便等于“速度”，所以较大的值便需要较长时间进行处理，这里便损失了一部分效率。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/33.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/33-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;在JavaScript中，我们如果要处理a加i，那么便不仅仅是一个ADD指令。首先它必须查看两个变量中的类型标记，然后根据类型选择合适的相加操作。于是再去加载两个值，然后再进行加法操作。这里还需要进行越界检查，因为在JavaScript中一旦越界了便要使用double，等等。很明显在这里也有许多开销。一般来说，动态语言是使用解释器来执行的，因此还有一些解释器需要的二进制码。你把这些开销全部加起来以后，便会发现执行代码时需要10倍到100倍的开销。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/34.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/34-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;不过由于近几年来出现的一些动态虚拟机或引擎，目前这些情况改善了许多。比方说，这是传统的情况（上图左），如在IE 6或IE 7里使用的非常缓慢的解释器。目前的情况是，大部分的JavaScript引擎使用了JIT编译器（上图中），于是便省下了解释器的开销，这样性能损失便会减小至3到10倍。而在过去的两三年间，JIT编译器也变得越来越高效，浏览器中新一代的适应性JIT编译器（上图右），如&lt;a href="https://wiki.mozilla.org/JavaScript:TraceMonkey"&gt;TraceMonkey&lt;/a&gt;，&lt;a href="http://code.google.com/p/v8/"&gt;V8&lt;/a&gt;，还有如今&lt;a href="http://blogs.msdn.com/ie/archive/2010/03/18/the-new-javascript-engine-in-internet-explorer-9.aspx"&gt;微软在IE 9中使用的Chakra引擎&lt;/a&gt;。这种适应性的JIT编译器使用了一部分有趣的技术，如Inline Caching、Type Specialization、Hidden Classes、Tracing等等，它们可以将开销降低至2到3倍的范围内，这种效率的提升可谓十分神奇。 &lt;/p&gt;

&lt;p&gt;在我看来，JavaScript引擎可能已经接近了性能优化的极限，我们在效率上可以提升的空间已经不多。不过我同样认为，如今JavaScript语言的性能已经足够快了，完全有能力统治Web客户端。 &lt;/p&gt;

&lt;p&gt;有人认为，JavaScript从来不是一种适合进行大规模编程的语言。如今也有一些有趣的工具，如&lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Tookit&lt;/a&gt;，在微软&lt;a href="http://www.nikhilk.net/"&gt;Nikhil Kothari&lt;/a&gt;也创建了&lt;a href="http://projects.nikhilk.net/ScriptSharp"&gt;Script#&lt;/a&gt;，让你可以编写C#或Java代码，然后将代码编译成JavaScript，这就像是将JavaScript当作是一种中间语言。Google Wave的所有代码都用GWT写成，它的团队坚持认为用JavaScript不可能完成这样的工作，因为复杂度实在太高了。如今在这方面还有一些有趣的开发成果，我不清楚什么时候会结束。不过我认为，这些都不算是大规模的JavaScript开发方案，而编写C#或Java代码再生成JavaScript的方式也不能算是完全正确的做法。我们可以关注这方面的走向。 &lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/35.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/35-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;在.NET 4.0的运行时进行动态编程时，我们引入了一个新功能：&lt;a href="http://dlr.codeplex.com/"&gt;动态语言运行时&lt;/a&gt;。可以这样理解，CLR的目的是为静态类型的编程语言提供一个统一的框架或编程模型，而DLR便是在.NET平台上为动态语言提供了统一的编程模型。CLR本身已经有一些支持动态编程能力，如反射，Emit等等。不过在.NET上实现动态语言的时候，总会一遍又一遍地去实现某些功能，还有如动态语言如何与静态语言进行交互，这些都由DLR来提供。DLR的特性包含了，如表达式树、动态分发、Call Site缓存，这可以提高动态代码的执行效率。&lt;/p&gt;

&lt;p&gt;在.NET 4.0中我们使用了DLR，不仅仅是IronPython和IronRuby，还有C# 4和VB.NET 10，它们使用DLR实现动态分发功能。因此我们共享了语言的动态能力实现方式，于是这些语言之间可以轻松地进行交互。同样我们可以与其他多样性的技术进行交互，例如使用JavaScript操作Silverlight的DOM，或是与Ruby、Python代码沟通，甚至用来控制Office等自动化服务。&lt;/p&gt;

&lt;p&gt;（未完待续）&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html"&gt;编程语言的发展趋势及未来方向（1）：历史回顾及趋势概述&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-2-declarative-programming-and-dsl.html"&gt;编程语言的发展趋势及未来方向（2）：声明式编程与DSL&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-3-functional-programming-and-fsharp.html"&gt;编程语言的发展趋势及未来方向（3）：函数式编程&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;编程语言的发展趋势及未来方向（4）：动态语言&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-5-meta-programming.html"&gt;编程语言的发展趋势及未来方向（5）：元编程&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-6-concurrency.html"&gt;编程语言的发展趋势及未来方向（6）：并发&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/trends-and-future-directions-in-programming-languages-by-anders-7-conclusion.html"&gt;编程语言的发展趋势及未来方向（7）：总结&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-4-dynamic-languages.html#comments</comments>
      <pubDate>Sun, 23 May 2010 14:16:22 GMT</pubDate>
      <lastBuildDate>Sun, 23 May 2010 14:16:22 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/parallel/">并行处理</category>
      <category domain="http://blog.zhaojie.me/cutting-edge/">技术尝鲜</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>盛大创新院赞助首届.NET技术交流会开始报名了！</title>
      <link>http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html</link>
      <guid>http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html</guid>
      <description>&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-in.png" /&gt; 

&lt;p&gt;自从上次在博客中提到&lt;a href="http://blog.zhaojie.me/2010/01/1651772.html"&gt;盛大创新院&lt;/a&gt;将会&lt;a href="http://blog.zhaojie.me/2010/03/snda-dotnet-conference-advices.html"&gt;赞助.NET技术会议&lt;/a&gt;已经过去了一个半月，如今这件事情终于落实了。我为此准备了数千字的申请书，但老大看也不看便表示支持。他的说法是，只要办得热烈，有影响力，那么这样的活动绝对支持。为此，各场次演讲内容及会场等诸多事宜之后，现在“首届.NET技术交流会”正式进入报名阶段了。&lt;strike&gt;人数不设上限，多多益善，怕只怕会场会显得空旷&lt;/strike&gt;，&lt;span style="color:red;"&gt;目前报名人数已达200人，请抓紧时间报名&lt;/span&gt;。除了.NET社区的群众以外，也欢迎其他技术社区的朋友前来参与交流。事实上，我组织技术交流会的目的之一便是希望能够促进.NET社区与其他技术社区的交流及相互学习。&lt;/p&gt;

&lt;h1&gt;时间及议程安排&lt;/h1&gt;

&lt;p&gt;本次交流会定于&lt;strong&gt;2010年6月19日&lt;/strong&gt;（周六）举行，具体时间如下。会议目前安排了四场演讲，除了与.NET技术直接相关的F#及C#话题以外，我们还邀请了大众点评网的核心架构师来分享他们在多年发展过程中的技术变迁过程。此外，我也联系了即将举办的Rails大会的主办方，邀请他们来分享关于Rails框架的内容。&lt;a href="http://blog.zhaojie.me/2010/05/learn-from-disadvantages.html"&gt;正如我之前说的那样&lt;/a&gt;，在以后每次技术会议上，我都会邀请其他社区的高手来讲解相关技术。&lt;/p&gt;

&lt;table style="text-align: center" border="1" cellspacing="0" cellpadding="5"&gt;&lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;时间&lt;/th&gt;

      &lt;th&gt;议程&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;12:30 ~ 13:00&lt;/td&gt;

      &lt;td&gt;签到&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;13:00 ~ 14:00&lt;/td&gt;

      &lt;td&gt;F#语言对异步程序设计的支持&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;14:00 ~ 14:10&lt;/td&gt;

      &lt;td&gt;短休&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;14:10 ~ 15:10&lt;/td&gt;

      &lt;td&gt;Rails: Better Framework, Better Life&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;15:10 ~ 15:40&lt;/td&gt;

      &lt;td&gt;茶歇&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;15:40 ~ 16:40&lt;/td&gt;

      &lt;td&gt;C#语言开发模式及实用建议&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;16:40 ~ 16:50&lt;/td&gt;

      &lt;td&gt;短休&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;16:50 ~ 17: 50&lt;/td&gt;

      &lt;td&gt;大众点评网的技术变迁过程&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;h1&gt;演讲内容&lt;/h1&gt;

&lt;p&gt;以下是关于四场演讲的详细描述。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/zhaojie.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/zhaojie.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;h2&gt;F#语言对异步程序设计的支持&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;赵劼，盛大创新院，研究员。关注前沿技术，并致力于开源社区与微软平台的组合优化。对函数式编程，并行程序开发，代码之美以及程序员能力与修养等相关问题也有着浓厚的兴趣，同时非常希望能够写程序到60岁。最近致力于F#，Scala语言及mono平台在社区中的推广。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;如今的Web应用、 Silverlight以及各种分布式系统让异步解决方案有了更进一步的需求。F#是微软.NET平台上的函数式编程语言，并添加了不少让并行及异步编程变得有趣且轻松的特性。本次演讲将讨论F#的核心概念，并探讨F#中的不可变性、函数式设计、异步工作流、代理等特性是如何应对真实应用中的异步挑战的。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/lvguoning.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/lvguoning.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;h2&gt;Rails: Better Framework, Better Life &lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;吕国宁，Intridea.com，高级工程师。超过三年的Ruby on Rails程序开发经验，先后供职于Red.com, ELCTech.com, 目前在Intridea从事ROR的咨询服务以及为客户提供解决方案。在工作之余热心国内ROR社区建设，长期致力于推动ROR社区在中国的发展，从2007年开始，作为组织者之一，在上海成立了Shanghaionrails组织，并筹办了国内第一，第二届RubyConfChina大会以及首届RailsConference。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;RoR是Ruby on Rails的缩写，是一个用于编写Web应用的框架。他基于Ruby语言，给开发人员提供了强大便利的框架支持。Ruby有很多优点，但是一直以来其流行范围仅局限于日本。2004年，当Rails框架横空出世，让人们认识到了一个更符合实际需要并且高效的web框架，在其出现不久就受到了业内的广泛关注。吕国宁将结合自己三年的Rails开发经验，给大家介绍一些Rails的优点，背后的设计文化，以及Rails的前景发展等内容。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/chenlifu.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/chenlifu.jpg" height="150" /&gt;&lt;/a&gt;

&lt;h2&gt;C#语言开发模式及实用建议&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;陈黎夫，盛大创新院，研究员&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;C#语言是微软.NET平台上的核心开发语言，从1.0到4.0的版本推进极其迅速，版本更替也带来了大量改进。在快速的发展过程中，C#的表达能力被一再强化，其功能愈发强大，语言本身也日趋复杂，这往往会让一些开发者在使用中产生迷茫，无法做到最优。希望能借此机会分享一下最新版本C#语言的开发模式以及实用建议。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/wanghong.jpg" target="_blank"&gt;&lt;img class="floatRight" src="http://img.zhaojie.me/blog/snda-dotnet-conf/wanghong.jpg" height="150" /&gt;&lt;/a&gt; 

&lt;h2&gt;大众点评网的技术变迁之路&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;讲师：&lt;/strong&gt;王宏，大众点评网，架构师&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt;大众点评网从2003年创建以来，已经经历了7个年头，在技术方面从最初构建时期的简单的、低成本的方案，到发展阶段不断“痛苦”的转型演变，到目前比较复杂的技术架构，大众点评网的技术团队一直在关注业界新技术，力求提高可用性、降低成本、优化用户体验，并针对“点评”这一第三方参与的特点，摸索出一些特有的解决方案，借此机会希望能够分享给大家。&lt;/p&gt;

&lt;h1&gt;地点&lt;/h1&gt;

&lt;p&gt;本次交流会举办地为&lt;strong&gt;上海市浦东新区碧波路888号畅星大厦&lt;/strong&gt;（地铁二号线张江高科站下，步行10分钟可达）3楼会议厅举行，地图如下：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-map.png"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-map.png" width="400" /&gt;&lt;/a&gt; 

&lt;p&gt;鸟瞰图：&lt;/p&gt;

&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-hybrid.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-hybrid.jpg" width="400" /&gt;&lt;/a&gt;

&lt;p&gt;畅星大厦外观：&lt;/p&gt;

&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-building.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-building.jpg" width="400" /&gt;&lt;/a&gt;

&lt;p&gt;会场实景照片：&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-room.jpg"&gt;&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/changxing-room.jpg" width="400" /&gt;&lt;/a&gt; 

&lt;p&gt;会场容量可以容纳超过200人，希望到时候不会显得太过空旷。:)&lt;/p&gt;

&lt;h1&gt;报名信息&lt;/h1&gt;

&lt;img src="http://img.zhaojie.me/blog/snda-dotnet-conf/sign-up-now.jpg" /&gt;

&lt;p&gt;本次交流会&lt;strike&gt;&lt;a href="http://www.diaochapai.com/survey347021"&gt;现已开始报名，请填写报名表&lt;/a&gt;，报名截止日期为2010年6月13日&lt;/strike&gt;已经截止，请等待后续消息。感谢大家支持！&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;盛大创新院赞助首届.NET技术交流会开始报名了！ &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-is-coming.html"&gt;盛大创新院赞助首届.NET技术交流会即将召开&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-all-slides.html"&gt;盛大创新院赞助首届.NET技术交流会 - 各场演讲幻灯片&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/first-snda-dotnet-conference-videos.html"&gt;盛大创新院赞助首届.NET技术交流会 - 演讲录像及下载&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/05/first-snda-dotnet-conference-sign-up.html#comments</comments>
      <pubDate>Thu, 13 May 2010 06:30:10 GMT</pubDate>
      <lastBuildDate>Thu, 13 May 2010 06:30:10 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>编程语言的发展趋势及未来方向（3）：函数式编程</title>
      <link>http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-3-functional-programming-and-fsharp.html</link>
      <guid>http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-3-functional-programming-and-fsharp.html</guid>
      <description>&lt;p&gt;这是&lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;Anders Hejlsberg&lt;/a&gt;（不用介绍这是谁了吧）在&lt;a href="http://channel9.msdn.com/posts/adebruyn/TechDays-2010-Developer-Keynote-by-Anders-Hejlsberg/"&gt;比利时TechDays 2010所做的开场演讲&lt;/a&gt;。由于最近我在博客上关于语言的讨论比较多，出于应景，也打算将Anders的演讲完整地听写出来。在上一部分中，Anders阐述了他眼中声明式编程的理念及DSL，并演示C#中一种内部DSL的形式：LINQ。在这一部分中，Anders谈及了声明式编程的另一个重要组成部分：函数式编程，并使用.NET平台上的函数式编程语言F#进行了演示。&lt;/p&gt;

&lt;p&gt;如果没有特别说明，所有的文字都直接翻译自Anders的演讲，并使用我自己的口语习惯表达出来，对于Anders的口误及反复等情况，必要时在译文中自然也会进行忽略。为了方便理解，我也会将视频中关键部分进行截图，而某些代码演示则会直接作为文章内容发表。&lt;/p&gt;

&lt;p&gt;（听写开始，接&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-2-declarative-programming-and-dsl.html"&gt;上篇&lt;/a&gt;）&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/17.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/17-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;关于声明式编程的还有一部分重要的内容，那便是&lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;函数式编程&lt;/a&gt;。函数式编程已经有很长时间的历史了，当年&lt;a href="http://en.wikipedia.org/wiki/Lisp_programming_language"&gt;LISP&lt;/a&gt;便是个函数式编程语言。除了LISP以外我们还有其他许多函数式编程语言，如&lt;a href="http://en.wikipedia.org/wiki/APL_programming_language"&gt;APL&lt;/a&gt;、&lt;a href="http://en.wikipedia.org/wiki/Haskell_(programming_language)"&gt;Haskell&lt;/a&gt;、&lt;a href="http://en.wikipedia.org/wiki/Scheme_(programming_language)"&gt;Scheme&lt;/a&gt;、&lt;a href="http://en.wikipedia.org/wiki/ML_programming_language"&gt;ML&lt;/a&gt;等等。关于函数式编程在学术界已经有过许多研究了，在大约5到10年前许多人开始吸收和整理这些研究内容，想要把它们融入更为通用的编程语言。现在的编程语言，如C#、Python、Ruby、&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;等等，它们都受到了函数式编程语言的影响。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/18.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/18-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;我想在这里先花几分钟时间简单介绍一下我眼中的函数式编程语言。我发现很多人听说过函数式编程语言，但还不十分清楚它们和普通的命令式编程语言究竟有什么区别。如今我们在使用命令式编程语言写程序时，我们经常会写这样的语句，嗨，x等于x加一，此时我们大量依赖的是状态，可变的状态，或者说变量，它们的值可以随程序运行而改变。 &lt;/p&gt;

&lt;p&gt;可变状态非常强大，但随之而来的便是叫做“副作用”的问题。在使用可变状态时，你的程序则会包含副作用，比如你会写一个无需参数的void方法，然后它会根据你的调用次数或是在哪个线程上进行调用对程序产生影响，因为void方法会改变程序内部的状态，从而影响之后的运行效果。 &lt;/p&gt;

&lt;p&gt;而在函数式编程中则不会出现这个情况，因为所有的状态都是不可变的。你可以声明一个状态，但是不能改变这个状态。而且由于你无法改变它，所以在函数式编程中不需要变量。事实上对函数式编程的讨论更像是数学、公式，而不像是程序语句。如果你把x = x + 1这句话交给一个程序员看，他会说“啊，你在增加x的值”，而如果你把它交给一个数学家看，他会说“嗯，我知道这不是true”。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/19.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/19-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;然而，如果你给他看这条语言，他会说“啊，y等于x加一，就是把x + 1的计算结果交给y，你是为这个计算指定了一个名字”。这时候在思考时就是另一种方式了，这里y不是一个变量，它只是x + 1的名称，它不会改变，永远代表了x + 1。 &lt;/p&gt;

&lt;p&gt;所以在函数式编程语言中，当你写了一个函数，接受一些参数，那么当你调用这个函数时，影响函数调用的只是你传进去的参数，而你得到的也只是计算结果。在一个纯函数式编程语言中，函数在计算时不会对进行一些神奇的改变，它只会使用你给它的参数，然后返回结果。在函数式编程语言中，一个void方法是没有意义的，它唯一的作用只是让你的CPU发热，而不能给你任何东西，也不会有副作用。当然现在你可能会说，这个CPU发多少热也是一个副作用，好吧，不过我们现在先不讨论这个问题。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/20.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/20-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;这里的关键在于，你解决问题的方法和以前大不一样了。我这里还是用代码来说明问题。使用函数式语言写没有副作用的代码，就好比在Java或C#中使用final或是readonly的成员。 &lt;/p&gt;

&lt;p&gt;例如这里，我们有一个Point类，构造函数接受x和y，还有一个MoveBy方法，可以把一个点移动一些位置。 在传统的命令式编程中，我们会改变Point实例的状态，这么做在平时可能不会有什么问题。但是，如果我把一个Point对象同时交给3个API使用，然后我修改了Point，那么如何才能告诉它们状态改变了呢？可能我们可以使用事件，blablabla，如果我们没有事件，那么就会出现那些不愉快的副作用了。 &lt;/p&gt;

&lt;p&gt;那么使用函数式编程的形式写代码，你的Point类还是可以包含状态，例如x和y，不过它们是readonly的，一旦初始化以后就不能改变了。MoveBy方法不能改变Point对象，它只能创建一个新的Point对象并返回出来。这就是一个创建新Point对象的函数，不是吗？这样就可以让调用者来决定是使用新的还是旧的Point对象，但这里不会有产生副作用的情况出现。 &lt;/p&gt;

&lt;p&gt;在函数式编程里自然不会只有Point对象，例如我们会有集合，如Dictionary，Map，List等等，它们都是不可变的。在函数式编程中，当我们向一个List里添加元素时，我们会得到一个新的List，它包含了新增的元素，但之前的List依然存在。所以这些数据结构的实现方式是有根本性区别的，它们的内部结构会设法让这类操作变的尽可能高效。 &lt;/p&gt;

&lt;p&gt;在函数式编程中访问状态是十分安全的，因为状态不会改变，我可以把一个Point或List对象交给任意多的地方去访问，完全不用担心副作用。函数式编程的十分容易并行，因为我在运行时不会修改状态，因此无论多少线程在运行时都可以观察到正确的状态。两个函数完全无关，因此它们是并行还是顺序地执行便没有什么区别了。我们还可以有延迟计算，可以进行Memorization，这些都是函数式编程中十分有趣的方面。 &lt;/p&gt;

&lt;p&gt;你可能会说，那么我们为什么不都用这种方法来写程序呢？嗯，最终，就像我之前说的那样，我们不能只让CPU发热，我们必须要把计算结果表现出来。那么我们在屏幕上打印内容时，或者把数据写入文件或是Socket时，其实就产生了副作用。因此真实世界中的函数式编程，往往都是把纯粹的部分进行隔离，或是进行更细致的控制。事实上也不会有真正纯粹的函数式编程语言，它们都会带来一定的副作用或是命令式编程的能力。但是，它们默认是函数式的，例如在函数式编程语言中，所有东西默认都是不可变的，你必须做些额外的事情才能使用可变状态或是产生危险的副作用。此时你的编程观念便会有所不同了。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/21.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/21-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;我们在自己的环境中开发出了这样一个函数式编程语言，F#，已经包含在VS 2010中了。F#诞生于微软剑桥研究院，由&lt;a href="http://blogs.msdn.com/dsyme/"&gt;Don Syme&lt;/a&gt;提出，他在F#上已经工作了5到10年了。F#使用了另一个函数式编程语言OCaml的常见核心部分，因此它是一个强类型语言，并支持一些如模式匹配，类型推断等现代函数式编程语言的特性。在此之上，F#又增加了异步工作流，度量单位等较为前沿的语言功能。 &lt;/p&gt;

&lt;p&gt;而F#最为重要的一点可能是，在我看来，它是第一个和工业级的框架和工具集，如.NET和Visual Studio，有深入集成的函数式编程语言。F#允许你使用整个.NET框架，它和C#也有类似的执行期特征，例如强类型，而且都会生成高效的代码等等。我想，现在应该是展示一些F#代码的时候了。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/22.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/22-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;首先我想先从F#中我最喜欢的特性讲起，这是个F#命令行……（打开命令行窗口以及一个F#源文件）……F#包含了一个交互式的命令行，这允许你直接输入代码并执行。例如输入5……x等于5……然后x……显示出x的值是5。然后让sqr x等于x乘以x，于是我这里定义了一个简单的函数，名为sqr。于是我们就可以计算sqr 5等于25，sqr 10等于100。 &lt;/p&gt;

&lt;p&gt;F#的使用方式十分动态，但事实上它是一个强类型的编程语言。我们再来看看这里。这里我定义了一个计算平方和的函数sumSquares，它会遍历每个列表中每个元素，平方后再把它们相加。让我先用命令式的方式编写这个函数，再使用函数式的方式，这样你可以看出其中的区别。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;sumSquaresI l = 
    &lt;span style="color: blue"&gt;let mutable &lt;/span&gt;acc = 0
    &lt;span style="color: blue"&gt;for &lt;/span&gt;x &lt;span style="color: blue"&gt;in &lt;/span&gt;l &lt;span style="color: blue"&gt;do
        &lt;/span&gt;acc &lt;- acc + sqr x
    acc&lt;/pre&gt;

&lt;p&gt;这里先是命令式的代码，我们先创建一个累加器acc为0，然后遍历列表l，把平方加到acc中，然后最后我返回acc。有几件事情值得注意，首先为了创建一个可变的状态，我必须显式地使用mutable进行声明，在默认情况下这是不可变的。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/23.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/23-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;还有一点，这段代码里我没有提供任何的类型信息。当我把鼠标停留在方法上时，就会显示sumSquaresI方法接受一个int序列作为参数并返回一个int。你可能会想int是哪里来的，嗯，它是由类型推断而来的。编译器从这里的0发现acc必须是一个int，于是它发现这里的加号表示两个int的相加，于是sqr函数返回的是个int，再接下来blablabla……最终它发现这里到处都是int。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/24.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/24-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;如果我把这里修改为浮点数0.0，鼠标再停留一下，你就会发现这个函数接受和返回的类型都变成float了。所以这里的类型推断功能十分强大，也十分方便。&lt;/p&gt;
&lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/25.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/25-thumbnail.png" /&gt;&lt;/a&gt; 

&lt;p&gt;现在我可以选择这个函数，让它在命令行里执行，然后调用sumSquaresI，提供1到100的序列，就能得到结果了。&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;let rec &lt;/span&gt;sumSquaresF l = 
    &lt;span style="color: blue"&gt;match &lt;/span&gt;l &lt;span style="color: blue"&gt;with
    &lt;/span&gt;| [] &lt;span style="color: blue"&gt;-&gt; &lt;/span&gt;0
    | h :: t &lt;span style="color: blue"&gt;-&gt; &lt;/span&gt;sqr h + sumSquaresF t&lt;/pre&gt;

&lt;p&gt;那么现在我们来换一种函数式的风格。这里是另一种写法，可以说是纯函数式的实现方式。如果你去理解这段代码，你会发现有不少数学的感觉。这里我定义了sumSqauresF函数，输入一个l列表，然后使用下面的模式去匹配l。如果它为空，则结果为0，否则把列表匹配为头部和尾部，然后便将头部的平方和尾部的平方和相加。 &lt;/p&gt;

&lt;p&gt;你会发现，在计算时我不会去改变任何一个变量的值，我只是创建新的值。我这里会使用递归，就像在数学里我们经常使用递归，把一个公式分解成几个变化的形式，以此进行递归的定义。在编程时我们也使用递归的做法，然后编译器会设法帮我们转化成尾递归或是循环等等。 &lt;/p&gt;

&lt;p&gt;于是我们便可以执行sumSquaresF函数，也可以得到相同的结果。当然实际上可能你并不会像之前这样写代码，你可能会使用高阶函数：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;let &lt;/span&gt;sumSquares l = Seq.sum (Seq.map (&lt;span style="color: blue"&gt;fun &lt;/span&gt;x &lt;span style="color: blue"&gt;-&gt; &lt;/span&gt;x * x) l )&lt;/pre&gt;

&lt;p&gt;例如这里，我只是把函数x乘以x映射到列表上，然后相加。这样也可以得到相同的结果，而且这可能是更典型的做法。我这里只是想说明，这个语言在编程时可能会给你带来完全不同的感受，虽然它的执行期特征和C#比较接近。 &lt;/p&gt;

&lt;p&gt;这便是关于F#的内容。&lt;/p&gt;

&lt;p&gt;（未完待续）&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html"&gt;编程语言的发展趋势及未来方向（1）：历史回顾及趋势概述&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-2-declarative-programming-and-dsl.html"&gt;编程语言的发展趋势及未来方向（2）：声明式编程与DSL&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;编程语言的发展趋势及未来方向（3）：函数式编程&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-4-dynamic-languages.html"&gt;编程语言的发展趋势及未来方向（4）：动态语言&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-5-meta-programming.html"&gt;编程语言的发展趋势及未来方向（5）：元编程&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-6-concurrency.html"&gt;编程语言的发展趋势及未来方向（6）：并发&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/trends-and-future-directions-in-programming-languages-by-anders-7-conclusion.html"&gt;编程语言的发展趋势及未来方向（7）：总结&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-3-functional-programming-and-fsharp.html#comments</comments>
      <pubDate>Tue, 04 May 2010 11:09:21 GMT</pubDate>
      <lastBuildDate>Tue, 04 May 2010 11:09:21 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/discussion/">思考讨论</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>幻灯片：Why Java Sucks and C# Rocks</title>
      <link>http://blog.zhaojie.me/2010/04/why-java-sucks-and-csharp-rocks-slides-final-version.html</link>
      <guid>http://blog.zhaojie.me/2010/04/why-java-sucks-and-csharp-rocks-slides-final-version.html</guid>
      <description>&lt;p&gt;昨天在&lt;a href="http://blog.zhaojie.me/2010/04/speech-why-java-sucks-and-csharp-rocks.html"&gt;5173与博客园联合举办的技术交流活动&lt;/a&gt;中进行了演讲，现在幻灯片终于可以放出了。当然，光看幻灯片本身的效果不大，在演讲过程中我进行了非常多的代码演示和说明，幻灯片本身只能算是一个辅助手段，因此各位没有来听演讲的朋友，还是等我慢慢地对这个话题进行详细讨论吧。&lt;/p&gt;  &lt;p&gt;不过既然幻灯片放出了，那么我进行这场“闹剧”的目的也可以完全公开了，其中有三：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;揭露Java语言的生产力的缺失 &lt;/li&gt;    &lt;li&gt;表达C#的发展现状与常用编程范式 &lt;/li&gt;    &lt;li&gt;鼓励别人抛弃Java语言，采用Scala。 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;没错，我的最终目的不是为了“让Java程序员使用C#”，而是“让Java程序员使用Scala”。&lt;/p&gt;  &lt;p&gt;这里我不得不多说几句。前天我写了“&lt;a href="http://blog.zhaojie.me/2010/04/why-java-sucks-and-csharp-rocks-1-thoughts-and-goals.html"&gt;比较的意义与目的&lt;/a&gt;”之后得到了许多评论，从评论中我看得出，许多朋友在评论时并没有看我的文章。为什么这么说？因为我已经在文章里不断强调“只是让Java程序员抛弃Java语言，不是Java平台”，而且“并没有想让Java程序员转向C#”。难道这还不能看出，我是想要推广JVM上的另一门语言吗？只可惜我还是收到了许多类似的回复：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;你说要用另一门语言来代替Java，这门语言是什么，C#吗？可笑…… &lt;/li&gt;    &lt;li&gt;你让黑莓，Android程序员去使用C#？他们看了只会一笑了之…… &lt;/li&gt;    &lt;li&gt;比较Java和C#语言本身不会有什么结果的，做开发还得看整体情况…… &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;如果不是没有看我的文章，那么我只能想出另一种可能了：有些朋友&lt;font color="#ff0000"&gt;并不知道JVM上的语言发展情况，并不知道目前JVM平台上除Java外最火热的语言是什么&lt;/font&gt;。那我就觉得奇怪了，要知道，现在可是在开&lt;a href="http://days2010.scala-lang.org/"&gt;Scala Days 2010&lt;/a&gt;呢，而且之前连&lt;a href="http://www.adam-bien.com/roller/abien/entry/java_net_javaone_which_programming"&gt;Java之父高司令都高度评价Scala&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;Java的粉丝们一直认为Java平台的最大优势是开放，我同意。但是，我想Java如此开放，但是为什么一些Java粉丝给我的感觉却是狭隘的心态和视野呢？例如，看到有人说Java坏话了，于是立即热血上涌，文章内容也不用看，文章目的也不去关心，不管三七二十一就在评论中想尽各种办法进行反驳。抛出各种论点，却鲜有论据——我是指靠谱的论据，而不是向某个朋友说的“.NET程序员90%只会拖控件，而Java程序员90%是了解核心技术的”这种莫名其妙的说法。要知道，论点易抛，论据难得。我的文章动辄数千字，就是为了想办法把文章内容说清楚。但是不管怎么努力，我还是会不断发现值得额外详述的地方——更何况在评论中的寥寥数字？&lt;/p&gt;  &lt;p&gt;是的，从某个角度来说.NET平台资源是比Java平台要少。所以我觉得很高兴，我可以时刻发现前进的目标。例如有人说Java平台有个地方很好而.NET很糟糕，我不会想办法去驳倒对方，我会很乐意去了解它，然后看看它在.NET平台有没有类似的东西，它的思想能否借鉴给.NET平台，如果发现这种说法有明显问题才去“摆事实、讲道理”。除了Java平台之外，我还关注其他各种技术，让各技术为我所用。&lt;/p&gt;  &lt;p&gt;Java平台的确开放，但对于某些Java粉丝来说，这难道只是您用来建立信心的借口吗？我一个封闭的微软平台的封闭的.NET程序员，如果心态和眼界都比您要开阔──就好比，一个Java平台上的Scala语言需要我一个.NET程序员告诉您，这难道不很讽刺吗？还好，我相信说一些没边评论的Java粉丝只是少数盲目分子，而Java领域的大部分朋友还是相当靠谱的。&lt;/p&gt;  &lt;p&gt;那么，我单纯比较Java和C#语言有意义吗？当然有，我只要能说明Java语言本身是多么糟糕，让我们有足够的理由转向Scala就行了。&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_3763050"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="Why Java Sucks and C# Rocks (Final)" href="http://www.slideshare.net/jeffz/why-java-sucks-and-c-rocks-final"&gt;Why Java Sucks and C# Rocks (Final)&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=why-java-sucks-and-csharp-rocks-100418041313-phpapp02&amp;stripped_title=why-java-sucks-and-c-rocks-final" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=why-java-sucks-and-csharp-rocks-100418041313-phpapp02&amp;stripped_title=why-java-sucks-and-c-rocks-final" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;感谢&lt;a href="http://www.cnblogs.com/waynebaby/"&gt;韦恩卑鄙&lt;/a&gt;提供&lt;a href="http://cid-fba4447598b1d752.skydrive.live.com/self.aspx/Public/Why%20Java%20Sucks%20and%20C%5E3%20Rocks%20-%20%E5%BD%95%E9%9F%B3[20100417].zip"&gt;演讲录音&lt;/a&gt;，关于演讲的详细内容，自然还是请关注的我的后续文章：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/why-java-sucks-and-csharp-rocks-1-thoughts-and-goals.html"&gt;Why Java Sucks and C# Rocks（1）：比较的意义与目的&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/04/why-java-sucks-and-csharp-rocks-slides-final-version.html#comments</comments>
      <pubDate>Sun, 18 Apr 2010 09:52:49 GMT</pubDate>
      <lastBuildDate>Sun, 18 Apr 2010 09:52:49 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>编程语言的发展趋势及未来方向（2）：声明式编程与DSL</title>
      <link>http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-2-declarative-programming-and-dsl.html</link>
      <guid>http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-2-declarative-programming-and-dsl.html</guid>
      <description>&lt;p&gt;这是&lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;Anders Hejlsberg&lt;/a&gt;（不用介绍这是谁了吧）在&lt;a href="http://channel9.msdn.com/posts/adebruyn/TechDays-2010-Developer-Keynote-by-Anders-Hejlsberg/"&gt;比利时TechDays 2010所做的开场演讲&lt;/a&gt;。由于最近我在博客上关于语言的讨论比较多，出于应景，也打算将Anders的演讲完整地听写出来。在上一部分中，Anders指出语言本身在过去的数十年里并没有明显的发展，并给出了他眼中编程语言发展趋势的预测。在现在的第2部分中，Anders将阐述声明式编程的理念及DSL，并演示C#中一种内部DSL的形式：LINQ。&lt;/p&gt;  &lt;p&gt;如果没有特别说明，所有的文字都直接翻译自Anders的演讲，并使用我自己的口语习惯表达出来，对于Anders的口误及反复等情况，必要时在译文中自然也会进行忽略。为了方便理解，我也会将视频中关键部分进行截图，而某些代码演示则会直接作为文章内容发表。&lt;/p&gt;  &lt;p&gt;（听写开始，接&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html"&gt;上篇&lt;/a&gt;）&lt;/p&gt; &lt;a target="_blank" href="http://img.zhaojie.me/blog/prog-lang-trends-anders/9.png"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/9-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;这里先从&lt;a href="http://en.wikipedia.org/wiki/Declarative_programming"&gt;声明式（Declarative）编程&lt;/a&gt;谈起。 &lt;/p&gt; &lt;a target="_blank" href="http://img.zhaojie.me/blog/prog-lang-trends-anders/10.png"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/10-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;目前我们在编写软件时大量使用的是&lt;a href="http://en.wikipedia.org/wiki/Imperative_programming"&gt;命令式（Imperative）编程&lt;/a&gt;语言，例如C#，Java或是C++等等。这些语言的特征在于，写出的代码除了表现出“什么（What）”是你想做的事情之外，更多的代码则表现出实现的细节，也就是“如何（How）”完成工作。这部分代码有时候多到掩盖了我们原来问题的解决方案。比如，你会在代码里写for循环，if语句，a等于b，i加一等等，这体现出机器是如何处理数据。首先，这种做法让代码变得冗余，而且它也很难让执行代码的基础设施更聪明地判断该如何去执行代码。当你写出这样的命令是代码，然后把编译后的中间语言交给虚拟机去执行，此时虚拟机并没有多少空间可以影响代码的执行方式，它只能根据指令一条一条老老实实地去执行。例如，我们现在想要并行地执行程序就很困难了，因为更高层次的一些信息已经丢失了。这样，我们只能在代码里给出“How”，而不能体现出“What”的信息。 &lt;/p&gt;  &lt;p&gt;有多种方式可以将“What”转化为更为“声明式”的编程风格，我们只要能够在代码中体现出更多“What”，而不是“How”的信息，这样执行环境便可以更加聪明地去适应当前的执行要求。例如，它可以决定投入多少CPU进行计算，你的当前硬件是什么样的，等等。 &lt;/p&gt; &lt;a target="_blank" href="http://img.zhaojie.me/blog/prog-lang-trends-anders/11.png"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/11-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;我之前提到过，现在有两种比较重要的成果，一是&lt;a href="http://en.wikipedia.org/wiki/Domain-specific_language"&gt;DSL&lt;/a&gt;（Domain Specific Language，领域特定语言），另一个则是&lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;函数式编程&lt;/a&gt;。 &lt;/p&gt;  &lt;p&gt;其实DSL不是什么新鲜的玩意儿，我们平时一直在用类似的东西，比如，SQL，CSS，正则表达式，有的可能更加专注于一个方面，例如&lt;a href="http://en.wikipedia.org/wiki/Mathematica"&gt;Mathematica&lt;/a&gt;，&lt;a href="http://en.wikipedia.org/wiki/Logo_%28programming_language%29"&gt;LOGO&lt;/a&gt;等等。这些语言的目标都是特定的领域，与之相对的则是&lt;a href="http://en.wikipedia.org/wiki/General-purpose_programming_language"&gt;GPPL&lt;/a&gt;（General Purpose Programming Language，通用目的编程语言）。 &lt;/p&gt; &lt;a target="_blank" href="http://img.zhaojie.me/blog/prog-lang-trends-anders/12.png"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/12-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;对于DSL而言其实并没有一个明确的定义，在这里我也不打算为它下个定义，例如&lt;a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language"&gt;UML&lt;/a&gt;甚至根本没有特定的语法。不过我这里会谈一些我觉得比较重要的东西。 &lt;/p&gt; &lt;a target="_blank" href="http://img.zhaojie.me/blog/prog-lang-trends-anders/13.png"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/13-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;&lt;a href="http://martinfowler.com/"&gt;Martin Fowler&lt;/a&gt;提出DSL应该分为外部DSL及内部DSL两种，我认为这种划分方式还是比较有意义的。外部DSL是自我包含的语言，它们有自己特定语法、解析器和词法分析器等等，它往往是一种小型的编程语言，甚至不会像GPPL那样需要源文件。与之相对的则是内部DSL。内部DSL其实更像是种别称，它代表一类特别API及使用模式。这里我会给你们看一些示例。 &lt;/p&gt; &lt;a target="_blank" href="http://img.zhaojie.me/blog/prog-lang-trends-anders/14.png"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/14-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;这些是我们平时会遇到的一些外部DSL，如这张幻灯片上表现的XSLT，SQL或是Unix脚本。外部DSL的特点是，你在构建这种DSL时，其实扮演的是编程语言设计者的角色，这个工作并不会交给普通人去做。外部DSL一般会直接针对特定的领域设计，而不考虑其他东西。&lt;a href="http://en.wikipedia.org/wiki/James_Gosling"&gt;James Gosling&lt;/a&gt;曾经说过这样的话，每个配置文件最终都会变成一门编程语言。你一开始可能只会用它表示一点点东西，然后慢慢你便会想要一些规则，而这些规则则变成了表达式，可能你还会定义变量，进行条件判断等等。而最终它就变成了一种奇怪的编程语言，这样的情况屡见不鲜。 &lt;/p&gt;  &lt;p&gt;事实上，现在有一些公司也在关注DSL的开发。例如以前在微软工作的&lt;a href="http://en.wikipedia.org/wiki/Charles_Simonyi"&gt;Charles Simonyi&lt;/a&gt;提出了&lt;a href="http://en.wikipedia.org/wiki/Intentional_programming"&gt;Intentional Programming&lt;/a&gt;的概念，还有一个叫做&lt;a href="http://en.wikipedia.org/wiki/JetBrains"&gt;JetBrains&lt;/a&gt;的公司提供一个叫做&lt;a href="http://en.wikipedia.org/wiki/JetBrains_MPS"&gt;MPS（Meta Programming System）&lt;/a&gt;的产品。最近微软也提出了自己的&lt;a href="http://en.wikipedia.org/wiki/Oslo_%28Microsoft%29"&gt;Oslo&lt;/a&gt;项目，而在Eclipse世界里也有个叫做&lt;a href="http://www.eclipse.org/Xtext/"&gt;Xtext&lt;/a&gt;的东西，所以其实在这方面现在也有不少人在尝试。 &lt;/p&gt;  &lt;p&gt;我在观察外部DSL时，往往会关注它的语法到底提供了多少空间，例如一种XML的方言，利用XML方言的好处在于有不少现成的工具可用，这样可以更快地定义自己的语法。 &lt;/p&gt; &lt;a target="_blank" href="http://img.zhaojie.me/blog/prog-lang-trends-anders/15.png"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/15-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;而内部DSL，正像我之前说的那样，它其实只是一系列特别的API及使用模式的别称。这里则是一些LINQ查询语句，&lt;a href="http://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;以及&lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;代码。内部DSL的特点是，它其实只是一系列API，但是你可以“假装”它们一种DSL。内部DSL往往会利用一些“流畅化”的技巧，例如像这里的LINQ或jQuery那样把一些方法通过“点”连接起来。有些则利用了元编程的方式，如这里的Ruby on Rails就涉及到了一些元编程。这种DSL可以访问语言中的代码或变量，以及利用如代码补全，重构等母语言的所有特性。 &lt;/p&gt; &lt;a target="_blank" href="http://img.zhaojie.me/blog/prog-lang-trends-anders/16.png"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/16-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;现在我会花几分钟时间演示一下我所创建的DSL，也就是LINQ。我相信你们也已经用过不少LINQ了，不过这里我还是快速的展示一下我所表达的更为“声明式”的编程方式。&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Product
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public int &lt;/span&gt;ProductID { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;ProductName { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;CategoryName { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
    &lt;span style="color: blue"&gt;public int &lt;/span&gt;UnitPrice { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }

    &lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;&lt;span style="color: #2b91af"&gt;Product&lt;/span&gt;&gt; GetProducts() { &lt;span style="color: green"&gt;/* ... */ &lt;/span&gt;}
}

&lt;span style="color: blue"&gt;public partial class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;_Default &lt;/span&gt;: System.Web.UI.&lt;span style="color: #2b91af"&gt;Page
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;protected void &lt;/span&gt;Page_Load(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)
    {
        &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;&lt;span style="color: #2b91af"&gt;Product&lt;/span&gt;&gt; products = &lt;span style="color: #2b91af"&gt;Product&lt;/span&gt;.GetProducts();

        &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;&lt;span style="color: #2b91af"&gt;Product&lt;/span&gt;&gt; result = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;&lt;span style="color: #2b91af"&gt;Product&lt;/span&gt;&gt;();
        &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Product &lt;/span&gt;p &lt;span style="color: blue"&gt;in &lt;/span&gt;products)
        {
            &lt;span style="color: blue"&gt;if &lt;/span&gt;(p.UnitPrice &gt; 20) result.Add(p);
        }

        GridView1.DataSource = result;
        GridView1.DataBind();
    }
}&lt;/pre&gt;

&lt;p&gt;这里有许多Product对象，那么现在我要筛选出所有单价大于20的那些， 再把他们显示在一个GridView中。传统的做法就是这样，我先得到所有的Product对象，然后foreach遍历每个对象，再判断每个对象的单价，最终把数据绑定到GridView里。运行这个程序……（打开页面）这就是就能得到结果。 &lt;/p&gt;

&lt;p&gt;好，那么现在我要做一些稍微复杂的事情。可能我不是要展示单价超过20的Product对象，而是要查看每个分类中究竟有多少个单价超过20的对象，然后根据数量进行排序。如果不用DSL完成这个工作，那么我可能会先定义一个对象来表示结果：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Grouping
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;public string &lt;/span&gt;CategoryName { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
    &lt;span style="color: blue"&gt;public int &lt;/span&gt;ProductCount { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }
}&lt;/pre&gt;

&lt;p&gt;这是个表示分组的对象，用于保存分类的名称和产品数量。然后我们就会写一些十分丑陋的代码：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Grouping&lt;/span&gt;&gt; groups = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Grouping&lt;/span&gt;&gt;();
&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Product &lt;/span&gt;p &lt;span style="color: blue"&gt;in &lt;/span&gt;products)
{
    &lt;span style="color: blue"&gt;if &lt;/span&gt;(p.UnitPrice &gt;= 20)
    {
        &lt;span style="color: blue"&gt;if &lt;/span&gt;(!groups.ContainsKey(p.CategoryName))
        {
            &lt;span style="color: #2b91af"&gt;Grouping &lt;/span&gt;r = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Grouping&lt;/span&gt;();
            r.CategoryName = p.CategoryName;
            r.ProductCount = 0;
            groups[p.CategoryName] = r;
        }
        groups[p.CategoryName].ProductCount++;
    }
}

&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;&lt;span style="color: #2b91af"&gt;Grouping&lt;/span&gt;&gt; result = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&lt;&lt;span style="color: #2b91af"&gt;Grouping&lt;/span&gt;&gt;(groups.Values);
result.Sort(&lt;span style="color: blue"&gt;delegate&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Grouping &lt;/span&gt;x, &lt;span style="color: #2b91af"&gt;Grouping &lt;/span&gt;y)
{
    &lt;span style="color: blue"&gt;return
        &lt;/span&gt;x.ProductCount &gt; y.ProductCount ? -1 :
        x.ProductCount &lt; y.ProductCount ? 1 :
        0;
});&lt;/pre&gt;

&lt;p&gt;我先创建一个新的字典，用于保存分类名称到分组的对应关系。然后我遍历每个Product对象，对于每个单价大于20的对象，如果字典中还没有保存对应的分组则创建一个，然后将数量加一。然后为了排序，我调用Sort方法，于是我要提供一个委托作为排序方法，然后blablablabla……执行之后……（打开页面）我自然可以得到想要的结果。 &lt;/p&gt;

&lt;p&gt;但是，首先这些代码写起来需要花费一些时间，很显然。然后仔细观察，你会发现这写代码几乎都是在表示“How”，而“What”基本已经丢失了。假设我离开了，现在新来了一个程序员要维护这段代码，他会需要一点时间才能完整理解这段代码，因为他无法直接看清代码的目标。 &lt;/p&gt;

&lt;p&gt;不过如果这里我们使用DSL，也就是LINQ，就像这样：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;result = products
    .Where(p =&gt; p.UnitPrice &gt;= 20)
    .GroupBy(p =&gt; p.CategoryName)
    .OrderByDescending(g =&gt; g.Count())
    .Select(g =&gt; &lt;span style="color: blue"&gt;new &lt;/span&gt;{ CategoryName = g.Key, ProductCount = g.Count() });&lt;/pre&gt;

&lt;p&gt;products……先调用Where……blablabla……再GroupBy等等。由于我们这里可以使用DSL来表示高阶的术语，用以体现我们想做的事情。于是这段代码则更加关注于“What”而不是“How”。我这里不会明确地指示我想要过滤的方式，我也不会明确地说我要建立字典和分类，这样基础结构就可以聪明地，或者说更加聪明地去确定具体的执行方式。你可能比较容易想到我们可以并行地执行这段代码，因为我没有显式地指定做事方式，我只是表示出我的意图。 &lt;/p&gt;

&lt;p&gt;我们打开页面……（打开页面）很显然我们得到了相同的结果。 &lt;/p&gt;

&lt;p&gt;这里比较有趣的是，内部DSL是如何设计进C#语法中的，为此我们为C# 3.0添加了一系列的特性，例如Lambda表达式，扩展方法，类型推断等等。这些特性统一起来之后，我们就可以设计出更为丰富的API，组合之后便成为一种内部DSL，就像这里的LINQ查询语言。 &lt;/p&gt;

&lt;p&gt;除了使用API的形式之外，我们还可以这样做：&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;result =
    &lt;span style="color: blue"&gt;from &lt;/span&gt;p &lt;span style="color: blue"&gt;in &lt;/span&gt;products
    &lt;span style="color: blue"&gt;where &lt;/span&gt;p.UnitPrice &gt;= 20
    &lt;span style="color: blue"&gt;group &lt;/span&gt;p &lt;span style="color: blue"&gt;by &lt;/span&gt;p.CategoryName &lt;span style="color: blue"&gt;into &lt;/span&gt;g
    &lt;span style="color: blue"&gt;orderby &lt;/span&gt;g.Count() &lt;span style="color: blue"&gt;descending
    select new &lt;/span&gt;{ CategoryName = g.Key, ProductCount = g.Count() };&lt;/pre&gt;

&lt;p&gt;编译器会简单地将这种形式转化为前一种形式。不过，这里我认为有意思的地方在于，你完全可以创建一门和领域编程语言完全无关的语法，然后等这种语法和API变得流行且丰富起来之后，再来创一种新的表现形式，就如这里的LINQ查询语法。我颇为中意这种语言设计的交流方式。 &lt;/p&gt;

&lt;p&gt;OK，现在我们回到下面的内容。&lt;/p&gt;

&lt;p&gt;（未完待续）&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html"&gt;编程语言的发展趋势及未来方向（1）：历史回顾及趋势概述&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;编程语言的发展趋势及未来方向（2）：声明式编程与DSL&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-3-functional-programming-and-fsharp.html"&gt;编程语言的发展趋势及未来方向（3）：函数式编程&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-4-dynamic-languages.html"&gt;编程语言的发展趋势及未来方向（4）：动态语言&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-5-meta-programming.html"&gt;编程语言的发展趋势及未来方向（5）：元编程&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-6-concurrency.html"&gt;编程语言的发展趋势及未来方向（6）：并发&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/trends-and-future-directions-in-programming-languages-by-anders-7-conclusion.html"&gt;编程语言的发展趋势及未来方向（7）：总结&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-2-declarative-programming-and-dsl.html#comments</comments>
      <pubDate>Wed, 14 Apr 2010 13:24:51 GMT</pubDate>
      <lastBuildDate>Wed, 14 Apr 2010 13:24:51 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>编程语言的发展趋势及未来方向（1）：历史回顾及趋势概述</title>
      <link>http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html</link>
      <guid>http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html</guid>
      <description>&lt;p&gt;这是&lt;a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"&gt;Anders Hejlsberg&lt;/a&gt;（不用介绍这是谁了吧）在&lt;a href="http://channel9.msdn.com/posts/adebruyn/TechDays-2010-Developer-Keynote-by-Anders-Hejlsberg/"&gt;比利时TechDays 2010所做的开场演讲&lt;/a&gt;。由于最近我在博客上关于语言的讨论比较多，出于应景，也打算将Anders的演讲完整地听写出来。我希望这个讲座可以从侧面回答某些朋友关于“语言讨论是否有价值”的疑问，并且展示出目前语言的发展状况以及微软在这方面的努力。完整内容将分为多次发表，每次一小部分，包含大约10分钟的演讲内容。等不及的朋友也和可以下载演讲视频一睹为快。现在的第1部分则包含Anders对编程语言发展的历史回顾，以及对趋势简单概述。&lt;/p&gt;  &lt;p&gt;如果没有特别说明，所有的文字都直接翻译自Anders的演讲，并使用我自己的口语习惯表达出来，对于Anders的口误及反复等情况，必要时在译文中自然也会进行忽略。为了方便理解，我也会将视频中关键部分进行截图，而某些代码演示则会直接作为文章内容发表。&lt;/p&gt;  &lt;p&gt;（听写开始）&lt;/p&gt; &lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/0.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/0-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;大家好，我是Anders Hejlsberg，现在是微软的&lt;a href="http://www.microsoft.com/presspass/exec/techfellow/default.mspx"&gt;Technical Fellow&lt;/a&gt;，担任C#编程语言的首席架构师，也参与并领导.NET Framework以及各种语言的开发。我现在打算谈一下……实际上是我脑海中一些影响未来5到10年编程语言设计的内容。比如C#或VB该怎么走，&lt;a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/"&gt;F#&lt;/a&gt;该怎么办，这次演讲主要就是讨论这些影响我们的东西。&lt;/p&gt; &lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/1.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/1-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;虽然主要内容是谈论未来的，但是我还是想先回顾一下历史。你们有些人可能对这个产品有印象，这是我大约27年前的工作内容，&lt;a href="http://en.wikipedia.org/wiki/Turbo_Pascal"&gt;Turbo Pascal&lt;/a&gt;，这也是我进入这个领域的起点。我先在拿出这个东西是想展示当年写程序的情况，然后可以讨论目前究竟的发展到哪儿了。&lt;/p&gt; &lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/2.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/2-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;事实上，我现在的机器里正好有TURBO.COM文件，大约39K，嘿，现在还可以运行。我们现在来试着写一点程序。先来创建的程序叫做Hello.pas……（开始写代码）……一个Pascal小程序写好了，我们来运行一下……（出现编译错误）啊噢，有地方我写错了……这个特性在当年是个创新，它会自动打开编辑器，直接把我们带去出错的地方。嗯，我们现在来纠正语法错误，把双引号改成单引号。&lt;/p&gt; &lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/3.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/3-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;再运行一下，现在成功了，（观众掌声）呵呵，谢谢，谢谢。事实上，在27年后这个程序还能在这台机器上运行还真是挺神奇的。&lt;/p&gt; &lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/4.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/4-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;现在，我们来看一下，从那时算起硬件已经发展了……嗯，我那时写Pascal的机器是&lt;a href="http://en.wikipedia.org/wiki/Zilog_Z80"&gt;Z-80&lt;/a&gt;，拥有48K内存。从那时算起，我现在这台机器已经有大约10万倍的外部存储容量，1万倍的内存大小，CPU速度也有大约1000倍的提高。&lt;/p&gt; &lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/5.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/5-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;但是如果你关注一下目前的软件……过去27年里编程语言到底进步了多少？呵呵，有趣的是如果你仔细观察这些代码，会发现C#还比Turbo Pascal的版本多一行。这也给我们带来了一些值得关注的东西。&lt;/p&gt; &lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/6.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/6-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;首先，编程语言的发展非常缓慢。期间当然出现了一些东西，例如面向对象等等，但是远没有好上1000倍。另一方面，你可能会想，那么这些努力都到哪里去了呢？事实上这些努力没有体现在编程语言上，而是出现在框架及工具等方面了。如果你关注如今我们使用的框架，它们的体积的确有1000倍的增长。例如当年Turbo Pascal所带的框架大约有，比如说100个功能，而现在的.NET Framework里则有一万个类，十万个方法，的确有1000倍的增长。与此类似，如果你观察现在的IDE，我们现在已经有了无数强大的功能，例如语法提示，重构，调试器，探测器等等，这方面的新东西有很多。与此相比，编程语言的改进的确很不明显。&lt;/p&gt;  &lt;p&gt;另一方面，如.NET，Java等框架的重要性提高了许多。而编程语言往往都倾向于构建于现有的工具上，而不会从头写起。现在出现的编程语言，例如F#，如果你关注Java领域那么还有&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;，&lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;等等，它们都是基于现有框架构建的。现在已经有太多东西可以直接利用了，每次从头开始的代价实在太高。&lt;/p&gt; &lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/7.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/7-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;还有件事，便是在过去5、60年的编程历史中，我们都不断地提高抽象级别，我们都在不断地让编程语言更有表现力，让我们可以用更少的代码完成更多的工作。我们一开始先使用汇编，然后使用面向过程的语言，例如Pascal和C，然后便是面向对象语言，如C++，随后就进入了托管时代──受托管的执行环境，例如.NET，Java，它们的主要特性有自动的垃圾收集，类型安全等等。我目前还没有看出这样的趋势有停止的迹象，因此我们还会看到抽象级别越来越高的语言，而语言的设计者则必须理解并预测下一个抽象级别是什么样子的。&lt;/p&gt; &lt;a href="http://img.zhaojie.me/blog/prog-lang-trends-anders/8.png" target="_blank"&gt;&lt;img src="http://img.zhaojie.me/blog/prog-lang-trends-anders/8-thumbnail.png" /&gt;&lt;/a&gt;   &lt;p&gt;我认为，现在影响力较大的趋势主要有3种。首先，我们会越来越多地使用&lt;a href="http://en.wikipedia.org/wiki/Declarative_programming"&gt;声明式的编程风格&lt;/a&gt;。这里我主要会提到例如&lt;a href="http://en.wikipedia.org/wiki/Domain-specific_language"&gt;DSL&lt;/a&gt;（Domain Specific Language，领域特定语言）以及&lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;函数式编程&lt;/a&gt;。然后在过去的五年里，我发现对于动态语言的研究变得非常火热，其中对我们产生重大影响的无疑是动态语言所拥有的良好的元编程能力，还有一些非常有趣的东西，例如JavaScript引擎的发展。然后便是并发编程，无论我们愿不愿意，多核的产生都在迫使我们不得不重视并发编程。&lt;/p&gt;  &lt;p&gt;有一点值得一提，那便是随着语言的发展，原本的编程语言分类方式也要有所改变了。以前我们经常说面向对象语言，&lt;a href="http://en.wikipedia.org/wiki/Dynamic_programming_language"&gt;动态语言&lt;/a&gt;或是函数式语言。但是我们现在发现，这些边界变得越来越模糊，经常会互相学习各自的范式。静态语言中出现了动态类型，动态语言里也出现了静态能力，而如今所有主要的编程语言都受到函数式语言的影响。因此，一个越来越明显的趋势是“多范式程序设计语言”。&lt;/p&gt;  &lt;p&gt;在接下来的部分中，我将深入讨论以上提到的这些内容。&lt;/p&gt;

&lt;p&gt;（未完待续）&lt;/p&gt;

&lt;h1&gt;相关文章&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;编程语言的发展趋势及未来方向（1）：历史回顾及趋势概述&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-2-declarative-programming-and-dsl.html"&gt;编程语言的发展趋势及未来方向（2）：声明式编程与DSL&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-3-functional-programming-and-fsharp.html"&gt;编程语言的发展趋势及未来方向（3）：函数式编程&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-4-dynamic-languages.html"&gt;编程语言的发展趋势及未来方向（4）：动态语言&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-5-meta-programming.html"&gt;编程语言的发展趋势及未来方向（5）：元编程&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/05/trends-and-future-directions-in-programming-languages-by-anders-6-concurrency.html"&gt;编程语言的发展趋势及未来方向（6）：并发&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;&lt;a href="http://blog.zhaojie.me/2010/06/trends-and-future-directions-in-programming-languages-by-anders-7-conclusion.html"&gt;编程语言的发展趋势及未来方向（7）：总结&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <comments>http://blog.zhaojie.me/2010/04/trends-and-future-directions-in-programming-languages-by-anders-1-history-and-trends.html#comments</comments>
      <pubDate>Mon, 12 Apr 2010 16:52:16 GMT</pubDate>
      <lastBuildDate>Mon, 12 Apr 2010 16:52:16 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/dotnet/">.Net框架</category>
      <category domain="http://blog.zhaojie.me/asp-net/">ASP.NET</category>
      <category domain="http://blog.zhaojie.me/language/">语言编程</category>
      <category domain="http://blog.zhaojie.me/parallel/">并行处理</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>视频：Microsoft PDC 09，算法及数据结构内容及其他</title>
      <link>http://blog.zhaojie.me/2009/11/videos-of-pdc09-algorithms-data-structure-visual-studio-documentary.html</link>
      <guid>http://blog.zhaojie.me/2009/11/videos-of-pdc09-algorithms-data-structure-visual-studio-documentary.html</guid>
      <description>&lt;p&gt;这里又有一些新整理好的视频。Microsoft PDC 09是最近的重头，只要您是搞微软技术的，无论关注哪个技术方面，都可以找到许多有用的内容。我也经常从此类大会中了解许多平时不太关注的内容，也算是保持知识的新鲜度。此外，还有算法和数据结构相关的内容，以及有趣的Visual Studio纪录片。&lt;/p&gt;  &lt;h1&gt;Microsoft PDC 09&lt;/h1&gt; &lt;img class="floatRight" src="http://img.zhaojie.me/blog/168980/o_PDC09Bling_BeforeAfter_136.jpg" /&gt;   &lt;p&gt;PDC，也就是Professional Developer Conference，专业开发者会议。这是微软的又一个技术大会，而且应该是个真正的技术大会。我为什么这么说呢？一个重要方面便是讲师的身份。PDC的讲师，大都是各微软产品团队的开发人员和设计人员，甚至一些科研人员，包括许多Technical Fellow和Distinguished Engineer等神仙级别的人物。总的来说，这个会议是来搞技术的。&lt;/p&gt;  &lt;p&gt;与此相对的一个典型是TechEd，它的定位是技术推广，让各厂商、合作伙伴了解微软技术、产品发展到什么样子了。因此，它的讲师大都是微软的咨询师，传教士等技术传播人员，而往往不是真正的技术开发者（当然我并不是说他们就不懂技术了）。从课程难度和深度上来说，TechEd大会的课程基本上都不能超过200，都应该属于介绍性质的，而PDC的内容，一般都要是300及以上了。&lt;/p&gt;  &lt;p&gt;因此我的观点就是，如果您专注于技术，那么不妨多专注于PDC或&lt;a href="http://visitmix.com/"&gt;MIX&lt;/a&gt;等技术会议，而不要在TechEd上追求太多——除非您已是高管，那么TechEd可以给您更凝练的感受。&lt;/p&gt;  &lt;p&gt;一星期前微软在洛杉矶举办了&lt;a href="http://microsoftpdc.com"&gt;PDC 09&lt;/a&gt;大会，然后放出了全部视频。然后经过了几天的下载和上传，我也终于把它们都放到优库上去了。如果您和我一样，在国内直接看PDC网站上的视频很慢，那么不妨可以看看优库上的版本。当然，您也可以选择去大会网站上下载高清版本，或低清版——还是比优库要清晰一些的。优库的好处在于想看便能立即看到，而且可以随意拖动。虽然不太清晰，但如果是需要让您看清楚的代码，讲师都会把它们放大，所以基本上也没有太大问题。&lt;/p&gt;  &lt;p&gt;这次的PDC的Session总共分七大部分，我将它们分为七个专辑：&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.youku.com/playlist_show/id_3966249.html"&gt;Keynotes (KEY)&lt;/a&gt; &lt;/li&gt;   &lt;li&gt;&lt;a href="http://www.youku.com/playlist_show/id_3956816.html"&gt;Client (CL)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.youku.com/playlist_show/id_3959023.html"&gt;Frameworks &amp;amp; Tools (FT)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.youku.com/playlist_show/id_3960432.html"&gt;Productivity (PR)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.youku.com/playlist_show/id_3961503.html"&gt;Server (SVR)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.youku.com/playlist_show/id_3961304.html"&gt;Services (SVC)&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.youku.com/playlist_show/id_3962400.html"&gt;Virtual&amp;#160; (VTL)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;由于视频太多，我不可能一个个地整理，因此目前我只为那些我看过的或是感兴趣的（看了一部分的）的视频填写的信息。不过每个视频的编号（如FT09）都是完整且排好序的，您可以先去&lt;a href="http://microsoftpdc.com/videos"&gt;大会的视频列表&lt;/a&gt;中找到感兴趣的话题，然后再去优库上看。&lt;/p&gt;  &lt;p&gt;如果您看完了某个视频，我建议可以写一点总结，然后和大家一起分享，例如我目前已经写了《&lt;a href="http://www.infoq.com/cn/news/2009/11/pdc09-fsharp"&gt;并行和异步编程中的挑战及F#的应对方案&lt;/a&gt;》及《&lt;a href="http://www.infoq.com/cn/news/2009/11/pdc09-aspnet4"&gt;ASP.NET 4运行时的改进&lt;/a&gt;》两篇总结，接下来也打算总结更多内容。&lt;/p&gt;  &lt;h1&gt;算法及数据结构及其他&lt;/h1&gt;  &lt;p&gt;今天在Reddit上看到有人贴了一篇文章：&lt;a href="http://techbytes360.blogspot.com/2009/11/free-algorithms-and-data-structures.html"&gt;Top Algorithms and Data Structures Video Lectures&lt;/a&gt;，其中列出了：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Algorithms&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/VideoLectures/index.htm"&gt;MIT OpenCourseWare: Introduction to Algorithms&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://nptel.iitm.ac.in/video.php?courseId=1065"&gt;NPTEL: Design and Analysis of Algorithm&lt;/a&gt; (by IIT and IISC, India) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.cs.sunysb.edu/%7Ealgorith/video-lectures/"&gt;Stony Brook University: Skiena's Algorithms Lectures&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.aduni.org/courses/algorithms/index.php?view=cw"&gt;ArsDigita University: Algorithms&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Data Structures&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://webcast.berkeley.edu/course_details.php?seriesid=1906978271"&gt;UC Berkeley: Data Structures&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://nptel.iitm.ac.in/video.php?courseId=1074"&gt;NPTEL: Data Structures And Algorithms&lt;/a&gt; (by IIT and IISC, India)&amp;#160; &lt;/li&gt;    &lt;li&gt;&lt;a href="https://wiki.cse.unsw.edu.au/cs1927cgi/09s2/Schedule"&gt;The University of New South Wales: Data Structures and Algorithms&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;而我发现，对于最负盛名的两所学校，MIT和UCB的算法与数据结构的课程，也已经有人整理在优库上了：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.youku.com/playlist_show/id_3967498.html"&gt;MIT: Introduction to Algorithms&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.youku.com/playlist_show/id_3763991.html"&gt;UC Berkeley: Data Structures&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;看到那么多学习资源，您还觉得哪里不满足吗？只是，看来学好英语是非常重要的——我现在越来越认同“大学毕业生必须过英语四级”这个硬性规定，只可惜我见过太多蒙混过关的人了……而且，很多人还觉得这是他们的幸运。这其实也挺悲哀的。&lt;/p&gt;  &lt;p&gt;最后，如果您对Visual Studio的历史感兴趣的话，Channel 9上最近在连载Visual Studio的纪录片，我也在优库上&lt;a href="http://www.youku.com/playlist_show/id_3963343.html"&gt;保持更新&lt;/a&gt;，除了技术内容至于，看这类内容也是挺有趣味的。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/11/videos-of-pdc09-algorithms-data-structure-visual-studio-documentary.html#comments</comments>
      <pubDate>Fri, 27 Nov 2009 05:57:00 GMT</pubDate>
      <lastBuildDate>Fri, 27 Nov 2009 05:57:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>一系列技术视频：MIT 6.00，Channel 9 E2E，FP Foundamentals</title>
      <link>http://blog.zhaojie.me/2009/11/technical-videos-mit600-channel9-e2e-fp.html</link>
      <guid>http://blog.zhaojie.me/2009/11/technical-videos-mit600-channel9-e2e-fp.html</guid>
      <description>&lt;p&gt;最近看一些技术视频上瘾，每天都要看一两个才满足，有时还会整理整理总结总结。视频的来源主要是&lt;a href="http://channel9.msdn.com"&gt;Channel 9&lt;/a&gt;等外国网站，它们往往必须下载到本地才能观看，代价太高。在线看的也不是没有，不过要么就在&lt;a href="http://www.youtube.com"&gt;Youtube&lt;/a&gt;等国内无法访问的站点上，或者就因为国内没有CDN导致播放不畅。因此，我正在把一些视频上传到号称国内第一视频站的&lt;a href="http://www.youku.com"&gt;优酷&lt;/a&gt;上，这样便可以比较方便的播放，甚至可以拖拖看看。目前我准备了三个系列，并且还在不断地进行搬运和整理工作。&lt;/p&gt;  &lt;h1&gt;MIT 6.00&lt;/h1&gt;  &lt;p&gt;&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-00Fall-2008/CourseHome/index.htm"&gt;MIT 6.00&lt;/a&gt;即MIT的“计算机科学与程序设计导论”课程，使用Python进行教学，是MIT的CS基础课程。它的前身便是大名鼎鼎的&lt;a href="http://blog.zhaojie.me/2009/07/recommended-reading-2-sicp.html"&gt;SICP&lt;/a&gt;。学习SICP时，可以配合两个公开视频：一是&lt;a href="http://webcast.berkeley.edu/course_details_new.php?seriesid=2008-D-26263&amp;amp;semesterid=2008-D"&gt;Berkeley的上课视频&lt;/a&gt;，二是&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-001Spring-2005/VideoLectures/index.htm"&gt;MIT的公开课件&lt;/a&gt;（为SICP原书作者Hal Abelson 和Gerald Jay Sussman为Hewlett-Packard公司员工培训时的录像）。这两个视频的历史都较为久远了，我们也可以&lt;a href="http://www.youtube.com/watch?v=k6U-i4gXkLM"&gt;选择“与时俱进”&lt;/a&gt;。由于国内无法访问Youtube，于是我将其收集（因为不是我上传的）为&lt;a href="http://www.youku.com/playlist_show/id_3940564.html"&gt;优酷的专辑&lt;/a&gt;。只可惜，这清晰度不如Youtube，不过应该不影响观看。&lt;/p&gt;  &lt;h1&gt;Channel 9的专家面对面系列&lt;/h1&gt;  &lt;p&gt;&lt;a href="http://channel9.msdn.com"&gt;Channel 9&lt;/a&gt;包含了与微软有关的大量视频，基本上都是由微软官方提供的。不过，其中许多视频并没有像官方那样的“正经”，而是比较随意的访谈性质，而这样的题材往往会特别有趣，别有收获。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://channel9.msdn.com/tags/Expert+to+Expert"&gt;专家面对面&lt;/a&gt;（Expert to Expert）是其中的一个非常独特的系列，是对微软内外各方面专家的采访，其中几乎每个人都是独当一面的专家（许多微软的Technical Fellow，Distinguished Engineer等神一般的人物也会出场）。E2E系列的话题也十分丰富，LINQ、PowerShell、CCR、Reactive Framework、函数式编程、并行程序设计，Virtual Earth，Clojure，Dryad/DryadLINQ，云计算，云存储，GC……各式各样，让人看的十分过瘾。&lt;/p&gt;  &lt;p&gt;目前的&lt;a href="http://www.youku.com/playlist_show/id_3956181.html"&gt;全部的30个视频&lt;/a&gt;都上传整理在此，我打算定期更新，保持同步，欢迎围观。&lt;/p&gt;  &lt;h1&gt;FP Foundamentals by Dr. Erik Meijer&lt;/h1&gt;  &lt;p&gt;这是新推出的Channel 9 Lectures系列，目前由Erik Meijer主讲函数式编程基础。Erik Meijer是LINQ和Reactive Framework等语言或框架的主要设计人员之一，由它来讲解函数式编程应该说再合适不过了。课堂中使用Haskell作为编程语言，不过其主要目的是理解函数式编程的原理，及其使用方式，倒不是Haskell语言本身。不过即便是将FP用于生产环境，Haskell也是个不错的选择。当然，可能还是F#更适合.NET开发人员。F#基于OCaml发展而来，也是一门经典的函数式编程语言。&lt;/p&gt;  &lt;p&gt;FP Foundamentals系列共有13次课程，目前出到8次，现在已经&lt;a href="http://www.youku.com/playlist_show/id_3941461.html"&gt;全部上传整理到此&lt;/a&gt;。&lt;/p&gt;  &lt;h1&gt;其他&lt;/h1&gt;  &lt;p&gt;我还上传了一些不成系列的优秀视频，因此您可以关注我在优库的&lt;a href="http://u.youku.com/user_show/id_UMTgxMDQ3OTIw.html"&gt;帐号&lt;/a&gt;，最近我在上传&lt;a href="http://microsoftpdc.com/"&gt;Microsoft PDC&lt;/a&gt;的内容，由于优库的上传工具总是在晚上莫名其妙地无法登陆，因此那么多视频估计还要很久才能搞定。&lt;/p&gt;  &lt;p&gt;不过现在也有一些其他一些视频值得观看，例如&lt;a href="http://v.youku.com/v_show/id_XMTM0MTQyOTQw.html"&gt;对Channel 9开发团队的采访&lt;/a&gt;（及&lt;a href="http://v.youku.com/v_show/id_XMTM0MTY1NjI4.html"&gt;下部&lt;/a&gt;）。Channel 9的代码库叫做EvNet，用在了Channel 8/9/10，CodePlex以及MicrosoftPDC.com等多个站点中。这次采访主要谈论了V4的设计、架构及实现。这两段视频我还没有完全看完，不过就上部来说，还是挺值得一看的。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/11/technical-videos-mit600-channel9-e2e-fp.html#comments</comments>
      <pubDate>Wed, 25 Nov 2009 02:12:00 GMT</pubDate>
      <lastBuildDate>Wed, 25 Nov 2009 02:12:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/asp-net/">ASP.NET</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>我在TechEd的演讲：Real World ASP.NET MVC</title>
      <link>http://blog.zhaojie.me/2009/11/dev343-teched-2009-real-world-aspnet-mvc.html</link>
      <guid>http://blog.zhaojie.me/2009/11/dev343-teched-2009-real-world-aspnet-mvc.html</guid>
      <description>&lt;p&gt;上周的TechEd 2009比想象中忙，掺和了不少Session。不过一到晚上就开始胡吃海喝，总体来说过得还是挺不错的——只不过博客就落下了。嗯嗯，从现在开始继续。&lt;/p&gt;  &lt;p&gt;这个是我在这次TechEd上关于ASP.NET MVC的演讲以及演示代码下载，内容比较多，时间有些不够用。大家不妨看看，权当消遣。我去处理别的事情了……太多邮件没有回复，太多RSS没有看了。&lt;/p&gt;
&lt;div style="width:425px;text-align:left" id="__ss_2453692"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/jeffz/real-world-aspnet-mvc" title="Real World ASP.NET MVC"&gt;Real World ASP.NET MVC&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dev343-091108195550-phpapp02&amp;stripped_title=real-world-aspnet-mvc" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=dev343-091108195550-phpapp02&amp;stripped_title=real-world-aspnet-mvc" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://cid-fba4447598b1d752.skydrive.live.com/self.aspx/Public/TechEd2009%5E_DEV343%5E_Demo.zip"&gt;示例代码&lt;/a&gt;&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/11/dev343-teched-2009-real-world-aspnet-mvc.html#comments</comments>
      <pubDate>Mon, 09 Nov 2009 02:03:00 GMT</pubDate>
      <lastBuildDate>Mon, 09 Nov 2009 02:03:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/asp-net/">ASP.NET</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>幻灯片：Web开发中的缓存</title>
      <link>http://blog.zhaojie.me/2009/09/slides-web-cache.html</link>
      <guid>http://blog.zhaojie.me/2009/09/slides-web-cache.html</guid>
      <description>&lt;p&gt;这是我昨天在&lt;a href="http://www.broadview.com.cn/open%20party/6/openparty-6.htm"&gt;博文视点Open Party上海站&lt;/a&gt;上关于Web开发中缓存的简单讲座。原本博文视点的朋友们希望我讲一下ASP.NET MVC方面的话题（估计看我最近一直在搞这个），但是我觉得其他平台一直用的是MVC框架，而ASP.NET MVC作为“后来者”也没有什么出彩的地方，所以最终选择这个稍微“通用”些的话题。&lt;/p&gt; &lt;div style="text-align: left; width: 425px" id="__ss_2026379"&gt;&lt;a style="margin: 12px 0px 3px; display: block; font: 14px helvetica,arial,sans-serif; text-decoration: underline" title="Web开发中的缓存" href="http://www.slideshare.net/jeffz/web-2026379"&gt;Web开发中的缓存&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=web-090920104457-phpapp02&amp;amp;stripped_title=web-2026379" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=web-090920104457-phpapp02&amp;amp;stripped_title=web-2026379" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt; &lt;div style="font-family: tahoma,arial; height: 26px; font-size: 11px; padding-top: 2px"&gt;View more &lt;a style="text-decoration: underline" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration: underline" href="http://www.slideshare.net/jeffz"&gt;jeffz&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt; &lt;p&gt;缓存是系统性能的关键，可以说每一个高性能的系统都在这方面下过苦功。不过似乎在这一块的总结还不太多，大部分的“讨论”都是在讲，例如，缓存多么重要，Memcached多么重要，但几乎没有人讲过在某个常见场景下的解决方案“案例”，更加没有提出过如“缓存模式”这样的东西。如&lt;a href="http://www.zhuangbiaowei.cn/"&gt;庄表伟&lt;/a&gt;同学&lt;a href="http://www.zhuangbiaowei.cn/?p=181"&gt;所说那样&lt;/a&gt;：“经典的GoF的设计模式，其实只解决了（甚至只能说部分解决了）可重用性的需求。”。因此可以这么说，我们在经验的总结上还缺了很大一块。&lt;/p&gt; &lt;p&gt;不如，现在就留下你的经验吧——或者只是你的疑惑，甚至只是一个你思考过但没有解决的问题。可能别人看了就能想到：“哎，这当初我不也遇到过吗？当时我是如此如此，这般这般……”&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/09/slides-web-cache.html#comments</comments>
      <pubDate>Sun, 20 Sep 2009 16:32:00 GMT</pubDate>
      <lastBuildDate>Sun, 20 Sep 2009 16:32:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/asp-net/">ASP.NET</category>
      <category domain="http://blog.zhaojie.me/news/">新闻信息</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>Get Ready for Real World ASP.NET MVC</title>
      <link>http://blog.zhaojie.me/2009/09/get-ready-for-real-world-aspnet-mvc-at-teched-2009.html</link>
      <guid>http://blog.zhaojie.me/2009/09/get-ready-for-real-world-aspnet-mvc-at-teched-2009.html</guid>
      <description>&lt;p&gt;&lt;a href="http://www.microsoft.com/china/teched/2009/"&gt;2009年的TechED大会即将在北京举行&lt;/a&gt;（11/5 - 11/7），其中有我的一个Session，我将其命名为“Real World ASP.NET MVC”，希望可以分享一下自己在ASP.NET MVC方面的使用体会。&lt;/p&gt; &lt;p&gt;最近我一直在总结ASP.NET MVC使用的方方面面，将我之前提出的一些“最佳实践”给具体化，此外我也在构建&lt;a href="http://MvcPatch.codeplex.com"&gt;MvcPatch&lt;/a&gt;这样的“补丁”、“扩展”及“示例”。有些朋友提出，我写的这一系列文章过于松散，话题之间关联不大。其实刚好相反，每个话题之间都是有联系的，我是把我解决问题过程中的思路细节表现出来。等一个阶段过后，我会整理一下我的思维脉络，把这些话题完整的串联起来。也算是对近期工作的一个总结。&lt;/p&gt; &lt;p&gt;此外，我还打算分享一下在进行ASP.NET MVC开发时的一些周边支持，它可能并不是在使用ASP.NET MVC框架，但是可以让系统构建过程更为“敏捷”，在TechED上的Session也主要是朝这个方向前进的。&lt;/p&gt; &lt;p&gt;而现在，希望大家可以给我一点帮助。例如，您在使用ASP.NET MVC开发Web应用程序时有没有遇到什么困难？您认为ASP.NET MVC哪方面还无法让人满意？各个方面都可以。&lt;/p&gt; &lt;p&gt;我会选择合适的话题来补充TechED的内容，也可以用其他方式（主要是博客）来谈下自己的感想。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/09/get-ready-for-real-world-aspnet-mvc-at-teched-2009.html#comments</comments>
      <pubDate>Wed, 16 Sep 2009 05:37:00 GMT</pubDate>
      <lastBuildDate>Wed, 16 Sep 2009 05:37:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/reading/">阅读相关</category>
      <title>MIT 6.00 Introduction to Computer Science and Programming, Fall 2008</title>
      <link>http://blog.zhaojie.me/2009/09/mit-open-course-sicp-replacement.html</link>
      <guid>http://blog.zhaojie.me/2009/09/mit-open-course-sicp-replacement.html</guid>
      <description>&lt;p&gt;两个月前我在&lt;a href="http://blog.zhaojie.me/2009/07/recommended-reading-2-sicp.html"&gt;推荐SICP&lt;/a&gt;这本书时，我提到MIT已经使用Python代替经典的SICP这本书进行编程基础课的教学——但是不知道用的是哪本教材。不过现在已经有了&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-00Fall-2008/CourseHome/index.htm"&gt;更进一步的消息&lt;/a&gt;，那就是：似乎没有一本如SICP这样的教材。如果说有什么统一参考，那么可能就是《&lt;a href="http://en.wikibooks.org/wiki/Python_Programming"&gt;Python Programming&lt;/a&gt;》这本wikibook了，可能还要算上官方的&lt;a href="http://docs.python.org/tutorial/index.html"&gt;Tutorial&lt;/a&gt;，还有《&lt;a href="http://www.greenteapress.com/thinkpython/thinkCSpy/thinkCSpy.pdf"&gt;How to Think Like a Computer Scientist: Learning with Python&lt;/a&gt;》。事实上从MIT的课程主页上来看，这门课程中&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-00Fall-2008/Readings/index.htm"&gt;需要阅读的资料&lt;/a&gt;并不仅限于“书”，而包括各种各样的资料——这简直是一定的，因为这门课是在教“编程”而不是教“Python”。&lt;/p&gt; &lt;p&gt;当时我还提过学习SICP时，可以配合两个公开视频：一是&lt;a href="http://webcast.berkeley.edu/course_details_new.php?seriesid=2008-D-26263&amp;amp;semesterid=2008-D"&gt;Berkeley的上课视频&lt;/a&gt;，二是&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-001Spring-2005/VideoLectures/index.htm"&gt;MIT的公开课件&lt;/a&gt;（为SICP原书作者Hal Abelson 和Gerald Jay Sussman为Hewlett-Packard公司员工培训时的录像）。这两个视频的历史都较为久远了，如果要与时俱进的话，现在我们有更“新”的选择了——不敢说更好，因为我也是今天早点看到&lt;a href="http://www.michaelfeathers.com/"&gt;Michael Feathers&lt;/a&gt;的Twitter消息才知道&lt;a href="http://www.youtube.com/watch?v=k6U-i4gXkLM"&gt;新的公开视频&lt;/a&gt;已经发布了。如果您无法观看Youtube，也可以从MIT的课程主页上&lt;a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-00Fall-2008/LectureVideos/index.htm"&gt;下载这些视频&lt;/a&gt;。看着教授用苹果在明亮的教室里讲课的感觉，的确比看之前的视频要舒畅很多。&lt;/p&gt; &lt;p&gt;我很憧憬MIT的这类顶级学府的学术氛围，虽然这个梦想似乎越来越遥远了。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/09/mit-open-course-sicp-replacement.html#comments</comments>
      <pubDate>Mon, 14 Sep 2009 02:02:00 GMT</pubDate>
      <lastBuildDate>Mon, 14 Sep 2009 02:02:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/news/">新闻信息</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>Kent Beck确认参加敏捷中国大会2009，讲述其35年架构设计心得</title>
      <link>http://blog.zhaojie.me/2009/08/kent-beck-is-coming-agile-china-2009.html</link>
      <guid>http://blog.zhaojie.me/2009/08/kent-beck-is-coming-agile-china-2009.html</guid>
      <description>&lt;p&gt;尘埃落定，Kent Beck终于确定他的行程，将于敏捷中国大会（9月11日~12日）前两天来京参会，并以大讲堂的形式分享其在架构设计方面的心得，在大会当天会做"实效的理想主义"的演讲，和另一位敏捷宣传创始人Dave Thomas一同为大会开幕。另外，这也是KB首次来中国，欢迎一起观瞻这个有点传奇色彩的极限编程创始人、敏捷宣言创始人。&lt;/p&gt; &lt;p&gt;在InfoQ总编辑和Kent Beck的电话沟通中，他稍有激动地告诉说，最近终于搞明白设计是怎么一回事了，有点醍醐灌顶的感觉。这也是其35年来的精华总结，据他自己说，如果将这次的讲座做个比喻的话，你就想想十几年前听我讲极限编程的那一小撮人现在的感受吧，Don't miss it。也是基于此，为了让更多人分享Kent Beck的这个心得，和KB商定后，InfoQ中文站将原本定在2,500的票价调整到普通票680元，特惠票480元，学生票280元。&lt;/p&gt; &lt;p&gt;Anyway，希望大家能够捧场，也希望这次名师讲堂对大家理解架构设计有帮助。&lt;/p&gt; &lt;p&gt;&lt;b&gt;相关链接：&lt;/b&gt;&lt;a href="http://www.infoq.com/cn/news/2009/08/kent-beck-responsive-design"&gt;名师讲堂之Kent Beck----响应式设计，现接受报名&lt;/a&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;相关信息：&lt;/b&gt;主题演讲：实效的理想主义。&lt;/p&gt; &lt;p&gt;“实效”这个词本身是表示说妥协，或者说以一种非最好的方式做事情，但是确实能帮助解决问题。而另一方面，"理想主义"却带有不切实际，或者说理论多于实践的含义。将这两个方面放在一起，看起来非常矛盾，但是什么时候理想主义能成为最实效的方法呢？&lt;/p&gt; &lt;p&gt;名师讲堂：响应式设计----何时做，如何做，以及做什么？&lt;/p&gt; &lt;p&gt;当软件需求发生了变化、开发人员对技术的理解更深、或技术平台发生进步的时候，软件的设计也需要相应的发展和变化。掌握及管理这种变化的过程是软件开发人员一种非常重要的技能。好的设计能够实现更容易的测试、更低的成本、更快的开发速度、更少的缺陷，以及更高的客户满意度。本次培训将讨论如何实现一次只设计一小块软件，如何安全有效的进行修改，以及如何理解软件设计的内部结构并将其应用于日常工作。本讲堂将仅面向有经验的开发人员。&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/08/kent-beck-is-coming-agile-china-2009.html#comments</comments>
      <pubDate>Sun, 23 Aug 2009 15:47:00 GMT</pubDate>
      <lastBuildDate>Sun, 23 Aug 2009 15:47:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/asp-net/">ASP.NET</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>ASP.NET MVC单元测试最佳实践</title>
      <link>http://blog.zhaojie.me/2009/02/mvc-unit-test-best-practices.html</link>
      <guid>http://blog.zhaojie.me/2009/02/mvc-unit-test-best-practices.html</guid>
      <description>&lt;P&gt;这是我在上周“.NET技术大会”上的主题Session。&lt;/P&gt;
&lt;P&gt;作为一个技术，例如语言或框架，为了确保有能力应付各种情况，以及天生的限制能力不足（例如弱类型语言无法限制数据类型），必然可以“组合”成无穷无尽的使用方法。而最佳实践，便是所有用法的子集——而且很有可能是非常小的子集。通过最佳实践，我们的程序一般可以得到更好的质量（高性能，可扩展性，可维护性等等）。在我看来，只有遵守最佳实践，我们才能充分发挥语言或框架的最佳功效。而最佳实践由于是一种限制，也就将用法的“最大边界”给清晰化了，这使外界能够契合这个边界进行扩展，简化了开发辅助功能的难度。&lt;/P&gt;
&lt;P&gt;我对于微软的一个特点时常呈一种否定态度，那就是因为它往往为了“显摆”自己的技术而向外界展现出一种“飘渺的美好”愿景。例如WebForm推出时铺天盖地的“拖拽”风潮，看似精彩却迷人双眼。对于能够“出钱”的合作伙伴来说，微软会给出一定指导。而对于社区来说呢？可能就只有一堆一堆的“How-to”和“Quickstart”……有时候我甚至会想，微软的“精英”们真想清楚过他们的东西该怎么“用好”吗（例如大家可以看到园子里，咳咳，某些微软技术支持中心员工给出的解决方案，咳咳……）？因此在《Essential WPF》一书的“序”中出现了“Microsoft Continuing Employment Act（微软编外就业行动）”，就是形容对微软的技术提供使用指引，并以此谋作为职业的人。&lt;/P&gt;
&lt;P&gt;可能是微软故意的吧，呵呵，我想。&lt;/P&gt;
&lt;P&gt;先提供这次Session内容的PPT和演示吧，在接下来的一段时间内，我会陆续分析这次课程的内容。希望大家能够尽可能地把东西给“用好”，而不仅仅是得到表面上的正确结果。&lt;/P&gt;&lt;IFRAME style="BORDER-RIGHT: #dde5e9 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #dde5e9 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 3px; BORDER-LEFT: #dde5e9 1px solid; WIDTH: 240px; PADDING-TOP: 0px; BORDER-BOTTOM: #dde5e9 1px solid; HEIGHT: 66px; BACKGROUND-COLOR: #ffffff" marginWidth=0 marginHeight=0 src="http://cid-fba4447598b1d752.skydrive.live.com/embedrowdetail.aspx/Slides/My%20Session%20in%202009%20DotNet%20Conference" frameBorder=0 scrolling=no&gt;&lt;/IFRAME&gt;&lt;BR&gt;&lt;BR&gt;关于“最佳实践”，我推荐一篇文章“&lt;A href="http://www.infoq.com/cn/articles/better-best-practices"&gt;更好的最佳实践&lt;/A&gt;”</description>
      <comments>http://blog.zhaojie.me/2009/02/mvc-unit-test-best-practices.html#comments</comments>
      <pubDate>Mon, 23 Feb 2009 01:07:00 GMT</pubDate>
      <lastBuildDate>Mon, 23 Feb 2009 01:07:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/news/">新闻信息</category>
      <category domain="http://blog.zhaojie.me/life/">生活心情</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <title>QCon北京大会，3月15日前购票享受7.5折优惠</title>
      <link>http://blog.zhaojie.me/2009/02/1393836.html</link>
      <guid>http://blog.zhaojie.me/2009/02/1393836.html</guid>
      <description>&lt;p&gt;&lt;strong style="color:red;"&gt;如果有朋友个人或团体需要的话可以联系我。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;距离&lt;a href="http://www.qconbeijing.com"&gt;QCon全球企业开发大会北京站&lt;/a&gt;（4月7~9日）还有2个月的时间，这次的会议包括6大主题和30多位知名讲师，为你提供一场丰富的培训和绝佳的学习机会。&lt;b&gt;&lt;a href="http://www.qconbeijing.com/Reg.aspx"&gt;现在报名&lt;/a&gt;即可享受7.5折优惠，节省700元。&lt;/b&gt; &lt;p&gt;&lt;a href="http://qcon.infoq.com"&gt;QCon大会&lt;/a&gt;的目标是为企业软件开发领域提供技术架构、团队领导和项目管理等深入技术内容的会议。这也意味着会议的内容并不局限在商业和流行技术上，同时它会提供最佳实践和相关经验，为你当前和未来的项目提供直接的帮助。今年&lt;a href="http://www.qconbeijing.com"&gt;QCon北京站大会&lt;/a&gt;包含了6个专题，比如： &lt;p&gt;&lt;b&gt;&lt;a href="http://www.qconbeijing.com/ShowNews.aspx?id=19"&gt;Java：企业级Java开发&lt;/a&gt;&lt;/b&gt;——毛新生主持&lt;br&gt;本主题将主要讨论Java语言和平台在企业级软件开发中的应用，包括服务器端、客户端等，以及Java语言的最新发展趋势，比如JRuby等。 &lt;p&gt;&lt;b&gt;&lt;a href="http://www.qconbeijing.com/ShowNews.aspx?id=20"&gt;Agile：敏捷，在路上&lt;/a&gt;&lt;/b&gt;——李剑主持&lt;br&gt;在本主题中，来自各领域有多年实践经验的项目管理人士将与大家一起讨论他们的最佳实践。 &lt;p&gt;&lt;b&gt;&lt;a href="http://www.qconbeijing.com/ShowNews.aspx?id=21"&gt;Cloud Computing：云计算，下一代架构&lt;/a&gt;&lt;/b&gt;——孟岩主持&lt;br&gt;与过去市面上所出现的许多热门名词不同，云计算在一出现就获得了厂商和开发人员的认可，比如Amazon的EC2和S3，比如Salesforce的在线CRM，比如阿里巴巴的商务云等，还比如InfoQ自己的视频就是用的Amazon的云服务等。 &lt;p&gt;&lt;b&gt;&lt;a href="http://www.qconbeijing.com/ShowNews.aspx?id=22"&gt;Case Studies：网站架构案例分析&lt;/a&gt;&lt;/b&gt;——冯大辉主持&lt;br&gt;你一定想知道那些知名网站背后的架构师是如何设计和构建这些产品的，比如eBay、支付宝、51.com、搜狐、豆瓣等。 &lt;p&gt;&lt;b&gt;&lt;a href="http://www.qconbeijing.com/ShowNews.aspx?id=23"&gt;Architect：设计优良的架构&lt;/a&gt;&lt;/b&gt;——周爱民主持&lt;br&gt;你如何带领团队实现健壮和可扩展的架构？我们一起来聆听这些架构领域领导者在设计架构和成为优秀架构师之路上的经验分享吧。 &lt;p&gt;&lt;b&gt;&lt;a href="http://www.qconbeijing.com/ShowNews.aspx?id=24"&gt;RIA：炫富互联网应用&lt;/a&gt;&lt;/b&gt;——吕德维主持&lt;br&gt;Dojo Toolkit的作者Dylan Shiemann、具有丰富的RIA实践经验的群硕公司技术总监邵荣、以及Cynergy系统公司执行总监和台湾Macromedia用户组发起人吕德维是如何理解RIA技术的？ &lt;p&gt;7.5折的优惠期截止到3月15日，&lt;a href="http://www.qconbeijing.com/Reg.aspx"&gt;价格为2,100元&lt;/a&gt;。如果你想团购门票，请直接邮件至&lt;a href="mailto:qcon&amp;#64;cn.infoq.com"&gt;qcon&amp;#64;cn.infoq.com&lt;/a&gt;或者电话010-51385937。更多关于QCon过往大会的信息，可以访问&lt;a href="http://www.infoq.com/cn/qcon"&gt;QCon大会特别专题&lt;/a&gt;。 &lt;p&gt;本次&lt;a href="http://www.qconbeijing.com"&gt;QCon北京站大会&lt;/a&gt;的讲师包括： &lt;ul&gt; &lt;li&gt;Rod Johnson——Spring创始人，Java和Java EE开发领域世界级权威  &lt;li&gt;Martin Fowler——&lt;a href="http://www.china-pub.com/34707"&gt;《分析模式》&lt;/a&gt;和&lt;a href="http://www.china-pub.com/12901"&gt;《重构》&lt;/a&gt;等书的作者，敏捷宣言缔造者，ThoughtWorks首席科学家  &lt;li&gt;Randy Shoup——&lt;a href="http://www.ebay.com/"&gt;eBay&lt;/a&gt;高级架构师  &lt;li&gt;Jeff Bar——&lt;a href="http://www.amazon.com/"&gt;Amazon&lt;/a&gt;公司云计算战略师  &lt;li&gt;Dylan Shiemann——&lt;a href="http://www.dojotoolkit.org/"&gt;Dojo Tookit&lt;/a&gt;创始人  &lt;li&gt;Henrik Kniberg——&lt;a href="http://www.infoq.com/cn/minibooks/scrum-xp-from-the-trenches"&gt;《硝烟中的Scrum和XP》&lt;/a&gt;作者  &lt;li&gt;Floyd Marinescu——《EJB模式设计》作者、&lt;a href="http://www.infoq.com"&gt;InfoQ&lt;/a&gt;和&lt;a href="http://www.theserverside.com"&gt;TheServerSide&lt;/a&gt;创始人  &lt;li&gt;毛新生——IBM中国开发中心Web 2.0首席架构师  &lt;li&gt;李伟——西门子中国研究院软件与工程中心首席系统架构咨询顾问  &lt;li&gt;周爱民——&lt;a href="http://www.china-pub.com/34356"&gt;《大道至简》&lt;/a&gt;和JS语言精粹等图书作者，盛大前高级架构师  &lt;li&gt;高焕堂——台湾软件架构设计大师，“台湾OO技术教父级代表人物”  &lt;li&gt;洪强宁——&lt;a href="http://www.douban.com"&gt;豆瓣网&lt;/a&gt;技术总监  &lt;li&gt;等等…… &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;如果你是厂商，有意支持本次大会，请邮件至&lt;a href="mailto:sponsor&amp;#64;cn.infoq.com"&gt;sponsor&amp;#64;cn.infoq.com&lt;/a&gt;或者电话010-51385937；如果你是媒体或者技术社区，有意参与本次大会的报道，请邮件至&lt;a href="mailto:media&amp;#64;cn.infoq.com"&gt;media&amp;#64;cn.infoq.com&lt;/a&gt;或者电话010-89880682；如果你是学生，有意成为本次大会的志愿者，或者有任何和QCon北京站大会相关的问题，请邮件至&lt;a href="mailto:qcon&amp;#64;cn.infoq.com"&gt;qcon&amp;#64;cn.infoq.com&lt;/a&gt;。我们期待你的参与，近距离分享国际技术专家的观点和经验。 &lt;p&gt;&amp;nbsp; &lt;p&gt;广告时间，好东西。 &lt;p&gt;&lt;a title="http://www.infoq.com/cn/news/2009/02/qcon-beijing-second" href="http://www.infoq.com/cn/news/2009/02/qcon-beijing-second"&gt;http://www.infoq.com/cn/news/2009/02/qcon-beijing-second&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong style="color:red;"&gt;如果有朋友个人或团体需要的话可以联系我。&lt;/strong&gt;&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2009/02/1393836.html#comments</comments>
      <pubDate>Thu, 19 Feb 2009 04:27:00 GMT</pubDate>
      <lastBuildDate>Thu, 19 Feb 2009 04:27:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/asp-net/">ASP.NET</category>
      <title>在Web应用程序开发过程中利用ASP.NET MVC框架的实战技巧</title>
      <link>http://blog.zhaojie.me/2008/11/teched-2008-cs276.html</link>
      <guid>http://blog.zhaojie.me/2008/11/teched-2008-cs276.html</guid>
      <description>&lt;p&gt;这是我在TechED 2008北京站讲的一个Community Session，主要内容是在传统的ASP.NET（Web Forms）应用程序中运用ASP.NET MVC中一些优秀特性的方式。&lt;/p&gt;
&lt;p&gt;这里是&lt;a href="http://files.cnblogs.com/JeffreyZhao/TechED_CS276.zip"&gt;PPT和Demo下载&lt;/a&gt;，以后我再慢慢细说。&lt;/p&gt;&lt;div class="blog_topic"&gt;所属话题：&lt;a href="http://www.cnblogs.com/topic/24/" target="_blank"&gt;Tech·Ed 2008&lt;/a&gt;&lt;/div&gt;</description>
      <comments>http://blog.zhaojie.me/2008/11/teched-2008-cs276.html#comments</comments>
      <pubDate>Fri, 07 Nov 2008 15:18:00 GMT</pubDate>
      <lastBuildDate>Fri, 07 Nov 2008 15:18:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <category domain="http://blog.zhaojie.me/asp-net/">ASP.NET</category>
      <title>MSDN Webcast“深入浅出ASP.NET AJAX系列”预告及反馈</title>
      <link>http://blog.zhaojie.me/2007/03/asp-net-ajax-msdn-webcast-feedback.html</link>
      <guid>http://blog.zhaojie.me/2007/03/asp-net-ajax-msdn-webcast-feedback.html</guid>
      <description>&lt;P style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;“承蒙抬爱”，MSDN Webcast给了我一个和大家探讨ASP.NET AJAX的机会。&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;我为MSDN Webcast准备了一个《深入浅出ASP.NET AJAX系列》，共有十多次课程，希望能够为大家系统的讲解一下如何使用ASP.NET AJAX框架进行开发。在这个系列中，我会尽可能的从“使用”入手，然后对于ASP.NET AJAX框架进行一定程度的深入讲解，使大家能够更自由地使用ASP.NET AJAX框架，并且能够自己着手解决一些使用中的问题。简单地说，这个系列中最着重的就是尽可能的“授人以渔”。&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;希望大家对我的这个系列多提意见和建议，并回复在这篇文章中，我需要您的反馈来改进我的表现。&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; FONT-FAMILY: verdana" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;STRONG&gt;已有课程：&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(1)：ASP.NET AJAX 概述（3月13日）&lt;/STRONG&gt;：对于ASP.NET AJAX的大致功能进行概述和演示，通过简单的演示让听众了解到ASP.NET AJAX框架的强大之处，以及对于开发带来的便捷。并且对于学习和研究ASP.NET AJAX，以及开发ASP.NET AJAX使用的工具进行简单演示和介绍。（&lt;A href="http://www.microsoft.com/china/msdn/events/Webcasts/shared/Webcast/episode.ASPx?newsID=1242787" target=_blank mce_href="http://www.microsoft.com/china/msdn/events/Webcasts/shared/Webcast/episode.ASPx?newsID=1242787"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax1_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax1_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax1_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax1_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/A/4/2/A42A23F0-0485-46D8-9CDC-319E9901396A/WebCast20070313_Video.zip" mce_href="http://download.microsoft.com/download/A/4/2/A42A23F0-0485-46D8-9CDC-319E9901396A/WebCast20070313_Video.zip"&gt;视频&lt;/A&gt;）（&lt;A href="http://blog.zhaojie.me/2007/03/673552.html" mce_href="/JeffreyZhao/archive/2007/03/13/673552.html"&gt;自我总结&lt;/A&gt;）&lt;/DIV&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(2)：UpdatePanel的使用(上)（3月29日）&lt;/STRONG&gt;：详细讲解了UpdatePanel作为ASP.NET控件的使用方式，并介绍UpdatePanel的调试方式，提出最佳实践。在课程中也会剖析UpdatePanel的基本实现原理。通过本次课程，听众可以熟练地使用服务器端编程来使用UpdatePanel并了解其基本原理。（&lt;A href="http://www.microsoft.com/china/msdn/events/Webcasts/shared/Webcast/episode.ASPx?newsID=1242802" target=_blank mce_href="http://www.microsoft.com/china/msdn/events/Webcasts/shared/Webcast/episode.ASPx?newsID=1242802"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax2_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax2_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax2_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax2_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/6/F/5/6F56B229-F414-44A1-8439-CA754E4078D9/WebCast20070329_Video.zip" mce_href="http://download.microsoft.com/download/6/F/5/6F56B229-F414-44A1-8439-CA754E4078D9/WebCast20070329_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(3)：UpdatePanel的使用(下)（4月10日）&lt;/STRONG&gt;：详细讲解UpdatePanel在客户端形成的一个生命周期，介绍如何使用脚本编程来更好的使用UpdatePanel。在课程中也会剖析UpdatePanel的数据传输方式。通过本次课程听众可以掌握客户端生命周期的方方面面，以及它们的使用方式。（&lt;A href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=705" target=_blank mce_href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=705"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax3_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax3_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax3_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax3_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/0/7/6/07613E63-7C26-4D86-9C22-A353282F5818/WebCast20070410_Video.zip" mce_href="http://download.microsoft.com/download/0/7/6/07613E63-7C26-4D86-9C22-A353282F5818/WebCast20070410_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(4)：客户端访问WebService(上)：基本使用方式（5月14日）&lt;/STRONG&gt;：从客户端访问WebService是ASP.NET AJAX中重要的功能，合理的使用则可以真正体现出AJAX技术的优势。本次课程将会讲解客户端访问WebService的基本方式，听众可以了解如何在应用中使用到ASP.NET AJAX的这一功能。（&lt;A href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=727" target=_blank mce_href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=727"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax4_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax4_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax4_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax4_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/4/0/2/402FDFEA-3551-4C60-9724-14B359186096/WebCast20070514_Video.zip" mce_href="http://download.microsoft.com/download/4/0/2/402FDFEA-3551-4C60-9724-14B359186096/WebCast20070514_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(5)：客户端访问WebService(中)：参数类型的序列化与反序列化（6月11日）&lt;/STRONG&gt;：从客户端访问WebService是ASP.NET AJAX中重要的功能，合理的使用则可以真正体现出AJAX技术的优势。本次课程将会详细介绍客户端访问WebService对于复杂参数类型的支持和变化，以及ASP.NET AJAX提供的JSON序列化能力。通过这次课程，听众能够了解如何让自己的WebService可以支持任意的复杂类型，以及如何将ASP.NET AJAX的JSON序列化与反序列化用到开发中去。（&lt;A href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=749" target=_blank mce_href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=749"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax5_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax5_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax5_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax5_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/D/0/E/D0EBDF65-99C4-43A0-A97E-B25B179D5F07/WebCast20070611_Video.zip" mce_href="http://download.microsoft.com/download/D/0/E/D0EBDF65-99C4-43A0-A97E-B25B179D5F07/WebCast20070611_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(6)：客户端访问WebService(下)：原理与细节（6月21日）&lt;/STRONG&gt;：从客户端访问WebService是ASP.NET AJAX中重要的功能，合理的使用则可以真正体现出AJAX技术的优势。本次课程将会简单讲解客户端访问WebService的原理，并且讲解这一功能的一些高级运用和使用中的一些变化与技巧。通过这次课程，听众将对ASP.NET AJAX中这一功能进行更深入的了解，可以将其灵活地运用到自己的应用中。（&lt;A href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=760" target=_blank mce_href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=760"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax6_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax6_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax6_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax6_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/B/5/F/B5F2DA95-53B4-4296-9657-8D57CEE6FAD6/WebCast20070621pm_Video.zip" mce_href="http://download.microsoft.com/download/B/5/F/B5F2DA95-53B4-4296-9657-8D57CEE6FAD6/WebCast20070621pm_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(7)：Microsoft AJAX Library对于JavaScript原生对象的扩展（上）（6月25日）&lt;/STRONG&gt;：AJAX技术的基础就是JavaScript，而JavaScript开发中的基础即为原生对象。此外，Microsoft AJAX Library为原生对象进行了扩展，使AJAX应用程序的开发更为容易。从本次课程开始，我们将使用两节课来详细讲述JavaScript中最常用的原生对象，以及Microsoft AJAX Library与此相关的扩展。（&lt;A href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=767" target=_blank mce_href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=767"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax7_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax7_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax7_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax7_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/B/5/F/B5F2DA95-53B4-4296-9657-8D57CEE6FAD6/WebCast20070625_Video.zip" mce_href="http://download.microsoft.com/download/B/5/F/B5F2DA95-53B4-4296-9657-8D57CEE6FAD6/WebCast20070625_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(8)：Microsoft AJAX Library对于JavaScript原生对象的扩展（下）（7月3日）&lt;/STRONG&gt;：AJAX技术的基础就是JavaScript，而JavaScript开发中的基础即为原生对象。此外，Microsoft AJAX Library为原生对象进行了扩展，使AJAX应用程序的开发更为容易。本次课程连同上次课程会详细讲述JavaScript中最常用的原生对象，以及Microsoft AJAX Library与此相关的扩展。 （&lt;A href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=778" target=_blank mce_href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=778"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax8_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax8_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax8_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax8_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/3/3/5/335DE5B7-3C23-4829-9807-C83FE218879D/WebCast20070703_Video.zip" mce_href="http://download.microsoft.com/download/3/3/5/335DE5B7-3C23-4829-9807-C83FE218879D/WebCast20070703_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(9)：使用Microsoft AJAX Library中的面向对象特性来进行开发（7月9日）&lt;/STRONG&gt;：理论和实践证明，合理使用面向对象编程能够提高组件的复用程度，并且使项目易于维护和扩展。本次课程将讲述Microsoft AJAX Library中的面向对象类型系统，这样开发人员就可以在客户端使用JavaScript进行面向对象编程了。（&lt;A href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=782" target=_blank mce_href="http://www.msdnwebcast.com.cn/CourseDetails.aspx?id=782"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax9_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax9_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax9_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax9_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/B/3/8/B38BAD02-7B42-49E4-93B9-7E02A0D57AD0/WebCast20070709_Video.zip" mce_href="http://download.microsoft.com/download/B/3/8/B38BAD02-7B42-49E4-93B9-7E02A0D57AD0/WebCast20070709_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(10)：基于Microsoft AJAX Library扩展客户端组件（7月23日）&lt;/STRONG&gt;：利用面向对象类型系统是扩展组件的常用方法，但是我们在客户端进行开发的时候也不能忘记正在使用的是JavaScript这个非常灵活的动态语言，使用一些特殊的方式来扩展组件有时候会得到更好的效果。本次课程将讲述最常用的基于Microsoft AJAX Library扩展客户端组件的方式，适用情况，以及相关注意点。（&lt;A href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032344867&amp;amp;Culture=zh-CN" target=_blank mce_href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032344867&amp;amp;Culture=zh-CN"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax10_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax10_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax10_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax10_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/0/6/9/0691DCC8-5B2F-4148-BAAE-B73AE8343CD0/WebCast20070723_Video.zip" mce_href="http://download.microsoft.com/download/0/6/9/0691DCC8-5B2F-4148-BAAE-B73AE8343CD0/WebCast20070723_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(11)：Microsoft AJAX Library中异步通信层使用（8月2日）&lt;/STRONG&gt;：Microsoft AJAX Library为了便于开发AJAX应用提出了一个异步通信层。使用这个异步通信层可以方便地发出AJAX请求，而且事实上，整个ASP.NET AJAX的客户端与服务器端的通信都是由它负责的。我们这节课将讲解一下这个异步通信层的使用方式，它可以方便我们做“纯粹”的AJAX应用。 （&lt;A href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032347064&amp;amp;Culture=zh-CN" target=_blank mce_href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032347064&amp;amp;Culture=zh-CN"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax11_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax11_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax11_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax11_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/B/7/1/B71CA32C-163D-44A2-B5DF-0D2A316286C5/WebCast20070802_Video.zip" mce_href="http://download.microsoft.com/download/B/7/1/B71CA32C-163D-44A2-B5DF-0D2A316286C5/WebCast20070802_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(12)：Microsoft AJAX Library中异步通信层的扩展（8月14日）&lt;/STRONG&gt;：Microsoft AJAX Library为了便于开发AJAX应用提出了一个异步通信层，它是整个ASP.NET AJAX客户端AJAX请求的基础。事实上，我们能够基于这个通信平台进行轻松的扩展，使它能够支持不同的通信方式。这节课我们就来讲一下该如何来扩展异步通信平台。（&lt;A href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032347070&amp;amp;EventCategory=4&amp;amp;culture=zh-CN&amp;amp;CountryCode=CN" target=_blank mce_href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032347070&amp;amp;EventCategory=4&amp;amp;culture=zh-CN&amp;amp;CountryCode=CN"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax12_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax12_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax12_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax12_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/B/7/1/B71CA32C-163D-44A2-B5DF-0D2A316286C5/WebCast20070814_Video.zip" mce_href="http://download.microsoft.com/download/B/7/1/B71CA32C-163D-44A2-B5DF-0D2A316286C5/WebCast20070814_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(13)：ASP.NET AJAX提供的Profile Service（8月28日）&lt;/STRONG&gt;：Profie是ASP.NET 2.0的重要特性之一，而ASP.NET AJAX提出了Profile Service，使开发人员能够方便地在客户端以AJAX的方式来处理Profile信息。这节课我们将来了解这个ProfileService的使用和扩展方式。 （&lt;A href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=zh-CN&amp;amp;EventID=1032347081&amp;amp;CountryCode=CN" target=_blank mce_href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=zh-CN&amp;amp;EventID=1032347081&amp;amp;CountryCode=CN"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax13_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax13_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax13_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax13_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/3/7/1/37185750-226E-44D6-895E-DB3DA9C170EA/WebCast20070828pm_Video.zip" mce_href="http://download.microsoft.com/download/3/7/1/37185750-226E-44D6-895E-DB3DA9C170EA/WebCast20070828pm_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(14)：Profile Service的实现方式与扩展（9月5日）&lt;/STRONG&gt;：Profie是ASP.NET 2.0的重要特性之一，而ASP.NET AJAX提出了Profile Service，使开发人员能够方便地在客户端以AJAX的方式来处理Profile信息。这节课我们将来了解这个ProfileService简单的功能细节以及如何扩展Profile Service。（&lt;A href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=zh-CN&amp;amp;EventID=1032351378&amp;amp;CountryCode=CN" target=_blank mce_href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=zh-CN&amp;amp;EventID=1032351378&amp;amp;CountryCode=CN"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax14_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax14_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax14_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax14_Demo.zip"&gt;示例代码&lt;/A&gt;）&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(15)：使用ASP.NET AJAX提供的Authentication Service（9月19日）&lt;/STRONG&gt;：Authentication Service是ASP.NET AJAX提供的另一个Application Service，能够让我们以AJAX方式来使用用户登录等功能。本次课程主要讲述如何来使用Authentication Service。（&lt;A href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=zh-CN&amp;amp;EventID=1032351392&amp;amp;CountryCode=CN" target=_blank mce_href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=zh-CN&amp;amp;EventID=1032351392&amp;amp;CountryCode=CN"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax15_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax15_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax15_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax15_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/1/0/D/10D450A2-C3F5-47EC-A549-99D5E2AB5CC3/WebCast20070918_Video.zip" mce_href="http://download.microsoft.com/download/1/0/D/10D450A2-C3F5-47EC-A549-99D5E2AB5CC3/WebCast20070918_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(16)：ASP.NET AJAX提供的Authentication Service的实现方式与扩展（9月29日）&lt;/STRONG&gt;：Authentication Service是ASP.NET AJAX提供的另一个Application Service，能够让我们以AJAX方式来使用用户登录等功能。本次课程主要讲述Authentication Service的简单实现细节以及如何扩展Authentication Service。（&lt;A href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=zh-CN&amp;amp;EventID=1032342723&amp;amp;CountryCode=CN" target=_blank mce_href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=zh-CN&amp;amp;EventID=1032342723&amp;amp;CountryCode=CN"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax16_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax16_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax16_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax16_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/E/D/1/ED161335-9157-4E51-90BE-3005A04BC10D/WebCast20070928pm_Video.zip" mce_href="http://download.microsoft.com/download/E/D/1/ED161335-9157-4E51-90BE-3005A04BC10D/WebCast20070928pm_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(17)：关注ASP.NET AJAX的核心：ScriptManager（10月10日）&lt;/STRONG&gt;：在之前的课程中我们已经接触过了ASP.NET AJAX的核性控件：ScriptManager。但是ScriptManager还有一些额外的功能值得我们再次给予关注。本次课程将关注ScriptManager的特殊功能，以及它们在开发过程中所起的作用。（&lt;A href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032354588&amp;amp;EventCategory=4&amp;amp;culture=zh-CN&amp;amp;CountryCode=CN" target=_blank mce_href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032354588&amp;amp;EventCategory=4&amp;amp;culture=zh-CN&amp;amp;CountryCode=CN"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax17_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax17_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax17_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax17_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/E/B/5/EB56BDB2-624B-49B0-B196-DF0BFB7A7DF9/WebCast20071010pm_Video.zip" target=_blank mce_href="http://download.microsoft.com/download/E/B/5/EB56BDB2-624B-49B0-B196-DF0BFB7A7DF9/WebCast20071010pm_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(18)：ASP.NET AJAX的国际化与本地化支持（10月24日）&lt;/STRONG&gt;：支持国际化与本地化已经成为越来越多项目的要求了。ASP.NET 2.0提供了开发良好的国际性项目的支持，ASP.NET AJAX也不例外。本次课程将关注于ASP.NET AJAX所提供的脚本国际化和本地化功能。（&lt;A href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032354610&amp;amp;EventCategory=4&amp;amp;culture=zh-CN&amp;amp;CountryCode=CN" target=_blank mce_href="http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032354610&amp;amp;EventCategory=4&amp;amp;culture=zh-CN&amp;amp;CountryCode=CN"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax18_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax18_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax18_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax18_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/0/6/C/06CBC985-6E58-46F8-B808-7BA6CA5632BC/WebCast20071024pm_Video.zip" target=_blank mce_href="http://download.microsoft.com/download/0/6/C/06CBC985-6E58-46F8-B808-7BA6CA5632BC/WebCast20071024pm_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(19)：VS 2008的JavaScript代码提示功能（11月6日）&lt;/STRONG&gt;：VS 2008即将发布，其中的JavaScript代码提示功能异常强大。不过要充分利用这些功能，开发人员还需要给与一点“协助”。本次课程将让听众了解如何使用VS 2008的JavaScript代码提示功能。（&lt;A href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032358640&amp;amp;Culture=zh-CN" target=_blank mce_href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032358640&amp;amp;Culture=zh-CN"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax19_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax19_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax19_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax19_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/8/6/A/86A378D8-18EA-423A-B94A-DC16749BBA13/WebCast20071106am_Video.zip" target=_blank mce_href="http://download.microsoft.com/download/8/6/A/86A378D8-18EA-423A-B94A-DC16749BBA13/WebCast20071106am_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI style="MARGIN-BOTTOM: 5px"&gt;
&lt;DIV&gt;
&lt;DIV&gt;&lt;STRONG&gt;ASP.NET AJAX深入浅出系列课程(20)：使用Microsoft AJAX Library中的浏览器兼容功能（11月13日）&lt;/STRONG&gt;：兼容不同的浏览器始终是客户端中心开发不可避免却又不方便实现的功能。本次课程将让听众了解如何使用Microsoft AJAX Library中的浏览器兼容层方便地开发AJAX应用程序。（&lt;A href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032358656&amp;amp;Culture=zh-CN" target=_blank mce_href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032358656&amp;amp;Culture=zh-CN"&gt;链接&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax20_ppt.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax20_ppt.zip"&gt;幻灯片&lt;/A&gt;）（&lt;A href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax20_Demo.zip" mce_href="http://files.cnblogs.com/JeffreyZhao/AspNetAjax20_Demo.zip"&gt;示例代码&lt;/A&gt;）（&lt;A href="http://download.microsoft.com/download/8/6/A/86A378D8-18EA-423A-B94A-DC16749BBA13/WebCast20071113am_Video.zip" target=_blank mce_href="http://download.microsoft.com/download/8/6/A/86A378D8-18EA-423A-B94A-DC16749BBA13/WebCast20071113am_Video.zip"&gt;视频&lt;/A&gt;）&lt;/DIV&gt;&lt;/DIV&gt;&lt;/LI&gt;&lt;/OL&gt;</description>
      <comments>http://blog.zhaojie.me/2007/03/asp-net-ajax-msdn-webcast-feedback.html#comments</comments>
      <pubDate>Mon, 12 Mar 2007 08:54:00 GMT</pubDate>
      <lastBuildDate>Mon, 12 Mar 2007 08:54:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/asp-net/">ASP.NET</category>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <title>讲座展示：TechEd Europe DEV 411 - AJAX Patterns with ASP.NET AJAX（3）</title>
      <link>http://blog.zhaojie.me/2006/12/lecture--teched-europe-dev411-3.html</link>
      <guid>http://blog.zhaojie.me/2006/12/lecture--teched-europe-dev411-3.html</guid>
      <description>&lt;p&gt;&lt;/p&gt; &lt;p style="font-size: 10pt; font-family: verdana"&gt;这次我选择的讲座内容，是最近在TechEd 2006 Europe中Andre Snanbria和Jeff Prosise的讲座&amp;#8220;AJAX Pattern with ASP.NET AJAX&amp;#8221;。Jeff Prosise是Wintellect的Co-Founder，Andre Sanabria是ASP.NET AJAX Team的Lead Program Manager。在MSDN's Showtime上已经有了&lt;a href="http://www.microsoft.com/emea/msdnshowtime/sessionh.aspx?videoid=331" target="_blank"&gt;这个讲座的完整视频&lt;/a&gt;，而我在早些时候给Andre Sanabria写了封Email，一星期后他给我寄来了这个讲座的PPT和Demo，大家可以&lt;a href="http://files.cnblogs.com/JeffreyZhao/TechEd_DEV411.zip" target="_blank"&gt;点击这里&lt;/a&gt;下载。&lt;/p&gt; &lt;p style="font-size: 10pt; font-family: verdana"&gt;这次讲座的主要内容是讲述了使用ASP.NET AJAX开发AJAX应用的最佳实践，在这次讲座里，会对建立轻量级的客户端控件的方法进行深入，讲述了如何优化脚本代码，并提出了如何避免AJAX开发中常见的问题。&lt;/p&gt; &lt;p style="font-size: 10pt; font-family: verdana"&gt;本篇文章是这次讲座展示的第三篇，使用了一个例子来观察UpdatePanel的工作方式，并通过几个步骤对这个例子进行优化。&lt;/p&gt; &lt;p style="font-size: 14pt; font-family: verdana"&gt;&lt;strong&gt;讲座内容&lt;/strong&gt;&lt;/p&gt; &lt;table cellspacing="5"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_15%5B2%5D.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_15_thumb.jpg" width="200" border="0"&gt;&lt;/a&gt; &lt;/td&gt; &lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_16%5B2%5D.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_16_thumb.jpg" width="200" border="0"&gt;&lt;/a&gt; &lt;/td&gt; &lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV和411AJAXPatternsw.NETAJAX3_13EC/DEV411_17%5B2%5D.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="180" src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_17_thumb.jpg" width="200" border="0"&gt;&lt;/a&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;我先从展示没有UpdatePanel时的体验开始（~/Optimization/0.SimpleForm.aspx）。这是个简单的页面（上图左，请注意Back按钮无法使用），我们有几个相册供用户选择，然后我们将为它们添加Tag。现在我们没有使用UpdatePanel，当选择了某一项时，您会发现发生了一个完整的页面刷新（上图中，我把Back按钮可以使用了）。因为现在在我的本地机器上演示，因此这个刷新非常迅速。但是在互联网上就不会像本地那么快了，带宽会非常小。您可以发现，当我点击页面上每个单选按钮后，页面都会有完整的刷新（上图右，Back按钮的列表多了几项）。&lt;/p&gt; &lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;我们现在来看一下该如何解决这个问题。我们解决这个问题的方法只是将UpdatePanel添加到页面上。正如Jeff刚才提到的那样，我们在刚才的应用里使用了许多UpdatePanel。现在这个也是展示UpdatePanel的不错的例子（~/Optimization/1.PartialRendering.aspx）。&lt;/p&gt; &lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;我们首先先使用UpdatePanel包含一个服务器端的控件&amp;#8220;Panel&amp;#8221;（如下）：&lt;/p&gt; &lt;pre class="code"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;UpdatePanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"server"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"contentUpdatePanel"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;Panel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"server"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"contentPanel"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;style&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"padding: 10px"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;AsyncPostBackTrigger&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ControlID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"albumList"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;Triggers&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;UpdatePanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt; 
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;然后我们使用UpdatePanel将一些CheckBox控件包含起来，我们那些Tag都是CheckBox（如下）：&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;UpdatePanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"server"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"tagsListUpdatePanel"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;CheckBoxList&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"server"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"tagsList"&lt;/span&gt;
            &lt;span style="color: #ff0000"&gt;AutoPostBack&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"TRUE"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Enabled&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"false"&lt;/span&gt;
            &lt;span style="color: #ff0000"&gt;RepeatColumns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"3"&lt;/span&gt;
            &lt;span style="color: #ff0000"&gt;OnSelectedIndexChanged&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"OnTagsSelectedIndexChanged"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Nature&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Landscapes&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Cityscapes&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Conference Trips&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Microsoft&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;CheckBoxList&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;UpdatePanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt; 
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;我们这里还有一个UpdatePanel（如下）：&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;UpdatePanel&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"server"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"tagsUpdatePanel"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;Label&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"server"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"tagsLabel"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;UpdatePanel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt; 
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;我们先来看一下现在的用户体验（老赵：这里就省略了），再来观察数据在客户端和服务器端之间是如何交换的。&lt;/p&gt;
&lt;table cellspacing="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_18%5B2%5D.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="165" src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_18_thumb.jpg" width="200" border="0"&gt;&lt;/a&gt; &lt;/td&gt;
&lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_19%5B2%5D.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="165" src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_19_thumb.jpg" width="200" border="0"&gt;&lt;/a&gt; &lt;/td&gt;
&lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_20%5B2%5D.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="165" src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_20_thumb.jpg" width="200" border="0"&gt;&lt;/a&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;我们先打开一个工具——&lt;a href="http://www.nikhilk.net/WebDevHelperHTTPTracingUpdates.aspx" target="_blank"&gt;Web Development Helper&lt;/a&gt;，然后打开Logging开关。当我们点击某个Tagging时，这个小工具记录了从我的浏览器发出的Request和Server回复的内容（上图左）。因此我们就可以清楚地看到当我们选中一个CheckBox时，一个新的Request就发送到服务器端了。那么我们现在就来仔细看一下到底在这里发生了什么（上图中）。&lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;首先，一个请求放送到当前的页面。然后我们可以发现一个新的Header被添加到了请求中，它的名称是&amp;#8220;x-microsoftajax&amp;#8221;，值为&amp;#8220;Delta=true&amp;#8221;。这表示客户端告诉服务器端，现在的是一个异步的请求，需要对页面上的部分内容进行刷新。如果看一下部分刷新的实现的话，可以发现我们会查找Header，如果有上面的信息，则表示我们必须进行特别的步骤了，就是Jeff刚才提到的那些步骤。当然，这只是第一步。&lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;第二步我想展示给大家看的则是到底发送了那些内容。大部分人没有意识到的是，当UpdatePanel在工作时，整张页面被发送到了服务器端。就像Jeff说过，我们会将我们需要的所有信息，例如ViewState发送到服务器端。我们来看一下发送的内容（上图右）。发送了ScriptManager，ViewState内容等等，这是所有被发送到服务器端的内容。&lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_21%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="198" src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_21.jpg" width="240" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;现在还有一个问题，服务器端到底返回了什么。我们可以从&amp;#8220;Response Content&amp;#8221;看到（上图）。这里有UpdatePanel的ID，我们也可以猜到，它返回了UpdatePanel里所有的HTML内容，在这里是个DIV，这就是我们会用来替换的内容。然后还有第二个UpdatePanel和第三个UpdatePanel。然后我们会将所有的ViewState发送到客户端。就像Jeff说过的，我们需要在Roundtrip时需要包含ViewState的原因是为了传输我们在客户端作了什么改变，在服务器端又作了什么改变。我们需要使用最新的数据来重建整个控件树，这就是我们需要ViewState数据的原因。&lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_22%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="198" src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_22.jpg" width="240" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;下面就是Jeff提到过的一个最佳实践。我打开这个工具的目的是要让大家知道，每次我们点击CheckBox的时候发生了什么（上图）。每次我们点击CheckBox时，我们就会去服务器端请求数据，然后将页面进行刷新。我们该如何解决这个问题？这个问题其实有个比较容易的解决方法。（Andre不小心关闭了Visual Studio）呃&amp;#8230;&amp;#8230;这个解决方案并不是关闭Visual Studio，我们再来重新看一下（~/Optimization/2.OptimizeFrequency.aspx），我们在这里把CheckBoxList的AutoPostBack属性设为False（如下）：&lt;/p&gt;
&lt;pre class="code"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;CheckBoxList&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"server"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"tagsList"&lt;/span&gt;
    &lt;span style="color: #ff0000"&gt;AutoPostBack&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"false"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;Enabled&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"false"&lt;/span&gt;
    &lt;span style="color: #ff0000"&gt;RepeatColumns&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"3"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Nature&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Landscapes&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Cityscapes&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Conference Trips&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Microsoft&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;ListItem&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;CheckBoxList&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt; 
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;这里的想法就是，我们不让每次CheckBox被选中或取消时就发送一次请求，我们只在我们准备好的情况下发送数据。我们再看一下页面（老赵：这里的截图就省略了），当我们选中一个像册时会发送一个请求。每次但我们点击CheckBox时，我们不会给服务器端发送数据。不过当我们点击Update按钮时，一个请求就出现了。这里的关键就在于，即使我们能够很快地与服务器端交互，我们也要仔细考虑一下，我们是否真的必要把AutoPoskBack打开，让控件自动地与服务器端交互，因为这意味着页面上所有的数据将向服务器端进行一个来回。&lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_23%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="185" src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_23.jpg" width="240" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;这里还有一些比较有趣的事情，我想展示一下刚才发生了什么。我们依旧回到刚才的&amp;#8220;Response Content&amp;#8221;，这就是从服务器端发回的内容，但是我们在这里使用&amp;#8220;Partial Rendering&amp;#8221;视图（上图）。这里发生的事情是，有个UpdatePanel被更新了，在每次请求之后，我们会更新所有的3个UpdatePanel，我们在这里使用UpdatePanel的默认设置，UpdateMode为Always。这样，无论向服务器端请求的内容是什么，所有的UpdatePanel都会同时进行刷新。这里的问题就在于，我们可能不需要重新生成所有的UpdatePanel，我们需要的是简单地选择几个需要更新的UpdatePanel。这里就使用到UpdatePanel的一个属性，就是&amp;#8220;Conditional Rendering&amp;#8221;——噢，对不起，是&amp;#8220;UpdateMode&amp;#8221;。让我来告诉您我到底在说什么（~/Optimization/3.OptimizeBandwidth.aspx）。&lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;在这里我将UpdatePanel的UpdateMode属性设为了&amp;#8220;Conditional&amp;#8221;（老赵：这部分代码就不粘贴了）。现在的状况就变成了，UpdatePanel不必在每次请求时都进行更新，而是只有在特定情况下才重新生成它的内容。这些情况可能是我们通过UpdatePanel内部的控件进行了更新或者调用UpdatePanel的Update方法。第二种情况则是通过了UpdatePanel的Trigger，当一个控件被作为UpdatePanel的Trigger时，则表示当这个控件发起PostBack之后，UpdatePanel将被更新。&lt;/p&gt;
&lt;table cellspacing="5"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_24%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="206" src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_24.jpg" width="240" border="0"&gt;&lt;/a&gt; &lt;/td&gt;
&lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_25%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="206" src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX3_13EC/DEV411_25.jpg" width="240" border="0"&gt;&lt;/a&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;我们再来看一下，当我们点击Update按钮之后，可以发现Reponse的内容变得多小（上图左），当我们查看更新的UpdatePanel时，可以发现现在只有一个UpdatePanel被更新了（上图右）！从我们的最佳实践方面来说，我们不仅从数据传输着手，也考虑到了页面加载方面的问题。我们在这里将UpdatePanel的默认设置改成了条件生成（Conditional Rendering）。&lt;/p&gt;
&lt;p style="font-size: 10pt; font-family: verdana"&gt;（未完待续）&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2006/12/lecture--teched-europe-dev411-3.html#comments</comments>
      <pubDate>Tue, 12 Dec 2006 19:30:00 GMT</pubDate>
      <lastBuildDate>Tue, 12 Dec 2006 19:30:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/asp-net/">ASP.NET</category>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <title>讲座展示：TechEd Europe DEV 411 - AJAX Patterns with ASP.NET AJAX（2）</title>
      <link>http://blog.zhaojie.me/2006/12/lecture--teched-europe-dev411-2.html</link>
      <guid>http://blog.zhaojie.me/2006/12/lecture--teched-europe-dev411-2.html</guid>
      <description>&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;这次我选择的讲座内容，是最近在TechEd 2006 Europe中Andre Snanbria和Jeff Prosise的讲座&amp;#8220;AJAX Pattern with ASP.NET AJAX&amp;#8221;。Jeff Prosise是Wintellect的Co-Founder，Andre Sanabria是ASP.NET AJAX Team的Lead Program Manager。在MSDN's Showtime上已经有了&lt;a href="http://www.microsoft.com/emea/msdnshowtime/sessionh.aspx?videoid=331" target=_blank&gt;这个讲座的完整视频&lt;/a&gt;，而我在早些时候给Andre Sanabria写了封Email，一星期后他给我寄来了这个讲座的PPT和Demo，大家可以&lt;a href="http://files.cnblogs.com/JeffreyZhao/TechEd_DEV411.zip" target=_blank&gt;点击这里&lt;/a&gt;下载。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;这次讲座的主要内容是讲述了使用ASP.NET AJAX开发AJAX应用的最佳实践，在这次讲座里，会对建立轻量级的客户端控件的方法进行深入，讲述了如何优化脚本代码，并提出了如何避免AJAX开发中常见的问题。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;本篇文章是这次讲座展示的第二篇，讲述了UpdatePanel的工作方式。&lt;/p&gt;
&lt;p style="FONT-SIZE: 14pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;讲座内容&lt;/strong&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX2_BB53/DEV411_13%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=180 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX2_BB53/DEV411_13.jpg" width=240 border=0&gt;&lt;/a&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Jeff：&lt;/strong&gt;很好，有很多最佳实践和合适的编程模式来简化编写AJAX应用的方式。就像Andre说的，我们现在要做的就是回头向大家一点点地展示一些我们已经实现的代码。可能它们和其它我们在这周展示给大家的有关ASP.NET AJAX的东西会有些不同，不过所有的我们做的，我们实现这些应用的方式，目的都是尽可能的做到更高的效率。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Jeff：&lt;/strong&gt;那么我们现在就来考虑对于这个应用程序的进行增强的第一步，我们第一步想看的东西。我们在这个应用中使用了&amp;#8220;局部刷新&amp;#8221;的技术，事实上在刚才的照片浏览页面，用到的并不是1个，而是4个不同的UpdatePanel。你们可能已经很清楚了，UpdatePanel完全就是用来&amp;#8220;局部刷新&amp;#8221;的。用户对于页面的PostBack和它造成的页面闪烁以及视觉中心的丢失，都可以说是深恶痛绝。当我们现在谈论到AJAX最先想到的就是&amp;#8220;局部刷新&amp;#8221;，就是不进行PostBack，而是对服务器端进行轻量级的异步CallBack。带来这些美妙东西的就是XMLHttpRequest，它能使浏览器不将现有的HTML给丢弃，因此我们就避免了页面的闪烁。如果您自己写AJAX代码的话，是需要比较多的工作才能完成的。UpdatePanel的美妙之处就在于，我能够简单地将它拖动到页面上，在它内部放置一些我们需要局部刷新的元素，然后UpdatePanel就会为我们管理那些元素的各种复杂情况了，这实在是一种魔法——直到您了解了让它能够这样的工作是多么地不容易。不过这是一种交易。如果我简单地在页面上放置几个UpdatePanel，我可能无法得到我期望的结果——的确，它增强了用户体验，但是在另一方面，它也让一些不需要的数据在客户端和服务器端之间来回。不仅仅是在一个单独的请求中发送了过多的数据，也有可能超出获得我们期望的多余的数据。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX2_BB53/DEV411_14%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=180 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX2_BB53/DEV411_14.jpg" width=240 border=0&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Jeff：&lt;/strong&gt;在演示下一个Demo之前，我再多谈论一下UpdatePanel是如何工作的。当你把一个UpdatePanel放在页面中之后，在页面就会实例化一个类型为PageRequestManager的客户端对象。当然这些都由ScriptManager来完成这些工作了，当你把ScriptManager的EnablePartialRendering属性设为True之后，一个用于初始化PageRequestManager对象的脚本就被发送到客户端。我们把Microsoft AJAX在客户端的那部分称之为Microsoft AJAX Library。事实上，一个理解ScriptManager的好方法是从客户端的角度来看UpdatePanel。PageRequestManager做的事情就是异步地将数据传输到客户端，管理客户端与服务器端的数据交换，得到服务器端UpdatePanel输出的内容，通过改变浏览器DOM的方式将这些内容放置在客户端中。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Jeff：&lt;/strong&gt;一般来说，如果一个没有UpdatePanel的页面，当我点击了页面上的一个&amp;#8220;提交&amp;#8221;按钮，页面被整个提交到了服务器端，在ASP.NET中我们称之为PostBack，因为数据通过了Post的方式传递&amp;#8220;回（Back）&amp;#8221;服务器端。不过因为有了PageRequestManager的神奇作用，这里就不会产生一个PostBack了。这时候数据就是用了XMLHttpRequest被异步地发送到了服务器端，在服务器端会产生一个round-trip，但是现在我们就不会让浏览器放弃它已经拥有的HTML了。让我来告诉您一些UpdatePanel更详细的一些秘密。大部分的人都会认为UpdatePanel会带来很高的效率——直到我们查看了客户端和服务器端交互的数据。一个传统的PostBack会将客户端所有的ViewState传递到服务器端，当然也包括所有页面上需要向服务器端Post的数据。事实上UpdatePanel的一个秘密就是：它也作了相同的事情。您可能会认为UpdatePanel并不会将ViewState以及多余的数据传回客户端，不过它的确这么做了。在这方面，一个UpdatePanel和一个传统的PostBack并没有什么区别，因此UpdatePanel并不是一种依靠避免传递ViewState而得到更高性能的方法。UpdatePanel这么做有个很重要的原因：因为在UpdatePane发送一个异步的CallBack时，您在服务器端也需要访问平时一直用到的ASP.NET的对象模型，这也意味着当一个异步的CallBack将数据发送到服务器端时，所有的控件树都会被重建，会经历一个传统的生命周期，这一切和传统PostBack的结果几乎完全相同：控件树会被重建，然后触发事件。事实上，在控件的事件被触发时有一点不同，这时候ASP.NET会意识到：&amp;#8220;嘿，这不是个传统的PostBack，这是个页面的PageRequestManager发送的异步CallBack。&amp;#8221;然后ASP.NET会让这个页面请求继续被处理，和传统PostBack相比，在服务期端处理时有很大区别的一点就是生命周期里的&amp;#8220;Render&amp;#8221;部分。传统状况下，页面会生成所有的内容，从控件树的最顶端直到控件树的最后。而UpdatePanel在这里的美妙之处就在于，它只会让UpdatePanel内部的控件被生成，在这里我们的确节省了一些消耗，因为我们在服务器端执行了较少的代码。不过这点性能的提高，可能完全被之前的消耗所抵消了，我们还是进行了一个完整的PostBack。这里我们可以是用一些方法，让我们能够尽可能高效地使用UpdatePanel。这幅图（上图）的最后，就表示了，当UpdatePanel在生成它内部控件的HTML之后将其发送到了客户端，而PageRequestManager则会处理页面内容更新的方式。在默认情况下，UpdatePanel会生成一个DIV标签，您能够将其设置为SPAN标签。PageRequestManager会设置标签的innerHTML属性，用新的内容替换了旧的内容。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Jeff：&lt;/strong&gt;下面让我们再体验一下刚才的照片浏览器，让我们更清楚地了解它是如何使用UpdatePanel，我们是如何将尽可能高效地使用UpdatePanel。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;（未完待续）&lt;iframe style="DISPLAY: none; VISIBILITY: hidden" src="http://blog.zhaojie.me/2006/12/583918.html" width=0 height=0&gt;&lt;/iframe&gt;&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2006/12/lecture--teched-europe-dev411-2.html#comments</comments>
      <pubDate>Fri, 08 Dec 2006 07:33:00 GMT</pubDate>
      <lastBuildDate>Fri, 08 Dec 2006 07:33:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <title>AJAX培训第三讲：开发一个简单的AJAX聊天室</title>
      <link>http://blog.zhaojie.me/2006/12/ajax-lesson-03.html</link>
      <guid>http://blog.zhaojie.me/2006/12/ajax-lesson-03.html</guid>
      <description>&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;　　&lt;a href="http://files.cnblogs.com/JeffreyZhao/Lessons/AJAX-Lesson03-PDF.zip"&gt;点击这里&lt;/a&gt;下载PDF文件。&lt;br&gt;&lt;a href="http://files.cnblogs.com/JeffreyZhao/Lessons/AJAX-Lesson03-Demo.zip"&gt;点击这里&lt;/a&gt;下载示例文件。&lt;br&gt;&lt;a href="http://downloads.cnblogs.com/thcjp/JeffreyZhao/AJAX-Lesson3.swf" target=_blank&gt;点击这里&lt;/a&gt;下载视频文件。&lt;br&gt;&lt;br&gt;这次的内容是开发一个AJAX聊天室，目的是让大家略为巩固一下前两次所讲的AJAX常用的基础知识。不过这个聊天室的功能是再简单不过了，这点我在视频中也多次强调。&lt;br&gt;&lt;br&gt;这次的录制是一个尝试，因为我想以后的录制过程中加大&amp;#8220;示例&amp;#8221;甚至于&amp;#8220;Hands on Lab&amp;#8221;的比例，不过对于现在这种从头至尾几乎连每一个文件的创建过程都一一演示的做法，在现在录制方式（Captivate是一帧一帧录制的，而每一帧的录制时刻不好把握）和录制条件（机器还是比较卡，更加增大了录制的困难）下都是很大的挑战，这次的尝试结果不容乐观，影片的体积变得比较大（这次几乎已经达到了20M），因此这个录制方式和技巧还要进一步的尝试。&lt;br&gt;&lt;br&gt;事实上还有别的原因使这次录制结果不太好。我本来准备在周二录制完毕，没想到因为朋友&amp;#8220;忽然&amp;#8221;过生日，导致我只有一点点的&amp;#8220;清静&amp;#8221;时间可以录制讲座，在录制了一段时间之后就不得不停了下来。从朋友的饭桌上回来之后，我直接杀奔公司，总算找到了一个安静的工作环境。因此大家可以很明显地在视频中发现录制环境的区别：突然从某一时刻开始声音变响了，回音变大了，因为我在公司找了个小房间关上门以后把剩余的部分录制完毕。再加上我今天有些感冒，因此声音总是不自觉地有气无力起来。还有不知道是我机器上新版本的Captivate有问题，还是我还不太会用，我在后期修修补补时总是不太顺利，因此这次的视频会有比较大剪辑痕迹。总总这些只能请大家多多包涵了，我以后会有改进。&lt;br&gt;&lt;br&gt;不过也有好消息，在我为可怜的笔记本加了1G内存，并换上了新版本的Captivate之后，整个录制过程&amp;#8220;前所未有&amp;#8221;地一次也没有崩溃过，编辑时的响应速度也快了许多，不再有3分钟的打开保存时间，每点击一下都要等3到5秒才有反应的状况出现了。这种&amp;#8220;卓越&amp;#8221;的体验让我多少看到了点希望——不是反语，不是讽刺，是真的，不过明显是&amp;#8220;相对&amp;#8221;之前所得到的感受。&lt;br&gt;&lt;br&gt;最后还是老话：如果大家对于讲座的内容有任何疑问，请在&lt;a href="http://blog.zhaojie.me/2006/10/asp-net-ajax-q-and-a.html" target=_blank&gt;&lt;font color=#1d58d1&gt;Q &amp;amp; A专用文章&lt;/font&gt;&lt;/a&gt;里进行提问，当然如果您有其它任何疑问的话，也能在那里提出，我会尽快为您解答。而且现在又多了一个讨论的地方：大家可以&lt;a href="http://groups.google.com/group/cnblogs_ajax" target=_blank&gt;点击这里&lt;/a&gt;访问&amp;#8220;博客园AJAX交流&amp;#8221;组，不过我更喜欢把它当作一个Mail List使用。:)&lt;br&gt;&lt;br&gt;已经说了太多的废话，下面就是这次录制的结果。我也该睡了，似乎今天我已经和地球那端的同事&amp;#8220;无时差&amp;#8221;工作了太长时间了&amp;#8230;&amp;#8230;&lt;br&gt;&lt;br&gt;多谢大家支持。&lt;br&gt;&lt;br&gt;
&lt;object height=570 width=800 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 xcodebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"&gt;
&lt;param name="Movie" value="http://homepage.fudan.edu.cn/~JeffreyZ/Lesson3.swf" /&gt; &lt;param name="wmode" value="transparent"/&gt;&lt;embed src="http://downloads.cnblogs.com/thcjp/JeffreyZhao/AJAX-Lesson3.swf" width="800" height="570"  quality="high" wmode="transparent"     type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;</description>
      <comments>http://blog.zhaojie.me/2006/12/ajax-lesson-03.html#comments</comments>
      <pubDate>Tue, 05 Dec 2006 19:37:00 GMT</pubDate>
      <lastBuildDate>Tue, 05 Dec 2006 19:37:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/translation/">翻译引进</category>
      <category domain="http://blog.zhaojie.me/practice/">实践优化</category>
      <category domain="http://blog.zhaojie.me/asp-net/">ASP.NET</category>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <title>讲座展示：TechEd Europe DEV 411 - AJAX Patterns with ASP.NET AJAX（1）</title>
      <link>http://blog.zhaojie.me/2006/12/lecture--teched-europe-dev411-1.html</link>
      <guid>http://blog.zhaojie.me/2006/12/lecture--teched-europe-dev411-1.html</guid>
      <description>&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;这次我选择的讲座内容，是最近在TechEd 2006 Europe中Andre Snanbria和Jeff Prosise的讲座&amp;#8220;AJAX Pattern with ASP.NET AJAX&amp;#8221;。Jeff Prosise是Wintellect的Co-Founder，Andre Sanabria是ASP.NET AJAX Team的Lead Program Manager。在MSDN's Showtime上已经有了&lt;a href="http://www.microsoft.com/emea/msdnshowtime/sessionh.aspx?videoid=331" target=_blank&gt;这个讲座的完整视频&lt;/a&gt;，而我在早些时候给Andre Sanabria写了封Email，一星期后他给我寄来了这个讲座的PPT和Demo，大家可以&lt;a href="http://files.cnblogs.com/JeffreyZhao/TechEd_DEV411.zip" target=_blank&gt;点击这里&lt;/a&gt;下载。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;这次讲座的主要内容是讲述了使用ASP.NET AJAX开发AJAX应用的最佳实践，在这次讲座里，会对建立轻量级的客户端控件的方法进行深入，讲述了如何优化脚本代码，并提出了如何避免AJAX开发中常见的问题。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;本篇文章是这次讲座展示的第一篇，讲述了这次讲座的内容概要，并浏览了第一个示例的各个功能。&lt;/p&gt;
&lt;p style="FONT-SIZE: 14pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;讲座内容&lt;/strong&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;（老赵：在下面的内容里，我将使用&amp;#8220;&lt;strong&gt;Jeff：&lt;/strong&gt;&amp;#8221;来表示Jeff Prosise的话，使用&amp;#8220;&lt;strong&gt;Andre：&lt;/strong&gt;&amp;#8221;来表示Andre Snanbria的话。）&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_1%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=180 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_1.jpg" width=240 border=0&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Jeff：&lt;/strong&gt;我们现在在这里有些激动人心的东西将会展现给你。在这之前我先说一下，可能大家原本在这里想见到&lt;a href="http://www.nikhilk.net/" target=_blank&gt;Nikhil Kothari&lt;/a&gt;（老赵：Nikhil是ASP.NET的架构师，业界非常著名的专家，相信大家多多少少都会读过他的书或文章），不过我不是Nikhil Kothari，我是Jeff Prosise。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;我也不是Nikhil Kothari，我是Andre Snanbria。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Jeff：&lt;/strong&gt;Andre是ASP.NET AJAX Team的Program Manager——事实上是Lead Program Manager之一，我是来帮他提水的（Andre笑），我在这里只是帮助他展示和搭建很多优秀的玩意儿。不幸的是，Nikhil在这次会议开始之前得了很严重的病，他虽然很想来参加这次会议，但是他的医生根本不允许他上飞机。然而，这个部分是这次我们最重要的内容之一，我们非常希望将这次的内容告诉大家，因此由Andre和我来作这次演讲。这些都是非常优秀的内容，那么我们先来快速地看一下我们这次会讲得内容。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_2%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=180 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_2.jpg" width=240 border=0&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Jeff：&lt;/strong&gt;你们一定已经发现了在这次会议周围停着许多车，尤其是关于Web开发——讲解ASP.NET AJAX的会议。你们一定也已经听说过了ASP.NET AJAX，它是ASP.NET平台上又一个非常优秀的产品，因为它提供了一个框架，能够展现AJAX神奇的一面。我们能够完全通过ASP.NET来开发AJAX站点。如果您已经听过今天在这之前的讲座，您会知道ASP.NET AJAX分为两部分：它有着与ASP.NET紧密结合的服务器部分，也有与服务器端无关的客户端脚本。因此您完全可以将它与其它的服务器技术一起使用，例如PHP或CodeFusion。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Jeff：&lt;/strong&gt;这个星期有过几次关于ASP.NET AJAX的讲座，我们已经展示了它魔术般的非常酷的特性，例如UpdatePanel或者客户端访问Web Service等等。不过我们想，也应该带给大家一些有关&amp;#8220;最佳实践&amp;#8221;的内容，有关您应该使用的模式，有关如何不仅仅是使用ASP.NET AJAX，而是尽可能地挖掘它，更有效地使用它。例如，不知道您是否了解UpdatePanel的神奇之处？如果您在页面上放置几个UpdatePanel，然后关注在这些AJAX功能背后客户端和服务器端是如何交换数据的话，您可能就会不那么兴奋了。虽然UpdatePanel是一个神奇的控件，它有自己的过人之处，但是它在使用时并不是那么的高效，在服务器端的性能也不是那么高，我们不能只关注于与它能够轻易使用AJAX魔法这个特点。今天我们会讲的话题之一，就是如何合理地使用，并且如何比您现在更加高效地使用UpdatePanel。我们也会谈一下您是如何使用ASP.NET AJAX从客户端访问服务器端Web Services的，您可能已经知道这些内容，因为它在这周别的讲座中也被提到过。然后，我们不如换个角度去看这个问题，我们要部分刷新的话，我们首先会想到UpdatePanel，我们也能够通过Web Services的异步访问然后进行页面的部分刷新，而且这样您可以得到远比使用UpdatePane要高的性能。我们已经准备了几个合适的场景来观察这个问题。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Jeff：&lt;/strong&gt;还有一个我们要解决的问题就是，大家一直提到的&amp;#8220;后退&amp;#8221;按钮，大家经常会问&amp;#8220;那么后退按钮该怎么办&amp;#8221;？&amp;#8220;后退按钮&amp;#8221;的问题从AJAX诞生不久就出现了，不是吗？我们在这里会展示一个解决它的办法，我们会向你们展示一个小小的控件，当然我们也提供了它所有的源代码，您可以使用这个控件，修改它的一些代码。这个控件能够把我们的逻辑视图和浏览器的&amp;#8220;历史&amp;#8221;结合在一起或者说进行交互，因此当用户点击后退按钮时，会自动向服务器端异步地请求数据，我们能够根据这些信息提供对应的逻辑视图，因此&amp;#8220;后退&amp;#8221;和&amp;#8220;前进&amp;#8221;按钮就能够工作了！它甚至也解决了AJAX的书签（Bookmark）问题。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Jeff：&lt;/strong&gt;我们也会谈论一些有趣的有关ASP.NET AJAX有趣的话题。例如您是否知道，当你在页面里放置了一个UpdatePanel之后，在客户端会有个对象——PageRequestManager——来管理客户端与服务器端的交互，同时这个PageRequestManager会触发一系列的事件，它构成了客户端页面的一个生命周期。我们如果响应其中的一些事件，就能够增强UpdatePanel部分刷新的特性，这是使用别的方法很难实现的功能。我们也会向大家展示一些别的内容，例如不仅仅是使用ASP.NET AJAX，还有如何将它用的更好。我们希望在使用ASP.NET AJAX时尽可能的高效，所以我们也会谈论一些&amp;#8220;最佳实践&amp;#8221;。Andre，是吗？&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;没错。我们准备在演示中展示很多很棒的东西，这次我们会有许许多多的演示。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_3%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=180 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_3.jpg" width=240 border=0&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Jeff：&lt;/strong&gt;这就是我们下面要讲的内容的一个快速预览，我刚才已经说了很多相关的内容了。现在我们要做的就是看一下我们下面这个示例，Andre要为你们展示一个照片浏览的应用程序，它用了很多ASP.NET AJAX里很酷的玩意儿。不过更重要的是，它展示了一些我们正在讲述的最佳实践和模式。他首先会带你们把这个应用程序浏览一遍，从外部看看这个应用到底是什么样的。当您熟悉了这个应用之后，我们将仔细观察这个页面的某些特定的部分，看看我们是如何做到这些的，我们为什么使用这个方式来实现。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_4%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=180 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_4.jpg" width=240 border=0&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;Nikhil和我谈到事情之一，就是他要展示现在AJAX技术非常酷的一面。这是个网站——如果你们认识Nikhil的话，会知道他非常喜爱漂亮的图片，这里是它在前几个月在他进行AJAX讲座时所到过的地方拍摄下来的照片。现在我会先将这个站点浏览一遍，看看我们是如何在这个应用中使用AJAX技术的。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;
&lt;table cellSpacing=5&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_5%5B9%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=173 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_5_thumb%5B5%5D.jpg" width=200 border=0&gt;&lt;/a&gt; &lt;/td&gt;
            &lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_6%5B5%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=173 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_6_thumb%5B1%5D.jpg" width=200 border=0&gt;&lt;/a&gt; &lt;/td&gt;
            &lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_7%5B5%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=173 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_7_thumb%5B1%5D.jpg" width=200 border=0&gt;&lt;/a&gt; &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;首先，这里非常酷的一点是，我们把鼠标移到缩略图上，可以发现有一副图片预览出现在缩略图的上方（上图左一）。而当我们点击这幅图片时，我们可以看到会有动画效果表示图片正在加载（上图左二），最后图片会以淡入的方式显示出来（上图左三）。这些都使用了AJAX。当我在图片之间切换时都回产生这些效果。从这个场景的角度来说，最重要的功能是使用了UpdatePanel和UpdateProgess帮助您省去了许多工作。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_8%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=208 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_8.jpg" width=240 border=0&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;在选中图片的右边有一个照相机（上图），点击它会出现当前图片的详细信息。从这个场景的角度来说，我们在点击这个照相机之后，发送了一个Web Service请求去获取数据，并且在获得这些数据之后简单地使用window.alert显示信息。&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;
&lt;table cellSpacing=5&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_9%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=208 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_9.jpg" width=240 border=0&gt;&lt;/a&gt; &lt;/td&gt;
            &lt;td&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_10%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=208 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_10.jpg" width=240 border=0&gt;&lt;/a&gt; &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tbody&gt;
        &lt;/tbody&gt;
    &lt;/table&gt;
    &lt;/p&gt;
    &lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;下面要展示的是站点的另一部分功能，在这里我们能够点击右上角的按钮来回切换UI（如上图），所有这些都是完全在客户端进行的。这里用来了一个一会儿我们谈到的概念：&amp;#8220;Behavior&amp;#8221;。我们所做的就是简单地改变页面的颜色，改变客户端的属性。另外可以发现，当我关掉这个浏览器并重新打开这个页面之后，页面会自动识别，并且将页面很快的切换到刚才的颜色（老赵：大家可以从Demo中自己感受一下，其实Nikhil的Blog也有这个功能）。从技术角度来说，我们是将页面的颜色信息使用某种方式保存在客户端，而不是服务器端，这也是我们在这里使用AJAX的方式。&lt;/p&gt;
    &lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_11%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=208 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_11.jpg" width=240 border=0&gt;&lt;/a&gt; &lt;/p&gt;
    &lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;在前几天晚上我和Nikhil进行了一段谈话，我们可以在这里尝试着回复一段内容。Nikhil的Blog有一个功能，在发文时能够阻止发送带有大量URL的内容，以避免有人发布垃圾广告。当我们&amp;#8220;企图&amp;#8221;发布带有大量URL的信息之后，会出现一个提示&amp;#8220;This comment appeared to contain spam&amp;#8221;（如上图）。这里我们使用到了一个服务器端异步验证的技术，它发送一个Web Service访问用来验证这段文本是否合法，然后才将信息发送到服务器端进行更新。&lt;/p&gt;
    &lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;a href="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_12%5B1%5D.jpg" atomicselection="true"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=208 src="http://img.zhaojie.me/blog/WindowsLiveWriter/TechEdEuropeDEV411AJAXPatternsw.NETAJAX1_AE7D/DEV411_12.jpg" width=240 border=0&gt;&lt;/a&gt; &lt;/p&gt;
    &lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;strong&gt;Andre：&lt;/strong&gt;这里还有一个功能，当我把鼠标移到大图片上的时候，大图片顶部会显示出这幅图片的名字等信息（如上图），这也是AJAX技术强大的体现。这就是我们展示的例子，下面会将这个应用分成各个小部分，逐一完成，让大家知道我们是如何做到这些的。&lt;/p&gt;
    &lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;&lt;iframe style="DISPLAY: none; VISIBILITY: hidden" src="http://blog.zhaojie.me/2006/12/581642.html" width=0 height=0&gt;&lt;/iframe&gt;&lt;/p&gt;
    &lt;p style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;（未完待续）&lt;/p&gt;</description>
      <comments>http://blog.zhaojie.me/2006/12/lecture--teched-europe-dev411-1.html#comments</comments>
      <pubDate>Mon, 04 Dec 2006 12:07:00 GMT</pubDate>
      <lastBuildDate>Mon, 04 Dec 2006 12:07:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <title>AJAX培训第二讲：使用AJAX框架（下）</title>
      <link>http://blog.zhaojie.me/2006/11/ajax-lesson-02-2.html</link>
      <guid>http://blog.zhaojie.me/2006/11/ajax-lesson-02-2.html</guid>
      <description>&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"&gt;　　&lt;a href="http://files.cnblogs.com/JeffreyZhao/Lessons/AJAX-Lesson02-2-PDF.zip"&gt;点击这里&lt;/a&gt;下载PDF文件。&lt;br&gt;&lt;a href="http://files.cnblogs.com/JeffreyZhao/Lessons/AJAX-Lesson02-2-Demo.zip"&gt;点击这里&lt;/a&gt;下载示例文件。&lt;br&gt;&lt;a href="http://downloads.cnblogs.com/thcjp/JeffreyZhao/AJAX-Lesson02-2.swf"&gt;点击这里&lt;/a&gt;下载视频文件。&lt;br&gt;&lt;br&gt;相关内容：&lt;a href="http://blog.zhaojie.me/2006/11/ajax-lesson-02-1.html" target=_blank&gt;AJAX培训第二讲：使用AJAX框架（上）&lt;/a&gt;&lt;br&gt;&lt;br&gt;&amp;#8220;AJAX培训第二讲：使用AJAX框架&amp;#8221;现在拆成了两部分，现在发布是第一部分，探讨了AJAX框架相关内容，并给出了一些最简单的例子。&lt;br&gt;&lt;br&gt;如果大家对于讲座的内容有任何疑问，请在&lt;a href="http://blog.zhaojie.me/2006/10/asp-net-ajax-q-and-a.html" target=_blank&gt;&lt;font color=#1d58d1&gt;Q &amp;amp; A专用文章&lt;/font&gt;&lt;/a&gt;里进行提问，当然如果您有其它任何疑问的话，也能在那里提出，我会尽快为您解答。:)&lt;br&gt;&lt;br&gt;&lt;span style="COLOR: red"&gt;&lt;strong&gt;另外，请大家能否告诉我我您最希望在这个系列讲座中看到的内容，在内容选择上一直是我的一个难题。:)&lt;/strong&gt;&lt;/span&gt;&lt;font size=3&gt; &lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;span style="COLOR: red"&gt;&lt;strong&gt;注：右下角有控制条。&lt;/strong&gt;&lt;br&gt;&lt;/span&gt;&lt;br&gt;
&lt;object height=570 width=800 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 xcodebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"&gt;
&lt;param name="Movie" value="http://downloads.cnblogs.com/thcjp/JeffreyZhao/AJAX-Lesson02-2.swf" /&gt; &lt;param name="wmode" value="transparent"/&gt;&lt;embed src="http://downloads.cnblogs.com/thcjp/JeffreyZhao/AJAX-Lesson02-2.swf" width="800" height="570"  quality="high" wmode="transparent"     type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;
&lt;/object&gt;&lt;/span&gt;</description>
      <comments>http://blog.zhaojie.me/2006/11/ajax-lesson-02-2.html#comments</comments>
      <pubDate>Sun, 26 Nov 2006 18:51:00 GMT</pubDate>
      <lastBuildDate>Sun, 26 Nov 2006 18:51:00 GMT</lastBuildDate>
    </item>
    <item>
      <author>jeffz@live.com (老赵)</author>
      <category domain="http://blog.zhaojie.me/speech/">培训演讲</category>
      <category domain="http://blog.zhaojie.me/front-end/">前端表现</category>
      <title>AJAX培训第二讲：使用AJAX框架（上）</title>
      <link>http://blog.zhaojie.me/2006/11/ajax-lesson-02-1.html</link>
      <guid>http://blog.zhaojie.me/2006/11/ajax-lesson-02-1.html</guid>
      <description>&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;　　&lt;a href="http://files.cnblogs.com/JeffreyZhao/Lessons/AJAX-Lesson02-1-PDF.zip"&gt;点击这里&lt;/a&gt;下载PDF文件。&lt;br&gt;&lt;a href="http://files.cnblogs.com/JeffreyZhao/Lessons/AJAX-Lesson02-1-Demo.zip"&gt;点击这里&lt;/a&gt;下载示例文件。&lt;br&gt;&lt;a href="http://downloads.cnblogs.com/thcjp/JeffreyZhao/AJAX-Lesson02-1.swf"&gt;点击这里&lt;/a&gt;下载视频文件。&lt;br&gt;&lt;br&gt;相关内容：&lt;a href="http://blog.zhaojie.me/2006/11/ajax-lesson-02-2.html" target=_blank&gt;AJAX培训第二讲：使用AJAX框架（下）&lt;/a&gt;&lt;br&gt;&lt;br&gt;首先向大家说声抱歉，离上次隔的时间实在太长。由于一度工作比较忙，所以录制就耽搁了。而且后来在录制过程中也麻烦不断，主要原因是我的笔记本比较差，而录制的内容一多，几乎就会处于&amp;#8220;僵死&amp;#8221;状态，然后Captivate非常容易崩溃，最后连录制内容都弄坏了。录制结束后怎么发布都有大段的声音无法播放，却又不想重新录，只能设法修补和求救（关于这个在博客圆可以看到我的抱怨和求助），最终经过&lt;a href="http://www.cnblogs.com/thcjp" target=_blank&gt;天轰川&lt;/a&gt;大哥的鉴定&amp;#8230;&amp;#8230;似乎还是重新录制比较好。于是去加了根1G的内存，重新录制部分内容，还好之前损坏的文件还有部分能够使用，这个过程比第一次轻松多了。&lt;br&gt;&lt;br&gt;得到&lt;a href="http://www.cnblogs.com/thcjp" target=_blank&gt;天轰川&lt;/a&gt;大哥的建议，我决定从现在开始可以将每一次的时间变得短一些，而发布的频率和次数可以多一些，这样可以避免因为文件过大而造成Captivate崩溃，甚至像这次一样的文件损坏。这样也能避免在我的破机器上保存打开都要几分钟，在编辑时每点一下都要等几秒钟之后才有反应的状况。这一点希望大家能够多多包涵。&lt;br&gt;&lt;br&gt;&amp;#8220;AJAX培训第二讲：使用AJAX框架&amp;#8221;现在拆成了两部分，现在发布是第一部分，探讨了ASP.NET 2.0中的AJAX能力。而第二部分我还在重新修补和录制，大概会在周一发布。&lt;br&gt;&lt;br&gt;如果大家对于讲座的内容有任何疑问，请在&lt;a href="http://blog.zhaojie.me/2006/10/asp-net-ajax-q-and-a.html" target=_blank&gt;&lt;font color=#1d58d1&gt;Q &amp;amp; A专用文章&lt;/font&gt;&lt;/a&gt;里进行提问，当然如果您有其它任何疑问的话，也能在那里提出，我会尽快为您解答。:)&lt;br&gt;&lt;br&gt;&lt;span style="COLOR: red"&gt;&lt;strong&gt;另外，请大家能否告诉我我您最希望在这个系列讲座中看到的内容，在内容选择上一直是我的一个难题。:)&lt;/strong&gt;&lt;/span&gt;&lt;font size=3&gt; &lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;span style="COLOR: red"&gt;&lt;strong&gt;注：右下角有控制条。&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;object height=570 width=800 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 xcodebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"&gt;
&lt;param name="Movie" value="http://downloads.cnblogs.com/thcjp/JeffreyZhao/AJAX-Lesson02-1.swf" /&gt; &lt;param name="wmode" value="transparent"/&gt;&lt;embed src="http://downloads.cnblogs.com/thcjp/JeffreyZhao/AJAX-Lesson02-1.swf" width="800" height="570"  quality="high" wmode="transparent"     type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;
&lt;/object&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;</description>
      <comments>http://blog.zhaojie.me/2006/11/ajax-lesson-02-1.html#comments</comments>
      <pubDate>Sat, 25 Nov 2006 03:41:00 GMT</pubDate>
      <lastBuildDate>Sat, 25 Nov 2006 03:41:00 GMT</lastBuildDate>
    </item>
  </channel>
</rss>
