360月影写给想成为前端工程师的同窗

编者按:本文由360副总监、奇舞团负责人月影编写,文中解释了什么是前端工程师,前端工程师的发展之路、前景、须要的知识体系、之前前端工程师的学习与成长等内容,在最后,还提到了关于在校大学生学习前端的一些见解。前端

  前端工程师是作什么的?nginx

  

  前端工程师是互联网时代软件产品研发中不可缺乏的一种专业研发角色。从狭义上讲,前端工程师使用 HTML、CSS、Java 等专业技能和工具将产品UI设计稿实现成网站产品,涵盖用户PC端、移动端网页,处理视觉和交互问题。从广义上来说,全部用户终端产品与视觉和交互有关的部分,都是前端工程师的专业领域。程序员

  2005年的时候大多数网页长这样:面试

  

  如今的网页通常是这样的:算法

  

  前端工程师的发展之路和前景是怎么样的?编程

  前端是一个相对比较新的行业,互联网发展早期(1995年~2005年)是没有专业的前端工程师的。随着互联网的发展,大约从2005年开始,正式的前端工程师角色被行业承认,到了2010年,互联网开始全面进入移动时代,前端工程师的地位愈来愈重要,前端领域的技术发展也愈来愈快,各类新的思想、设计模式、工具和平台都快速发展,对前端工程师的技能要求也愈来愈高。设计模式

  有一些数据能够说明前端行业的发展迅速:浏览器

  在2010年以后最流行的新编程语言中有至关部分和前端有关,好比 Dart、Clojure、Coffee 和 Type。性能优化

  做为前端最重要的编程语言 Java,在最近几年里不管是代码量仍是关注数都稳居 Github 平台热门编程语言榜。网络

  行业对前端需求量持续增长,前端程序员薪水在行业里面处于较领先的位置。

  

  近年来最流行的编程语言不少都是Java替代语言

  

  Java在最热编程语言 TOP10

  

  近几年互联网公司前端团队每一年扩张一倍

  

  Java工程师平均薪水排名在程序语言工程师收入前10

  前端工程师须要什么样的知识和技能?

  有人说前端工程师的技术栈是这样的:

  

  还有人说是这样的:

  

  实际上前端工程师最核心的技能仍是:

  

  在一个典型的互联网公司的产品研发流程中,前端工程师和其余角色的关系大体上是这样的:

  

  前端是最接近产品和设计的工程师,起到衔接产品和技术的做用,前端为用户能够看到的部分负责,因此也是最接近用户的工程师。

  在多终端的时代,若是一个产品同时支持PC、移动端,前端工程师还须要和更多的角色打交道:

  

  Java 对于前端是最重要的技能,因此优秀的前端工程师要有扎实的Java基本功。而Java这门编程语言也是目前程序设计领域煊赫一时的宠儿,现在的它不只仅只是用来开发Web,还能够用在各个方面。

  

  Java 能够用在“树莓派”这类智能硬件芯片开发

  前端工程师也是软件工程师,因此软件工程师的基础知识也是很是重要的,这些基础知识包括:

  数学

  计算机体系

  操做系统

  数据结构和算法

  编译原理

  HTML和CSS也是前端工程师很是重要的基本功,不少同窗,尤为是喜欢写代码的同窗容易忽视 Markup Language,实际上 ML 也是 UI 相关的领域里面很重要的内容,不该该被忽视。

  HTML: The Living Standard

  HTML & CSS

  有同窗问说:“前端工做需求不少,总是改来改去,实际的技术点并无多少,产品决定业务逻辑,从事底层基础服务会不会更有挑战和职业将来?”

  的确,越贴近业务和产品层面上的工做,需求差别性越大,可能改动越频繁。不只仅是前端改来改去,PHP服务端作业务的同窗也面临这样的问题,业务逻辑改来改去。越底层通用性越强,改动相对较少。

  不过事情都是有两面性的,首先能够这么想一想,是底层基础服务的市场大仍是互联网业务和产品的市场大。其次,基础服务的通用性很容易达成,而产品层面上如何通用化,如何在业务驱动的产品研发中利用工程化和工具化提高开发效率,这实际上是一个很难的问题。丰富的互联网产品已改变和正在改变着咱们的生活,然而做为产品的创造者,工程师们怎样让本身过得更好,这个领域值得研究。

  另外,不要以为实际的技术点没有多少,举几个例子:实现曲线和曲面动画,计算地图的最短路径,让png静态图片相似于gif图同样作局部的运动,抽奖游戏,物理效果的HTML5游戏,3D图表,加强现实的WebGL视频流处理等等,这些都是在前端领域中遇到的实际问题。

  就 Java 来讲,在实际项目中设计最合适的模型高效率解决现实问题自己就颇有挑战。做为一种典型的新生代编程语言,Java 特性丰富,使用灵活,性能优良。面向对象、函数式编程、各类设计模式、MVC 和 MVVM,这些自己就有足够的吸引力。

  前端要解决界面和交互问题,实际上UI层面上的问题一直是软件工程方面的一个难题,由于UI不停地在变化。浏览器各个版本的兼容性、Web 标准、移动设备、多终端适配,给了前端工程师很大的挑战,对前端工程师的能力也有很高的要求。许多UI问题有不仅一种解决方法,许多问题有很是巧妙的思路和精彩的解决办法,前端在工程师群体里是属于很是有创造力的一个群体,由于这个行业须要丰富的创造力和想象力。

  前端工程师仍是Web标准的制定者、实践者和推进者,而如今的W3C标准不只仅局限于浏览器,还包括各类手持智能设备,车载设备、智能家居等等。在将来万物互联的时代,前端将不只仅是网页上的工程师,而是全部人机交互领域的工程师。

  前端工程师的学习和成长

  前端领域发展很快,各类新技术新思想不断涌现,这是一个好现象。可是前端发展太快也带来一些问题,好比有同窗就问到我究竟应该学些什么,Angular.js、React、Node.js、ES六、ES七、Coffee、Type……彷佛永远有太多东西须要学习,有些东西好像还没学明白就被另外一些新的技术取代而“过期了”。

  其实仍是那句话,前端工程师首先是软件工程师,基础是最重要的,若是基础不扎实,一切应用技能就都是“浮云”。前端的基础是什么?HTML、CSS、Java基本功,数学、算法、数据结构、操做系统、编译原理基本功。

  一个优秀的前端工程师必需要有本身擅长的领域,而且钻研得足够深刻,同时要有眼界,能“跨界”。能够之前端做为职业,但千万不要把本身的技能限制在前端领域,由于有不少东西,只有站在前端以外,才能看得更清晰,更透彻。

  学东西千万别盲目跟风,你们都在谈AngularJS就当即跑去学习,过几天你们都谈React了,就又放下AngularJS去学习React。前端领域知识点不少,值得学的东西也不少,聪明的同窗懂得花时间学习成体系的知识而且研究得足够深刻,由于只有这样才能从中总结出规律,造成方法论,这样才能最大化学习的价值。

  

  知识的正确用法 —— 一个领域里面的大师永远不会是另外一个相似领域的菜鸟

  此次前端星计划布置的一个实现带有农历和节气的万年历,有些同窗卡在农历计算上,大约70%的同窗懂得去网上找代码,但只有不到1%的同窗真正弄明白农历计算的原理。

  在面试的时候,面试官问到如何作前端性能优化,有的同窗可以拿雅虎的性能优化军规回答得头头是道,反复强调使用工具压缩静态资源,可是本身搭建的博客的nginx服务却没有开启gzip。都知道说要合并静态资源,要减小HTTP请求,然而为何要减小HTTP请求,减小请求以后预计能改善多少性能,得到多少收益呢?须要弄明白这些问题,也须要深刻了解HTTP协议自己。

  还有一个更有趣的问题,你们都说写HTML的关键是语义化,那么到底什么是语义化呢?这个问题难住了很多同窗。标签要符合语义,这个答案看似简单标准,但什么样的标签才是符合语义?强调用 strong 不用 b?那若是有个外星文明,它们的语言里 strong 至关于地球的 bold,bold 至关于地球的 strong,那么它们究竟该用 strong 仍是用 b?咱们说 i 标签是斜体的意思,那为何 fontawesome.io 拿它作 icon font 的标签,这是否是“反语义”的?

  过去不少地方农村有一种民间的染坊,制做染布的染料。这种染房里面有一口很大的铁缸,一般都要有一个身体很是强壮的工人拿一根很长的铁棒在染缸里面用力地敲击,敲得越响,制做出来的染料颜色越鲜艳。 为何越用力敲打铁缸染料就越好?染坊的人说这是祖祖辈辈传下来的经验,而事实上也是如此,真的染料的颜色和敲打用力有很大关系。直到有一天,一位从村里走出去学化学的大学生,弄明白了原来只须要在染料中加适当比例的铁屑,就能让染料和含铁元素氧化物产生化学反应而变得更鲜艳。原来祖祖辈辈传下来的“仪式”实际上在真实原理面前只是一种信仰和宗教。一样,若是咱们不去了解技术的本质而止步于应用,那么咱们就只是技术宗教的信徒。因此在周爱民老师的《Java 语言精髓与编程实践》中说,计算机语言如同祭司手中的神杖,神杖换了,祭司仍是祭司,世人仍是会把头叩得山响。祭司掌握了与神交流的方法,而世人只看见了神杖。

  由兴趣选择前端

  在我学程序设计的最初,我学习的是C语言,然而整整一本书除了教我如何在黑洞洞的控制台上输出 Hello World 和各类其余字符或者用键盘输入一些什么而后依然是字符输出外,就没有什么其余的内容了。学习了一段时间以后,个人心里一度是崩溃的,由于我以为这和我想得不同,学了那么多知识,我都不知道本身究竟算不算是“学会”了C语言,由于在我看来,那些丰富多彩的操做系统和各类应用软件和黑洞洞的控制台之间明显还有着很是巨大的鸿沟。

  过后回想起来,当时的想法固然是幼稚好笑的,那时候的我并不知道程序语言和运行环境之间的区别,对操做系统、用户API、硬件接口、网络服务等等都彻底不了解。然而这并不能怪我,由于C语言的教程并无任何一言半语来告诉我这一点,我也不知道学习了C语言的语法以后接下来还应该学习些什么。

  相对来讲,Web开发更吸引我,由于不须要安装任何环境,只须要在文本编辑器里面输入一些字符,保存后打开浏览器,立刻就能看到丰富的视觉效果,这就是前端的优点,你所作的努力当即就能看得见。

  相对于死板的输入输出,Web开发在界面可见的一层要丰富多彩得多,这一点吸引了我,若是这一点也能吸引你,让你着迷,那么你就适合学习前端。

  在选择前端做为职业以前,要明确判断本身对前端开发的确感兴趣,选择作前端,应该是确认本身喜欢和适合作前端,而不是为了一份看起来体面并且薪水不菲的工做。若是你对构建丰富多彩的界面、处理各类交互逻辑不感兴趣,甚至厌烦,那么最明智的选择是放弃成为前端工程师的想法 —— 由于选择一个本身不喜欢的职业,为之忍受数十年直到退休,实在是一件很悲催的事情。

  对在校学生,咱们看重哪方面能力?

  有同窗问,360前端是否必定要求实际经验的学生,在这里我能够回答:否。

  对于学生,咱们比较关心的是:

  基础:包括数学、算法、数据结构、计算机相关基础的掌握。

  学习能力和学习方法:如何学的前端,学了多久,学到什么程度,遇到过什么问题,是如未尝试解决这些问题。

  兴趣:对前端的兴趣如何,这一点能够体如今不少细节上。有一个反面的例子比较常见,通常来讲我会问学生最近在关注什么前端新知识,有的学生会说我关注某某某,但当我再问他究竟关注到什么程度,会发现他实际上根本没有在这项新知识上花费多少时间。若是你对感兴趣的问题都不花费时间,如何证实你本身对前端的“兴趣”呢。

  解决问题的能力:遇到难题如何解决的,遇到没接触过的问题是如何思考和最终解决的。从这里能够判断出同窗有没有前端思惟,这些问题没有标准答案,咱们不追求某些“官方思路”,看重过程而不是结果。

  关于简历,有同窗提到说如今彷佛不少公司都但愿学生会点 Node.js,会点 React,我本身不会该怎么办。

  我想说的是,咱们并不要求学生必须会这些。相反,我我的更鼓励学生利用时间打好基础。简历上写本身真正擅长的内容便可,咱们不会由于在你的简历上看不到 Node.js 或者 React 就忽略你。只要你真心热爱前端并用心学了,你应该明白如何用前端基础来打动我。有的学生喜欢在简历上堆砌词汇,实际上这一点不见得好,由于若是你写了一个你本身只知其一;不知其二的东西,最后在面试中被面到了,必定会得负分的。

  技术自己是有深度的,A 同窗说“我知道React但没用它作过东西”, B 同窗说“我用AngularJS写过一些我的的小项目”, C 同窗说“我上个月使用弹性布局的思路来写个人博客,结果在Android系统4.1版本的Webkit浏览器下出现了一个显示bug,最后我是这样这样解决的”。大家说 A、B、C 三个同窗咱们会选择哪一个同窗?

  面试是一个彼此交流的过程,咱们但愿看到你们在前端领域的能力和潜力,“知道”一件事,并非一种有价值的能力,尤为是在知识廉价的互联网时代。咱们的同窗千万不要像背书同样去死记硬背同样东西,而应该真正用心去学。咱们的高等学校不只仅教授你们知识,还有如何真正学习和作研究,不是吗?

  若是你对前端真的感兴趣并有潜力,花点当心思,你该知道如何学习它。

  最后,祝愿你们都能成为优秀的前端工程师。