未経験から独学でiOSアプリ(Pythonバックエンド)を作るまでにやったこと

iOSアプリ

私はプログラミング技術を全て独学で身につけてきました。

「iOSアプリ(Swift)と、そのバックエンドサーバー(Python)を書く」くらいのことは、誰の助けも借りずにできるようになりました。
(コードのクオリティなんかはまた別の話ですが・・・)

この記事では、私がiOSアプリを作れるようになるまでに、独学で行った勉強法や関連書籍を紹介していきます。

最初の方はC#の話が多いです。
iOSやPython以外は興味ない方は「退社後」から読んでください。

未経験から入社まで

「独学」といっても、一応プログラマとして未経験者採用枠で雇ってもらっていました(半年で退社)。

ただ、先輩や上司にも特に教えてもらった記憶はなく、基本的には全部自分で勉強して仕事をこなしていたので、ここでは「独学」としておきます。

やさしいJava

「知識ゼロ」の状態から勉強するために、入社前に初めて買った技術書は『やさしいJava』でした。

ちなみに会社のメイン言語はC#でした。

なんでC#を勉強しなかったのかというと、そもそもその企業に長く務める気がさらさら無く、自分のスキルとして役に立つ言語を勉強したかったからですね。
(当時はなぜかJavaが良さそうだと思ってました。)

結局Javaはこの本以外まったく勉強していないので、「Javaの教材」としてどうなのかはよくわかりませんが、少なくとも「プログラミング入門書」としては平凡な出来だと思います。

説明はそれなりに丁寧で、不親切な本ではないです。
でも、入門書にありがちな「ゼロから解説」タイプなので、1冊こなすのはかなりダルいです。
あまり読者の「モチベーション」を考慮した本ではないですね。

実際、私も最後の方の「例外」とか「スレッド」はやらずに投げました。

入門 Python3

「Javaはなんだか違う」と思った私が次に手を出したのはPythonです。

購入したのは『入門 Python3』。

これは逆に、「プログラミング初心者」向けではないです。
あくまで(他の言語の経験がある)「Python初心者」が読むべき本です。

なぜなら、この本は「Pythonにはこういう機能・ライブラリがあります」ということを網羅的に説明していく本だからです。

例えば、「Pythonではクラスの宣言の仕方はこうです」という説明はあっても、「クラスとはこういうものです」という説明は一切ありません。

私は上記のJava本で最低限の知識はありましたが、それでも読んでてキツかったです。

この本も、結局半分くらい写経して投げました。

でも、会社で経験を積んでからもう一回読んだら、かなり役に立ちました(後述)。

ネットで公開されているC#課題

上記の2冊の本を買ったのは大学4年次の12月ごろでしたが、いまいちモチベが上がらず、両方投げ出してから3月くらいまでなにもやってませんでした。
(モチベも無かったし、ひたすら曲を作りたかったというのもあります)

そんな「ほぼ未経験」の状態で新卒社会人プログラマになるのも怖かったので、ようやくC#の勉強を始めました。

しかし「プログラミング本はつまらない」という体験をした筆者は、とにかく「手を動かしまくる」ことにしました。

ネットでC#用の基礎的な問題(forやifや配列の扱いなど)を見つけては解きました。

「北ソフト工房」さんのC#問題はよくやりました。

文法はJavaと似ているので基本はわかりましたが、細かいところは「未確認飛行C」さんの解説にお世話になりました。

プログラミングは覚えることが多い

これは事実で、入門書だけでも、初心者は膨大な知識量に圧倒されてしまうと思います。

なので、プログラミング初心者はいきなり「網羅的」な知識を習得しようとしないほうがいいです。

私も最初の2冊が「網羅系」だったので、知識だけは中途半端に詰め込んで、「いったいプログラミングで何ができるのか」は全然わかりませんでした。

それよりも簡単なプログラムでも「まず書く」ことが、技術・モチベのアップにつながります。

Redditのトップニュース取得アプリ作成

2週間くらいC#の課題をやったわけですが、すぐに飽きました。

「いったいプログラミングで何ができるのか」という私の疑問は、forやifが使えるだけでは全く解消されません。

そこで「とりあえずデスクトップアプリを作ろう」と考えました。
webアプリは難しそうだし、言語単体の知識だけじゃ対応できなさそうだったからです。

私が作ったのは「Redditのトップ記事をスクレイピングで取得して表示する」という単純なものです。

スクレイピング用のライブラリを使って、Windows Formsで作りました。
サムネとタイトルの表示、ログインや検索機能も実装しました。

毎日10時間ずつくらいコーディングして、3日くらいで作った記憶があります。

このアプリを作っている時にようやくプログラミングの楽しさがわかりました。

入門書や単純な問題を解いているだけでは、いまいち「ドーパミン」が出ないんですよね。

でも、自分で「このサイトからこの情報を取得しよう」と決めて書いたスクレイピングプログラムで、狙い通りの動作を実現できた時は興奮しました。

これを作ったのが、ファイルの日付からおそらく3月25日なので、もう少しで入社ですね。

入社後

研修

会社では3ヶ月の研修期間がありました。

いわゆるプログラミングの勉強ができたの実質1ヶ月半ほどでした。
(ちなみにラダーもやりました。)

研修といっても、実質は自習です。
すでに入社前にやったような基礎的なものから、もう少し発展的な内容もやりました。

どんな会社だったかは以下の記事に詳説。

実務

4ヶ月目からは実務に入りました。
メイン業務は工場向けの生産管理システム製作で、基本はC# + Windows Formsです。

初仕事ではICタグ・QRコードリーダーを使ってアレコレしてました。

ちなみに、そのプロジェクトにプログラマは私1人だけ。

しかも設計をしてくれるSEの上司は1ヶ月前に中途入社したばかり + プログラミング不可という人材です。
仕事の段取りが非常に悪く、SEという割にスケジューリングの概念がありません。
さらに客先とも社内ともコミュニケーションが上手く取れず、分からないことを分からないまま放置するような人です。

「残業絶対したくないマン」としては、自分が働くよりも、とにかく彼を働かせることを考えなければいけませんでした。
(というか、彼が働いてくれなければ自分も働きようがない)

なんとか仕様を書かせたら、ようやくプログラミングができます。
わからないことはいくらでもあるので、とにかくググってトライ・アンド・エラーを繰り返します。

結局、残業だけは1日30分未満に抑えつつ何とか完成させることができました。

仕事以外

入社してからも、ある程度は自分で勉強していました。

初めのうちは何故か機械学習に手を出すも、「結局これで何をするの?」と思って挫折します。

5月くらいにはMacbook Proを買いました。

そこでUnix/Linux系OSに慣れることの重要性に気づいて、「新しいLinuxの教科書」をやりました。

この本はオススメです。

「Linuxの教科書」とは言っても、別にLinuxカーネルについての本ではありません。

むしろ「Bashの教科書」という感じですね。
Linuxコマンドの使い方を基本から教えてくれるのと、最後にgitについても結構ページが割いてあります。

この本の良いところは、「手を動かして」学べることです。
理論や御託は書いてありません。とにかく「こうしたければああしろ」という本です。

「日記を書く」「再帰的にファイルを検索する」といった、実用的なスクリプト(自分で書く必要はないですが・・・)の書き方も載っています。

webアプリ製作

単純なものでもいいから、とりあえずカタチになっているwebアプリを作ろうとしました。

「Pythonのmidiライブラリ「mido」でコード解析ツールを作った」

この記事で紹介したツールはその時に書いたものです。

これをFlask(Pythonのサーバーライブラリ)で動かして、「ブラウザから送られたMidiデータを解析してコード進行を返す」というアプリを考えてました。

完成するのは辞めてからです。

退社後

リモートで働きたいという欲はやっぱり収まらず、とにかくweb系技術をつけようと思いました。

入門 Python3

でもweb云々以前に、言語自体を体系的に学びたいと思い、投げ出していた『入門 Python3』をもう一度開きました。

C#をそれなりに勉強してから読むと、やはり「プログラミング入門」ではなく「Python入門」としては良いなと感じました。

ファイルの読み書きからサーバーにいたるまで、かなり幅広く(そして浅く)紹介されています。

Pythonの可能性を知るためにはいい本ですよ。

The Flask Mega-Tutorial

The Flask Mega-Tutorialは、無料で公開されているFlask講座です。

ちなみに英語版しかありません。
プログラミングをやる上でやっぱり英語はできたほうがいいですね。

無料ですが、内容は書籍なみに充実しています。

初心者でも努力次第でついていけるくらいに親切だし、でも内容が浅いというわけではありません。

これがタダで読めるあたり、英語圏の文化の分厚さを感じます。

webアプリを完成させる

働きながら作っていたwebアプリを完成させました。

ブラウザからMidiデータをアップロードして、Flaskのバックエンドでコード進行を解析して返すという機能ですね。

サーバーアプリはDockerイメージ化して、AWSのEC2にデプロイしました。

固定IPも一応は取得して公開できるようになったんですが、肝心の「コード進行のグラフィック化(譜面化)」の前に力尽きて断念。(動作はしても、ダサい)

htmlやcssなんかのweb系フロントエンドには、かなり苦手意識を持ちました。

ユニバーサルな枠組みのはずなのに、特定の誰かが勝手に決めたルールに従わないといけない感じが嫌なんですよね・・・。
「iOSアプリ」とか「React」とかは企業のフレームワークというのが明確なので気にならないんですが。

htmlが嫌になったところで、「アプリ開発の方が向いてる」と方向転換します。

webアプリを作る上でPythonを選ぶ利点があるのか? というと、多分べつにないでしょうね・・・。
受託できる案件の数なんかを考えると、本当はphp(あるいはRuby?)を選んだ方が良いはずです。
でもphpやRuby on Rails界隈(といってもほぼ初心者だとおもいますが・・・)のノリが無理で敬遠してました。
生きるためにphpにも手を出そうとは思っています。

AppCodaの「Beginning iOS 12 Programming with Swift」

これはウェブからダウンロードできる有償教材です。
電子書籍とかhtmlで読めますし、サンプルコードもたくさんついてきます。

とにかくこれを1周して、自分なりのwebサービスとクライアントアプリを作ろうとしました。

完成したiOSアプリ

ここまで読ませておいてなんですが、実はまだできてません。

すみません。笑

でも基本は完成していますし、完成させられるだけの力は身につけてきたはずです。

まとめ

まだ1年未満のプログラミングしかありませんが、実感するのは「プログラミング言語は1つやれば応用が効く」ということです。

実際、Swiftは「よしiOSアプリを作ろう」と思ってから2週間勉強しただけですが、C#やPythonの経験さえあればどうにでもなります。

この記事のタイトルである、「未経験からiOSアプリを作れるようになるまでにやったこと」のほとんどは、Swiftと直接の関係はありません。

(Swiftの教材がたくさん紹介されてると思って読まれた方、すみません)

技術書もあまり読んできませんでした。

「とにかく書く」「とにかく作る」ためには、「とにかくググる」でなんとかなります。

(そろそろ基礎的で体系的な知識をつけていく必要もあると思っているところですが)

初心者かつ独学でプログラミングを始めようとしている方の参考になったら幸いです。