2008年9月2日星期二

技术骨干跳槽 IT主管如何是好?

八月娇阳似火,空气中没有一丝风。潘雄站在公司楼顶,遥望远方,IT部门两个骨干员工要辞职的事情让他烦恼不堪。潘雄是艾杰公司的IT主管,上个月IT项目刚刚成功上线,潘雄还没有来得及享受成功上线的喜悦,就收到两个骨干成员的辞职信。

随着企业IT项目上线运行后,项目组成员的安排和发展成为一个值得IT主管深思的问题。各成员是根据业务特点留在业务部门还是在原来项目组内进行业务流程优化与持续改进工作?项目组成员在实施过程中得到很好的实践经验、面临社会上更多的跳槽诱惑时,IT主管怎样才能防止项目组骨干人员流失?

人员流失导致系统沦为鸡肋

在传统企业,IT项目组人员的流动率相对其他岗位而言要高很多。IT项目组骨干的流失往往会给企业IT系统带来不同程度的风险。对此,潘雄深有感触——很多企业实施IT系统后用不起来的根本原因不是领导不想用,而是最初参与IT系统实施的IT人员在系统上线后都选择了离开;先进的IT系统没有人去使用、维护,最终只好沦为鸡肋。

一个IT项目组骨干离职所带来的影响是方方面面的。首先,良好的IT团队因某些核心员工的离职而遭到破坏,执行中的IT系统可能因此被迫中断,企业IT项目进程效率可能会大大降低。其次,IT项目组成员离职所留下的职位空缺迫使公司重新花费一大笔培训成本或是寻找接替者的时间精力。另外,某些核心员工的离职还影响在职员工的情绪,极大挫伤团队的整体士气。

IT人才为何会流失?

IT人才自愿流失指的是IT人才自愿从企业中离开,它与一般意义上的人员流动不同。自愿流失的人员往往主要是那些对企业很有用处,企业想留又留不住的人。实际上,IT人才自愿流失的原因是多方面的。

①个人原因。因个人原因离职的员工,大多是将企业当作自己职业生涯发展的跳板,在公司实施IT项目对他们而言就是为了获得工作经验或是学习相关技术,一旦项目实施完成,或学习目的达到,他们就会选择待遇更高、发展空间更大的企业。

②公司原因。从公司方面讲,导致IT项目组人员离职的根本原因在于企业制度问题。其中管理者素质不高、员工激励机制不健全、未能建立有效的评估体系、缺乏合理的薪酬结构、未能建立针对核心员工的长期职业发展规划和企业文化氛围是主要问题。正是这些原因导致IT项目组人员尤其是IT骨干人员频频跳槽。

③外界原因 。一般来讲,IT项目中流失的优秀人才其中绝大部分是到其它公司继续做IT实施人员,或到顾问咨询公司、软件公司工作。因为这些公司所提供的无论是技术方面以及职位结构都非常合适这些流失的人才。正因为如此,公司在ERP项目实施过程中培养的优秀IT员工,如技术骨干或是部门经理等极易得到顾问公司、软件公司或准备实施IT系统公司的青睐,后者为吸引这些优秀人才加盟,往往开出优厚的条件进行猎取,这也是公司优秀IT员工离职的一个重要原因。

如何留住IT骨干人才?

照目前的社会状况,要说单纯依靠情感来留住人,完全是一厢情愿的想法。试想想,如果员工每天都在为家里的柴油盐米发愁时,无论情感多深厚,都无法有效留住人才。所以,潘雄觉得有三点很重要:一是待遇留人——薪资和待遇高于其他行业薪资水平,是留住一部分人才的首要条件。二是事业留人——有些人在有经济保障时,还想有更大的发展空间,因此需要让员工能看到自己在企业内发展的前景并感到满意。三是感情留人,让员工感到公司对他们的的关怀,认同企业的文化,有归属感。

①待遇留人。首先,人才流失是有一定经济原因的。当薪资、工作待遇、福利不如其它公司的时候,潘雄就觉得“做IT主管也很难做,公司在费用方面管控得非常严格,使我很难给员工满意的薪金,也很难招到称心的人才。”例如艾杰公司实施的是国外知名软件公司的ERP系统,实施人员长期浸泡在系统中,其对该系统的理解已接近这家知名软件公司实施顾问的水平;而在业内,这家知名软件公司系统实施顾问的年薪相对不错,而在传统企业IT人员的待遇对这个数字只能望尘莫及。

传统企业的IT部门是站在传统企业与代表高科技的IT行业的交叉点,IT部门的人员往往拿着传统企业平均水平的工资干着在IT企业可以拿到高薪的活儿,这样比较的话,一些员工的心里自然很难平衡,这也成为传统企业难以留住IT员工的原因之一。为此,潘雄在薪酬方面积极与公司协商,要求公司支付给内部IT顾问的薪资要从IT行业整体考虑,不要仅限于传统行业的薪酬水准。

②事业留人。潘雄在来艾杰公司前一直都在专业的IT公司工作,他非常能够感受到传统企业对IT技术的理解力与IT企业之间的巨大差距,这使得IT人员在艾杰公司得不到应有的成就感。因为人都需要在一定成就感的激励下增强工作信心。潘雄觉得IT人员很难得到成就感的满足是传统企业的必然特点;既然不可能改变整个大环境,他只能尽力改变小环境,引领员工主动寻找职业成就感。同时,他要求IT部门员工要精通业务,多和其他业务部门交流,熟悉业务并成为有技术背景的业务能手,让IT价值在业务部门发挥出来。

所谓“不想当将军的士兵不是好士兵”。因此,潘雄认为IT主管在帮助IT员工提升的同时,也要主动为他们规划职业道路。潘雄给ERP项目组员工规划了两条职业走向:一条是管理路线,将来可以做项目经理,再做部门经理;另一条是技术路线,做顾问再到高级顾问。潘雄将IT部门员工分为两个小组:ERP项目组和系统设备网络组,分工使得每个员工的技术更加专业,而且能竭力避免传统企业的IT人员技术广而不精的问题。

③感情留人。除了待遇瓶颈,IT主管还得面对另外一个留人瓶颈:IT员工无法得到企业内多数人的认同,这成了他们选择离开的又一主要原因。一般来说许多ERP项目实施的骨干成员离职后大部分都去了大型IT咨询公司。据称,除了能在那儿获得必要的物质满足外,还能获得精神上的认同。

人才流失不是突然发生的,一般来说会经历抱怨、倦怠、抗拒和离职四个阶段。当人才遭遇不满意的事项,会通过某些途径将这种消极情绪渲泄出来。在抱怨阶段,成员虽然感觉不满,却并没有离职的打算,工作任务也能正常完成。如果IT主管实施了适当的干预,一切将回归正常;但是,如果IT主管对人才的抱怨放任不管,或者虽采取了措施但未达到人才的预期,则会导致人才情感上的失望和失意,进而产生职业倦怠。

如果IT主管不分析IT项目组成员行为变化的深层次原因,只是简单地进行批评或处罚,则会加剧IT项目组成员的不满,从而产生心理上的抗拒。这种抗拒情绪达到一定程度,极有爆发的可能。因此,IT主管的诚心和信任,仍可能让成员回心转意;而IT主管的不当作为则会坚定IT项目组成员离职的决心。一旦外部条件(有更适合的公司聘任)具备,IT项目组成员就会向IT主管明确表示离职的意愿。如果IT主管仍没有实质性的挽留行动,某些成员就会实施离职行为。

总而言之,防止IT项目实施后核心组员的流失是关系到公司IT系统正常运行的根本利益,能留住IT项目组骨干人才就等于降低了公司的招聘成本和前期培训费用。此外,留住IT项目组骨干成员往往意味着能更好地把精力集中在变革、优化和改良业务流程上,而流失了对系统有丰富经验的IT骨干则意味着公司会整日疲于招聘和培训新员工。

(本人长期提供MTK手机平台代码和资料,需要联系QQ:85313653
开发系统软件清单: 1. 手机程序源代码 2.烧写程序下载工具 flashtool 3.ads1.2 ,ads1.2update,activeperl:编译工具和辅助工具 4. Trace 工具:catcher 5.手机工程测试工具: META (Mobile Engineering Testing Architecture) is designed to provide the functionality of RF testing, NVRAM access testing, speech related testing of advanced feature – melody and voice memo. 6.UI制作工具: MCT 开发系统硬件清单: 1.开发用手机板 2.烧拷线一条 3.USB线一条 4.旅行充电器一个 5.锂电池两个 6.硬件原理图 开发系统文档清单: 1mtk 软件培训(MTK_Training) 2 mtk 软件系统和调试 ( SW System and Debug ) 3.mtk 软件MMI设计(MMI Design Doc0 4.mtk 软件设备驱动(Device Driver) 5.Mtk手机校准(Factory) 6.Mtk手机工具使用说明(Tool Document)

08年Java开发者最迫切的五个期望

不少人为自己是Java开发者中的一员而感到骄傲,新年伊始,大家一定对这个与自己息息相关的语言和平台有不少的期待。以下为2008年Java开发者五个最迫切的期待,可能其中有不合你意者,但相信大多数Java开发者会对此认同:

JavaFx不再只是空谈

在2007年的JavaOne上,我们听到了一个救世主——JavaFx,不幸的是,当初的所有许诺却没有成为现实。希望2008它能成为一个真正的、简单的、可用选择,从而Java开发者不必在富交互技术领域无“本宗”技术可选。

Glassfish成为应用服务器的选择

Glassfish是一款非常好的开源应用服务器和平台,也是第一个遵从Java EE 5标准的,它强大而有效。然而在企业端它还不被熟知,许多企业主管甚至从未听说它。即使Java开发者,很多也从未下载使用过,甚至部分人还没有用就在印象中觉得它不够正规。希望2008年开发者能够有效利用它。

重量级/轻量级(Lightweight/Heavyweight)之争当停止

由于Java EE正不断吸取各种框架、工具、库等的优点,开发方法变得更加直接和简单,所以传统的所谓的重量级Java和轻量级之间的区别也越来越模糊。然而此间关于重量级和轻量级的争论仍未停止。

Google青睐Java,希望Apple也能

iPhone非常风靡而且许多iPhone应用正在开发,然而迄今Java仍然是iPhone的毒药,希望08年这一局面可以改观。Google已经通过它众多的Java API和服务帮助了全世界的Java开发者,这也再一次证明,强者用之则发扬广大。所以希望包括Apple在内的更多强者可以用Java。

弃糟粕、大统一

凭借Java的枝繁叶茂,再复杂的任务Java都可以提供很好的解决,然而它也因为自身分支和技术的太过丰富而使开发者迷乱。Java开发者花费了几年时间去弄清楚一大堆商业和开源框架、工具、库……希望在2008年,其中的一些可以被废弃。虽然专政(指Java统一)是有害的,但一个统一的领土有更多的优势。



(本人长期提供MTK手机平台代码和资料,需要联系QQ:85313653
开发系统软件清单: 1. 手机程序源代码 2.烧写程序下载工具 flashtool 3.ads1.2 ,ads1.2update,activeperl:编译工具和辅助工具 4. Trace 工具:catcher 5.手机工程测试工具: META (Mobile Engineering Testing Architecture) is designed to provide the functionality of RF testing, NVRAM access testing, speech related testing of advanced feature – melody and voice memo. 6.UI制作工具: MCT 开发系统硬件清单: 1.开发用手机板 2.烧拷线一条 3.USB线一条 4.旅行充电器一个 5.锂电池两个 6.硬件原理图 开发系统文档清单: 1mtk 软件培训(MTK_Training) 2 mtk 软件系统和调试 ( SW System and Debug ) 3.mtk 软件MMI设计(MMI Design Doc0 4.mtk 软件设备驱动(Device Driver) 5.Mtk手机校准(Factory) 6.Mtk手机工具使用说明(Tool Document)

2008年9月1日星期一

英特尔处理器存漏洞,可被利用攻击任何系统

英特尔处理器存漏洞,可被利用攻击任何系统

2008年7月15日消息,据国外媒体报道,安全研究员克瑞斯·卡巴斯基(Kris Kaspersky)日前表示,他将展示如何利用英特尔处理器漏洞来远程攻击用户计算机,无论用户安装的是哪种操作系统。

克瑞斯称,他计划于今年10月在马来西亚首都吉隆坡举行的“Hack in the Box”安全大会上展示该攻击方法。克瑞斯将利用JavaScript或TCP/IP包来发动攻击,从而证明处理器漏洞(勘误表)可以被黑客用来发动攻击。

克瑞斯还称,处理器漏洞的威胁越来越大,将来,病毒作者也将利用这样的漏洞来开发恶意软件。克瑞斯说,不同的处理器漏洞允许黑客做不同的事情。有些漏洞只能使系统崩溃,有些漏洞则允许黑客完全控制系统,有些可以帮助黑客禁用Vista安全保护。

克瑞斯将展示攻击基于几乎所有操作系统的PC机,其中包括Windows XP、Vista、Windows Server 2003、Windows Server 2008、Linux和BSD。而且,这些系统均已打全补丁。克瑞斯还补充道,也有可能展示攻击Mac计算机。

处理器通常包含着上亿个晶体管,因此存在勘误表是很正常的事情。有些漏洞可能影响到处理器性能,而有些用户根本觉察不到。例如,均英特尔6月公布的数据显示,Silverthorne版Atom处理器就存在35处勘误表。

克瑞斯说:“修复其中大部分漏洞是可能的,英特尔也向各主要BIOS厂商提供了解决方案。但是,并不是每一家厂商都会部署,因此存在漏洞在所难免。”

(本人长期提供MTK手机平台代码和资料,需要联系QQ:85313653
开发系统软件清单: 1. 手机程序源代码 2.烧写程序下载工具 flashtool 3.ads1.2 ,ads1.2update,activeperl:编译工具和辅助工具 4. Trace 工具:catcher 5.手机工程测试工具: META (Mobile Engineering Testing Architecture) is designed to provide the functionality of RF testing, NVRAM access testing, speech related testing of advanced feature – melody and voice memo. 6.UI制作工具: MCT 开发系统硬件清单: 1.开发用手机板 2.烧拷线一条 3.USB线一条 4.旅行充电器一个 5.锂电池两个 6.硬件原理图 开发系统文档清单: 1mtk 软件培训(MTK_Training) 2 mtk 软件系统和调试 ( SW System and Debug ) 3.mtk 软件MMI设计(MMI Design Doc0 4.mtk 软件设备驱动(Device Driver) 5.Mtk手机校准(Factory) 6.Mtk手机工具使用说明(Tool Document)

“云计算”改变IT产业生态

想象一下,有朝一日,企业无需再花费大量资金采购IT设备,将寸土寸金的办公空间,用于存放发热量惊人的服务器;而个人消费者也不必在电脑上安装大量的套装软件,耗费有限的系统资源,通过高速互联网,就可以按需定制获取计算能力。

  这就是目前在IT产业备受热议的“云计算”。

  IT巨头争抢制高点

  IDC认为,与其说“云计算”是一项新技术,倒不如说它是一项在商业模式方面的创新。早在2006年,亚马逊率先推出弹性计算云服务,让中小型企业能够按照自己的需要购买亚马逊数据中心的计算能力。截至目前,IT产业巨头已纷纷推出了云计算计划。

  谷歌(Google)将分布在36个数据中心的上百万台服务器组成庞大的计算机群,为用户提供搜索、电邮、地图等免费网络服务。在谷歌董事长兼CEO Eric Schmidt看来,90%的计算任务都能够通过云计算技术完成,其中包括几乎所有的企业计算任务和白领员工的任务。

  2007年3月,戴尔成立了数据中心解决方案部门,所推出的第一项服务就是云计算解决方案。前不久,戴尔覆盖全球100多个城市的客户巡展“未来的计算”(Future of Computing)大会在北京举行。在戴尔公司看来,IT产业将向“移动无限”、“绿色环保”和“虚拟化”这三大方向演进。戴尔公司亚太及日本地区商用市场营销副总裁Sam Burd表示:“IT行业正处于急速转变期,整个行业必须不断推陈出新。”他透露,戴尔会继续在云计算领域进行投资。

  值得一提的是,2007年11月,IBM推出蓝云(Blue Cloud)计划,准备将蓝云渗透到IBM的软件、硬件以及服务之中。在微软最近主推的Windows Live平台中,基于云计算的云基础结构(Cloud Infrastructure)服务同样具有重要作用。微软Office产品主管克里斯?卡波塞拉表示,越来越多的企业会放弃它们自己的计算机系统,转向“云计算”环境。

  Web安全进入“云时代”

  目前,全球木马病毒呈现出爆炸性增长的趋势。仅瑞星一家每天就能截获8万?10万种新病毒。另据AV-Test.org的最新统计,全球恶意程序已超过1100万个。海量的新增病毒和产业链化的攻击行为,导致传统代码比对技术查杀病毒的有效性正在急速丧失。

  事实上,全球信息安全产业已面临转折关头,中外企业都在寻找新的出路。

  国外反病毒公司趋势科技的CEO上个月曾表示,目前反病毒业界的状况糟糕极了,只有“云-客户端”的架构才能有效打击黑客;而欧洲安全厂商Panda于今年5月在巴塞罗那就已公布了一个类似的战略。

  日前,趋势科技在中国展示了基于云安全技术架构(Cloud-Client)构建的下一代内容安全防护解决方案,其核心在于以Web信誉服务(WRS)、邮件信誉服务(ERS)和文件信誉服务(FRS)为基础构建的云客户端安全架构,通过把大多数病毒特征码文件保存到互联网云数据库中,从而在网络威胁到达最终用户或公司网络之前即可对其予以拦截。据记者了解,目前趋势科技“云安全(SecureCloud)”已经在全球建立了5个数据中心,数万部在线服务器,每天阻断的病毒感染最高达1000万次。趋势科技全球副总裁兼大中华区执行总裁张伟钦强调:“相同的分析工作,过去需要一天的运算时间,如今只需要几秒钟。”

  值得注意的是,国内安全厂商在这场安全业务模式的升级大战中也不甘人后。7月中旬,瑞星公司正式对外推出了“云安全”计划的重要组成部分??“瑞星卡卡上网安全助手6.0版”。据记者了解,瑞星“云安全”计划的内容是:将用户和瑞星技术平台通过互联网紧密相连,组成一个庞大的木马/恶意软件监测、查杀网络。一个瑞星卡卡6.0的用户所提交的可疑木马样本分析结果,可以分享给所有用户。按照业内专家的说法,最终整个互联网将变成一个超级庞大的“杀毒软件”,这也正是瑞星“云安全”计划期望达到的宏伟目标。

  业内分析人士指出,未来中外安全企业差异化竞争的核心将转移到云端架构的后台计算和分析服务能力方面。同时,对于IT业界整个“云计算”拼图来说,需要产业链上成员的集体迁移,尤其是信息安全厂商对于“云计算”架构的搭建更为关键,不补上这个“漏洞”的话,“云计算”产业未来将成为Web威胁的新乐园。


(本人长期提供MTK手机平台代码和资料(价格优惠),需要联系QQ:85313653
开发系统软件清单: 1. 手机程序源代码 2.烧写程序下载工具 flashtool 3.ads1.2 ,ads1.2update,activeperl:编译工具和辅助工具 4. Trace 工具:catcher 5.手机工程测试工具: META (Mobile Engineering Testing Architecture) is designed to provide the functionality of RF testing, NVRAM access testing, speech related testing of advanced feature – melody and voice memo. 6.UI制作工具: MCT 开发系统硬件清单: 1.开发用手机板 2.烧拷线一条 3.USB线一条 4.旅行充电器一个 5.锂电池两个 6.硬件原理图 开发系统文档清单: 1mtk 软件培训(MTK_Training) 2 mtk 软件系统和调试 ( SW System and Debug ) 3.mtk 软件MMI设计(MMI Design Doc0 4.mtk 软件设备驱动(Device Driver) 5.Mtk手机校准(Factory) 6.Mtk手机工具使用说明(Tool Document)

2008年7月28日星期一

60条经典网话

1、吃自助最高境界:扶墙进,扶墙出。
  2、结婚必备条件:有车有房,父母双亡。
  3、没有钱,没有权,再不对你好点,你能跟我?
  4、拿份报纸上厕所,俺是读书人。
  5、上Google上百度一下。
  6、女人一定要对自己好一点。一旦累死了,就会有别的女人花你的钱,住你的房,睡你的老公,打你的娃!
  7、你的丑和你的脸没有关系……
  8、长个包子样,就别怨狗跟着。
  9、争吵的时候,男人和女人的区别就像步枪和机关枪的区别。
  10、爷爷都是从孙子走过来的……
  11、老天,你让夏天和冬天同房了吧?生出这种鬼天气!
  12、鸟大了什么林子都有!
  13、听说女人如衣服,兄弟如手足。回想起来,咱这尊千手观音竟然裸奔了20多年!
  14、不怕虎一样的敌人,就怕猪一样的队友。
  15、夏天就是不好,穷的时候我连西北风都没得喝……
  16、随你大小便!
  17、怀才就像怀孕,时间久了才能让人看出来。
  18、没什么事就不要找我,有事了更不要找我。
  19、你以为我会眼睁睁地看着你去送死?我会闭上眼睛的。
  20、锻炼肌肉,防止挨揍!
  21、天使之所以会飞,是因为她们把自己看得很轻……
  22、我想早恋,可是已经晚了……
  23、拥抱真是个奇怪的东西,明明靠的那么近,却看不见彼此的脸。
  24、揍你个性生活不能自理!
  25、当你穿上爱情的婚纱,我也披上了和尚的袈裟……
  26、其实我是一个天才,可惜天妒英才!
  27、请你以后不要在我面前说英文了,OK?
  28、思想有多远,你就给我滚多远!
  29、男人的谎言可以骗女人一夜,女人的谎言可以骗男人一生!
  30、好久没有人把牛皮吹的这么清新脱俗了!
  31、老板,钱对你来说真的就那么重要吗?讲了三个多小时了一分钱都不降?
  32、起那么早干嘛?夜总会还没开门呢!
  33、一觉醒来,天都黑了。
  34、我要是做了人事部经理,第一件事就是提拔自己做老总。
  35、我每天除了吃饭的时间全在减肥,你还说我没有毅力?
  36、水能载舟,亦能煮粥。
  37、买了电脑不上宽带,就好比酒肉都准备好了却在吃饭前当了和尚。
  38、只要你敢死,我就敢埋!
  39、人又不聪明,还敢学人家秃顶?
  40、有一个很古老的传说——能在XX校园里看到美女的人会长生不老……
  41、如果连你也不理我,我就变成狗不理了……
  42、生,容易;活,容易;生活,不容易。
  43、打死你我也不会说。
  44、钱可以解决的问题都不是问题。
  45、念了十几年书,想起来还是幼儿园比较好混!
  46、连广告也信,读书读傻了吧?
  47、戒烟容易,戒你太难!
  48、不吃饱哪有力气减肥啊?
  49、睡眠是一门艺术——谁也不能阻挡我追求艺术的脚步。
  50、奈何桥上的老婆婆都卖上百事可乐了,你叫我怎么忘记你?
  51、早起的鸟儿有虫吃,早起的虫虫被鸟吃。
  52、如果我做了皇帝,一定封你当太子。
  53、只要锄头舞的好,哪有墙角挖不倒?
  54、天哪,我的衣服又瘦了!
  55、我在女友手机里的名字是“他”,分手后,我就变成了“它”。
  56、避孕的效果:不成功,便****。
  57、我和你不一样,因为我是人。
  58、问君能有几多愁,恰似一群太监上青楼。
  59、我真想亲口管你爷爷叫声:“爹!”
  60、我喝水只喝纯净水,牛奶只喝纯牛奶,所以我很单纯……

2008年7月24日星期四

MTK(联发科)手机主芯片详解

MT6205、MT6217、MT6218、MT6219、MT6226、MT6227、MT6228
均为基带芯片,所以芯片均采用ARM7的核。

MT6305、MT6305B为电源管理芯片。

MT6129为RF芯片
RF3146(7×7mm)、RF3146D(双频)、RF3166(6×6mm)为RFMD的PA。

MT6205为最早的方案,只有GSM的基本功能,不支持GPRS、WAP、MP3
等功能。(2003年MP)

MT6218为在MT6205基础上增加GPRS、WAP、MP3功能。MT6217为MT6218的cost down方案,与MT6128 PIN TO PIN,只是软件不同而已,另外MT6217支持16bit数据。(2004年MP)

MT6219为MT6218上增加内置AIT的1.3M camera处理IC,增加MP4功能。
8bit数据。(2005年MP)

MT6226为MT6219 cost down产品,内置0.3M camera处理IC,支持GPRS、WAP、MP3、MP4等,内部配置比MT6219优化及改善,比如配蓝牙是可用很便宜的芯片CSR的BC03模块USD3即可支持数据传输(如听立体声MP3等)功能。

MT6226M为MT6226高配置设计,内置的是1.3M camera处理IC。(2006年MP)

MT6227与MT6226功能基本一样,PIN TO PIN,
只是内置的是2.0M camera处理IC。(2006年MP)

MT6228比MT6227增加TV OUT功能,内置3.0M camera处理IC,
支持支持GPRS、WAP、MP3、MP4。

MTK(联发科)手机主芯片详解!
我公司供应的MTK手机套片详解:
MT6205、MT6217、MT6218、MT6219、MT6226、MT6227、MT6228均为基带芯片,所以芯片均采用ARM7的核(2004年MP)。
MT6305、MT6305B为电源管理芯片。
MT6129为RF芯片,射频处理器,转换射频信号
RF3146(7×7mm)、RF3146D(双频)、RF3166(6×6mm)为RFMD的PA。
MT6205 只有GSM的基本功能,不支持GPRS、WAP、MP3等功能
MT6218 为在MT6205基础上增加GPRS、WAP、MP3功能。
MT6217 为MT6218的cost down方案,支持16bit数据,功能与6218相同,只是软件不同。(2004年MP)
MT6219 在MT6218上增加内置AIT的1.3M camera处理IC,增加MP4功能。8bit数据。(2005年MP)
MT6226MT6219 cost down产品,内置30万 摄相头处理IC,支持GPRS、WAP、MP3、MP4,内部配置比MT6219优化及改善,比如配蓝牙是可用很便宜的芯片CSR的BC03模块USD3即可支持数据传输(如听立体声MP3等)功能
MT6226M MT6226的高配置设计,内置的是1.3M camera处理IC。(2006年MP)
MT6227与MT6226功能基本一样,与MT6226功能相同,内置200万相素摄相头处理IC。(2006年MP)
MT6228 在MT6227的基础上内置300万相素摄相头处理IC,增加TV OUT视频输出功能,支持支持GPRS、WAP、MP3、MP4。(2006年MP)
从MT6226后软件均可支持网络摄像头功能,也就是说你的机子可以用于QQ视频


(本人长期提供MTK手机平台代码和资料,需要联系QQ:85313653
开发系统软件清单: 1. 手机程序源代码 2.烧写程序下载工具 flashtool 3.ads1.2 ,ads1.2update,activeperl:编译工具和辅助工具 4. Trace 工具:catcher 5.手机工程测试工具: META (Mobile Engineering Testing Architecture) is designed to provide the functionality of RF testing, NVRAM access testing, speech related testing of advanced feature – melody and voice memo. 6.UI制作工具: MCT 开发系统硬件清单: 1.开发用手机板 2.烧拷线一条 3.USB线一条 4.旅行充电器一个 5.锂电池两个 6.硬件原理图 开发系统文档清单: 1mtk 软件培训(MTK_Training) 2 mtk 软件系统和调试 ( SW System and Debug ) 3.mtk 软件MMI设计(MMI Design Doc0 4.mtk 软件设备驱动(Device Driver) 5.Mtk手机校准(Factory) 6.Mtk手机工具使用说明(Tool Document)

2008年7月23日星期三

IT人,不要一辈子靠技术生存

IT人,不要一辈子靠技术生存
(http://blog.csdn.net/mac_cm)

我现在是自己做,但我此前有多年在从事软件开发工作,当回过头来想一想自己,觉得特别想对那些初学JAVA/DOT。NET技术的朋友说点心里话,希望你们能从我们的体会中,多少受点启发(也许我说的不好,你不赞同但看在我真心的份上别扔砖头啊).

一、 在中国你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇,你千万更不要认为哪些从事 市场开发,跑腿的人,没有前途。

不知道你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开发的关键阶段需要团队的成员没日没夜的加班,还需要为测试出的BUG和不能按时提交的软件模块功能而心怀忐忑,有的时候如果你不幸加入现场开发的团队你则需要背井离乡告别你的女友,进行封闭开发,你平时除了编码之外就是吃饭和睡觉(有钱的公司甚至请个保姆为你做饭,以让你节省出更多的时间来投入到工作中,让你一直在那种累了就休息,不累就立即工作的状态)

更可怕的是,会让你接触的人际关系非常单一,除了有限的技术人员之外你几乎见不到做其他行业工作和职位的人,你的朋友圈子小且单一,甚至破坏你原有的爱情(想象一下,你在外地做现场开发2个月以上,却从没跟女友见过一面的话,你的女友是不是会对你呲牙裂嘴)。

也许你拿到了所谓的白领的工资,但你却从此失去享受生活的自由,如果你想做技术人员尤其是开发人员,我想你很快就会理解,你多么想在一个地方长期待一段时间,认识一些朋友,多一些生活时间的愿望。

比之于我们的生活和人际关系及工作,那些从事售前和市场开发的朋友,却有比我们多的多的工作之外的时间,甚至他们工作的时间有的时候是和生活的时间是可以兼顾的,他们可以通过市场开发,认识各个行业的人士,可以认识各种各样的朋友,他们比我们坦率说更有发财和发展的机会,只要他们跟我们一样勤奋。(有一种勤奋的普通人,如果给他换个地方,他马上会成为一个勤奋且出众的人。)

二、在学习技术的时候千万不要认为如果做到技术最强,就可以成为100%受尊重的人。

有一次一个人在面试项目经理的时候说了这么一段话:我只用最听话的人,按照我的要求做只要是听话就要,如果不听话不管他技术再好也不要。随后这个人得到了试用机会,如果没意外的话,他一定会是下一个项目经理的继任者。

朋友们你知道吗?不管你技术有多强,你也不可能自由的腾出时间象别人那样研究一下LINUX源码,甚至写一个LINUX样的杰作来表现你的才能。你需要做的就是按照要求写代码,写代码的含义就是都规定好,你按照规定写,你很快就会发现你昨天写的代码,跟今天写的代码有很多类似,等你写过一段时间的代码,你将领略:复制,拷贝,粘贴那样的技术对你来说是何等重要。(如果你没有做过1年以上的真正意义上的开发不要反驳我)。

如果你幸运的能够听到市场人员的谈话,或是领导们的谈话,你会隐约觉得他们都在把技术人员当作编码的机器来看,你的价值并没有你想象的那么重要。而在你所在的团队内部,你可能正在为一个技术问题的讨论再跟同事搞内耗,因为他不服你,你也不服他,你们都认为自己的对,其实你们两个都对,而争论的目的就是为了在关键场合证明一下自己比对方技术好,比对方强。(在一个项目开发中,没有人愿意长期听别人的,总想换个位置领导别人。)

三、你更不要认为,如果我技术够好,我就自己创业,自己有创业的资本,因为自己是搞技术的。

如果你那样认为,真的是大错特错了,你可以做个调查在非技术人群中,没有几个人知道C#与JAVA的,更谈不上来欣赏你的技术是好还是不好。一句话,技术仅仅是一个工具,善于运用这个工具为别人干活的人,却往往不太擅长用这个工具来为自己创业,因为这是两个概念,训练的技能也是完全不同的。

创业最开始的时候,你的人际关系,你处理人际关系的能力,你对社会潜规则的认识,还有你明白不明白别人的心,你会不会说让人喜欢的话,还有你对自己所提供的服务的策划和推销等等,也许有一万,一百万个值得我们重视的问题,但你会发现技术却很少有可能包含在这一万或一百万之内,如果你创业到了一个快成功的阶段,你会这样告诉自己:我干吗要亲自做技术,我聘一个人不就行了,这时候你才真正会理解技术的作用,和你以前做技术人员的作用。

2008年7月22日星期二

嵌入式应用软件任务划分的原则

嵌入式应用软件任务划分的原则

(http://blog.csdn.net/mac_cm)

在基于实时操作系统(RTOS,RealTime Operating System)的单片机应用软件设计中,“任务”是一个很重要的概念。有专家指出[1],把一个应用系统分为多少个任务且定义每一个任务各负责什么事情,这是一门艺术。对于任务的划分,并没有一个人人都要遵守的规则,不同的人来设计一个同样规格要求的系统,会有不同的方案。然而,到目前为止,很难看到有关论文对任务划分的方法有比较详细而系统的介绍。本文将深入研究划分任务的方法,并在此基础上,从实用的角度给出编写基于RTX51 Tiny实时操作系统的应用软件的指导方针。

1 任务的概念和应用软件开发过程

在嵌入式实时多任务系统开发中,用C语言代码表示的任务是一个无限的循环程序。任务不能有返回,不能有退出出口,但是任务可以被杀死,包括被别的任务杀死或自杀[2]。任务的概念与操作系统中的进程概念相同,一个任务是独立的执行进程,可以与其他的并发任务竞争CPU时间。

基于RTOS的单片机应用软件开发过程:首先是根据系统设计方案明确应用软件的功能,然后结合RTOS的并发特性(或准并发特性),对应用软件要实现的功能进行大小适当的划分,也就是把应用软件的功能按照一定的原则划分为若干个任务模块,并对各个任务间的通信和时延进行仔细的确认。

2 任务划分的原则

任务划分有3个原则,分别介绍如下。

2.1 原则1

原则1是将同一个外设的访问放在一个任务中。

对每个独立的硬件(例如串行通信端口)进行操作的驱动程序段放在一个任务中。也就是说,要想对某个设备资源进行操作,只有依靠执行相应的任务来实现。这样无论何时切换任务,都不会对任何独立的“外设”造成影响。

这样做能够避免嵌入式操作系统的特殊问题——资源冲突和重入问题,而且利于系统维护与升级。各个任务之间要实现通信,可以调用os_send_signal函数及全局变量来实现。

所谓“资源冲突”,就是任务A在访问某个资源时,恰好发生了任务切换——由任务A切换到任务B,任务B也访问这个资源且改变了它的状态,这样当再次执行任务A时,就可能发生冲突或带来不确定性。而所谓“重入”,是指假设任务A在运行某个函数,发生任务切换后,任务B也运行这个函数,这样就会破坏任务A执行这个函数时的现场,从而可能导致任务A执行函数时结果不正确。这种问题尤其容易出现在串行接口器件的操作中,例如串口,串行的A/D、D/A器件等。

2.2 原则2

原则2是要通过任务分割提高系统的实时性。

在嵌入式多任务实时系统中,任务是指一个程序分段。这个程序分段被操作系统当作一个基本单元来调度。典型地,每个任务都是一个无限的循环。

RTOS本质上就是嵌入的实时内核,它负责管理各个任务,或者说是为每个任务分配CPU时间,并且负责任务之间的通信。实时内核可分为可剥夺型和不可剥夺型两类。因此,按照所使用内核的不同,嵌入式实时系统也可分为两类:使用不可剥夺型内核的嵌入式实时系统和使用可剥夺型内核的嵌入式实时系统。

2.2.1 长任务的定义

在RTOS中,长任务就是指整个任务的执行时间较长,超出了RTOS中其他某一个或某几个任务的实时要求容限,而对整个RTOS的实时性构成威胁的那些任务。需要注意的是,长任务与复杂任务不能混淆,复杂任务的执行时间不一定长,简单任务也可能会构成长任务。

2.2.2 长任务对RTOS的影响

当使用可剥夺型实时内核时,长任务由于执行的时间较长,因而更容易被高优先级的任务打断;一旦高优先级的任务进入了就绪状态,当前任务的CPU使用权就被剥夺了,或者说任务被挂起了,那个高优先级的任务立刻得到了CPU的控制权。这样会出现两个问题:一是长任务可能在一次执行的过程中被频繁打断,长时间得不到一次完整的执行;二是长任务被打断时,可能要保存大量的现场信息,其目的是为了保证在高优先级任务执行完返回后,长任务能得以继续执行。然而,这样做要占用一定的系统资源,同时保存现场本身也是要占用CPU时间的,因此,实时性也会下降。

当使用不可剥夺型实时内核时,长任务对RTOS的影响更为明显,因为在这种内核中,任务的响应时间取决于最长的任务执行时间。也就是说,由于长任务的存在,任务的响应时间要变长。其结果是CPU长时间停留在长任务中,其他任务得不到实时的响应,甚至根本得不到执行,系统的实时性势必要下降。

总之,无论是使用可剥夺型内核,还是使用不可剥夺型内核,长任务都会对RTOS构成严重的威胁。

2.2.3 长任务问题的解决方法

解决长任务问题最有效的途径是进行任务分割。所谓“任务分割”是指将影响系统实时性的长任务分割成若干个小任务。这样单个任务的执行时间变短,系统的任务响应时间变短,实时性得以提高。

(1) 对任务的分析与计算

当然,长任务的分割必须结合系统中所使用的内核,以及各任务对实时性的要求等情况,进行必要的分析与计算,才能保证分割的合理性和有效性,具体的步骤如下。

① 分析系统共有多少个任务,这些任务对实时性的要求有多高,求出各个任务所要求的最低执行频率(f1,f2,…,fn)。

② 计算目前各任务的实际执行时间(t1,t2,…,tn)

③ 确定系统中的长任务。如果max(t1,t2,…,tn)≤min(1/f1,1/f2,…,1/fn),则此系统中不存在长任务。如果max(t1,t2,…,tn)>min(1/f1,1/f2,…,1/fn),则存在长任务,而且执行时间为max(t1,t2,…,tn)的那个任务就是要找的长任务。

④ 分析此长任务是否需要分割,分析一下是什么原因导致执行的时间过长,这个时间是否能够通过程序的优化来缩短?如果能,则不需要进行任务分割;否则,要对这个长任务进行分割。

(2) 实施长任务分割

常用的任务分割的方法有以下两种:

① 将长任务按功能分为若干个小模块,每一个模块构成一个小任务,每个小任务实现一种相对独立的功能,且要保证执行时间t

② 有的长任务比较特殊,例如键盘任务和动态LED数码管显示任务,很难按照上面的方法把它分成若干个功能相对独立的小模块。这时,一般是按照方便保存现场信息的原则,将其强制分割成若干个小任务,每个小任务在min(1/f1,1/f2,…,1/fn)时间内主动保存现场信息、放弃CPU的控制权,等到再次被内核调度时继续执行。这种分割方法相对而言较复杂,各任务之间界限不是很明显,看似未经分割,但实际上它却是由多次任务中断来完成的。

2.3 原则3

原则3是要将软件工程中的“解耦原则”用于任务划分。

可以采用软件工程中的解耦原则对应用程序进行任务的划分。任务之间的耦合是影响软件复杂程度的一个重要因素,应该采取下述设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。具体方法可参见软件工程方面的书籍,例如文献[3]。

3 基于RTX51 Tiny的应用软件设计指导

RTX51是一个德国Keil Software公司开发的用于8051系列单片机的多任务实时操作系统[4]。RTX51有2个不同的版本。

(1) 完全版RTX51 Full

完全版RTX51 Full允许4个优先级的任务时间片轮转调度和抢先式的任务切换,可以并行地利用中断功能。信号和信息可以通过邮箱系统在任务之间互相传递,可以从一个存储池中分配和释放内存,可以强迫一个任务等待中断、超时以及从另一个任务或中断发出的信号或信息。

(2) 小型版RTX51 Tiny

小型版RTX51 Tiny是RTX51的一个子集,它可以很容易地在没有任何外部存储器的单片8051系统上运行。RTX51 Tiny仅支持时间片轮转任务切换和使用信号进行任务切换,不支持抢先式的任务切换,可以并行地利用中断功能,可以强迫一个任务等待中断、超时以及从另一个任务或中断发出的信号,不能进行信息处理,也不支持存储器分配或释放。RTX51 Tiny是一种不可剥夺型实时操作系统内核。

基于RTX51 Tiny实时操作系统的单片机应用软件设计,首先应该根据RTX51 Tiny操作系统的准并发特性,对应用软件要实现的功能进行大小适当的划分——按照上述3个原则划分为若干个任务模块,并对各个任务间的通信和时延进行仔细的确认。

编写基于RTX51 Tiny的应用软件的指导方针如下:

① 包含头文件rtx51tny.h在应用程序中。

② 不要写C语言主函数main()。RTX51 Tiny操作系统内核中已经有它自己的主函数main()。

③ 应用程序应该至少包括1个任务函数(task function)。

④ RTX51 Tiny应用程序必须中断使能(EA=1),因为RTX51 Tiny操作系统使用了定时器T0中断。

⑤ 应用程序至少调用1个RTX51 Tiny系统函数(如os_wait);否则,链接器将不会把RTX51 Tiny的系统库包含到应用程序中。

⑥ 任务task0是应用程序中第一个执行的函数。在任务task 0中,必须调用os_create_task函数来运行其他任务。

⑦ 任务task函数不必退出或返回。任务task必须使用一个while(1)结构或其他类似的结构。任务task函数不带参数,也没有返回值。使用系统函数os_delete_task挂起(halt)一个运行的任务。

⑧ 中断服务程序的编写方式,与不使用RTX51 Tiny操作系统下的编写方式相同。

⑨ 编译和链接应用程序有2种途径,一种是使用集成开发环境μVision 2 IDE,另一种是使用命令行工具CommandLine Tools。一般采用德国Keil Software公司提供的集成开发环境 μVision 2 IDE。

利用Keil Software公司提供的集成开发环境 μVision 2 IDE,创建RTX51 Tiny应用程序的开始的步骤如下:

① 运行Keil Software公司的集成开发环境 μVision 2 IDE。

② 运行菜单命令Project→Options for Target‘Target 1’,打开Target对话框,并在对话框中选择Target选项卡。

③ 从Operating system下拉列表框中选择RTX51 Tiny,如图1所示。



图1 选择RTX51 Tiny实时操作系统

4 结论

本文给出了划分任务的3个原则,分别是“对同一个外设的访问放在一个任务中”、“通过任务分割提高系统的实时性”和“软件工程中的‘解耦原则’用于任务的划分”。实践证明,这些任务划分的原则是行之有效的。另外,从实用的角度给出了编写基于RTX51 Tiny实时操作系统应用软件的指导方针。实际上,RTX51 Tiny实时操作系统对目标系统的硬件需求是很低的,随着半导体技术的发展,能够运行嵌入式实时操作系统的单片机芯片是很容易采购得到的。

人们越来越清楚地认识到,在嵌入式系统设计中引入实时操作系统的必要性[5]。在许多嵌入式系统中,不但要求系统能够及时响应随机发生的外部事件,并对其作出快速处理,通常还需要同时执行多个任务,并对每个任务作出实时响应。实践证明,对于这样的应用,采用嵌入式实时操作系统作为应用软件的设计平台和运行平台是一个良好的选择。

我在软件公司成长的第四年

我在软件公司成长的第四年
(http://blog.csdn.net/mac_cm)

前言:去年此时,将我在软件公司成长的三年工作总结放予网上,得到多方关注和很多朋友的肯定,一年来,收到了很多来自各地的求助、咨询等等邮件,也曾与大家共同分享工作心得。今年是我在软件公司的第四年,这一年,我做了些什么,又有哪些收获呢?承接上一年的总结,继续将今年的工作总结与大家分享,且来看看“我在软件公司成长的第四年”。

辞旧迎新的这段时间里,看到的,听到的,到处与总结、盘点有关。什么娱乐大盘点,十大新闻,十大电视剧,十大游戏,十大美女,十大流行金曲,十大小说,十大软件,十大富豪……只要沾得上边的,都可以好好排榜一番。而我,也早在心里酝酿,要好好总结今年一番,工作上的,生活里的,一年时间,如果不想让记忆就此流过,是有很多事情可以着笔的。

2005,是我在SK工作的第四个年头。很多人问我,在一个公司呆这么久,不会觉得乏味没有新鲜感吗?我回头想想去年、前年、大前年的工作,与今年相比,无论是公司里的人还是事,又是翻天覆地的变化。如果说是寻找新鲜感,我倒希望计划不要赶不上变化太多。且来看看,我这一年的工作是怎样一步一步从量变走向质变?

一月,春节到来之前,工作主要是总结和收尾。在这一个月内,我除了继续配合完成一些项目的收尾工作以外(包括江西产权系统IC卡的测试、包装、整理测试缺陷报告、功能规约、准备发货光盘、写用户手册;茂名项目用户手册的编写),我完成了个人年终总结,公司质量总结分析报告,参加研发中心部门总结会议,公司年终总结会议……一连串的总结,带来了很多对2005的暇想。内心里,期盼“一年更比一年好”的同时,也在思索着,自己的职业生涯该如何定位,三年了,还要不要继续留在同一间公司或是寻找另一片天空?在与多位领导交谈过后,我还是决定继续留在SK,尝试从配置管理员转变为总裁办公室秘书的新工作,那个时候,我其实并不清楚,接下来迎接我的有些什么?

二月,春节过后,就是计划大展拳脚的时候,我的工作也团绕计划来开展。参加公司的年度经营会议、营销中心会议,做好会前的议程安排、会议资料的准备、会议的主持以及会后的记录整理工作。在这个月,公司确定了今年的工作计划、营销计划,并与每一位中层管理干部、销售人员签订了“个人责任书”,试将考核落于始,先定目标再考核完成情况;同时,公司确定以业绩考核为重点市场,并将工作的重点放在三月份将要在河北廊坊召开的全国业绩考核工作会议的宣传工作上。经过多方努力,最后发行了一份业绩考核内刊,作为会议的宣传资料,我在其中主要是资料的收集、整理、校对、排版和资源的协调等工作。

三月,我的工作慢慢向营销部门靠近。半是忐忑中接下了tany移交的与代理沟通、网站留言客户的跟进工作,开始近距离接触市场、接触客户。这个月,我整理了公司相关的产品、市场宣传资料,并将所有的文档归类、扫描,形成CHM格式的电子宣传册。这份宣传册内容齐全丰富,在后续的客户跟进中派上了一些用场,只是由于容量太大,传输困难,现在已经束之高阁;与全国各地的代理联系沟通,用电话、邮件的形式解答代理所提的一些关于公司产品、政策等方面的问题,跟进合同的续签工作;对网站的留言进行电话跟进,在不泄露公司机密的前提下,尽可能满足各方需求,发送相关的资料;为了方便公司人员了解市场行情,开始尝试每周制作市场简报,将一周发生的行业信息、市场信息形成周报格式的文档,供大家参考。

四月,公司在确定要将融资工作作为今年的工作重点之一以后,商业计划书的写作也进入了紧锣密鼓阶段。都没有融资经验,摸石头过河的大家,希望请来的专业人士能够给出专业指导的同时,也开始了解商业计划书的相关格式、写作注意事项,并协助整理写作一些需要的材料;人员流动频繁的四月,在负责美工、测试、网管的同事相继离职,又没有新人接替工作的时候,我便临时兼任了这些工作,整理他们留下来的文档,熟悉先前的工作,解决诸如断网、重装系统等等工作,身兼数职,四处救火,淋漓尽致地发挥着万金油般的作用。

五月,融资工作初有起色,我们满心雀跃地迎接有可能成为公司战略伙伴的北京刘总的考察,作好演示PPT、演示系统、接待等一切准备工作。在公司人才紧缺的情况下,我这个菜鸟水平的人被推上了前方战场,第一次开始对外讲解、演示工作。战战兢兢之中,在经过几次三番的预演——提出意见改进——再预演——再提出意见改进——继续预演——继续提出意见改进的排练之后,我从一开始吞吞吐吐、心跳加快到正式演示时镇定自若、吐字清晰,花费了无数心血,这其中的喜乐悲辛,也只有当事人才能体会了。虽然最后因为种种原因融资没有成功,我在演示方面的表现却得到了肯定。整个五月,突然多了很多演示锻炼的机会,到南海CZ局给局长的演示,对青岛现场考察客户的系统演示,每一次演示,都意味着要写PPT,要准备演示系统,演示数据,要排练预演,为了不会说错话忘掉说什么,甚至写好台词,反复背诵。学习的过程,至今想来仍是一个苦涩的过程。在经过反复多次给处长、局长甚至国家领导演示之后,我相信自己已经完全可以胜任“演示”这项工作了。

六月,我开始了第一次全过程参与售前、现场开发实施的项目——深圳天健数据导入系统。从售前提供相关的系统说明文档,到签单后出差到现场参与项目工作,我第一次,实实在在地与客户接触,参与项目的具体工作。我主要是以EXCEL专家的身份协助客户制作清查表格,除了帮助客户解决在制表过程中无法实现的效果以外,更多的是作为劳动力帮助制表加快项目进度。当然,还少不了在项目过程中的一些需求整理、进度报告、客户方与我方开发人员的沟通工作。在深圳出差的一个月,几乎是我工作四年来最辛苦的一个月,状态一直是busy,busy,busy,一整天,除了腾出喝水、上厕所的时间以外,就是不断地键盘鼠标键盘鼠标,做着机械人般的重复劳动。成百上千份EXCEL表格,几乎是我这辈子见过、做过最多的表格。连续多日的高强度劳动,还抽时间回来公司去南海出差演示了一次,我感到前所未有的憔悴。不过,收获也很多很多。学会了怎样更好地与客户沟通;跟同事以认真、负责、专业的态度赢得了客户的认可;体验了另一个城市的工作和生活……感谢公司,给了我这样的一个机会。

七月,从深圳出差回来之后,已有一个月没有接触过公司里的工作,免不了收拾整理一番,心情、工作、状态。各个项目配置库的整理、备份,各个项目进度、系统功能的熟悉了解也变成了这一年来阶段性的、空闲下来做的工作。除去这些,静心工作,研究了sharepoint的安装、使用,可惜因为安装环境复杂等问题未能使用;起草了全国行政事业性国有资产的市场计划,重新设计表格整理客户资料;参与四川机关事务管理局的来访接待讨论会议,并准备相关的演示PPT、系统,以及演示。这一个月,以干零活、杂活为主,在回顾、总结、计划中度过。

八月,喜讯到来,公司签下了高明CZ局的单。有了深圳的第一次近距离接触客户,这一次便显得顺理成章。我又一次参与了从系统演示到现场安装、实施、培训的售前售后全过程工作。在琢磨如何做好这些技术支持工作的时候,我在支点网上找到一个网友写的《项目经理九阴真经》一文,如获至宝,除了好好研读,还全部下载成文,整理排版,并发给全公司同事共享,这本书得到了老板和众同事的好评,几乎成了我在此后做售前和售后工作时指导的明灯。去高明出差的一个星期,也是感慨良多,收获良多(见高明出差小记)。

九月,传来了东莞CZ局客户的需求,我便开始了又一个项目的跟进工作。写方案建议书,准备演示PPT,演示系统和数据,直到现在,三个月过后,这个项目经过在商务、需求多方面不断促进,至今还在跟进,在这中间,做了大量的沟通,需求、业务流程分析,原型演示的设计等工作,当然,这离不开其他同事的密切配合。融资工作在五月份北京刘总的考察未能取得成功之后,便没有再取得进展。这段时间,我加足马力在网上搜索风险投资公司的资料,把大大小小、国内国外的投资机构都搜罗了一番,一一发送邮件,看能不能因此找到一个对我公司感兴趣的投资商。这中间也收到一些回信,几个邮件来回之后还是觉得不适合。融资的工作大概不是随便发商业计划书给某某人、某某公司就可以轻而易举地打动人心进而成功的吧,公司未能在这项工作上取得突破,是我们2006年要继续探索的路。

十月,经过一年的艰苦努力、奋力拼搏,我们终于在九月里签下了开发区项目,这几乎是公司在黑暗中前进的一盏明灯,让我们看到了未来的丝丝希望。为了做好这个长期以来列为一号工程的单,研发部门调配了所有可出动的人手,我也加入了该项目组。计划是做实施培训工作,前期做的大多是配合link进行现场调研,需求分析,准备相关的演示PPT。到如今后期的阶段性测试工作也做完了,实施和培训工作却始终未能开展。一个项目的成功,开发方高度重视、技术精湛、产品功能齐全或许占很大的因素,但绝对与客户的重视、配合程度紧密相联,而这,往往是我们怎么努力也很难左右的。做政府部门业务之难、之变化多端我想无论是公司领导、销售人员还是开发人员都在这个项目中体会得淋漓尽致。除此之外,就是其它项目的配合,省厅设备清查EXCEL表格的修改,茂名项目的实施方案确定、表格整理、数据导入系统,甘肃国资委系统演示的跟进等等。

十一月,工作的重点主要围绕东莞和深圳两大售前项目开展。前者主要是到现场进行需求的调研、业务流程分析以及调研后演示系统的设计、开发跟进;后者主要是协助准备投标相关的标书,演示系统等。两项看似简单的工作,却也让人好好体验了一番忙碌,一直想静下心来好好地测试青岛项目的业绩考核系统,也因为这两项工作草草而过。

十二月,年底了,本该收尾盘点的时候我们却尽力作最后的冲刺,售前售后同时抓,想抓住新年的尾巴,为今年的努力写下壮丽的一笔。事情却往往难尽人意,辛苦跟进了一年的深圳项目废标了,踌躇满志想争取的湖北项目也未能拿下。尽管挫折重重,该争取的还是要继续争取,该努力的还是要继续努力,这一个月,还涉及了东莞演示系统的修改跟进;茂名项目的需求整理,修改跟进;天津城投项目系统的测试;辅助省厅项目的相关文档写作及项目跟进,也算是“尽人事,听天命”了。

回头看看这一年的工作,囊括了文职、演示、技术支持、网管、测试、配置管理、市场方方面面,在回答别人问我是做什么的时候,这仍然是一个让我左右为难的难题,即便公司冠我以“总裁办公室主管”一职仍然觉得什么也不像。甚至一度很为自己的职业定位而困扰,不知道“万金油”何年何月才能变成“特效药”?感谢九月里那一次意外的offer,让我有机会重新审视自己的职业定位,与T总深谈过后,更加明白了自己的优势劣势,坚定了自己的信念。尽管“万金油”也许成不了“特效药”,却时时能被人想起,时时派上用场发挥作用,又有何不可呢?

这一年来,很少可以对工作做月以上的计划,工作总是随着每个月甚至每一周项目/公司内务的轻重缓急变化而变化,今天难以预料明天的事。这当然与公司的市场、业务不稳定有很大的关系,不光个人、整个公司也很难计划。这便使很多工作的开展有点像打游击,开了个头却难以再配备足够资源进行后续的工作开展:比如融资,比如业绩考核市场公关,比如全国行政事业资产市场的计划……回过头来看的时候才发现,当时那么重要的一件事,以为会带来很大影响,其实并没有改变什么,甚至无足轻重,做了跟没做效果差不多。不知道是我们执行力不够,没有好好按照计划去完成既定的目标,亦或是在做决策的时候没有把好关?这些问题要留待我们慢慢去思考。

2005,个人接触到的新东西很多,学到的也不少。从前台——配置管理——总裁办公室秘书——总裁办公室主管,从综合管理部——开发部——总裁办公室的变化我想自己又前进了一步,上了一个新台阶,工作上的进步是我这个本命年里最好的礼物。只是想到公司的业绩、业务,心头却有太多的无奈和遗憾,为什么我们付出了那么多的心血和汗水,从老板、中层到普通员工,从销售、开发到后勤部门,每个人都付出了很多努力,说起来都有一肚子的辛酸,可换来的收获却仍是那么少那么少?遇到感情中、生活上的挫折时,每每想起T总这几年来面对公司的重重困难,始终满怀信心、笑着面对的态度,就会变得坦然起来。是啊,要长期在挫折中坚持前路必胜的信念,那需要多大的坚持和勇气啊。经营一个公司面对那么多的困难尚且如此,感情中、生活上又有什么不可以的呢?

日子一定会越来越好的,于公司,于个人,均如此,我越来越相信!

2008年7月21日星期一

软件项目研发的酸甜苦辣

软件项目研发的酸甜苦辣
http://blog.csdn.net/mac_cm

不管您是做过项目还是没有做过项目,项目总在您的身边。在这篇文章中将由有着10余年软件项目研发经验的邓子云先生和您分享“项目人生”的感悟。

  今天突然接到希赛网周泉的电话,问及我在IT业闯荡10余年有些什么感受,回想起这10余年来从事IT项目,特别是软件项目研发的一幕一幕,感慨良多,确实需要回头看看了,借助希赛网这个平台,我愿意和大家分享,这些年真的是“酸甜苦辣”,但又乐在其中。

  软件人的日子总是生活在项目中,不断地研发一个一个的项目,“项目人生”是生活历程的恰当写照,百味交杂,“酸甜苦辣”。

  (1)软件项目研发的“酸”

  软件项目真的成功了吗?先要想想成功的标准是什么。一是看是否满足了客户的需求;二是看是否达成了项目的既定目标,包括盈利目标、研发人力资源发展目标等。如果结合这两点来看,成功的项目并不多。从我从事的20余个项目来看,成功的仅占约五成。客户需求没完没了,根本不可能满足;超出预算是经常的事,保本经营打个市场就算幸运。

  软件企业、软件人的日子总是那么艰辛,项目收尾的时候皆大欢喜的情况并不多见,总是有点“酸”,一来客户总算放你一码,让你做的软件先用着,一个项目做下来,结果还是不完善,开发人员总觉得委屈。二来标的总不能100%到位,签的合同100万,甲方让你分期得到,还要留点余款,谁叫你是乙方呢?他是你的衣食父母,能给你就不错了。

  (2)软件项目研发的“甜”

  也不知道为什么,每新启动一个项目,总是充满了激情;每收尾一个项目总是酸中带喜。原来做程序员的时候看到自己的程序在为客户跑着一笔的业务时心里就高兴,有成就感;后来做项目经理时,一到系统上线时就兴奋得睡不着觉,要检验成果了,要切换系统了,一个细节也不能错过。

  (3)软件项目研发的“苦”

  真的苦,长年加班、出差在外,知识又学不完。加班是家常便饭,“没有加过班的软件人肯定不是地球人”。编写代码,调试程序,测试和修改只怕都得自己做,项目组人多点总算有个测试员了,代码还得自己改,改了再测。

  开发人员根本不清楚明天的项目场子会在哪座城市,说不定公司还会把自己以“修身养性”为名安排到僻静之所净心开发。作为项目经理在外的时间就更多了,手头的项目越多,只怕要跑的地方也越多,多项目管理的项目经理就象是名星“走穴”。

  也不知道下一个项目需要采取什么技术,Java吧,跨平台,技术体系相当庞大,开源技术满天飞;.NET吧,工具多,用来方便,不过许多客户明确要求用J2EE。工作10余年,20余个项目,操作系统用过Windows、UNIX、LINUX等;中间件用过Weblogic、Websphere、Tomcat、Tuxedo、MQ、CICS、MT等;数据库用过ACCESS、SQL Server、SYBASE、infomix、Oracle、DB2等;软件开发语言用过Java、ASP、VB、C#等;开源框架技术用过Struts、Hibernate、Spring等;真不知道明天用什么,自己也把握不了。做项目经理总可以把握了吧,幸好不要写太多的代码了,但是技术攻关只怕还得项目经理来参与;客户关系协调得项目经理来做(这可能是许多技术人员力所不及的)。

  (4)软件项目研发的“辣”。

  碰到利害的客户这是一“辣”,要不是能侃(这种一般不懂专业,还真不好侃),就是憋着(这种一般很专业,侃不开),这时候得自己“辣”一点,前者和他一起侃大山,后者想办法调剂一下,就对方聊感兴的专业领域,找知音。找不到合适的人手又是一“辣”,现在招一名熟练的Java程序员只怕真难,程序员易找,工程师难寻,“辣”得饥渴。

  软件人必将尝遍“酸甜苦辣”,才有可能逐步成长成熟,虽然每个项目能带给我们诸多的烦恼,真的是做程序员时想着做项目经理可能就轻松了,做项目经理时就想着还是做程序员境界更高,但肯定是乐在其中,不断地迎接一个一个项目带来的挑战,克服一个一个的困难,这样必然会有所收获,愿我们一起共勉,继续软件项目的征程。

MMS彩信

MMS彩信
http://blog.csdn.net/mac_cm

一、概述
MMS彩信大家都看到过,或者都编辑过。在这里,利用一系列的文章来说明彩信的编辑、发送和接收的过程。首先这里,简单描述一下彩信的编辑过程。这是彩信的第一步。
二、MMS的表述(presentation)语言——SMIL概述
MMS由一系列类似于“power point style”类型的slide组成,由这些slide来组织各种格式的文本、音频、视频信息。这些我们在发送或者接受彩信的时候都有切身的体会,就不说了。
为了把这些多媒体信息组织到一起,通过网络发送,并且这些信息在接收者那里能够保证按照发送者的样式进行播放。这里就需要采用一种技术,用于描述彩信的组织和播放方法。这种方法就是利用SMIL语言。看过这个语言的规范之后,我想大部分熟悉HTML和XML的人都会会心的笑了,的确,这就是SMIL语言。
MMS使用SMIL(Synchronized Multimedia Integration Language)的子集作为表述语言,SMIL是由W3C(world wide web consortium)制定的基于XML的表述语言标准(可以参见附录中之处的RFC文档)。相当于HTML之于web。SMIL语言可以控制多媒体对象的layout和timing(播放时间)。
在初期,MMS只使用了SMIL的简单基础子集,称作“MMS SMIL”。每个MMS信息都是由SMIL表述语言文件组成。在这个文件中所有的slide有相同的layout。每个slide至少包含两个region,一个包含文本,一个包含图像。事实上,每个slide都是一个frame,每个frame包含layout和指向内容(text、images、audio、video)的索引。每个slide的播放周期以秒计算,在每个slide的内部,文本和图像的播放时间可以单独设定。
由于每个移动设备的尺寸不尽相同,所以SMIL被设计成可以根据终端的不同表现形式作以重新安排。简单说来,SMIL具有下列特点:
§ 来自于W3C的规范定义
§ SMIL只是简单地限定了各种message元素在何时、在什么地方显式
§ SMIL文件以标记开始,接下来是head和body标记,最后以结束
§ Head标记元素限定了
§ Body标记元素限定了被插入内容的参考索引(references),并且限定了何时、何地播放以及每个元素播放的时间。
下面一段文字来自于IBM,说明了在MMS之外SMIL的广泛用途。
SMIL 2.0 是同步多媒体集成语言(Synchronized Multimedia Integration Language),它已开始成为将多媒体集成到 Web 内容的重要新方法。SMIL 提供基于 XML 的方法来控制多媒体元素的定时和表示,它已开始获得众多大的软件供应商和工具制作商的支持,这使得开发人员使用它变得越来越容易。
SMIL 支持已开始成为 Adobe、Microsoft 以及(也许是最重要的)媒体传递领先者 Real Networks 支持的技术之一。众多较小的供应商已开始提供 SMIL 创作工具和播放器。
在不久的将来,随着对当前 2.0 规范支持的增长,对于任何在工作中需要某种形式的多媒体资产控制的开发人员,使用 SMIL 将成为他们的标准策略。如果把正在增长的工具创建者的名单作为某种指示,那么用 SMIL 构建表示也会变得更简单。
RealNetworks正如前面 提到的那样,最广泛的 SMIL 2.0 实现可能来自 Real Networks。RealOne Player 支持 SMIL 2.0 语言概要文件(SMIL 2.0 Language Profile),它结合了 SMIL 支持的大多数(尽管不是全部)模块。除了支持大多数标准 SMIL 模块以外,RealNetworks 还开发了自己的几个 SMIL 扩展。要使用这些扩展,开发人员必须遵守标准 XML 声明.
Microsoft通过使用少量的 一系列基于 SMIL 的 XML 元素和属性,Microsoft 的 HTML+TIME 给 HTML 页面添加了定时和多媒体支持。为了给 HTML 文档添加定时,开发人员要向现有的 HTML 元素添加新属性。创建新元素是为了使向 HTML 页面添加媒体变得简单。
为了使用任何 HTML+TIME 元素,开发人员必须在 HTML 标记中声明 XML 名称空间 t:
不同于上述这两个供应商,大多数创作工具和播放器开发人员主要分为两种,
§ 一种是只关注 SMIL 的完整台式机部署
§ 另一种至少要关心一下用于占用资源较小的移动设备的基本 SMIL 2.0 子集。
此外,随着无线网络的发展,关注 MMS 部署的 SMIL 播放器应该对 SMIL 创作有新的考虑。
三、SMIL简单示例
下面给出了一个MMS消息的SMIL示例:

<-head>
<-meta name="title" content="vacation photos">
<-meta name="author" content="Danny Wyatt">


height="80" left="0" top="0" />
height="40" left="0" top="80" />


<-body>










具体的SMIL描述语言的解释可以参见附录的参考文档,那里给出了每种标记的解释说明。
至于在手机软件上实现,也不是很困难的事情。想想看。
利用结构数组,把所有的MMS中的slide存储到其中,最后,结合SMIL语言的规范,把彩信
打包成上述文件的格式,注意,这里,并不需要把具体的多媒体文件内容添加到smil文件中,只需要加在smil文件中,作为附件就可以了。具体的数据的加载,请看下一篇——MMS的打包部分吧!

一、MMS的封装(Encapsulation)——MIME
对于使用SMIL语言描述的MMS,在通过无线网络发送的时候,我们必须通过某种方式把SMIL和附属的内容包装在一起,一边能够以一个unit(整体)的形式发送出去,以便SMIL文件各个部分内容的reference变得有效。
这个解决的办法就是MIME(Multipart Internet Mail Extensions)规范,这个规范的最初作用是在email的plain text的主体中加入不同的内容。比如说,发送带有附件的email,这个时候你就使用了MIME的规范。MIME负责把所有的独立的文本、图像、声音、视频内容以及SMIL文件本身捆绑在一起,这个规范称为MIME Encapsulation Aggregate Documents,用于告诉接受的终端这个MMS的内容是相互相关(related to one another)并且相互参考的(referenced to one another)。
1. MIME封装示例
下面是根据RFC文档给出的MIME的封装示例:
Content-Type: multipart/related; boundary="boundary-example";
type="text/html"
--boundary-example
Content-Type: text/html; charset="US-ASCII"
... ... ... ...
... ... ... ...
--boundary-exampleContent-Type: image/gifContent-ID: <97116092511xyz@foo.bar.net>Content-Location: fiction1/fiction2--boundary-exampleContent-Type: image/gif
Content-ID: <97116092811xyz@foo.bar.net>
Content-Location: fiction1/fiction3
--boundary-example--§ Content-type
位于信息头部的content-type用于通知接收的终端消息的各个不同部分的内容是相互关联的、并且可能是相互索引的(refer to one another)。
§ Boundary
Boundary用于分割各个不同的消息part。第一个部分是一个html类型的消息,这里只是取得了相关的部分。第二和第三部分省略了实际的images图像的实体。
§ Location and ID
在HTML文本部分我们可以看到,我们可以利用两种方式来索引消息内容的不同部分。这两种不同的方式是 content-ID 和 content – Location。
如果一部分的消息体想通过content-ID指向(refer to)另外一部分的消息体,可以使用“CID”.
关于MIME的部分的信息可以参考附录中列出的RFC文档(RFC2387和RFC2357)。
2. 利用MIME封装MMS的示例
下面给出一个利用MIME封装MMS的示例:
Content-Type: multipart/related;
Type="application/smil"; Start="";boundary="----=_Part_24362_271418.1110357304160"
------=_Part_24362_271418.1110357304160
content-type: text/x-vCalendar;Charset=UTF-8;Name="slide1.vcs"
content-id:
content-location: slide1.vcs
Content-Transfer-Encoding: base64
QkVHSU46VkNBTEVOREFSDQpWRVJTSU9OOjEuMA0KQkVHSU46VkVWRU5UDQpEVFNUQVJUOjIwMDUw
MzA4VDA5MDAwMFoNCkRURU5EOjIwMDUwMzA4VDEwMDAwMFoNClNVTU1BUlk7Q0hBUlNFVD1VVEYt
ODtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOuaYr+WQpg0KQ0FURUdPUklFUztDSEFSU0VUPVVU
Ri04O0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6QVBQT0lOVE1FTlRTDQpFTkQ6VkVWRU5UDQpF
TkQ6VkNBTEVOREFSDQo=
------=_Part_24362_271418.1110357304160
content-type: application/smil;Charset=UTF-8;Name="20050309163706.smil"
content-id:
Content-Transfer-Encoding: base64
PHNtaWw+PGhlYWQ+PGxheW91dD48cm9vdC1sYXlvdXQgd2lkdGg9IjE3NiIgaGVpZ2h0PSIxNzQiLz48cmVnaW9uIGlkPSJmdWxsIiB3aWR0aD0iMTc2IiBoZWlnaHQ9IjE3NCIgbGVmdD0iMCIgdG9wPSIwIiAvPjwvbGF5b3V0PjwvaGVhZD48Ym9keT48cGFyIGR1cj0iNXMiPjx0ZXh0IHNyYz0ic2xp
ZGUxLnZjcyIgcmVnaW9uPSJmdWxsIiAvPjwvcGFyPjwvYm9keT48L3NtaWw+
------=_Part_24362_271418.1110357304160--
下图给出的图示说明各个部分之间的关系:
3. 一个完整的MIME封装MMS示例
下表给出了一个完整的MIME封装MMS的示例:
MIME Object Date: Fri, 14 Dec 2001 15:13:21 -0500 (EST)
X-Mms-Expiry: Thu, 20 Dec 2001 21:52:25 -0500 (EST)
X-Mms-Delivery-Time: Wed, 19 Dec 2001 21:52:25 -0800 (PST)
X-Mms-Priority: Normal
X-Mms-Sender-visibility: Show
X-Mms-Message-Class: Personal
X-Mms-Delivery-report: yes
X-Mms-3GPP-MM3-Version: 4.3.0
From: mms-email-sample@sample-email.ericsson.com
To: +12345@mmc.sample-mms.ericsson.com
Subject: Sample SMIL
Mime-Version: 1.0
Content-Type: multipart/related; boundary="----
=_MIME_Boundary_MMS_Reference_Sample_001"
MIME Headers "----=_MIME_Boundary_MMS_Reference_Sample_001" MIME Start boundary
Content-ID:
Content-Type: application/smil; charset="US-ASCII"; name=index.smil

<-head>





<-body>







SMIL document "----=_MIME_Boundary_MMS_Reference_Sample_001" MIME boundary
Content-Type: text/plain; name=mms.txt
Content-Transfer-Encoding: 7bit
Content-ID:
Content-Disposition: attachment; filename=mms.txt
This is a sample MMS message, for use as a reference.
Text Document
"----=_MIME_Boundary_MMS_Reference_Sample_001" MIME boundary
Content-Type: image/gif; name=sample.gif
Content-Transfer-Encoding: base64
Content-ID:
Content-Disposition: attachment; filename=sample.gif

R0lGODlhZQBQAPcAAOYeAClUpyAtb/XNjlo8RqoUFHSa2ZCKjHiCWrzf/2iQ1J
m66Yeq4cXm/6ys


kBiJkjiJlFiJlniJmJiJmriJnNiJnviJoBiKogh5AQEAOw== Image "----=_MIME_Boundary_MMS_Reference_Sample_001" MIME boundary



二、 MMS的MIME结构
综述来说,每个MMS信息按照MIME规范的基本结构如下图所示:
从图示看出,每个MMS都是由MMS Header和MMS Body组成,MMS Header根据WAP-209协议和RFC2387的规定,由一系列的域组成,下表列出了部分的域(给出的示范的内容表示),其中有些是强制必须实现的(用黑体表示)。
X-Mms-Message-Type
m-send-req
X-Mms-Transaction-ID
1234
X-Mms-MMS-Version
1.0
Date
星期五, 18 三月 2005 06:43:40 GMT
From
mms-editor@toolkit
To
33333333333333
Cc
33333333333333
Bcc

Subject
test
X-Mms-Message-Class
Personal
X-Mms-Expiry
星期六, 19 三月 2005 06:43:40 GMT
X-Mms-Delivery-Time
星期五, 18 三月 2005 06:43:40 GMT
X-Mms-Priority
low
X-Mms-Sender-Visibility
Show
X-Mms-Delivery-Report
No
X-Mms-Read-Reply
No
Content-Type
application/vnd.wap.multipart.related; start="" type="application/smil"
1. MMS承载的内容elements
MMS只是用于发送消息的载体,根据规范,我们可以发送各种不同类型的内容元素。这些内容元素组成MMS中各个不同的部分。根据元素类型的不容,每个part Header部分的content-type也不尽相同。下面给以示例:
§ 文本:
文本包含很多类型,普通文本的类型可以表示为——text/plain,而vcard类型的文本表示为text/x-vCard。
§ 静态图像
静态图像存在各种不同的类型,根据不同的编码方式由不同的后缀名表示。如image/gif 和image/jpeg。

ADS1.2进行嵌入式软件开发

ADS1.2进行嵌入式软件开发

http://blog.csdn.net/mac_cm
概述 嵌入式应用程序通常都是在样机环境下调试与开发的,这种环境与最终产品之间并不完全相同。因此,在系统调试阶段就考虑应用程序在最终目标硬件中的运行情况是非常重要的。 本文旨在讨论如何将一个开发/调试环境下的嵌入式应用程序转移到最终独立运行的目标系统中去,并提到了ARM ADS1.2开发工具包的一些功能特性及其在这个过程中所起到的作用。
使用ADS开发嵌入式程序时,需要着重考虑以下几个问题:1.与硬件相关的C语言库函数的使用;2.某些C语言库函数使用了调试环境中的资源,要把这些使用的资源重定向到目标系统中的硬件上来;3.可执行映象文件的存储器映射必须根据目标硬件的存储器分布进行裁剪;4.在主程序执行前,嵌入式应用程序必须先完成系统的初始化。一个完整的初始化包括用户的启动执行代码和ADS中C库函数的初始化过程。

图1 Semihosting的实现举例


图2 C语言库函数结构

图3 缺省的存储器映射

图4 连接器布局规则
缺省的工程项目设置刚开始一个嵌入式应用软件开发时,ADS用户可能并不完全清楚目标硬件的一些参数指标。比如有关外设、存储器地址分布,甚至处理器类型等一些细节,可能还没有最终确定。为了在所有这些细节全部就绪前就能进行软件开发,ADS工具有一套程序构建和调试的缺省设置。了解这套缺省的工程项目设置方法,对于掌握最终的移植步骤非常有好处。
ADS1.2C语言函数库Semihosting在ADS的C语言函数库中,某些ANSIC的功能是由主机的调试环境来提供的,这套机制有一个专门术语叫Semihosting。Semihosting通过一组软件中断(SWI)指令来实现。如图1所示,当一个Semihosting软中断被执行时,调试系统先识别这个SWI请求,然后挂起正在运行的程序,调用Semihosting的服务,完成后再恢复原来的程序执行。因此,主机执行的任务对于程序来说是透明的。
C语言库函数结构从概念上来讲,C语言库函数可以被分成两部分,一是ANSIC语言规范本身的一部分,一是只受某一特定ANSIC层次支持的函数,如图2所示。其中一些ANSIC的功能是由主机调试环境调用驱动程序级的函数完成的。例如,ADS的库函数printf()把输出信息输出到调试器的控制台窗口,这个功能通过调用__sys_write()实现,__sys_write()执行了一个把字符串输出到主机控制台的Semihosting软中断服务程序。
缺省的存储器映射如果用户在程序编译时没有指定映象的存储器映射分布,ADS将为生成的目标代码和数据分配一个缺省的存储器映射图,如图3所示。目标印象被连接至地址0x8000,存储和执行区域都位于该地址开始的空间。RO(只读)部分放在前面,接着是RW(读写)部分,最后是ZI(零初始化)部分。在ZI部分之上紧跟着HEAP,所以HEAP的确切地址要在连接时才能确定。STACK的基地址是在应用程序启动时由一个Semihosting操作提供。这项Semihosting操作返回的地址值视不同调试环境而定:ARMulator返回配置文件peripherals.ami中的设置值;缺省为0x08000000。Multi-ICE返回的是调试器内部变量$top_of_memory的值;缺省为0x00080000。
连接器布局规则连接器对代码和数据在存储器系统中的分配,遵循一套规则,如图4所示。映象首先按照属性以RO-RW-ZI的次序进行排列,在同一种属性里面代码先于数据。然后连接器将输入段根据名字的字母顺序进行排列,输入段的名字与汇编代码里面的块名字指示一致(在汇编程序中用AREA关键字)。在输入段中,来自不同对象的代码和数据放置次序与在连接器命令行中指定的对象文件次序一致。在需要灵活分配代码和数据放置位置的情况下,建议用户不要简单地依靠这些规则。后面会介绍一种如何控制代码和数据布局的机制Scatterloading。

图5 缺省的ADS初始化过程

图6 C库函数重定向

图7 scatter文件语法

图8 分散加载的简单样例
启动应用程序大多数嵌入式系统在进入应用主程序之前有一个初始化的过程,该过程完成系统的启动和初始化功能。缺省的ADS初始化过程如图5所示。总体上,初始化过程可以分成两部分来看:_main负责设置运行映像存储器映射;_rt_entry负责库函数的初始化。_main完成代码和数据的复制,并把ZI数据区清零。这一步只有当代码和数据区在存储和运行时处于不同的存储器位置时才有意义。接着_main跳进_rt_entry,进行STACK和HEAP等的初始化。最后_rt_entry跳进应用程序的入口main()。当应用程序执行完时,_rt_entry又将控制权交还给调试器。函数main()在ADS中有特殊的意义。当一个程序工程项目中存在main()时,连接器会把_main和_rt_entry中的初始化代码连接进来;如果没有main()函数,初始化过程就不会被连接,结果就会导致一些标准的C库函数无效。
根据目标环境裁减C库函数缺省状态下C库函数利用Semihotsting机制来实现设备驱动的功能。但一个真正的嵌入式系统,要使用到具体的外设或硬件独立于主机环境运行。C库函数重定向用户可以定义自己的C语言库函数,连接器在连接时自动使用这些新的功能函数。这个过程叫做重定向C语言库函数,如图6所示。举例来说,用户有一个I/O设备(如UART)。本来库函数fputc()是把字符输出到调试器控制窗口中去的,但用户把输出设备改成了UART端口,这样一来,所有基于fputc()函数的printf()系列函数输出都被重定向到UART端口上去了。下面是实现fputc()重定向的一个例子:externvoidsendchar(char*ch);intfputc(intch,FILE*f){/*e.g.writeacharactertoanUART*/chartempch=ch;sendchar(&tempch);returnch;}这个例子简单地将输入字符重新定向到另一个函数sendchar(),sendchar()假定是一个另外定义的串口输出函数。在这里,fputc()就好像目标硬件和标准C库函数之间的一个抽象层。
在C语言库函数中禁用Semihosting在一个独立的嵌入式应用程序中,应该不存在SemihostingSWI操作。因此,用户必须确定在所有调用到的库函数中没有使用Semihosting。为了保证这一点,在程序中可以引进一个符号关键字_use_no_semihosting:在C代码中,使用#prgrama #pragmaimport〈_use_no_semihosting_swi〉在汇编程序中,使用IMPORTIMPORT_use_no_semihosting_swi这样,当有使用SWI机制的库函数被连接时,连接器会进行报错:Error:Symbol_semihosting_swi_guardmultiplydefined为了确定具体是哪一个函数,连接时打开-verbose选项。这样在结果信息输出时,该库函数上将有一个_I_use_semihosting_swi的标记。Loadingmembersys_wxit.ofromc_a_un.1.Definition:_sys_exitReference:_I_use_semihosting_swi用户必须要把这些函数定义成自己的执行内容。有一点需要注意,连接器只能报告库函数中被调用的Semihosting,对用户自定义函数中使用的Semihosting则不会报错。
根据目标硬件定制存储器映射分散装载(Scatlerloading)在实际的嵌入式系统中,ADS提供的缺省存储器映射是不能满足要求的。用户的目标硬件通常有多个存储器设备位于不同的位置,并且这些存储器设备在程序装载和运行时可能还有不同的配置。Scattertoading可以通过一个文本文件来指定一段代码或数据在加载和运行时在存储器中的不同位置。这个文本文件scatterfile在命令行中由-scatter开关指定,例如:armlink_scatterscat.scffilel.ofile2.0在scatterfile中可以为每一个代码或数据区在装载和执行时指定不同的存储区域地址,Scatlertoading的存储区块可以分成二种类型:装载区:当系统启动或加载时应用程序的存放区。执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行块。映像中所有的代码和数据都有一个装载地址和运行地址(二者可能相同也可能不同,视具体情况而定)。在系统启动时,C函数库中的__main初始化代码会执行必要的复制及清零操作,使应用程序的相应代码和数据段从装载状态转入执行状态。1.scatter文件语法scatter文件是一个简单的文本文件,包含一些简单的语法。My_Region0x00000x1000{thecontextofregion}每个块由一个头标题开始定义,头中至少包含块的名字和起始地址,另外还有最大长度和其他一些属性选项。块定义的内容包括在紧接的一对花括号内,依赖于具体的系统情况。一个加载块必须至少含有一个执行块;实践中通常有多个执行块。一个执行块必须至少含有一个代码或数据段;这些通常来自源文件或库函数等的目标文件;通配符号*可以匹配指定属性项中所有没有在文件中定义的余下部分。2.简单分散加载样例图8所示样例中,只有一个加载块,包含了所有的代码和数据,起始地址为0。这个加载块一共对应两个执行块。一个包含所有的RO代码和数据,执行地址与装载地址相同;同时另一个起始地址为0x10000的执行块,包含所有的RW和ZI数据。这样当系统开始启动时,从第一个执行块开始运行(执行地址等于装载地址),在执行过程中,有一段初始化代码会把装载块中的一部分代码转移到另外的执行块中。下面是这个scatter描述文件,该文件描述了上述存储器映射方式。LOAD_ROM0x4000{EXE_ROM0x00000x4000;Rootregion{*〈+RO〉;Allcodeandconstantdata}RAM0x100000x8000{*〈+RW,+ZI〉;Allnon-constantdata}}3.在分散文件中放置对象在大多数应用中,并不是像前例那样,简单地把所有属性都放在一起,用户需要控制特定代码和数据段的放置位置。这可以通过在scatter文件中对单个目标文件进行定义实现,而不是只简单地依靠通配符。为了覆盖标准的连接器布局规则,我们可以使用+FIRST和+LAST分散加载指令。典型的例子是在执行块的开始处放置中断向量表格:LOAD_ROM0x00000x4000{EXEC_ROM0x00000x4000{vectors.o〈Vect,+FIRST〉*〈+RO〉};moreexecregions...}在这个scatter文件中,保证了vextors.o中的Vect域被放置于地址0x0000。4.RootRegion(根区)根区是一个执行块,它的加载地址与执行地址是一致的。每个scatter文件至少有一个根区。分散加载有一个限制:创建执行块的代码和数据(即完成复制和清零的代码和数据)无法自行复制到另一个位置。因此,在根区中必须含有下面的部分:_main.o,包含复制代码/数据的代码;连接器输出变量$$Table和ZISection$$Table,包含被复制代码/数据的地址。由于上面两个部分的属性是只读的,因此他们被*〈+RO〉通配符语法匹配。如果*〈+RO〉被用在了非根区中,则在根区中必须显式地指明另一个RO区域。下面是一个例子:LOAD_ROM0x00000x4000{EXE_ROM0x00000x4000;rootregion{_main.o〈+RO〉;copyingcode*〈Region$$Tabl0e〉;RO/RWaddressestocopy*〈ZISection$$Table〉;ZIaddressestozero}RAM0x100000x8000{*〈+RO〉;allotherROsections*〈+RW,+ZI〉;allRWandZIsections}}

上期主要介绍了基于ARM的嵌入式系统软件开发中,怎样来对必要的C库函数进行移植和重定向,以及如何根据不同的目标存储器系统进行程序编译和连接设置。本期介绍程序中的存储器分配和如何根据设置正确初始化系统。
放置堆栈和heapScatterloading机制提供了一种指定代码和静态数据布局的方法。下面介绍如何放置应用程序的堆栈和heap。* _user_initial_stackheap重定向应用程序的堆栈和heap是在C库函数初始化过程中建立起来的。可以通过重定向对应的子程序来改变堆栈和heap的位置,在ADS的库函数中,即_user_initial_stackheap()函数。_user_initial_stackheap()可以用C或汇编来实现,它必须返回如下参数:r0:heap基地址;r1:堆栈基地址;r2:heap长度限制值(需要的话);r3:堆栈长度限制值。当用户使用分散装载功能的时候,必须重调用_user_initial_stackheap(),否则连接器会报错:Error: L6218E: Undefined symbol Image$$ZI$$Limit (referred from sys_stackheap.o)
*存储器模型ADS提供了两种实时存储器模型。缺省时为one-region,应用程序的堆栈和heap位于同一个存储器区块,使用的时候相向生长,当在heap区分配一块存储器空间时需要检查堆栈指针。另一种情况是堆栈和heap使用两块独立的存储器区域。对于速度特别快的RAM,可选择只用来作堆栈使用。为了使用这种two-region模型,用户需要导入符号use_two_region_memory,heap使用需要检查heap的长度限制值。对这两种模型来说,缺省情况下对堆栈的生长都不进行检查。用户可以在程序编译时使用 -apcs/swst 编译器选项来进行软件堆栈检查。如果使用two-region模型,必须得在执行_user_initial_stackheap时指定一个堆栈限制值。

图9 重定向_user_initial_stackheap()

图10 基本初始化过程

图11 ROM/RAM重定向和映射
表1
系统复位和初始化目前情况,一般假设程序从C库函数的初始化入口_main开始执行。实际上,所有的嵌入式程序在启动时都要执行一些系统级的初始化操作。在此讨论这方面的内容。初始化过程图10中显示了一个基于ARM的嵌入式系统的基本初始化过程。可以看到,在_main之前加入了一个复位处理模块reset handler,它在系统上电复位时立即启动。标识为$sub$$main的新代码块在进入主程序之前执行。复位处理模块reset handler通常是一小段汇编代码,在系统复位时执行。它至少完成应用程序中使用到的所有处理器模式的堆栈初始化工作。对于含有本地存储器系统的内核(比如含cache的ARM内核),配置工作也必须在这一段初始化过程中完成。当完成系统初始化之后,通常程序会跳向_main,开始C库函数的初始化过程。系统初始化过程一般还包括另外一些内容,中断使能等,这些大多安排在C库函数的初始化完成之后执行。$sub$$main()完成这部分功能。向量表(vector table)所有的ARM系统都有一张中断向量表当出现异常需要处理时,必须调用向量表。向量表一般要位于0地址处。
表2
表3
表4
表5
表6
表7
表8
表9
表10
存储器配置*ROM/RAM重定向当系统启动的时候,为了保证0地址处有正确的启动代码存在,需要非易失性的存储器。一种简单的方法,就是把系统0x0000开始的一块地址分配给ROM。其缺点是,由于ROM的访问速度比RAM慢很多,当执行中断响应需要从中断向量表跳转时,会给系统性能带来损失;同时,在ROM中的向量表内容也不能被用户程序动态修改。另外一种可行的方案如图11所示。ROM位于地址0x1000开始的地方,但是在系统复位时又被存储器控制器映射到0x0000地址处。这样当系统启动之后,在地址0x0000看到的是ROM,系统执行这块ROM中的启动代码,启动代码跳转到真正的ROM的地址,并让存储器控制器移除对ROM的地址映射。这时0x0000地址处的存储器又恢复回了RAM。__main中的代码把向量表copy到0x0000处的RAM中去,使得异常时能被正确响应。表1为ARM汇编中执行ROM/RAM重定向和映射的一个例子。它以ARM公司的Integrator平台为基础的,该方法适用于类似ROM/RAM重定向方法的所有平台。第一条指令完成从ROM的映射地址(0x00000)到真实地址的跳转。地址标号instruct_2是ROM的真实地址(0x180004)。然后通过设置Integrator平台上的相应控制寄存器,移除ROM的地址映射。代码在系统一启动就被执行。所有关于地址重定向/映射的操作必须在C库函数初始化之前完成。
*本地存储器配置许多ARM处理器都有片上存储器系统,如cache和紧密耦合存储器(TCM)、存储器管理单元(MMU)或存储器保护单元(MPU)。这些设备都要在系统初始化过程中正确配置,并且有一些特殊的要求需要考虑。由前文可知,_main中的C库函数初始化代码负责程序运行时的存储器系统设置。因此,整个存储器系统本身必须得在__main之前完成初始化工作,如MMU或MPU必须在reset handler里面完成配置。紧密耦合存储器(TCM)的初始化同样须在_main之前完成(通常在MMU/MPU之前),因为一般程序都需要把代码和数据分散装入TCM。需要注意的是当TCM被使能后,不再访问被TCM屏蔽的存储器。关于cache的一致性问题,如果cache在_main之前使能的话,那么当_main里面进行从装载区到执行区的代码和数据拷贝时(因为在拷贝过程中指令和数据在本质上都是被当作数据处理),指令会出现在数据缓冲区。避免此问题的方法是在C库函数初始化完成后再使能cache。*Scatter loading与存储器配置无论是通过ROM/RAM重定向还是MMU配置的方法,如果系统在启动和运行时存储器分布不一致,scatterloading文件中的定义就要按照系统重定向后的存储器分布情况进行。以上文ROM/RAM重定向为例:LOAD_ROM 0x10000 0x8000{EXE_ROM 0x10000 0x8000{reset_handler.o (+RO, +FIRST)...}RAM 0x0000 0x4000{vectors.o (+RO, +FIRST)...}}装载区LOAD_ROM被放置在0x10000处,代表了重定向之后代码和数据的装载地址。
堆栈的初始化程序中可能用到的处理器模式,都需要定义一个堆栈指针。在表2中,堆栈位于stack_base标识的地址中。这个符号可以是存储器系统中的一个直接地址,也可以在另外的汇编文件中定义,由scatter文件来定义分配地址。表2代码为FIQ和IRQ模式各分配了一个256字节的堆栈,用户可以用同样的方法为其他模式也分配堆栈。最简单的方法就是进入相应的模式,然后为SP寄存器指定相应的值。如果想使用软件堆栈检查,还必须指定一个堆栈长度限制值。堆栈指针和堆栈限制的数值会作为参数自动传递到C库函数的初始化代码__user_initial_stackheap中,在__user_initial_stackheap中不应该修改这些值。硬件初始化 $sub$$main()一般来说,应该把所有的系统初始化代码与主应用程序分离开来,但是有几个例外,比如cache和中断的使能,需要在C库函数初始化之后执行。表3代码显示了如何使用 $sub和 $supper 。连接器把呼叫main()的函数替换成呼叫$sub$$main(),完成cache和中断的使能,并最终跳向main()。
执行模式考虑为主应用程序选择一个处理器执行模式非常重要,这取决于系统的初始化代码。许多在启动过程中使用到的功能,如MMU/MPU的配置、中断的使能等,只能在特权级模式下进行。如果需要在特权极模式下运行自己的应用程序,只要在退出初始化过程之前改变到相应的模式就行了,没有其他任何问题。如果使用user模式,必须保证所有只能在特权模式下执行的功能完成之后,才能进入user模式。因为system模式和user模式使用相同的寄存器组,reset handler应该从system模式退出,_user_initial_stackheap在system模式下完成应用程序堆栈的初始化。这样在处理器进入user模式后,所有的堆栈空间都已经被正确设置好了。
对存储器布局的进一步考虑在scatter文件中分配硬件地址虽然可以在一个scatter文件中描述代码和数据的分散布局,但是目标硬件中的外设寄存器,堆栈和heap配置仍然直接采用硬件地址在程序源代码中进行设置。如果把所有存储器地址相关的信息都在scatter文件中进行定义,避免在源文件中引用绝对硬件地址,对程序的工程化管理是有大好处的。*在scatter文件中定义目标外设地址通常外设寄存器的地址在程序文件或头文件中定义,也可以声明一个结构类型指向外设寄存器,结构的地址定位在scatter文件中完成。举例来说,目标定时器上有2个32位的寄存器,可以用表4来映射这些寄存器。为了把结构放置在指定的存储器地址上面,创建一个新的执行区(见表5)。scatter文件便把timer_regs结构定位在了地址0x40000000。注意,在启动过程当中这些寄存器的内容不需要清零,改变寄存器的内容可能影响系统状态。在执行区上加UNINIT属性可以防止ZI数据在初始化过程中被清零。在scatter文件中分配堆栈和heap在许多情况下,用scatter文件来定义堆栈和heap的地址会带来一些好处,主要有:所有的存储器分配信息集中在一个文件里;改变堆栈和heap的地址只要重新连接就行了,不需要重新编译。*显式地放置符号在ADS1.2环境下,这是最简单的方法。在前文中引用过2个符号stack_base和heap_base,这2个符号在汇编模块中创建,在scatter文件中各自的执行区里定位(见表6)。表7文件中,heap基地址定位在0x20000上,堆栈基地址位于0x40000。现在heap和堆栈的位置就可以非常方便地进行编辑了。*使用连接器产生的符号这种方法需要在目标文件中指定好heap和堆栈的长度。这在一定程度上减弱了本节开头描述的两个优点。首先在汇编源程序中定义heap和堆栈的长度。关键词SPACE用来保留一块存储器空间,NOINT则可以阻止清零操作(见表8)。注意在这里的源文件中并不需要地址标号。然后这些部分就可以在scatter文件中对应的执行区里定位了(见表9)。连接器产生的符号指向每一个执行区的基地址和长度限制,这些符号可以被_user_initial_stackheap调用的重定向代码使用。在代码中使用DCD来给这些值定义更有意义的名字,可以增强代码的可读性(见表10)。文件把heap基地址定位在0x15000,堆栈地址定位在0x4000。Heap和堆栈的位置可以通过编辑对应执行区的地址方便地改变。

(本人长期提供MTK手机平台代码和资料,需要联系QQ:85313653
开发系统软件清单: 1. 手机程序源代码 2.烧写程序下载工具 flashtool 3.ads1.2 ,ads1.2update,activeperl:编译工具和辅助工具 4. Trace 工具:catcher 5.手机工程测试工具: META (Mobile Engineering Testing Architecture) is designed to provide the functionality of RF testing, NVRAM access testing, speech related testing of advanced feature – melody and voice memo. 6.UI制作工具: MCT 开发系统硬件清单: 1.开发用手机板 2.烧拷线一条 3.USB线一条 4.旅行充电器一个 5.锂电池两个 6.硬件原理图 开发系统文档清单: 1mtk 软件培训(MTK_Training) 2 mtk 软件系统和调试 ( SW System and Debug ) 3.mtk 软件MMI设计(MMI Design Doc0 4.mtk 软件设备驱动(Device Driver) 5.Mtk手机校准(Factory) 6.Mtk手机工具使用说明(Tool Document)
)

2008年7月17日星期四

Android,Google的移动平台

Android,Google的移动平台
(http://blog.csdn.net/mac_cm)

Google的Android移动平台计划显然野心不小,为移动电话创建一个开源平台的说法似乎对开发者也颇具吸引力,然而在Android平台问世以前,开发者已经在使用诸多现在的主流移动软件开发平台,Google这个新移动开发平台能否让这些开发者抛弃一切从头再来吗?
在过去的一年中,整个IT业界都在急切的等待这个在山景城的互联网巨人宣布它的移动电话计划,期间一度有谣言称这个互联网公司即将推出它的Gphone手机,一个据传可以挑战苹果的iPhone的东东。现在Google公布了它的答案,其目标绝不是一个简单的硬件产品,而是为众多移动手机提供一个软件开发平台。
图1、谣言中的Gphone手机
在近日的一次电话会议上,Google公司官员揭开了它的移动平台战略。这是一个叫做“Android”的移动软件开发平台,一个自由、开源的移动操作系统。这个平台将可以让开发者更轻松的创建新移动应用软件,推出这个平台的原因是Google认为在今天的移动操作系统上开发应用还过于困难。
Google的美好愿望与开发者的冷静反应
Google希望借助于Android平台可以带来更便宜、更高级的智能手机,尽管基于这个平台的首款移动手机在明年年底之前还不会推出,Android的技术规范却早在本月初就已经早早发布。
虽然Google对这个新的平台给予了很大的希望,一个比较现实的问题是,开发者们会围绕它编程吗?开发者们会立即(或者不远的将来)在Android上开发足够的应用吗?这个平台让我们感到兴奋之余,能否真正带来实际的好处或者仅仅是失望?
图2、Google新平台能否成功?
要想找到这些问题的真正答案,或许西雅图的人们更有资格比其他地方的人们来回答这些问题,因为众所周知这里聚集着众多移动软件开发者。来自十二个左右的西雅图新兴公司、老牌公司和个人开发者的一个比较一致的意见是,尽管它们多数已经知道最近Google发布的这个平台,但是并没有立即在Android平台上进行开发的计划。
据这些公司表示,这个刚刚推出的移动软件开发平台还有很多问题,而且如果为了转向这个平台而停止已经正在进行且有望赚钱的项目,这是一种非常不成熟的做法。
Google为了推广这个平台,开出了100万美元的悬赏来吸引人们开发Android平台上最佳应用,尽管如此它们还是表示,不会立即拥抱这个新的移动开发平台。
Ontela公司正在开发一个移动图片共享应用,其首席执行官Dan Shapiro表示,“或许一些新兴公司现在更愿意使用它(Android平台),我可以想象到那些正在创业的家伙可能会认为这是一个巨大的奖励,但是对我们来说,我们要对现有客户负责,这是我们更加关注的事情。”
来自Action Engine公司的高级创新技术架构师Chris Lihosit表示,上周一他听到这个消息后首先做的几件事情之一是把这个开发者工具下载下来,先了解一下。经过试用后他表示,尽管某些功能看上去非常不错,但是Action Engine对它并不感兴趣。
“明确的来说,如果是周末需要消遣的时候,我很乐意去使用它,感受它的新功能给我带来的震撼,”Lihosit表示,“但是,我不知道它是否能成为我的工作中的一部分。”
结盟知名厂商 能否挑战市场现有主流系统?
Google自己也意识到凭借一己之力很难让这个移动开发平台发扬广大,它需要更多的帮手,因此这个搜索巨人正在与其他33家公司联手组建一个名叫“开放手机联盟(Open Handset Alliance)”的组织,联合开发Android移动平台系统。这33家公司名单中不乏名气不小的公司,诸如T-Mobile、Sprint Nextel、英特尔、Qualcomm、摩托罗拉、HTC和eBay。另外还包括一些规模小但专业性比较强的公司。
图3、开放手机联盟能否让Android启航?
移动软件开发者是比较分散的群体。他们可能在新兴公司工作,也可能在大型股份化公司,或者作为咨询者之类的自由职业者,甚至他们中有的人是在业余时间来开发移动手机应用软件。
开发者的支持与使用这个平台的手机的数量是互相支持的关系。没有开发者的支持,Google将难以得到足够多的应用——诸如音乐服务、移动游戏、社交网站和类似的服务——来推动运营商销售基于Android平台的手机,以及让消费者有兴趣来购买它们。要想引起引起开发者注意,没有什么比市场上存在被数百万消费者使用的数百万个基于Andrioid平台手机更重要。
今天的高端智能手机操作系统中,Symbian、微软和黑莓(Black Berry)三家移动操作系统是最为流行的主流系统。开发者使用不同的语言来在现有的手机上开发应用,诸如Sun公司的Java、C++(被微软使用)和Qualcomm的Brew等。
Android平台是基于开源软件Linux的。而且麻烦的是,Android在上面创建了它自己的软件层,尽管开发者也可以使Java来进行开发,但Android平台版的Java和今天在移动开发领域被广泛使用的Java版本并不一致。因此,现有的使用移动Java创建的应用程序不一定就能在更丰富、更强大的Android平台上使用。
由于这个原因,某些开发者表示,Android可能给移动应用带来了更多令人头疼的问题。
Google新平台让给开发者带来的新问题
Pelago公司的创始人兼首席执行官Jeff Holden表示,要想让移动应用软件支持所有现有平台几乎是一件不可能的事情。
位于西雅图的Pelago现正在一个移动Java版本上开发它的Whrrl服务,Whrrl服务可以根据用户手机的位置和用户的社交网站来推荐饭店和服务。
“我们认为Android是另一个不同的平台,因此它增加了移动手机应用更加具有分裂性的局面,”Holden表示。“我认为它是一个有趣而且有价值的平台,它是只有像Google这样的公司才能做得到的一件事情,尽管它不是一个草率的产品,但是仓促移植应用到它上面却不值得推荐。”
上面说的“移植”,是开发者必须对那些已经基于某个语言创建好应用程序进行重新加工修改,以让它们可以运行在更多的手机上。此外,一个程序还必须针对不同的手机进行调整,举个例子来说,每个型号手机的屏幕大小和按键都是不一样的。对于一个支持数百种手机的移动手机软件,开发商可能要对其进行多次修改。
位于美国贝佛的Action Engine公司主要是从事 Mobile 应用开发,比如提供媒体发布商和移动网络运营商面向手机用户端的发布平台。它表示,它花费了大约三年的时间来让它的应用软件支持所有平台,而且现在它依然在修改一个不久可以支持黑莓手机的版本。
“要让你的应用支持Android平台,可能要花费你9到12个月的时间,”Action Engine的开发者Lihosit表示。
另一个挑战是为不同平台进行开发给企业带来的成本问题。
IceBreaker是一家位于美国贝佛城的公司,其主打产品是一个移动交友平台,其销售副总裁表示,公司一直在尽力避开开发基于手机的应用程序,而是通过一个移动Web上提供它的服务,即用户可以通过手机连接互联网来使用这个服务。现在它正在考虑是否创建基于手机的应用程序,因为这样可以提供给用户更酷的功能。
开发这种应用大约需要205000美元的成本,其中包含三个开发者三个月、一个设计者两个月和一个产品经理的工作量的工资和福利,Levine表示。与之对比的是Google要在创新大赛中对10个公司派发的275000美元的奖金。
“没有人在讨论的一个难于回答的问题是,一个应用程序如何能够很好的工作在所有手机和跨越所有运营商,”Levin表示。“传说中的最高境界是一次编写处处运行,但是至今没有人能够解决这个问题。”
Dashwire的创始人兼首席执行官Ford Davidson表示,公司的开发团队对于Google的新平台感到激动,而且Google所主办的大赛的奖金也是公司资金的一个好来源。但是他还是打消了立即拥抱这个平台的念头。
“是的,它的新功能非常酷,但是我们不得不保持专注,”Davidson表示,他的服务是帮助人们通过互联网管理他们的电话。“我们还有很多手机在那儿等待我们服务的推陈出新。”
Android能否成功还需时间验证
如果Google想取得成功,它将必须具有某些其他平台所不具备的东西,开发者们表示。至今为止,Google所能说出的Android的最大不同之处就是这个平台是开放性的。
从实践的层面上来说,这意味着手机用户界面的每一方面都可以被定制化。开发者甚至可以修改非常细小的事情,诸如拨号面板的外观等。
Android还将允许应用程序之间的交互。在某些情况下,一个开发者从一个用户日历或联系人中获取信息来创建一个一个定位应用程序,可以交流在一个预定时间用户和他(她)的朋友在什么地方。
但是Pelago的首席技术官兼共同创始人之一Darren Erik Vengroff表示,即使Android具有诸如此类的内置功能,运营商是否允许开发者访问这种用户信息还是一个未知的事情。
Sprint Nextel的发言人Scott Sloat表示,Google公司这个平台的基本指导思想肯定将是开放式的,允许开发者更多的参与到其中。但是现在预言其究竟能取得什么样的成功还为时过早。

2008年6月18日星期三

华硕员工长篇记实:天堂向左,华硕往右

华硕员工长篇记实:天堂向左,华硕往右

要离开ASUS的同仁依照惯例都会留下些支言片语,这也是华硕独特的企业文化. 我也在想是否依照惯例留下点什么,让后人能够探索前辈们的历史,又怕影响还在ASUS工作的同仁们的心情,但毕竟在这里工作了17个月之久,不留下点什么,总觉得有些遗憾。下面的文章送给我在ASUS认识的朋友们,并纪念我在华硕的第一份工作。
第一章 实习报到
2003年华硕从武汉又招募的一群大学实习生到其苏州的生产基地报到了,在招聘会上被华硕招募的美女所吸引,梦想着华硕苏州工厂里面应该遍地都是美女,然后又联想到西施也是苏州的,于是推理出苏州起码也是个美女遍地的园林城市了,于是毫不犹豫的就签了卖身契,可惜当时不知道历史是不会重演的,不然打死我也不会推出如此荒谬的结论。
坐了20多个小时的火车,出了苏州站后才明白历史是不会重演的,西施是没有了,但东施还是满街跑的,心里面也只有安慰自己华硕工厂的美女应该会多一些,到了工厂后才知道原来那些美女大多都是人事的,也有其它厂的助理,华硕贫瘠的土壤是生长不出美女的,但恶劣的环境却很适合一些长得很有创意的恐龙生存。
明白被华硕的“虚假广告”给骗了,虽然很失望,但想到来华硕是工作第一,大丈夫应以事业为重,也只有接受来到侏罗纪公园这个KB的现实了,也入乡随俗的降低了心中苏州美女的标准,心里面更是不断的安慰自己,丑女和美女是没有区别的,前者是恐龙,后者是进化后的恐龙。
在刚出火车站时大家还是很小心的,小心到连两个健壮的大男生都不由自主的手牵手荡来荡去的怕走丢了,可惜没有数码相机,不然拍下来传到mop上怎么也可以被顶成一篇经典贴了。
报到后就开始分寝室,感觉又像回到大学刚报到的时候了,辛辛苦苦把房间打扫干净了,床铺也铺好了,却发现自己进错了寝室,怎一个郁闷了得。三天的新人训让我们开始接触华硕的企业文化和各项规章制度了, 不知道底细的我们对教育班长充满着敬畏,以为他们都是职务很高的人,分到部门后才知道原来很多教育班长不过是从生产线上抽出来无关紧要的人而已,当时心里面就一个字"KAO"。
第二章 实习时光
新人训终于结束了,我也被助理领到我该去的部门,见到了当初面试我的主管蔡经理。本以为新人到部门后会下基层到车间去实习,结果我们却被经理单独留下来培训,每天给我们讲课。4月后的天气是炎热的,但坐在办公室里面吹空调却很惬意,每天听课,没课就看部门文件,对于这种坐着都有工资拿的实习让我不由得发出还是资本主义好的感慨!
当然不是所有的人都是这么幸运的,分到生技部的本科生们每天都被驱使做些拿螺丝,取扳手之类打杂的工作,终于让一个实习生发出悲哀的怒吼:"难道老子大学毕业是来给你们拿螺丝,扳手的?"。对于这种说完后就跑路的大学实习生,我们应该予以最强烈的谴责,因为他那句不负责任的话造成余下的大学实习生们被生技部副理发配到冲制自动化线苦干了1个多月。当然DT的大学实习生们也好不到哪里去,每天都上流水线当作业员,当时大家都以为是在锻炼自己,可惜到最后才知道当时由于SARS泛滥,实在招不到OP,只有拿大学实习生充数了。
对中午那顿工作餐,大家的怨言还是颇多的,很难吃,而且即使你不吃,也不会把那顿饭折现打到你工资卡里面的。当厂长知道我们对中午伙食很不满意后,给我们一个"泪流满面"的故事,说他问一个OP中午的饭好不好吃,那个OP竟然泪流满面说他从来没有吃过这么好吃的午饭!!!(KAO! 这故事TMD可能吗? 难道华硕还有去非洲招过OP?)。当时这个故事让在场的大学实习生们惭愧不已,鼻子酸酸的,就差泪流满面了,可后来才知道每个厂的厂长都对刚来的大学实习生说过同样的故事!
第三章 返校答辩
实习的日子是短暂而幸福的,终于要回学校参加论文答辩了。虽然SARS流行,但是还是阻挡不住我回去的步伐,当然我也打着SARS流行回去要被隔离15天的幌子,多请了15天的假。收拾好东西,揣着一个月的实习工资,坐上回武汉的火车,心里怎一个爽字了得。
SARS流行,学校都被封锁了不让出去,呆在学校的日子过得极为糜烂,考上研究生和找到工作的同学无忧无虑,过着猪一样的生活; 没有找到工作的同学每天都要躲开巡逻队翻墙出去,顶着炎炎烈日满街乞求工作,过着狗一样的生活,而那些没考上研究生又找不到工作的同学,则是过着猪狗不如的生活。
恢复到"九三学社"的作息时间让我凌晨三点睡觉,早上九点起床。早上九点起来后就联网几局SC活动活动手脚,然后就开始径行CS对决了,玩到中午去食堂打饭,回寝室一边吃一边看碟。下午看完碟就继续修练CS和SC。晚饭是来不及吃的,一般都是CS对决到九点后躲过巡视的人翻墙出去吃夜宵,顺便租碟回来,吃饱喝足后已近11点了,然后再躲过巡夜的人翻墙进来。进来后又开始看碟,到凌晨1点后,再对决几局CS和SC,熬到3点了,大家也筋疲力尽了,终于可以睡觉了!
学校的日子是快乐的,一个多月就看坏了4个DVD光驱,好在当时各IT公司都在做活动,光驱1个月内包换,不然就我们那样折腾,是光驱都会受不了的。但隔壁寝室的BenQ DVD看烂碟频率远高过我们寝室的ASUS DVD,但他们只换过1次,而我们换过4次,害得我每次看DVD时,就被寝室那个买ASUS光驱的老兄唠叨,说我心太黑,刚到华硕实习竟然就开始昧着良心给ASUS做虚假广告了,让他吃了大亏,而我也只有缩着脑袋小心翼翼的说我TMD也不知道华硕的质量是吹出来的,我也是受害者呀!
第四章 正式上班
早上被喧闹声吵醒了, 到寝室外看到系里面的领导亲自过来赶我们搬出学校,才知道已经到了离校的最后一天了,收拾好计算机,网线,找到扔在角落里的学位证书和毕业证书,拍掉上面的灰尘,扛着行李离开了生活了四年的大学。回到家正准备继续睡觉时才想起离到公司报导的时间只有2天了,慌忙之下立刻打电话订火车票,然后又打点行李,告别刚见过面的父母直奔火车站。
来到公司门口,看到一大群华硕员工拿着苍蝇拍子在拍苍蝇,让我大吃一惊,到部门后才知道谢伟琦副总要求所有的BU都要上缴苍蝇, 而且列入主管的考核中,逼得各BU主管停线抽人出去打苍蝇,然后还要安排人去数打到的苍蝇。一时间苍蝇飞到华硕门口都要绕道走,不少苍蝇都在华硕员工的追杀下,疲于奔命,活活累死。更为夸张的是,此事竟然促使附近村民在华硕门口销售苍蝇,最贵时可以卖到1毛钱一只,比开三轮车赚钱多了! 此类事情我真是前所未闻,看来只有在谢伟琦领导下的华硕才会发生。
第五章 接手装配
本以为来到部门后会继续上课,但实习的幸福时光已经一去不复返了,实习时候给你讲课,是为了正式报到时更好的用你。就在自己还不知道自己今后的何去何从时,突然得知楼上装配的组长,分组长,线长纷纷跑路。一时间,课长Alex忙得焦头烂眉,万般无奈下,他起用了刚来上班的我做装配的组长,而我也成为自2002年以来,短短一年半内走马上任的凯硕装配课第7任大组长了。相比其它回公司后还在DT生产线继续当作业员的本科生们,我算得上是一个奇迹了,为此周龙还专门为我取了个日本名字------"牛X轰轰"来纪念我的升迁。
组长听起来是挺响亮的,可惜没有给我加工资,而具体的工作让我逐步认识到组长其本质上也就是个高级OP而已,完全没有必要浪费个本科生扔在那里。当组长的第一天就因为入库的人手不够,结果还要我亲自拉油压车入库,后来生产线上的人手不够了,结果我又被线长借去帮忙锁螺丝,一天下来,我终于明白了组长的工作内涵,就TMD是一救火队员,到处救急。就在开始当组长的那一个星期里,我终于明白了华硕经营理念中第一句话"培育,珍惜,关怀员工,让华硕人尽情地发挥最高潜力。"的真实涵义,那就是"把女的当男的使,把男的当畜生使"。
组长的工作是痛苦的,我坚持了2个月后终于坚持不住了,重压之下,我把这个看似风光的职务交给了由资深分组长升为组长的凤娟同志,并语重心长的告诉她"party就把这个光荣而又艰巨的任务交给你了,你一定不要辜负party和人民的希望,把装配搞好"。本以为在我深情的劝导下,凤娟同志会感动得热泪盈眶,然后毫不犹豫接替我做下去,结果不到一个月,她竟然一声不吭地就跑路了! 我还没有体验够在野party的幸福生活,又在Alex的利诱下,含泪重新上台执政了,成为自2002年以来上任的装配第9任大组长了。
可怜的凤娟同志在华硕干了4年了,好不容易升到组长了,工资却只加了10块大洋,发工资前,凤娟还兴奋的说升职了要请大家吃顿饭,我还激动得考虑是去新城花园,还是去吴宫喜来登,可惜工资单拿到手后,只有请喝可乐了,更郁闷的是加的工资还无法满足给6个干部买瓶饮料喝。饱受耻辱的凤娟选择了离职,后来厂长想体现一下他很关怀老员工,在凤娟离职的一个月后还专门打电话到装配问凤娟为什么要离职,我也只有含糊其词的说凤娟大概是年级大了,只有回家结婚去了。
第六章 生管好友
虽然当时我做组长没有多少经验,而读IE出身却在做生管的小马哥更是没有任何生管经验. 两个没有工作经验的大本生碰到一起,自然惺惺相惜,不久就成为好友,但好友归好友,乱安排排程,我也会发飙的。他发出来的生产排程里面竟会同时出现装配调休无生产和装配有生产两种排程,让人不知道是该安排调休还是安排生产,看到这份排程后,让Alex和我都同时抓狂。
当然小马哥在出货的重压下还有过让人更抓狂的安排,人力安排不过来,小马哥就到DT借用DELL的一条生产线人力过来帮忙生产,但是DT的作业员就没有受过相关的正规训练,IE彭为民教育训练时又教错了一个安装动作,而OQC的新人做首件检验时又没有查出来,等我发现这个问题时,已经做出来30台MA3要全部重工,彭为民也只有很郁闷的把那30台MA3拖到角落里自己一个人重工掉了。
更KB的还在后面,EPSON的产品要求很严格,而小马哥竟然敢安排没有任何生产经验的DT OP做EPSON的机种,吓得负责这个机种的OEM工程师Ricky守在装配生产线不敢离开半步,但当Ricky发现锁螺丝站的作业员竟然没有见过电动起子,不知道该如何使用时,立刻吐血倒地,成为自EPSON机种正式生产以来挂掉的又一个4职等的工程师。DT的OP们一天生产了5个栈板,却漏贴了一张Label,结果我还要安排夜班抽出人力全部Sorting重工,让吐血不止的Ricky又继续狂喷血.
虽然小马哥刚开始生管做得不好,但我还是予以理解和支持的,起码他会听从我的安排,让我没有钱用的时候安排周末加班。等到小马哥熟悉作业,做得游刃有余时,他却被调到安排冲制生产了,而他的继任者虽有工作经验,却只会开工单,连库存有无料件都不管,还要制造单位去催物控备料,甚至逊到要我们去问系统组装部明天生产什么机种,然后告诉她,她再来安排装配生产对应的机箱。遇到这种生管我每天也只有吐血了,可惜吐出来的血不能做为无偿献血使用,不然我吐出来的血足够可以让我一辈子都可以无偿用血了.
第七章 Moses风云
在凯硕机壳生产史上不得不提到的机种------Moses开始生产了,这个机种给凯硕带来了难以想象的波折和动荡,并直接导致凯硕走了一个副总,二个经理,并有大批高级工程师离职。
Moses的历程极为不顺利,一直delay,等到工程部的经理Bob要开始进行T0试模时,离出货已经没有几天了,于是工程的阿虎领着一帮工程的兄弟开始做T0的东西了。可惜T0的产品竟然会出货! 尺寸跑掉得严重,楼上装配时极为困难,拉钉孔位不准,组装后断差太大,所有的问题都没有办法解决,但是T阶段的量却越来越大,从最初T0的200台到移模厂外生产的最后一次T11的1820台,这些问题都没有解决过。
而QA的课长Miles卡着标准不放,断差在0.3mm以内的就pass,0.31mm的就NG,每次看着QC拿厚薄规量断差,发现超过标准1条就判退,让工程经理Bob,阿虎和我都抓狂不已, 其实这也不能怪QA工程师, 毕竟大学刚毕业, 前任Moses QA胡永泉没有管控好又没有带好她, 使得新来的QA工程师只能服从Miles. 其实在胡永泉就曾经私底下把断差放宽到0.5mm, 甚至0.6mm出货, 也没有客诉回来过. 相反客诉的问题都是USB接口失效, 电源不工作这类功能性Bug, 外观性的断差客户就根本没有在意过.
机壳与面板的断差太大, 只有用锤子将断差敲小. 那时装配的IE彭为民测量的产量是每天800台, 但是由于断差太大, 拉钉孔位不准, 每天加班到晚班来也就只能敲出来200来台. 我要求IE改工时, 彭为民也十分委屈的说异常不能考虑在工时里面, 而刚出道的小马哥硬是严格按照IE的产能做排程, 而且时间卡得很好, 通常是今天做第二天就要出货的东西, 让我有种要跳楼的冲动, 也让Bob每次看到生产排程就抓狂.
实在生产不出来就只有加班, 于是我也在这个时候创造了自己月加班和连续加班的最高纪录, 一个月累计加班200多个小时, 还有连续加班56个小时. 当时在重机场上夜班的李锋伟经常看到我吃半夜餐,总会装作非常惊讶的问我是不是也在上夜班,得到我回答是上白中夜连班时, 他立刻劝我千万不能要钱不要命了.
凌晨2,3点才能下班回寝室,而且人也是日见消瘦,让寝室的人都以为我在华硕有了一份兼职--------午夜牛郎,纷纷向我请教这份兼职的薪水如何? 服务对象的身材相貌如何? 还招不招人? 如何报名? 还嚷着要我发工资的时候请客。让我痛骂他们有异性没人性,要他们好好反省,兄弟们的反省果然够深刻,第二天晚上我下班回来后,就给了我一个药房的地址,说凭华硕的识别证去买伟哥可以打九折,没等我说话,兄弟们又嚷看你这么拼命,反正也是命不久矣,不如趁现在还活着,干脆立个遗嘱好让他们瓜分我留在寝室的东西!
第八章 工程阿虎
阿虎是工程部的牛人,作为凯硕工程部的高级工程师,机械出身的阿虎不光机械强,连编写程序都很强,他用VB编写的全尺寸量测系统至今还在凯硕量测中心使用,放眼整个凯硕工程部,就再也没有比他更牛的人物了。
可惜他命不好,大学毕业了好多年,工作经验丰富,但从永业跳槽到华硕的工资却没有一个应届本科生高,遇到负责Moses这个机种。Moses设计本身的尺寸有问题,而RD却不肯承认,加上永业的面板又缩水,结果装配组装就很困难,可怜的阿虎在内外压迫下,只有抓一批刚到工程报导的毕业生去我装配生产线去打铁。但原始的手工打造势必不符合生产力的发展方向,所以Moses在经历十余次生产后终于移模到永业生产了,得到移模的消息后,生管,QA,装配一片欢呼,而工程部的经理Bob却随着Moses的移模,跑路了。
Bob跑路后,虎哥在凯硕工程的命运发生了翻天覆地的变化,被打入冷宫直到合同期满离开华硕,都没有再被重用过,而将虎哥打入冷宫的就是凯硕一个彪乎乎的人物--------Howard。
Howard是凯硕Staff们公认的最阴霾的台湾人,他以前是在DT当经理,当时在DT实习的本科生们就见识过他的厉害,在本科生们刚到DT实习时,他问那些本科生,有谁是为了钱来华硕工作的,凡是举手的本科生们后来都被他用各种手段逼走了。和我一起来华硕的周龙则是被他用更残酷的手段逼走的,周龙从实习到正式报到就一直被发配在生产线做作业员,每天饱受那些OP出身的带线干部们的驱使,看着他们的脸色小心翼翼的过着猪狗不如的生活。随着时间的流逝,比他后来的本科生们都分到DT各部门了,而他还在生产线上当OP,终于,周龙忍不住问Howard有没有他的职务安排,苏声和冷冷的对他说:"小伙子,你很年轻,但我们合不来,这里没你的位置,不愿意做OP,可以走人"。饱受羞辱的周龙只有交离职报告,南下投奔FOXCONN去了,半年时间里就做到了组长,工资也涨到华硕的两倍了。至那时起认识他的大本生就私底下称他为飙驴了.
飙驴要调到凯硕工程部当经理的消息传出来后,7号楼DT的本科生们一片欢呼,甚至还开了2箱啤酒庆祝。而凯硕工程的本科生们则是神情黯然. 飙驴到凯硕工程后果然掀起一阵阵血雨腥风, 他积极响应并残酷的执行施主的金企鹅计划, 收外线密码, 并计算机使用, 一时间工程陷入白色KB中. 眼看情况不妙的工程老竿子吴启干, 魏学良立刻选择跑路. 而林岚跑路时, 飙驴则毫不客气地告诉她:"你走得快, 我找替代你的人更快". 而负责EPSON机种的杨云芳则是收到飙驴的死命令:"给你三个月的时间找工作, 无伦找不找得到工作, 都不要来见我了".
不讨飙驴欢心的虎哥, 在工程当然没有什么好下场, 飙驴三句话决定了虎哥在工程的命运------"你不适合做工程", "以后不要发邮件了", "把你的个人信箱取消掉". 被打入冷宫的虎哥, 每天度日如年, 飙驴更是变本加利到连办公室都不让虎哥坐了, 可怜的虎哥每天只有在冲制现场看生产, 累了就到我装配办公区坐着休息, 和我探讨一下软件开发的心得. 那时候虎哥真是虎落平阳被驴欺. 连他的课长都看不过去了, 劝他调到DT做机构工程, 但虎哥想到合同马上就要到期, 没有答应.
终于, 虎哥熬到了合同期满的那一天, 扬眉吐气的发出了离别邮件, 离开了给他太多痛苦回忆的凯硕工程部, 到另外一家公司做工程课长去了!
第九章 罢工风云
谢老大一直很有雄心壮志, 力图将华硕的管理转变为FOXCONN似的军事化管理. 只是他忽略了一个非常现实的状况, 那就是FOXCONN的管理虽然很严格, 严格到就如同百战不败的军队一样有纪律性, 可那是靠高工资支撑起来的纪律. 在FOXCONN, 对一个STAFF而言, 每年二次的调薪机会对大家而言是透明公正的. 一年18个月的工资对每个STAFF都有致命的吸引力. 相比ASUS这边, 大本生的起步价就不到人家的8折, 而且年终奖最高也不过是一个月工资, 华硕起步就输给人家了, 却还大言不惭的说要跟竞争, 不知道华硕的高层有没有想到过, 从华硕离职出去的精英大都去了FOXCONN, 调转枪头开始不遗余力的对付华硕了。
ASUS给员工如此低的工资, 却要求员工给予很大的付出, 又要马儿跑, 又不让马儿吃草, 谁愿意如此呢? 更何况苏州这里已经不再是万恶的旧社会了, 谢伟琦却以为高压可以解决一切问题. 而防盗计划以及施主要求施行的金企鹅计划又让ASUS同仁头上的紧箍咒紧了又紧. 恶劣的工资待遇, 冷酷无人性的管理, 三座大山的压迫让表面平静的ASUS激流暗涌, 罢工的环境已经酝酿成了, 然而没有人性的华硕高层在实施金企鹅计划时竟然想到将午饭的档次下降, 降低夜班津贴, 取消三班制的休息时间, 终于导致了员工的极力反弹!
主管会议的邮件泄漏出来后, 让员工有种被愚弄的感觉, 长久以来压抑在心理面的愤怒终于爆发了, 于是公用邮箱里面拉援罢工的邮件飞来飞去, 虽然各部门的经理纷纷出来安慰人心, 但伙食变差却是不争的事实. 待到一位STAFF的离职邮件----<<再见, 我亲爱的朋友们......>>发出来后, 这种在私底下的动作终于浮上水面了. 而大家也终于开始预备在周六罢工, 还邀请南京零距离的记者来采访, 以抗议ASUS非人的环境.
老实说, 我历来都是唯恐天下不乱之人, 一旦得知有罢工行动, 这种看热闹的事情我当然不会错过, 于是那个周六我一改往常周末加班中午才去刷卡上班吃饭的习惯, 很早就起床刷卡来到公司, 就等待一旦罢工开始, 我离开趁乱下班去石路逛街, 然后再回来刷下班卡. 可惜, 那些第一批提为副课的走狗都在各自岗位上坚守, 控制着情况, 让我没有得到一点有关罢工的讯息, 没有办法去支持, 连声援都做不到, 只好非常郁闷地呆到刷下班卡.不过, 罢工风云的作用是明显的, 那就是谢伟琦被施主调回台湾了, 大家头上的一座压迫大山终于消失了, 于是那些跩得像二五八万的第一批干训的副课也知道要收敛一些了, 也没有以前那么狂妄了, 脱掉了让人看得很反感的干训服, 而谢伟琦一手组建的纠察队也解散了. 疯狗终于不乱咬人了. 走在培训中心的感觉怎一个爽字了得.
第十章 首批副课
谢伟琦在大陆时模仿FOXCONN搞了一期干训班,也就是培养一些很听话,而且执行力强到变态的人成为了副课. 可惜第一批刚训练完后, 他就因为罢工事件而被迫调回台湾了,谢伟琦式的干训也被取消掉了。后来挑选干训的干部时,就再没有选那些只有BT的执行力而没有人性的人了。不过那是后话,不提了。
凯硕清洗涂装课与装配课合并成为涂装组立课后, 一位从DT调过来的副课----Judy大人开始正式统治凯硕的涂装组立课了. 对于这位女强人, 凯硕的干部刚开始都还是比较敬佩的, 毕竟能够在这里熬了四,五年还没有自杀, 也没有精神崩溃, 而且竟然还从一个OP熬成了副课确实有过人之处. 当然也有人私下告诉我这种没有受过高等教育的人离开华硕是找不到高工资的工作, 也就只能在华硕工厂这种没有技术含量的地方混. 当然她心情不好时还可以训训手下的大本生,耍耍威风,又何必要离开呢.
Judy大人的到来,却成为凯硕干部的恶梦,也正所谓一朝天子一朝臣,连制造的经理都被Moses搞得黯然跑路,Judy大人也当然要开始逐步排挤凯硕的干部,安插系统的干部了。只是她的手脚太明显了,一碗水端不平,下面做事情的凯硕干部难免会有怨恨。
一开始就是涂装的二当家郭志辉和Judy大人发生冲突, 起因很简单: 涂装的一个OP休息时间在车间吃东西被Judy大人抓住, 结果要被记过, 而从系统调过来的干部在办公室里面吃东西却没有任何处罚! 郭志辉据理抗争也没有任何结果. 如果仅仅这件事情也就算了, 二当家郭志辉去助理那里领东西,被告之没有,碰了一鼻子灰,但是系统的干部去却马上领到。唉,环境恶劣到连助理都开始见风使舵了.
不久,老板在早会上说过厕所太脏,结果命令到达涂装组立后,Judy大人变成说厕所之所以太脏,是因为干部没有做到督导责任,要求所有的组长管理一个厕所,每天带人打扫,她负责监督。可是厕所分配上,凯硕干部却要看管使用最频繁的厕所,更为悲惨的是我一个大男生竟然分配管女厕所。唉,人在屋檐下不得不低头,咱忍吧! 可是Judy大人似乎好象很喜欢上厕所,经常叫嚣着凯硕干部看管的厕所太脏。万般无奈下,我和胡卫兵只有每天停线带人去扫厕所,停线造成的产量损失只有加班来赶,但是这种加班却没有加班费。一时间,下面的人怨声载道,眼看就要压不住了,我和胡卫兵只有绞尽脑汁想各种方法,如上厕所的人要交识别证,完事后有专人检查,如果没有弄脏厕所, 就还回识别证,不然就扣下来打扫。
可惜, 太浪费人力了, 本来在白色KB统治之下的涂装组立离职人员就如潮水般汹涌, 仅有的人力连开线都保证不了, 哪有办法抽出人看厕所. 当然重压之下必有变通之方法, 我和胡卫兵每到休息时间就站在厕所门口不让人用厕所, 于是OP们只有非常郁闷的从2楼冲到1楼上厕所, 然后再冲回来上线. 仅有的10分钟休息时间都用来跑步上厕所了, 哪有休息时间呀, 不过唯一的好处就是让OP锻炼了身体. 那段时间我和胡卫兵下班时心惊胆寒, 反复易容确保没有人能认出我们后才敢下班, 就怕出了2号门后被一群憋得得尿道炎的蒙面人砍!根据Judy大人极其BT的执行力, 我猜想到我离职那天, 看厕所这个任务都不会取消, 但是二当家郭志辉认为最多1个月, 唯有胡卫兵认为不超过2周. 为此大家还赌了5瓶可乐. 当然姜还是老的辣, 果然不到2周这个BT的命令在楼下冲制干部的一片反对声中取消了, 因为他们每天排队上厕所都快憋到得尿道炎了. 虽然姜还是老的辣, 但脸皮毕竟还是我年轻人的厚. 我不光赖掉了打赌输的可乐, 而且每到周二,周四趁胡卫兵午睡的时候就偷喝他的饮料. 结果胡卫兵午睡起来后想喝饮料却总发现饮料总是不翼而飞, 满办公室都找不到, 却只能发现喝完后剩下的饮料盒, 而这时我已经睡得口水流一地了.
第十一章 赶尽杀绝
鲁迅告诉我们"不在沉默中爆发就在沉默中灭亡"。面对Judy大人咄咄逼人的气势,让涂装组立课仅存的凯硕干部们不寒而颤. 与其在沉默中被人干掉,不如爆发,更何况"死国可乎"! 只可惜,我醒悟得太晚了,手下凯硕出身的带线干部被Judy大人更换得一乾二净, 接下来她更为残酷的手段就是把那些干部换下来踢到其它制程作OP,逼得别人只有离职走人。我突然发现在不知不觉中我已经成为装配名义上的组长了,每天除了签报废单,回8D,挨训时还想得到用我垫背外,其余就再也没有什么用处了。
那段时间,李锋伟就一见到我就拍拍我的肩膀提醒我要小心,弄得我莫名其妙,还以为这位老大突然对男人也感兴趣了。伟哥看我似乎完全没有明白自己危险的处境,只有点破告诉我Judy大人在老板面前告了我的状,说我刚愎自用,不服从管教,不适合做组长............. 最后李锋伟提醒了一下还是早做打算吧!
"狡兔死, 走狗烹; 飞鸟尽, 弓箭藏"这句古语我不是不懂, 只是没有想到"刀枪入库, 马放南山"的命运会出现在我的身上。Judy大人刚调到凯硕时一切都不太懂,全部靠凯硕干部教,可惜没想到她刚站稳就开始大规模清洗凯硕干部了。回到办公室,发现二当家郭志辉正在酝酿写离职邮件,胡卫兵也在私下上网找工作,打简历,准备找工作了。IE的两个弟兄一个为调5#厂塑料部而到处奔走,另一个则准备找工作了。
从李锋伟那里得知我最有可能调到楼下做冲制的IE后,我也开始为我的后路做准备了。先去拜访和我同样从武汉来华硕报到,又住在我隔壁的关二哥,了解楼下冲制的情况如何,得知下调IE还是给我很大台阶让我下的,虽然IE的兄弟也是人满为患。
既然要调到IE,当然要学会测工时。当IE彭为民带我到我的装配生产线去测工时,发现我测量工时的时作业员的速度明显快过他测量工时的时候,他非常高兴的拍着我的肩膀说"恭喜你,你可以从我这里毕业了",然后又用非常郁闷的口气感叹到"想不到我大学读了四年的IE, 竟然还没有你强",我也只有安慰他说"那是因为这些作业员还不知道我就快要不是他们的组长了"。
该来的那天终究会来到,Judy大人开始找我谈话了,说楼下的IE很缺人,老板要我调到楼下去支持,然后还感慨说怎么我比她还先知道要调到IE,我心里暗骂,但却只有打着哈哈说听楼下助理传的一个周五的下午,找了楼下的IE帮忙,黯然的把计算机搬到了楼下,从此离开了工作了9个月之久的装配了。
到了楼下,刚打开邮件,就看到二当家郭志辉发出来的离职邮件。一个月后,胡卫兵打着婚假的幌子到新公司上班去了,黯然到连离职都没有告诉兄弟们一声! 不久,宋立兵也如愿以偿的调到5#厂塑料部作IE了,而最后一个兄弟彭为民也被踢到DT作IE去了。至此,凯硕的干部彻底退出了涂装组立的历史舞台!
第十二章 最后时光
来到冲制IE后. 和关二哥做做移线, 顺便听他介绍楼下冲制的情况, 然后帮他做做SOP, 测测工时. 不久我终于能单独负责TR2和MA3了, 可惜刚准备大干一场, TR2和MA3就不生产了, 最后一次生产的近万台产品就积压在清洗线旁等着生锈. 热情被浇灭的我每天都没有事情做了, 按时上下班, 晚上就去关二哥或彭为民寝室看DVD, 日子过得很悠闲, 体重也直线上升. 白天上班也就是对着计算机发呆. 不过在发呆的这段时光里, 我竟然把在大学里一直没有时间研究的东西看完了, 但我却悲哀的发现曾引以自豪的英语已退步了好多!
发呆的时间是美好而短暂的,可是没有加班,仅凭那一点点财政收入是无法在苏州生活的,一时间生活陷入困苦中,这个时候关二哥特照顾的拍着肩膀对我说"等我调到5#厂威硕后,我负责的EPSON机种全部交给你做,这样你就有理由混加班费了"。听到这句话,我脱口而"关二哥, 你怎么还不调走呀?", 结果就为这句话,关二哥拿着EPSON的LinkBar追杀我跑了两条街,要不是我急中生智狂喊"嫂子救命呀!"没准还真能被他砍死后扔运河里!
不知不觉中, 新来的大本生来报到上班了,作为老员工的我也开始带新人了。想想当年带过自己的大本生们都已经离开了华硕, 我想也到了该我离开的时候了. 17个月了, 唯一的改变就是自己的态度变得越来越强硬, 硬得让人以为我每天上班前都吃了半斤伟哥. 好心人都纷纷劝我有生理疾陷就要赶紧去看医生, 千万不要胡乱吃伟哥, 会伤身体的, 然后还压低声音告诉我有认识的医生, 建议我去看, 随手还给了我一张名片, 特地嘱咐我说只要你对医生说你是华硕的, 医药费可以打八折, 反正医生也知道华硕员工没多少油水可以刮.
每天坐厂车总是看到3号门前的空地上聚满了前来报到的新员工,一个个目光呆滞, 等着被挑选,让我联想到了农市场上挑选牲畜的场面,当然每个月的12号在华硕3号门排队办离职手续的人却能够一直排到林枫苑的601车站.
终于到了该我退出华硕历史舞台的时候了,拿着离职单找老板签字,老板和颜悦色的告诉我这次给我涨了工资,劝我不要离开,然后还诱惑我说以后的工资涨幅会很大。听到这句话,心里就一阵悲哀,TMD,华硕先前干什么去了? 为什么以前干得辛苦的时候华硕没有想到给我加工资,如今人要走了,才想起来用加工资来留人。可是华硕又知不知道我去FOXCONN面试时,对方毫不犹豫地开出了一年18个月的工资,每个月3500大洋, 而且还特别强调加班费另外算,可华硕却还是天真的以为加个四五百大洋就可以把人留住.
虽然老板万般不愿意,但离职单还是被签掉了,我也能够如愿以偿的从华硕毕业了。但这次毕业心里面却没有大学毕业时那么踏实了,把识别证,厂服交给助理,办理完移交手续后,就等着9月12日去3号门办离职了,心里轻松了很多,终于可以告别一段不堪回首的经历了!

2008年6月10日星期二

高并发高流量网站架构

高并发高流量网站架构
(http://blog.csdn.net/mac_cm)
Web2.0的兴起,掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念,细分了网站功能和用户群,不仅成功的造就了一大批新生的网站,也极大的方便了上网的人们。但Web2.0以用户为导向的理念,使得新生的网站有了新的特点——高并发,高流量,数据量大,逻辑复杂等,对网站建设也提出了新的要求。
本文围绕高并发高流量的网站架构设计问题,主要研究讨论了以下内容:
首先在整个网络的高度讨论了使用镜像网站,CDN内容分发网络等技术对负载均衡带来的便利及各自的优缺点比较。然后在局域网层次对第四层交换技术,包括硬件解决方案F5和软件解决方案LVS,进行了简单的讨论。接下来在单服务器层次,本文着重讨论了单台服务器的Socket优化,硬盘级缓存技术,内存级缓存技术,CPU与IO平衡技术(即以运算为主的程序与以数据读写为主的程序搭配部署),读写分离技术等。在应用层,本文介绍了一些大型网站常用的技术,以及选择使用该技术的理由。最后,在架构的高度讨论了网站扩容,容错等问题。
本文以理论与实践相结合的形式,结合作者实际工作中得到的经验,具有较广泛的适用性。1 引言1.1 互联网的发展最近十年间,互联网已经从一个单纯的用于科研的,用来传递静态文档的美国内部网络,发展成了一个应用于各行各业的,传送着海量多媒体及动态信息的全球网络。从规模上看,互联网在主机数、带宽、上网人数等方面几乎一直保持着指数增长的趋势,2006年7月,互联网上共有主机439,286,364台,WWW 站点数量达到 96,854,877个 [1]。全球上网人口在2004 年达到 7 亿 2900万 [2],中国的上网人数在 2006 年 12 月达到了约 1亿3700 万[3]。另一方面,互联网所传递的内容也发生了巨大的变化,早期互联网以静态、文本的公共信息为主要内容,而目前的互联网则传递着大量的动态、多媒体及人性化的信息,人们不仅可以通过 互联网阅读到动态生成的信息,而且可以通过它使用电子商务、即时通信、网上游戏等交互性很强的服务。因此,可以说互联网已经不再仅仅是一个信息共享网络,而已经成为了一个无所不在的交互式服务的平台。
1.2 互联网网站建设的新趋势互联网不断扩大的规模,日益增长的用户群,以及web2.0[4]的兴起,对互联网网站建设提出了新的要求:
高性能和高可扩展性。2000 年 5 月,访问量排名世界第一(统计数据来源[5])的Yahoo [6]声称其日页浏览数达到 6 亿 2500 万,即每秒约 30,000 次HTTP 请求(按每个页面浏览平均产生 4 次请求计算) 。这样大规模的访问量对服务的性能提出了非常高的要求。更为重要的是, 互联网受众的广泛性,使得成功的互联网服务的访问量增长潜力和速度非常大,因此服务系统必须具有非常好的可扩展性,以应付将来可能的服务增长。
支持高度并发的访问。高度并发的访问对服务的存储与并发能力提出了很高的要求,当前主流的超标量和超流水线处理器能处理的并发请求数是有限的,因为随着并发数的上升,进程调度的开销会很快上升。互联网广域网的本质决定了其访问的延迟时间较长,因此一个请求完成时间也较长,按从请求产生到页面下载完成 3 秒计算, Yahoo 在 2000 年 5 月时平均有 90,000 个并发请求。而且对于较复杂的服务,服务器往往要维护用户会话的信息,例如一个互联网网站如果每天有 100 万次用户会话,每次 20分钟的话,那平均同时就会有约 14000 个并发会话。
高可用性。互联网服务的全球性决定了其每天 24 小时都会有用户访问,因此任何服务的停止都会对用户造成影响。而对于电子商务等应用,暂时的服务中止则意味着客户的永久失去及大量的经济损失,例如ebay.com[7]1999 年 6 月的一次 22小时的网站不可访问,对此网站的 380万用户的忠诚度造成巨大影响,使得 Ebay 公司不得不支付了近500万美元用于补偿客户的损失,而该公司的市值同期下降了 40 亿美元[8]。因此,关键互联网应用的可用性要求非常高。
1.3 新浪播客的简介以YouTube[9]为代表的微视频分享网站近来方兴未艾,仅2006年一年,国内就出现近百家仿YouTube的微视频分享网站[10],试图复制YouTube的成功模式。此类网站可以说是Web2.0概念下的代表网站,具有Web2.0网站所有典型特征:高并发,高流量,数据量大,逻辑复杂,用户分散等等。新浪[11]作为国内最大的门户网站,在2005年成功运作新浪博客的基础上,于2006年底推出了新浪播客服务。新浪播客作为国内门户网站中第一个微视频分享服务的网站,依靠新浪网站及新浪博客的巨大人气资源,在推出后不到半年的时间内,取得了巨大的成功:同类网站中上传视频数量第一、流量增长最快、用户数最多[12],所有这些成绩的取得的背后,是巨大的硬件投入,良好的架构支撑和灵活的应用层软件设计。2.1 镜像网站技术镜像网站是指将一个完全相同的站点放到几个服务器上,分别有自己的URL,这些服务器上的网站互相称为镜像网站[13]。镜像网站和主站并没有太大差别,或者可以视为主站的拷贝。镜像网站的好处是:如果不能对主站作正常访问(如服务器故障,网络故障或者网速太慢等),仍能通过镜像服务器获得服务。不便之处是:更新网站内容的时候,需要同时更新多个服务器;需要用户记忆超过一个网址,或需要用户选择访问多个镜像网站中的一个,而用户选择的,不一定是最优的。在用户选择的过程中,缺乏必要的可控性。
在互联网发展的初期,互联网上的网站内容很少,而且大都是静态内容,更新频率底。但因为服务器运算能力低,带宽小,网速慢,热门网站的访问压力还是很大。镜像网站技术在这种情况下作为一种有效解决方案,被广泛采用。随着互联网的发展,越来越多的网站使用服务器端脚本动态生成内容,同步更新越来越困难,对可控性要求越来越高,镜像技术因为不能满足这类网站的需要,渐渐的淡出了人们的视线。但有一些大型的软件下载站,因为符合镜像网站的条件——下载的内容是静态的,更新频率较低,对带宽,速度要求又比较高,如国外的SourceForge (http://www.SourceForge.net,著名开源软件托管网站),Fedora(http://fedoraproject.org,RedHat赞助的Linux发行版),国内的华军软件园(http://www.onlinedown.net),天空软件站(http://www.skycn.com)等,还在使用这项技术(图1)。
图1 上图:天空软件站首页的镜像选择页面
下图:SourceForge下载时的镜像选择页面
在网站建设的过程中,可以根据实际情况,将静态内容作一些镜像,以加快访问速度,提升用户体验。
2.2 CDN内容分发网络 CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的互联网中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,分散服务器的压力,解决互联网拥挤的状况,提高用户访问网站的响应速度。从而解决由于网络带宽小、用户访问量大、网点分布不均等原因所造成的用户访问网站响应速度慢的问题[14]。
CDN与镜像网站技术的不同之处在于网站代替用户去选择最优的内容服务器,增强了可控制性。CDN其实是夹在网页浏览者和被访问的服务器中间的一层镜像或者说缓存,浏览者访问时点击的还是服务器原来的URL地址,但是看到的内容其实是对浏览者来说最优的一台镜像服务器上的页面缓存内容。这是通过调整服务器的域名解析来实现的。使用CDN技术的域名解析服务器需要维护一个镜像服务器列表和一份来访IP到镜像服务器的对应表。当一个用户的请求到来的时候,根据用户的IP,查询对应表,得到最优的镜像服务器的IP地址,返回给用户。这里的最优,需要综合考虑服务器的处理能力,带宽,离访问者的距离远近等因素。当某个地方的镜像网站流量过大,带宽消耗过快,或者出现服务器,网络等故障的时候,可以很方便的设置将用户的访问转到另外一个地方(图2)。这样就增强了可控制性。
图2 CDN原理示意图
CDN网络加速技术也有它的局限性。首先,因为内容更新的时候,需要同步更新多台镜像服务器,所以它也只适用于内容更新不太频繁,或者对实时性要求不是很高的网站;其次,DNS解析有缓存,当某一个镜像网站的访问需要转移时,主DNS服务器更改了IP解析结果,但各地的DNS服务器缓存更新会滞后一段时间,这段时间内用户的访问仍然会指向该服务器,可控制性依然有不足。
目前,国内访问量较高的大型网站如新浪、网易等的资讯频道,均使用CDN网络加速技术(图3),虽然网站的访问量巨大,但无论在什么地方访问,速度都会很快。但论坛,邮箱等更新频繁,实时性要求高的频道,则不适合使用这种技术。
图3 新浪网使用ChinaCache CDN服务。
ChinaCache的服务节点全球超过130个,
其中中国节点超过80个,
覆盖全国主要6大网络的主要省份[15]。
2.3 应用层分布式设计新浪播客为了获得CDN网络加速的优点,又必须避免CDN的不足,在应用层软件设计上,采取了一个替代的办法。新浪播客提供了一个供播放器查询视频文件地址的接口。当用户打开视频播放页面的时候,播放器首先连接查询接口,通过接口获得视频文件所在的最优的镜像服务器地址,然后再到该服务器去下载视频文件。这样,用一次额外的查询获得了全部的控制性,而这次查询的通讯流量非常小,几乎可以忽略不计。CDN中由域名解析获得的灵活性也保留了下来:由接口程序维护镜像网站列表及来访IP到镜像网站的对应表即可。镜像网站中不需要镜像所有的内容,而是只镜像更新速度较慢的视频文件。这是完全可以承受的。
2.4 网络层架构小结从整个互联网络的高度来看网站架构,努力的方向是明确的:让用户就近取得内容,但又要在速度和可控制性之间作一个平衡。对于更新比较频繁内容,由于难以保持镜像网站之间的同步,则需要使用其他的辅助技术。 3 交换层架构3.1 第四层交换简介按照OSI[16]七层模型,第四层是传输层。传输层负责端到端通信,在IP协议栈中是TCP和UDP所在的协议层。TCP和UDP数据包中包含端口号(port number),它们可以唯一区分每个数据包所属的协议和应用程序。接收端计算机的操作系统根据端口号确定所收到的IP包类型,并把它交给合适的高层程序。IP地址和端口号的组合通常称作“插口(Socket)”。
第四层交换的一个简单定义是:它是一种传输功能,它决定传输不仅仅依据MAC地址(第二层网桥)或源/目标IP地址(第三层路由),而且依据IP地址与TCP/UDP (第四层) 应用端口号的组合(Socket)[17]。第四层交换功能就像是虚拟IP,指向实际的服务器。它传输的数据支持多种协议,有HTTP、FTP、NFS、Telnet等。
以HTTP协议为例,在第四层交换中为每个服务器组设立一个虚拟IP(Virtue IP,VIP),每组服务器支持某一个或几个域名。在域名服务器(DNS)中存储服务器组的VIP,而不是某一台服务器的真实地址。
当用户请求页面时,一个带有目标服务器组的VIP连接请求发送给第四层交换机。第四层交换机使用某种选择策略,在组中选取最优的服务器,将数据包中的目标VIP地址用实际服务器的IP地址取代,并将连接请求传给该服务器。第四层交换一般都实现了会话保持功能,即同一会话的所有的包由第四层交换机进行映射后,在用户和同一服务器间进行传输[18]。
第四层交换按实现分类,分为硬件实现和软件实现。
3.2 硬件实现第四层交换的硬件实现一般都由专业的硬件厂商作为商业解决方案提供。常见的有Alteon[19],F5[20]等。这些产品非常昂贵,但是能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了[21]。鉴于条件关系,这里不展开讨论。
3.3 软件实现第四层交换也可以通过软件实现,不过性能比专业硬件稍差,但是满足一定量的压力还是可以达到的,而且软件实现配置起来更灵活。 软件四层交换常用的有Linux上的LVS(Linux Virtual Server),它提供了基于心跳(heart beat)的实时灾难应对解决方案,提高了系统的鲁棒性,同时提供了灵活的VIP配置和管理功能,可以同时满足多种应用需求[22]。4 服务器优化4.1 服务器整体性能考虑对于价值昂贵的服务器来说,怎样配置才能发挥它的最大功效,又不至于影响正常的服务,这是在设计网站架构的时候必须要考虑的。常见的影响服务器的处理速度的因素有:网络连接,硬盘读写,内存空间,CPU速度。如果服务器的某一个部件满负荷运转仍然低于需要,而其他部件仍有能力剩余,我们将之称为性能瓶颈。服务器想要发挥最大的功效,关键的是消除瓶颈,让所有的部件都被充分的利用起来。
4.2 Socket优化以标准的 GNU/Linux 为例。GNU/Linux 发行版试图对各种部署情况都进行优化,这意味着对具体服务器的执行环境来说,标准的发行版可能并不是最优化的[23]。GNU/Linux 提供了很多可调节的内核参数,可以使用这些参数为服务器进行动态配置,包括影响 Socket 性能的一些重要的选项。这些选项包含在 /proc 虚拟文件系统中。这个文件系统中的每个文件都表示一个或多个参数,它们可以通过 cat 工具进行读取,或使用 echo 命令进行修改。这里仅列出一些影响TCP/IP 栈性能的可调节内核参数[24]:
/proc/sys/net/ipv4/tcp_window_scaling “1”(1表示启用该选项,0表示关闭,下同) 启用 RFC[25] 1323[26] 定义的 window scaling;要支持超过 64KB 的窗口,必须启用该值。
/proc/sys/net/ipv4/tcp_sack “1”启用有选择的应答(Selective Acknowledgment),通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);对于广域网通信来说,这个选项应该启用,但是这也会增加对 CPU 的占用。
/proc/sys/net/ipv4/tcp_timestamps “1” 以一种比重发超时更精确的方法(参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。
/proc/sys/net/ipv4/tcp_mem “24576 32768 49152” 确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB)。第一个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。超过这个上限时可以将报文丢弃,从而减少对内存的使用。
/proc/sys/net/ipv4/tcp_wmem “4096 16384 131072” 为自动调优定义每个 socket 使用的内存。第一个值是为 socket 的发送缓冲区分配的最少字节数。第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值。第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。
/proc/sys/net/ipv4/tcp_westwood “1” 启用发送者端的拥塞控制算法,它可以维护对吞吐量的评估,并试图对带宽的整体利用情况进行优化;对于 WAN 通信来说应该启用这个选项。
与其他调优努力一样,最好的方法实际上就是不断进行实验。具体应用程序的行为、处理器的速度以及可用内存的多少都会影响到这些参数对性能作用的效果。在某些情况中,一些认为有益的操作可能恰恰是有害的(反之亦然)。因此,需要逐一试验各个选项,然后检查每个选项的结果,最后得出最适合具体机器的一套参数。
如果重启了 GNU/Linux 系统,设置的内核参数都会恢复成默认值。为了将所设置的值作为这些参数的默认值,可以使用 /etc/rc.local 文件,在系统每次启动时自动将这些参数配置成所需要的值。
在检测每个选项的更改带来的效果的时候,GNU/Linux上有一些非常强大的工具可以使用:
ping 这是用于检查主机的可用性的最常用的工具,也可以用于计算网络带宽延时。
traceroute 打印连接到特定网络主机所经过的一系列路由器和网关的路径(路由),从而确定每个 hop 之间的延时。
netstat 确定有关网络子系统、协议和连接的各种统计信息。
tcpdump 显示一个或多个连接的协议级的报文跟踪信息,其中包括时间信息,可以使用这些信息来研究不同协议的报文时间。
Ethereal 以一个易于使用的图形化界面提供 tcpump (报文跟踪)的信息,支持报文过滤功能。
iperf 测量 TCP 和 UDP 的网络性能;测量最大带宽,并汇报延时和数据报的丢失情况。
4.3 硬盘级缓存硬盘级别的缓存是指将需要动态生成的内容暂时缓存在硬盘上,在一个可接受的延迟时间范围内,同样的请求不再动态生成,以达到节约系统资源,提高网站承受能力的目的。Linux环境下硬盘级缓存一般使用Squid[27]。
Squid是一个高性能的代理缓存服务器。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。它接受来自客户端对目标对象的请求并适当地处理这些请求。比如说,用户通过浏览器想下载(即浏览)一个web页面,浏览器请求Squid为它取得这个页面。Squid随之连接到页面所在的原始服务器并向服务器发出取得该页面的请求。取得页面后,Squid再将页面返回给用户端浏览器,并且同时在Squid本地缓存目录里保存一份副本。当下一次有用户需要同一页面时,Squid可以简单地从缓存中读取它的副本,直接返回给用户,而不用再次请求原始服务器。当前的Squid可以处理HTTP, FTP, GOPHER, SSL和WAIS等协议。
Squid默认通过检测HTTP协议头的Expires和 Cache-Control字段来决定缓存的时间。在实际应用中,可以显式的在服务器端脚本中输出HTTP头,也可以通过配置apache的mod_expires模块,让apache自动的给每一个网页加上过期时间。对于静态内容,如图片,视频文件,供下载的软件等,还可以针对文件类型(扩展名),用 Squid 的 refresh_pattern 来指定缓存时间。
Squid 运行的时候,默认会在硬盘上建两层hash目录,用来存储缓存的Object。它还会在内存中建立一个Hash Table,用来记录硬盘中Object分布的情况。如果Squid配置成为一个Squid集群中的一个的话,它还会建立一个 Digest Table(摘要表),用来存储其它 Squid 上的Object摘要。当用户端想要的资料本地硬盘上没有时,可以很快的知道应该去集群中的哪一台机器获得。在硬盘空间快要达到配置限额的时候,可以配置使用某种策略(默认使用LRU:Least Recently Used-最近最少用)删除一些Object,从而腾出空间[28][29]。
集群中的Squid Server 之间可以有两种关系:第一种关系是:Child 和 Parent。当 Child Squid Server 没有资料时,会直接向 Parent Squid Server 要资料,然后一直等,直到 Parent 给它资料为止。 第二种关系是:Sibling 和 Sibling。当 Squid Server 没有资料时,会先向 Sibling 的 Squid Server 要资料,如果 Sibling 没资料,就跳过它向 Parent 要或直接上原始网站去拿。
默认配置的Squid,没有经过任何优化的时候,一般可以达到 50% 的命中率[30](图4)。如果需要,还可以通过参数优化,拆分业务,优化文件系统等办法,使得Squid达到 90% 以上的缓存命中率。 Squid处理TCP连接消耗的服务器资源比真正的HTTP服务器要小的多,当Squid分担了大部分连接,网站的承压能力就大大增强了。
4 某网站使用MRTG工具检测到的Squid命中率
蓝线表示Squid的流量,绿色部分表示Apache流量
4.4 内存级缓存内存级别的缓存是指将需要动态生成的内容暂时缓存在内存里,在一个可接受的延迟时间范围内,同样的请求不再动态生成,而是直接从内存中读取。Linux环境下内存级缓存Memcached[31]是一个不错的选择。
Memcached是danga.com(运营Live Journal[32]的技术团队)开发的一套非常优秀的分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。和 Squid 的前端缓存加速不同,它是通过基于内存的对象缓存来减少数据库查询的方式改善网站的性能,而其中最吸引人的一个特性就是支持分布式部署;也就是说可以在一群机器上建立一堆 Memcached 服务,每个服务可以根据具体服务器的硬件配置使用不同大小的内存块,这样,理论上可以建立一个无限大的基于内存的缓存系统。
Memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等[附录1]。客户端首先与 Memcached 服务建立连接,然后存取对象。每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存的时候还可以设置有效期。保存在 Memcached 中的对象实际上是放置在内存中的,而不是在硬盘上。Memcached 进程运行之后,会预申请一块较大的内存空间,自己进行管理,用完之后再申请一块,而不是每次需要的时候去向操作系统申请。Memcached将对象保存在一个巨大的Hash表中,它还使用NewHash算法来管理Hash表,从而获得进一步的性能提升。所以当分配给Memcached的内存足够大的时候,Memcached的时间消耗基本上只是网络Socket连接了[33]。
Memcached也有它的不足。首先它的数据是保存在内存当中的,一旦服务进程重启(进程意外被关掉,机器重启等),数据会全部丢失。其次Memcached以root权限运行,而且Memcached本身没有任何权限管理和认证功能,安全性不足。第一条是Memcached作为内存缓存服务使用无法避免的,当然,如果内存中的数据需要保存,可以采取更改Memcached的源代码,增加定期写入硬盘的功能。对于第二条,我们可以将Memcached服务绑定在内网IP上,通过Linux防火墙进行防护。
4.5 CPU与IO均衡在一个网站提供的所有功能中,有的功能可能需要消耗大量的服务器端IO资源,像下载,视频播放等,而有的功能则可能需要消耗大量的服务器CPU资源,像视频格式转换,LOG统计等。在一个服务器集群中,当我们发现某些机器上CPU和IO的利用率相差很大的时候,例如CPU负载很高而IO负责很低,我们可以考虑将该服务器上的某些耗CPU资源的进程换成耗IO的进程,以达到均衡的目的。均衡每一台机器的CPU和IO消耗,不仅可以获得更充分的服务器资源利用,而且还能够支持暂时的过载,遇到突发事件,访问流量剧增的时候, 实现得体的性能下降(Graceful performance degradation)[34],而不是立即崩溃。
4.6 读写分离如果网站的硬盘读写性能是整个网站性能提升的一个瓶颈的话,可以考虑将硬盘的读,写功能分开,分别进行优化。在专门用来写的硬盘上,我们可以在Linux下使用软件RAID-0(磁盘冗余阵列0级)[35]。RAID-0在获得硬盘IO提升的同时,也会增加整个文件系统的故障率——它等于RAID中所有驱动器的故障率之和。如果需要保持或提高硬盘的容错能力,就需要实现软件RAID-1,4或5,它们能在某一个(甚至几个)磁盘驱动器故障之后仍然保持整个文件系统的正常运行[36],但文件读写效率不如RAID-0。而专门用来读的硬盘,则不用如此麻烦,可以使用普通的服务器硬盘,以降低开销。
一般的文件系统,会综合考虑各种大小和格式的文件的读,写效率,因而对特定的文件读或写的效率不是最优。如果有必要,可以通过选择文件系统,以及修改文件系统的配置参数来达到对特定文件的读或写的效率最大化。比如说,如果文件系统中需要存储大量的小文件,则可以使用ReiserFS[37]来替代Linux操作系统默认的ext3系统,因为ReiserFS是基于平衡树的文件系统结构,尤其对于大量文件的巨型文件系统,搜索速度要比使用局部的二分查找法的ext3快。 ReiserFS里的目录是完全动态分配的,因此不存在ext3中常见的无法回收巨型目录占用的磁盘空间的情况。ReiserFS里小文件(<>Squid->Apache的一条处理链,Lighttpd在最前面,专门处理静态内容的请求,把动态内容请求通过Proxy模块转发给Squid,如果Squid中有该请求的内容且没有过期,则直接返回给Lighttpd。新请求或者过期的页面请求交由Apache中的脚本程序来处理。经过Lighttpd和Squid的两级过滤,Apache需要处理的请求大大减少,减少了Web应用程序的压力。同时这样的构架,便于把不同的处理分散到多台计算机上进行,由Lighttpd在前面统一分发。
在这种架构下,每一级都是可以进行单独优化的,比如Lighttpd可以采用异步IO方式,Squid可以启用内存来缓存,Apache可以启用MPM(Multi -Processing Modules,多道处理模块)等,并且每一级都可以使用多台机器来均衡负载,伸缩性好。
著名视频分享网站YouTube就是选择使用Lighttpd作为网站的前台服务器程序。
5.2 数据库选择MySQL[43]是一个快速的、多线程、多用户和健壮的SQL数据库服务器,支持关键任务、重负载系统的使用,是最受欢迎的开源数据库管理系统,是Linux下网站开发的首选。它由MySQL AB开发、发布和提供支持。
MySQL数据库能为网站提供:
高性能。MySQL支持海量,快速的数据库存储和读取。还可以通过使用64位处理器来获取额外的一些性能,因为MySQL在内部里很多时候都使用64位的整数处理。
易用性。MySQL的核心是一个小而快速的数据库。它的快速连接,快速存取和安全可靠的特性使MySQL非常适合在互联网站上使用。
开放性。MySQL提供多种后台存储引擎的选择,如MyISAM, Heap, InnoDB,Berkeley Db等。缺省格式为MyISAM。 MyISAM 存储引擎与磁盘兼容的非常好[44]。
支持企业级应用。MySQL有一个用于记录数据改变的二进制日志。因为它是二进制的,这一日志能够快速地将数据的更改从一台机器复制(replication)到另一台机器上。即使服务器崩溃,这一二进制日志也能够保持完整。这一特性通常被用来搭建数据库集群,以支持更大的流量访问要求[30](图5)。
图5 MySQL主辅库模式集群示意
MySQL也有一些它自身的缺陷,如缺乏图形界面,缺乏存储过程, 还不支持触发器,参照完整性,子查询和数据表视图等,但这些功能都在开发者的TO-DO列表当中。这就是开源的力量:你永远可以期待更好。
国外的Yahoo!,国内的新浪,搜狐等很多大型商业网站都使用MySQL 作为后台数据库。对于一般的网站系统,无论从成本还是性能上考虑,MySQL应该是最佳的选择。
5.3 服务器端脚本解析器的选择目前最常见的服务器端脚本有三种:ASP(Active Server Pages),JSP(Java Server Pages),PHP (Hypertext Preprocessor)[45][46]。
ASP全名Active Server Pages,以及它的升级ASP.NET,是微软公司出品的一个WEB服务器端的开发环境,利用它可以产生和运行动态的、交互的、高性能的WEB服务应用程序。ASP采用脚本语言VBScript(C#)作为自己的开发语言。 但因为只能运行在Windows环境下,这里我们不讨论它。
PHP是一种跨平台的服务器端的嵌入式脚本语言。它大量地借用C,Java和Perl语言的语法, 并耦合PHP自己的特性,使WEB开发者能够快速地写出动态生成页面。它支持目前绝大多数数据库。PHP也是开源的,它的发行遵从GPL开源协议,你可以从 PHP官方站点(http://www.php.net)自由下载到它的二进制安装文件及全部的源代码。如果在Linux平台上与MySQL搭配使用,PHP是最佳的选择。
JSP是Sun公司推出的新一代站点开发语言,是Java语言除Java应用程序和Java Applet之外的第三个应用。Jsp可以在Serverlet和JavaBean的支持下,完成功能强大的站点程序。 作为采用Java技术家族的一部分,以及Java 2(企业版体系结构)的一个组成部分,JSP技术拥有Java技术带来的所有优点,包括优秀的跨平台性,高度可重用的组件设计,健壮性和安全性等,能够支持高度复杂的基于Web的应用。
除了这三种常见的脚本之外,在Linux下我们其实还有很多其他的选择:Python(Google使用),Perl等,如果作为CGI调用,那么可选择范围就更广了。使用这些不太常见的脚本语言的好处是,它们对于某些特殊的应用有别的脚本所不具有的优势;不好的地方是,这些脚本语言在国内使用的人比较少,当碰到技术上的问题的时候,能找到的资料也较少。
5.4 可配置性在大型网站开发过程中,不管使用什么技术,网站的可配置性是必须的。在网站的后期运营过程中,肯定会有很多的需求变更。如果每一次的需求变更都会导致修改源代码,那么,这个网站的开发可以说是失败的。
首先,也是最重要的一点,功能和展示必须分开。PHP和JSP都支持模板技术,如PHP的Smarty,Phplib,JSP的JSTL(JSP Standard Tag Library)等。核心功能使用脚本语言编写,前台展示使用带特殊标签的HTML,不仅加快了开发速度,而且方便以后的维护和升级[47]。
其次,对于前台模板,一般还需要将页面的头,尾单独提取出来,页面的主体部分也按模块或者功能拆分。对CSS,JS等辅助性的代码,也建议以单独的文件形式存放。这样不仅方便管理,修改,而且还可以在用户访问的时候进行缓存,减少网络流量,减轻服务器压力。
再次,对于核心功能脚本,必须将与服务器相关的配置内容,如数据库连接配置,脚本头文件路径等,与代码分离开。尤其当网站使用集群技术,CDN加速等技术的时候,每一台服务器上的配置可能都会不一样。如果不使用配置文件,则需要同时维护几份不同的代码,很容易出错。
最后,应该尽量做到修改配置文件后能实时生效,避免修改配置文件之后需要重启服务程序的情况。
5.5 封装和中间层思想在功能块层次,如果使用JSP,基于纯面向对象语言Java的面向对象思想,类似数据库连接,会话管理等基本功能都已经封装成类了。如果使用PHP,则需要在脚本代码中显式的封装,将每一个功能块封装成一个函数,一个文件或者一个类。
在更高的层次,可以将网站分为表示层,逻辑层,持久层,分别进行封装,做到当某一层架构发生变化时,不会影响到其他层。比如新浪播客在一次升级的时候,将持久层的数据库由原来的集中式改为分布式架构,因为封装了数据库连接及所有操作[附录2],做到了不修改任何上层代码,平稳的实现了过渡。近来流行的MVC架构,将整个网站拆分成Model(模型/逻辑)、View(视图/界面)、Controller(控制/流程)三个部分,而且有很多优秀的代码框架可供选择使用, 像JSP的Structs,Spring,PHP的php.MVC, Studs 等。使用现成的代码框架,可以使网站开发事半功倍。6 扩容、容错处理6.1 扩容一个大型网站,在设计架构的时候,必须考虑到以后可能的容量扩充。新浪播客在设计时充分地考虑了这一点。对于视频分享类网站来说,视频存储空间消耗是巨大的。新浪播客在主存储服务器上,采用配置文件形式指定每一个存储盘柜上存储的视频文件的ID范围。当前台服务器需要读取一个视频的时候,首先通过询问主存储服务器上的接口获得该视频所在的盘柜及目录地址,然后再去该盘柜读取实际的视频文件。这样如果需要增加存储用的盘柜,只需要修改配置文件即可,前台程序丝毫不受影响。
新浪播客采用MySQL数据库集群,在逻辑层封装了所有的数据库连接及操作。当数据库存储架构发生改变的时候,如增加一台主库,将某些数据表独立成库,增加读取数据用的从库等,都只需要修改封装了的数据库操作类,上层代码不用修改。
新浪播客的前台页面服务器使用F5公司的硬件第四层交换机,网通,电信分别导向不同的虚拟IP,每一个虚拟IP后面又有多个服务器提供服务。当访问流量增大的时候,可以很方便往虚拟IP后面增加服务器,分担压力。
6.2 容错对于商业性网站来说,可用性是非常重要的。7*24的访问要求网站具有很强的容错能力。错误包括网络错误,服务器错误以及应用程序错误。
2006年12月27日台湾东部外海发生里氏7.6级地震,造成途径台湾海峡的多条海底电缆中断,导致许多国外网站,像MSN, NBA, Yahoo!(英文主站)等国内无法访问,但也有例外,以Google为代表的在国内建设有分布式数据节点的很多网站却仍然可以访问。虽然说地震造成断网是不可抗原因,但如果在这种情况下网站仍然可以访问,无疑能给网站用户留下深刻的印象。这件事情给大型商业网站留下的教训是:网站需要在用户主要分布区域保持数据存在,以防止可能的网络故障。
对于服务器错误,一般采取冗余设计的方法来避免。对于存储服务器(主要是负责写入的服务器),可以使用RAID(冗余磁盘阵列);对于数据库(主要是负责写入的主库),可以采用双主库设计[30];对于提供服务的前台,则可以使用第四层交换的集群,由多台服务器同时提供服务,不仅分担了流量压力,同时还可以互相作为备份。
在应用层程序中,也要考虑“用户友好”的出错设计。典型例子如HTTP 404 出错页面,程序内部错误处理,错误返回提示等,尽可能的做到人性化。7 总结及展望7.1 总结对于一个高并发高流量的网站来说,任何一个环节的瓶颈都会造成网站性能的下降,影响用户体验,进而造成巨大的经济损失。在全互联网层面,应该使用分布式设计,缩短网站与用户的网络距离,减少主干网上的流量,以及防止在网络意外情况下网站无法访问的问题。在局域网层面,应该使用服务器集群,一方面可以支撑更大的访问量,另一方面也作为冗余备份,防止服务器故障导致的网站无法访问。在单服务器层面,应该配置操作系统,文件系统及应用层软件,均衡各种资源的消耗,消除系统性能瓶颈,充分发挥服务器的潜能。在应用层,可以通过各种缓存来提升程序的效率,减少服务器资源消耗(图6)。另外,还需要合理设计应用层程序,为以后的需求变更,扩容做好准备。图6 典型高并发高流量网站的架构在每一个层次,都需要考虑容错的问题,严格消除单点故障,做到无论应用层程序错误,服务器软件错误,服务器硬件错误,还是网络错误,都不影响网站服务。
7.2展望当前Linux环境下有著名的LAMP(Linux+Apache+MySQL+PHP/PERL/PYTHON)网站建设方案,但只是针对一般的中小网站而言。对于高并发高流量的大型商业网站,还没有一个完整的,性价比高的解决方案。除去服务器,硬盘,带宽等硬件投资外,还需要花费大量的预算和时间精力在软件解决方案上。
随着互联网的持续发展,Web2.0的兴起,在可以预见的未来里,互联网的用户持续增多,提供用户参与的网站不断增加,用户参与的内容日益增长,越来越多的网站的并发量,访问量会达到一个新的高度,这就会促使越来越多的个人,公司以及研究机构来关注高并发高流量的网站架构问题。就像Web1.0成就了无数中小网站,成就了LAMP一样,Web2.0注定也会成就一个新的,高效的,成本较低的解决方案。这个方案应该包括透明的第三方CDN网络加速服务,价格低廉的第四层甚至更高层网络交换设备,优化了网络性能的操作系统,优化了读写性能,分布式,高可靠的文件系统,揉合了内存,硬盘等各个级别缓存的HTTP服务器,更为高效的服务器端脚本解析器,以及封装了大部分细节的应用层设计框架。
技术的进步永无止境。我们期待互联网更为美好的明天

深入理解敏捷开发的常见九大误区

(http://blog.csdn.net/mac_cm)
责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度。敏捷相对以前的软件工程最大的革新之处在于把人的作用提高到了过程至上,正如敏捷宣言的第一条“个体和交互胜过过程和工具”所说的。
1、敏捷是“一个”过程
敏捷不是一个过程,是一类过程的统称,它们有一个共性,就是符合敏捷价值观,遵循敏捷的原则。
敏捷的价值观如下:
◆个体和交互 胜过 过程和工具
◆可以工作的软件 胜过 面面俱到的文档
◆客户合作 胜过 合同谈判
◆响应变化 胜过 遵循计划
由价值观引出的12条敏捷原则:
◆我们最优先要做的是通过尽早的、持续的交付有价值的软件来使客户满意。
◆即使到了开发的后期,也欢迎改变需求。敏捷过程利用变化来为客户创造竞争优势。
◆经常性地交付可以工作的软件,交付的间隔可以从几个星期到几个月,交付的时间间隔越短越好。
◆在整个项目开发期间,业务人员和开发人员必须天天都在一起工作。
◆围绕被激励起来的个体来构建项目。给他们提供所需的环境和支持,并且信任他们能够完成工作。
◆在团队内部,最具有效果并且富有效率的传递信息的方法,就是面对面的交谈。
◆工作的软件是首要的进度度量标准。
◆敏捷过程提倡可持续的开发速度。责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度。
◆不断地关注优秀的技能和好的设计会增强敏捷能力。
◆简单是使未完成的工作最大化的艺术??是根本的。
◆最好的构架、需求和设计出自于自组织的团队。
◆每隔一定时间,团队会在如何才能更有效地工作方面进行反省,然后相应地对自己的行为进行调整。
建立敏捷联盟的17位大师所创立的敏捷方法包括:极限编程,Scrum,特征驱动开发,动态系统开发方法,自适应软件开发,水晶方法,实用编程方法。这些方法统称为敏捷方法。
其实每个人都可以从敏捷宣言和原则出发,明确问题,找出一些解决方法,形成自己的过程。我觉得国内的软件环境这么复杂,程序员的自主精神又这么强,敏捷方法应该是在中国首先提出才对,只是国人都有唯标准唯规范至上的心理定式,即使找出好办法,也觉得不规范,没有深入形成理论,无法提升高度,始终是跟着鬼子屁股后面走,我想这也是国外软件行业不成熟的表现之一吧!
2、敏捷仅仅是一个软件过程
如果仅仅从软件过程的角度去认识敏捷实施敏捷,效果不会太好。敏捷相对以前的软件工程最大的革新之处在于把人的作用提高到了过程至上,正如敏捷宣言的第一条“个体和交互胜过过程和工具”所说的。
涉及到人的问题,就已经不再是过程所能覆盖的了,就到了企业管理的层面上了,包括企业的价值观和文化。这也是敏捷在国内实施的最大障碍:
把客户当作合作伙伴而不是对手,从客户角度出发去想问题,充分的跟客户沟通,而不是出了问题推诿责任。目标是让软件实现客户的价值,而不是收钱就完事儿。
把人的能动性调动起来,给动力而不是给压力。
要实用而不是要规范。让开发人员理解并实施,体验到敏捷的好处,而不是盲目机械地实施规范。
没有绝对的权威,每个人都有可取之处。
3、迭代就是敏捷,UP属于敏捷。
看到这么多人都把UP归入敏捷,我都开始怀疑是不是自己搞错了。但是在我的印象中:
UP是重型的过程,虽然引入了迭代,但是其原则和价值观与敏捷是不同的。敏捷注重的是反馈,迭代周期尽量的短,重在客户的参与,通过客户的参与,获取持续的反馈,不断调整使整个项目走在正确的方向上。同时也给客户一个感受和思考的机会,因为对于大多数客户而言,目标是明确的(不排除有些客户目标也不明确),但是具体怎么做,开始时是没有想法的,只有看到具体的东西的时候,才知道“噢,原来可以这样,那我想把这里调整一下”。
4、敏捷是彻底革命的。
敏捷,特别是XP,让人有耳目一新的感觉,觉得以前的所有软件工程理论,设计方法都可以抛弃掉了,推翻一切,从头再来。抱着这种想法实施敏捷,那就错了,敏捷不是“石头里蹦出个孙大圣”,以前的软件过程中也有敏捷的影子,只是没有像敏捷一样上升到价值观和原则的高度,比如快速原型法。敏捷是在对已有的软件过程方法的改进,抛弃的是传统软件工程低效的外表,以往的软件过程中很多技巧都是很实用的。实施敏捷应该以现有的软件过程为基础,从敏捷宣言和原则出发,利用敏捷的方法来改善过程。
5、敏捷是反文档的。
文档只是为了达成目标的一种手段,如果这种手段是低效的,那就换一种手段。可是完全抛弃了文档,怎样解决沟通的问题?难道你想每次沟通都完全用手比划,用嘴说,跟不同的人重复表述同样的想法,那样更是低效的。
应该清楚文档的本质是把知识显性化。在一个项目中存在很多需要沟通的知识,知识具备两种形态,显性的和隐性的,传统的观念是尽量把隐性知识显性化,即文档化,而忽略了这其中的代价(特别是更新同步文档的代价)。
因此,在实施敏捷的时候,需要在团队内明确哪些知识是必须显性的,这些知识可以通过文档交流。哪些知识是可以隐性的,这些知识则完全可以通过口头的方式进行交流,以达到沟通的最佳效率。
文档不是目的,有效沟通才是目的。
6、为了敏捷而敏捷
“嗯,敏捷这么好,我们也敏捷吧”,可能很多人会有这种想法。忘了以前是在哪儿看的大师采访录:
Q:“我们现有的过程很好,不知道怎么用敏捷改进?”
A:“既然很好,那就不要用敏捷”。
做什么事情都要有明确目标的,敏捷虽好,得看你需不需要,能不能解决你现在头疼的问题,如果不是,那就不要给自己找麻烦了。
7、敏捷是CMM的反义词
在讨论中,很多人把CMM作为敏捷的反义词,我觉得这不是很合适。CMM只是一种衡量软件成熟度的标准,并非过程,和敏捷不是一类概念。如果要给敏捷找一个反义词,我觉得传统的瀑布式开发应该更合适一些。
并且,我认为,如果CMM还能继续流行下去的话,应该会有公司可以用敏捷改善的过程通过CMM认证。
8、敏捷是自由的,无约束的。
敏捷强调的是自组织团队,发挥人的能动性,以动力代替压力,让人有绝对自由的错觉。但是应该清楚,凡事都是要讲究一个平衡,人也是两面的,消极的一面和积极的一面同时并存,绝对的自由会放纵人消极的一面。敏捷并非是绝对自由,无约束的。作为管理者,有一个职责,就是引导团队成员用自己积极的一面去压制消极的一面,不能放任团队中出现搭便车的现象,否则将打击整个团队的士气。如果实在无效,那就只能将其排除出团队了,这个惩罚够有约束力吧?
9、重做就是重构
重做不等于重构,很多场合这两个概念是混淆的。但是在敏捷中,重构的一个特征是必须可控的。当对系统结构进行大的调整时,如果没有测试驱动辅助的话,那么可控性就会很差,这不能叫做重构。

2008年6月2日星期一

设计你的软件人生

设计你的软件人生

(http://blog.csdn.net/mac_cm)


站在全球软件行业的最前沿.黄皮肤黑眼睛的他们大都经历了同样的道路:海外求学、海外就业、加入微软。在2004微软中国技术大会上,在本报和微软合作举办的第三届软件人生座谈会上,来自微软总部的十八位华人顶尖技术高手汇聚一堂,共同品味软件人生的酸甜苦辣,探讨职业生涯的成功之道。
在全球最大的软件公司里,一名成功的程序员应该具备什么素质?怎样设计自己的职业生涯能达到人生的最高效率?在女性通往优秀程序员、优秀团队管理者的道路上有何障碍和优势?
从专注成就的顶尖技术高手到明星风采的专家,再到屈指可数的女性高管,他们的人生经历或许能给你带来些许感悟。
软件生涯,人品先行?
郭旭:最近我报刊登了一篇文章,对注重人品的招聘原则进行了评论。各位认为人品的好坏对工作到底有没有影响?为什么人品这么重要,什么品格是微软最赞扬、最提倡的品格。
朱敏:我不完全同意这个说法,人品是第一位的,但人品不是一次面试就能够判断的。最关键是团队机制能够让一个人成长,通过几年的工作培养人品和能力更重要。
郑全战:我认为人品挺重要的,例如这个人如果比较孤立,没有团队精神,将导致他不能很好地跟大家共事。
王志峰:在微软每次面试之前人力资源部都会给我们发一个E-mail,说这个过程需要看重这个人哪些方面,我从来没有收到哪个E-mail说是要注重人品。我感觉人品是职业道德问题,职业道德在美国社会已经被认为是最基本、最底层的要求。从人品角度来讲要看大的社会环境,人品是跟很多因素相关的,当企业管理者在发现员工缺乏职业道德的时候,要想一想企业是不是为之创造了好的环境。
毕德兰:人品是一个感觉。在面试时交谈五分钟就可以感觉到,然后可以用一些技巧来证实这些感觉是否正确。在国内国外都是同样的情形,有经验的面试人很快就可以看出来,不需要长时间的判断。在选择人的时候,技术上很多时候不可能找到一个完全想要的人,所以在技术上很多是大概差不多就可以了。人品很重要。
郭旭:哪些品质是必须得有、或者是最值得推崇的?
刘朝勇:我1997年加入微软公司,我觉得最重要的是要敬业,要敢于承担责任。另外是团队精神有时被高估了,以前在我们组有一个同事技术能力非常强,分配给他的活能够很快干完,虽然团队精神有所欠缺,但是我们还是非常尊重他。
吴峻:作为一个工程师,你面对问题,从哪个角度来考虑——是从客户利益出发,还是自我保护,我觉得这是人品具体的表现。一个人品比较好的工程师对工作很认真,对错误敢于承认,同时对责任不推卸,他和团队中其他人的合作就会非常容易。
李丹:要有应变能力、独立工作能力。我做面试时很喜欢问一个问题,你的老板叫你找一本书,明天早晨给他,你会怎么样去做?我看他能找出多少种方法,你每说出一种我都会否定,就看你有没有独立工作的能力。因为在微软工作没有人牵着你的手下一步该怎么做,独立工作能力是必需的。
毕德兰:最重要的是热爱和专注。我们是做IT的,如果他对于这份工作很热爱,那么从字里行间行为语言上都会完全表现出来。我希望一个人专注,专注的人不会随随便便会走歪道。
素质与角色
如何才能成就完美人生?不妨说说你的看法.
郭旭:能力跟角色定位很有关系。希望各位介绍一下你们自己是什么样的角色,需要怎样的个人素质?
吴家震:我主要做测试,做测试很重要的一点就是怎样从用户的角度来看产品。这是和大学或者研究院里教的很不一样的地方。我们大多数人是从程序、代码来看这个产品。这是我感受最深的一点。另外一点,就是怎么样把效率提高。你一定要追求最好的,如果你这一次追求了最好的,下一次就会更好。
郑全战:我以前做开发,现在做项目管理。大家过去理解,做开发不要求太多跟外界打交道的能力。但是从做项目管理的角度看,如果开发人员有更好的沟通能力,整体效率就会提高很多。
王克刚:微软是非常开放的,我很喜欢这个文化,能够让你避开短处,慢慢地长处就凸显出来了。如果你在一个部门里面不太合适,也可以到别的部门去,公司也鼓励你这样做。
李丹:我在做测试。在微软,鼓励大家选最有热情的领域去做,去了解各个岗位。人在岗位轮换中老接受挑战。做测试的人第一要有合作精神,第二要很有条理,另外需要很好的沟通能力:要跟项目经理沟通,跟各种环境沟通。而且你是代表公司在测试软件,要有敢于挑战设计的精神。
栾跃:在微软做项目经理要专门上一门课,叫怎样鼓动其他团队帮助你工作。要让那些人愿意死心塌地地为你做,这很不容易,是很大的挑战。
郭旭:创业者是软件人群体中非常大的一个部分。大家如何看待创业的问题?
栾跃:这是一个非常好的话题。我们讨论到目前为止,只是讨论怎么样成为一个好的雇员。还有一方面我们没有提到,甚至我认为是中国教育对下一代培养缺少的,就是创业。中国有多少大学毕业生大学还没有毕业就把一个很好的概念转化成商业概念?好像只有一个。不能等到大环境好了才开始教育,应该从现在开始教育。学校在培养下一代时不光要有好的人品、个性,要懂技术,还有很重要的一点,要把中国人创造智慧的才能从技术转换成为财富,这方面的培养应该是高等教育很重要的一部分。哪一天我们的技术能够创造中国的微软,创造出中国的雅虎?
郭旭:各位如果回来创业,成功率相对大,因为你们有人脉、有经验、有积累。鼓励刚刚毕业的学生出去创业是不是操之过急?
肖维:我们不是鼓励每个人都去创业,因为每个人的性格、能力都有不同。在设计人生时,应该考虑到自己是什么样的人,要扬长避短。如果你真的想创业,要意识到创业需要学习哪些能力。人的学习能力要很强,但是要意识到自己的不足。不是说所有的人都要去创新,但是中国IT行业要想健康发展,一定要有一批带头人。
李丹:不是说各样条件都具备了才能创业,一定是你有这种热情:克服一个个困难,把这个事情做成。在中国,很长一段时间还是培养高级打工仔的概念,认为读书越多越好。
郭旭:大家能不能告诉那些把人生目标定为以软件为职业的人,在求学过程中应该注意哪些东西,让他们少走一些弯路,更快地成长。
郑全战:在大学时一定要往前看,眼界要开阔一些。看一看哪些东西是前沿的,有可以突破的地方。对好学生来说应该做到一点,他可以看看中国微软研究院这边在做什么样的课题,你是不是可以跟他们联络,看看这方面的资料,特别是研究生。你也可以参与,我知道很多人给开复写信要资料。这种人往往能够跟上时代潮流,前沿科技能够很快了解到。
肖维:我比较赞赏以色列,这个国家本身资源不是很多,但是出了很多创新的小人物。有别人没有的东西,这样才会比较有前途。
王克刚:给想当好开发人员的大学生们提个建议:要把自己的追求弄清楚,到底在一生中要追求什么。假如不知道的话先把这个找到。如果一定要用软件来致富,先分析一下在这种环境下、这种法制下,你能不能成功了。
李丹:跟社会环境有关系,像美国那个环境比较好,主张的是人热爱什么一定要去做什么。在中国。从我小的时候就想什么东西能够赚钱,我们出去留学哪个专业会赚钱——从实用主义出发,而不是从个人的爱好出发。
定义成功
郭旭:今天的题目是设计软件人生,大家对成功的定义都不太一样。
李丹:我刚才想讲的是大环境问题。怎么样定义成功?我们老是说好像要开公司就成功了,或者是在大公司里面做到什么样的职位就成功了,这样的话太绝对了。要鼓励年轻的学生,让他们真的放开,不要为了社会舆论、社会的承认做什么东西,而是为了自己的理想、为了自己的热爱去做,这样做的话总会成功的。我也是走来走去,最后走到这个行业的。
毕德兰:我觉得大家都说得很好,但是我是比较无为的人,很多时候还是顺其自然,不给自己太多压力。做学生的时候,我觉得无忧无虑的很好。要设计,但是不要太强求。说实在的,两年前没想到一定非到中国来不可,但是一有这个机会,也很希望在中国这个产业上能够做点儿事,我就回来了,不一定说我非要怎么样,我觉得做人不要这么辛苦。
王克刚:我想苦不苦每个人都是不一样的,最根本的你要问你自己,如果一个钟头以后你就死了,在快死前你后悔了,后悔我没到中国来过,后悔没有开发软件,后悔我没有自由自在地生活过一段时间。那就好了,你想做这个就去做这个。
栾跃:最关键的还是心里的热爱,如果你的爱好是周游世界你就去做。微软很多人到最后自己把微软的职位辞掉,去中学当老师,或者开一个小作坊。也不是说在这个行业走到头了,而是他觉得这边没有热情了,就改一个路做其他的,也不见得很赚钱,就是喜欢。我有一个同事做得很好,突然间辞职了,想去做跟IT完全没有关系的急救员。他放弃了这么多,重新去学校学他想做的事情,做他想做的事情。这还是一个大环境不一样,中国和美国的文化还是有区别的。
栾跃:我有一个同事很特别,他就喜欢研究骨头,后来辞掉工作专门去研究骨头。所以做你喜欢做的事情,只要开心就好,不要给这个社会创造太多的失望者。
吴家震:绝大多数人其实并不知道将来做什么,当你大学、研究生院毕业之后很多人并不是很清楚。你看这个世界上特别成功的人、特别成功的大企业不是说设计出来的,这些人是当机会出来时可以抓住它,所以专业知识的积累、管理知识的积累都是一个从量变到质变的过程。一定要有一个催化事件,这是可遇不可求的东西。我们也有一个杰出工程师,他一生做了很多不一样的工作,他当过厨师,去采购玉米,去南非给人家烧过两年煤炭,20多岁,原来学的是林业,二十七八岁才学的计算机。他自己定的目标是:30岁之前不要有真正的工作。因为他当时不知道自己要做什么,他一直在寻找,找到之后把自己的全身心都放进去了。他30岁开始做计算机,现在50多岁。我觉得不要给学生、年轻人有很多的压力,只要是做自己高兴的事情就好。
栾跃:苹果公司的创始者写的自传,题目就是:整个旅程就是我最终的报酬,而不是我达到的目的地作为报酬。甚至很多美国年轻人宣扬一种论调,当我还不知道做什么事时就做各种各样的事,最后再定下来。但是我这边讲的不是告诉所有做软件的人,把这个世界玩够了以后再决定干什么。还有一个,真正的成功并不是随机发生的。大家知道微软的历史。大家道听途说就认为比尔·盖茨退出哈佛大学去写程序,然后就成功了。其实不是的。微软的启动历史是,比尔·盖茨在辞去大学之前,在1960年读了一本书,有比较成型的想法,但是他们一直等到1968年英特尔的新CPU出来,才决定放下手中一切工作开发这个软件,决定开公司。
关于年龄
郭旭:好多人说,做软件是吃青春饭,做几年之后就基本上改行了,做得好就改做管理,做得不好就做其他的。也有很多微软的程序员想一辈子都做编程。年龄、经验对程序员工作有没有帮助?
李丹:在微软也有很多很年轻的程序员,20出头。在软件行业一定要有开放心态,要锻炼自己的基础能力。不像一些传统的行业,要成为这方面的专家,要一辈子都干这一行。微软给我们提供一个大环境,例如做项目经理做厌了可以做开发。
肖维:我觉得这个问题有两个方面,一个是能力方面,一个50岁的人能不能编程?我认为是没有任何问题的。问题的另外一面你到50岁时,以你能够获得的酬劳,在中国还值不值得编程?我想三十几岁的人就面临这样的问题。在中国,很基本的程序员收入能不能让他在30岁或者是40岁甚至是50岁时还觉得满意?
栾跃:这是企业方面的问题,很多国内企业的领导都问,怎样才能保持员工的积极性?年纪大了,做到三四十岁觉得钱不够了就不愿意做了是常见的现象。
郭旭:但是对于企业来讲,要考虑运作的成本:同样雇一个能够实现我这个工作的人,老员工费用比较高,而一个大学生刚毕业几年,费用比较低,自然企业会雇新人。经验值能不能带来真正的价值?
栾跃:经验值应该可以带来价值。我今天课上就讲到了软件真正开发好的话,效率是很大的,关键就是怎么管理运作流程。经验多,在执行流程和规章制度、执行管理政策方面就可以起到正面作用。
肖维:如果真是很优秀的人,一个人可以比十个人更加有效率。我们组里现在有两个级别非常高的纯开发人员,级别和收入比我们的经理还高很多。他们写东西至少比别人要快两到三倍,经验是很重要的。
栾跃:技术人员首先要明确,做技术是不是你真正热爱的?如果并不是你的兴趣所在,只是为了赚钱,那还不如不要做了。如果你真正对软件开发热爱的话,完全可以在技术的道路上走下去,而并不是说我要赚多少钱。第二个层面,作为企业来讲,也应该为技术人员创造一个可以继续发展的前途,而不是说如果人家想赚更多的钱就非得停止技术来做管理。包括微软在内,很多比较先进的企业采取两个序列并列的方法,技术和管理两条线都可以上升到很高的职位。对那些很想做技术,也适合做技术,不想做管理的人,就让他由技术路线上升到很高的地位,赚很多钱,而且可以得到很多人的尊重。设计软件人生,很重要的一点是技术人员应该意识到自己的工作是崇高的,是很伟大的一份工作。如果没有这个热爱只是看着钱来的,还不如早点儿离开。
专注,成就顶尖高手
唐朝晖,微软总部商业智能部门Microsoft SQL Server的项目经理(a lead program manager)。1996在法国获得博士学位。在有关数据库的相关会议和期刊上发表过多篇论文,并合著了数据库的相关书籍。
戴着眼镜,一件简单的衬衫,外形敦厚的唐朝晖看起来像一个最普通的程序员。他说话速度很快,谈起太太总是一脸的骄傲。你无法从唐朝晖年轻而充满朝气的外表中看出,这是一位全球数据挖掘领域顶尖级专家。
从上世纪九十年代初开始做软件到现在,十多年已经过去了。唐朝晖觉得自己做得不错的一点是认可数据库领域的发展方向,并专注于此。他从硕士开始,到博士到以后的工作,都专注在数据库领域。“有的人做事情变换快,这样就很难积累,应该尽量做些垂直的东西。软件行业面很大,但是期间有很多垂直的东西,你可以积累,变成专家。”唐朝晖认为,选对方向有一定的偶然性,但是也有必然性。例如现在就业机会不错,每个人都面临职业选择,哪种机会对自己更有积累应该成为一个判断标准。
1996年博士毕业的唐朝晖就职于一家欧洲公司,后来因为太太的原因来到美国。五年前,他在一个学术会议上发表演讲,被猎头看上并挖来微软。唐朝晖认为,被看作是技术人员成长重要途径的发表文章和演讲,关键在于和人的交流,而不要关起们来写程序。
在微软的五年时间里,唐朝晖评价微软的升迁之道,认为抓住一个有潜力的产品很重要。
“微软的特点是有很多小的产品在做,每个人都很有机会随着产品成长起来。但是对于一些相对稳定的产品,机会就不如成长型产品。”
“在微软这段时间对我自己最有收获。因为我学到很多东西,有很多产品项目管理的经验。每天做的事情是新的。我心里很有成就感,因为我设计的东西影响这么大的市场,在我们这个专业领域里,我可能是屈指可数的几个专家之一。”
“至少在未来三年,我会坚持新版本的开发,但是之后的安排,完全取决于我的家人。我太太在美国做医生,也混得很好,她说,为什么要和你回国?你在家里带孩子也是可以的。所以五年以后我还没有想好,现在国内公司找我的特别多。说不定有一个很好的机会,说不定我太太愿意回国。我可能会做职业经理人,但是退出数据挖掘领域,机会成本比较大”
唐朝晖这次回国在北京和上海走访了很多软件公司,包括外资、合资以及人们自行创业的公司,甚至包括原来微软的同事创办的公司。唐朝晖总的感觉是开发人员的年龄普遍都很小,“在微软,大部分的开发人员是我这个年龄的人。我们有一个同事是韩国人,他原来是一个教授,后来不想做教授想编程序,就因为自己喜欢。他就是一个程序员,已经四十多岁了,我们都对他很尊重。” 35岁的唐朝晖在欧洲呆了十年,在美国呆了五年,“在我们那个年代,国内和国外差别很大,所以出国还是很有收获,但是现在国内很多公司的管理经验和国外差不多,所以在国内也很有收获。”
屈指可数的女性高管
棕色挑染短发,蓝色套服,右手习惯性地插在口袋里,这位款款行来的中年女性庄重沉静,让人很难和印象中身穿T恤、活泼开朗的微软人划上等号。
她是微软中国技术中心(CTC)的负责人毕德兰,1981年到美国,2003年回到中国。毕德兰在大洋彼岸工作已有二十余年,而其东方女性的温婉恬淡却依然不改,与人们印象中IT行业快节奏、重表现的行业特点格格不入。毕德兰是微软为数不多的女性高管之一,探索毕德兰的成长之路,或许你会对性格与职业的适应性有新的认识。
毕德兰1981年到美国,读完硕士以后在华盛顿州工作,七八年后搬到西雅图。期间做了十年技术,之后转做管理,亦有十余年。2003年7月,毕德兰和先生带着两个孩子从美国搬到北京,开始了她在北京的微软生涯。
毕德兰读书时自认不善于和人打交道,想一辈子做技术。刚进入微软时,技术功底扎实的毕德兰学习快,加上独身一人在美国所培养起来的独立精神,因此随着行业经验的增加,使得她非常有自己的独立想法。在互联网热潮时,微软很多人都跳槽去了互联网公司,职位晋升“这才轮到我”,毕德兰说,“我当时觉得自己肯定不行,老板说,那你先代理试试吧。”这一试一路坦途,成就了一名微软优秀的女性高管。“这都是机缘。实际上,一个女人结婚以后管先生,生了孩子以后管孩子,都是积累管理经验啊。”
在上升到中层管理职位后,先生的支持使得毕德兰从来没有面临过工作与家庭的平衡问题。在成为高层决策者后,毕德兰发现,在中层强调的是表现能力,到了高层,强调的是决策能力,是与人沟通的能力。
从来没有计划要做管理职位的毕德兰成为一名优秀的女性高管,而这份工作,也挖掘出毕德兰从来没有意识到的自身的潜力。毕德兰介绍,即便在美国,IT行业的女性也相对少——职级越高,女性越少。毕德兰把一个公司的员工分成高中低三个层次,其中,初级职位上女性不少,但是到了中层以后,很多女性因为家庭原因,放弃了在工作上的努力。另外,IT行业所谓的成功,都是要好强、独立、有思考能力,这与传统女性从小受到的家庭教育相悖,而当她看见自己前后左右都是男性的时候,也很容易产生放弃努力的想法。到了高层,也就是三十到四十岁,女性要继续努力就更难,“男人好像是酒,越陈越香;女人是醋,越老越酸”。
在座谈会上,毕德兰很少说话,“我在听,听完以后表达自己的意见。而且最后说可以博采众长啊。”不说话的毕德兰在一席热火朝天的讨论者间显得突出,“但是这并不意味着我没有激情,只是我和别人的表达方式不同而已。”
在强调沟通和自我表现的今天,毕德兰的这个特点并没有使她遭遇职业发展的瓶颈,“我幸运地遇到了一位好老板,我的老板不认为说话少是一个缺点。实际上,老板并不一定认为说话最多、最响的人最好。大家都争得面红耳赤时,实际上没有人在听你说什么,因为大家都在急着表达自己的观点。而且,说话少、但是有自己观点的人会使老板觉得成熟稳重,敢把责任交给你。比尔·盖茨就不会说话,但是大家都很尊重他。”
“年轻人要有自己的选择,而选择一位赏识自己的好老板可以把你带得很远。”恬淡温婉并不意味着懒散和慢节奏。“我很喜欢上班!在生完两个孩子之后,我都是一天都没有耽误就去上班了。因为我不想与技术脱节,想尽量早地工作,我喜欢在办公室。” 现在在北京的毕德兰白天工作,下班回家带孩子,孩子睡了以后再继续工作,所以经常凌晨两点还在网上,周末是她补充睡眠的重要时间。
比起空降兵,毕德兰更喜欢自己培养人,但是CTC还不能给她这样的空间,“在CTC没有这样做过,因为业务需求的紧迫性使得我们不能等上五年。”毕德兰对于跳槽太多的人,主要判断两点,一是他是否属于有信心有耐心的人,二是看他的职业生涯是否每一步都在做正确的决定。“每一步都是每个人自己的选择,你是否对自己有规划和判断都体现在这里”。毕德兰认为,履历表能够决定录用与否的50%以上,而剩下的面试,则主要是观察一些软性素质,“如果可以和我很舒服地吃一顿饭,那么这个人被聘用也就差不多了。所以我们一般都会安排一次午餐。”
毕德兰对于中美员工的差异感触很多。“美国的员工刚毕业就很有独立思考的能力;中国员工聪明听话,但是不善于独立思考,领导说怎样便怎样,这样使得领导的责任感很重。在美国,做一个决策前,我向大家咨询,美国员工就会不客气地提出很多不同意见;但是在中国,员工大部分没有意见,领导提出一个决策,他便去执行。因此在中国要做头脑风暴,很辛苦,大家都在等老板做决定。中国的员工对老板没有信任感,一切都在等你做决定。”
明星般的技术专家
9月17日下午,微软中国技术大会的第一天。在最大的分会场门口,一位身穿浅黄色微软衬衫、平头的年轻人背着一个硕大的书包,被人围得水泄不通:
“测试人员的绩效考核如何进行?”
“在微软,如果计划在4月30日要完成10个BUG,但实际才找到7个是要被老板骂的!”年轻人回答问题斩钉截铁。
“这个方法有问题!”提问人不接受。
“但非常有效!”年轻人不容置疑。
“每个项目都面临工期紧、人员不足的问题,怎么办?”
“要沟通!管理不完全是科学,更是艺术!”
“微软的测试都是一对一吗?我们公司是二十对一!”
“那把你的老板叫来听我的课,我把他臭骂一顿!”
这位明星般的技术专家是微软项目经理、中国事务办公室经理栾跃。
“栾跃你好!我是周业,非常感谢你对我的帮助!”一位年轻人挤到栾跃身边,感激地说。这是一年前在微软技术大会上听过栾跃讲课的创业者,他得到栾跃电子邮件地址后,给栾跃发去了寻求帮助的电子邮件,得到栾跃持续不断的支持和帮助。现在,他的项目越做越大,公司已经从十几个人发展到四十几个人。“祝贺你事业上的成功!”栾跃热切地鼓励他。
时间已经是下午3点了,栾跃还没有顾上吃午饭,今天的午饭估计是泡汤了,但是栾跃似乎很习惯这种生活。栾跃计划写一本关于软件工程管理的书,李开复博士为他写的序已经就绪,但是这本已经耗时两年的书还没有诞生。“写书很难,因为工作非常忙,只能用中午吃饭、晚上下班和周末的时间写。老婆抱怨说,你天天干嘛,搞到半夜12点。非常累,很辛苦。本来想今年8月交稿,不过现在还差一两章。”
栾跃还没有写完的一两章的内容是有关国内大学应如何培养技术人才的观点。栾跃认为,教育不仅是培养人编程序,更要智商和情商并重。栾跃非常赞同李开复博士关于人品的观点,开复老师专门面对大学生的网站就是栾跃帮助建的。
“中国技术人才的培养不仅是技术能力,还有与人交往的能力、领导者风范、做人的品德。不能只是为了挣钱不顾一切。在海外,普遍中国人在与人交往上能力要差一点。我发动他们改变自己,他们说:‘要我们去和美国人交往,去说服他们,这是我的短处。为什么要用我的短处去和别人的长处比?’改变,这是他们害怕的事情。中国人在海外普遍还是比较害羞。印度人就不一样,非常强硬,善于沟通。”
除了微软的项目经理,栾跃还担任一个职务是微软中国事务办公室经理,主要任务是洽谈执行与国内政府、企业的一些合作项目以及促进微软的一些项目到中国做外包。他刚刚完成“振兴东北,培训中国东北100位企业家”的一期活动,“我安排他们和星巴克的营销副总裁见面,是希望通过了解星巴克怎样把一杯咖啡卖到全世界,而认识到传统老工业如何走向新的发展,国外企业又是怎样让自己的品牌突破地域的限制,怎样利用懂别国文化的人去打开其市场,怎样利用全球资源去提高自己企业的效率。”
栾跃的工作中还有一个很重要的部分就是把微软做的一些项目拿到中国来,做外包。微软成立了一个推动中国软件外包的小组,任务不仅包括对中国企业的培训。由于很多美国媒体没有正确地宣传中国,因此很多微软高层还对中国有错误认识。栾跃希望能把尽量多的微软高层带到中国来,让他们看看中国的真实情况。
无论是与高层政府官员的接触,还是与同事的交流,栾跃都强调一点:管理是艺术,而不仅仅是科学。
“我们每周的例会都鼓励明星,批评工作不好的人。这牵涉到微软文化很重要的一点,即作为一个项目经理,你怎样去管理人家,尤其是在你对人家没有行政管理权利的时候。这件事情的原则重要的是与人交往的能力。例如,有的人,你要指出他的问题必须要关起门来谈,如果当众批评他就会认为你冒犯;有的人,你必须在大庭广众之下批评,不然他不买你的账。不同环境要采取不同处理办法,我也是干中学,学中干。在过去我是一个好好先生,别人说不行,我就算了。现在我也变坏了,别人如果不干活,我就告他的老板,他的老板就会去说他。”

2008年5月29日星期四

网站版式设计欣赏

另类网站版式设计欣赏


当你在创建一个新网站的时候,希望这些网站富有个性的版式设计能给你带来灵感。
  
  Popmatik
  这是Rob Leach设计制作的一个个人网站,这个网站用了一个瓶子的底图,网站的内容都在瓶子的这个包装纸上。
  
  Digitalmash.com
  Digital Mash是澳大利亚的网站设计师Rob Morris的网站,这个网站的独特之处在于,Rob Morris把自己放在网站上作为背景,而且最有意思的是Rob手持着网站的内容。
  
  Melissahie.com
  这个网站运用了一种拼贴板块的手法,点击每个板块的链接,网站会引导你进入下一个板块去。在这里你会看到作者的个人简历,及相关内容信息等等。
  
  Evanescenceuk.co.uk
  这个英国风格的网站用的是一种横向的排版,导航的方式跟Melissahie.com 有些类似。观看者可以通过导航滑行到不同的内容面去。

  Sitotis.hr
  Sitotis的底图是一本装订的本子,内容就在这本子里面,标签就是网站的导航。
  
  Mussatto.com.br
  Mussatto用了一种很长的横排版式,但这也没有跟现行的网站的竖排版式相冲突。
  
  Danviv.net
  Dan Viveiros的这个个人网站摆放了很多盒式磁带。挺有感觉的。

  CraigEarl.co.uk
  摄影师Craig Earl在他的网站上运用的一大特色就是有四个长条的板块组成了网站四大板块的导航,分别指向日常的图片,风景,乐队,人物。
  
  JeremyCowart.com
  来看看另外一个有趣的摄影网站JeremyCowart.com,它可以让你更直接的找到网站上的图片。这比起要靠链接来找到图片要直观的多,这个网站还有一个很独特的细节就是,当鼠标停留在每一张图片上时,这张图片的内容文字就会出现在鼠标的旁边。
  
  Huge
  这个设计公司的网站把左边的大图作为一个导航,然后右边的边栏就放了一些介绍性的文字内容。

2008年5月28日星期三

从玩扑克到软件开发

从玩扑克到软件开发
(http://community.csdn.net/Mac_cm)

我以前不是做软件开发的。在加入ThoughtWorks两年之前,我主要靠玩扑克为生。当然,如果你曾跟我打听过我前臂上的纹身,那你肯定已然听过我的故事了。要是还没有,等下次我们一起喝一杯时,我可以讲给你听。
学习
我学习打扑克和学习软件开发的方式是一样的:尽可能多读书。我用两年的时间,读完了所能找到的每一本有关扑克的书。最后竟至39本之多。编程亦如是。此刻,我面前仍然摆着接下来要读的5本书;而在过去三年ThoughtWorks的工作中,我放火烧掉的书亦不在少数。
我认为,无论编程还是玩牌,阅读书籍、博客与杂志都是要想有所成就的必备条件;而若要以二者为谋生之业,仅靠读书却是远远不够的。也许你可以把书本上的一切知识都装入脑中,但知道在何时应用何种规则,这才是真正高手的标志。
诚然,开卷有益。但总要走过万里路,方能对应用特定技术的具体环境烂熟于心。书本不可能把所有情况都囊括一空,只有通过亲身体会得来的经验,才能让你在某些状况下为自己或是雇主做出快速而正确的决策,而这些决策可能价值几千乃至数百万美元。
经验之宝贵,世间无物可代。
艺术的巅峰
你可以设计出击败普通扑克玩家的计算机程序。遵守一些基本规则,自然就可获胜。但迄今为止,还没有任何程序可以击败最好的扑克玩家。因为扑克技能达到巅峰时,也就成了一门艺术。软件开发亦如是。要想成为一个还行的开发者,只要遵循一系列最佳实践即可。如果按照经典参考指南一类的书籍行事,开发出还不错的应用程序应该不成问题,而且效果会胜过其他最常见的做法。有了这么多失败的项目作为前车之鉴,我相信,还不错的应用就足以令大多数管理层甘心掏腰包了。
当然,有些经理有更高的标准。在银行、创业公司、医疗系统等领域,标准则更为严苛。“还不错”自是远远不够。那些经理会很乐意为最佳选择买单,他们期待的是远超常人的技能。但问题在于,专家级程序员的技能与普通程序员不同。普通程序员知道做事的方式;专家知道做事的目的。普通程序员会僵化跟随模式书籍中的指示,就如遵守参考指南一般;专家则明白对模式的创新可能会带来指数级的性能改善。
他们看到的绝非同一个世界,所以普通程序员很难跟专家对面交流。做艺术评论家易,做优秀的艺术评论家难。
决策技能
在扑克和编程中有一条绝对真理:几乎没人能像他自我感觉的那么良好。有自知之明是不错的开始,但人们依然很难知道自己与专家之间的差距。程序员接触专家的机会并不多,也就无法公正评判自己的技能。在牌桌上,每个人都是为了锦标而来,可大多数人都会过高评价自己的牌技,这总是让我惊讶不已。
程序员之间亦是如此,而且大多数人可以获得的信息更少得可怜。一个从不参加任何大会的技术领导人,只能跟自己的团队成员一比高下。当然,他可能已经很优秀了,否则也不会成为技术领导。但如果与整个行业中最出类拔萃的人相比,他又处于什么位置?如果觉得在自己的圈子里已经一览众山小了,那碰到不同意见时,他又会作何反应?有些人会视之为学习的契机并为此感到兴奋,但绝大多数都会对不同意见嗤之以鼻。
团队协作
乍看上去,扑克是一种彼此对抗的游戏。但事实很少如是。即使在赌注最小的牌桌上,通常也至少会有几个人常打交道。他们不会达成条件一致对付牌桌上的其他人——他们也不必如此。大家都明白一条道理:你不是要去跟牌玩得好的人对着干,赢他们的钱,而是要从水平低的人身上赚钱。专业牌手甚至会像一个团队一样协同工作。有些人彼此利益相关,故而一人得利则众人均有收益。他们不仅互相了解,而且认识很多人。如果出现一局精彩牌局,楼层经理会跟他们打招呼;侍者会为他们的对手调制酒精度高的饮品;和手(即发牌者)会故意“犯错”以影响某人心情(很少有人在心情不好的时候能够打好牌)。每个人都在协同工作,确保大家都能挣到钱。
颇为有趣的是,程序员的情况也与之相似。很多人都坐在格子里,完全依赖自己解决问题。他们往往工作在代码个人独有制模式之下。我曾亲眼目睹,在这种程序员交付的应用中,集成问题一直都是大家的心病。而更为不幸的是,集成之痛还只是最小的问题。假设IT部门把业务需求锁定为500页的需求文档。如果公司决定改变业务方向,随之而来的系统变更需求将令人痛不欲生。数以百万计的金钱付诸东流,因为程序员开发的特性已不再具备业务价值,而IT部门还没有找到更好的方式来应对业务变化。
当然,情况并非总是如此。专家懂得协作。他们会跟其他专家协作,但也不排斥与经理、客户、业务部门、分析师、质保人员,以及所有可以为成功贡献力量的人协作。他们胸怀大局:只有协作,才能让每个人有所收获。
度量
雄心勃勃的牌手常常讨论他们赢了多少手牌,又输了多少手。他们讨论最多的还是本该赢但却输掉的那几手牌。有时人们会犯错误输钱,但他们一般都不会记得这几手是怎么输掉的。相反的是,如果有些牌局只是因为手气不好而输掉,他们就会记得那一局中的每一处细节,他们还会在故事中透露对手必然获胜的几率,来证明自己根本没有胜出的机会。真正的牌手知道他们输掉过多少手牌,以及失败的大概几率。他们懂得度量。而且专业牌手会专注于重要的度量标准。你赢了多少手,输了多少手,这无关紧要;重要的是你赢了多少钱,输了多少钱。而且,为你的狗屎运(译者注:bad beat,即开局时输家比赢家牌好,赢的几率更大,但关键时刻赢家却来了更好的牌。碰到狗屎运——take a bad beat——用来形容输家,来了狗屎运——lay a bad beat——用来形容赢家)苦恼实际上等于替你对手的牌运犯愁。既然你的收入来自于对手的错误,那你就是在抱怨为什么对手把钱给了你。
有度量标准是好事,不过专业人士懂得哪些标准重要,哪些只会分散注意力,哪些介于二者之间。
软件开发也有很多度量标准,而且有很多标准身上的光环已经远远超出了它们所应有的范围。例如,知道代码行数几乎不能带来任何价值。复杂应用需要相当多的代码,但这个“相当”到底是多少?它得依赖于语言、工具及其他因素。
修复的bug数量也是个很有趣的话题,只是略逊于前一个。为什么人们会在乎修复了多少个bug?Bug数量也许有其价值,但是修复的bug数目并不能为我们带来多少有用信息。
特性完成率是我自己最喜欢把玩的一个标准。除非我们使用特性来评估工作量,否则知道完成了多少特性又有何用?而且,如果已经对工作量做出了评估,那为什么不把剩余工作与已完成工作相比较,从而得到工作进度呢?我很难从特性完成率中看到价值所在。
代码覆盖率让我想起了记录狗屎运。这项度量是有意义的,但很多人都没抓住重点。代码覆盖率低意味着可能有问题存在,但是代码覆盖率高只能表示你有一个很大的代码覆盖率数值。高代码覆盖率与高质量之间没有必然联系。
注意人,而不是逻辑
如果看过有玩牌镜头出现的电影,你大概听过这样一句话:你不是在与扑克玩,而是与人玩。此言极是。牌手无疑都是心理学家。有时你确实需要某些牌,但拿一手好牌只是赚钱的一部分而已。一旦有了好牌,你就需要知道怎样利用好它们。你是应该加注,还是先让牌然后加注,还是彻底让牌,还是跟进?这些做法依赖于很多因素,但关键还是要了解牌桌上的对手。当你得到一手好牌,首要目标就是尽可能多地从对手那里赢钱,而达到这种目的的唯一方式则是想办法让对手给你更多的钱。了解逻辑可以帮助你赢得几手牌,了解人则可以帮助你赢钱。
在交付软件时,人处于同样重要的地位。如果软件只是让一切工作起来,那只要把它变成自动化的工作,事情就容易得多了。但软件却远非功能组合这么简单。在一场高尔夫球比赛中,人们会卖出软件包;在全家到迪斯尼免费旅游时,人们会签下软件服务合同;为了避免法律纠纷,人们会履行合同去构建已经毫无用处的软件;为了超越竞争对手,人们会使用软件来加快业务响应速度。
人们使用软件、开发软件、维护软件,或是在某种程度上依赖软件。软件开发与这个世界有着千丝万缕的联系,要把洋洋洒洒的变量组合成简单方程,生产出高质量的软件,又与登天何异?但是,软件开发高手需要考虑每个人引入的所有已知与未知的变量,做出他们力所能及的推测。知道应该做什么会让你受益,而知道必须做什么所带来的价值却是难以衡量。了解逻辑可以帮助你交付应用,了解人则可以帮助你交付价值。
在残缺的信息下工作
有关这点,刚开始打牌的人处理的非常好:打好每一手牌,老老实实押注,从不虚张声势。这便是了,新手就应该只做该做的事情,除非你的钱多得没地方花了。难点在于如何从初学者的水平提升。大量信息霎那间纷至沓来,你需要注意牌桌上每个人的每一处细节:他们怎样交流,你从前跟他们每个人打过什么交道,他们所钟爱的玩牌方式,谁在赢,谁在输,凡此种种不一而足。而且,你也不可能知道对手手里的牌是什么,下一张牌又是什么。你所拥有的信息已超出所能处理的极限,而且这远非全部。
编程亦如是。领域专家无所不知,但把一切都向你倾囊相授却毫无意义。何况,你也不一定需要所有的领域知识。你需要熟悉团队,但同事总有些事情是你永远无法知晓,或者不能完全理解的。不过,编程高手能够把必要的领域知识融会贯通,掌握团队的动态,并始终提供技术上的真知灼见。他们知道他们永远无法成为百晓生,他们知道什么事情值得思考,哪些应该置之不理。纵使面前汹涌澎湃的信息仍是残缺不全,他们也总能做出正确的决定。
即时反馈
普通牌手在反馈信息少的游戏中表现最好。因为牌手是根据信息而赢钱的。在5张牌梭哈中只有一轮押注的机会。各位玩家只有一次机会来分析你给出的信息,而你也只有一次机会犯错。专家级牌手更喜欢多轮的游戏。游戏中的回合数越多,他们就有越多机会从低水平的对手身上捞到好处。他们喜欢即时反馈,并根据反馈做出调整。在有多个回合的游戏中,每一个回合都可以得到反馈,专业玩家就会根据当前局势调整打法。
编程高手同样喜欢即时反馈。从业务人员即时反馈回来的信息,可以避免你在构建业务应用时走上弯路。从另一个程序员即时反馈回来的信息,可以在软件产品化之前发现bug。持续集成服务器可以提供即时的集成反馈,从而避免集成之痛。喜欢敏捷的人能马上说出迭代是一个有着显著成效的实践,因为它可以让程序员和业务人员得到即时反馈。不过,作为一个编程高手,纵使他不喜欢敏捷,他也能够意识到即时反馈的价值;即使在非敏捷的环境中,他也会争取得到更多的反馈,从而避免浪费时间精力。即时反馈可以让你了解前行的方向正确与否,每一个专家都会珍视这些信息。
上下文为王
无论扑克还是编程,没有绝对正确或是绝对错误的选择。如果你有一对K,那么在翻牌之前你该不跟么?也许吧。这要看你是在打比赛还是赌钱、有上限还是没上限、你坐在哪个位置上、你是否已经不跟过一次还是已经封顶了等等。我在扑克中学到了一点,那就是在给出答案之前,一定要综合考虑所有的因素。
在编程中沉浸的时间愈久,同样的体会在我心里就愈加深刻。Java在有些时候是不错的选择,但它并非万能。所有的编程语言均如此。工具亦然。Hibernate很不错,但它不适用的地方还有IBatis,当IBatis也不适用的地方还会出现或自己创造新的解决方案。几乎没有一款解决方案能够绝对有效,它只有在恰当的形势下才会发挥应有的作用。在错误的环境中,它也许会成为毒药。
所以,面对一门新的语言或者工具,无论是你是打算弃若敝履,或是爱不释手推而广之,不妨先想想它的适用环境,尽量做到对症下药,量体裁衣。