<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>前沿视频教室-视频教程-CSS-Javascirpt-Web-设计与开发</title>
	<link>http://learning.artech.cn</link>
	<description>学习在前沿！这里是“前沿视频教室”，在这里您可以找到关于各种网页设计/网站开发/Flash动画相关的内容，而且我们都通过视频演示的方式，直观地向您讲解！包括CSS/Javascript/Flash/Dreamweaver/Fireworks/Photoshop等软件的使用和技巧!</description>
	<pubDate>Thu, 14 Apr 2011 05:54:36 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2</generator>
	<language>en</language>
			<item>
		<title>随笔随心(10) —— 也谈 JavaEye 改名</title>
		<link>http://learning.artech.cn/20110414.javaeye-renaming.html</link>
		<comments>http://learning.artech.cn/20110414.javaeye-renaming.html#comments</comments>
		<pubDate>Thu, 14 Apr 2011 05:54:33 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[随心随笔]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110414.javaeye-renaming.html</guid>
		<description><![CDATA[这个“随心随笔”系列文章，是我在遇到有趣或值得思考的事情时，写的一些随笔，供大家参考。
10. 也谈 JavaEye 改名
9. 关于写书的一事一议
8. 论一论近日的百度侵权问题  
7. 计算机图书十二... ]]></description>
			<content:encoded><![CDATA[<div  style="width:240px;float:right; border:1px solid #ccc;padding:0 10px;margin:00px 0 10px 10px;">
<p><strong>这个“随心随笔”系列文章，是我在遇到有趣或值得思考的事情时，写的一些随笔，供大家参考。</strong></p>
<p><a target="_blank" href="http://learning.artech.cn/20110414.javaeye-renaming.html">10. 也谈 JavaEye 改名</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110403.a-rule-of-writing.html">9. 关于写书的一事一议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110327.baidu.html">8. 论一论近日的百度侵权问题  </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110224.computer-book-experience.html">7. 计算机图书十二年之体会 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20091103.living-in-beijing.html">6. 闯荡北京值不值？</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20091029.mis-is-important.html">5. 沙漠里可以钓鱼吗？ </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20090806.create-content-site-abc.html">4. 做网站比的是慢功夫 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20090706.css-teaching-adivse.html">3. 给教师朋友的关于CSS的几点教学建议 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20090701.xuzhu-and-gump.html">2. 虚竹的人生启示</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20090427.how-to-write-blog.html">1. 如何写好技术博客 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20090616.freelancer-trends.html">0. 大多数设计师将成为自由职业者</a></p>
</div>
<p>JavaEye.com 是在中国相当知名的一个开发者社区，前几天将使用了7年的名称和域名从 JavaEye 改名为 ItEye，原因是 Oracle 公司认为这个名称侵犯了对 Java 这个名称的权利，JavaEye 放弃了通过法律一争高下，选择改名。这里不讨论Oracle的行为是否符合法律。假设 Oracle 的要求是符合法律的，那么这类行动会对未来会产生什么结果呢？从一些相关的文章，可以知道，Oracle 收购 Sun 以后，获得了Java 的控制权，然后关闭许多知名的第三方 Java 开发者社区。Oracle的做法是，开发者社区要由Oracle自己来作；其他人要做Oracle的社区，就是对Oracle的侵权。对于Oracle来说，社区的学习需求要转化为Oracle的培训业务，社区成员之间的自我交流是会影响培训部门业务的。</p>
<p>感觉上，这是个有问题的做法。具体信息可以<a target="_blank" href="http://www.iteye.com/news/20605">查看这里</a>，此外还可以参考一篇原 Sun 中国技术社区的高级经理蒋清野的<a target="_blank" href="http://www.qyjohn.net/?p=1155">评论文章</a>。</p>
<p><img align="right" style="margin:0 0 5px 15px;" src='http://learning.artech.cn/wp-content/uploads/2011/04/8891052-1_l.jpg' alt='8891052-1_l.jpg' />这让我想到了Merrill Chapman所著的《In Search of Stupidity》（中文翻译为《IT大败局》）一书中，对20世纪80年代的软件巨头 Ashton-Tate 公司的描述。20多年过去了，这个名字已经没有什么人知道了，不过它的产品 dBase 数据库，很多人还是有印象的。这家公司依靠 dBase 数据库，在上世纪八十年代如日中天，在软件领域与微软、Lotus 一起三国鼎立。</p>
<p>在《IT大败局》这本书中，总结了这家公司失败的原因：大量封杀基于 dBase 的第三方开发团队，以法律手段进行恐吓，威胁要诉讼那些他认为侵犯了dBase 权利的人；对咨询、培训和出版市场进行封杀，禁止第三方的咨询、培训、出版机构使用任何关于 dBase 这一名称。这些行动的后果就是短短几年，dBase 就一败涂地，被卖给了当时鼎盛的Borland公司，而遗憾的是当时Borland公司的创始人 Philippe 当时也被胜利冲昏头脑，没有抓住机会，失去了对数据库软件的控制权。如果他们两人没有犯错误，可能就不会给 Oracle 和微软的 SQL Server 留下机会了。</p>
<p>这种级别的企业之间的竞争，已经不是一两个产品的竞争，这种级别的企业构建的不仅仅是几款产品，而是围绕产品的整个生态系统。竞争的本质是生态系统之间的竞争。没有大量第三方的参与，没有庞大的生态系统，仅仅靠一个公司自身力量，是不可能获得成功的。当然 Oracle 的成功有目共睹，他们采取的任何策略肯定都是尤其考虑和目的的。最终的结果如何，只有靠时间来检验。</p>
<p>蒋清野在文中谈到：“我向来认为，IT行业的进入门槛是在不断降低的。同样一个工程问题，由技术水平相当的两个团队使用不同的技术来实现，在工作量和实际效果上不会有太大的差别。在这个大前提下，谁能够吸引更多的开发人员，谁就能够在生产平台上获得更大的市场份额。”说的确实非常在理。与之对比的，这让我想起了一个在网上流传很广的视频，微软CEO鲍默尔在讲演中高喊“Developers！Developers！”（开发者！开发者！）的视频,。</p>
<p><center><embed src="http://player.youku.com/player.php/sid/XMjAzMDc1MTYw/v.swf" quality="high" width="360" height="300" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed></center></p>
<p>当然这里还要顺便再指出一点，一个公司这么做，即使你认为这是在错误，<strong>最终也必须让市场去评判，而不能是用暴力的方式去不尊重知识产权</strong>。绝不能因为分享的名义，就可以放任盗版和侵权。这是中国目前面临的主要问题，不能混为一谈。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110414.javaeye-renaming.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Web开发杂谈(12) —— 编程语言的新动向</title>
		<link>http://learning.artech.cn/20110411.programming-language-trends.html</link>
		<comments>http://learning.artech.cn/20110411.programming-language-trends.html#comments</comments>
		<pubDate>Sun, 10 Apr 2011 23:32:06 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[Web开发杂谈]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110411.programming-language-trends.html</guid>
		<description><![CDATA[两年前，我写过两篇文章谈到“编程语言的流行度”和“解读 TIOBE 指数”，谈到关于编程语言的一些问题。转眼两年就过去了，真要感慨时间飞逝。在这两年里，当然又出现了很多新动向。
我... ]]></description>
			<content:encoded><![CDATA[<p>两年前，我写过两篇文章谈到“编程语言的流行度”和“解读 TIOBE 指数”，谈到关于编程语言的一些问题。转眼两年就过去了，真要感慨时间飞逝。在这两年里，当然又出现了很多新动向。</p>
<p>我们也可以简单说说这些新动向，以及对我们有什么影响。数据主要还是<a target="_blank" href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">来自TIOBE</a>的。</p>
<h3>主流语言依然稳定</h3>
<p>主流语言的范围变化很小，跟两年前相比，按照排名前10的语言来看，除了Ruby语言跌出前10名，Objective-C入围之外，其他语言没有变化。这一点很好理解，一个开发者，使用哪种编程语言，通常是相对稳定的，不会非常频繁和轻易地改变。熟练掌握一门语言，也需要相当长的时间，这都决定了各种语言占有率的变化是相当缓慢的，如果用10年、20年的时间间隔，来考察编程语言，才有可能有较明显的差异，一两年的差异不会很大。</p>
<p><center><img src='http://learning.artech.cn/wp-content/uploads/2011/04/tiobe.jpg' alt='tiobe.jpg' /></center></p>
<h3> Objective-C 和 C# 耀眼</h3>
<p>虽然，各种主流语言的变化并不很大，但是也有着一些差异。表现最好的是 Objective-C 和 C# 两种语言。</p>
<p><center><img src='http://learning.artech.cn/wp-content/uploads/2011/04/objective-c1.jpg' alt='objective-c1.jpg' />　<img src='http://learning.artech.cn/wp-content/uploads/2011/04/c-sharp1.jpg' alt='c-sharp1.jpg' /></center></p>
<p>其中 Objective-C 属于异军突起型，爆发力极好，09年中开始突然爆发，这显然与苹果公司产品的优势分不开的，Objective-C是苹果产品，如iPhone、iPad的首选语言。</p>
<p>而 C# 则属于稳步前进型，耐力性选手，从发布第一个版本开始到现在的10年时间里，一直稳步提高，不急不躁。</p>
<h3>静态语言保持优势</h3>
<p>在开发社区，关于动态语言的讨论十分很热烈，但是在实际应用中，从2007年开始的几年来，动态语言使用的比例在缓慢下降。实际上动态语言还有很多实际问题需要解决。这些问题不解决，是很难成为真正的主力语言的。下图中，蓝线是动态语言的使用率，红线是静态语言的使用率。</p>
<p><center><img src='http://learning.artech.cn/wp-content/uploads/2011/04/dynamic.jpg' alt='dynamic.jpg' /></center></p>
<p>当然，静态与动态也不是绝对的。C# 语言在2010年推出了第4个版本，即 C#4，在这个版本中，最重要的改进，就是支持动态类型。 </p>
<p>从哲学角度看，动态语言具有更好的弹性，可以让系统具有更好的可扩展性和灵活性。但是实际上在绝大多数场合，使用动态语言进行开发，对程序员的要求高很多，静态语言中编译器可以做的很多事情，都需要由程序员来做，这些具体问题不解决，动态语言的优势很难得到体现。就好像目前而言，要建一座大楼，还是要靠混凝土这样的刚性材料。</p>
<h3>移动开发日益重要</h3>
<p>Objective-C 异军突起，显然是由于苹果 iPhone 、iPad以及AppStore的成功引发的。大家也很容易发现，现在移动开发的火爆，经常可以听到一些朋友说到，移动开发人员紧缺，当然也就是高薪的同义词了。</p>
<p>所以，如果有兴趣的读者，不妨也关注一下相关的发展情况。总体来说，我认为在移动终端上的开发开发客户端软件，就想当于在10到20年前，PC上的主流开发。当时大部分开发都是在PC开发本地程序。现在，移动终端来了，那么自然也需要很多开发人员来进行相应的程序的开发。</p>
<p>但是我们看一看，PC是的历史，从单机程序逐渐变为开发“C/S模式，也就是客户端/服务器模式的程序，把很多核心业务放到了服务器上，客户端越来越瘦。后来，互联网来了，向大比例的C/S开发变成了“B/S”模式，也就是客户段痩到了不再开发单独的客户端程序，而是都用浏览器来作为操作界面了。</p>
<p>那么移动终端未来的趋势将会如何？我估计，一部份必须的客户端软件，都会在移动终端上出现，这是一种“补课”。此外还有大量业务，是基于网络的，在移动终端上，就像PC上一样，要么是做一个独立的客户端程序，要么用浏览器来作为界面。</p>
<p>目前来看，与PC上的一个区别是，PC的浏览器屏幕大，操作容易，因此客户端形式的程序并不多，除非是一些和系统结合紧密地，比如Windows自带的一些程序，Office这类软件（身子也出现了给予浏览器的在线版本），还有就是杀毒软件等等。</p>
<p>而移动终端的最大特点就是屏幕小，这就限制了流览器在移动终端上的应用，因此客户端软件（即所谓的“应用”）又显示出了优势 —— 可以让操作界面适应小屏幕的需要。</p>
<p>了解了上面的一些基本背景后，我们就可以想象，所谓“移动开发”，真正和PC上差异比较大的就是开发移动终端上的客户端软件，或者叫做“应用”这个部分上。其他的（包括给予浏览器的前端开发，以及服务器端程序的开发）则和PC任何区别。而一个比较复杂的系统，真正工作量绝大部分还是集中在服务期端的。</p>
<p>所以关于移动开发，大家也不用觉得是个很新鲜东西，其实我感觉本质上并没有太多的新东西。</p>
<h3> 语言 < 平台 </h3>
<p>在任何开发社区，关于语言的讨论都特别多，而且特别容易引起争论。按照我目前个人的理解，经过了近50年的发展，设计开发出一个新的高级语言，已经不像几十年前那么困难了。一些计算机领域中的明星人物，一个人就可以设计出一个非常牛B的语言，这些语言在一些社区中发展，很有特色。现在数得出名字的语言有几百种，Tiobe跟踪的有几十种。但是真正成为主流的还是很少的，比如现在，使用率超过1%的高级语言，不过11种。最主流的4种语言，就拥有了超过50%的使用者。</p>
<p>现在关于语言的竞争，本质上已经不在于语言本身了，而在于语言所在的平台的竞争。你会发现，所有发展的好的语言，都又一个很好的平台作为支撑。选择语言的本质是选择平台。这一点对于开发人员的选择是比较重要的因素。</p>
<h3>总结</h3>
<p>还是那句话，编程语言既是一个新技术层出不穷，又是一个相当稳定的东西。</p>
<p>不少人提这样一个观点，我非常赞同：<strong>真正精通一两个语言，然后多了解一些其他的语言</strong>。精通一两种语言，是你工作的武器，绝对不能丢。然后当有新技术、新热点出现时，可以花一些时间做一些尝试和试验，可以跟上新潮流，而且可以不断开阔眼界，加深对技术的理解，是一件很好的事情。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110411.programming-language-trends.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>.NET Web开发研习(10) —— 微软 MIX11 大会</title>
		<link>http://learning.artech.cn/20110407.mix11-bookmark.html</link>
		<comments>http://learning.artech.cn/20110407.mix11-bookmark.html#comments</comments>
		<pubDate>Thu, 07 Apr 2011 04:10:43 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[.NET Web 开发研习]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110407.mix11-bookmark.html</guid>
		<description><![CDATA[
这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。
0. 写书计划，欢迎大家提建议
1. Web开发的“十事要说” 
2. 关于学习C#语言的几个... ]]></description>
			<content:encoded><![CDATA[<p><center><img src='http://learning.artech.cn/wp-content/uploads/2011/04/mix111.gif' alt='mix11.gif' /></center></p>
<div  style="width:240px;float:right; border:1px solid #ccc;padding:0 10px;margin:10px 0 10px 10px;">
<p><strong>这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。</strong></p>
<p><a target="_blank" href="http://learning.artech.cn/20110128.new-book.html">0. 写书计划，欢迎大家提建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html">1. Web开发的“十事要说” </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html">2. 关于学习C#语言的几个建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html">3. 技术平台选择，兼谈.Net 与微软</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html">4. 语言与框架 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html">5. ORM(对象关系映射)</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html">6. 学习编程实践之“五子棋”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html">7. 学习编程实践之“文件压缩”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html">8. UCLA计算机系如何教C#</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110330.elevator-simulation-programming.html">9. 学习编程实践之“电梯模拟”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110407.mix11-bookmark.html">10. 微软 MIX11 大会</a></p>
<p>不断添加中……</p>
</div>
<p>世界著名的软件公司或者科技公司，每年都会组织一些开发者大会，一方面是宣传自己的产品和战略，另一方面也是对新技术的探讨。比如微软每年上半年会举行MIX大会（面向Web开发和设计人员），下半年会举行PDC（面向专业开发人员）。此外，比如Adobe公司会举办MAX大会，苹果的开发者大会叫做WWDC，这些都是非常好的学习机会。</p>
<p>每年的 MIX 和 PDC 大会，都是我们学习新技术的好机会。大会分别都有100多场新技术的演讲。今年的MIX大会将在4月12号开幕，持续3天，有很多很酷的演讲。具体演讲的题目和日程，<a target="_blank" href="http://live.visitmix.com/mix11">可以参见这里</a>。微软在网站上，都会现场直播讲演的内容，结束以后这些讲演的视频也会保留在<a target="_blank" href="http://channel9.msdn.com/">Channel9网站</a>上，可以随时观看。所以这里不得不说，搞技术什么最重要？我看还是得说英语最重要啊。</p>
<p>我挑出了一些比较感兴趣的题目，这里先做个记号，一共选出了20个题目：</p>
<h3>HTML5 &#038; CSS3</h3>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/HTM01">加速 HTM5 网站的50个性能优化技巧</a>：50 Performance Tricks to Make Your HTML5 Web Sites Faster</p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/HTM17">HTML5的未来</a>：The Future of HTML5</p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/HTM03">深入 HTML5 的 canvas（画布）</a> ：Deep Dive Into HTML5 canvas</p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/HTM02">HTML5 世界中的数据</a>：Data in an HTML5 World</p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/EXT20">CSS3征服世界</a>：CSS3 Takes on the World</p>
<p><a href="http://channel9.msdn.com/events/MIX/MIX11/HTM15">让你的网站更现代：SVG与HTML5</a>：Modernizing Your Website: SVG Meets HTML5</p>
<h3>Javascript  &#038;  jQeury</h3>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/EXT23">编写可维护的Javascript</a>：Writing Maintainable JavaScript</p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/OPN08">C# 开发人员的 Javascript 好习惯</a>：Good JavaScript Habits for C# Developers； </p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/FRM05">用 jQuery 开发数据为中心的N层应用</a>：Building Data-centric N-tier Applications with jQuery</p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/HTM16">Script#: 编译 C# 到 JavaScript</a>：Script#: Compiling C# to JavaScript using Visual Studio</p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/HTM07">JavaScript的交互扩展 (RxJS)</a>：Reactive Extensions for JavaScript (RxJS)</p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/FRM12"> JavaScript, jQuery, AJAX 与 ASP.NET 实战</a>：Pragmatic JavaScript, jQuery &#038; AJAX with ASP.NET</p>
<h3>.NET平台上的开发</h3>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/FRM04">更大、更快、更强，优化ASP.NET应用</a>：Bigger, Faster, Stronger: Optimizing ASP.NET Applications</p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/FRM13">脚手架：ASP.NET, NuGet, Entity Framework Code First 及其他</a>：Scaffolding – ASP.NET, NuGet, Entity Framework Code First and More</p>
<p><a target="_blank"  href="http://channel9.msdn.com/events/MIX/MIX11/OPN03">深入MVVM开发模式</a>：Deep Dive MVVM</p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/OPN07"> ASP.NET MVC 3 与 MEF（托管扩展框架）</a>：Fun with ASP.NET MVC 3 and MEF</p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/EXT07">设计师与程序员，身兼二职</a>：Designer and Developer: A Case for the Hybrid</p>
<p><a href="http://channel9.msdn.com/events/MIX/MIX11/FRM03">ASP.NET MVC 3 @ : 现在进行时</a> ：ASP.NET MVC 3 @:The Time is Now</p>
<p><a target="_blank" href="http://channel9.msdn.com/events/MIX/MIX11/FRM02"> Web 开发平台概述</a> ：An Overview of the MS Web Stack of Love</p>
<p><a target="_blank"  href="http://channel9.msdn.com/events/MIX/MIX11/DES02">设计草图、原形、捕捉灵感：使用Expression Blend 和SketchFlow</a>：Get Real! Sketch, Prototype, and Capture Great Ideas with Expression Blend and SketchFlow</p>
<p>还有很多演讲是围绕 Silverlight、Windows Phone 和 Windows Azure 的，我不熟悉，所以没有列出来。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110407.mix11-bookmark.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>随心随笔(9) —— 关于写书的一事一议</title>
		<link>http://learning.artech.cn/20110403.a-rule-of-writing.html</link>
		<comments>http://learning.artech.cn/20110403.a-rule-of-writing.html#comments</comments>
		<pubDate>Sun, 03 Apr 2011 03:02:02 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[随心随笔]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110403.a-rule-of-writing.html</guid>
		<description><![CDATA[这个“随心随笔”系列文章，是我在遇到有趣或值得思考的事情时，写的一些随笔，供大家参考。
9. 关于写书的一事一议
8. 论一论近日的百度侵权问题  
7. 计算机图书十二年之体会 
6. 闯荡北... ]]></description>
			<content:encoded><![CDATA[<div  style="width:240px;float:right; border:1px solid #ccc;padding:0 10px;margin:00px 0 10px 10px;">
<p><strong>这个“随心随笔”系列文章，是我在遇到有趣或值得思考的事情时，写的一些随笔，供大家参考。</strong></p>
<p><a target="_blank" href="http://learning.artech.cn/20110403.a-rule-of-writing.html">9. 关于写书的一事一议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110327.baidu.html">8. 论一论近日的百度侵权问题  </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110224.computer-book-experience.html">7. 计算机图书十二年之体会 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20091103.living-in-beijing.html">6. 闯荡北京值不值？</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20091029.mis-is-important.html">5. 沙漠里可以钓鱼吗？ </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20090806.create-content-site-abc.html">4. 做网站比的是慢功夫 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20090706.css-teaching-adivse.html">3. 给教师朋友的关于CSS的几点教学建议 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20090701.xuzhu-and-gump.html">2. 虚竹的人生启示</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20090427.how-to-write-blog.html">1. 如何写好技术博客 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20090616.freelancer-trends.html">0. 大多数设计师将成为自由职业者</a></p>
</div>
<p>作为一个十多年来，以各种方式参与过技术图书创作的作者，必然要经常考虑如何才能把一本书写好。今天遇到一件有趣的事，和写书有点关系，和读者朋友分享一下。</p>
<p><center><img style="border: 1px solid #ccc" src='http://learning.artech.cn/wp-content/uploads/2011/04/21004599-1_b.jpg' alt='21004599-1_b.jpg' /></center></p>
<p>前几天，我从朋友的办公室要了一本书回来，封面如图所示。这本书放在桌上已经几个星期了，而且一直在利用闲暇的时间学习这本书，内容不错。有趣的是，我在几个星期的时间里，一直把这本书的名字看成《后门的秘密》，直到今天早上，我忽然发现到其实是《门后的秘密》！！！</p>
<p>我多次仔细地看封面上的书名，一直不理解为什么叫“后门”的秘密，甚至对照过原书的英文书名（也在封面上）——Behind Colosed Doors —— 直译是“关着的门的后面”，但即使如此，我依然没发现，其实是我把书名中的两个字顺序看反了。</p>
<p><em>顺便提一句，这本书内容很不错：通过实际的情景描述的方式，讲解了技术团队管理中的方方面面，如果你能实实在在地实践其中的方法，相信会提升你的管理能力和改善管理效果。</em></p>
<p>我知道，我是个粗心的人，这时看错书名的原因。这一点很多读者都有体会，比如在《CSS设计彻底研究》这本书里，存在很多疏忽造成的小错误，有的是因为一瞬间脑子短路写错的，有时纯属粗心造成的，如果不是这本书较好地把CSS讲的比较清楚（核心是我总结了学习CSS必须掌握的4大核心基础：盒子模型、标准流、浮动、定位，以及深入地讲清了它们），这本书可能是要被骂的。</p>
<p>但是另一个方面，如果你比较一下我的书和其他的很多CSS书，我认为一个很大的区别是，《CSS设计彻底研究》这本书读起来会很轻松。当你一眼看过一句话的之后，立即就能明白这句话是什么意思，歧义、指代不明等等情况会很少发生。打个比方，你比较一下读武侠小说的感受，和你在考英语时做阅读理解题目的感受，你觉得有什么区别？看武侠小说很轻松，甚至可以一目十行，而独阅读理解题目，你必须仔细一句句读，更麻烦的是一句话，一遍读不懂，你不得不常常翻回头再读一次两次，甚至还是不懂。</p>
<p>而我们的技术图书，目的绝对不是给读者考试。一本好书，就是要用最浅显易懂的语言，把复杂的事儿说清楚。所以作者必须要想办法让读者最轻松地掌握你写的内容。所以，遣词造句都是很讲究的。回到《门后的秘密》这本书来说，其实翻译的没有错误，也很简洁有力，是个好名字。甚至99%的读者也不是像我这样的粗心人，并不会看错。</p>
<p>但是我想在这里分析一下，我为什么会看错这个书名。在汉语里，如果“门”和“后”两个字连一起，“后门”和“门后”都是存在的，但是有两个因素引导我误认为是“后门”而不是“门后”。</p>
<p>1）在汉语中，“后门”是一个极其常用的词，“门后”远没有“后门”常用。</p>
<p>2）如果“门后”两个字连用，通常是“某某某在某某门后如何如何”这样的句式，“门后”即使连用，仅仅是连在一起而已，并不是一个单度的词，。</p>
<p>而这里“门后的”三个字连用，显然引导读者认为“门后”是个独立的词，可是“门后”很少单独作为一个词出现，相反，“后门”倒是出现频率极高的一个独立词汇。因此，就容易把读者引导到“后门”这个词上了。</p>
<p>当然，如果你问我：“那你说这本书应该叫什么名字？”我还真说不好，我对起名字还真不在行。我想，如果叫“藏在门后的秘密”是不是好点？</p>
<p>所以，这是一个很好的例子。如果你在写文章的时候，希望读者能够不费力地读懂你的文章，就应对文字非常讲究，尽可能避免掉类似容易发生误解或者歧义的词汇或者句子。类似的例子，我还可以举出很多很多。</p>
<p>通过这个例子，也说明一个道理，想写出一本书好书，每一个细节都需要花费多大的努力和精力。必须要对版权有充分的保护，才能让更多人为此努力，为此付出，这样读者才能享受到更好的文化产品，否则整个产业必将消亡，如果没有文化的创造者，这个世界还将如何前进？</p>
<p>希望我的文章对您有所帮助。</p>
<p>您可以到新浪微博联系我：   <a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a> 。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110403.a-rule-of-writing.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>.Net Web 开发研习(9) —— 学习编程实践之“电梯模拟”</title>
		<link>http://learning.artech.cn/20110330.elevator-simulation-programming.html</link>
		<comments>http://learning.artech.cn/20110330.elevator-simulation-programming.html#comments</comments>
		<pubDate>Wed, 30 Mar 2011 10:58:55 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[.NET Web 开发研习]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110330.elevator-simulation-programming.html</guid>
		<description><![CDATA[这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。
0. 写书计划，欢迎大家提建议
1. Web开发的“十事要说” 
2. 关于学习C#语言的几个... ]]></description>
			<content:encoded><![CDATA[<div  style="width:240px;float:right; border:1px solid #ccc;padding:0 10px;margin:00px 0 10px 10px;">
<p><strong>这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。</strong></p>
<p><a target="_blank" href="http://learning.artech.cn/20110128.new-book.html">0. 写书计划，欢迎大家提建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html">1. Web开发的“十事要说” </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html">2. 关于学习C#语言的几个建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html">3. 技术平台选择，兼谈.Net 与微软</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html">4. 语言与框架 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html">5. ORM(对象关系映射)</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html">6. 学习编程实践之“五子棋”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html">7. 学习编程实践之“文件压缩”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html">8. UCLA计算机系如何教C#</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110330.elevator-simulation-programming.html">9. 学习编程实践之“电梯模拟”</a></p>
<p>不断添加中……</p>
</div>
<p>上一篇文章介绍了加州大学洛杉矶分校（UCLA）的<a target="_blank" href="http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html">一门C#语言课的教学内容</a>。今天就来讲解一下其中的一个作业题，这个作业题占它这门课程总成绩的20%。以下是我按照原文写的，以翻译为主，删掉了一点非核心的内容，并稍加了一些说明，<a target="_blank" href="http://www.cs.ucla.edu/~jeff/courses/cis399-005/sp09/ps4.html">原文见这里</a>。</p>
<h3>概述</h3>
<p>这个作业题的内容，是请你模拟一座建筑物中的电梯。你的程序需要控制电梯的运行以及乘坐电梯的乘客流。从教学的角度出发，这个作业可以分为三个部分，但你在实现的时候，不一定非要按照下面描述的顺序。你要为一座多层的建筑物中的几部电梯建模，这个模拟过程发生在一座建筑物中，需要跟踪乘客乘坐电梯在不同楼层之间运行。为了简单起见，我们设定一共有5层（标记为0-4），以及两部电梯（标记为0和1）。</p>
<p>这个模拟是基于“节拍”的，每一拍发生如下三件事：</p>
<p>1）电梯根据当前的状态进行移动；</p>
<p>2）乘客移动；</p>
<p>3）电梯的控制器更新电梯的状态。</p>
<h3>模拟乘客流</h3>
<p>一个乘客的状态一定处于两种状态之一：“空闲”（Idle）或“去向(n)”（GoingTo(n)），各自含义是:</p>
<p>去向(n)：这位乘客要去向第n层楼。</p>
<p>空闲：乘客在电梯外休息。</p>
<p>乘客的状态变迁如图所示：</p>
<p><center><img src='http://learning.artech.cn/wp-content/uploads/2011/03/simstates.png' alt='simstates.png' /></center></p>
<p>当整个模拟开始时，每个乘客的起始状态都是“空闲”。</p>
<h4>乘客的位置</h4>
<p>每个乘客有一个当前的位置，有以下7种可能： { 电梯0, 电梯1, 楼层0, 楼层1, 楼层2, 楼层3, 楼层4}。初始情况是每个乘客都在“楼层1”（楼层0表示地下室）。</p>
<p>当一个乘客正在乘坐“电梯i”的时候，我们就说他的位置是“电梯i”。当一个乘客正在“楼层f”的时候，我们就说他的位置是“楼层f”。</p>
<h4>乘客的指令</h4>
<p>我们一种简单的格式定义某个乘客的行动计划，例如</p>
<p>(t1,f1); (t2,f2); (t3,f3); …</p>
<p>其中的一个括号中有两个数字，t表示的时某一个时刻，f表示此时该乘客要取得楼层。这样的一对数字，我们称为一个“指令”。用一系列的指令就可以描述一个乘客的一系列行动的计划。注意，在实际模拟时，严格按照序列顺序，即使后面的指令中的时间早于前面指令的时间。然后，用一个简单的文本文件，可以构造出多个乘客的行动序列，每个乘客一行，如下所示：</p>
<div style="border:1px solid #cc">
  (t11, f11); (t12, f12); (t13, f13) &#8230;<br />
  (t21, f21); (t22, f22) &#8230;<br />
  (t31, f31); (t32, f32); (t33, f33) &#8230;
</div>
<p>在模拟程序开始的时候，读入这个文本文件，然后程序根据这个文件设定的所有指令模拟整个运行过程。</p>
<h4>对乘客建模</h4>
<p>乘客的移动按照下面的规则进行：假设一个乘客S，当前的状态是state，当前位置是p，当前的指令I，并假设当前的时刻为T。</p>
<p>　* 如果 state 为 Idle，那么<br />
　　　　 o 如果 I 为空，那么什么也不做<br />
　　　　 o 如果 I 的形式为 (t0,f0);I′， 那么<br />
　　　　　　+ 如果 T < t0 那么什么也不做。<br />
　　　　　　+ 如果 T ≥ t0 那么将 state 设置为 GoingTo(f0) 并且将 I 设置为 I′。<br />
　　* 如果 state 为 GoingTo(f)， 那么<br />
　　　　o 如果 p = "楼层f"，那么将 state 设置为 Idle。<br />
　　　　o 如果 S 正在 电梯e中，并且电梯e位于“楼层f”，电梯状态是 Open，那么将 p 设置为“楼层f”。<br />
　　　　o 如果 p =“楼层f0” ( 不等于“楼层f" )，那么<br />
　　　　　　+ 如果 f < f0，那么将指示灯 d 设置为 Down，否则将 d 设置为 Up.<br />
　　　　　　+ 如果电梯e位于“楼层f0”，且状态为 Open，指示灯为d，电梯内少于5人, 那么将p设置为电梯e。</p>
<p>注意，如果点运行的速度慢，可能导致乘客获取到一个过期的指令，以上的规则可以保证，所有的指令都会按照顺序被执行。换句话说，乘客可能在某些步骤，比指令计划的有所延迟，但是都会根据指令完成确定的旅程计划。</p>
<h3>对电梯建模</h3>
<p>模拟的电梯承载着乘客，在楼层之间移动。我们需要使用一些状态来对电梯建模。</p>
<h4>电梯高度</h4>
<p>每一部电梯都有一个“当前高度”，假设每层楼高10英尺，电梯的高度用从0到40的整数表示。当电梯的高度是10的整数倍的时候，我们就说该电梯唯一第“高度/10”层。比如当前的高度是30，就说明它在第3层。在模拟开始时，两部电梯都在第0层。</p>
<h4>电梯动作</h4>
<p>一个电梯一共有4种可能的状态：“打开”（Open）、“静止”（Stopped）、“上移”（GoingUp）和“下移”（GoingDown），描述如下。任何操作都不会使电梯的高度小于0或大于40，即高度永远在 [0,40] 这个区间内。</p>
<p>“打开”：乘客可以进入或离开。</p>
<p>“上移”：电梯按照5英尺/拍的速度上升。</p>
<p>“下移”：电梯按照5英尺/拍的速度下降。</p>
<p>“静止”：没有什么动作。</p>
<p>只有特定的电梯动作序列是有效的。一个电梯一旦开始运动，就不能开门。各种状态之间变迁需要符合下图。即从状态s到状态s&#8217;，只有符合下面图中存在从s到s&#8217;的箭头时才是允许的。例如。从“下移”状态，可以变为“静止”状态，但是不能变为“打开”或“上移”状态。</p>
<p><center><img src='http://learning.artech.cn/wp-content/uploads/2011/03/elevatoractions.png' alt='elevatoractions.png' /></center></p>
<p>电梯的初始状态是“静止”。一部电梯内同时最多容纳5个乘客。</p>
<h4>指示灯</h4>
<p>每一部电梯有一个指示灯，分别有“上”、“下”和“无”三种显示状态。</p>
<h3>电梯调度</h4>
<p>由电梯本身来决定自身的行动，也未尝不可。不过更好的方式，还是为电梯的运行提供集中的控制。这个模拟程序，将使用单一的方法来为整个电梯系统的运行提供计划。这个方法称为 PlanStep，由以下接口定义：</p>
<div style="border:1px solid #ccc; color:black;overflow:auto;width:99.5%;">
<pre style="margin:0em;"> <span style="color:#0000ff">interface</span><span style="color:#000000">  <span style="color:#2b91af">IElevatorPlanner</span><span style="color:#000000"> </pre>
<pre style="margin:0em;"> <span style="color:#000000">{</span></pre>
<pre style="margin:0em;">     <span style="color:#008000">//定义方法 PlanStep(controls, upFloors, downFloors)</span><span style="color:#000000"> </pre>
<pre style="margin:0em;">     <span style="color:#008000">//用于对电梯进行调度</span><span style="color:#000000"> </pre>
<pre style="margin:0em;">     <span style="color:#008000">//其中的参数：</span><span style="color:#000000"> </pre>
<pre style="margin:0em;">     <span style="color:#008000">//controls[e] 对应于电梯e的控制</span><span style="color:#000000"> </pre>
<pre style="margin:0em;">     <span style="color:#008000">//upFloors[i]为 true ，当且仅当一名乘客在“楼层i”，且状态为GoingTo(j)，且 j > i</span><span style="color:#000000"> </pre>
<pre style="margin:0em;">     <span style="color:#008000">//downFloors[i]为 true ，当且仅当一名乘客在“楼层i”，且状态为GoingTo(j)，且 j < i</span><span style="color:#000000"> </pre>
<pre style="margin:0em;">     <span style="color:#0000ff">void</span><span style="color:#000000">  PlanStep(IElevatorControl[] controls,</pre>
<pre style="margin:0em;">                   <span style="color:#0000ff">bool</span><span style="color:#000000"> [] upFloors,</pre>
<pre style="margin:0em;">                   <span style="color:#0000ff">bool</span><span style="color:#000000"> [] downFloors);</pre>
<pre style="margin:0em;"> <span style="color:#000000">}</span></pre>
<pre style="margin:0em;"> </pre>
</div>
<p>PlanStep方法将会使用comtrols数组中的对象对外界作出响应。PlanStep可以使用内部的状态来辅助作出决策，但是必须做到仅通过这个接口与电梯和乘客交互。显然，upFloors 和 downFloors 数组对应的就是对每个楼层的电梯按钮，又等候电梯的乘客按下。这里做了一点简化，使用真实的电梯时，乘客会先把电梯呼叫到他所在的楼层，进入以后，再按目的楼层的按钮。而这里则化简为在电梯外就确定目的楼层。</p>
<p>IElevatorPlanner 接口依赖于一个控制电梯的类（声明为接口）以及两个相关的枚举类型。分别定义如下：</p>
<pre style="border:1px solid #ccc;font-family: NSimSun; color: black; background: none repeat scroll 0% 0% white;">
<span style="color: blue;">enum</span>&nbsp;<span style="color: rgb(43, 145, 175);">ElevAction</span>&nbsp;{&nbsp;Open,&nbsp;Stopped,&nbsp;GoingUp,&nbsp;GoingDown&nbsp;};

<span style="color: blue;">enum</span>&nbsp;<span style="color: rgb(43, 145, 175);">ElevLight</span>&nbsp;{&nbsp;Up,&nbsp;Down,&nbsp;None&nbsp;};

<span style="color: blue;">interface</span>&nbsp;<span style="color: rgb(43, 145, 175);">IElevatorControl</span>{
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green;">//StopRequested(i)&nbsp;返回&nbsp;true，当且仅电梯内乘客的状态是GoingTo(i)。</span>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green;">//需要对i做参数检查，确保在&nbsp;[0..4]范围内。</span>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">bool</span>&nbsp;StopRequested(<span style="color: blue;">int</span>&nbsp;i);

&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green;">//只读属性，返回电梯的当前状态。</span>
&nbsp;&nbsp;&nbsp;&nbsp;ElevAction&nbsp;ActionState&nbsp;{&nbsp;<span style="color: blue;">get</span>;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green;">//设置电梯的当前状态。</span>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green;">//需要对参数作检查，确保参数是一个有效的状态变迁。</span>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">void</span>&nbsp;SetAction(ElevAction&nbsp;s);

&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green;">//只读属性，返回电梯所电梯指示灯的状态。</span>
&nbsp;&nbsp;&nbsp;&nbsp;Light&nbsp;Indicator&nbsp;{&nbsp;<span style="color: blue;">get</span>;&nbsp;<span style="color: blue;">set</span>;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: green;">//只读属性，返回电梯所处的高度。</span>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">int</span>&nbsp;Height&nbsp;{&nbsp;<span style="color: blue;">get</span>;&nbsp;}
}&nbsp;
</pre>
<h3>作业内容</h3>
<p>编写一个图形界面，显示模拟的当前状态。提示：System.Windows.Forms.PictureBox 提供了显示图像的方法。你的图形界面应该包括以下功能：</p>
<p>1）用户可以把鼠标移动到一个电梯或乘客上，查看他当时的状态。可以使用：System.Windows.Forms.ToolTip。</p>
<p>2）用户可可以控制电梯运行的步数，每次跳过一定的步数（比如10步、50步），显示电梯的状态。</p>
<p>3）用户可以通过读入文本文件设定乘客的行程计划。</p>
<h3>挑战部分：动画演示</h3>
<p>使用动画方式演示电梯的运行过程。</p>
<h3>总结</h3>
<p>这是一个很有意思的题目，通过这个题目，读者可以注意到几个问题：</p>
<p>1）现实世界中的系统，和信息世界中的系统，是如何对应的。在题目中多次提到了一个词“建模”，这非常本质地说明了，软件开发很重的一个性质。</p>
<p>2）系统地分析，在这题目的描述中，可以发现他非常清晰对系统地进行了划分，而且每个部分之间的耦合度非常低，这是值得学习程序设计的读者仔细领会的要点。</p>
<p>希望我的文章对您有所帮助。</p>
<p>您可以到新浪微博联系我：   <a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a> 。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110330.elevator-simulation-programming.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>推荐一个上海的前端开发工作机会</title>
		<link>http://learning.artech.cn/20110329.job-front-end-dev.html</link>
		<comments>http://learning.artech.cn/20110329.job-front-end-dev.html#comments</comments>
		<pubDate>Tue, 29 Mar 2011 07:10:46 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[工作机会]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110329.job-front-end-dev.html</guid>
		<description><![CDATA[一个获得投资的创业企业，面向体育迷的垂直SNS社区，公司位于上海。如果有兴趣的读者朋友可以试试看。网址：体遨网。
职位描述： 
1、 负责符合w3c标准、多浏览器兼容、语义化的Web前端... ]]></description>
			<content:encoded><![CDATA[<p>一个获得投资的创业企业，面向体育迷的垂直SNS社区，公司位于上海。如果有兴趣的读者朋友可以试试看。网址：<a target="_blank" href="http://www.tiao.com/">体遨网</a>。</p>
<p><strong>职位描述： </strong></p>
<p>1、 负责符合w3c标准、多浏览器兼容、语义化的Web前端网页产品功能的开发、调试和维护，实现一流的用户交互WEB界面； </p>
<p>2、 理解设计师意图，负责与程序工程师的沟通，制定技术实现方案和接口规范； </p>
<p>3、 持续优化前端代码结构，降低网络下载时间，提高页面显示速度； </p>
<p><strong>职位要求： </strong></p>
<p>1、 两年以上WEB前端开发经验，热爱WEB前端开发工作，对WEB前端开发的重要性有正确的认识； </p>
<p>2、 精通HTML/XHTML、CSS，对Web标准和标签语义化有深入理解，能手写DIV+CSS布局，兼容各类主流浏览器的静态页面代码； </p>
<p>3、 精通前端展现框架的一种: Jquery, prototype EXT等JS框架；</p>
<p>4、 熟悉基于Ajax技术的应用开发；</p>
<p>5、 责任心强，良好的对外沟通和团队协作能力；</p>
<p>6、 有大型门户网站前端开发经验的优先；</p>
<p>7、 热爱体育优先。</p>
<p><strong style="color:#C33">联系方法：hr[at]tiao.com</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110329.job-front-end-dev.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>随心随笔(8) —— 论一论近日的百度侵权问题</title>
		<link>http://learning.artech.cn/20110327.baidu.html</link>
		<comments>http://learning.artech.cn/20110327.baidu.html#comments</comments>
		<pubDate>Sat, 26 Mar 2011 16:37:39 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[随心随笔]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110327.baidu.html</guid>
		<description><![CDATA[从大的方面来看，我坚信一个品牌或企业的竞争，最终是价值观的较量。一心一意依靠盗版来做生意，如此低级的价值观，结果可想而知。
从具体层面来看，百度目前的核心问题不是“分成比... ]]></description>
			<content:encoded><![CDATA[<p>从大的方面来看，我坚信一个品牌或企业的竞争，最终是价值观的较量。一心一意依靠盗版来做生意，如此低级的价值观，结果可想而知。</p>
<p>从具体层面来看，百度目前的核心问题不是“分成比例”问题，而是必须<strong style="color:#C33">“先授权再发布”</strong>的问题。一个生产者(内容所有者)应该有权力决定，是否销售，以及如何销售它的产品，而不是由其他人（比如百度）来决定。</p>
<p>打个比方，你投资建了一个市场，比如一个家具市场。你的市场再好，产权人也有权力决定，在或不在你那里卖他的东西。而不能说，你想把我的东西放到你的市场里卖，我就必须要放进去卖。更何况，你那里还都是在卖从我那里偷来的东西，卖来的钱是你和小偷分赃。</p>
<p>现在很多人有一个观点，现在的数字化和网络技术导致版权保护已经不可能了，创作内容要挣钱只能通过广告了，而不能通过销售内容本身了。而且往往摆出一些例子，说你看谁谁谁不是靠广告就正钱了吗？或者说你看电视台不都是免费看的吗？而且电视台广告收入大大的呀！</p>
<p>实际上这个观点是严重错误的。原因有两点：</p>
<p>1：盗版问题不解决，靠广告模式挣钱也是不可能的。就像百度这样的大大小小的无视知识产权的网站存在，广告收入从哪里来？小偷把你的东西偷走了，然后销赃，挣了钱会分给你吗？所以，盗版不是个技术问题，而是个社会问题和法律问题。</p>
<p>比如说一本书，如果卖1万册，作者就可以有一定收益了，这样他也愿意写。而一旦被随便传播了，只能卖1千册了，他还怎么写？就算作者愿意写，也没有出版社会出版。而这就是近年来出版业举步维艰的现实。</p>
<p>百度现在这种模式是在扼杀内容创作的源动力，绝对不能允许它存在。否则就意味中国继续向没有文化、没有技术、没有思想的道路上继续前进。</p>
<p>2：即使盗版问题解决，也不可能靠广告解决问题。核心在于只有大众内容才能靠广告！</p>
<p>销售1万册的书，根本不可能靠广告模式。而你知道，销售超过1万册的书，比例不会超过所有图书的15%。</p>
<p>如果强迫内容创作者都必须使用内容免费，而靠广告来赢利的模式，就意味，至少90%的图书不会产生出来了。</p>
<p>图书的价值就在于多样性，个性化。如果没有90%的小众图书作为基础，就不会有那10%的大众图书。</p>
<p>也许以后可以出现一个很好的平台，确实可以为很多作者带来很好的收益，但是再好的平台，也必须由作者决定他的作品是否出现在这个平台上，而不是由这个平台来决定。</p>
<p>所以，还是那句话：一个生产者，应该有权利决定，是否销售、在哪里销售、以何种价格销售它的产品，而不是由其他人（比如百度）来决定。</p>
<p>当然，此外还有一种观点：除了百度，还有很多其他的网站，比百度疯狂多了，怎么不管？一个一个来，只要方向是正确的，总有成功的时候。</p>
<p>最后，还有一些人很直接地表示，就希望看到免费的东西，白来的就是好！对这样的人，无话可说~~ 但我相信这种人毕竟还是少数。</p>
<p>正如在国外，免费电视台（靠广告）和收费电视台（无广告）同时存在。一个市场是应该存在大众、小众、收费、免费等多种多样化和多种模式的产品的市场。而不是单一的模式，更不是靠盗窃和销赃挣钱的市场。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110327.baidu.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>关于本站视频下载的说明</title>
		<link>http://learning.artech.cn/20110325.download-notice.html</link>
		<comments>http://learning.artech.cn/20110325.download-notice.html#comments</comments>
		<pubDate>Fri, 25 Mar 2011 08:32:33 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[本站信息]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110325.download-notice.html</guid>
		<description><![CDATA[我们的网站的访问负载主要来自视频的下载，目前对下载做了一些限制，这里说明一下.

简单说：最好的学习方式不是下载一大堆视频和电子书放到硬盘里，而是立即在线就看。
建议不要按下... ]]></description>
			<content:encoded><![CDATA[<p>我们的网站的访问负载主要来自视频的下载，目前对下载做了一些限制，这里说明一下.</p>
<p><strong style="color:#C33"></p>
<p>简单说：最好的学习方式不是下载一大堆视频和电子书放到硬盘里，而是立即在线就看。</p>
<p>建议不要按下载按钮，而是按播放按钮，这样不会有任何问题，除非你上网的速度太慢。如果一定要下载，请务必一个一个文件下，下完一个再下一个。请不要用同时下载多个视频，不要使用迅雷等下载工具。否则你就会遇到无法下载的情况。</p>
<p></strong></p>
<p>详细说明如下：</p>
<p>1：在同一个时刻，每个IP只允许有一个连接进行下载，比如说，一个用户正在下载或播放某一个视频教程，那么此时那就无法下载或播放其他视频教程。</p>
<p>这个要求用PHP是可以实现的，只需要把一个下载请求的IP记录在数据库中，对每次来的下载请求先在数据库中查一下，如果已经在下载文件了，那么就拒绝这个IP的请求，当一个下载结束或者人为终止以后，就在数据库中删除这个IP的记录，这是他在访问就被允许了。</p>
<p>但是仅仅这样做还不够，因为还会有很多人使用下载工具，大量并发地发出下载请求，而由于使用了上面第1条措施后，所有的下载请求都会转到一个PHP 文件上，这样如果并发的下载请求数量很多的话，就需要服务器创建大量的PHP进程，这也是一个非常大的负担，而且Apache对于同时并发创建的PHP进程数量是有限制的。为此，我们就不得不采取第二个限制措施：</p>
<p>2：对于那些非常疯狂地发出并发下载请求的IP，就只能实施封锁的办法了。</p>
<p>我们经常会观察到一秒钟发出超过10个请求的IP，这些IP就必须要拒绝掉了。我们会记录每一个下载文件的IP在一段时间中发出的请求数量，如果超过一定限额，就封IP了，也就是这个“拒绝”命令直接由web服务器Apache发出，而不再由PHP程序发出。</p>
<p>目前，把疯狂发出下载请求的IP放入黑名单这个功能可以由这个程序自动实现。当然更理想的状态是经过一段时间比如1个小时以后，再自动从黑名单中去掉，这个我没有做到程序里。因此，指使人工地过一段时间把黑名单清空一次。我对PHP所知甚少，没有太多的时间把这个程序做得很复杂了。</p>
<p>当然在设置了上面的限制以后，对一些访问者是有麻烦的，比如在局域网中的不同的人，往往使用同一个对外的IP，这样他们就会被看作是同一个IP而加以限制。但是目前我们也只能这样了。</p>
<p>以后有条件的话，我们会尽可能改善服务期的条件，比如使用独立主机等等，但是还是需要一定的盈利以后，才可以做到。再不赢利的情况下，服务器的投资还无法做到很大。</p>
<p>如果哪位有一些更好的建议，可以告诉我们，谢谢大家对我们的支持！</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110325.download-notice.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>.Net Web 开发研习(8) —— UCLA计算机系如何教C#</title>
		<link>http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html</link>
		<comments>http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html#comments</comments>
		<pubDate>Fri, 25 Mar 2011 03:49:48 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[.NET Web 开发研习]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html</guid>
		<description><![CDATA[这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。
0. 写书计划，欢迎大家提建议
1. Web开发的“十事要说” 
2. 关于学习C#语言的几个... ]]></description>
			<content:encoded><![CDATA[<div  style="width:240px;float:right; border:1px solid #ccc;padding:0 10px;margin:00px 0 10px 10px;">
<p><strong>这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。</strong></p>
<p><a target="_blank" href="http://learning.artech.cn/20110128.new-book.html">0. 写书计划，欢迎大家提建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html">1. Web开发的“十事要说” </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html">2. 关于学习C#语言的几个建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html">3. 技术平台选择，兼谈.Net 与微软</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html">4. 语言与框架 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html">5. ORM(对象关系映射)</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html">6. 学习编程实践之“五子棋”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html">7. 学习编程实践之“文件压缩”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html">8. UCLA计算机系如何教C#</a></p>
<p>不断添加中……</p>
</div>
<p>前两次的文章介绍了两个实践题目，我又想到的第三个不错的选题，是写一个“电梯运行模拟程序”。这个题目是我在做本科毕业设计的时候，看到比我高一届的一个同学的毕业论文，当时就觉得很有意思。这里面除了涉及基本的编程语言，核心的面向对象的编程思想，和设计模式的运用，我觉得对一个学习者，是个相当不错题目。</p>
<p>为了写这个题目，我在Goolge用“assignment elevator simulator”作为关键字，搜索了一下，想看看国外的大学有没有用这个题目给学生留作业的。不出所料，果然搜出了一大堆美国大学计算机系的课程页面，使用这个题目给学生留作业。[BTW：如果在未来的某一天，在中国无法使用Google了，中国真的要倒退100年，但是很多人不这么想，很无奈。]</p>
<p>我浏览了这些美国大学的相关课程页面之后，很受启发，我觉得可以增加一篇文章，来讲讲国外大学的计算机系是如何讲授一门高级语言的。因为他们讲的内容和方式，和我当年上大学的感觉很不一样。</p>
<p>这里我就选择美国加州大学洛杉矶分校（UCLA）计算机系的一门课程为例 ——&#8221;CIS 399-005: Introduction to Programming in C# &#8220;，即编号为CIS 399-005的“<strong>C#编程介绍</strong>”。如果是在中国的大学里开这么一门课程，相信所有人都会认为是给文科或者非计算机专业开设的简介性质的课程。</p>
<p>下面我就介绍一下在UCLA，这么一门从名称看非常入门的课程，具体是如何教学的。如果读者懂英语，可以查看这里“<a target="_blank" href="http://www.cs.ucla.edu/~jeff/courses/cis399-005/sp09/index.html">Introduction to Programming in C#</a>”的页面。</p>
<p>这门课程的网页左侧是一个目录，包括课程<a target="_blank"  target="_blank"  href="http://www.cs.ucla.edu/~jeff/courses/cis399-005/sp09/policy.html"> Policy</a>（规则）、<a  target="_blank" href="http://www.cs.ucla.edu/~jeff/courses/cis399-005/sp09/ps.html">Problem Sets</a>（作业项目）、<a target="_blank"  href="http://www.cs.ucla.edu/~jeff/courses/cis399-005/sp09/resources.html">Resources</a>（资源）、<a target="_blank"  href="http://www.cs.ucla.edu/~jeff/courses/cis399-005/sp09/software.html">Software</a>（软件）和 <a  target="_blank" href="http://www.cs.ucla.edu/~jeff/courses/cis399-005/sp09/schedule.html">Schedule &#038; Notes</a>（日程和备注）。我们选择一些重点内容介绍。</p>
<h3>如何评分？</h3>
<p>在规则部分，首先给出的是这门课程的评分方法：</p>
<p>课程参与度 ： 10分</p>
<p>作业项目1 ：5分</p>
<p>作业项目2 ：10分</p>
<p>作业项目3 ：15分</p>
<p>作业项目4 ：20分</p>
<p>期末项目 ：40分</p>
<p>看到吗？没有笔试考试！就是5个实际的编程项目。这很重要，我清楚地记得，我在上大学期间三次参加编程语言的笔试考试：Pascal（一年级）、C（三年级上） 和 C++ （三年级下）。考题大多是一些孔乙己的“茴香豆有几种写法”式的问题，看看你对于语法规则是否熟悉。我上的大学（华中理工大学，现在改名叫华中科技大学）的计算机系在中国的大学计算机系里，如果不能排进前10名，至少可以排进前20名，尚且如此，对于其他成百上千所大学的计算机专业的教学，可想而知。</p>
<h3>注意事项</h3>
<p>接下来，告诉学生应该如何参与课程，做哪些准备工作，以及不要迟交作业（时间是精确到秒的，晚交作业扣50%的分数），最后告诉学生抄袭是“绝对零容忍”的。这些事情，说起来很简单，但是如果你仔细看一下他的文字，都能感觉到一种既和善又足够有力的力量。</p>
<p>此外，还特别鼓励学生接受挑战，在每个作业题目中，除了基本要求之外，还会各处一个“挑战”部分，给那些有余力的学生。因此，鼓励学生迎接这些挑战，但也不忘提醒学生，务必先把基础部分完成好之后，再做挑战部分。</p>
<h3>讲授内容</h3>
<p>在“日程和备注”部分，给出了每次课程的日期和概述，大家可以仔细看一下，他们<a target="_blank" href="http://www.cs.ucla.edu/~jeff/courses/cis399-005/sp09/schedule.html">是如何教C#语言</a>的。包括了C#语言的对象模型、面向对象的思想方法何实现，泛型、反射、多线程开发、互操作、高阶（High order）编程等等很多深入的内容。这些内容基本覆盖了《C#本质论》的所有高级内容，可绝对不是简单讲讲C#的语法而已。</p>
<h3>作业项目</h3>
<p>最重要的是我想介绍一下他们布置的5个作业项目。</p>
<p>“问题1”非常简单：包括一个“Hello World”程序，和一个对字符串排序的程序。</p>
<p>“问题2”开始就不一样了：写一个<a target="_blank"  href="http://www.cs.ucla.edu/~jeff/courses/cis399-005/sp09/ps2.html">图形界面的“逆波兰式“计算器</a>。</p>
<p>“问题3”又上了一个台阶：写一个<a target="_blank"  href="http://www.cs.ucla.edu/~jeff/courses/cis399-005/sp09/ps3.html">手写数字的识别程序</a>。这是模式识别领域的问题。</p>
<p>“问题4”就是我前面提到的题目：写一个“<a target="_blank"  href="http://www.cs.ucla.edu/~jeff/courses/cis399-005/sp09/ps4.html">电梯运行模拟程序</a>”。它涉及到面向对象的分析方法、设计模式、状态机等很多问题。</p>
<p>“期末项目”：这是一个<a target="_blank" href="http://www.cs.ucla.edu/~jeff/courses/cis399-005/sp09/project.html">开放式的问题</a>，组成3-5人的开发小组，从策划构思到最终的实现，配合完成，并作现场的演示和讲解。</p>
<p>我感觉这几个题目，对于一个本科生的一门课，强度真是不小。这让我想到了《软件随想录》中，Joel的理论：大学计算机系必须要开设一些“非常难”的课程，把真正适合做软件开发的人筛选出来。</p>
<h3>总结</h3>
<p>我十分希望中国的大学可以把教学的档次再提升一些，当然我也看过一些清华大学计算机系的课程的教学网站，感到学生的水平和这种作业项目的质量，是相当牛B的。希望这样的模式能从仅仅少数几所学校，扩展开，至少国内前100名的学校应该有这个意识。</p>
<p><img align="right" src='http://learning.artech.cn/wp-content/uploads/2011/03/20746325-1_l.jpg' alt='20746325-1_l.jpg' />从这里，也给学习C#的或其他语言的读者提一个建议，就是想要学会一门语言，就必须真正动手，实实在在做一些需要比较复杂逻辑思考的程序，这对于一个开发人员是必须的路径。如果你是大学生计算机系的学生，在毕业前，至少应该写够5万行有意义的代码。</p>
<p>另外，强烈推荐<a target="_blank" href="http://learning.artech.cn/20110217.book-review-more-joel-on-software.html">《软件随想录》</a>这本书，值得所有软件行业的人认真读一读，如果你还没读过，务必要买一本。</p>
<p>下一片文章，我将会把“电梯运行模拟程序”这个题目，按照上面UCLA的这门课程页面中的讲解，进行比较详细的说明。</p>
<p>如果读者感兴趣，我可以把上面那几个题目分别翻译一下，介绍给学习C#或其他语言的读者，你们亲自动手试试看。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>[代发] 图灵公司招聘开发方面图书的译者（英译汉）</title>
		<link>http://learning.artech.cn/20110324.are-you-a-translator.html</link>
		<comments>http://learning.artech.cn/20110324.are-you-a-translator.html#comments</comments>
		<pubDate>Thu, 24 Mar 2011 02:46:27 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[工作机会]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110324.are-you-a-translator.html</guid>
		<description><![CDATA[昨天发了一个贴子，比较快地就找了合适的人选，所以这次又来了一批图书，供有兴趣者参与。
关于图灵公司：图灵文化公司是人民邮电出版社下属的专业出版公司，致力于高品质计算机图书... ]]></description>
			<content:encoded><![CDATA[<p>昨天发了一个贴子，比较快地就找了合适的人选，所以这次又来了一批图书，供有兴趣者参与。</p>
<p><strong>关于图灵公司：<a target="_blank" href="http://www.turingbook.com">图灵文化公司</a>是人民邮电出版社下属的专业出版公司，致力于高品质计算机图书的出版工作。你在书店能够看到的很多高端计算机外版书，都是图灵公司引进翻译出版的。</strong></p>
<p>图灵现有以下图书需要翻译出版，需要招聘图书译者，如果您的<strong>英文水平较好</strong>，<strong>对相关技术熟悉</strong>，<strong>汉语文笔流畅</strong>，对翻译一本技术图书感兴趣，可以在发邮件到 support [at] artech.cn，自我介绍一下，最好能详细一些，谢谢！<strong style="color:#c33">请务必在邮件中留下电话，便于和您联系</strong></p>
<p>以下为书名，您如果有兴趣，可以到亚马逊美国的网站（www.amazon.com）上，找到这些书，具体看一下书的详细信息。</p>
<p>PHP jQuery Cookbook </p>
<p>DSLs in Action [难度较大]</p>
<p>Designing with Progressive Enhancement: Building the Web that Works for Everyone </p>
<p>ActionScript 3.0 Game Programming University </p>
<p>Level Up!: The Guide to Great Video Game Design [难度较大]</p>
<p>Pragmatic Guide to JavaScript</p>
<p>Joe Celko&#8217;s SQL for Smarties: Advanced SQL Programming [难度较大]</p>
<p>Driving Technical Change [难度较大]</p>
<p>Pro PHP Application Performance</p>
<p>The Essential Guide to HTML5: Using Games to Learn HTML5 and JavaScript</p>
<p>以上注明难度较大者，是图灵公司的工作人员标注的。</p>
<p>目前寻找的“试翻者”比最终的“译者”会多一些，因此，不能保证您报名都能一定请您翻译您报名的那本书，不过您越早报名，机会比较大。即使这次没有合作，图灵公司也会将您的信息存档，以后还有很多机会，所以还是欢迎大家积极报名。</p>
<p>此外，翻译书和看懂英文技术资料还有一定的区别，不仅需要真正理解原文，还需要能够很好地表达为汉语。希望为您带来一个新的机会。</p>
<p>翻译一本专业的图书，一方面是个学习（还能有收入），另一方面也是很有成就感的一件事哦~~ 这些书都是业界顶尖的技术书。</p>
<p style="color:#c33"><strong>请务必在邮件中留下电话，便于和您联系</strong></p>
<p>走过路过，不要错过~~</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110324.are-you-a-translator.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>[代发] 招聘CSS方面图书的译者（英译汉）</title>
		<link>http://learning.artech.cn/20110323.css-translatior-hunting.html</link>
		<comments>http://learning.artech.cn/20110323.css-translatior-hunting.html#comments</comments>
		<pubDate>Wed, 23 Mar 2011 12:33:55 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[工作机会]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110323.css-translatior-hunting.html</guid>
		<description><![CDATA[图灵文化公司是人民邮电出版社下属的专业出版公司，致力于高品质计算机图书的出版工作。你在书店能够看到的很多高端计算机外版书，都是图灵公司引进翻译出版的。
图灵有两本英文CSS方... ]]></description>
			<content:encoded><![CDATA[<p>图灵文化公司是人民邮电出版社下属的专业出版公司，致力于高品质计算机图书的出版工作。你在书店能够看到的很多高端计算机外版书，都是图灵公司引进翻译出版的。</p>
<p>图灵有两本英文CSS方面的图书需要翻译出版，需要招聘CSS方面的图书译者，如果您的英文水平较好，对CSS技术熟悉，汉语文笔流畅，对翻译一本技术图书感兴趣，可以在发邮件到 support [at] artech.cn，自我介绍一下，谢谢！</p>
<p style="color:#c33"><strong>请务必在邮件种留下电话，便于和您联系</strong></p>
<p>翻译一本专业的图书，一方面是个学习（还能有收入），另一方面也是很有成就感的一件事哦~~</p>
<p>走过路过，不要错过~~</p>
<p><strong style="color:#c33"></p>
<p style="font-size:1.5em">[3.24 10:18 更新说明]：</p>
<p>没想到我的这个网站影响力这么大（开个玩笑：））~~ 一个晚上加一个早上，已经找到适当的试译者，所以暂时不需要新的译者报名了~~</p>
<p>但是~~ 鉴于我们的影响力，图灵公司又给了我心的人物，还有一批其它题材的引进数招聘译者，稍后我再公布具体信息。</p>
<p></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110323.css-translatior-hunting.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>朝花夕拾第三篇：《构建高性能可扩展ASP.NET网站》读后感</title>
		<link>http://learning.artech.cn/20110319.from-micro-blog-3-book-review.html</link>
		<comments>http://learning.artech.cn/20110319.from-micro-blog-3-book-review.html#comments</comments>
		<pubDate>Sat, 19 Mar 2011 01:29:53 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[朝花夕拾]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110319.from-micro-blog-3-book-review.html</guid>
		<description><![CDATA[《构建高性能可扩展ASP.NET网站》各章独立，先读哪章都可以。看完第8章，关于SQL Server的性能分析和实践指导，感觉很好，解决了很多我长久以来一直认识模糊的东西。比如关于各种索引方面... ]]></description>
			<content:encoded><![CDATA[<p><img style="margin:10px;float:right" src='http://learning.artech.cn/wp-content/uploads/2011/03/145126764.gif' alt='145126764.gif' />《构建高性能可扩展ASP.NET网站》各章独立，先读哪章都可以。看完第8章，关于SQL Server的性能分析和实践指导，感觉很好，解决了很多我长久以来一直认识模糊的东西。比如关于各种索引方面的东西，虽然也看过很多相关文章，这本书讲的是最清楚且有说服力的。这本书核心就是让网站“快”起来。 </p>
<p>==========</p>
<p>这本书，告诉我们一个道理，从客户端到服务器端再到数据库，追求高性能都是靠两个武器：“缓存”和“异步”，代价就是程序的复杂性增加。所以希望提高性能时，就要平衡一下，是找人优化程序合算，还是多买几台服务器合算。</p>
<p>==========</p>
<p>原来没听说过这本书的作者（我是比较孤陋寡闻的），看了他自己写的简历后，觉得还是很牛的，尤其是几十年坚持在技术的第一线，在中国几乎是不可想象的，我们每天讨论的话题是“程序员35岁以后怎么办”的问题。</p>
<p>==========</p>
<p>此外，他的简历的最后一句话“2006年12月，我们一家离开了压抑的硅谷，搬到了美丽的新西兰。”我恰好前几天也向一个朋友，用了压抑这个词形容北京，表达愿意离开的愿望~~~希望若干年后，我也可以写一句“20XX年，我们一家离开了压抑的北京，搬到了美丽的YYY”。</p>
<p>==========</p>
<p>[翻译书为什么不好读] 例如这本书里有一句：“当写入数据库日志操作与延迟写线程将已修改的页写到数据文件或从磁盘读取数据操作同时进行时，“这个状语从句很难理解，如加3个标点：“当……操作，与……操作（或……操作）同时进行时，”就容易理解了。其实这个句子本质是非常简单的：“ A与（B或C）同时进行”。当把ABC分别扩展为一句话，连在一起就非常难一下子读懂了。</p>
<p>==========</p>
<p>本书作者说的这些因素值得考虑，具体如何用，是另一个问题。知道这些因素，经过思考不去用，和根本就不知道这些事儿，是不一样的。就像学会之后忘记，和从来不知道，是完全不同的。 //@时金魁:两本不同的构建高性能网站的书，真正实施有很长的路。不适合小企业，高性能的规则也在摸索中，不见得立竿见影。</p>
<p>==========</p>
<p>在优化数据库这一章，作者表达了对ORM（对象关系映射）的观点，他的观点中性偏负面。和我的观点不太一样，我觉得ORM和SQL就像当于高级语言和汇编语言的关系，真正追求高性能时，用汇编是首选（至今全世界仍有1%程序员使用汇编），但是绝大多数情况，还是使用高级语言的。</p>
<p>以上文字系我发表在新浪微博上的微博。也欢迎您在新浪微博和我联系：<a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a></p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110319.from-micro-blog-3-book-review.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>朝花夕拾第二篇：关于浏览器</title>
		<link>http://learning.artech.cn/20110318.from-micro-blog-2-about-browsers.html</link>
		<comments>http://learning.artech.cn/20110318.from-micro-blog-2-about-browsers.html#comments</comments>
		<pubDate>Fri, 18 Mar 2011 08:12:20 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[朝花夕拾]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110318.from-micro-blog-2-about-browsers.html</guid>
		<description><![CDATA[对 HTML5 在中国何时能真正用起来，相当不乐观。IE 6 在中国太根深蒂固了。对HTML 5热衷的人都是搞IT做技术的人，而真正的客户对此并不关心，要他们更新浏览器非常困难。如果是企业内部的系... ]]></description>
			<content:encoded><![CDATA[<p>对 HTML5 在中国何时能真正用起来，相当不乐观。IE 6 在中国太根深蒂固了。对HTML 5热衷的人都是搞IT做技术的人，而真正的客户对此并不关心，要他们更新浏览器非常困难。如果是企业内部的系统，还可以有商量的余地，而如果是对公众服务的系统，必须是IE 6兼容的。</p>
<p>==========</p>
<p>对 IE 6 在中国的现状，几个大网站应该有所作为，就像美国一些大网站已声明不支持IE6。中国的大网站也应该联合起来这样做，如果全民都使用使用现代浏览器，无论对用户，还是对业界，都有巨大的好处。否则HTML5等等，都是海市蜃楼。我也不很看好HTML5 的书，纯技术发烧友比例太小。</p>
<p>==========</p>
<p>刚才看了一下我的网站的访问数据，统计了一年来访问者的浏览器情况，IE 6 还是相当顽固，不做最近倒是突然下降了一些，如果能继续下降就好啦。Chrome 增长很稳定， Firefox 一年来没什么提高。</p>
<p>==========</p>
<p>现在的核心问题不是HTML5和CSS3支持的如何的问题，而是CSS2真正支持完善的问题。只要CSS2真正支持完善了，就已经进步相当大一步了。 HTML 5和CSS3 的很多特性，是好东西，但是远非CSS 2那么重要。边际效用递减，一顿饭吃的第3个馒头的重要性，远低于第2个馒头。</p>
<p>==========</p>
<p>对于前端开发人员，重要的是了解各种浏览器支持的各种特性集合的“最大公约数”，这就是你能放心使用的所有特性。其他的只能视而不见。</p>
<p>==========</p>
<p>让中国人民升级浏览器，看来最靠靠谱的是网页游戏，如果出现基于HTML5的超级流行的游戏，没准可以使中国的浏览器迅速升级，那就太好了。</p>
<p>==========</p>
<p>以上文字系我发表在新浪微博上的微博。也欢迎您在新浪微博和我联系：<a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a></p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110318.from-micro-blog-2-about-browsers.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>朝花夕拾第一篇：题解</title>
		<link>http://learning.artech.cn/20110318.micro-blog-1-why-the-title.html</link>
		<comments>http://learning.artech.cn/20110318.micro-blog-1-why-the-title.html#comments</comments>
		<pubDate>Fri, 18 Mar 2011 08:06:34 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[朝花夕拾]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110318.micro-blog-1-why-the-title.html</guid>
		<description><![CDATA[从去年底开始上新浪微博，体验了一下这个据说很流行的东西，结果发现确实挺好玩。总体来说，普通人在微博上主要关注两类人，一类是生活中的朋友，一类是明人（包括你关心的某个领域... ]]></description>
			<content:encoded><![CDATA[<p>从去年底开始上新浪微博，体验了一下这个据说很流行的东西，结果发现确实挺好玩。总体来说，普通人在微博上主要关注两类人，一类是生活中的朋友，一类是明人（包括你关心的某个领域的名人）。微博最大的特点就是一个字“快”。</p>
<p>我这两个多月，也发了几百条微博，但是感觉到“快”固然好。但是也带来一个问题，微博滚动特别快，一下子就被淹没了，没有积累，连自己都不记得了。</p>
<p>我觉得如果有一个方法能把微博上发的一些心得体会，转到网站上来，就便于查找得多。本想寻找一下是否已经有这类的基于新浪微博API的应用，但是没找到。自己写一个应该也不麻烦，但是没有时间了。因此，看来只能用笨办法，自己手工转贴了~~~ 看看能不能以后出现这样的应用，或者有空自己写一个。</p>
<p>我以往写的文章大多是长篇大论，以后这类把发表在微博上的文字摘过来的文章，肯定是很像短小的，我想也不错。因此决定在这里新开一个文章系列，起一个名字叫做“朝花夕拾”，没有考证过这个词的来源，我只知道我第一次看到这个词是初中一年级，语文课学习鲁迅的《从百草园到三味书屋》里有这个词，现在已经完全忘记了这篇文章的其他内容，但是这个词却印象很深。</p>
<p>好了，希望这些短小的文字除了能帮我做个记录，还能对您也有一些启发。这些文字中的想法可能都不是很成熟，也欢迎您的意见和指正。</p>
<p>也欢迎您在新浪微博和我联系：<a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110318.micro-blog-1-why-the-title.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>.Net Web 开发研习(7) —— 学习编程实践之“文件压缩”</title>
		<link>http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html</link>
		<comments>http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html#comments</comments>
		<pubDate>Tue, 15 Mar 2011 15:32:03 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[.NET Web 开发研习]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html</guid>
		<description><![CDATA[这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。
0. 写书计划，欢迎大家提建议
1. Web开发的“十事要说” 
2. 关于学习C#语言的几个... ]]></description>
			<content:encoded><![CDATA[<div  style="width:240px;float:right; border:1px solid #ccc;padding:0 10px;margin:00px 0 10px 10px;">
<p><strong>这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。</strong></p>
<p><a target="_blank" href="http://learning.artech.cn/20110128.new-book.html">0. 写书计划，欢迎大家提建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html">1. Web开发的“十事要说” </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html">2. 关于学习C#语言的几个建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html">3. 技术平台选择，兼谈.Net 与微软</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html">4. 语言与框架 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html">5. ORM(对象关系映射)</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html">6. 学习编程实践之“五子棋”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html">7. 学习编程实践之“文件压缩”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html">8. 美国名校计算机系如何教C#</a></p>
<p>不断添加中……</p>
</div>
<p>在上次的文章里，讨论了编写一个五子棋程序的基本思路。下面再举一个编程实践的题目。可以分为两步走，第一步是很简单的，每一个学习过《数据结构》的读者都可以完成，第二步复杂一些，但是也是可以完成的任务。</p>
<p>所有用过的电脑的人，都离不开“压缩”这两个字。你有没有考虑过，是如何实现这么神奇的功能的？你有没有想过自己也写一个WinZip、WinRar这样的压缩文件的程序？其实你完全有这个能力。</p>
<p>所以今天给学习编程的读者提出的实践题目是“文件压缩”，当然也包括解压。在介绍编写文件压缩和解压这篇文章里，我们还将介绍三个人，都是计算机科学和软件界响当当的人物。</p>
<h3>基础</h3>
<p>其实在我们日常生活中，用到的“压缩”有两大类。</p>
<p>1）无损压缩 —— 在文件压缩中，使用的就是无损压缩，也就是说压缩以后的文件还可以恢复为原来的文件，而且一个字节都不差。这样的压缩没有损失任何有用的信息，因此叫做无损压缩。</p>
<p>2）有损压缩 —— 在图像压缩中，经常用到这类压缩，比如最常用Jpeg格式的图像，如果用图像编辑软件，可以把文件的大小缩小很多，而我们肉眼看起来，图像质量没有明显变化，但实际上，图像质量还是下降了，而且一旦压缩以后，就无法在恢复原来的清晰度了。这样的压缩就损失了有用的信息，视觉感觉不很明显，文件的大小却可大幅度减小，因此也是十分有用的。这样的压缩就叫做“有损压缩”。</p>
<p>我们今天要讨论的是第一类压缩，即“无损压缩”，这类程序要完成“压缩”和“解压”两个功能。</p>
<h3>香农与信息论</h3>
<p><img style="float:right;margin:0 5px 5px 5px;" width="110"  src='http://learning.artech.cn/wp-content/uploads/2011/03/shannon.jpg' alt='shannon.jpg' />第一个历史人物出场 ——  克劳德·香农(Claude Elwood Shannon，1916-2001)。这位美国科学家在20世纪40年代，开创了信息论，用数学方式科学地定义了信息的各种相关概念。1948年的论文《A Mathematical Theory of Communication 》，被认为是其标志。信息论和系统论、控制论一起，被称为系统科学的“老三论”，对应于后来的“新三论”，即耗散结构论、协同论和突变论。</p>
<p>香农的信息论中，借用热力学的概念“熵”来度量信息，定义了“信息熵”的概念。我们这里不进行正规严格的介绍了，通常在大学本科的相关专业会有一些课程进行介绍。我们这里为了便于大家理解，简单地介绍一下，因为它是压缩软件能够存在理论基础。</p>
<p>简单举个例子，有两本书放在我们面前，我们如何评价两本书的信息量？假设一本书是《红楼梦》，另一本书很特殊，他的内容只有一句话，但是重复印刷了1万次。那么即使两本书印刷的字数是相同的，我们也认为前者的信息量要远远大于后者，因为后者相当于只有一句话，其它的都是重复，没有价值，被称为“冗余”。这是一个极端的例子，但是说明了压缩的基础就是存在“冗余”，压缩的目的就是消除掉“冗余”，这样既保证了信息没有损失，又减小了体积，在解压时，把这些“冗余”在恢复即可。</p>
<p>正如计算机的出现，必须在一系列数学家（图灵、冯诺依曼等）把计算机的理论模型分析清楚之后，才有可能一样。香农的研究，把这些问题的基础研究清楚，这样才有可能实际做出很多实际应用。当然，数据压缩仅仅是它的应用中非常非常小的一个，但是每天都被我们应用，并且它很容易被我们理解。</p>
<p>顺便可以提一句的是，大家都知道CD音质的采样频率是44.1KHz，但是你考虑过为什么是这个数字吗？首先为什么是40多KHz？而不是10KHz或400多KHz？这也跟香农的一个研究有密切的关系，“香农采样定理”说的是：为了不失真地恢复模拟信号，采样频率必须不小于模拟信号频谱中最高频率的2倍。 声音是模拟信号，声音的数字化就是通过采样实现的，根据香农的这个定理，采样频率不能小于声音的最高频率的2倍，而人耳可以听到的声音的频率范围是20Hz到20KHz，因此要能够不失真地恢复人耳能够听到的声音，就不应该低于40KHz。而至于为什么是有零有整的44.1呢？实际上在音频工业界，早期存在不同的方案和标准，最后逐渐统一到了44.1，至于44.1是如何来的，<a target="_blank" href="http://www.cs.columbia.edu/~hgs/audio/44.1.html">有不少文章做了介绍</a>，我这里就不再介绍了。</p>
<h3>哈夫曼编码</h3>
<p><img  style="float:right;margin:0 5px 5px 5px;"  src='http://learning.artech.cn/wp-content/uploads/2011/03/huffman.jpg' alt='huffman.jpg' />下面，第二个历史人物出场 —— 戴维·哈夫曼 (David A. Huffman, 1925–1999)。香农在提出了信息论的原理同时，和他在MIT的同事 Fano 一起，提出了一个编码方式，对通信中的数据进行编码，称为 Shannon-Fano 编码。 但这个成果很快就被 Fano 的一名学生超越了，他就是哈夫曼。而有趣的是，哈夫曼提出的这种后来被称为“哈夫曼编码”的编码方法，仅仅是为了避免一门课程的考试而写的一篇小论文。就是这篇在他学生时代的小论文，让他成为了一名著名的科学家，并且写进了无数的教科书中。</p>
<p>下面来简单介绍一下哈夫曼编码的原理，实际上每一本《数据结构》的教科书，在“树”这样一章，都有对哈夫曼树以及哈夫曼编码的介绍。其基本原理就是，在一段信息中，不同的字符出现的频率是不一样的，比如英文中，字母e出现的频率最高，而字母 z 出现的频率就低得多。那么如果各种字母都占用一个字节的保存，就浪费了很多空间。如果可以让出现越多的字母占用的空间越小，比如e这个字母就只占1个bit（编码前，各种字母都是占一个字节，8bit），字母出现少的字母占用的空间多，那么总的空间就会小很多，从而就实现了“压缩”的目的。大家可以找任何一本《数据结构》教科书，找到具体的讲解和详细的算法说明。</p>
<p>现在终于说到你需要动手编写的程序了。第一步，你可以编写一个用哈夫曼编码实现的压缩和解压软件。实际上这个题目正是我大二学习完数据结构以后，老师布置的课程设计（就是两周时间的一个大作业）的题目，我觉得挺有意思。 如果你很快地就完成了，你可以再仔细考虑一下，如何提高程序的性能，比如同样大小的一个文件，你能否让压缩和解压的实践更短一些？如果你可以分析一下，算法中，时间是如何分配的，你又是如何优化的，那么你的收获将会是巨大的。</p>
<h3>PK与Zip压缩算法</h3>
<p><img style="float:right;margin:0 5px 5px 5px;" src='http://learning.artech.cn/wp-content/uploads/2011/03/phil-kats.jpg' alt='phil-kats.jpg' />在中国，由于版权意识不够，所以Rar格式的压缩文件用的较多，但是在世界范围内，绝对是Zip格式的压缩软件占绝对的比例。每个Zip格式的文件的开头两个字母都是PK。这就来自于下面出场的第三个历史人物 —— 菲尔·卡茨 Phil Katz, 1962－2000) 。可以看到，1962年出生的他本来完全不应该成为历史人物，但是已经早早地离开了这个世界，他的命运令人唏嘘。他发明了Zip软件和Zip文件格式。</p>
<p>我们先来简单介绍一下Zip压缩的基本原理。哈夫曼的算法，考虑的是核心是不同字节（字符）出现的频率的不同带来的冗余，通过消除这种冗余实现了信息的压缩。Phil Katz 的算法则考虑了另外一种冗余 —— 短语带来的冗余。</p>
<p>比如英语中，the 这三个字母连在一起，出现的频率非常高，ese 这三个三字母连在一起，也是比较经常的，它们都占用了3个字节，假设我们有办法用两个字节来代替这三个字节，就可以实现数据的压缩。别小看这1个字节的缩小，但是带来了本质的变化。进一步，我们可以考虑，在一段有意义的文字中，有很多重复的短语，这都造成了信息的冗余，如果我们消除这些由于短语重复带来的冗余，就可以实现对信息的压缩。也就是说，一段纯随机的字母组成的段落，用这种方法压缩是无效的。但是实际上，我们生活中用到的文件，基本上都是有意义的，而非随机的。除了文本之外，比如一个图像，按像素排列，也存在着大量重复的样式，都是可以大幅度压缩的冗余。</p>
<p>在经典的Zip压缩算法中，使用一种称为“滑动窗口”的算法。在编码过程中，随时检查是否出现出现了重复的短语，一旦发现出现了重复的短语，就用这个短语的长度和到当前位置的距离两个数值代替这个短语，这样就可以实现压缩了。</p>
<p>而理论已经证明，世界上只存在上面说的这两种方法，即字节编码和短语编码，可以实现无损压缩。在Zip的压缩中，首先使用短语编码，压缩一次，然后再使用哈夫曼编码压缩一次。</p>
<p>当然，具体要实现一个Zip算法还是有许多问题要解决的，希望读者仔细到网上搜索一下相关的资料。此外，要实现高效的算法，需要更多地技巧。网上有不少文章介绍，都很有帮助。如果读者有兴趣，可以把Zip算法实现出来，虽然可能不是那么精致完善，压所的效率（空间和时间两方面）没有那么高，但是我想，写这么一个程序你对自己的写程序的帮助一定会非常巨大。</p>
<p>说起Phil Katz，他是一个非常有性格的程序员，他坚持自己的理想，坚持使用自由软件的方式发布自己的软件，拒绝与商业公司合作，并与商业软件公司对抗，很不幸的是他年仅37岁，因酗酒死于一家汽车旅馆。如果感兴趣，<a target="blank" href="http://article.yeeyan.org/view/35697/15166">可以看一下这篇文章</a>，算是一篇纪实文学，尽管里面唯一句涉及Zip算法的话，原文或者翻译的是不准确的，但是这篇文章还是很有意思的。</p>
<p>现在几乎全世界的每一台PC上都有用Phil创造的压缩算法生成的文档。现在虽然他的生活并不算成功，但是所有ZIP格式的文档的最开头，都嵌有他姓名的字头缩写“PK”两个字母，也算是他的生命走遍了世界这个世界的各个角落吧。</p>
<p>希望我的文章对您有所帮助。</p>
<p>您可以到新浪微博联系我：   <a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a> 。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>.Net Web 开发研习(6) —— 学习编程实践之“五子棋”</title>
		<link>http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html</link>
		<comments>http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html#comments</comments>
		<pubDate>Fri, 11 Mar 2011 07:48:10 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[.NET Web 开发研习]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html</guid>
		<description><![CDATA[这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。
0. 写书计划，欢迎大家提建议
1. Web开发的“十事要说” 
2. 关于学习C#语言的几个... ]]></description>
			<content:encoded><![CDATA[<div  style="width:240px;float:right; border:1px solid #ccc;padding:0 10px;margin:00px 0 10px 10px;">
<p><strong>这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。</strong></p>
<p><a target="_blank" href="http://learning.artech.cn/20110128.new-book.html">0. 写书计划，欢迎大家提建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html">1. Web开发的“十事要说” </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html">2. 关于学习C#语言的几个建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html">3. 技术平台选择，兼谈.Net 与微软</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html">4. 语言与框架 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html">5. ORM(对象关系映射)</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html">6. 学习编程实践之“五子棋”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html">7. 学习编程实践之“文件压缩”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html">8. 美国名校计算机系如何教C#</a></p>
<p>不断添加中……</p>
</div>
<p>在前几天的文章里谈了如何学习C#语言，实际上学习任何语言都具有相当大的共性。最重要的一点就是必须实践，真正用某个语言写一个有定规模的程序。</p>
<p>在那篇文章的末尾，我给出几个选题建议，如果你正在学习某种语言（什么语言都可以），以下可以作为实践题目，自己来写一个程序：</p>
<p>1）写一个能够和人对弈的五子棋程序，看看你的程序下棋的水平能到达什么程度。</p>
<p>2）用面向对象的思想，写一个电梯运行的模拟程序。</p>
<p>3）研究压缩算法，写一个文件压缩和还原程序。例如最简单的，你可以研究一下哈夫曼算法，然后以此为基础，你可以找到很多压缩算，都可以综合在一起，实践一下。</p>
<p>下面分别解释一下这三个题目。今天说第一个，另外两个以后说。</p>
<h3>  五子棋 </h3>
<p>1998年我本科的毕业设计，指导教师研究的领域是人工智能，给我们的题目是写一个能够下围棋的程序。</p>
<p>不过我当时研究了一下之后，感觉这个题目实在太大了，对于博弈程序，核心是两个方面，一个是搜索的基本算法，另一个是对博弈的实际游戏（比如围棋、象棋）的理解。也就是说，如果写围棋程序，就得懂围棋。对于一个本科生来说，写一个博弈程序，能做的就是两件事，第一是搭出一个相对完善的基于搜索的算法，第二是给出对于棋局的形势，给出一个不完全离谱的估值函数。两个方面缺一不可，否则无法实现有意义的自动对弈。搜索算法，对于棋的类型相差不多；但是对于棋局形势的判断，各种棋类就相差很多了。大家都知道，围棋是最复杂的棋种，棋盘特别大，一盘棋的步数非常多，开始的阶段的很多步，都不是搏杀性质的，二是大形势的布局，这样计算对于编写算法来说，非常困难。</p>
<p>于是我就跟老师申请，要求改成五子棋，这样对棋局形势的估计就简单多了，比如一个“双活三”的形态是赢棋，一个“活三”比“活二”的价值更大。从而可以更专心在搜索算法的实现上夺下一些功夫。老师不同意，说五子棋太简单没意思。最后折中了一下，做了一个中国象棋的程序。中国象棋比围棋确实简单一些，而且能够较快地进入搏杀阶段，这样搜索算法就能派上用场。对于布局阶段，搜索算法基本没有作用，比如你是用“当头炮”开局，还是“仙人指路”开局，是没法评价孰优孰劣的。只有到进入到一定阶段以后，开始搏杀，搜索算法才能派上用场。因此，我就在开始阶段，事先准备好一些开局定势，不用搜索，直接用定式走开局的若干步。然后到了一定步数以后再开始使用搜索算法来计算下一步棋的走法。</p>
<p>最终的效果还不错，最后这个毕业论文得了95分。回头来看，做这个程序，其实还是收获挺多的。但是有一点小小的遗憾，一个本科生，2、3个月的时间，写一个象棋的博弈程序，其实还是太困难了，如果当时能使用五子棋作为题目，效果会更好一些，因为估值函数简单，可以更多地探讨一下搜索算方面的问题。事实上，国际国际上早期的人工智能领域的研究者，在研究波一问题的时候，开始选择的也是特别简单的跳棋程序。其实我的整个毕业设计的程序的算法，没有超出陆汝钤编写的《人工智能》上册中的讲解的搜索算法。不过很遗憾，我做的那个程序没有保存下来，现在也没有了。</p>
<p>总体来说，要编写一个自动博弈的程序，最好先看一本人工智能的教课书（比如陆汝钤编写的《人工智能》上册就很好），里面一般都会有关于博弈问题的讲解。了解一些基本的概念之后，掌握几种基本的搜索算法，从简单的博弈树开始，增加一些剪枝和启发技术，这些算法都不是很复杂。而五子棋的估值函数就很简单了，比如活三冲四、直四的都是杀招，依次排列，情况并不太多，分别赋一个适当的分值即可。</p>
<p>此外，我找到了一篇荷兰 Louis Victor Allis 博士的博士论文：“Searching for Solutions in Games and Articial Intelligence”（《在博弈和人工智能中对解的搜索》），里面讨论了好几种棋类的博弈算法，并给出了很多性能分析。非常实用的是给出了一个五子棋的非常有效的算法，把普通的博弈树转化成搜索树进行求解。我试验了一下，非常好用。2010年春节假期，我花了几天根据这篇论文的算法，写了一个小程序，我用一些五子棋网站上给出的五子棋题目进行试验，效果非常好。很多需要十几步甚至几十步的解，都能非常快的计算出来。</p>
<p>因此，这个题目实际上还是很有意思的，需要对数据结构有所了解，在此基础上对人工智能有所了解，《数据结构》+ 陆汝钤的《人工智能》上册 + 某一种高级语言，基本刹功能就可以做出一个可以下的五子棋程序了。如果希望程序的棋力在高一些，可以参考我上面提到的“Searching for Solutions in Games and Articial Intelligence”这篇博士论文的第5章。</p>
<p>如果有做出来的，可以和我联系，让我也跟你的程序下一下哦。</p>
<p>如果大家感兴趣，又觉得自己做起来比较困难，我也可以考虑是否可以写一本C#开发实践的书，就已这几个小项目为案例，深入的讲解一下。大家也可以给点建议和意见？</p>
<p>顺便提一句，这位 Louis Victor Allis 博士1994年博士毕业以后，1997年创建了一家软件公司，利用人工智能和算法上的技术优势，从事物流和排程相关的软件研发。现在这家公司已经使跨国企业了，在中国也有业务，中国的总部在上海。这是一个很好利用自己的技术创业的榜样。</p>
<p>好了，今天就介绍到这里，下次再介绍另外的题目。也都是很有意思的题目，学习完一门语言之后，作为实践，会对掌握这门语言有很大帮助。</p>
<p>希望我的文章对您有所帮助。</p>
<p>您可以到新浪微博联系我：   <a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a> 。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>.Net Web 开发研习(5) —— ORM(对象关系映射)</title>
		<link>http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html</link>
		<comments>http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html#comments</comments>
		<pubDate>Wed, 02 Mar 2011 03:57:18 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[.NET Web 开发研习]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110302.dot-net.html</guid>
		<description><![CDATA[这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。
0. 写书计划，欢迎大家提建议
1. Web开发的“十事要说” 
2. 关于学习C#语言的几个... ]]></description>
			<content:encoded><![CDATA[<div  style="width:240px;float:right; border:1px solid #ccc;padding:0 10px;margin:00px 0 10px 10px;">
<p><strong>这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。</strong></p>
<p><a target="_blank" href="http://learning.artech.cn/20110128.new-book.html">0. 写书计划，欢迎大家提建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html">1. Web开发的“十事要说” </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html">2. 关于学习C#语言的几个建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html">3. 技术平台选择，兼谈.Net 与微软</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html">4. 语言与框架 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html">5. ORM(对象关系映射)</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html">6. 学习编程实践之“五子棋”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html">7. 学习编程实践之“文件压缩”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html">8. 美国名校计算机系如何教C#</a></p>
<p>不断添加中……</p>
</div>
<p>在上一篇文章中，介绍了“框架”这个概念。在实际工作中，会用到各种各样的框架，今天介绍的是一类非常重要的框架 —— ORM。ORM的全称是 Object-Relational Mapping，即“对象-关系映射”。本文就来介绍一下ORM的概念以及它的具体作用。首先从基础的知识开始说起。</p>
<h3>CRUD —— 增、删、改、查</h3>
<p>对于绝大多数Web系统或者信息系统系统的开发，或者说信息系统开发中的大多数任务，从原理来说并不复杂。这种开发又有一个名称叫做“CRUD”开发。CRUD就是信息系统中最常见的4种操作“Create / Read / Update / Delete”—— 创建、读取、更新和删除这4种操作。</p>
<p>例如，我们要开发一个BBS论坛，那么显然我们操作的对象是“帖子”，我开发的系统必须要能够实现“发贴（Create）”、“浏览（Read）帖子”、“编辑（Update）帖子”以及“删除（Delete）帖子”这几个基本操作。</p>
<p>事实上，如果仔细想一下，你所使用的各种系统，都是这4个操作，不同的系统的区别就是CRUD操作的对象和规则不同。比如一个博客系统的CRUD的对象是文章、一个网上商店系统，CRUD的对象就更复杂一些，包括各种商品、订单等等对象。但是无论这些对象是什么，归根到底要做的，总体上就是CRUD这4个操作，通常也称为“增删改查”操作。</p>
<p>&#8220;增删改查&#8221;是4种操作，那么这些操作的对象是什么呢？就是各种数据，比如论坛系统中的帖子、网上商店中的商品和订单等等，那么数据在哪里呢？在两个地方 —— “内存”和“数据库”：大多数时间，数据就存储在数据库里，静止不动；而在需要对数据进行操作的时候，就把数据读入到内存中，操作完以后，在存回数据库。因此，下面就来谈谈“数据库”。</p>
<h3>数据库与关系模型</h3>
<p>计算机最初的主要用途是计算，被称为计算机之父的冯诺依曼，在上世纪40年代，投入很大精力研制计算机，目的就是为了给研制原子弹的曼哈顿计划提供计算工具。随后，计算机的用途逐渐转向事务处理，也就是处理和存储大量的数据，例如IBM一直是计算机领域的先锋。事实上IBM在计算机发明之前很多年，就开始长期为美国政府、保险公司等大型机构提供打孔机等商用机器，在计算机出现以后，IBM的第二代领导人敏锐地意识到了计算机将会给整个社会带来的巨大影响，成功地实现了向计算机业务的转型。为了更有效地处理和存储数据，科学界也经过了好几个阶段的探索，其间提出了若干不同的数学模型，最终以“关系代数”为理论基础的“关系数据库”成为了数据存储方案的主流模型。</p>
<p>1970年，IBM的研究员，有“关系数据库之父”之称的 Edgar Codd 博士发表了题为“大型共享数据库的关系模型”的论文，文中首次提出了数据库的关系模型的概念，奠定了关系模型的理论基础。在随后的几十年里，关系数据库日益成熟。今天常用的数据库管理系统，包括 Orcale、SQL server、Access 等等，都是“关系数据库”的产品。</p>
<p>关系数据库的核心，就是通过一系列的范式理论描述的“关系模型”，这个模型的形式化描述，并非几句话可以说清。对于没有在课堂上完整学习过“数据库”这门课程的读者，建议找一本大学教材，细细地读一读，会对背后的原理有更深入的理解。</p>
<p>这里只能简单地解释一下。在“关系模型”中，用一个多元组描述一个实体对象：所谓多元组，就是（x, y, z）这样的形式。例如，描述一个人，可以用（张三， 男，65kg， 1.75m）这样一个多元组来表示。每一个“元”表示的是这个人的某一个“属性”。如果需要表示一群人的集合，就把一系列的同样形式的多元组竖直方向摞起来，形成一个二维表格，每一行表示一个人。这就是关系数据库的基本模型。一个数据库，就是由很多个这样的表组成的。例如下面的示例表示了这样的一个表。</p>
<p style="text-indent:0; border:1px solid #ccc">
（张三， 男，65kg， 1.75m）<br />
（李四， 女，60kg， 1.65m）<br />
（王五， 女，55kg， 1.55m）<br />
（赵六， 男，75kg， 1.85m）
</p>
<p>为了方便在程序中操作数据库中的数据，1974 年由 Boyce 和 Chamberlin 和提出了 SQL（SQL(Structured Query Language)，即“结构化查询语言”。SQL 是一个通用的、功能极强的关系数据库语言。配合关系数据库，SQL发挥巨大的作用，时至今日，SQL也是每一个程序员都必须要掌握的一门语言。通过 SQL 可以方便地完成在数据库中增删改查数据的任务。</p>
<h3>“对象模型”Vs“关系模型”</h3>
<p>由于信息系统的数据最终都是存储在数据库中，因此我们在写程序的时候，最终任务就是通过使用 SQL 来进行 CRUD 操作。对于一些十分简单的系统，通常是我们首先建立好数据库中的各个数据表，然后在程序中嵌入 SQL 语句，需要浏览数据库中的内容时，就是用 SQL 中的查询语句，读取出内容，然后再通过不同的语言显示在界面上。比如如果用 VB 或者 Delphi，就可以把结果显示在 Windows 窗口中；如果使用 ASP.NET，就可以把数据显示在浏览器的 HTML 页面中。</p>
<p>上面的方法简称为“数据库驱动开发”，是以数据库操作为核心的。事实上即使到现在，仍然有大量的系统使用这种方式开发。然而这种开发方法存在着比较严重的问题，对于开发稍微大一些的系统，容易潜藏很多问题。核心的问题在于，数据库管理系统使用的是“关系模型”，这种模型非常适合存储数据，但并不适合表达“业务逻辑”，因为它不是为表达通用逻辑设计的。</p>
<p>我们在开发信息系统中使用的语言，例如C#、Java、PHP等等都是流行的通用语言，他们都非常适合表达复杂的业务逻辑。他们使用的都是“对象模型”。学习过一点任何面向对象语言的读者都很熟悉如何表达一个对象。</p>
<p>例如，表达一个人的概念，用C#语言是这样的：</p>
<p><!-- Start block. Created with Code4Blog for Microsoft Visual Studio 2010. Copyright (c)2010 Vitaly Zayko http://zayko.net --></p>
<div style="color:black;overflow:auto;width:99.5%; border:1px solid #ccc">
<pre style="margin:0em;"> <span style="color:#0000ff">class</span><span style="color:#000000">  <span style="color:#2b91af">person</span><span style="color:#000000"> </pre>
<pre style="margin:0em;"> <span style="color:#000000">{</span></pre>
<pre style="margin:0em;">     <span style="color:#0000ff">public</span><span style="color:#000000">  <span style="color:#0000ff">string</span><span style="color:#000000">  Name <span style="color:#000000">{</span> <span style="color:#0000ff">get</span><span style="color:#000000"> ; <span style="color:#0000ff">set</span><span style="color:#000000"> ; <span style="color:#000000">}</span></pre>
<pre style="margin:0em;">     <span style="color:#0000ff">public</span><span style="color:#000000">  <span style="color:#0000ff">int</span><span style="color:#000000">  Weight <span style="color:#000000">{</span> <span style="color:#0000ff">get</span><span style="color:#000000"> ; <span style="color:#0000ff">set</span><span style="color:#000000"> ; <span style="color:#000000">}</span></pre>
<pre style="margin:0em;">     <span style="color:#0000ff">public</span><span style="color:#000000">  <span style="color:#0000ff">float</span><span style="color:#000000">  Height <span style="color:#000000">{</span> <span style="color:#0000ff">get</span><span style="color:#000000"> ; <span style="color:#0000ff">set</span><span style="color:#000000"> ; <span style="color:#000000">}</span></pre>
<pre style="margin:0em;"> <span style="color:#000000">}</span></pre>
</div>
<p>和我们刚才看到的，在数据库中，描述一个人的多元组模式，似乎差不太多。但是当两个对象之间有联系时，二者的区别就大了。</p>
<p>例如，在一个学籍管理系统中，一个学生需要选修若干门课程。为了表达“学生”和“课程”挣两个实体概念，以及二者之间的关系。在关系模型，也就是数据库中，是这样描述的：</p>
<p style="text-indent:0; border:1px solid #ccc">
（张三， 男，65kg， 1.75m）<br />
（李四， 女，60kg， 1.65m）<br />
（王五， 女，55kg， 1.55m）<br />
（赵六， 男，75kg， 1.85m）
</p>
<p style="text-indent:0; border:1px solid #ccc">
（数据结构，4学分，王可教授）<br />
（C++入门，3学生，周翔教授）<br />
（数字逻辑，2学分，俞山教授）
</p>
<p style="text-indent:0; border:1px solid #ccc">
（张三，数据结构）<br />
（李四，数据结构）<br />
（张三，数字逻辑）<br />
（张三，C++入门）<br />
（李四，数字逻辑）<br />
（王五，C++入门）
</p>
<p>可以看到，一共使用了三张“表格”，第一个表格记录了学生的集合，第二个表格记录了课程的集合，第三个表格记录了“选课”的集合。可以看到，一个学生可以选修多门课程，例如张三选修课了3门课程，李四选修了两门课程，同时以门课程也可以有多个人选修，例如上面显示的三门课程分别由两个人选修。这种关系在称为“多对多”关系。对应的，另一种常见的关系是“一对多”关系，例如学生“分班”，通常是一对多关系，一个学生只能属于一个班级，一个班级有多名学生。</p>
<p>而上面这个例子，如果在C#或Java这样的语言中，使用对象模型，又该如何描述呢？</p>
<p><!-- Start block. Created with Code4Blog for Microsoft Visual Studio 2010. Copyright (c)2010 Vitaly Zayko http://zayko.net --></p>
<div style="color:black;overflow:auto;width:99.5%;border:1px solid #ccc">
<pre style="margin:0em;"> <span style="color:#0000ff">class</span><span style="color:#000000">  <span style="color:#2b91af">Course</span><span style="color:#000000"> </pre>
<pre style="margin:0em;"> <span style="color:#000000">{</span></pre>
<pre style="margin:0em;">     <span style="color:#0000ff">public</span><span style="color:#000000">  <span style="color:#0000ff">string</span><span style="color:#000000">  Title <span style="color:#000000">{</span> <span style="color:#0000ff">get</span><span style="color:#000000"> ; <span style="color:#0000ff">set</span><span style="color:#000000"> ; <span style="color:#000000">}</span></pre>
<pre style="margin:0em;">     <span style="color:#0000ff">public</span><span style="color:#000000">  <span style="color:#0000ff">string</span><span style="color:#000000">  Credits <span style="color:#000000">{</span> <span style="color:#0000ff">get</span><span style="color:#000000"> ; <span style="color:#0000ff">set</span><span style="color:#000000"> ; <span style="color:#000000">}</span></pre>
<pre style="margin:0em;">     <span style="color:#0000ff">public</span><span style="color:#000000">  <span style="color:#0000ff">string</span><span style="color:#000000">  Teacher <span style="color:#000000">{</span> <span style="color:#0000ff">get</span><span style="color:#000000"> ; <span style="color:#0000ff">set</span><span style="color:#000000"> ; <span style="color:#000000">}</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;">     <span style="color:#0000ff">public</span><span style="color:#000000">  Student[] Students <span style="color:#000000">{</span> <span style="color:#0000ff">get</span><span style="color:#000000"> ; <span style="color:#0000ff">set</span><span style="color:#000000"> ; <span style="color:#000000">}</span></pre>
<pre style="margin:0em;"> <span style="color:#000000">}</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#0000ff">class</span><span style="color:#000000">  <span style="color:#2b91af">Student</span><span style="color:#000000"> </pre>
<pre style="margin:0em;"> <span style="color:#000000">{</span></pre>
<pre style="margin:0em;">     <span style="color:#0000ff">public</span><span style="color:#000000">  <span style="color:#0000ff">string</span><span style="color:#000000">  Name <span style="color:#000000">{</span> <span style="color:#0000ff">get</span><span style="color:#000000"> ; <span style="color:#0000ff">set</span><span style="color:#000000"> ; <span style="color:#000000">}</span></pre>
<pre style="margin:0em;">     <span style="color:#0000ff">public</span><span style="color:#000000">  <span style="color:#0000ff">string</span><span style="color:#000000">  Sex <span style="color:#000000">{</span> <span style="color:#0000ff">get</span><span style="color:#000000"> ; <span style="color:#0000ff">set</span><span style="color:#000000"> ; <span style="color:#000000">}</span></pre>
<pre style="margin:0em;">     <span style="color:#0000ff">public</span><span style="color:#000000">  <span style="color:#0000ff">float</span><span style="color:#000000">  Weight <span style="color:#000000">{</span> <span style="color:#0000ff">get</span><span style="color:#000000"> ; <span style="color:#0000ff">set</span><span style="color:#000000"> ; <span style="color:#000000">}</span></pre>
<pre style="margin:0em;">     <span style="color:#0000ff">public</span><span style="color:#000000">  <span style="color:#0000ff">float</span><span style="color:#000000">  Height <span style="color:#000000">{</span> <span style="color:#0000ff">get</span><span style="color:#000000"> ; <span style="color:#0000ff">set</span><span style="color:#000000"> ; <span style="color:#000000">}</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;">     <span style="color:#0000ff">public</span><span style="color:#000000">  Course[] Courses <span style="color:#000000">{</span> <span style="color:#0000ff">get</span><span style="color:#000000"> ; <span style="color:#0000ff">set</span><span style="color:#000000"> ; <span style="color:#000000">}</span></pre>
<pre style="margin:0em;"> <span style="color:#000000">}</span></pre>
</div>
<p>可以看到，定义了两个类，在“课程”这个类中，有一个“学生”字段，用一个数组记录了选修改课程的若干学生，同理，在“学生”类中，有一个“课程”字段，用一个数组字段，记录了这个学生选修的若干课程。</p>
<p>而在访问数据时，二者的差异就更大了：</p>
<p>如果使用数据库的关系模型，也就是使用 SQL 语言，查询选修了&#8221;数据结构&#8221;课程的学生姓名，需要使用连接语句：</p>
<p><!-- Start block. Created with Code4Blog for Microsoft Visual Studio 2010. Copyright (c)2010 Vitaly Zayko http://zayko.net --></p>
<div style="color:black;overflow:auto;width:99.5%; border:1px solid #ccc">
<pre style="margin:0em;"> <span style="color:#0000ff">SELECT</span><span style="color:#000000">  <span style="color:#008080">Student<span style="color:#808080">.<span style="color:#008080">Name</span><span style="color:#000000"> </pre>
<pre style="margin:0em;"> <span style="color:#0000ff">FROM</span><span style="color:#000000">  <span style="color:#008080">Student</span><span style="color:#000000">  </pre>
<pre style="margin:0em;"> <span style="color:#808080">JOIN</span><span style="color:#000000">  <span style="color:#008080">StudentCourse</span><span style="color:#000000">  <span style="color:#0000ff">ON</span><span style="color:#000000">  <span style="color:#008080">Student<span style="color:#808080">.<span style="color:#008080">Name</span><span style="color:#000000">  <span style="color:#808080">=</span><span style="color:#000000">  <span style="color:#008080">StudentCourse<span style="color:#808080">.<span style="color:#008080">StudentName</span><span style="color:#000000"> </pre>
<pre style="margin:0em;"> <span style="color:#808080">JOIN</span><span style="color:#000000">  <span style="color:#008080">Course</span><span style="color:#000000">  <span style="color:#0000ff">ON</span><span style="color:#000000">  <span style="color:#008080">Course<span style="color:#808080">.<span style="color:#008080">Title</span><span style="color:#000000">  <span style="color:#808080">=</span><span style="color:#000000">  <span style="color:#008080">StudentCourse<span style="color:#808080">.<span style="color:#008080">CourseTitle</span><span style="color:#000000"> </pre>
<pre style="margin:0em;"> <span style="color:#0000ff">WHERE</span><span style="color:#000000">  <span style="color:#008080">Course<span style="color:#808080">.<span style="color:#008080">Title</span><span style="color:#000000">  <span style="color:#808080">=</span><span style="color:#000000"><span>&#8216;数据结构&#8217;</span><span style="color:#000000"> </pre>
</div>
<p>上面的SQL语句中，把三个表连接起来，然后进行筛选，可以看到语句写起来还是相当麻烦的，而且这是一个最简单的结构，在实际系统中，情况还会复杂很多。</p>
<p>而如果使用对象模型，读取某一个学生选修的课程，简单地通过“点”语法就可以了：</p>
<p>例如 ZhangSan 是一个学生对象，那么 ZhangSan.Course[0].Teacher 就可以读取他选修的第1门课程的教师姓名了，这样和上面的SQL语句相比，就方便太多了。然而在开发系统的时候，二者都是必不可少的，因为就目前而言，数据库还离不开关系模型，因此在访问数据库时，我们就必须使用SQL语句。</p>
<h3>ORM</h3>
<p>为了解决数据库使用的关系模型和编程语言使用的对象模型之间的差异，“ORM”应运而生。使用ORM，可以尽可能地隐藏关系模型的复杂性，使开发人员能够方便地使用对象模型完成对数据库的操作。简单地时说，就是要尽可能地避免直接写SQL语句来实现各种对数据库的操作。也就是把使用C#、Java这样的通用编程语言编写的语句，映射，或者更直接地说叫做翻译，为相应的SQL语句。</p>
<p>例如，一段用C#语言写的代码如下：</p>
<p><!-- Start block. Created with Code4Blog for Microsoft Visual Studio 2010. Copyright (c)2010 Vitaly Zayko http://zayko.net --></p>
<div style="color:black;overflow:auto;width:99.5%; border:1px solid #ccc">
<pre style="margin:0em;"> <span style="color:#0000ff">var</span><span style="color:#000000">  custQuery = db.Customers.Where(c =&gt; c.City == <span style="color:#a31515">&quot;London&quot;</span><span style="color:#000000">  );</pre>
</div>
<p>这段代码中，在数据库的客户表中查找所有城市为London的客户。如果使用 Linq To SQL 这个ORM，将会自动生成下面的SQL语句：</p>
<div style="color:black;overflow:auto;width:99.5%; border:1px solid #ccc">
<pre style="margin:0em;"> <span style="color:#0000ff">SELECT</span><span style="color:#000000">  <span style="color:#008080">[t0]<span style="color:#808080">.<span style="color:#008080">[CustomerID]<span style="color:#808080">,</span><span style="color:#000000">  <span style="color:#008080">[t0]<span style="color:#808080">.<span style="color:#008080">[CompanyName]<span style="color:#808080">,</span><span style="color:#000000">  <span style="color:#008080">[t0]<span style="color:#808080">.<span style="color:#008080">[ContactName]<span style="color:#808080">,</span><span style="color:#000000">  <span style="color:#008080">[t0]<span style="color:#808080">.<span style="color:#008080">[ContactTitle]<span style="color:#808080">,</span><span style="color:#000000">  <span style="color:#008080">[t0]<span style="color:#808080">.<span style="color:#008080">[Phone]<span style="color:#808080">,</span><span style="color:#000000"> </pre>
<pre style="margin:0em;"> <span style="color:#008080">[t0]<span style="color:#808080">.<span style="color:#008080">[Address]<span style="color:#808080">,</span><span style="color:#000000">  <span style="color:#008080">[t0]<span style="color:#808080">.<span style="color:#008080">[City]<span style="color:#808080">,</span><span style="color:#000000">  <span style="color:#008080">[t0]<span style="color:#808080">.<span style="color:#008080">[Region]<span style="color:#808080">,</span><span style="color:#000000">  <span style="color:#008080">[t0]<span style="color:#808080">.<span style="color:#008080">[PostalCode]<span style="color:#808080">,</span><span style="color:#000000">  <span style="color:#008080">[t0]<span style="color:#808080">.<span style="color:#008080">[Country]<span style="color:#808080">,</span><span style="color:#000000">  <span style="color:#008080">[t0]<span style="color:#808080">.<span style="color:#008080">[Fax]</span><span style="color:#000000"> </pre>
<pre style="margin:0em;"> <span style="color:#0000ff">FROM</span><span style="color:#000000">  <span style="color:#008080">[dbo]<span style="color:#808080">.<span style="color:#008080">[Customers]</span><span style="color:#000000">  <span style="color:#0000ff">AS</span><span style="color:#000000">  <span style="color:#008080">[t0]</span><span style="color:#000000"> </pre>
<pre style="margin:0em;"> <span style="color:#0000ff">WHERE</span><span style="color:#000000">  <span style="color:#008080">[t0]<span style="color:#808080">.<span style="color:#008080">[City]</span><span style="color:#000000">  <span style="color:#808080">=</span><span style="color:#000000">  <span style="color:#008080">@p0</span><span style="color:#000000"> </pre>
<pre style="margin:0em;"> <span style="color:#008000">&#8211; @p0: Input String (Size = 6; Prec = 0; Scale = 0) [London]</span><span style="color:#000000"> </pre>
<pre style="margin:0em;"> <span style="color:#008000">&#8211; Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.20810.0</pre>
</div>
<p>这仅仅是对一个表的查询，非常简单，所以效果还不明显。如果是一些更复杂的查询，就可以看出使用ORM的优势，它可以大大提高开发的效率。另外，借助 Linq 这样的语言工具，编程的时候，便一起就可以进行类型检查，而不是像使用SQL那样，没有类型检查，只有到了运行时吃才能发现错误。这都将大大提高开发人员的生产效率。</p>
<h3>ORM 也不是万能的</h3>
<p>当然，天下也没有十全十美的东西。ORM 也不例外，使用 ORM 确实可以大大提高开发效率，节省时间。但是毕竟这些映射（翻译）是由程序来完成的，在有的情况下，并不能保证生成的SQL语句是性能最优的。</p>
<p>因此，如果开发人员懂得SQL语句，就可以在开发过程随时监控程序的性能，如果出现问题，查找相应的SQL，分析问题产生的原因，这样就会好很多。</p>
<p>当然，也应该避免另一个倾向，过于怀疑 ORM 产生的SQL的质量。实际上，流行的ORM都是经过长期考验的，在绝大多数情况下，性能是有保证的。此外，尽管对于一个特定的情况，人脑可能可以构想出最佳的SQL语句，但是在实际开发的时候，如果全部用手工写SQL，往往写出来并非的最优的SQL，还不如使用ORM产生的SQL。</p>
<p>因此，在开发中，使用ORM还是利远远大于弊的。同时随时注意性能和生成的SQL语句，这样既保证了高效的开发，又保证了代码的质量。</p>
<h3> 总结 </h3>
<p>最后，说说实际的ORM框架。在Java平台上，最流行的是Hibernate，推出已经很多年，最新版本是3，可以说是久经考验。在 .Net 平台，微软没有官方的ORM之前，最流行的是从Hibernate移植到.Net的Nhibernate，后来微软推出了自己的ORM，第一个是Linq To SQL，带有试验性质，现在已经停止升级，目前大力投入主推的是Entity Framework。</p>
<p>在我们的书中，我将比较详细地介绍 Entity Framework。在书中，我觉得应该先介绍 Entity Framework，然后在讲解 ASP.NET MVC，这样会条理更清晰。但是如果这样写的话，又担心会有读者会心急，买的是一本 Web 开发的书，看了半天访问数据库的东西，见不到Web程序，会很不开心。所以我在考虑如何找到一个合适的，折中的编写顺序，既能够保证读者学着开心，又能够符合学习的规律。</p>
<p>我之所以有上面的担心，是因为很多读者确实看了开头的一两章，没有看到他要的东西，就开始着急。比如原来写的CSS的书，为了说明一些基础的东西，在前面的章节用了一些表格的HTML标记，读者就发评论，说这本书是骗人的，书名号称讲CSS布局的书，其实用的都是表格布局。我们也很无奈，耐心看到后面，自然会明白为什么写，但是现在很多读者都一方面希望能把内容讲清楚，另一方面又希望书里代码和案例都能够拿起来就用。所以这也给写书的人，提出了更高的要求，尽可能地通过好的编排，实现读者的希望的效果。总之我们也将会更尽力地组织好，争取写出一本好书。</p>
<p>希望我的文章对您有所帮助。</p>
<p>您可以到新浪微博联系我：   <a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a> 。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>.Net Web 开发研习(4) —— 语言与框架</title>
		<link>http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html</link>
		<comments>http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html#comments</comments>
		<pubDate>Sun, 27 Feb 2011 05:51:07 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[.NET Web 开发研习]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html</guid>
		<description><![CDATA[这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。
0. 写书计划，欢迎大家提建议
1. Web开发的“十事要说” 
2. 关于学习C#语言的几个... ]]></description>
			<content:encoded><![CDATA[<div  style="width:240px;float:right; border:1px solid #ccc;padding:0 10px;margin:00px 0 10px 10px;">
<p><strong>这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。</strong></p>
<p><a target="_blank" href="http://learning.artech.cn/20110128.new-book.html">0. 写书计划，欢迎大家提建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html">1. Web开发的“十事要说” </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html">2. 关于学习C#语言的几个建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html">3. 技术平台选择，兼谈.Net 与微软</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html">4. 语言与框架 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html">5. ORM(对象关系映射)</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html">6. 学习编程实践之“五子棋”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html">7. 学习编程实践之“文件压缩”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html">8. 美国名校计算机系如何教C#</a></p>
<p>不断添加中……</p>
</div>
<p>在“.Net Web 开发研习”这个系列中，我们主要是就Web开发中会遇到的各种问题，作一些专题性的解释。都属于入门级，因此对于已经有经验的开发者来说，会非常浅显。我们写这个系列的目的是便于初学的读者比较快速地入门。但是在写的时候，我会尽量把里面的道理写透彻，使读者能够真正理解为蛇呢没需要这样做，而不仅仅是知道这样做的方法。在任何时候，学习任何技术，知道为什么要这样做，都比知道具体如何操作更重要。知道了为什么，具体的方法你自己就可以想出来了。</p>
<p>今天的文章着重讲解两个概念 ——  “语言”和“框架”</p>
<p>当我们学习计算机专业，或者软件开发的时候，通常首先就要学习一门编程语言，并且只要做软件开发，就永远离不开语言。在计算机发展得非常早期阶段，语言是编写软件的唯一工具，我们曾经介绍过编程语言的一些发展历程。那时候，使用某种语言，写出程序，直接编译成针对某种型号的计算机的“机器码”，就可以在这种计算机上运行了。</p>
<p>几十年过去了，今天我们可以开发出来的软件功能和复杂程度，都已经远远超过了那时候。开发软件的方式和以前也有了很大的不同。核心的一点是，有很多很多功能，不需要我们在一点一点亲自编写了，而是可以直接调用现成的代码。</p>
<p>这时我们就需要理解“语言”和“框架”这两个概念。</p>
<h3>语言 Vs 框架</h3>
<p>举个例子来说这两个概念。例如我们使用C#语言（或其他高级语言也是类似的），在程序中进行“加法”这个运算，那么这个操作是由语言本身完成的。也就是说，高级语言的编译器会自动把含有这个加法的语句编译为机器码（严格说，对于C#和Java这类语言，编译为中间代码，不过意思是一样的），但是如果要进行开方运算，仅仅依靠语言就无法完成了，因为在C#语言中，并没有“开方”这个语句或者运算符。那么我们如何在C#中实现“开方”这个非常基本而又常用的功能呢？</p>
<p>我们有两种方法实现：</p>
<p>1）通过加、减、乘、除这些基本的C#语言本身支持的运算，以及配合循环、条件等语句来计算。例如可以使用牛顿迭代法，公式如下：</p>
<p><center><img src='http://learning.artech.cn/wp-content/uploads/2011/02/sqrt.PNG' width='150' height='60' alt='sqrt.PNG' /></center></p>
<p>公式中的 c 就表示要开方的数，先选取一个x<sub>0</sub>的初始值，代入公式，就可以计算出x<sub>1</sub>的值，再把x<sub>1</sub>代入公式，就可以计算出x<sub>2</sub>的值，这样就可以反复迭代了，每次迭代之前，计算一下x<sub>k</sub>和上一次计算的值的差，如果小于预先设置的精度要求，比如0.0000001，就结束程序，这样得到的x<sub>k</sub>就是最终的结果。</p>
<p>这种方法尽管并不算太麻烦，但这仅仅是一个开方运算，如果还需要计算sin、cos、指数、对数等等各种运算呢？每一个运算都这样写一段程序，就很麻烦了。因此，软件提供商早已为我们做好了这些事情，他们把这些数学函数都做成库，我们可以直接使用。就是下面的第二种方法。</p>
<p>2）在C#中，可以直接使用 Math.Sqrt()这个函数，关键在于这个Math，它是微软预先定义好的一个类，它包含了很多很多数学函数，开发人员需要使用时，直接调用这些函数，就可以了。在这里，Math这个类并不属于C#“语言”的范畴，而是属于“框架”的范畴。</p>
<p>上面的例子说名了“语言”和“框架”的各自作用。而框架则远远不止数学函数这点功能了，它提供极其丰富的功能。你可能不知道的一个事实是，在微软公司，设计和开发C#语言本身的团队非常小，只有几个人而已，而开发框架则有几千人。到2008年，微软发布的 .net 框架3.5，包括的类型有39509个（Math是其中的一个），提供的函数（方法）有384300个（开方函数Sqrt是其中的一个）。最新的 .net 4.0 ，我没有找到这个数字，但总之是一个非常庞大的数字。<a target ="_blank"  href="http://codebetter.com/patricksmacchia/2008/03/18/number-of-types-in-the-net-framework/">上面两个数字的来源在这里</a>。</p>
<p>但是请读者不要认为，设计和开发高级语言是很简单。实际上，招聘一个可以设计语言和开发编译器的程序员，远比招聘开发一些框架的程序员要求高。领衔设计微软C#语言的 Anders Hejlsberg，是比尔盖茨当年，亲自出马，又请吃饭，又派豪华轿车迎接，这是给足了面子；开出比微软的副总裁还要高的薪水和股票，这是给足了里子；又允诺给 Anders 一支队伍，任由他实现自己的理想，这是给出了远期的宏大目标，这样才把 Anders 从 Borland 公司挖过来的。别看Anders手下不管的人不多，但是在微软和软件界的地位，可是绝对数得着的人物。再比如，在C# 3中，引入了Linq，它的基础是微软剑桥研究院的多年研究成果，里面很多问题不仅仅仅是工程问题，也涉及到了科学问题。</p>
<h3>进一步理解语言与框架</h3>
<p>我想到一个比喻（尽管不是十分贴切），<strong>如果把开发一个系统比作盖房子，语言像是水泥，框架像是砖块。我们就是用水泥把砖块粘在一起，建成房子。</strong></p>
<p><strong>语言</strong>实际上是程序员和计算机之间的接口。高级语言的设计师，例如Anders这些人，要考虑的一点就是，应该把什么功能做到语言里，什么功能应该就给框架去做。事实上，这并没有一个绝对的标准，需要的就是设计师根据很多因素综合决定的。这里最重要的一点又回到了计算机理论中最核心的一点——“抽象”。计算机要解决的问题千千万万，各不相同。但是如何把这些问题中共性的东西“抽象”出来，形成不同的层次，每个层次完成各自的功能。</p>
<p>因此，也必须要了解，没有一个最好的语言，面向不同的实际问题，就会有不同的结果，有的语言处理这种问题适合一些，有的语言处理那种问题合适一些。总体而言，有的语言更通用一些，用的人也就更多，例如C、C++、C#、Java都属于通用语言；而有的语言则是专门适于解决某一类问题，就成为专用语言。</p>
<p>而<strong>框架</strong>则是实际项目提供了一些公用的功能或者模块，本身并没有简化问题的复杂性，只是隐藏了复杂性，就像上面例子中的开方运算，将复杂工作由框架完成，留给开发人员的内容就不那么复杂了。需要注意的是，实际上现代的框架完成的功能，远远不止调用几个函数。现代的框架可以认为是设计思想的复用，每个的框架都针对某些特定的问题领域，大幅度地提高开发的效率。使用某些框架，也需要深入地学习，充分了解了这个框架的设思路之后，严格地按照框架的要求，来进行开发。</p>
<p>例如 ASP.NET 就可以认为是一个为了解决Web开发的框架，包含了大量的组件和模块，而基于ASP.NET，微软又推出了 ASP.NET MVC，他也是一个框架，实现基于MVC模式的Web开发。与之相应， Java的Struts也是一个基于MVC模式的Web开发框架。</p>
<p>再例如为了更方便地实现对数据库的访问，在.NET平台，可以使用Entity Framwork，这是一个典型的数据访问框架，在Java平台上也有 Hibernate框架，实现与之相应的功能。</p>
<p>.Net平台的历史要比 Java 平台晚几年，因此Java平台积累的框架数量也更丰富。.Net平台与Java平台的一个区别是，.Net上的框架由微软官方主导，当然也有大量的第三方开发的框架，但是我们在开发的时候，主要还是使用微软提供的框架，然后根据项目需要配合一些第三方的框架。而在Java平台上，框架这个层面，Sun和现在的Oracle并不主导，因此使用的都是第三方开发出来的框架，好处是数量非常多，而且往往对需求更敏锐，因此出现的早，但是不方便的是，没有一个相对统一的支持模式。微软主导的.NET平台上的框架，则相对更完善，但是推出的时间相对较晚，例如ASP.NET MVC框架2007年才推出，比Java上的Struts晚了好几年。但是微软对各种框架都有统一的支持，框架之间的协调也会比较好（因为都是他们自己的东西），用起来会比较容易，而且新版本新特性的推进也比较周全。</p>
<p>当然，框架不是万能的，在实际开发中，框架和语言都仅仅是工具。程序员真正的价值在于开发中的思想，所以除了学习语言和框架之外，还必须去多实践，把数据结构、算法的思想结合到具体的问题中，然后用语言去实现，在实现的过程才能体会语言和框架的优点和不足，才能够真正的掌握语言和工具。</p>
<h3>.Net 开发中常用的一些框架</h3>
<p>Web开发已经是相当比例的程序员在做的工作了，应用范围极其广泛。我们这里 .Net 平台上，如果总称的话，整个 .net framework 就是一个巨大的框架，里面包含了太多的功能，大致架构如图所示。</p>
<p style="text-indent:0;text-align:center;"><img src='http://learning.artech.cn/wp-content/uploads/2011/02/274184-28258-dot-net-4-framework.jpg' alt='274184-28258-dot-net-4-framework.jpg' /></p>
<p>这张图中，低下的两层是核心层，通常是做到语言范畴里的，上面的一层，分为了三组，通常被理解为框架的范畴。</p>
<p>1）左侧的是User Interface，即用户界面相关的框架，它又包括三个部分：</p>
<p>　　A. WinForms，这是开发Windows窗口应用程序的模式。</p>
<p>　　B. ASP.NET ，通常我们指的Web开发都是指的这个，其中WebForms是最初推出的，至今已经10年；MVC是2008年推出的，非常好用，我们的书将详细讲解它；Dynamic Data是一种非常方便的用户界面和数据结合的模式，我没有用过，尚不了解。</p>
<p>　　C. WPF，一种新的表现层框架，Silverlight 是 WPF 的一个子集，Silverligh 是微软用来和 Flash 竞争的产品。</p>
<p>2）中间的是一组服务框架，包括数据服务框架、通信框架、工作流框架等等，他们和Web开发不直接相关，如果面向的问题需要时，可以使用。</p>
<p>3）右侧是一组数据访问框架，其中，ADO.NET 是基础的数据访问框架。在 ADO.NET 的基础上，微软又推出了两个高层的数据访问框架：</p>
<p>　　A. Linq To SQL ，这是一个早期的，由Ｃ#团队开发的ORM（对象-关系映射，下一篇文章专门介绍ORM） 框架，因此带有一定的实验性质，功能不是非常完善，但是相当好用。</p>
<p>　　B. Entity Framwork，这是一个功能非常强大的数据访问框架，由ADO.NET团队开发，是微软的主推数据访问框架。Linq To SQL 框架现已移交给ADO.NET 维护，将不再增加新功能。Web开发离不开是数据库操作，在我们的书中，将会较大篇幅介绍 Entity Framwork。</p>
<h3>总结</h3>
<p>上面区分了语言和框架个字的范畴和作用。对技术人员来说，语言、框架，再往大了说，任何技术都是在不断变化的，如果你不能理解本质性的东西，就会感到非常辛苦，总是在不停地追着各种技术跑。如果你能把本质性的东西理解了，溶化在脑子里，那么任何新技术的出现，其实都没有脱离这些基本的路数，这样就不会总觉得很辛苦，总担心会不会很快地被新技术淘汰。</p>
<p>希望我的文章对您有所帮助。</p>
<p>您可以到新浪微博联系我：   <a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a> 。 </p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>随心随笔(7) —— 计算机图书十二年之体会</title>
		<link>http://learning.artech.cn/20110224.computer-book-experience.html</link>
		<comments>http://learning.artech.cn/20110224.computer-book-experience.html#comments</comments>
		<pubDate>Thu, 24 Feb 2011 07:09:16 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[随心随笔]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110224.computer-book-experience.html</guid>
		<description><![CDATA[新的一年转眼已经过了两个月，其中一个月生病（医生诊断为病毒感染，不需用药，2-4周自愈），耽误了不少正事，也让我有些时间多琢磨琢磨平常没功夫琢磨的事情。想起这个网站基本上已... ]]></description>
			<content:encoded><![CDATA[<p>新的一年转眼已经过了两个月，其中一个月生病（医生诊断为病毒感染，不需用药，2-4周自愈），耽误了不少正事，也让我有些时间多琢磨琢磨平常没功夫琢磨的事情。想起这个网站基本上已经停了一年多没有更新，很早以前打算出版一本关于Web开发的书，已经嚷嚷了两年，一直没有动手。</p>
<p>我们这个网站停止更新，有两个方面的原因，第一是因为其他工作项目占据了太多的时间，写书是需要静下心来做的一件事，而项目的开发中，琐碎的、繁杂的事情太多，确实很难静下心来构思一本书。第二，一年多前（以及一直持续的）互联网发生的那些事儿，确实令人提不起精神。虽然从长远来看，相信历史的车轮不会被暂时的逆流所阻挡；但是看着历史每天开倒车，还是相当焦虑。</p>
<h3>计算机图书的这十几年</h3>
<p>说到了图书，从99年到今年，已经十二年了。仔细想想，这还是我工作的大部分，这些年的收入，大部分还是来自稿费收入。虽然已经两年多没有新书了，但是我还是很关心这个圈子。我相信计算机图书现在进入了一个非常特殊的时期。这里，我就随便聊聊一些体会吧。</p>
<p>1999年4月下旬，非常偶然，在一个论坛上（当时叫水木清华BBS，现在叫<a target="_blank" href="http://www.newsmth.net">水木社区</a>，这也是我唯一至今每天都上的一个论坛），认识了人民邮电出版社的<a target="_blank" href="http://t.sina.com.cn/bjtailor">蒋伟</a>老师，谈妥了出版一本3ds max绘制效果图的书。到10月份，第一本书就真的出版了，到今年12年了，当时相当激动，而且挣到了人生第一笔收入，当时我还在上研究生，接近两万块钱，在十多年前是巨款了。此后，1999年11月又出版了一本网页制作的书。这两本书一共为我带来了差不多30万的收入，在当时，这些钱可以在北京买一套房子了。</p>
<p>现在大家都把“老师”当作一个通用的称呼，管什么人都叫老师。但是我必须要说，蒋伟确实是我真正的老师，我跟他学了很多很多东西，非常受用。小到怎么写书、大到怎么做事，都给了我很多帮助。我的文字风格，受他影响很大。他告诉我，技术文章，就像白开水，干干净净，娓娓道来；告诉我用双字词可以使句子更容易被读者理解；告诉我用插图的原则，使读者理解更轻松；他告诉我要想办法让你的文章出彩，需要有创意；他告诉我，你答应了的事情，就是不吃饭，不睡觉，也得按时完成。后来他升职为出版社的副社长了，别人都叫他蒋社长，我跟他见面还是叫他蒋老师。他当社长做得也非常棒，邮电社常年占据计算机图书市场的第一名。如果谁对出书有兴趣，还可以跟他联系，只要您有真本事，找他绝对没错，他是真正干事儿的人。</p>
<p>一转眼，12年了。出版行业，特别是计算机图书的出版，形势发生了很大的变化。首先，计算机图书这个产业现在遇到了相当大的困难，实际上这并不是中国独有的，美国的计算机图书市场的整体情况也同样在严重萎缩，09年下降了15%，10年下降4%。相比之下，中国比美国的形势还要好一些。</p>
<p>至于图书，特别是计算机图书，遇到困难，原因已经被讨论得很多了，当然主要还是网络的冲击太大。平常接触到很多的计算机图书策划编辑，大都感到现在计算机图书非常难做，单品种的销量降低，这是现实情况，不必也不能回避。我不想分析更多的原因，但我想谈谈我觉得应该怎么做。</p>
<h3>回归出版的本质</h3>
<p>世界上的商品无非是两类，一类卖的有型的物质，另一类卖的是无形的思想或者文化。</p>
<p>图书显然应该是属于后者的，然而多少年来，图书（特别是计算机图书）都是作为前者来卖的。从上世纪的90年代说起吧，那个时候，计算机这个新东西出现了，人们都对它感兴趣，都要使用电脑。而使用电脑和使用电视机是不一样的，使用电视机，有一本随机带的说明书就足购了；而对于使用电脑，就没有那么简单了。因此广大电脑用户迫切需要一些指导，这种需求非常之大，因此讲解“如何使用Windows”、“如何使用Word”之类的基础图书，就成为了出版社的一棵摇钱树。所有经历过那个时代的计算机图书编辑都对那几年非常怀念。而在这样的红火形势下，对作者的要求就降低了，加上内容并不复杂，只要写出来的语句通顺，都可以比较容易的胜任，而当时互联网刚刚起步，网络上的内容远没有今天丰富，因此计算机图书行业挣钱就相对比较容易了。这样，图书之间的竞争，主要就不在于内容（或者说是作者）了。当时的一个说法是，一本书能否卖得好，有三个因素：书名占50%，目录占30%，内容占20%。因此，图书同质化严重，到书店里，一个题材的书有好几书架子，内容大同小异。因此，计算机图书已经不是在卖内容了，而是卖的纸和销售人员的吆喝。</p>
<p>当时大量的计算机图书，是由各种“图书工作室”编写的。这些工作室由一个人或几个人组成，他们取得了出版社的信任，和出版社接洽，商定选题，然后他们负责招募作者，指导作者写作，因此作者不再直接和出版社接洽。比较早的时候，这些工作主要聚集在北京，以清华等院校的一些头脑比较灵活学生为写作主力，后来由于在北京做这些的成本太高，逐渐都转移到了外地。当时很主流的计算机图书出版模式，是做“套系”，起一个简短通用的名字，一个套系就是个大筐，所有的软件、编程语言等等，都以放到这个框里。比如“从入门到精通”，就可以有各种软件的“从入门到精通”。这种模式的核心思想，是使用麦当劳生成汉堡包的方式，构建出图书内容的生产线，批量地、标准化地生产图书。简单来说，在这种“图书工作室”方式的运作下，图书的数量可以大幅度的提升了，但是问题在于，质量难于保证，基本上都是抄来抄去，把软件的帮助文档直接搬过来使用，或者从网上找一些资料。我也曾经有几年这样运作过工作室，效果不好。</p>
<p>这显然不是一种长久的商业模式，随着不断的发展，情况发生了变化，网络迅速发展，在书中可以找到的内容，网上都有，购买图书的<strong>必要性</strong>大大降低了。“生产线”方式生产图书，作者并不真正关心图书的内容，大都是从网上抄下来，缺少真正的价值。图书同质化严重，单一品种的效率降低，这意味为了维持原来的总销量，必须增加品种数，因此，结果是更加降低了对作者的要求，因为品种数如果不够，在书店的书架子上就不够显眼，就更卖不出去。因此，各大出版社谁都不会降低品种数。结果使图书的口碑越来越差。</p>
<p>那么是不是计算机图书就真的没有市场了呢？我觉得并非如此，人们学习的要求是永远不会消失的，社会越进步，人们学习的需求越大。而图书就是为了让人们以最低成本学习的工具。我们必须要找到图书存在的意义在哪里。我们要找到并回归出版的本质。出版一本书，读者买到的是一段经过深思熟虑的思想，每一本书都是独特的，每一本书都是作以及编辑等合作者的思想的汇集。而不是像麦当劳一样，全世界每一分钟卖出成千上万汉堡包，但是你找不到一个有名有姓的，与众不同的汉堡包。图书不能用生产线来生产，而必须是作者的真知灼见，对于技术图书，就是作者的经验的积累和表达。图书不是麦当劳，而应该像电影大片那样，从编剧、导演、演员、制片，所有的环节都是有名有姓的，这才是文化产品的应有的样子。如果真正做到这一点的书，依然可以卖的很好。我们07、08出的3本CSS和Javascript方面的书，销售得也相当不错。</p>
<h3>网上书店的影响</h3>
<p>图书业的另一个变化是书店的变化，现在的情况是除了新华书店体系的这些国营书店，民营书店非常艰难。我清楚地记得，我第一次听到“国进民退”这个词，是在一个出版方面的会上，针对图书销售说的。网上书店的销售，则增长迅速。我们这几本书，我统计了一下，当当卓越两家店，销售了总销售量的40%左右。而且，在非网上销售的60%中，还有不少是用作教材（即非零售）的，因此，实际上从实体书店被读者零售买走的数量并不很大。</p>
<p><strong>网上书店兴起以后，对于出版业来说，特别是对作者来说，是个利好</strong>。为什么这么说呢？在网上买书，集中度比地面书店高不少。在书店买书，面对着同一题材的几十本书，读者在几分钟里辨别出书的优劣是很难的，结果就是相当随机的选择一本买走，因此好书就被淹没在大量的平庸的同类书中了。而在网上书店则不同，同样这几十本书，默认会根据销量排名，每本书都有读者的评论，特别是有一些有几百条的评论，好书很容易跳出来，被读者选中。这样的结果就是，好书卖的更好，不好的书还得更不好。那么对于那些认真负责的作者，愿意努力的作者，这就是一个大大的好消息。只要你写出了好书，你就可以获得更大的收益。</p>
<p>同时，这也意味着，在一个细分领域，如果你不能进入最好几本书，基本上就没有钱赚。比如一个100种书的类别，如果不能进入前3名，根本挣不了什么钱。但是如果是卖得最好的那一本，还是可以有不错的收入的。所以这也是很残酷的事儿了，就像在奥运会，你必须的冠军，否没有人会记得到你。不过这样总比好坏都一个样强。</p>
<h3>视频教程与售后服务</h3>
<p>另一个我认为对于图书出版者而言十分重要的事情，是售后服务。受到现有出版模式的限制，图书出版基本上不存在“售后服务”这件事，图书除了偶而缺页等问题，需要换本书之外，没有可服务的地方。如果你这么想，就说明你还是把图书还是当作上面说的第一类商品，仅仅把它当作一个实体的东西，而没有把它当作思想和文化的载体来看待。如果我出版的是一本技术书籍，读者买回去，就是为了学会一项技术，比如CSS，或者一门编程语言比如C#，如果看到某一页，没看明白，是不是我们应该提供一些“售后服务”给读者，帮助他们看明白，学明白？如果这么想，是不是就很有售后服务的必要性了？</p>
<p>比如我们为了这几本书，建立这个“前沿视频教室”网站，录制一些和书配套的教程，并回答读者的提问，实际就是在做着“售后服务”这件事。这实际上很重要，以后的图书，这方面会越来越重要。</p>
<h3>探索新的服务形式</h3>
<p>说到我们自己的售后服务，从07年开始，我坚持在网上回答读者的各种提问，坚持了3年，但是10年实在顾不上了，就停了一年，因此这里也对没有的得到我答复的读者，无论买了或者没买我们的书的读者，表示歉意。</p>
<p>但是从这里，也体现一个问题，售后服务都是有成本的。要知道，现行的图书定价，是以页数为基础的，一个出版社，甚至同类的出版社，会有一个大致统一的单位价格（印张定价），书的页数乘以这个单位价格，再稍作调整，就是一本书的最终定价。所以一切不印在纸上的东西，都不计价格。</p>
<p>那么我在时间允许的情况下，我也愿意在网上回答所有人的问题，我觉得这样做很开心，和读者交流本身是一个有意思的事儿。但是必须承认这是一个“无保障”的服务。如果我没有时间的话，就无保证读者的提问。</p>
<p>这使得我在想一件事儿，有没有可能，我建立一个收取一定费用的，但是有质量保证的网上教学服务呢？我们知道，学习某个技术主要有三种途径：</p>
<p>1）在网上找各种资料，大量的搜索，泡论坛。这种方式的好处是成本低，不花钱，但是比较花时间，需要有较强的自学能力，善于查找资料，一些技术，还需要有比较好的英文能力，因为中文资料很少。需要逐渐摸索，因此时间花费较多。</p>
<p>2）买一本书，成本较低，几十块钱，相对来说，跟着一本书学习，比较系统，按部就班地学习，可以节约在网上大量搜索的时间。对学习者学习能力有一定要求，在遇到一些问题的时候，需要有灵活处理的能力。比如在学习程序开发的书的时候，你可能会遇到程序跑不通的情况，又自己发现不了问题出在哪儿，这个时候就容易卡住，你要有比较好的处理问题的能力，才能顺利学下去。</p>
<p>3）上一个培训班，价格较高，一般数千元，最大的好处是有教师面对面，这样遇到问题可以直接问，而且教师可以直接演示，学习起来更容易，读学习者的学习能力要求救比较低了，只要能按部就班跟上老师的讲解，就可以完成学习。但是遗憾的是，我听到太多关于IT技术培训学校的负面评价。而且上培训班比较麻烦，要到学校去，时间还不一定灵活。</p>
<p>我在考虑，我们是否可以在第2种和第3种途径之间，创造一个新的途径，基于网络的学习途径，我会提供视频、文本、图书等学习材料，就像你现在跟着图书、视频学习一样，但是区别在于，我为读者提供“有保证”的问答服务，比如您学习到某一个章节，卡壳了，你可以给我提问，我会保证在一定的时间内给予回答，使读者可以顺利地学习下去。实际上，自学为什么难？就难在遇到问题的时候，没有人帮助。那么如果有人能够给你提供有保证的服务，就可以在你遇到困难的时候，快速帮你完成这个跨越。为了使这个服务有保证，那么你为此的付出一个可接受的价格。</p>
<p>不知这样形式的服务，是否可行，有兴趣的读者，请给我留言，我想听取你们的意见和建议。</p>
<p>希望我的文章对您有所帮助。</p>
<p>您可以到新浪微博联系我： <a target ="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a> 。</p>
<p>补充说明：基于本文的内容，做过一次小演讲，<a href='http://learning.artech.cn/wp-content/uploads/2011/03/wrinting.pdf' title='wrinting.pdf'>PPT供大家参考</a>。</p>
<p><center><img src="http://ww3.sinaimg.cn/large/6e25f957jw6dezydiw7vcj.jpg" /></center></p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110224.computer-book-experience.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>.Net Web 开发研习(3) —— 技术平台选择，兼谈.Net 与微软</title>
		<link>http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html</link>
		<comments>http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html#comments</comments>
		<pubDate>Tue, 22 Feb 2011 03:57:02 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[.NET Web 开发研习]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html</guid>
		<description><![CDATA[这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。
0. 写书计划，欢迎大家提建议
1. Web开发的“十事要说” 
2. 关于学习C#语言的几个... ]]></description>
			<content:encoded><![CDATA[<div  style="width:240px;float:right; border:1px solid #ccc;padding:0 10px;margin:00px 0 10px 10px;">
<p><strong>这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。</strong></p>
<p><a target="_blank" href="http://learning.artech.cn/20110128.new-book.html">0. 写书计划，欢迎大家提建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html">1. Web开发的“十事要说” </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html">2. 关于学习C#语言的几个建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html">3. 技术平台选择，兼谈.Net 与微软</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html">4. 语言与框架 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html">5. ORM(对象关系映射)</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html">6. 学习编程实践之“五子棋”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html">7. 学习编程实践之“文件压缩”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html">8. 美国名校计算机系如何教C#</a></p>
<p>不断添加中……</p>
</div>
<p>在前面的文章中，提到了我们正在策划一本书新书，内容是关于“Web开发”的。因此这里新开一个系列，在这个系列中，将把关于这本书的策划和写作过程的一些思考，写出来，供大家参考。如果您希望学习基于.net平台的Web开发，也可以和我讨论。</p>
<p>今天的题目是“.Net与微软”。实际上我们做开发的，用什么技术路线，有很多因素要考虑，就像找工作一样。最重要的一点是，找一个你真正喜欢的工作，对你的发挥更有利。选择你喜欢的技术，找到你的兴趣所在，才能让你工作起来更有信心，更有劲头。</p>
<p>互联网是个热门迭出、名词迭出的地方，关于Web开发，也是纷繁复杂，对于初学者，容易感到很混乱，听说有什么PHP，ASP，ASP.NET， 还有一堆什么Python、Java、Ruby、RoR、JSP等等很多词语，要都搞清楚也不是一件容易的事情。还很多“开源”的东西，听起来是很棒的！我到底应该学什么？从哪里入手呢？</p>
<p>这确实是个问题，我们为什么从这么多技术和平台中选择.Net平台呢？ <strong>已经有太多关于不同的语言、不同的平台之间讨论、争论设置争吵，其实没有太大意义，如果您已经确定了您更喜欢某一个平台或者技术路线，请坚持您自己的选择。</strong></p>
<p>至于我们的选择，有几个原因。今天只谈一个：主流技术、主流平台。对于程序员，使用主流技术，就意味着更多的工作机会。对于公司，使用主流技术，就意味可以有更多的人才选择。这个原因属于非技术原因，还可以罗列很多技术方面的原因，我们放到以后的文章中再谈。</p>
<h3> .Net是一个主流技术和主流平台吗？</h3>
<p style="color:#C33">说明：我通常写的是技术文章，对于各种技术，都不带有任何倾向性，不过我得承认今天的这篇文章确实带有一些倾向性。因为我平日在各种网站、论坛上，总是看到很多人在没有调查和数据的基础上，就总是说“微软不行了”，“.Net不行了”，“ASP.NET失败了”，说实话我很奇怪，微软的媒体公关为什么这么差。其实只需要摆出一些简单的数据，足可以说明真实的情况。当然，如果是理性的分析，指出具体环境下的优点和缺点，那么当然就另当别论，技术探讨是十分有益的。</p>
<p>在很多人的印象中，Windows只是在桌面系统厉害（这个不用说了，中国99%的桌面用Windows），而在服务器市场上，则是Linux和Unix的天下了，其实并非如此。下面数据来自<a target="_blank" href="http://www.zdnet.com/blog/microsoft/idc-windows-server-still-rules-the-server-roost/6424">IDC的报告</a>：</p>
<p>2010 年第一季度的服务器市场份额：</p>
<p><center></p>
<table>
<tr>
<td>Windows</td>
<td>　1,379,487</td>
<td>　75.3%</td>
</tr>
<tr>
<td>Unix    </td>
<td>　65,451 </td>
<td>　3.6%</td>
</tr>
<tr>
<td>Linux   </td>
<td>　380,429 </td>
<td>　20.8%</td>
</tr>
</table>
<p></center></p>
<p>2009 年第四季度的世界服务器市场份额：</p>
<p><center></p>
<table>
<tr>
<td>Windows</td>
<td> 　1,434,225</td>
<td>　73.9%</td>
</tr>
<tr>
<td>Unix    </td>
<td>　84,851 </td>
<td>　4.4%</td>
</tr>
<tr>
<td>Linux   </td>
<td>　412,041 </td>
<td>　21.2%</td>
</tr>
</table>
<p></center></p>
<p>可以看到，<strong>Windows 服务器是占有绝大部分市场份额</strong>，而且在不断增长的。因此， .Net当然是一个主流平台。</p>
<p>昨天我在水木社区（www.smth.org）上看到一个人又在发感慨：</p>
<p>“似乎没有谁用ASP.NET 来开发网站? 还是用 PHP 的多一些。ASP.NET的前景, 似乎越来越暗淡了: 在企业级应用不是J2EE平台的对手, 在互联网又打不过 LAMP。”</p>
<p>这位老兄看起来还是知道几个英语缩写的，但是所有的论述都是拍脑袋想出来的，这几十个字里，就有两个“似乎”。当我把上面“75%市场份额”的数据告诉他时，他开始表示找不到数据来源，当我把数据来源告诉他以后，他又给出了一个十分有趣的，当然也是臆想出来的结论：</p>
<p>“知名的互联网企业好像没有用.NET的。普通行业软件应用中，金融和电信用.NET的好像也非常少？ .NET 大量使用在非有钱行业里的一些外围应用，钱貌似都不多?”</p>
<p>他这么几十个字里，包括了两个“好像”，一个“貌似”。难道就不能花几分钟，搜索一些数据来验证你的想法吗吗？</p>
<p>好吧，我又找到了这篇文章：“<a target="_blank" href="http://www.port80software.com/surveys/top1000webservers/">Top 1000 Corporation Web Servers（全球Top 1000 企业的Web服务器）</a>”</p>
<p><center><img src='http://learning.artech.cn/wp-content/uploads/2011/02/web-server-market-share.PNG' alt='web-server-market-share.PNG' /></center></p>
<p>不知这位仁兄如何定义“有钱行业”和“非有钱行业”，不知道 Fortune 1000 这1000个企业，是否属于“有钱行业”。我认为觉得大多数人，应该会认为他们是“有钱”的。这是2010年的报告，<strong>全世界最大的1000个企业中，545家的Web服务器使用的 IIS</strong> ，234家使用Apache（大致是Lamp的份额），剩下是其他系统。</p>
<p>当然，有人会说，全世界最大的那些网站，哪个用的是Windows服务器，比如Google？实际上，确实如此，您如果要做Google这么大的事业的话，自然不会使用Windows Server这样的服务器，甚至连数据库管理系统等等，都不会用现成的软件了，肯定都是自己建出来的了。别说软件，Google的服务器，都是自己搭的。但是需要注意的是，真正达到Google这样的企业太少了，对于绝大多数IT的应用解决方案，都是使用现成的平台的。</p>
<h3>选择技术远比选择股票重要的多</h3>
<p>说到 .Net ，就自然说到了微软。还有的技术人员担心 ASP.NET 甚至微软公司在不久的未来，某一天死掉了，到时候花费心血学习到的技术就没有用场了。</p>
<p>实际上，对于任何一个技术人员，选择一个有生命力的技术平台，是很重要的，我们花力气学习一个技术，是有很高成本的，如果我们花了很多心血，积累的技术和经验，没过多久，这个技术平台消失了，对于一个技术人员来说，打击是很大的。所以，选择技术远比选择股票重要的多，选错一个公司的股票，最多赔点钱，而选择一个公司的技术平台，如果这个公司沉没了，转换平台的成本就相当高了。</p>
<p>那么微软又如何呢？2010年世界最大的软件公司年收入排名如下，这里只列出前5名，完整列表参见（<a target="_blank" href="http://www.softwaretop100.org/global-software-top-100-edition-2010">数据来源</a>），这里只列出以软件为主营业务的公司（即去掉了IBM这样的公司）：</p>
<p><center></p>
<table>
<tr>
<td>Microsoft </td>
<td>612亿美元</td>
</tr>
<tr>
<td>Oracle </td>
<td>227亿美元</td>
</tr>
<tr>
<td>SAP </td>
<td>154亿美元</td>
</tr>
<tr>
<td>Symantec </td>
<td>59亿美元</td>
</tr>
<tr>
<td>Activision Blizzard</td>
<td>	43亿美元</td>
</tr>
</table>
<p></center></p>
<p>可以看到，作为第一名的微软是第二名的Oracle的近三倍。要知道，2010年全中国的软件总收入也只有60亿美元而已（<a target="_blank" href="http://www.cnw.com.cn/weekly/htm2010/20100401_193487.shtml">数据来源</a>）。对于这样的一个公司，如果说他不行了，实在没有太多实际的根据。</p>
<p>客观地说，微软到底是在进步，还是在退步？不同数据可以给出不同的答案，甚至相同的数据，不同的角度，也可以看到不同的结论。</p>
<p>微软的年收入，从2001年的238亿美元，到2010年已经增长到612亿美元，对于一个如此庞大的公司，能有如此的增长速度，不是进步，还能说是什么呢？——OK，它是在进步。</p>
<p>但是有那么多人说微软不行了，那也是一定有原因的，我们来找找原因：</p>
<p>1984年世界前5大软件公司（数据来源于《IT打败局》（ISBN9787121001116），前言第4页）：</p>
<p><center></p>
<table>
<tr>
<td>MicroPro </td>
<td>6千万美元</td>
</tr>
<tr>
<td>Micorsoft </td>
<td>5.5千万美元</td>
</tr>
<tr>
<td>Lotus </td>
<td>5.3千万美元</td>
</tr>
<tr>
<td>Digital Research</td>
<td>4.5千万美元</td>
</tr>
<tr>
<td>VisiCorp</td>
<td>4.3千万美元</td>
</tr>
</table>
<p></center></p>
<p>以上数据说明在1984年，微软排名第二，而前几名的软件公司，非常接近。下面再看看2001年的数据（数据来源同上），也就是Bill Gates移交CEO之前的数据：</p>
<p><center></p>
<table>
<tr>
<td>Microsoft </td>
<td>238亿美元</td>
</tr>
<tr>
<td>Adobe </td>
<td>12.7亿美元</td>
</tr>
<tr>
<td>Novell </td>
<td>11.0亿美元</td>
</tr>
<tr>
<td>Intuit </td>
<td>10.8亿美元</td>
</tr>
<tr>
<td>Autodesk </td>
<td>9.3亿美元</td>
</tr>
</table>
<p></center></p>
<p>这个表现了惊人的数据，第一名的微软是第二名进20倍。这就好像参考试，第一名考了100多分，第二名只有5分。再结合2001到2010年的数据，在这十年的时间里，从第二名20倍，变成到第二名的3倍，这么看的话，微软确实退步了，或者叫做“进步的速度变慢了”。再加上Google等互联网公司的出现，以及Apple的巨大成功对比，微软就不像十年前那么耀眼了。因此，现在也有很多人呼吁Bill Gates 复出。</p>
<p>综上所述，微软的实力相对来说，确实没有10年前那么强大了，但是作为一个已经成熟和稳定的公司，他们有足够强大的能力，构建行业生态系统。这就好像，1992年，NBA第一次被允许参加奥运会，乔丹率领的梦一队，无疑是超级强大的，20年后的美国篮球队，依然是强大的，但确实没有那么强大了。但是至少还没有哪个球队能代替美国队。</p>
<p>实际上，我们这篇文章，和我们的主题“Web开发”来说，说得有点远了，对于很多真正做开发的程序员来说，微软就是一个技术提供商，我们只是用他们的产品来做开发，踏踏实实做好给客户做好开发，挣好我们的工资，就OK了。至于微软是不是老大并不关键，就像我们买汽车，或者其它的生活用品一样。对于一个程序的开发人员，对这些应该都是可以看得非常清楚的，在了解的基础上，选择适合自己的技术和平台，才能够最大程度地帮助自己的事业获得成功。</p>
<h3>总结</h3>
<p>这篇文章的本质，是在告诉大家，选择一个你喜欢的技术平台，非常重要。如果再扩大一些范围，选择一个你喜欢的职业，非常重要。关于这一点，我很欣赏<a target ="_blank" href="http://www.hanselman.com/blog/">Scott Hanselman</a>的一个观点：</p>
<p><center><img src='http://learning.artech.cn/wp-content/uploads/2011/02/job.png' alt='job.png' /></center></p>
<p>选择你的职业要考虑三个因素：你是否感兴趣、你是否能做好、靠它是否能赚钱。我们的终极目标，就是寻找这个三个圆圈的“交集”。仔细想想看，真是很有道理，如果感兴趣，这个工作很挣钱，但是你却不擅长，肯定很郁闷；如果你感兴趣，也很擅长，但是这个工作太偏门，赚不到钱，你也很痛苦；如果你也能做好，也能挣钱，但是根本没兴趣，也不是个理想的工作。最好还是能把这三个因素都能兼顾，那就是最理想的工作了。</p>
<p>希望我的文章对您有所帮助。</p>
<p>您可以到新浪微博联系我： <a target ="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a> 。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>.Net Web 开发研习(2) —— 关于学习C#语言的几个建议</title>
		<link>http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html</link>
		<comments>http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html#comments</comments>
		<pubDate>Fri, 18 Feb 2011 06:10:18 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[.NET Web 开发研习]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html</guid>
		<description><![CDATA[这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。
0. 写书计划，欢迎大家提建议
1. Web开发的“十事要说” 
2. 关于学习C#语言的几个... ]]></description>
			<content:encoded><![CDATA[<div  style="width:240px;float:right; border:1px solid #ccc;padding:0 10px;margin:00px 0 10px 10px;">
<p><strong>这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。</strong></p>
<p><a target="_blank" href="http://learning.artech.cn/20110128.new-book.html">0. 写书计划，欢迎大家提建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html">1. Web开发的“十事要说” </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html">2. 关于学习C#语言的几个建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html">3. 技术平台选择，兼谈.Net 与微软</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html">4. 语言与框架 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html">5. ORM(对象关系映射)</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html">6. 学习编程实践之“五子棋”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html">7. 学习编程实践之“文件压缩”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html">8. 美国名校计算机系如何教C#</a></p>
<p>不断添加中……</p>
</div>
<p>C#是.NET平台上的主力开发语言，如果希望在.NET上做开发，包括Web开发、桌面程序的开发，以及Silverlight和移动设备的开发，例如Winodws Phone的开发，C#都是首选语言。</p>
<p>下面的图是 indeed.com 统计的近年来美国招聘市场上，几个语言的职位数量，可以看到比较常用的语言都有比较好发展，都在增长，C#的职位也在不断增长。</p>
<p>C#语言已经经过了10余年的发展。谈到C#语言，就不能不提到Anders Hejlsberg 。Anders 早年创建了 Turbo Pascal 和Delphi，1996年加入微软，最开始的工作是建立微软的Java开发工具Visual J++，但是由于微软和Sun没有关于Java标准谈妥，因此微软决定彻底放弃Java，重新设计一个全新的语言，这就是C#。Anders 始终活跃在C#语言的地第一线，几个月前，他在PDC大会上宣布了C# 5的新特性。</p>
<p>从语言来说，C#的每一个版本都有着质的提高。C# 1.0 实现了托管代码，C# 2.0 加入了泛型，C# 3.0加入了Linq，C# 4.0 加入了动态编程，尚未发布的C 5.0将加入异步变成的新特性。</p>
<p><center><img width="450" height="250" src="http://www.indeed.com/trendgraph/jobgraph.png?q=Java%2CC%23%2CPHP%2CPython%2CRuby+on+Rails" border="0" alt="Java,C#,PHP,Python,Ruby on Rails Job Trends graph"></center></p>
<p>要把C#语言完全描述清楚，需要相当厚的一本大书了。千里之行，始于足下。本文希望为初学者学习C#，提供一些建议。</p>
<p>我想大约需要三个步骤。</p>
<h3>第一步是把C#当作C语言</h3>
<p>在这一步中，掌握基本的语言结构，包括基本数据类型，和基本流程控制等语言特性。重点是：</p>
<p>1）理解值类型和引用类型的区别；</p>
<p>2）运算符和表达式；</p>
<p>3）控制流，包括各种分支结构和循环结；</p>
<p>4）方法（函数）和参数的相关内容，包括传值、传引用的区别，以及返回类型，还包括方面的签名、重载等机制。</p>
<p>总体来说，这一步中得很多内容，都是相当古老的，在学习时，可以和传统的C语言，进行比较。例如在C语言中的指针，在C#没有了，但是C#使用了“引用”的概念，那么在实际用中，二者有哪些相同点和不同点呢？在学习C语言的课后都用很多关于链表的练习题，你应该同样都可以使用C#语言来实现。</p>
<h3>第二步是把C#当作C++语言</h3>
<p>在这一步中，重点是理解面向对象的思想，即OOP的三个特性 ：封装、继承和多态。重点是</p>
<p>1）理解“类”的概念；</p>
<p>2）继承与接口，理解C#的单继承，多接口的含义和特点；</p>
<p>3）虚方法与多态的概念，重点是真正理解为什么需要虚方法。如果你想不清这一点，就说明还没有真正理解OOP的思想。</p>
<p>在这一步中，建议读者比较C#语言和C++语言的相同点和不同点。不要轻易做出哪个好、哪个不好的结论。要相信设计这些语言的人，他们都是软件开发界的顶尖高手，他们做出的任何决定都不是随便拍脑袋想出来的，他们都是经过深思熟虑后做出的决定，都有各自的原因。如果你能分析出，各种做法各自的优点和缺点，理性地看待这些语言特性，你对他们的理解就深入多了，这样你在具体开发实践时，也就能够更加游刃有余了。</p>
<h3>第三步是把C#当作C#语。</h3>
<p>在充分理解了上面两步之后，重点是理解C#的很多新的语言特性了。这些语言特性相当多，这里列举几个最重要的，包括“异常”、“泛型”、“容器”、“Linq”、“反射”、“动态”、“异步”、“并行”。</p>
<p>事实上，这些特性才是C#语言真正的特点所在。这些特性相对独立，每一个可以作为一个专题，仔细研究，把它们分别吃透。</p>
<p>同样，在研究的时候，可以仔细比较不同语言之间的实线差异，例如“泛型”，就可以比较在Java、C++和C#中实现的各自机制，当你把他们都研究清楚的时候，你对这些特性就真正理解了。</p>
<h3>推荐几本我看过的几本 C# 的书</h3>
<p>《C#本质论(第3版) 》讲解的是C# 4.0 。<a href="http://www.amazon.cn/%E6%9C%AC%E8%B4%A8%E8%AE%BA-%E7%AC%AC3%E7%89%88-%E7%B1%B3%E5%87%AF%E5%88%A9%E6%96%AF-Mark-Michaelis/dp/B003ZXBKQC/">查看详情</a>。</p>
<p>《C# 4.0 捷径教程》<a href="http://www.amazon.cn/C-4-0%E6%8D%B7%E5%BE%84%E6%95%99%E7%A8%8B-%E7%BA%B3%E4%BB%80-Trey-Nash/dp/B004GETPW0">查看详情</a>。</p>
<p>《深入解析C#》讲解的是C# 3 。<a href="http://www.amazon.cn/深入解析C-斯基特-Jon-Skeet/dp/B003MQ73AE">查看详情</a>。</p>
<p>《C#图解教程》讲解的是C# 3 ，不过似乎已经没货了。<a href="http://www.amazon.cn/C-图解教程-索利斯/dp/B001N8N45Q">查看详情</a>。</p>
<p>上面这4本讲解C#语言的书，质量都是相当有保证的，翻译得也不错，大家有兴趣，可以买来读一读。如果说这几本书有一些问题的话，有两个问题，一个是对OOP思想的讲解不够透彻，看过之后，可能语法你都理解了，但是还不是很理解为什么，以及在什么用这些特性。另一点就是缺少一些例子，一些实实在在的，很具体的例子。</p>
<h3>思考题</h3>
<p>我在这里给有兴趣的读者，留三个题目，你可以作为实践题目，自己来写一个程序：</p>
<p>1）写一个能够和人对弈的五子棋程序，看看你的程序下棋的水平能到达什么程度。</p>
<p>2）用面向对象的思想，写一个电梯运行的模拟程序。</p>
<p>3）研究压缩算法，写一个文件压缩和还原程序。例如最简单的，你可以研究一下哈夫曼算法，然后以此为基础，你可以找到很多压缩算，都可以综合在一起，实践一下。</p>
<p>上面三个程序，如果你都能够写出不错的程序，你的语言基本上就过关啦。如果有兴趣的读者，你真的写了这几个程序，可法发给我看看哦。</p>
<p>希望我的文章对您有所帮助。</p>
<p>您可以到新浪微博联系我： <a target ="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a> 。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>好书推荐——《软件随想录》</title>
		<link>http://learning.artech.cn/20110217.book-review-more-joel-on-software.html</link>
		<comments>http://learning.artech.cn/20110217.book-review-more-joel-on-software.html#comments</comments>
		<pubDate>Thu, 17 Feb 2011 03:40:59 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[书评与推荐]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110217.book-review-more-joel-on-software.html</guid>
		<description><![CDATA[今天向大家推荐一本好书，《软件随想录——程序员部落酋长Joel谈软件》。
这本书是2009年12月出版的，所以不算是新书了，基于目前的图书销售机制，如果一本书的销售速度不能保持一个基本... ]]></description>
			<content:encoded><![CDATA[<p>今天向大家推荐一本好书，《软件随想录——程序员部落酋长Joel谈软件》。</p>
<p><img align='right' src='http://learning.artech.cn/wp-content/uploads/2011/02/20746325-1_l.jpg' alt='20746325-1_l.jpg' />这本书是2009年12月出版的，所以不算是新书了，基于目前的图书销售机制，如果一本书的销售速度不能保持一个基本的量，这本书就不会再印刷了。因此我在本书出版了一年多以后，再来“鼓吹”一下这本书，希望有更多的人能买一买这本书，使它不至于绝版。你要知道，很多很多书，在书店半年的时间就下架了。</p>
<p>事实上，这本书还是很有名的，特别是在软件圈子里，这个作者是个相当有名的人。这与他相当善于经营自己的品牌有关。</p>
<p>这本书的作者 Joel Spolsky，出生在美国，他是犹太人，后来回到以色列空军服役，他不是飞行员，而是空降兵，退役后回到美国读大学，他毕业于耶鲁大学计算机系。他有很好的程序员的技术基础，但是更多地，它并不是一个单纯的技术人员，这可能和他的犹太人血统有关，在我们印象中，犹太人都很善于经营生意。他毕业之后不太久，就加入了微软，身份是“程序经理”，类似于我们常说的“产品经理”，主要的任务是定义产品和协调开发，他具体负责的是Excel中VBA相关的工作。</p>
<p>他的这本书实际上就是他的博客上的文章的汇总，他博客上的文章实际上先后汇总出版了两本书，国内引进的这本是第二本。他开始写博客是在他离开微软后，决定自己创业的时候。事实上，在他离开微软以后，还没有明确决定具体要做什么的时候，他先建立了自己的博客，经常发表一些他个人关于软件开发方面的思考的文章。他的博客受到了很大范围的关注。与此同时，他创建了一个软件公司，销售一个专业的软件产品，这个产品是给专业的开发团队追踪和管理bug的。从某种意义上说，他的博客也是他做营销的重要手段。用这种方式做营销，效果远比花钱做广告好得多。所以有人说，未来的营销，只有没本事的人才要靠花钱，这是有道理的。这个软件公司，到现在也一直在良好的经营中。</p>
<p>后来，Joel又与另一个著名的blogger Jeff Atwood合作，创建了一个网站，获得巨大的成功，大大的有名 —— <a target = '_blank' href="http://stackoverflow.com/">StackOverflow.com</a> ，这是一个面向程序开发人员的问答网站，有点类似于百度知道那样的网站。经过短短的两年多时间，到2010年年末，StackOverflow 单个站点在 Alexa 排名到达了 160名，从最初的三个开发人员，发展到了二三十人的规模，获得了风险投资 。顺便提一句的是， StackOverflow是用ASP.NET MVC 开发的，用户体验做得非常之好。 此后，他们又横向发展，推出了好几个面向不同人群的问答网站。有兴趣的可以参考<a target="_blank" href="http://www.dbanotes.net/startup/stack_overflow_success.html">这篇文章</a>。</p>
<p>这里之所以要介绍一下 StackOverflow，是因为这个网站上的问题解答相当专业，质量非常高，在我们日常的开发中，经常遇到各种各样的问题，相当一部分，在StackOverflow上找到了相当棒的答案。问题的回答质量高，社区氛围好，造就了StackOverflow的成功，也同样证明了Joel独到的眼光和管理经营能力。我在国内的好几的招聘帖子中看到一条对应聘者的要求：善于从StackOverfowl等技术网站寻找解决方案，这足以说明，这个网站的作用。</p>
<p>说了这么多之后，再回到这本书《软件随想录》。这本书之所以好，核心在于“角度”。在每个人的眼前的，是同一个世界，但是有每个人的眼光不同，就看到了不同的结果。有的人，就能够从大家都习以为常的现象中看到不一样的东西，这就是“角度”，这就是“眼光”，或者叫做“洞察力”。当然，任何人的观点，都不一定全部正确，也不可能得到所有人的认同。但是我们必须要承认，有的人总能看出一些东西，是我们没有看到的，能够给我们很多启发，使我们能够进一步的思考。</p>
<p>Joel是这样的一个人，他用他的文章和实践证明了他的洞察力。所以我说了这么多，但是根本没有提到这本书到底讲了什么，如果你对这个人感兴趣，对这个人做事的方法感兴趣，建议你赶紧买一本，仔细看一看，相信不会让你失望。随着图书受到越来越大的冲击，口碑原来越重要，图书的出版也将越来越回到出版的本质，谁写的这本书，才是一本书的决定因素。所以这片书评，只谈作者这个人，而不说书的内容。</p>
<p>希望我的文章对您有所帮助。</p>
<p>您可以到新浪微博联系我： <a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a> 。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110217.book-review-more-joel-on-software.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>.Net  Web 开发研习(1) —— Web开发的“十事要说”</title>
		<link>http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html</link>
		<comments>http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html#comments</comments>
		<pubDate>Tue, 15 Feb 2011 12:38:53 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[.NET Web 开发研习]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html</guid>
		<description><![CDATA[这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。
0. 写书计划，欢迎大家提建议
1. Web开发的“十事要说” 
2. 关于学习C#语言的几个... ]]></description>
			<content:encoded><![CDATA[<div  style="width:240px;float:right; border:1px solid #ccc;padding:0 10px;margin:00px 0 10px 10px;">
<p><strong>这个系列文章（.Net Web 开发研习）是在准备新书的过程中，一边构思，一边发文，逐步添加的，供大家参考。</strong></p>
<p><a target="_blank" href="http://learning.artech.cn/20110128.new-book.html">0. 写书计划，欢迎大家提建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html">1. Web开发的“十事要说” </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html">2. 关于学习C#语言的几个建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html">3. 技术平台选择，兼谈.Net 与微软</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html">4. 语言与框架 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html">5. ORM(对象关系映射)</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html">6. 学习编程实践之“五子棋”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html">7. 学习编程实践之“文件压缩”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html">8. 美国名校计算机系如何教C#</a></p>
<p>不断添加中……</p>
</div>
<p>在上一篇文章中，提到了我们正在策划一本书新书，内容是关于“Web开发”的。因此这里新开一个系列，在这个系列中，将把关于这本书的策划和写作过程的一些思考，写出来，供大家参考。如果您希望学习基于.net平台的Web开发，也可以和我讨论。</p>
<p>对于Web开发来说，大致分为前端和后端，前端就是在浏览器上运行的程序，主要是Javascript程序，后端就是在服务器运行的程序，种类就非常多了。目前，Web开发的主流的“三巨头”是 .Net、Java和PHP。</p>
<p>首先要注意的是，不用过于花精力探讨哪个更好。没有哪一个是最好的，只有最适合你的那一个。至少在5年内，他们都会存在并发展，你只要把任何一个掌握精通，都有绝对的实力去赢得胜利，就像无论那本武侠小说，”少林”和”武当”都是大门派。只要选择一个适合你的就可以了，比如你周围有个PHP高手，你可以随时请教，那你就学PHP就好了。能随时请教，比任何事情都重要，对你的帮助一定是最大的。</p>
<p>当然，我们这里选择 .Net 平台，当然也是有一定原因的，具体的原因在后面我会用两篇文章的篇幅来讨论，等我贴出以后，欢迎大家探讨。</p>
<p>关于学习Web开发， 我先来说说根据我个人的经验，比较重要的几个方面。</p>
<p>补充说明：写完以后，数了一下，正好是十条，想起了唐玄宗掌权以后的任命的第一个宰相姚崇写的《十事要说》，为唐玄宗的开元盛世提出了治理的框架。所以我就把此文命名为Web开发的“十事要说”了。如果读者有兴趣，可以看一下姚崇当年的《十事要说》，放在当今中国，也是一个不错而实用的治国方略。</p>
<h4>1：过硬地掌握一门编程语言和一些常用的算法</h4>
<p>比如你用 ASP.NET MVC ，那就要掌握C#或者VB。如果用PHP，就要掌握PHP。对语言的掌握，就是靠不断的实践，写够了5万行代码，自然就掌握了。</p>
<p>需要注意，语言和开发平台是不一样的，讲解ASP.Net 开发的书，通常不会介绍太多C#语言，讲解C#语言的书，也不会介绍ASP.NET或者WinForm的开发。对于还在作学生的读者，我建议一定要认真学习语言和数据结构，多做一些深入的程序，后者叫做“很难”的程序。这个“难”不是指用什么新的语言或平台、框架，而是逻辑、算法的难。</p>
<p>在比较好的大学里，老师通常会有比较好的引导作用，同学的素质也不错，身边有很多榜样，希望你能加入他们，做做一些真正很“难”的程序。特别推荐读者买一本《软件随想录》这本书，作者专门谈到他在耶鲁大学计算机系学习时的一些体会，反复强调，做一些真正很“难”的程序的重要性，它是考验你能否成为一名好的开发人员的试金石。</p>
<p>如果你不是在顶尖大学里上学，就要更多地靠自己的努力了，周围的人可能不能给你太多的帮助。但是方法是一样的，就是要做一些真正“很难”的程序，不用着急做一些花哨的东西，到任何时候写程序，语言和算法都是最重要的。</p>
<h4>2：掌握一个开发环境</h4>
<p>如果有了足够好的语言和算法基础，开发环境并不是个大问题。当然说到开发环境，比如Windows上的Visual Studio是超级强大的，实际上这里说的开发环境，除了能够写程序之外，更重要的是掌握足够的调试经验，这个同样也是需要实践经验磨练的，和上一条一样，写够了足够多的行数，自然你的调试经验就丰富了。</p>
<p>除了调试之外，这里涉及的另一个问题，实际上是搜索新东西的能力。如果你经常跑一些技术论坛，经常会看到很多人问一些类似于“有没有关于XXX的库啊？”这样的问题，实际上这类问题，根本不用在论坛上问，你去Google一下就是了。你应该有这样自信：如果你通过Google没有找到，那么论坛上也不会找到了。搜索实际上一个很重要的能力，需要不断地锻炼。以前的文盲是不识字，现在的文盲是不会用Google。</p>
<h4>3：过硬的SQL语言基本功</h4>
<p>Web开发，绝大多数离不开数据库，所谓Web程序，绝大多数都是根据需要，把一堆数据，按照要求存储到数据库中，在需要的时候，再取出来，并显示的好看一些（怎么存取由后台决定，怎么显示好看，由前后台共同决定），就可以了。因此，小到一个留言簿，大到一个超级大系统，都离不开数据库的支持。因此，SQL语言，一定要搞熟，要能够根据各种稀奇古怪的要求，写出正确的SQL查询语句，这也是个功夫，需要不断积累一些经验。</p>
<p>尽管目前已经有了很好的ORM，可以使我们几乎不用写SQL，就可以做出很复杂的系统，但是当你对系统的性能有要求的时候，仍然需要十分关注ORM生成的SQL语言，如果你对SQL理解足够好，在写程序的就可以引导ORM生成质量更好的SQL语句。具体内容以后还会谈到。</p>
<h4>4：基本的数据库以及服务器的配置、管理经验</h4>
<p>上面第3 条说的是能够用SQL语句在程序中访问数据库，此外，还需要一些对数据库的配置、管理经验，理论上说，有一个专业的说法，叫做DBA，数据库管理员，专门做这个，但是作为开发人员，多少也需要了解一些，至少基本的配置管理操作要了解，至少要熟悉一种数据库系统，比如SQL Server、My SQL等。</p>
<p>此外，服务器的配置管理经验也是一个开发人员应该掌握的，这样在实际运行过程中，遇到一些问题，你都可以分析解决。</p>
<h4>5：对网络机制的理解</h4>
<p>要做Web开发，和以前开发的单机运行的程序相比，一个最本质的区别，就是有存在客户端和服务器的分别。用户在浏览器上，按了一个按钮，可能的结果是先在客户端运行了一些 Javascript代码，然后又传到服务器上，服务器又开始运行一些代码，然后把一些数据传回到客户端，结果客户端又开始运行另一些 Javascript代码，最后才给用会显示出正确的结果。那么这个过程，你就必须要非常清楚，在什么时刻，什么条件下，在哪里，运行了哪个程序的哪行代码。 这和以前在一台计算机上一个程序，从第一行运行到最后一行，是很不一样的。</p>
<p>这里的关键问题是，一定要对HTTP协议，有一定的了解，比如你一定要清楚 “请求”和“响应”分别是怎么回事，服务器和浏览器之间是如何传递数据，并协同工作的。这个不用了解的非常深入，但是至少要在概念上非常清楚，否则无法深入理解Web开发的实质。</p>
<h4>6：对“领域问题”有比较好的理解力</h4>
<p>所谓 “领域问题”，就是你要开发的系统，实现的具体功能是什么，比如你做一个“学生学籍管理系统”，那么就要对学校管理学生的具体方法、制度、规则深入、完整地理解，然后才能设计出一个合适的系统，适合这个需求，理论上来说，这个工作就比较“高级”了，在一个团队中，常常有“系统分析员”或者“系统架构师”的说法，其实也没有那么玄乎了，只是一定要真正能够理解用户的需求，才能做出一个正确的选择。因为客户并不懂技术，就要靠系统分析人员，来理解用户的需求。这一步做不好，结果将会导致整个项目陷入泥潭，后果不堪设想。</p>
<p>如果再多说几句的话，在中国的软件行业，由于没有之上产权的保护，做通用软件是很艰难的事儿，相对来说做企业的信息化，则要好得多。这种软件本质上是在卖服务，不存在盗版问题。市场已经过经过多年的启蒙，越来越多的企业认识到信息化能够给自己带来的巨大效益，这给软件行业带来了很大的机会。同时也说明一个问题，做企业软件要想挣钱，就必须深入某个行业，对这个行业理解得越深，做出来的软件才会越好用。而另一点是：这个行业本身越挣钱，你做软件也就越容易挣钱。当然，对于大多数人，这并不是想选择就能选择的。当然，对于还处于初学阶段的读者，还不用考虑太多挣钱的事儿，先把基础打牢就很好！</p>
<h4>7：Web开发框架</h4>
<p>所谓框架，就是根据一些相对通用的、固定的开发模式，设计出的一套程序库，开发人员可以直接利用这些框架提供的程序进行开发，从而大大减少工作量。在上面说的“三巨头”(.NET、Java、PHP)中，各自都有很多不同的框架，适用于不同类型的开发需求。在对Web开发有了一定的经验以后，就可以使用一些框架，来加速你的开发效率，即所谓提高你的“生产力”。比如在.net平台上，最近微软推出的 ASP.net MVC ，就属于这样的一个Web开发框架，实现了MVC模式的开发，当然MVC在JAVA上，和在Ruby on Rails前几年已经有了相应的框架。</p>
<p>ASP.NET 诞生已经已经10多个年头了，已经用了数百万的开发者，以及第三方的生态系统。到目前，在ASP.NET上有三种开发模式，按照微软的话来说，就像冰激凌的三种口味道：</p>
<p><center><img src='http://learning.artech.cn/wp-content/uploads/2011/02/aspnet.JPG' alt='aspnet.JPG' /></center></p>
<p>其中传统的是中间的ASP.NET WebForms，这种方式开发模式非常类似于传统的桌面开发，以控件为基础，非常成熟。</p>
<p>左边的 ASP.NET Web Pages，是一种刚刚发布的开发模式，使用的工具也是新发布的 Web Matrix，它的特点是表面上看起来，它非常类似于PHP或者传统的ASP，使用在HTML内嵌后台代码的方式，但实际上它又非常不同的改进，这种方式的特点是简单、轻量级和快速。</p>
<p>右边的是ASP.NET MVC，它的特点是强大、扩展性好，敏捷。这是我们以后要主要介绍的，具体的情况我们以后再慢慢深入介绍。</p>
<h4>8：数据访问层的开发效率加速</h4>
<p>实际上，统计表明，现在大多数Web开发工作，绝大部分工作是围绕着数据库中的数据的增、删、改、查来进行的。这些工作本质上都是通过SQL语言实现的，因此上面的第 3点中，特别提到了“过硬的SQL语言”的功夫，对一个开发人员的重要性。然而，最近几年出现了不少数据访问层的开发框架，有一个通用的名称叫做 “ORM”即“对象关系映射”框架，它的作用就是通过易于理解的高级语言支持的面向对象的操作方式，避免或减少编写难于理解、管理的SQL语句，从而可以大大提高开发和调试效率。同样，在“三巨头”上，有各自的不同的实现。比如.net上的 Linq To SQL，以及Entity Framwork都是这样的工具，使用他们以后，可以使开发人员不再直接编写，或减少直接编写SQL，可能会少量地降低运行的效率，但是可以大大提升开发效率。因此，对于开发人员来说，这些工具，也是值得关注的。还是那句话：对于程序开发来说，基本上没有什么其他成本，唯一的成本就是你的时间，所以要想尽办法提高你的生产效率。</p>
<p>当然，ORM不是万能的，大多数情况下，如果没有SQL基础，使用ORM还是会有问题，特别是效率问题。这就好像如果你有汇编语言的基础，再写C语言的代码，和不懂汇编的人写出来的，肯定是不一样的。</p>
<p>关于数据访问的一些更详细的情况，我们留在以后介绍。</p>
<h4>9：使用各种设计模式提升代码质量</h4>
<p>当我们熟悉了基本的增删改查的操作以及基本的开发框架之后，你做的系统也会越来越复杂。这种复杂有些是由于规模带来的，有些是由逻辑带来的。在系统越来越复杂以后，我们就需要有是系统保持清晰、可维护、高效，而避免各种各样的“坏味道”。设计模式（Design pattern）是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 当然，这里面有不层次的结构模式，比如语言本身提供，框架提供的等等。</p>
<p>例如，当一个系统比较大以后，我们就必须要考虑让系统的各个部分解耦和，也就是让系统的各个部分尽可能不互相依赖，那么使用依赖注入的模式就是一种非常通行的作法。这时，就可以使用一些专门的库，来方便地实现相应的功能，例如 StructureMap就是.NET环境下的一个轻量级依赖注入工具，用起来很方便，当然类似的工具还有很多。</p>
<p>再比如，当我们的系统分层以后，在不同层之间，经常需要传递对象，这种项通常称为DTO（Data Transter Objects），业务逻辑的对象与DTO对象之间，就像业务逻辑对象和数据库对象之间一样，也存在不匹配的情况，因此也可以找到一些相应的库来做一些映射，例如AutoMapper就是一个这样的内存中的对象映像工具。</p>
<p>总之，在系统越来越复杂以后，就会遇到越来越多的问题，这些问题解决得不是“能不能”问题，而是“好不好”的问题。当我们的着眼点越来越侧重于这些“怎么样作效果更好”的问题时，就说明我们已经进步了。</p>
<h4>10：测试、测试还是测试</h4>
<p>现代软件工程中，关于测试的重要性，在不断提高。TDD——Test Driven Development 驱动测试开发，已经得到了越来越多的认可和接受。当然，就目前国内的开发状况，真正能做到TDD的开发团队可能并不很多，主要是因为使用TDD，确实大幅度地增加了代码量。但是，做的项目越复杂，重要性越高，测试的重要性就越高。而且测试将从一个增加开发时间的事情，变成节约时间的事情了。</p>
<p>系统要不断改进，要使用敏捷方法，都需要不断地重构程序，先实现某些功能，然后进行重构，实现程序代码更合理，从程序的结构、维护性等各个方面提高代码质量。但是需要牢记的一点是，如果没有自动化的测试作为保证，代码重构就是一个非常危险的时候，因为无法保证重构以后，不改变代码的行为。</p>
<p>因此，对于成熟的开发团队，测试势必需要重视的一个方面。</p>
<h4>本文总结</h4>
<p>文本概述了，研究学习Web开发的10个应该重视的方面。无论使用什么具体的开发语言和开发平台，这些方面都是相同的。本文也作为我要写的书的一个提纲，我在书中也会涉及到上面提到的这些方面，当然详略不会相同，有的将作废查国内详细的介绍，有些则简单给出一些介绍和演示。</p>
<p>需要指出的是，Web开发的复杂程度，要比前端复杂不少，设计的范围也远较HTML和CSS广得多。我们写文章和书的目的，就是结合我们自己的实践经验，给初学者一些帮助，少走一些弯路，而绝对无法给出最佳的方案。如果您是有经验的专业开发者，有什么不同意见和建议，请告诉我；如果您是初学者，也可以把您的问题告诉我，我会尽可能解答。</p>
<p>希望我的文章对您有所帮助。</p>
<p>您可以到新浪微博联系我：   <a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a> 。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>写书计划，欢迎大家提建议</title>
		<link>http://learning.artech.cn/20110128.new-book.html</link>
		<comments>http://learning.artech.cn/20110128.new-book.html#comments</comments>
		<pubDate>Fri, 28 Jan 2011 10:11:24 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[.NET Web 开发研习]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110128.new-book.html</guid>
		<description><![CDATA[大家好，
在2011年，计划编写一本关于Web开发的书。

在构思这本书的过程中，我会写一些文章，供大家参考：
0. 写书计划，欢迎大家提建议
1. Web开发的“十事要说” 
2. 关于学习C#语言的几个... ]]></description>
			<content:encoded><![CDATA[<p style = "text-indent:0">大家好，</p>
<p>在2011年，计划编写一本关于<strong>Web开发</strong>的书。</p>
<div style="border:1px solid #ccc;padding10px;">
<p>在构思这本书的过程中，我会写一些文章，供大家参考：</p>
<p><a target="_blank" href="http://learning.artech.cn/20110128.new-book.html">0. 写书计划，欢迎大家提建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110215.dot-net-web-dev-1-10-skills-needed.html">1. Web开发的“十事要说” </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110218.dot-net-web-dev-2-how-to-learn-c-sharp.html">2. 关于学习C#语言的几个建议</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110222.dot-net-dev-2-tech-choosing.html">3. 技术平台选择，兼谈.Net 与微软</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110227.dot-net-web-dev-4-language-and-framework.html">4. 语言与框架 </a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110302.dot-net-web-dev-5-orm.html">5. ORM(对象关系映射)</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110311.dot-net-web-dev-6-gomoku.html">6. 学习编程实践之“五子棋”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110315.dot-net-web-dev-zip-algorithm.html">7. 学习编程实践之“文件压缩”</a></p>
<p><a target="_blank" href="http://learning.artech.cn/20110325.how-ucla-teach-c-sharp.html">8. 美国名校计算机系如何教C#</a></p>
<p>不断添加中……</p>
</div>
<h3>基本背景</h3>
<p>Web开发从本质上说，在做三件事：</p>
<p>1）要给程序的用户提供一个美观、易用、灵活的<strong>用户界面</strong>；</p>
<p>2）根据程序的功能要求，实现一定的<strong>逻辑</strong>，包括接受用户的请求，从数据库中取出来，然后再传给客户端的浏览器上，以及把用户输入的数据存储到数据库里；</p>
<p>3）需要通过数据库系统（比如SQL Server），把内容<strong>存储</strong>在数据库中，或从数据库中<strong>读出</strong>来。</p>
<p>这三件事可以概括为“<strong>表现</strong>”、“<strong>业务逻辑</strong>”、“<strong>持久化</strong>”这三个词语。我们以往出版的书，都是针对第一件事（通常称为“Web设计”或“前端”）的，<strong>而这本书我们将把目光聚焦于后两者（通常称为“Web开发”或“后端”）</strong>。</p>
<p><center><img src='http://learning.artech.cn/wp-content/uploads/2011/01/book1.png' style=" width:200px ; height:210px;" alt='book.png' /></center></p>
<h3>基本内容</h3>
<p>与页面设计不同，服务器端程序的开发，有很多不同的工具和平台可以选择，目前Web开发的主流平台有“三巨头”（.net、Java 和 PHP），以及 Ruby on Rails 等其他工具。 我这几年来一直从事 .net 平台上的开发工作，因此将介绍与之相关的内容，所有内容都是来自于这几年的实践。</p>
<p>具体来说，包括以下两个核心内容：</p>
<p>1）ASP.net MVC  ：这主要是来解决“业务逻辑”层的问题，也 ASP.net 未来的主流开发模式，我们将使用MVC 3 版本；</p>
<p>2）Entity Framework ：这主要来解决“持久化”层的问题，这是微软的核心ORM（对象-关系映射框架）。在书中，将以 Code First 模式为主，兼顾 Model First 和 Database First 模式。Entity Framework 4 最新的 Feature Pack 将于近期正式，我现在使用的是正式版之前的最后一个预览版，写书的时候，正式版就会发布了。</p>
<p>此外，我还希望把一些相关的基础内容也穿插其中进行介绍，使读者不但知其然，而且知其所以然，比如HTTP协议的一些基本知识、SQL数据库的性能优化等等。</p>
<h3>目标读者</h3>
<p>写任何一本书，第一步是确定目标读者，我基本设想为：</p>
<p>1）对 HTML、CSS非常熟悉；</p>
<p>2）对 Javascript 基本了解，能够使用一点 jQeury；</p>
<p>3）对 C# 语言和 OOP 概念有一定的了解。</p>
<p>也就是说，对前端要足够熟悉（书中不会再做相关介绍），编程有一定基础（对于一些重要内容，我会做一些重点说明，比如Lambda表达式、Linq、SQL语句等概念）。当然，这里面的一个问题，本书肯定会比较重的倚赖C#语言，我原来打算先写一本书C#+OOP的书（其实已经写了100多页），但是我后来觉得市面上的C#书还是有不少不错的，似乎我再写一本的意义不是很大，所以就决定还是写一本更偏重实际开发的了。</p>
<h3>图书体例</h3>
<p>实际上，写书实践型的技术书籍，最重要就是<strong>做好案例、讲好案例</strong>。实际工作中， Web开发通常解决的是两类任务：</p>
<p>1）对外的网站。例如做一个博客系统、论坛系统，或者时髦的微博系统等等；<br />
2）企业内部使用的信息管理系统，实际上这部分需求比第一类更大。例如ERP、客户关系管理、办公自动化系统。</p>
<p>我希望在书中，介绍若干实际的系统。实际上，用上面提到的工具，开发一个博客、微博这样系统，并不是一件很困难的事，任何人都可以做到。Ruby On Rails的官网首页就有一个“15分钟开发一个博客系统”的视频演示，很吸引人眼球，我们也可以在第一章，就给出一个Just Follow 模式的例子，做一个博客出来。</p>
<p>当然，要开发一个可靠的、有性能要求的、好用的企业级的软件，还是很复杂的，并非看一本书就可以搞定的。对此，我们会尽可能给出一些方法，至少可以保证你做出的网站不会像昨天摇号网站出现的那种大漏洞。</p>
<p>以前的计算机语言的书，第一个例子都是著名的“Hello World!”，对于今天而言，开发一个博客系统就是“Hello World!”。</p>
<h3>请不吝赐教</h3>
<p>如果您对这个题目感兴趣，欢迎给我一些建议。可以在这里留言，也可以到我的微博跟我交流： <a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a> 。</p>
<p>希望我的书对更多的读者有帮助！谢谢大家的支持！</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110128.new-book.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>祝大家新年快乐！</title>
		<link>http://learning.artech.cn/20110103.happy-new-year-2.html</link>
		<comments>http://learning.artech.cn/20110103.happy-new-year-2.html#comments</comments>
		<pubDate>Mon, 03 Jan 2011 09:27:15 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[本站信息]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20110103.%e7%a5%9d%e5%a4%a7%e5%ae%b6%e6%96%b0%e5%b9%b4%e5%bf%ab%e4%b9%90%ef%bc%81.html</guid>
		<description><![CDATA[2010年飞驰而去，我在去年一年没有顾上这个博客，非常抱歉！
在今年争取能够重装上阵，同时也希望能出两本新的技术图书。
去年的最后一天，我也赶时髦，在新浪开了一个微博 http://t.sina.co... ]]></description>
			<content:encoded><![CDATA[<p>2010年飞驰而去，我在去年一年没有顾上这个博客，非常抱歉！</p>
<p>在今年争取能够重装上阵，同时也希望能出两本新的技术图书。</p>
<p>去年的最后一天，我也赶时髦，在新浪开了一个微博 <a target="_blank" href="http://t.sina.com.cn/1906984307">http://t.sina.com.cn/1906984307</a>，有兴趣的新老朋友可以到哪里找我，欢迎交流！</p>
<p>谢谢大家！再次祝大家新年快乐，工作学习顺利！</p>
<p>温谦</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20110103.happy-new-year-2.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>新书信息:《别具光芒——CSS网页布局案例剖析》</title>
		<link>http://learning.artech.cn/20100502.css-new-book.html</link>
		<comments>http://learning.artech.cn/20100502.css-new-book.html#comments</comments>
		<pubDate>Sun, 02 May 2010 14:22:00 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[本站信息]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20100502.css-new-book.html</guid>
		<description><![CDATA[大家好：
我们最近有一本新书上市了，仍然是CSS方面的，书名是《别具光芒——CSS网页布局案例剖析》。由于这本书的出版拖了比较长的时间，大概一年多的时间，我本人目前还没有看到这本... ]]></description>
			<content:encoded><![CDATA[<p>大家好：</p>
<p>我们最近有一本新书上市了，仍然是CSS方面的，书名是《别具光芒——CSS网页布局案例剖析》。由于这本书的出版拖了比较长的时间，大概一年多的时间，我本人目前还没有看到这本书 的样子～～</p>
<p><a href="http://learning.artech.cn/download/CSS-Samples.rar">读者请到这里下载本书的案例</a>。</p>
<p>请稍等几天我拿到这本书的样书之后，在给大家介绍一下这本书。</p>
<p>谢谢大家！</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20100502.css-new-book.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Web开发杂谈(10) —— 原型设计与工具</title>
		<link>http://learning.artech.cn/20091209.sketchflow-intro.html</link>
		<comments>http://learning.artech.cn/20091209.sketchflow-intro.html#comments</comments>
		<pubDate>Wed, 09 Dec 2009 11:20:28 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[Web开发杂谈]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20091209.sketchflow-intro.html</guid>
		<description><![CDATA[任何一个网站都是经过一定的过程，才能逐渐由头脑中的概念成为一个真正的网站的。一个网站的设计过程往往是需要经过大量的修改、甚至若干次的推翻重来，才可以达到最终的结果。今天... ]]></description>
			<content:encoded><![CDATA[<p>任何一个网站都是经过一定的过程，才能逐渐由头脑中的概念成为一个真正的网站的。一个网站的设计过程往往是需要经过大量的修改、甚至若干次的推翻重来，才可以达到最终的结果。今天来简单谈谈这个过程中使用的方法和工具。</p>
<h3>问题的背景</h3>
<p>在最初的设计阶段，最重要的一点是与客户进行良好而充分的沟通。尤其是<b>现在的网站功能越来越复杂，而客户往往只能描述一些非常抽像的概念、想法和特征</b>。</p>
<p>因此需要我们做设计和开发的人充分理解客户的想法，但是一个重要的问题是，我们如何验证我们是否真正理解了客户的想法呢？当然我们通常会写一些文档，作为与客户签订合同的附件。但是即使用再多的文字描述，毕竟客户看不到最终的效果，而最终开发出来的网站或系统如果不符合客户的心意，就是一件非常麻烦的事情了。要么为了符合客户的要求，而进行大量的修改工作，其中的成本是非常巨大的，而你向客户追加费用是很困难的事情了，即使客户同意，也不是件令人非常开心的事。要么就只能凑了，也许这并不是设计和开发公司的责任，但是毕竟问题发生了。</p>
<p>那么从比较理想的方式应该是如何的呢？显然，如果我们能够<b>在还没有真正开始投入大量人力进行设计和开发之前，就可以让用户看到最终的效果和功能</b>，那就是最好的了！这就是所谓的“原型设计”的作用。</p>
<p>我们用尽可能小的代价，把我们理解的用户需求表现出来，或者叫“模拟”出来，甚至用户可以实际操作，就好象这个系统已经做好了一样，这样将来做出来的系统和这个“原型”系统非常接近，那么在开发完成后在发现问题的可能性就小多了。</p>
<h3>静态原型</h3>
<p>因此，原型系统是非常重要而有效的一个手段，那么有什么好的方法来实现“原型”呢？</p>
<p>当然，最基本的方法就是手工绘制一些图纸了，此外，比如Fireworks软件中，提供了一些更为方便的进行原型设计的功能，但是这些方法和软件还是停留在“静态”展示的层面，本质上和手工绘制一些图给客户，进行纸上谈兵是一样的。</p>
<p>而现在网站的交互功能越来越强，一些基于Web的信息管理系统，操作起来就跟们更为复杂，比如各个页面之间的跳转，如果使用了Ajax等技术，页面还会局部刷新，如果都要用静态的图像来表达，实际上是非常困难的。</p>
<h3>SkecthFlow 增加原型系统的动态性 </h3>
<p>因此，如果我们可以方便地制作出，可以模拟最终的动态效果的原型，那么就好多了！这是基于这个原因，近年来出现了一些具有模拟效果的原型设计软件，比如我们以前介绍过的Axure RP Pro，不我实际使用过一两个项目以后，感觉这个工具还是不够方便。而今天介绍一个我刚刚开始使用的软件 SketchFlow，感觉非常棒！实际上这不是一个独立的软件，而是附属于 Expression Blend 的一部分。而 Expression Blend则是微软的 <a target="_blank" href="http://www.microsoft.com/china/expression/">Expression Studio</a> 套件中的一个。如果再往下说，就要到大名鼎鼎的 Silverlight （微软指望靠它和Flash大干一场呢）上了—— Expression Blend 正是用来设计和开发 Silverlight应用的软件，因此对于微软来说，这可是一个重头戏。</p>
<p>而在 Expression Blend 3 中，包括了一个部分叫做“SkechFlow”，我们今天要讲的就是它了。 因此现在这个软件的全称叫做“<a target="_blank" href="http://www.microsoft.com/china/expression/products/Sketchflow_Overview.aspx">Microsoft Expression 3 + SketchFlow</a>”，够长的名字。</p>
<p>Sketch 就是草图的意思，Flow就是流程的意思，因此合在一起，就是“流程草图”的意思。那么它具有什么用呢？</p>
<h3>SkecthFlow 的用途 </h3>
<p>首先，这个Blend这个软件本身就是可以绘制矢量图形和动画的，因此用它来绘制页面的草图是很方便的，比如假设我们要租一个网站，首先是一个登录页面，然后进入到一个内容页，我们就可以非常方便地绘制出如下的图形，注意这种风格是专门为此设计的草图风格，看起来就像是手绘的风格，主要的目的就是给用户展现的是页面的核心概念和功能，而不会是非常细节的样式。我个人非常喜欢这种风格，看起来分舒服。</p>
<p><img src='http://learning.artech.cn/wp-content/uploads/2009/12/sketchflow.png' alt='Sketchflow' /></p>
<p>当然，如果只是把图像绘制的看起来手绘风格，那么也就没有太的改进了，更更为重要的是，使用SketchFlow制作的网站原型，可以精确地模拟实际操作过程，比如上面图中，登录框中的用户名输入框、密码输入框、滑动条、选择框、按钮都是可以实际操作的，而且通过简单控制，就可以非常方便地使他实际工作起来。在比如，上面的右图中，“作者介绍”和“读者评价”部分，各有一个滚动条，而这些滚动条都是有实际作用的，因此使用这种方式制作出来的原型，可以使客户非常直观而精确地了解最终这个网站完成以后，会是什么样子的，这样如果他又不满意的地方，在一开始就可以明确地指出来，这样对于我们开发成本的控制就大有好处了。</p>
<p>此外，软件中给出了方便的导航图，以显示各个页面之间的导航关系，也非常清晰实用，如下图所示。</p>
<p><img src='http://learning.artech.cn/wp-content/uploads/2009/12/flow.png' alt='Sketchflow 2' /></p>
<p>有兴趣的读者可以在浏览器中实际看一下演示的效果，如果没有安装Silverlight插件的话，需要安装一下。<a target="_blank" href=" http://learning.artech.cn/uploads/blog-files/sketchflow/demo1.html">请点击这里查看实际效果</a>，在登录页面随意输入，然后按Login按钮，导航至内容页面，可以在左侧调整大小。</p>
<p>此外，SketchFlow还可以自动生成Word格式文档，包括目录、文字、导航图、各个页面都准备好了，这样稍作修改后，提供给客户交流，就非常方便，也非常专业了。如下图所示。</p>
<p><img src='http://learning.artech.cn/wp-content/uploads/2009/12/flwo2word.png' alt='Sketchflow 2 word' /></p>
<p>当然，这个软件的功能还远远不止于添加几个导航链接的功能，因为它本身用C#或者VB就可以进行深入而灵活的控制了，不过我自己也没有深入学习过Silverlight的开发，并不能说的非常清楚，此外这些操作并非几句话可以说清的了，有兴趣的读者，可以参看前不久的<a href="http://microsoftpdc.com/Sessions/CL23">微软开发者大会上关于 SketchFlow 的讲演</a>： http://microsoftpdc.com/Sessions/CL23 。讲演者说的英语不算快，还比较容易听懂，另外有很多屏幕操作，也很有帮助。</p>
<h3>本文小结</h3>
<p>今天重点介绍了两个问题，1）在实际开发之前，制作原型系统的重要性，以及能够给我们带来的好处。 2）使用 SketchFlow 可以比较方便地制作出高度模拟实际效果的原型系统，给我们带来很大的益处。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20091209.sketchflow-intro.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>如果无法在线播放本站的视频教程，请告知，谢谢</title>
		<link>http://learning.artech.cn/20091112.can-not-play.html</link>
		<comments>http://learning.artech.cn/20091112.can-not-play.html#comments</comments>
		<pubDate>Thu, 12 Nov 2009 03:16:56 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[本站信息]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20091112.can-not-play.html</guid>
		<description><![CDATA[前几天，我们使用的服务器提供商在技术上做了一些修改，导致本站上的一部分 FLV 格式的视频无法正常下载观看了，经过我们和服务商的技术人员联系，目前已经解决，从我们这里访问，可以... ]]></description>
			<content:encoded><![CDATA[<p>前几天，我们使用的服务器提供商在技术上做了一些修改，导致本站上的一部分 FLV 格式的视频无法正常下载观看了，经过我们和服务商的技术人员联系，目前已经解决，从我们这里访问，可以正常观看视频教程了，速度也不错，非常流畅。</p>
<p>如果您在观看的时候，无法正常在线播放的话，请在这里留言，说一下您遇到的现象，我们会进行检查，谢谢！</p>
<p>谢谢大家的支持！</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20091112.can-not-play.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Web开发杂谈(9) ——网站空间故障的排查</title>
		<link>http://learning.artech.cn/20091104.server-network-checking.html</link>
		<comments>http://learning.artech.cn/20091104.server-network-checking.html#comments</comments>
		<pubDate>Wed, 04 Nov 2009 06:59:53 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[Web开发杂谈]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20091104.server-network-checking.html</guid>
		<description><![CDATA[我们从去年6月份开始为我们的一些读者提供实际练兵的的虚拟主机空间——“学以致用”计划，现在有了不少的会员。本文主要是针对我们的会员遇到问题时参考来解决问题用的，如果您拥有... ]]></description>
			<content:encoded><![CDATA[<p>我们从去年6月份开始为我们的一些读者提供实际练兵的的<a target="_blank" href="http://talking.artech.cn/thread-1003-1-1.html">虚拟主机空间——“学以致用”计划</a>，现在有了不少的会员。本文主要是针对我们的会员遇到问题时参考来解决问题用的，如果您拥有自己的网站，使用的是其他的空间商提供的空间，如果有类似问题的读者也可以参考，希望对您有所帮助。</p>
<h3>先了解一些基本原理</h3>
<p>当您制作完成了一个网站，租用一个“学以致用”空间（或者称为虚拟主机），把网站发布到了空间，这时全世界的人都可以访问你的网站了。有的时候，会遇到一些问题，比如网站连不上了，或者觉得网页装载的速度不够快等等，当然遇到这种情况，可以给我们发信，我们会帮你检查。</p>
<p>但是在这里介绍一下，你应该做哪些自己可以做的检查工作，这也大致可以判断出问题出在哪里。这里先介绍一些简单的原理性知识.</p>
<p>我们知道，访问一个网站，输入一个网址，最终看到了你要看的网页，数据的传递实际上经过了千山万水，很多个环节，大致包括以下几个部分：</p>
<div style="border:1px solid #BBB">
<p>1：你自己的电脑。</p>
<p>2：如果你是在一个局域网，比如单位或家庭的局域网，则要经过局域网的路由器链接到互联网上。</p>
<p>3：互联网会从你家附近的电信局一个节点一个节点地找到目标服务器。</p>
<p>4：如果你的服务器在国外，还会经过海底光缆，进入其他大陆的互联网（我们给会员提供的服务器是位于美国的）。</p>
<p>5：进入服务器所在的机房（数据中心）。</p>
<p>6：到达最终的服务器，服务器根据请求的页面，产生网页内容，再沿着上述路径返回传输到你的电脑上。</p>
</div>
<p>因此，如果在这一些列的传输过程中，任何一个节点出现故障，都会导致无法看到你要看的网页。如果你的网站不能够正常打开了，首先要判断一下是在上述6个环节中的哪一个环节出了问题。</p>
<h3>自检步骤</h3>
<p>请根据下列操作进行分析：</p>
<p>1：首先如果可以正常上新浪、Google、百度等网站（注意确认打开的不是缓存网页，最好使用Google随便搜索一个词，看看返回的结果是否正常），说明你的电脑和外界的互联网连接正常，反之说明你的电脑或者内部的局域网连接有问题了。</p>
<p>2：如果可以访问新浪等大网站，而无法访问你自己的网站，那么就需要判断是哪里断了？可以用下面两种方法</p>
<p>      A: 比较快速的方法，使用 Ping 命令。选择Windows 的开始菜单，选择“所有程序 > 附件 > 命令提示符”，这时出现一个命令行窗口。用键盘输入&#8221;ping 你要诊断的网站的域名&#8221;，然后回车，这时，如果网络连接正常时，将会看到如下所示的结果。</p>
<p><img src='http://learning.artech.cn/wp-content/uploads/2009/11/ping-1.gif' alt='ping结果' /></p>
<p>而如果网络连接的某个环节发生中断时，将会看到如下所示的结果，说明无法连接到你要看的网页所在的服务器。</p>
<p><img src='http://learning.artech.cn/wp-content/uploads/2009/11/ping-2.gif' alt='ping结果' /></p>
<p>    B：同过上面的 Ping 命令，可以检查从你的电脑到目标服务器之间的网络连接是否通畅。此外，还有一个比Ping命令更为详细的命令 —— Tracert 。</p>
<p>        对于服务器在国外的情况，比如我们的虚拟主机，如果出现了中断，需要判断一下中断的路由器在国内还是国外。可以进入命令行窗口，然后使用“Tracert”命令。</p>
<p>       对于链接通畅的网站，结果应该是如下所示。</p>
<p>       <img src='http://learning.artech.cn/wp-content/uploads/2009/11/tracert-1.gif' alt='tracert-1.gif' /></p>
<p>       其结果显示的就是从你的电脑到目标服务器之间经过所有路由器的IP地址，注意每一行中间有一个几十或几百的数字，其确切含义这里不多解释了，只是你会注意到，从起点开始这个数值一般情况下会越来越大，特鄙视你会看到，其中有一跳之后数字突然从几十毫秒变成200多毫秒，这就是从国内的网络进入了国外的网络。</p>
<p>      如果某一个途中的某个路由发生故障，那么在从该节点开始，原来现实毫秒数的数值就会显示为星号，如图所示，表示连接发生故障了。</p>
<p>      <img src='http://learning.artech.cn/wp-content/uploads/2009/11/tracert-2.gif' alt='tracert-2.gif' /></p>
<p> 某一个节点发生了故障而导致中断，你就可以判断故障发生在国内还是国外。看一下上面正常的那个tracert结果图，数字很小的那些节点如果变成星号了，就说明是国内的网络出问题了，而如果时是后面数字比较大的节点变成星号了，就说明国外的某个网络节点出问题了。</p>
<p>从我这四五年的经验来看，这种骨干网发生故障的情况并不多见，尤其是国外一侧几乎一年于不到两三次，每次最多几分钟，国内相比之下就会多不少，特别是似乎几个月会调整路由，会在某一天或几天中，频频发生故障，而我们用户也没有什么办法，只能等待。</p>
<p>     因此，当你发现国内或者国外的路由节点发生故障了，就耐心等待一会儿，一般就会好了，因为这些骨干线路发生故障，影响面很大，会很快修好的。</p>
<p>3：如果使用Tracert命令发现整个路由的最后一个节点无法，也就是目标服务器显示的星号，那就说明是这台服务器当机（死机 、停机，总之是故障了），可以给我们发邮件，我们给你查一下。给我们发邮件的时候，请附一个路由结果。</p>
<p>4：如果服务器可以Ping通，即最后一节点也可以正常显示出正常的毫秒数值，但是网站打不开，那很可能是服务器还没有完全死机，但是一些服务，比如HTTP服务已经无法正常运行了，可以给我们发邮件，我们给你查一下。 给我们发邮件的时候，请附一个路由结果。</p>
<p>上述第3、4两点如果发生故障，那就是服务器提供商的责任了，就我们的经验看来，我们选用的服务商的服务还是相当稳定的。</p>
<p>上面说的是如果你的网站完全无法连接的时候，如何判断故障原因。接下来，有的时候，你会觉得打开速度不够快。这个问题就很复杂了。特别是中国的网络情况是非常复杂的，全国各地访问同一台服务器，结果速度可能就相差很多。</p>
<p>因此，建议你这样做：</p>
<p>1：平常没事儿的时候，也可以用tracert命令查一下从你的电脑到目标服务器之间的路由结果，这样平常有个印象，当某一个时刻，你感觉网站的速度不如平常的时候，tracert一下，看一看结果是否和平常相同，如果结果正常，那么或者是你的网站的设置出问题了，或者可能你是你的心理作用了，既不是网络的链接问题。</p>
<p>2：如果发现路由中，某个节点的数值突然变大了很多，那就说明是这个节点的路由器有点问题了，这个也做不了大多，一般来说经过一段时间，就会恢复正常了。</p>
<p>3：如果你没有发现任何问题，但是觉得速度很慢，可以这样检测一下：</p>
<p>首先，安装一个Firefox浏览器，然后安装Firefox的一个插件，叫做<strong>Firebug</strong>，利用这个插件，可以精确地测量一个页面的详细的装载过程和时间，例如</p>
<p><img src='http://learning.artech.cn/wp-content/uploads/2009/11/firebug-1.gif' alt='firebug' /></p>
<p>如图所示，安装好Firebug以后，可以在Firefox浏览器的右下角看到一个小虫子的图标，单击该图标，在浏览器窗口的下半部，会出现一个新的窗口，如图中的红色方框所示，选择“网络”、“所有”，然后浏览一个网页，这是下侧的窗口里就会显示出该页面中包括的所有文件，比如html文件、CSS文件、图像文件等等，完整的如下图所示。</p>
<p><img src='http://learning.artech.cn/wp-content/uploads/2009/11/firebug-2.gif' alt='firebug监视网页加载的时间' /></p>
<p>可以看到，列出了每个文件的大小，以及装载的次序，每个文件的后面有一个彩色的横柱图示，不同颜色代表装载该文件的不同阶段，其实就是对应于本文开头说的那些步骤。</p>
<p>你用这个插件查看一下你的网站的装载情况，看看主要慢在哪里，比如是否页面的体积太大？图排太多？图片没有压缩？如果你还是无法判断，把这个图发新给我们，我们给你看一下，是否正常，以及可能出现的问题。注意Firebug窗口的最底下计算了整个页面的所有文件的总的大小，以及完整装入浏览器的总时间，比如图中这个页面，所有文件加在一起200多K字节，一共用了5秒多装载，基本上可以接受。当然这里面要说的话，还有很多很多讲究的，并非几句话可以说清的了。</p>
<p>顺表说一句题外话，Firebug这个插件功能非常强大，对于网页设计，特别是要跟CSS打交道的设计师，以及要做Javascript开发的人员，Firebug都是必不可少的工具。以后有时间的时候，我会写一些相关的文章，介绍一下。</p>
<h3>本文总结</h3>
<p>如果遇到访问或者网络连接问题，请仔细阅读上文，如果仔细看过之后仍然无法找到原因，请给我们发邮件，在邮件中，请附带执行tracert命令的图，如果您的网站可以打开，但是觉得速度慢，在邮件初中附上Tracert的图，以及firebug的装载时间图，以便我们帮你查找原因。</p>
<p>如果你发现你的<a target="_blank" href="http://talking.artech.cn/thread-1003-1-1.html">“学以致用”</a>主机的网站无法访问，或者感觉速度不好，经过上述检查手段，仍然无法发现原因，请给我们发邮件。在邮件中请包括必要的内容：</p>
<p>1：一定要包括一个 Tracert 你的网站 的结果截图。</p>
<p>2：如果网也打得开，但是你觉得网站打开的速度慢，请包括一个firebug的页面装载时间图，就像上面第二个firebug图那样的图。</p>
<p>如果您使用的是其他虚拟主机，遇到类似问题，也可以把这些结果发给客户服务的技术支持人员。就像到医院看病一下，关键是要找出问题的原因在哪里，然后再能够解决。用一些工具去进行判断，就像看病的时候要做化验、做CT扫描等检查一样，都是很重要的手段。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20091104.server-network-checking.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>随笔随心(6) —— 闯荡北京值不值？</title>
		<link>http://learning.artech.cn/20091103.living-in-beijing.html</link>
		<comments>http://learning.artech.cn/20091103.living-in-beijing.html#comments</comments>
		<pubDate>Tue, 03 Nov 2009 11:55:17 +0000</pubDate>
		<dc:creator>温谦</dc:creator>
		
		<category><![CDATA[随心随笔]]></category>

		<guid isPermaLink="false">http://learning.artech.cn/20091103.living-in-beijing.html</guid>
		<description><![CDATA[一位老朋友 keelii 今天问了一个问题：
老师最近忙不？闲的话我请教个问题：最近我们都已经在找工作了，学校也来了很多招聘的公司，但都没有软件方面的。我本身是学软件技术专业的，但... ]]></description>
			<content:encoded><![CDATA[<p>一位老朋友 keelii 今天问了一个问题：</p>
<p style="color:#B00;">老师最近忙不？闲的话我请教个问题：最近我们都已经在找工作了，学校也来了很多招聘的公司，但都没有软件方面的。我本身是学软件技术专业的，但对网页设计和前端工发比较感兴趣。想找一份前端的工作，初步打算去北京。老师能给点建议吧？先谢谢啦！</p>
<p>这里我说几点我的想法吧。我觉得凡事都是有利有弊的。</p>
<h3>这里先说北京的坏处吧：</h3>
<p>1：生活成本比较高，特别是房价太高，没有基础的年轻人，只身北京闯荡，开始的艰苦可想而知。而且成功的概率也并不是100%，不努力肯定不行，努力了也不一定就行。除非发展非常顺利，否则想挣出一套房子，都已经非常困难了。</p>
<p>2：气候不算好，冬天冷，过日子可能未必舒服。</p>
<p>3：城市太大，交通拥堵，上班费劲，总之在北京有很多不方便。</p>
<p>4：相比之下，北京的生活没有很多城市休闲。</p>
<h3>北京的好处：</h3>
<p>1：公司多，机会多。牛人多，便于你学习。如果善于处事，加之自身努力，过上世俗意思以上的好日子也是没问题的。</p>
<p>2：在北京，无论做什么行业，市场容量都极大，金字塔形的层次很多，无论你是什么水平，都可以找到一个适合你生存的层次。一条完整的食物链，无论是大鲨鱼，还是小虾米，都能活。如果努力勤奋又肯动脑子的话，北京是个很好的发展事业的地方。</p>
<p>3：北京可以算是一个移民城市了，真正祖上几代都是北京人的并不多，因此相对来说，外来的人在和本地人相处，相对比较容易一些。1949年解放的时候，北京只有200万人，现在快2000万了，多出来的都是移民。</p>
<p>4：北京经历的问题，其它城市将来都会经历，比如交通拥堵、环境污染等等，其它城市如果现在还没有遇到，只是因为还没有到时候而已。比如说交通，北京从2000年开始，汽车数量开始猛增，很多城市从今两三年开始汽车猛增，所以很多城市的交通问题很快就会爆发了。如果你在中国不同城市开过车，会发现北京的交通管理、交通设施算是非常好的，因为已经堵了这么多年了，久病成医嘛。在比如空气不好，但是我发现中国的各个大城市，没有哪个好的，而且北京的空气这几年特别是今年，比原来还真是好的多了。这是集权政府不多的一点优点了。</p>
<h3>结论</h3>
<p>从我身边看到的人来说，应该可以分为4类了:</p>
<p>1：不少没有任何基础的来到北京发展的非常好的；</p>
<p>2：也有干了多年发展很不得顺利离开的；</p>
<p>3：并不是工作的原因，而是因为其他原因，比如生活、家庭等原因，离开北京去其它城市的。</p>
<p>4：也有不好不坏的，也还在北京继续生活的；</p>
<p>不过总体来说，似乎留下来，并且过得越来越好的，还是占大多数。</p>
<p>所以关键还是要看自己的理想、基础、能力、性格等各个方面。 其实工作来说，未必只看着北京，我觉得比如成都这样的城市，也很不错，大学多，人力资源丰富，这就决定了一定会发展的很快，而且，相对物价低一些，吃得又好，生活舒适。就好像人们选股票，关键要找价值被低估的洼地，将来升值的空间就会更大。只是没有人能预测未来，所以只能看自己的感觉了。</p>
<p>总之，年轻的时候创一创还是值得的！但是还是要审时度势。既要低头拉车，也要抬头看路。</p>
]]></content:encoded>
			<wfw:commentRss>http://learning.artech.cn/20091103.living-in-beijing.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>

