重回前端
后端之旅
记得几年前刚做前端的时候,每天的工作就是HTML + CSS + JS三件套,其实说JQuery更准确一些,页面布局,模板嵌套,一套JQ走天下,随着慢慢接触到了前端工程化,模块化,尤其是ES6的普及,才发现自己的基础那么差,开始恶补JavaScript的基础,看了几本书,每天在网上找案例,看博客,渐渐的也能手写一些原生JS,可很多软件工程的东西都不了解,只是似懂非懂,应付业务尚可,像一些原型链、闭包、继承的概念、MVC、分层、架构,都是知其然而不知其所以然,后来换了公司,接触了Vue,SeaJs,RequireJs,MVVM,看着一套套层层封装的框架,发现自己的知识结构如此薄弱,可又不知道该怎么发力,相信这也是很多刚工作一两年的前端程序员很迷茫的地方,明明书也看了,代码也敲了,还是感觉不得其法。
18年初,公司的业务方向发生了一些改变,前端的项目开发进度也放缓,而后端的工作有一些空缺,在做小程序的同时,我开始了后端的学习。公司的后端用的.net平台,于是从c#,SqlServer数据库,到MVC,三层架构,Http协议,ROM,IOC等框架也慢慢接触,随着全面转到后端开发,一年多的时间,也有了独立负责了项目,虽然做的项目不是太复杂,但后端开发带给我的,是一整套的webk开发流程,尤其是对前端的反哺。
反哺前端
-
在做后端之后,我对前端的很多概念都有了新的认识,也有了和以前不同的见解。以前总是听说,前端的工程化是基于后端多年成熟的工程结构演变而来的,很多新的技术也都能在后端技术里看到影子。前端作为后端开发中MVC的View,负责页面和数据的展示,而数据库,业务逻辑,数据过滤,权限控制等等等一系列看不到的东西都由庞大的后端所支撑,考虑的东西也多了很多。回过头再看一些以前不太明白的前端概念,突然有一种恍然大悟的感觉。
-
关于静态语言和动态语言。以前虽然知道两者的区别,但也仅限于概念,为什么说JS作为弱类型的语言,相对于强类型语言有先天的劣势呢。对于JS,一个var基本走天下,后来出来了let和const,语法的性质还是一样的,对于JS来说,定一个变量,就是可以随便的修改的,从来不用考虑的那么多,这也是我刚写C#时比较不习惯的地方。可随着业务逻辑的复杂,强类型的代码让程序更加清晰,代码编译前就确定了类型,并不允许改变,无论是字段,属性,还是方法,都各司其职,大大提高了程序的安全性。
-
关于类。刚开始学习JS的时候就知道了面向对象,可到底什么是面向对象,本来就是一个抽象的概念。由于以前JS没有提供类的定义,只是通过Function的构造函数或者原型对象来模拟类,学习起来就很吃力,虽然知道面向对象是什么,但是脑子里很难映射出相应的程序。而类作为很多后端语言的最基础的类型,可以把字段,属性,方法封装到一起,通过类的构造函数生成示例对象,可以说是面向对象语言里最重要的东西了,通过学习C#才真正了解到了面向对象的三大特性:封装、继承、多态。最近特别火的TypeScript,基本就是继承了C#的精髓,真正的用面向对象的写法去写JS。
-
继承和原型。JS的继承和原型、原型链一直是困扰我好久的东西,这里要感谢一本书《你不知道的JavaScript》,讲的非常详细,怎奈以前没有接触后端的时候,总是印象不太深刻,书中一直在强调类的概念,通过模拟类的特性,去理解继承和原型的指向,可在没有类的概念的时候,理解起来也还是非常吃力的。在C#中,继承作为重要的概念,使用的实在是太广泛了,想没有印象都难,尤其在学习了C#的反射以后,不自主的就联想到了JS中的原型。
所有的函数默认都会拥有一个名为prototype的公有且不可枚举的属性,它会指向一个对象,这个对象通常被称为函数的原型,通过prototype属性引用来访问它。
反射可以通过Type和GetType(),获取实例的类型对象,实现动态创建对象,动态赋值,动态加载类型,动态调用方法,而JS正可以利用函数的prototype属性来实现了这一特性。
重回前端
通过学习后端并实际应用开发,发现了C#语言的精妙和优雅之处,随着后端的深入,也让我明白了很多JS书籍里都会说的一句话,JS是把双刃剑,作为动态弱类型语言,由于使用的领域不同,所以有优势也有劣势。作为近几年最火热的语言,如果能把JS深入研究透彻,一定能让自己的技术获得一个巨大的飞跃,而TypeScript作为微软开发的JavaScript的超集,就必须得学一下了。于是花了两天时间,快速学习了一下TypeScript的语法。TypeScript本质上是向Javascript添加了可选的静态类型和基于类的面向对象编程,让Javascript也拥有了类、接口以及类型检查等许多静态语言才有的特性。在学习后端一年半以后,我觉得,我要重回前端了。
End
以前在学习的时候,不敢思考,不会思考,虽然看了不少书,但是只能跟着作者的思想走,学到了皮毛,却没有学到核心。一方面是接触的大型项目不够,很难抽丝剥茧,透过现象看到本质,其次,只局限于前端,殊不知前端不只是网页,而是软件工程的一部分,没有系统的学习整个web开发的流程。向前走,回头看,继续学习,扩大视野,不仅仅是前端程序员,而要成为真正的软件开发工程师。