素人がWebサービスを作るまでのプログラミング勉強法

はじめに

とあることをきっかけにプログラミング(Python)を学び始め、半年後にはWebサービスを自作することができました。

www.sekaiisan.site

これまでの半年間の振り返りも兼ねて、その学習の過程を書きます。

回り道を重ねた平凡な学習の記録ですが、私と同じようにWebサービスを作ることを目指してプログラミングを現在勉強中の方・これから学ぼうとしている方に少しでも参考になれば幸いです。

目次

学びのきっかけ

本業

私は1年半ほど前から非IT系企業内で、ITに関わる仕事をしています。

所属する部署がWebサービスや営業現場の社員が利用するシステムを所管しており、それらの改善案を企画することがおもな業務です。

とある機能追加。その開発が完了するのは2年先。

ある時、そのWebサービスと社内システムを連携させて営業社員の業務効率化を図る話が立ち上がり、それらの開発・保守を行っているシステム会社に要件を伝えて見積もりを取りました。

そうしたところ、これがかなり大掛かりな開発になってしまうようで、費用は数億、開発期間は1年半がかかるとのことでした。

それに加え、今回見積もりした案件への開発着手は半年は先になるとのこと。自社からそのシステム会社には、大小含め数多くの案件を依頼中で、システム会社側の開発要員の空きが無いためでした。

費用はともかく、開発が完了して新機能が使えるようになるのが、待つこと半年プラス開発期間1年半の2年先では困るため、自社内で要件の練り直しに入りました。

要件を大幅見直して、費用は100分の1に。それでも開発が完了するのは5ヶ月先。

見直し後の要件で再度見積もりをとったところ、費用は数百万、開発期間は2ヶ月と大幅に削減、短縮することができました。

しかし、それでも開発着手時期に関しては半年とは言わずとも3ヶ月待ってほしいとのことでした。

慢性的な開発要員の不足

自社と、そのシステム会社の間では長年こういった状態が続いていて、自社ではシステムで実現したいことが山のようにある一方で、システム会社の方はその開発を行うための要員が慢性的に不足していました。

なお、これはシステム会社側の要員調達力だけが問題というわけではなく、案件の中には自社からの依頼内容が曖昧なまま開発がスタートして納期が厳しくなった結果、システム会社が多忙になってしまっているという側面もあるのだと思います。

ちなみに自社内には情報システム部門が別にありますが、そこに開発を依頼する、つまり自社で内製開発するという手段が取れるかというと、それもいまの体制上は困難でした。その情報システム部門も実際に開発はせず、先ほどのシステム会社へ外注しているからです。

自分自身で開発できたら、何かが変わる?

こうした経験もあって、自分自身でプログラミングして開発できるスキルがあれば、という思いが強くなってきました。

もちろんプロのシステム会社が保守開発しているWebサービスや社内システムを、素人が付け焼き刃でプログラミングを覚えたところで、現実的に機能追加の開発ができるとは思ってはいません。

ですが、プログラミングを学べば、どういった要件がシステム会社にとって開発しやすいのか、そうでないのかが少しはわかるようになるでしょうし、プログラミングを学んだことで新たな企画の着想が生まれるかもしれません。

それ以外にも、新規機能の試作品のようなものを自作することができれば、社内で企画を通す時や、システム会社に要件を伝える時にも具体的なイメージを示すこともできます。

プログラミングを学ぼう!

何かを始めるのに遅いということは無いはずです。私は、プログラミングを学ぶことを決意しました。

プログラミング言語選び

連休のある日。私は大型の本屋にいました。これから学ぶプログラミングの本を買うために。

Rubyか?

本屋に行く前は、学ぶプログラミング言語Rubyにしようとなんとなく思っていました。日本人が開発した言語ということで新聞で採り上げられることもあり私でもその存在を知っていましたし、学びやすそうなイメージがありました。

それともPythonか?

ただ、本屋のプログラミング言語コーナーには機械学習ディープラーニングといった言葉をタイトルに含むPythonの書籍が目立って置かれていました。

直接関わった経験はありませんが社内でも機械学習を利用したプロジェクトの話はいくつか耳にしたこともありましたし、自分がこれから学ぶプログラミング言語機械学習にも使えるのだとすればそれは非常に魅力的に見えました。

検討した結果、学ぶ言語はPythonにして、初心者向けと思える本を1冊買い、帰宅しました。

Pythonは好きだし選んで後悔は無いけれど、いま考えるとRubyも良かった

ただ、いま現在は機械学習のプログラミングには取り組めておらずWebアプリケーション作りに専念しているので、そうした点を踏まえると、最初の言語としてはPythonにこだわらずRubyを選び、WebアプリケーションフレームワークであるRuby on Railsを学んでも良かったかもしれません。

のちのち通うことになるプログラミングスクールでのWebアプリケーション開発カリキュラムでもRailsを使用しており、初期の独学もその後のスクールも一貫してRubyRailsを学んだ方が効率的だったとは思います。

学習記録:初日〜2日目

1冊目 いちばんやさしいPythonの教本

本屋で1冊目に選んだのは「いちばんやさしいPythonの教本」という本です。

shacho.beproud.jp

先ほどPythonを選んだ理由に機械学習を挙げましたが、この本では取り扱っていません。

ですが、これからのプログラミング学習で早々に挫折することが無いよう、背伸びはせずにこの本を選びました。機械学習を学ぶのは、2冊目、3冊目以降にすれば良いと考えました。

本の内容に従ってPython3とテキストエディタであるAtomを自宅のWindows PCにインストールし、学習を開始します。

思った通り、プログラミング未経験者でも理解できる内容となっており、読み進めていてもつまづく箇所はありません。1冊目にこの本を選んで正解でした。

もっとPythonのことを知りたい

ただ、この本はとてもわかりやすく作られている反面、Pythonに関して取り扱う範囲を意図的に大幅に絞り込んでいるであろうことが、素人である私にも感じられました(いま読み返してみると、例えばクラスの説明もありませんね)。

Pythonでどんなことができるのかますます興味が湧いてきた私は、同じく初心者向けではあるけれどもう一段レベルの高そうな本をもう1冊選び、Amazonで購入しました。

1冊目の本を読み始めて1日余りで早速2冊目の本を購入してしまったわけですが、今回の勉強では気になったものがあれば極力迷わずに出費することにしました。

2冊目 Python3 入門ノート

2冊目に購入したのはPython3 入門ノートという本です。

oshige.com

こちらは、Pythonの基礎的な文法から始まって、終盤では機械学習にも触れる内容となっています。

解説がとても丁寧で非常にわかりやすいですし、いま現在も「あの処理って、どう書くんだっけ?」と思った時には見返すのはこの本です。こちらも買って本当に良かった本のひとつです。

ただし、この本はWebアプリケーションの作成方法については触れてはいません。Webアプリケーションについて学ぶのであれば、後ほど紹介する「Django Girls Tutorial」がまずはおすすめです。

学習記録:1〜2週目

連休が明けました。平日は仕事があり、勉強に使える時間は片道1時間の通勤電車内と、帰宅後にこどもの寝かしつけが終わった後の1〜2時間ほどです。

書籍と「写経」による学習

通勤電車は混雑していて座れることはほとんど無くノートPCを使うようなことはできないので「いちばんやさしいPythonの教本」と「Python3 入門ノート」を読むだけにして、自宅に帰ったら電車で読んだ章のコードをPCにそのまま打ち込んで実行結果を確認しました。

こうした丸写しによるプログラミング学習方法は「写経」と呼ばれ、ITエンジニアの中ではとても有効かつ伝統的な学習方法のひとつだそうです。

買って良かった電子書籍タブレット

通勤カバンに多くの本を入れるのは重いので、2冊目の「Python3 入門ノート」は、電子書籍版(Kindle版)を購入し、スマホKindleアプリで読んでいました。

ところが「Python3 入門ノート」のKindle版は各ページを画像化したような形式となっており、スマホの小さい画面に合わせて文章が拡大、改行されて表示されるようなことはありません。1ページをすみずみまで読む為には、手動で拡大してページ内をスクロールする必要があります(Amazonのこの本のサイトにもそうした点はしっかりと注意書きされていて、見逃した私が悪いのです)。帰宅後のPCでの「写経」の際、このスマホとPCを目でいったり来たりするのはつらいものがありました。

そこで、電子書籍タブレットとしてKindle Fire HD 8を購入しました。これにより一気に電子書籍が読みやすくなり、勉強効率は上がりました。また、このタブレットは、後ほど触れるオンライン学習サイトを通勤電車内で取り組む際にも役に立ちます。1万円以下でこのレベルのタブレットが手に入るのは非常に良い買い物だったと思います。

以降購入する書籍も全てKindle版にして、Kindle Fireで持ち歩くようにしました。

その他の空き時間でもプログラミングとその周辺の知識に触れるようにする

職場での昼休み中は、スマホPythonに関するネット上の記事に目を通すようにしました。

Python」で検索して色々なサイトを周るうちに、ITエンジニアが自分の知識を投稿する「Qiita」というサイトに辿り着き、そちらのPython関連の投稿を中心に毎日読むようにしました。これはいまでも続けています。

qiita.com

Qiitaには、私には到底理解が追いつかない高度な内容の投稿もありますが、初心者向けの投稿もありますし、Pythonに限らずプログラミングに関する有用な情報が幅広く得られますので、とてもおすすめです。

学習記録:3〜4週目

オンライン学習サイト

書籍によるプログラミングの学習を開始してネット上でプログラミングの情報を触れるうちに、世の中にはオンラインのプログラミング学習サイトが多数あることに気づきました。

プログラミング学習サイトの中には、問題が出て、画面上に(ブラウザに)回答となるコードを書くと、正しいか誤っているかを自動で判定してくれるタイプのものがあります。

PyQ

1冊目に購入した「いちばんやさしいPythonの教本」の巻末でも、そうしたプログラミング学習サイトのひとつとして「PyQ」が紹介されていました。このPyQは、Pythonに特化したプログラミング学習サイトです。

pyq.jp

値段はいちばん安いプランで2,980円/月となっています。

プログラミングの学習を開始して約3週間が経過し、Pythonへの理解度を測る目的と、新しい勉強法への好奇心からPyQを始めることにしました。

自分がどこを理解できていないのか、それがよくわかる

問題というかたちでコードを書くことを求められると、理解しているはずのことが実はよく理解できていない、ということに気付かされます。

PyQでコードを書けなかった問題についてはPyQの解説を見て、さらに「Python3 入門ノート」で取り扱っている内容であればそれも読むことで、Pythonへの理解を深めていきました。

通勤電車もインプット&アウトプット学習

PyQはスマホタブレットには対応していないと公式サイトに書かれていますが、電子書籍タブレットとして購入したKindle FireのSilkという標準ブラウザでも特に問題なく動きます(私の触った範囲では)。

そのことに気づいた私は、自宅PCだけでなく通勤電車でもKindle Fireを使ってPyQによる勉強を行いました(ネットへの接続はスマホテザリング機能を使用)。

これまでの通勤電車での勉強は本を読むというインプット学習だけでしたが、Kindle & PyQによって学んだ内容をすぐにコードに書き出せるインプット&アウトプット学習になりましたので、勉強の効率が大幅に上がりました。

ただ、Kindleのソフトウェアキーボードで英数字と記号といった入力モードを切り替えながらコードを書くのは相当にしんどく、万人におすすめできる方法ではありません。私の場合は当時PyQにのめり込んでいて、楽しさが入力のしんどさを上回っていましたが。

学習記録:5〜8週目

Webアプリケーションフレームワーク Django

PyQの数多くのカリキュラムの中で、基礎的な内容を終えて早く取り組みたいと思っていたのがWebアプリケーション作成の章です。

Webアプリケーションを作れるようになれば、それをネット上に公開して知人や職場の人に触ってもらうことも可能ですので、私はこれをひとつの目標としていました。

PyQで取り扱っているPythonのWebアプリケーションフレームワークのひとつにDjangoがあり、こちらでWebアプリの作り方を徐々に学んでいくことにしました。

Djangoの全体像への理解

Djangoでは、決められた役割を持ったプログラムやファイルが組み合わさって、ひとつのWebアプリを構成しています。Django全体の設定に関するプログラム、URLに応じて処理を振り分けるプログラム、処理そのもののプログラム、データベースを担当するプログラム、画面の表示内容のテンプレートとなるファイル・・・といった感じです(他にも色々あります)。

私がPyQでDjangoを学習する上で最初につまづいたのが、ひとつひとつの問題は何となく解けるけれど、こうした各プログラムの役割と関係性、ディレクトリ構成などが時間をかけても頭に入らず、Djangoの全体像が見えてこないという点でした。

ゼロからDjangoでWebアプリを作ってみよう

そこで、Djangoを実際に自分のPCにインストールし、ゼロからWebアプリを作ってみることにしました。そうすることでDjangoの全体像を把握できると思ったからです。

この時、参考にしたのがDjango Girls Tutorialというサイトです。

チュートリアルによる学習

それまで私はよくわかっていなかったのですが、Djangoやその他著名なオープンソースソフトウェアの公式サイトには、そのソフトウェアの基本的な機能を実践形式で学べる、チュートリアルとなるページが大抵あったのです。

プログラミングを学ぶにはまずは書籍を買う、という発想しか無かった私には目からウロコでした。

ただ、こうしたチュートリアルは、日本語化がされていなかったり、日本語化されていたとしても何か別のプログラミング言語の経験者でないと理解することが難しい場合があります。

Django Girls Tutorial

その点、Django Girls Tutorialは、Djangoの公式チュートリアルではありませんが、Webアプリケーションを作成するのが初めての人を対象に作られており、非常にわかりやすい内容となっています。

このDjango Girls Tutorialに繰り返し取り組むことで、当初把握できていなかったDjangoの全体像を徐々に理解していきました。

Herokuでつまづく

ただ、私が取り組んだDjango Girls TutorialはDjango1.11を対象にしたものなのですが、その中で唯一苦労した箇所がありました。Herokuです。

Django Girls Tutorial(Django1.11版)では、Herokuというクラウドサービスを利用して、Djangoで作られたWebアプリケーションをインターネット上に公開する方法が説明されていますが、書かれている通りにやっているはずなのに何度やっても上手くいかず、心折れそうになりました。

最終的には上手くいったのですが、当時の自分がなぜ成功できたのかがよくわかりません・・・。

Django本体やその他パッケージのバージョンが、チュートリアルで取り扱っているものと、実際に自分がインストールしたものとで異なるなどが原因のひとつだと思うので、同様に取り組まれる方はご注意ください。

Django2.0.6を対象としたチュートリアルであればDjango以外のパッケージのバージョンアップに追随した内容になっていることで、そうしたエラーに悩まされることが少ない可能性があります。

1.11版でうまくいかない方は、2.0.6版を試しても良いかもしれません。

Django Girls Tutorial (Django1.11向け)

Django Girls Tutorial (Django2.0.6向け)

学習記録:9〜12週目

初のオリジナルのWebアプリ作成に挑戦

Herokuを使ってDjangoアプリをインターネット上に公開する方法を学んだ私は、オリジナルのWebアプリ作りに取り組むことにしました(冒頭で紹介したWebサービスとは別のものです)。

3冊目 Pythonエンジニアファーストブック

このWebアプリ作りの際に、とても参考になったのが3冊目に購入した「Pythonエンジニアファーストブック」です。

blog.hirokiky.org

この本のWebアプリケーションの章では、画面からおもちゃのレゴの情報を登録、更新、削除したり、それらレゴの情報を一覧表示したり、個別に詳細表示したりするWebアプリを、Djangoを使って作成する方法が順を追って記載されています。

題材はレゴですが、この部分を好みのものに置き換えれば良いので、この本のDjangoアプリの内容をベースにオリジナルのWebアプリ作成に取り組みました。

初めてのWebアプリ完成

そうして完成させた初のオリジナルのWebアプリを知人に公開しました。内容としては知人との内輪ネタ的なWebアプリですが、それなりに面白がってもらえて、私はますますプログラミングが楽しくなってきました。

学習記録:13週目〜20週目

自分ひとりで調べるということ

ここまで書籍とオンライン学習サイトでプログラミングを学んできましたが、Herokuを使ってのWebアプリの公開など、書籍でも学習サイトでも取り扱っていない内容でエラーが出ると当然自力で調べなければならず、かなり時間をかけてしまっていました。もちろん、プロラグラミングをこれからも学んでいく上でわからないことを自ら調べる力は必須だとは思っているのですが、初心者がつまづくようなところではあまり時間をかけたくないという気持ちもありました。

そこで、もっと効率的に学ぶ方法として、費用は高くなってしまいますが、プログラミングスクールへ通うことを検討し始めました。プログラミングスクールの多くは、わからないことがあれば教室やチャットでいつでもメンターへ質問できることを独学と比較したメリットとして挙げています。

私はTECH::CAMPというプログラミングスクールに通うことにしました。

プログラミングスクール TECH::CAMP

tech-camp.in

どんなシステム?

  • 講師による講義とかがあるわけではなくて、会員制のWebサイト上にチュートリアルのようなコンテンツが掲載されているので、それを読みながら教室や自宅で自分のペースで学習していきます。

  • 学べる内容としてはRuby on RailsによるWebアプリケーション、Pythonによる機械学習、その他にiPhoneアプリVR・3Dゲームなどがあり、入会費と月会費を払えばいつでも好きなものを選んで学習できる「学び放題」制となっています

良かったところ

  • このチュートリアル式のカリキュラムがプログラミング未経験者でも理解できるよう本当に丁寧に作られており、簡単なところから段階的にプログラミングを学ぶことができるようになっています

  • 平日は16時〜22時、土日祝日は13時〜19時まで教室が開いていて、静かな環境で集中して学習できます

  • ちなみにプログラミングスクールに通い始めたことを妻に話すと「お金を払っているなら、しっかり通って」ということで、平日は1, 2回は22時まで、土日のどちらかは丸1日(6時間)、こどもの世話を免除させてもらって、スクールに通わせてもらいました。深く感謝です。

  • 私はWebアプリケーションのカリキュラムを中心に学びましたが、つまみ食い的に取り組んだAIのカリキュラムではLINE Messaging APIぐるなびAPIIBM Watsonなどを使ったアプリ作りもあり、視野が広がりました。

私は、TECH::CAMPには計2ヶ月通いました。

最初の1ヶ月半でRailsによるWebアプリケーションのカリキュラムをほぼ終えたのですが、残り半月はそのカリキュラムで作ったRailsのアプリをDjangoで再現してみる、ということにひっそりと取り組んでいました。

スクールでRubyRailsを学んでいるうちに、馴染んだPythonDjangoでまたWebアプリが作りたくなってしまったのです。

スクールのカリキュラムとしては、この先はRailsでのオリジナルWebアプリ作成に入っていきます。せっかくスクールに通っているのにRailsに専念して取り組む気持ちが湧いてこないのであれば、お金だけでなく時間ももったい無いと思い、悩んだ末に2ヶ月で区切りをつけてスクールは退会することにしました。

冒頭の本屋でのプログラミング言語選びで書いた、最初はRubyから学び始めても良かったな、というのはこれが理由です。

TECH::CAMPそのものは本当に良いスクールだったと思います。

学習記録:21週目〜24週目

Webサービス作りに挑戦

ここまでプログラミングを学んできて約5ヶ月。半年を迎えるまでに、前回のような内輪向けではない、一般に公開できるWebサービスを作ることを目標に立てました。

どんなWebサービスにするか

Qiitaでは、自作のWebサービスを紹介する投稿がたまにあります。どれもレベルが高いのですが、その中のひとつに「ホット チリ レビューズ」という、ベルリンのITスタートアップで働くエンジニアのジャバ・ザ・ハットリさんが作られたWebサービスがあります。

qiita.com www.hotchillireviews.net

こちらは、ネット上に散らばる映画レビューのブログ記事を収集し、映画タイトルごと、ブロガーごとなどに分類して掲載しているWebサービスとなっています。

私はこのホット チリ レビューズを参考に、自身のWebサービス作りを開始しました。

世界遺産ブログ集を作ろう

ただし、参考、とはいってもホット チリ レビューズでは、画面の表示を高速にするためのデータ配置の工夫や、動くグラフ表示、機械学習による映画タイトルごとの分類など高度な技術が使われており、こういった点は私には真似ができるわけもありません。

参考にさせていただいたのは「あるテーマのブログ記事を収集し様々な観点で分類する」というコンセプトの部分で、私の場合は世界遺産をテーマとし、その旅行ブログ記事を収集して、世界遺産ごと、ブロガーごとに分類して掲載するWebサービスを作ることにしました。

世界遺産は現在1,000以上存在し、日本人にとっては地名度の低い世界遺産も含めて旅行ブログ記事を網羅することができれば、世界遺産に興味のある人には一定の価値のあるWebサービスになりそうな気がしたからです。

世界遺産ブログ集の開発にあたり役立った本

4冊目 Python クローリング&スクレイピング

世界遺産のブログ記事を集めるといっても手作業ではいくら時間があっても足りません。そこでスクレイピングをします。スクレイピングとは、プログラムを使ってWebサイトの内容を解析して必要な情報を取得する方法です。

3冊目に購入したPythonエンジニア ファーストブックでも全6章のうち1章でまるまるスクレイピングを取り扱っており、それだけでも初心者にとってはかなりの知識が得られますが、4冊目に購入した「Python クローリング&スクレイピング」は1冊まるごとスクレイピングです。

orangain.hatenablog.com

スクレイピングに関する膨大な知見がまとめられていて、初心者がスクレイピングをやろうと思ってわからないことは、この本を読めばまず解決できるのではないでしょうか。内容は高度ですが、解説は非常に丁寧でわかりやすいものとなっています。

5冊目 現場で使えるDjangoの教科書《基礎編》

これまでDjangoについては、Django Girls Tutorial(Django1.11向けDjango2.0.6向け)から始まり、書籍では Pythonエンジニアファーストブック、以降は公式チュートリアルやQiitaの各種投稿などに目を通して知識を習得してきましたが、Django専門の日本語書籍は発売されないものかとずっと思っていました。

akiyoko.hatenablog.jp

そんな私にとって、この「現場で使えるDjangoの教科書」は待望の本で、その存在を知った時には即座に購入していました。これまでのDjangoでの開発でつまづいていた点、理解できていなかった点が、この本によって一気に解決していきました。

そして完成したWebサービス

こうして、ここまで学んだ知識を総動員し、約1ヶ月を使ってWebサービスを完成させました。

www.sekaiisan.site

世界遺産トラベラーズは、世界遺産に関するブログへのリンクを独自の基準で集めた世界遺産ブログ集です。

各ブログに掲載されたリアルな旅の感想や美しい写真を通して、世界遺産への関心をさらに深めていただけば幸いです。

まとめ

本業で経験したことをきっかけにプログラミングを学び始めましたが、この半年間でPythonの知識が身に付いただけでなく、Qiitaの投稿やITエンジニアのブログなどを通じて、ITエンジニアの文化や考え方など多くのことに触れることができた気がします。とても新鮮で、実りのある半年間でした。

これからもプログラミングを学び続けていきたいと思います。

そして、いつの日か自社のWebサービスを内製開発できたら最高ですね。