宠文网

奔跑吧,程序员

宠文网 > 科普学习 > 奔跑吧,程序员

12.2 学习的技巧

书籍名:《奔跑吧,程序员》    作者:叶夫根尼.布里克曼
    《奔跑吧,程序员》章节:12.2 学习的技巧,宠文网网友提供全文无弹窗免费在线阅读。!



现在把关注点放到三种最常见的学习技巧上,这些技巧都是最出色的软件开发者和软件公司所使用的,它们分别是:

·  研究;

·  实现;

·  分享。



12.2.1  研究


根据《人件》一书的说法,一般的软件开发者连一本关于他工作主题的书都没有。作为一名程序员和作者,我发现这种情况是很让人害怕的。但是在某种意义上,这也意味着存在大量的机会。如果你是程序员,你可以定期花时间去阅读和研究,走在你的同事之前。

·  阅读文章、博客和图书。(阅读本书就是一个好的开始!)

·  阅读学术论文。paperswelove是一个非常好的计算机科学学术论文知识库。

·  参加课程。Coursera和Khan学院都提供了许多免费、线上课程,涵盖了各种各样的主题,包括编程和创业。

·  参加演讲、聚会小组或者会议。请访问Meetup网站和Lanyrd网站。

·  阅读代码,特别是开源项目的代码。The  Architecture  of  Open  Source  Applications提供了许多流行项目代码的指导讲解,包括Berkley  DB、Eclipse、Git和nginx。

我已经发现了三种让我的研究时间变得更有效率的方法。第一,设立具体的、可测量的目标。例如,我为2015年设定的目标是阅读30本书(我用Goodreads来记录我的进度)。差不多每两周就要读一本书以上,所以如果两周过去了,还没有读完一本书,我就知道自己落后了。我还有一个目标,就是每年至少学一种主要的新技术,比如一种新的编程语言或数据库,我发现“七周七种”系列图书,比如《七周七语言》《七周七数据库》和《七周七并发模型》,都是实现这一目标很好的方法,因为这些书会向你介绍各种各样的技术,还会重点强调不同的编程范式,比如Ruby中的面向对象编程和Prolog中的声明式编程的对比,或者用MongoDB实现面向文档存储和HBase实现面向列的存储对比。

第二,记笔记。举例来说,我会对读过的每一本书进行总结,并把喜欢的文字保存在Goodreads。我会简单记下一些新的点子、问题,以及在阅读点子日记过程中产生的想法(阅读2.1.3节了解更多信息)。偶尔,我会把这些新想法发表到博客上。但是即便我把这些想法写在纸上立即丢掉,记笔记这样一个动作也可让我的学习成为更加主动的过程,帮助我更好地记住和理解这些新点子。

最后,也就是第三点,是要让你的朋友和同事也一起参与到学习过程中。在LinkedIn,我们成立了一个阅读小组,每几周就阅读一篇新的计算机科学论文,然后聚在一起讨论。在开始使用Scala的时候,我们也成立了一个学习小组,人员就是在Coursera上参加了“用Scala进行函数式编程”课程的那些人。有了别人的推动、可以在一起讨论问题和想法,你就更能坚持做一件事。

事实上,公开的承诺也是确保自己学习进度不落后的好方法。当我正挣扎着让自己写作的时候,我和几个同事参加了一个30天的博客健身挑战赛,我们每个人都必须每天写一篇博客,持续一个月。当不懂技术的朋友问我比特币的工作原理是什么的时候,我意识到我无法不用很多编程术语向他解释清楚,我就答应他写一篇博客,用一种技术受众和非技术受众都可以理解的方式解释清楚。当我在LinkedIn团队努力用Scala实现流处理的时候,我允诺要学会这种技术并用博客写下来。

在所有人面前努力展现我的写作技能、在比特币的论文中深挖各种数学原理、和晦涩的函数式编程原理概念做斗争,这种过程不总是那么有趣,但会给你带来巨大的回报。在30天的博客健身挑战赛之后,我成了更出色的作者,博客的流量也增长了10倍。在写了关于比特币的博客之后,我与非技术受众讨论技术话题的能力也得到了提升,我的文章也被放到了Hacker  News的首页,又进一步增加了博客的流量。在写了关于流处理的文章之后,我的博客再次上了Hacker  News的首页,Play  and  Scala社区看到我的反馈并改进了其中的一些API,我也学到了足够多的函数式流处理的知识,启动了一个帮助降低LinkedIn主页加载时间的项目。



12.2.2  实现


小时候的我讨厌读书,父母千方百计要让我读书,甚至每读完一本书就会给我几块钱,但我还是一如既往地更喜欢电视、视频游戏、和朋友闲逛,就是除了读书以外的每样东西都喜欢。最终让我开始读书的原因是我变成了一个需要读书的人。这是什么样的人呢?

这是创造者。

只要你想创造某种东西,你会发现你不知道自己在做什么,会发现自己的知识存在巨大缺口,会意识到你缺少一些关键的技能。最终,解决的方法会变得显而易见,那就是读书。你会渐渐理解,读书可以给你带来强大的力量。在一本书上花几个小时,读完之后,你就能够做一些新的事情、产生新的想法、看见新的世界。

但是在你开始做东西之前,大部分所学之物,无论源于书本还是源于学校,很大程度上会让你感觉一无是处。这就是为什么我们经常会听到孩子们抱怨“我将来什么时候会用到微积分呢”或者“学习古代史有什么意义”。他们说的也是对的。当你的生活只有电视、视频游戏以及和朋友闲逛的时候,真的不需要什么微积分和古代史。只有在你需要做一些东西的时候,这些技能才会变得有用,对我来说等到毕业之后才真的遇到这样的情形。当然,我也做过许多项目,还有课堂上布置的家庭作业,但是它们都是属于“把要点联系起来”的东西。是别人在决定我做什么、我可以使用什么工具、起始点在哪里、结束点在哪里,我所需要做的只是从一个地方走到另一个地方。这样的日子一结束,我会把项目抛之脑后,再不去看它一眼,什么都与我无关,所以学不到什么也是没有关系的。

工作之后,我就必须挑选自己的项目了,必须找出什么重要什么不重要,必须选择我要使用的工具,必须定出自己的时间和日程安排,也必须对项目维护若干年。我开始了专业编程,但意识到我并不真正了解如何做软件;我开了一个博客,但意识到我并不真正了解如何去写;我开始想要保持身材,但意识到我并不真正了解如何锻炼。我开始尝试自己做一些东西,才意识到我需要帮助。

所以当我开始定期读书之后,就再也停不下来了。如果你在激励自己读书方面还有困难,最好就是找一个其中有些地方不知道如何实现的项目,去实现它,就不用操心读书的事了。

根据刻意练习的精神,我们要找一些能够扩展自己能力的项目。如果你不知道如何做网站,就为自己建一个主页或博客;如果你从未用过Ruby,就用Ruby  on  Rails去做自己的主页;如果你从来没有实现过倒排索引,就可以从头开始为你的主页做一个搜索功能(阅读5.3.4节,出于学习的目的重新发明轮子也没有问题)。按照网上的趋势,你可以给自己找一些学习新库、新语言和新技术的理由。你可以在工作中引入新的挑战,从而实现这一目标。如果公司支持的话,你可以把黑客马拉松和20%时间作为实现和学习一些新东西的机会(阅读9.5.1节了解更多信息)。

如果你在工作中没有机会这样做,就必须在自己的空闲时间去做。最好的工程师通常会有几个业余的项目,是他们在深夜或者周末捣鼓出来的。还有一种极好的学习方法,可以为自己的简历增加许多亮点,那就是为开源项目做贡献、解决编程挑战、参加编程竞赛。



12.2.3  分享


学习的最后一个阶段是分享。想要弄清楚原因何在,先进行一个思想实验。我会问你两个问题,往下读之前先花一分钟时间考虑一下答案。

·  谁是世界上最出色的软件工程师?

·  哪个公司是世界上最出色的软件公司?

你能想出一大串名字吗?如果是的话,这份清单最好玩的地方就是它太短了。世界上有成千上万的软件工程师和软件公司正在做着不可思议的东西。但是当我问你谁是最出色的,只有几个名字会浮现在你的脑海中。为什么是这些名字而不是其他名字呢?这是因为这些工程师和公司不仅做出了出色的作品,还花时间告诉你他们做出了这样的作品。我敢打赌对于你列表上的每一名程序员和每一个公司,你都已经读过他们的作品(例如博客、论文、图书),看过他们的展示(例如演讲、会议、聚会),或者使用过他们的代码(例如开源项目)。

最出色的公司和程序员都喜欢分享他们所做的几乎一切东西。例如,Linus  Torvalds创造了Linux(最流行的服务器操作系统)和Git(最流行的版本控制系统),这两个产品都以免费、开源项目的形式发布。Google发表的论文免费发布了其实现的强大搜索索引核心基础架构技术的两个实现细节,即MapReduce和Google  File  System,后来均以免费、开源项目的形式实现(Hadoop和Hadoop文件系统)。Facebook启动了开放计算项目,也免费发布了实现高效率和可扩展数据中心的细节。还有完全基于开源而建立的公司,发布几乎一切东西,比如Mozilla、Red  Hat和Typesafe。问题是,它们为什么要这么做?

1.  为什么应该分享

为什么软件开发者和软件公司会发布如此多的成果?为什么它们要投入成千上万个小时和数百万美元到一个项目中,然后又免费发布出来?原因就是,分享所得到的东西要超过你所投入的,涵盖了专业性、质量、劳动力、市场推广和所有权这几个方面。

专业性

最好的学习方法就是教。向别人解释一个话题,你自己就必须更深入地去理解它。每次我准备演讲、准备写博客或者像现在这样,写一本书的时候,我都会去了解比最初掌握的还要多的知识。花时间去分享知识是提升水平的一种最简单也是最有效率的方式。事实上,具有“资深”标记的工程师都是那些使周围的人更加出色的人,要达到这一目的唯一的方法就是教。

质量

你的家什么时候最干净?是在客人到来之前。你和别人分享任何东西也是同样的道理。将代码开源最意想不到的好处之一就是,这一行为通常都可以让你得到更高质量的代码,因为你知道“客人”将会看到它。你可能会花时间去整理代码、添加测试、编写文档,通常都会让项目更好地展示在世人面前。如果你写博客或者做有关工作的演讲,道理也是一样的,分享项目的行为可以将项目变得更加出色。

劳动力

每当有人使用你的开源代码并登记一个bug的时候,他们都是在进行免费的质量评价;每当有人为你的开源项目提交补丁,他们都是在为你开发软件;每当有人撰写关于你的开源项目的博客,他们都是在为你免费编写文档。如果这篇博客是严厉的负面评论,好吧,即便如此他们也是在给你进行免费设计评审。和别人分享成果可以让整个软件社区为你的东西做贡献,与你自己一个人做(特别是作为小型创业公司)相比,项目的规模可能更大、质量也能更高。

市场推广

如果你是开发人员,让自己在雇主面前表现出色的最好方法就是分享你的成果。把这种方法想作是对你职业的集客营销(阅读4.2.2节了解更多信息)。你并不是盲目地把信息用垃圾邮件发给全世界(例如通过求职信),希望引起别人的注意,而是通过有价值的内容去吸引雇主。如果公司中的开发者阅读了你的博客或观看了你的演讲,他们就会把你视作专家,想把你招进来。你所分析的东西也会成为简历中永恒的部分,事实上,甚至还会更好——就像jQuery之父John  Resig所说的:“在招聘的时候,无论怎样我都会看看应聘者的GitHub提交日志。”

如果你是雇主,也会起到另外的作用。让你自己在开发者面前表现出色的最好方法也是分享你们的成果。如果开发人员多年来一直在使用你们公司的开源代码,他们更有可能想要加入你们公司继续使用这些代码。一个开源项目是比任何招聘公告都更好的工作广告。

所有权

作为开发人员,如果要把几千个小时的努力投入到一个项目中,我就很容易迷恋上它。它如同我的宝贝孩子,如果这是具有所有权的项目,离开公司对我来说就有点像离婚并失去孩子的监护权。这是很痛苦的,你经历几次之后,就很难再有如此的热情投入到并不真正属于你的东西上。然而,如果你能够在演讲中谈论你的成果、发布博客和论文,最好的情况是开源你的项目,那么它就是属于你的,一辈子都是。它会成为你百宝袋中无法丢弃的珍宝,它会随着你去任何地方,你可以向别人展示,你会自豪于在它身上的付出。

分享文化是软件行业之所以如此成功的原因之一。和华尔街做个比较,那是竞争者连现在是几点都不会告诉你的地方,但科技行业可以说极其开放。当所有人都在分享时,所有人就都是胜利者,借用牛顿的话说就是,“在分享文化中,我们可以看得更远,是因为我们站在巨人的肩膀上”。

现在大家清楚了为什么应该进行分享,那么来讨论一下应该分享什么(以及不应该分享什么)。

2.  应该分享什么以及不应该分享什么

目前有这三种常见的反对分享成果的意见,分别是:

(1)我没有时间;

(2)没人会看我的成果;

(3)每个人都会偷走我的成果。

对于第一个问题“缺少时间”,我们之前已经讨论过了。如果想获得成功,你就要留出进行分享活动的时间,比如写作、演讲和为开源项目做贡献。第二个问题“没人会看你的成果”,即便真是这样也不是问题。写作、演讲和开源的首要目的是作为你学习的手段。写作就像在纸上思考,写博客的主要目标就是提升自己的思考能力,所以即便没人阅读也是值得去做的。演讲和写作非常类似,都是把你的想法进行集中展示并向别人清晰地表达出来,可以帮助你理清自己的想法。将代码开源,则可以让项目变得更加出色。

也就是说,如果你练习写作、演讲和编程,受众的增长方式会让你惊讶不已。先是从你的朋友和同事开始,慢慢地,特别是如果你在Twitter、Facebook、LinkedIn、Reddit和Hacker  News这样的网站上分享你的东西,陌生人也会发现它,再进行分享,有时还会给你感谢或者反馈。此外,在互联网上,没有人可以和你见面,所以你的身份标识就是写作、研究和开源。当我在Google上搜索你的名字时,出现的结果就表明了你是谁。所以在现代社会,你所分享的东西就代表了你这个人。如果你担心没有人对你说什么感兴趣,只要记住每一个人都处于他们学习的不同阶段即可。

你会惊讶于有多少你认为理所当然的“普通知识”实际上对其他聪明人也是全新的。这只不过是因为世界上有太多要了解的知识,我们都在不断学习(我希望如此)。通常,当我觉得自己写的东西已经被别人深入讨论过了,我就会觉得气馁。这时我必须提醒自己,现在就是学习东西的“正确时间”,每个人的情况都是不一样的……不管你正处在接受教育的什么阶段,一些人都会有兴趣倾听你的奋斗过程。当你写博客的时候,一定要记住这重要的一点:你的每一个受众都在不同阶段,他们某些方面走到了你的前面,但也在其他某些方面落后于你。写博客的关键就是我们都同意分享自己所处的位置,不会取笑那些看似落在我们后面的人,因为他们也许知道其他一些我们多年都没有真正理解、甚至根本不知道的东西。

——Steve  Yegge,Amazon、Google软件工程师

第三个问题“竞争者可能会偷取你的成果”,只有在该成果会给竞争者带来优势时才是需要我们担心的。换句话说,不要分享你的“秘密武器”。例如,Google的搜索排名算法是它最大的竞争优势,所以可能永远都不会公开精确的公式。但是对于其他所有人,特别是一般的基础架构项目,公开并让社区参与进来所得到的好处要多于把它们隐藏起来所带来的好处。这就是为什么Google要发表类似MapReduce和BigTable这样的技术论文、为什么要把许多复杂的基础架构项目(比如Android、Go和V8)作为开源项目进行开发。