サービス開発に対して思っていることをまとめる

インターンや面接、様々な場面で自分の考えや技術的なことを喋る機会が多いのですが、喋るのがあまり得意ではないのと時間が限られていて伝えきれないことが多いのでブログにまとめていきます。所々話が重複してるところもありますが説明のためです。

技術的なことや実際のソースコードは[qiita](http://qiita.com/takeokunnn)や[GitHub](https://github.com/takeokunn)にまとめているのでそちらをどうぞ

[たけてぃーの開発ブログ](http://bararararatty.hatenablog.com/)に書いたがせっかくなので`Qiita`にも書いちゃいます。~~はてぶはView数増えないからつまらない~~

# サービスの開発改善していく上で一番大事なことってなんだろう？

プログラミングや企画、デザインなど全てに共通するものなのですが、何をやるにしてもこの疑問が一番大事だと思います。「収益を増やす」、「ユーザー数を増やす」、「使ってくれているユーザーがもっと快適に操作できるようにする」、「自分たちの開発能率を上げる」など様々な目標があげられると思います。

その目標を達成するためにはどうすればいいでしょうか？

方法は非常にたくさんあげられると思います。

例えば、「使ってくれているユーザーがもっと快適に操作できるようにする」という目標に対してのアプローチを考えてみます。

## 1. スマホユーザーに対してのアプローチ

スマートフォンは今や若者の普及率が９割を超えているという調査(総務省調査)があるように普通に使われているものです。`Android`ユーザーが3割、`iOS`ユーザーが7割くらい(おおよそ)です。さて、スマホユーザーはスマートフォンを使用してる時に何をやっているでしょうか？基本的にブラウザを開くよりもネイティブ(スマホ)アプリを開いていることが多いとおもいます。

では、ユーザーのためにネイティブアプリを作ればそれで本当にいいのでしょうか？

答えはYesでありNoだとおもいます。人的、金銭的、時間的にリソースは限られています。`xamarin`は置いといて、基本的に`Android`と`iOS`開発は別です。レスポンシブルデザインじゃダメなの？本当にネイティブアプリを作るだけの価値があるの？と言ったことをきちんと考えてそれでも「やはり必要だよね」となれば開発するべきだと僕は思っています。(当たり前の話ですが....)

スマートフォンにはPCと比べてメリットもデメリットもあります。メリットとしてあげられるのは「外出時でも気軽に見ることができる」などです。逆にデメリットは「通信が安定しない」や「処理速度が遅い」、「機種によって画面サイズもOSのバージョンの挙動も様々(Androidが顕著らしい)」などがあげられます。

さて、このようなデメリットを埋めるためにはどうすればいいでしょうか？

一つは「通信量を抑える」というものが考えられます。ではどのようにしたら通信量を抑えられるでしょうか？DBから引っ張ってくるデータの量を最適化する(無駄にjoinしてないか)、xmlではなくjsonで送る、無駄なviewコードを書かない、ソースコードを圧縮する、など様々考えられます。

また「処理速度を改善する」というものも考えられます。計算回数を減らす(アルゴリズムの見直し)、データバインド数を減らす、メモリ管理はどうか、細かい高速化Tipsはたくさんあります。

当然改善すべきところは改善すべきなのは当たり前ですが、これは本当に優先事項の高いことなのでしょうか？Yesならばすぐに改善すべきですし、Noならば別のものを改善してから取り組むべきです。

## 2.PCユーザーに対してのアプローチ

PCはスマートフォンと比べて処理速度も高く画面も大きい場合が殆どです。また通信が安定している場所で開くことが多いのである程度アニメーションを入れたリッチなサイトにしても問題無いとおもいます。

さて、サービスを使ってくれているユーザーはどの端末からアクセスするでしょうか？僕が今やっている開発では8割以上がスマートフォンからのアクセスです。では、どのように開発すればいいでしょうか？

一つの方法としては、「PC版とスマホ版で切り分ける」という方法です。ユーザーエージェント毎にPCページとスマホページを切り替えということができるのでこの方法でもいいでしょう。

また、スマホPC共に表示できるレスポンシブルデザインもいいでしょう。`bootstrap`使えば簡単に実装できますし、別々に作るよりも開発効率はいいです。

## 3.バグについて

「バグの無いシステムなど存在し無い」とよく言われていますが、どうしてバグがでるのか、バグが出ると何が困るのか、どうやったらバグが出にくくなるのか、と言ったことについて考えていきます。

どうしてバグは出るのでしょうか？僕は「人間はミスをする生き物」だからだと思っています。ちょっと処理を書き間違えた、変数名をミスった、エラー処理をしてなかったとか様々ありますが、ミスをするのはしょうがないです。「[闘うプログラマ](https://www.amazon.co.jp/%E9%97%98%E3%81%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-%E4%B8%8A%E5%B7%BB-G-%E3%83%91%E3%82%B9%E3%82%AB%E3%83%AB-%E3%82%B6%E3%82%AB%E3%83%AA%E3%83%BC/dp/4822740161)」でも同じようなことが書いてありました。世界中の天才と呼ばれるプログラマが集まってWindowsNTの開発を行ってたのですがバグが膨大な数出たそうです。

さて、バグが出るのはしょうがないとして、バグが出るとどんな問題が生じるのでしょうか？たくさん考えられますが、「ユーザーから信頼されなくなる」のが一番の痛手なのではないでしょうか？自分の個人情報などをばら撒かれるor自分に危害が及ぶことをわかっていてそのサービスを使いたいでしょうか？サービスの内容以前の問題になってきます。バグ修正は最重要項目だと僕は思っています。

ここが一番肝心、バグはどうやったら減るorなくなるのでしょうか？TDD(テスト駆動型開発)やデバッガなど様々な手法方法が考えられてきました。それぞれすごく役に立ちとても良いと思うのですが、僕が一番大事だなと思うことは「ソースコードを綺麗に書く」です。UNIX哲学に「一つのことを、うまくやれ」という言葉があります。シンプルな方がいいんです。他にも素敵なことが書いてあるので詳しくは[Wiki](https://ja.wikipedia.org/wiki/UNIX%E5%93%B2%E5%AD%A6)で

### さて、ソースコードを綺麗に書くにはどうすればいいでしょうか？

僕が普段心がけてることは以下の通りです。

#### 視覚的にソースコードを美しくする

デザインの4原則「反復」「整列」「コントラスト」「近接」が役に立ちます。変数定義、ロジックをなるべく"近接"させる。`=`や`;`などで"整列"する。それぞれの関数の中の処理を「反復」して一貫する。`syntax highlight`で「コントラスト」する(例がいまいち...)。

このようなことを気をつけるだけで圧倒的にコードが見やすくなります。(当然コーディング規約も大事だが）

また、フォントや背景色にもこだわることによってより視覚的に見やすくなると思います。

あとはファイルの大きさも150行くらいまでにするとぱっと見わかりやすくなるのではないでしょうか？

#### なるべく早く`return`するようにする

多重ネストしたコードは可読性が下がります。さっさと`return`して綺麗にしましょう。

#### ファイル分割を美しくする

どのファイルに何があるか、どこを編集すればいいのか、どうやって追加すればいいかの理解がしやすくなるとコード書く早さもバグも減ると思います。

#### 意味のないコードを書かない

使われていないコードは本当に知りたいコードを探すときにノイズになってしまいます。なるべく書かないようにしたいものです。

####  データのフローを意識する

データがどのように流れているのかということを意識するとバグがどこで起きたのかすぐに特定できます。データの流れはデザインパターンによって決められることが多いとおもいます。

####  アンチパターンやセキュリティ的に問題になりそうなところをあらかじめ勉強しておく

`qiita`や`stack overflow`など様々な情報共有サイトがあります。そこで他人のコードを読んだりバグがでそうなパターンを読んだり実際に趣味でコード書いてみたりするようにしています。

# 結論

時間、人手、金は限られているのでその中で最大限目標を達成するためにはどうすればいいのだろうか？何が一番優先順位が高いのだろうか？ということを常に考え実行していくことが重要だと思っています。その目標を達成するためには様々なアプローチの仕方があってそれぞれのアプローチの仕方が本当に正しいのかを考えながら実践していくことが重要だ、また目標を達成する手段を増やすために個人でも勉強をしなければならない、と僕は思っています。

初めから処理速度だとか通信量だとかいずれ改善しなければならないだろうことを意識できていたら２度手間になることはないですからね。

# 最後に

まだプログラミングを初めて日が浅いので様々な仕事を受けてもっともっと自分の中で改良していけたらなぁと思っています。

批判コメントお待ちしています。