IT業界で気づいたことをこっそり書くブログ

くすぶってるアプリエンジニアが、日々気づいたことを適当に綴っていきます(受託→ベンチャー→フリー→大企業→ベンチャー→起業)

iOSエンジニアはMVVM・RxSwiftをやるべき?キャリアパスから解説する

タイトルは釣りです。

 

本当に書きたいのは

エンジニアはスキルの陳腐化やコモディティ化とどう戦っていくべきか

です。
クソ面倒くさい話を書きます。
死ぬほど長いです。

 

 

モチベーション

最近16人のiOSエンジニア志望者と1時間程度の面談を行ったのですが、多くの人が似たようなことを言っていました。

 

アプリ開発について勉強していて、アプリも出してみたが、次に何をすべきかわからない。とりあえず求人情報を見たらMVVMとRxSwiftが書かれていたのでアーキテクチャについて勉強しようと思う。

 

それでMVVMってどうなの?というあたりを15分くらいで早口で説明するのですが、ちょっと口頭で話すには複雑すぎると思いました。
あと自分でも色々考えをまとめたかったので書きます。

 

免責事項

正直ここらへんの話語りたくないんですよね。
知識不足が露呈しそうで。
iOSアプリ開発は30案件くらいやってますが未だに自信がない。
話半分くらいでお願いします。
違う意見があったらください。

 

MVVMとは?

ja.wikipedia.org

 

ここ3年くらいのiOS界隈ではMVCの上位版みたいな語られ方をしますね。

 

MVC, MVVMはどこから来たのか?

きちんとどこから来たのか調べ始めると私の休日(※休んでない)が溶けるので辞めますが、乱暴な言い方になりますが、今のアプリ界隈におけるMVCってそもそもWeb開発から来てませんか? Webのフレームワークって明確にMVCが別れていますよね。アプリにおけるMVCと全然印象が違います。

 

たぶん合ってると思うんだよなあ。
2010年頃のWeb開発では既にMVCは常識中の常識でした。

f:id:otihateten3510:20210912173234p:plain

 

対してMVVMは明らかにWindowsから来ています。

 

f:id:otihateten3510:20210912173513p:plain

f:id:otihateten3510:20210912173609p:plain

 

WikipediaのMVVMについての説明を読んでみましょう。

根拠
MVVMは、WPF(Windows Presentation Foundation)のデータバインディング機能を利用して、ビュー層からほぼすべてのGUIコード(コードビハインド)を取り除き、ビュー層の開発を他のパターンから分離することを目的として設計されています[3]。このように役割を分けることで、インタラクティブデザイナーはビジネスロジックのプログラミングではなく、UXのニーズに集中することができます。このように、アプリケーションのレイヤーを複数のワークストリームで開発することで、生産性を高めることができます。一人の開発者がコードベース全体を担当する場合でも、エンドユーザーからのフィードバックに基づいてユーザーインターフェースが開発サイクルの後半で頻繁に変更されることが多いため、ビューとモデルを適切に分離した方が生産性が高くなります[要出典]。

MVVMパターンは、MVCによって提供される機能的な開発の分離という利点と、純粋なアプリケーションモデルにできるだけ近いところでデータをバインドすることによるデータバインディングフレームワークの利点の両方を得ようとするものです[3][4][11][clarification needed] バインダー、ビューモデル、およびあらゆるビジネス層のデータチェック機能を使用して、入力データを検証します。その結果、モデルとフレームワークができるだけ多くの操作を行い、ビューを直接操作するアプリケーションロジック(例:コードビハインド)を排除または最小限に抑えることができます。

www.DeepL.com/Translator(無料版)で翻訳しました。

 

ちなみに推奨されてるだけで、WPFをMVVM無しにでも作れるみたいです。

Web界隈では、大体2016年頃から流行ったのではないでしょうか?(合ってる?)Vue.jsが流行り始めた当たりからです。Qiitaでひっきりなしにそういった話題が出ていたのを覚えています。

f:id:otihateten3510:20210912174958p:plain

 

やや遅れて、RxSwiftが流行ります。RxSwiftはSwiftでMVVMをするならできれば入れておきたいLibraryです。だいたいSwiftが出た次の年くらいですかね? 2016年にSwift2.3で結構安定しまして、そこらへんからRxSwiftが盛り上がってきます。(ちなみにSwift4.0で仕様がかなり変わって大変でした)

 

f:id:otihateten3510:20210912175108p:plain

 

まあつまりちょいちょい流行っていて、アプリ界隈はWindowsやWebからやや遅れて、言語がモダンになったのにあわせて(Swift,Kotlin)2016年くらいから行り始めたという感じです。

 

RxSwiftとは何なのか?

ReactiveXというパラダイム・思想です。

 

reactivex.io

 

f:id:otihateten3510:20210912180215p:plain

 

ざっくり言えばオブザーバーパターンを実現するためのLibraryです。
あと関数型言語っぽく書けます。
上のページには他に、コードの行数を減らせるとか、非同期エラー処理に強いとか、並行処理が容易と書いています。

 

ここで脳が破壊されるのが、Rxを評価するということはすなわちオブザーバーパターンや関数型言語の評価をすることと同義であり、それは非常に厄介です。永遠のテーマに近いのではないでしょうか。大多数のエンジニアには荷が重いはずです。

 

そんな中、なぜRxSwiftが流行ったのかと言えば、上の特徴とは無関係に、データバインディングができて、MVVMが実現できるからに他ならないでしょう。

 

MVVMがやりたい → RxSwiftを導入する → 関数型言語・オブザーバーパターンについての勉強が必要

 

この流れができています。

まあここらへんも私の妄想でしかない可能性があるんですが、とりあえずはデータバインディングとMVVMが標準装備されているAndroidの方では、RxKotlinがさおど流行ってないんですよね。


Githubでも
RxSwift ★20.9K
RxKotlin ★6.7k

とこんな具合です。
RxJavaは強いんですけど(★45.3k)

 

関数型言語・オブザーバーパターンはなんか良いやつなの?

両者大昔からあって、現代のメインストリームのパラダイムになれなかったやつらです。
良い悪いっていうより、完全に向き不向きだと思うんですよね。作るプロダクトに対して選択するのが良いと思ってます。
ちなみに私はLISP恐怖症なので良いイメージ無いです。

 

ja.wikipedia.org

ja.wikipedia.org

 

なぜMVVMをやりたいのか、真のメリットは?

  1. 分業ができる
  2. 変更容易性により、生産性を高められる(要出典)
  3. FatViewController, FatModelを回避したい(可読性)
  4. 疎結合になり再利用性が高まる
  5. 自動テストが可能になる

あー、なんだか色々否定するのが難しくなってきました。そして自信もない。

まず1の分業はしていません。Webではフロント/バックエンドで上手くやってるのかもしれませんが、アプリでは明らかにできていません。
2,3,4について言えば作ってみればわかりますがメリットどころかコードが膨大になって複雑性が増すので却って有害な場合が多いです。これはあまり反論がないのではないかと思うんですがどうなんでしょう?それで最後に残るメリットが「テスト可能性」なんですよ。というのが私の主張です。

※ここのロジックが一番ふわふわしていますが、説明できる自信がないです。結果的にそうなっているとしか言えず、何故そうなるかとか、ちゃんとした人がコードを書けば大丈夫だとか、色々言われそうです。

 

iOSアプリ開発で自動テストは必要なのか?

上記のロジックから考えると今度俎上に上がるのはこの議題なんですが、これも非常に語りづらいです。
私はiOSアプリにおいて自動テストの優位性はかなり低いと思います。全部不要というわけではありませんが、少なくともテストコードを書くためにアーキテクチャーを大幅に変える必要はないと思っています。

 

自動テストを書く理由ってここらへんですよね。

  • フロントからアクセスしづらい機能だから
  • 大量にテストをまわしたいから
  • 継続的なデプロイを高頻度で行うから
  • 手動テスト工数をそれほど積めないから
  • 実行環境が多岐に及ぶから
  • 実行環境を用意できないから
  • 再現が難しいから
  • 変更が外的要因だから、いつでも検知できるようにするため
  • クリティカルなサービスであるため(人名やお金)
  • より完璧な品質のため
  • TDD的な思想、リファクタリングする時に必要だから
  • 仕様把握のため

このうちiOSアプリにおいて該当するのは本当に僅かです。WebやAndroidに比べても必要なシーンは少ないし、ピンポイントでそこだけ対応するのが妥当だと思っています。
以下のフローは多くのプロジェクトで起きていると思いますが、考えてみると高い学習コストを払ってまでこの選択をすべきなのか疑問です。

 

自動テストを書かなきゃいけないから → MVVMがやりたい → RxSwiftを導入する → 関数型言語・オブザーバーパターンについての勉強が必要

 

これはMVPやVIPERなどのアーキテクチャでも同様です。
(ReSwiftは別の文脈ですが)

 

iOS MVVMは一過性の流行なのか?

アーキテクチャのトレンドは毎年のように変わります。

MVCがクソと言われ、Apple提唱の方法から離脱し、MVPが流行り、MVVMが流行り、CleanArchitectureが流行り、VIPERが流行り(?)
かと思えばCocoaMVCって良いよね、と回帰してる人も現れたりして、みんな思い思いに自由に勝手なこと言っててすごいです。ついていけません。

 

じゃあMVVMが一過性なのかと言えばNOです。
ここからは非技術的な話が入ってきます。

 

1.MVVM+RxSwiftで慣れた人は、MVVM+RxSwiftが書きやすい

当たり前なんですが、その書き方に慣れた人はその書き方が一番書きやすいんです。RxSwiftの熟練者だけのチームがあれば、当然次のプロジェクトでもRxSwiftを採用するでしょう。CocoaMVCはおそらく書きづらいと思うはずです。

そして、会社を挙げてRxSwiftを使っている有名な会社がいくつかあります。代表例はDeNAクックパッドドワンゴです。サイバーエージェントは確かAbemaTVあたりがRxだったはずです。

他にはベンチャー企業がRxSwiftをよく採用しています。新しいもの好きですね。

 

2.RxSwiftが向いているプロジェクト、MVVMが向いているプロジェクトがある

たとえばライブ配信アプリのように、沢山の要素(view)が同時に動くようなアプリではRxSwiftが向いているらしいです。これはオブザーバーパターンが向いているからです。

そして大規模なアプリでは自動テストの必要性が上がってくるため、当然MVVMを採用したくなります。結果的にMVVMやRxSwiftが消えることは直近1,2年ではありません。

 

MVVMは無くならない

わかるでしょうか?この2つの理由はお互いにコラボレーションします。一定の割合でこれは残っていくはずです。

 

副次的に起こるRxSwift+MVVMの必要性、そして避けられないコモディティ化

大企業が作ってるような大規模な案件や、ライブ配信のような新規性のある案件、目立ってるベンチャー企業がRxSwift+MVVMを採用すると、当然皆が真似します。実際に2018年、2019年はそこそこ流行った認識です。

しかし当然、向いていないプロジェクトでも採用されました。

logmi.jp

 

また、AppleがRxSwiftと似たような仕組みであるCombineというのを発表しました。これがiOS13からなので、採用し始めるプロジェクトが出るのがおそらくそろそろ出始めると思います。本格的に採用するのは、おそらくSwiftUIが本格化する来年下旬か再来年だと想います。

developer.apple.com

 

また、SwiftUIではデータバインディングができるらしいので、RxSwiftを使わずともMVVMが実現できるようになります。

 

これらをまとめると、RxSwiftの優位性はかなり落ちるでしょうし、MVVMを続けようとするプロジェクトもどれほど残るかやや疑問ではあります。

f:id:otihateten3510:20210912193101p:plain

 

じゃあMVVMやRxSwiftを勉強しなくていいのか?

これが難しいところで、例えばiOSエンジニア志願者なら答えはNOになってしまうと思います。
まず上で書いたように、RxSwift+MVVMを得意とするチームが少なからず存在すること、またそれに向いたプロジェクトが存在していることが理由の一つ。
そして、たとえそうではなくとも、一度書いたRxSwift+MVVMのコードは5年、10年と保守していかなければならないわけで、そうなると募集要項に「RxSwift+MVVM」が入ってくるわけです。

これはSwiftが流行り始めた頃のObjective-Cや、今後SwiftUIが流行った時におけるStoryboardと同じ立場です。つまりレガシーコードになっていくんですが、その需要は確実に存在するため対応が必要です。

 

クソみたいなレガシーコード・チキンレース

エンジニアは常に自分がレガシーコードしか触れない人材になることを恐れています。そのため次の技術を探し、勉強し、トレンドに乗っていち早くそのコードを試して、極力早くそのプロジェクトから脱出するというチキンレースを行っています。
それが上手くできた人は、毎年のように言ってることがコロコロ変わりますが、常にハイレベルのスペシャリストだと認識されるでしょう。

未経験者が就職する際には、一旦その人らが生み出したクソをメンテナンスする業を背負わなければ業界に潜り込めませんので、勉強する必要が出てきます。

 

これは戦略的なゲームです。
例えばFlutterを例にあげれば、いち早くその流行を察知し、勉強し、技術記事を書き、著書を書き、登壇して、スペシャリストになり、それを散々布教した上で企業にアドバイザーとして技術支援して高い報酬を得る。みたいな人も居ます。
羨ましいです!

 

そしてそういう人らの情報を真に受けた我々下々のエンジニアがそれを勉強して、それが業界標準になり、誰もがそれを勉強しなければならなくなる、という社会の仕組みです。

 

だから私登壇とかああ言うのぶっちゃけ嫌いなんですよね。
まあ本人らは楽しくやってそうですし、完全に善意でやってると思うんですが。回り回って事業の速度を遅くしたり工数増大させたりしてるだけでは?という・・・すいません愚痴が過ぎました。

 

新人が採る選択肢はまず2つ、就社(Closed)か、就界(Open)か

もし大企業に就社して、そこの方針が「RxSwift+MVVM使おう!」だったら、それを勉強するべきです。もしそれが別の技術だったとしても勉強するべきです。特に大きい会社では色んな独特な技術が使われています。それがたとえニッチで学習コストが高かったとしても、頭が良い人を採用し、時間をかけてやっていけばいいわけですから。会社の方針は間違っていませんし、社員もそれに沿うのが出世への近道でしょう。
それでいいんです。そういう会社は売上がすごく高いんですから。世間で何が流行ってるかよりも社内で何が使われてるかの方が重要です。

対して、例えばフリーランスジョブホッパーのように「どこでも通用する技術を身に着けよう」と言うのであれば少し話が難しくなります。まず大多数がやっている開発方法を優先すべきでしょう。ニッチだったりレガシーなものを採用しているプロジェクトへのアサインは首を絞めますから、会社や案件選びから考えていかなければなりません。
また、新しい技術が袋小路になっていないか、それがレガシー化した時に自分のスキルとして何が残るか考えなければなりません。

 

Closedな人材としてやっていく場合

何より必要なのは入りたい会社の採用している技術です。
それを調べたりヒアリングするところから始まると思います。
まあこっちは簡単です。

Openな人材としてやっていく場合

こちらは難解です。
まず、特定の技術をやりたいという欲求が具体的にあるのならば、それができるところに行くべきでしょう。
RxSwiftだったり、SwiftUIをやってるイケてる会社を探すのが良いと思います。

 

そうではない場合、より厄介です。
そもそも会社の募集要項に「RxSwift+MVVM」があるのはいくつか考えられます。

  • 現状そのプロジェクトが有る
  • そのくらい勉強している、やる気ある優秀な人材がほしい
  • 流行ってる技術を採用している会社だというアピール

会社としては優秀な人に来てほしいので間口を広くしたいという状況があります。
そうなると、「弊社では最新トレンドの技術が試せますよ」とアピールしたいわけです。この様々な思惑の中、行動を見極めなければならないと思います。

 

もしその会社がSwiftUIを採用していないのに「SwiftUIできる人募集!」と書いていたらどう思うでしょうか?不誠実な会社だと思うでしょうか?そういう会社はたくさんありますが、そうとも言い切れません。
そういう最新技術やってますアピールをする会社には、もちろん技術に対するモチベーションが高い人が集まるでしょう。
逆にレガシーな技術を採用している会社には、優秀な人があまり来てくれないかもしれません。

プロジェクトはチーム戦ですから、優秀な人がより来てくれる会社に言ったほうが安全ですよね?

 

ただ、そういう会社に行くと当然上で言ったような「最新トレンドの社会の流れ」に簡単に流されて苦しい思いをします。
要はどう足掻いても絶望です。

 

iOSエンジニアの差別化しづらい問題

エンジニアってより難しいことやってハイレベルの人材になるみたいな風潮あるじゃないですか。例えば検索技術とか、データベース技術とか、セキュリティ関係とか、ああいうのはそんな感じあるんですが
特にiOSエンジニアはAppleにしたがって普通にやるのがベターみたいなシーンが多くて、ぶっちゃけ歴3年以降、他のエンジニアとの差別化が難しくなってくる職業だと思います。

そんな中焦って色んなものに手を出すんじゃないかと睨んでるんですが、これって難しいですよね。キャリアパスとしてはしょうがない側面もあるし、でも「より難解なことしたもん勝ち」ってなんか嫌ですよね。

フリーランスやってると、RxSwift案件の単価が明らかに2割くらい高いんですよ。これってどういうことかというよ、他人の書いたRxSwiftを引き継いでくれるエンジニアが少ないってことだと思うんですよ。なんかね、お客さんにはマイナスですよね、っていう。

 

絶望から逃れる手

上流工程のような、技術以外のスキルを身につける手がありますが、これでも結局トレンドには流されます。上流工程を身に着けつつ、フリーランスになれば結構この絶望から逃れられます(今の私がこれです)

登壇者になる手もあります。

優秀な、分かってるリーダーの下につくというのも手です。ただしその人がつよつよエンジニアだとついていけない事も往々にしてあります。

自分がそのリーダーになってしまうというのも手です。ただし出世する必要がありますし、部下を制御できるかはまた別問題です。

 

採用しないにしても勉強するのは有り

話の流れで漏れましたが、新しい技術を採用はしないにしても勉強するのは有りだと思います。
何かしらの考え方を参考にして、似たようなことを自分のコードで試すということができます。
教養にもなりますし、いくつかの新しい技術は実際にデファクトスタンダードになってしまいますから、その見極めの練習も必要です。

 

iOS + MVVMは今後どうなる?

私はCocoa MVVMになると思っています。
より柔軟に、画面やパーツ毎に切り替えできるようになるんじゃないでしょうか?ある意味理想的だと思います。

 

話足りないこと・まとめ

まとめるの無理ですわこれ。

とりあえず新人は真面目アピールのために勉強せざるを得ないんじゃないですかね?あと会社の方針はよく聞いたほうが良いです。

あとは、技術の採用というのは絶対的な解があるわけではなくて、トレードオフがあったりチームメンバーに依存したりします。あくまでやってるのは理論じゃなく工学なので。

だから「より良いアーキテクチャーやライブラリーがあるんじゃないか?」というのは幻想だったりします。そういう探求もエンジニアのさがだと思いますが。残念ながらAppleも進化していってるので、その結果iOSエンジニア自体が徐々にコモディティ化していってます。まあアプリエンジニア自体がレアなので全然まだまだブルー・オーシャンですけどね。

そうそう、AndroidGoogleがMVVMを推奨しています。でもこのMVVMはMVVMじゃないとかそういう人たちも居ます。よぐわがんね。宗教戦争

developer.android.com

 

そもそもViewModelって最初は違う意味合いだったんですよ。Utility的な。それがいつの間にかアーキテクチャになって。てか昨今のアーキテクチャという概念自体が、どうにもWebにおけるフレームワークを作りたがってる感じなんですよね。Webは本当にフレームワークありきなんですけど、アプリはiOSAndroidもそれそのものがフレームワークみたいなもんなんで、フレームワークonフレームワークみたいな黒魔術みを感じます。

あとCleanArchitectureはアーキテクチャじゃなくて「きれいに書く方法だ」みたいに言われてますね。私はその本読んでないので何とも言えないですが。

何かしら技術を採用するときは、大抵そのカウンターとなるデメリット記事があったりするので探してみてください。Reduxとかも結構見つかります。ReSwiftってやつ。

エンジニアってどうもこういう枠組み発明をしたがる傾向がありますね。昔はWebやSIerでオリジナルフレームワークが作られてて地獄だった、みたいな昔話が出るんですが、アプリ業界ではそういうアーキテクチャ地獄についてまだ好意的な意見が多いですよね。ちょっと謎。

 

あとなんだろ、思いついたら追記します。

 

宣伝

iOSエンジニア志望者のたまり場みたいな場所を作ろうかなとちょっと考えています。
興味があったらお問い合わせください。
そこからベテランエンジニアがピックアップしていくみたいなイメージで考えてます。あと就職の相談したりとか。
そう言えばオフショアとかニアショアとか存在するのにインターン活用ってあまりないよなと思って、思いつきです。ぜんぜん儲かる気がしないのでただの慈善活動になりそうですけど。

似たようなのは2個くらいあるらしいですけど、用途として被らないようにしたいですね。勉強は見ませんが仕事は与えるみたいな感じで。

 

f:id:otihateten3510:20210912204718p:plain

 

近況 2021/08/27

  • 未経験者を雇って仕事を助けてもらう(2名)
  • ナショナルクライアントから仕事をもらう
  • 単価がチームラボ時代を超える
  • シェアオフィスが取り壊されるので、お引越し

 

下手すると1年半で新規アプリ5件もリリースすることに・・・
こんだけiOSアプリをリリースしてる受託会社あんまないのでは?笑

 

未経験者を雇って実績を与えて就職させるような慈善事業を思いつきました。
案外今の自分には合ってるやり方じゃないかと思います。一人でやるより楽しいですしね。
でもやっぱり3人4人の新人にタスクを振ろうとすると、上手く丁度いいタスクがなかったりして難しいですね。そもそも仕事振っちゃダメっていう案件の方が圧倒的に多いですし。

今は結構奇跡的な気がします。
規模の大きい受託会社じゃなくて、私に直接依頼してきてくれるけど、新人に手伝わせていい、みたいな優しいクライアントに恵まれた感じです。

 

10月までは死ぬほど忙しいことが確定しています。
いい加減に自社アプリを進めたいんだけど無理ですね。とりあえずお金を貯めておきます。

 

今の仕事の実績が見える状態になったら、余計に仕事が舞い込む気がしているんですが、やはり規模拡大したほうがいいのか・・・?でも社名じゃなく個人で依頼してきてるはずなんで、やっぱ難しいんですかね。

振られたタスクの粒度によって気をつけることは変わる

新人が振られるタスクって大小様々なんですが、その大小によって注意すべき点とか動きかたみたいなのって教えてくれないですよね。
というわけでサクッとまとめてみます。

 

 

バグを修正するタスク

おおよそ正常に動いているプログラムがあるが、一部にバグが有りそれを修正すると言うタスク。参画して最初に振られることが多いタスクです。
大事なのはバグを増やさないことです。なので今動いている部分は壊しちゃいけません。
と言っても最初にプロジェクトに参画した時は正常動作がどういう状態か、どうテストするのかがはっきりしていないことが多いのでかなり大変な作業です。
プロジェクトに慣れてれば1時間で終わるようなタスクが、10時間以上に膨れたりします。理解がない雇い主の場合はそれで一回揉めます。
プルリクエストを活用して責任の分散を図るのが良いと思います。またよくわからない部分については仕様書を探したり人に聞いたりしましょう。そこでそのプロジェクトの絶望度が見えてきます(誰も答えを知らないとか)

 

もちろん再現性も重要です。どの条件で再現して、どの条件で再現しないのかを詳らかにしなければスタートラインにすら立てません。バグを見つけた人は発見だけを報告しますが、修正者は全てのエラー条件を洗い出す必要があります。
洗い出せたら修正し、網羅性の有るテストにより修正できたことを確認すれば良いのですが、自分の修正が何かを壊していない確証を得るのは非常に大変です。むしろそちらのほうが神経をすり減らします。

 

これが未リリースのプロジェクトならそこまで気負う必要はないのかもしれません。テストする人もエンジニアがきちんと修正したなどと信用していないからです。
ただし、それがリリース済みのプロジェクトだったり、テスターが居ないプロジェクトでは非常に神経質になる必要があります。(具体的なテストの方法論については割愛)

 

少しだけ追加・変更するタスク

既に動いているプログラムに、わずかな改良や変更をするタスク。
概ねバグ修正に似ています。

追加変更する際に、同プロジェクトの他コードと足並みを揃えることが求められます。完璧に足並みを揃えるのは難しいかもしれませんが、既に作成されているUtilityがあったり、設計手法を合わせたり、用語を合わせたり、コードの流れやコメントの書き方を踏襲する努力は必要です。完璧にやる必要はありません、そこはユーザーに見せる場所ではないので、あくまで”作業場”として適切な状態に近ければOKです。

 

あまり作業場をこだわろうとするのはおすすめしません。それより有意義なタスクはあるからです。わずかな用語の差や構造の差は見て見ぬ振りをする我慢強さが必要になります。

 

追加・変更したために発生する影響範囲が漏れることが多いです。1つの画面を作ったとき、その画面に至る導線は1つではないかもしれません。思わぬところから画面遷移してきて、その際に必要なデータを用意できなくて設計を見直す必要があることもあります。
意外とそういう接続の部分が重かったりすると、「追加変更」のタスク分しか見積もっていなくて時間が足りなくなることがあります。
気軽に聞ける人が居たら聞いてみましょう、ただし完璧な回答が返ってこない可能性の方が高いことを留意して下さい。

 

1つのパーツを作るタスク

ある1機能を作るようなタスク。
影響範囲が色んな所に及びます。パーツそのものの工数も大きいですが、他との連携に多くの時間がかかるケースもあります。パーツが何を使うのか、何がパーツを使うのか、ヒエラルキーや文脈を理解する必要があります。

あるいはそういう設計部分を誰かに任せたほうが良いかもしれません。各々やるととっちらかります。

 

大変そうに見えますが、この粒度が一番安心度が高いと思います。プログラムの振る舞いは自分が書いたコードのコントロール下にあります。他人のコードを読む必要は少ないので、書いたとおりに動きます。
(ただし大きな枠組みで設計方針が決まっている場合もあります)

 

似たようなパーツが他にないか探し、真似ることも重要になります。これはコスト削減とコードを読みやすくするという2つの目的があります。
ただし真似た方のコードに問題があった場合、自分の方にも問題が出るので注意が必要です。また、新しく書いたコードはどこかで真似られる可能性があります。心して書きましょう。

 

過度な共通化はやめてください。人は同じ形のものがあるとグルーピングしたくなります。ただし最近のプログラミングは生き物のように変化します。同じ形だったはずの2つが別のものになろうとした時、妙な共通化がされていると事故が起きます。
通化というのは高度な作業です。
どのような条件下でも使いやすく、不要になったらすぐに分離できるような慎重に共通化する必要があります。悩んだら聞いてみて下さい(できれば10年以上の人に聞いて下さい。プログラマーは3〜5年目あたりで共通化大好き病に罹ります)

 

試作を積極的に作りましょう。
何かと干渉し、そのプロジェクトでしか動かないケースなどあるはずです。試作で困ったことは大抵一般的な悩みなので検索すれば出てきます。
また作った試作は別の機会にも役に立つはずです。

 

1つのプロダクトをまるっと作る

長くなるので割愛しますが、プログラムよりも要件定義やテストやリリース、チーム体制の方が重要になります。

 

以上です

SwiftUI移行は2023年〜2025年?

iOSエンジニア SwiftUIへの移行戦略 - IT業界で気づいたことをこっそり書くブログ

 

私の観測範囲ですが、iOS15からSwiftUIが良い感じになるという噂を各所で数件見つけました。
実務に耐えられるようになるのがiOS15から、おそらくiOS16以降でスタンダードになる予感がしています。

 

ただし、最低バージョンがiOS15ですから。
実際には最新バージョンがiOS16,17,18の頃になると思っています。
Objective-CからSwiftへの移行や、AutoLayout移行、Storyboard移行などを見てきましたが、以下のスケジュールが凡人エンジニアとしては丁度いい気がしています。

 

iOS16が出る頃 勉強開始 → 2022年秋
iOS17が出る頃 移行開始 → 2023年秋
iOS19が出る頃 移行終了 → 2025年秋
以下、Storyboardがレガシー扱い

 

新規アプリに採用して良いのも多分2022年から。iOS14切るならOKみたいな。
既に何件かSwiftUIの仕事依頼をされましたが、ちょっと早いと思います。別にいいんですけど、徒労かつ負債になりそう。

 

ただ、何らかのSDKやライブラリのチュートリアルが徐々にSwiftUIで書かれ始めていたりするので、なんやかんや今年辺りから勉強せざるを得ない感じになるかもしれません。Amplifyの公式チュートリアルとかはSwiftUIで書かれてました。

 

ちなみに私の本音は「めんどくさいよー!!」です。Storyboard好きなので。
完全に無くなる感じもしてないんですよね。
というか2024年頃にまた別の何かを出してきそうですよねApple

【定期】年収と成長率 2021 現状分析

去年

otihateten.hatenablog.com

 

2020年と今年の見込み。
2020年はコロナやらなんやらでバタバタしてて微増でしたが、今年2021年は2000万が普通に見えてきました。なんなら2500万も見えてくるかも。

 

f:id:otihateten3510:20210621113750p:plain

 

2020年、2021年で大きく変わったこと

 

営業しなくても直契約の仕事が来るように成りました。
流入経路を洗い出すと

しかもありがたいことに新規開発が多く、開発が安定しました。
こちらから営業(面接)受けると全然決まらないんですが、向こうから来る場合は非常に決まりやすいし質の高い案件が多い印象です。

驚くことにここ5案件は全て向こうからです。先週もう一件決まりました。年内ほぼ安泰です。

 

分析:1分野で実績を沢山重ねると仕事は向こうからくる

この実績解除にも似た状況って果たして狙えるんでしょうか?
私はiOS歴9年です。9年も同じ石の上に座ってようやくと考えると、再現性は薄いような気がします。IT業界で同じことを9年続けるのは運が必要でしょうし。

 

プロモーションを頑張れば同じ状況になるか?

私の場合、特に大人数のフォロワーが居るわけでもないし、プロモーションをがんばってるわけではないので、皆様なんとか探して見つけてきていただいている状況です。
これがもっと目立つ格好になると、よりよいクライアントも来るでしょうけど、そうではないクライアントからも見つかるので、玉石混交状態にはなると思います。
そこから選別できるスキルが有ればいいですが。

 

あまり進んでいない自社プロダクト開発

単価、時間ともに理論値に近づいています。

otihateten.hatenablog.com

 

ここから先に売上的な成長は見込めないので、やり方を変える必要があるんですが。
どうにもプロダクトオーナーとしてはまだまだ未熟らしくうまくいきません。

最悪でも年内にある程度の形にしたいんですが。

 

このブログもお金の話よりユーザー数の話とかもっとしたいです。
グロースの話とかマーケの話とか。

客単価から考えるWebサービスの現実問題

客単価と人件費などの開発費用を考えると、選択肢ってかなり絞られるよねという話をします。

 

1万円/年という商売(高単価)

1人のお客さんが平均年間1万円使ってくれるようなサービスを考えてみましょう。(粗利と考えます)
1年で必要な開発費用が、ざっくり10人で1億円だとすれば、客単価1万円で1万人のお客さんが必要です。

1万人と考えればニッチなジャンルで行けます。
営業が動いても良いと思います。1人1日10人対応したら年間2000人くらい対応できますから。

しかし1年1万円という単価は結構でかいです。物販だったり、不動産や婚活や就職など、こういったものの特徴として「人生で発生回数が少ない」=「リテンション(リピート)が見込みづらい」というのがあります。

なので高単価帯というのは「広告=札束での殴り合い」になります。
大きな資本になかなか勝てません。

 

1000円/年という商売(低単価)

年間1000円、月100円程度と考えれば、例えば手数料ビジネスのような「ちょっとした中抜き」のようなビジネスモデルでもいけそうです。
しかしこの場合は年間1億円稼ぐためにお客さんが10万人必要です。

10万人を得るためには一朝一夕にはいけませんから、資金調達が必要になってきます。その場合Exit戦略を求められるわけですが、上場するなら年間10億円くらい稼ぐ必要が出てきます。
そうなると必要なお客さんは100万人です。

100万人のお客さんとなると、ニッチなジャンルでは無理かギリギリです。
例えば「食」とか「物販」とか「予約」とか、大きめのジャンルで戦うしか無いのですが、その場合既に競合が沢山居ます。ブルーオーシャンは基本的にありません。殴り合いです。「◯◯に限定した食」とか「◯◯に限定した物販」となるとニッチジャンルになるので厳しいです。

 

サービス開発者が取れる基本的な選択肢

1.高単価帯で、巨大資本と戦う(数万人のお客さんを狙う)

2.メジャージャンルで競合と戦う(100万人のお客さんを狙う)

 

まあどっちも凡人には無理ですよね。
天才が複数人集まってワンチャンどうかという感じです。

 

例外的な存在:ゲーム

これはちょっと例外です。現代のゲームは本当にうまいことやっています。
だから選択肢は3つですね。

 

現代のWebサービスは、それ以外を探す旅

無くはないです。

例えばWebオンリーのサービスとか、マルチデバイス対応のサービスを少人数で作ってバイアウトしてしまうとか。
卸業者のように、どこかの中間に入り込むことで生き残るとか。
シェアリングエコノミーでこれまでに不可能だったビジネスを成立させるだとか。
技術一本で金融系に手を出すとか。
もっと単純にtoBのサービスをやるなら話がぜんぜん変わります。こちらのほうが現実的ですね。コツコツやる感じ。toBの方がお金が動いてる説もありますしね。

 

私は最近「全国民をターゲットにできるジャンル」を模索しています。
大言壮語を言わないといけないのが辛いところですが、普通に戦略的に考えると普通に一つの選択肢だと思います。

 

思い付いたアイディアがイケてるのか確認する方法

1.それは札束で殴り合うタイプのものではないですか?(大量の広告が必要なジャンルではないですか?)

2.1ではない場合、それはニッチ過ぎませんか?100万人のユーザーを取れそうですか?

ここで解決できる新規サービスには中々出会う機会がありません。出会っても大抵失敗しますが。

技術的負債ならぬ、仕様的負債について

技術的負債っていう話、プログラマーは大好きです。
こいつらはコーディングの邪魔をし、プロジェクトを遅れさせ、残業を増やします。
だから皆嫌いなので技術的負債をどうにかしようと議論します。

技術的負債 - Wikipedia

 

ただし、概ね技術的負債を減らす術を身に着けてくると、それでもコードの複雑性が解消されないことに気づきます。
リーダブルに作っても、疎結合に作っても、SOLIDで作っても、どうしてもコードがぐちゃぐちゃになり、相当頭がいい人でないと全体を理解できない代物に成っていくでしょう。
あるいは新しく参画した、優秀なプログラマーたちによって作られたプロジェクトのコードが理解できずに悩むことで気づくかもしれません。

技術的負債の他に敵がいるということに。

 

その一つは仕様側の複雑性の問題です。
多くのプログラマーが気づくけど、中々手を出せず、それどころか議論にすら成りづらい仕様的負債について考えます。

 

f:id:otihateten3510:20210323081658p:plain

 

仕様的負債がどのように発生するか

このテーマだけで論文が書けそうなくらい重い話ですが。
今回は単純に「なぜ仕様が複雑化するか」の話を考えたいと思います。
私の観測範囲から見えてくる原因は、大体次のとおりです。

  • やろうとしてることがそもそも複雑
  • 市場最適のし過ぎ
  • 状態数を増やしすぎ
  • 施策の取り下げができていない
  • 環境の場合分け
  • 例外の作りすぎ

ちょっとずつ説明していきます。

 

やろうとしていることがそもそも複雑

Webサービスだと例えばECだとか決済だとか予約とかSNSだとか、あるいは国内向けのEMSだとかCSMだとかCMSだとか金融システムだとか、ああいうのはそもそもどう足掻いても複雑です。
複雑だからこそそれだけで仕事として成り立っています。導入に何億円もかかったり、それだけの機能を持った単一サービスが生まれたり。

これらは一回関わってみるとわかりますが、どれだけ単純化しようにも限界があります。ちなみに似たようなことが複雑性保存の法則で言われているらしいです。

 

市場最適のし過ぎ

例えば会社向けに導入するシステム開発などでよく言われますけど、会社側が自分達の仕事のフローの変更をせず、システム側にその複雑性を要求するとシステムがとんでもなく複雑になり工数が多くなります。

別の例で、最初にシンプルに作っていたサービスでも、売上が伸び悩んできて個々のユーザーに最適になるようにあれこれやってるとどんどん複雑になってきます。

 

状態数を増やしすぎ

例えばUserが1Modelとして存在していればいいんですが、UserをCustomer、Providerのように2Modelとして扱うと複雑度がかなり増します。
リボン型ビジネスとかそうですね。例えば売り手と買い手が居るようなシステムとか。
これに更に売り手、買い手、仲介のように3Modelにするともっと複雑度が増して工数が爆発します。

別の例で、Userを初回ユーザー、未ログインユーザー、ログイン済みユーザー、お得意様、のように分けていくとどんどん複雑になっていきます。

もっと小さいトランザクションレベルのところでも、送信前、送信中、送信後で3状態ですが、2つのトランザクションを組み合わせると3状態x3状態で最大9状態になります(ここは少し仕様的負債よりも技術的負債に近い気がしますが、2つのトランザクションを同時にやらなきゃいけない状況というのは仕様的負債だと思います)

こういう一見小さな状態数の増加で実はシステムの複雑度は爆発します。

 

施策の取り下げができていない

サービスをもっとよくしようとしてあれこれ入れたもので、あまり効果がなかったものが取り下げられていないケースです。これは謎の機能として邪魔をし続けますが、リファクタリングなどで解決できるものではありません。

以前見かけたのが、AppleGoogleに「新機能を入れたらアプリを目立たせてあげるよ」みたいな取引に応じた機能が放置されていたケースです。2,3社で見ました。

 

環境の場合分け

例えばiOSだと、iOSバージョン14,13,12,11,10,9で使えるみたいなアプリが有りましたがそこそこ地獄でした。
バージョンごとに書き方が異なるケースがあり、複雑度が上がっていました。
またはスマホだけじゃなくタブレットでも専用のレイアウトがあるだとか、小さい端末の時と大きい端末の時で処理を変えるとか、そういうケースがあります。

 

例外の作りすぎ

これは分かりやすいですよね。
実際のビジネスは例外のオンパレードです。ECサイトで「明日まで3000円以下の商品は送料無料」とか、状態数増やしてる上に例外を増やしています。
期限付きの例外とか注意しないと負債まっしぐらですよね。

 

仕様的負債が発生する理由(複雑度が上がる理由)

  • ビジネスがそもそも複雑
  • 構造が少し複雑になるとシステムは爆発的に複雑になるということに気づいていない
  • 人間の思考はプログラム的ではない
  • 工数が増えると嬉しい人達が居る
  • 非エンジニアの複雑度に対する危機感の薄さ

こんなところでしょうか?

 

仕様的負債が事業に及ぼす影響

  • どんな機能追加もひたすら遅くなる
  • バグが増える
  • バグかどうかの判断が付かない
  • 仕様を全部把握できる人が居なくなる
  • 優秀で高給な人しか改修できなくなる

どこでも起きてます。

 

仕様的負債を避ける方法

  • 複雑な仕様を安易に受け入れない(技術者サイド)
  • 単純な仕様を検討する
  • 使ってない仕様を破棄する

まあほとんどできてる所無いんですけどね。

 

エンジニアができる仕様的負債に対するアプローチ

現実問題これってあり得るんでしょうか。
仕様的負債の解消というのは技術的負債の解消よりも影響範囲も大きくどうなるか分からない部分もあります。イメージとしては盆栽の剪定作業のような感じですが、コア事業のために何かを捨てるとか変えるわけですから、そこへの責任が発生しますし、非エンジニア組織への説明やユーザーへの説明も発生します。

世の中どちらかと言えば、とにかく気にせず複雑にしてしまい、誰も触れないくらいになるんだけど、最終的に東大卒のエンジニアが長い時間をかけてちょっとずつ変更できるカタツムリのようなスピードで何とかやっていく、みたいな企業が多い印象です。それができないところは停滞していくという。

ライブラリーの開発など見ると、結構スクラップ・アンド・ビルドを繰り返しているので、ああいう風にできたらいいのにと思う一方で、ユーザーとしては「前と全然仕様が違う!」と苛つくこともあるのでどっちが良いんだろうと未だに答えが出ていません。

あと、すごくシンプルにした結果自分らの仕事がなくなるというケースも、いやそれはないか。やることは沢山ありますからね。

自分がこれからPOになることがあったらそこらへんの課題感を持ってやってみたいと思います。