ブログのとさか

技術的な話をしたりしなかったり

AtCoderのプログラミング入門教材 AtCoder Programming Guide for Beginners の宣伝

この記事はCompetitive Programming Advent Calendar 2016 12/10の記事です。

AtCoderのコンテンツとして、プログラミング入門の教材を作ることになりました。
AtCoder Programming Guide for Beginners」みたいな名前でやっていこうと思っています。

AtCoderのコンテンツなので、当然オンラインジャッジを最大元活用した内容にしていきます。
一応「競技プログラミングのためのプログラミング入門」ではなく、「オンラインジャッジを活用したプログラミング入門」です。 とはいえ、この教材で学び、ACの快感を知ってしまった人は競技プログラミングの世界に自然に入っていけるでしょうし、競技プログラミングの人口増加に繋がるかもしれません。

逐次公開しつつ、みなさんからの意見を受けてフィードバックしながらより良いものを作っていきたいと思っています。
進捗を報告したり、意見を受け付けたりするためのTwitterアカウントを作成したので、気軽にリプライやDMを送って下さい。よろしくお願いします!

内容

この教材の到達目標は「プログラミング初学者が様々なアルゴリズムを記述するために必要なプログラミング言語の文法知識を身に付ける」ことです。
言語はC++を採用します。

オンラインジャッジを活用したプログラミング入門なので、各項目について問題とジャッジを用意します。

まずは、「最速」でプログラムを書けるようになるため、最低限の文法知識を扱います。
AtCoder Biginner ContestのA問題とB問題のほぼ全てと、一部のC問題を解けるようにします。
その後は、アルゴリズムを記述するのに役立つ言語機能や、それまで「おまじない」的扱いを受けていた文法について説明します。

ただし、C++の言語仕様に詳しくなること自体は目的としていないため、詳細な文法の解説はしません。
また、保守性の高いプログラムの書き方や、高度なアルゴリズムとデータ構造等も扱いません。

現状の目次は以下のようなものを考えています。あくまで暫定なので、内容は順番は変化する可能性が高いです。

基礎

  • 導入
  • 出力
  • 四則演算
  • 変数(1)
  • 入力
  • if文
  • 条件演算子
  • bool型
  • 変数(2)
  • while文
  • for文
  • 文字列
  • 配列
  • STL(1)(関数のみ紹介)
  • 関数
  • 数値型とビット演算

繰り返し処理の応用

計算量

  • 計算量について

C++

以上の項目の他に↓のようなページがあったら良いかなぁと思っていますが、労力が余っていれば...くらいに思っています。

  • C++基本文法チートシート(基礎文法最速マスターみたいなもの)
  • プログラムの書き方について(インデント等)
  • 典型コンパイルエラー/バグ集

ちなみに、ポインタを扱うかどうか迷っています。平衡二分探索木とかを実装したかったら必要になるんですが、うーん...

対象者のより詳細な前提知識としては、基本的には中学二年生開始時程度の数学、英語知識を最低限求めるくらいのものにしようと思っています。
PCの知識は、アプリケーションのインストールと見ながらタイピングくらいはできるくらいを想定するつもりです。
説明が冗長になりすぎない範囲でできるだけハードルを下げたいと思っているので、実際には中学1年生でもわかるくらいの書き方になっていると思います。
中高の部活動から大学生以上まで広く使われる教材になったら良いなあと思っています。

明日のCompetitive Programming Advent Calendar 2016はmatsu7874さんの記事とhotpepsiさんの「バグ」です。

以下はおまけです。


プログラミング入門とオンラインジャッジ

オンラインジャッジを用いたプログラミング入門は非常に効率的だと思います。

プログラミングはプログラムを書かないと覚えられません。しかし、一般的な入門書でプログラミングを覚えようとすると、入門書に書いてあるコードを写経するだけで終えてしまう人が多いです。
また、ソフトウェア制作を通じたプログラミング入門も、GUI周りのAPIを覚えること等とプログラミング言語の文法を覚えることが混在してしまい、 プログラミング言語そのものの知識を身に付ける方法としてあまり効率的でない面があります。

それに対し、オンラインジャッジを用いたプログラミング入門では、学んだ文法を使う問題を解くことによって、より確実に知識を定着させることができます。
プログラミング言語以外で覚えなければならない要素もほとんどありません。

さらに、ACしていくことはかなりモチベーションに繋がります。入門書にも例題がついていることはありますが、基本自己採点になってしまいますし、答えが載っていないことすらあります。 オンラインジャッジでは、コンパイルと出力の確認だけとはいえ、ある程度確実な採点を行えますし、オンラインジャッジに「AC」と出るのは自己採点よりも強い快感があると思います。

一通り文法を学び、教材で用意した問題を解き終わった後も、他の問題を解いたり、開催されているコンテストに参加することによって、プログラムを書く能力を上げていくことができます。 「プログラミングに興味はあるけど、作りたいものがあるわけではない」という人は案外多く、そういった人たちにとってこのことは重要だと思います。

オンラインジャッジを活用した日本語のプログラミング入門教材は、僕の知る限り現状AOJ系のものだけです。この資料はAOJの資料とはまた違った価値を提供していきたいです。

教材作成者について

教材の構成等は「経験上」という曖昧な感覚から決めているため、どういう経験をしてきたのか、自分語りをしておきます。

僕は中高時代コンピュータ部の部長を務めていました。
部長として部員のレベルを上げるため、中1~高1くらいの人に対し、プログラミングをよく教えていました。対象者の前提知識が中学生程度なのは、このこととも関係しています。
プログラミングの入門教材を作るのは実は二度目で、中学3年生の時に部活の仲間とC#の入門教材を作ったことがあります。
コンピュータ部の宣伝として、コンピュータ部外の人にプログラミング講座を開催したりもしていたので、今までプログラミングを教えた人数は多分50人~100人(超大雑把)くらいでしょうか。
今回の教材ではそこでの経験を活かしていきたいと思っています。

競技プログラミング経験としては、JOI春合宿の出場経験があり、大学生になってから引き続きICPCに出場しています。
アルゴリズムを記述するのに役立つ言語機能」は実際の所、競技プログラミングで使われる言語機能のことですが、今まで見てきた競プロのソースでよく見る or 便利だと思ったものを扱っていきたいと思っています。

書いてる途中の感想

基礎のところは半分くらい書き上がってますが、やっぱ読みやすい文章書くのは難しいなあと感じています。 文章書くのが遅いので、この教材作成経験を通じて速くしていきたいですね。(まぁよく見ると文章量は大したこと無く、説明のほとんどがサンプルコードみたいなことが多いですが...)
「あ、これも説明しないといけないんだった」みたいなことが頻発し、一章書き上がったら一章増えるみたいなことが起きていて、自分たちが普段書いているプログラムも意外と多くの知識の元で作られているんんだなぁというのを実感します。

教材を作るにあたって、本屋や図書館で色々とプログラミングの入門書を眺めているんですが、質の高い本もある一方、びっくりするような(遠回し)構成の入門書が結構多くてなんだかなぁと思うことがあります。160ページとかではじめてif文が出てきたJavaの入門書(初学者向けっぽいタイトルをしている)には流石に驚きました...
全体的な傾向として、入門書の書き方は意外と難解だと感じました。この教材ではできるだけ易しく説明することでも一般的な入門書との差別化を図っていきたいと考えています。