2/26/2017

Swiftはどうなるのか? (Whither Swift?)

Underpassの開発者、ジェフ・ジョンソンのエッセイ。スターウォーズ・サーガをもじって。

私は次の疑問を自問している。AppleのSwiftObjective-Cの計画が何なのか? Swiftが2014年に公開されたとき、作者のクリス・ラットナーは、SwiftとObjective-Cは永久に共存すると主張しているように見えた。xcode-usersのメーリングリストの投稿より:

> On Jun 3, 2014, at 5:45 AM, McLaughlin, Michael P.  wrote:
> AppleがCとC++のサポートをやめるつもりかどうか、ご存知の方はいますか?
> そのように聞こえます。Fortranのコードがたくさんあるにも関わらず、既にFortranをサ
> ポートしていません。MultiNestのようにかなり新しいコードでさえサポートされません。
>
> そうではないと言って下さい。私たち全員、「パワーユーザ」は長編漫画を作るだけの人で
> はないと考えています。多くは科学者やエンジニアです。

やぁ、マイケル、

そういう計画はありません。Swiftはプラットフォーム上で開発するための新しいオプション
です。C、C++、Objective-Cをやめる計画はありません。あなたがそれらに満足しているな
ら、気兼ねしないで使い続けて下さい。

-クリス

問題は誰もこれを信じていないことだ。そしてもちろん、ラットナーはAppleを去ったので、彼の主張が間違っていたと分かっても批判を受けることはない。開発者間の大多数の意見は、Appleが最終的にObjective-Cを廃止し、SwiftはCocoaアプリ開発の唯一のファーストクラス言語になるだろうということだ。AppleがObjective-Cをサポートするコンパイラを非推奨にしたり削除したりする理由はないため、「ファーストクラス」を与える人物は重要である。コンパイラは多くのプログラム言語をサポートし、そのうちいくつかは非常に古くてほとんど使われていない。そのため、ラットナーの主張は専門事項に基づくと真実ではあるが、誰もが気にすることではない。彼らはiOSとmacOS上のCocoaアプリを作るための言語を使用することについて関心があるのだ。

開発者のコンセンサスがおそらく正しいのだろう。私はObjective-CとSwiftが永久に共存し続けられないというコンセンサスに同意する。しかし、Swiftが未来だと、私は他の開発者ほど確信は持てない。コンセンサスはおそらく正しいが、もし間違っていたらどうなるだろう? それが私がこの記事の中で探求したい可能性である。まず、SwiftとObjective-Cがなぜいつまでも平和的に共存できないのかを話そう。

新たなる希望? (A New Hope)

SwiftもObjective-Cもどちらも、Appleのプラットフォーム以外の開発にはほとんど使われない。それは将来変わるかも知れないが、今のところ事実である。Appleのプラットフォーム上でアプリを書きたいなら、どちらか一方、あるいは両方を学ばなければならない。新しい開発者の疑問は、どちらの言語を学べばいいのか? 一つの言語しか学ばないなら、標準的なアドバイスはSwiftを学ぶことである。標準的なアドバイスに必ずしも同意するわけではないが、それが標準的なアドバイスであることには同意する。賢い人の頭は、Objective-CとSwift両方を学ぶべきだと示唆している。しかし、その点に問題が潜んでいる。アプリを書くだけのために、二つの新しいプラットフォーム固有のプログラミング言語を学ばなければならないなら、Appleのプラットフォームは開発者にとってそれほど魅力的ではない。Swiftは、Objective-Cよりもモダンで親しみやすいため、新しい開発者にとって魅力的だと一般に言われている。しかし、Objective-Cをとにかく学ばなければならないとするなら、優位性はどこにあるのだろう?

サードパーティの開発者はSwiftを採用した... 素早く(swiftly)。Appleがジャンプと言ったら、彼らは飛び込んだ。アポロニアがミネトンカ湖へ。Swiftが非常に人気となり、取り敢えず、速かったと言っておこう。これはSwiftのリソースへのものすごい需要を生んだ。メーリングリスト、フォーラム、ブログ、Stack Overflow、Twitter、あちこちで開発者はSwiftについて知りたい、話したいと思った。Swiftは技術本出版業界に影響を与えた。労働市場にも影響を与えた。合理的であろうと、無知でブームであろうとなかろうと、多くの企業が今はSwift開発者だけを採用している。Appleのプラットフォームへの多くの新しい開発者は、Objective-Cを知らない。多くの元Objective-C開発者はSwiftのみを使うようになり、彼らはObjective-Cを忘れ、読んだり書いたりしなければならない時、頭を抱えている。開発者間のSwiftに対する熱意と要求は、Objective-Cを消し去ってしまう危険性がある。二つの言語はAppleの考えの中では公式には共存かも知れないが、他の人の考えの中は非公式に共存にできるだろうか? 全てのメール、ブログ投稿、ウィキページで2言語スタックが存在できるだろうか? オープンソース・プロジェクトではどうだろう? 彼らはObjective-CあるいはSwiftだろうか? 労働市場がほとんど独占的にSwiftに移行するなら、開発者は選択肢がなく、その方向に向かうしかない。

帝国の逆襲 (The Empire Strikes Back)

これまでの議論はObjective-Cが絶望的だということを示唆している。Swiftはサードパーティ開発者で優位に立ち始めている。サードパーティ開発者はAppleのプラットフォームを支配していないため、まだ全てが失われるわけではない。Swiftの支配が始まっていない一つの場所が、皮肉にもApple自身の中にある。Apple自身。AppleはSwiftを採用するのが非常に遅かった。この時点で、Appleは話にならないほど少ししかSwiftコードを出荷していない。このテーマの素晴らしい分析は、最近のブログ投稿の中で見つけることができる。言い訳になるかも知れないが、いくつかの説明は、この欠落を説明するつもりだ。例えば、Appleのフレームワークは、まだABI安定性を達成していないため、Swiftを使うことができない。(あるいは、そのことについて言えば、ソースの安定性も。) それを説明したいと思うが、Appleの内部Swiftコードベースは相対的にとても小さいという事実に変わりはない。Appleは世界で最も巨大な現存のObjective-Cコードベースを持っている可能性が最も高いのだ。

今日、Appleが二つの言語のうち一つを廃止する必要があるなら、どちらを廃止するだろうか? Swiftを廃止することはサードパーティ開発者には非常に辛いだろう。一方、Apple自身にとっては、Swiftを廃止することは比較的痛みはない。AppleはSwiftからObjective-Cに変換するコードがほとんどない。確かに、AppleはSwiftに、特にXcodeに関して多くの努力を払っている。しかし、それらはサンク・コスト(埋没費用)である。もし、Appleが合理的であれば、彼らは失敗したビジネスにさらにお金をつぎ込むべきではない。AppleはObjective-Cに、特にXcodeに関して多くの努力も払っている。そして、それらはサンク・コストでもあるが、Swiftのコストよりも過去にさらに沈んだだけである。重要なことは、すでに支払った対価ではなく、将来支払われるべき対価である。Appleはサンク・コストを回収不能と見なすことに反対していない。噂によれば、彼らは何も見るものがない自動運転プロジェクトに多くの資金を投入し、報道によればそのプロジェクトは大部分が棚上げにされている。

Appleはその気になればObjective-Cコードベース全体をSwiftに変換できる。彼らは確かにリソースを持っている。彼らが所有する流動資産の量は、歴史上前例のないくらいの大きさで圧倒的である。それにもかかわらず、現在の企業文化が彼らはこの変換を行うことができない、あるいはしないだろうと言うことを示唆している。いくつかの要因が障害になっている。まず、AppleはすべてのメジャーOSバージョンのリリースサイクルを毎年に変更した。確かに、彼らはアジャイル・ソフトウェア開発の考えを実行しているという報道がある。これにより、完全な書き直しのための余裕や時間はほとんどなくなっている。また、Appleがスクラッチでアプリやテクノロジーを書き直す時、品質が低下しがちで、機能が失われる傾向があったのをこれまでも見てきた。

第二に、Appleは最高のエンジニアを雇用することを誇りにしている。私は、Apple内部と外部のエンジニアを多数知っているが、これは神話だと考える。しかし、これが本当かどうかに関わらず、Appleが信じていることは事実であり、従って大量の新規採用を行うことはまずないし、Objective-Cコードを書き直す問題で多くの人を投入することもない。

第三に、私が最初に指摘したことに関連し、Objective-Cエンジニアのアベイラビリティは低下している。Appleがこの問題に多くの人を投入したいと思っているなら、その人たちをどこで見付けてくるのだろうか? Objective-CコードベースをSwiftに変換するには、両方を理解するエンジニアが確実に必要である。Objective-Cを知らないエンジニアがObjective-CのコードベースをSwiftに書き直そうとするのは、惨事を招く行為だろう。

Appleの内部計算は、ソフィーの選択を一つの言語にする必要があるなら、Swiftは斧を手にしなければならないことを示している。あなたが全面的にSwiftに投資しているサードパーティの開発者なら、この考えは少なくとも少しはあなたを驚かせる筈である。そして、自分自身に尋ねて欲しい。もし、今日振り子がそのように振れているなら、どのくらい変化し、どのくらい長く、他の方法で振れる振り子を巻き上げるか? 何時、何年、Objective-CよりSwiftを切り捨てるのはAppleにとってより痛いだろうか?

AppleがSwiftを捨てることで、開発者をひどく裏切る可能性がないわけではないことに、あなたはブツブツ言うかもしれない。どのくらいAppleの幹部は夜眠ることができるか? 私は現金で一杯のマットレスを信用しない。彼らは再考しなかった。彼らは勇気があると自画自賛するかも知れない。廃止、失望、苦しみ、約束の反故と長々続く経験に関連するApple開発者の歴史を振り返る必要がある。Objective-Cのガーベジ・コレクション、64ビットCarbon、Cocoa-Javaブリッジ、Windows向けYellow Box、Dylan、これ以上続ける必要はない? 私は続ける。Appleエバンジェリストは、Swiftはこれまでにない最高のプログラミング言語だと言い、その後、我々は常にSwiftと戦ってきたことを伝えて突き放すわけだ。

プリクエル (The Prequels)

AppleがSwiftを作ることを決めた時、オリジナルの計画は何だったのだろうか? 3つの可能性を考えてみる:

  1. 彼らは本当にObjective-CとSwift両方をいつまでもサポートするつもりだった。
  2. 開発者の大多数が信じている、Objective-Cを最終的に廃止し、Swiftに移行するつもりだった。
  3. 彼らはしっかりした計画が無く、Swiftが採用されるかどうかも分かっていなかった。

私が既に要点を述べた理由で、1は愚かな計画である。そして、Appleに対して疑わしきは罰せずとするが、1ではないと言える。

2が計画だったら、私はAppleがそれについて積極的になることを本当に期待する。ラットナーのメッセージはせいぜい誤解を招いたことだろう。Swiftが未来なら、なぜそのことを開発者に明確にしないのだろうし、それに応じて計画を立てるだろう。不確実さはこれの最悪な側面である。我々は選択肢が無ければ、まだSwiftが未来だと受け入れることができる。しかし、SwiftがAppleの選択であり、彼らは我々の選択肢を持てるという幻想をまだ我々に与えたなら、我々の一部が知らずに誤った選択をしており、これは皆にとって有害である。

私の考えは、3が真実だということだ。多くの人がAppleはいくつかの壮大で秘密の長期基本計画に準じて行動していると思い込んでいることは知っている。Appleは長期計画を持っているだろうか? 疑いの余地はない。それでは、計画は暫定的ではないのか? それは疑わしい。テック業界では、長期計画を立てることはできるが、長期計画を維持することは期待できない。テクノロジーは変化する...素早く(swifty)。あなたは機敏に動けるようにしておく必要がある(しかし、アジャイルでは無く)。競合先の行動に反応できなければならない。ラットナーの退職を考えてみる: Appleの計画の一部だったのか? 計画は変化する。彼らは変化しなけばならなかったのだ。サードパーティ開発者は即座にSwiftに飛び付いたが、AppleはSwiftが開発コミュニティで肩をすくめてしまう可能性を考慮しなければならなかった。うまくいくように願うが、最悪の自体に備えて計画を立てる必要がある。

ローグ・ワン (Rougue One)

誰に聞いても、SwiftプロジェクトはAppleの中でさえ秘密だった。少数の選択された人だけが知らされていた。AppleがSwiftを発表した時、サードパーティ開発者にとっても、ほとんどのAppleエンジニアにとってもとても驚きだった。Appleエンジニアやエンジニアリング・マネージャはそれに備えていなかった。これはSwiftプログラミングにとって最大の課題を示している: Appleのエンジニアリングチーム間の内部衝突である。幹部のサポートを得ているSwiftチームはAppleのアプリ開発の未来としてSwiftを提示する。しかし、Swiftチームはそこにあるものを単純に廃止できないし、未来を既成事実にはできない。Apple内の今はObjective-Cである。Objective-Cがたくさんある。AppleがNeXTを買収する前から累積されたObjective-Cの数十年がある。Objective-Cコードベースは希望的な考えで単純に消し去ることはできない。非常に時間が制約され、リソースが制約されているApple内の多くのチームにあなたがSwiftを紹介したとする、彼らはあなたに邪魔するなと言うだろう。彼らはSwiftのアイデアは好きかもしれないが、WWDCがすぐそこにあり、作業を完了する必要がある。おそらく来年も。いや、それ以降の年も。

Appleはこれらの競合する利害関係をどのように調停できるだろうか? 彼らはSwiftを未来にしたいと思っているが、大量のObjective-Cコードもあり、最高のエンジニアだけを採用しながら、アジャイルなソフトウェア開発を続けたいと思っている。そして、ソフトウェア品質を維持したい。(願わくは、彼らが品質について注意を配っていると仮定する。) いずれは何かを譲歩しなければならない。その一方、外部の開発者らはSwiftのリソースにAppleへの要求を増やすだろう。APIリファレンスはおそらくかなりの程度自動化されているので、デュアルスタックでも大きな問題はないだろうが、Swiftの開発者らはSwiftのドキュメントガイドやSwiftのサンプルコードを必要とする。公的立場がAppleがSwiftとObjective-Cの両方をサポートするということなら、全てのドキュメント、全てのサンプルコードをデュアルスタックで書くのだろうか? そして、非常に古いObjective-C指向のドキュメントを更新するためにどのくらいの努力を払うのだろうか?

この問題へのコンセンサスは何だろうか? AppleがObjective-Cを廃止するだろうと考える人は、Appleがどのように扱うと考えるだろうか? 一部の人々は、Appleが対外的にObjective-Cを廃止するだろうと考えているが、彼らはいつまでも内部的にObjective-Cの開発を続けるだろう。しかし、私はこれらの人たちが問題を過小評価していると思う。Appleが持つObjective-Cコードの量や、彼らが取り組んでいる制約を考えると、内部的にもゆっくりした道を歩み、実際にはSwiftの未来は非常にゆっくりした道となるだろう。Appleが内部のObjective-Cツールチェーンを維持する必要があると思われる期間はどのくらいだろうか? あなたが5年、10年と考えていないなら、10年もさることながら、私はあなたが問題の大きさを理解していると思わない。私には、Appleが内部専用のXcode、内部専用のObjective-CのAPI、内部専用のObjective-Cドキュメント(皆がドキュメントを必要とする)などを開発し維持するリソースを置くことはほとんど不可能に見える。再度、Appleが正式にObjective-Cを廃止するなら、Objective-Cの開発者の数は今ようりも急激に減少するだろう。そのため、AppleはObjective-Cコードベースをいつまでも維持し続けるため、世界中で人を見付け続ける事ができるだろうか?

エピソードC (Episode C)

ここで私の主張への考えられる異議に反論させてほしい。異議はAppleは以前からObjective-CとC、FoundationとCore Foundationのデュアル・ソフトウェア・スタックを持っていたいうもの。スタックにもう一つの言語を加えることは新しいことではない。この異議は一見説得力があるが、固有の欠陥がある。CとObjective-Cは別の言語と言うのは事実だが、CはObjective-Cのサブセットなので、Swiftでの類推はうまくいかない。あなたがObjective-Cを学習する場合、うまく習得できたとして、あなたはCも学習したことになる。多くの人はCを最初に学習し、Objective-Cは後になるのは重要ではない。確かに、それが私が学習した方法で、私がお勧めする教育ルートである。しかし、CとObjective-Cを学習することは、2つのプログラミング言語を学習するのと同じではない。事実上、それは単にObjective-Cを2段階で学習しているだけである。Cについて学習する全てが、Objective-Cに直接適用できる。いわば、学ぶだけ。それが、Swiftでは全く違う。もちろん、SwiftはObjective-Cを念頭に設計されているため、いくつか重複があるが、決して他のサブセットとは言えない。SwiftとObjective-Cは、ある意味で非常に近しいC++とCよりもはるかに互換性はない。

さらに、CだけではiOSやmacOSアプリを開発するファーストクラス言語では全くない。完全にCでアプリを作ることはできるか? おそらく、しかしもちろん簡単ではない。Cのアプリケーション開発環境はCocoaではなくCarbonであり、Carbonはほとんど廃止されている。Appleのプラットフォーム向けにかなりの数サポートされたC APIはあるが、Cはアプリ開発に関してObjective-CやSwiftと同じクラスにはない。

何々の復讐 (Revenge of the Something Something)

これは私の疑念であるが、AppleはSwiftがすぐに人気が出ると見込んでいたかどうか疑わしい。Swiftが長年掛けてゆっくりした成長をしていたら、全体の戦略は非常につじつまが合う。開発者ベースがほぼ均等に分かれていたら、デュアル・ソフトウェア・スタックは経済的である。Appleとサードパーティ双方が既存のコードベースをObjective-CからSwiftに移行するのに十分な時間がある。Swiftはまだ未来の可能性があったし、いずれは唯一のファーストクラス言語になっていたが、それは全く遠い未来である。Swiftが開発者のマインドシェアの中にObjective-Cを突然圧倒するという見立ての計画あるいは想像が不足していた。そして今、Appleは難しい選択に迫られている。Apple内部が単純にそのための準備がまだできていないので、彼らはAppleを除いてSwiftの予想外に人気にどのように対応するだろうか?

私はAppleがSwiftを撤回するとは思えない。とはいえ、ラットナーの退社は以前よりももう少しそれが起こりそうな可能性をあると考える。多くの開発者がSwiftに生活を賭けている。その当時は良い賭けのように思えたかもしれないし、おそらくそれは利益をもたらすだろう。しかし、もしそれがない場合はどうなるだろう? もし、大穴が勝ったならどうなるだろう? もし、今後経営者が変更になったら、あるいは単に経営陣の中に心変わりがあったらどうなるだろう? もし、Appleが彼ら自身の内部制約が予想よりも克服が難しく、言語の切り替えが有益ではないと判断したらどうなるだろう? あなたはその可能性を排除できるだろうか? 私は、ほとんどの人がその苦痛の世界(world of hurt)の覚悟ができないことを心配している。もし、それが起これば、多くの人が泣き叫ぶだろう。Objective-Cの開発者を除いて、1999のように笑ってパーティをする人はいないだろう。2001でもいいけど。

そういう事で、ハッピー・バレンタイン・デイ!

Hacker News