我已经提交好多天了,在百度上还是搜不出来,求大神指点

BAT里因为实习时间要求只面了两家,另外面了若干比较有名的创业公司,都是前端。目前没有失败过,只有在确认发offer协商实习时间和是否能到岗的阶段因为家庭原因主动放弃了一些,感觉败了很多RP,OTZ……真的很对不起HR姐姐们和一些热情的面试官,所以来介绍一下个人经验补点RP……

首先要明白的是,应聘实习是一个双向选择的过程。因为前端入门门槛相对于其他岗位低,所以相对而言要在候选人里挑到靠谱的前端就更难,个人体会是目前要招前端的地方很多都确实非常缺人,但也怕招到不靠谱的人来创造负价值,所以如果你比较靠谱的话自然会有团队主动找你想让你加入,而如果你想进大厂的话,只要在面试的阶段尽可能表现出自己靠谱,就OK了。

个人感觉对于前端来说,靠谱的表现主要有以下几种:

1. 要有比较好的计算机基础

这里的计算机基础指的是数据结构与算法,操作系统,编译原理,计算机网络等等。虽然相对于其他方向而言,前端在工作中用到计算机基础的地方可能少一点,但是无论大小厂,招实习生其实都是为正式招聘做储备,所以会比较希望招将来有更大发展空间的人,就像里

如果你具备比较好的计算机基础素养,那么以后在拓展到其他领域(WebGL —— 计算机图形学,Node.js 底层 —— 操作系统,JS 引擎和各种预编译工具—— 编译原理, etc.)的时候会更快上手。另外有一些公司对前端的概念不局限于 Web 前端,也包括移动端偏前端的部分,这里也需要你有比较好的计算机基础才能做好。前端领域有很多人已经不满足于造轮子,直接跑去造语言了,如果你编程基础够好,接触过各种形形色色的编程语言和范式,再上手这些东西也会方便些(比如Ruby/Python->CoffeeScript,Haskell->LiveScript)。

虽然也有很多地方为了招到足够多能来干活的前端会降低对计算机基础的要求,但是打好这方面的基础是没有坏处的,如果面试笔试被问到且答得上来,也是能够加分的。一些大厂经常会出现“不是前端的面试官来面前端”的情况,我个人是觉得如果这类面试官问的都是计算机基础问题的话,其实真的无可厚非,毕竟人家在面“一个前端程序员”之前,是在面“一个程序员”啊……

2. 要懂得现代前端的一些新技术

有一些同学觉得这些东西懂得越多越好,我个人是觉得这些工具不一定要都了解(毕竟它们很多也未必能火多久),但对这些东西要有大致的概念,并且每个领域的用过一两种(最好是在项目里),清楚它们的优缺点和必要程度。这是区分在前端上投入过一定精力的人和跨行来兼职前端的人的标志。

去大厂校招应聘前端的会有很多只是做过一些 Web 项目,但不一定对前端的技术很了解,只是看前端门槛比较低就去投简历的人。如果你对这些新技术比较了解的话,起码能够证明你是比较专注前端而且花过一定时间在上面的。

同时,前端现在确实是一个每天都有很多轮子冒出来的领域,也需要你有足够强的自学能力和(英文)文档阅读能力去跟上社区的这些新动态。接触过比较多的轮子,才会有自己的判断,不会老是人云亦云火一个学一个。这些工具里,确实也有很多在合适的场景下可以提高前端的生产力或者代码质量,对这些东西有一定关注,也表明你对自己的生产力和代码质量是有一定关注的,这其实是一个更广义的靠谱程序员的特性。

3. 懂得什么是 Web 标准和浏览器开发维护的流程,并且会跟进新发布的标准和主流浏览器新实现的特性

当然面试的时候一般不会直接问你这方面的问题,但是如果你懂这里面的水大概是怎么一回事的话,在很多问题上(特别是兼容性问题上)都能回答得比较深刻一些。最好清楚:

  • 各种标准的不同版本和提交状态是怎么回事
  • 知道标准和实现的差距(有些人喜欢把 W3C 标准奉为圭臬,但现实中浏览器们并不是这样的)
  • 知道浏览器的一些常见做法(比如给 CSS 特性加前缀)的缘由

标准和浏览器这滩水还是很浑的,涉及到很多利益纠葛和大厂的博弈,如果你大概清楚他们的一些事情,不光自己做前端兼容的时候会容易一些(不会只抱怨“为啥XXX就是不能OOO”而是懂得他们的无奈并且认真寻找解决方案),在新特性出来的时候也更容易消化(不是“啊又出了个新东西要学好烦啊”而是“在邮件列表上争(si)论(bi)了那么久他们终于把这个搞出来了”),你自己对前端比较基础的那部分的知识体系更会有条理得多。个人觉得这也是区分比较有经验的前端和临时跨行的前端的关键之一,这些东西是需要你经过一段时间的耳濡目染才能理清楚,而且会在一定程度上影响你的工作的。

4. 多看书,多关注技术资讯

技术资讯的来源包括RSS、邮件订阅、比较重要的邮件列表、或者follow Twitter和微博上一些比较有影响力的开发者。个人经验是,一般在二面或者三面的时候,面试官都会问类似“你从哪里接触前端的新技术/你看过哪些书”的问题,因为前端现在技术更新很快,比较专注于前端这方面的人一般都会有自己接触新技术的渠道,他们自然也会比较关心候选人是不是有在跟进社区的一些动向。其实这也能够排除那些不太靠谱的临门跨行的人,因为他们平时一般不会特意去关注前端技术的新动态的。

5. 不仅懂得一些东西怎么写,更要懂得一些东西不要怎么写

Web 标准大多不是严格向后兼容的,很多几年前常用的写法,现在已经被社区的大多数人强烈建议避开了,有很多特性也随着时间的流逝被打上了 deprecated 的标签,如果你不幸拿着一本比较老的书入门,又不在网上验证上面说的每一句话,那么很有可能你就这样被误导很久,比如

这样的情况……与之类似的还有:

  • JavaScript 里那数量令人叹为观止的坑
  • 一些在经验比较丰富的前端看来属于常识的东西(比如:为什么 CSS 大多放在 head,JavaScript 多放在 body 底端?)
  • 划分各种模块、文件,添加模板的正确方式(比如错误方式是一堆脚本/样式写在一个超大文件里,或者在有替代方式的情况下在 JavaScript 里拼字符串)

这些知识都需要你有一定的前端方面的经验,看过比较多相关的博客和书,才能慢慢积累起来,所以也能区分靠谱的前端和不靠谱的前端。

6. 不依赖某一个特定的框架或者库

比如很常见的“离开了jQuery就不会写前端”星人……也不是说要做原生 JavaScript/CSS 和 DOM 的原教旨主义者,但高度依赖某个框架或者某个库的话,通常意味着换了一个框架/库你的学习成本会比不依赖特定轮子的人高,因为这通常是处于还不知道前端领域“什么是什么”的阶段的表现。

事实上前端领域的这些轮子有一些都是其他领域早就有,或者根本不需要的东西,其中很多的实现原理也不是那么复杂,只不过是脏活累活。个人觉得对这些东西应该报以“不能知其然而不知其所以然”的态度,起码大概清楚它们的实现是怎样的套路,知道它们的优缺点,多接触几种,这样在换一个替代品的时候很快就能上手。

因为前端的特殊性,在开发比较大的项目的时候使用库和框架是必须的(比如遇到各种鼠标事件的前端兼容问题时,总不能全都就地写 if-else 吧,总得封装一下。遇到非常 data-driven 的项目,还用手动操作 DOM 的写法很难维护吧,用个 MV* 框架真的不纯是偷懒了),但是这些东西都是会迅速改朝换代的,死守着某个特定的库或者框架,确实不太靠谱。很多公司喜欢问候选人“原生 API 写个 Ajax 请求怎么写”这类问题,感觉很大程度上也是在排除这类人……

这里说的不是切图啊PS啊AI啊什么的,而是大概懂基础的视觉传达/色彩构成/平面构成的知识。毕竟前端是和设计师联系最密切的程序员,虽然前端要做的事不仅仅包括 UI/UX,但是 UI/UX 却都主要依赖前端来实现。很多时候,设计师(特别是不会前端技术的设计师)给出的设计可能很难(在照顾兼容性的前提下)实现,这个时候不应该跟他硬拼让他改设计,或者自己默默纠结怎么用很 hack 很难维护的方法去实现,而是理解设计的意图,并且跟设计师沟通,尽可能在工程上容易实现容易维护的前提下实现设计的意图,哪怕要修改一些具体的表现形态。

最恐怖的就是丢一张图过来,让你做到 pixel perfect,你也不问三七二十一直接开工,代码写得别扭也不去沟通,遇到不兼容就打个哈哈蒙混过关了……设计的目标是让大众都能更容易地使用,这样做是与设计师存在的意义背道而驰的,我也遇到过一些设计师会主动来问前端怎样的设计在浏览器里容易实现,怎样的设计比较别扭,这样他才能结合多方面的信息去做设计上的决定。如果你对设计不关心,不与他交流的话,实际上相当于剥夺了一些关心工程实现的设计师的知情权(一般正常的设计师看到自己的设计实现出来效果不好,也会小郁闷的……)。个人觉得与设计师沟通的技巧,也是一个靠谱的前端应该具备的素养。

(这个是我看了一下别人的答案补加的)。其实这个和第一点的目的类似,最重要的是别要做一个非得等队友来才能开工的人。大厂(主要是阿里系)有不少在用 Node 做前后端分离一类的事,另外做前端的经常要在后端还没写完的时候自己去 mock 一下数据接口,如果你懂怎么搭建简单的服务器和 serve 数据给前端,那么就可以提高开发的效率。即使你只想专注前端,但前端有很多东西(比如 JS 跨域,WebSocket,SSE,WebGL 的素材获取)都需要你懂得架设简单的后端才能去实践,这时候不懂后端通常就意味着你要放弃学习这些知识,或者只能纸上谈兵。一个正常的前端肯定是要对计算机网络和 HTTP 等协议有一定了解的,有了这些知识去学简单的后端其实是很水到渠成的事情。

9. 在前端投入足够的时间

意识到以上几点还需要投入足够多的时间才能看到成果,不然很容易出现“道理我都懂,可是OOO”的情况,那最后也还是靠谱不了的……如果不是真的对前端感兴趣并且投入足够多的时间,与其为了“好找工作”而投前端,不如转一个更合适的方向。

另外有些面试官喜欢问你一些很细节的 API (虽然我个人觉得这类问题很囧),这些东西很多时候都是靠的“无他,但手熟尔”,虽然有一些确实有点刁难人的味道,但有一些真的是如果你经常写前端,重复多几次就会记住的,如果记不住,只能说明你前端写的不够多。还有一些没足够实战经验的人很少遇到过的问题(比如 JS 跨域),也是需要在前端投入足够多的时间,才会接触到(无论是纸上谈兵,还是项目里遇到)。

其实综上所述,不靠谱的前端大概表现就是:计算机基础不好(更糟糕的是编程基础都不行,不过编程基础和计算机基础好不好跟绩点高不高专业对不对口这些其实真的不一定有什么关系……),对前端的认识还停留在十年前,对社区出现的新工具完全不认识(没认识全很正常,但完全不了解就有点两耳不闻窗外事一心只读圣贤书的味道了……),不懂 Web 标准是怎么回事或者不在意标准,遇到兼容问题就复制粘贴搜到的代码,对于一些在社区里是常识的坑毫无意识地各种踩,“离开了jQuery/某库/某框架就不会写前端”星人,或者平时根本没怎么做过前端的东西,只是做做 Web 项目顺带写前端,到应聘了临门一脚跑过来……不管是平时学习还是笔试面试,尽量避免向这些特征靠拢就可以了。事实上大厂们招人不一定会要求这么严格,而且大厂里的团队本身也未必个个靠谱,但是平时有在这些方面努力的话,起码如果挂了会知道自己哪里不足,或者到底是他的问题还是你的问题……

以上大概就是我觉得拿到大厂(or前端比较靠谱的中小厂)前端offer需要的水平,其实我感觉没必要拿“实习”这个词来限定自己,尽量往高水平靠拢,才能做到是你来选公司,而不是公司来选你,这样你才能结合兴趣/家庭/个人规划之类的因素拿到最适合自己的 offer。另外,我觉得面试这回事是这样的,上面提到的这些特征,每一条单独拿出来,在不确定面试官的情况下,既不是拿到offer的充分条件,也不是拿到offer的必要条件,某一条不满足,也不是拿不到offer的充分或必要条件。大厂的面试官有很多种,有些设计出身喜欢问设计,有些后端出身喜欢问偏后端的东西,有些喜欢问你API细节,有些喜欢问你实现思路,有些喜欢看你学习能力,有些面试官本来就不是前端所以喜欢问你基础题。如果你侧重某一些方面,虽然无可厚非,但是运气不好遇上期望不同的面试官,可能你就会得到比较低的评价或者挂掉。确定能拿 offer 的唯一途径,就是面面俱到,这当然是不可能的要求,但大厂的种种因素配合起来往往就是在找这种不存在的人才,真的想拿 offer 的话,就只有硬着头皮尽量靠拢。

就像国内很多大厂里比较著名的前端们文章/博客/知乎里提到过的一样,前端这块水不是很深,但水非常非常宽,在考虑将来作为一个前端如何发展如何应对天花板之前,先要脚踏实地把这些属于前端的“本分”的东西搞好。事实上前面提到的这些东西我也没有全都做到。作为前端,个人觉得最重要的是要保持一颗开放、谦卑的心,不要抵触新东西,永远记得外面的世界还有很多东西自己不懂,要继续学习。

自己接触 Web 开发是在大二上学期,兴趣确定在前端方向大概是大二下学期,现在大三下学期,所以大约经历了一年多吧……中间的过程有空再填坑……(逃

大概是大一暑假我姐 @张秋晴 要做个创新项目,想做成网站形态的,彼时我刚刚经过一年的洗礼大概入了编程的门,大约就是会写烂大街的 XX 管理系统和简单的数据结构/算法,可以IDE也可以终端流,懂点单元测试和构建脚本之类偏工程的东西的水平,但是对怎么用自己的编程知识写一个网站一无所知。当时不懂操作系统也不懂计算机网络,高中因为经常上网偶尔鼓捣一下大概接触过 HTML,对 CSS 和 JavaScript 只是略有耳闻,HTTP 协议之类的更是不懂……不懂那当然就要去学了!然后开始自己找资料去。和大部分人一样,先从前端开始,我看的是 John Duckett 的 《HTML & CSS》(因为我是外貌协会的),JavaScript 看的是 《DOM Scripting》(其实后来发现这本书并不是特别好,有些做法过时了),于是打开了新世界的大门……

大二上学期选了一门学校的 Web 开发相关课程,技术栈大概是 Tornado(一个 Python 的 Web Server,知乎也在用)+ MongoDB + jQuery,老师鼓励我们把作业放到 GitHub 上互相借鉴,所以我也开始往长了几个月草的 Github 放东西。不过我自己属于比较喜欢自学的那种人,所以基本上还是靠自己看书去学,选课只是为了给自己加点压力(而且毕竟有三个学分拿)。后端部分因为本来就是半个 Pythoner 所以学起来还是很愉快的,虽然当时对计算机网络一窍不通所以会比其他大三的同学吃力一点。Tornado 不算很热门的项目,资料不是很多,但是本身源码架构清晰,官网也有足够的文档和示例,所以对我来说还是够用的。当时收集的学习资料在。后面两个学习的资料相对多很多,当时收集的部分学习看的书放在了 里面。同时还加了学校的一个 Web 开发的社团,参加了一些研讨会,接触到了一些前端领域的新东西(Node.js,各种现代前端的工具等等)。

很多人入门都是从 w3school 开始,但涉水深了就会发现其实 w3school 与它的英文站点 w3schools 并不是一个很靠谱的参考来源(参考 的介绍),在 StackOverflow 上回答问题时,如果援引 w3schools 也有可能因此被 downvote。我在入门的时候有人指了下路,然后开始将 作为自己的参考来源(一方面也是因为我是 Firefox 死忠 2333)。MDN 上有很多好的教程、示例,但最常用的还是各种特性的介绍、相关标准传送门和兼容性数据,同时它是由社区和志愿者们维护的,一些比较热门的特性更新都更及时一些,很多被淘汰的东西也都会注明。

大二的寒假写了,帮助了一些同学,写的过程中自己也理清了一些东西,算是对 Web 开发的整个知识体系有了一个总结。寒假零零碎碎看了一些书,主要是 Node.js 方面的。

大二下学期在社团师兄的介绍下进了一个创业团队打杂,主要工作就是用 Node.js 封装微信公众平台的 API,写成一个 Express 的中间件,这个时候接触了很多 JavaScript 比较深层的知识,包括

大三开学前,也是经人介绍去某 IT 咨询公司做了一段时间的前端实习生,挣点零花钱……这个项目有很多遗留代码,而到我实习的时候其实基本做前端的只有我一个人,最后这份实习让我学到的更多的是“不应该怎么做”。这是一个完全符合 MV* 使用场景的、data-driven 的项目,但遗留下来的是使用 jQuery 操作 DOM 的架构,并且在设计风格与 Bootstrap 相差甚远的情况下使用了 Bootstrap,导致非常多的组件都要覆盖原来的样式,而且在很多问题上踩遍了前端的各种坑,前端部分的组件化和模块划分也是无法直视。当时在解决手头问题的同时,看了一些偏业界经验和介绍大型网站前端处理的书,研究了 Paypal,Linkedin 和阿里系的前后端分离方案(这个项目的架构与他们以前的做法是类似的)。然后才明白,前端的很多看似多此一举的解决方案,确实是不去做一个比较大的项目,是不会有亲身的痛感的……

大三上学期开始玩前端各种新冒出来的工具,去探清浏览器与 Web 标准错综复杂的关系,并且开始对偏底层的一些东西产生了兴趣。这个时候大二接触的很多基础知识开始对我的前端学习起到了更大的作用。比如在对工业界使用的而不是教科书上的 C++ 和相关的构建工具有一定了解后,我可以开始去阅读部分 WebKit 的源代码,看懂里面一些 C++ 的特定模式这样写是几个意思,可以去看一些自己好奇过的底层实现,也可以为 Node.js 写 C++ 的 add-on。学习了操作系统、编译原理和计算机网络,就可以有选择地去阅读 libuv 和 V8 的代码,了解 Node.js 的架构,对自己使用的这些东西有更深入的了解,而不是停留在“知其然而不知其所以然的层面”。如果我没有在 C++ 和相关的构建体系上花费足够的精力,可能就很难去研究这些东西。

再比如说学过了数据库系统原理,我就知道自己搭后端的时候 MongoDB 和 MySQL 都在对我的电脑干嘛,IndexedDB 又是怎么回事,它们不再是纯粹的黑盒子。接触了 C++11 与 C++14,认识了 Haskell 和玩了一些其他语言,在各科作业里大量使用 Python,对编程语言有了一定了解之后,再去接触 ES6、CoffeeScript 之类的语言会觉得非常自然,很多概念都不需要太多学习成本,因为你已经在其他语言里遇到过了。使用过 Make/Maven 之类的工具再看 Grunt/Gulp,使用过 gtest/JUnit 之类的单元测试框架再去看 Mocha/Karma,了解过Python/Ruby/Haskell的模块机制再去看 JavaScript 的各种模块方案,也都更容易融会贯通。

事后其实比较庆幸自己的大二没有像其他一些同学一样在做外包上花费太多时间,因为对我来说大二学习的这些基础知识和不分语言的知识感觉更加重要,它们更多是 timeless 的,在我深入学习各种领域知识的过程中能发挥更大的作用。这也是为什么我觉得计算机基础对前端很重要的原因,这些基础知识可以帮助你在各种地方深入地去玩,而不是浅尝辄止。

现在处于大三下学期,开始对计算机图形学产生了兴趣(原因是逛到了 发现原来他们这么酷啊……),选修了相关课程,捡起了好久没用过的线性代数,为了能够让做出的东西有更好的表现力和交互,指不准什么时候还要用到数字图像处理与计算机视觉的知识。尝试用 MEAN 的架构去完(tou)成(lan)一些课程作业,在虚拟现实的课程作业里自己搭后端配数据库,用 WebGL 做了一个可交互的 3D 书架,按照老师的脑洞还会加入更多更酷的东西,貌似又打开了一扇新世界的大门……

我从大二开始把自己的作业、笔记、和一些玩具都放到了 GitHub 上,因为申请了教育账号有 private repo,在 deadline 截止前不公开 repo 就不会有被人抄的后顾之忧。其实我个人认为把作业放到 GitHub 上是一件好事,GitHub 本身也鼓励计算机专业学生这样做(所以才会有教育计划)。我的一些笔记和对一些论文、经典算法的实现也帮助到了一些人,也有一些素昧平生的外国人来 star。我自己在做一些难度比较大的作业的时候,也会去 GitHub 上找参考。一般素不相识的人的参考实现跟你实际布置的作业要求会差很远,但是你可以借鉴他们的思路和一些优化,总之有学到东西就是好事。我选的课程比较杂,除了常见的数据库、编译原理等必修课作业之外,写过 Hadoop Streaming、傅里叶变换和各种图像滤镜、爬虫、神经网络之类各种杂七杂八的东西。这些东西可能看上去跟我感兴趣的前端方向没有太大的交集,但是在解决这些问题的过程中学习到的编程、设计、调试、构建的经验是不分领域,可以用于前端的。我的作业一般都会有比较详细的 README,或者先空着到假期再补,既方便搜到我的 repo 的人看懂,也锻炼了自己写文档的技巧(因为我们专业要求双语教学,很多TA布置作业的说明都是用英文的,我一般也会顺手呼应写英文的文档)。同时,因为前端流行用 Git 管理代码,如果熟悉用 Git 做版本控制,将来工作也会降低一些学习成本,而且放在 GitHub 上的话你的 commit 记录还可以给 TA 看(虽然他们貌似都不看的哈哈哈哈……)。虽然比较惭愧的是没有给开源项目交过什么 pull request(偶尔遇到过自己不得不动手魔改的一些包都没好意思给人交 pull request = =||),希望以后可以去交点……

有大段空白的一般是跑去做不能公开的东西or期末考试修罗场or纯粹犯懒……如果颜色特别深一般是我乌龙了蛤蛤蛤蛤……
我不是计算机相关专业出身所以OOO……

其实我觉得在想学计算机基础知识的前提下,是不是计算机专业出身真的没什么太大关系。就拿操作系统来说,计算机专业也可以有一个听了 17 周每周一念 PPT,平时做点概念题,然后期末花 1 周里的大约两三天时间突击各种常见题型,最后拿个八九十分的人;而非计算机专业也可以有把 《Modern Operating Systems》 或者 《Operating System Concepts》 刷完一遍,把 PINTOS 做一遍,再去看 Linux kernel 源代码并且 tweak 着玩的人。两者水平孰优孰劣大概不言而喻……除非你要搞科研发 paper,否则是否计算机专业出身真的没那么重要。


计算机基础对前端来说没那么重要

我个人是很讨厌“因为我是前端,所以我计算机基础不好也没关系”这种想法的,就跟我讨厌“因为我是女生,所以我编程水平不好也很正常”这种想法一样,这些都是在自己给自己画地为牢。人都是有惰性的,只要你给自己找了个这样的理由,你就会慢慢用这个理由给自己洗脑,如果你没有其他的动力推进自己,它很容易就会变成不思进取的借口。

在和其他面试官/认识的前端交流的时候我也思考过前端未来的路到底在哪里的问题。想一想90年代的前端技术,再看看现在的前端技术,再想象一下二十年后的前端技术,联系一下现在移动端与前端的竞争关系,以及各国开始鼓励全民编程的风气,我自己是觉得如果没有足够的计算机基础支撑,单纯的前端可能再过十年就再也跟不上技术的进化,或者泯然众人矣了……

我要回帖

更多关于 百度大家还在搜 的文章

 

随机推荐