程序员的自我修养

时间:2024.4.20

优秀的程序员应该具备两方面能力: ?

o 掌握常用的数据结构和算法(例如链表,栈,堆,队列,排序和散列);

o 理解计算机科学的核心概念(例如计算机系统结构、操作系统、编译原理和计算

机网络);

o 熟悉至少两门以上编程语言(例如C++,Java,C#,和Python);

? 专业的软件开发素养:

o 具备良好的编程实践,能够编写可测试(Testable),可扩展(Extensible),

可维护(Maintainable)的代码;

o 把握客户需求,按时交付客户所需要的软件产品;

o 理解现代软件开发过程中的核心概念(例如面向对象程序设计,测试驱动开发,

持续集成,和持续交付等等)。

和其它能力一样,程序设计能力和软件开发素养源自项目经验和书本知识。项目经验因人而异(来自不同领域的程序员,项目差异会很大);但书本知识是相通的——尤其是经典图书,它们都能够拓宽程序员的视野,提高程序员的成长速度。

在过去几年的学习和工作中,我阅读了大量的程序设计/软件开发书籍。随着阅读量的增长,我意识到:

?

? 经典书籍需要不断被重读——每一次重读都会有新的体会; 书籍并非读的越多越好——大多数书籍只是经典书籍中的概念延伸(有时甚至是照搬); 意识到这两点之后,我开始思考一个很功利的问题:如何从尽可能少的书中,获取尽可能多的关键知识?换句话说:

? 优秀的程序员应该掌握哪些关键概念?

? 哪些书籍来可以帮助程序员掌握这些关键概念? 这即是这篇文章的出发点——我试图通过程序员必读书单这篇文章来回答上面两个问题。 标准

进入必读书单之前,我先介绍下书单里的书籍选择标准和领域选择标准。当然你也点击这里直接跳转到书单开始阅读。

书籍选择标准

1. 必读:什么是必读书籍呢?如果学习某项技术有一本书无论如何都不能错过,那么这本书就是必读书籍——例如Effective Java于Java,CLR via C#于C#; ? 注意我没有使用“经典”这个词,因为经典计算机书籍往往和计算机科学联系在一起,

而且经典往往需要10年甚至更长的时间进行考验;

2. 注重实践,而非理论:所以这个书单不会包含过于原理性的书籍;

3. 入门—必读—延伸:必读书籍的问题在于:1. 大多不适合入门;2. 不够全面。考虑到没有入门阅读和延伸阅读的阅读列表是不完整的——所以书单中每个关键概念都会由一本入门书籍,一本必读书籍(有时入门书籍和必读书籍是同一本),和若干延伸阅读书籍所构成。

概念选择标准

1. 全面:全面覆盖软件开发中重要的概念;

2. 通用:适用于每一个程序员,和领域特定方向无关;

3. 注重基础,但不过于深入:优秀的程序员需要良好的计算机科学基础,但程序员并没必要掌握过于深入的计算机科学知识。以算法为例,每个程序员都应该掌握排序、链表、栈以及队列这些基本数据结构和算法,但计算几何、线性规划和网络流这些算法可能就不是每个程序员都需要掌握的了;

通过这几个标准,我把程序员应掌握的关键概念分为程序设计,软件开发,以及个人成长三大类,每一大类均由若干关键概念组成。

快速通道

自从开博以来,经常会有朋友在论坛,微博,和QQ上提问学习X技术读什么书合适(例如:学习Java读什么书合适?如何学习程序设计?)所以我在这里列出了一个“快速通道”——把常见的问题集中在一起,点击问题,即可直接进入答案。(当然,如果你把本文从头读到尾帮助会更大 :-))

程序员的自我修养

程序员的自我修养

程序员的自我修养

程序员的自我修养

程序员的自我修养

程序员的自我修养

这个阅读列表覆盖了软件开发各个关键领域的入门书籍和必读书籍,我相信它可以满足绝大多数程序员的需求,无论你是初学者,还是进阶者,都可以从中获益:

程序员的自我修养

来自他人的书单

它山之石,可以攻玉。我在本文最后给出其他中外优秀程序员的书单,以便参考&补充。 刘未鹏(暗时间作者)

以下同一条目下用“/”隔开的表示任选,当然也可以都读。

程序员的自我修养

程序员的自我修养

程序员的自我修养

程序员的自我修养

程序员的自我修养

程序员的自我修养

程序员的自我修养

Joel Spolsky(Stackoverflow联合创始人) 1.

2.

3.

1. 软件项目管理 快速软件开发 编程技艺

程序员的自我修养

程序员的自我修养


第二篇:关注程序员自己的文化


关注程序员自己的文化

IT 频道Page 1 of 6搜狐首页 >> IT频道首页 >> IT >> 国内IT >> IT媒体头条速递 >> 产品/技术类IT媒体 《程序员》:关注程序员自己的文化-专访Tom DeMarco

2003-04-23 14:47 作者: 熊节

关注程序员自己的文化

转自: 程序员

关注程序员自己的文化

Tom DeMarco 关注软件中“人”的问题

关注程序员自己的文化

《程序员》(下文简称《程》):DeMarco先生,您好。最近,您的两本书——《最后期限》和《人件》在中国开发者中间引起了不小的反响。请问您本人如何看待这两

本书?

Tom DeMarco(下文简称TDM):噢,你很了解我的书的……这两本书代表了

我最近一段时间的主要思想。我希望所有的读者——包括程序员、经理、客户以

及所有与软件开发有关的人——重新关注软件开发中“人”的问题。我希望看到

一种人本主义的回归,就像文艺复兴那样。

我相信中国读者很聪明,他们一定注意到了我故意在书中使用的轻松气氛,还有

那种像推销员一样的夸张口吻。你知道,对于程序员的工作环境,老板们是有决定权的。可是,老板们只读这种口吻轻松随意的书。我也是不得以而为之。

《程》:不管是否喜欢您的书和赞同您的观点,读者们的确关心您的思想,并打算向您学

习。

TDM:不谦虚地说,我想我是值得他们学习的。你看,一个六十多岁的老头,他和Dijkstra

2004-4-28

IT 频道Page 2 of 6共过事,他参加了19xx年NATO会议,他开发各种程序几十年,他从结构化走到面向对象……我的经验应该会对年轻人们有所帮助。这也是我写书、做培训的原因。

一点点运气都是成功的必要因素

《程》:我记得您的乐观态度。如果没有天降神兵般的帮助,如果没有那么好的运气,《最

后期限》中的汤普金斯先生恐怕早就被吊死在摩罗维亚的肉钩子上了。但是,作为一个普通的软件开发者,我们怎么可能期望得到那么多的好运气呢?

TDM:不管怎么说,我们必须承认,在任何有风险的工作中,一点点运气都是成功的必要因

素。软件开发当然也不例外。

《程》:但是,如果没有这些好运气,我们的项目难道不就变成一场死亡之旅吗?

TDM:优秀的经理能够让好运气降临到自己身上。比如说,当汤普金斯先生第一次见到贝琳

达时,他就敏感地知道:她将成为项目组的一大财富。当时,就连贝琳达自己都还不敢肯定自己的能力呢。还有,你说的“天降神兵”中,很多人都是汤普金斯先生以前就认识的,他只是知道应该在什么时候向什么人求助而已。而且,他有一种独特的人格魅力,让那些初次见面的人也乐于和他交心,愿意帮他解决困难。所以,你说汤普金斯先生的成功是因为运气,我却说在很大程度上那是因为他的能力——知道应该选择哪些人,知道如何让这些人为自己拼命工作,这是一个管理者最重要的能力,对不对?

人与管理的简议

《程》:您在书中说,管理就是“找到合适的人,并保持这些人斗志高昂”,现在您又说汤

普金斯先生的成功是因为那些难以捉摸的能力。您是否认为,只要找到合适的人,一切工作都可以顺风顺水?或者,我们是否需要再做些其他的工作来保证这一点?如果是,我们应该做什么?

TDM:“选择什么人”和“如何使用他们”,这就是最重要的事。然后,第二重要就是富有

个人魅力的管理。所有其他的东西(过程、工具……)都只能起到一定的边界效应,但无法起到关键性的作用。

《程》:可是,这两种最重要的能力都显得很神秘,不是吗?我们要如何去学习它们呢?

TDM:我就知道你会提这个问题。没错,它们就是很神秘的能力,有些人天生就是优秀的管

理者,有些人永远都没有这方面的能力。我有没有说过“它们是优秀管理者必须的能力”?啊,这是我的表达不够准确了。这其实是一个达尔文主义的问题:只有具有这些能力的管理者才可能一次次地带领项目走向成功,并被人们评价为“优秀的管理者”。

你说对了,很大程度上这些能力是无法学习的。但是,认识到它们的重要性仍然对我们很有

帮助。首先,一些管理者可以清楚认识到自己缺乏管理的天赋;然后,他们可以去找一个真正优秀的管理者来帮助自己。知道自己无知,总比无知而不自知要来得好。

《程》:我们一直认为自己是科技工作者,但您却用这种近乎神秘的方式来解释我们的工

作……

TDM:你说对了,我们是科技工作者,我们相信科学。什么是科学?就是知道某些事情的解

决办法,也知道另一些事情不可能解决,还知道有些事情能够解决、但无法找出解决的办法。既然你相信科学,就不应该想着给所有问题找一个“科学的”解释。

2004-4-28

IT 频道Page 3 of 6

而且,软件是一门实践的科学。我们不需要像证明费马大定理那样用三百多年的时间来证明

某个办法有效,我们只是让各种不同的办法接受残酷的生存竞争。所以,教条主义是软件科学中最不可取的。

CMM,一种过时的东西

《程》:我想知道您对CMM的态度。您认为CMM对哪些企业会有帮助?又会有哪些副作用?

TDM:帮助?CMM?对于如今的软件企业,CMM有百害而无一利。

《程》:我记得您曾经说过,在长期说来,CMM有助于提高生产率,只是在短期内会造成阻

碍。

TDM:你记错了,我说的是“过程改进”,不是CMM。你知道吗,CMM已经有超过20年的历

史,它的成功经验都是在19xx年前获得的。CMM试图将一个固定的模型强加于一个日新月异的行业之上,它鼓励你效仿IBM在19xx年代所采用的软件开发方式。僵化,不敢面对变化,这是如今的软件业最忌讳的。所以我要说,对于绝大多数的软件开发,CMM毫无帮助。

当然,一定的过程是有必要的。但是,在这个变化的时代里,过程也必须拥抱变化,否则就

不是好的过程。你一定还记得,CMM2级的特征是“可重复”,我认为这根本就是一个悖论:我们的每个项目都完全不同,我们的开发环境每年都在更新,如何去寻求一个“可重复”的过程呢?你看,所有伟大的软件企业,有哪一家做的事情是“可重复”的呢?

《程》:可是有那么多人、那么多企业热衷于CMM呢。

TDM:他们根本就是无可适从——他们无法适应变化,他们无法在这种全新的环境中找到自

己的位置,所以他们总得给自己找点什么东西来信仰。William Clifford曾经说过,人们常常会根据自己的愿望而虔诚地相信一些东西,但愿望的强烈并不能使信仰变得可靠。

不过,对于只做外包项目的企业(例如很多印度软件公司)来说,CMM倒是一个不错的能力衡量标准。只有对于这种不需要动脑筋、不需要创新的企业,CMM才有意义。如果让我来评价,我会认为CMM是软件企业的耻辱符:等级越高,说明企业越缺乏创造力。

让员工偷一点懒吧

《程》:我注意到您最近出了一本新书Slack,这个书名很是有趣,能不能请您简单介绍一下

关注程序员自己的文化

这本书? TDM:其实这本书原来的名字叫《敏捷企业的秘密》(Secrets of the

Agile Organization)。在我看来,要让企业具有适应新世纪、新经济所必须的敏捷性,需要做四件事:1)给员工一点点偷懒的时间;2)帮助员工减轻压

力;3)注重对员工培养的投资;4)评估风险、控制风险。

《程》:难道偷懒也能帮助提高生产率吗?这不是违反直觉的吗?

TDM:对呀,你应该让员工每周七天、每天十二小时地拼命工作,这样效率最高了——如果

他们的工作是搬砖头的话。

你必须首先搞清楚,要让你的员工为你贡献什么,然后再决定如何安排他们的工作。对于软件开发者,我们需要他们贡献的是创造力,是他们的点子,是他们的聪明才智,所以,我们必须让他们常常放松,有自由思考的时间,这样他们才能把自己的才华发挥出来。

2004-4-28

IT 频道Page 4 of 6软件本质

《程》:Fred Brooks说过,软件中的关键问题导致“没有银弹”。但是,难道每种软件的关

键问题都是一样的吗?比如说操作系统和ERP系统。

TDM:Brooks说,软件的关键问题就是“找出需要做什么”,而“怎么做”则是次要问题——所有的技术、工具和过程解决的都是这个次要问题。我完全同意他的观点。在“怎么做”的问题上,我们取得了极大的进展;但是,在“做什么”的问题上,几十年来情况似乎并没有太大的改善。我想,这是由于软件的本质造成的。

《程》:那么,什么是软件的本质呢?

TDM:我们的世界是模糊的、连续的、不精确的,但软件是精确的、离散的、形式化的,这

就注定了软件不能完全描述现实世界。因此,我们需要知道描述哪些部分、忽略哪些部分,这就是软件的本质问题。显然,这是一件机器无法完成的工作,软件的本质意味着开发人员的存在意义。

《程》:您认为对软件业最好的比喻是什么?是工程学?是艺术?还是工艺学?

TDM:都是,但又都不准确。软件中有工程学的成分,有工艺学的成分,也有艺术的成分,

所以它才如此复杂。

在过去的几十年中,我们在“软件工程”这条路上做了大量探索,并且取得了极其可观的成果(很荣幸我在其中也做了一些贡献)。但是,现在看来,边际效用递减律正在起作用,对软件工程进行更多的探索所能收到的效果正在变得越来越少。所以,我认为应该去考虑另一些以前很少考虑的问题。比如如何营造良好的工作环境,如何将新手培养成熟练的开发者……以前很少有人系统地考虑这些问题,所以如果在这上面投入努力也许能获得更大的效果。

眼中有英雄

《程》:最近Bill Gates来了中国,引起了整个中国IT业界的轰动。您如何看待Gates先生和

他的微软帝国?

TDM:噢,我可是Gates和微软的崇拜者。现在,全世界的人都在使用计算机,微软在其中起

到的作用胜过其他任何一家公司。而且,Gates本人很有意思:他有一个天才的头脑,总有精彩的点子;同时他又是一个优秀的商人,知道如何用自己的点子去挣钱。你也看到了,在《最后期限》中,我用Gates的形象刻画了摩罗维亚的国家元首。我想,这是我能对Gates表示的最大尊敬吧——不过,像Gates那样挥霍建豪宅,我也是反对的。这大概是老头的毛病吧。

说实话,如果说有一家公司是我心目中的理想企业,那就是微软。有很多人试图找出微软成功的秘密,可是他们常常去关注微软的开发过程。其实,微软的开发过程有什么可研究的呢?他们有全世界最优秀的员工,这些人享受着全世界最舒服的工作环境,不管用什么过程,我相信他们都能取得这些成就。其实,微软最值得研究的也是这两个问题:如何得到优秀的员工;如何让员工尽量发挥自己的能力。

《程》:您大概也知道,很多人抨击Gates和微软,说他们贪得无厌,说他们垄断……

TDM:贪得无厌?哈哈,这大概是对一个商人最好的称赞吧?至于垄断嘛……你还记得IBM垄

断案吗?19xx年,美国司法部控诉IBM垄断了个人计算机市场,而且用各种手段阻止其他公司的竞争——他们的手段可比微软厉害得多呢。IBM是怎么说的?他们说自己预见到计算机革命的巨大潜力,并通过自己“高超的技术、远见和产业”来统治该行业。政府最终在19xx年撤消了对IBM的控诉,理由就是“计算机产业的本质决定了它是充满风险和竞争的”。像这样一个充满风2004-4-28

IT 频道Page 5 of 6

险和变化的产业,如果微软真的像他们说的那样垄断长达十多年之久,那我就更要崇拜

Gates和他的微软了。

《程》:除了Gates先生,您认为哪些人称得上是程序员中的英雄?

TDM:我尊敬的英雄有Barry Boehm、Victor Basili、Bob Glass、Ed Yourdon、Ken Orr、

Fred Brooks、Capers Jones、Tim Lister,还有苹果公司的Sheila Brady。你看,他们曾经有过辉煌的成就;他们关注程序员群体的利益;他们不断探索新知,并把自己的知识和经验传递给新一代的程序员;他们不关心那些流言蜚语,也不热衷于哗众取宠,他们只关心如何帮助程序员更好地成长、如何让程序员能够不断进步。只有这样的人,才配得上“英雄”的称号。

关注程序员自己的文化

Tom DeMarco与Tim Lister的合影 (搜狐IT编辑配图) 关注程序员自己的文化

《程》:最后,按照我们的惯例,请您对中国程序员说一句最想说的话吧。

TDM:文化。只有拥有了共同的文化,同样职业的一群人才能成为一个社会群体,才能得到

整个社会的重视,否则他们就只是恰好有些共同之处的乌合之众。工人、农民、商人……甚至连流浪汉都有自己的文化。软件开发者也应该努力营造并维护自己的文化,而我写的一些书也是在为这种程序员文化尽绵薄之力。

这就是我想说的:在技术之外,请关注程序员自己的文化。

附:CSDN.net上的网友评论

fingerfoolcn: 真是经典,不过我不相是我一个人认为它是经典的,我希望全世界的程序员都认识到这一步。我想我把TDM当成我的偶像是没有错的。我有一个理想,那就是中国管理者都是这样,那时我们的轮作就会像我们的思想一样了,有了更高的高度。 (2003.04.22)

csdn_bob: 也许环境才是最应该解决的问题!中国所有的老板都想员工24小时上班,其实他们想错了!他们只是想让程序员,坐在电脑前,其实我也这样,只要我坐在电脑前,老板就放心了!这样的观念什么时候才能有所。。。期待。。。 (2003.04.20)

2004-4-28

IT 频道Page 6 of 6

Raptor: 但是文化要有土壤,不知道中国的软件业什么时候能长出文化来。郁闷 (2003.04.15)

headzg: 说到我心坎里去了。特别是对于CMM的见解,简直是太精辟了。 (2003.04.15)

lee_j: 看完后茅塞顿开 (2003.04.14)

2004-4-28

更多相关推荐:
程序员面试自我介绍

程序员面试自我介绍程序员面试自我介绍我叫xxx今年21岁毕业于xx解放军信息工程大学计算机科学与技术专业拥有扎实的corejava基础良好的编程风格熟悉jspservletjavabean模式的web开发熟悉s...

20xx程序员自我介绍范文

20xx程序员自我介绍范文程序员在程序的开发过程中扮演着非常重要的作用其技能素质直接决定着程序开发质量的高低本文是学习啦小编为大家整理的程序员自我介绍范文仅供参考程序员自我介绍范文一我叫xxx今年21岁毕业于x...

20xx程序员面试时自我介绍范文

20xx程序员面试时自我介绍范文程序员在程序的开发过程中扮演着非常重要的作用其技能素质直接决定着程序开发质量的高低程序员的培养作为IT技术高职计算机软件技术专业的主要培养内容之一本文是程序员的面试时自我介绍范文...

程序员面试技巧,自我介绍,亲身总结

一段短短的自我介绍其实是为了揭开更深入的面谈而设计的一两分钟的自我介绍犹如商品广告在有限的时间内针对客户的需要将自己最美好的一面毫无保留地表现出来不但要令对方留下深刻的印像还要即时引发起购买欲精彩推荐英语面试自...

程序员面试英文自我介绍

GoodmorningladiesandgentlemenItsagreatpleasureformetohavethisopportunityfortheinterviewIhopeIcanmakeagoodperformanc...

程序员面试技巧,自我介绍,亲身总结[1]1

一段短短的自我介绍其实是为了揭开更深入的面谈而设计的一两分钟的自我介绍犹如商品广告在有限的时间内针对客户的需要将自己最美好的一面毫无保留地表现出来不但要令对方留下深刻的印像还要即时引发起购买欲精彩推荐英语面试自...

程序员英语自我介绍

GoodafternoonIamofgreathornortostandhereandintroducemyselftoyouFirstofallmyenglishnameisandmychinesenameisIfyouareg...

java程序员_英语自我介绍_就业

GoodmorningItisreallymyhonortohavethisopportunityforainterviewIhopeicanmakeagoodperformancetodayI39mconfi...

大学生求职程序员英文自我介绍

大学生求职程序员英文自我介绍FouryearsofcollegeeducationcultivateIbecomeadarestoundertaketheresponsibilitythepeoplesince...

面试常用的英文自我介绍

面试英文自我介绍的一些技巧QCanyousellyourselfintwominutesGoforit你能在两分钟內自我推荐吗大胆试试吧AWithmyqualificationsandexperienceIfe...

面试前的英语自我介绍

首先准备英语面试时的自我介绍要特别注意两点一条理清楚用词准确二真实展现自己的本质不要用夸大或吹嘘的词语有些人喜欢在做英语自我介绍时夸张地表现自己的优点甚至把根本没有做过的事情也说出来其实这是一种很冒险的行为虽然...

程序员简历自我评价

程序员简历自我评价本人勤奋踏实工作认真负责自学能力强性格开朗容易与人相处注重团队协作精神且能承受较大压力注重专业基础学习和实践能力的培养在校期间不仅做过多个课程设计暑假期间也去过单位实践过对java编程和网站开...

程序员的自我介绍(10篇)