大学总结,技术与技术之外的事 | 掘金年度征文

1,528 阅读19分钟

一直没有写年末总结的习惯,今年想写,年前懒癌发作,元旦后也一直没抽时间,也很久没写文章了,掘金的活动可以算是一个动因吧,在这个比较重要的一年里,写一篇比较长的文章,也盘点一下平时思考过的一些东西。

个人履历

首先简单自我介绍,我是2019应届本科生,哈尔滨一所不知名学校软件工程专业,前端开发者。今年过后,多年的学生生涯也到此结束了,盘点一下大学已经过去的三年半,真的没白读。

我的经历其实就是一个普通人的经历,上大学之前,对软件开发一无所知,不过我选择这个专业还真不是道听途说的“赚得多”,最初的认知来自于我是用的第一部智能手机。时至今日智能手机动辄10+128,也许很少有人能理解 RAM 512MB ROM 150MB的手机使用起来是一种什么样的感受,那个时代获取root精简系统是多么重要。那个手机我用满了三年,也使我相信我可以做这个工作。然后一切就和我想的一样,我选择到了一个合适的学校的对应的专业。

刚到大学的时候真的不懂,学校的课程设置的也不是很好,大一上学期只有c一门专业课,借着学校ACM校队举办的集训活动,学校c语言课上的基本内容在十一假期就学会了。然后我就在思考我应该做什么。当时没人指点我,我也不知道获取有效信息的渠道,我只知道我想要在大二结束前能自己写出android app,我只知道我需要先学会java(当时可不能用kotlin也没有flutter)。我买过很侮辱智商的从入门到精通系列的书,当然后来主要是靠看视频资料,懵懵懂懂的知道了面向对象是什么,开始拿起郭霖老师的第一行代码,正式开始学习开发android客户端,前前后后半年左右吧,算是能写本地应用了(不联网那种)。大二的时候申报大学生项目,我也跟着参与了一下,想做app需要后端开发,说起来惭愧,就像我现在看外行人一样,当时一个很外行的我是无论如何也不能理解,你看上去只有一个会联网的app,看不到的是不知在何处的某一台机器上运行着提供服务的另一个应用。普通用户不用知道server端存在,这并不是坏事,但是作为一个开发者,这可是极其不专业了。既然java能进行web编程,那我就用java写吧,省的再学其他编程语言了(naive)。ps:此时我还不知道我要学的那个东西叫后端。

java web学习这段路可以说是拐的很偏了,现在回来看这段经历,其实也是少不得的,一会还会再说。眼下,我就要开始学习java web了,当时主要的学习资料就是imooc上面的那些比较老的视频(当时就处在过时的边缘,现在真的没必要看了),一边学一边还在想,jsp是不是写页面的吗,这不是前端吗,那我学这个干什么(根本不知道有后端),迷迷糊糊地就这么学着(当时我是抱着留后路的态度,android开发已然趋于平静,因为岗位的特殊性注定了机会不会很多,而且就是那一年小程序刚刚出现,多一种选择未尝不是好事)。后来跟着就是ssh(简单看过而已,没学),ssm,还有封装好的spring boot,这时其实我在java的路上走的已经比较远了,我也已经知道了web后端是什么,前后端分离是什么,我也考虑做一个java工程师,当时大概大三了,写app这个目标已经实现了,我要做java,我开始考虑技术的广度和深度。从jvm原理到框架源码,从javaSE基础到web框架熟练使用,从基础算法到分布式中间件,坑还是很深的。其实这个时候,接下来学习java发展究竟如何,其实我是不确定的,但是由于之前的积累,我已经相信了编程语言只是工具而已,解决问题的方式有很多,在需要的时候选择合适的就可以。而真正让我选择前端,大概是从node.js开始。

node.js听说过很久了,但是不知道是干什么的,之前也和很多不了解情况的人一样,js肯定是前端框架了,后来使用hexo搭建博客,安装了node.js环境,不过并不知道为什么要安装。说来惭愧,第一次知道node.js是因为一家培训机构的广告。很多学校都有那种,培训机构来学校做推广的课程,我第一次知道node.js,它是用来开发后端的,它主推的异步流程和我熟悉的多线程同步模型截然不同(当时并不知道vert.x,Netty是什么,只是听说过)。培训机构我不喜欢但是也不排斥,但是我绝对不认同一点:不是所有的本科学生都没有自学能力,虽然这是大概率,但是否认所有人的论调就是会让我觉得不舒服,换一门语言又不是不能写增删改查,试试就试试。我开始了解node.js,我知道学会js之后有机会学习前端,我顺便关注了一些前端话题(那个时候我还记得,当时正是vue作者尤雨溪老师和谷歌angular中国区布道者大漠穷秋老师在知乎大战的时候,没入前端门先认识了前端娱乐圈,ps:后面也真的是,每隔几个月必有大新闻)。学习node.js时候我已经完全知道自己在做什么了,前后端分离的边界在哪,每一部分需要做的是什么,js语法什么的,已经不存在什么很大的问题了,知道想要学什么,寻找需要的东西去学习就可以了。在学习node.js时候要感谢我们学校jser club腾哥的帮助,他是Node.js Foundation的成员之一,我是在他推荐后了解的egg.js(迄今为止我最喜欢的node.js web框架,不管阿里出品口碑如何,egg.js绝对是我心中相当优秀的框架,又免费广告了一波,天猪老师大概也不会看到),后来写第一个正式项目时候,参考了腾哥之前写的一个工程。node.js当然不只有web一部分,各种其他功能我也了解过,我也知道它作为前端工程师的工具,发挥的作用是极其巨大的。时机差不多了,我正式开始学习前端了。

前端的门槛在门里边,html,css,以及对于一个写过node人来说的js,入起门来其实很容易。简单看了看基本经典的基本资料图书,之后就开始学习vue.js了,选择vue最主要是因为渐进性学习路线,可以从使用script标签引入开始学习,最后到webpack工程化的学习。学习vue主要得益于黄轶老师的音乐播放器视频(这里也不是广告,不过实名推荐,我心中目前最好的学习视频,没有之一),这个项目基本上涵盖了从零开始搭建完整vue工程的每一个方面,吹爆。之后我使用vue和egg独立完成学校的一个大学生项目,这是我第一次使用vue,也是第一次使用egg,一上来就完成完整项目既是实战也是学习,此后算是正式入门前端。我和大多数前端都不一样,我不是从html,css开始学起的,我也没有过写静态页面的常规练习,可以说是路子比较野了。我此时完全坚信也印证了一点,软件工程理论真的是相通的,所谓的客户端开发也好服务端开发也罢,浏览器开发原生开发,它们各有各的特点,但是总能抽象出共通的东西来。再以后就是大三下学期了,从写js开始到入门前不到半年的我开始寻找实习了,机缘巧合吧,去了我第一家实习公司。之后面试了几家暑期实习,也通过了几家,最后选择了我现在的公司。在这段前后的时间接触的新东西不多,但是成长还是有的,个人开发和企业开发本身有很大差距,创业型公司的实践模式和大型互联网公司的实践模式还是有一定差别的,等等诸多不便细表。后面的故事就是因为工作时间原因,我没参加秋招(算是小遗憾吧),拿到了现在公司的offer,目前待毕业入职状态(也可能还看机会)。

复盘回顾

整个大学就是这样的,现在回顾过去,有时候确实会想,是不是有些弯路没必要走?有些东西学习了之后对我现在有帮助吗?如果让我重新选择一次我会怎么走?等等一系列问题,接下来也算是自己回答自己,做一个复盘。

为什么几经波折最后选择了前端?

我是一个用情不专的人吗?我是一个看什么好就干什么什么都想做的人吗?我觉得我不是,我做的每一个决定都有自己的道理,我不能说自己是对的,但是绝对是符合我个人意志的。学习android开发是因为最初的兴趣点,而且时至今日大前端的发展我用js仍旧可以开发android也算是绕了一圈不忘初心了。java后端开发是我冷静思考过后选择的正路,按照我当时的见识和眼界,这是最合适的东西,而且也是常规选择,不能说没干正事。至于为什么后来又变了,因为对我而言,放弃java学习前端的原因之一是我对互联网公司的追求(互联网公司是个神奇的东西,至于我选择互联网公司的道理,一句两句话说不清楚,在此不展开了)。首先一个事实就是,后端语言多种多样,java只是其中之一,而且java广泛应用于传统软件行业,在互联网行业里面,java的应用多但是没有绝对优势,而互联网前端,js是绕不开的。如果我学习的是其他一门后端编程语言,我大概就不会改了,但是java,这是一个在传统行业大放异彩的东西,我要学习一个在互联网行业中有这么高地位的东西。另一点也是最重要的一点原因是现在前端工程师所发挥的作用越来越大,大前端的概念个人认为没那么夸张,但是是存在的。时至9012年要是还有人认为前端只是切图的,那他是绝对的外行了。如果是曾经的逐个静态页面分别开发的时代,我是不可能喜欢前端的。我觉得现在的前端行业是真正的工程,它还在发展,它正在日渐完善,这里面有我想要的东西。

学习前端之前的学习经历有意义吗?

答案是肯定的,不但有,甚至一点也不能少。android客户端开发是用户端开发,其实web前端开发也是客户端开发,它们只是做同一件事的不同方式,在实际开发中遇到的问题也有很多相似性,比如android中数据变化需要同步ui展示,而web中也需要做这个同步处理,而各种现代数据驱动的web开发框架,其中的一件重要的事就是实现了这个同步过程的自动化,这些东西我在android中理解了在web前端中也就懂了。更重要的一点就是,在那个时间点上,学习android编写的大量java程序,使我从迷迷糊糊到彻底弄懂面向对象,而学校最早接触面向对象的课程是在半年多之后。还有一点算是很幸运也可能是很不幸,我选择的编程语言java,它是教科书式的面向对象编程语言(至于为什么说不幸,下面会说)。

后来的java web学习真的是走了不少弯路,但是,它的不可替代性在于,通过这段学习我真正弄懂了前端后端都是什么,前后端分离是什么,为什么要ajax异步请求,http请求与响应之间数据是怎么流动的......这些东西时至今日也是极其受用的。而且这段时期的大量编码真的是很巨大的成长,可以说,直到此时,我才开始具备成为开发工程师的基本条件。

之后的node.js,如果把它作为后端js的运行环境,可能大多数时候都只存在于个人项目中。但是当它作为前端工程师的基本工具时,它的地位可以说是非常重要了。其实很多时候我们会需要一些小工具,它们可以用来自动化的解决遇到的重复性问题。这些东西其实任何一门编程语言都可以做到,但是要考虑运行成本,实际上更多时候由脚本语言来充当这个任务。对于其他工程师而言,python是一个不错的选择,但是对于前端工程师而言,js已经是一门强大的编程语言了,node.js又可以让它走出浏览器,自然成为了开发这类工具的绝佳选择。而且我先学习的node.js,ES6,typescript接触的都非常早,这对于现代前端开发是有很大意义的。

如果成新选择一次,我会选择前端吗?

聊聊技术

我认为不得不说的技术之外的事

谈一谈我对技术工作的看法。曾经不短的时间里,我和很多人一样,认为作为一个开发者,技术就是全部,要不断学习新的东西,提升自己的编程能力。这些话不能说不对,但是现在看来,还是眼界太窄。

我只是一个还没毕业初入职场的年轻人,我做的话只代表个人看法。我知道很多技术从业者,包括我在内,一直在心中存在一个矛盾:在公司大多数人在写业务,无非就是拧螺丝的工作,而个人成长需要提升技术能力,公司做的很low的工作我不想去做,他不会给我带来什么好处。这个观点不能说错,但是要考虑一个问题,开发工程师创造的价值在哪?要知道对于资本家而言,他们根本不会关注产品开发的过程,一切的收益都会以创造的商业价值为准。诚然,一些框架类库的开发提升了开发人员的工作效率,但是之后呢,高效的开发目的也是要节约开发维护的成本,要用更少的投入来创造更大的价值。从这个角度来看,一个商业化产品,无论是产品、设计、推广、开发、运营,每一各环节都只不过是其中之一而已,如果单纯只通过技术的角度来看一个产品,无异于管中窥豹。

这不代表技术不重要,而且术业有专攻,该做好的事本应该做到足够专业。我想说的是,这种看问题的方式,影响了一个开发工程师的眼界。其实我们工作的时候只要能够抽象建模,所有遇到的问题最终都不过是UI和数据流的处理。但是我们为什么要去了解业务?为了能够建模,这只是其中的原因之一。了解业务之后整个开发过程中我们可以不把自己当做一个只会写代码的,我们可以从产品本身出发,思考为什么要做?如何去做?带来的价值是什么?这个过程也是我们思考自己工作意义的过程。

我的前端技术栈

成为前端工程署之前,首先要是一个软件开发工程师,计算机网络,操作系统,算法数据结构等等东西,包括设计模式,软件工程理论等等在学校学的东西东西不能丢了。说它们没用只能说是因为太菜了,做的工作太low以至于根本不需要这些东西。学校教的有时候不够,加上自己学习的,这部分有一个简单的知识体系。

作为前端开发者,首先肯定要学习html,css,javascript了,虽然我早期没写过大型静态页面,但是html,css至少是过关的,css3动画写的相对少一些,JavaScript的书我看过不少。自己不是一开始就从前端学起来的,和他们相比基础知识沉淀的时间不够长,,所以在学习的早期基础知识方面投入的比较多,我认为能用原生js思考问题很重要,用不用和会不会是两个概念。

框架工具在工作中主要使用的是vue,当然我觉得技术总是用来解决问题而存在的,框架之争没什么意义。我自己比较喜欢写react,纯属个人喜好问题,自己写东西我就使用react写了。

node.js还是不能丢的,在前端中主要是各种自动化工具,辅助开发的。node.js做web开发在生产中可能没机会实践,但是如果是我自己写东西玩,我就直接用egg了。

typescript是一个很好的东西,不是跟风,怎么说呢,用的时候起初我真没感受出来好,多写了很多类型接口定义,甚至一度觉得自己是给自己找麻烦。可是当我一旦再回去写js时候,我惊奇地发现我曾经觉得没那么糟糕的js原来这样难用(我用过java,熟悉静态类型,但是js些时间久了我觉得动态类型也挺好的,直到遇上ts)。用了就很难回去,大概感受它的到好处的人才会懂吧。

跨平台技术一直是大家的热点话题,目前我写东西主要用react native,因为它的生态相对完整,虽然至今没出1.0,但是有不少生产环境使用的案例,一些常见问题也都有比较成熟的解决方案。flutter是比较热门的,从设计理念来说,它是更先进的,如果发展的好,可能未来真的会成为主流,目前还很年轻,观望中吧。

以微信为首的各种小程序也属于前端工程师的开发范畴,这类东西我写的不多,如果有需要的话会去学习。

我很乐意去学习函数式编程相关的东西,FP和OOP本身并不是针锋相对的,二者也没有谁好谁坏,解决问题的方式很多,选择哪种需要考虑的点也很多。在公司中自然要统一编程风格,如果是自己写东西,我很愿意适当的使用fp解决问题。对我来说一个比较大的挑战可能是有时候思想被OOP限制了,有些东西还是要不断地去学习,包括响应式的Rx.js等等。

还有很多值得了解的,graphql,pwa,ssr,electron,webassembly等等,这些东西我会去找机会学习,有需要我也愿意主动去使用它们。要了解的东西很多,人的精力有限,对我而言二者之间的平衡点在于,这个东西是否值得。

大概是学习规划吧

目前的任务大概是做毕业设计,写论文。毕业设计中也可以学习react native,electorn等等东西,后面可能还会去了解一些docker等等工具,整个完成提升的可能不仅仅是技术能力,还有对于产品设计,对于开发流程把控等等方面能力。然后我会去补充学习一些前面提到的值得了解的东西,随时保持一个比较新的状态。此外还有基础的沉淀。另一方面就是技术的深度,包括各类工具的底层原理,公共类库的内部实现方式等,这方面的学习一方面能加深对于这些工具本身的认知,另一方面通过阅读也能提升自己的能力。还有一些性能问题等实际生产中才会遇到的问题,这些东西也是工作之后的一些认识吧,有机会需要提升一下。最后还是我的观点,技术只是一小部分,要提升自己的眼界。

一点想说的话

其实也曾经问过自己,累吗?后悔吗?我的学校很普通,也没遇上相关爱好的组织,身边的同学准备读研自然也没人和我同路。我自己坚持的动力大概来自于编故事的某乎社区。别人都行我为什么不行,我就是想有一天也可以像他们一样轻描淡写的一句--这东西一学就会了,这东西看看文档就能上手,这东西很简单。我知道背后的不易,但是我觉得我可以。不过真正到了今天,最后的我什么都不想说了,以后回首往事,我会很感谢今天的自己。(其实这里之前写了很多话,又删了)

最后感谢所有人,还有最爱的她。


掘金活动

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