<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>紫枫印象 &#187; 前端开发</title>
	<atom:link href="http://www.86ue.com/archives/tag/%e5%89%8d%e7%ab%af%e5%bc%80%e5%8f%91/feed" rel="self" type="application/rss+xml" />
	<link>http://www.86ue.com</link>
	<description>UED web2.0 前端技术 用户体验 SEO 80后</description>
	<lastBuildDate>Sun, 14 Mar 2010 14:02:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>YUI3设计中的激进和妥协</title>
		<link>http://www.86ue.com/archives/759</link>
		<comments>http://www.86ue.com/archives/759#comments</comments>
		<pubDate>Fri, 29 Jan 2010 13:54:37 +0000</pubDate>
		<dc:creator>紫枫印象</dc:creator>
				<category><![CDATA[前端技术]]></category>
		<category><![CDATA[YUI3]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[设计]]></category>

		<guid isPermaLink="false">http://www.86ue.com/?p=759</guid>
		<description><![CDATA[相信每个前端工程师都有自己喜爱的 javascript框架，说情感也好，道信仰也罢，javascript框架带给人的不仅仅是便捷的开发，更有一种纯粹的逻辑美感，不管是jquery 曼妙的简洁，还是yui魔术般的沙箱，都使我们产生无穷的想象。然而，js框架却又必然无法做到面面俱到的完美无瑕，比如jquery在OO方面做出的让步，以及yui在性能上做的牺牲，无不给人传达一种缺憾美、一种理想的现实主义。今天，我们来看看yui3在框架设计中的这些牺牲和让步，以便让我们更加深刻的理解yui3的全貌，并将其优势发挥至最佳。

<strong>1，种子的一步到位 or 颗粒化</strong>
所谓种子一步到位是指只要在页面引入一个种子文件的script标签，比如prototype和jquery，只要引入一个prototype.js或 jquery.js就可以了，他们将各自对dom操作和event的封装等等都囊括进一个文件中，并尽力将其做到最小，这样做的好处是显而易见的，使用框架非常简单。然而yui将这些功能做了级别划分和颗粒化设计，从概念上抽象出来“核心”、“工具”和“组件”，每个小功能放在一个文件当中，需要的时候则要自行去引用，yui文档中给出的大量demo都采用这种方法，这种设计显然不像jquery那样对初学者友好，而且使用起来不够傻瓜，为了实现一个小功能，甚至要引入三四个js文件。yui这样做的原因有两个，一是yui实在太大，把所有功能都搞进一个文件中确实有点不靠谱，二是为其动态加载的框架设计做铺垫。

<strong>2，手动引入 or 动态加载</strong>
往页面中写js的传统方法是，直接将js文件作为script标签路径写在页面中，使用yui也可以这样引入页面，但yui更推荐使用loader进行动态加载。动态加载脚本的渊源很复杂，目前来看主要原因有三，其一，页面中手写js标签无论如何都会占用一个http请求，即使这个请求是一个304，动态加载的文件缓存后则不必发起真实的http请求，其二，动态加载可以实现按需加载，而且可以根据js文件之间的依赖进行去重和排序，手写标签加载js文件则必须让开发者去额外关注一下文件的排序、重复等等，其三，动态加载有利于页面代码的语义化，这使得开发者只关心“需要什么”，而不用去在意“如何得到”。当项目变得越发臃肿，维护成本越来越高的时候，这中小技巧会有不小的好处的。]]></description>
			<content:encoded><![CDATA[<p>相信每个前端工程师都有自己喜爱的 javascript框架，说情感也好，道信仰也罢，javascript框架带给人的不仅仅是便捷的开发，更有一种纯粹的逻辑美感，不管是jquery 曼妙的简洁，还是yui魔术般的沙箱，都使我们产生无穷的想象。然而，js框架却又必然无法做到面面俱到的完美无瑕，比如jquery在OO方面做出的让步，以及yui在性能上做的牺牲，无不给人传达一种缺憾美、一种理想的现实主义。今天，我们来看看yui3在框架设计中的这些牺牲和让步，以便让我们更加深刻的理解yui3的全貌，并将其优势发挥至最佳。</p>
<p><strong>1，种子的一步到位 or 颗粒化</strong><br />
所谓种子一步到位是指只要在页面引入一个种子文件的script标签，比如prototype和jquery，只要引入一个prototype.js或 jquery.js就可以了，他们将各自对dom操作和event的封装等等都囊括进一个文件中，并尽力将其做到最小，这样做的好处是显而易见的，使用框架非常简单。然而yui将这些功能做了级别划分和颗粒化设计，从概念上抽象出来“核心”、“工具”和“组件”，每个小功能放在一个文件当中，需要的时候则要自行去引用，yui文档中给出的大量demo都采用这种方法，这种设计显然不像jquery那样对初学者友好，而且使用起来不够傻瓜，为了实现一个小功能，甚至要引入三四个js文件。yui这样做的原因有两个，一是yui实在太大，把所有功能都搞进一个文件中确实有点不靠谱，二是为其动态加载的框架设计做铺垫。</p>
<p><strong>2，手动引入 or 动态加载</strong><br />
往页面中写js的传统方法是，直接将js文件作为script标签路径写在页面中，使用yui也可以这样引入页面，但yui更推荐使用loader进行动态加载。动态加载脚本的渊源很复杂，目前来看主要原因有三，其一，页面中手写js标签无论如何都会占用一个http请求，即使这个请求是一个304，动态加载的文件缓存后则不必发起真实的http请求，其二，动态加载可以实现按需加载，而且可以根据js文件之间的依赖进行去重和排序，手写标签加载js文件则必须让开发者去额外关注一下文件的排序、重复等等，其三，动态加载有利于页面代码的语义化，这使得开发者只关心“需要什么”，而不用去在意“如何得到”。当项目变得越发臃肿，维护成本越来越高的时候，这中小技巧会有不小的好处的。</p>
<p><strong>3，逻辑启动的单一入口 or 沙箱</strong><br />
我们在页面中启动一个js逻辑通常是放在一个类似onDomReady的方法中，如果页面中存在多个逻辑的时候怎么办呢？比如，a实现了逻辑A，页面代码是这样的</p>
<pre line="1" language="javascript">

$.onDomReady(function(){
___LogicA.start();
});
</pre>
<p>这段代码通常写在页面的尾部，这段逻辑所伴随的html代码是埋藏在页面的某处，这时b要在页面中增加逻辑B，b的做法是首先找到尾部的这段代码，然后更改成如下模样：</p>
<pre line="1" language="javascript">
$.onDomReady(function(){
___LogicA.start();
___LogicB.start();
});
</pre>
<p>同样，B逻辑所伴随的html代码也是埋藏在页面的某处，这样看来，js逻辑和其伴随的html代码如此分离，以至于到了删减功能的时候，往往删掉 html却忘了删js，或者删掉js忘了删除html，在重用代码的时候也会是个麻烦。同样，在调试的时候，工程师也要打开两个窗口分别关注js和 html，即使这两段代码在同一个文件当中。如此则不如把代码写成这样：</p>
<pre line="1" language="javascript">
A逻辑的html代码段
$.onDomReady(function(){
___LogicA.start();
});

…

B逻辑的html代码段

$.onDomReady(function(){
___LogicB.start();
});
</pre>
<p>这种coding写法正是yui所提倡的，也就是所谓的沙箱，每个逻辑包含在一个沙箱中，各司其则互不干扰。当第三者浏览代码的时候也立即明白这就是一个独立的功能块，包含典型的html结构和启动逻辑的js，要重用，整块拷走即可。</p>
<p><strong>4，代码污染 or 沙箱</strong><br />
刚才提到的沙箱可以解决一部分代码污染的问题，新人阅读代码不用再看着乱码般的源码，“瞻前顾后”小心翼翼的寻找html和js的对应关系。但这种写法也存在隐患，现在的前端开发越来越复杂也更多的使用分层，比如底层使用yui，中间层是自定义的工具库，或者再加一个项目的widget组件库，写页面逻辑则是基于这些库进行开发。这样的话，每段逻辑可能写成这个样子：</p>
<pre line="1" language="javascript">

A逻辑的html代码段
$.onDomReady(function(){
___LogicA.start();
});
</pre>
<p>尽管我们可以约定，将项目用到的所有的组件都统一加载进页面中，但当组件越来越多的时候，就出现了上文所说的一步到位和颗粒化之间的矛盾，当每个控件单独占用一个js文件和与之相伴随的css皮肤，一个相对复杂的逻辑就变成了上文所说的手动引入js文件，并随之引入一些显而易见的弊端：</p>
<pre line="1" language="javascript">
复杂的A逻辑的html代码段，使用了日历，弹层，幻灯
$.onDomReady(function(){
___LogicA.start();
});
</pre>
<p>首先，手写大量的js文件会各自占用单独的http请求，在者，这个场景中，slider.js继承自tabview.js，因此要着重关注他们的顺序，第三，如果别人在页面的其他地方也使用了日历或者幻灯，还要再加两个相同的js标签？其实，说到这里，我们已经可以隐约看到大项目团队开发的影子了，在一个迭代及其频繁的项目中，开发者需要在短的时间内完成一个复杂页面的某个功能的开发，而且不能影响到页面的其他功能，毕竟，每添加一个功能，QA mm们都要将与之牵连的所有功能都要回归，可辛苦了我们的QA mm们。在这种情况下，一个功能的开发可能和同一个页面其他功能的开发相互并行。互相不属于同一个项目组，也不知晓对方的实现。这种模式则是我们经常遇到的多人开发，冲突也大都由此产生，每个功能单独看来是正确的，合并到一起会产生冲突和bug，这时调试bug则需要两个工程师同时进行，很麻烦。甚者，当组件升级了，比如，tabview.js再继承自tab.js，则又要去联系各个工程师，将每个引用tabview.js的地方之前再加上一个 tab.js，很麻烦。我们说，这种多人协作模式所带来的冲突也是代码污染的一种，因为每个人只能掌控类似tms区块那么巴掌大的地方，所组成的最终页面是什么样，都不知道。更何况，这种生猛的引用js，也会阻塞页面加载，占用http请求，影响性能。</p>
<p>鉴于此，yui将js的动态引入机制也并入其沙箱设计之中，我要引用的只是一个名字，比如slider.js，他依赖 tabview.js，tabview.js依赖tab.js，这样我只需引用一个名叫”slider”的东西即可，不用操心他依赖什么，更不用管如何引入到页面中，yui都帮我们搞定：</p>
<pre line="1" language="javascript">
TB.addmoudle({
___logicA:{
______fullpath:’logica.js’,
______requires:['slider']
___}
}).use(‘logicA’,function(Y){
___LogicA.start();
});
</pre>
<p>当我们看最终组成的页面的时候，看到的只是埋藏在页面各个角落的这些简短的结构一致的js代码段。很易理解，这点代码也不用像长的代码块压成一行。（更多细节可参照 <a href="http://www.uedmagazine.com/ued/comments.php?y=09&#038;m=09&#038;entry=entry090905-051322">前端弱架构导致的代码污染</a> ）</p>
<p><strong>5，颗粒化 or http请求数</strong><br />
这的确是一对矛盾，颗粒化带来了项目开发、管理、和代码重用的高效率，却又引入了更多的http请求数，好在yui提供了combo，可以将所有的 http请求合并成一个。只需在YUI引入的时候配置下combo属性即可，高颗粒化的请求数瞬间降低一倍以上。在之前做雅虎关系的时候，在yui2和 yui3pre并存的情况下，可以将请求降低到4个，yui2和3各一个种子，各自一个combo。当然这是在hack掉yui的loader的前提下。 yui默认不会合并非yui文件（更多细节可以阅读<a href="http://www.uedmagazine.com/ued/comments.php?y=09&#038;m=06&#038;entry=entry090612-094816">基于yui的团队开发</a>）。即使这样，我们仍然可以控制我们的http请求数，在不hack yui的情况下，可以解决部分性能问题。</p>
<p><strong>6，懒惰加载 or 即时加载即时执行</strong><br />
上文提到，逻辑依赖沙箱，沙箱依赖的js文件则是延时加载的，这样就导致一个问题，当页面比较庞大的时候，会等待页面js加载完毕才会渲染动作，这样的用户体验不佳，而即时加载即使运行则可以渲染出模块后随即渲染动作，当网速一定的时候，两者看似是一对不可调和的矛盾，yui 动态加载的机制比较折中的处理了这个问题，A逻辑需要a.js，B逻辑需要b.js，A逻辑则只会在a.js加载完成后执行，而不管b.js是否加载完成，而当A需要a.js和b.js的时候，A则需要等待a.js和b.js都加载完成才会执行，B逻辑只需判断当前是否已经加载b.js，如果b.js已经在其他模块中引入进来，B则可以立即执行。但确定的是，所有的js的引入一定是在domReady后执行的，也就是说，不管怎样，动作的渲染一定是在页面html结构出来后才开始执行的，用户体验上还是会有损失。</p>
<p><strong>7，面向接口的设计 or 面向dom的设计</strong><br />
我们知道jquery的插件习惯将所有的动作都加载到一个$(‘#id’)上，使用的时候只要执行类似$(‘#id’).init()即可。这看起来简洁明快，开发者的逻辑的思路也始终没有离开“节点”，很方便理解，而对yui3 的node扩展就不那么方便，从yui3的pre版到正式版，对node扩展的方法在不断的修改（更多细节看这里：<a href="http://www.uedmagazine.com/ued/comments.php?y=09&#038;m=09&#038;entry=entry090919-054842">扩展yui3 node的定时器</a>），这也可以看出yui设计者在对node扩展性设计时的纠结和苦恼：要不要允许开发者去扩展node节点呢？大概是因为设计者们对prototype先天的弊端心有余悸。目前看来，设计者还没有完全走出纠结，尽管对node扩展相比yui3第一个预览版方便了很多，开发者仍然不能像写jquery插件那样优雅自如的对node进行扩展。相反，zakas却将更多的精力放在了widget接口的设计上，在这一点上，相比jquery，yui3则具有无可限量的优越性，因为在yui3中，组件不仅仅是组件，而是一个有血有肉的生命体，他可以出生，可以成长，可以被改造，可以死亡，组件在这些复杂的运行时环境中自我锤炼，因此，一个复杂页面在yui3的技术体系中，变成了一个由无数组件链接而成的生态系统，这种生物链所带来的设计创新和新视野是其他js框架无论如何也无法超越的。关于yui3的组件开发更多细节可以参照：<a href="http://ued.taobao.com/blog/2009/12/16/yui/">基于yui3的组件开发1</a> 和 <a href="http://hikejun.com/blog/?p=503">克军在D2上的分享《从yui2到yui3看前端的演变》</a></p>
<p><strong>8，苗条的身材 or 庞大的身躯</strong><br />
说到这里，大概会有很多人拍砖。其实jquery和yui同属两类不同的js框架，一个苗条纤细，一个身重如山，两者之间其实没有什么水深火热，只是使用范围不同罢了，类似jquery的轻框架的使用范围是博客级别的小网站，尤其适合单人开发，代码写一次不再修改，而且很适合初学者学习使用，给初学者带来自信。 yui则使用与企业级的项目中的团队开发，项目维护周期远远超过开发周期，因此yui性能一定比不过jquery，jquery的续航能力也一定不如 yui，没有最优秀，只有最适合。当然这自然也挡不住我个人对迷人的jquery的喜爱，只要我们能从各个js框架学到东西，能提高自己做前端架构的能力，就ok。</p>
<p>说了这么多，其实只有一个观点，人无完人，框架无完框架，缺憾之处必有权衡。以上YY，欢迎拍砖！</p>
<p>感谢：ued.taobao.com 分享！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.86ue.com/archives/759/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>前端开发流程浅析</title>
		<link>http://www.86ue.com/archives/620</link>
		<comments>http://www.86ue.com/archives/620#comments</comments>
		<pubDate>Sat, 09 Jan 2010 15:17:36 +0000</pubDate>
		<dc:creator>紫枫印象</dc:creator>
				<category><![CDATA[前端技术]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[前端开发流程]]></category>
		<category><![CDATA[流程]]></category>

		<guid isPermaLink="false">http://www.86ue.com/?p=620</guid>
		<description><![CDATA[流程，通俗来讲，就是许多人，在做一系列的事情时，怎样相互协调，安排好这一系列事情的先后顺序，有什么事先的约定，需要达到怎样的预期目标。

在UED里，前端同学需要处理的需求比较多，早些时候，前端这里的开发流程还是比较模糊的，UED以外的同学也不清楚这边的工作具体是怎样进行的，所以难免会有需求插队的情况发生，打乱了大家的计划，因此今年Q3的时候，在与SCM团队同学的共同努力下，形成了一个前端的ASSETS发布流程。

这个流程主要针对ASSETS发布的需求做了一些约定，制定了相关的几个时间点，包括审核需求、提交代码、daily测试、预发测试、正式发布到线上确认的时间。

<strong>ASSETS流程简述</strong>

<strong>需求审核</strong>

在提需求之前，需求方一般都会先找PM或者相应产品线的前端咨询一下，如果可行的话就会在周四之前将需求提到平台上，到了周四的时候，前端会结合自身的工作情况，将平台上的需求接收并纳入自己的日程中，预估完成时间、发布时间以及相关的发布简述。

<strong>编码开发</strong>

周四需求评估完以后，就会按计划开始处理需求，将涉及ASSETS发布的需求优先处理，不涉及ASSETS的放在靠后的时间处理，一般这段时间是从周四到下一周的周二。SCM会在每周四开一个新的ASSETS分枝供前端在下一周开发使用。

<strong>提交代码，合并到daily测试以及预发测试</strong>

如果有涉及到与后台开发相关的需求，前端的同学会在周一就把代码提交，这一天会有一次合并代码，方便后台开发来测试。其他的同学一般最晚会在周二下班之前把代码提交，在周二，会有多次合并代码到daily的操作，每次操作完后，SCM的同学会在前端的群里通知到大家，方便大家测试。]]></description>
			<content:encoded><![CDATA[<p>流程，通俗来讲，就是许多人，在做一系列的事情时，怎样相互协调，安排好这一系列事情的先后顺序，有什么事先的约定，需要达到怎样的预期目标。</p>
<p>在UED里，前端同学需要处理的需求比较多，早些时候，前端这里的开发流程还是比较模糊的，UED以外的同学也不清楚这边的工作具体是怎样进行的，所以难免会有需求插队的情况发生，打乱了大家的计划，因此今年Q3的时候，在与SCM团队同学的共同努力下，形成了一个前端的ASSETS发布流程。</p>
<p>这个流程主要针对ASSETS发布的需求做了一些约定，制定了相关的几个时间点，包括审核需求、提交代码、daily测试、预发测试、正式发布到线上确认的时间。</p>
<p><strong>ASSETS流程简述</strong></p>
<p><strong>需求审核</strong></p>
<p>在提需求之前，需求方一般都会先找PM或者相应产品线的前端咨询一下，如果可行的话就会在周四之前将需求提到平台上，到了周四的时候，前端会结合自身的工作情况，将平台上的需求接收并纳入自己的日程中，预估完成时间、发布时间以及相关的发布简述。</p>
<p><strong>编码开发</strong></p>
<p>周四需求评估完以后，就会按计划开始处理需求，将涉及ASSETS发布的需求优先处理，不涉及ASSETS的放在靠后的时间处理，一般这段时间是从周四到下一周的周二。SCM会在每周四开一个新的ASSETS分枝供前端在下一周开发使用。</p>
<p><strong>提交代码，合并到daily测试以及预发测试</strong></p>
<p>如果有涉及到与后台开发相关的需求，前端的同学会在周一就把代码提交，这一天会有一次合并代码，方便后台开发来测试。其他的同学一般最晚会在周二下班之前把代码提交，在周二，会有多次合并代码到daily的操作，每次操作完后，SCM的同学会在前端的群里通知到大家，方便大家测试。</p>
<p>周三早上，SCM的同学会将代码发布到预发环境，此时就可以在HOST中绑定IP，换用线上的地址来测试。</p>
<p><strong>正式发布</strong></p>
<p>周四上午，SCM的同学确认后，将没有问题的代码发布上线。</p>
<p><strong>流程的作用</strong></p>
<p>在团队不断成长的过程中，处理的需求数量也在增长，需要考虑到开发的效率、产品的质量以及团队协作间的配合等因素，这个流程能为我们解决很多相关的问题：</p>
<p><strong>督促需求方做好相关的规划</strong></p>
<p>有些时候，一些需求的细节还没完全确定，但需求方总希望能将他想到的各种细节都实现出来，然后再挑选其中一种做为他的方案，所以需求的变更会有些频繁，然而这样的成本有些高，一切应该在计划后再去实现，而非反其道而行。现在需求方会在提需求之前，会花时间地去考虑他们的需求，将尽可能多的情况都想清楚，做好必要的沟通工作，权衡各种利弊之后，再给出一个比较成形的方案。</p>
<p><strong>保证需求安排的有序性</strong></p>
<p>在一个大的团队中，不同部门的同学在一起合作，因为沟通及一些特殊情况，效率或多或少会受到一些影响，良好的规划能有助于提高开发的效率。</p>
<p>通过每周的需求审核，安排好下一周的日程，由于需求的优先级和先后顺序都已排定，工作的条理性会更加清晰，需求插队的现象也有明显减少。当然我们也有紧急流程，但是它仅限于处理线上bug以及一些经过多方确认的紧急需求，有其自己的适用范围。</p>
<p><strong>统一测试，归避风险</strong></p>
<p>之前的日常处理中，可能会遇到这样的情况：甲、乙两个同学分别需要处理两个日常需求，他们的需要改动到的代码会有重合的部分，如果他们并不知道这个情况，那么在他们本地的单独测试中，一切都是OK的，然而当发布到线上去时，发现出了bug或者一方的改动没有同步到线上，查原因后发现是提交的代码相互覆盖了。</p>
<p>现在要处理的需求数量越来越多，为了避免上述情况，新流程实行以后，大家会统一来做多次测试，这样就更容易发现bug，可以大大降低协作开发而产生的风险。</p>
<p>流程本身就是一把双刃剑，有利有弊。一方面，它使我们的需求变得有序，使前端能够在处理一个需求时，不会频繁被其他插队的需求打断。并且因为发布有时间点的设定，所以测试工作会更加严谨，这有助于提升代码的质量。因此对于我们来讲，流程带来的好处是显而易见的；但另一方面，它额外地增加了做事的成本，涉及ASSETS发布的需求，就像赶某班火车一样，错过了就只能等下一班，所以也给需求方带来了许多不便，有待改进，不过这可以通过长期的合作而慢慢被弱化，双方达成了一种默契以后，情况会好很多，现在这样的情况已经比较少了。</p>
<p>尽管在流程使用之初，会带来诸多不便，但是从长远来看，流程有助于使一个团队形成统一的工作方式和态度，将繁杂的事情化整为零，有条理地去处理它们。因为流程，每一个人的责任感都会增强，对风险考虑得会更多一些，这一切都会使产品有质的提升。而我们所有与这个流程有关的人，都会不断地去推动流程改进的工作，这其中还有很多需要思考的：</p>
<p>    * 如何将我们的流程推广到整个公司，让大家都能了解我们的流程，这样在未来需要合作时，需求方需要注意些什么，相关的时间点以及开周时间的预估等，他们就会心中有数。<br />
    * ASSETS的发布还不够灵活，如果把和应用相关的ASSETS独立划分出去与应用一起发布，这样剩下的需要发布的东西就会少很多。或者是按产品线来设计发布流程，根据实际情况来发布。<br />
    * 如何来简化流程上的一些细节，在保持效率的同时，降低实际操作中的成本。<br />
    * 每周二是一个特别的时间点，为了赶在这最后时间提交代码，之前的开发会有些紧张，这种情况也有待改善，比如未来可以一周有两次发布。</p>
<p>流程不是生来就完美，但从现在它带给我们的好处来看，遵循并使用它，对我们的开发会起到很大的帮助作用。我们对待它的态度，决定了它对我们会有怎样的反馈，如果觉得它不合适了，就发出自己的声音，想办法去改进它，不要只是被动地等待。</p>
<p>———————————-</p>
<p><strong>部分名词解释：</strong></p>
<p>daily环境：UED的一个日常测试环境<br />
预发环境：外网IP，需绑定访问，供内部使用测试<br />
ASSETS：脚本和样式存放的目录<br />
SCM：软件管理配置<br />
PM：项目经理</p>
]]></content:encoded>
			<wfw:commentRss>http://www.86ue.com/archives/620/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
