Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決...
Search
yimajo
August 20, 2026
Programming
71
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
https://potatotips.connpass.com/event/400003/
yimajo
August 20, 2026
More Decks by yimajo
See All by yimajo
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
900
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
710
11年かかって やっとVibe Codingに 時代が追いつきましたね
yimajo
1
400
iOSアプリ開発で 関数型プログラミングを実現する The Composable Architectureの紹介
yimajo
3
340
良いテストコードのために悪いテストコードを理解する - 不安定なテスト編: iOSアプリ開発ユニットテストの場合
yimajo
22
6.8k
TCAの Shared Stateって どういう仕組みになってんの?
yimajo
0
2.7k
Swift 5.9 からの Observation はiOS17 未満 からも使えて struct の変更検知もできるんすかね?
yimajo
2
1.2k
不安定なテストは200種類あんねん
yimajo
3
1.2k
TCA v0.19.0からのSwitchStore/CaseLetが良い
yimajo
0
2.1k
Other Decks in Programming
See All in Programming
リアルな遅延を測る仕様
kota_yata
1
120
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
120
バグを直したら useEffect が消えた
colorful12
3
640
VibeCodingからAgenticWorkflowへ
starfish719
0
650
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
110
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
390
メールのエイリアス機能を履き違えない
isshinfunada
0
240
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
520
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
160
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
1
140
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
420
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
330
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
46
8.2k
BBQ
matthewcrist
89
10k
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
How to make the Groovebox
asonas
2
2.3k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
450
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
GitHub's CSS Performance
jonrohan
1033
470k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Six Lessons from altMBA
skipperchong
29
4.4k
エンジニアに許された特別な時間の終わり
watany
108
250k
Side Projects
sachag
455
43k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
Transcript
POTATOTIPS #96 片 田 舎 のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PR を出すが、解決方法がキャッシュをしないようにす ることであり、ビルド時間が伸びると言われてマー
ジされないので高速化もする 片田舎のおっさんこと yimajo BIG 3 PR SQUAT 85kg, BENCH 80kg, DEADLIFT 110 kg
はなしの前提 落ち着く… 前提は良い —-集中
Appleプラットフォーム用のネイティブなビルドはSwift Buildを使う Xcode $ xcodebuild $ swift build OSS llbuild
Swift Build アプリのバイナリ potatotips #96 Swift Compiler
依存関係のダイアモンド問題について 大抵のビルドシステムは モジュールの依存関係がダイアモンド型になるとき、 2経路がそれぞれStaticでないなら、 依存先をDynamic Linkにする。 (逆に経路が両方Staticなら依存先はStatic App Static Feature
A Dynamic Feature B Dynamic Dynamic のままでいい) 「ダイアモンド問題の解決」と言ったりする。 Common CommonはDynamic Linkにしないといけない potatotips #96
ダイアモンド問題の解決できていないなら? もし、Feature AがStaticで、Feature BがDynamic App と固定されていて、CommonがそれぞれStaticとし てLinkされると… Static Feature A
ビルド時にAppはFeatureA経由でCommonをStatic Link Dynamic Feature B Static Static で含んでいて、アプリ起動時にDynamic LinkでFeatureB 経由で別のCommonを呼び出してしまう。 これで、2つのCommonが1アプリに重複して存在してし Common Common まう。 potatotips #96 04
解決した不具合と解決方法 落ち着く… 不具合解決は良い —-集中
Swift Buildの潜在的不具合 App Dynamic固定 Embedded Framework • Step1: top-levelなTargetからダイアモンド判定 •
そしてそれを重複判定しないようにキャッシュ化 • キャッシュ化された子のTargetを判定から外す Dynamic判定 • Step2: その他TargetもDynamic判定 • -> 子が別のTargetから重複しているのに判定から外される Feature X Feature A • 例 判定から外す • Feature AがAppとEmbeddedFrameworkからリンク • Dynamic判定されるが、FeatureAの子Commonは判 定材料から無視される • FeatureXのCommonは2つあるので本来Dynamic判定 すべきだが、判定材料の対象として見つからない Common Common Commonは重複だがもう一方の Commonは存在しないものとさ れDynamic化されない potatotips #96
不具合修正の解決: PR #1424 ワイ「キャッシュの数行を削除することで問題を解 決だ!Pull Request出す」 レビュアー「処理が指数関数的に遅くなるけど、 DFSアルゴリズムに書き換えることはどう思う?」 ワイ「…!」 potatotips
#96
不具合修正の解決: PR #1424 やったこと 1. 不具合が再現するプロジェクトを用意 2. 不具合の再現をテストコードとして用意し失敗を確認 • このテストが成功することを目指す
3. DFS(深さ優先探索)アルゴリズムを調べる • 型を作りそのメソッドにロジックを書く • テストコードを書いておく 4. 上記2種類のテストが成功するように 5. 再現プロジェクトでも不具合起きないようにする potatotips #96
不具合修正の解決: PR #1424 思ったこと • しかし不具合解決と高速化を1つのPRでやりたくないん だけどその理由は差分がわけわからんことになるから • (そもそも既存コードがわけわからんすぎる) •
PRの差分の読みづらさを許容するんかい • こちらはもっとやりたいようにコードを書く • フォーマットはこちらが読み易いようにもする potatotips #96
不具合修正の解決: PR #1424 ワイ「DFS使ったしワイの作りやすいようにした わ!」 マージ potatotips #96
こんな感じを繰り返し現在8個PRを出して6個マージ済み potatotips #96
片田舎のおっさん、 The Swift Programming Language グループの Member になる potatotips #96
感想:マージまでにも学びがある 01 あきらかな問題でも修正と高速化を同じPRで扱うことになる これは自分のやり方と違うけど郷に入っては郷に従うのがいいと思う 02 具体的なアルゴリズムを指定されることがある 依存関係は逆から辿ることで分岐もないので正直議論しても良かったが私には言語力がない 03 1つのPRの変更は1コミットにまとめ、force pushしてって感じ
おそらく、差分の読みやすさとかコミットログとか気にしていない? 自分たちがずっと使っていくAppleの製品へ組み込まれるコード やる意味は大きい…みんなもやっていこう potatotips #96
発表は以上です さらに知りたい人向けの内容 おまけ: 実態の違う同名の型が存在するとどうなる? potatotips #96
知らんのか? potatotips #96
Feature AとBそれぞれからシングルトンを作成しようとすると それぞれ2つできる Feature A static let sharedな何か Feature B
static let sharedな何か この例はCommonへのStatic Linkが2個だけど CommonへStatic LinkがN個かつDynamic LinkがM個という状況でもダメ potatotips #96
2つの経路で取得したインスタンスのキャストが失敗する 2つの別々の経路から取得した型を比べようとすると 一致しないので `error as? Common.Failure` は失敗するし `do { }
catch Common.Failure { }` も失敗する potatotips #96
リソースが2つあったら超無駄 potatotips #96 Feature A Commonのリソース Feature B Commonのリソース