今天和大家分享的主题是前端的自我成长,这是一个关于成长的话题。 很多人都有这样的感受:听了很多技术圈的分享,有的深入,有的指导简单,但是几年下来,哪些用到了,哪些真正对自己有帮助已经?相反,它有点模糊。 2015年在不同的场合分享了很多内容:有移动性能,适配,WebvsNative,混合,但一直担心真正深入的内容其实是针对比较小众的组,比如Hybrid,其实在大部分公司只能现成使用。 所以这次尝试分享一个我觉得对所有前端都有帮助的话题。关于前端的成长,如果说到这次分享的内容,全场有几十人拿到了BAT的offer,或者升职加薪,然后我觉得我觉得我已经成功了。 前端其实是一个特别辛苦的工作,因为前端技术的变革速度非常快,新的技术和技能不断被发明出来。之前有一个朋友,他说他对自己的认知就是懂前端,熟悉前端,精通前端,熟悉前端,不懂前端。为什么,他说当他对前端的一切都感到无所不知、无所不能的时候,突然看到一段他根本看不懂的代码,于是整个世界都崩塌了,他再也不敢说他会前端了. 我告诉他,这里少了一个正确的方法。你认为全知全能的标准是什么?是工作中长期没有解决的问题吗?他说是真的。我又问他,你有系统学过前端吗?他想了想,以前还真没学过。大学不开设该课程。确实,目前为止还没有大学会教前端,但是有一些培训班会教web开发三剑客。 我在这里说的,是希望能带给大家如何学习前端,实现自己的成长。 关于成长,首先我要发出免责声明。并不是我对自己说的话没有信心,而是成长是我的事。在外企工作的人经常听到一句英文谚语,叫做:Youaretheownerofyourcareer。 你是自己事业发展的主人。这句话的潜台词是你(不是你的老板,也不是你的父母,更不是你的女朋友)对你的职业发展负责。 我在职业生涯之初就听到了这句话,它一直在指引着我的职业发展。甚至在我带领和培养团队的时候,也是中心的指导思想。我之前带队的同学,他们有很多人也在带队。其实他们也在练这句话,所以在这里我也把这句话和这个道理分享给大家。 我们讲前端的成长,我觉得,主要是两个方面,一方面是“能力”,另一方面是“知识”。在我个人看来,能力占80%,知识占20%。 从这张图可以看出,我们想的东西变化很快,最新的Angular,React,ES2015,其实都在知识里,知识分为两部分。比较稳定,很少有标准被推翻的。另一部分是技术,比如jQuery、React等框架,MVC、FLUX等架构。这些东西由各个公司主导,变化非常快。可以看到Grunt发展的时间不长,Gulp来挑战他了,然后还有browserify,webpack这些东西。 而且我觉得关键能力很稳定。我认为能力分为三部分:编程能力、架构能力、工程能力。 编程能力就是用代码解决问题的能力。你的编程能力越强,你能解决的问题就越复杂。只有你把调试、算法、数据结构、OS原理等细分支持起来,才能解决各种问题。有点麻烦的问题。 架构能力就是解决代码规模的问题。当一个系统足够复杂时,你可以编写每一部分并解决每一个问题。这并不意味着您可以处理整个系统。这需要架构能力,这包括一些意识,比如解耦,接口隔离,也包括理解业务建立抽象模型,还有一些通用的模式,比如经典的MVC,还有设计层面,对象-面向、设计模式等。 最后一个工程能力是解决协同问题。当系统规模较大时,单靠一个人是无法完成的。如何保证几位高手能够很好的配合?如何保证项目中水平最差的人不退缩?这种工程建设往往跨越多个业务,以汇报关系为单位进行。包括前后端解耦、模块化、质量保证、代码风格等。 其实不难看出,这三项其实是有序的。低级别的小团队只能处理一种编程能力。前端越有经验,公司和团队越大,越需要后面的技能,但这里我要强调一点,其实高级前端,大团队,对能力的需求是兼而有之——不是说高级前端,编程能力就可以变差。 社区中总会有一些声音,对工程能力和架构能力持抵制态度,觉得比较空洞,没有必要。其实对于某些人的立场来说也是如此。毕竟,公司和团队的地位可能不需要,但从个人成长的角度来看,却是大错特错。 说说知识的学习吧。 对于知识,我一直有一个观点叫宁缺无澜。这张图有前端好辨别是非。是的,其实很多人在学习东西的时候都喜欢挑三拣四。选择最“深入浅出”的。有了这种心态,就没有学好的可能。因此,我把知识学习的目标理解为亮点,一是准确,二是全面。如果你当年学到了一部分知识,如果你能做到这两点,那么你以后在业务中做技术决策的时候,面对面试官的技术问题的时候,你的自信会和你说的完全不一样只触及了表面。 这两点怎么做?我想肯定有很多方法,而我的答案,也就是我想在这里分享的,是“建立自己的知识体系”。 如何建立自己的知识体系?我个人的经验是以下几个步骤: 第一步是寻找线索。 你需要知道一些事情。比如我想学习web平台的API。当然,我可以先找本书看看别人写的是什么,但我不喜欢这样做。 在我的大学里,我正在学习前端的东西。为了搞清楚id和name的区别,曾经借过十几本书对比。那时,没有人真正告诉我哪本书更好。所以我对别人善知识的第一反应是质疑而不是相信。 所以我建议,找一些更准确的,可以肯定的是,作为线索的信息确实够全面。对于web平台的API,我用的是反射:浏览器给出的属性列表 不会骗人。以这件事为线索,我很有信心。 也可能是比较合适的资料,还有一些标准文档的附录,以及源码中的结构体定义。 第二步是建立连接。 例如看下面的DOM属性:img 这里左边的列是操作Node的,右边的列是操作Element的,所以有一定的对应关系。 一般来说,我们寻找对应关系的方式有以下几个基础:审美完备性对同组数据进行操作 特别是,对同组数据进行操作是面向对象的核心概念。对于前端来说,有点不同的是所有的API都有一个window的根,所以,其实大部分的API都可以按照面向对象的数据和操作的角度来划分。 第三步是分类。 这里我举个实际的例子。下图是zepto(jQueryformobile简化版)的API分类 。一张图,在这张图中,你可以很清楚的知道哪些知识是非常重要的,哪些其实是可以相互替代的。 而一旦你有一些你以前没有见过的东西,你可以通过将它放在地图中来快速了解它,或者找到一些好的替代品。 比如在面试的时候,如果面试官问你bind和unbind怎么用,你还是不会用。这时候,如果你心里有这幅画,你就不会迷茫了。你可以说,虽然我不知道绑定和解除绑定,但我知道生和死,我知道开和关。 从这张图我们可以看出,集合中的大部分东西是没有用的,但是在节点操作中,它们一定是非常有用的。 第四步,追本溯源。 当我对一个知识体系的全貌有了一个概念的时候,我就占了“全面”这个词,然后我需要确认它的准确性。很多知识,社会上会有很多争论,相信谁,这是个问题。而我的回答是追根溯源,找到它最初的讨论和定义。 有一个真实的案例,就是闭包的概念。我们很多人过去有一个错误的认识。我们混淆了闭包和作用域的概念,认为闭包是一个函数的执行环境上下文,但是有个叫hax的(应该很多人都认识他,哈哈),他对此提出质疑,认为闭包是一个函数。于是就去验证一下闭包的概念。 大家都知道wiki其实是不准确的,但是里面有一段基本上没有太大问题,就是历史了。下图是闭包词条的历史部分: 从这段历史中,我找到了一个名字,PeterJLandin,他是作者,然后,我去看他说了什么,于是我去谷歌学术搜索并搜索了他的文章 ,找到了,所以我们看一下原文件 的定义,对应我们今天JS中的闭包,略有不同,但与它。问题是它包含环境部分和控制(代码)部分两部分,所以其实闭包就是JS对应的函数,而之前一般的看法是闭包只包含环境部分。 所以这个回顾的过程可以帮助我们真正弄清楚什么是对的,什么是错的。 除了结合wiki-google学术搜索,还有一些邮件列表和github提交历史,也很适合查一些概念和技术的历史。 最后,我讲的建立知识体系的过程就是不断接受新的知识,挑战和质疑原有的体系,推翻重建,每一次循环,你的知识体系就会越来越强大。 下面的部分分享是关于能力建设的。 能力培养其实很重要,但其实内容很少。只有两点:教材和培训。 对于知识的学习,我主张建立自己的体系,不相信书本。但对于能力培养,我的观点恰恰相反。我觉得能力体系恰恰是自己很难搭建的,需要教材来引导。这是由两者的复杂程度和变化速度决定的。 想要培养自己的能力,就需要找经典的教材来学习,比如《算法导论》、《C++程序设计语言》等几十年都不会过时的经典。 注意我这里用的是教科书,不是书籍。 教科书和书最大的区别就是有没有习题。 在我看来,再难的书,一周看两本书也可以,但教材一定不行。课本一定要花几个月的时间,一边看一边做习题。 说到训练。 其实有一个事实就是,工作之后,只有极少数人还能做培训,比如我自己的编程能力,自觉工作了7、8年,几乎没有进步。 培训应该是系统的(需要教材)和积极的。这两个特点缺一不可。可能有人会觉得我真的很努力,每天都要加班,但其实,任何被动的痛苦都是没有必要的。法律给别人带来进步,但你的痛苦却可能给老板带来更多的收入。 面对困难,你可以选择系统的训练来提升自己,但对于大多数人来说,你可能更愿意选择workaround:养成习惯,让工作更有挑战性。关于 的理论其实有很多,比较有名的是NoelTichy提出的心理舒适区、学习区和恐慌区。选择一份对你来说具有挑战性的工作,并直面问题。 科技圈流传着一个笑话。讲的是一个人工作了三年,但是只有一年的经验,因为接下来的两年是重复第一年的工作。 所以我们要做的就是永不重复工作。当你觉得现在的工作越来越舒服,风险越来越小的时候,你就应该提高警惕了。 虽然训练是一件很辛苦的事情,但其实不用太担心。虽然到处都是“一万小时培训”的传言,但我觉得各大公司的招聘门槛应该都停留在几百小时。小时的培训。所以我想说,一万小时太长了,抓紧时间抓紧时间。希望看到大家成为更好的前端,成为更好的自己。 以上是我分享的全部内容。如果大家在学习前端的过程中遇到任何问题或者想获取学习资源,欢迎加入前端学习交流QQ群:328058344
