Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于编程学习 #31

Open
yinguangyao opened this issue Oct 9, 2019 · 4 comments
Open

关于编程学习 #31

yinguangyao opened this issue Oct 9, 2019 · 4 comments

Comments

@yinguangyao
Copy link
Owner

yinguangyao commented Oct 9, 2019

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

@neimen123456
Copy link

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

@yinguangyao
Copy link
Owner Author

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

@neimen123456
Copy link

neimen123456 commented Oct 14, 2019 via email

@yinguangyao
Copy link
Owner Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants