勉強法はじめにとあることをきっかけにプログラミング(Python)を学び始め、半年後にはWebサービスを自作することができました。これまでの半年間の振り返りも兼ねて、その学習の過程を書きます。回り道を重ねた平凡な学習の記録ですが、私と同じようにWebサービスを作ることを目指してプログラミングを現在勉強中の方・これから学ぼうとしている方に少しでも参考になれば幸いです。学びのきっかけ本業とある機能追加。その開発が完了するのは2年先。要件を大幅見直して、費用は100分の1に。それでも開発が完了するのは5ヶ月先。私は1年半ほど前から非IT系企業内で、ITに関わる仕事をしています。所属する部署がWebサービスや営業現場の社員が利用するシステムを所管しており、それらの改善案を企画することがおもな業務です。その開発が完了するのは2年先。ある時、そのWebサービスと社内システムを連携させて営業社員の業務効率化を図る話が立ち上がり、それらの開発・保守を行っているシステム会社に要件を伝えて見積もりを取りました。したところ、これがかなり大掛かりな開発になってしまうようで、費用は数億、開発期間は1年半がかかるとのことでした。それに加え、今回見積もりした案件への開発着手は半年は先になるとのこと。自社からそのシステム会社には、大小含め数多くの案件を依頼中で、システム会社側の開発要員の空きが無いためでした。費用はともかく、開発が完了して新機能が使えるようになるのが、待つこと半年プラス開発期間1年半の2年先では困るため、自社内で要件の練り直しに入りました。要件を大幅見直して、費用は100分の1に。それでも開発が完了するのは5ヶ月先。見直し後の要件で再度見積もりをとったところ、費用は数百万、開発期間は2ヶ月と大幅に削減、短縮することができました。それでも開発着手時期に関しては半年とは言わずとも3ヶ月待ってほしいとのことでした。自社と、そのシステム会社の間では長年こういった状態が続いていて、自社ではシステムで実現したいことが山のようにある一方で、システム会社の方はその開発を行うための要員が慢性的に不足していました。これはシステム会社側の要員調達力だけが問題というわけではなく、案件の中には自社からの依頼内容が曖昧なまま開発がスタートして納期が厳しくなった結果、システム会社が多忙になってしまっているという側面もあるのだと思います。ちなみに自社内には情報システム部門が別にありますが、そこに開発を依頼する、つまり自社で内製開発するという手段が取れるかというと、それもいまの体制上は困難でした。その情報システム部門も実際に開発はせず、先ほどのシステム会社へ外注しているからです。自分自身で開発できたら、何かが変わる?こうした経験もあって、自分自身でプログラミングして開発できるスキルがあれば、という思いが強くなってきました。プロのシステム会社が保守開発しているWebサービスや社内システムを、素人が付け焼き刃でプログラミングを覚えたところで、現実的に機能追加の開発ができるとは思ってはいません。プログラミングを学べば、どういった要件がシステム会社にとって開発しやすいのか、そうでないのかが少しはわかるようになるでしょうし、プログラミングを学んだことで新たな企画の着想が生まれるかもしれません。それ以外にも、新規機能の試作品のようなものを自作することができれば、社内で企画を通す時や、システム会社に要件を伝える時にも具体的なイメージを示すこともできます。プログラミングを学ぼう!何かを始めるのに遅いということは無いはずです。私は、プログラミングを学ぶことを決意しました。プログラミング言語選び連休のある日。私は大型の本屋にいました。これから学ぶプログラミングの本を買うために。Rubyか?本屋に行く前は、学ぶプログラミング言語はRubyにしようとなんとなく思っていました。日本人が開発した言語ということで新聞で採り上げられることもあり私でもその存在を知っていましたし、学びやすそうなイメージがありました。それともPythonか?ただ、本屋のプログラミング言語コーナーには機械学習、ディープラーニングといった言葉をタイトルに含むPythonの書籍が目立って置かれていました。関わった経験はありませんが社内でも機械学習を利用したプロジェクトの話はいくつか耳にしたこともありましたし、自分がこれから学ぶプログラミング言語が機械学習にも使えるのだとすればそれは非常に魅力的に見えました。検討した結果、学ぶ言語はPythonにして、初心者向けと思える本を1冊買い、帰宅しました。Railsを学んでも良かったかもしれません。のちのち通うことになるプログラミングスクールでのWebアプリケーション開発カリキュラムでもRailsを使用しており、初期の独学もその後のスクールも一貫してRubyとRailsを学んだ方が効率的だったとは思います。本屋で1冊目に選んだのは「いちばんやさしいPythonの教本」という本です。Kindle版この商品を含むブログを見る先ほどPythonを選んだ理由に機械学習を挙げましたが、この本では取り扱っていません。これからのプログラミング学習で早々に挫折することが無いよう、背伸びはせずにこの本を選びました。機械学習を学ぶのは、2冊目、3冊目以降にすれば良いと考えました。PCにインストールし、学習を開始します。思った通り、プログラミング未経験者でも理解できる内容となっており、読み進めていてもつまずく箇所はありません。1冊目にこの本を選んで正解でした。Pythonのことを知りたいただ、この本はとてもわかりやすく作られている反面、Pythonに関して取り扱う範囲を意図的に大幅に絞り込んでいるであろうことが、素人である私にも感じられました(いま読み返してみると、例えばクラスの説明もありませんね)。Pythonでどんなことができるのかますます興味が湧いてきた私は、同じく初心者向けではあるけれどもう一段レベルの高そうな本をもう1冊選び、Amazonで購入しました。1冊目の本を読み始めて1日余りで早速2冊目の本を購入してしまったわけですが、今回の勉強では気になったものがあれば極力迷わずに出費することにしました。入門ノート」という本です。Kindle版この商品を含むブログを見るこちらは、Pythonの基礎的な文法から始まって、終盤では機械学習にも触れる内容となっています。解説がとても丁寧で非常にわかりやすいですし、いま現在も「あの処理って、どう書くんだっけ?」と思った時には見返すのはこの本です。こちらも買って本当に良かった本のひとつです。この本はWebアプリケーションの作成方法については触れてはいません。Tutorial」がまずはおすすめです。平日は仕事があり、勉強に使える時間は片道1時間の通勤電車内と、帰宅後にこどもの寝かしつけが終わった後の1〜2時間ほどです。入門ノートを読むだけにして、自宅に帰ったら電車で読んだ章のコードをPCにそのまま打ち込んで実行結果を確認しました。した丸写しによるプログラミング学習方法は「写経」と呼ばれ、ITエンジニアの中ではとても有効かつ伝統的な学習方法のひとつだそうです。入門ノートは、電子書籍版(Kindle版)を購入し、スマホのKindleアプリで読んでいました。入門ノートのKindle版は各ページを画像化したような形式となっており、スマホの小さい画面に合わせて文章が拡大、改行されて表示されるようなことはありません。1ページをすみずみまで読む為には、手動で拡大してページ内をスクロールする必要があります(Amazonのこの本のサイトにもそうした点はしっかりと注意書きされていて、見逃した私が悪いのです)。帰宅後のPCでの「写経」の際、このスマホとPCを目でいったり来たりするのはつらいものがありました。これにより一気に電子書籍が読みやすくなり、勉強効率は上がりました。このタブレットは、後ほど触れるオンライン学習サイトを通勤電車内で取り組む際にも役に立ちます。1万円以下でこのレベルのタブレットが手に入るのは非常に良い買い物だったと思います。Fireで持ち歩くようにしました。その他の空き時間でもプログラミングとその周辺の知識に触れるようにする職場での昼休み中は、スマホでPythonに関するネット上の記事に目を通すようにしました。「Python」で検索して色々なサイトを周るうちに、ITエンジニアが自分の知識を投稿する「Qiita」というサイトに辿り着き、そちらのPython関連の投稿を中心に毎日読むようにしました。これはいまでも続けています。Qiitaには、私には到底理解が追いつかない高度な内容の投稿もありますが、初心者向けの投稿もありますし、Pythonに限らずプログラミングに関する有用な情報が幅広く得られますので、とてもおすすめです。学習記録:3〜4週目オンライン学習サイト書籍によるプログラミングの学習を開始してネット上でプログラミングの情報を触れるうちに、世の中にはオンラインのプログラミング学習サイトが多数あることに気づきました。プログラミング学習サイトの中には、問題が出て、画面上に(ブラウザに)回答となるコードを書くと、正しいか誤っているかを自動で判定してくれるタイプのものがあります。PyQ1冊目に購入したいちばんやさしいPythonの教本の巻末でも、そうしたプログラミング学習サイトのひとつとして「PyQ」が紹介されていました。このPyQは、Pythonに特化したプログラミング学習サイトです。値段はいちばん安いプランで2,980円/月となっています。プログラミングの学習を開始して約3週間が経過し、Pythonへの理解度を測る目的と、新しい勉強法への好奇心からPyQを始めることにしました。自分がどこを理解できていないのか、それがよくわかる問題というかたちでコードを書くことを求められると、理解しているはずのことが実はよく理解できていない、ということに気付かされます。入門ノートで取り扱っている内容であればそれも読むことで、Pythonへの理解を深めていきました。FireのSilkという標準ブラウザでも特に問題なく動きます(私の触った範囲では)。Fireを使ってPyQによる勉強を行いました(ネットへの接続はスマホのテザリング機能を使用)。PyQによって学んだ内容をすぐにコードに書き出せるインプット&アウトプット学習になりましたので、勉強の効率が大幅に上がりました。Kindleのソフトウェアキーボードで英数字と記号といった入力モードを切り替えながらコードを書くのは相当にしんどく、万人におすすめできる方法ではありません。私の場合は当時PyQにのめり込んでいて、楽しさが入力のしんどさを上回っていましたが。DjangoPyQの数多くのカリキュラムの中で、基礎的な内容を終えて早く取り組みたいと思っていたのがWebアプリケーション作成の章です。Webアプリケーションを作れるようになれば、それをネット上に公開して知人や職場の人に触ってもらうことも可能ですので、私はこれをひとつの目標としていました。PyQで取り扱っているPythonのWebアプリケーションフレームワークのひとつにDjangoがあり、こちらでWebアプリの作り方を徐々に学んでいくことにしました。Djangoの全体像への理解Djangoでは、決められた役割を持ったプログラムやファイルが組み合わさって、ひとつのWebアプリを構成しています。Django全体の設定に関するプログラム、URLに応じて処理を振り分けるプログラム、処理そのもののプログラム、データベースを担当するプログラム、画面の表示内容のテンプレートとなるファイル・・・といった感じです(他にも色々あります)。私がPyQでDjangoを学習する上で最初につまずいたのが、ひとつひとつの問題は何となく解けるけれど、こうした各プログラムの役割と関係性、ディレクトリ構成などが時間をかけても頭に入らず、Djangoの全体像が見えてこないという点でした。ゼロからDjangoでWebアプリを作ってみようそこで、Djangoを実際に自分のPCにインストールし、ゼロからWebアプリを作ってみることにしました。することでDjangoの全体像を把握できると思ったからです。Tutorialというサイトです。Tutorialチュートリアルによる学習それまで私はよくわかっていなかったのですが、Djangoやその他著名なオープンソースソフトウェアの公式サイトには、そのソフトウェアの基本的な機能を実践形式で学べる、チュートリアルとなるページが大抵あったのです。プログラミングを学ぶにはまずは書籍を買う、という発想しか無かった私には目からウロコでした。したチュートリアルは、日本語化がされていなかったり、日本語化されていたとしても何か別のプログラミング言語の経験者でないと理解することが難しい場合があります。Tutorialは、Djangoの公式チュートリアルではありませんが、Webアプリケーションを作成するのが初めての人を対象に作られており、非常にわかりやすい内容となっています。Tutorialに繰り返し取り組むことで、当初把握できていなかったDjangoの全体像を徐々に理解していきました。Tutorialの中で唯一苦労した箇所がありました。Tutorialでは、Herokuというクラウドサービスを利用して、Djangoで作られたWebアプリケーションをインターネット上に公開する方法が説明されていますが、書かれている通りにやっているはずなのに何度やっても上手くいかず、心折れそうになりました。最終的には上手くいったのですが、当時の自分がなぜ成功できたのかがよくわかりません・・・。Django本体やその他パッケージのバージョンが、チュートリアルで取り扱っているものと、実際に自分がインストールしたものとで異なるなどが原因だったのだと思います。Tutorialは、Django以外のパッケージのバージョンアップに追随した内容になっているほか、Djangoで作ったアプリをデプロイする(配置する)クラウドサービスがHerokuではなくPythonAnywhereというサービスになっており、私が経験したようなエラーに悩まされることは無いと思います。PythonAnywhereではなくHerokuにDjangoアプリをデプロイしたいという方は、以下記事を参考にしてください。初のオリジナルのWebアプリ作成に挑戦Herokuを使ってDjangoアプリをインターネット上に公開する方法を学んだ私は、オリジナルのWebアプリ作りに取り組むことにしました(冒頭で紹介したWebサービスとは別のものです)。PythonエンジニアファーストブックこのWebアプリ作りの際に、とても参考になったのが3冊目に購入した「Pythonエンジニアファーストブック」です。Kindle版この商品を含むブログを見るこの本のWebアプリケーションの章では、画面からおもちゃのレゴの情報を登録、更新、削除したり、それらレゴの情報を一覧表示したり、個別に詳細表示したりするWebアプリを、Djangoを使って作成する方法が順を追って記載されています。題材はレゴですが、この部分を好みのものに置き換えれば良いので、この本のDjangoアプリの内容をベースにオリジナルのWebアプリ作成に取り組みました。Webアプリ完成そうして完成させた初のオリジナルのWebアプリを知人に公開しました。内容としては知人との内輪ネタ的なWebアプリですが、それなりに面白がってもらえて、私はますますプログラミングが楽しくなってきました。自分ひとりで調べるということここまで書籍とオンライン学習サイトでプログラミングを学んできましたが、Herokuを使ってのWebアプリの公開など、書籍でも学習サイトでも取り扱っていない内容でエラーが出ると当然自力で調べなければならず、かなり時間をかけてしまっていました。プロラグラミングをこれからも学んでいく上でわからないことを自ら調べる力は必須だとは思っているのですが、初心者がつまずくようなところではあまり時間をかけたくないという気持ちもありました。そこで、もっと効率的に学ぶ方法として、費用は高くなってしまいますが、プログラミングスクールへ通うことを検討し始めました。プログラミングスクールの多くは、わからないことがあれば教室やチャットでいつでもメンターへ質問できることを独学と比較したメリットとして挙げています。私はTECH::CAMPというプログラミングスクールに通うことにしました。TECH::CAMPどんなシステム?講師による講義とかがあるわけではなくて、会員制のWebサイト上にチュートリアルのようなコンテンツが掲載されているので、それを読みながら教室や自宅で自分のペースで学習していきます。2回は22時まで、土日のどちらかは丸1日(6時間)、こどもの世話を免除させてもらって、スクールに通わせてもらいました。Watsonなどを使ったアプリ作りもあり、視野が広がりました。私は、TECH::CAMPには計2ヶ月通いました。最初の1ヶ月半でRailsによるWebアプリケーションのカリキュラムをほぼ終えたのですが、残り半月はそのカリキュラムで作ったRailsのアプリをDjangoで再現してみる、ということにひっそりと取り組んでいました。スクールでRubyやRailsを学んでいるうちに、馴染んだPythonやDjangoでまたWebアプリが作りたくなってしまったのです。スクールのカリキュラムとしては、この先はRailsでのオリジナルWebアプリ作成に入っていきます。スクールに通っているのにRailsに専念して取り組む気持ちが湧いてこないのであれば、お金だけでなく時間ももったい無いと思い、悩んだ末に2ヶ月で区切りをつけてスクールは退会することにしました。冒頭の本屋でのプログラミング言語選びで書いた、最初はRubyから学び始めても良かったな、というのはこれが理由です。TECH::CAMPそのものは良いスクールだったと思います。プログラミングスクールに興味を持った方へのアドバイスこうしたプログラミングスクールは全てのカリキュラムを終えるには数十万円レベルの出費となり、決して安くはありません。プログラミングスクールはTECH::CAMP以外にも様々あります。スクールに通うのであれば、各プログラミングスクールの評判を検索すると肯定的な意見も否定的な意見も集まるはずですので、それらを踏まえて自分の目的に合ったスクールを選択するようにしてください。学習記録:21週目〜24週目Webサービス作りに挑戦ここまでプログラミングを学んできて約5ヶ月。半年を迎えるまでに、前回のような内輪向けではない、一般に公開できるWebサービスを作ることを目標に立てました。どんなWebサービスにするかQiitaでは、自作のWebサービスを紹介する投稿がたまにあります。レビューズ」という、ベルリンのITスタートアップで働くエンジニアのジャバ・ザ・ハットリさんが作られたWebサービスがあります。https://www.hotchillireviews.net/こちらは、ネット上に散らばる映画レビューのブログ記事を収集し、映画タイトルごと、ブロガーごとなどに分類して掲載しているWebサービスとなっています。レビューズを参考に、自身のWebサービス作りを開始しました。レビューズでは、画面の表示を高速にするためのデータ配置の工夫や、動くグラフ表示、機械学習による映画タイトルごとの分類など高度な技術が使われており、こういった点は私には真似ができるわけもありません。参考にさせていただいたのは「あるテーマのブログ記事を収集し様々な観点で分類する」というコンセプトの部分で、私の場合は世界遺産をテーマとし、その旅行ブログ記事を収集して、世界遺産ごと、ブロガーごとに分類して掲載するWebサービスを作ることにしました。世界遺産は現在1,000以上存在し、日本人にとっては地名度の低い世界遺産も含めて旅行ブログ記事を網羅することができれば、世界遺産に興味のある人には一定の価値のあるWebサービスになりそうな気がしたからです。クローリング&スクレイピング世界遺産のブログ記事を集めるといっても手作業ではいくら時間があっても足りません。そこでスクレイピングをします。スクレイピングとは、プログラムを使ってWebサイトの内容を解析して必要な情報を取得する方法です。クローリング&スクレイピング」は1冊まるごとスクレイピングです。Kindle版この商品を含むブログを見るスクレイピングに関する膨大な知見がまとめられていて、初心者がスクレイピングをやろうと思ってわからないことは、この本を読めばまず解決できるのではないでしょうか。内容は高度ですが、解説は非常に丁寧でわかりやすいものとなっています。ファーストブック、以降は公式チュートリアルやQiitaの各種投稿などに目を通して知識を習得してきましたが、Django専門の日本語書籍は発売されないものかとずっと思っていました。Kindle版この商品を含むブログを見るそんな私にとって、この「現場で使えるDjangoの教科書」は待望の本で、その存在を知った時には即座に購入していました。これまでのDjangoでの開発でつまずいていた点、理解できていなかった点が、この本によって一気に解決していきました。完成したWebサービスこうして、ここまで学んだ知識を総動員し、約1ヶ月を使ってWebサービスを完成させました。世界遺産トラベラーズは、世界遺産に関するブログへのリンクを独自の基準で集めた世界遺産ブログ集です。各ブログに掲載されたリアルな旅の感想や美しい写真を通して、世界遺産への関心をさらに深めていただけば幸いです。最後に本業で経験したことをきっかけにプログラミングを学び始めましたが、この半年間でPythonの知識が身に付いただけでなく、Qiitaの投稿やITエンジニアのブログなどを通じて、ITエンジニアの文化や考え方など多くのことに触れることができた気がします。新鮮で、実りのある半年間でした。これからもプログラミングを学び続けていきたいと思います。いつの日か自社のWebサービスを内製開発できたら最高ですね。後日談その1この記事を書いたのは2018年11月ですが、その後はというと、自社Webサービス開発の内製化こそ実現はできませんでしたが、引き続きPythonでアプリを作ったり、勉強会に参加したりなど、充実したプログラミングライフを送っています。したことはプログラミングの勉強開始前は一切無く、社外での過ごし方が一変したことになります。ITエンジニアでない方も、いま現在のお仕事や会社生活にマンネリや行き詰まりを感じられていたら、プログラミングの勉強を始めることをおすすめします!後日談その2さらにその後、プログラミングを本業としたく2019年1月から転職活動を始め、5月よりWeb系エンジニアとして働くことになりました。その動機や転職活動の詳細はこちら。(1)関連リンクQiitaはてなブログをはじめよう!shonansurvivorsさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。