敏捷的开发者,特别是极限编程人员将会发现,这本书提供了很多实用技巧,而这些技巧为极限编程的价值--也就是勇气与沟通--提供了支持。那些怀有成为软件工匠抱负的人,将获得成为工匠群体中一员所需的洞察力。
这本书叫做《在软件业获得成功》,但它看起来可以叫做《在任何行业获得成功》。你确实讨论了为什么要在软件世界里应用每个教训。但你能用几句话概括一下为什么这本书对软件业的专业人士以及那些怀有相同抱负的人格外有用吗?
确实如此,这本书中的很对想法对于所有行业都是有价值的。这里有些共性行为,它们会让人成功。不管你是一名程序员、一名脑外科医生还是一名会计师,这都没有关系。如果你对每个人都很友善,对时间进行了很有效的管理,并且是一名优秀的公共演讲者,那么将会在你的领域中更加成功。我写的这本书《在软件业获得成功》中有三分之一是一般性的职业生涯建议,三分之一是软件方面的具体建议,还有三分之一是带有较多软件特点的职业生涯访谈。它的三分之二关注于软件,这使它特别对于极客们(因特网 "怪人", 对计算机或因特网上瘾的人)产生了真真正正有价值的职业生涯指导,而不是一本单调乏味的自助书。很幸运,我们在非常有活力、成长中的行业中工作。我们在高科技领域都有巨大的机会。几乎每一样使用直流电的东西都要使用软件。当今,有超过二十亿人链接到了互联网上。我们所有的技术都在逐渐地自动化、相互连接。那就是机会!对于那些想在软件业取得成功并获得机会的人来说,值得学习一下那些可以让我们取得成功的技能,而这些技能是在学校都没有教过。
你采访过的人都很有趣,并且访谈都很启发人。你是如何选择被采访者的?
访谈经过了非常、非常认真地筛选。我想包括研究员、变革者、业务领导者,年轻的、年长的,男人、女人。我也想采访那些有深远影响力的人。首先我研究了过去二十年计算机管理协会图灵奖的获奖名单。我也询问了那些意见值得信任的卓越执行官,问他们认为谁是软件业里过去三十年最具影响力的人。我设法确保包括了大部分语言和操作系统的革新者。我看过顶尖软件公司的名单,并设法确保我已经囊括了这些领导者中的代表。之后,我手中有了大约三十人的人名列表,我逐渐消减,直到这份名单达到恰当的特性平衡点和人数。
对于不是简单因为篇幅限制的原因而不得不被排除在本书之外的人,你进行过采访吗?
这是个危险的问题!有两个人,他们答应接受采访,但是并没有坚持到底。尽管我不能提他们的名字,但那确实很令人沮丧。
有没有你确实想采访并写进书里,但却没有做到的?(比方说,我有一点惊讶,在这份列表中竟然没有看到Alan Kay。)
实际上我采访过Alan Kay!由于篇幅限制,我很难囊括全部的访谈。贯穿现代计算机工作的关键时代,Alan有过一段使人们深深地得到启示的创造和贡献时期。对于面向对象、动态编译语言,以及关于图形界面的早期想法,Alan都是重要的推动者。他还花费了大量时间推广在教学中使用计算机。对Alan的采访中,自始至终带给我的重要积极的感觉就是他对计算机科学艺术的酷爱。和弹奏爵士吉他(他的另外一个酷爱)有些类似,他真的视计算机科学为一门艺术。在第十八章关于“成名”的末尾,我加入了给予我灵感的引用,它来自于我与Alan关于“你的艺术爱好如何驱动真正的快乐和成就”的交流。读者们请看,下面就是:“艺术家由理想的内心意识来驱动做事的人。他们非常易于集中精力并且容易上瘾。各种类型的音乐已经是“可供选择的艺术形式”,但我已经对它近乎于上瘾了(像古典和爵士这种高度成熟的音乐形式需要大量的思考和磨练,至少对我来说是这样的)。理想主义为许多这样的名人,设立了相当多不可能达到的目标。 Butler Lampson喜欢引用Browning的一句话:“要不断超越自我,否则还有什么乐趣可言呢?”,并且他的发展比我更均衡。我有一位精通吹玻璃的朋友,他告诉我如果可以的话,他将尝试一下模铸玻璃。我完全了解他的意思。这就是“艺术中的快乐”。”
看起来几乎所有的被采访者都是在初中或者高中时开始使用计算机。这意味着他们都投入了至少一万小时的时间来实践,这一点Gladwell在《局外人》中谈论了很多。到底要早到什么程度,对于成功的职业生涯,特别是对个真正一流的职业生涯才会起到决定作用呢?
我宁愿相信早些开始不是决定性的,因为早些开始太痛苦了,以至于无法相信其他方式。相信你需要早些开始然后就不必担心,这看起来不合理,甚至是残酷的。然而,事实上,真正成功的软件革新者,大多都是早早涉猎其中。很遗憾的是,尽管它不是必须的,但看起来却非常有用。我曾经听过关于一位音乐家的访谈,这位音乐家二十岁的时候开始学习弹吉它。几十年后他说,“我还是用一个调弹吉它”。这位吉它演奏家是聪明的,但他的音乐就是赶不上那些从小就开始弹(吉它)的人。好像我们的大脑整合语言非常早。比方说语言、音乐、数学、编程--这些都是语言--年轻时开始构建起来的流畅度是之后所不能媲美的。它是人类条件的限制。尽管精通编码获益于早些开始,但商业领导力和商业革新就不是早些开始就能从中获益那么简单了。年轻的另外一个益处是没有责任需要负担。没有按揭要付,没有家庭要供养,没有孩子需要照料。年轻时所允许的各式各样的行为,当你岁数大了、安定了之后就不能那么容易做了。你更容易承担商业风险(当你没有什么可失去的时候,不会有太多的风险),你可以通宵工作。伟大的开端常常就是那样显露出来的。这是“两个人在车库里带着一篓子可乐、薯条”的模式,并且真的是以年轻作为必要条件。四十岁之后,在尝试(这样的模式)之前,先去看看医生吧。
如果我对这本书有误读的话请纠正我,但是它看起来成功需要的知识和技巧只有少数是“技术性的”,这个比例可能只有百分之三十到四十。好像大多数都是“软性的”。有没有什么途径可以获得这些软技巧,而不是通过经验去获得?
总的来说,我认为真地(成功需要的“软性的”和“技术性的”的知识和技巧)混合物(比例)接近于百分之五十对百分之五十,因为他们是相互依附的成功因素。你既不能仅仅靠魅力,也不能单独靠计算机方面的专家(技术技巧)。对于我们来说,在我们职业生涯的初期,是向技术技巧倾斜的,然后,随着时间的推移,软技巧的重要性逐渐增加。高层职位关于技术性和管理性的追踪需要更多的软技巧。那是因为这样类型的角色需要人际交往、有效的管理、经验、谋取地位和说服力。
你在学校与工作之间进行了重要的对照,并且看起来找到了一些学术界的重大缺陷。我们的教育制度(小学至博士的分级)使人们为你谈到的各种职业生涯的成功做好足够的准备了吗?
没有,学校没有使我们为真正的成功做准备,并且我不认为他们尽力这样做了。这是我写《在软件业中成功》的原因所在。把学校确定为是专业准备的,可能更直截了当些?在我书中的第一句话说道:“你上大学去学习专业,他们却拼命的给你一个教育”。我们的大学的学位课程源于欧洲的传统,这个传统基于教会人们如何思考,并且包含了大多数的理论想法。高见、深奥的问题和优秀的著作。他们总是关注于理论。甚至像非常实用的领域,如护理、工程和法律的学位课程,从根本上看仍然根植于和实际应用差不多多的高见之中。那些高见的方法是超级有价值的,我不应该丢弃它。但是真正的成功需要技术的和软的技巧,而软的技巧在学校并没有被教授。所以如果你认为大学的学位课程是关于给人们以理论背景并教会人们如何思考的话,那么我认为他们做的很不错。如果你认为大学应该是职业成功的训练场地,那么他们有所不足。我最近在给美国一所顶级的计算机科学学校讲授计算机科学课程。当我了解到学生们没有学过程序设计语言时,我很吃惊。他们学习设计模式、理论,以及算法,但是对于实践部分,也就是学习语法,学校却认为学生会在这个学习的过程中顺便学到。我觉得对于一个优秀机构有明确的方向并把他们的教育优先级放在什么地方,那是个不错的例子。我们可以争论是否这种方法是不切实际的,但至少我认为在他们在教育策略上是清晰的。
学位只不过是让你通过人力资源的通行证吗?你采访过的大多数人都有研究生学位,似乎是说获得学位的经历是很有趣的并且教育经历是颇有价值的,但是他们并不认为学历本身对于他们自己或者别人的成功是一个前置必要条件。在这里,有没有这方面的教训可以帮助一名学生更好地在大学里使用他们的时间呢?
让我们把学士学位和研究生学位(硕士和博士)分开来谈。我认为学士学位非常有价值。它不仅仅是一纸文凭。已经通过顶级学士课程的人一般会比获得大专文凭或者自学的人有更好的平均技能,当然也会有例外。记住我说的是“平均”。这里有很多非常明显的例外,一些让人印象非常深刻、聪明并取得了巨大成功的人,正是在没有学历的情况下就成就了事业。一些名人,如(苹果的)Steve Jobs、(微软的)Bill Gates、(Facebook的)Mark Zuckerberg、(甲骨文的)Larry Ellison就是如此。 你在本科学业中会学到很多非常重要而又实用的思想,像数据结构、算法、操作系统、复杂性分析等等,而那是很难从大专课程或者通过自学学到的。学士学位也是对你的技巧、思想焦点和职业道德的证明。确实,学位是申请者通过人力资源部门的通行证。尽管如此,学术成就和职业生涯成功之间的关联是还不明确。有太多职业生涯成功需要的东西与学校教育无关。举几个例子:你对艺术的热情,创新思维,对处理模糊问题形成有组织的计划,领导和组织他人的能力,清晰沟通,了解如何在(大型)组织中获得任务,必要的谦逊,以及同样在需要时的少许傲慢等等。在获得研究生学位(硕士和博士)的过程中,你学的内容的价值真的是更少了,而更多的价值在于他们要求学生掌握科技写作、文献评论以及独立研究的技巧。并非所有的工作都需要那些技巧,但是研究生课程经历的那些做过的事情,却是很好的成长经历。所以我同意一些我采访过的人的观点:研究生学位(硕士和博士),副作用的价值大于它的内容,并且在多数情况下,即便你没有研究生学位,也能拥有光辉的职业生涯。
对于你的第二个问题,如何在大学中更好地利用时间,我将用书中的观点来回答:“如果知道问题在哪儿,那么在生活中取得成就的可能性就会大大提高”。那是因为,如果你不知道你想去哪,你就不大可能到达那里。所以,当他们在学校时,他们能做的最好的事情就是想出他们爱好什么,并用现实情况衡量一下,以确定他们想去哪的愿景。对于我们大多数人来说,这个愿景通常是很实际的,像会计师,与一些更有趣的——像成为摇滚明星——之间的妥协。计算机科学的优势在于,在那里你像会计师一样从事着幸福而稳定的工作,并且穿着像一位摇滚明星。说正经的,如果你知道你想做什么,并且知道你想达到的目的地,那么就可以利用那个愿景,通过进修课程来拥有那些能让你为那个目标做最好准备的经历,进而“戏弄”这个制度,而不用去管它们是否正式列在课程上。
在我们大学或者研究生教育制度里,(如果可以的话)你将改变哪三到五件事呢?
在元级别,我认为我们应该介绍更多实用的非工程技能,包括软技能技能和商业。我是强调理论认识与学习如何思考这一潮流的极力拥护者,但是我想看到专业技能融入其中。为了达到那种平衡,我需要做如下的改变:
- 业务技能。我们应该把业务开发和企业家精神教授给每一位计算机科学、工程学的研究生。优先这样做的原因有二:
- 首先,因为这些学校将培养出社会的高科技商业领导核心。对于那些赶上了下一个重要科技理念的人们来说,那会让他们可以推出Google或者Facebook,我们想让他们知道如何带着这个理念继续向前。
- 其次,即使我们的研究生是公认的技工,他们热衷于做极客一族,对业务上的问题丝毫不感兴趣,当这些人开发技术时对市场压力、业务需求、产品生命周期影响敏感时,我们的世界仍将变得更好。
- 要求他们能够进行有效的沟通。技工的沟通能力差是出了名的,但是把如此多的创造伟大技术的技工聚集在一起,靠的就是有效沟通。这很大程度上依赖于口头交流,但也可以通过邮件和演讲,这样我们就会成为技术共同体。不管当地语言是不是你的母语,你都必须让和你一起工作的人清楚地理解你在说什么。
- 可用性和设计。我们这些科技工作者靠功能重于形式而茁壮成长,但是在少数领域也有例外,在这些领域中你可以假设操作者是一台机器或者是一名需要几年来培训的人,在大多数情况下,优先级是颠倒的。“让它工作,然后让它简单”的箴言正在毁了我们。我认为苹果公司采用的“让它简单或者根本不要做”的方法,对他们很管用。优先级被颠倒的一部分原因是因为我们没有训练人们为了可用性而设计。我们训练人们如何从软件工程的远景来设计程序,但是很少训练如何为了人的使用来设计软件。我们需要向我们的下一代灌输这样的理念并让他们相信:人比我们教授给他们的能力更重要,也就是说,给工程师提供这样一个为了人的体验而提升他们工作的工具。
- 新兴技术。学校倾向于教授学生基本法则。我希望大学生在他们毕业后通过体验获得尖端科技部分的知识,在研究生阶段的学生,就可以在非常狭窄的领域关注尖端课题。我们丧失了所有从“异花传粉”带来的机会,在这些“异花传粉”中两个或者更多好的想法会被合并创造出真正新的、伟大的事物。
- 计算机是怎样工作的。令人惊讶的是,很少有学计算机科学的学生真正了解整个系统的各个细节。而那对于程序员如何开发代码是有连锁反应的。了解计算机的人在他们程序设计时会对诸如你CPU利用的怎么样、内存消耗的怎么样,磁盘空间和网络带宽消耗的怎么样更加敏感。
作为职业生涯成功的重要技能,你认为设计和设计思想的作用何在呢?除了程序设计或者计算机系统结构课程之外,几乎任何一种计算机科学或者软件工程编程设计都不会教授设计,甚至在专业领域中谈论的也不多。
你的问题很有见地,并且在我之前的回答中我间接提到了一些。好的设计让我们可以成功。如果你问人们关于技术什么使他们灰心丧气,答案通常是两件事情:软件有太多bug,或者软件太难以至于无法使用。可用性设计在后者提及了,并且它是把产品推向成功最重要的特质之一。事实上,我主张大多数优秀商业软件的成功是由于设计而非功能。让我们来看一些例子:苹果电脑,它既不是功能最强大的个人电脑也不是最便宜的个人电脑。它的成功在于它使用起来足够方便,以至于一个高中学生都能认真地开始程序设计。Facebook并没有让我们与以前电子邮件都不能到达的人一起合作,但是它创造了更加生动并且使用方便的体验,因为我们都可以彼此找到对方并且可以在一个易用的图形空间里分享信息。通过用更好的可用性提供以前就有的功能,几乎来自于手持电脑或者复杂关系数据库的一切都取得了成功。九十年代中期,James Hamilton是我的良师益友之一。他现在是卓越的工程师、亚马逊云计算的副院长。James曾经告诉我说:“与成功争辩是很困难的”。不管在运行方式上他们可能有多少次的失败,用成就推动了科技成功或者生意成功的人将会得到信任。在设计方面的高雅是项目成功乃至职业生涯成功的真正秘密武器之一。
在大学中学习计算机科学或者软件工程是为从事计算机事业做的最好准备吗?当我还是一位全职IT经理时,好像我最好的人手中至少有一半大学时是非计算机专业的。
当然要看工作的情况而定。例如程序设计工作,计算机科学的本科学位是很好的训练。许多IT工作,可能是大多数的IT工作,并不强调编程。对于IT管理人员、IT商业咨询、web设计和许多其他的领域,你都可以做的非常好,没有计算机科学学位可能做得更好,并且还有许多机会去做创造性的和智力上有挑战的工作。
软件是不是已经变得太大、太笨重、而无法使用了呢?创建软件的组织已经变得有太多层次、过于方法/过程导向,以至于没有效率了吗?当我读这本书的时候,我似乎感受到了一些肯定的答案,但是好像我表达的是自己的偏见。
这是一个令人着迷的问题,并且我认为真正的答案是:我们正处于计算机历史上一个有趣的阶段,这个阶段的答案是在不断发展变化中的。重要的软件总是复杂的,并且最老的和最成熟的系统现在已经发展了几十年了。这些系统的代码和设计复杂性现在已经达到了事先深不可测的程度。当你拥有来自于存在多年组织的几百万行代码,而这些代码的作者是来来去去的成百上千个人时,你会期待什么呢?另一方面,虽然大多数组织难于应用敏捷,但是敏捷开发方法正在真正地显现出:让开发软件的过程更灵活并降低风险。云计算正在简化在开发团队之后的大量的环境管理的痛苦。程序设计模式也正在变得更简单。没有一点经验的人能够做更多事情了,因为技术障碍正在减少。几个月以前,我被邀请去给旧金山附近的一个用户组织作演讲。在我演讲结束后的不长时间,另外一位应邀发言者炫耀了他的新iPhone应用程序,这个应用程序带有一流的图像绘制、一个产品选择和定制结构,以及一个payPal的支付接口。一切都非常漂亮,现在茶和饼干在哪里?直到他坦承:在三周内,他开发了全部的应用,并且之前他从来就没有编写过程序!我差点从椅子上摔下来。他的妻子说:“我厌倦了我的工作,因此给我做一个iPhone的应用程序吧,这样我就可以在家做生意了”,就这样三个星期后,他就在这里了。人们正在开发丰富多彩的在线内容,并且这个工作本身正变得越来越容易。
因此,当代码复杂并且这些代码正变得越来越大的时候,就应该把它推到更高的抽象层,抽象会使事情更简单并且更多的迭代和动态开发方法论会减少风险。我们的工作就会更有趣!。