みんなの「作ってみた」

【アプリ開発】はじめての個人開発に意気込み過ぎたら色々しくじった

2019/08/27

yukiomura0319
yukiomura0319
元証券営業#法人#個人・モバイルエンジニア 個人アプリで1円でも収益を出すために研究と開発を日々しています。 github: github.com/omurayuki/

はじめに

とある受託企業でiOS開発をしています。
個人開発のしくじり記事です。noteとqiitaで迷いましたが、Gitの共有もしたいのでこの場をお借りして書かせて頂きます。

開発の経緯

業務である程度のことなら開発ができるようになってきたということもあり、個人開発にチャレンジしたいと思い立つ。
それと同時に最近ピーター・ドラッカーの"フィードバック分析"を紙ベースで行なっていたので、どうせならアプリ化しようと思い開発に取り掛かる。

フィードバック分析とは自分の強みを知り、その強みを伸ばしていくためのメソッド。ピーター・ドラッカー自身も長年このメソッドを取り入れていた。

開発前の準備

特に何もしていません。
思い立ったら即行動。

開発初期

~ なんでもできる万能感 ~

TwitterやFacebookのUIをみて、自前で全部作れるわとか思っていた頃。
また、フィードバック分析のアプリがなかったということもあり、市場のパイオニアのような感覚だった。

これがブルーオーシャンww

とか思っていた。とにかくイタすぎた。

開発中期

~ 割と楽しかった ~

妄想フェーズは終わって、現実的にデータベース設計とかアーキテクチャの学習とかやっていた。
市場のパイオニア感をモチベーションに難しい実装も幾度となく乗り越え、その度に達成感に包まれた。
この頃が一番精神的に豊かだった。

開発後期

~ モチベーション氷河期 ~

モチベーション大暴落。側から見たら情緒不安定。

理由1. こんなアプリじゃない感

なぜかアプリがSNS寄りになっていく。そして指が勝手に動く。気づいたらSNSになっていた。
この時に、機能定義などは開発前に着手するべきだと痛感した。

理由2. 先が見えない

後半から気づき始めたが、初期フェーズの個人が出すアプリにしては規模がデカすぎる。
何も考えず開発を続けていると、あれもこれも必要なんじゃないか とか こんな機能がほしい と、つい目的から遠ざかってしまう。それが行き過ぎたのが俺だ。
これに関しても事前準備である程度は回避できたはずだ。


そして自分は一体なんのために戦っているのか、何と戦っているのかわからなくなってきた。しかし、一つだけ目的があった。

それが"リリース"。

自分で作ったアプリを市場に出せば何かが変わるんじゃないかという想いで無心で頑張った。
それはまるで仲間を失い生贄の烙印を押されながらも、グリフィスを倒すというただ一つの目的のために戦い続けるガッツのように。

反省点

・ アプリは小さく始める

今回の記事で一番主張したい。調子に乗るなと。一人のエンジニアのリソースで世の有名アプリと張り合えるアプリなど作り出せない。
誰でも最初はすごいものを作りたい。その気持ちはわかる。だが、"過ぎ去るは及ばざるが如し"というように、そんなことをするとコードの前に精神が破綻する。それが俺だ。

・ 画面遷移図やデータの流れをざっくりとでも書き起こす

ざっくりとでもデータの流れや画面遷移の流れを書き起こすべきだった。自分の場合局所的に必要なデータや画面を都度書き起こしたりしていて時間と労力の無駄が多かった。

・ 個人開発者の記事をいくつか見て取り組むべきだった

すでに世の中には沢山のしくじり先生がいる。 
同じ失敗をする必要はなかった。

技術的な反省点

・ Viewの管理

アプリで同じようなviewを使い回す場面が多かった。しかしそれはあらかじめ把握できたものだ。自分は愚策にもBaseViewなるものを作ってこの問題を解決してしまった。反省はしている
BaseViewControllerは作りたくない

・ 変数名をもっとしっかりつけるべきだった

最初は具体的な変数名をしっかりつけていたが、いつの間にか

・token
・documentID

などという抽象的な変数名をつけるようになった。一周回ってこんな変数名つける俺かっこいいとか思ってたけど後からコード全体見渡したら地獄絵図だった。
変数名は長くなってもわかりやすく。
リーダブルコード

・ どういう目的でどこに処理を書くか

どこにどういう目的で処理を書くかなど最初は何も考えなかった。
しかし、規模が大きくなるとそれらの負債は自分を襲ってくる。
やられる前に対策しよう。
ひどいコードをメンテしてきたからこそ実感する、良いコードや良い設計の大切さ
コーディング原則
デザインパターン

・ deinitが走らない(循環参照)

deinitとはクラスインスタンス解放時に呼ばれる関数。この関数が呼ばれなければ、クラスのインスタンスがメモリ上にまだ残っていることを示唆している。メモリリークの原因になる。

ある時インスタンスが破棄されたタイミングで処理を走らせたい場面があった。
しかしdeinitが走らない(循環参照)、冷や汗をかいた、そしてLintの大切さをしみじみと感じた。
デバックは出来たもののその時間はもう帰ってこない。
それ以外にもLintを導入する理由は数えきれない。
(Lintを入れたらいいのではと思われるかもしれないが、入れた際の地獄絵図を想像するだけでも泣きそうになるから入れなかった。今回だけ許して)
ハマりがちな循環参照について
SwiftLint
私がLintを愛する3つの理由

その後

一応完成はしたものの、リリースは見送る形にしました。

理由は以下です。
・フィードバック分析機能がもはや機能していない。と言うよりも存在にすら気づかない。
・結果SNSになり、それでもリリースしようと思ったが、同じようなアプリはかなりある。
・次に作りたいものがあるので、申請に時間を費やしたくない。
・etc..

しかし、そのままでは何かすごくモヤモヤした気持ちが残るので、せめてこれからiOSで個人開発に取り掛かろうと思っている方々にこれを活用してほしいと思い、Githubに公開しています。
*諸々修正はしましたので、ある程度参考にできるコードにはなっていると思います。
よかったらご覧ください。

最後に

以上しくじりでした。
しかし今回の開発で学んだことは計り知れす、ナレッジも沢山溜まりました。
今回の反省点を全て活かし、これからもめげずにアプリ開発を続けていきます!
その度に個人開発の開発・運用状況なども共有していきたいと思っているのでTwitterもフォローしていただければ嬉しいです。
YUKI_個人アプリ開発&MobileEngineer