个人经验,不要学太多细枝末节的东西。
例如,学一堆库或框架 Vue、React、Angular、JQuery、easyui….
像这样学,永无止境,是个人都会觉得累,最重要的是,对于你技术的积累没啥用,换个框架,原来的知识就排不上用场了。
我的建议是:
一、只学当前工作中要用到的东西
比如你公司用的是 Vue,就深入学习 Vue,最好看看源码,不用全部都看,只看重点部分的源码。例如模板编译、Diff 算法、Vue 原生组件实现、指令实现等等。
剩下的两个框架 React、Angular 做个 DEMO 熟悉一下就行,毕竟原理都是相通的,等你公司要上这两个再深入学习,不过也不建议阅读源码了,太累。看别人写的现成的源码分析文章就行。
其他的,像 JQuery、easyui、Backbone.js、各种小程序… 用不到的时候坚决不学,浪费时间。用的时候看文档就行了,当然,如果有兴趣了解如何实现也是可以的。
二、一定要深入学习的知识
1. JavaScript
原生 JS 掌握得好,学习其他库或框架的速度真的是不要太快。
举个例子吧:
我在学习 Vue 时,因为对 Vue 改变数据,页面自动刷新这一现象特别感兴趣。所以决定学习 Vue源码,得益于自己的基础比较好,研究 Vue1.0 的版本并模仿它写了一个MVVM库,实现了1.0版本70%-80%的功能,大概花了一个月时间,还开发了几个 Vue 组件。
woai3c/mini-vuegithub.com/woai3c/mini-vue
如果 JS 基础不好,要看懂 Vue 源码也是一个很困难的事情。
2. 计算机科学理论知识
为什么这么说呢?因为我是中途转行的,还是高中毕业,所以对于计算机理论知识是一窍不通。导致在工作中遇到一些问题,不知道原理,不知道如何解决,还得经常去网上搜答案,而且对答案也是一知半解。举个例子:
转行前端后去的第一家公司,在开发页面时,其中有这样一个需求:
有一个 ul
,下面有四个 li
,要求点击其中一个 li
时,高亮显示,其他的 li
取消高亮,我和别人纠结用 for
循环写性能比较好,还是用 JQuery 的 each
写性能比较好。当时对于这个问题我还发在了知乎上求大神解答。
(前端JS)同一个问题 两个解法 哪个更优?191 关注 · 22 回答问题
现在想想,要是当时我懂编译原理的知识,就会知道这两个实现都是一样的,甚至用 while
实现,底层都是一样的,时间复杂度都是 O(n)(注意:这里说的实现是指 for each while 底层实现一样)。
在工作中越来越深刻的体会到计算机理论知识的重要性,所以在去年开始就在不停的进行有关方面的学习,最近还学习《计算机的系统要素》这本书写了一个简单的编译器,下面的链接就是我写的编译器。
woai3c/nand2tetrisgithub.com/woai3c/nand2tetris
计算机理论知识决定了一个程序员的天花板,让你看得更远更广。
如果对计算机理论知识还有疑问,可以看看知乎的这个问题
计算机基础知识对程序员来说有多重要?1264 赞同 · 59 评论回答
希望我的回答对你有帮助。
2020.4.15 更新
收获了这么多赞,打算把我学习前端的过程也分享一下,希望能给大家带来一点帮助。
学习经历
由于我是高中毕业,并且 28 岁才开始学习编程,所以起点比一般人差很多,完全是零基础,需要学习的知识也特别多。
在找工作前,我花了五个月时间自学编程。
第一个月学的 C 语言,结果发现 C 语言不好找工作。第二个月转学 python,学了一个月发现招聘岗位很少,又放弃了。第三个月,痛定思痛,我决定先去网上搜一下什么语言好找工作再做决定,最后选了前端做为学习的方向。
接下来前端学习了三个月,HTML 和 CSS 是在 w3school 上学的,JavsSciprt 则是看的 《JavaScript 高级程序设计第三版》。在学习的同时,还做了百度前端技术学院 2016 的任务来巩固和提升技术。三个月后开始找工作,2017 年 2 月找到了第一份工作,终于转行成功。
接下来的三年学习经历可分为前端和计算机理论知识两个方面来讲。
前端
关于前端学习,我的宗旨是:
- 基础知识为主,库、框架为辅。
- 理论与实践结合,学习更高效。
- 时常写文章总结,将学到的知识消化了再写出来(费曼学习法)。
库、框架都是工具,基础打好了,学习第三方工具才能事半功倍。
基础知识(JavaScript、CSS、HTML)
在这三年里,我看了大量的前端书籍,具体如下:
- 你不知道的JavaScript系列
- JavaScript高级程序设计
- 高性能JavaScript
- ES6标准入门
- JavaScript语言精粹
- JavaScript DOM编程艺术 第2版
- CSS揭秘
- 高性能网站建设指南
- 高性能网站建设进阶指南
- Web性能权威指南
在看书的同时,我还做了百度前端技术学院 2017 年的任务。功夫不负有心人,看书和做练习让我的技术水平得到了极大的提升,以至于后面对 Vue 源码的学习起到了很大的作用。
库、框架
关于第三方库的学习,我只对 JQuery 和 Vue 进行了深入学习,其他的库都是看文档按需使用。 深入学习 JQuery 的成果:写了两个组件。 深入学习 Vue 的成果:
- 写了一个 Vue 动态表单组件,发布到 NPM上。
- 模仿 Vue1.0 版本写了一个 MiniVue,这让我对 Vue 的理解达到了源码级别。
- 写了几篇关于 Vue 的文章。
nodejs
学习 nodejs 的时间比较少,主要是工作用不上。成果是写了一个个人博客 node-blog,涉及到服务器和数据库知识。
- 深入浅出node.js
计算机理论知识
计算机理论知识决定了一个程序员的天花板(在国内还得加上英语)。
数据结构与算法
算法看的是 《算法 4th》这本书,课后习题没做,改成用刷 leetcode 代替,目前已经刷了 200 道了,还在继续刷。
编译原理、计算机原理
由于编译原理和计算机原理是看的同一本书《计算机系统要素》,所以就放一起说了。
这是本神书,内容通俗易懂,涉及计算机原理、编译原理、部分操作系统知识,每一章后面都有对应的练习,需要你写代码完成。
如果完成了本书所有的项目,你将会获得以下成就:
- 构建出一台计算机(在模拟器上运行)
- 实现一门语言和相应的语言标准库
- 实现一个简单的编译器
而且,这本书的门槛非常低,只要你能熟练运用一门编程语言即可。我已经把这本书所有项目都做完了,答案放在 github 上,有兴趣可以看看。
操作系统
操作系统看了《操作系统导论》以及《深入理解计算机系统》(这本书更像是计算机导论),并且做了MIT6.828 的项目写了一个简单的操作系统内核。
计算机网络
计算机网络看了《计算机网络–自顶向下》《计算机网络–谢希仁版》,实验是按《计算机网络–自顶向下》做的。另外还深入学习了 HTTP,HTTPS,HTTP2,看的是《HTTP 权威指南》《HTTP2基础教程》。并且在学习过程中,我还做了学习笔记,有兴趣可以看一看。
https://github.com/woai3c/Computer-Networking-Labgithub.com/woai3c/Computer-Networking-Lab
其他
这是没有做或做了一部分练习的。
- 汇编语言(第三版)
- x86汇编语言:从实模式到保护模式
- 代码大全2
- 重构
- 计算机程序的构造和解释(SICP)
总结
计算机理论知识值得每个程序员都去认真学习。不过,持续学习并不是一件容易的事,需要你有坚定的目标和强大的自驱力。如果不想学习,可以看电影玩游戏放松一下,注重劳逸结合,不过也要警惕玩游戏上瘾,这都是血的教训总结出来的。
2020.7.14 更新
1.4k 赞了,没想到我的回答能得到这么多赞,受之有愧。其实我的水平并不高,这三年多一直在小公司呆着,在视野上有很大的局限性。所以大家一定要带着批判性的眼光来阅读,别给带偏了。
我认为一个程序员最核心的东西,不在于学习方法、学习路线,而在于你想不想变强,不管你是因为虚荣心还是真的热爱,或者就因为工资高。
这是放之四海皆准的道理,厉害的程序员、厉害的产品、厉害的销售等等都有强大的内驱力,他们对自己要求非常严格,不放过任何能提升自己的机会,想尽办法榨干一切时间来提升自己。
这就是我想要强调的东西,不管你是面向工资编程还是真的热爱编程,都要严格要求自己。三天晒网,两天打鱼,是成不了大神的。
友情提醒:学习新知识,一要动手,二要总结进行输出,这样才能真正的刻在脑海里。
2020.7.22 更新
之前的回答写的都是关于怎么学习和学什么的事情,这次聊一下怎么在工作中提升的问题。
大家都知道,写业务页面是很没意思的事情,特别是重复的业务页面。但写业务页面也是能学点东西的。
封装复用
例如,当你发现每天写的业务页面有很多部分相似的时候,我们可以把其中相同的部分封装成组件。以后再写页面,直接堆组件就可以了。当然,一个页面全都由组件构成是很难的事情,但要尽量往这方向上靠。
将公共部分抽离成组件后,是否还有其他提高开发效率的操作呢?
答案是有的,那就是写一个页面生成器。
举个例子,后台管理系统相信每个前端都写过。而一个后台管理系统的页面,大多是由以下几个区域组成:搜索区(各种查询框)、表单区(表格展示信息等)、一些操作按钮(针对表单区进行各种操作,例如增删改查,这些都需要弹窗来辅助完成)、分页等等。
而每次写新的页面时,几乎不可能重头开始写,都是复制旧页面内容到新页面上再进行修改。这个操作是很烦琐的,两个页面的数据不一样,需要进行修改,用的组件不一样也要修改,弹窗不一样也要改,相应的方法等等都得改。
页面生成器的思路是根据配置文件生成页面,我们可以将一个页面按刚才说的区域分成 4 个,对应 4 个 配置项,例如搜索区、表单区、按钮区、表单区等。然后页面生成器根据你每个区域的配置来生成页面。生成器要尽量将日常常用的操作设置成默认配置,而真正需要人去手动设置的,可能就是一些具体的组件以及添加属性、方法等等。同时要根据设置的属性、方法自动生成对应的代码、数据。
有了生成器后,写新页面就不用再去复制旧页面进行修改了。生成器直接生成一个半成品,然后开发再去填充数据,以及具体的方法内容,接口等。
重构
每次开发完一个页面,是否就结束了呢?我觉得不是,在开发完页面后,要自己跑一遍测试看看有无 BUG。另外还要审视一下代码,看看有没有能封装复用的代码,变量名及函数名语义是否清晰,函数功能是否单一,每个页面都要用到的函数,可以考虑提取到公共工具函数库等等。这里推荐一本书 重构(第2版),有兴趣的同学可以看看。
单元测试
对业务页面写测试不太现实,特别是前端页面,不好写还没啥意义,迭代太快。
最适合写单元测试的就是工具函数以及公共组件。有人可能会问,单元测试的意义在哪?
其实对于当下的你来说,写单元测试没多大意义。但对于以后的你或其他人来说,单元测试意义重大。假如你的代码半年后需要进行功能变更或修改 BUG 时,由于不清楚改动有没有影响现有的功能,这时只要跑一遍单元测试就可以了。如果你没有写单元测试,就得自己手动重测一边。
原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/89317.html