2019前往新世界前的准备 | 掘金年度征文

1,253 阅读16分钟

写在前面的话

首先做一个简单的自我介绍,我叫Wwqin,只是一名来自双非学校计科专业21年毕业的大三前端小菜鸡一枚。

在我的计划中我的每一年都应该有一个年度总结,可是在已经早已过去的2018发现自己碌碌无为了一年,于是打算在2019做一点什么事情。一年前的现在我还停留在大二上,那个时候还天天听着学长学姐们的各种传奇故事(各种收割大厂offer),似乎就业实习离自己好像还是很远的样子,直到时间慢慢逝去,学长学姐们已经毕业而我们也即将面临着找实习还是考研的抉择,面对选择我毫不犹豫的选择了找实习,因为面对考研我着实是学不进去了,考上了一个不好不坏的大学已经把我掏空了。还好我觉悟的也不算很晚,开始为了工作开始了各种准备。

我为什么会选择前端? 这个问题已经被问过好多次了,特别是在面试之中,但是我真正的初衷其实可能就是选择前端可能更好玩,至于就业和薪资之类的我那个时候倒也没有去考虑,回过神来准备要用什么身份去面试的时候,毫无犹豫的选择了前端开发实习,大概是因为要换方向也不太来得及了吧。开始面试之后才发现学习前端的种种好处:

  • 首先在我看来前端的面很广,它不仅可以用来做网页,现在已经有了各种各样的跨平台框架还有了Nodejs来做服务端
  • 其次竞争压力相对较小,虽然竞争无处不在,但是前端作为一种基础性设施,谁也离不开它,所以前端岗位总的来说是不少的。可能也会说后端岗位也很多,这的确,后端岗位的确不少,但是JAVA大军也不少,所以选择了前端起码工作实习的机会不会太少。
  • 最后在我看来,前端秃的可能会慢一点(手动滑稽)

我的成长之路

我的学习过程大概可以分为四个过程。第一个是混沌阶段,第二个是探索阶段,第三个是完善阶段,第四个是沉淀阶段。

混沌阶段

这个阶段大概是我处在大一和大二上的时候所经历的阶段,在这个阶段里对于前端甚至对于计算机的整个认识都是模糊的,可能一天变一个样子,还有会听到自己许多自己搞不懂的专业名词,每天就是听学长各种balabala,自己也听不懂但是看起来很厉害的样子,在这个阶段会积累各种各样的问题,面对这些问题我们也不从下手,总结一下这个阶段的特点:

  1. 对什么都好奇,对什么也都不懂
  2. 有各种各样的问题但无从下手
  3. 学习没有方向比较迷茫
  4. 被各种学校的课程所拖累疲于学好高数线代,不知道自己到底想干什么

在这个阶段我停留了很久很久,也接触了许多东西,首先接触的竟然是硬件,因为参加了一个硬件比赛,最后通过初赛以后草草了之,因为发现自己可能不太感兴趣。后来又参加了学校组织的程序设计比赛,去做了三个小时发现自己代码写出来的竟然没有自己用草稿纸做出来的多,这才意识到自己可能走错了方向。在此期间也接触过各种大佬,听过各种各样的劝退名词,也如他们所愿的被劝退了。后来不知怎么的选择了前端,而且一头扎进去就没出来了,被各种劝退像什么JQuery、前端工程化、原型链、React、Vue等等,让我整个人都快炸掉了,那种不懂却又想了解的心情。自己去粗浅的查了以后发现之间的关联好像没有那么密切,感觉一切都是混沌的,一切都没有联系但又好像有联系。但是也没有办法去捋清楚,因为那个时候自己的知识面有限,只能慢慢积累从无序中发现有序。

探索阶段

在一开始混沌学习的阶段遗留下来了很多的问题,在这个阶段实际上就是从无序到有序的一个过程,但是又区别于网上的那种系统学习的课程,毕竟在自己摸索的过程中选择去看的问题肯定也是自己感兴趣的问题,比如React和Vue做选择的时候我肯定就会去选择React,因为它的logo比较好看吧。这个阶段又有这么几个特点:

JQuery一把梭

  1. 学习速度较快,快速接受新的知识
  2. 动手能力强对一切都好奇
  3. 有自己明确的方向(那个时候张开闭口前端nb)

在这个阶段往往自己已经可以摸索出一条适合自己的方向,学习有了目的,会去系统的学习相关知识了。

完善阶段

自己也尚且停留在这个阶段,觉得自己已经有了一套自己的学习方法已经学习路线,对自己的规划也很明显,缺的是一个时间,随着时间的增长技术越来越全面,至少在自己的专业领域会慢慢变得全面和强大

沉淀阶段

大概就是前端学的差不多了开始慢慢走向了架构?

总结一下自己的Flag

  • 学习React全家桶
  • 学习express和koa
  • 找一份实习
  • 做一个使用新技术的项目
  • 写12篇博客
  • 完成自检清单

学习React全家桶

React我也不清楚到底有没有全家桶之说,可以这么说,你新建一个React的项目,你去挑选要用什么的时候就像去逛超市一样,Redux和mobx哪个好呢,好像Redux更香一点,antd和element谁更好看呢,好像antd更简洁一点,诸如此类的问题数不胜数,简直就是在为难我选择困难症。我就挑几个我常用的说一说吧!

React

都叫React全家桶了为什么还要单独拿出来说React呢?!

因为React写组件的方式也有好几种啊!上至hook下至React.createClass,都可以去创建组件。在初期学习的时候,无论什么组件我都是通过关键字class来创建导致了代码冗长而且可读性不高性能也一般,因为通过class来创建的组件都是一个新的实例,这样做可能没什么问题,但是一些相对于不复杂仅仅只关乎UI的UI组件再这样做就显得不太好。所以在写的时候去对自己将要去写的组件进行规划将其拆分成需要去实时更新的容器组件和不需要去实时更新的UI组件,这样不仅可以增加代码的可读性也提高了项目的可维护性,看起来也眉清目秀了。

怎么去学习的React 我学习React更多的是通过官方文档以及自己去写Demo,在我看来官方文档已经将基本的用法以及一些核心思想写的比较全面了,通过阅读学习后掌握基本用法后就可以自己去写一些能用到这些点的Demo,这么做之后可以说你已经基本掌握了React的用法,接下来怎么去应用它就看你自己了。至于什么看不看源码的我觉得仁者见仁智者见智,看源码不是目的,目的是去真正的了解他的核心思想实现原理。

Redux

Redux其实我感觉是很多人学习的难点,但在我看来要去写一个Redux就很简单,你只要去写相应的reduce和action就好了。但是Redux并不仅仅只是将数据操作换了一个地方写而已,它优秀的地方在于它的原理,它将数据统一起来放在store由reduce去更新,触发更新后再去更新那些订阅了store的组件,这样以来订阅的组件只受控于store的改变以及本身state的改变,相对于以前的单向数据传递的那种模式更清晰,数据统一管理也更便于管理状态。前面说到的将组件分成UI和容器的优越性也体现出来了,UI组件因为没有订阅所以不会被更新,而容器组件会被更新。

做一个用了新技术的项目

为什么要强调新技术呢?因为我觉得我已经在我的舒适区里待了很久了,需要去突破了。每次init项目都是,某后台管理系统(React+Redux+react-router)、某答题系统(React+Redux+react-router)等等,感觉自己做了一百个项目还是只会一套东西,永远停留在自己会的地方不去探索不会的东西了。于是我就在六七月份打算开始尝试ssr,一开始打算自己构建一个ssr项目,奈何水平有限,没能搞得定服务端,只能依靠nextjs了,nextjs各种奇葩问题也不少,具体会出现的问题我自己也写过教程,在我的博客。

我觉得一个程序员需要时刻保持着对自己清醒的认识,不要被自己会的那点东西所迷惑,禁锢住了自己探索新东西。再接触了next之后所带来的好处是很多的,首先我通过next了解了next这个ssr框架的基本原理以及ssr的原理,还有这样做所带来的好处。其实可能这就是在完善阶段一个不错的学习方法,学习一个框架然后从使用到理解原理掌握后再去学习其他的,如此循环让自己的前端武器库里的东西越来越多,让自己技术越来越好。

找一份实习

现在也已经到了大学的下半程了,觉得是时候找一份正经的实习了,之前也找过一些不大不小的实习,实习过后却没有什么本质上的提升,可能也就是业务写的更加熟练了调API越来越快了。在下半年就开始准备去找实习了,首先是学长推荐的cvte,但是怎么说呢,这个公司效率真的很一般,我在其他公司都已经拿到offer call了这个刚刚才出笔试结果,所以毫无疑问的pass了,虽然笔试过了。后来是在本地的育儿网、孩子王等规模还不错的公司进行简历投递,但是这个更惨,石沉大海杳无音讯。直到一个来自头条的学长帮我内推,其实那个时候我刚刚准备面试一个月左右,说实话还没有完全准备好,但是机会留给有准备的人,如果没有准备那就爆肝吧!爆肝了十几天开始了一面、二面、三面、hr面,有幸过五关斩六将,拿到了我的第一份实习offer。最后我也没有想到我的第一份正式实习offer居然是字节跳动,这个剧情有着太多的跌宕起伏了,可能只有当事人的我才能体会其中的辛酸和幸运吧!这也是我2019觉得最自豪的事了。

软技能

如果技术称之为硬实力,那么如何利用好各种资源就是软技能了,当然还有其他方面。软技能有好多,比如前端怎么协作、代码规范怎么样才好、命名规则等等,我就只想说几点我觉得很有帮助的。

学会使用git

作为一个程序员我觉得学会使用git是每个人必须的,git是一个分布式管理系统,这么说可能有一点抽象,但是当你真正使用之后你就会发现他好像那种,就是很少见的那种,可以任意的在各个版本之间穿梭、回退,也有自己的一套工作流,将一个项目工程化之后版本控制以及多人协作这些都是无法避免的,所以掌握git是一个必不可绕过的问题,其实git也不难,看 廖雪峰老师的博客完全就够了。

Markdown

Markdown是现在很流行的一种可以使用普通文本编辑器编写的标记语言,这么说吧,如果你连Markdown都不会你甚至都不会在掘金上发文章(滑稽)。

设计模式

设计模式这个概念可能很抽象,但是我觉得一个优秀的程序员是必须要掌握设计模式的,因为它关乎你设计一个系统的合理性,它不是代码风格也不是命名规则,在我看来它更像是解决问题的思路。通过相应的设计模式解决相应的问题。具体我也不知道怎么去描述,但是我在我学习之后极大的提升了我写代码的可读性可维护性,不再是很机械的面向过程式写法,起码掌握了面向对象等基本设计模式。推荐一本JavaScript的设计模式书

JavaScript设计模式

做计划

通常来说在我去做一个事情的时候我会先把这个事情安排做出来,这样就不至于到时候手忙脚乱。在学习技术的过程中也会有一个又一个计划,先不说计划的执行情况,先把计划做出来。通常计划我会根据我的手头上事情的数量去安排,如果这段时间毕竟松散我会制定周计划来让自己松散的时间变得有规律起来,比如:一周内完成代码重构、看完某个工具使用文档、读一份react status等等,一般不会具体到某一时刻做什么事情因为我也相信我可能不会去做,但是一个周期内需要完成哪些事情写在了计划上这样就不至于我找不到方向一直在摸鱼。在时间毕竟紧凑的时候我也会去做计划,但是大都是短期计划,而且一般就是比如补全周报、补全博客文章等比较容易利用碎片时间完成的事情,总的来说就是根据自己的时间调整自己接下来的计划。我的周计划做出来一般是问题式的希望大家可以借鉴:


2019.12.07 JS

  1. JS 语言的特点?和 C 语言、Java 语言的区别?
    单线程、解释型、弱类型、安全性、跨平台性,单线程、弱类型和解释型这两种都非常容易理解,安全性是因为js无法访问本地硬盘也不允许对网络文档进行修改和删除(node除外),跨平台是因为js只依赖于浏览器环境并不依赖操作系统环境。和C、java的区别也是他们特性的区别。
  2. 原始类型有哪几种?null 是对象嘛?
    null、undefined、number、string、Boolean,null不是对象,之所以typeof null==="object"是因为在底层二进制编码的时候对象的前三位都是0而null全部都是0所以判断null是对象
  3. 对象类型和原始类型的不同之处?函数参数是对象会发生什么问题?
    对象类型是一种复杂的结构,除了原始类型的其他类型基本都是对象类型,原始类型存储的是值,对象类型储存的是指向存放值的这个地址的指针。函数是参数的话,参数拷贝的只是指针并不是值,所以在函数内部进行操作的时候会影响原本这个对象的值。
  4. typeof 是否能正确判断类型?instanceof 能正确判断对象的原理是什么?
    typeof不能正确的判断类型,因为typeof能准确的判断源氏类型但是对于其他对象类型返回的都是object并不能达到我们预期想要的结果。
    instanceof可以判断对象类型,因为它的工作原理是沿着实例(参数1)的__proto__这条线来找,同时沿着构造函数(参数2)的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false。
  5. 转换规则:基本类型转换为布尔值?基本类型转换为数字?基本类型和引用类型转换为字符串?
    基本类型转数字,字符串只包含数字的直接转为十进制数字(浮点数、八进制、二进制等只要输入正确转为十进制数字),true为1,false为0,null为0,undefined为NaN,对象则调用valueOf再按照前面的规则转换 基本类型和引用类型转字符串,基本类型直接调用toSring(),null和undefined没有这个方法。引用类型的话同样是调用toSring()但结果一般是[object Object]

以上就是我在学习初期所作的周计划,通过问答的形式去完成,不仅要写还有解答,很好的督促了我学习

2020的展望

2019对于我来说是我前往新世界前的准备,我也即将成为前往伟大航线闯荡的一名船长了,对新世界有着别样的憧憬,我希望我能一路披荆斩棘。

  1. 坚持写文章写博客,持续做分享
  2. 完善自己的sacc-cli
  3. 转正
  4. 多回家几次,因为很多事情都选择了假期留校,大学没有完整的一个假期在家里

今天2019年12月23号了,我马上考完期末考准备去北京接受新的挑战了,希望我可以在字节跳动有自己的一席之地。

掘金年度征文 | 2019 与我的技术之路 征文活动正在进行中......