写代码的人

Archive for the ‘生活休闲’ Category

一百年后,人类怎样编程?

很难预测一百年后的人类生活,只有少数几件事是可以确定的。那时,汽车将具备低空飞行能力,城市规划的法规将放宽,大楼可以造到几百层,大街上一天到晚看不见太阳,女性个个都学过防身术。本文只想讨论其中的一个细节:一百年后,人们使用什么语言开发软件?

为什么这个问题值得思考?原因不是我们最终会用上这些语言,而是幸运的话,我们从现在开始就能用上这些语言。

 

我认为,编程语言就像生物物种一样,存在一个进化的脉络,许许多多分支最终都会成为进化的死胡同。这种现象已经发生了。 Cobol语言曾经流行一时,但是现在看来没有任何后续语言继承它的思想。它就像尼安德特人 一样,进化之路已经走到了尽头。

我预言 Java也会如此。有人写信说:“你怎么能说 Java不会成功呢?它已经成功了。”我觉得这要看你的成功标准是什么。如果标准是相关书籍的出版量,或者是相信学会 Java就能找到工作的大学生数量,那么Java确实已经成功了。当我说 Java不会成功时,我的意思是它和 Cobol一样,进化之路已经走到了尽头。

这只是我的猜测,未必正确。这里的重点不是看衰 Java,而是提出编程语言存在一个进化的脉络,从而引导读者思考,在整个进化过程中,某一种语言的位置到底在哪里?之所以要问这个问题,不是为了一百年后让后人感叹我们曾经如此英明,而是为了找到进化的主干。它会启发我们去选择那些靠近主干的语言,这样对当前的编程最有利。

无论何时,选择进化的主干可能都是最佳方案。要是你不幸选错了,变成了一个尼安德特人,那就太糟了。你的对手克鲁马努人时不时就会来攻打你,把你的食物全部偷走。

这就是我想找出一百年后的编程语言的原因。我不愿意押错赌注。

 

编程语言的进化与生物学进化还是有区别的,因为不同分支的语言会发生聚合。比如, Fortran分支看来正在与 Algol 的继承者聚合。理论上,不同的生物物种也可能发生聚合,但是可能性很低,所以大概从来没有真正出现过。

编程语言之所以可能出现聚合,一个原因是它的概率空间 比较小,另一个原因是它的突变不是随机的。语言的设计者们总是有意识地借鉴其他语言的设计思想。

对于语言设计者来说,认清编程语言的进化路径特别有用,因为这样就可以照着样子设计语言了。这时,认清进化的主干就不仅有助于识别现存的优秀语言,还可以把它当作设计语言的指南。

 

任何一种编程语言都可以分成两大组成部分:基本运算符的集合(扮演公理的角色)以及除运算符以外的其他部分(原则上,这个部分可以用基本运算符表达出来)。

我认为,基本运算符是一种语言能否长期存在的最重要因素。其他因素都不是决定性的。这有点像买房子的时候你应该先考虑地理位置。别的地方将来出问题都有办法弥补,但是地理位置是没法变的。

慎重选择公理还不够,还必须控制它的规模。数学家总是觉得公理越少越好,我觉得他们说到了点子上。

你仔细审视一种语言的内核,考虑哪些部分可以被摒弃,这至少也是一种很有用的训练。在长期的职业生涯中,我发现冗余的代码会导致更多冗余的代码,不仅软件如此,而且像我这样性格懒散的人,我发现在床底下和房间的角落里这个命题也成立,一件垃圾会产生更多的垃圾。

我的判断是,那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。

 

当然,猜测一百年后人们使用什么编程语言,这本身就是一个很大的假设。也许一百年后人类已经不编程了,或者直接告诉计算机想做什么,计算机就会自动完成。

不过,到目前为止,计算机智能并没有取得太大进展。我猜测一百年后,人们还是使用与现在差不多的程序指挥计算机。可能有一些我们今天需要编程解决的问题,那时已经不需要编程了,但是我想,那时还会存在大量与今天一样的编程任务。

你可能认为只有那些自以为是的人才会去预言一百年后的技术。但是,请不要忘记,软件发展的历史已经走过了 50年。在这 50年中,编程语言的进化其实是非常缓慢的,因此展望一百年后的语言并不是虚无缥缈的想法。

编程语言进化缓慢的原因在于它们并不是真正的技术。语言只是一种书写法,而程序则是一种严格符合规则的描述,以书面形式记录计算机应该如何解决你的问 题。所以,编程语言的进化速度更像数学符号的进化速度,而不像真正的技术(比如交通或通信技术)的进化速度。数学符号的进化是缓慢的渐变式变化,而不是真 正技术的那种跳跃式发展。

 

无论一百年后的计算机是什么样子,我们基本上可以断定它们的运行速度一定会快得多。如果摩尔定律依然成立,一百年后计算机的运行速度将是现在的 74乘以 10的 18次方倍(准确地说是 73 786 976 294 838 206 464倍)。真是让人难以想象。不过实际上更现实的预测并不是速度会提高这么多,而是摩尔定律最终将不成立。不管是什么东西,如果每 18个月就增长一倍,那么最后很可能会达到极限。但那时的计算机比现在快得多大概是毫无疑问的。即使最后只是略微快了 100万倍,也将实质性地改变编程的基本规则。如果其他条件不变,现在被认为运行速度慢的语言(即运行的效率不高)将来会有更大的发展空间。

那时,依然会有对运行速度要求很高的应用程序。我们希望计算机解决的有些问题其实是计算机本身引起的。比如,计算机处理视频的速度取决于生成这些视频的另一台计算机。此外,还有一些问题本身就要求无限快的处理能力,比如图像渲染、加密 /解密、模拟运算等。

既然在现实中一些应用程序本身的效率较低,而另一些应用程序会耗尽硬件提供的所有运算能力,那么有了更快速的计算机就意味着编程语言不得不应付更多的极 端情况,涵盖更大范围的效率要求。我们已经看到这种情况发生了。要是以几十年前的标准衡量,有一些使用新语言开发的热门应用程序对硬件资源的浪费非常惊 人。

不仅编程语言有这种现象,这实际上是一种普遍的历史趋势。随着技术的发展,每一代人都在做上一代人觉得很浪费的事情。 30年前的人要是看到我们今天如此随意地使用长途电话,一定会感到震惊。 100年前的人要是看到一个普通的包裹竟然也能享受一天内从波士顿发件、途经孟菲斯、抵达纽约的待遇,恐怕就要更震惊了。

 

我已经预测了,一旦未来硬件的性能大幅提高将会发生什么事。新增加的运算能力都会被糟蹋掉。

在我学习编程的年代,计算机还是稀罕玩意。我记得当时使用的微机型号是 TRS-80,它的内存只有 4K,为了把 BASIC程 序装入内存,我不得不把源码中的空格全部删除。我一想到那些极其低效率的软件,不断重复某些愚蠢的运算,把硬件的计算能力全部占用,就感到无法忍受。但 是,我的这种反应是错的,我就像某个出身贫寒的穷孩子,一听到要花钱就舍不得,即使把钱用在重要场合(比如去医院看病)都觉得很难接受。

某些浪费确实令人厌恶。比如有人就很讨厌 SUV(运动型多用途车),即使它采用可再生的清洁能源也改变不了看法,因为 SUV来自一个令人厌恶的想法(如何使得小货车看上去更有男子汉气概)。但是,并非所有的浪费都是坏的。既然如今的电信基础设施已经如此发达,再掐着时间打长途电话就有点锱铢必较了。如果有足够的资源,你可以将长途电话和本地电话视为同一件事,一切会变得更轻松。

浪费可以分成好的浪费和坏的浪费。我感兴趣的是好的浪费,即用更多的钱得到更简单的设计。所以,问题就变成了如何才能充分利用新硬件更强大的性能最有利地“浪费”它们?

对速度的追求是人类内心深处根深蒂固的欲望。当你看着计算机这个小玩意,就会不由自主地希望程序运行得越快越好,真的要下一番功夫才能把这种欲望克制住。设计编程语言的时候,我们应该有意识地问自己,什么时候可以放弃一些性能,换来一点点便利性的提高。

 

很多数据结构存在的原因都与计算机的速度有关。比如,今天的许多语言都同时有字符串和列表。从语义上看,字符串或多或少可以理解成列表的一个子集,其中 的每一个元素都是字符。那么,为什么还需要把字符串单列为一种数据类型呢?完全可以不这么做。只是为了提高效率,所以字符串才会存在。但是,这种以加快运 行速度为目的、却使得编程语言的语义大大复杂的行为,很不可取。编程语言设置字符串似乎就是一个过早优化的例子。

如果我们把一种语言的内核设想为一些基本公理的集合,那么仅仅为了提高效率就往内核添加多余的公理,却没有带来表达能力的提升,这肯定是一件很糟的事。没错,效率是很重要,但是我认为修改语言设计并不是提高效率的正确方法。

正确做法应该是将语言的语义与语言的实现予以分离。在语义上不需要同时存在列表和字符串,单单列表就够了。而在实现上做好编译器优化,使它在必要时把字符串作为连续字节的形式处理。

对于大多数程序,速度不是最关键的因素,所以你通常不需要费心考虑这种硬件层面上的微观管理。随着计算机速度越来越快,这一点已经越发明显了。

 

语言设计时,对实现方式少作限制还会使得程序具备更大的灵活性。语言的规格发生变化不仅是无法避免的,也是合理的。通过编译器的处理,按照以前规格开发的软件就会照常运行,这就提供了灵活性。

essay(论文)这个词来自法语的动词 essayer,意思是“试试看”。从这个原始意义来说,论文就是你写一篇文章,试着搞清楚某件事。软件也是如此。我觉得一些最好的软件就像论文一样,也就是说,当作者真正开始动手写这些软件的时候,他们其实不知道最后会写出什么结果。

Lisp语 言的黑客早就明白数据结构灵活性的价值。我们写程序的第一版时,往往会把所有事情都用列表的形式处理。所以,这些最初版本可能效率低下得惊人,你必须努力 克制自己才能忍住不动手优化它们,这就好像吃牛排的时候必须努力克制自己才能不去想牛排是从哪里来的一样,至少对我来说是这样的。

一百年后的程序员最需要的编程语言就是可以让你毫不费力地写出程序第一版的编程语言,哪怕它的效率低下得惊人(至少按我们今天的眼光来看是如此)。他们会说,他们想要的就是很容易上手的编程语言。

效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。随着计算机速度越来越快,这会变得越来越明显。

 

我觉得,放弃字符串类型已经是大家可以接受的想法了。 Arc语言已经这样做了,看上去效果不错。以前用正则表达式很难描述的一些操作,现在用回归函数可以表达得很简单。

这种数据结构的扁平化趋势会怎么发展?我极其努力地设想各种可能,得到的结果甚至令我自己都吓了一跳。比如,数组会不会消失?毕竟数组只是散列表的一个子集,其特点就是数组的键全部都是整数向量。进一步说,散列表本身会不会被列表取代呢?

还有比这更惊人的预言。在逻辑上其实不需要对整数设置单独的表示法,因为可以把它们也看作列表,整数n可以用一个 n元素的列表表示。这一样能完成数学运算,只是效率低得让人无法忍受。

编程语言会发展到放弃基本数据类型之一的整数这一步吗?我这样问并不是真的要你严肃思考这个问题,更多的是希望打开你对未来的思路。我只是提出一种假想 的情况:如果一股不可抗拒的力量遇到了一个不可移动的物体,会发生什么事。具体就本文而言:一种效率低得不可想象的语言遇到了性能强大得不可想象的硬件, 会发生什么事。我看不出放弃整数类型有什么不妥。未来相当漫长。如果我们想要减少语言内核中基本公理的数目,不妨把眼光放得远一点,想一想如果时间变量 t趋向无限会怎么样。一百年是一个很好的参考指标,如果你觉得某个想法在一百年后仍然可能是难以令人接受,那么也许一千年后它也依然难以令人接受。

让我说清楚,我的意思不是说所有的整数运算都用列表来实现,而是说语言的内核(不涉及任何编译器的实现)可以这样定义。在现实中,任何进行数学运算的程序可能都是以二进制形式表示数字,但是这属于编译器的优化,而不属于语言内核语义的一部分。

 

另一种消耗硬件性能的方法就是,在应用软件与硬件之间设置很多的软件层。这也是我们已经看到的一种趋势,许多新兴的语言就被编译成字节码 。比尔•伍兹曾经对我说,根据经验判断,每增加一个解释层,软件的运行速度就会慢一个数量级。但是,多余的软件层可以让编程灵活起来。

Arc语言 最初的版本就是一个极端的例子,它的层很多,运行速度非常慢,但是确实带来了相应的好处。Arc是一个典型的“元循环”( metacircular)解释器,在 Common Lisp的基础上开发,很像约翰•麦卡锡在他经典的 Lisp论文中定义的 eval函数。 Arc解释器一共只有几百行代码,所以很便于理解和修改。我们采用的 Common Lisp版本是 CLisp,它本身是在另一个字节码解释器的基础上开发的。所以,我们一共有两层解释器,最上面那层效率低下得惊人,但是语言本身是能用的。我承认只是勉强可用,但是确实能用。

 

即使是应用程序,使用多层形式开发也是一种很强大的技巧。自下而上的编程方法意味着要把软件分成好几层,每一层都可以充当它上面那一层的开发语言。这种方法往往会产生更小、更灵活的程序。它也是通往软件圣杯——可重用性( reusability)——的最佳路线。从定义上看,语言就是可以重用的。在编程语言的帮助下,你的应用程序越是采用这种多层形式开发,它的可重用性就越好。

可重用性这个概念多多少少与 20世纪 80年 代兴起的面向对象编程有些关联。不管怎样寻找证据,也不可能把这两件事完全分开。某些使用面向对象编程开发出来的软件确实具有可重用性,但是这不是因为它 使用了面向对象编程,而是因为它的开发方法是自下而上的。以函数库为例,它们具有可重用性,是因为它们属于语言的一部分,而不是因为它们采用面向对象或者 其他编程方法。

顺便说一句,我不认为面向对象编程将 来会消亡。我觉得,除了某些特定的领域,这种编程方法其实没有为优秀程序员带来很多好处,但是它对大公司有不可抗拒的吸引力。面向对象编程使得你有办法对 一团乱码似的代码进行可持续性开发。通过不断地打补丁,它让你将软件一步步做大。大公司总是倾向于采用这样的方式开发软件。我预计一百年后也是如此。

 

既然是谈论未来,最好谈谈并行计算( parallel computation),因为看上去并行计算好像就是为未来而存在的。无论怎么想,并行计算似乎都是未来生活的一部分。

它会在未来实现吗?过去二十年,人们都在说并行计算马上就会来临。但是,到目前为止,它对编程实践并没有太大影响。这是真的吗?芯片设计师已经不得不把它考虑在内,为多 CPU计算机开发系统软件的程序员也是如此。

但是,真正的问题在于,并行计算到底能达到哪个抽象层次?一百年后它就会影响到开发应用软件的程序员吗?或者,它还只是编译器作者需要考虑的事情,在应用软件的代码中根本就无处寻觅?

一种可能是,大多数可以用到并行计算的场合,人们都会放弃使用并行计算。虽然我总的预测是未来的软件会挥霍掉大部分新增的硬件性能,但是并行计算是一个 特例。我估计随着硬件性能得到惊人的提升,如果你明确地说想要并行计算,那么肯定可以得到它,但是通常情况下你不会用到它。这意味着,除了一些特殊的应用 程序,一百年后的并行计算不会是那种大规模的并行计算( massive parallelism)。我预料,对于普通程序员来说,一切更像对进程进行分叉,然后让多个进程在后台并行运行。

这是编程进行到很后期才要做的事情,属于对程序的优化,类似于你想开发一种特定的数据结构来取代现有的数据结构。程序的第一个版本通常会忽略并行计算提供的各种好处,就好像编程开始时会忽略某种特定的数据结构给你带来的好处一样。

除了某些特定的应用软件,一百年后,并行计算不会很流行。如果应用软件真的大量使用并行计算,这就属于过早优化了。

 

一百年后会有多少种编程语言?从最近来看,出现了大量的新语言。硬件性能提高是一个原因,这就允许程序员根据使用目的在运行速度和编程便利性之间做出不同的取舍。如果这就是未来的趋势,那么一百年后强大的硬件只会使得语言数目变得更多。

但是,另一方面,一百年后的常用语言可能只有很少几种。部分原因是基于我的乐观主义,我相信在未来,如果你的作品确实很出色,你可能选择的是一种开发起 来很方便的语言。使用这种语言写出来的软件第一版的运行速度很慢,只有对编译器进行优化设置后运行速度才会提升。既然我抱有这种乐观主义,那么我还要做一 个预言。有些语言可以达到机器的最高效率,另一些语言的效率则慢到刚刚可以运行而已,两者之间存在巨大的差距。我预言一百年后,这段差距之间的各个点上都 会有对应的编程语言存在。

因为这段差距正在变得越来越大,所以性能分析器( profiler) 将变得越来越重要。目前,性能分析并没有受到重视。许多人好像仍然相信,程序运行速度提升的关键在于开发出能够生成更快速代码的编译器。代码效率与机器性 能的差距正在不断加大,我们将会越来越清楚地看到,应用软件运行速度提升的关键在于有一个好的性能分析器帮助指导程序开发。

我说将来可能只有很少几种常用语言,但没有把用于特定领域的“小众语言”( little language)算进去。我觉得,这些嵌入式语言的想法很不错,一定会蓬勃发展。但是我判断这些“小众语言”会被设计成相当薄的一层,使得用户可以一眼看出在底下作为基础的通用型语言,这样就减少了学习时间,降低了使用成本。

谁来设计这些未来的语言?过去 10年最激动人心的趋势之一就是开源语言的崛起,比如 Perl、 Python和Ruby。语言设计已经被黑客接管。到目前为止这样到底是好是坏还看不清楚,但是发展势头令人鼓舞。比如, Perl就有一些绝妙的创新。不过,它也包含了一些很糟糕的想法。对于一种充满进取心、大胆探索的语言来说,这也是很正常的事。以它现在这种变化的速率,大概只有上帝才知道一百年后 Perl会变成什么样。

有一句俗话说,如果你自己做不到,那就去当老师。这在语言设计领域不成立,我认识的一些最出色的黑客就在当教授。但是,当老师的人确实有很多事情不能 做。研究性职位给黑客带来了一些限制。在任何学术领域,都有一些题目是可以做的,另一些题目是不可以做的。不幸的是,这两类题目的区别通常取决于它们写成 论文后看上去是不是很高深,而不是取决于它们对软件业的发展是否重要。最极端的例子可能就是文学,文学研究者的任何成果几乎对文学创作者都毫无影响。

虽然科学领域的状况要稍好一点,但是研究者可以做的题目与能够对设计优秀语言有所帮助的题目之间的交集小得令人沮丧。(奥林• 希弗斯曾经对这一点表达不满,而且说得头头是道。)比如,研究变量类型的论文好像多得无穷无尽,尽管事实上静态类型语言看来无法真正支持宏(在我看来,一种语言不支持宏,那就不值得使用了)。

新语言更多地以开源项目的形式出现,而不是以研究性项目的形式出现。这是语言的一种发展趋势。另一种发展趋势是,新语言的设计者更多的是本身就需要使用它们的应用软件作者,而不是编译器作者。这似乎是好的趋势,我期待它继续保持下去。

 

一百年后的物理学基本上不可能预测。但是计算机语言不一样,现在就动手设计一种一百年后可以吸引使用者的新语言,这在理论上似乎是可能的。

设计新语言的方法之一就是直接写下你想写的程序,不管编译器是否存在,也不管有没有支持它的硬件。这就是假设存在无限的资源供你支配。不管是今天还是一百年后,这样的假设好像都是有道理的。

你应该写什么程序?随便什么,只要能让你最省力地写出来就行。但是要注意,这必须是在你的思维没有被当前使用的编程语言影响的情况下。这种影响无处不 在,必须很努力才能克服。你也许觉得,对于人类这样懒惰的生物,喜欢用最省力的方式写程序是再自然不过的事情。但是事实上,我们的思想可能往往会受限于某 种现存的语言,只采用在这种语言看来更简单的形式,它对我们思想的束缚作用会大得令人震惊。新语言必须靠你自己去发现,不能依靠那些让你自然而然就沉下去 的思维定势。

 

采用程序的长度作为它耗费工作量的近似指标是个很有用的技巧。这里的程序长度当然不是指字符的数量,而是指各种句法元素的总长度,基本上就是整个解析树 的大小。也许不能说最短的程序就是写起来最省力的程序,但是当你一心想把程序写得简洁而不是松松垮垮时,你就更接近省力这个目标,你的日子也会变得好过得 多。所以,设计语言的正确做法就变成了,看着一段程序,然后问自己是不是能把它写得更短一点?

实际上,用想象出来的一种一百年后的语言来写程序,这件事情的可靠程度,取决于你对语言内核的估计是否足够正确。常规的排序,你现在就可以写出来。但是,想要预测一百年后的语言使用什么函数库就很难了。很可能许多函数库针对的领域现在还根本不存在。比如,如果 SETI@home 计划成功,我们就需要与外星人联系的函数库了。当然,如果外星人的文明高度发达,已经到了用 XML格式交换信息的地步,那就不需要新的函数库了。

另一个极端是,我觉得今天你就能设计出一百年后的语言内核。事实上,在有些人看来,大部分语言内核在1958年就已经设计出来了。

 

如果今天就能使用一百年后的编程语言,我们会用它编程吗?观古而知今。如果 1960年就能使用今天的编程语言,那时的人们会用它们吗?

在某些方面,回答是否定的。今天的编程语言依赖的硬件在 1960年并不存在。比如, Python这样的语言,正确的缩进( indentation)在编写时很重要,但是 1960年的计算机没有显示器,只有打印机终端,所以编写起来就不会很顺利。但是,如果把这些因素排除在外(你可以假设,我们只在纸上编程), 20世纪60年代的程序员会喜欢用现在的语言编程吗?

我想他们会的。某些缺乏想象力、深受早期编程语言思想影响的人可能会觉得不可能。(没有指针运算,如何复制数据?没有 goto语句,如何实现流程图?)但是我想,那时最聪明的程序员一定能轻松地使用今天的大多数语言,假定他们能得到的话。

如果我们现在就能拥有一百年后的编程语言,那就至少能用来写出优秀的伪码 。我们会用它开发软件吗?因为一百年后的编程语言需要为某些应用程序生成快速代码,所以很可能它生成的代码能够在我们的硬件上运行,速度也还可以接受。相比一百年后的用户,我们也许不得不对这种语言做更多的优化,但是总的来看,它应该仍然会为我们带来净收益。

 

现在,我们的两个观点就是:( 1)一百年后的编程语言在理论上今天就能设计出来;( 2)如果今天真能设计出这样一种语言,很可能现在就适合编程,并且能够产生更好的结果。如果我们把这两个观点联系起来,那就得出了一些有趣的可能性。为什么不现在就动手尝试写出一百年后的编程语言呢?

当你设计语言的时候,心里牢牢记住这个目标是有好处的。学习开车的时候,一个需要记住的原则就是要把车开直,不是通过将车身对齐画在地上的分隔线,而是通过瞄准远处的某个点。即使你的目标只在几米开外,这样做也是正确的。我认为,设计编程语言时,我们也应该这样做。

原文:http://blog.csdn.net/turingbooks/archive/2011/03/29/6285205.aspx

本文转载自: 图灵教育

 

Firefox 4 全球市场份额已超 IE9

Mozilla刚刚发布Firefox 4浏览器,不到一天其下载量就超过了IE 9的两倍。现在网站分析公司StatCounter 表示,Mozilla的新浏览器已经占据了世界浏览器市场的1.95%。相比之下,IE 9仅有0.87%。从上图中可以清晰得看到,也是最近才发布的Opera 11稳稳地超过IE9。

IE9不能与Windows XP兼容是其一大弊端,尽管这个操作系统已经发布有十年了,但是在世界上仍然有很多用户在使用。

StatCounter 称,从总体上来分析,IE 浏览器仍旧领导全球的浏览器市场的45%,Firefox和Chrome以30%和17%的市场份额紧随其后。这家分析公司最近曾表 示,Firefox2010年12月已经成为了欧洲第一。在美国IE的市场份额还要大点,达到了48%,而Firefox和Chrome的份额只有26% 和14%。

StatCounter 还称,全球在线用户每月浏览超过300万家网站,从150亿页网页中收集信息。

后 PC 时代:科技与人文艺术的结合

比尔盖茨在最近的一次言论中,认为教育投资上应减少人文艺术方面的投入,将更多的资金投入到能够产生更多工作机会的地方。

恰好在随后的 iPad2 发布会上,乔布斯提到了人文艺术的重要性。

只有技术是不够的,这种理念已经融入了苹果的 DNA——是科技与人文艺术的结合,与人性的结合,造就了合乎我们心意的产品,这在后 PC 设备上体现的更加明确。

针对这两种几乎是针锋相对的言论,纽约时报邀请杜克大学的教授 Vivek Wadhwa 撰写一篇文章,探讨人文艺术与科技的关系,而 Vivek Wadhwa 的观点出乎纽约时报的预料,Vivek 认为人文艺术和科技同样重要,真正伟大的产品是两者的结合

 

尽管我仍相信工程学是最重要的专业之一。我已经领悟到,人文艺术同样重要。要制造出 iPad 这样优雅的产品,需要艺术家、音乐家、心理学家与工程师一起合作。任何人——无论在那个领域接受教育——都能够在硅谷获得成功。

可见,人文艺术在后 PC 时代之所以越来越重要,这股由苹果带来的风潮中,技术已经退居幕后,用户体验成为产品成败的标准。对于公司来说,用户体验的优劣取决于良好的产品设计,而设计不仅仅是技术领域,更是人文艺术的展现,设计师和工程师同样重要,毕竟通才总是极少数的。

你可以教会艺术家使用软件和图像处理工具,但是将工程师变成艺术家更加困难。

via TechCrunch

 

成功公司里鲜为人知的小秘密

有多少次你曾经听到一些公司的领导说,公司之所以成功是因为拥有优秀的人才?你在演讲里听过,在采访里、书里、公司的宣传资料上读到过。听起来很对 —— 很好、很谦虚、很有风度。他们说的很正确,但他们没有说出故事的全部。

在这些访谈里、书里,这些人没有告诉你的事情是 —— 我读了不少这些东西 —— 优秀的公司也许在很多事情上都很优秀,但他们并非都总是招 募到正确的人。这使它们处在跟其它的公司相同的处境(也许几率会小些)。这是一个鲜为人知的小秘密:即使是优秀的公司也不得不解雇一些不能出活的员工。你 很少听到这样的消息,因为解雇员工不会产生好的公共关系形象。并不是说这看起来不好、不仁慈。但这确实会给人留下一个负面的印象。

这些年来在用人上的失误经常让我困惑:我究竟错在哪里?我怀疑我是否是唯一一个为这种事情而困惑挣扎的人。我精心经营着我的公司,面对着所有因为没有掌握到最好的招募、培训和管理员工的方法而带来的不良后果。这里所写的就是我最终学到的一些经验。

如果你想创办一个优秀的公司 —— 给客户优秀的服务、优秀的产品,让员工愉快和一个好的盈利,你时不时的就需要去招募。招到了谁?一个经过殚精竭虑的培训、指导、忠告后仍然不能干活的人。 一个如果10分为满分只能得到大概6分的人 —— 但正是这6分让人棘手。他们并不是很差,但确实不够好。

你怎么看出他们只有6分?你了解他们。你甚至喜欢他们。他们看起来有能力,但总感觉不那么可靠。他们经常犯错误,他们对人不好,他们很马虎,他们不 能很好的把个人时间和工作时间区分开,他们不太诚实,他们不承担责任,他们拖拉,对同事不友好。这真正的考验是:如果他们辞职,你内心深处的反应是什么? 松了口气?我想这说明了一切。

对于所有的这些有问题人,这有一个度的考量。有人痛苦的面对很多这样的人,有人对其中的一两个人非常的不爽。根据同其它的几个企业老板交流的结果, 我可以告诉你,大多数的老板都会留下一些6分的人(甚至4分或5分)。他们承认挣扎于是否解雇他们的想法中。当然他们是有权利的。老板留下这些人,因为这 能让这些人高兴些。可问题是,经常事与愿违。

这些老板努力使公司“更上一层楼”,让公司更盈利或只是守住市场份额。可问题是,开除员工不是件有趣、轻松、高兴的事情。事实上,这可能是当老板最 难做的一种事情。大多数情况下,这些人都还是挺好的,他们努力工作,只是不太胜任。问题就在于该怎么办?在一本书中我看到过各种合理化建议(好像是一本如 何管理小公司的书)。人们都很困惑;我也很困惑。你很难在“做一个好老板”和“做一个好人”之间选择。

我曾经给一大批保险经纪人做一个讲座。讲座之前,组织者让我和这些经纪人坐在一个圆桌旁讨论公司运营问题。一位女士说她的公司现在正在发展阶段,她 新招聘了一批销售人员去扩大业务。我问她如果6个月后一个销售人员明显没有任何业绩,会炒了他吗?她不加思索的脱口而出,“我需要考量一下对我个人的影 响!” —— 就好象是解雇一个不能干活的人会破坏了她的名声。

我对是否把一些不能干活的人留在身边这种事情思考了很久。这种做法对于其他员工不太公平,同样对客户也不公平。坐一个只有“6分”的飞行员开的飞 机,你的感觉是怎样?你能放心一个只有“6分”的护士照看你医院里的老妈妈吗?还有修你的车刹的修理工,负责你的保单内容的保险经纪人等。

有些5分的员工在更换岗位后也许会达到9分(可能就在你的公司里)。如果你真的想经营一个优秀的公司,你必须把合适的人放在合适的位置上。有些人也 许会提问说:你怎么有权利下这些论断 —— 但如果这事牵涉到你,那这不仅是你的权利,而且是你的义务。而且,以我个人一个拥有102名员工的公司的经验,我可以告诉你,如果员工能各司其职,各施所 长,企业经营就变得容易多了。

人们经常问我为什么有时间写这些博客文章。这是因为我有优秀的读者!

本文转载自: 外刊IT评论 http://www.aqee.net/

 

微软的再度崛起

在舆论的视野中,微软在网络时代的表现一向有点负面。这个昔日的软件霸主,面对咄咄逼人的谷歌,给人一种感觉就是老去的王者。不过,如果我们严谨一点来审视的话,事实并非如此。比如说,最新的2011年第二季度财报,微软的利润为66.3亿美元,相比之下,市值超过它近600亿美元的苹果,利润为60亿美元。无疑,微软还是相当会赚钱的。

在这份财报中,我们看到,软件领域有了24%的增长,其中,微软的office并没有受到谷歌文档的多大冲击。Office 2010比office 2007多卖出了50%的数量。而在娱乐领域,微软更是创下了60天大卖800万台kinect的奇迹。这款游戏设备的外设,同时也拉动了xbox360的销售:多卖了21%。娱乐领域的总成绩单是:收入增长56%。

在一些稍许不那么有直接商业利益的领域中,微软也干得不错。微软先后建立了三个同盟:微软和雅虎的同盟、微软和facebook的同盟,以及微软和诺基亚的同盟。前者是搜索领域中的合作。在邀买雅虎失败后,微软和雅虎在搜索上达成以bing为核心的搜索合作协议。而这个新的搜索(包括以bing为核心的雅虎搜索和bing搜索自身),根据Hitwise的调研,已经占到了美国市场的27.44%的市场份额,bing自身的市场份额较去年12月份大幅提升21%。

除了搜索引擎自身的市场份额,微软还和facebook于今年1月达成了一个合作协议:微软将向Facebook提供一个网络开发接口,Facebook能够使用微软提供的API来把微软的网络搜索和付费搜索结果整合到Facebook在美国的网站当中。在这个协议的框架下,微软成为了facebook在美国的唯一搜索引擎提供商。很明显,搜索市场上,微软正在急起直追。

另外一个诺微同盟则是刚刚发生的事。诺基亚宣布全面转向windows phone 7操作系统,固然是诺基亚的自救,亦可视为微软获得了一个硬件制造商的重要支持。这个支持,对于微软进攻如日中天的苹果市场和日益壮大的安卓市场,是非常重要的。诺基亚虽然已远不如当年,但毕竟瘦死骆驼比马大,如果合作良好,以过于封闭的苹果系统和过于开放的安卓系统,win系统诺基亚手机,并非没有机会。

而这一合作,其实有一个前提,可能是在诺微合作中,很多评论所忽视的。那就是稍早时(今年一月),微软宣布,下一个windows版本将支持ARM处理器。可以这么说,如果微软不支持ARM处理器的话,那么,诺微合作的成效,将大打折扣。

如果说英特尔是电脑CPU的统治者的话,那么,ARM就是移动设备CPU中的头号选手。有资料说,这家公司的产品,占据手机处理器90%,上网本处理器30%,平板电脑处理器80%的市场份额——诺基亚手机就是使用ARM的CPU。故而,微软在年头向ARM示好的动作,或可视为这次诺微合作的伏笔。

相对于英特尔的CPU,ARM的则被视为低端CPU,具有成本低和能耗省的特点,而移动终端,特别是手机,限于设备的体积大小以及移动要求,非常需要这样的CPU,而不是价格高昂的英特尔产品。凭借这一点,使用ARM的iPad以及ARM与Android操作系统组合,都是2010年市场中相当闪亮的组合。

在与英特尔的较量中,ARM使用的是第三方授权模式,使得在ARM周围,有几十家半导体企业在和ARM一起合作生产芯片,使得ARM形成了自己的“ARM生态圈”,而英特尔闷起头来自己搞ATOM,成本高昂,且至今ATOM处理器功耗依然无法达到ARM处理器的水平。在移动领域,ARM的江山,相当牢固。

微软借助所谓的wintel联盟,携手英特尔统治PC市场多年,事实上也成为了桌面互联网真正的上游企业。在移动互联网时代,微软清晰地认识到,再守着wintel联盟并非明智之举。在利用windows版本对ARM的支持,携手诺基亚拓展windows phone 7系统,意味着微软开始倒向ARM。所谓没有永恒的朋友,只有永恒的利益,这句话大概是这段时间里微软频频动作的最好注解。

不过,ARM处理器到底性能比英特尔差了些,故而终端设备虽然由于价廉而得到普及,但数据处理能力也会相对较弱。这就有必要引入一个概念,来应对这个状况。这就是:云计算。

云计算这种将主要信息处理能力置于服务器端的模式,可以允许终端设备性能较弱。以微软这种巨头规模,不可能在这个方面缺失。故而,微软也早就开始布局云计算。

在2010年的年报中,微软在研发上投入了87亿美元,其中大部分都是与云计算相关的技术,据微软全球资深副总裁梁念坚称,目前微软近4万名工程师中,有7成的人与云计算有关,而今年这个比例将会达到90%。

云计算是一个强调“生态”的模式,也就是要有开放的心态和更多的第三方合作。微软向云计算如此着力地转型,在我看来,它已经学会了互联网时代建立广泛同盟的必要性。同时,云计算力量的强大,也为ARM核心的低端设备提供极好的支持。也许,在未来,wintel联盟依然在桌面互联网为微软获取真金白银,win-arm结构则在移动互联网中为微软打下同样身处上游的位置。

在苹果的乔布斯健康恶化,谷歌要召回创始人重任船长的今天,微软绝对是值得密切关注的数字巨头。与前两者过度依赖某个创始人不同的是,微软已经是一个不再依靠任何一个个体的成熟公司。这种公司,一旦战略大方向无误,它的竞争力,将会是惊人的。坦率地讲,我相当愿意用“重新崛起”来形容这个公司。微软,正在重生。

 

原文链接:http://weiwuhui.com/4146.html

 

哪本书是每个程序员都该阅读的?

本文是从 What is the single most influential book every programmer should read? 这篇文章翻译而来。

国外知名网站stackoverflow上有一个问题调查: 哪本书是对程序员最有影响、每个程序员都该阅读的书?, 这个调查已历时两年,目前为止吸引了153,432人访问,读者共推荐出了478本书(还在增加),其中最火的一本书《Code Complete》被顶了1306次。如果你是个程序员,你一定有兴趣看看这些书里你都看过几本,如果你一本没看过的话,我也不好说什么,也许你是个天 才,但我相信大多数人都知道,你在学校里根本学不到什么真正的工作中需要的知识,我们毕业后能帮助我们在公司中胜任工作的老师就是这些优秀的书籍,一本好 书可以改变一个人的一生。

下面是这个调查中排名靠前的书的一个简单的清单:

  1. 第一名:1306票《Code Complete (2nd Ed) by Steve McConnell》,中文版《代码大全(第二版)》,两届Software Jolt Award震撼大奖得主!
  2. 第二名:1161票 《The Pragmatic Programmer》,中文版《程序员修炼之道
  3. 第三名:689票 《Structure and Interpretation of Computer Programs》,中文版《计算机程序的构造和解释》
  4. 第四名:557票 《The C Programming Language》,中文版《C程序设计语言
  5. 第五名:472票 《Refactoring: Improving the Design of Existing Code》,中文版《重构:改善既有代码的设计
  6. 第六名:472票 《Introduction to algorithms》,中文版《算法导论
  7. 第七名:430票 《The Mythical Man-Month》,中文版《人月神话
  8. 第八名:426票 《Design Patterns》,中文版《设计模式
  9. 第九名:386票 《The Art of Computer Programming(First Volume Hardcover)》,中文版《计算机程序设计艺术第 (第一卷)
  10. 第10名:353票 《Compilers: Principles, Techniques, and Tools 》,中文版《编译原理
  11. 第11名:329票 《Head-First Design Patterns》,中文版《Head First 设计模式

当然了,这里的排名并不具有什么权威性,但绝对可以说都是好书,这11本外还有很多书虽然票数不是那么多,但大家估计都耳熟能详,比如《Effective C++》(中文版《Effective C++:改善程序与设计的55个具体做法》),《Clean Code》(中文版《代码整洁之道》),《Effective Java》(中文版《Effective Java中文版(第2版)》等 。

记得有位先哲曾说过:一种编程语言的重要性并不在于语言本身,而是在于这种语言来体现出来的编程思维模式。所以说,并不是你用到的书才去读,读书是一种习惯。

本文转载自: 外刊IT评论 http://www.aqee.net/

 

 

 

 

 

 

自由职业者:你网站上必须有的10个页面

编者按:本文标题中虽标明是“自由职业者”,但不仅适用于这一群体,同样适用于博主(比如IT和美术相关专业)。如果你能在博客中展示你的作品(最终是展现能力),通过网络传播,理想的潜在雇主,或许就会主动联系你。

几天前,我在Twitter上看见一句很在理的话:“你的博客是一份新的简历。”

千真万确!如今,每个人都熟悉网络,我们只需要在网上搜索一个人的名字就能了解他的爱好。即使你的潜在客户没有网上业务,他们也明白通过互联网可以轻松获取关于你的更多信息。

他们最可能找到什么信息呢?Facebook 上的囧照?Twitter上的谄媚评论?还是你在博客中对客户的抱怨?

为什么你的博客(网站)如此重要

如果想让你的自由职业者网站或博客能有助你走向巅峰,有一个途径是:确保拥有以下所列必不可少的页面。这些页面会帮助你的潜在客户:

  • 了解你最擅长什么和能从你这获得什么帮助
  • 发现你有多出色
  • 判断是否有能力雇用你
  • 了解、欣赏、信任你
  • 联系你以发掘合作机会

优秀的自由职业网站只有一个目的:使来访者更多地了解你。他们直接联系你或者他们留下的联系方式,你便可以持续发给他们自己的更多信息。

这10个必备页面是:

1. 主页

这是来访者来到网站上最有可能先见到的页面。这可以是静态页面,也可以是博客索引页。无论哪种方式,都要让来访者在几秒钟之内就明白自己是否来到了想要的地方。

为此,主页应传达的信息应包括你做什么及为谁做。应该非常明显地表明自己是一个可雇用自由职业者。避免诙谐的标题,而应简洁明了。

2. “关于”页面

想要更多地了解你本人的来访者会寻找“关于”页面。一定要提供基本资料,例如你是谁,你在哪(尤其是当你目标是当地客户的时候)。让他们了解你 的特别之处,知道你与其他同行的差别。这页面不是用来列出你的资格证书的(以后会越来越多),而是用来展示你的所长及你是如何获得这些成就的。

如果你有些与服务无关的怪癖和爱好,但却使你更风趣,你也可以在这里提及。谨记,人们雇用的是同伴,而不是机器人。

举例来说,我是如何得到第一份工作的。当时我应聘一家儿童电视制作机构的研究员。我有通讯专业的学位及一些电视制作行业的在职培训经历。然而,老板雇佣我的原因竟是我简历中提到的我喜欢唱歌并且曾在一些业余剧团里演出。

唱歌的确与该工作说明毫无关系,但却是我从其他求职者中胜出的原因。(多年以后,我在一场演出中当替唱演员。)

你不会知道什么使你应聘成功,所以,即使看似无关,也要列出你热衷的事情。

3. 你的服务

专门用一个页面来描述你所能提供的项目细节。如果过于复杂,你甚至可以每页介绍一个服务,但是一定要有一个列出所有服务的页面。

要不要公开报价?这没有严格规定。就我个人而言,我不喜欢让潜在客户去猜。如果他们无法请我,我宁愿他们离开,也不愿他们问我要份竞标书,然后跟我说他们根本付不起!

同时,对于不同的项目我的报价也不同,所以每项服务我都会发布一个最低价格。让客户知道哪个适合他及他最喜欢哪个。

有关这个页面,有一件很重要的事要记住,那就是要明白你的服务会如何使客户受益。记住,你不仅是写文章、设计网站或是写代码。你是在帮助客户节省时间,使他们不必纠结于不擅长的领域,并帮他们赚更多的钱。

4. 客户推荐信

选几个最好的客户评价,发表在客户评价页面上。

有了客户评价,评价中有关你的服务越详细越好。得到客户许可后,发布她们的全名、地址(提到城市便可)、照片和网站地址,这些是最起码的。

你的潜在客户想要知道雇用你不是在冒险,因为你已经有很多满意的客户了。

5. 简历

这是详细描述你的专业背景和资格证书的页面:你何时何地取得的学位;你在哪工作过,做过什么;你得过什么奖,和其他一些我们会放到纸面简历上的东西。

但是,毕竟这是网络,你可以在语气和措辞上稍加修饰。不必非常正式(取决于目标人群),也不必与纸质简历相似。

6. 案例

让来访者知道一下你擅长什么。做一个展示你代表作的页面,理想上,每项服务要有至少一个工作样本。

在将为他们完成的作品展示到网站上之前,首先要经过客户的同意,或在你的网站上提供他们的链接。大多数客户都会很高兴被列在你的案例页面中,但是还有一些案例需要保密。

如果是那样的话,问问客户,你是否可以通过邮件发案例给潜在客户看,而不是放在网站上。额外的私下交流也许足以让你的客户同意。

7. 联系方式

一些自由职业者说最好是网站的每个页面都有你的联系方式。至少,留出一个他们可以给自己发邮件的地方,或找到如何联系自己的地方。

可以将此页面链接到网站的所有页面上,那样,不论来访者在哪,一旦他们需要你,只需点击一下就能与你取得联系了。

8. 常见问题页面(FAQ)

常见问题页面可以帮你减少所需回复的邮件数量。把经常问到的问题列出来。可以有关你的服务价格,付款方式或工作流程。(编注:FAQ相关详细信息,请参阅伯乐在线职场博客的《自由职业者:添加FAQ页面有助于获得更多客户并节省时间》一文。)

如果你之前回复过这些,你只需要将答案复制粘贴,就能制作一个FAQ页面了。

9. 隐私条款和其他法律措辞

许多网站所有者都疏忽了这个策略!随着越来越多的人对垃圾信息的了解与烦恼,在适当的位置附一个隐私策略是一个好主意。

其他容易疏忽的政策包括网站的内容著作权。若要促销与你有关联的产品和服务,你将需要在网站上披露。

我不是律师,所以我为自己的网站购买了定制的隐私条款。你也可以多多打听,然后找到自己所需。

10. 准顾客收集页面或登记表

准顾客收集页面(Squeeze Page)可以用来保存访问者的联系方式,通常是一个名字和一个邮箱。另一种方法,你可以在网站每个网页的角落附上一个登记表。

考虑到并不是每个来访者都会联系你。附上一个准顾客收集页面或登记表可以让你留住他们的联系方式,这样你便可以通过邮箱与他们再次沟通。

提供一些免费的东西是个好主意,通常是一个专题报告或者甚至一个软件、插件或图表,以此来交换他们的联系方式。

一旦他们留下了联系方式,你便可以定期与他们沟通,让你在他们的心目中留下深刻印象,当你需要新客户时,你可以给他们优惠。

以上这些就是我总结的自由职业网站上的10个必备页面。这些页面可以展示提供的服务,将你置身到行业专家的行列中,并且你与潜在客户建立联系。
原文链接:http://freelancefolder.com/10-essential-pages-in-your-freelance-site/
译文链接:http://www.jobbole.com/entry.php/533