程序员的7个坏习惯

1. 所有的代码都是垃圾,除了我的以外
哥们儿,我有一个坏消息要告诉你,你的代码很垃圾。不管你花费了多少精力,总是有很多程序员认为你的代码是垃圾,他们可以比你做的10倍更好。

怎么解决:不要只顾着批评,你也是写代码的人。尝试去客观的评价,而不是审判!谦虚一点。

2. “马上搞定”带来的灾难
大家都喜欢走捷径,每个人都做过。有时候走捷径是必须的,但是大部分情况下走捷径是危险的,非常危险,所以我们应该尽量避免。一个捷径可能省了你几个小时的时间,但是可能为你带来几个月的痛苦。

怎么解决:不要一个人偷偷的把事情搞定,而是和别人商量,请别人检查你的工作。假如你要采取捷径的方法,请必须经过所有相关人员,包括你的经理的同意。

3. 错误的估算时间
我住在巴塞罗那,我们那里有非常有名的 Sagrada Familia 教堂。它出名的原因是因为它非常精美,并且预计的建造时间非常长,从1882年开始。我想这个项目在做时间预算的时候没有程序员参与,否则建造完成时间可能是两个礼拜。

怎么解决:首先,准确的预估软件开发的时间是不可能的,我们只能猜。在开发的过程中你可能遇到各种你没有遇见的问题,所以我们往往在预估的时间上乘以2。

4. 盲目自大
程序员之间的讨论有时候看起来像是公鸡打架而不是人类谈话。这往往发生在设计和架构的会议上。在你的眼里,其他人的意见都是扯蛋,扯蛋,扯蛋……

怎么解决:把自大留在家里,冷静的听听别人在说什么,再做决定。

5. “这不是我干的!”
我们总是给自己找借口。我们往往给自己开脱,比如在正常情况下,我永远也不会犯那样的错误云云。

怎么解决:谁都会犯错误,调整你的态度,“是的,这是我的问题,我们现在需要修复它”就是一种非常专业的态度。它会帮助你建立你的声望,并获得同事的好感。

6. 缺乏耐心
虽然重复的简单工作很枯燥,但是那也是必须完成的任务。程序员往往抵制,反感这些任务,导致工作效率低下。

怎么解决:纪律!记住,再激动人心的项目也有枯燥无味的任务要完成!

7. 不成熟
如果编程是做爱的话,一定有很多没有被满足的电脑。你不能简单的进入,做到一半然后就睡觉了。很多程序员都没有搞明白“完成”是什么概念。请记住:完成意味着测试通过(不仅仅是单元测试),文档完整,提交,合并……

怎么解决:这一条很难,很多看起来不必要的任务加在一起很复杂。但这是完成一个项目所必须的工作,需要通过纪律和训练来完成。

 

原文链接,OSChina 编译

Java 已死?九百万程序员说不

Java没死,事实上它拥有足够的能量让你的应用跑起来。那些对Java吹毛求疵人频繁地聚焦在一些小众问题上,总是和其他技术或者语言做些不公平的对比,这些语言并没有像Java一样得到广泛应用及长远的历史。

现在的小孩都能学Java,它在Web和企业开发中广泛被采用,特别是近些年更是有了些让人惊讶的改善,一些新特性正在筹备中。即使抛开这些最 新的特性,Java仍然很酷,应用的广泛性、JVM平台背后卓越的设计、清晰的语法、拥有丰富的工具和库文件构成的生态系统。Oracle说有超过 9,000,000 Java 开发者(亿万的应用和设备用户),所以为什么我会听到诸如“Java正在被淘汰中”,2007年开始,Java就已经沦为“21世纪的Cobol语言”的 言论?

Java平台是工程师的梦想

首先就是Java平台的存在,HotSpot JVM 是一项非凡的设计,CLR(公共语言运行库)有了大量的优化,Java应用在性能上甚至可以与C相媲美,当然还有其他可选的虚拟机供可用(如:JRockit,Zing),应你的环境有特殊的需求而定。

再者,多种基于JVM的语言使得这个平台更奇妙,如:Groovy,Jython,JavaFX,Scala,当然还不局限于以上流行的语言。Java现 在包含有字节码指令:invokedynamic和java.lang.invoke包,使得JVM构建动态语言更简单,现在已经有超过50中基于JVM 的语言。其中最有意思的一个是php.reboot,它的目标是保持php的哲学理念,但是移除了其中一些缺陷,而且它同样能在Android中运行。

Java是一门成熟的语言,并不适合老人

Java成为被批评,抱怨,诅咒的靶子,我说这门语言还没死,恰恰相反当有人抱怨Java的时候正是推广Java时机。人们总会做些奇怪的对比,好 像仍然以为Java还是停留在1.4的版本,用记事本编写、需要EJB2的支持、只能用来写写简单的留言板,然后把这些用来与一个高端框架甚至是CMS来对比。

作为Java程序员,这种对比对我来说没有任何意义。更为明智的方法对比Java就得理智地选择竞争对手,看看Java vs PHP、Python或者Ruby,或者用框架Play 对比 Ruby on Rails,SpringMVC vs Zend Framework,有鉴于此,我觉得Java似乎根本就不适合老人。

Java 冗长吗?当然

人们常说Java太啰嗦了,减缓了运行速度。批评者矛头通常指向Java的强类型静态语言特性,缺乏前沿技术在语言中,然而,我认为他们是经过深思熟虑 的,而且这正是Java良好的特性。动态语言在启动一个小项目时开始会觉得很受欢迎,但是可以考虑一下,在时髦框架及合适的工具(如:考虑用IDE代替记 事本)下创建一个“Hello 留言板”类型的应用,Java很简单,只是10分钟的事情,如果你想做个试验的话,使用Spring Roo 再准备一个秒表,如果有需要的话。现在就可以开始繁琐的CRUD了。

想象一下,你正为移动运营商搭建一个系统,运行客户登陆网站,你不得不在后台调用各种子系统收集大量的数据,Cool框架通常分解你的程序模块而不需要匹配任何用户模型。要更多的了解建议你看看Joel Spolsky发表的一篇文章

Java是一门强类型静态语言

强类型静态语言有很多好处,我喜欢它简单的视觉外观,我可以粗略看一段代码就知道是做什么的,它就像是可视化的用英语反馈,语言非常易读,字母混合成单词 仍然可读。其它的一些好处是有强大的IDE支持,动态语言在这点一直是弊端,大项目中有强大的IDE和工具支持是无价的。

批判者的观点在Java在读文件、转换xml或迭代集合的时候缺乏表达力,但是你可以总是创建一个方法去处理这些常用的事例,或者是用 FileUtils.readLines(),java语言上表达力的缺点有很多库对其支持。在Java7中能看到一些优雅的加强型功能,如自动关闭资 源、siwtch语句支持String、数字类型支持下划线(强烈建议读Coin 项目)。Java8承诺了更多的东西(最有意思的应该是闭包)。Java是不是在任何方面都是那么的完美无缺呢?当然不是,这就是Java8、Java9 在准备阶段的原因。我个人也不喜欢那些不太优雅的核心API.是否的确将更多的事情留给平台而不是语言本身?java核心包括API进阶设计跨度长达20 年,API的更新会破坏向后兼容性,有些设计太抽象,但有些还不够抽象,有些太零碎,有些根本不可思议。看看其竞争对手.NET,核心API做的很好,比 如统一的通信API。Java8在Jigsaw项目的帮助下,会有所改变。

所以你值得拥有Java,正确地使用它,它是一门很棒的语言。堪比Klingon语言,它将继续改善并不会很快消失。不应把努力放在取代Java上,而是和其他JVM语言结合使用,这是最明智的,但是对我的下一个Pet Clinic 还是坚持使用Java。

原文:Arnel Pällo  编译:伯乐在线 – 刘志军

解密扎克伯格“护身符”:二元制股权的秘密

来源:21世纪网-《21世纪经济报道》 作者:王珊珊 赵晓悦

在对Facebook此次强大IPO的关注之中,扎克伯格的另一秘密武器,也详细地曝光在公众面前:二元制股权结构。

根据Facebook的招股书,其股权总共分为两类,即A类普通股和B类普通股,其中,B类普通股的表决权是A类普通股的十倍根据美国媒体此前的一些报道,这个倍数和Google公司类似。

B类普通股在出售时自动转换成A类普通股;只有A类普通股才能上市。在首次公开募股(IPO)中发售的股票将是A类普通股也就是说,公众投资者是不可能买到具有额外表决权的B类股的。

Facebook提交的SEC文件还提到,扎克伯格拥有Facebook的28.4%股权,但由于他还持有的5.338亿股B类股;根据他和此前股东们 签订的一系列表决权代理协议,他们在特定情况下授权扎克伯格代表股东所持股份进行表决,也就是说,扎克伯格最终控制了10.7亿股B类股,4220万股A 类股,掌握着56.9%的表决权,是最大的单一股东。

事实上,早在2009年,Facebook在进行私募阶段的融资时,就引入了二元 股权结构, 以维持创始股东在关键事务上的掌控权,通过双类股权结构来扩大了创始股东的投票权。根据招股书,扎克伯格所持有的B股投票权是A股普通股的十倍。正是通过 以上手段,扎克伯格拥有了56.9%的投票权,这意味着他将有能力控制股东选举的结果,包括了公司董事会成员选举和公司重大策略决定,比如任命自己的继任 者等。

典型的例子,近期Facebook一项10亿美元收购移动应用Instagram的交易,是在扎克伯格与Instagram公司 CEO凯文·希斯特罗姆在前者的家中私下达成的协议。而扎克伯格只是告诉董事会收购Instagram的事情,而董事们压根没有参与投票和建议。

扎克伯格俨然成为聚光灯下的独裁者,但却不是第一个通过二元股权结构来维系“独裁”的创业者,在此之前,Google,福特汽车公司,华盛顿邮报,纽约时报,VISA,EchoStar ,还有“股神”巴菲特的伯克希尔哈撒韦公司,都采取了这种二元股权结构。

解密扎克伯格“护身符”:二元制股权的秘密

事实上,Facebook的二元制股权结构,初始缔造者并非扎克伯格,而是前CEO肖恩·帕克,正是其在2009年向扎克伯克进言,劝其通过二元股权结 构来维护其对公司合法的、完全的控制。在电影《社交网络》里,肖恩·帕克“被”表现的角色,却是如何设计把第一个投资扎克伯格的爱德华多给踢走,让扎克伯 格可以独掌大权。

而肖恩·帕克对“控制权”如此意识,却又是其自身的教训所得,在硅谷的传说中,帕克性情多变、易怒且捉摸不定,很容易 激怒投资者他参与创办的几家公司,在公司腾飞之后,他都很快被踢了出去,这一系列创业公司的名单,包括Napster、 Plaxo,facebook,Spotify, Airtime在内。

Plaxo是帕克尝试创立的第一家真正的公司提供帮助用户实时 更新通讯录的网络服务,相比Napster或Facebook,这听起来有些无聊,但它是一种早期社交网络工具,下载Plaxo之后,该程序将分析你的通 讯录,向所有联系人都发送一条信息,鼓励他们也使用这项服务,有人因此注册后,该软件又会进一步分析他的通讯录,继续进行传播。很短时间内,Plaxo的 营销信息就发到了数百万用户的邮箱中。甚至这些经验后来又改变了Facebook的发展史。

不久,帕克却被董事会逐出公司,其破产、身 无分文、一无所有,甚至连任何期权都没有。在加入Facebook后不久,也再次离开,但尽管不再是Facebook的员工,帕克继续为扎克伯格提供战略 方面的建议。帕克在经历过Plaxo的乱局后,对控制权问题很敏感,他的计划赋予扎克伯格的股份以超级投票权,巩固了他的地位,使他不用担心在筹资过程中 摊薄控制权,同时使他在董事会控制足够多席位,只要愿意,想在公司呆多久都行。

“Facebook的架构确保马克能保持尽可能强的控制权,肖恩对此发挥了实质性作用,这既表现在他能谋得高估值、低稀释的融资,还体现在董事会架构本身和一些关于控制权的细节上。”Facebook联合创始人达斯汀·莫斯科维兹此前曾表示。

根据招股书,就投票权而言,Facebook的B类普通股每股有十票,而在IPO中提供的A类普通股每股有一票。由于B类和A类普通股之间是十比一的投 票比例,B类普通股的持股人将继续共同控制普通股合并投票权的多数,因此能够控制提交给股东审批的所有事项,只要B类普通股的股份能够代表至少9.1%的 A类和B类普通股的所有流通股。

招股书中还明确道:Facebook拥有一个二元股权结构,向扎克伯格提供可以掌控要求股东批准事项决 策的能力,即使他拥有的明显少于额外的A类和B类普通股。这种集中控制表示,扎克伯格持一股,而对应十个投票权,即同股不同权。即使他的股份被稀释,但在 决策上还是享有很大的权力。

除此之外,扎克伯格获得了和股东签订的表决权代理协议,他们在特定情况下授权扎克伯格代表股东所持股份进行表决。这项协议在IPO完成后仍然保持效力。

根据招股书提到的这些协议,几乎在IPO之前投资Facebook的所有机构和个人投资人,都同意在任何需要股东投票的场合均按照扎克伯格的指示投票,并且授予扎克伯格不可撤销的代理权。

投票协议还规定,投资者不得:(1)收购Facebook任何资产或业务的所有权;(2)不得需求任何公司证券投票权的代理权;(3)以“证券交易法” 第13条的名义形成任何“集团”;(4)提名任何没有被现任董事提名的人为新董事,不能提出任何需要股东投票的提议,不能发起、投票支持发起、呼吁发起股 东大会特别会议;(5)公开宣布打算做以上任何一项行动。

当然,对扎克伯克这种超级投票权,也给出了一些约束,但是,与这种超级投票权所拥有的“超级权力”相比,这些“约束”之力是非常弱小的。

招股书中提及,扎克伯格所享有的B类股的各种特别权益,直至其死亡时自动失效。另外,在IPO之后,除了投票协议约束的232,542,558股B类普 通股之外,如果投资者出售、转移、转让、抵押或以其它方式抵押股权,那么,这些股票将不再受制于此前的投票协议的规定。

“当然, 如果扎克伯格先生不再积极从事公司的管理,扎克伯格对投42,245,203股A股普通股和215,919,085股B股普通股的超级投票权协议将终止”,Facebook招股书中称。

二元制股权成为硅谷新宠

Facebook的二元股权结构曝光之后,“股神”巴菲特对此深表赞同。巴菲特表示,对于扎克伯格而言,紧紧握住对Facebook的持股是一项明智的举措,即便在Facebook上市之后。

有分析人士表示,Facebook所采取的“二元制”股权结构将逐渐成为硅谷的新标准,被更多创业公司特别是科技企业采纳。而科技企业之所以喜欢这种结构,是因为创始人可以在上市融资后依然把握企业发展方向。

但事实上,二元股权结构也是把“双刃剑”,对于核心控制者,是层合法的核心保护壳,但从另一个角度来说,如果核心控制者犯了错误,造成了投资者的损失,轻则可能引来投资者的抱怨,严重的,还有可能毁掉一家公司的未来。

事实上,这种二元股权结构以及他们制造的争议在公司的世界里并不是什么新鲜事。很多创建企业的家族和个人都授予自己特殊的投票权以保护公开募股后对公司 的控制权。这种结构被运用在纽约时报公司(The New York Times Company)、福特(Ford)、巴菲特的伯克希尔哈撒韦公司(Berkshire Hathaway),以及Visa and EchoStar Communications,还有默多克的新闻集团(News Corpation)

这种股权结构就是给企业上保险的。在1988 年,SEC为了应对股东的抱怨,准备出台驱逐二元股权结构的法律,但一年后被联邦法院否决。于是SEC调整了自己的规则禁止企业在上市后调整二元股权结 构。一旦开启先河,时局就很难控制了,这其实就默许了公司是可以用二元股权结构走向公开市场。另一种使用二元股权结构的考虑是,允许创始人或创始人的家族 维持和保护一种独特的企业文化。这是二元股权结构被运用于传媒企业的原因。包括华盛顿邮报和纽约时报。

在默多克掌控的新闻集团News Corporation中,默多克家族以12%的股权占近40%的投票权。但这对其投资者来说,却不是件令人愉快的事情。加州公共雇员退休系统作为美国最 大的公共养老基金,持有新闻集团700万股总价值122,000,000美元的股份,其中包括550万美元没有投票权的股份。他们的高级投资组合经理安 妮·辛普森女士认为,二元股权结构是一个腐败的治理体系。

英国《金融时报》一篇文章称,此前,摩根士丹利曾要求过纽约时报放弃其二元股 权结构。在纽约时报,持有99%股权的股东只能选出董事会13个席位中的4个。其援引大摩某位高层的话,公司外的投资者在购买股票的时候,需要有完整的认 识,而他们手上的股票仅有次等的投票权,仅仅“是个陪遛弯”的角色。

媒体圈外的例子是福特汽车。福特家族拥有B股,虽然B股只占福特流通股的2%,却占据40%的投票权。

一项统计材料显示,根据机构股东服务公司的一项数据,在标准普尔的500支股票索引中,只有6%的公司采用这种二元股权结构。

在Google IPO前,这种二元股权结构都快被人遗忘了。Sergey Brin和Larry Page在出售他们的股权后,直至降到仅17%时,却依然牢牢掌控着投票权。

硅谷一众公司把这股浪潮又掀起来了,从Google到linkedin和Facebook,还有Zynga等等,二元股权结构成为了互联网亿万富翁地位的新标志。

而2009年11月,位于芝加哥的Hyatt Hotels在上市时只出售A股,引发了同样的争议和分析。掌控酒店的普里茨科家族保持B股和主要的投票权,“当然这种股权结构也有失败的案例,例如摩托 罗拉曾投资”依星“无线通讯系统,却被较便宜的GSM电信网络系统打败,UTSTARCOM(小灵通手机)也是因转型管理不善,上市后就出现管理问题。 Bate录影带被VHS录影带打败,后者又被CD/DVD打败,而现在又由MP3/MP4主导电子音乐影像市场。如果在二元股权结构之下的公司控制人没有 及时地紧跟市场变化,很可能投资股份或创业股权变成一文不值。

一些资产管理公司,比如T Rowe Price,对二元结构的投资并不积极。“我们强烈反对这种二元资产结构”,T Rowe Price曾在英国《金融时报》表示,“我们没有任何活跃在新闻集团的股份投资,因为我们不希望有一个无投票权的立场。”

英国金融时报专栏作者约翰·加普(John Gapper)就撰文写到,二元股权结构,并非每个企业的咖啡。在这篇文章中,他认为,超级投票权的价值无法按价格量化,内部和外部投资者对公司的不等权 益,外部投资者很难知道内部人是否会作出影响财务权益的行为,而只有在这类事情发生时,外部投资者才有知晓权。

对于Facebook而 言,维护创业者居于强势地位的二元股权结构,同时也带来这家公司在融资上的影响,尽管在Facebook强势的商业模式之下,这种影响甚小。在 Facebook的招股书中,也提及了这种二元股权结构可能造成的影响:可能会导致我们的A类普通股对某些投资者的吸引力降低,或者对我们的交易价格造成 损害。

这里我说了算!

自从9岁那年得到第一台Commodore 64家用电脑起,我就开始编程。然而,当面对如何写出好的代码时,我仍然感觉自己还有很多要学的。

在探索如何提高自己的过程中,我学了很多种语言。大多数是以面向对象为主的(OO)。

然而,让我惊讶的是,在我读过的大多数书本、杂志和网上文章中,有着大量遭透了的被当作面向对象例子的代码。

这些代码中,我看到的最多被违反的原则是“命令,不要去询问(Tell, Don’t Ask)”原则。这个原则讲的是,一个对象应该命令其它对象该做什么,而不是去查询其它对象的状态来决定做什么(查询其它对象的状态来决定做什么也被称作 ‘功能嫉妒(Feature Envy)’)。在面向对象的编程中,一个对象被定义成由对象状态和操作这个状态的方法组成。

在《Holub on Patterns: Learning Design Patterns By Looking At Code》这本书里,Allen Holub在第一章里有一节的标题是“为什么getter和setter方法有害”。他在JavaWorld上的一篇文章里也谈论了这个问题。对所有的面向对象的程序员来说,这应该是一篇“必读”文章。

我有一些程序员同事,他们在一个对象上第一步声明了属性后,第二步就是添加getter和setter方法。JavaBean规范对于这种文化的推广负于很大的责任。人们认为这是一种能让你写出可复用的模块化组建的好方法,但这已是很多年前的事了,时过境迁。

写带有getter和setter方法的类会导致过程式的代码。通过getter和setter来获取数据进行操作的逻辑最终会遍布整个应用,进而 经常导致应用内的重复(这违反了另外一个原则:DRY——不要自我重复(Don’t Repeat Yourself))。这会致使产生很难维护的代码,当你对一个类做任何修改时,都会在整个应用内造成连锁式的牵连。

用这种方式来暴露数据还会妨碍你重构你的类,因为对这样的属性的任何修改都意味着会影响到访问了这个属性的其它类。

违反“命令,不要去询问”原则的另外一个副作用是,你的探询最终变成严重依赖状态信息并带有很多前提条件。这会让人很难理解你究竟询问的是什么。

你很可能会最终违反的第三个原则是,尽少知道(Least Knowledge)原则,也叫做得墨忒耳定律(Law Of Demeter)。这个定律可以总结为下面一句好:

一个类应该只跟它的直接朋友通话,不要跟陌生人说话。

在类里面加入getter方法,你的代码最终会写成这样:

1 if (person.getAddress().getCountry() == "Australia") {

这违反了得墨忒耳定律,因为这个调用者跟Person过于亲密。它知道Person里有一个Address,而Address里还有一个country。它实际上应该写成这样:

1 if (person.livesIn("Australia")) {

这并不违反得墨忒耳定律,因为这个调用者只跟它的直接朋友Person通话,而且它不知道内部情况。从“命令,不要询问”的视角来看,这也是更好, 因为确定这个person是否居住在Australia的逻辑被隐藏到了Person里,如果我们改变Person里存储国家信息的方式,这将不会影响任 何依赖这个信息的其它类。

另外一个这样写代码的好处是,它把我们的意图显示的很清楚。这是我会在以后的时间里讨论的另外一个话题。

为了避免违反“命令,不要去询问”原则,有几样事情你要记在心里。

  • 在IDE里敲击快捷生成键前,询问自己’五个为什么’,问问自己为什么一上来就添加getter和setter方法。
  • 不要询问对象的状态。要做什么,告诉它们该怎么做。
  • 操作所属的对象拥有这些操作的数据。

进一步阅读

我的一个朋友是这个思想的大力倡导者,他用East Oriented方式精彩的解释了这个原则。

《Tell Don’t Ask and the effect on testing》,出自Steve Freeman 和 Nat Pryce,他们也是 《Growing Object-Oriented Software》, 《Guided by Tests》 两本书的作者。

[本文英文原文链接:I give the orders around here! ]

微软欲打造三八世代:新Xbox将会命名为Xbox 8

开发代号为Durango的下一代Xbox新戏平台,已知推出日期会于明年(2013年),并会采用IBM的处理器配合AMD显示核心。有消息指其名称也会命名为Xbox 8,与Windows 8及Windows Phone 8齐齐组成「888」新世代。

微软的产品相近的名字放到不同的产品上已不是第次代,例如先前的Windows 7、Windows Phone 7;Xbox 360,Office 365等等,这样命名确实会给用户一个同一世代的感觉。据一名刚离开微软的前员工表示,Windows 8及Windows Phone 8的名字已落实,为了一致性明年推出的Xbox也会命名为Xbox 8,简化产品名字也有助增加消费者的接受程度。

Windows 8+Windows Phone 8+Xbox 8可以连成「888」,在国内上也有「发发发」的好兆头,如果三部机器联网在一起,不知道会否来个「三八」联机?更有意思的是,不知道Xbox 8会否也会选择明年的三八妇女节上推出呢?有进一步消息再为大家报道。