Androidアプリ vs iosアプリ 初心者エンジニアが最初に取り組むならどっちがいいか勝手に評価してみた。


#概要

##この記事は何？
初心者エンジニアである僕が両方のOSで同じようなアプリ開発を１ヶ月ほどで行った。
その僕がどちらのほうが開発しやすいかを **超主観的** に評価する。
ただ、それだけ。

##この記事を書くにあたって参考記事

グーグル先生にて
「ios android 開発 比較」
でググった記事を上から幾つか。


[Android vs. iOS, アプリはどっちから先に作る/売り出すべきか](http://jp.techcrunch.com/2013/11/19/20131116the-state-of-the-art/)
[こんなに違う？ AndroidとiOSの開発流儀](http://www.kumikomi.net/archives/2011/09/co33smap.php)

このへんの記事を参考にした。
全部乗っけるのは面倒なので、適当にご覧くださいませ。


##比較方法

僕が
ios > Android
の順で開発を行ったので、
「Androidまじか！ すげー！ Andorid始まってる！」
「嘘、だろ。iosで簡単に出来たことがどうしてこんなにも難しいの！？」

というような観点で比較していきます。

上記記事では、マジで開発をする！という観点で書かれておりますが
兎に角取り組んでみよう。と考えている人向けに書くので内容はすっかすかです。

僕が作業した環境と、簡単な作業内容としては

* Android開発環境

>IDE : AndroidStudio 1.0 RC1

>利用したもの :
Volley - Androidのネットワーク周りのあれこれを色々助けてくれるモジュール。超便利。
FacebookSDK - Facebookログインの機能を取り付けるのに使用。
GoogleAnalytics - トラッキングするために使用。
FelloSDK - push通知を簡単にするためのサービス用のSDK。良い。

>開発期間:４週間

>開発手法:
ListFragmentとPagerを利用したアプリを開発。
Javaとxmlでやりました。


* ios開発環境

>IDE : xcode6.1

>主に利用したもの：
CocoaPods - ライブラリのあれこれを簡単に導入するためのツール。超便利。
AFNetworking - iosのネットワーク周りのあれこれを色々助けてくれるモジュール。相方が良いと言っておりました。
FacebookSDK - Facebookログインの機能を取り付けるのに使用。
GoogleAnalytics - トラッキングするために使用。
FelloSDK - push通知を簡単にするためのサービス用のSDK。良い。

>開発期間:５週間

>開発手法:
scrollViewを利用してタブとページの部分を開発。これといって特殊なことはなし。
StoryBordを使わない開発。objective-cでやりました。

こんな感じでした。

##注意事項

正しい情報とは限りませんので、鵜呑みになさらぬようお願い致します。
iosは今だとswiftという簡単な開発方法もありますし、
一概にどちらが最初に取り組むと良いかはあくまで僕の主観です。
ですが、いやこれは絶対違うでしょ。無知乙。
という部分は是非ご指摘をお願いします。

#評価開始

##観点①　最初の取り組みやすさ

###勝者:引き分け

xcodeはインストールするだけで取組めて、AndroidだとAndroidStudioなどのIDE入れた後にSDKをインストール手間があります。

しかし、ちょっとずるいですがJavaが結構普及していることもあり馴染みやすく、
objective-cは独自のサイクルがあるせいで最初壁を感じてしまいがちです。

Androidのライフサイクルとか、アクティビティは最初のうちは特に意識せず、
画面遷移はIntentで適当に移動できるし、

```java:AndroidJavaTips_簡単な画面遷移
//明示的インデント
Intent intent = new Intent(this, NextActibity.class);
startActivity(intent);
```

objective-cは実行ファイルとヘッダファイルと分かれていて、
慣れてくるととっても見やすいのですが、
最初のうちだとどうしてAppdelegateで最初にやるalloc initなんなん？ newじゃだめなん？
え、いいのかよ！何であるんだよ！（錯乱）

```objective-c:objective-cTips_インスタンス生成
//どちらも同じこと。
[AppViewController new];
[[AppViewController alloc] init];
```

というよくわからない迷路にハマる。（嵌った）

どちらも最初にコケる要素があって、どちらにも良い箇所が有りますので、ここは引き分けですね。
どっちからやろうかなぁと考えてる方！
正直どちらも同じくらい面倒ですので覚悟決めてどっちか取り組んじゃいましょう！

##観点②　序盤から中盤にかけての理解しやすさ

###勝者:objective-c

objective-cはブラックボックス的な部分が広くて
ここどうしてこうなってしまうの？
と思いがちですが、どうせ知らなくても最初はすむのですから、こういう動作するんです位で覚えておけばいいのです。

Javaはよくも悪くも凄くオープンで何でも出来る反面
選択肢が多すぎて、学習コストがやや高めな気がします。
そして参考となる資料も大量なので、なにから手を付けていいのか目を回すことになります。

ぶっちゃけるとオブジェクト指向を理解できていれば
iosの方が直感的で、触りやすいと僕は思います。Javaは、というかAndroidは
ライフサイクルの部分が初心者的には直感的ではなく、抵抗感があると思います。

後半になれば両者ともに同程度の難易度になると思いますが、
上達への道が長いのはAndroidだと僕は思います。

##観点③　組やすさ

###勝者:Objectib-c

Javaメソッド多すぎぃ!!

いやいやiosも結構なもんでしょ？
って話になるんですが、

[iPhoneアプリ開発虎の巻](http://iphone-tora.sakura.ne.jp/)

こいつが便利すぎました。
Androidはこういった纏めサイトが（多分）なくて、
Androidの色々な継承元のメソッドの利用方法を覚えるのに
時間がかかってしまいました。

iOSから先に取り組んでいたので、privateとか、publicとか、synchronizedもなんだか最初よくわかんないし、importしてインスタンス化したらアクセスするときの方法がなんだか直感的じゃないし。

まぁ結局iOSにしろAndroidOSにしろ、それ用のAPIとメソッドを覚えなくてはいけません。
ただ、僕的にAndroidOSはブラックボックスが少なく細かく色々組める反面、知らなきゃ出来ない部分が多くあるように感じました。

[ん・ぱ・か工房](http://www.saturn.dti.ne.jp/npaka/)さんが纏めてくださっている
[Androidメモ](http://www.saturn.dti.ne.jp/npaka/android/activity/index.html)を見るとその鱗片を知ることが出来ると思います。これを見ると作るの辛い。ってなるかもですけど、とりあえず

```java:AndroidJavaTips_Activity継承時に使える色々
    //アプリ生成時に呼ばれる
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
    }

    //アプリスタート時に呼ばれる
    @Override
    public void onStart() {
        super.onStart();
    }
    

    //アプリリスタート時に呼ばれる
    @Override
    public void onRestart() {
        super.onRestart();
    }    
    
    //アプリレジューム時に呼ばれる
    @Override
    public void onResume() {
        super.onResume();
    }

    //アプリポーズ時に呼ばれる
    @Override
    public void onPause() {
        super.onPause();
    }
    
    //アプリストップ時に呼ばれる
    @Override
    public void onStop() {
        super.onStop();
    }

    //アプリ破棄時に呼ばれる
    @Override
    public void onDestroy() {
        super.onDestroy();
    }   

```

ここだけ抑えておけば最初のうちはなんとでもなります。

##観点④　デザイン、コーディングしやすさ

###勝者:Java & xmlの辛勝

iosだと実行ファイルとヘッダファイルで分かれているため、
いちいち見合わせるのがちょっと大変だったりします。

どちらも最初の頃は記述も結構分散しがちになりますが

Javaはどうやっても一つのファイルにはまとまるはずですので、
何がどうなってるかは見失いにくいと思います。

ただメソッドの扱いに関して言うと

```objective-c
UIViewController c = [[BaseViewController alloc]init];
[c method];
int num = c.num;
NSString *str = c.name;
```

```java
BaseController c = new BaseController;
c.method();
int num = c.num;
String str = c.name;
```

と、ちょいちょい違いますが
Objective-cからやり始めた僕にとってjavaが見づらいなぁと感じてしまいました。
中括弧ついてる方がはっきりしてて分かりやすくない？と言う感じで。
ぶっちゃけこのへんは綺麗に書ける書けないは慣れなので、
どちらに凄く優劣がつくとかは無いと思います。

また、iOSだとストーリーボード、Androidだとxmlを使ってView部を作れますが
どちらもちょっと拘った事をしようとすると痒いところに手が届かないことになりがちです。
どちらかと言うとxmlのほうがhtmlっぽく自由にコーディング出来る感じです。

##観点⑤　API等のネットワーク利用に関して

###両者引き分け

スマホアプリは基本的に非同期通信でサーバーとのやりとりを行うわけなのですが
どちらも既存の物だと扱いにくいです。
というか、学習コスト高すぎです。

なので、さくっとやってしまうのに

 - Android : volley
 - iOS : AFNetworking

のような便利モジュールが有りますので
是非そちらの利用をご検討下さい。

どちらも一つのクラスにメソッド纏めて
シングルトンにしてしまうのが基本的な使い方ですので、
あまり難しくないと思いますが、つまづきやすい点でもあると思いますのでご注意下さい...

##観点⑥　xcode vs AndroidStudio　（コード補完機能）

###勝者:xcode

私、補完機能ないと死んでしまいます。（皆そう）

この観点はメソッドとか変数とかの名前を補完する機能ただ一点だけを見た時にどっちがいいかというものですが

ただ、どちらも優秀です。

むしろAndroidStudioのほうが自動でimportとかをコード補完してくれる分やや優秀です。

ではなぜAndroidStudioが勝者ではないのかというと
如何せん遅いです。
目に見えて凄く遅い！ということではないのですが、比べると遅さが目立ってしまいます。

あと、やたらとコード補完候補がだらだらっと出てきて、あれ？これ使えるの！？　と思って試しに選んでみたコード補完先がerrorで使えなかったり、最初のうちはイライラする事が多かったです。（objective-cもNSなんちゃらみたいなのばっかりでコード補完もめっちゃ出てくるだろって話ですが僕はAndroidのほうが気になります）

##観点⑦　検証しやすさ

###勝者:シミュレーターなら断然ios。実機はAndroid

Androidシミュレーターは意味不明な部分が多すぎる。
Android実機を持ってないならAndroidデバッグは絶望的である。
動くが重いし、発狂してディスプレイを叩き割るのがオチです。

実機でもiOS優勢かとおもいきや、
なんとiOSを実機で検証するには証明書関係を通す必要が出てきます。
手軽ではないですねぇ。なによりデベロッパーアカウントを購入する必要があるので
ここは無料で、簡単に出来てしまうAndroidのほうが手軽です。


##総論

結局どっちが初心者エンジニアが取り組むんだったらいいの？

アプリ開発をし始める時に、両方のOSでアプリを作らなきゃいけないって前提のもとで判断させてもらうと
objective-cから作り始めるのが良いかと思われます。


僕が両方のアプリを作り終えた後の感想として
objective-cで作っていると、途中で変な癖がついてしまいます。
そのため、iosアプリを作り終えた後にJavaをやり始めた時に、同じことが出来るのに、書き方の雰囲気が違うがために凄く打ちにくい気持ち悪さを感じます。

javaでアプリってこんな感じか。と学んだあとに、iosってちょっと違う雰囲気のコーディングをしないといけないんだな。という気持ちで挑む方がいいのではと感じました。

ですが、AndroidからiOSより、iOSからAndroidのほうが断然作りやすいと思います。

理由はobjective-cの特殊性にあって、ヘッダーファイルと実行ファイルが完全に分かれているため、
Android用に設計し直す時、何がpublicであるべきか等判断がつけやすく、
objective-cで行ったことをjavaでどうやるのか探すときに、javaには豊富なモジュールとサンプルが出回ってますので楽をしやすいです。

Androidから作ってしまうと、objective-cにするときに、似たようなのがあるけど、微妙に同じ挙動にならない。等のもやもやを感じるのでは？　と思います。（実体験ではないため信憑性は薄い。）


###終わり

役に立たない情報のほうが多かったかもですが、
これを見てアプリでも触ってみるかーと思って頂ける方が1人でも現れると幸いです。