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会否也会选择明年的三八妇女节上推出呢?有进一步消息再为大家报道。

是时候跟 MongoDB 说再见了

在过去的两到三年的时间内,我一直在一个中等规模的项目中使用 MongoDB。

但因为各种技术上的原因,到了和 MongoDB 说再见的时候了,我的原因有以下几点:

  • MongoDB 当前的内存模型基于内存映射文件,这是一项已经宣布脑死亡的技术。在实际应用过程中,不具备伸缩性,没有方法来控制内存的使用情况。
  • 锁机制: 一个可伸缩性的数据库解决方案使用全局的服务器锁是一个糟糕的设计,特别是因为当 MongoDB 支持原子操作。应该有更精细的锁操作。
  • 查询引擎:目前 MongoDB 的每个查询只允许使用一个索引,不知道为什么会有这样的限制,完全没有理由。其实 MongoDB 的索引模型和关系数据库是差不多的。
  • 查询语言:使用 JSON 作为查询语言是一个糟糕的决定,尽管当前 JSON 查询语言支持标准查询,但对一些操作确实有限制,无法在 JSON 中执行一些类似 SQL 的复杂查询。
  • Map-Reduce: MongoDB 的 Map-reduce 相似一个无用的赠送品。
  • 数据分片:这是 MongoDB 的另外一个糟糕的功能,从一个单一的服务器到分区设置的步骤是非常巨大的,你需要最少两个复制集才能做分片,三个配置服务器和负载均衡,有点像小镇上的小房子旁建了一栋摩天大厦。
  • 数据中心的意识:这是另外一个拼凑在一起的特性,复制集只支持一个主节点和多个从节点,只能去写一个从节点。可以在跨多个数据中心运行复制集,但写操作只能在一个数据中心的从节点。
  • 默认关闭“安全”模式: 是谁做出这样白痴的决定呢?看到很到报道称数据丢失,多数是因为这个问题。
  • 日志: MongoDB 预先分配了 3G 的数据用于日志记录,这个数据是独立于数据库大小的,3G大小对一些小型系统来说简直是疯了。

社会化组件:10gen 和 MongoDB 试图让构建一个大型的可伸缩系统变得很简单,但实际上并不如此。在过去,构建大型的可伸缩性系统是非常复杂的,需要专业的知识和经验。尽管很多人觉得构建这样一个系统很酷。有一点很清楚的是,如果你正在构建一个小型或者中型的系统,那么使用 MongoDB 将会是徒劳的,因为性能不佳的问题以及收效甚微。很多人不愿意深入去了解和挖掘 SQL 数据库本身的功能和性能,轻易的作出了使用一些非 SQL 数据库系统的决定,这样的做法是不明智的,而且充满危险。我这样说可能太苛刻,不符合多样性,但却非常现实。

MongoDB 目前更多的是市场营销和炒作,10gen 主要的目标是为了告诉全世界说 MongoDB 是如何的酷,原因很清楚:10gen 正试图发挥在数据库这一市场上与其他产品进行竞争,以便能更好的说服投资人支付更多的钱来帮助其发展,这当然是 10gen 合法的目标,但其技术的基础却是摇摇欲坠的。

英文原文OSCHINA原创翻译