在成为程序员之前,我干过很多工作。由于学历的问题(高中),我的工作基本上都是体力活。包括但不限于:工厂普工、销售(没有干销售的才能)、搬运工、摆地摊等,转行前最后一份工作是修电脑。这么多年,月薪没高过3300...
后来偶然一个机会我发现了知乎这个网站,在上面了解到程序员的各种优点。于是,我下定决心转行(2016年,当时28了),辞职在家自学编程。并且也得到了媳妇的支持,感谢我的媳妇。
转行选择前端也是在知乎上看网友分析的,比后端好入门。
最好在网上多查查资料,找评价高的或者去豆瓣上找评分高的书。
我先学习了HTML、CSS,做完了第一阶段任务。再看完红宝书前十三章,做完了第二阶段任务。然后把红宝石剩下的全看完,做到第三阶段的任务四十五。后面的任务对于当时的我来说实在太难了,就没往下做。在1月的时候,又学习了ajax,了解了前后端如何相互通信。
我从16年11月开始自学前端,一直到17年2月。历时3个月,平均每天学习3-4个小时。中间有好几次因为太难想过放弃,不过最后还是坚持下来了。
找工作的过程非常艰难,我在网上各大招聘平台投了很多简历,但由于没学历、没经验,所以一个回复都没有。最后还是我媳妇工作的公司在招前端,给了我一个内推的机会,才有了第一次面试。并且第一次面试也很顺利,居然过了,这是我没想到的。直到多年后我和面试官又在一个公司的时候,才知道原因。他的意思是:看在我这么努力自学编程的份上,愿意给我一个机会。
虽然人生很艰难,但很有可能,遇到一个愿意给你机会的人,就能改变你的命运。
在正式的项目中写代码和在学习时写代码是不一样的。你必须得考虑这样写安不安全,会不会引起BUG,会不会引起性能问题。在工作的第一年,写业务代码对我的提升非常大。
第一年的主要任务,就是提升前端基础能力。因此我看了很多JavaScript的书籍来提升自己的水平:
这些书都是非常经典的书籍,有几本我还看了好几篇。
另外还学习了jquery和nodejs。jquery是工作中要用,nodejs则是出于兴趣学习的,没有多深入。
到了第二年,写业务代码对于我来说,已经提升不大了,就像一个熟练工一样。而且感觉前端方面掌握的知识已经足够把工作做好了。于是我就想,为了成为一名顶尖的程序员,还需要做什么。我在网上查了很多资料,看了很多前辈的回答,最后决定自学计算机专业。
这里引用一下书里的简介,大家可以感受一下:
本书通过展现简单但功能强大的计算机系统之构建过程,为读者呈现了一幅完整、严格的计算机应用科学大图景。本书作者认为,理解计算机工作原理的最好方法就是亲自动手,从零开始构建计算机系统。
通过12个章节和项目来引领读者从头开始,本书逐步地构建一个基本的硬件平台和现代软件阶层体系。在这个过程中,读者能够获得关于硬件体系结构、操作系统、编程语言、编译器、数据结构、算法以及软件工程的详实知识。通过这种逐步构造的方法,本书揭示了计算机科学知识中的重要成分,并展示其它课程中所介绍的理论和应用技术如何融入这幅全局大图景当中去。
全书基于“先抽象再实现”的阐述模式,每一章都介绍一个关键的硬件或软件抽象,一种实现方式以及一个实际的项目。完成这些项目所必要的计算机科学知识在本书中都有涵盖,只要求读者具备程序设计经验。本书配套的支持网站提供了书中描述的用于构建所有硬件和软件系统所必需的工具和资料,以及用于12个项目的200个测试程序。
做完这些实验,让我有了一个质的提升。以前感觉计算机就是一个黑盒,但现在不一样了。我开始了解计算机内部是如何运作的。明白了自己写的代码是怎么经过编译变成指令,最后在CPU中执行的。也明白了指令、数据怎么在CPU和内存之间流转的。
为什么我不建议阅读源码?因为阅读源码效率太低,而且相对于你的付出,收益并不大。到后面Vue出了3.0版本时,我也是有选择地阅读部分源码。
由于打王者的原因,第三年没学习多少新知识。基本上只做了三件事:
数据结构和算法有什么用?学了算法后,我觉得至少会懂得去分析程序的性能问题。
今年我做了非常多的事情:
研究前端工程化的目的,就是为了提高团队的开发效率。为此我看了很多书和资料:
操作系统是管理计算机硬件与软件资源的计算机程序。通常情况下,程序是运行在操作系统上的,而不是直接和硬件交互。一个程序如果想和硬件交互就得通过操作系统。
如果你掌握了操作系统的知识,你就知道程序是怎么和硬件交互的。
例如你知道申请内存,释放内存的内部过程是怎样的;当你按下k键,你也知道k是怎么出现在屏幕上的;知道文件是怎么读出、写入的。
对于操作系统,我主要学习了以下书籍:
计算机网络的作用主要是解决计算机之间如何通信的问题。
例如A地区和B地区的的计算机怎么通信?同一局域网的两台电脑又如何通信?学习计算机网络知识就是了解它们是怎么通信的以及怎么将它们联通起来。
对于计算机网络,我主要学习了以下书籍:
软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。
学习以下书籍:
软件工程是一门非常庞大的学科,我只学习了一点皮毛。主要学习的是关于代码怎么写得更好、结构组织更合理的知识,这需要一边学习一边在工作中运用。
英语对于程序员的好处非常非常多,就我知道的有:
在我转行前英语词汇量只有几百,三年多过去了,现在词汇量有6000(都是用百词斩测的)。
个人认为写作的好处有三点:
总之一句话,写作对你只有好处,没有坏处。
我觉得学习一定要有非常清晰的目标,知道你要学什么,怎么学。对于前端来说,我认为很多框架和库都是不用学的。例如前端三大框架,没有必要三个都学,把你工作中要用的那个掌握好就行。
比如你公司用的是Vue,就深入学习Vue,如果要看源码就只看重点部分的源码。例如模板编译、Diff算法、Vue原生组件实现、指令实现等等。
我觉得好的学习方法非常重要,对我比较有用的两个是:
费曼学习法在《写作》一节中已经说过了,这里着重说说第二个。
你有没有过这种感觉:觉得自己会的东西很多,但其实掌握的知识很多都停留在表面上,别人要是往深一问,就懵逼了。
后来我尝试改正这种状态,在学习新的知识点时,时常问自己三个问题:
当然,不是所有问题都能适用灵魂三问,但它适用大多数情况。
先了解一下HTTP请求是啥,查资料发现原来是向服务器请求资源用的。
查资料发现:HTTP请求需要经历DNS查找,TCP握手,SSL握手(如果有的话)等一系列过程,才能真正发出这个请求。并且现代浏览器对于TCP并发数也是有限制的,超过TCP并发数的HTTP请求只能等前面的请求完成了才能继续发送。
这是一个HTTP请求,请求的文件大小为28.4KB。
名词解释:
使用HTTP2,所有的请求都可以放在一个TCP连接上发送。HTTP2还有好多东西要学,这里不深入讲解了。
经过灵魂三问后,是不是这条优化规则的来龙去脉全都理清了,并且在你查资料动手的过程中,知识会理解得更加深刻。
下面提前回答一下可能会有的问题。
百度前端技术学院2017年及往后的任务,如果没有报名,那就只能做部分任务。2016年的任务则由于百度服务器的问题,很多题的示例图都裂了。这个其实是有解决方案的,那就是看别人的答案。把别人的源码下载下来,用浏览器打开html文件当示例图看。这两年的任务我都做了大部分,附上答案:
我从18年开始,已经报考了成人高考大专,19年报了自考本科。大专明年1月就能毕业,自考本科比较难,可能2021年或2022年才能考下来。
从转行到现在,已经过去3年多了。不得不说转行当程序员给了我人生第二次机会,我也很喜欢这个职业。不过这几年一直都是在小公司,导致自己的技术和视野得不到很大的提升。所以现在的目标除了学习计算机专业外,就是进大厂,希望有一天能实现。
虽然今年已经32了,但我对未来仍然充满希望。努力地学习,努力地提升自己,为了成为一名顶尖的程序员而努力。