前端工程师是怎样一种职业

2016-03-20 吕大豹 前端开发

来自:医小生与程序猿(微信号:doctor_programmer)

链接:http://www.cnblogs.com/lvdabao/p/5229640.html

前端工程师已经是大家不再陌生的一个软件行业的工种了,尽管这一工种诞生也没几年。作为一名从业三年的前端工程师,我尝试结合业界标准与我的理解,来尽可能诠释一下前端工程师这个职业。这篇文章的适读人群为:非web方向的软件开发者、产品经理以及与产品挂钩的相关人士、正在纠结需不需要招聘一个前端的老板们、刚刚走上工作岗位的前端新手们、以及所有对前端感兴趣的父老乡亲们。

前端工程师的英文名为front-end engineer,简称FE,下文将用FE来代称。国内最早开始招聘FE应该是2011年左右的事情吧,在此之前,FE的工作基本都是由服务端工程师包办的,或者是由设计师来产出HTML页面。那么,是什么样的原因催生出了FE这一职位呢?本文将从FE的工作内容、专业FE应具备的技能和品质来聊聊这个职业。

用户体验的操刀者

前端工程师的首要工作就是开发用户界面,在web系统中,就是指网页了。为什么网页需要专门的FE来写呢?答案就是「用户体验」。随着web2.0概念的普及以及web3.0的提出,用户成为互联网的主要生产者,网页所承载的功能越来越多。

一方面,企业的「用户体验」诉求很强烈。这个很容易就能理解,如果你的产品看上去就像个钓鱼网站而且还特别难用,就会有一部分用户离你而去。非互联网企业呢?也会面临这样的情况,你花了很大的功夫优化数据库,优化服务器负载,你的客户却很难感知到你的努力。你的系统界面还是八九十年代的风格,客户的第一感觉就是这系统不行,不买你的帐。相反,如果你花一点时间做一套崭新风格的界面出来,客户的第一感觉就是这个系统好炫酷,技术含量很高。不要小看这个第一感觉,对于外行人来说,第一感觉往往起到了决定作用。好多企业都意识到了这一点,所以对用户体验的诉求就上去了。

另一方面,现在的用户也都很挑剔。毕竟他们使用的产品一个比一个炫,都被惯坏了,你的产品稍有点不爽的地方,就上微博去给你宣传。

前端工程师是用户体验的把控者,在产品经理构想出交互原型,设计师设计出交互细节后,FE就用他的双手一行行敲出这些代码。他敲出的每一个按钮,每一张图片,都被成千上万的用户点击着,FE与用户可以说是“零距离接触”。作为产品交互的实现者,除了HTML、CSS这两门语言要精通外,对前端要求更高的其实是非技术因素。

FE需要对用户体验有较深的理解。比如页面上有一个超链接,字体比较小的情况下,用户可能会一下点不中,因为链接的可点击区域是紧贴着文字边缘的。前端可以通过很简单的方法来扩大这个链接的可点击区域,使得用户更容易点中。这就是用户体验,正如《瞬间之美》中提到的那样,touch到用户的内心只需要一瞬间。对用户体验的理解,还体现在对一些交互常识的把握上。比如用户操作某个软件的界面,会感觉它很灵巧,却具体说不出到底是哪里。那么很可能是这个界面上的按钮有着设计良好的四态(正常、鼠标移上、鼠标按下、不可用),它会随时对你的操作给出反馈。

懂用户体验的前端工程师,会让他的作品与用户沟通,能够touch到用户心中那一块柔软的区域。

FE需要有一点强迫症。这体现在对任何瑕疵的不容忍。比如采用技术手段让页面的滚动更平滑些,减少页面的视觉抖动,像素级别的定位校准。当用户触碰的内容是一串非电话号码的数字时,不要让手机自动调出拨号功能,等等。很多细节是产品经理无法感知的,因为这些都是很零散的技术手段,只有靠FE来点滴积累。再有极致者,追求让页面的响应时间再减少几个毫秒,让你的手机少耗几KB流量,少耗一些电量。这些甚至连用户都无法感知,但是当你的用户有百万级别或者千万级别,这样做的价值就显现出来了。

前端工程师需要是一个心思细腻之人,需要对美有所领悟,需要执着地追求完美,需要有品味,有思想,有大局观,最好还能懂点心理学。

用户端业务逻辑

做出优雅的界面只是前端工程师的第一步,编程也是必备技能,FE承担着处理用户端业务逻辑的任务。放在以前,用户端就是个IE浏览器,没有什么业务逻辑可言。但现在不同了,用户使用浏览器发表文章、进行社交活动,更复杂的能使用在线工具完成工作。

javascript就是FE需要掌握的编程语言,他应该通晓这门语言的优势和缺点,掌握各种编程思想、开发模式。利用各种技巧实现交互越来越丰富的界面,同时还要与服务端的工程师沟通,调试接口,完成:页面展示——响应用户操作——提交用户数据——反馈操作结果这一系列流程。

从这一点上,要求前端工程师要有软件开发的基础,了解计算机的基本原理,网络通信的基本原理,所以计算机相关专业出身的前端会更有优势一些。

前端也需要架构

写写网页也要架构?有什么好架的?回答这个问题首先得明确一点,FE的工作内容已不再是「写写页面」这么简单。随着前端代码的规模越来越大,逐渐涌现出了模块化开发、MVC、MVVM等开发模式。团队规模也从原来的单兵作战演变为团队开发。

所以,一个高级前端工程师,要有架构能力。这个架构能力包括不限于:

  • 对现有优秀框架的了解与整合使用
  • 根据项目的业务特点构建出合适的开发模式
  • 设计前端测试方案保证代码质量
  • 用工程化方案组织起团队的开发流程。

向前延伸、向后延伸

物联网的市场越来越热了,手机是物联网体系中的一个关键节点。前端工程师的战场已不再是单纯的浏览器,将来会覆盖到各种「端设备」上。得益于javascript语言的灵活性,现在用javascript已经可以开发windows应用、ios应用、android应用,可以编写智能电视上的应用。将来,或许是VR、可穿戴设备、智能家电。这是前端可以向前延伸的方向。

另一方面,由于nodejs的横空出世,javascript这门语言竟然神奇的有了服务端的能力。之前用java、PHP做的事情,js同样可以实现了。本来前端阵营中就有一批人是从后端转过来的,有服务端开发的基础,得了nodejs这一利器,再加上现在市场的需求,快出产品,敏捷开发,前端工程师向后延伸的路线宽广而明亮。事实上,全栈工程师的概念在前年就被提出,BAT这样的业界领头羊早已用nodejs做一些基础设施的建设,而很多小而快的创业公司,也在用nodejs进行快速迭代开发。

持续学习

前端领域的技术更新相对于其他领域要快很多,原因大概也是因为这个领域离用户最近吧。有一些新的技术甚至是颠覆性的,前端工程师必须要跟上时代的步伐,否则你开发出的产品在体验上就落后别人一截了。

有一些市场人员提出的需求,产品经理根据多年的经验评估后觉得无法实现,就被打回了。而事实上,随着新技术的出现,有些你认为无法实现的功能已经可以在前端实现了。随着HTML5的支持度越来越高,前端拥有的能力也会越强。比如利用canvas能够获取到图片上的每一个像素点,这样前端就拥有了图像处理能力。有了FileReader API,前端拥有了本地文件的读取能力,还有地理位置获取等等。

而这些新东西,就需要前端工程师来不断学习。所以,一个称职的前端必须能够保持持续学习能力,能够对新技术有敏锐的嗅觉。活到老,学到老,说的就是前端工程师。

高情商的程序猿

大多数人对程序猿的印象就是情商低、不善言谈。但前端工程师应该是个例外,这是由工作性质决定的。

从工作流程来看,FE处于设计师的下游,他要接设计稿,转化为网页。同时又是后端工程师的上游,需要把用户产生的数据提交到服务端。横向来看,他又与产品经理有着密切接触,因为他可能随时和产品经理探讨交互的细节。这样一个连接着团队中的其他成员的角色,需要他既是一个粘合剂,又是一个润滑剂。

前端工程师需要有较高的沟通能力和理解能力。我们经常开玩笑说“设计师活在童话故事里”,因为有时候他们设计的页面根本不符合常规,无法实现。这个时候你就需要耐心的给设计MM讲原理、讲原因,并且告诉她设计需要遵循哪些基本规范。对于产品经理的思想,你要能把握到位,你得理解他比划了半天到底是想要做什么。与后端工程师打交道的时候,你又得马上化身编程达人,跟他们聊数据类型,聊面向对象,聊设计模式。

你需要能随时切换角色,切换你的表达方式和谈话内容。所以,你得是一只高情商的程序员。

以上就是我对前端工程师的理解,前端的门槛低,但要成为一名专业的前端工程师,需要掌握的东西太多了。除了前端技术外,我认为前端更重要的是综合能力,包括我上面谈到的思维细腻、有品味、有思想、情商高等等。毕竟你要通过代码与用户产生接触,给用户带来愉悦感。从某种程度上来说,你得是一个好恋人。

每一个人都有精彩的故事

原载:https://knewone.com/entries/55a35b6031302d78e8ea0200?from=groupmessage&isappinstalled=0

冒志鸿

自我介绍

我是冒志鸿,是互联网和社交领域的连续创业者和研究者。目前我在美国创业之中,我们公司( PixoMobile )的产品Pixotale ( 图话 )是一个新一代的移动社交网络,她让用户能方便地通过手机阅读或发表图文并茂的富媒体内容, 用每个人生活中的点滴故事来构建一个更真实、更直观的社交网络。 Pixotale 一经发布就引起了社交媒体的强烈反响,被科技媒体广泛报道,在用户成长、内容创建和社区育成各方面均发展迅速。

从很早期就断断续续地看 KnewOne ,一来 KnewOne 有很多新奇的产品介绍和使用体验,作为喜欢尝试新鲜事物的我而言,这是非常好的媒体; 二来常常在上面看到熟人或者仰慕已久的网红们,格外有亲切感。 我尤其喜欢 KnewOne 把用户、评价、文章按照产品线索聚合的设计, 这是一种媒体形式上的创新。

从微软研究院到创立 Pixomobile 公司

 

创办PixoMobile之前,我在微软美国研究院的未来社交体验实验室(FUSE Labs)工作了几年时间,专注于社会化计算相关的一些实验和研究性的项目。微软研究院提供了一流的办公和协作环境,我觉得最大的优势是拥有一群非常优秀的同事,在很多领域都有可以学习和讨论的对象,有可以一起讨论的同伴,这对在未知领域里的探索者来说是最大的幸运之一,否则你就只能在黑暗中孤独地摸索。

          我觉得研究和创业其实有一个相当类似的地方:就是需要不断开拓未知领域,不断地尝试失败,在近乎盲目乐观的假设基础上,通过尝试和失败来取得小概率的成功。 然 而研究院环境小取得的成功主要是通过发表论文,研究成果能被其他人所采用来体现的,这就使得我每个研究项目都有一种意犹未尽的感觉,有时甚至会觉得很沮 丧,因为你必需放下已经投入很久取得初步成果的东西,没有办法把这些变成真正能改变成千上万人的生活的实实在在的东西。这就使得在机会合适的时候,离开研 究院来创业变成非常顺理成章的事情,不仅我自己,我在我同事身上看到了很多这样的例子。

  PixoMobile 的组建故事非常简单: 当我费尽“千辛万苦”拿到了绿卡批准 -- 我这绿卡的确很难拿,是我自己以“杰出人才”身份( Extraordinary Ability )取得的,而不是通过给微软工作而获得的 -- 即将获得“自由身”的时候,也刚好是我在微软的一个研究项目即将终结的阶段,无论如何选择都需要开始一个新的旅程,选择再次创业变成一个非常明显的事情。

Pixotale(图话)诞生记

         自我表达是人类的基本需求,就如同吃饭、睡觉、沟通一样,都属于持久不变的需求。 然而,虽然这些需求的类型恒久未变,但其形式却始终处于不断的变化演进之中,有些时候这些演变是螺旋曲折的,是带有流行和跟风成分的。过去的有些流行的表达方式是受历史、环境以及技术等因素局限而产生的。 Pixotale 试图提供一个非常容易使用的工具,让人们在移动时代自我表达和传播变得更为容易。

从另外一个角度而言,“故事”是一个非常重要的沟通、表达和传播形式。 事实上我们今天每一个人都是从故事中长大的,我们从小时候开始最爱听的就是故事, 故事,而不是说教、唠叨和冗长的理论。 Pixotale 就是试图通过提供一个革新的移动创作工具和传播网络,让人们找回自己喜爱的表达方式,而不是变成因为过去的技术局限导致的120字符内的絮絮叨叨,或者被动在所谓的 “ 朋友圈 ” 内接受大量鸡汤文的刷屏。 Pixotale 和她的一些竞争同行其实代表的是一群先行者在这个领域的一种大胆尝试,我们仍然在探索和寻找最佳的方式和体验,但我们代表着未来。

 

 PixoMobile 产品介绍

我们在 PixoMobile 的创业初期采用快速迭代,快速发布的方式开发了好几个和照片、视频相关的 app ,其实这是我们自己在摸索、学习研究的过程中的产品,但比较幸运的是,好几个app都取得了不俗的表现,被 Apple 多次推荐,并且多次上榜并较长时间停留。 除了我们的主产品 Pixotale ,最有趣的就是 Levitagram 这个漂浮照的 app ,我们是第一个漂浮照片的app,这么简单的想法,在我们之前居然没有人做我们自己都很惊讶

这个 app 的第一版我们只花了两星期就推出了,推出第一周就上了榜,在美国榜单上呆了一年之久。 ( 不过最近大量的copycat已经杀了进来 )

几个我最喜欢的别家的 app :

Same - 很早就注意到了这个相当棒相当原创的 app

Hyperlapse - Facebook 的那款消除抖动的 app 真的效果很棒。

工作装备

 

作为果粉,多年来使用全套的苹果装备,工作需要也使得自己有借口在任何新苹果装备出现的时候去购买一台,最近的是Apple Watch

9fe30499c40c8487ac9e7a60120d9814
Apple Watch

40911219

即便在微软的时候,作为微软研究院的特权之一,我们可以自由选择各家的装备,因此我在微软时的主力笔记本电脑也是Macbook Pro

苹果产品中 Time Capsule 是我很喜欢的一个产品,这么多年它就一直呆在家里一个黑暗的角落里不知疲倦地备份数据和提供无线网络,属于一个使用体验好得可以被被遗忘的产品。

Uplift 900 我自己相信站立办公是对 IT 从业者健康非常有益的东西,因此我自己的工作台是 Uplift 900 自动升降桌。这是 Lifehaker 读者评价第一位的升级桌,我自己用下来两年觉得非常棒。 现在配合 Apple Watch 的站立提醒,感觉非常给力。

我的创业公司里,每人都配备自动升降的工作台,这虽然成本有些高但一来创业团队中每个人的健康都非常重要,二来我们就不需要买昂贵的人体工学的椅子了, 时髦的 Aeron 在我们 team 就省了。:)

钟爱的产品

喜欢各种新鲜的电子产品,不过也谈不上装备和钟爱,因为电子产品总是不断地推陈出新的。

Amazon Echo ,这是最近一段时间拥有的最棒的电子产品了。

从 Amazon 去年宣布就打听如何能及早拿到,年初预定到几周前拿到几乎等了半年, 但 Echo 的表现绝对超出了预期。 Echo 是一个由亚马逊背后的云服务支撑着的智能音箱,能“听懂” 人话。通过 Echo 可以轻松听音乐,广播,设闹钟,查天气交通,还可以用她控制智能家电(比如开关灯等)。 Echo 的使用体验远远超出我的预期,主要是随时随地的语音控制非常方便。

耳机是 BOSE QC – 15 降噪耳 ,用 BOSE QC 系列耳机已经超过 10 年时间,这耳机对出差在飞机上,吵闹环境下办公有神奇效果,强烈推荐。

Plantronics Backbeat FIT 运动型蓝牙耳机,是我的新宠。非常轻便小巧,功能强大,而且音质也相当不错。

Soundblaster Roar + 网易云音乐下载。 Sound Blaster Roar 是一个功能强大的便携蓝牙音箱,最喜欢的功能是她能直接插一个 Micro SD 卡,这样不需要任何音乐源就能自己连续播放几个小时的音乐, 配合上网易云音乐的离线下载,这个字典大小的盒子已经成为家里厨房和餐厅里的主要音乐设备。

说了半天,看来我最喜欢的原来都是音乐有关的装备,不过我不是发烧友,对音乐欣赏也是门外汉,只是随便听些东西。

近期想要或正在关注的产品

本来的几个期望产品,由于我的拖延症原因都已经变成拥有的产品了。由于生活在一个总是可以不满意就轻松退货的环境之中,我经常购入各种有兴趣的东西,觉得不满意就退了( 相当多很期待的东西到手玩几天发现失望就退了哦 )。:P 希望不久的将来国内也能变成这个样子就好啦。

这些是我在关注和想要的产品:

Philips Hue:

智能多彩的灯泡,虽然好想尝试一下,但觉得 $200就买3个能变色的灯泡实在有点过不去,因此一直没有下手。最近因为入手了Amazon Echo可以声控Hue,让我重新考虑是否要买回来看看。

Apple Thunderbolt Display 5K:

这产品并不存在,但估计不久的未来一定会出现。 相信很多苹果粉丝和我一样在翘首等待苹果推出这款升级的产品。

Google无人驾驶汽车

 

算法的力量

李开复写于 2006 年

算法是计算机科学领域最重要的基石之一,但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门就产生了一种误解,认为学计算机就是学各种编程语言,或者认为,学习最新的语言、技术、标准就是最好的铺路方法。其实大家都被这些公司误导了。编程语言虽然该学,但是学习计算机算法和理论更重要,因为计算机算法和理论更重要,因为计算机语言和开发平台日新月异,但万变不离其宗的是那些算法和理论,例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。在“开复学生网”上,有位同学生动地把这些基础课程比拟为“内功”,把新的语言、技术、标准比拟为“外功”。整天赶时髦的人最后只懂得招式,没有功力,是不可能成为高手的。

算法与我

当我在1980年转入计算机科学系时,还没有多少人的专业方向是计算机科学。有许多其他系的人嘲笑我们说:“知道为什么只有你们系要加一个‘科学’,而没有‘物理科学系’或‘化学科学系’吗?因为人家是真的科学,不需要画蛇添足,而你们自己心虚,生怕不‘科学’,才这样欲盖弥彰。”其实,这点他们彻底弄错了。真正学懂计算机的人(不只是“编程匠”)都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”。

记得我读博时写的Othello对弈软件获得了世界冠军。当时,得第二名的人认为我是靠侥幸才打赢他,不服气地问我的程序平均每秒能搜索多少步棋,当他发现我的软件在搜索效率上比他快60多倍时,才彻底服输。为什么在同样的机器上,我可以多做60倍的工作呢?这是因为我用了一个最新的算法,能够把一个指数函数转换成四个近似的表,只要用常数时间就可得到近似的答案。在这个例子中,是否用对算法才是能否赢得世界冠军的关键。

还记得1988年贝尔实验室副总裁亲自来访问我的学校,目的就是为了想了解为什么他们的语音识别系统比我开发的慢几十倍,而且,在扩大至大词汇系统后,速度差异更有几百倍之多。他们虽然买了几台超级计算机,勉强让系统跑了起来,但这么贵的计算资源让他们的产品部门很反感,因为“昂贵”的技术是没有应用前景的。在与他们探讨的过程中,我惊讶地发现一个O(n*m)的动态规划(dynamic programming)居然被他们做成了O (n*n*m)。更惊讶的是,他们还为此发表了不少文章,甚至为自己的算法起了一个很特别的名字,并将算法提名到一个科学会议里,希望能得到大奖。当时,贝尔实验室的研究员当然绝顶聪明,但他们全都是学数学、物理或电机出身,从未学过计算机科学或算法,才犯了这么基本的错误。我想那些人以后再也不会嘲笑学计算机科学的人了吧!

网络时代的算法

有人也许会说:“今天计算机这么快,算法还重要吗?”其实永远不会有太快的计算机,因为我们总会想出新的应用。虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快增长,价格也在不断下降。可我们不要忘记,需要处理的信息量更是呈指数级的增长。现在每人每天都会创造出大量数据(照片,视频,语音,文本等等)。日益先进的纪录和存储手段使我们每个人的信息量都在爆炸式的增长。互联网的信息流量和日志容量也在飞快增长。在科学研究方面,随着研究手段的进步,数据量更是达到了前所未有的程度。无论是三维图形、海量数据处理、机器学习、语音识别,都需要极大的计算量。在网络时代,越来越多的挑战需要靠卓越的算法来解决。

再举另一个网络时代的例子。在互联网和手机搜索,如果要找附近的咖啡店,那么搜索引擎该怎么处理这个请求呢?最简单的办法就是把整个城市的咖啡馆都找出来,然后计算出它们的所在位置与你之间的距离,再进行排序,然后返回最近的结果。但该如何计算距离呢?图论里有不少算法可以解决这个问题。

这么做也许是最直观的,但绝对不是最迅速的。如果一个城市只有为数不多的咖啡馆,那么这么做应该没什么问题,反正计算量不大。但如果一个城市里有很多咖啡馆,又有很多用户都需要类似的搜索,那么服务器所承受的压力就大多了。在这种情况下,我们该怎样优化算法呢?

首先,我们可以把整个城市的咖啡馆做一次“预处理”。比如,把一个城市分成若干个“格子(grid)”,然后根据用户所在的位置把他放到某一个格子里,只对格子里的咖啡馆进行距离排序。

问题又来了,如果格子大小一样,那么绝大多数结果都可能出现在市中心的一个格子里,而郊区的格子里只有极少的结果。在这种情况下,我们应该把市中心多分出几个格子。更进一步,格子应该是一个“树结构”,最顶层是一个大格——整个城市,然后逐层下降,格子越来越小,这样有利于用户进行精确搜索——如果在最底层的格子里搜索结果不多,用户可以逐级上升,放大搜索范围。

上述算法对咖啡馆的例子很实用,但是它具有通用性吗?答案是否定的。把咖啡馆抽象一下,它是一个“点”,如果要搜索一个“面”该怎么办呢?比如,用户想去一个水库玩,而一个水库有好几个入口,那么哪一个离用户最近呢?这个时候,上述“树结构”就要改成“r-tree”,因为树中间的每一个节点都是一个范围,一个有边界的范围(参考:http://www.cs.umd.edu/~hjs/rtrees/index.html)。

通过这个小例子,我们看到,应用程序的要求千变万化,很多时候需要把一个复杂的问题分解成若干简单的小问题,然后再选用合适的算法和数据结构。

并行算法:Google的核心优势

上面的例子在Google里就要算是小case了!每天Google的网站要处理十亿个以上的搜索,GMail要储存几千万用户的2G邮箱, Google Earth要让数十万用户同时在整个地球上遨游,并将合适的图片经过互联网提交给每个用户。如果没有好的算法,这些应用都无法成为现实。

在这些的应用中,哪怕是最基本的问题都会给传统的计算带来很大的挑战。例如,每天都有十亿以上的用户访问Google的网站,使用Google的服务,也产生很多很多的日志(Log)。因为Log每份每秒都在飞速增加,我们必须有聪明的办法来进行处理。我曾经在面试中问过关于如何对Log进行一些分析处理的问题,有很多面试者的回答虽然在逻辑上正确,但是实际应用中是几乎不可行的。按照它们的算法,即便用上几万台机器,我们的处理速度都根不上数据产生的速度。

那么Google是如何解决这些问题的?

首先,在网络时代,就算有最好的算法,也要能在并行计算的环境下执行。在Google的数据中心,我们使用的是超大的并行计算机。但传统的并行算法运行时,效率会在增加机器数量后迅速降低,也就是说,十台机器如果有五倍的效果,增加到一千台时也许就只有几十倍的效果。这种事倍功半的代价是没有哪家公司可以负担得起的。而且,在许多并行算法中,只要一个结点犯错误,所有计算都会前功尽弃。

那么Google是如何开发出既有效率又能容错的并行计算的呢?

Google最资深的计算机科学家Jeff Dean认识到,Google所需的绝大部分数据处理都可以归结为一个简单的并行算法:MapReduce。这个算法能够在很多种计算中达到相当高的效率,而且是可扩展的(也就是说,一千台机器就算不能达到一千倍的效果,至少也可以达到几百倍的效果)。 MapReduce的另外一大特色是它可以利用大批廉价的机器组成功能强大的server farm。最后,它的容错性能异常出色,就算一个 server farm宕掉一半,整个fram依然能够运行。正是因为这个天才的认识,才有了MapReduce算法。借助该算法, Google几乎能无限地增加计算量,与日新月异的互联网应用一同成长。

算法并不局限于计算机和网络

举一个计算机领域外的例子:在高能物理研究方面,很多实验每秒钟都能几个TB的数据量。但因为处理能力和存储能力的不足,科学家不得不把绝大部分未经处理的数据丢弃掉。可大家要知道,新元素的信息很有可能就藏在我们来不及处理的数据里面。同样的,在其他任何领域里,算法可以改变人类的生活。例如人类基因的研究,就可能因为算法而发明新的医疗方式。在国家安全领域,有效的算法可能避免下一个911的发生。在气象方面,算法可以更好地预测未来天灾的发生,以拯救生命。

所以,如果你把计算机的发展放到应用和数据飞速增长的大环境下,你一定会发现;算法的重要性不是在日益减小,而是在日益加强。

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

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打断。让你的大脑专注于一件事,在做完这件事情之后再转向做其他的事情。

安排好处理事情的顺序

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

重用所有你能重用的

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

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

 

Soft Skills: The software developer’s life manual

<a  href=”http://www.amazon.com/gp/product/1617292397/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1617292397&linkCode=as2&tag=softw05-20&linkId=BF7CMFQ5Y3OGUVJ7″><img border=”0″ src=”http://ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=1617292397&Format=_SL110_&ID=AsinImage&MarketPlace=US&ServiceVersion=20070822&WS=1&tag=softw05-20″ ></a><img src=”http://ir-na.amazon-adsystem.com/e/ir?t=softw05-20&l=as2&o=1&a=1617292397″ width=”1″ height=”1″ border=”0″ alt=”” style=”border:none !important; margin:0px !important;” />