“人工智能大脑”跳槽记:吴恩达所理解的智能,创新和失败

2016-04-17 董老师在硅谷

前两天公众号上发了吴恩达的Quora采访问答,而上周四“机器学习研究会”线上交流中,雷鸣对话吴恩达深度解析人工智能的发展现状与未来。让我印象深刻的是这么一段他谈到无人车和AI领域学习建议。吴恩达说:

在中国,每天都有500人死于车祸。我们的无人驾驶技术早实现一天,就相当于多拯救了500人的生命,这将会是接下来的十年中,人工智能得到的最重要的应用之一。

我想和在座的年轻人说几句话。我们处在一个独特的时期,这是一个人工智能将会改变世界的时期。如果你知道怎么运用人工智能,你今天的一个决策将有可能在接下来十年里改变世界。你的努力可能会拯救数以万计甚至百万计的生命。或许,你可以改变整个行业,帮助无数的人。也正因如此,我对人工智能如此兴奋!如果你还年轻,正在考虑未来的职业如何规划,我希望你能够考虑人工智能。

人工智能发展的如此迅猛,从事这一行业的我们应该不断的学习。再一次,我想跟在座的年轻人共勉:每个周六,你可以选择看美剧,也可以选择学习。如果你学习,两天后的周一,你不会很快的就在工作中出彩,你的老板也不会知道你花了整天的时间学习,更不会夸奖你什么。你几乎找不到任何东西可以证明你在努力学习。但是我想告诉大家:如果你每个周末都这样努力工作,持之以恒,你会发现你已经突飞猛进。我认为,学习是一件几乎没有短期回报的事,但是从长远来看,回报却是非常丰厚的。

下面这一篇是去年Huffington Post对他的采访,讲述科学家背后的成长,经历的失败和保持的信念。译文知乎专栏“董老师在硅谷”首发。转发请注明。

可以说最好的计算机科学的项目分布在卡内基美隆、麻省理工、加州大学伯克利分校和斯坦福大学等高校中,而吴恩达教授 (Andrew Ng)正是从这些地方分别取得了本科,硕士,博士学位,以及12年的任教经历。

吴恩达虽然不到40岁,但是已经是人工智能界的标志性人物。早在2011年,他建立了谷歌大脑(Google Brian),这是依托于谷歌强大的计算能力和丰富的数据建立起来的一个深度学习的研究项目。可喜的是,这个项目的重要成就之一是通过让计算机分析几十个YouTube的视频截图来识别猫(《纽约时报》标题:需要多少计算机才能正确的识别猫?16,000台)。正如吴恩达解释的那样,“最值得注意的是,我们的系统自己发现了‘猫’的概念,尽管没有人告诉过它‘猫’是什么。这可以说是机器学习的一个里程碑”。

吴恩达流露出喜悦但却非常冷静,他欣然地讨论着他职业生涯中犯过的错误和遇到的失败,以及他读不懂的论文。他每天穿着一样的牛津蓝的衬衫。他的妻子Carol Reiley从事外科手术机器人的研究,当同事们谈及他和妻子之前那张机器人主题的订婚照片时,他也会脸红,但又非常自豪。

尽管他作为讲师备受欢迎,但当和他一对一交谈时,他的声音显得非常柔和。2011年,他把自己在斯坦佛教授的机器学习课程录像上传到网上,随后超过100,000人在网上注册学习了这门课。在接下来的一年里,他和别人共同创立了迄今世界上最大的在线公开课程平台—Coursera。Coursera 的合作伙伴包括包括普林斯顿、耶鲁以及中国和欧洲的顶尖高校。尽管Coursera是一个盈利性的公司,但所有的课程都是免费开放,因为“对课程本身的内容收取费用将是一个悲剧”,吴恩达说到。

去年春天,吴恩达宣布了一条令人震惊的事情,他将离开谷歌、离开曾全身心投入的Coursera而加盟百度。当时,中国的科技巨头百度斥资3亿美金,在位于谷歌硅谷总部不远的地方,正建立一个专注于研究人工智能的实验室。吴恩达将会领导和管理这个实验室。

像之前一样,吴恩达在百度继续尝试让计算机以很高的准确率来实时识别音频和图像文件。吴恩达相信,高达99%准确率的语音识别技术会为人和计算机的交互方式、以及未来操作系统的设计带来革命性的改变。同时,面对百度的数以百万刚开始体验数字生活的用户,他要帮助百度为这些用户提供更好的服务。“在中国,你可能得到和美国的完全不一样的查询请求”,吴恩达解释道,“例如,我们得到的查询可能是‘百度你好,上周我在街角的那家店吃了碗面,味道很棒,你觉得这周末那家店会有促销活动吗?’”。“像这样的查询请求”,吴恩达补充道,“我想我们已经可以很好的回答它”。

尽管Elon Musk (SpaceX和特斯拉的CEO)和史蒂文霍金已经发出警告:高级人工智能技术可能会威胁到人类自身,吴恩达却不以为然,“我不会防止人工智能向邪恶的方向发展,就像我现在不会去解决火星上人口过剩问题一样。”根据吴恩达所说,距离人工智能达到可以自我感知的水平,还有相当长的一段时间。但与此同时,人工智能导致了更加棘手的问题的出现:这些基于机器学习的计算机,正在取代很多人工工作,而且这种趋势正在加速。吴恩达经常呼吁政策的制定者为因此产生的社会经济后果做好准备。

在位于加州Sunnyvale 的百度实验室,我们采访了吴恩达先生。我们谈到了一个名为‘索菲亚’(Sophia)的项目,这个项目诣在收集非常有趣的人的经历。他解释了为什么他认为“跟随着你的热情”是非常糟糕的职业发展建议,分享了他教授创造力的方法;他也讨论了他的失败经历以及他的一些不错的习惯,对他影响最大的书籍以及他关于人工智能前沿领域的一些看法。

问:您最近曾说过,“我发现人们正在学着更具有创造力了”,请您解释一下?

答:问题是,一个人如何才能创造新的想法?新的想法是某一个方面的天才(比如乔布斯)的不可预知的行为?还是可以通过系统的传授产生创新的想法?

我相信创新的能力是可以被教授的。人们可以通过很多方式来系统的发明创新。我在百度做的事情之一是组织一个关于培养创新思维的讨论班。我的想法是,创新不是那些天才所做的随机的、不可预知的事情,恰恰相反,人们可以非常系统的创造从未被创造的新事物。

对我而言,无论何时,当我觉得我不知道下一步应该如何做的时候,我将会尝试大量的学习和阅读,和某些领域的专家谈话。我不知道我们的大脑是如何工作的,但它非常的神奇:当你读了足够多的书,或者和足够多的专家谈话之后,换句话说,当你的大脑有了足够多的输入信息,新的想法就会随之产生。我知道的很多人都有这样的经历。

当你对某一个某技术领域足够的了解,你便停止随机地寻找新的想法。你会通过深思熟虑来选择想法,把这种想法组合到一起。你也会知道什么时候尝试创造尽量多的想法,什么时候裁剪、整合已有的想法。

好了,现在还有一个挑战,就是面对非常多的新想法,你如何去做?如何进一步用这些想法做一些非常有用的东西?当然,这是另外一回事了。

问:你可以谈一下你平时会学习什么,学习的方法是怎样的?

答:我阅读很多材料,也花很多时间和很多人交谈。我觉得两个最有效的学习、获取信息的方法是阅读和同专家交谈。所以我会花很多时间做这两件事情。在我的kindle上有不到一千本书,我大概已经阅读了其中的2/3。

在百度,我们有阅读小组,在那里,我们可以每星期读半本书。我试试上参加了两个这样的阅读小组,在每个小组里都会每星期读半本书。我想我是唯一一个参加了两个阅读小组的人。我每周六下午最喜欢的活动就是独自在家阅读。

问:我想了解一下早期教育对你的影响,你觉得父母做了什么独特的事情对你后来产生了持续的影响?

答:我记得在我六岁时,我父亲为我买了一台电脑,并帮助我学习编程。这本身并不是很特别,因为很多计算机科学家从很小的时候就开始学习编程了。但我仍然觉得从小就拥有计算机学习编程是件很幸运的事。

不像传统的亚洲家长,我的父母对我的要求非常宽松。当我在学校取得好的成绩时,他们就会夸张地表扬我,甚至让我觉得有些尴尬。所以我有时故意把取得的好成绩藏起来[笑]。我不喜欢把我的成绩单拿给父母看,不是因为我的成绩不好,而是因为他们的反应。

我有幸能在很多地方生活和工作过:我出生在英国,在香港和新加坡长大,来到美国读书。我在卡内基美隆,麻省理工,伯克利都拿到了学位,最后去了斯坦福任教。

我也有幸因为去了这些地方,从而见到了很多非常优秀的人。我在著名的前AT&T贝尔实验室做过实习,然后去了微软研究院。这些经历使我有机会从各个角度看待问题和接受观点。

问: 如果可以重新规划你的教育和早期的职业,你会做哪些不同的事情?你有哪些会让别人受益的教训,可不可以分享一下?

答: 我希望这个社会能给年轻人更好的职业发展建议。“跟着你的热情做事”不是什么好的建议,相反,是给年轻人非常糟糕的建议。

如果你酷爱驾车,并不一定要成为赛车车手。事实上,我们应该把“跟着你的热情做事”改成“跟着你的热情做事,但这些热情是对你在大学所学专业相关事物的热情”。

但通常,你先是掌握了一件事情,然后才会对它有热情。我相信大多数人都会很好的掌握大多数事情。所以关于选择我想要做的事情,有两个标准。第一,是否有学习的机会。就是说,做这件事情是否会让我学到新的、有趣的、实用的东西?第二,就是潜在的影响。这个世界有很多有趣的问题需要解决,但也有很多重要的问题。我希望大家把精力放在解决重要的问题上。

幸运的是,我不断地找到能够产生深远影响的事情去做,同时也有很多学习的机会。我想,年轻人如果能注重优化这两个标准,就会获得非常好的职业发展。

我的团队的使命就是要做更难、更高级的人工智能技术,这些技术会影响数亿人们。这就是令我兴奋的使命。

问: 在你看来,重要性就是说可以影响很多人吗?

答:不是。受到影响的人的数量并不是衡量重要性的唯一标准。用显著的方式改变数亿人的生活,我想这是我们可以合理追求的境界。通过这种方式,可以确信,我们不仅仅是做有趣的事情,而且是做有影响的事情。

问:你之前谈到过你做过一些失败的项目,那你又是如何面对这些失败呢?

答:失败在所难免,说来话长了[笑]。几年前,我在 Evernote里面列了一起清单,试图记住我所有开始做,却由于各种原因最后不了了之,或者没有成功,亦或投入和产出完全不成比例的项目。有时,我通过运气而非技能,以出乎我意料的方式,把一些项目做出来了。但我还是列了上面提到的那个清单。然后把它们按照哪里出了问题分类,对他们进行彻底的分析,找出没有成功的原因。

其中的一个失败的案例发生在斯坦福。当时受到鹅群成V型飞行,我们曾尝试让飞机也以V字型飞行,从而节省燃料。关于这方面的空气动力学理论非常成熟,我们就花了一年时间让飞机可以被自动控制,然后以V字型飞行。

但一年之后,我们发现我们没有办法让飞机以足够的精度控制飞机从而实现节省燃料。如果重新开始这个项目,我们会意识到我们用小型飞机根本不可能实现那个目标。因为阵风很容易无法让飞机准确地以V字型飞行。

我以前很容易犯的一种错误,就是当我做一个项目时,一步,两步,三步之后,发现第四步根本不可能完成。希望这种错误现在会少很多。上面的那个飞机V字型飞行的例子,我在战略创新组会上也讲过,教训就是尽早的发现项目的风险。

现在,我学会尽量早的发现评估项目的风险。如果我现在说“我们应该尽早找到项目的风险”时,每个人都会赞同,因为这显然是正确的。但问题是,如果你自己面对一个新的项目时,很难把我说的应用到你的项目中去。

究其原因,这些科研项目是一种策略技能。在现行的教育系统中,我们非常善于教授已有的事实,比如食谱。如果你要做意大利番茄牛肉面,你只需要照着食谱做就好了。

但创新或者创造力是一种策略技能,每天你醒来,便会处在从没有经历过的环境中,你需要在你自己所处的独特环境中做决策。据我所知,教授策略技能的唯一途径是通过经历无数的案例。当你已经见过足够的案例后,大脑会内化这些定律和准则,从而更好的做出决策。

通常,我发现做科研的人们要花好多年才能见到足够多的案例,内化这些准则。所以在这里,为创新策略,我一直试验做飞行模拟器。在非常有限的时间内,飞行模拟器可以产生非常多的案例,人们不再需要花五年时间来看足够多的案例。

如果你学驾驶飞机,你需要费很多年,或者几十年才能遇到紧急情况。但在飞行模拟器中,我们可以在很短的时间里展示非常多的紧急情况。这会让你学习的更快。这些就是我们一直试验的东西。

问: 当试验室刚刚建立,你说你之前还没看到团队文化的重要性,但你已经看到它的价值。几个月过去了,你学会到如何建立正确的团队文化了吗?

答:很多机构有关于文化的文件,比如“我们要互助”等等。当你说这句话的时候,每个人都会点头,因为没有人不想帮助团队的其他成员。但当他们回去以后,过了五分钟,他们还会这么做吗?事实上人们很难把抽象和实际联系起来。

在百度,我们做了一件关于文化的事情,我认为这是很不寻常,因为我不知道有别的企业这么做过。我们做了一个小测验,向每个员工描述一个具体的情景,然后问他们,“如果你在这种情况下,你应该怎么做?选A, B, C还是D?”

没有人在第一次就能拿到测验的满分。我觉得通过在测验中让员工把具体的行动用到假设情景中,就是我们尝试帮助员工把抽象的文化和实际联系起来。当你的员工找到你,做了这些事情,你会怎么做呢?

问:你是否可以分享一些对你知识构建很有影响的书呢?

答:对于那些想要创新的人,我有一些书推荐。第一本是《从零到一》(Zero to One),这是一本非常好的书,给出了对创业和创新的概览。我们经常把创业分为B2B, B2C. 对B2B,我推荐《跨越鸿沟》(Crossing the Chasm)。对B2C,《精益创业》(The Lean Startup)是我非常喜欢的一本书。这本书从更窄的范围入手,但给出了具体的快速创新策略。这本书的范围有点窄,但在提及的那些领域,它讲的非常棒。

然后我们进一步把B2C细分,两本我非常喜欢的书是,首先是《与人沟通》(Talking to Humans),这是一本非常简短的书,教会你如何通过和你服务的用户交谈,来为他们设身处地的着想。另外一本是《妙手回春》(Rocket Surgery Made Easy),如果你想做一些重要的,人们关心的产品,这本书会告诉你一些不同的策略(通过用户学习或者是面谈)了解你的用户。

最后,我推荐《创业艰难》(The Hard Thing about Hard Things)。这本书有些深,但它涵盖了关于如何建立企业的方方面面。

对那些想做出职业发展决策的人,So Good They Can’t Ignore You是一本非常有趣的书,它给出了关于如何选择职业发展道路的非常有价值观点。

问:你有那些好的习惯呢?

答:我每天都穿蓝色牛津衬衫,我不知道你是否已经意识到了。[笑]是的,培养好的习惯的能力是你撬动你生命的最大杠之一。

当我和研究人员,或是想创业的人交谈时,我告诉他们如果你不断地阅读论文,每周认真研究六篇论文,坚持两年。然后,你会学到很多东西。这是对你长期发展一个极好的投资。

但这种投资,比如你花整个周六去学习而不是看电视,没有人会赞扬你。而且很可能你在周六所学的东西对你在接下来周一的工作没有什么帮助。我们很少会从这些投资中得到短期回报。但这却是很好的长期投资。确实,要想成为一个伟大的研究者,就要大量阅读。

人们通常用意志力做这些事情,但不起作用,因为意志力会耗尽。我觉得,人们喜欢创造习惯,比如每周都努力的学习工作,这是最重要的。这些人才是最可能成功的。

我有一个习惯,每天早晨花七分钟用手机应用锻炼。我发现更容易每天做同样的事情,因为我只有一个选择。同样的原因,我的衣柜里塞满了蓝色的衬衫。我以前有两种颜色的衬衫,蓝色和紫红色。我觉得我需要做的决定太多了[笑]。所以我现在只穿蓝色衬衫了。

问: 你主张政策制定者要花时间想一下未来,当计算机和机器人削减了大量个人工工作。对这个问题,你有什么解决方案呢?

答:这是个很难回答的问题。计算机擅长做重复性的工作。迄今为止,计算机主要擅长的事情就是把人们每天重复的劳动自动化。

让我们从工作的难易程度来具体的分析。工人们在流水线上工作,每个月都重复同样的动作。现在部分这样的工作已经可以有机器人来实现。中等难度的工作,拿驾驶开车举例子。卡车司机每天都是做同样的事情,所以计算机也试图做这件事。虽然这比大多数人想象的要难很多,但自动驾驶很可能在未来的十几年里成为现实。最后讲的是最有难度的工作,比如放射线学家每天都要分析同样类型的X光射线,同样,计算机可能涉足这些领域。

但是对于那些非重复性的社会工作,我想,在今后很长一段时间内,人类要比计算机更擅长这类工作。很多工作,我们需要每天做不同的事情,见不同的人,计划不同的事情,解决不同的问题。现在,这些事情对于计算机来说还是很难完成。

当美国从农业经济向制造和服务型经济转型,有很多的人转变了所从事的工作,比如,从在农场工作变为制造或在电话客服中心工作。很多的人经历了那种转变,所以他们找到了新的工作,他们的生活还不错,但他们从事的工作大多还是重复性。

我们现在面临的挑战是,如何大规模地教人们从事非重复性的工作。从历史来看,我们的教育系统并不擅长做这种大规模的培训。顶尖高校擅长为相对少的一部分人提供这种培训。但大部分的人最后做的确实重要但重复性很强的工作。这是我们教育系统面临的挑战。

我觉得这个问题可以被解决。这就是我为什么一直想教授创新策略。我们要让很多人能做不重复的工作。这些创新策略,这些创新的飞行模拟器可以实现这个目标。我不是说我们已经知道如何解决这些问题,但我很乐观的相信我们能够解决它。

问: 你曾说过,“总体上来看,在中国的工程师要比在硅谷的工程师工作努力。在硅谷的初创公司的工程师工作非常努力,在成熟的公司,我没有见过像你这种工作强度,无论在初创公司还是在百度。”你为什么这么说呢?

答:其实我也不是很清楚。我觉得在中国的工程师非常出色。在硅谷的工程师也很出色。我认为不同之处在于公司。百度的工程师团队动作非常快。

对中国互联网经济的现状评价很少,我更感觉,所有的假设可以受到挑战,任何事情都可以被随时利用。中国互联网生态非常有活力。每个人都能看到大的机遇,每个人也都能看到大量的竞争。变化无所不在。新的事物出现,很多公司就会在一天之内进入一个全新的商业领域。

举个例子,在美国,如果Facebook说要做一个新的搜索引擎,我们可能会觉得这么做有点怪。为什么Facebook要做搜索引擎呢?这非常困难。但在中国,这种事情却更可信些,因为这么做不仅仅是个假设,还可能会创造一种新的商业模式。

问:这看起来是一种不同的管理文化,因此你可以很快的做重要的决定,从而让这些决定更明智有效,而不是更混乱。百度是以一种独特的方式来运营吗?你觉得这种运营方式对百度的成长有帮助吗?

答:这是一个非常好的问题。我想一下这个问题如何入手。在百度,决策制定可以推行到公司的最底层。百度的员工有很大的自治权,他们显得非常重要。有一件事我很欣赏公司,特别是公司执行高层,就是对世界,对竞争,有着清晰的眼界。

在管理层会议上,我们对公司的说话方式,没有任何的虚张声势。在公司的内部陈述中,他们会说“我们在这件事上做的很好。我们对这些是不是很满意。这些做的不错。这些做的不是很好。这些事情我们应该强调一下。我们仔细分析一下我们犯的错误。”在这里,确实没有什么虚张声势,我想,这让公司有一个不错的环境从事创新以及专注。

问:比起其他的问题,你非常专注语音识别。你现在遇到那些困难,当你解决了这些困难后,会让语音识别的准确率有显著的提高?

答:我们现在在做基于机器学习的语音识别系统。我们正在使用的一些机器学习的技术已经存在几十年了。但正是过去的几年,这些技术才真正开始被使用。

为什么会这样呢?我经常拿建造火箭飞船作比喻。火箭飞船需要很大的发动机和非常多的燃料。发动机必须足够大,燃料必须足够多。如果燃料很多发动机很小,那无法飞离地面。如果发动机很大但燃料很少,飞船可以飞起来,但无法进入轨道。

现在机器学习才真的算得上起步,原因是我们有了建造巨大引擎的工具—大型计算机。燃料就是数据。现在我们终于拥有了所需要的数据。

社会的数字化创造了很多的数据,长期以来,我们已经产生了很多的数据。但就是最近几年我们才有能力建造大引擎来吸收燃料。所以处理语音识别的方法就是想办法建造大引擎,并得到更多的燃料。

举个我们做的一个例子,这个例子有点偏技术。从哪里获取语音识别的数据呢?我们做的其中一件事就是获取音频数据。其他的研究组可能只用几千小时的音频数据,但我们用的是十几万小时的数据。这比你在学术文献里使用的燃料要多很多。

然后我们把人们说话的音频剪切下来,加上背景噪音,听起来像人们在咖啡厅里面的录音。这就是人工合成像在咖啡厅录制的音频。通过把人们的声音和背景音合成,我们得到了更多的数据。我们正是通过类似的方法,把更多的数据放到机器里,填充火箭的发动机。

说到语音识别,有一件事要提一下:大多数人不理解95%和99%的准确度的区别。95%的准确度意味着20个词中有一个是错的。这非常烦人,因为在电话上退回去再去纠正它非常痛苦。

99%意味着一切都变了。99% 说明语音识别系统更可靠。你在任何时候使用它,它都会照常运转。所以这不是四个百分点的改进,这将会是人们几乎不使用跟一直使用的差别。

问: 你觉得现在达到99%准确率的困难是什么呢?

答:我们需要更大的火箭引擎和更多的燃料。现在这两方面都很有限,而且这两方面要同时增长。我们正在为推动这些方面的发展而努力。

------------------

欢迎大家报名翻译,转载请注明出处。

关注如下我的微信公众号“董老师在硅谷”,关注硅谷趋势,一起学习成长。

如何快速在一个陌生领域达到优秀水平?

2016-04-30 TalentGuide

优秀是投入20%精力得到80分;

顶尖是投入80%的精力去打磨那超越众人的20分。

来源:咪喵

ID:mimiao_mao

授权 TalentGuide 发布

许多事情无需做到顶尖,做到优秀已经足够。
下厨做菜,不用做到五星级饭店主厨水平,不用将洋葱切成0.1cm见方的均匀小块,只需会做几个拿手菜,可为心爱之人下厨,可招呼三五知己来家吃饭,已足够应付日常生活,若还会做几样甜点糖水,更是加分项。
做PPT,无需专业设计功底,能做到配色和谐、风格统一、排版整齐、图表清晰,已足够秒杀90%混乱驳杂、惨不忍睹的PPT。
日常服饰搭配,不必有时尚总监的品味,不必紧追每季潮流细节,能在各种场合着装都妥帖恰当,已足够让人心生敬意。

优秀和顶尖的区别,可以用80/20法则来解释:优秀是投入20%精力得到80分,顶尖是投入80%的精力去打磨那超越众人的20分。高手相争,看似只在毫厘之间,其实如果按边际效应计算,为获得那毫厘之差所投入的努力又何止数倍。

这篇文章不讨论如何做到顶尖,通往顶尖的路是没有捷径的,要靠天赋和时间堆积出来的。通向优秀的路则不同,短时间内有限的投入就能带来可见的有效产出。这篇文章只讨论如何才能快速在一个陌生领域到达优秀水平。

1
大量搜集资料

如果你在做一个紧急的任务,这个任务涉及的领域你很陌生。最快速上手一个新领域的方式,就是先穷尽你能找到的所有资料
如果你需要出一份专题报告,先搜罗这个专题的所有相关论文和书籍。你不一定需要把所有的付费资料都买回来,很多时候只需浏览目录,看看别人都是从哪些角度切入这个题目,再通过目录标题搜索相关的资料,并且顺藤摸瓜找到更多资料里提及的其他资料来源,已可找到足够丰富的素材。
如果你要装修房子,先大量浏览别人家的装修效果图,找到自己喜欢的风格;收集各种与自己家类似的户型图,看看别人如何利用空间;再看看别人的装修日记,看看装修都有哪些常见的坑。一番研究下来,不出三个月,你也能成为一个小小的行家。

2
寻找现成的最优解

许多人上手新东西的方法是自己先瞎捣鼓一通。当然这没什么不对,只是效率不太高。
比如你想学做一锅白粥,当然可以凭自己喜好随便扔点米和水进锅里,凭感觉爱煮多久煮多久,等烧成锅巴后再研究为什么这次煮得不成功。这符合人类长久以来进化的习惯——在实践中总结经验。
事实上,99%的情况,这个对你而言全新的领域,对别人而言早已是玩剩下的。完全没有必要自己重新实验一番再总结经验,你可以直接套用别人经验总结出来的最佳方案。


你可以在做白粥之前先研究各路大师总结的做粥秘诀,知道米和水的最佳比例是1:10,最适合做白粥的米是圆粒的珍珠米,熬一锅好粥的关键是熬透米心,为了熬透米心你需要提前一晚浸泡大米,在煮粥前用一勺油将米裹上,然后烧一壶滚烫的开水缓慢地冲入米中,这样裹在米周围的油就会将热量吸在米周围,慢火熬了两小时,最后半小时要用勺子不停搅拌,帮助米心融化。

于是,你虽然是第一次下厨熬粥,却能令人惊叹地熬出比做了一辈子饭的妈妈熬的更香更浓见米不见粒的标准粤式好粥。

有人说什么都用别人的最优方案岂不是特别没意思,我这人就喜欢不参考别人的自己创新。连牛顿这样的神级人物都要“站在巨人的肩上”,李白这样的诗仙都会借鉴《黄鹤楼》写“凤凰台上凤凰游”,我们又有什么不能借鉴别人的呢?

创新从来不是从石头里面蹦出来的,参考过现实中所有最佳方案仍感到不满意,在理解原方案的基础上创造出更好的东西,才算真正的创新。如果所谓的原创只是在低水平徘徊,那不叫创新,只能算自娱自乐。

3
依样画葫芦的练习

在你搜罗了大量的资料和最佳实践的案例后,就要开始练习之路了。足够量的练习是达到优秀的必经之路。
练习之初,不要急着发挥你的创造性,请一板一眼,完完全全按照你收集到的最佳方案进行练习。学烘焙,就完完全全按照方子的分量和步骤做;学画画,就完完全全按着样稿一笔一笔地画;学画原型,就完完全全地按照范例一步步地设置。
不要笑,太多人在这一步跌倒,以至于一辈子无缘优秀。老人家常笑孩子“还没学走,先想学跑”,看似浅显的道理许多人却从未明白,总是觉得自己特别聪明,幻想着能一步登天。

如果你真的很扎实地做了前两步功课,就该相信你学习的对象已是目前能找到的最佳方案,人家这么做一定有他的道理,即使你并不懂那道理是什么。只有一板一眼地依样画葫芦,成品出来不如人意时,你才能回溯出自己到底哪儿做的不够好。如果中途发挥各种创意做了稀奇古怪的改动,就很难找到成品不满意的原因了。
觉得自己特别聪明,不需要这样沉闷无聊的练习?弗罗基俄为何让达芬奇画了三年鸡蛋?自己的悟性能否超过这位文艺复兴时代的天才,请再思。

4
修正与总结

大量练习的过程中,如果你自问已经完全按照最佳方案实践,却始终无法达到满意的效果,就要多问几个为什么了。问的方式可以是搜索、找该领域的牛人,或者到相关的领域的论坛跟别人讨论。相信我,你不会是唯一一个遇到问题的,你踩过的坑,前人多半已踩了无数回。

列出练习中发现的问题,认真地研究每一个产生问题的可能性。这是提升水平的关键时期,只有你真正掌握了每一条迈过这些坑的方法,水平才会有质的提升,否则不管投入多少时间练习,都只能在低水平徘徊。

我曾经因为自己做的戚风蛋糕达不到理想的状态,搜罗了网上所有的戚风蛋糕失败原因,买了n本大师级的书看里面的教程,换模具换打蛋器换鸡蛋,每晚做一个戚风蛋糕,测试各种温度、各种转速的打发、各种混拌手势、各式各样的戚风蛋糕配方,终于达到了做戚风蛋糕信手拈来的程度。

在那之后,我的烘焙水平忽然突飞猛进,以前搞不定的各种高难度糕点如马卡龙、意式蛋白霜都变得很轻松。朋友们在烘焙上遇到问题来问我,我竟然每次也能将原因猜得八九不离十。虽然离真正的烘焙大师还十万八千里,可至少达到了“超过周围大部分人平均水平”的程度。

许多人做几次做不好,就将原因归结为“自己根本就不是这块料”。不客气地说一句,大部分时候,水平之低还够不着谈“是不是这块料”的程度,因为根本还没入门呢。

5
结语

所谓的实践出真知,没有理论的实践是瞎忙,没有实践的理论是纸上谈兵,只有学习了理论,用实践验证理论,再用实践修正理论,才会实现真正的“从量变到质变”。

如果足够专注与投入,用了合适的方法,用三个月甚至更短的时间,在一个领域做到比周围大部分人优秀是可能的。更有意思的是,随着这四步变成了习惯,接触一个陌生领域并迅速达到优秀水平的时间会越来越短。

老子说“一法通,万法通”,当获悉了一个领域的奥秘后,其他领域的奥秘之门也会变得轻轻一推就开,哪怕这些领域表面看起来似乎毫无关联。

一站式青年人才职业成长平台

有哪些优秀程序员知道而新手不知道的秘诀?

原载:伯乐在线

Jens Rantil 的观点:2.9k 顶

大多数情况下,使用继承从长远看来是一个很糟糕的面向对象设计。它影响了代码的重用性和可测试性。推荐使用组件和接口的方式替代它。

避免过早引入接口,除非你能够完全控制它。“过早接口”同样会导致设计问题。

深度代码嵌套(both intra-function and inter-function) 1 ) 难于维护 2 )更容易产生bug 3 ) 难于复用。精炼的代码层次划分更利于以后的代码测试和代码复用。参照上一条关于继承的问题。

预估时间在开发中是一件很难的事情。这就是为什么在很多地方使用敏捷开发(Scrum)和 Sprints 。参见:《为什么程序员总是不能准确估测项目时间?》、《趣文:为什么软件开发周期通常是预期的两三倍?

完美的加密是很难做到的。除非有一个很好的理由,否则不要尝试自己去发明它。

无副作用逻辑(Side-effect free logic)是非常棒的,这使了解程序状态更简单(参看下一条),同时也简化了自动化测试。

学习去了解程序的状态切换和生命周期。参看 Jens Rantil 的博客

如果选则合适的实现方式,并发并不难。线程池、队列、观察者模式、非可变性和Actor模型编程可以帮你很多。

过早优化是万恶之源。一个好的开发过程一般是: 1 ) 让它工作。 2 ) 使代码很漂亮。 3 ) 优化。

了解程序的基本数据结构和理解时间复杂度。这是一个有效使代码变得更快在的方法,且不会增加代码复杂度。

练习粗略计算。一段代码通常在内存中占用多少?相关;

应用程序早晚会出问题;不好的部署,意想不到的行为,意想不到的输入或意想不到的外部加载。为了应对这些问题。我们需要确保用日志记录下那些未捕获的异常,在部署工作完成后进行测试(并可能回滚),并不停地运行测试,也要确保为所有内存中的队列和线程池设置限制(理智的)。相关;

如果你监控队列大小的时候,发现它通常总是满的或空的。应对好这些。

网络服务和外部服务应该一直保持片状(易剥离的,即插即播)。为每一个套接字(Socket)设置超时,在每次HTTP读或者连接操作时都设置超时。建议可以将外部网络封装到一个重试/循环断路库中。(参考 Netflix/Hystrix 和 rholder/guava-retrying)

写出你自己都愿意读的代码。增加注释,除非你认为还能在一年后看懂它。在一个月后你会需要这些注释的。有些相关;

为项目设置构建工具,这样别人可以更快开始工作。在你的README文件中记录下要构建、运行、测试和打包的命令。

确保你的项目可以从命令行构建,会使事情变的容易得多。

在许多语言中,处理第三方依赖关系是一个真正混乱的事情(看看你的Java和Python工程)。特别是当两个不同的库依赖于不同版本。使你远离这些麻烦的好方法: 1 ) 不断审视你的依赖库。 2 ) 自动化测试有助于解决此类问题。 3 ) 总是关注你应该使用哪个版本的第三方依赖库。

阅读流行的开源项目,是学习编写可维护代码和软件开发流程的好方法。

为应用添加的每一行代码都会增加项目的复杂性,同时使它发生错误的可能性更高。删除代码是一个消除错误的好方式。相关;

应用中的每一个基础服务(数据库、缓存、消息队列等)都是一个bug的来源,需要对它们进行维护,同时也需要学习新知识。更不用说,这种依赖性可能会降低你的生产力。仔细衡量新基础设施的效率。你还需要用一个新的基础设施取代一个旧的吗?

代码路径导致的失败,很少在测试或执行中出现。但往往这就是bug的原因。

输入验证不仅仅是出于安全原因的,它能帮助你尽早发现bug。

和上一条有一些关系:有些相关状态验证和输出验证可以作为输入验证同样有用,无论是为了发现内在的bug,还是为了安全性。

代码评审(code review)是一个用来提高程序员的好方法。你会得到关于你代码的批评,同时你将学会描述为什么其他人的代码的好坏。它还引导你发现常见的错误。

学习一门新编程语言是一种很好的方式,以了解新的范式和旧的习惯问题。

总是指定编码转换文本与字节;当读/写网络、文件或加密时。如果你依赖于语言环境的字符集最终你一定会遇到数据损坏。如果你可以自己选择,请使用UTF字符。

了解你的工具,包括编辑器、终端、版本控制系统(如git)和编译工具。

学会在使用你的开发工具时不用鼠标。学习尽可能多的键盘快捷键。它会让你更高效而且这更符合人体工学。

重用代码不是一个最终的目标,也不会使你的代码更易于维护。重用复杂的代码,但请注意,两个域之间的代码重用可能使它们产生过度的依赖。

长时间坐在电脑会伤害你的身体。 1 ) 了解你的身体状况。看看你的背、脖子和手腕。当你身体感到不适的时候休息一会。养成一个暂停的习惯(泡茶,拿咖啡)对你的身心会有意想不到的益处。 2 ) 时不时的远离屏幕来休息一下你的眼睛。 3 ) 选一个适合你手腕的好的键盘。

自动化测试,特别是单元测试,不仅仅是测试您的代码。它们还: 1 ) 告诉大家代码的使用范围; 2 ) 还能帮助你提前的适应生产环境。后者是为什么一些人声称测试优先的开发方法可以产生干净的API。

适度的测试。因为缺少测试会导致bug,而查找bug会降低你的开发速度。过度的测试也会降低你的速度,因为每个改变都需要更新太多的测试。

和编译语言相比,动态语言通常需要更多的测试工作来保证它的正常工作。(离线代码分析工具也很有用。)

竞态比普遍认为的更常见。这是因为计算机通常比我们习惯于TPS。

理解吞吐量和延迟之间的关系在优化您的系统时非常有用。相关;

很多时候高吞吐量可以通过引入智能匹配的方式来完成。

保持你提交的代码简短、可用,提交代码的时候写下你做了什么的日志,告诉大家你为什么做这些。有效的提交信息是解决bug的先决条件。

保持你的本地分支尽可能的新。我的经验是:失败发生的风险和你本地版本保持的时间成正比。不要在一个分支上工作超过两周时间。那些比较大的特性,我们可以将它分为多个小的特性并分多次提交它。

尽早的了解你的产品运行环境,并根据环境对部署策略进行调整。

令人惊讶的是,频繁的发布代码会降低风险,而不是增加。

学习面向对象的语言是很容易的。掌握良好的面向对象设计是困难的。了解面向对象设计和面向对象的设计模式将改善你的面相对象设计的理解。

好的架构师很可能会写出很糟糕的代码。然而,一个优秀的架构师知道如果保证系统是解耦的,可更替的。首先要保证这是一个理智的分离的架构。其余的问题可以在时间不紧的时候进行清理。

巴士系数也是你团队中的一个严重风险。(一个项目至少失去若干关键成员的参与(被巴士撞了,比喻)即导致项目陷入混乱、瘫痪而无法存续时,这些成员的数量即为巴士系数。)作为团队的一员,大多数你写的代码需要被别人读或者修改。这包括你早些时期在项目中写的代码。在一开始你就应该写好文档和提交信息。此外,代码评审和脚本也可以帮助你分享一些知识。最后,确定你不是唯一一个知道密码的人。等等

 

Jeff Darcy 的观点,4.6k 顶

了解概念

通过记忆和模式识别来解决问题要比单纯的寻找问题的原因快的多。如果你曾经解决了一个类似的问题,那么你很可能直观的想起解决方案。就算做不到这一点,至少过去保留的经历会让你更容易的找到解决问题的灵感。“自动化”的解决一个问题看起来很像魔术,但是这就是 Miguel Paraz 建议的“练习 练习 再练习”的真实效果。

了解你的工具

这是一个在编程时维持而不是终止连续性的方法。每当你不得不考虑如何去学习编辑器、版本控制系统、调试器,这将打断你的深度思考。这些“小插曲”虽 小,但是它们加起来就不小了。比起什么也不做,那些愿意花时间学习工具、练习使用工具、用自动化工具的人的生产力会得到几倍的提高。

做好时间管理

使自己再次进入工作状态。你想写代码,写代码。你想回顾一些修改补丁,回顾一些修改补丁。如果想头脑风暴新的算法……你懂得,不要试图将这些事情一 起做完,一定不要让自己被电子邮件、IRC、Twitter和Quora打断。让你的大脑专注于一件事,在做完这件事情之后再转向做其他的事情。

安排好处理事情的顺序

我发现这方面很多人做的很失败。每一个问题都可以从不同的方面来对待。通常,解决一个问题的一方面会比其他方面容易很多。因此,正确的顺序尤为重要。恐怕没人能说出如何排序的标准答案,但是当你在当前领域经验越来越丰富的时候,再去实践,你的经验会给你很多启发。

重用所有你能重用的

重用的想法。重用代码。每次你把一个新问题变成一个你已经知道如何解决问题,计算充满这样的机会——你可以节省时间。不要担心如果转换后的解决方案并不是绝对完美的当前问题。你可以完善之后,如果你真的需要,通常你会发现,你最好继续下一个问题。

这些事情真的会降低你的效率。随着你每天遇到更多的问题,你将获得更多的经验,这会让你能更快的解决更多的问题,这样一直下去。这是一个循环,一旦你能够正确的对待这些事情时,你的效率和价值将会得到大幅度的提升。