❶ 如何阅读和学习《计算机程序设计艺术(TAOCP)》
哦,上帝!《The Art of Computer Programming》引那位出名的王垠对TAOCP的评论: 本来早就想想写一个对于Knuth的The Art of Computer Programming的看法。 没想到一去Amazon就找到一个同类 关于Knuth的 TAOCP,我想,大部分人声称看了他的书,或者买了他的书,不过是作为一种炫耀的资本或者摆设。我对门的同学几年前就买了一套三本,全新的精装本,花了 200多块钱。可是呢,他从来就没看。我把它借过来,看了几页就放在那里没有看了。我哪有时间看他用那些一个字节6位的机器语言实现简单的链表!有一天一个师弟走进来,看到那套书在我书架上,显示出一种敬畏感:“挖!师兄!你好牛啊!居然看这么高深的书!” 我一愣。嗯,不错嘛,这套书放在书架上可以让人对我刮目相看。这恐怕就是它对很多人的实际作用。还有人可以帮助神化这套书,同时也神化自己,比如他可以这么说:“谁要是看完了Don Knuth的 The Art of Computer Programming 我就雇用他!” 这样可以显得比一般看过书的人还要高一等。据说Bill Gates就是这么做的。我怀疑他自己看完过没有。 我讨厌这套书的一个原因就是Knuth故意用一个叫 MIX 的处理器的机器语言来写这本书。虽然在新版的书里他设计了一种新的处理器 MMIX,但是换汤不换药。他以为一部“永恒”的计算机编程书不应该使用高级语言,因为它们很容易过时。但是他错了,机器语言恰恰是最容易过时的东西,看看现在有多少牌子的更新换代的处理器就知道。而世界上确实存在非常高级的语言从60年代到现在都没有过时。我预言,MMIX会在不久的将来被淘汰。很好笑的是MMIX是在MIX上加了一个“M”,代表Millennium(千禧年)。关于它的专著也起名为 MMIXware---A RISC Computer for the Third Millennium。一千年甚至短短一百年,几十年以后,计算机还是不是二进制的集成电路都说不清楚,况且这个处理器其实就是从别的处理器比如RISC II, Sparc之类的捡了一点东西,没有什么大的创新。他就把这个处理器的模拟程序印在纸上卖,曰:“一个优秀的程序要像一部好的小说一样容易读懂。一个优秀的程序员会在将来拿到普利策奖。” 用机器语言写一点初级的计算机入门部分还可以,但是用来写整整一部书未免容易让读者只见树木不见森林了。看TAOCP最容易出现的一种现象就是,“哇!原来这个程序可以这么写。” 但是你不知道为啥那么写。虽然可以知道一些底层的原因,但是最根本的原理,读者始终不会明白。就像看清楚了一张图片上的每一个像素,却认不出图片上其实是一个熟人。看清楚了棋盘上每一个棋子能走的地方,却不能赢棋。Dijkstra 说计算科学不应该被叫做"computer science",就像外科手术不应该叫做"knife science"。可是这关Knuth什么事呢,他的书名叫做 The Art of... 再说他的支票吧…… 很多人拿了Knuth的支票就作为一种可以炫耀的东西。以前我就看到一个Cambridge的教授主页上挂着一个Knuth支票的照片。Knuth的支票真的可以作为炫耀的资本吗?告诉你们,我找到的错误都是typo而已,没想到他也给我支票。谁叫他打字不小心,Millennium都能打成 Millenium?嘿!我凑足了一顿饭钱的支票时就想去中国银行兑现,准备换了钱大吃一顿。可是银行的职员告诉我,他们必须把支票寄回美国才能拿到现金,办理这件事的费用大大高于支票本身的价值!所以Knuth相当于给我一些空头支票。Damn!早该想到的,他为什么不往大家的信用卡上面转账,而使用支票这种过时的东西!他明显觉得有他签名的支票,肯定谁也不会拿去兑现,甚至装裱在相框里作为纪念。hmmm... 算你狠~ 好了,啰里啰唆。还是看看这个别人写的书评。White elephant,这确实道出了我对这套书的感觉。 (但是评价者有些观点我不能苟同,比如“O(n)表示法足够了”。) 希望以后对 paper 也有这种公开的 comments! Dan Friedman 的故事 (4)——C311当我刚从 Cornell 转学到 IU 的时候,Dan Friedman 叫我去上他的研究生程序语言课 B521。我当时以自己在 Cornell 上过程序语言课程为由,想不去上他的课。Friedman 把我叫到他的办公室,让我在他旁边坐下来,和蔼的对我说:“王垠,我知道你在 Cornell 上过这种课。我也知道 Cornell 是比 IU 好很多的学校。可是每个老师的教学方法都是不一样的,你应该来上我的课。我和我的朋友们在这里做教授,不是因为喜欢这个学校,而是因为我们的家人和朋友都在这里。”后来由于跟 Amr Sabry(我现在的导师)的课程 B522 时间重合,他特别安排我坐在本科生的 C311 的课堂上,却拿研究生课程的学分。后来发现,这两门课的内容基本没有区别,只不过研究生的作业要多一些。 在第一堂课上,他说了一句让我记忆至今的话:“《The Little Schemer》和《Essentials of Programming Languages》是这门课的参考教材,但是我上课从来不讲我的书里的内容。”刚一开始,我就发现这门课跟我在 Cornell 学到的东西很不一样。虽然有些概念,比如 closure,CPS,我在 Cornell 都学过,在他的课堂上,我却看到这些概念完全不同的一面,以至于我觉得其实我之前完全不懂这些概念!这是因为在 Cornell 学到这些东西的时候只是用来应付作业,而在 Friedman 的课上,我利用它们来完成有实际意义的目标,所以才真正的体会到这些概念的内涵和价值。 一个例子就是课程进入到没几个星期的时候,我们开始写解释器来执行简单的 Scheme 程序。然后我们把这个解释器进行 CPS 变换,引入全局变量作为"寄存器" (register),把 CPS 产生的 continuation 转换成数据结构(也就是堆栈)。最后我们得到的是一个抽象机 (abstract machine),而这在本质上相当于一个真实机器里的中央处理器(CPU)或者虚拟机(比如 JVM)。所以我们其实从无到有,“发明”了 CPU!从这里,我才真正的理解到寄存器,堆栈等的本质,以及我们为什么需要它们。我才真正的明白了,冯诺依曼体系构架为什么要设计成这个样子。后来他让我们去看一篇他的好朋友 Olivier Danvy 的论文,讲述如何从各种不同的解释器经过 CPS 变换得出不同种类的抽象机模型。这是我第一次感觉到程序语言的理论对于现实世界的巨大威力,也让我理解到,机器并不是计算的本质。机器可以用任何可行的技术实现,比如集成电路,激光,量子,分子,基因…… 但是无论用什么作为机器的材料,我们所要表达的语义,也就是计算的本质,却是不变的。 而这些还不是我那届 C311 全部的内容。后半学期,我们开始学习 miniKanren,一种他自己设计的用于教学的逻辑式语言 (logic programming language)。这个语言类似 Prolog,但是它把 Prolog 的很多缺点给去掉了,而且变得更加容易理解。教材是免费送给我们的《The Reasoned Schemer》。在书的最后,两页纸的篇幅,就是整个 miniKanren 语言的实现!我学得比较快,后来就开始捣鼓这个实现,把有些部分重新设计了一下,然后加入了一些我想要的功能。这样的教学,给了我设计逻辑式语言的能力,而不只是停留于一个使用者。这是学习 Prolog 不可能做到的事情,因为 Prolog 实现的复杂性,会让初学者无从下手,只能停留在使用者的阶段。 我很幸运当初听了他的话,去上了这门课,否则我就不会是今天的我。 谁是真正的程序语言专家Knuth 也曾有类似的说法:“要是看不懂 TAOCP,就别当程序员。”他总是被誉为“计算机科学的神”,在他的演讲里大谈文学,艺术,上帝和宗教,给人陡增神秘感。他总是说程序员应该学习机器语言,而不是高级语言,机器才是不变的真理。但是 Knuth 却不是从科学的角度来看这个问题,而只是他个人的偏见。当他看到 Fortran, Lisp, ALGOL, Pascal, C, C++, Java 这些语言的发展仿佛没有尽头的时候,他并没有理解其中不变的原理。在程序语言的设计上,他不是一个强者。他很有可能根本不理解 lambda calculus 和类型理论,否则他不会设计出像 TeX 那样毫无章法的语言。TeX 排版的质量无可厚非,但是到了1978年还仍然采用程序语言专家们早已深恶痛绝的 dynamic scoping,再加上其它一些蹩脚的设计,说明他对程序语言理论缺乏理解。实际上 TeX 含有一个图灵完备的扩展语言,是因为 Knuth 采纳了 Guy Steele(Scheme 的发明者)的建议,然而 Knuth 却没有把它设计好。 Knuth 觉得机器是不变的真理,所以他坚持用机器语言来写作 TAOCP。但是由于机器语言缺乏抽象,程序员没法专注于真正的问题。使用机器语言来描述算法,会把本来很简单的问题都显得高深难懂,仿佛这书永远也看不完。有多少人真正的看过 TAOCP 呢?恐怕大部分人把这套书买回去,只是把它们摆在书架上做面子。只要有人说机器语言太难懂,这些人就会说你自己不够聪明,不配做程序员。而其实呢,他们自己都没看过。 机器不是计算的本质这个事实,很多人包括 Dijkstra,早就看到了。他说:“计算机科学是个错误的名字,因为它不是计算机的科学,这就像外科手术不是刀子的科学。”而这是几乎每一个程序语言专家都明白的道理。在他们的眼里,这不再是道听途说或者个人观点,而是可以用逻辑来证明的事实。真正明白计算本质的人,可以设计出全新的硬件来来满足语义的需要,而不是受控于处理器的设计。他们甚至可以超越集成电路,而使用另外的技术来制造机器。这些都说明,计算其实是独立于机器的。 有不好的想法不要紧,但是如果把不好的想法硬说成是好的,那就会阻碍历史发展了。我并不否认 Knuth 和 Ritchie 对算法,排版和操作系统的重要贡献,但是由于他们以及他们崇拜者经常在有关语言的事情上误导群众,所以觉得有必要指出他们的一些局限性。Linus Torvalds, Guido van Rossum, Eric Raymond, Paul Graham 也经常发表对语言的评论,被很多人奉为圣旨,但其实他们言论里面很少有真知灼见。 其实我要说的不过是,通常程序员们膜拜的偶像,大部分都不是真正的程序语言专家。希望你不要觉得这是危言耸听,实际上这些是大部分世界级的计算机科学家们很多年前就知道的事情。
❷ 程序员需要学些什么
程序员的岗位需求很多,例如大型网络公司、软件开发公司等等都需要程序员。
程序员需要学习:
1、掌握数据及其转换、数据的机内表示、算术和逻辑运算,以及相关的应用数学基础知识;
2、理解计算机的组成以及各主要部件的性能指标;
3、掌握操作系统、程序设计语言的基础知识;
4、熟练掌握计算机常用办公软件的基本操作方法;
5、熟练掌握基本数据结构和常用算法;
6、熟练掌握C程序设计语言,以及C++、Java、Visual Basic中的一种程序设计语言;
7、熟悉数据库、网络和多媒体的基础知识;
8、掌握软件工程的基础知识,了解软件过程基本知识、软件开发项目管理的常识;
9、了解常用信息技术标准、安全性,以及有关法律、法规的基本知识;
10、了解信息化、计算机应用的基础知识;
11、正确阅读和理解计算机领域的简单英文资料。
程序员必备技能:
1、熟练开发工具
做为一名程序员至少熟练掌握两到三种开发工具的使用,这是程序员的立身之本,其中C/C++和JAVA是重点推荐的开发工具,C/C++以其高效率和高度的灵活性成为开发工具中的利器,很多系统级的软件还是用C/C++编写。
而JAVA的跨平台和与WEB很好的结合是JAVA的优势所在,而JAVA即其相关的技术集JAVAOne很可能会成为未来的主流开发工具之一。
其次,能掌握一种简便的可视化开发工具,如VB,PowerBuilder,Delphi,CBuilder,则更好,这些开发工具减小了开发难度,并能够强化程序员对象模型的概念。
另外,需要掌握基本的脚本语言,如shell,perl等,至少能读懂这些脚本代码。
2、熟知数据库
作为程序员,他们自然有自己的理由:很多应用程序都是以数据库的数据为中心,而数据库的产品也有不少,其中关系型数据库仍是主流形式,所以程序员至少熟练掌握一两种数据库,对关系型数据库的关键元素要非常清楚,要熟练掌握SQL的基本语法。
虽然很多数据库产品提供了可视化的数据库管理工具,但SQL是基础,是通用的数据库操作方法。如果没有机会接触商业数据库系统,可以使用免费的数据库产品是一个不错的选择,如mySQL,Postgres等。
3、了解操作系统
当前主流的操作系统是Windows,Linux/Unix,熟练地使用这些操作系统是必须的,但只有这些还远远不够。
要想成为一个真正的编程高手,需要深入了解操作系统,了解它的内存管理机制、进程/线程调度、信号、内核对象、系统调用、协议栈实现等。
Linux作为开发源码的操作系统,是一个很好的学习平台,Linux几乎具备了所有现代操作系统的特征。虽然Windows系统的内核实现机制的资料较少,但通过互联网还是能获取不少资料。懂得网络协议TCP/IP。
在互联网如此普及的今天,如果您还没有对互联网的支撑协议TCP/IP协议栈有很好的掌握,就需要迅速补上这一课,网络技术已改变了软件运行的模式。
从最早的客户/服务器结构,到今天的WEBServices,再到未来的网格计算,这一切都离不开以TCP/IP协议栈为基础的网络协议支持,深入掌握TCP/IP协议是非常必要的。
至少,需要了解ISO七层协议模型,IP/UDP/TCP/HTTP等常用协议的原理和三次握手机制。
4、明白DCOM/CORBA/XML/WEBServices存在的意义
随着技术的发展,软件与网络的无缝结合是必然趋势,软件系统的位置无关性是未来计算模式的重要特征之一,DCOM/CORBA是当前两大主流的分布计算的中间平台,DCOM是微软COM(组件对象模型)的扩展,而CORBA是OMG支持的规范。
XML/WebServices重要性不言而喻,XML以其结构化的表示方法和超强的表达能力被喻为互联网上的“世界语”,是分布式计算的基石之一。
5、不要将软件工程与CMM分开
大型软件系统的开发中,工程化的开发控制取代个人英雄主义,成为软件系统成功的保证,一个编程高手并不一定是一个优秀的程序员。
一个优秀的程序员是将出色的编程能力和开发技巧同严格的软件工程思想有机结合,编程只是软件生命周期中的其中一环,优秀的程序员应该掌握软件开发各个阶段的基本技能。
如市场分析,可行性分析,需求分析,结构设计,详细设计,软件测试等。
6、需求理解能力
程序员要能正确理解任务单中描述的需求。在这里要明确一点,程序员不仅仅要注意到软件的功能需求,还应注意软件的性能需求。
要能正确评估自己的模块对整个项目中的影响及潜在的威胁,如果有着两到三年项目经验的熟练程序员对这一点没有体会的话,只能说明他或许是认真工作过,但是没有用心工作。
7、模块化思维能力
作为一个优秀的程序员,他的思想不能局限在当前的工作任务里面,要想想看自己写的模块是否可以脱离当前系统存在,通过简单的封装在其他系统中或其他模块中直接使用。
这样做可以使代码能重复利用,减少重复的劳动,也能使系统结构越趋合理。模块化思维能力的提高是一个程序员的技术水平提高的一项重要指标。
就业方向:
1、网络开发
现在网络已经成为世界通讯的一座桥梁,好像Javascript、PHP、Ruby这几类开发语言大部分是用作网络开发方面。
2、企业软件开发
JAVA、C#、VB这几类开发语言都实现了面向对象开发的目标,更多时候用于企业系统的开发。
3、系统软件
C语言、C++、Object-C这些软件更多是用在系统软件开发,嵌入式开发的方面。
当然,这分类不是绝对,像JAVA、C#、VB很多时候也用于动态网站的开发。在很开发项目都会使用集成开发的方式,同一个项目里面使用多种开发语言,各展所长,同步开发。
但所以在刚入门的时候,建议先为自己选择一种合适的开发工具,“专注地投入学习,全力一击”。
会编程、会计算机语言就能加入互联网发展大潮中,享受数字经济发展的红利,一时间社会上的程序员培训机构都变得格外火爆。
但是现在,专家的数据分析结果告诉你:若想跟上数字经济发展的步伐,光会编程可不行,这个行业现在紧缺高端的、综合型人才。
11月22日下午,清华大学经管学院互联网发展与治理研究中心与领英联合发布《中国经济的数字化转型:人才与就业》,揭示我国数字人才现状与趋势。
报告显示我国数字经济发展面临人才短缺的挑战,但这种短缺主要体现在拥有中高级专业技能数字人才的比例不高,拥有人工智能、智能制造等前沿技术的人才更是少之又少。
与美国、英国、加拿大等国家相比,中国的数字人才储备尚有很大差距。
此外,报告根据对人才需求的数据分析,结果显示我国数字人才的技能需求不再强调单一编程技能,更加看重技术、管理和领导力等综合技能。
2015年,我国从事信息传输、软件和信息技术服务相关工作的人数约350万,但其中中高端人才,特别是前沿技术的数字人才并不多。根据领英中国智库的研究,在人工智能领域,美国的从业者数量在85万人以上,印度15万,英国14万,中国只有5万多人。
报告负责人、清华大学经济管理学院副院长陈煜波教授表示,我国目前在大数据与人工智能领域人才缺口明显。
他解释说,目前中国85%以上的数字人才分布在产品研发类,而深度分析、先进制造、数字营销等职能的人才加起来只有不到5%,存在较大缺口,新兴技术人才和创新型人才培养方面存在滞后和不足。
这份研究报告的基础数据来自领英在中国的3600万个人用户,这些用户毕业于1.5万多所国内外院校,分布在36.4万家企业,拥有超过2.3万项技能。
陈煜波研究团队从中筛选了72万数字人才,多维度提取用户画像并跟踪其职业轨迹,以此预测不同地区的人才流向、雇佣率、受雇主欢迎的技能等人才趋势层面的信息。
陈煜波说,根据数据分析结果,整体来看,虽然编程技能和数据分析技能需求占据主导,然而随着数字产业走向成熟,企业除了强调编程技能,也逐步更加看重人才的技术、管理和领导力等综合技能。
近年间,项目管理、产品运营等“技术+管理”类技能的需求呈现出明显的上升趋势,懂技术、懂管理的人才被认为是“一将难求”。
领英中国代理总裁曾志恒也提醒,如果你有兴趣向数字职能转型,不能仅仅专注于自己的技术能力,沟通和领导力等软性技能将成为你脱颖而出的关键。
陈煜波希望这些研究结果能为教育行业和政府部门提供借鉴。他说,教育行业可根据职位的供需趋势更好地规划人才培养的方向,政府也可更好地了解人才流动方向、技术缺口等,以此制定有针对性的引才策略。
程序员岗位职责:
1、对项目经理负责,负责软件项目的详细设计、编码和内部测试的组织实施,对小型软件项目兼任系统分析工作,完成分配项目的实施和技术支持工作。
2、协助项目经理和相关人员同客户进行沟通,保持良好的客户关系。
3、参与需求调研、项目可行性分析、技术可行性分析和需求分析。
4、熟悉并熟练掌握交付软件部开发的软件项目的相关软件技术。
5、负责向项目经理及时反馈软件开发中的情况,并根据实际情况提出改进建议。
6、参与软件开发和维护过程中重大技术问题的解决,参与软件首次安装调试、数据割接、用户培训和项目推广。
7、负责相关技术文档的拟订。
8、负责对业务领域内的技术发展动态进行分析研究。
相关书籍:
很多程序员响应,他们在推荐时也写下自己的评语。 以前就有国内网友介绍这个程序员书单,不过都是推荐数 Top 9的书。
其实除了前9本之外,推荐数前30左右的书籍都算经典,笔者整理编译这个问答贴,同时摘译部分推荐人的评语。
下面就按照各本书的推荐数排列。
1、《代码大全》 史蒂夫·迈克康奈尔
2、《程序员修炼之道》
3、《计算机程序的构造和解释》
4、《算法导论》
5、《重构:改善既有代码的设计》
6、《设计模式》
7、《人月神话》
8、《计算机程序设计艺术》
9、《编译原理》(龙书)
10、《活着》
❸ 一个合格的程序员应该读过哪些书
1、《代码大全》 史蒂夫·迈克康奈尔
推荐数:1684
“优秀的编程实践的网络全书,《代码大全》注重个人技术,其中所有东西加起来, 就是我们本能所说的“编写整洁的代码”。这本书有50页在谈论代码布局。” —— Joel Spolsky
对于新手来说,这本书中的观念有点高阶了。到你准备阅读此书时,你应该已经知道并实践过书中99%的观念。– esac
Steve McConnell的原作《代码大全》(第1版)是公认的关于编程的最佳实践指南之一, 在过去的十多年间,本书一直在帮助开发人员编写更好的软件。
现在,作者将这本经典著作全新演绎,融入了最前沿的实践技术,加入了上百个崭新的代码示例, 充分展示了软件构建的艺术性和科学性。 McConnell汇集了来自研究机构、学术界以及业界日常实践的主要知识, 把最高效的技术和最重要的原理交织融会为这本既清晰又实用的指南。
无论您的经验水平如何,也不管您在怎样的开发环境中工作,也无论项目是大是小, 本书都将激发您的思维并帮助您构建高品质的代码。
《代码大全(第2版))》做了全面的更新,增加了很多与时俱进的内容,包括对新语言、新的开发过程与方法论的讨论等等。
2、《程序员修炼之道》
推荐数:1504
对于那些已经学习过编程机制的程序员来说,这是一本卓越的书。 或许他们还是在校生,但对要自己做什么,还感觉不是很安全。
就像草图和架构之间的差别。虽然你在学校课堂上学到的是画图,你也可以画的很漂亮, 但如果你觉得你不太知道从哪儿下手,如果某人要你独自画一个P2P的音乐交换网络图,那这本书就适合你了。—— Joel
《程序员修炼之道:从小工到专家》内容简介:《程序员修炼之道》由一系列独立的部分组成, 涵盖的主题从个人责任、职业发展,知道用于使代码保持灵活、并且易于改编和复用的各种架构技术, 利用许多富有娱乐性的奇闻轶事、有思想性的例子及有趣的类比, 全面阐释了软件开发的许多不同方面的最佳实践和重大陷阱。
无论你是初学者,是有经验的程序员,还是软件项目经理,《程序员修炼之道:从小工到专家》都适合你阅读。
3、《计算机程序的构造和解释》
推荐数:916
就个人而言,这本书目前为止对我影响醉倒的一本编程书。
《代码大全》、《重构》和《设计模式》这些经典书会教给你高效的工作习惯和交易细节。 其他像《人件集》、《计算机编程心理学》和《人月神话》这些书会深入软件开发的心理层面。 其他书籍则处理算法。这些书都有自己所属的位置。
然而《计算机程序的构造和解释》与这些不同。 这是一本会启发你的书,它会燃起你编写出色程序的热情; 它还将教会你认识并欣赏美; 它会让你有种敬畏,让你难以抑制地渴望学习更多的东西。
其他书或许会让你成为一位更出色的程序员,但此书将一定会让你成为一名程序员。
同时,你将会学到其他东西,函数式编程(第三章)、惰性计算、元编程、虚拟机、解释器和编译器。
一些人认为此书不适合新手。 个人认为,虽然我并不完全认同要有一些编程经验才能读此书,但我还是一定推荐给初学者。 毕竟这本书是写给著名的6.001,是麻省理工学院的入门编程课程。 此书或许需要多做努力(尤其你在做练习的时候,你也应当如此),但这个价是对得起这本书的。
4、《C程序设计语言》
推荐数:774
这本书简洁易读,会教给你三件事:C 编程语言;如何像程序员一样思考;底层计算模型。 (这对理解“底层”非常重要)—— Nathan
《C程序设计语言》(第2版新版)讲述深入浅出,配合典型例证,通俗易懂,实用性强, 适合作为大专院校计算机专业或非计算机专业的C语言教材,也可以作为从事计算机相关软硬件开发的技术人员的参考书。
《C程序设计语言》(第2版新版)原著即为C语言的设计者之一Dennis M.Ritchie和著名的计算机科学家Brian W.Kernighan合著的 一本介绍C语言的权威经典著作。 我们现在见到的大量论述C语言程序设计的教材和专著均以此书为蓝本。 原著第1版中介绍的C语言成为后来广泛使用的C语言版本——标准C的基础。
人们熟知的“hello,world”程序就是由本书首次引入的,现在,这一程序已经成为所有程序设计语言入门的第一课。
5、《算法导论》
推荐数:671
《代码大全》教你如何正确编程; 《人月神话》教你如何正确管理; 《设计模式》教你如何正确设计……
在我看来,代码只是一个工具,并非精髓。 开发软件的主要部分是创建新算法或重新实现现有算法。 其他部分则像重新组装乐高砖块或创建“管理”层。
我依然梦想这样的工作,我的大部分时间(>50%)是在写算法,其他“管理”细节则留给其他人…… —— Ran Biron
经典的算法书,被亚马逊网,《程序员》等评选为2006年最受读者喜爱的十大IT图书之一。
算法领域的标准教材,全球多所知名大学选用
MIT名师联手铸就,被誉为“计算机算法的圣经”
编写上采用了“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。
6、《重构:改善既有代码的设计》
推荐数:617
《重构:改善既有代码的设计》清晰地揭示了重构的过程,解释了重构的原理和最佳实践方式, 并给出了何时以及何地应该开始挖掘代码以求改善。 书中给出了70多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术。
《重构:改善既有代码的设计》提出的重构准则将帮助你一次一小步地修改你的代码,从而减少了开发过程中的风险。
《重构:改善既有代码的设计》适合软件开发人员、项目管理人员等阅读, 也可作为高等院校计算机及相关专业师生的参考读物。
我想我不得不推荐《重构》:改进现有代码的设计。—— Martin
我必须承认,我最喜欢的编程语录是出自这本书:任何一个傻瓜都能写出计算机能理解的程序, 而优秀的程序员却能写出别人能读得懂的程序。—— Martin Fowler
7、《设计模式》
推荐数:617
自1995年出版以来,本书一直名列Amazon和各大书店销售榜前列。 近10年后,本书仍是Addison-Wesley公司2003年最畅销的图书之一。 中文版销售逾4万册。
就我而言,我认为四人帮编著的《设计模式》是一本极为有用的书。 虽然此书并不像其他建议一样有关“元”编程,但它强调封装诸如模式一类的优秀编程技术, 因而鼓励其他人提出新模式和反模式(antipatterns),并运用于编程对话中。—— Chris Jester-Young
8、《人月神话》
推荐数:588
在软件领域,很少能有像《人月神话》一样具有深远影响力并且畅销不衰的著作。
Brooks博士为人们管理复杂项目提供了最具洞察力的见解。 既有很多发人深省的观点,又有大量软件工程的实践。 本书内容来自Brooks博士在IBM公司System/360家族和OS/360中的项目管理经验。
该书英文原版一经面世,即引起业内人士的强烈反响,后又译为德、法、日、俄中等多种语言,全球销量数百万册。 确立了其在行业内的经典地位。
9、《计算机程序设计艺术》
推荐数:542
《计算机程序设计艺术》系列著作对计算机领域产生了深远的影响。 这一系列堪称一项浩大的工程,自1962年开始编写,计划出版7卷,目前已经出版了4卷。
《美国科学家》杂志曾将这套书与爱因斯坦的《相对论》等书并列称为20世纪最重要的12本物理学著作。 目前Knuth正将毕生精力投入到这部史诗性著作的撰写中。
这是高德纳倾注心血写的一本书。—— Peter Coulton
10、《编译原理》(龙书)
推荐数:462
我很奇怪,居然没人提到龙书。(或许已有推荐,我没有看到)。 我从没忘过此书的第一版封面。 此书让我知道了编译器是多么地神奇绝妙。- DB