現在、ITスクールを運営しています。代表の私自身が過去にどのような手順でプログラミング言語を勉強してきたかを時系列で紹介したいと思います。勉強する最初のきっかけを探している人や、何から勉強すべきか考えている人、勉強の進め方に悩んでいる人の参考になれば幸いです。
1. 時系列マップによる解説
1.1. 大学・大学院時代
C
初めてプログラミングと出会ったのは大学の講義でした。C言語を使った情報処理の演習でした。この時、変数や分岐処理、反復処理、アルゴリズム(演算やソート)などの基礎知識を学びました。課題を解くために、C言語に関する書籍を幾つか購入して、ひたすら手を動かして独習もしました。
プログラミングが純粋に楽しいと感じたので、その後、自然と興味を持ちました。振り返ってみると、この時に学んだ基礎が、すべての土台となっていると思います。
C++
所属した研究室では、コンピュータシミュレーションを使って、生体機能を分析していました。分析環境はプログラミングで自作する必要があったので、C++を独習する課題が与えられました。C++に関する書籍を幾つか購入して、ひたすら手を動かして独習しました。C++はC言語の内容に加えて、「オブジェクト指向」という概念があり、クラスや継承、ポリモーフィズムなどを一通り学びました。
大きなシステムを構築する際に、オブジェクト指向の概念が非常に役立っていると思います。再利用性や拡張性を高めるために、システムを構成する各パーツを如何に独立させるかが鍵となります。
C++(生体モデルのシミュレーション)
学士の研究テーマは脊髄のニューラルネットワークの解析でした。神経細胞の膜電位のモデル(微分方程式)を使って、歩行に関するパターン生成を解析しました。早速、C++のクラスを使って、ベースのモデルを実装しました。そして、各タイプの神経細胞のモデルをサブクラスに継承させました。シミュレーションする際はモデルの微分方程式を数値計算します。ベースのモデルに抽象メソッドを持たせ、ポリモーフィズムの機能によって、各タイプの神経細胞のモデルの独自メソッドを実行するように実装しました。
オブジェクト指向はやや抽象的な内容のため、実際にそれを具体的に活用するのが難しいと思います。試行錯誤しながら実装パターンを学んでいくのが良いでしょう。この辺りはシステムの「デザインパターン」にも繋がります。
XML(モデルのパーサー開発)
研究室では、プログラミングなしでも生体機能を簡単にシミュレーションできるアプリも開発していました。各モデルはXMLのデータフォーマットで保存されていました。研究テーマで使用するニューラルネットワークを、このアプリでも実装することになりました。単体の神経細胞のモデルのXMLを読み込んで、数百単位で結合させたニューラルネットワークのXMLを自動生成するプログラム(パーサー)を作成しました。
XMLの構文を解析するパーサーを自作した際に、データ処理(特にテキスト処理)に関する力が身に付きました。実際の仕事では、様々なデータを加工する機会が多くあるので、日頃からデータ処理の力は磨いておいた方が良いと思います。
1.2. 社会人時代(製造業のエンジニア)
C(組み込みソフトウェア開発)
製品の組み込みソフトウェア開発を担当した時に、C言語などのソースコードを読み込む機会がありました。膨大なソースコードを前に、悪戦苦闘しながらシステムの挙動を読み解いていきました。ハードウェア特有の割り込み処理もあり、全体の流れを正確に把握するのは非常に難しかったです。また、製品開発に携わることで、「ウォーターフォール型」の開発プロセスを経験することもできました。
他人の書いた(洗練された)ソースコードを読み込むことで、設計思想や実装などのヒントを多く得ることができます。また、一般的な開発プロセスである「ウォーターフォール型」は汎用性があるので、色々な職場で役に立つと思います。
VBA(アプリ開発)
社内の業務改善で、初めてC系以外のプログラミング言語を使用しました。主にExcelを操作するVBA(Visual Basic for Applications)です。製品に関する調査資料を管理する簡易アプリを開発しました。VBAのフォーム機能でUI(操作画面)を作り、ユーザーが資料の登録や閲覧ができるようにしました。データベースにはExcelシートを代用しました。VBAの知識は書籍やネット上の情報で勉強しました。C系の言語を身につけていたので、VBAはそこまで苦戦することはなかったと思います。
VBAは、ブックやシート、セル、フォーム、各コントローラーの扱い方さえ押さえておけば、ある程度のことはできるようになります。応用範囲が広く、発散しがちなので、学習項目を絞って勉強する方が効果的だと思います。他の細かい内容は、必要になった際にネット上の情報などで調べるのが良いでしょう。
1.3. フリーランス時代(社内SE-1)
GAS
独立して最初の現場で、クラウド上で動作するプログラミングを扱う機会がありました。Googleのサービスで行っている社内の事務作業を、GAS(Google Apps Script)で自動化しました。当時は書籍などの情報源が少なかったので、ネット上の情報から知識を得ながら、少しずつ勉強していました。言語仕様の違いはありましたが、概念自体はVBAと幾分似ていたので、そこまで苦戦はしなかったと思います。
GASはクラウド上で動作します。各サービスをAPI通信などで連携させることや、リソースの制約(動作時間の上限など)について理解しておくことが重要です。実装を最適化させないと動作が遅くなったりするので要注意です。
PHP
ここで、初めてWebアプリの開発を体験することになりました。新規企画のWebアプリの試作版を作る機会に恵まれました。今まではWebに関する知識はゼロでした。先輩社員が実装する過程を実際に見せて頂けました。HTMLやフォームのGET/POSTメソッド、SQLなどに関する断片的な知識を仕入れることができました。これは後のWebアプリ開発のきっかけになる大きな収穫でした。因みに、この時は、フレームワークなどは使用していませんでした。
実際に形作られていく過程を見れることは非常に有益でした。「百聞は一見に如かず」で、書籍などで勉強する何十倍の効果があると思います。チャンスがあれば積極的に掴みにいきましょう。
1.4. スクールの講座
機械学習
独立した当時、機械学習やディープラーニングが世間でも少しずつ認知され始めていました。私も興味があったので、早めに勉強しておこうと思いました。独学だとハードルが高そうだったので、民間のスクールの講座に約半年ほど通いました。初回の授業で、いきなりPythonによるデータの前処理の話をされた時は、全く理解できず、かなり焦りました。講座では、機械学習の分類やモデル、データの前処理、精度の検証方法などを一通り学びました。しかし、モチベーションが続かずに途中でリタイアしてしまいました。とは言え、後のAIの勉強を始める良いきっかけになったと思います。
時には思い切って自己投資してみるのも良いでしょう。ただし、先行者利益は限りがあるので、常日頃からアンテナを張っておいて、情報を得た瞬間にすぐに行動したいものです。
Python
大学時代にPythonについて聞いたことがありましたが、特に使う機会がなかったので勉強していませんでした。機械学習を勉強するにあたり、自然とPythonを使うことになりました。最初はC系の言語仕様とやや異なることに戸惑いました。特に、行列データを扱う際の記法などは、ある程度は勉強して慣れる必要があると思います。私はPythonを単独で勉強することはせずに、機械学習やディープラーニングで必要になる内容に絞って勉強しています。主に書籍やネット上の情報から知識を吸収していっています。
一から体系的に勉強すると多くの時間がかかります。今までに積み重ねた知識や経験に対する差分内容のみに限定して、短期間で勉強するのも良い方法だと思います。
1.5. フリーランス時代(スタートアップ)
UiPath
独立して少し経った頃、職場でRPAという単語を耳にしました。当時、日本でもRPAが認知され始めていました。求人検索してみたところ、スタートアップ企業がRPA事業を始めるためにメンバーを募集していましたので、試しに飛び込んでみました。最初にUiPathを勉強してみることになりました。当時は情報源が公式のオンライン教材くらいしかなかったので、ひたすら英語の動画を見て演習しました。元々、プログラミングはできたので、RPAツールも特に苦戦することなく使えるようになりました。ただし、セレクタの設定に関する知識だけは、ある程度は勉強する必要はありました。
RPAツールの操作方法から勉強し始めると、高い確率で失敗すると思います。なぜなら、RPAはソースコードは書かなくても、ビジュアルプログラミングをしているからです。先ずは、プログラミングの基礎から勉強するのが良いでしょう。
Robotic Crowd
実際の業務では、自社プロダクトのクラウド型RPA「Robotic Crowd」を主に使いました。プリセールスとして、出来上がってきたプロダクトを顧客企業にひたすら導入していきました。顧客企業の要望をもとに、試行錯誤しながらワークフローを作成していました。その過程で、セレクタの設定のためにHTMLやCSSの基礎を、他のクラウドサービスとの連携のためにAPI通信の基礎を、それぞれ勉強する手がかりを得ることができました。
SaaS(Software as a Service)のプロダクト開発を目の当たりにしたことで、Webやクラウドに関する様々な知識やスキルを幅広く身につけることができたと思います。新しいジャンルへ挑戦して、自分の成長を加速させていきましょう。
JavaScript
クラウド型RPAを使う過程で、一部、ブラウザをJavaScriptで直接操作するケースがありました。これがJavaScriptとの初めての出会いでした。最初はブラウザ上で動作しているということがよく分かっていませんでした。とにかく、ネット上の情報を頼りに、HTMLのDOM操作などを数多くこなすことで、少しずつ知見を増やしていきました。ただし、この時はJavaScriptがWebアプリのフロント部分の開発に関わっていることは、全く知りませんでした。
JavaScriptを勉強する際は、単にプログラミング言語として捉えるだけだと、実際にそれをどう活用すればよいのか見えにくいです。ブラウザやWebアプリとの関係性も一緒に考えると理解が深まると思います。
1.6. フリーランス時代(独学-1)
Ruby on Rails
Webアプリに興味を持ったので、当時流行っていたフレームワーク「Ruby on Rails」を独学してみることにしました。公式サイトのチュートリアルやオンライン講座「Progate」の教材を試してみました。しかし、途中で挫折してしまい、表面的な理解だけで終わってしまいました。フレームワークは最初に多くの約束事を勉強する必要があり、やや学習コストが高いなと感じました。ただ、この時、MVC(Model-View-Controller)という概念を知り、後にWebアプリを開発する際の参考になりました。
フレームワークは強力なツールですが、全体のシステムの仕組みがブラックボックスになりがちです。フレームワークを勉強する際は、根本的な原理などにも目を向けてみると理解が深まると思います。
HTML/CSS
今まで断片的にしか勉強してこなかったHTMLとCSSについて、体系的に学び直すことにしました。書籍を幾つか購入して、例題のWebサイトを制作しながら一通りの知識を習得しました。ただ、知識があっても、実際に洗練されたWebサイトを制作できるかどうかは別問題でした。やはり、デザインに関する知見も必要だと気づきました。最近は、実際にITスクールのWebサイトを改良するなどして、デザインも継続的に勉強していくようにしています。
実際にWebサイトを制作して、一般公開してみましょう。知人などから率直な感想を貰いながら、ひたすら改善していきましょう。これが実力を磨く一番の方法だと思います。
ディープラーニング
以前、スクールの講座で「機械学習」について学びました。その中の手法の一つである「ディープラーニング」に関して、書籍を購入して継続的に勉強しています。大学時代にニューラルネットワークを研究していたこともあり、多少の前提知識があったので、独学する道を選択しました。書籍は「実践系」と「理論系」の両方をバランス良く勉強するようにしています。個人的にテキスト処理が好きだったので、「自然言語処理」のジャンルを中心に学んでいます。今後は、スクール事業で蓄積したデータを使って、何かしらのAIサービスを作ってみたいです。
ビジネス応用を目指すのであれば、ディープラーニングを勉強する際は、「実践系」から入った方が良いと思います。「理論系」から始めると挫折する可能性が高くなります。理論は3~5割くらいの理解で割り切りましょう。
1.7. フリーランス時代(委託開発)
C#
業務用システム(Windowsアプリ)の開発を委託された時に、C#を使用する機会がありました。C#は初めてでしたが、C系の経験があったので何とかなるだろうと考えていました。書籍を一冊購入して、ざっと目を通しました。基本的にオブジェクト指向ベースの言語だったので、ある程度はカバーできました。システムのUIは、WPF(Windows Presentation Foundation)というフレームワークを使用しました。その時、MVVM(Model-View-ViewModel)の概念を初めて知りました。しかし、少し複雑な内容だったので、当時は理解不足で、何となく使用していたと思います。
オブジェクト指向の概念を一度学んでおくと、オブジェクト指向ベースのプログラミング言語には、ある程度対応できると思います。やや難しい内容ですが、勉強する価値はあるでしょう。
1.8. フリーランス時代(社内SE-2)
Power Automate(for desktop)
今まで扱ったことのある主なRPAツールは、UiPathとRobotic Crowdの2つでした。Power Automate for desktopが無料化されることになった時に、今後の事も考えて勉強しておこうと思いました。ただ、他のRPAツールとの本質的な差は大きくないと予想していたので、一から勉強することはせずに、実際の業務で使いながら知見を蓄えることにしました。思った通り、ほとんど勉強しなくても、過去の経験値である程度はカバーできました。ただし、セレクタの設定については別途勉強が必要だと思います。
以前にも言及しましたが、RPAはビジュアルプログラミング的な側面があります。プログラミングの土台さえあれば、ツール自体が変わってもキャッチアップは速いと思います。「急がば回れ」なのでしょう。
1.9. フリーランス時代(独学-2)
Webアプリ開発
今までに、Webアプリ開発に必要な要素として、HTML、CSS、JavaScript、PHP、フレームワークなどを断片的に勉強してきました。何となく、自分でも簡単なWebアプリくらいなら作れるのではと思いました。試しに、API経由でネット上の情報を検索して画面に表示するだけのWebアプリをGASで作ってみました。すると、意外にも出来てしまいました。その後は、GASやPHPなどのサーバー言語で、小規模なWebアプリを幾つか作りながら、Webアプリ開発の知見を深めていっています。また、独自のフレームワークを作りながら、中規模のWebアプリを開発することにも挑戦しています。
過去に身につけた知識やスキルを結合させていくことで、新たな価値を生み出すことができるかもしれません。点と点を結んで線に、そして面に、さらに立体にしていく感じです。試行錯誤を繰り返していきましょう。
アジャイル開発
最近は、アジャイル開発やプロダクトマネジメントなどの手法についても勉強しています。書籍を幾つか購入して、隙間時間に読み込んでいっています。今までは、ウォーターフォール型の開発プロセスしか経験したことがなかったので、他の新しい開発プロセスについての最低限の知識は押さえていこうと考えています。
1.10. 全体
最後に全体をまとめた図を掲載しておきます。
2. 考察
今まで、約15年以上に渡り、プログラミングなどを継続的に勉強してきました。それは必ずしも最適・最短な道のりではなかったです。世の中の流れやトレンドに影響を受け、その時々で興味を持った内容を少しずつ学んできたように思います。ただ、途中で途切れることはなく、少しずつですが積み重ねていきました。ITスキルや思考力は学習量に比例するというよりも、指数的(雪だるま式)に徐々に向上していくものだと感じています。
つまり、「継続は力なり」です。学びを継続させるための大きな要素は、強い「興味関心」と「必要性」の2つです。少なくとも、どちらか一方は自分のポケットに入れておかなければいけません。両方とも持っていなければ、高い確率で挫折することになるので、はじめから手を出さない方が良いかもしれません。自分の大切なリソース(時間やお金)は、他の可能性のあることに使うべきだと思います。
なお、具体的な勉強の手段としては、書籍やネット上の情報(ブログ記事や動画)、スクールの講座などが挙げられます。それぞれの手段にメリット・デメリットがあるので、バランスよく組み合わせることが重要だと思います。勿論、インプットも重要ですが、より重要なのはアウトプットすることです。学んだ知識やスキルを使って、実際に何かを作ってみましょう。また、そもそも何を作るのか、なぜ作るのかを考えてみましょう。試行錯誤することで、また、時には失敗することで、生きた知見が得られることでしょう。
まとめ
今回は、代表の私自身が過去にどのような手順でプログラミング言語を勉強してきたかを時系列で紹介しました。学ぶべきことは次から次へと出てきますが、興味を持った内容について、気楽に少しずつ勉強していけば良いと思います。皆さんも、少しずつ始めてみては如何でしょうか。