来自Google的前端工程师-Philip Walton 分享了本身关于如何成为优秀的工程师的一些观点。我的感受颇有价值,因此翻译成中文,方便你们阅读。水平有限,如翻译不妥之处请在评论中指出。javascript
原文地址:http://philipwalton.com/articles/how-to-become-a-great-front-end-engineer/css
最近,我收到了读者的邮件,引起了个人一些思考。这是他在邮件中问个人问题:前端
Hi Philip, is it okay to ask how you become a great front-end engineer? Any advice?java
我不得不认可,我感到很是的惊讶,竟然会被问到这样的问题,由于我历来没有想过本身是一个优秀的前端工程师。实际上,我在这个行业工做的前几年里,我真的不以为我可以胜任个人工做。我接受了这些工做只是由于我之前没有意识到我知道得东西太少了,我可以获得这些工做只是由于之前面试个人人不知道问我什么问题。面试
话虽这么说,我最后仍是把我本身的角色作得很是好,并且成为了团队里有价值的一员。当我最后离职的时候(下一个职位我仍是没法胜任)我一般也会应试那些将要应聘个人职位的人。如今回想那些我面试过的应聘者,让我明白,看待知识的重要性。尽管我一开始在这个领域很薄弱。我如今的本身可能也不会雇佣之前的那个本身,尽管我知道随着工做经验的积累,成功也是可能的。npm
在Web领域,我工做的越久,越让我意识到不错的人和真正优秀的人的区别在于不是他们知道什么,而是他们如何思考。 很明显,知识是很重要的--特别是在某些状况下--可是,在一个快速变化的领域并不是如此。你获取知识的方式比你知道那些知识更为重要。并且也许最重要的是:你如何利用你的知识去解决平常生活中的问题。后端
你能够找到大量谈论知识点、框架和工具的文章,这是知识都是得到一份工做所须要知道的。我想说一些不同的。在这篇文章中,我会说一说前端工程师应有的心态,但愿可以回答最开始的问题:怎样才能作到优秀?浏览器
不少的人只是不断地写一些 CSS 和 Javascript 补丁直到他们发现这些东西能够正常的工做了,而后他们就无论了。我在代码审查的过程当中看到了不少这样的作法。前端工程师
我会常常问别人:“为何你要在这里加一个 float: left
?” 或者 “这个 overflow:hidden
真的须要吗?”,而后他们会回答:“我不知道,可是若是我删掉他们,就出问题了”。app
Javascript 也同样。我看到一些人用 setTimeout
来防止执行顺序上的问题,或者是一些人滥用 stopPropagation()
而没有考虑到它也许会影响页面中的其余事件处理函数。
我遇到过不少相同或相似的问题,若是你历来不花时间去了解问题的根源所在,你会发现你会一遍一遍的遭遇一样的困境。
花时间去深刻的研究你的解决方案为何可行看起来须要耗费不少的精力,可是我发誓它会在未来给你节约不少时间。对你如今工做的系统有一个全面的理解能够减小你未来的猜想和检查工做。
前端跟后端主要的不一样是:后端的运行环境在你的控制之下。可是对于前端而言,相比于后端,它彻底不在你的控制范围。你的用户所使用的平台或者设备随时都有可能改变,你的代码须要可以优雅地处理这种状况。
我记得早在2011年的时候,我在一个很是著名的 javascript 框架看到下面这样一段源码(大体如此):
var isIE6 = !isIE7 && !isIE8 && !isIE9;
我知道在现实生活中, feature detaction
并不能100%的有效,有些时候咱们不得不采用这种很差的方式或者浏览器白名单的方式,可是任什么时候候你这样作的时候,你应该预测将来可能会发生什么,即便发生,你的代码也不该该出现bug。
对于咱们大多数人而言,咱们在如今的工做岗位上写的代码会比咱们的任期更长。我8年前写的一些代码如今还会常常用到,这想起来既让人知足又让让感到可怕。
浏览器 bug 老是存在的,可是,当两个浏览器执行相同的代码表现却不一致时,人们常常假设,而不是亲自去检查,只是把他们认为的表现好的叫作“正常”浏览器,表现异常的叫“不正常”浏览器。但并不是老是这样,当你作出了错误的假设时,任何你选择的解决方法在将来也许会失效。
一个现实的例子就是 flex items
的默认最小尺寸。根据官方文档, flex items
的 min-width
和 min-height
是 auto
(而不是 0),这意味着,它们的尺寸不会比它们的内容还要小。 可是在过去的8个月里,只有 Firefox
是惟一一个正确的实现这一标准的浏览器。
若是你遇到过这类跨浏览器的兼容性问题,并且你注意到你的页面在 Chrome,IE,Opera,和 Safari 上表现一致,惟独 Firefox 上表现不一样时,你确定会猜想这是 Firefox 本身的问题。
当两个或多个浏览器在渲染相同的代码表现不一致时, 你应该花一些时间去研究到底哪一个浏览器才是正确的,而后用正确的方式写下你的代码。你的做品才会是面向将来的。
另外,优秀的前端工程师常常都是站在变化的最前列的,他们会在这些技术成为主流以前就采用这些技术,甚至为这些技术做出贡献。若是你凭借你本身的实力去查找官方文档,并且可以想象一个技术在你可以在浏览器中用它的以前将会是如何工做的,你将成为可以谈论这个官方标准会对开发形成什么影响的人。
阅读其余人的代码,无疑是成为一个更好的开发者的最好方式。
本身解决问题是学习的最好方式,可是若是这些问题都是你之前解决过的,你很快就会进入平稳期(很难有上升的空间)。阅读其余人的代码能够为你打开处理问题的新的思路。并且阅读和理解别人写的代码的能力也是在跟团队合做或者参与开源项目时相当重要的能力。
实际上,我认为在面试一个应聘者是只让他们写代码--新的代码,是最大的错误。我应聘的时候,历来没有被叫过去阅读一些已经存在的代码,在这些代码中找出问题,而后解决它。这是很是很差的,由于做为一个工程师,不少时候咱们是在别人的代码上添加和改变一些代码。不多从头写一些新的。
在我印象你,比起后端开发者,更多的前端开发者但愿成为一个自由职业者(全栈)。也许是前端工程师更趋向于自学,然后端工程师更趋向于学术。
自学并为你本身工做的问题是没法从比你聪明的人身上获得好处。没有人来跟你讨论观点或者帮你审查代码。
我强烈的建议,至少在你职业生涯初期,在一个团队中工做,特别是跟一群比你更聪明更有经验的人工做。
若是你已经结束你的职业生涯,如今只是为你本身工做,那么参与到开源中来。 贡献开源项目会给你不少与团队合做的机会。
在商业上,重复造轮子是很差的,可是对于学习来讲并不是如此。你也许尝试从 npm
上获取预输入控件或者事件委托库,可是想象一下若是你本身尝试创造这些东西的话会学到更多。
我肯定一些正在阅读这篇文章的人对此感到强烈反对。不要误会个人意思。我不是说你永远也不该该使用第三方库。使用优秀的库是很是明智的事情。
可是,在这篇文章中,我要说的是如何从一个不错的工程师成为一个优秀的工程师。大部分我认为的这个领域中优秀的工程师都是这些优秀的第三方库的维护者。
你也许历来没有构建够本身的 javascript 库,可是你依然可以在你的职业生涯中得到成功,可是,可能你历来没有理解到解决问题的核心。
在这个行业中,人们常常问起的一个问题是:我接下来应该作什么? 若是你问了这个问题,为何不去尝试从新创造一个你喜欢的 javascript 库或者 CSS 框架,而不是尝试一些新的工具或者写一个新的 app。 这样作的好处是,及时你遇到了困难,你也能够从目前已有的库中的源码找到答案。
最后, 你应该把你学到的东西写下来。有太多的理由这样作了,可是,也许最重要的缘由是这样能够强迫你更好地理解你所学的东西。若是你没法解释其原理,这是一个很好的机会说明你并无彻底搞懂它。不少时候你没有意识到你不懂,直到你把它写下来。
在个人经验中,书写、作一个演讲、以及写一些 demos 是强迫我本身彻底弄懂一个东西的最好方式,从里到外。即便没有一我的会看你写的东西,可是作这件事的过程更有价值。
文章地址:http://blog.mcbird.cn/2015/08/15/How-to-Become-a-Great-Front-End-Engineer/