本文不算是纯技术的文章,但是个人觉得这篇文章或者可以给你带来不一样的视角。
周末闲下来重温了凯哥(扔物线)关于“协程”和“内存抖动”的视频后颇有感慨,能把一项技术的本质介绍得如此通俗易懂,其对技术的理解已然是返璞归真,因为要把“高级”说得“通俗”需要对逻辑有清晰的认知。
内存抖动视频地址:https://www.bilibili.com/video/BV1xf4y127Ur
协程视频地址:https://www.bilibili.com/video/BV164411C7FK
“协程” 这个词听起来确实比较“高级”,在写作中创作者确实会喜欢用一些“高级”的词汇来“装饰”内容,这些高级的内容会形成“热点”,而追逐热点也是创作者的“习性”。不只是 Kotlin
的“协程”,比如:
Vue
3.0 面世后就会跟进一波源码和新特性解读;Deno
1.0 的发布也会有扎堆的对比和安利文章;因为追热点需要捧,捧过后必然就带来部分的对立,从而产生矛盾和流量。并不是说“追热点”有什么问题,因为“创作者希望带来流量”是一种正常诉求,只是这个度一直很难把握。
正如
Deno
出来后就会有鼓吹Node.js
要凉,在Android
领域Kotlin
面世后也有鼓吹Java
要凉,而近两年的“协程”的出现,也成了Kotlin
里追捧的“高级”概念,“协程”需要把RxJava
打下神坛。
那接下来就让我们以“协程”为切入点来唠唠嗑。
凯哥在关于“协程”的视频里很直白地介绍了:“协程”在 Android
上就是“切线程”。
是不是瞬间觉得“没意思”?“协程”只是 Kotlin
对于 Thread
的高级封装,本质和 Java
的线程池并没有太大区别,Kotlin
的“协程”是把 Thread
变成可以更方便地使用,能用“阻塞式”的语法写出“非阻塞式”的效果。
借用下凯哥对比的代码,是不是很直观?
在 Android
+ Kotlin
的基础上,“协程”更像是“语法糖”,它让开发人员可以更加方便地使用线程。当然,在 Android
上也不存在 “协程”比线程更轻的概念,甚至凯哥也扒了官方 Demo 的鸡贼,因为官方 Demo 提供关于“协程”和线程的对比中,在线程部分是直接用了 Thread
而不是用线程池,其实从这一点也可以看出官方在推崇新技术时也会“偏袒”。
那为什么新技术需要捧,新概念需要“高级”?因为我们会因为掌握了“高级”技术而自豪,新技术需要“高级”来带动热度,正是因为“高级”,所以有学习的价值。
“协程”并不是 Kotlin
才有的概念,事实上 Android
的技术栈一直是“相对保守”,并且不断地吸取其他领域的能力完整自身,从 MVC
、MVP
、MVVM
、 Dagger
、AOP
、响应式
乃至"协程",这些技术其实在其他领域就早已存在。
而 “协程” 比线程更轻的概念,在另外一些技术上是成立的。比如 JavaScript
和 Dart
,它们比 Kotlin
更早具备“协程”的概念,因为JavaScript
和 Dart
大部分时候是运行在单线程上。
用移动开发比较熟悉的 React Native
或者 Flutter
举例,它们都是运行在单线程上,如果这些代码里需要执行异步操作,就需要利用“协程”的理念,比如把异步的代码“挂起”,然后在线程的下一个“时间分片”上去处理,这时候的“协程”就只是一个“伪线程”,它“很轻”。
是不是又看到了一些不好理解的“高级”的概念?这里用一个不恰当但比较有意思的比喻解释:
Kotlin
上的“协程”更像是火影中的多重影分身术,它们都是物理存在的,像鸣人成为火影后,可以多个影分身又带娃又办公,真正的“多人运动”。
JavaScript
和 Dart
上的“协程”更像是龙珠中的“分身术”,实质上是一个人,只不过是运动速度太快,看起来就像分身,但是本质是一个人分割出多个时间点,更像是一个人在时间纬度上的“调度策略”。
关于调度策略推荐看这一篇文章的前半部分介绍: https://juejin.im/post/5dadc6045188255a270a0f85
当然
Dart
上也有isolate
这样的真线程概念,当然这就是另外一个故事了。
比如 Dart
上的异步,通俗说就是把需要异步执行的代码放进任务队列,然后线程会轮询这个队列,如果碰到“异步任务”就跳过,等它“完成后”不“异步”了就获取结果执行;如果还没有完成,就继续跳过,等待下一个时间轮询。
有些概念的技术本质上可能并不复杂,但“高级”的技术概念会带来自豪感,确实会让人在介绍技术时,不自觉地抬高了自身的“地位”,最典型就是凯哥所说的:面试官喜欢问“内存抖动”的概念。
本质上“内存抖动”其实就是频繁 GC 导致内存出现上下波动的情况,比如 Android
在 onDraw
方法里创建 Bitmap
引起的内存变化,但是在将这个现象将其称之为 “内存抖动”后, 确实显得形象和“高级”了不少。
而技术人在写作时,不自觉会把“高级”的概念给复杂化,因为“不复杂怎么高级”?
而我也开始反思自己过去在创作上的这种心态,优越感其实并不应该来自于“我会用这种高级的技术” ,而应该是“我能把一项高级的技术用最简单的方式和你讲明白”。
在思考“协程”的问题上,最后我想到的是写作。作为一个创作者其实我也“追热点”,比如:
Flutter
的技术热点;Android
新版或者 Andorid Studio
的大版本更新我也会追;因为作为创作者和开发者,新技术能给我带来话题和红利,在我的经历里,我觉得写作是最好的学习。想把一个东西“写明白”,你就需要先让自己“看明白”它是什么,另外“好记性不如烂笔头”,我现在都还会时不时翻自己的文章找一些东西。
所以当有人问我应该怎么学习时,我都会说:“试试写出来”?
当然写出来的东西就要被人“审阅”,自然就有人喜欢有人讨厌,互联网上的“戾气”相信大家应该有所体会。所以作为创作者,不可能想着把读者都服务得面面俱到,接受“反对”甚至“批判”的心理预期还是要有的,总不能因为部分的“否定”就放弃了吧。
举个简单的例子:比如每次发布 Andorid Studio
更新的文章,都会有反对或者抱怨的一方。其实我也理解,因为确实旧版本“又不是不能用”;又比如我在安利 Flutter
的时候,也会收到各种反对的意见:“Flutter 语法落后”、“跨平台没有前途”之类的评论。
“学不动”确实是当下的常态,我们希望可以在“固化”的技能下养家糊口,这很正常。
而关乎新技术,我的观点是:新技术的出现代表着新的可能,新的红利甚至新的机会。一般如果条件允许我会多去尝试新的可能,虽然这并不容易,但是这么做的原因可能是我在原本的领域遇到了“瓶颈”。
当然这个“瓶颈”不是我技术已经“巅峰造极”,而是感觉“我就到这了”,或者新的东西可以带来新的突破?确实在接触了跨平台和前端开发之后,反过来去理解 Kotlin
上的“协程”、Java
上的Stream
时,理解上是就有了不一样的视角。
另外,我也会时不时写错东西或者理解错一些概念,也很感谢那些指出我错误的人。虽然被人指出错误我会感觉挺“羞耻”,但是这比一直错下去好很多,比如之前我写过一篇文章,收获了不少意料之外的“投诉”和“反对”,这也给我带来了很多不一样的思考和理解,充满戾气的反对确实会让我产生“郁闷”,但是气消后再想想感觉也挺有意思的。
写这篇文章最主要是目的还是有感而发,吐吐槽,虽然我本身也挺懒的,也希望可以在舒适区内多待一会,“又不是不能用” 也是我口头禅之一,但是时不时我还是会选择出来折腾一下,大概潜在的意识里还是有些“不甘心”吧。
码码字,装装逼,作为一个普普通通的程序员,往往就是这样的朴实无华,且枯燥。