社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 银行

  • 219973阅读
  • 1107回复

软件编程杂谈文章汇总

级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 29楼 发表于: 2010-10-23
C++编译器的函数编译流程

C++中的类型查找过程相对简单,基本上就是名字查找,这里不再介绍。对于 .cpp 文件中调用的一个函数 ( 或成员函数 ), 编译器主要做了下面三件事情 :
1 、名字查找 。
先在所在编译单元中可见名字实体中进行名字查找 。
(1) 类成员函数优先 ( 对象所在的类 -》 基类 )。 一经找到就停止查找 。
(2 )如果没有 ,在相应的名字空间中做进一步的搜索 ; (3) 如果还没有 , 会根据函数参数所在的名字空间中查找 (keoning 查找 )。
2 、重载决议 。 根据所找到的名字进行重载决议 , 根据参数最匹配原则选择相应的函数 。
3、可访问性检查 。 用以确定被选中的函数是否可被调用 。
说明 :
1) 根据第一条 , 显然 , 如果类型想和非成员函数一起工作 , 那么它们应该放在同一个名字空间中 。 比如 , 一般类型的重载运算符和参数类型放在同一个头文件中/或者同一个名字空间下 。
2) 函数特化模板不参与重载决议 , 因此 , 如果想运用某个函数的特化 , 最好的方法是重载该函数 , 在实现中采用该特化来工作 。
3) 重载决议发生在可访问性检查之前 。 因此 , 如果私有函数不幸参与了重载 , 并且被选中 , 最终也会出现无法访问的编译提示 。 这常常隐含二义性 , 这样的设计本身也不合理 。 换句话说 , 私有参数 , 在名字查找和重载时并非是 ” 私有的 ”。
以 c.Twice( 21 )的函数调用为例:
a) 名字查找:编译器会首先寻找一个至少包含一个名字为 Twice 的实体作用域(类,文件,或者名字空间),并将候选函数放入候选实体列表。例子中,编译器首先从对象 c 所在类实体中进行查找,找到就停止;如果没找到就会依次在其基类和外围的名字空间中查找,直到找到一个至少含有一个候选函数的作用域。两点需要注意: 1) 只要找到一个实体就停止查找,所以并非所有的同名函数都会被考虑; 2) 参数所在名字空间也属于查找范围(keoning 准则) 。
b) 重载决议:从所找到的候选重载函数列表中选出唯一最佳匹配 。如不唯一,就存在二义性。注意: 1) 这是基于名字查找结果的; 2) 特化的模板函数不参与重载。
c) 可访问性检查:确定所选出的函数是否可访问。这是最后一步,晚于重载决议。
文章中的规则非常重要,理解后,很多C++的编译问题就自然解决了。后面将会有进一步的文章来介绍:如何确定C++每个编译单元(CPP文件)中的可见名字(与名字查找相关);Keoning查找详解; 重载 (Overload) 和虚函数的重实现 (override).
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 30楼 发表于: 2010-10-25
早期著名程序员现状
1986年,Susan Lammers采访了计算机业内的领军人物,19位著名的程序员和软件设计师,写成了《Programmers At Work》。今天,这些著名程序员又身处何种环境,从事何种职业?2008年Leonard Richardson曾经整理出一份简单介绍,2010年ITworld的一篇文章详细介绍了他们的过去和现状:电子表格程序VisiCalc作者之一的Dan Bricklin现在运营一家叫Software Garden的小公司,它的产品包括iPad应用程序Note Taker。他还担任顾问和进行演讲。


游戏吃豆人的作者岩谷彻目前在Toyko Poly-Technic做全职讲师。


Framework办 公软件的作者RobertCarr同时也是公司的联合创始人,Framework在1985年被Ashton-Tate收购,Carr任新公司的首席科学 家,Borland在1991年收购了Ashton-Tate,而Carr相继担任过AutoCAD Market Group的副总裁,一家Web2.0公司的CEO等。现在,Carr处于时而工作时而休息的状态下,他参加铁人三项运动,到墨西哥旅行等。


微软创始人比尔盖茨现在是慈善家....
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 31楼 发表于: 2010-10-25
程序员的故事
通常来说,和从事程序开发的同行们聊聊关于某个经理的糗事,或者某款编得一塌糊涂的软件,是一件非常有趣的事。面对困扰软件开发行业的菲薄待遇和缺乏竞争这两个问题,这是个应对方法。我最近听说了一件事,让我着实一惊。一个开发人员和我分享了几个月前他找工作的经历。当时,他的长期合同到期了,公司暂不打算招人,所以他不得不找工 作。作为一名有竞争力的资深开发人员,他轻松拿到了两份Offer。虽然其中有份工作的薪水不如另一份高,但工作地点离家很近,并且他家小孩才两个月大, 所以他决定接受那份工作了。


他到公司报到后便开始了工作,后来要发工资了。结果他拿到的薪水比Offer中提到的要少得多。项目经理总是拿公司的财政制度说辞,但他是给一家大公 司工作,并且这家公司用来买办公室打印机墨粉的钱可能都比他的工资要多。实际情况是:项目经理是分包合约的,他只想从中取得更多钱而已。


事情就这样悲剧的发生了,而这仅仅是开始。那时,我见到了他,坦率的说,他并没有什么个人问题。事情经过是这样的:他所做的软件和系统中的另一部分对 接,而这部分也是那位项目经理负责的。因此,这位项目经理坚持认为,软件的性能问题是那位仁兄使用的码基导致的,而不是其他人。即便后来分析器验证并非如 此。大家还记得我以前戏仿过那个“开发人员"驱动开发(DDD)吧,那么,这次是“我不想要”驱动开发(IDWDD)。


后来,薪水开始发得越来越晚。甚至连比最初接受的那份工资还少的工资都没有了。


那时,他已经有两个孩子了:一个四岁,另一个只有两个月大。他老婆(也是开发人员)生完小孩不久后,也回归岗位上班。白天要上班,晚上要照顾孩子,这样的生活已经使她变得麻木了。


就只是变本加厉的努力工作吗?不!为了给宝宝节省钱买尿布,他们还在申请注册Costco会员。


编者注:Costco是一间大型会员制连锁批发零售市场,采用会员制购物方式,会员只需要每年交40美元会费就能以低于市场价5%-30%的优惠价买到所需商品。


所以开发人员都应该听说过别人称我们为“资源”。我们就像可更换的齿轮一样,在不同的团队和项目中之间轮换。


我确信,当管理层不把程序员当人看时,他们可以轻松地谈论招人和裁员。
我确信,当你不把程序员当人看时,你可以轻松裁员,把项目以每小时7美元的价格外包,然后再雇佣同样的开发人员来修复(或重写)你那糟糕的软件项目。
我确信,当你不把程序员当人看时,你可以轻松用停车位测试方法来判断效率和能力,无须用心来评估项目、进度和质量。
我确信,当你不把程序员当人看时,在你知道程序员们江郎才尽要暗淡出局后,你可以轻松压榨他们,无须去投资忠诚又高效的劳动力。


事实既如此:公司不太在乎你,管理层大概也是这样。如果想改变这种现状,那就自己主宰自己的事业。作为有竞争力、思维缜密的开发人员,如果我们相互依靠的话,情况应该不会太糟。


庆幸的是,这个故事有个圆满的结局。他和以前公司的经理通了电话,得知公司开始招聘了。在离开两个月后,他又回到了原来的公司。毕竟,《优秀的开发人员》总是供不应求。现在是,将来也是。
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 32楼 发表于: 2010-10-28
如何才算程序员老手?
除多年编程经验之外,还有什么能区分一个程序员是“老手”还是“新手”?编程技巧当然是一部分,但它绝非是全部。聪明的程序员可能比他们的同行拥有更出众的编程技巧,但那不足以说明他们就是“老手”。同样,仅仅因为拥有10年编程经验也并不意味着他们就是高手。在工作岗位上,拥有多年编程经验也不能说明问题。即便没被炒鱿鱼,那也不能提升你的价值。


下面列举的事情是大多数高级程序员都会做的。


1.至少掌握一门编程语言


我相信有些优秀的程序员只懂(并精通)一门编程语言,但在某种程度上而言,这其实会限制一个人的思维。就像当你手拿一把锤子时,任何东西看起来都像钉 子。我认为,知道并成功使用至少一门编程语言,这是程序员从新手走向老手的重要一步。我要说的是,像JavaScript和SQL这样的辅助编程语言,只 有当你确实已经开发了完整的应用程序,并在其中使用这些编程语言时,它们才有价值。


2.工作之余也经常编程


我抱怨过把开源作为招贤的一项要求,但那仅仅因为许多充满激情的程序员把时间花在别的地方。除了对开源有所贡献,你还可以做兼职顾问,兼职创业,开发自己的产品或者创办自己的微型软件公司。当然,你也可以尝试从外部接些兼职项目,可参考伯乐在线的这篇《成功接项目需要注意的几个要点》。 


注:mISV即MicroISV,是一个只有一名员工组成的软件公司,是一种微型公司。


3.经历完整的软件开发过程,从概念设计到产品实现,再到产品维护


有的程序员希望不用自己动手就可以得到详细的设计说明,然后把缺陷代码交给测试/维护小组,这是平庸程序员的一个缩影。任何称职的程序员都会跟客户密切合作,去制定需求分析,然后编码实现,当然也要维护。如果你在编码实现阶段偷懒了,那你在维护阶段不得不付出代价。


4.不断创新


创新就是做一些你身边的人没有做过的事情,用来改善你的过程或产品。你不一定非得是世界上第一个做这件事的人,只要发现一个问题,找到解决方法然后实现它就行。


5.编写的软件能解决实际问题


有一副虚构的场景:一名黑客,仅仅是出于对技术以及自己所做事情的爱,一天到晚都在编写代码。但这几乎无助于成就一名优秀的开发者。事实上,我曾见过 有些开发人员和客户争论,来采用更好但不太有助客户的技术。这会适得其反。你可以利用自己的时间来完善。但涉及工作时,你最好还是编写能实际改进并解决问 题的代码,而不是使用那些不同寻常的算法或接口。


编者后话


这些问题对于任何想成为高级开发人员的朋友来说,都合情合理。因为这些问题和拥有多少年编程经验并没有关联。如果你能做到上面4-5条,那你就是高级程序员。如果只有1-2条,那你还需要加油努力。


当然,在面试中,设置一个简单的“是或不是”问题,通常是一个衡量自己的小练习。更重要的问题会是“你能给我们举例介绍一下吗?”


你的高级程序员测试得分是多少?你怎么看待这些问题呢?对高级程序员来说,其中是否多余的吗?或者你认为还有其他条件可以判断他人为高级程序员? 欢迎在评论或微博中分享你的观点。
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 33楼 发表于: 2010-11-13
资深程序员的20条编程经验
原文作者乔纳森·丹尼可(Jonathan Danylko)是一位自由职业的web架构师和程序员,编程经验已超过20年,涉足领域有电子商务、生物技术、房地产、医疗、保险和公用事业。正如乔纳 森在文中所言,本文适合刚毕业的大学生和刚入门的程序员。如果你已是高级开发人员,或许你在本文中看到自己的身影。






从11岁时,我就一直在编程,并且一直都很喜欢技术和编程。这些年来,我积累了一些艰难又容易的经验。作为一名程序员,你或许还没这些经验,但我会把它们献给那些想从中学到更多的朋友。


我会持续更新这些经验,我可能还会有更多的感想,但就我这20年来看,我想下面这个列表中基本不需要增添额外的东西了。下面就是我至今最难忘的经验。


1. 估算解决问题所需要的时间。不要怕,承认吧!我曾见过一些程序员为了解决一个特殊问题而坐在显示器前面8小时。为自己定一个时间限制吧,1小时、30分钟或甚至15分钟。如果在这期间你不能解决问题,那就去寻求帮助,或到网上找答案,而不是尝试去做“超级堆码员”。


2. 编程语言是一种语言,只是一种语言。随着时光推移,只要你理解了一种语言的原理,你会发现各种语言之间的相似之处 。你所选择的语言,你应该觉得“舒服”,并且能够写出有效(而且简洁)的代码。最重要的,让语言去适应项目,反之亦然。


3. 不要过于注重程序的“设计模式”。 有时候,写一个简单的算法,要比引入某种模式更容易。在多数情况下,程序代码应是简单易懂,甚至清洁工也能看懂。 


4. 经常备份代码。在我年轻时,我就有过因硬盘故障而丢了大量代码的经历,这经历很恐怖的。只要你一次没有备份,就应当像有着严格的期限,客户明天就需要。此时就该源码/版本控制软件大显身手了。


5. 承认自己并不是最顶尖的程序员 - 知不足。我常想,我对编程了解已足够多,但是总有其他人比你优秀。正所谓,“一山总比一山高”。所以,向他们看齐吧!


6、学习再学习。正如第5点所说,我经常会在手里拿一本计算机或编程相关的杂志或书(不信,可以问我的朋友)。诚然,总有很多你不知道的技术,你可以从中学习以保持不落后。如果你有一种灵巧的方式来获取你需要的新技术,那你每天都应该坚持学习。


7. 永恒的变化。你 对待技术/编程知识,就应像你对待股票一样:多样化。不要在某一特定技 术上自我感觉良好。如果那种技术或语言已经没有足够支持,那你还不如现在就开始更新你的简历,并启动培训新计划。我能保持前行的主要原则是什么呢?至少了 解两到三种语言,所以,如果某种语言过时了,你在学习新技术的时候还可以依靠另一种语言。


8. 提携新人。协助并且培养初级/入门的开发人员学习优秀的编程方法和技巧。也许你还不知道,在帮助他们向更高一层前进时,你自己也在向更高一层提升,你会更加自信。


9. 简化算法。代码如恶魔,在你完成编码后,应回头并且优化它。从长远来看,这里或那里一些的改进,会让后来的支持人员更加轻松。


10. 编写文档。无 论是Web服务的API,还是一个简单的类,你尽量编写相应文档。我曾经引以为豪的代码注释,因过度 注释而有人指责。给三行代码加一行注释,只需要你几秒时间。如果那是一个比较难以理解的技术,千万别担心过多注释。如果你能很好做好自己的工作,大多数架 构师、后备程序员、支持组都会感激你。


11. 测试、测试再测试。我是一名黑盒测试粉丝。当你完成编码后,你“被认可”的时候就开始了。如果你们公司有QA部门,如果你的代码中有错误,那你得到的评论,会比项目经理还多。如果你不彻底测试自己的代码,那恐怕你开发的就不只是代码,可能还会声名狼藉。


12. 庆祝每一次成功。我见过很多程序员在解决编程技术难题后,会和同伴握手、击掌或甚至手舞足蹈。每个人在生命中都会碰到“顿悟”。如果一个程序员高兴地跑来叫你去看他的非凡代码,也许你已经看过这样的代码100遍了,但你也应该为了这个家伙而庆祝第101次。(编者注:《庆祝成功的九种方式》。)


13. 经常检查代码。 在公司,你的代码要经常检查(包括自查和其他同事检查)。不要把别人的检查,看成是对代码风格的苛求。应该把它们看作是有建设性的批评。对个人来说,经常检查你的代码并且自问,“我怎样才能写得更好呢?” 这会让你加速你的成长,让你成为一个更优秀的程序员。


14. 回顾你的代码。在 看到自己以前的代码时,通常会有两种方式:“难以至信,这代码是我写的”和“难以至信,这代码是 我写的”。第一种往往是厌恶的语气,并在想如何改进它。你也许会惊叹,旧代码也能复活成为一种更好的程序,甚至是一个完整的产品。第二种通常带着惊奇和成 就感。开发人员应该一到两个自己完成的项目成果,能让众人不禁而立并注目而观的项目。同样,基于你优越的编程能力,你可以把过去的程序或项目拿出来,把它 们更新为更加优秀的产品或想法。


15. 幽默是不可缺的。在我20年的开发生涯中,我还没有碰到哪位程序员是没有幽默感的。实际上,干我们这行,幽默是一项必备品。


16. 谨防那些无所不知的程序员,不愿分享的程序员,还有经验不足的程序员。当你遇到这几种程序员时,你自己要谦虚。无所不知的程序员,更想当一个英雄而不是团队成员;保守的程序员则是在编写着他们独享的代码;而经验不足的程序员则会每十分钟就来问你一下,当代码完成后,代码已经是你的,而不是他们。


17. 任何项目都不会那么简单。朋 友、家人和同事曾请求我仓促做一些事情,仓促做一个程序或者网站。对于这样的事,应该 从双方做计划,才能做出令两方都会满意的东西。如果某人起初只是需要一个使用Microsoft Access的、只有有3个页面的网站,但来就很可能变成一个有15个页面的网站,并使用SQL Server,有一个论坛,还有一个定制的CMS(内容管理系统)。


18. 任何时候不要想当然。假如你承接一个简单的项目,你可能会认为某个部分可以轻松完成。千万别这样想!除非你有一个类、组件、或者一段已经写好的代码,并且在现有的项目已经测试通过。不要认为这将是很容易的。


19. 没有已经完成的软件。曾经有一位程序员告诉我,没有软件是已经完成的,它只是“暂时完成了”。这是明智的忠告。如果客户还在使用你写的程序,并经受了时间的考验。如果有机会,你仍在更新它,这并不是什么坏事,这让你不断地前行。


20. 耐心是一种美德。当 客户、朋友或家庭成员用电脑的时候,他们也许会受挫,进而想砸电脑,或气冲冲地离开。我一直在 告诉他们,“是你掌控电脑,不是电脑掌控你。”对于用作编程的电脑,你要有一定的耐心。一旦程序员知道问题所在后,他们就会站在电脑的角度看问题,并且说 “哦,这就是为什么它是这样做。”


编者后话


对本文深有感触!虽然本文没有华丽的辞藻,其中朴实的道理,其实并非只适用程序员,同样可以扩展到其他行业。记得以前练字时,总感觉当时写得很好,但后来回头再看时,也会想“这居然是我写的字!”


在阅读本文的朋友,不知你是否也有看到了自己的身影呢?欢迎你在微博或评论中和大家一起分享感触。
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 34楼 发表于: 2010-11-20
编写可维护的代码

可维护性我认为主要由两个方面构成, 一是可读性, 也就是代码要能让人看懂; 二是可调试性, 出了问题可以很快的找到原因. 市面上讲设计的书很多, 但大部分侧重于灵活性和可复用性, 比如面向对象设计和设计模式等. 灵活和可复用并没有什么错, 但我认为可维护要更重要一些, 试想如果一个模块非常灵活并被大量复用, 却不可维护, 岂不是不出问题则已, 一出就是灾难性的吗?

再看C++语言, C++是一个提供了太多特性的语言, 每一件事情都可以用好几种可选的特性去实现, 但我们应该选择哪一种呢? 显然应该是最合适, 最实用的, 而不是最新最酷的.

从05年末到09年初, 我得到了一个非常难得的机会: 把一个项目做了两遍. 第一遍的时候用了很多C++的高级特性, 也有意无意的引入了一个设计模式的思想, 项目也还成功, 但后续的维护却越来越难. 后来在做第二遍的时候, 受《UNIX编程艺术》等的影响(也就是在这时候我成了把C++当C用的程序员), 开始学习用最简单直接的方法解决问题. 而结果也相当好, 不光项目成功, 整个系统的可维护性也不错. 而且虽然设计时完全没考虑面向对象, 设计模式, 但最终的系统却又带着这些东西的影子, 只是实现方法和书上写的不完全一样. (呵呵, 吹大了 欢迎大家对这一段扔几个西红柿鸡蛋之类的).

现在由于工作变动开始维护另一个系统, 这是一个很C++, 很面向对象, 也很设计模式的系统, 可是维护起来却无比困难, 出问题后简直无从下手. 所以更体会到了可维护性的重要, 进而想到应该把自己的这点经验总结一下, 写出来. 目前总共有四五篇的题材, 都是很细节的问题,  希望自己能坚持写完. 我的方法也许不那么漂亮, 但应该还实用, 毕竟也算是真刀真枪的实战中总结出来的.

因为一发出来就被批了个体无完肤, 所以加上了这些文字, 说明一下背景. 不太喜欢口水仗, 后续的批评我将不再回复, 因为软件开发是工程而不是艺术, 工程讲究实用, 没有绝对的对和错, 一切都应该根据实际情况具体问题具体分析. 我写的东西只是供大家参考, 没有也无法强迫大家一定要用.

下面开始正题. 如果我们要实现一个类, 用于从流式缓冲区读出数据(典型应用是网络通讯中的数据包分析), 你会用下面哪种实现呢(错误处理用的是异常, 与主题关系不大, 故不详述)?

// A实现
class CBufferReaderA
{
 ...
 template<class T>
 CBufferReaderA& operator>>( T& v );
 ...
};

// B实现
class CBufferReaderB
{
 ...
 char ReadChar();
 short ReadShort();
 int ReadInt();
 ...
};

我想不少人会选择A, 因为看起来更酷一些, 而且只写了一个模板函数就可以处理一大堆数据类型了, 但实际上, 如果从可维护性和实用性来说, B却更好一点. 下面就来对比分析一下.

1. 像cin/cout一样, A实现能把多个操作写在一起.

CBufferReaderA br;
br >> a >> b >> c >> d;

这一点B是作不到的, 因为它的返回值被用来返回实际读取的内容了. 可是当我们调试A实现支持的那一串代码时, 问题就出现了, 整个代码虽然是好几个函数调用, 但一下就执行过去了, 根本没法看到中间结果(VC是这样, 其他调试器不清楚). 为了避免这个问题, 只好把这一串操作拆成单个的, 但这样一来A和B也就没什么区别了.

2. 如果需要跳过一段数据, 需要怎么做呢? 如果用A实现, 肯定是类似下面的方法:

int tmp;
br >> tmp;

而B实现则可以直接:

br.ReadInt();

对比可见, A实现不光多用了一个没有什么实际用处的变量, 而且多写了一行代码. 只看这一点也许没多大问题, 但如果程序很大, 类似需求很多, 它带来的混乱就不可忽视了.

 3. 缓冲区中是char型, 但我想用int保存读出的数据, 应该怎么办?
A实现:

char c;
int i;
br >> c;
= c

B实现:

int i = br.ReadChar();

我想B的优势不用我说了吧.

 4. 前面说到的A缺点也许还不算太严重, 下面这个应该就有足够的说服力了.
A实现:

br >> a;
br >> b;
br >> c;
br >> d;
br >> e;

B实现:

= br.ReadChar();
= br.ReadShort();
= br.ReadChar();
= br.ReadInt();
= br.ReadInt();

看出问题了吗? 没错, 在B实现中, 我们很容易的知道每步操作从缓冲区中读了多少数据. 而如果用A实现, 这些信息就不那么明显, 必须去检查各个变量的定义, 也许你会说VC里面把鼠标放上去就能看到定义, 但也别忘了一次只能看一个, 而B则可统观全局. 如果是个很大的程序, 那B的可读性和可调试性要高很多.

 5. 对B的一个批评是暴露了实现细节, 把读了几个字节清晰的写出来了. 但我认为这恰恰是它的优点, 因为只有应该隐藏的细节才需要隐藏, 而这里, 知道读几个字节对缓冲区分析来说非常重要的, 是不应该被隐藏掉的. 无限制的隐藏细节只会给自己找麻烦. 打个比方, 把路的细节隐藏起来, 方法之一是把眼睛蒙上, 我们又怎么走路呢?

 6. B相对于A也有一个缺点, 就是A可以通过重定义>>运算符, 让自定义类型和原生类型使用看起来完全相同的方法被读出来, 但一般来说, 这一点的艺术性远大于实用性, 而且考虑到前面所有的缺点, 它不足以成为我们选择A的理由.
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 35楼 发表于: 2010-11-22
如何成为一名专家级的开发人员

原文作者Jenkov是一位丹麦资深开发人员,从事软件开发已有十多年。常有读者咨询他,“怎么才能成为一位专家级的开发人员?”(这个“专 家”不是头衔,应是指硬实力,“成为专家”和“被视为专家”是两码事)。所以他在下文中给出了相关建议。另外,他也提醒到,这些建议因人而异、因所用技术 而异,并非适合所有人。


什么是“专家”?成为“专家”需要多长时间?

在我开始讨论如何成为一名专家之前,我们一起来花上30秒时间,看看专家的定义,还有成为专家需要多长时间?

在使用某一技能三个月后,你还不是专家,即便使用时间是三年,你还不是。马尔科姆·格莱德威尔在《异类》一书中指出,成为一名真正的专家,需要 10000小时。10000小时!如果一天用10小时,每天都学习,则大概需要3年时间。如果一天5小时,一年学习200天,则大概需要10年时间。10 年!

根据这一说法,我想起来,我曾在有3年开发经验时,自认为是一个专家级或高级开发人员。如今,在2010年我已有约10年经验,我已经知道,自己已经掌握多少东西,还有多少东西尚未知晓。现在,我已觉得自己不再是一名专家了。

此外,在过去10年当中,这一行业(Java企业级开发)已经发生了翻天覆地的变化,所以我过去掌握的技能,已不再“风光”。所以,即便你是专家,你可能也会发现自己正在过时,不得不重头开始。

还有一件事:你不可能是全才(即:各个领域的专家)。这也就是说,你或许在某一技能上比张三优秀,但张三在另一技能上或许比你优秀。你不可能在任何方 面都比别人优秀或比不上别人。你总是能从他人身上学到东西。(更不能因为别人使用的技术和你不同而去攻击他人,只要别人不是一无是处,你就可以从他们那里 学到很多东西。正所谓,“三人行必有我师”。这也是《成为一名优秀程序员所需要知道的那些事》之一)。我曾经遇到过一些开发人员,他们总以为自己在全方面都比他人优秀似的,即便事实并非如此。

事实上,这通常就是区分新手的一种方法。不管是在线上还是线下,新手总是相信自己知道一切,并会至始至终地争辩。他们的争辩相当绝对,比如“这个总是 比那个要好”,或“这就是解决事情的唯一方法”等。专家则几乎不会那样做。他们知道,一切事情取决于具体情况(也就是“具体情况,具体分析”),开发人员 所掌握的技能,公司所选择的工具,公司政策,个人喜好等等。没有经验的开发人员(和普通人)一般都认为“世界是非白即黑”。而专家知道,世界还充满了灰色 区域,甚至还有其他大量颜色和色调。

如何成为一名专家

对于大多数你需要学习的技能,这里有四个步骤,以助你成为一名专家。在大多数情况下,你可以按照顺序完成如下步骤,也可以从上至下重复如下步骤:
    1. 学习技能;2. 实践技能;3. 讨论技能;4. 传授技能;

学习技能

在你掌握一门技能之前,你必须先学习相关理论。你可以通过书籍和教程,或课程教育,或综合前面这些方法来学习理论。

实践技能

一旦你掌握了技能相关理论,你需要在现实中运用该技能。通过实践,你会知道你所学的理论,哪些地方正确,哪些地方有误。当然了,你在大学中所学到的理论,通常在现实中并不奏效,或者根本不适合你所处的环境。

讨论技能

一旦你使用技能已有很长一段时间,并且发现自己能解决很多需要该技能的问题,那这时候你应该和其他经验人士讨论它了。讨论使用该技能的最佳方法,技能 相关理论的局限是什么,还可以增加什么东西等等。简而言之,讨论如何进一步推动该技能。(比如一个API,如何优化/改进它等。)

传授技能

向他人传授技能,无疑是完善自身技能的一种好办法。可能有很多事情只顾着做了,但并未考虑为什么要那样做。因为必须(向他人)解释你的方法,这会迫使你自己重新思索“为什么要做”和“做了什么”。

此外,你的技能上或许有些边边角角事从来都不需要掌握的。(比如,Web服务规范的边边角角)。因为要传授自己的技能,这迫使你也要掌握这些空白了,这会让你更上一层楼。

如何成为一名专家级的开发人员

既然我已经谈论了如何成为一名普遍意义上的专家,我将进一步谈论如何成为一名专家级的开发人员。

作为一名开发人员,你将很可能在特定行业(至少有一段时间)做软件开发,使用特定的平台。如果不是,如果你一直在选择工具或行业,就像一些Web开发 人员一样,那么你很可能将永远不会成为一名真正的专家。你会成为万金油或三脚猫(在某些方面还是挺有用)。如果你没有专注某一平台或行业,而你又想成为一 名专家,那你要学会专注了。

1998年,那是一个春天,我开始做Web应用,开始了我的职业生涯。我发现自己一直在更换着工具,也就是说我并没有真正擅长于某种工具。我只是一直 在为新工具而战。后来,我决定专注一门面向对象语言和一个平台,并选择了Java。那时候还没有.Net。所以从1999年开始,我一直只用Java。

在成长为专家的路上,你必须要选择一个平台,可能还有一个行业。行业并不特别重要,但拥有业务领域知识,这将真正增强你的实力。

在你学习一个平台时,你可以选择一门语言来入手。比如,Java语言。在你学习语言之后,则需要学习一个平台(包括所有的API和工具)。在Java中,有两大平台:标准版(J2SE)和企业版(J2EE)。(编者注:还有微型版(J2ME))

一旦你开始掌握选择的平台,你应当开始学习独立于平台的技能,比如模式设计、分布式系统设计、系统机构和可用性等等。在你取得进步时,你将要花更多的时间来学习这些技能。这是好事。因为这些技能不受平台限制,更容易转移新的技术平台。

最后,你或许会脱离软件开发,转入到诸如项目管理或架构师的完全不同的业务领域。请谨记,一旦你停止使用你的开发技能,你的专家之路将更加长远了。

下面有一张关于你的“专家之路”的图表。你从最低端开始,逐层上升。蓝色层表示独立于平台的技能。其他颜色层表示特定的平台。即便下图中并没有你的平台,你也可以自行添加。


你必须根据你所处的行业、所在的公司和所使用的平台来填入具体的工具和技术等。这些事情,我无法一劳永逸地为各位一次性做好。

怎么知道自己该学习什么,查看招聘广告不失为一个好办法。看看最常用的工具和技术?阅读一些在线软件杂志,看看行业人士讨论最多的技术是什么?泡相关论坛和博客,看看他们最常问的问题是什么?还有,人们谈论最多的技术是什么?总之一句话,什么技术是明天的热点?
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 36楼 发表于: 2010-11-23
程序员的八种级别

你有没有遇到过那个经典的面试问题,“你预见过自己5年后的职位吗?”。每当有人这样问时,我就会想到Twisted Sister乐队从1984年开始发行的某张专辑。当然是玩摇滚,至不济也得是个摇滚明星级别的程序员吧。这种问题通常得不到正面回答——就像那种在面试中无病呻吟式的陈词滥调,”你最大的缺点是什么?”。有的时候是不是太大起大落?以至于那些无辜的旁观者会受到伤害。

但是,我认为这是一种不一样并更严肃的话题,它应该引起足够的重视。而这并不是为了面试官好,而是为你好。文章开始的那个问题听起来有点老生常谈,而 且大部分人都是有备而来。但是这个问题却会引起更深层的思考:一名软件开发人员的职业生涯会是怎样的呢?当然,我们干着一行是因为我们热爱编程,并且在这 一点 上,我们非常幸运。但是,当你50岁的时候,你还会坐在电脑前编程吗?当你60岁呢?对于那些渴望成为程序员的程序员来说,最好的职业生涯出路是什么呢? 

开个玩笑,如果我告诉你,程序员可分为八种级别,你会怎么想呢?


1. 不朽的程序员:这是最高层次。你写的代码并没有随你而去,而是保留了下来(万古流芳)。你会在计算机领域永垂不朽。其他程序员会研究你的成果和著作。你可能获得了图灵奖,发表过有巨大影响力的论文,或者发明了一项或多项为众人所知的基础性技术,已经影响了编程事业的发展。

介绍你的并不只是个维基百科词条——很多网站致力于研究你的生平和成就。只有很少的程序员达到这种高度。

代表人物:Dijkstra(迪杰斯特拉)、 Donald Knuth(唐纳德·克努斯/中文名:高纳德)、 Allan Kay (阿兰·凯)

2. 成功的程序员:这些程序员既声名远扬又借助自己的编码创立完整业务,甚至整个行业。他们给自己创造了真正的自由:自己决定从事什么工作的自由。并且跟自己的同事分享这种自由。

这是大部分程序员都渴望的一种高度。能否达到这种高度往往更多的取决于业务技巧而不是编程能力。

代表人物:Bill Gates(比尔·盖茨)、John Carmack(约翰·卡马克)、DHH (戴维·海涅梅艾尔·汉森)

3. 著名的程序员:这 也是一个不错的层次,但是美中不足是出名不能当饭吃。在编程这个圈子里,你非常有名。但是,有名气 并不一定就意味着你会藉此获利来养活自己。出名很好, 但成功更佳。你可能为一家著名的大公司或者有影响力的小公司工作,也可能是一个普通创业团队的一员。其他程序员对你都有所耳闻,你正对这个领域产生积极影 响。

4. 能干的程序员:作为一名软件开发人员,你事业有成。公司需要你的技术,找份好工作对你来说永远不是件难事。你的同事尊重你。你工作过的每家公司都在你从事的方面取得了长足的进展。但是,仅此而已,别无他长?

5. 普通程序员:处 在这个水平,你有自知之明,知道自己不是一个伟大的程序员——可能你永远都不会是。天赋跟成功鲜有关 联。如果你拥有生意头脑和人际技巧,你会非常成功。 如果你是一名平庸的程序员,但是能够以此谋生,那么可以说你是很有天赋的,但不一定在编程方面。别低这份估自知之明,因为有自知之明的人比你想要的要少。 有没有天赋无关紧要,只要你能《发现自己的强项》并且持之以恒。

6. 业余程序员:一 名业余程序员热爱编程,这说明:他可能是一名很有前途的学生或实习生,他们正在为开源项目做贡献,或 者在业余时间开发有趣的”仅供娱乐”应用程序或网 站。他们的想法以及代码表明他们充满热情并且很有前途。成为一名业余程序员是一件很不错的事情,从这个阶段可以很快成为一名有作为的程序员。

7. 不知名的程序员:这是众所周知的典型的一种程序员:无名氏。他们有能力(通常会有)但不出色,可能为一家不知名的大公司工作,但那只是一份工作不是生活的全部。不过,那也没有什么问题。

8. 糟糕的程序员:那些没有一点技术或能力但不知怎么就成了程序员的人。他们接触的每件事情都会成为同事们的苦难——这些员工更糟糕,他们甚至不知道在和别人合作工作。

这些糟糕的程序员有什么共同特征呢?按理说他们跟写什么样的代码无关——但不管怎样确实有关。


这种划分并不是非常严格。并不是每一名程序员都渴望在自己的职业生涯里只做同一件事。但是一名程序员在十年、二十年、三十年或者终其一生能够达到一个什么样的高度?这值得我们思考。你最敬佩哪位著名程序员?他们取得了怎样的成就赢得了你的尊敬?
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 37楼 发表于: 2010-11-25
高级软件工程师的10种素质

如今,每家公司都似乎成了科技公司。从软件创业公司到投机性投资公司、制药巨头和媒体巨头,它们都越来越多地加入到软件业务行列。代码质量不仅成为了一个必需品,更成为了一个竞争优势。因为众多公司围绕软件而竞争,开发软件的人——软件工程师正显得越发重要。但是,你该如何发现那种百里挑一的程序员呢?在本文中,我们简明扼要地列出了明星开发人员的10种特质。


    1. 热爱编程2. 完成事情3. 持续重构代码4. 使用设计模式5. 编写测试6. 善用现有代码7. 专注可用性8. 编写可维护的代码9. 能用任何语言编程10. 知晓基本的计算机科学

1. 热爱编程

编程是一种为了满足兴趣而心甘情愿去做的劳动(Programming is a labor of love)。和其他任何职业一样,唯有真正的热情,才能完成真正的伟大事情。这里有个误解,认为编写代码是机械化并纯科学性的。事实上,最优秀的软件工程 师是工匠,他们能把能量、独创性和创造力融入到每一行代码中。伟大的工程师知道何时该把代码雕琢至完美,知道何时把大型系统像拼图一样组装到一块。热爱编 程的工程师从构建软件中获得满足,就好比一位作曲家在完成一部交响乐后而欣喜若狂。正是兴奋感和成就感,才造就了喜爱编程的明星工程师。


2. 完成事情

有很多技术人员只谈论软件而不编写代码(只说不做型)。而伟大软件工程师会真正去编码,这也是他们最为重要的品质之一。他们是实际做事的人。聪明人都 知道,解决问题的最佳途径是直面问题,而不是花上数周来设计复杂又不必要的架构和函数库。优秀工程师应当会问:解决手头问题的最简单方法是什么?最近的软 件开发方法——敏捷实践,正是专注那个。它的思想是,把复杂的项目拆分为短小的迭代,每个迭代只关注一小部分的增量功能。因为每个迭代对应的编码只需要数 周,所以功能易于管理并简单。


3. 持续重构代码

编码很像雕刻。要像艺术家一样不断完善自己的作品,软件工程师也要通过可能的最佳方式来持续完善自己的代码,以达到目标。重新塑造代码的原则称为“重 构”,Martin Fowler在他的创意书中有相应描述。重构背后的原始思想是:改善代码而不改变其功能,移动调整部分代码以确保系统不腐,还有确保系统完成基于当前需求 该完成的事。持续重构可以让开发人员解决另一个著名的问题——“黑盒遗留代码”(这个问题基本无人想触及)。

几十年的软件开发文化要求我们,不应该去改变正常工作的东西。然而,随着时间推移,问题是我们成为了老旧代码的奴隶,老旧代码变得不稳定和不兼容。而 重构正好可以改变这一状况,因为我们是代码的主人,不是它的奴隶。重构在工程师和代码之间建立起持续的“对话”,并带来所有权、确定性、自信心和系统的稳 定性。

千万不要成为老旧代码的奴隶。如果代码是他人所写,或许你可以轻易推脱责任。但大多数时候,那些代码是自己所写,要拿得起放得下,旧代码该埋时,就把它埋了!

4. 使用设计模式

自从所谓的“四人帮”(Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides)发表他们的著作——《设计模式》后,全世界的软件工程师一直都在讨论模式。在我们所处世界,不管是自然界还是人类行为,模式无处不 在。软件工程自然也不例外。模式就是不断重现的跨语言跨系统的场景和机制。一位优秀的工程师通常能识别并利用模式,而不是受制于模式。工程师不应(强制) 让系统去适应某种模式,而需发现在系统中使用模式的时机(恰当使用模式)。在使用模式来确保正确性时,应借鉴利用前人的智慧结晶,使用以前能正当解决特定 工程问题的方法。但请切记:模式不是万灵药;不要为了使用设计模式而使用设计模式。

5. 编写测试

曾有段时间,软件工程师们认为测试不值得他们去做。然而,如果你不做测试,你怎么能确保代码就能正常工作呢?敏捷实践中的“单元测试”已获得普遍认 可,因为它注重编写测试来反映代码是否有效。随着系统增大,测试也随之增大。有经验的工程师知道并了解测试的价值所在,因为测试的目的就是创建一个能正常 运作的系统。优秀的工程师通常会确保出现过一次的Bug不会再出现第二次。但优秀的工程师也知道,不应该浪费时间写那些琐碎或多余的测试,而需要专注测试 各个组件中的核心部分。

6. 善用现有代码 

“重新发明轮子”一直是软件行业中的巨大问题之一。从发明新语言到从写函数库,忽视并重写那些已经存在并已能工作的奇怪驱动力,已经造成大量软件开发 的失败案例。一位明星工程师会专注三种基本类型的重用:第一,内部基础架构的重用,相应代码是他自己或同事编写的;第二,使用第三方的函数库,比如 JDK。最后,研究使用某些大型网络服务商提供的相应服务,比如Amazon。总之,正确善用现有的代码,使得软件工程师能真正专注于最为重要的事情上 ——应用程序本身。

7. 专注可用性 

优秀的工程师通常都专注于用户。无论用户是企业还是个人,无论是为消费型的软件公司还是投资银行,需要关注的都是可用性。用户如何和系统交互?系统是 否提供一种简单、直接和平稳的操作体验?有种说法,因为软件工程师是技术人员,他/她和“用户如何与系统交互”没有关联,这种说法严重错误。优秀工程师努 力工作是为了什么?不正是让系统简单并易于使用。他们无时无刻都会想到用户,不会尝试去发明那些令人费解,只有极客才能理解并欣赏的东西。

有些时候,一些软件工程师过于投入,反而忘记所编写的程序/软件,是供他人使用,不是做给自己看的“艺术品”。所以,在软件开发过程中,一直要把“用户”放在心中。

8. 编写可维护的代码

软件开发界的另外一个小秘密是:编写优秀代码和糟糕代码所花费的时间是一样多。一位训练有素的工程师,他/她会从第一行代码开始就考虑可维护性和代码 的演化。没有任何理由编写“丑陋”的代码、长达数页的函数,或是稀奇古怪的变量名。优秀的工程师编写代码会遵循命名惯例,代码编写紧凑、简单和不过度炫耀 聪明。代码的每一行,都应恰如其分地展现出其原有目的。在给不便理解的代码(块)合理注释时,别忘了命名规则。清晰明了的函数名和变量名可以让代码不言而 明。

在编码时,有些程序员会有这种心态:过一会儿再来修改或完善某部分代码或某条语句。但谁知这一“过一会”竟然是“一天”、“一周”、“一个月”或“一 年”,甚至以后根本就没机会再回头修改。所以,尽量别妥协写出暂时堪用的代码。否则,不仅不会节省开发时间,也可以阻碍整个进程。当然也不利于后续维护人 员的工作。

9. 能用任何语言编程

优秀的软件工程师活血有自己一门特别钟爱的编程语言,但从不会执迷于当中。如今已有很多优秀的编程语言,也就是说,如果你只会使用其中一门语言,说明 你缺乏多样性。你可以用Java、C#或C++编写任何现代软件,可以用PHP、Perl或Ruby编写任何网站的后台。简而言之,编程所用语言,远远没 有语言相应的函数库重要。优秀的工程师能够认知到这一点,并愿意去学习新语言、新函数库和构建系统的新方法。

10. 知晓基本的计算机科学知识

最后,但肯定不是优秀工程师最不重要的特质就是:扎实的基础。优秀的工程师或许并没有计算机科学的学位,但他/她必须知道基础——数据结构和算法。如 果不知道哈希表,或者不知道链表和数组之间的差别,你如何构建一款大型的软件?。这些都是每位从事软件开发的开发人员应当知道的。算法也同样重要,从二分 查找到各种排序,到图形遍历,一位明星工程师必须知道并内在消化这些基础东西。因为这些基础就是你在构建任何现代软件中做抉择时的必备品。

结束语

以上就是区分伟大软件工程师的诸多特质。其中讨论的“热情”,是非常重要的。代码重用、设计模式、基础数据结构和算法都是必须知道的,而敏捷实践中的重构和单元测试则有助于工程师应对复杂的软件。尤为重要的是,明星工程师相信简洁和常识。也正是这些信念,帮助他们成功构建当今世界所需的看似不可能又错综复杂的系统。
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
级别: 管理员
发帖
8532
金币
2762
威望
3231
贡献值
0
元宝
0
只看该作者 38楼 发表于: 2010-11-26
网站开发人员应该知道的62件事

有人在Stack Overflow上发问,动手开发网站之前,需要知道哪些事情? 不出意料地,他得到了一大堆回答。通常情况下,你需要把所有人的发言从头到尾读一遍。但是,Stack Overflow有一个很贴心的设计,它允许在问题下方开设一个wiki区,让所有人共同编辑一个最佳答案。于是,就有了下面这篇文章,一共总结出六个方面共计62条"网站开发须知"。
我发现,这种概述性的问题,最适合这种集合群智、头脑风暴式的回答方式了。这也是我第一次觉得,Stack Overflow做到了Wikipedia做不到的事。(难怪它最近挤进了全美前400大网站。)

在我的印象中,关于网站开发,这样全面的概述性文章非常少见,因此也就非常有用。大家不妨看看,62件事情中你做到了多少?

一、界面和用户体验(Interface and User Experience)

1.1

知道各大浏览器执行Web标准的情况,保证你的站点在主要浏览器上都能正常运行。你至少要测试以下引擎:Gecko(用于Firefox)、Webkit(用于SafariChrome和一些手机浏览器)、IE(你可以利用微软发布的Application Compatibility VPC Images进行测试)和Opera。同时,不同的操作系统,可能也会影响浏览器如何呈现你的网站。

1.2

除了浏览器,网站还有其他使用方式:手机、屏幕朗读器、搜索引擎等等。你应该知道在这些情况下,你的网站的运行状况。MobiForge提供了手机网站开发的一些相关知识。

1.3 

知道如何在基本不影响用户使用的情况下升级网站。通常来说,你必须有版本控制系统(CVS、Subversion、Git等等)和数据备份机制(backup)。

1.4

不要让用户看到那些不友好的出错提示。

1.5

不要直接显示用户的Email地址,至少不要用纯文本显示。

1.6

为你的网站设置一些合理的使用限制,一旦超过门槛值,就自动停止服务。(这也与网站安全相关。)

1.7

知道如何实现网页的渐进式增强(progressive enhancement)。

1.8

用户发出POST请求后,总是将其重导向(redirect)至另外一个网页。

1.9

不要忘记网站的可访问性(accessibility,即残疾人如何使用网站)。对于美国网站来说,有时这是法定要求WAI-ARIA有一些这方面很好的参考资料。

二、安全性(Security)

2.1

阅读《OWASP开发指南》,它提供了全面的网站安全指导。

2.2

了解SQL注入(SQL injection)及其预防方法。

2.3

永远不要信任用户提交的数据(cookie也是用户端提交的!)。

2.4

不要明文(plain-text)储存用户的密码,要hash处理后再储存。

2.5

不要对你的用户认证系统太自信,它可能很容易就被攻破,而你事先根本没意识到存在相关漏洞。

2.6

了解如何处理信用卡

2.7

在登录页面及其他处理敏感信息的页面,使用SSL/HTTPS

2.8

知道如何对付session劫持(session hijacking)。

2.9

避免"跨站点执行"(cross site scripting,XSS)。

2.10

避免"跨域伪造请求"(cross site request forgeries,XSRF)。

2.11

及时打上补丁,让你的系统始终跟上最新版本。

2.12

确认你的数据库连接信息的安全性。

2.13

跟踪攻击技术的最新发展,以及你使用的平台的最新安全漏洞。

2.14

阅读Google的《浏览器安全手册》(Browser Security Handbook)。

2.15

阅读《网络软件的黑客手册》(The Web Application Hackers Handbook)。

三、性能(Performance)

3.1

只要有可能,就使用缓存(caching)。正确理解和使用HTTP cachingHTML5离线储存

3.2

优化图片。不要把一个20KB的图片文件,作为重复出现的网页背景图案。

3.3

学习如何用gzip/deflate压缩内容(deflate方式更可取)。

3.4

将多个样式表文件或脚本文件,合为一个文件,这样可以减少浏览器的http请求数,以及减小gzip压缩后的文件总体积。

3.5

浏览Yahoo的Exceptional Performance网站,里面有大量提升前端性能的优秀建议,还有他们的YSlow工具。Google的page speed则是另一个用来分析网页性能的工具。两者都要求安装Firebug

3.6

如果你的网页用到大量的小体积图片(比如工具栏),就应该使用CSS Image Sprite,目的是减少http请求数。

3.7

大流量的网站应该考虑将网页对象分散在多个域名(split components across domains)。

3.8

静态内容(比如图片、CSS、JavaScript、以及其他cookie无关的网页内容)都应该放在一个不需要使用cookie的独立域名之上。因为域名之下如果有cookie,那么客户端向该域名发出的每次http请求,都会附上cookie内容。这里的一个好方法就是使用"内容分发网络"(Content Delivery Network,CDN)。

3.9

将浏览器完成网页渲染所需要的http请求数最小化。

3.10

使用Google的Closure Compiler压缩JavaScript文件,YUI Compressor亦可。

3.11

确保网站根目录下有favicon.ico文件,因为即使网页中根本不包括这个文件,浏览器也会自动发出对它的请求。所以如果这个文件不存在,就会产生大量的404错误,消耗光你的服务器的带宽。

四、搜索引擎优化(Search Engine Optimization,SEO)

4.1

使用"搜索引擎友好"的URL形式,比如example.com/pages/45-article-title,而不是example.com/index.php?page=45。

4.2

不要使用"点击这里"之类的超级链接,因为这样等于浪费了一个SEO机会,而且降低了"屏幕朗读器"(screen reader)的使用效果。

4.3

创建一个XML sitemap文件,它的缺省位置一般是/sitemap.xml(即放在网站根目录下)。

4.4

当你有多个URL指向同一个内容时,在网页代码中使用<link rel="canonical" ... />

4.5

使用Google的Webmaster Tools和Yahoo的Site Explorer

4.6

从一开始就使用Google Analytics(或者开源的访问量分析工具Piwik)。

4.7

知道robots.txt的作用,以及搜索引擎蜘蛛的工作原理。

4.8

www.example.com的访问请求导向example.com(使用301 Moved Permanently重定向),或者采用相反的做法,目的是防止Google把它们当做两个网站,分开计算排名。

4.9

知道存在着恶意或行为不正当的网络蜘蛛。

4.10

如果你的网站有非文本的内容(比如视频、音频等等),你应该参考Google的sitemap扩展协议

五、技术(Technology)

5.1

理解HTTP协议,以及诸如GET、POST、sessions、cookies之类的概念,包括"无状态"(stateless)是什么意思。

5.2

确保你的XHTML/HTMLCSS符合W3C标准,使得它们能够通过检验。这可以使你的网页避免触发浏览器的古怪行为(quirk),而且使它在"屏幕朗读器"和手机上也能正常工作。

5.3

理解浏览器如何处理JavaScript脚本。

5.4

理解网页上的JavaScript文件、样式表文件和其他资源是如何装载及运行的,考虑它们对页面性能有何影响。在某些情况下,可能应该将脚本文件放置在网页的尾部

5.5

理解JavaScript沙箱(Javascript sandbox)的工作原理,尤其是如果你打算使用iframe。

5.6

知道JavaScript可能无法使用或被禁用,以及Ajax并不是一定会运行。记住,"不允许脚本运行"(NoScript)正在某些用户中变得流行,手机浏览器对脚本的支持千差万别,而Google索引网页时不运行大部分的脚本文件。

5.7

了解301重定向和302重定向之间的区别(这也是一个SEO相关问题)。

5.8

尽可能多得了解你的部署平台(deployment platform)。

5.9

考虑使用样式表重置(Reset Style Sheet)。

5.10

考虑使用JavaScript框架(比如jQueryMooToolsPrototype),它们可以使你不用考虑浏览器之间的差异。

六、解决bug

6.1

理解程序员20%的时间用于编码,80%的时间用于维护,根据这一点相应安排时间。

6.2

建立一个有效的错误报告机制。

6.3

建立某些途径或系统,让用户可以与你接触,向你提出建议和批评。

6.4

为将来的维护和客服人员撰写文档,解释清楚系统是怎么运行的。

6.5

经常备份!(并且确保这些备份是有效的。)除了备份机制,你还必须有一个恢复机制。

6.6

使用某种版本控制系统储存你的文件,比如SubversionGit

6.7

不要忘记做单元测试(Unit Testing),Selenium之类的框架会对你有用。
(完)
QQ: 378890364 微信:wwtree(省短信费) 紧急事宜发短信到0061432027638  本站微博:http://t.qq.com/wwtree QQ群:122538123
描述
快速回复

您目前还是游客,请 登录注册
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容