国外网站评出对程序员最具影响的书籍清单

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

第一名:1333票《Code Complete (2nd Ed) by Steve McConnell》,中文版《代码大全(第二版)》,两届Software Jolt Award震撼大奖得主! 

code complete

第二名:1181票 《The Pragmatic Programmer》,中文版《程序员修炼之道》 

第三名:701票 《Structure and Interpretation of Computer Programs》,中文版《计算机程序的构造和解释》

第四名:572票 《The C Programming Language》,中文版《C程序设计语言》 

第五名:481票 《Introduction to algorithms》,中文版《算法导论》 

第六名:478票 《Refactoring: Improving the Design of Existing Code》,中文版《重构:改善既有代码的设计》 

第七名:447票 《The Mythical Man-Month》,中文版《人月神话》 

第八名:440票 《Design Patterns》,中文版《设计模式》 

第九名:394票 《The Art of Computer Programming(First Volume Hardcover)》,中文版《计算机程序设计艺术(第一卷)》 

第10名:364票 《Compilers: Principles, Techniques, and Tools 》,中文版《编译原理》 

第11名:329票 《Head-First Design Patterns》,中文版《Head First 设计模式》 

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

来自http://book.51cto.com/art/201103/249957.htm

理想主义者–理查德.马修.斯托曼(GNU的传奇)

理查德·马修·斯托曼是美国自由软件运动的精神领袖、GNU计划以及自由软件基 金会(Free Software Foundation)的创立者。作为一个著名的黑客,他的主要成就包括Emacs及后来的GNU Emacs,GNU C 编译程序及GNU 除错器。他所写作的GNU通用公共许可证(GNU GPL)是世上最广为采用的自由软件许可证,为copyleft观念开拓出一条崭新的道路。

1990年代中期,斯托曼把他大部时间花在作为一个政治运动者,为自由软件辩护,对抗软件概念专利及版权法的扩张。他仍在程序设计方面奉献的心力都放在GNU Emacs。他的演讲当中大约半数有收入,这让他能够养活自己。

他最大的影响是为自由软件运动竖立了道德、政治以及法律框架。他被许多人誉为当今自由软件的斗士、伟大的理想主义者,但同时也有人批评他过于固执、观点落伍。

       斯托尔曼

       我相信,不知道微软、比尔.盖茨、windows操作系统的中国人没有多少了。我也相信,绝大多数中国人不知道GNU、FSF,不知道理查德.马修.斯托曼(Richard.Matthew.Stallman, RMS),甚至包括许多计算机专业的大学生。这篇文章正是写给这些人看的,其主要材料来自于方兴东写的一篇关于斯托曼的传记类文章,加了一些个人理解。

    中国,是一个软件盗版大国,我所见的人们,没有几个人是用正版软件的。凡是懂得一点知识产权的人,也许会觉得用盗版软件是不道德的。好象这种道德观念是天经地义的,就象人们本应当互相关爱一样。微软也总是理直气壮的将一个又一个侵犯它的版权的用户告上法庭,它的理由很简单:软件是有版权的,用户未经许可,任何复制、传播行为都是非法的。

    软件不允许复制传播,也许全世界的人们都认可,但一个叫做理查德.马修.斯托曼的人到死都不会苟同这种认识。上幼儿园时,老师就会教导我们:“如果你有糖,不应该独个吃,而应该和别的孩子一起分享它!”但现在,你有了一套很好用的软件,当你打算和朋友分享它的时候,这时有人告诫你:“不要那么做,不然你会因此而坐牢的。”社会应该是这样子的吗?不,它绝不能是这样的。理查德.马修.斯托曼认为用户彼此拷贝软件不但不是“盗版”,而是体现了人类天性的互助美德。对理查德.马修.斯托曼来说,自由是根本,用户可自由共享软件成果,随便拷贝和修改代码。他说:“想想看,如果有人同你说:‘只要你保证不拷贝给其他人用的话,我就把这些宝贝拷贝给你。’其实,这样的人才是魔鬼;而诱人当魔鬼的,则是卖高价软件的人。”理查德.马修.斯托曼说出他的这些观点是在 20世纪80年代的初期。

    理查德.马修.斯托曼这个人是“五短身材,不修边幅,过肩长发,连鬓胡子,时髦的半袖沙滩上装,一副披头士的打扮。看起来象现代都市里的野人。如果他将一件“麻布僧袍”穿在身上,又戴上一顶圆形宽边帽子,有如绘画作品中环绕圣像头上的光环。一眨眼的功夫,他又变成圣经中的耶稣基督的样子,散发着先知般的威严和力量。”这当然是作家的描写,我眼中的斯托曼只是一个普通人,一个具有崇高理想的普通人,一个颠覆了商业软件领域的人。他是美国科学院院士,但他更像是一个传教士,率领无数信徒沿着一个神圣的方向前行。按照我们这个国家目前的政治信仰,斯托曼是一个彻底的共产主义者。我毫不掩饰自己对于共产主义的见解,共产主义在某种程度上就是理想主义,一种摆脱了低级趣味的、朴素而高尚的主义。

    1971年,18岁的斯托曼在麻省理工大学(MIT)的人工智能实验室做了一名程序员。那时,他们有一个软件共享社区,他们为当时的人工智能实验室的计算机编写了一个分时操作系统,并不断地对其进行修改,当时无论是某个公司成员或另一所大学想获得它,大家都会非常高兴地把源程序给他。如果你看到别人使用一种你没见过且有意思的程序,你可以坦然地向他索要程序,这样你就可以读它、改它,或拆卸部分用于新的程序。社区中的这些人是真正意义上的黑客,而现代的大多数所谓的黑客,则是计算机的驻虫。就这样,那时所有软件都是共享的,私有让人嘲笑,专用受人鄙视。当然,这种共享,只是在这个特定的社区中,那时全世界没有多少人掌握计算机技术。斯托曼很快就成为这个社区的重要成员。

    20世纪70年代末,微软公司的创始人比尔·盖茨《致电脑业余爱好者的一封公开信》为标志,以世界知识产权组织《伯尔尼公约》为框架,软件步入了版权时代。随着现代商业软件的发展,对利润的疯狂追逐不但割裂了传统,极大地偏离了计算机的基本精神。而且还在不断变本加厉。专有软件所有者制订了规则: “如果你与你的邻居共享,你就是盗版者。如果你想作点改动,那你得乞求我们来做。” 到80年代后,计算机的商业化和软件专有化席卷整个产业,黑客们的黄金时代结束了。一个又一个有才能的MIT程序员离开了校园,投入了市场的怀抱。尤其是 Symbolics公司的成立,挖走了社区中的许多黑客,大大伤了MIT人工智能实验室的元气。斯托曼感到:一个时代结束了。

    斯托曼说:“那时,人工智能实验室已没法再支持下去,我是最后一个还想让它活起来的呆瓜。但后来我也没办法了,因为一个人根本发挥不了作用。……随着社区的终结,我面临着一个道德上的抉择。最简单的就是投身于专有软件世界之中,签署不公开协议,并承诺不帮助同行、同事。而且自己也很可能编写软件,并在不公开协议的前提下发布软件,去同流合污,迫使更多的人背叛自己的原则。显然,走这条路,可以挣大钱,而且使编写代码的工作增添一份金钱上的快乐。但是我知道,等到自己职业生涯终结时,我再回首这些年为分离人类而砌造的‘墙壁’。我会感受到,我将自己的一生都用在使这个世界变得更加糟糕。” 而他的另一个选择,很直截了当,但令人不愉快,那就是从此离开计算机领域。“这样我的技能不会被滥用,但也将被浪费,我不会因为分化和限制计算机用户而感到有罪,但这些事情会继续发生。……因此,我开始寻找一条出路,使程序员可以做真正的好事。我问自己,我能写什么软件,我能否让社区重焕生机。”

    我深信斯托曼所陈述的当时的心理活动都是很真实的,因为他后来的一切活动都在围绕一个目的:使程序员可以做真正的好事!于是,他与专有软件领域开始了抗争,这种抗争一直持续到现在,将来依然存在,只要专有软件一天不消失,它就会存在。

    开始时,斯托曼在思考,首先需要的是一个操作系统,这是开始使用计算机的关键软件。有了操作系统,就能做许多事,没有操作系统,计算机都无法运行。有了自由操作系统,我们就能再次组建一个相互合作的黑客社区。而且任何人使用自由软件都不必剥夺他/她与朋友家人的共享权利。作为一名系统开发者,无疑,斯托曼是可以胜任这项高尚的工作的。“虽然我没有认为自己一定能成功,但我意识到自己就是命定做这项工作的。”斯托曼选择做一个与Unix兼容的操作系统。这样容易被移植,而且Unix用户可以方便地转移过来。这个系统的名字就叫GNU,这个名字的确定就是遵循黑客传统,是一个递归的缩略词:“GNU IS NOT UNIX。” 也许,刚接触电脑,只知道天下有windows的的朋友们会问,为什么不与windows兼容呢?因为那时还没有windows。有unix的时候,微软尚未存在。

    但一个操作系统并不仅仅意味着一个内核(管理磁盘,内存分配等),而且仅能运行其他程序也是不够的。一个完整的操作系统,还需要有指令处理器、汇编程序、编译器、解释程序、调试器、文本编辑器、邮件软件等等,这样才能形成一个完整的系统。开发这样一个完整的系统是项庞大的工程。斯托曼决定尽可能采用已有的自由软件,比如一开始他将Tex作为主要的文本格式标识符,几年后他又用X Windows系统作为GUN的窗口系统。

    1984年1月,斯托曼已启动了GNU计划,他担心MIT会要求产品的所有权,会给产品强加入他们的销售条件,最终又会成为专有软件,因而他辞去了 MIT的工作。辞职后,他为买不起电脑而发愁时,发现自己原来在人工智能实验室的办公室,还没有分给其他人用时,这样他就每天晚上溜进去工作。久而久之,白天他也跑去用实验室里的电脑。 当时人工智能实验室主任Patrick H. Winston并不干涉。因为Winston始终不把斯托曼的辞职当真,只要斯托曼能创造些好东西给大家用,实在没有必要把这位共事13年的老同事打发走路。因此他爽快地邀请斯托曼可以继续使用实验室的设备。从此,斯托曼就成了特殊的一员。

    GNU工程启动后,斯托曼听说有一个自由大学编译器套件(VUCK)。他去信询问能否用入 GNU。答复是嘲弄式的,说对大学是自由的,但对软件本身不行。于是,决定他为GUN编写的第一个软件就是一个多语言、多平台的编译器。他想利用 Pastel编译器的源代码,但最终放弃。从头编写了新的编译器,名为GCC。(可能刚接触计算机的朋友又不懂了,不知道什么是编译器。简单的说,我们所用的软件几乎都是由编译器生成的)。

    1984年9月,斯托曼开始开发字处理器GUN Emacs,1985年初,它开始可以工作。这使它可以在Unix系统上进行文本编辑。此时,许多人想使用Emacs,因此一个现实的问题是:如何传播它?当然,他将其放到了MIT计算机的匿名服务器上。但那时互联网还未普及,人们很难通过FTP获得拷贝,而且失业的斯托曼也需要收入。于是,他宣布任何人都可以用150美元的价格获得全部程序。这就是说,如果你愿意从网上下载,就下载,是免费的。如果你无法从网上下载,那么就要支付一些费用才能得到,当然,所支付的费用是远低于当时的专有软件的价格的,而且,用户可以得到软件的源代码,这是专有软件最为忌讳的事情。这样,自由软件的分销商业模式就此诞生。如今,整个基于Linux的GUN系统都是如此。

    由于GNU是公开源代码的,为了防止不肖厂商利用自由软件,使其专有化。斯托曼别出心裁,创造了Copyleft的授权办法,让所有的 GNU程序遵循一种“Copyleft”原则,即可以拷贝,可以修改,可以出售,只是有一条:源代码所有的改进和修改必须向每个用户公开,所有用户都可以获得改动后的源码。Copyleft保证了自由软件传播的延续性。我相信,很大一部分人对自由软件是否公开源代码不感兴趣,只是对其免费比较感兴趣,但自由软件和销售拷贝之间并没有矛盾。事实上,销售拷贝的自由是至关重要的:把自由软件收集到CD-ROM上出售对整个社团都很重要,而销售它们又是为开发自由软件筹集资金的重要手段。因此,如果人们无法将某个程序自由地收集到这些集合中时,这个软件就不是自由软件。虽然自由软件允许收费,但我并没有看到卖的很昂贵的自由软件。譬如,同样是操作系统,WINDOWS XP卖了上千块人民币,而一套Fedora Core 5只花数十元人民币就能得到。另外,你买了WINDOWS XP,并不算完,像office系列软件等依然需要购买。而一套Fedora Core 4是一个完整的系统,包括了大多数常用软件。

    斯托曼的EMACS得到许多用户的喜爱,有一大堆人去玩它,然后精益求精,越改越好。目前已有几百种EMACS的副程序,可用在50多种电脑上,从微电脑到Cray的超级电脑都可用EMACS。 由于EMACS的成功,Richard Stallman设立了一个基金会:自由软件基金会(Free Software Foundation FSF);凡是捐助FSF和GNU计划的厂商,可享有一些优待。这样,单单1989年,FSF就收到267782美元的捐助,基金会也因出售GNU程序手册和磁带,而赚了330377美元。此外,斯托曼也不再天天溜回人工智能实验室“借”用电脑,因为许多厂家已为FSF提供一大堆的高性能工作站等硬件设备,包括HP、Thinking Machine、Sony,甚至UNIX的娘家—贝尔实验室,也贡献了不少设备。也有一些厂商捐赠现金,并把技术人员送到FSF来向斯托曼学习,而且支付斯托曼的员工薪水。 FSF就用这些钱来养起14位基金会成员: 9位程序设计师,3位负责技术资料撰写。虽然斯托曼自己不领薪水,但他不能期望他的同仁也和他一样看得开,而饿着肚子为理想拼斗。但FSF的程序设计师一年也只有2万5千美元的薪水,这是一般厂商的一半或三分之一。斯托曼之所以以低薪待人,原因就是可多请几位志同道合的黑客,为理想而工作!

    GNU在工作站和微机市场很风光,许多工作站/UNIX和微机厂家,都把GNU纳入他们操作系统,包括Convex Computer、DEC、Data General及以前的NeXT等。GNU工程激励了许许多多年轻的黑客,他们编写了大量自由软件。最后,一个芬兰的大学生李纳斯·托瓦兹写了一个类似 UNIX操作系统的内核,称为Linux,把所有GNU软件和硬件连接了起来,但Linux并不能代表整个操作系统,Linux只是个内核,整个系统还包含数以百计的软件工具和实用程序,大多是由GNU黑客们完成的。他认为,整个操作系统称为GNU/Linux比较合适。Linux内核为GNU工程画上了一个完满的句号! 同时,自由社区也日益壮大起来,斯托曼的理想终于实现了。

    斯托曼认为,在自由软件t时代,软件公司可以靠服务和训练赚钱。如果你公司没有人会用源代码,你就得请位程序员,帮你修改由FSF得来的 Copyleft程序;你不必怕你出钱所改的程序会流传到另一家公司,因为那家公司也许会为这软件改头换面,帮它抓虫,或修改,或添加些新功能。而在任意拷贝的情况下,你也因而受惠。所以程序员绝对饿不死,仍会像现在高价软件的时代一样,有许多“服务”的大钱可赚,只不过不可能象盖茨这样积聚起世界第一的巨额财富。而GNU的软件也能使写程序的人更具生产力,因为他不必凡事都从零做起,可根据已有的软件来改进。所以斯托曼希望,有一天软件业者不是靠目前的 “Copyright”版权法,迫使客户花费巨额资金购买软件,而是依仗提供服务(如技术支援、训练)来获取应得的报酬,这种报酬可能会比一般人高,但是绝对不可能为一个小公司培养出几百个百万富翁。简而言之,未来软件业的基本准则就是“资源免费,服务收费”。

    近几年,随着Linux系统的迅速崛起,以及良好的声誉,再也没有人对自由软件的全新商业模式表示怀疑。在斯托曼思想的指导下,自由软件已经成功地步入市场主流,占据了市场实地。毕竟,在商业横流的今天,思想在贬值。自由软件也只有在夺取市场政权后,才能真正确立自己的实力地位,促使整个软件业模式发生巨变!2005年,微软不得不接受一个事实:必须与自由软件共生共存!庶民,同样能够赢得胜利!

    赢得胜利之后的斯托曼总是风尘仆仆,行囊相随,四处布道。他带着一台笔记本电脑,但这不是他个人的,而是属于自由软件基金(FSF)。其实,斯托曼从来就没有拥有过一台自己的计算机。也从来只用自由软件(当然他从来没有用过Windows)。而且,他也没有自己的汽车、电视和房产。这位 46岁的单身汉节俭地居住在一间租来的房子里。已有15年了,没有领取过一个月的正式工资。因为他的工作就是使软件获得自由。

    但是在商欲横流的今天,人们更愿意追逐财富,而不是贫寒的斯托曼的高尚思想。因此不足为怪,连自由软件团体内的许多人也开始离他而去。同时,随着自由软件迅速崛起,影响力大增,而斯托曼毫不妥协的个性和思想使其在自由软件内部也越来越成为争议人物。

    Apache Web服务器和GNU/Linux操作系统日渐流行,新一代黑客们受到鼓舞,纷纷投入商业领域,越来越多的人加盟自由软件,他们是一类全新的黑客:一方面呼应自由软件的精神,一方面又积极拥抱商业世界。他们鼓吹自己能够创建比专有软件更稳定更灵活更少“臭虫”的软件产品,同时又积极捕捉每一个商机。于是,与斯托曼持不同政见者将“自由软件”这个名字改成了“开源软件”,看起来好象两者兼容,但斯托曼认为,两者最大的区别就是自由软件将自由精神放在首位。但是对商人来说,自由(free)与免费(free)是同一个词,与斯托曼布道的“自由精神”不同,他们更愿意谈论实际问题,也就是能不能赚到利润。为了避免纷涌而来的投资者被斯托曼“吓跑”,与斯托曼持不同政见者还得联起手来,将斯托曼屏蔽起来。

    我不怀疑,自由软件阵营中的现实主义者们的本意也是好的,是想让自由软件具有更广阔的发展空间,就像中国的改革开放一样,要积极与国际接轨,要招商引资,总不能报着理想当饭吃吧?但我只是觉得,现实主义者将越来越背离自由软件的原始意义。也许,有一天,它会蜕化成商业的专有软件,就像苏联的命运。中国为什么无法开发自己的操作系统,我想没有理想是最大的原因。

    但斯托曼彻头彻尾的是个坚定的理想主义者,如果他不是这样的人,那么不可能有GNU的产生!他宁愿固守贫穷,也不愿意放弃他的理想,自由,自由,乌托邦!毫无疑问,无论是自由软件运动还是开放源代码,都来源他20多年前开始的努力,这肯定是计算机历史上最脍炙人口的传奇故事。对于目前的成功,斯托曼感到非常高兴,但也有更多的焦虑。因为他感到自己明显被排斥在外。“有人极力想改变历史,否定我在这场运动中的地位”对于人们用Linux来指代整个操作系统,斯托曼十分痛心,他说正确的用词应是“GUN/Linux”。 斯托曼承认李纳斯.托瓦兹的贡献很关键,是他完成了GUN/ Linux的内核。但是斯托曼估算,内核只占整个系统的3%,相比之下,GUN项目贡献了30%的代码,其余67%的代码来源于其他方面。但令他欣慰的是,GNU的一些原则仍在起作用。他认为这种原则不仅使软件开发更显活力,更能生产出优质软件,还认识到这本身是一种行为准则。

    批评者认为,斯托曼极力维护GNU的遗产,是沉湎于这场运动的枝枝末末,对整个自由软件都是有害的。对大多数开放源代码倡导者来说,颠覆微软才是主要的斗争方向。但斯托曼说:“我关心的是精神,是GUN项目内在的哲学。这种哲学就是它存在的理由,那就是自由软件不仅仅是为了方便,也不仅仅是为了可靠。真正重要的是自由,协作的自由。我不关心某个人或公司。因此我认为单纯与微软作战偏离了这个运动的方向。”

    现在,斯托曼的拥戴者还有,我也是其中一员,但是斯托曼的大多数主张还是被人们忽略了。如今只有“Linux”充斥着媒体的标题,而其背后的思想开始逐渐隐去。

    现在,斯托曼依旧没钱、没势,连原先的许多信徒都被分化而去。这场运动给他带来的唯一收获可能就是:无论斯托曼走到哪里,都会有人乐意借给他计算机,使他能及时查看电子邮件。他还是那样不修边幅,无所顾忌。但是与当年执着相比,他的精神状态开始呈现一种新的焦虑和紊乱,而这一切正是他创造的自由软件的成功,施加给他的。而且可以肯定,斯托曼必将越来越被自由软件成功的浪潮所淹没。因为,他引燃的这场革命已经完全超越了他的驾驭范围。这也是许多思想家、革命家、理想主义者的共同的命运!

来源:http://blog.csdn.net/MTK_kyle/archive/2008/04/15/2294195.aspx

通过Python得到一张图片或logo的主要颜色

看到一篇博客Pick the dominant colour from a logo using Python,一段代码实现了该功能, 效果还不错, 我把代码稍微完善了一下, 方便测试 🙂

python pick_dominant_color.py -f xxx.gif

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import colorsys
from PIL import Image
import optparse


def get_dominant_color(image):
    """
    Find a PIL image's dominant color, returning an (r, g, b) tuple.
    """


    image = image.convert('RGBA')
   
    # Shrink the image, so we don't spend too long analysing color
    # frequencies. We're not interpolating so should be quick.
    image.thumbnail((200, 200))
   
    max_score = None
    dominant_color = None
   
    for count, (r, g, b, a) in image.getcolors(image.size[0] * image.size[1]):
        # Skip 100% transparent pixels
        if a == 0:
            continue
       
        # Get color saturation, 0-1
        saturation = colorsys.rgb_to_hsv(r / 255.0, g / 255.0, b / 255.0)[1]
       
        # Calculate luminance - integer YUV conversion from
        # http://en.wikipedia.org/wiki/YUV
        y = min(abs(r * 2104 + g * 4130 + b * 802 + 4096 + 131072) >> 13, 235)
       
        # Rescale luminance from 16-235 to 0-1
        y = (y - 16.0) / (235 - 16)
       
        # Ignore the brightest colors
        if y > 0.9:
            continue
       
        # Calculate the score, preferring highly saturated colors.
        # Add 0.1 to the saturation so we don't completely ignore grayscale
        # colors by multiplying the count by zero, but still give them a low
        # weight.
        score = (saturation + 0.1) * count
       
        if score > max_score:
            max_score = score
            dominant_color = (r, g, b)
   
    return dominant_color

def main():
    usage = 'usage: %prog -f filepath'
    parser = optparse.OptionParser(usage)
    parser.add_option('-f', '--filepath', dest='filepath', help='-f filepath', type='string')
    (options, args) = parser.parse_args()
    if options.filepath == None:
        parser.error('must has -f option!')
    try:
        img = Image.open(options.filepath)
    except:
        print("can not open the file")
        return
   
    print '#%02x%02x%02x' % get_dominant_color(img)

if __name__ == '__main__':
    main()

你是极客吗?

如果你在这个周一的早晨拥挤的公交/地铁上因为周末的某个 Bug/Config/Gadget 心神不宁,那么或许应该问问自己:我是极客吗

这个测试将告诉你答案:NerdTest

欢迎大家晒晒自己的得分~