Web系ソフトウェアエンジニア学習コースへの競技プログラミングの導入事例

*本記事は、[Competitive Programming Advent Calendar 2015](http://www.adventar.org/calendars/850)の8日目の記事です。*

いわゆるWeb系のシステム開発を行っている会社で、未経験者のソフトウェアエンジニア向けに研修を行っています。その学習コースへの競技プログラミングの導入に当たって得られた知見を記します。

# 学習コース

学習していただきたいことはたくさんあるのですが、入社時の研修期間として用意できるのは2ヶ月のみです。以下のように学習事項を体系立ててまとめた上で、研修対象をピックアップしました。(2015年12月現在)

| 分野 | 技術 | 教材 | 研修対象 |
|:--|:--|:--|:--:|
| コンピュータ科学の基礎 | ビット、進数、小数点、コンピュータアーキテクチャ、OS | [キタミ式イラストIT塾](http://www.amazon.co.jp/dp/4774161810)<br>選択: [プログラムはなぜ動くのか　第２版](http://www.amazon.co.jp/dp/4822283151) | ○ |
| 言語の基礎 | C | [新・明解C言語 入門編](http://www.amazon.co.jp/dp/479737702X)<br>選択：[新・明解C言語 中級編](http://www.amazon.co.jp/dp/4797384115) | ○ |
| 〃 | Java | [Java言語プログラミングレッスン 第3版(上)](http://www.amazon.co.jp/dp/4797371250)<br>選択：[Java言語プログラミングレッスン 第3版(下)](http://www.amazon.co.jp/dp/4797371269)<br>選択：[わかりやすいJavaオブジェクト指向 入門編](http://www.amazon.co.jp/dp/4798034835 ) | ○ |
| 〃 | PHP | [パーフェクトPHP](http://www.amazon.co.jp/dp/4774144371) (1-8, 12-13章) | ○ |
| 〃 | JavaScript | [JavaScript本格入門](http://www.amazon.co.jp/dp/4774144665 ) | ○ |
| 〃 | HTML, CSS | [HTML&CSS 標準デザイン講座](http://www.amazon.co.jp/dp/4798129674) |  |
| 言語のイディオム |  | （該当無し） |  |
| 言語のライブラリ・フレームワーク | Laravel | [Laravel リファレンス[Ver.5.1 LTS 対応]](http://www.amazon.co.jp/dp/4844339451) |  |
| コーディング作法 | 読みやすいコード | [リーダブルコード](http://www.amazon.co.jp/dp/4873115655) |  |
| データ構造とアルゴリズム | ArrayList, LinkedList, HashSet, TreeSet, Set/Map | [Web: Collections Frameworkの概要](http://docs.oracle.com/javase/jp/8/docs/technotes/guides/collections/overview.html) | ○ |
| 〃 | アルゴリズム基礎 | [最強最速アルゴリズマー養成講座](http://www.amazon.co.jp/dp/4797367172)（第1～6章） | ○ |
| 〃 | アルゴリズム実践 | [Web: yukicoder](http://yukicoder.me) | ○ |
| 〃 | データ構造・ソート基礎 | [アルゴリズムを学ぼう](http://www.amazon.co.jp/dp/404886128X )（第1～4, 5.7講） |  |
| オブジェクト指向設計 | UMLの書き方 | [Web: UML入門 - IT専科](http://www.itsenka.com/contents/development/uml/) | ○ |
| 〃 | UMLによるモデリング | [かんたんUML入門 (プログラミングの教科書)](http://www.amazon.co.jp/dp/4774157368) |  |
| 〃 | デザインパターン | [増補改訂版Java言語で学ぶデザインパターン入門](http://www.amazon.co.jp/dp/4797327030) |  |
| 〃 | 分析 | [実践ドメイン駆動設計](http://www.amazon.co.jp/dp/479813161X) |  |
| データベース | SQL | [できるPRO MySQL](http://www.amazon.co.jp/dp/4844337017) (6-2, 6-3 除外) | ○ |
| 〃 | スキーマ設計・運用 | [達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ](http://www.amazon.co.jp/dp/4798124702) |  |
| アジャイル開発プロセス | スクラム | [SCRUM BOOT CAMP THE BOOK](http://www.amazon.co.jp/dp/4798129712) |  |
| ネットワーク | TCP/IP・各種プロトコル | [スラスラわかるネットワーク&TCP/IPのきほん](http://www.amazon.co.jp/dp/4797377038) |  |
| 〃 | HTTP | [HTTPの教科書](http://www.amazon.co.jp/dp/479812625X) |  |
| Linuxサーバ構築 | コマンド・LAMPの構築 | [10日でおぼえるLinuxサーバー入門教室 CentOS対応](http://www.amazon.co.jp/dp/4798126136)（LESSON1～23） |  |
| テスト技法 | テスト設計 | [知識ゼロから学ぶソフトウェアテスト 【改訂版】](http://www.amazon.co.jp/dp/4798130605) |  |
| セキュリティ | セキュアプログラミング | パーフェクトPHP (9-10章) |  |
| ユーザビリティ | ユーザビリティ | [ウェブユーザビリティの法則 改訂第2版](http://www.amazon.co.jp/dp/4797339098) |  |
| 〃 | ユーザインタフェース | [デザイニング・ウェブインターフェース](http://www.amazon.co.jp/dp/4873114349) |  |
| CMS | WordPress | [WordPress　仕事の現場でサッと使える! デザイン教科書](http://www.amazon.co.jp/dp/4774173800 ) |  |
| デザインの基礎 | レイアウト・カラー・活字 | [ノンデザイナーズデザインブック](http://www.amazon.co.jp/dp/4839928401) |  |

# 各学習分野への競技プログラミングの導入

- コンピュータ科学の基礎
 - この段階ではまだプログラミング言語を一切知らない状態ですので、競技プログラミングは利用できません。オンラインラーニングサイトもあるかと思いますが、書籍の情報処理技術者試験過去問集を超えるメリットは特に見いだせませんでした。
- 言語の基礎
 - [yukicoder](http://yukicoder.me)★1を研修開始後1ヶ月で解けるようになることを目標としていますので、受講生の方にとっては、yukicoderを早く解けるようになりたいというのが、言語の学習を始めた段階での、学習の動機付けになっていたようです。
 - ただし、各言語の学習の途中、例えばif文だけを習得した段階、などで解ける問題が明らかでは無いので、結局各言語の学習を完了するまでは、競技プログラミングの問題を解くことはできませんでした。学習途中段階でも解ける、適切な問題をピックアップしてあげれば良かったかもしれません。
- コーディング作法
 - 適切なインデントやスペースなどについては、随時直接指導していました。そのあたりのアドバイスが自動的に行われるサービスがあれば試してみたいと思っています。
- データ構造とアルゴリズム
 - まさに競技プログラミングが対象としている分野ですが、当初はyukicoder★1をひたすら解く、というだけのカリキュラムにしていたので、あまり体系立てた学習ができませんでした。そこで高橋直大氏の[最強最速アルゴリズマー養成講座](http://www.amazon.co.jp/dp/4797367172)を教材として学習を進めることにしました。他の本も検討しましたが、C++は研修範囲ではないことも有り、Javaでのコードが記されている本書にしました。
 - 研修範囲としては、計算量の概念までは知っていて欲しいと思っていますが、動的計画法以降については実務で即座に役に立つわけではないので、研修期間との兼ね合いも有り、計算量までとしました。
 - ただ、一番最初のSRM 478 KiwiJuiceEasyが、受講者にとってかなりの壁になってしまいました。問題文が比較的複雑で、複数の「i番目の～」が別々のものを指していることの理解に苦しむなど、問題を解くよりも、問題の理解に時間がかかってしまったようです。導入部分は手厚くサポートする必要がありそうです。
 - なお、それ以降の問題については、比較的簡単で、自習で理解して進めることができたようです。
- オブジェクト指向設計・データベース
 - 設計やRDBに関してのオンラインジャッジというのは、寡聞にして存じておりません。何か利用できるサービスがあれば試してみたいと思います。

# 競技プログラミングは役に立つのか

競技プログラミングは、要件を整理して、きれいなアルゴリズムを作る練習になります。

一般的な業務システムでも、ごく簡単なアルゴリズムの実装は必要になります。yukicoder★1で苦戦しているようですと、業務システムの日常的な実装にも支障をきたし、品質の低いコードを生み出すなどの問題を起こすはずです。逆に、このレベルの問題を解けるようになれば、ソフトウェアエンジニアとして最低限の仕事はできるようになったと言えると思います。

また、例えば計算量を考えて実装しなければならないような、少し難しい実装も時には必要になります。yukicoder★2を安定して解けるようになれば、そのような実装を安心して任せられると思います。

会社によっては、情報工学の高度な知識が求められることがあるかもしれません。yukicoder★3以上がそれに該当すると思います。筆者もyukicoder★3がかろうじて解けるか解けないかというレベルですので、このレベルについてあまり多くは語れません。

ソフトウェアエンジニアとして学ぶべき事は多岐にわたっているので、前述の通り、全く競技プログラミングが関連しない分野もあります。学習時間の配分として、競技プログラミングに力を入れすぎるのは、総合的な能力バランスで見たときに問題かもしれません。もちろん、伸ばすべき能力は人それぞれですので一概には言えません。どこに力を入れるべきか迷ったら、経験豊かなエンジニアに相談してみましょう。

# まとめ

簡単ながら研修への競技プログラミングの導入事例を記しました。まだ事例が少なく、十分なフィードバックは得られていないのですが、少なくともプログラミングを楽しめるようにする、という意味では効果はあったと感じていますので、今後も積極的に利用していきたいと思います。競技プログラミングサイトの運営者、作問者の皆様に感謝いたします。