2019 我的前端技能中对JS和CSS重大观念的改进 | 掘金年度征文

1,037 阅读12分钟

2019 我是奔着一个目标前进的,那就是成为一名合格的Web应用程序设计师,从今天起回顾这段历程的关键印象,以及重大观念改进事件,那种能成为个人专史的成长事件。其中主要记录对JS和CSS的重大观念改进。

人思想进展才算历史

历史哲学鼻祖黑格尔说,内容上的偶然而非时序上的偶然,才是真正的历史;而人的“内容”就是他的理性和思想。理性和思想的进展是人(类)进步的本质,思想不加深,理性不长进,人亦无历史可陈。思想的具体是「造物的能力」和「及物的态度」,简单的说就是才能,和品德。个人专史要记录思想的进展。

思想之能力与态度

人的思想二分为能力和态度;能力是人改造自然的力量,以知识为载体,以价值的导向;能力的强弱表现为知识的深浅和圆缺,知识越深(越接近原因),越全面,能力越强,越能创造价值;态度则比较的复杂。正直的态度,优良的品德依赖我们对人性(包括共性和个性)、社会 和自然发展规律的深刻认识,态度(品德)还是以知识为基础。态度(的改善)如此之复杂,以至于我们常常只能通过历史故事、人物传记、宗教神话和文化传统来“学习”。

专业技能加深与补缺

思想态度的进展是校准自己的位置,思维能力的进展是知识的加深和补缺。做软件开发的,只要有过一定的经验,没有人不认为自己懂面向对象编程;然而,真正到什么程度呢?了解?掌握?还是精通可用其来开发复杂一个代码库?这就是我2019第一个技术印象的意义:加深了专业的基础,对专业知识——JS的面向对象技术——有了更深入的认识,从而提高自己能力,推进了自己的思想;2019 后续印象很大一部分是对「完整Web开发技术能力」的䃼缺。

2019印象概观

2019我的前端技术进展大概有以下系列的印象:

  • 第一,对Javascript动态性及面向对象的分析
  • 第二,CSS的VF理论,以及页面常见布局方案(例如固宽和响应式);
  • 第三,Web前端技术,诸如AJAX,跨域,事件委托,JS程序加载;
  • 第四,MVC GUI体系,这个花了好长的一段时间,因为要学一种MVC框架;
  • 第五,Web项目构建;
  • 第六,JS应用技术,包括对象理论、函数对象技术等;
  • 第七,ES6。

本文主要记录前端开发者核心能力前两个表现:JS和CSS。

Javascript动态性及面向对象的分析

2019第一个专业知识的印象,是对Javascript语言编程的一个理论研究,一月中旬始花了一个多月时间,写了八篇技术博文(《我看Javascript》),算是一个小成果。

其实这次研究,是年前我对CSS所谓核心技术和任务的一个延伸(联想)研究。Web开发三个技术HTML CSS JS,我在去年年底曾细致了研究了CSS的一些核心技术(风格化,布局和动画),由此推及,JS也会有自己的“核心”技术和任务。

我意识到自己对JS核心的了解的不足,所以一直质疑很多流行的概念,例如闭包 IIFE,只是表面。然则,在首两篇简单的分析了JS语言所谓的核心特性后,例如JS针对Web应用的交互特性所发展的语言动态性,接着顺着深入的写(写JS作为一种编程语言中几个属——程序、面向对象),竟掘开了有关「程序」、「程序开发」、「程序的工程构造技术」等计算机工程的基础理论。现在回看起来,这一系列其实就是一个篇有关「程序构造技术」计算机科学论文的草稿。

探讨进路

《我看Javascript》的探讨进路是这样的:

JS特性 - > JS动态性 -- 程序的理论 -- > JS的OO特性 - > 程序构造技术/抽象化理论 - > 程序理论/工程构造理论

研究的重点是JS的动态性和OO特性,因这两个属性是JS最核心的特性。OO特性的分析的篇幅是最大的。研究的目标其实也是很简单,就是解释JS的面向对象功能,例如原型继承WHAT和WHY,目的当然更好的使用JS的OO(包括看懂别人的代码)功能。

分析过程中,发现OO是一支流行的现代程序构造术,针对「程序的精神构造」特性,使用一种「抽象化操作」(包括使用编译延迟等技术创建虚化中间构件)的构造术来建造「工程构件」,和「构件复合」; 分析进路可理解如下:

JS是一支使用原型继承的面向对象的编程语言
面向对象是一种使用对象抽象术的程序构造技术
程序是一种精神构造物
	精神构造物依赖抽象技术进行构件分解
程序工程是一种精神工程
	工程构造
		中间构件

面向对象是程序构造理论和抽象化的交叉,而程序构造理论又是程序理论(程序是什么)和工程构造理论(工程及构件是什么)的交叉。

以上多层理论的研究有了些初步的猜想,而这些猜想对OO 有了比原先的观念更深一步的解释(请看《我看JavaScript(七)》,还没对JS的面向对象特性进行解释)。由于存在猜想,还有我还是蛮着急找工作,写到第八分析精神构造分解术——抽象原理之后有点“不了了之”,像很多研究一样,要等待下一轮迭代,因为需一些实际的程序构造经验,来实证这些猜想。

初步结论

《我看Javascript》对JS两大特性——动态性和面向对象构造术——总结了更深入的解释,概略如下:

第一,JS针对交互应用的动态性,发展出语言动态性。什么叫语言动态性?运行时可动态修改程序形式,即是语言动态性。其中,扩展程序功能只是【动态修改】的一种;而程序的修改单元是,有状态的对象,不是函数或更细的语句。运行时动态修改程序对象【形式】是JS动态性的基本表现,而new一个对象是一种最常见的动态“修改”。常见语言动态性表象:

  • 闭包:闭包不是函数,它是一种特殊的类对象使用,“嵌套了函数的函数”其实就是一个类构造器;类创建多个对象实例,为程序动态添加同类功能;
  • IIEF:立即调用函数,其实就是一种一次性闭包,满足单例模式,给程序添加一项唯一的功能;
  • 函数作值传递:函数本身是无状态的,通用,可以是对象的方法属性,可以任何对象的方法。

第二,面向对象程序构造术; 对OO这种业界流行的程序构造术,研究它的基础理论是为验证它的工业结论的合理性,以及作出可能的改进,建立一种科学的成熟的程序理论和程序构造理论。目前工业结论包括找到了程序工程的通用构件,是带状态的对象,不是函数,也不是模块;类是一个编译时对象静态模板(可new一个新对象动态改变程序的形式);抽象基类和继承则是对【程序功能】开刀(而不是像「对象」是对程序的物理形态/组成结构开刀),提供一种更细致的程序分割的技术。类继承是功能的抽象部分(类本身是计算不完整的),对象是具体功能的多少(对象是计算完整的)。

于前端开发何用

任何理论研究看起来都是“无用”的,如果要问写了这些有关「程序的构造」理论研究,对我掌握前端开发有没有“用处”,我得说,真的有用。我们天天在写程序,却不清楚「程序」到底是什么;我们写程序用别人的对象,系统的API,自己创建对象,却不知道这都是一种「构造程序的技术」。基础理论不可能是无用的,只是没有被融通

我觉得对JS的基础理论加深最明显的益处,在后续前端开发学习表现在几个点:

  • 第一,当我读到一个「对象」他有更深刻的涵义,promise iterator generator都是对象,它们都是大程序的构造块,是独立的计算单元;
  • 第二,对JS 函数技术(函数作值传递、即时调用,闭包,this)有更深入的看法;
  • 第三,函数式编程也是一种程序构造技术等等等等;

概括起来,可讲我的「程序开发观念」有了一次重大刷新。

CSS VF理论的总结

2019 第二个技术印象,应该是CSS的VF理论的总结。VF是visual formatting ,视觉格式化(很多人译为可视格式化),我认为VF主要是指布局(layouting),虽然风格化(styling)和动画也有格式化的涵义。

其实去年年底我已经对CSS的各种布局技术有过一次“持续”的分析,是我常用的反问剖析方法做出的,现在回想起,那是一次刺激的精神探险,从熟悉的一些现象开始追问,一步步闯入一直以来困惑的领域,找到了很多“原因”,写下多篇#CSS进阶#,详情看这里

年前的VF技术分析还是比较粗糙的,还没有上升到理论(还不清楚它们的共通的地方),但这些分析对今年的学习有两个贡献:第一,为VF理论作了准备;第二,为作业理论提供了实例;这里简略说说作业理论。

当我研究多个相似的东西的时候,下意识就会对它们进行归纳。面对多种布局技术时,我就会对技术,及技术所完成的任务作出拷问,而因为我在提高自己的专业能力,这些汇总在起,我发一起了个贯通全年的一个学习指引:

所谓专业,就是对自己所使用的工具(技术),和负责的任务有特别细致的理解。

技术和任务,是作业理论的两核心概念,后面再分析。

CSS布局理论初步结论

先小结已经掌握的VF理论。今年有三次思考“企图”触及VF理论,它分别是:

  • #什么是布局(layout)#
  • #手动定位与完整的视觉格式化模型#
  • #精简逻辑与复杂技术#

“什么”、“完整”和“精简逻辑”都带有理论的意味。首先,VF或布局是任务,布局理论是一个过程/活动的理论,过程产出一交互界面。所以,布局理论是关于这个任务过程中种相关概念的理论。

布局的直显意思是给交互内容安排位置,然,一张复杂的交互页内容是相当多的,要精细控制交互内容位置,布局必有规则可依。

第一个规则是画布的概念(将交互页划分不同的画布单独布局),其次是内容框。布局的定义,就是在画布上排放内容框;又,为了实现复杂的布局任务,画布可以是另一张更大的画布的内容框。所以布局任务是可以嵌套的;而单一布局任务,则是根据不同的布局需求,选择不同布局算法。

由于布局任务就是在画布上安排一个或以上内容框的位置,布局算法的核心是决定内容框(边界)位于画布的什么位置上:

  • NF:一种类似固定的位置算法——向左向上靠(流),位置由内容决定,是个内容相对定位;
  • position/relative :原地相对
  • position / absolute fixed :手动绝对定位算法
  • flexbox:自动计算

总结起来,一个内容框在画布上的位置,可以是固定的、相对于某个参考点、绝对手动的、和自动计算等几种。

交互页的整体布局方案

至此,布局(VF)理论基本成型,后续可能需要再补充完善,对float、flexbox和grid等布局技术的分析。总之,多项的布局技术变种,是基于一通用的布局理论。而不同的布局技术提供不同API(通过画布或内容框的CSS属性),针对不同的布局任务(交互功能不同),例如NF和float针对图文混排,flexbox适用局部交互控件,grid适用于全局交互页。

CSS 还有一个深刻的印象,是交互页的整体布局方案。交互页的「布局」,和交互应用的页面「布局设计方案」,应该是两个不同性质的任务。交互布局是在一个逻辑边界内作业的——针对一个交互故事选择布局技术;而布局设计方案则是根据应用「介质特性」决定页面的设计风格,例如早期的定宽设计越来越被流行的响应式设计所替代。

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