不一样的角度聊聊的协程、写作和学习

本文不算是纯技术的文章,但是个人觉得这篇文章或者可以给你带来不一样的视角。

一、“高级”的协程

周末闲下来重温了凯哥(扔物线)关于“协程”和“内存抖动”的视频后颇有感慨,能把一项技术的本质介绍得如此通俗易懂,其对技术的理解已然是返璞归真,因为要把“高级”说得“通俗”需要对逻辑有清晰的认知

内存抖动视频地址: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 变成可以更方便地使用,能用“阻塞式”的语法写出“非阻塞式”的效果

借用下凯哥对比的代码,是不是很直观?

不一样的角度聊聊的协程、写作和学习_第1张图片

Android + Kotlin 的基础上,“协程”更像是“语法糖”,它让开发人员可以更加方便地使用线程。当然,Android 上也不存在 “协程”比线程更轻的概念,甚至凯哥也扒了官方 Demo 的鸡贼,因为官方 Demo 提供关于“协程”和线程的对比中,在线程部分是直接用了 Thread 而不是用线程池,其实从这一点也可以看出官方在推崇新技术时也会“偏袒”

那为什么新技术需要捧,新概念需要“高级”?因为我们会因为掌握了“高级”技术而自豪,新技术需要“高级”来带动热度,正是因为“高级”,所以有学习的价值。

二、关于协程引发的思考

“协程”并不是 Kotlin 才有的概念,事实上 Android 的技术栈一直是“相对保守”,并且不断地吸取其他领域的能力完整自身,从 MVCMVPMVVMDaggerAOP响应式乃至"协程",这些技术其实在其他领域就早已存在。

而 “协程” 比线程更轻的概念,在另外一些技术上是成立的。比如 JavaScriptDart ,它们比 Kotlin 更早具备“协程”的概念,因为JavaScriptDart 大部分时候是运行在单线程上

用移动开发比较熟悉的 React Native 或者 Flutter 举例,它们都是运行在单线程上,如果这些代码里需要执行异步操作,就需要利用“协程”的理念,比如把异步的代码“挂起”,然后在线程的下一个“时间分片”上去处理,这时候的“协程”就只是一个“伪线程”,它“很轻”

是不是又看到了一些不好理解的“高级”的概念?这里用一个不恰当但比较有意思的比喻解释:

  • Kotlin 上的“协程”更像是火影中的多重影分身术,它们都是物理存在的,像鸣人成为火影后,可以多个影分身又带娃又办公,真正的“多人运动”。

  • JavaScriptDart 上的“协程”更像是龙珠中的“分身术”,实质上是一个人,只不过是运动速度太快,看起来就像分身,但是本质是一个人分割出多个时间点,更像是一个人在时间纬度上的“调度策略”。

关于调度策略推荐看这一篇文章的前半部分介绍: https://juejin.im/post/5dadc6045188255a270a0f85

当然 Dart 上也有 isolate 这样的真线程概念,当然这就是另外一个故事了。

比如 Dart 上的异步,通俗说就是把需要异步执行的代码放进任务队列,然后线程会轮询这个队列,如果碰到“异步任务”就跳过,等它“完成后”不“异步”了就获取结果执行;如果还没有完成,就继续跳过,等待下一个时间轮询。

不一样的角度聊聊的协程、写作和学习_第2张图片

有些概念的技术本质上可能并不复杂,但“高级”的技术概念会带来自豪感,确实会让人在介绍技术时,不自觉地抬高了自身的“地位”,最典型就是凯哥所说的:面试官喜欢问“内存抖动”的概念。

本质上“内存抖动”其实就是频繁 GC 导致内存出现上下波动的情况,比如 AndroidonDraw 方法里创建 Bitmap 引起的内存变化,但是在将这个现象将其称之为 “内存抖动”后, 确实显得形象和“高级”了不少。

而技术人在写作时,不自觉会把“高级”的概念给复杂化,因为“不复杂怎么高级”?

而我也开始反思自己过去在创作上的这种心态,优越感其实并不应该来自于“我会用这种高级的技术” ,而应该是“我能把一项高级的技术用最简单的方式和你讲明白”。

四、最后聊聊写作和学习

在思考“协程”的问题上,最后我想到的是写作。作为一个创作者其实我也“追热点”,比如:

  • 我很早就追 Flutter 的技术热点;
  • 每次 Android 新版或者 Andorid Studio 的大版本更新我也会追;

因为作为创作者和开发者,新技术能给我带来话题和红利,在我的经历里,我觉得写作是最好的学习。想把一个东西“写明白”,你就需要先让自己“看明白”它是什么,另外“好记性不如烂笔头”,我现在都还会时不时翻自己的文章找一些东西。

所以当有人问我应该怎么学习时,我都会说:“试试写出来”?

当然写出来的东西就要被人“审阅”,自然就有人喜欢有人讨厌,互联网上的“戾气”相信大家应该有所体会。所以作为创作者,不可能想着把读者都服务得面面俱到,接受“反对”甚至“批判”的心理预期还是要有的,总不能因为部分的“否定”就放弃了吧。

举个简单的例子:比如每次发布 Andorid Studio 更新的文章,都会有反对或者抱怨的一方。其实我也理解,因为确实旧版本“又不是不能用”;又比如我在安利 Flutter 的时候,也会收到各种反对的意见:“Flutter 语法落后”、“跨平台没有前途”之类的评论。
“学不动”确实是当下的常态,我们希望可以在“固化”的技能下养家糊口,这很正常。

不一样的角度聊聊的协程、写作和学习_第3张图片

不一样的角度聊聊的协程、写作和学习_第4张图片

而关乎新技术,我的观点是:新技术的出现代表着新的可能,新的红利甚至新的机会。一般如果条件允许我会多去尝试新的可能,虽然这并不容易,但是这么做的原因可能是我在原本的领域遇到了“瓶颈”。

当然这个“瓶颈”不是我技术已经“巅峰造极”,而是感觉“我就到这了”,或者新的东西可以带来新的突破?确实在接触了跨平台和前端开发之后,反过来去理解 Kotlin 上的“协程”、Java 上的Stream 时,理解上是就有了不一样的视角。

另外,我也会时不时写错东西或者理解错一些概念,也很感谢那些指出我错误的人。虽然被人指出错误我会感觉挺“羞耻”,但是这比一直错下去好很多,比如之前我写过一篇文章,收获了不少意料之外的“投诉”和“反对”,这也给我带来了很多不一样的思考和理解,充满戾气的反对确实会让我产生“郁闷”,但是气消后再想想感觉也挺有意思的。

不一样的角度聊聊的协程、写作和学习_第5张图片

不一样的角度聊聊的协程、写作和学习_第6张图片

不一样的角度聊聊的协程、写作和学习_第7张图片

不一样的角度聊聊的协程、写作和学习_第8张图片

写这篇文章最主要是目的还是有感而发,吐吐槽,虽然我本身也挺懒的,也希望可以在舒适区内多待一会,“又不是不能用” 也是我口头禅之一,但是时不时我还是会选择出来折腾一下,大概潜在的意识里还是有些“不甘心”吧

码码字,装装逼,作为一个普普通通的程序员,往往就是这样的朴实无华,且枯燥。

不一样的角度聊聊的协程、写作和学习_第9张图片

你可能感兴趣的:(Android开发,android,flutter,ios,java,kotlin)