yinguangyao / blog

关于 JavaScript 前端开发、工作经验的一点点总结。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于编程学习

yinguangyao opened this issue · comments

commented

本文来自工业聚在 React China 论坛的分享。

问答

  1. 工业聚大大您好。前一阶段参加了几次面试,有几个公司面试反馈说前端掌握的深度不够,这个问题我感觉很令人费解,但是也是我需要加深的方向。
    所以我想请问工业聚大大,向我们这种毕业1-3年的前端,该怎么做去加强自己在前端领域的深度呢,同时又能保持基本的技术广度呢?感谢您的回答!

    不管是技术深度还是广度,都依赖于一个扎实的技术基础。如果还没有通读过《JavaScript权威指南》、《JavaScript 高级程序设计》、《JavaScript DOM编程艺术》等经典书籍,可以开始啃起来了。

    然后,可以开始实现常见的 UI 和交互效果,比如轮播图,移动端的 swiper,Tab 切换,下拉刷新等等。每一种效果,都有从低到高的完成度。比如。轮播图里,有无小圆点切换,有无左右箭头,是否支持定时轮播,是否可以无限循环地轮播,是否支持移动端 touch 事件等等,都反映了你写的效果的完备性和完成度。不断地提高它们,同时也就打磨了 JS 编程能力。

    其他还有模板引擎(templte engine),lodash/underscore,jquery/zepto,react/vue 等不同类型的库或框架,先不看它们的源码,按照你对其 API 的理解,仿写一个最小可运行版本。再去看它们源码,印证你的实现跟原版实现的差异。

    技术的深度和广度,都是积累而来的,无法一蹴而就。如果没有相对严酷的历练,难以沉淀下来深刻的知识和领悟。

  2. 你好,工业聚。我想问下作为一个刚毕业半年的前端开发,有必要系统的去学习css3基础,JavaScript基础吗?意思是每当学习我一些东西,就做好记录,比如我会写博客。但感觉节奏很慢,比如3月打算将css3基础系统学习,一忙就基本把这个计划又推到下个月了,只做到一小部分。
    总结了一下,发现自己确实有点拖延症,而且容易被一些环境左右。我想问下对于初出茅庐的前端,如何克服这些问题。比如如何做一个好的规划,如何不要被一些环境所左右?谢谢。

    你的问题跟二楼的有点类似,可以参考对二楼的回答。

    这里可以再总结一下,我们可以回顾自己现在掌握的知识和技能,可以发现,绝大多数都来自于曾经的严酷训练(如高中彻夜复习、暑假集中培训等)。那是一段当时并不轻松,但回想起来很充实的状态。有人称之为「学习区」,在「学习区」我们不轻松但成长最快。在「舒适区」我们很轻松,但成长较慢;在「恐慌区」,我们无所适从,只想逃离。

    现在让你直接看 react/vue 的源码,可能直接进入了你的「恐慌区」,觉得自己水平很差、人很蠢。我们需要找到自己的「学习区」,每个阶段我们的学习区都是不同的。如果没有打好基础,那么「学习区」会一直停留在基础知识的层面,一进入更高领域,就会感到不适和恐慌。基础知识是每个学习者无法逃避的一个学习阶段,一定要通过某种方式突破它,并且这个方式一定不是轻松的(不是舒适区)。

    「拖延现象」是逃避有难度的事情,沉迷自己舒适区的一种行为表现。在现在信息碎片化和信息娱乐化的时代,让人立刻得到短暂愉悦(如看抖音、刷微博、微信等)的事物太多了。需要鼓起很大的意志,刻意让自己去做有难度的事情,并坚持去做。最后会有显著成长。

    先明确自己有要去改变的意愿,再强迫自己有尝试去改变的行为,并开始对自己的不作为,感到愤怒。从内心形成自趋力,最后形成习惯。初期必定痛苦,习惯之后可以体会到乐趣。

  3. 工业聚你好,我想问一下为什么 React 会废弃掉 componentWill* ?他们跟 fiber 和 suspend 有关系吗?谢谢!

    是的,主要跟 suspend 特性有关。

    react suspend 特性的实现机制是,重复执行 render 流程。第一次执行 render 时,fetcher.read 方法里的 promise 如果还没有 resolve,就 throw promise,终止此次渲染。然后进入 componentDidCatch 的阶段,catch 到 promise 后,在 promise.then 时,再次触发渲染流程。

    这个机制要求async-safe,类似于 restful api 里两次 get 请求预期拿到一样的结果,虽然第一次 get 被 abort 了,但不应该影响第二次 get 到的结果。

    上面说的是「重复执行 render 流程」,而非「重复执行 render 方法」,「render 流程」里包含 componentWillMount、componentWillReceiveProps 和 componentWillUpdate 等生命周期,如果在这些生命周期里操作了 component 实例的属性或调用了有副作用的方法,那么两次渲染流程就无法满足「幂等」要求。

    所以,干掉 will*,把 willReceiveProps 挪出到静态方法 getDerivedStateFromProps,可以防止开发者操作 component 实例,增加 async-safe 的安全性。

  4. 工业聚你好,我想了解一下,你是如何平衡事业、家庭、个人娱乐、个人能力提升、知识输出这几部分的精力和时间的?(你上次好像提到通过原始积累形成系统以后,可以让后续提升和知识输出的效率大幅提高,但是这个原始积累也是很花时间精力的啊,所以你那时候还是单身?)

    在前端领域我的技术积累,是由我的老婆(当时的女朋友)推动的。我之前对 IT 技术没什么了解,她认为我在这方面骨骼清奇,怂恿我去学习。

    原始积累的方式主要是两个:1)做 web 特效 demo 向她表达爱意;2)在她公司的楼下,等她加班完毕的间隙,看 web 领域的电子书,打下扎实的基础。

    我老婆比我优秀得多,我在平衡事业、家庭、娱乐等方面很弱,全靠她敲打。

  5. 您好!我想请问一下,非计算机相关专业自学的前端,现在大四在实习,想工作几年有机会跳槽去大厂,需要系统的学习一些后端的知识吗,比如数据库,算法等等,还有在工作项目中要多积累哪些方面,可以在简历上有亮点

    对前端来说,系统地学习后端知识,在求职阶段不是必要的;但一点都不了解,也不合适。适当了解一些。

    不必等工作几年再去考虑大厂,可以现在就去投,去面试,去考虑。即便面试被刷掉了,你也可以知道自己要满足大厂的要求,应该加强哪些方面。

  6. 你好,想请问在工作之外是如何安排时间去学习技术的?
    对你而言,工作内容和个人项目带给你的技术上的成长分别占比多少呢?
    感谢。

    在学习技术上,我是兴趣驱动的。学习技术,对我而言,跟玩撸啊撸,守望先锋等游戏有相似的乐趣,并且更不容易腻,成就感也更强。这是一个很好的状态,我不知道怎么进入了它,我希望后面可以一直保持住这种热情。

    我的成长 80% 发生在工作内容,个人项目只有 20% 的增益。但恰恰是个人项目,使我得到机会去付诸工作实践。所以从重要性来讲,个人项目里我的积累,也很重要。目前可以说是工作和业余的技术学习,对技术成长而言,同等重要。

  7. 你好,其实我一开始还想了几个问题去问你,不过转念一想都是 Google 能解决的,就不强问技术或者学习能力方面的了。
    就是闲聊一下,有没有什么技术或者知识对你来说只是 Just for fun 所以才去掌握的。

    这个问题非常好。在进入技术领域之前,我对数学、物理学、哲学、心理学以及演化论都很感兴趣,我认为它们是理解世界的不同维度,缺了任何一个,都缺少了一个重要的、不可替代的视角。

    我对技术的兴趣,也延续了上面的特征。计算机是另一个庞大的、重要的世界的体现,如果不懂计算机及编程,就像一个麻瓜,所见皆如魔法。

    仅仅掌握编程语言,也不足够,还需要对编程语言如何被创造有所了解。这就进入编程语言的设计和实现的领域。除此之外,很多问题,无法手写规则解决,必须通过特殊途径,间接解决。这就进入了人工智能/机器学习的领域。而在很多领域,最后都会触及到数学跟编程的结合,目前最贴近数学的是函数式编程语言,又是一个新领域。

    正是对世界和自我的反思与好奇,不断引领我去了解不同的领域。虽然难以成为每个上述领域的专家,但光是得到一些知识的理解,都足够让我兴奋很久。

    在现代,没有人可以掌握人类创造的所有知识。我们需要根据自身兴趣,对知识做一个优先级的划分。我的划分方式是先去掌握纲领性的知识,它们可能是所有知识的核心部分,可以创造新知识,或者推导出旧知识。数学、物理、哲学、心理学、演化论、计算机编程、编程语言实现、人工智能/机器学习、函数式编程等,都属于我认为的纲领性知识的范畴。

  8. 目前公司比较大,大公司的通病就是可能每个人都是螺丝钉,只在自己的岗位上去做事情,但是带来的问题就是自己可能会很长时间只钻一个地方,比如我是前端,可能就一直写页面,用RN,就一直用RN,我希望强化自己的后端或者其它框架,但是却没有办法,时间久了担心自己其它方面会越来越弱,也许某一块会比较熟练,但是毕竟范围有限,请问如何解决这一现状呢?或者说从自身角度出发,如何去改变它呢?

    工作不是技术成长的全部,工作之外,可以有基于兴趣的技术探索和积累。而且,工作内容,其实也有很多可挖掘和拓展的地方。靠外界环境去提供一个开发而广阔的学习,基本上不太可能。也不符合公司用人的专业性要求。内心的自我驱动力更可靠。

  9. 你好,请问对于其他的框架,如Vue, Angular, Ember, Backbone等等了解多不多?为何当初选择深入钻研React?你认为对于常用React的程序员来说,学习其他前端框架的时候有什么需要特别注意的吗?

    对 Backbone 和 Vue 的了解较多,Angular 和 Ember 不是很了解。当初选择 React 是恰巧当时它比较火,所以去学习和使用,然后有了更深的理解,开始在工作里使用,就这样上了这个车。

    不管是学习其他框架还是其他语言,我认为,都要以腾空自己的心态去感受;不要刻意去想,这不就是 React 里的 xxx 吗?这不就是 C# 里的函数重载吗?虽然我们第一次在 React 或 C# 里发现了某个语言特性或者框架特性,但并非这个特性的内部机制和用途,就跟我们第一次接触的框架和语言绑定了。

    我们应该去理解脱离框架和语言表象的背后的抽象事物,而不是用这个具体事物去理解另一个具有相似性质的具体事物。用水果去理解苹果和香蕉,而不是用苹果去理解香蕉。

  10. 工业聚你好。我是一个什么都接触的二傻搬砖,有以下问题想请教一下:
    我主要想应用一下机器学习,这样学习伊始是否需要一些大学数学基础(全忘了,如果需要还要复习一下),下手建议从传统机器学习算法还是直接上深度学习的框架
    React / Vue / Angular 这类框架已经极大的方便了前端工程师的开发,您觉得未来的前端框架演化会接着朝一个怎么样的方向发展,是否还会有 jQuery -> MVVM 的跳跃式改变。
    想看看您对未来前端职责和后端职责的看法,因为目前有许多项目的后端其实也是由我们「前端」来执行完成的,前后端的界限似乎越来越模糊。
    对于目前业界「知识付费」你有什么看法吗?或者对于现在前端圈造网红的现象有什么看法。您接触过这样经常「知识付费」的人吗?是否会影响正常的工作和知识积累。
    对于「前端门槛低」的说法您有什么看法,前端门槛低到底是一种好现象还是一种泥石流?
    在社招招聘开发时,您更看重学习能力还是之前所做的项目的匹配度。

    1、关于机器学习,我前面有个回答是相关的,可以参考一下。我建议从传统机器学习算法学起,就像卡马克 的做法(虽然不必那么硬核,但手写算法还是有很大帮助)。数学、编程和机器学习建模等,是并驾齐驱,互相增益的关系,在学习过程中,自然而然地会发现需要补充的数学部分,编程部分和建模部分是什么。从数学开始学起,离做出一个东西会隔很远很远,而且,数学是学不完的。不必在手写算法上停留过长的时间,积累了一定的经验和体会之后,应该是时候去玩框架了。目前的资料和教程也越发丰富。比如 Google 的机器学习速成

    2、React、Vue 和 Angular 目前只是在数据和视图的绑定以及状态管理上,提供了一些便利。但在 css/style 布局,UI 动画等方面,还有很大的发展空间,等到 houdini 落地,或许会有一个兼顾布局、动效、数据、视图和状态管理的新范式,FRP 是其中一个方向。另外,js 语言的发展,也可能改善一些写法,如 pipeline operator, partial application ,pattern-matching 等。以及 elm, reasonml 等编译到 js 的语言,和 wasm.js 开启的新的竞争领域的冲击,也在推动前端的发展。jQuery -> MVC| MVVM | Flux 这个转变,只是开始,远未到终点。

    3、前端和后端,本来就是人为划分,是之前或现在的分工需求。随着 Backbend、OPS 、 GUI开发乃至人工智能等技术和工具的发展,分工的模式被改变是意料之内、情理之中。做技术的人,要保持「终身学习」的决心和习惯,去迎接更多的挑战,并从中感到乐趣。

    4、目前的「知识付费」处于一个野蛮生长的萌芽阶段,绝大多数知识,并没有进入付费者的大脑。不过,如果把「知识付费」看成是一个像「密室逃脱」的娱乐来看,去掉知识的神圣感后,其实也算不错的体验。我们愿意让肉体去游乐场付费玩过山车,也可以让大脑在网络上玩「知识体验的过山车」。在现阶段,想要获得有竞争力的长进不能只寄希望于「知识付费」里。

    5、前端门槛低是事实。是好是坏,要看有什么角度或者处于什么情境。门槛低,意味着竞争者多,如果是一个不求进步,只图安稳的人,会感觉到竞争者很多,到处都是想抢饭碗的人。但另一方面,如果是一个对技术有追求,有热情,学习的方法论正确的人,他更容易脱颖而出。

    6、社招时的判断因素很多,对不同工作年限的候选人,衡量的方式也不同。对于初入社会的人,主要看对方的学习能力、学习的方法论、获取知识的媒介以及当前的技术基础等。对于资深的候选人,主要考察对流行框架和编程范式的认知和实践经验,对疑难咋整的处理办法,对团队协作的管理策略,以及对软件开发架构和设计模式的个人体悟。

楼主你好,我是个新手,最近自己学编程,有什么需要注意的地方吗?

commented

@neimen123456 看你是在学啥、看你是在校生还是在职想转行,不同人情况是不一样的

commented

@neimen123456 现在市场比较饱和了,转行劝你慎重吧,至少别裸辞,先利用下班时间去学习,等找到工作后再辞职。给你的建议就是多做点儿个人项目吧,毕竟是转行,相当于从零做起,到时候降低薪资的预期。
祝你有个好的开始!!