时代变了
话说我上一家公司就是那种—想招聘个高级前端开发人员但是又没什么钱的小企业。
这种企业真的很多,给的薪资不高,但活儿是真的很多。
如果时间能倒退五年,你只会用html+css做一个静态页面都能很轻松的找到工作。可是现在呢,你的简历甚至都没人会看。
为什么会这样呢?
通过这几道题,希望能给正在找工作或者想要换工作的你一些启示。
第一题
你理解的前端开发是干什么的?
2013年冬天我刚来北京的时候,面试到处碰壁的我还没有找到地方住,饿了就在地铁口买几个包子吃,风嗖嗖的往我脖子里面灌。
电话响了,是我妈打来的。
她问我工作找的怎么样了,我说,面试的不错,过几天就上班了。
其实那个时候,我才干过几天所谓的前端开发。过去是学平面设计的我,对代码根本就是一知半解,我做网页就是用dreamweaver在设计模式里面插入一个表格,然后把图切成一段段的插入进去。
后来我终于找到了一份工作,在一个小公司做网页设计,设计完了切一个静态页面给程序员套程序。
那时候所谓的套程序就是用dedecms把静态页面里的内容用标签替换掉。
也可能就是我这个人脑子笨,我就不明白,为什么网站开发要分为前端和后端,设计算前端吗,还有那些安卓开发和ios开发,他们算什么开发人员?
在碰了无数次壁,换了无数个公司,无数个领导以后。
我想我已经可以回答你这个问题了,只要是用户能感知到,看到的,体验到的,都是前端。
我们使用的html,css,js—这些都是为了实现前端展现所用的手段。就好比你在小程序中开发的wxss和wxml一样,不论它是什么媒介,什么语言。
前端开发就是开发展现给用户看到的那部分内容。
第二题
mvc和mvvm开发模式的区别是什么
在做了无数个静态页面以后,我就想搞清楚一个问题,那些java和php开发人员,拿了我的静态页面到底干什么去了。
后来我发现,无论是php还是jsp都是一种把服务器端语法嵌入到html中运行的语言。因为你传输给用户浏览器的肯定还是html。
因为浏览器只能解析html。
可是问题就来了,编程语言不可能只为了前端展示服务,它必定还有一部分是要处理逻辑的,有了逻辑部分,你还要有一部分处理连接数据库,好让数据持久化。
好的,那么我们为什么不制定一个规范,把视图处理,逻辑处理和数据储存这三个操作分开呢?
于是像thinkphp这一类的框架就诞生了。他们最大的特色就是基于我们上面的理论,把视图,控制器和模型分开,于是mvc就诞生了。
mvvm设计模式就是把逻辑部分移到了前端完成,这一点当我学会使用vue以后才大彻大悟,后端处理数据解构的操作减轻了,但是前端特么的复杂了!
我不但需要在前端解构数据,我还要想办法解决页面静态化的问题和用户体验。所以当一个人告诉你,前端没什么技术含量,后端应该比前端工资高的时候,说明这个人一点也不懂前端!
当我学会php和nodejs以后,我终于可以回答你这个问题,mvc和mvvm的最大区别就是,在mvvm中,实现了数据驱动视图,前后端完全分离。如果route和数据解构是在前端完成的,那它就是一个mvvm结构的项目。
第三题
为什么在移动端网页用touchstart而不是click
时代在变化,很快我们就进入了h5一统江湖的时代。
我记得当时我需要做一个h5用于微信中播放的贺卡页面,结果有的同事就发现,按钮在手机上好像不是特别灵敏。有的时候点了要等一会才有响应。
我一开始以为是代码问题,但是很快排除了,因为在这个页面上逻辑部分非常的简单,不存在执行效率的问题。最后发现是onclick导致的。
因为这个onclick是pc端的事件,在移动端会存在一个3毫秒的响应延迟。需要换成ontouchstart为移动端专用。
不过你要注意,这个时候,在你pc端是无法触发这个事件的。
第四题
你如何解决vue项目无法被百度搜索引擎收录的问题?
有一次我去面试,对方公司的态度似乎是对目前主流的这几个js框架非常的抵触,细问之下,原来对方是做商城的。
做商城就不得不考虑商品能不能被百度自然收录,然而,做为主流spa框架,vue做的页面想获取自然流量简直就是天方夜谭。
对方也不可能烧钱去做推广。
然而问题就出来了,作为一个前端开发,你如何解决这个问题?
我一开始提出的是用vue插件prerender-spa-plugin来解决问题。所幸对方在这个问题上也没有深究。最后不了了之。
因为我们都知道—这只是一个治标不治本的解决办法。prerender-spa-plugin可以按照route去生成html,但是,我们都知道,详情页是无法生成的,只有列表页被生成了html,而且内容那块还是空的,因为我们的数据都是ajax来的。
这样问题就出现了,如果不是每个链接都是一个实打实的html静态页面。那怎么样被百度收录呢?
直到我遇见了nuxt。一切问题都解决了。nuxt是一个ssr框架,它可以根据你的动态route把获取到的内容自动生成html,ajax的数据在async中,并不是动态获取的,但在开发时,使用spa模式,提高效率,nuxt是基于vue内核的,这是一个两全其美的解决方案。
第五题
我能不能在微信小程序的地图或者视频上,悬浮一个自己的按钮?
首先我们先来判断一下,这个操作能实现吗。
有的人说不能实现,他们的理由是,地图是map,视频是video,这都不是普通的html标签,他们本身会占用一部分浏览器或应用资源,是完全脱离文档流的,所以你想用文档流里面的内容去覆盖它,是不能实现的。
咱们先不说对不对。
先说那些认为能实现的人的想法:
“看到这个问题,我们脑子里第一个想到的肯定是:给view的css里面来个position,再加一个absolute。搞定了。”
事实真的这么简单吗?
首先我需要肯定一点,这个操作是可以实现的。微信小程序虽然底层是模拟了一套浏览器语法和行为,但是它本身并不是浏览器,所以dom并不存在的。
当我们翻看小程序api手册,会发现有这样一个标签cover-view。它比view就多了一个cover,但多了这个表示的意义就完全不同了。
在小程序中只有模拟层和原生组件一说,我们写的view都是在模拟层中的,原生组件会无条件的覆盖在模拟层之上,所以就出现了这个cover-view覆盖层组件。
第六题
假如我想要做一个抽奖的小游戏,你选择用canva还是dom?
其实我觉得大部分人不选择canvas的原因,并不是因为抽奖这种东西用dom比较方便,而是他们压根就不会canvas技术。
你在面试的时候就要非常小心这个,不会没关系,但是你一定要知道为什么我们需要这个技术。
首先我们需要知道dom是什么,dom就是浏览器中的文档节点,类似<body><p>这些,都是节点点。
遍历节点,是一种非常消耗浏览器资源的操作。于是canvas取代了flash现在大行其道,很多小游戏都是基于canvas制作出来的,有一个非常著名的游戏引擎白鹭,你可以去了解一下。
然后,我们就可以肯定说,一定是用canvas了。
canvas是通过调用显卡,把画面一帧一帧绘制到浏览器中的,而dom走的是计算机内存。内存和显卡,想都不用想,肯定是显卡快了。要不然那些比特币挖矿机为什么烧的是显卡而不是内存呢。
这只是一个思路的问题,真正的面试对方不会去考你,比如一个函数怎么写,有几个参数,参数干什么用的。大部分时候他们也记不住,走phpstrom提示或者用的时候再去查。
但是大方向上你不能错,你最起码应该知道,遇到什么问题,用什么方式解决。
第七题
谈谈你对es6的了解?
如果说前面的题都是考察你思路上如何应对各种情况,那么这道题就深入前端开发工程师灵魂了。
如果你没有经历过es5那个年代,你可能真的不太好答这个问题。
大部分人可能会说,es6比如扩展运算符,比如箭头函数,比如export和import。他们甚至能给你写个例子。但是我打包票他们大部分人不知道为什么es6拥有这些特征。
我在第二家公司里面待了三年多,那个时候前端保持jquery+bootstrap做静态页面不动摇的政策,后端再用静态页面做成一个jsp。
三年时间让我和时代的发展迅速脱节。我以为js,就是用来渲染页面,做几个页面交互效果的。
可是我错了。
前后端分离开发的诞生,webpack和gulp的崛起,让react,angular,vue等框架迅速成为各个公司开发的主流方式—我真的不知道前端开发能做这么多事。
我当时一度认为脱离了开发工具和代码提示我什么也做不出来。
现在不在doc窗口面输入自动化命令我都感觉自己的项目非常的low。
可能你会问,你讲的这些跟es6有关系吗。我得说,太有关系了,es6中新增的export和import为模块化复用代码复用打下了基础,另外extend替代了apply和call,class让原来的类更像是编程语言而不是脚本语言了。
另外,箭头函数并不仅仅是缩写,它最关键的在于解决了,this在函数体的指针指向问题。
展开运算符让数据解构变得更加简单了。
仅仅这些吗?当然不是,es6中提出了一个叫promise的东东,这玩意的强大之处让你不用在异步函数里面一个一个去回调了。
第八题
你熟悉哪些后端语言?
其实我们很多时候,我们经常听说一个词,叫架构师。那么什么是架构呢,这东西跟我们前端有什么关系吗?
lamp是一种架构,但其实说白了就是linux服务器+apache web服务+mysql数据库+php服务器编程语法。有了这一套你就可以架设一个自己的网站。
这里你可能会疑惑,为什么龙哥说的这么简单但是我搞起来却这么难呢?
因为你没有找到捷径。
比如说我们下载一个phpstudy你可以直接省去你买的那个php书最少前面一章的内容,你先别管怎么去配置,先做一个基础的页面再说。
先跑起来!然后运用你的前端知识去倒推后端。然后你做一个购物车或者一个商城,你最起码也能掌握90%的后端基础内容。
接着你就会发现,无论是java,php还是nodejs,他们提供的操作都大同小异,除了写法不一样以外其实也没什么稀奇的。
所以面试官考你这个问题,也只不过就是想看看你有没有后端的思维,毕竟跟你合作的还有后端开发人员。
再聊几句
你对薪资有什么要求?
其实我觉得,当一个面试官而非人事问你这个问题,是很不负责任的。
因为面试官很可能就是你以后的同事,你比他工资高或者低,都会对以后的共事产生一些影响,所以到这里,你就要对自己和公司环境有一个评估。
如果你觉得你之前的薪资已经不能代表你的能力了,你应该要求适当加薪,并且跟对方说明你加薪的理由。假如,你之前每个月薪资10K,你要求11-12k上下是完全合理的,即你原始薪资的10-15%上下的提升。
千万不要从一家公司出来以后就觉得自己已经翅膀硬了,可以随便要价了。之前就听说过,程序员跳槽后要求加薪三倍的新闻。你突然提出加薪幅度超过你原始工资太多以后,对方必定会对你的目的和心理产生一定程度的戒备。
双方带着提防和戒备的心态去谈薪资,找工作就成了一幢买卖。尤其是在经济环境不太好的时候,对方可能就会给你一次要价的机会,你一旦喊出了一个不切实际的价格,对方从心底就已经把你拒绝了。
值得一提的是
这家公司值不值得我去,我到底想要什么?
你一定要注意,对方的提问是不是围绕着他们公司目前所做项目上的。
而不是上来给你一套题,然后根据你的答案对你指指点点的。如果真是这样,对方八成是没有真心想要招人,最起码,他们对用人的渴望没有那么的迫切。就算你做的很好,他们也会在薪资上进行比较,那样你的机会就很渺茫了。
所以综上所述,当我们遇到了一个迫切需要你这方面人才的公司,你并且也感觉对可以在这里学到一些知识,环境也还可以的时候。你应该慎重评估自己接下来的行为。
对方也认为你不错,但是感觉你索要的薪资偏高,你能不能稍微做一些妥协?
毕竟我们都是出来打工的,直接目的,说白了就是为了钱。为了钱你能不能忍受恶劣的工作环境和是非不分的领导?
还是你只是想过一些平淡的生活?
这些东西,可能随着时间推移,我们慢慢的才能知道自己到底想要什么。