プログラマは自分が使いたいアプリを自分で作れる点が素晴らしいです。自分の場合、普段の情報収集・整理を効率化するアプリを作りたくなることが多いです。普段使っているOSはMacなので、Macアプリを作れるといいな、と思っています。
そうやって作ったアプリを誰か使ってくれたり、収入源になったり、技術力アピールになれば最高ですよね。
InkdropのcraftzdogさんやJasperのh13i32maruさんのようになれたらいいな、と思っています。
過去に何度もアプリを作ろうと挑んでは色々な理由で頓挫してきました。凝りもせずにまた挑もうと思っています。今回、使用する技術をどれにするか検討した際の過程をメモとして残しておきます。
持っているスキル
自分のスキルのうち、Macアプリを作る時に役立つかも知れないものは以下の通りです。
Cocoa(AppKit)
Apple提供のMacアプリを作るためのライブラリです。。以前に個人プロジェクトで2つアプリを作った経験があります。
画像管理アプリ
いまも個人的には利用しているのですが、公開できる品質にまで育てることができませんでした。
直したいとは思いつつも、設計もコードもひどいことになっているので、重い腰を上げられない状態が続いています。
Tumblrから画像をダウンロードしてくるアプリ
こちらは公開できました。
Tumblrに投稿した画像をローカルに保存できるMacアプリ「Savlr」を公開します
サッと作りきれる範囲に機能を絞ることができたのが完遂できた理由だと思っています。
Objective-C/Swift
上記アプリやiOSアプリの作成の際に使いました。特に問題なく使えている認識です。
Swiftの最新の仕様は把握していませんが、キャッチアップできる範囲だと思っています。
HTML/CSS
CSSフレームワークを利用して管理画面を作るぐらいはできますが、お客さんに使ってもらう画面を作るのはとても無理です。
JavaScript
ごくごく簡単な処理は書けますが、苦手意識が強いです。最近は言語仕様が整ってきたと聞いており、それなら触っていてもいいかな、と思えてきました。
技術スタックの選択肢
Cocoa(AppKit) + Swift/Objective-C
Macのネイティブ開発と言えばこれですよね。
情報が少ないのがネックです。日本語では最新の情報はほとんど得られず、英語でも少ないように思えます。
標準提供されているUIパーツがずっと変わっていません。モダンなUIを作ろうとした場合、自作するか、ライブラリを利用する必要があります。自作する場合、前述の通り、情報が少ないため、トライアンドエラーでがんばる必要があります。
2年ほど前にUIKitベースで新しいUIパーツを提供するUXKitがリリースされるかも、という噂があったのですが、未だにリリースされていません。
Electron + Webフロントエンド技術
Electron製アプリに内臓されたChromiumベースのブラウザ内でお好きなWebフロントエンド技術でUIを構築してね、という方式であるという理解です。AtomやSlackはこの方法で作られています。
魅力を感じる点
情報が山ほどあります。日本語でブログやQiita、Twitter、書籍などでいくらでも情報を集めることができます。わからないことがあればStackoverflowや友人へ質問することで回答を得ることも期待できそうです。
リソースが豊富です。「このサイトと同じUIが作りたいんだけど」と思ったら、だいたい誰かが作ってくれています。通信やテスト、ビルドなどのライブラリも豊富にあります。
モダンな設計思想のライブラリやフレームワークが利用できます。表示を更新したい時、昔はgetElementByIdで対象エレメントを探し、その内容を更新するという作業が必要でしたが、最近では更新後のDOMツリーを作成することで、更新前のものと比較して差分を検出し、自動で更新してくれる仮想DOMというやり方が出てきました。仮想DOMはとても良いと思うのです。非同期処理もasync/awaitで書くと読みやすくなるようです。
躊躇してしまう点
学習する範囲が広いです。HTML, CSS, JavaScript, Electron, Node.jsは必須で、モダンな構成にしようと思ったら、仮想DOM, Webpack・・・とどんどん覚えることが増えていってしまいます。
学習したものがすぐに廃れる可能性があります。去年は「これからはAだよな」って言っていたのに今年は「Aはもうダメ。これからはB」って言うのが多いように思えます。フルタイムでWebフロントエンド技術を学べるわけではない立場だと辛いです。
JavaScriptはやっぱり辛いです。最新のES2016などだと良くなっているようですが、ブラウザで動かすにはトランスパイルなので、また覚えるべきことが増えます。動かなかった場合にトランスパイル済みのJavaScriptコードを読んで原因調査できるスキルも必要ですね。JavaScriptに型を導入したTypeScriptを使いたいのですが、こちらもトランスパイルが必要なので、大変です。
モジュール化の方法がいくつも乱立しており、モジュール関連の話題が出てくると、ビビってしまいます。
Xamarin.Mac
独自のUIフレームワークを作っているわけではなく、Cocoa(AppKit)へのラッパーらしいので、直接Cocoaいじった方が地雷を踏む確率が低そうです。
C#で書けることには特にメリットも感じません。
Qt
情報が少ない上に古いため、利点を把握することすらできませんでした。Unix/Linuxで作られたアプリをクロスプラットフォーム化できる・・・あたりなんですかね?
まとめ
趣味プログラマが余暇時間でちょっと学んで小さいアプリをつくれる「制限はあるが、メンテナンスはされていて、モダンな」技術スタックはないように思えます。
いま思うとVisual Basicは素晴らしかったのだなぁ、と思います。安価なEditionで簡単なアプリを作れましたし、高価なEditionに乗り換えても、コードと経験値は維持できました。
「Electron + Webフロントエンド技術」を選択するのが前向きなように思えます。ただし、学習が終わる前に廃れるリスクがあるので、技術選定は慎重に行う必要があります。廃れても泣かない強さも必要ですね。
TypeScriptは学習コストと地雷を踏む確率を増やしますが、個人プロジェクトで使いたくない言語を書いてモチベーションを下げるよりはマシですので、がんばっていくことにしたいです。
一気にElectronアプリを作ろうとすると死ぬので、まずはTypeScript + Node.jsでいくつかコマンドラインツールやライブラリを作って経験値を貯めていこうと思います。