In: 产品之路
14 五 2012看到一段印度软件开发人员whyjava写的感慨,51CTO翻译如下:
1、在印度,任何一个人,无论他的资格如何,都可以成为软件开发人员。这个过程没有经过任何筛选,而纯粹是偶然的。我本人本来应该从事机械行业的,但是在校园招聘过程中,被一家软件公司选中,最终成为一个软件开发人员。同样,我也有很多朋友也是因为偶然的机会成为软件开发人员的。大部分大学生在进入软件开发企业的时候,并不懂得软件开发和编程知识。
2、大学 教育没有对人起到任何帮助。我可以很明确的告诉大家,我本人毕业于印度一所很好的大学,但是印度所有的大学教育质量都非常差。很多学生只能通过各种补习班 获得知识,但是到底在这些补习班学习的如何,也没有人知道。最近我面试了一个有6年工作经验,并且从一个很好的大学计算机专业毕业的人。但是我发现他连一 个斐波纳契数列程序都写不出来。
3、开发人员不注重自己的知识更新。如果你问一个开发人员,他最后所读的书,或者是如何保证自己的知识更 新。往往无法得到确切的回答。没有人想提升自己或者多做点事情。很多人甚至都没有听说过《代码大全》这本书。
4、每个人都想当经理。在印 度,工作到5年左右,就有机会成为项目组长。一旦成为项目组长,你的下一个目标就是希望成为经理,但是想成为经理就需要处理很多人际关系、做肮脏的政治交 易,导致无法做其他重要的事情。因为多数人工作5年左右就开始整天琢磨怎么当经理,结果就是很少有人能够在编程领域有所造诣。
5、没有参 与到开源社区。在我的朋友,或者朋友的朋友里面,也包括我自己。我没有发现任何人对开源社区做出过贡献。对于开源项目,我们只能使用,一旦发现什么 bug,没有任何办法解决,只能抱怨开发人员写的代码有问题。
也许有人会说,我就是想当经理,我就是不想当资深软件开发人员,不也挺好的 吗?在这,shaou.org想仿照他写一段中国为什么缺少优秀项目经理的原因:
1、在中国,任何一个人,无论他的资格如何,都可以成为 项目经理。这个过程没有经过严格筛选,只要你本职工作做得还算好、人际关系处理的也还算好,就有机会成为项目经理。在我身边就出现过很多这样的例子:一个 团队里技术最好的人被提为项目经理,虽然他在管理方面经验很少,而且在领导力和沟通技巧方面的修为还很初步,但公司愿意相信他的学习能力,即使他其实更适 合于做技术专家而不是管理。
2、大学教育没有对人起到任何帮助。我可以很明确的告诉大家,我本人毕业于中国一所很好的大学,但是中国所有的大学教 育都缺乏领导力和管理能力的训练。很多学生只能通过各种课外实习获得锻炼,但是到底在这些课外实习效果如何,也没有人知道。最近我面试了一个有10年工作 经验,并且从一个很好的大学计算机专业毕业的人。但是我发现他连一个完整的BUG管理方案都写不出来。
3、开发人员不注重自己的知识更 新。如果你问一个项目经理,他最后所读的书,或者是如何保证自己的知识更新。往往无法得到确切的回答。没有人想提升自己或者多做点事情。很多人甚至都没有 听说过《一页纸项目管理》这本书。
4、每个人都想当CTO。在中国,工作到8年左右,就有机会成为项目经理。一旦成为项目经理,你的下一 个目标就是希望成为CTO,但是想成为CTO就需要更多的了解行业、了解市场、同时参与更多的办公室政治斗争,导致无法做其他重要的事情。因为多数人工作 8年左右就开始整天琢磨怎么当CTO,结果就是很少有人能够在项目管理领域有所造诣。
5、没有参与到网络社区。在我的朋友,或者朋友的朋 友里面,也包括我自己。我没有发现任何人能列出几个优秀的项目管理方面的交流社区,对网络社区贡献的贡献更是没有。对于网络社区,我们只能通过 google从它们身上收罗资料,对于一些从技术人员的角度不好理解的观念,有时还会私下嗤之以鼻。
转载请标注本文来源:中国为什么缺少优秀项目经理?
我想网 板凳 编辑
In: 云
14 二 2012“云服务”现在已经快成了一个家喻户晓的词了。如果你不知道PaaS, IaaS 和SaaS的区别,那么也没啥,因为很多人确实不知道。
“云”其实是互联网的一个隐喻,“云计算”其实就是使用互联网来接入存储或者运行在远程服务器端的应用,数据,或者服务。
任何一个使用基于互联网的方法来计算,存储和开发的公司,都可以从技术上叫做从事云的公司。然而,不是所有的云公司都一样。不是所有人都是CTO,所以有时候看到云技术背后的一些词可能会比较头疼。
云也是分层的
任何一个在互联网上提供其服务的公司都可以叫做云计算公司。其实云计算分几层的,分别是Infrastructure(基础设施)-as-a-Service,Platform(平台)-as-a-Service,Software(软件)-as-a-Service。基础设施在最下端,平台在中间,软件在顶端。别的一些“软”的层可以在这些层上面添加。
IaaS: Infrastructure-as-a-Service(基础设施即服务)
第一层叫做IaaS,有时候也叫做Hardware-as-a-Service,几年前如果你想在办公室或者公司的网站上运行一些企业应用,你需要去买服务器,或者别的高昂的硬件来控制本地应用,让你的业务运行起来。
但是现在有IaaS,你可以将硬件外包到别的地方去。IaaS公司会提供场外服务器,存储和网络硬件,你可以租用。节省了维护成本和办公场地,公司可以在任何时候利用这些硬件来运行其应用。
一些大的IaaS公司包括Amazon, Microsoft, VMWare, Rackspace和Red Hat.不过这些公司又都有自己的专长,比如Amazon和微软给你提供的不只是IaaS,他们还会将其计算能力出租给你来host你的网站。
PaaS: Platform-as-a-Service(平台即服务)
第二层就是所谓的PaaS,某些时候也叫做中间件。你公司所有的开发都可以在这一层进行,节省了时间和资源。
PaaS公司在网上提供各种开发和分发应用的解决方案,比如虚拟服务器和操作系统。这节省了你在硬件上的费用,也让分散的工作室之间的合作变得更加容易。网页应用管理,应用设计,应用虚拟主机,存储,安全以及应用开发协作工具等。
一些大的PaaS提供者有Google App Engine,Microsoft Azure,Force.com,Heroku,Engine Yard。最近兴起的公司有AppFog, Mendix 和 Standing Cloud
SaaS: Software-as-a-Service(软件即服务)
第三层也就是所谓SaaS。这一层是和你的生活每天接触的一层,大多是通过网页浏览器来接入。任何一个远程服务器上的应用都可以通过网络来运行,就是SaaS了。
你消费的服务完全是从网页如Netflix, MOG, Google Apps, Box.net, Dropbox或者苹果的iCloud那里进入这些分类。尽管这些网页服务是用作商务和娱乐或者两者都有,但这也算是云技术的一部分。
一些用作商务的SaaS应用包括Citrix的GoToMeeting,Cisco的WebEx,Salesforce的CRM,ADP,Workday和SuccessFactors。
本文来自:VB
译文来自:雷锋网
In: DIV+CSS
13 二 2012:before
语法:Selector : before { sRules }
说明:用来和 content 属性一起使用,设置在对象前(依据对象树的逻辑结构)发生的内容。
:after
语法:Selector : after { sRules }
说明:用来和 content 属性一起使用,设置在对象后(依据对象树的逻辑结构)发生的内容。
:after 伪元素在元素内容之后插入内容。
这个伪元素允许创作人员在元素内容的最后面插入生成内容。默认地,这个伪元素是行内元素,不过可以使用属性 display 改变这一点。
示例DEMO:http://webqianduan.com/demo/html5css3/css_Pseudo_after&before.html
CSS3 伪类after/before 操练
In: 用户体验设计
13 二 2012kingdee大概把UCD的流程分为了下面几个阶段:
Research stage 调查研究阶段
Concept stage 概念定义阶段
Iterative design stage 迭代的设计阶段
Implementation stage 执行阶段
Launch stage 发布阶段
Research (调查研究)
Context studies(背景研究)
Focus groups 关注群体
Competitor comparisons (竞争对手对比)
Depth interviews 深度面试
Questionnaires 问答
User personas and scenarios 用户角色与场景了解
User goals 用户目标
Usability goals 可用性目标
Concept (概念定义)
Concept models 概念模型
Usage scenarios 使用场景
Paper prototyping 简易原型
Usability testing 可用性测试
Expert evaluation 专家评估
Design (界面设计)
Product structure diagram 产品结构示意图
Process flows 程序流程
Wireframes 框架
Interactive prototypes 交互原型
Card sorting 卡片分类排序 - 就是把关键流程用卡片形式定义下来,然后不断组织,了解和挖掘最佳的排序模式
Usability testing 可用性测试
Accessibility evaluation 易用性评估
Expert evaluation 专家评估
Functional specifications 功能型详述
Implementation (执行测试)
Usability testing 可用性测试
Expert evaluation 专家评估
Accessibility evaluation 易用性评估
Launch (发布)
Usability testing 可用性测试
Expert evaluation 专家评估
Accessibility evaluation 易用性评估
Focus groups 关注群体
Competitor comparisons (竞争对手对比)
Metrics 测量
In: JavaScript
8 二 2012这个图来自于《JavaScript语言精髓与编程实践》第三章P184页。最近在改第二版,这张图重做了,需要的可以对照着看。
此外,补充一下图中用到的概念:
1、内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始化阶段就被创建好的对象,是后者的一个子集;而后者包括了一些在运行过程中动态创建的对象。
2、引擎扩展对象是一个并不太大的集合,一般来说比较确定,它们也属于引擎的原生对象(但不属于ECMA规范的原生对象)。
3、宿主对象不是引擎的原生对象,而是由宿主框架通过某种机制注册到JavaScript引擎中的对象。
4、一些宿主会把自己提供的对象/构造器也称为“原生对象”,例如Internet Explorer 7就把它提供的XMLHttpRequest()称为原生的——与此相对的是在它的更早先版本中通过“new ActiveXObject(‘Microsoft.XMLHTTP’)”这样的方法创建的对象。这种情况下,读者应注意到“宿主的原生对象”与“引擎的原生对象”之间的差异。
In: JavaScript|学习笔记
5 二 2012Scope是JS中非常关键的概念,搞清楚它,才能搞清楚闭包(Closure)。对Scope的解释,JavaScript: The Definitive Guide这本书解释的非常清楚,而JavaScript: The Good Parts则没怎么解释清楚。下面我们以这个程序为例来说明Scope和Closure:
对于一个JS程序而言,都有一个Global Scope Object, 我们定义的全局变量,其实都是这个对象的属性,在主程序体中,可以用this来访问这个对象的内容。这是Scope Chain当中只有一个Global Scope Object。
根据下述原则,执行完var Counter = function() {…}之后,系统中的对象示意如下:
Scope原则1: 当函数Counter被定义时,JS会把当前有效的Scope Chain保存在函数对象当中备查
之后执行var counter1 = new Counter;根据下面的原则,系统对象示意如下:
Scope原则2:当一个函数被执行时,会创建一个新的Scope Object,再将函数内容完全分析一遍,将参数和局部变量都加成新Scope对象的属性,最后将新Scope Object作为Scope Chain的最后一节,更新Scope Chain。
Scope Chain的作用在于之后查找属性时,如果本Scope查不到,就去父Scope里面查,指导Global Scope Object。感觉其实也是Delegation,所以说不定,Scope Object之间也是用__proto__来连接的呢?
之后Counter的内容被执行,increment和getValue两个函数被定义,之后被返回给counter1,根据原则1,这时系统的对象示意如下:
而执行var counter2 = new Counter之后,对象示意变成:
看到上述对象模型,我想大家就不会意外下面这段代码的输出是这样的:
counter1.increment();
document.writeln(“counter1: “+counter1.getValue());
document.writeln(“counter2: “+counter2.getValue());

本来嘛,给玩各的,会不干扰!
最后,我们给出闭包的定义,一个函数F的内部函数G可以访问F定义的局部变量和参数,这就叫闭包,它是在JS中实现封装的基础!
为了叙述的方便,我们在这节中忽略了一些有关JS内存管理的细节,有关垃圾收集和堆栈,将在下一节分解!
补记:推荐大家去看一下这个博客,解释的会更详细,有更多例子:http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html
In: JavaScript|学习笔记
5 二 2012看这两天同学们的反馈还是觉得比较难懂,因此,决定再举一个例子帮助大家理解吧,后面有关Scope和闭包Closure的精彩内容就只好晚一点写了!
其实,这个系列不是写给初学者的,而是写给那些中级JS程序员的,对JS有一定的认识,希望这个系列能够帮助他们透过现象看到本质。同时,这里面的内容是高度浓缩的,向1,2节基本上对应了JavaScript: The Good Parts两章的内容,因此,建议感兴趣的同学,最好根据上面的例子程序,配合Debugger,仔细体会可能才能理解,指望光看这个博客系列就完全搞懂JS的对象系统是不太切合实际的。
另外,如果你只是简单写写网页,的确可能不需要把JS搞懂这么清楚,但是如果你真正重视JS,打算应用例如node.js,backbone.js这样的JS框架的话,那么,我认为还是需要真正把JS搞明白的。
好,切入正题吧,在JavaScript: The Good Parts当中,给出了一个创建对象的常用方式:
Object.create = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
var b=Object.create(a);
结合1,2节的内容,我们来理解一下上述这段代码:
首先,在执行var b=Object.create(a);之前,已经有了a对象,如下图:
在执行了var F = function () {};之后,F函数对象被创建出来,他的property属性也被赋值指向一个新创建出来的对象,详细规则在第二节描述过:
当用var ff = function(){}定义一个函数时,JS会生成一个函数对象F,函数对象F的__proto__指针指向Function.prototype(在下图中省略了), 同时F还会有一个property属性,property属性的值指向一个新创建的对象P,这个对象P只有一个属性是构造函数constructor(),构造函数constructor()的值就是函数对象F,而对象P的__proto__指针则指向Object.Prototype,
执行了F.prototype = o; 之后, F的prototype属性指向了对象A,如下图所示:

执行new F();之后,根据第2节中描述的规则,执行之后的对象关系如下:
当用new激活一个函数时,一个新对象会被创建出来,其内容是执行函数的返回结果,而这个对象的__proto__链接指向函数的prototype属性所引用的对象
函数Object.create返回之后,F和p都不存在了,因此,最后的对象关系如下:

总结一下,我们可以看到,对象的__proto__链接是不能直接修改的,而函数对象的prototype属性是可以修改的,因此,Object.create实际上是利用了这个特点,结合new来完成了一个拷贝创建的过程,希望这个例子能够帮助大家更好地理解!!
可继续阅读 4. Scope和Object http://www.webqianduan.com/?p=647
补记:推荐大家去看一下这个博客,解释的会更详细,有更多例子:http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html
In: JavaScript|学习笔记
5 二 2012函数对象首先是一个对象,所以,它也有__proto__链接,也有Delegation。函数对象还有一个特殊之处就是它会有一个叫做prototype的属性(又是prototype?, 对,这就是我一直用__proto__链接来代表上文提到的prototype linkage,这样可以避免混淆)。
当用var Class = function(){}定义一个函数时,JS会生成一个函数对象F,函数对象F的__proto__指针指向Function.prototype, 同时F还会有一个property属性,property属性的引用一个新创建的对象p,这个对象p只有一个属性是构造函数constructor(),构造函数constructor()的值就是函数对象F,而对象p的__proto__指针则指向Object.Prototype,如下图:
了解了函数对象,再看看它如何发挥作用:当用new激活一个函数时,一个新对象会被创建出来,其内容是执行函数的返回结果,而这个对象的__proto__链接指向函数的prototype属性所引用的对象
,如下面的例子所示:
抽象一下,就是这样:
如果看到这里,还觉得不太明白,最好再去看看 3.对象创建 http://www.webqianduan.com/?p=641
补记:推荐大家去看一下这个博客,解释的会更详细,有更多例子:http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html
In: JavaScript|学习笔记
5 二 2012在学习JavaScript的过程中,经常被它的对象系统(Object,Function,Prototype)搞的云里雾里的,感觉这些东西如果不搞清楚,后续的JavaScript学习也会不扎实,所以,下决心把它搞清楚,让我们开始吧!
这个学习过程中,主要的参考书目是《JavaScript: The Good Parts》、《JavaScript: The Definitive Guide》和《Object-Oriented JavaScript: Create scalable, reusable high-quality JavaScript applications, and libraries》;主要的分析工具是IE和IE开发者工具。
1. 对象
JavaScript语言没有类的概念,除了基本类型(Number、String、booleans、null和undefined)之外,一切都是对象。对象的定义如下,用英文比较准确:
这些都不难理解,关键是这个:
这里,这个原型链接(a prototype linkage)是隐藏的(在Debugger里面看不见的),在某些实现中,它的属性名是__proto__
因此,到目前为止,JavaScript对象系统用UML建模后的领域模型如下:
补充一下,任何一个对象的__proto__链接都是不为空的,对于一个从Object Literal中创建的对象,其__proto__指向Object.prototype。
有了__proto__链接之后,就可以发挥一些面向对象的威力了,头一个就是Delegation。Delegation是指当从一个对象中获取一个属性失败时,JS会自动再尝试去其__proto__链接指向的对象中去查找,如果还找不到,就沿着__proto__一路找上去,指导找到Object.prototype为止。根据上述Delegation算法的描述,你可以很容易理解Delegation过程是动态的,这次可以从祖先中找到A属性,不代表下次一定能找到。
这里需要注意的是,__proto__链接只对查询有效,而对Update无效,也就是说,如果你给一个属性赋值的话,而这个属性在该对象中还不存在,而在__proto__祖先中已有同名属性,但这是JS会在该对象中再新建一个属性,而不是修改祖先的属性值。
补记:推荐大家去看一下这个博客,解释的会更详细,有更多例子:http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html
In: FLASH/AS3/FB/RIA|学习笔记
29 一 2012flash中汉字显示是一件让人头疼的事情,不过并不是没有解决的法子,AS3中引进的相关函数,给这个问题的解决带来了另一种方法。
众所周知,在ActionScript 3中,除了escape和unescape两个字符串编码和解码函数以外,新增了encodeURI,encodeURIComponent,decodeURI,decodeURIComponent四个函数,在开发过程中遇到了与此相关的问题,仔细研究了一下这as3中的六个函数:
除了官方文档里的说明以外,我补充几点我在使用过程中发现的一些值得注意的地方,至于AS3中escape和encodeURI的区别,就不在这里说了:
1. 记得以前有一次我在as中escape,同学一看我用的是escape,于是在js中就用了unescape,但却始终得不到原始的值,原因就是在AS2中,没有与js的escape对应的函数,而AS2中的escape,实现的却是其他语言中的encodeURI或URIEncode的功能,AS3中,终于把escape和encodeURI区分开来了,AS3中的encodeURI和decodeURI与AS2中的escape和unescape基本一样,而AS3中的escape则和js等其他语言保持了一致,例如:
在as2中:
trace(escape(“我见犹怜”)); //输出:%E6%88%91%E8%A7%81%E7%8A%B9%E6%80%9C
trace(unescape(“:%E6%88%91%E8%A7%81%E7%8A%B9%E6%80%9C”)); 输出:我见犹怜
在as3中:
trace(encodeURI(“我见犹怜”)); //输出:%E6%88%91%E8%A7%81%E7%8A%B9%E6%80%9C
trace(decodeURI(“:%E6%88%91%E8%A7%81%E7%8A%B9%E6%80%9C”)); 输出:我见犹怜
trace(escape(“我见犹怜”)); //输出:%u6211%u89C1%u72B9%u601C
trace(unescape(“%u6211%u89C1%u72B9%u601C”)); //输出:我见犹怜
2. AS3中的encodeURI和decodeURI与AS2中escape和unescape不一样的地方:
在as2中,System.useCodepage影响escape对双字节字符编码和解码的结果,注意下面System.useCodepage设为true和false的时候,输出是不同的:
System.useCodepage=true;
trace(escape(“我见犹怜”)); //输出:%CE%D2%BC%FB%D3%CC%C1%AF
System.useCodepage=false;
trace(escape(“我见犹怜”)); //输出:%E6%88%91%E8%A7%81%E7%8A%B9%E6%80%9C
在as3中,System.useCodepage不影响decodeURI的结果,两个结果是一样的:
System.useCodePage = true;
trace(encodeURI(“我见犹怜”)); //输出:%E6%88%91%E8%A7%81%E7%8A%B9%E6%80%9C
System.useCodePage = false;
trace(encodeURI(“我见犹怜”)); //输出:%E6%88%91%E8%A7%81%E7%8A%B9%E6%80%9C
在as3中,escape同样也不受System.useCodePage的影响:
System.useCodePage = true;
trace(escape(“我见犹怜”)); //输出:%u6211%u89C1%u72B9%u601C
System.useCodePage = false;
trace(unescape(“我见犹怜”)); //输出:%u6211%u89C1%u72B9%u601C
这意味着在AS3中,所有运用到escape和encodeURI的地方,都不能再通过设置System.useCodePage来改变编解码的方式,与后台或其他程序语言交互就必须考虑这个问题,以后后台编码的时候,记得要以UTF-8编码,否则decodeURI就会抛出URIError,提示无效的URI;也许有人会和我我一开始一样觉得这样很不爽,其实这样做是有道理的。
你懂的,记录一点大家都想记录的东西:-)