10月はじめの "やさしい Swift 勉強会" は、個人的に節目的な回に当たるのもありまして。そんな節目な都度の恒例にしている :wakaba-small: オリエンテーション 回にしますね。勉強会のコンセプト等を再確認しながら勉強会を振り返る、そんな機会にする予定です。
そんなお話が終わったらまた Swift の話題に立ち戻りまして、前回の Swift 5.9 まわりの新機能の続きですとか、本編の循環参照のお話とかに戻っていけたらいいなと思っています。どうぞよろしくお願いしますね。
——————————————————————————— 熊谷さんのやさしい Swift 勉強会 #304
00:00 開始 00:10 今日はオリエンテーション回 01:22 勉強会のはじまり 02:08 習慣化は効果的な印象 03:56 積極的に脱線していくスタイル 04:45 題材は難しい? 06:34 所有権は最適化へのアプローチ 07:43 所有権は、暗黙複製に対する代案 08:42 複製タイミングを遅らせる手法 09:48 所有権のジェネリック対応がまだ貧弱 10:06 ~Copyable という不思議な名前 11:42 ~Copyable は複製できないだけ 12:32 ~Copyable でチルダが使われる理由 13:50 存在型での所有権の扱いに注意 15:35 Any は複製できる前提だった 16:56 所有権のまとめ 17:59 対話の定義にはそぐう印象 19:24 Swift の基礎学力を高めるのが目的 21:20 基本をじっくり、何度でも 23:06 理解するより触れておくことが大切 24:40 Swift に興味さえあれば誰でも歓迎 25:47 話しかける上での心持ち 27:33 クロージング ———————————————————————————
Transcription & Summarize : 熊谷さんのやさしい Swift 勉強会 #304
はい、じゃあ今日も始めていきましょう。今日は自分の契約の切り替えが3ヶ月ごとに新しい契約になるというタイミングなので、オリエンテーションと称して振り返りを行っています。次の契約期間は12月までの予定で、特に大きな変更がなければその後も続けられたらいいなと思っています。勉強会はずっとやってきて、これからも続けるつもりです。
この勉強会は研修を意識して進めていますが、もう少し積極的に研修的な要素に触れてみてもいいかと感じ始めています。2021年7月14日から始まり、だいぶ経ちましたね。とはいえまだ2年は経っていません。
毎回好きなテーマを適当に決めて進めるのがこの勉強会のスタイルです。最近は特に自分の知識が増えているなと感じていて、それは特にSwift周りで顕著です。自分の成長を感じられると同時に、参加してくれている皆さんも賢くなっているのではないかと期待しています。業務に追われていると基礎に手が回らないことが多いですが、この勉強会がその基礎力の底上げに貢献していると感じています。
やはり継続して開催することが大事で、頻度も重要だと感じています。例えばSwiftの新機能を見てみたり、脱線的な話題で充実した回も多いです。また、他の参加者からの質問を受けたり、それをきっかけに広がる話題も増えてきて良い感じです。
さて、ここから具体的な話に入りますが、最近は「優しい」というイメージを持ちながらも、多くの話題に脱線しています。例えば、「Swift Programming Language」を追いかけていると話が基礎に偏りがちですが、その基礎をどう捉えるかが重要です。また、Swiftの新機能や、スタパリエクステンション(例如、Standard Library Extensions)
の話もしました。データ競合の話もやりましたね。
特に、知識が不足しているところを調べながら話をすることもあります。最近ではSwift 5.9の新機能についての話題で少し難しかった回がありました。主にオーナーシップ(ownership)についてですが、これは所有権ではなく最適化に関わる部分だと考えています。
このように脱線的な話題も含めて、多くのトピックをカバーしつつ進めています。これからもこのスタイルで続けていきたいと思います。 最適化のためにオーナーシップが指定できるようになりました。これにより、どちらがメモリを管理しているのかを明確にすることで、自然な動作を実現できます。
「ボローイング」と「コンシューミング」は、消費と借用のことを指しますが、この用語が何を意味し、どのような場面でどう動くのかを一つ一つ理解するのは難しいです。これは数学の定理を覚えるのと似ていて、個々の定理を闇雲に覚えるのは大変ですが、基本的な原理を抑えることで、複数の定理を自然に導けるのと同じです。ですので、「ボローイング」と「コンシューミング」の違いを理解しておくことが重要です。
Swiftの所有権についての話ですが、勉強会中にスライドで説明した内容を若干修正したものです。多くの知識を覚えるのは大変ですが、基本的な部分をまとめました。Swiftの基本には「暗黙コピー」という概念があり、これを避けるためにオーナーシップを導入しました。借用(ボローイング)の場合と消費(コンシューミング)の場合で、所有権がどちらに残るべきかを決める必要があります。
まとめると、複製をできるだけ避けようというのがオーナーシップの考え方です。そして、次の点を理解することが重要です:
- 複製を避ける場合、どちらにデータを残すべきか
- 呼び出し元に残す場合、呼び出し先が変更できない
- 呼び出し先に渡す場合、変更が可能
このようにして複製タイミングを遅らせるのがポイントです。おそらく、これが基本の軸になります。
現時点でジェネリクスに対するオーナーシップの対応はまだ貧弱ですが、将来的には改善されるでしょう。
次に、「コピーアブル」についての話題です。「コピーアブル」と「チルダコピーアブル」の違いは、複製が可能かどうかです。例えば、~Copyable
は、この複製ができないことを意味します。C言語の用語で言えば、ビックリマーク(!
)は論理的否定、チルダ(~
)は算術的否定を表しますが、これはSwiftの文脈では必ずしも関連しません。
いずれにせよ、複製を遅らせるかどうかという点に焦点を当てれば、それほど難しくありません。表を作成する際には少し混乱しましたが、今後も理解は深まるでしょう。従って、複製タイミングを遅らせるという考え方を持っていれば基本は何とかなると思います。 議論の中で、誰がチルダ(~
)を見つけたのか、その意図は何なのかを尋ねることがありました。こういう知識をさらっと言えると、確かにかっこいいですよね。たまに気になることですが、なぜチルダが重要なのかがわかると便利です。ここでは理論というよりも、コンピュータ上でコピー可能かどうかの保証が大事になる場合があります。コピー可能でない場合もあり、その感覚が興味深いですね。
特にSwiftに関しては、所有権の基本が重要です。ただし、現時点ではジェネリクス周りで弱い部分があるので注意が必要です。具体的には、存在型(existential type)についてです。現在、存在型を代入すると消費(consumption)として扱われてしまうようです。プログラムを書く際に、右辺(RHS)から左辺(LHS)に代入するのですが、右辺は消費扱いになります。存在型に代入する場合、消費扱いになってしまうため、複製が必要になる場合があります。
特に注意すべきはAny
型です。Any
型も実質存在型であり、Any
に渡すと消費として扱われます。このため、混乱が生じることがあります。プリント関数に引数としてAny
を取ると、その引数が存在型になります。この場合、所有権を持っているものを渡そうとすると消費されてしまうため、エラーが発生します。
存在型に所有権を持っていけない理由についてですが、これはバイナリ互換性の問題が関連していると思います。例えば、Any
に対してコピー可能ではないものを入れたとすると、Any
だけではそれがコピー可能かどうか判断できなくなり、情報が抜け落ちてしまいます。したがって、存在型に所有権を代入しようとすると、所有権が抜け落ちてしまう可能性があるため対応していないのです。これがかなり深い問題であり、Any
が正しく機能するためにはどうすればいいかが議論の焦点となっています。 オーナーシップが難しくなっているという問題があります。ジェネリクスが登場したときには、その点を切り替える必要があると思います。ただ、切り替える点を除けば、前に紹介した表がすべてをカバーしていると思います。
右辺値についてですが、今週も取り扱っている内容になります。右辺値というのはあまり馴染みがないかもしれませんが、重要な概念です。そして、対話型の勉強会についても触れておきます。この勉強会は対話を重視しており、自問自答を通じて自分自身で深く考える機会を提供しています。参加者それぞれが対話の意味を見出すことができると良いと思います。対話の機会が増えること自体が重要です。表面的には大人しいかもしれませんが、それも一つの形です。
次に勉強会の方針についてですが、基礎学力の養成を重視しています。最近は少し脱線することも多いですが、それも基礎学力を深める一環だと思っています。最新の機能などについても触れることがありますが、それだけで新しい参加者が来ることはあまりないと思います。それでもプログラミングに関連する話題は重要です。
次に、サプリメントのような応用の内容も時々触れますが、これは応用の中でも基礎に位置するものです。勉強会の目的としては、言語に対する意識を持つことが重要です。たとえば、コピーアブルに関しても言語の仕様について考える良い機会です。
勉強会の指針として、「The Swift Programming Language」を軸にしています。これにより迷子にはならずに進めていますが、最近は少し脱線が多いですね。それでも悪くはないです。勉強会を運営する上で、何かしらの軸を持つことは大切だと思います。
同じ話を何度もしても構わないという方針で運営しています。質問があれば気軽にしてください。以前に話したことがあっても全然問題ありません。勉強会の時間において、繰り返し質問することを避けたりする必要はないので、どんどん疑問を解消していってください。
理解できたかどうかに関わらず、まず触れてみることが大事です。躊躇せずに、どんどん参加してもらえればと思います。 さっきの同じことですが、きっとそうですよ。いざ使ってみようとなったときに、この勉強会で理解できなかったとしても、なんかすごいことを言ってるなと思ってもらえれば大丈夫です。それで、理解できるように話せているとも限りませんが、まあ、そんな感じでも触ってみると、この勉強会で話を聞かなかったときよりは認識が明るくなります。ですので、本当に触れてみることが大切で、触れておくだけでも週3回くらいが効果的に感じます。繰り返し触れることで身につくことが多いからです。
最初はアソシエイトエンジニアが主体ですが、アソシエイトエンジニアと呼ばれる方が参加しているのかなと思います。でも、いろんな人が参加する中で、初心者に優しい雰囲気にしたいと思います。最近は社外の方も定期的に来てくれるようになり、嬉しい限りです。もっと初心者の方が参加してくれると良いですね。
短所形式なので、いつでも話しかけてくれて構いません。チャットでもOKなので、Zoomの得意な機能を使って気軽に話しかけてください。話しかける上での心持ちについても少し話しておきたいのですが、どんなに相手が詳しそうに見えても、知らないことがあるのは当たり前です。それを忘れずにいてほしいです。話しかけることで、相手が知らないことを知る機会を提供できるので、気にせずに話しかけてもらえると嬉しいです。
この界隈ではよく「それは根拠があるのか?」と問われることがありますが、勉強会の場ではそんなことを気にする必要はありません。根拠がなくても話していくうちに見つかることが多いですし、見つからないこともあります。根拠を探していたら話す機会を失ってしまうので、気楽に話しかけてもらえればと思います。
ということで、時間が来ましたので今日はここまでにします。最近の紹介としては、動画が今回進んでいるので、ぜひ見てください。あと、次回の出向勉強会は10月27日に札幌、12月8日に香川県の高松で予定しています。詳細はまたお知らせしますので、興味があればよろしくお願いします。
次回は通常の話題に戻って、本来の内容をやっていきますね。今日はこれで終わりにします。お疲れ様でした。ありがとうございました。