対象読者
for you
- エンジニアとして強くなりてぇ人
- 特にインフラ方面に詳しくなりてぇ人
- エンジニアとしての経験が浅めの人
- 2年後に応用情報を受ける人
NOT for you
- 2週間後に応用情報を受ける人
- すでに強い人
目的の再考
みなさんは何を目的に応用情報技術者試験(以下応用情報)を受けているでしょうか。
もちろん、会社に取れと言われて渋々受けている方もいるでしょう。
しかし、多くの方々は「エンジニアとして強くなりてぇ、応用情報を受ければ試験ドリブン勉強が捗るだろう」と考えて受検したのではないかと思います。
つまり、みな「エンジニアとして強くなりてぇ」という志を持ってるんだと思っています。
応用情報の一般的な学習方法
応用情報の学習方法というと、一般的には以下のような方法が多いでしょう。
- 資格の参考書を買って読む
- 過去問(特に午前試験)を解きまくり、分からない用語を復習する・覚える
これらを便宜的に「応用情報に受かる目的の学習方法」と定義します。
本記事はこの「応用情報に受かる目的の学習方法」を批判したいための記事ではありません。
試験があることでモチベーションになりますし、短期間で合格を目指す場合はこの方法が最も効率的だと思います。
ただし、エンジニアとしての長期的な成長を考えた場合は、別のアプローチも有効ではないかと考えています。
本記事では、「応用情報を逆に2年かけて合格する学習方法」というアプローチを提案したいと思います。
本記事のような学習方法をとることで、応用情報合格を目指しつつ、付け焼き刃ではない知識を長期的に定着させ、エンジニアとしての”””力”””を高めることができるのではないかと思っています。
応用情報を逆に2年かけて合格する学習方法
すでにタイトルにも書いてあることなんですが、以下の2軸によって構成される学習方法です。
- コンピュータサイエンスを体系的に学習する
- 長期記憶として定着する学習方法を採用する
ちなみに2年というのは僕がそのくらいの期間かけたというだけで、目安程度に考えてください。
コンピュータサイエンスを体系的に学習することで、ある程度幅広い知識が求められる応用情報への対応力を高めることができます。
また、そのためには長期間の学習が必要となるので、長期記憶として定着しやすい学習方法を採用します。
コンピュータサイエンスの重要性
現代のソフトウェア開発において、フレームワークやツールは日々進化し続けて、技術の廃れも日常茶飯事です。
Webpack が開発終了したとか、MongoDB はもう古いとか、Jenkins オジサンだとか。
しかし、様々なフレームワークやツールにおいて基礎となっているコンピュータサイエンスは、何十年経っても本質的には変わっていないと思います。
例えば・・・
- B-tree インデックスの仕組みや、クエリ最適化の考え方はどのデータベースでも使える
- 新しい Web フレームワークが登場しても、それらは基礎として HTTP, TCP/IP を使っている
- プロセスやスレッドの概念はプログラミング言語や実行環境によらない
- コンピュータアーキテクチャの基本的な仕組み(プログラムはアセンブラとなり、メモリからロードされ、FDE cycle で処理される)はどんな CPU でも変わらない
コンピュータサイエンスをしっかり理解しておくことで、新しい技術が登場しても理解が進みやすくなります。
応用情報はそれ自体がコンピュータサイエンスに関連した出題が多いというのはもちろんありますが、それ以外でもある程度幅広い知識を習得する必要があります。
幅広くキャッチアップするためにも、コンピュータサイエンスという基礎を理解しておくと効率的に学習を進められると思います。
体系的な学習の重要性
コンピュータサイエンスの知識は、断片的な情報としてではなく、相互に関連する体系として学ぶことが重要だと思ってます。
例えば・・・
- OS のプロセス管理を理解するには、メモリ・記憶階層といった知識が役立つ
- ネットワークの通信原理を理解することで、分散システムの連携を理解できる
- データ構造とアルゴリズムの知識は、インデックスやルーティングプロトコルの理解に役立つ
- 情報セキュリティの脅威を深く理解するためには、OS の動作原理やネットワークプロトコルの脆弱性について理解している必要がある
カリキュラム
以下のように学ぶ分野を定め、なるべく体系的に学習していくことを意識しました。
- コンピュータアーキテクチャ
- データ構造とアルゴリズム
- OS
- ネットワーク
- データベース
- 情報セキュリティ
特にコンピュータアーキテクチャと、データ構造とアルゴリズムの2つはあらゆる技術分野の基礎となっているので、カリキュラムの最初の方に置くのが良さそうと思っています。
以下あたりも候補になりそうです。
- 離散数学
- コンパイラ
- 分散システム
- ソフトウェア工学
- 人工知能
これらを網羅したとしても、いわゆる”””コンピュータサイエンスのすべての分野に精通している”””とは当然言えないとは思います。
しかし、エンジニアとして実務で直面するであろう技術的課題に対しては、多くをカバーできるのではないかと思います。
少なくとも応用情報の合格だけを考えるなら十分な範囲と思います。
また、大学のカリキュラムを参考にするのも良いと思います。
以下のような記事は参考になりました。
書籍例
学習方法としては書籍を教材として読み進めを行いました。
究極、どういう教材でも(書籍でなくても)良いとは思っていて、大事な観点は以下二つかなと思ってます。
- 定めたカリキュラムに沿った本であるかどうか
- 仕組みや原理、基礎を理解できるような内容になってるかどうか
必然的に大学でも採用されるような書籍が多くなってはいます。
以下に僕が読んだ本を例として挙げておきます。
コンピュータサイエンスをある程度腰を据えて学習するとなると、長期間の学習期間が必要となります。
長期間の学習となると、以前学習した内容を忘れてしまうこともあるでしょう。
長期記憶として定着しやすい学習方法が求められます。
長期記憶として定着しやすいとされる学習方法の中で、エビデンスがある学習方法はいくつかあります。
この記事では分散学習と検索練習について紹介したいと思います。
分散学習
分散学習とは、学習内容を一度にまとめて覚えるのではなく、時間を空けて繰り返し学習する手法です。
対照的な学習は「一夜漬け」ですね。
知識を忘れかけたタイミングでもう一度インプットすることを繰り返すことがポイントになります。
復習するたびに間隔を伸ばしていきます。
例えば、以下のような復習スケジュールを組みます。
- 最初に学習してから1日後に復習する
- 次に3日後に復習
- 次に7日後に復習
- 次に14日後に復習
- 最後に1ヶ月後に復習
検索練習
検索練習とは、学んだ内容を積極的に思い出そうとすることで、記憶の効率を高める学習法です。
対照的な学習は「テキストの読み返し」だそうです。
「テスト効果」とも呼ばれており、要は復習のときに自らに小テストを課すようなやり方になります。
自分の脳に、覚えたはずの知識を想起しようとする努力をさせることが大事です。
分散学習・検索練習を支えるツール
分散学習・検索練習を自前で実現しようとすると結構大変です。
現代であればツール、文明の利器を使ってしまいましょう。
この分散学習ツールにも色々あるんですが、ReminDO と Anki を紹介しておきます。
ReminDO
これです。
https://remindo.co/
穴埋め問題などを自分で作って、毎日思い出しながら回答するという使い方をしていました。
デスクトップアプリ・iOS アプリ・WEB アプリがあり、回答結果をサーバで同期してくれるので、どこでも回答できるのが利点です。
たぶん5年間くらい愛用していました。
しかし、ここ半年くらいでなぜかデスクトップアプリがクラッシュするようになってしまいました。
公式に問い合わせたら、実は Mac はそもそもサポート外であることが判明したので、他のアプリを使うことにしました。
エンジニアに Mac サポートがないアプリを勧めるのもどうかと思うので、今使ってる Anki も紹介します。
Anki
これです。
https://apps.ankiweb.net/
最初は取っ付き難いですが、今では ReminDO 以上に気に入ってるアプリとなってくれてます。
僕もまだ使いこなせているとは言えませんが、かなり多機能なようです。
分散・出題のアルゴリズムも中々考えられているようで、ほぼ初期設定でもうまく機能している感覚があります。
料金は iOS アプリが 3000 円なのですが、買い切りなので継続的な痛手ではありません。
そろそろ「よく見ると応用情報があんまり関係ない記事じゃねえか、タイトル詐欺するな」というツッコミが来そうです。実はそうです。ごめんなさい。
免罪符として応用情報についての話も書いておきます。
応用情報に受かる目的の学習方法
あの、実は数週間前からは普通に過去問を解きまくりました。ごめんなさい。
上記のような学習を十分にしていれば、応用情報に合格する素地はできているかなと思います。
ただし、以下のような目的のために過去問演習も十分に行いました。
- 問題形式に慣れる。特に午後試験の記述の仕方や、計算問題は慣れておくといいと思います。
- 以下のような分野に関しては上記の学習カリキュラムではほとんどカバーできてないので、出題された問題ベースで暗記することにしました。
- 経営戦略
- プロジェクトマネジメント
- サービスマネジメント
- システム監査
過去問演習をし、知らない単語や概念があったら全部 ReminDO に突っ込む、といったことをしました。
午後試験の選定
以下の11問の大問から、5つを選択します。
- 情報セキュリティ
- 経営戦略
- プログラミング
- システムアーキテクチャ
- ネットワーク
- データベース
- 組み込みシステム開発
- 情報システム開発
- プロジェクトマネジメント
- サービスマネジメント
- システム監査
問1の情報セキュリティは必須科目です。
ぶっちゃけ情報システム開発とかの方が点数が取りやすそうだったけど、断固たる意思で前述のコンピュータサイエンスのカリキュラムと範囲が被っていそうな、以下4つの選択科目を選択しました。
- 3.プログラミング
- 4.システムアーキテクチャ
- 5.ネットワーク
- 6.データベース
点数
ドヤ顔記事書いてる割にはそこまで高くねえじゃねえかというツッコミはお控えください。
この2年間でコンピュータサイエンスを体系的に学んだ結果、様々な良い効果を実感しています。
キャッチアップ力が高まった
以下のような理由で、新しい技術へのキャッチアップ速度が格段に上がったと感じています。
- 技術書や技術記事を読んだ際に、その背景にある原理や仕組み・制約などが以前よりも深く理解できるようになった。表面的な理解が少なくなった。
- これまでは「この技術、よくわからないな」で終わっていた部分も、「これはコンピュータサイエンス全般に不勉強なのではなく、この技術に詳しくないだけだから詳しくなれば良い」といった切り分けができるようになった。
キャッチアップ力が高まったのは、流行り廃りの激しい IT 業界でエンジニアとして長く働く上でメリットが大きいかなと思ってます。
メトリクス解析力・トラブルシューティング力が向上した
業務でシステムのモニタリングなどする際に、各メトリクスが”””読める”””ようになりました。
メトリクスが悪化したときに仮説とそれを解決する案が立てられるようになったのは大きいと思ってます。
また、トラブルシューティングの際も、闇雲に試すのではなく、原理から考えて原因の切り分けが進むようになり、以前より効率的に解決できるようになったと思います。
業務や技術そのものがより楽しく感じられるようになった
何よりも大きかったのは、業務や技術そのものが以前よりもずっと面白く感じられるようになったことです。
仕組みや原理が分かることで、楽しく技術をキャッチアップできるようになりました。
前述のようにモニタリング結果から仮説を立て、その解決案がうまく機能したときにはまるでパズルが解けたかのような達成感があります。
エンジニアとしての充実感が大きく増したと思ってます。
というわけで楽しくエンジニアしてます。
ポジショントークも多分に入っておりますが、以下のように比較をまとめました。
ご検討(?)ください。
観点 | 一般的な学習方法 | 2年かける学習方法 |
---|---|---|
主な目的 | 短期的な試験合格 | 長期的な技術力向上 |
学習スタイル | 短期集中・詰め込み型 | 長期的なコンピュータサイエンスの体系的学習 |
記憶への定着 | 忘れやすい | 定着しやすい |
ツール | 参考書・過去問サイト | 技術書・Anki等の分散学習ツール |
推奨される人 | すぐに応用情報に合格したい人・短期集中型の人 | エンジニアとして強くなりてぇ人 |
デメリット | 知識が定着しにくい | 時間がかかる、即効性は低い |
Views: 0