Railsのメリットはそのままデメリットとなる
RailsとDjangoはORMにActiveRecordパターンを用いている。このActiveRecordパターンは便利な反面、ビジネスロジックの中にDB操作のロジックが混ざる原因を生み出す。そうRailsのようなMVCパターンを採用したフレームワークではよく、Controllerにビジネスロジックを書いてしまいがちであり、そこからDBの操作を実行してしまうことが多い。
クライアントの希望は変更されやすい
なぜ先のような書き方が問題になるか、それはクライアントの要望が変わったときに、変更がMVCがぴったりとくっついていると、変更があちこちに及んで、コードの大きな書き換えにつながるからだ。更に私のような趣味のプログラマにとってもRailsは無用の長物である。私は自分で使う小さなスクリプトしかRubyで書かない。
Rubyの本当のメリット
Rubyは誰でも読んですぐに理解できるような、非常に自然な英語表記にちかい言語であり、しかも完全なオブジェクト思考言語である。そして、古い本が多いがオブジェクト思考の原理原則やリファクタリングに関する素晴らしい書籍が存在する。そして言語仕様は数百ページの本で網羅できるほど簡単である。これほど、自分が普段使う簡単な作業用のスクリプトを書くのに適した言語はない。
Rubyの最大のデメリット
GUIを作るライブラリがPythonと比べても圧倒的に少ない、機械学習やディープラーニングについてのライブラリも圧倒的に少ない、Rails以外に注目されるこれといったライブラリが存在しないのである。そこで私はGoやPythonも勉強したが、最終的にSwiftに行き着いた。
Swiftはなぜ素晴らしいか
Swiftではこれまで蓄積されてきたオブジェクト思考に関する議論を踏まえた最新の言語である。例えばSwiftは構造体を最大限活用可能とする、構造体の中にメソッドが書けるという仕組みを持っている。構造体は常にコピーして渡されるので完全にマルチスレッドセーフである。あるいは、徹底的なプロトコル(インタフェース)思考の言語であるというメリットもある。例えば、構造体にHashbleというプロコトルをつけるだけで、構造体の内容に基づいた一意のハッシュ値を生成するようになるが、更に面白いことにこのHashbleはEqualityというプロコトルを内包していて、構造体の内容同士の比較も可能にしてくれる。このProcotolにはメッソドが定義されており、何のコードの実装もなくそれが出来るのだ。
Swift UIはAppleのどのデバイスでも動く
Swiftの魅力はAppleが作り上げた、実装の利便性が非常に高いSwiftUIを使えることによるところがお大きい。パソコン好きならiPhoneかiPad、Macのどれかは持っているはずだ。私は旧式のMacしか持っていないが、そのどれでもSwiftUIは動く。SwiftUIはApple製品以外に移植されてないので、開発にはMacが必要だが、MacがあればSwiftUIでMacアプリも作れる。iOSだけのものじゃない点が魅力である。もちろん仕事レベルで使おうとすると古いMac用のライブラリであるUIKitの知識も必要なのは事実だし、iOS用のアプリの開発が出来ないと採用がそもそも難しいかもしれない。でもそんな事はSwiftとSwiftUIを使えるようになってから考えれば良いことだ。
Swiftのコードは非常に美しい
Rubyを使っていた私が一番惹かれたのはこの点である。Swiftのコードは洗練されていて非常に美しい。Goのように構造体の初期化メソッドをFactoryメソッドで実装する必要はない。構造体にもinitメソッドがある。Goのように構造体の参照をメソッドの前に書く必要はない。クラスのようにstructの内部に関数を書けばそのままインスタンスメソッドになる。メモリは参照カウントで管理されるのでRustのようにメモリのオーナーシップの移動の必要はない。構造体はメモリをコピーして持つ、クラスは一意の参照を共有して使う、それだけだ。全てアプリ側で参照をカウントして、カウントが0になったらメモリの領域は上書き可能となる。Rustに比べてなんてシンプルでわかりやすい解決方法だろう。もちろんオブジェクトによって、演算子をオーバロードして挙動を変える機能も使える。mapもfilter, select, reduceといったコレクションのEnumeratorメソッドもある。
Objective-Cでの問題点を徹底的に解消したのがSwift
実際のところObjective-Cは酷い言語であったのことは否定できない。現在のOOPで嫌われる継承に頼りきった実装が行われていた。Swiftは徹底的にそこを見直し、構造体を中心に実装されており、更にプロコトルによる抽象化を徹底的に利用している。素晴らしい。実際のところGUIの開発において最もすぐれた言語はSwiftであると考えられる。Kotlinの言語仕様は見事に関数言語のエッセンスを取り入れており、Rubyを使っていた私も魅力を感じる、しかしJVMの上で動作するので、Rustなどに比べると明らかにメモリを食うし、明らかに起動は遅い。実際のところ私はRustを詳しく知らない。理由は簡単でRustは覚えるのに時間がかかるわりに、これといった決定打になるようなGUIライブラリがないので、何に使えばいいか正直分からないからだ。
ところでXCodeのPlaygroundが嫌だという方に(補足)
Playgroudとはファイルの保存が出来るPythonのJupyterCodeのような順次実行結果が表示される環境である。どうも、それがもたついて、見た目も派手すぎていやだという方も多いと思う。そういう人にはVSCode及び互換エディターをオススメする。私もLinuxにSwiftSDKをいれてSwiftを学習しているが、WindSurfのコードサジェストがバンバン効いてとても快適だ。GUIを作ろうとするとSwiftUIをXCodeから使わないといけないが、アプリの制作環境は高度にカスタマイズ出来るので問題を感じない人が多いと思われる。テキストの文字サイズが違うのが気持ち悪いと思う人はTheme画面で全てのテキスト種別を選択して好きなフォントと文字サイズを指定すれば揃う。