全栈工程师修炼指南

别有洞天:从后端到前端

2020-11-15  本文已影响0人  码农架构

为什么要学习前端技术?

前端一直以来是一个颇具争议的领域,有人极其喜爱,有人避而远之,和多数“天下太平”的技术相比,这确实有些令人费解,但我认为这其中的原因至少包括这样两点。

如果你志在学习全栈工程,前端就自然是你无法避开,且还需努力驾驭的领域。但即便你的长期目标不在此,也应该学习前端技术,因为它能给你带来的好处是多方面,且是别的技术所不可替代的。具体包括这样几个方面。

遗憾的是,现实中有不少迈入职场没有几年,却已经给自己打上“前端工程师”“后端工程师”等标签的程序员朋友。我觉得他们可能是受到了某些万恶的职业生涯规划鸡汤的影响,这些标签会让他们在面对新技术和新机遇的时候,觉得身处“不属于自己的领域”而选择封闭自己。

因此我的建议是:职业生涯不宜过早做过细的规划,除了技术深度,也需要在技术广度上积累,等到一定程度以后再来选择自己的发展分支路线。而且,某些特定技术领域,在程序员给自己打标签的时候,压根还没有发展成熟,等到发展起来,时机真正到来的时候,只有那些原本“不偏食”的优秀的程序员才能够脱颖而出。

思维模式的转变

应用事件驱动编程

而在 JavaScript 中,在浏览器中,你看到眼花缭乱的效果和变化,却是“假并行”,是一个彻头彻尾的“骗局”。为什么这么说?

具体说来,在整个 JavaScript 的世界里,引起代码运行的行为是通过事件驱动的,并且全部是通过这唯一的一个勤奋的工作线程来执行的。那么当有事件产生的时候,这个工作线程不一定空闲,这就需要一个机制来让新产生的事件排队“等一等”,等当前的工作完成之后,再来处理它。这个机制就是 Event Loop,这个等一等的事件,就被放在一个被称为事件(回调)队列的数据结构中。

console.log("1");

setTimeout(function timeout() {
    console.log("2");
}, 0);

setTimeout(function timeout() {
    console.log("3");
}, 5000);

console.log("4");

于是上面的代码,实际在运行的时候,从事件队列的角度看,是这样的:

image.png

主代码最先被执行,从上往下顺序执行,因此顺序是:

  1. 先打印 1;
  2. 在遇到第一个 setTimeout 的时候,告知浏览器,请在 0 秒之后往事件队列内放入执行打印 2 的事件;
  3. 在遇到第二个 setTimeout 的时候,告知浏览器,请在 5 秒之后往事件队列内放入执行打印 3 的事件;
  4. 再打印 4;
  5. 主代码执行完毕,Chrome 的控制台打印这段代码的返回值,但因为它没有返回值,于是就打印 undefined。

实际输出:

console.log("1");

setTimeout(function timeout() {
    console.log("2");
}, 0);

setTimeout(function timeout() {
    console.log("3");
}, 5000);

console.log("4");

基于线程与事件驱动的比较:

image.png

基于线程的方式可以阻塞线程,等待时间或某个条件满足后再继续执行;而事件驱动则相反,发送一条消息后无阻塞等待回调的发生。阻塞线程的方式对资源的消耗往往更加显著,因为无论是否执行线程都被占用,但从人直观理解的角度来说,代码更直白,更符合人对顺序执行的理解;而事件驱动的方式则相反,资源消耗上更优,但是代码的执行顺序,以及由此产生的系统状态判断变得难以预知。

另外,需要说明的是,浏览器的 JavaScript 执行是单线程的,但不代表浏览器是单线程的。浏览器通常还包含其它线程,比如说:

学写声明式代码

声明式代码和命令式代码一样,都需要设计,且都需要测试。

举例来说,设计页面的时候,要先设计布局,抓住整棵 DOM 树中核心的部分,自上而下地去划分区域,哪些是静态的区域,哪些是动态生成的,并合理设计可重用组件。再比如说,使用声明式代码处理模板中呈现数据的格式转换,使得呈现部分的代码更纯粹、自然,具体请参看 [第 16 讲] 中的过滤器。

培养交互思维

前端工程师必须具备敏感的交互思维。通常来说,前端的代码,兼具着“甲方”和“乙方”的角色:

和用户的交互要求开发前端的程序员具备产品思维,而和服务端的交互则要求开发前端的程序员具备工程思维

扩展阅读

公众号:码农架构
上一篇 下一篇

猜你喜欢

热点阅读