我对知乎前端相关问题的十问十答

这篇文章发布于 2017年06月2日,星期五,02:03,归类于 Web综合。 阅读 127645 次, 今日 4 次 153 条评论

 

之前知乎上有不少同行邀请我回答一些前端相关问题,但是,大家都知道了,要认真回答一个问题是需要大量时间和精力的,对于还在不断学习积累阶段的我,时不时分散原本的精力,打乱自己原本的节奏,实际上是一件不划算的事情。就好像邮件或者微信,来一条信息,你就去看一下,时间和精力都会大大分散,工作和学习效率必然会大打折扣。所以我的策略是一段时间后专门花时间统一处理,这样时间利用率会更高,投入产出比会更大。

对于知乎上的这些前端的问题,我也打算采用同样的套路,趁着端午节前还有两个晚上的自由时间(当晚修正:两个晚上绝对搞不定,怕要月底前才能全部写好),决定抽十个比较具有代表性,自己能够驾驭的前端问题统一作答。

问题一、前端现在怎么这么多人?

原问题地址是:https://www.zhihu.com/question/55886635

问题描述如下:

投出去的简历没有人看了

web前端开发人很多截图

我的回答:

想来想去,还是从一个非前端领域的切身故事说起吧。

我的老家江苏泰兴是中国银杏之乡,产量全国1/3,而我外公家宣堡镇除了小馄饨出门,还是就是中国银杏第一乡的美称。在我小的时候,银杏的药用价值和使用价值被发掘,银杏价格突然猛增,那个时候的银杏树是没有人专门种植的,全部都是很早很早以前的那些老树,百年以上的比比皆是,或者说全部都是又大又粗的银杏树(见下图),那个时候银杏30~50元每斤,20年前的30元相当于现在300元,而一颗百年银杏大树一年可以产上千斤的银杏,按照现在的购买力,相当于一棵树可以给一个家庭带来年收入30万,所以那个年代相亲,听说市区有套房,恩,还行!听说家里有个百年银杏树,靠,直接就成了!当时一粒指头大的白果就可以卖几毛钱,可以换一斤西瓜。以至于银杏成熟的时候,银杏树拥有者(我家田里的就是我的)会在外面通宵守着。

银杏树

一看这玩意儿值钱,政府又鼓励,于是家家户户,真的是家家户户,包括我外公,屋子前面和屋后面地全部嫁接了的银杏树,好多好多颗,但是树这东西啊,它不是一嫁接就能成熟的,没个3,5年,花都看不到一个。然后前几年国庆回去看望,银杏成熟季节,结果发现家家户户银杏树上都挂着黄灿灿成熟的银杏果,很是奇怪,怎么还不收啊?

后来跟外公聊天才知道,现在银杏才一块多钱一斤,扣除打果子,蜕皮等一系列人力成本,完全就是亏本的买卖,所以大家全部都让果子挂在树上,自然掉落,然后烂在地里,甚至很多人,直接把好不容易长大的银杏树直接砍了,又种起了红薯花生。

我觉得前端人为什么现在这么多,和银杏树一下子这么多是类似的。

本质上市场需求导致的。

一个是移动web的兴起(本质上是多端的出现),二是Node.js发展带来的诸如大前端的发展,三是我国的互联网还在快速发展阶段,包括很多传统行业的转型等。

就好像智能手机兴起的那会儿,iOS开发以及Android开发需求很旺盛,而导致后来相关开发人员过盛是一样的。

历史总是惊人的相似,但却又无法避免。

毕竟互联网行业的工资,确实比其他行业要高很多,一旦市场出现某个巨大的职位缺口,自然会有很多人涌向这一块蛋糕,来的早还好,还能吃到一口蛋糕。就像股市一样的,有些人敏锐,牛市起来的时候跟进,但大多数人都是在大家都已经知道事物很火的时候跟进的,承受的往往是低收益和高风险。

所以,当知乎上开始出现“前端现在怎么这么多人”这样的问题的时候,已经预示着市场开始饱和,那些趁着春风,听着前端很火,看着工资很高才进入这个行业的小伙伴就和牛市到头进入股市,别人银杏赚钱也跟着种银杏树的人一样,必然要面对贬值和风险两大问题。

在市场面前,我们其实都是商品。

当市场趋于稳定,最终能够摆在货架上的,还是那些真材实料的商品。所谓大浪淘沙,去粗取精,时间会证明一切,其实也是同样的意思。

所以,提这个问题的小伙伴,你应该意识到问题不在于前端有这么多人,而应该意识到自己在前端这一块的造诣还不行,意图趁着春风进入某个行业,并且有大成,这种概率非常小,因为职业生涯它是一个长期的过程,就算你趁着行业需求紧缺进入这个行业,你自身能力不过关,永远都会停留在这个位置,会逐渐沦为边缘角色,生活不一定开心的。

你想啊,如果你比大部分人都优秀,能力比大部分人都强,再多人进入这个行业也不需要担心,所以其实最重要的是,安下心来好好的把自己的前端知识给打牢了,基础学扎实了学系统了,千万不要有什么一夜暴富的想法,群体一定会发生小概率事件,但是是不会发生在你这个个体上的。

我当年大学毕业的时候,前端这一块的积累其实已经比很多人都多了,但我还是辞去工作,无业闭关学习了9个月的基础知识,你看我现在已经30出头了,虽然还是在一线,但是根本就不会担心小鲜肉顶替了自己的位置,因为内功足够扎实,这些东西呢,才是真正经得起时间考验的。

所以,如果当你们静下心来更关注自身成长的时候,说不定哪天一抬头,嘿,物联网兴起了,需要大量前端职位;人工智能兴起了,又来了前端职位;JS已经深入到生物基因工程领域了,又是高薪职位。

此时的你,站在了牛市的起点,自己就是一颗巨大健壮的银杏树,而银杏的价格又很高很高……

而银杏的故事其实还没完,很多农户把自己的银杏树砍掉重新种了普通庄稼,所以这几年银杏价格就开始节节攀升……所以简历无人问津,不要担心,你再坚持个一两年,一定会有新的机会的!

问题二、Web前端的路该怎么走?

原问题地址是:https://www.zhihu.com/question/34388831

问题描述如下:

刚刚毕业,在公司一直做的是前端开发,之前都是自己去学习一些基础的前端知识(html+css+js)。到现在越来越迷茫,不知道自己该去学哪方面的。 在学校学的都是一些基础知识,毕业之后自己自学了JavaScript,在这个公司,要求不高能搭页面就行,可是我想提升自己。.求各位前辈指点!

我的回答:
想要提升的想法是对的。企业对员工的要求就是搭页面,只会是下面两种情况:1. 页面质量各方面都是top级别,交给你实现可以收益最大化;2. 你技术能力仅限搭个页面,其他活交给你不放心。由于你刚毕业,我想你应该是第二种,所以,如果你满足于现状,必然对自己职业发展是非常不利的,任何可以被轻易替换的职位都是不具有竞争力的,搭页面就是IT行业门槛最低的职位,没有之一,虽然实际上要想搭的好需要很多积累,但是,对于大多数企业,大部分用户,大部分场景,只需要页面视觉过得去就可以,而这种程度的要求实在太好实现了,而太多入行的新人都是这种程度,导致“问题一”的出现。

从理论上讲,只要你HTML和CSS足够精通,页面足够好,也是可以进入很好的单位,有不错的发展。但是,很难,对于大多数同学而言,往往是条不归路,所谓一叶蔽目,不见泰山,简单和舒适容易让人忽略的对边界和底层的不断探索,以及即使是大公司,也不希望你化太多精力在收益不直接不明显的事情上,所谓人在江湖,身不由己,因此很难坚持下来。

所以,我的建议是优先投入精力在JS的学习上,学习一定要系统,一定要是基础知识。

学习有经验式学习和系统学习两种。经验式可以收获书本上没有的一些知识,例如微信浏览器下的坑,以及知识具有极高概率的重复利用可能性,可以说是投入产出比非常高的一种学习方式;但是不足也很明显,一是学到的知识比较狭隘,拿搭页面举例,常用的CSS颠来倒去就那些,以至于很多小伙伴都没见过unicode-bidi等CSS属性;第二个是工作效率其实并不高,一旦遇到之前没有接触过的场景或者需求,就会不知从何下手,百之谷之问人之,大把时间都被耗掉了;第三个就是技术实现往往不是最优解,举例来说,想要知道A元素是否包含B元素。以前工作经历让我们知道parentElement可以获得父元素,于是,说不定就会写一个不断遍历父元素判断元素是否包含的方法。写的人自以为写了个很厉害的方法,殊不知,浏览器,包括低版本IE都天然支持元素是否包含的DOM方法contains

而系统学习是成为一个技术能手所必须的,全部知识点在脑中(或者有印象),自然想要实现什么手到擒来。然而系统学习却是很枯燥,很花时间,有些知识可能一辈子都用不到几次,平均下来,似乎是个投入很大产出效率并不高的买卖。人总是喜欢舒适讨厌无用功的付出,因此,有非常多的开发人员的知识都是经验式学习,然后1年经验3年用,然后中年危机。

“基础知识”是相对上层工具或者应用而言的,例如,最近Vue很火,对于刚毕业的你,且公司又不需要你写Vue, 因此,Vue哪怕被说到天上去,也不要去学习,抓紧时间学习JS基础知识,原生的那些东西。

虽然前面讲过学习要系统,但是,JS知识点那么多,如果每个知识点都花大把功夫去学习,且不说能不能学懂,怕是压根腾不出这么多业余时间吧。因此,很有必要指出哪些内容是适合你当下学习的,否则学习无重点像无头苍蝇,很容易陷入迷茫的。

非计算机专业背景学习JS要点:

  1. 非常重要:先要对JS这门语言要有整体、感性的认识;
  2. 掌握JS中的字符串、函数、对象、数组、字面量等基本概念,熟记所有内置的方法(包括参数和返回值);
  3. 所有继承和原型相关内容跳过,注意,是跳过,不要看!没有这些JS一样可以活得很好,你的日常工作一样玩得飞起,当然,你没忍住看了相关知识也没关系,因为你会发现自己看不懂的;
  4. DOM事件和所有DOM方法一定要掌握的牢不可破;
  5. 学好正则表达式;

然而,要记住JS所有字符串、函数、数组相关的方法,所有DOM相关方法是相当庞大的一项工作,因为,很容易忘记,方法也很简单,所谓好记性不如烂笔头。把编辑器的JS自带补全提示干掉,从小交互开始,尝试使用原生的JS书写,写着写着,一定就会记住了,这是最快学习成长的方法。

学习的过程一定是带有痛苦的,并且漫长的,千万不要出现类似“《JavaScript高级程序设计》和《JavaScript语言精粹》我都看完了,接下来我要学什么的言论”?你以为你是黄蓉啊,看一眼就记住啦!反复看,看完肯定会忘记,忘记了再看,我也是看这两本书学习JS的,《JavaScript高级程序设计》这本书已经被我翻到掉页了,《JavaScript语言精粹》上面满满的笔记,哪个知识点不记得了,基本上一翻就可以准确到对应的页数,因为也是翻了太多遍了。

最终学习是否成功的关键在于“坚持”。

在一个相对公平的环境下,想要超越他人,只要能够完成他人完成不了的事情就可以了。大多数非计算机背景前端从业人员对于JS的系统学习是很难坚持下来的,时间长,收益缓慢,但是,如果你坚持下来了,你就超越了这些人,你就不是一抓一大把的页面仔,而真正能独当一面抢手的前端开发了,完成了前端开发领域的阶级跨越。如果你学习的时候像放弃,想想前面这句话,或许就又有了额外的动力。

问题三、前端开发基础扎实的标准是什么?

原问题地址是:https://www.zhihu.com/question/38922374

问题描述如下:

1.题主妹子,现在在培训学习前端,看到有人说不要培训出来的程序员,因为基础不扎实,自学能力差等,让我不得不重视这个问题;
2.题主上一份工作是做招聘的,也了解过,有的企业是不要自学的,因为没有经过系统学习,基础也不扎实,但是有人又说会喜欢自学的人多过培训的。
3.感慨就是这个世界好复杂,每个人想要的都不一样啊,那其实唯一的标准就是基础好不好嘛?

那问题来了:
对于前端,或者其他的IT岗位而言,怎样才算基础扎实呢?

我的回答:
这个问题我们其实可以通过咬文嚼字来理解,首先要明白什么是“基础”,然后理解什么是“扎实”。

“基础”汉字表形上有“土”“石”“山”,原本用在建筑构造上,由于地球重力的存在,现代建筑都是从下往上建的,而最下面这个用来稳固建筑的这个底层就是“基础”。众所周知,建筑越高,基础一定要越牢固,否则就会出现“眼看他起朱楼,眼看他楼塌了”的情况。在这世界上有非常非常多的东西都是从无到有建立起来的,就跟一栋建筑的拔地而起是一样的,先有个底子,然后再慢慢的往上添加东西,最终形成一个完整事物,而这个“底子”,我们也称之为“基础”,可以看成是事物发展的立命之本。

其中个人技能成长,就是非常典型的一个从无到有建立的过程,比如说打篮球,篮球规则,运球,定点投篮等就属于非常基本的东西,我们就可以称之为“基础”,就算篮球之神迈克尔乔丹也是踩着这些基础成长起来的;又比方说前端开发,在接触这玩意之前,大家显然都是一无所知的,到后来祝那个玩出点花样来,这个从无到有的过程也必然伴随着一些称之为“基础”的东西在里面,那到底是什么东西呢?

回到这个问题本身,目前行业中前端开发其实分两类,一类是偏逻辑系的,一支也是偏视觉系的,无论是哪个系的,基础都离不开HTML,CSS和JavaScript的,但不同系别最基础东西有差异,如果是偏逻辑系的,基础中的基础是JavaScript,至于逻辑思维能力和抽象能力,并不是基础,而是天赋,基础是通过努力可以夯实的,如果无论怎么努力也夯实不了,那就不能称之为基础;如果是视觉系的,基础中的基础就是HTML,没错,是HTML,不是CSS,虽然CSS出镜频率甩了HTML好几条街,但是,最基础的是HTML,自带行为和样式,前端中的前端。同样的审美能力和具象能力也不是基础,这东西天生的,很难练出来。

提问的妹子上一份工作是做招聘的,根据我其实不太靠谱的经验式猜测,妹子应该是走视觉系的,那前端基础排序应该是HTML > CSS > JavaScript。大家千万不要有这样一个误区,认为基础的重要程度是和学习时间成正比的,其实不是这样子的。很多人学HTML估计就几周时间,觉得学得很不错了,简历上可以写“精通”二字,因为最终的效果好像确实和预期的一样,我说这个并不是想吐槽这些人“槑”,而是想表达的是HTML这门语言相当的厉害,这绝对是一个会非常长盛的语言,因为其重要同时上手非常的简单,并且随着发展,说不定以后会一统万端。

这个问题的重点其实是“扎实”。先说说“实”吧,拿大米举例,我们盛了满满的一碗饭,用勺子再压一压,我们会觉得米饭很“扎实”,很管饱,但是我想从来不会有人觉得一碗粥很“扎实”吧,为什么呢?粥里面虽然也有米饭,但其实百分之八九十都是水,水大家都知道的,进到肚子里一会儿一泡尿一撒就没了……

基础知识的学习其实也是类似的,所以“实”,就是要满,就是要没有间隙,就是没有水分在里面。假设请问那些基础知识,无论HTML,CSS还是JavaScript,我们都看成是一碗米,那我们花两周速成那些知识,或者说平时项目开发所用的那些知识所代表的米粒顶多就一碗粥里面米饭的量,虽然吃的时候管饱,你以为好像知道了全世界,但实际上你知道的永远是碗里面那一小撮米而已,这就是不够“实”。

因此,所谓“实”,就是从中心到边界全部一个不落的进行细致的了解,比如说举个很简单的例子,是我问过我厂实习生的问题:“CSS vertical-align支持几个关键的属性值?CSS vertical-align支不支持负值?CSS vertical-align百分比值是相对哪个属性计算的?”

CSS vertical-align属性大家肯定都用过,一定是middle用的最多,有时候也会用用top或者bottom,然后有太多的人就会认为vertical-align:top/middle/bottom就是vertical-align属性的全世界,这就是典型的CSS前端知识不扎实,想要扎实非常简单,MDN文档看起来。HTML中有非常多的标签和属性,有新标签字的行为,有些属性自带行为,还有些属性自带样式,且影响无障碍访问,想要“实”,文档一个一个看过来,一定要一个不落,要记住;CSS那么多属性,默认值是什么,支持的属性值是什么,定义是什么,都是非常简单的不需要逻辑思维的东西,全部一个不拉记住。于是你会发现这些其实非常表面的一些东西,你花两周时间是根本来不及看的,我想很多人两年都看不完,或者说根本就看不下来,静不下心来,眼睛速度一扫,恩,我知道了,这些东西,好简单,其实屁什么都看不出来,就好像自己写的文章中的错别字,有时候复查个十几遍都看不出来。要想从简单的自以为了解的东西中看出一些不一样的东西出来,这个其实是需要天赋的,心态,专注度等都有关系。

所以,虽然我这里对这个问题进行了用心的回答,但是最终能带来多少好的结果我其实是保持极大的怀疑的。

最后,回答一下“扎”,“实”为“满”,可以理解为广度,“扎”则可以理解为深度,我们可以看两张图片,形象的感受一下这个“扎”这个动作:

扎水捕鱼 容嬷嬷扎针

也就是说基础扎实的另外一层意思就是要“进入水下”,“深入肌肤”,也就是说,我们除了要熟记表面的那些定义啊,语法啊,参数啊,还需要多思考,为什么这样设计?为什么会有这样的表现?

举个简单例子,我们或多或少都听说话,写页面要符合W3C标准,HTML一定要要语义化,但不知道大家有没有想过为什么要注意语义化?这其中背后的原因就是“扎”。

如果我们把前端基础知识点比多人的话,所以前端基础扎实,包括:在座所有的人我都知道你们的名字是什么,你们的父母叫什么,在什么地方上班,星座是什么,特长是什么;甚至我还知道你为什么你会叫这个名字,你为什么会有这样的性格。

发现没,“前端基础知识”这几个字看上去好像很简单,但实际上真的要做好其实是非常难的。HTML,CSS和JavaScript分属三门不同的语言,每门语言都有非常多的基础知识,要想全部记住并能自如在项目中选项应用,那一定是需要大量的时间学习和积累的。

但是如果你积累到一定程度,犹如万丈高楼一样,有非常好的基础,日后在前端领域,尤其技术这一块,日后的高度一定非常可观,而且持续上升。并且无形中会从一个前端使用者变成一个前端创造者,成为一个真正的高级前端开发人员,成为行业的香饽饽。

问题四、前端新人的迷茫?

原问题地址是:https://www.zhihu.com/question/54440732

问题描述如下:

大二,学前端大半年了,html,css,js,jq,less,bootstrap这些不敢说精通,但也熟练掌握,项目也做了不少。最近学react的时候开始感觉力不从心了,之后再去了解webpack,npm,node等简直一脸懵逼,各种配置命令行根本看不懂,仿佛到了另一个世界。
到了这个阶段应该怎么继续学下去呢,是我基础知识不足的问题吗?

我的回答:
现在的年轻人啊,就是急躁。有句古话说的好,不识庐山真面目,只缘身在此山中。

如果单看问题表面,进行不下去,肯定是因为基础知识不足,主要是计算机基础理论知识,这个时候就可以看出计算机专业背景的优势以及其实JS掌握得很弱啦。

但我看的是,你可能在走一条错误的方向,或者说有种给人盲目学习的感觉。

我觉得我大学最大的收获是“自我认知”。我当时买了一本厚厚的心理学书,叫做《人格心理学》,读得非常认真,一页不落全部读完,几乎每一页都有笔记和心得。这本书是我人生中的一个转折点,它让我明白了,为什么我会如此特立独行,为什么性格会很罕见地分布在两个对立端,为什么内在更像女孩子,敏感细腻,喜欢和女孩子相处,喜欢听女生的歌(取向还是正常的哈),这种性格特质比例多少,这种性格的优势在哪里,不足在哪里等等。

“自我认知”带来的好处是更自信,内心更强大了,比方说一些说话刻薄的人说你是“变态”,你就可以大可不必放在心上,因为你自己知道你是什么一个人;你知道自己的不足在哪里,以后就可以知道从朝方面努力不断改正让自己变得更好;你知道你自己的特长在哪里,从哪方面发力更容易让你走得更高更远,学习的时候不会盲目,即使是一条别人没走过的路,也会坚持走下去。注意,最后这一点就是我想说的重点,所谓“人贵自知”,人的精力总是有限的,盲目地学习,甚至直接去硬啃自己当下啃不动的骨头,实际上是种无谓的消耗和浪费。在我看来,你学react除了让自我感觉良好以外,没有任何作用,如果你的目标是进入非常棒的前端团队的话。因为校招,甚至社招,基础绝对是更重要的。所以,我觉得你有必要好好想一想,我的专业是什么,我的兴趣是什么,我最强的特质是什么,既然你说你react力不从心,很显然,react这种东西在当下并不适合你,如果进一步本质分析,可能这辈子都不适合你。大学数年过得很快的,要想校招时候offer拿到手软,一定要进行基础攻坚,jq,less,bootstrap要学就不要学怎么使用,而是学人家的源码,为什么这么实现,如果看不懂,搞不明白,说明你html,css,js基础还很弱,离熟练掌握还差了好几条街,需要不断积累,再不断积累,会做几个项目鸟用都没有,和你竞争的那些前端哪个大学没做过几个项目,而校招名额就那几个。等什么时候,jq,bootstrap甚至react源码都看得懂了,恭喜你,你已经到了另一个世界,眼界和认知都脱胎换骨,即使是一些你自己都没注意的谈吐表达,都会很容易感受出不俗的技术造诣在里面!

所以呢,那些让你懵逼的东西就不要学了,了解下大概即可,好好扎实基础,参见问题三,这才是你的方向。

然后,对于在校学生,从概率上讲,深入JavaScript要比深入CSS入职概率高,但也有团队招CSS很厉害,JS毛毛雨的人,例如我们阅文集团,但这样的企业并不多。当然,如果要我说心里话,我是鼓励大家追寻自己的内心世界,不要被外部这些东西左右,做好自己,等待时机。但对于大部分人其实只想混口饭,给父母长长脸,功利些也无可厚非,面向职位面向热门前端开发也没什么不好的,乔布斯的名言“follow your heart”其实只适合有资本有能力的那些人。

问题五、① 前端工程师的价值体现在哪里?② 前端的意义是什么?

前一个问题地址是:https://www.zhihu.com/question/19589966
后一个问题地址是:https://www.zhihu.com/question/44812950
问题描述如下:

上一门必修课的时候,老师介绍了许多她的科研成果,感觉好高端。最后,老师让我们思考一下自己学计算机的意义是什么?难道就是为了写写网页?
我个人深知将网页写好多么的不容易。但是感觉所解决的问题貌似是可有可无的,即没有前端,我们好像也能使用好多的互联网功能。前端的意义是什么呢?仅仅是可以优化视觉效果,让用户用得开心(我承认这是很重要的一部分,想知道还有没有其他的)

由于两个问题答案本质上类似,因此,我统一作答。

我的回答
如果作为一个打工者角度来讲,前端的意义就是可以养家糊口。

而作为职业本身,前端的意义其实就如你说的,让人机交互这一块让用户更加愉悦。至于其他什么高大上的意义,其实并没有。前端工程师的价值其实也就是让用户在于机器交互的时候更加愉悦,让用户越来越喜欢,甚至在上面花钱,给企业创造价值。

你说如果你想要通过前端代码来改变世界,很难,除非你造个像jQuery这样的东西,也就让世界变化了那么一点点而已。

所以千万不要高估前端这个职位的价值和意义。有种效应叫做“禀赋效应”,指的是“当个人一旦拥有某项物品,那么他对该