こんにちは、hirano です。
社内でプログラミングコンテストをやってみた話です。
プログラミングコンテストのルール
- あるお題に沿ったプログラムを作る
- 言語はJava(社内で使えない人がいないのでこれになった)
- お題等の詳細は以下。 github.com
- 処理速度が速いのが勝ち
- シングルコア
- ヒープは100MBまで
どうやったのか
速度を競う関係上、エントリーしたらすぐに結果が見たいはずなので、 ソースファイルをアップロードしたら自動的にコンパイル&実行&計測&ランキング更新するサーバーを作った。
余談だが、このサーバーは社内のエンジニアがフルスクラッチで数時間で作ってくれたが、私には無理だったので助かったww
エントリー経過
名前 | 実行時間(ms) | エントリー日 |
---|---|---|
JS専門社員 | 6,980 | 2016/04/22 01:26:33 |
JS専門社員 | 6,895 | 2016/04/22 07:34:32 |
goto3 | 6,921 | 2016/04/22 21:46:20 |
goto3 | 6,935 | 2016/04/22 21:47:16 |
goto3 | 6,454 | 2016/04/22 21:49:11 |
これがほぼ初日。適当に実装すると4時間以上かかってしまうのだが、 いきなり7秒台で勝負がスタート。 それにしてもJS専門社員のエントリー時刻がおかしい気がする。
名前 | 実行時間(ms) | エントリー日 |
---|---|---|
SQL大好き役員 | 3,648 | 2016/04/23 01:10:46 |
goto3 | 5,195 | 2016/04/23 03:15:14 |
C#系社員 | 4,477 | 2016/04/23 16:34:59 |
翌日。2日目にして3秒台が現れる。 初日にエントリーした goto3 も5秒台まで縮めてくる。
名前 | 実行時間(ms) | エントリー日 |
---|---|---|
JS専門社員 | 6,078 | 2016/04/24 11:20:59 |
JS専門社員 | 5,214 | 2016/04/24 12:57:13 |
JS専門社員 | 5,239 | 2016/04/24 13:46:45 |
JS専門社員 | 4,359 | 2016/04/24 19:31:36 |
JS専門社員 | 4,197 | 2016/04/24 20:13:32 |
3日目。JS専門社員無双。エントリーの度にタイムを縮めてくる。
名前 | 実行時間(ms) | エントリー日 |
---|---|---|
SQL大好き役員 | 3,893 | 2016/04/25 02:49:50 |
SQL大好き役員 | 3,194 | 2016/04/25 03:42:43 |
超絶技巧社員 | 4,268 | 2016/04/25 13:39:10 |
4日目。SQL大好き役員が 3,648ms から 3,194ms まで記録を延ばす。 超絶技巧社員もいきなりで4秒台とレベルが高い。
ちなみに4/25は月曜日だったのだが SQL大好き役員は翌日ちゃんと出社できたのだろうか。
名前 | 実行時間(ms) | エントリー日 |
---|---|---|
JS専門社員 | 4,129 | 2016/04/26 00:36:12 |
JS専門社員 | 4,355 | 2016/04/26 00:43:45 |
JS専門社員 | 3,603 | 2016/04/26 00:47:37 |
勝利指向役員 | 1,478 | 2016/04/26 08:31:39 |
超絶技巧社員 | 4,068 | 2016/04/26 14:08:45 |
SQL大好き役員 | 12,886 | 2016/04/26 19:42:30 |
SQL大好き役員 | 3,286 | 2016/04/26 19:45:16 |
SQL大好き役員 | 2,316 | 2016/04/26 19:46:02 |
SQL大好き役員 | 2,202 | 2016/04/26 19:57:44 |
SQL大好き役員 | 1,765 | 2016/04/26 19:58:59 |
SQL大好き役員 | 2,197 | 2016/04/26 20:00:05 |
SQL大好き役員 | 1,890 | 2016/04/26 20:01:11 |
goto3 | 2,126 | 2016/04/26 22:50:58 |
goto3 | 2,036 | 2016/04/26 22:51:21 |
goto3 | 2,022 | 2016/04/26 22:52:21 |
goto3 | 1,822 | 2016/04/26 22:54:58 |
goto3 | 1,624 | 2016/04/26 22:56:17 |
goto3 | 2,911 | 2016/04/26 23:18:17 |
SQL大好き役員 | 1,478 | 2016/04/26 23:39:33 |
5日目。勝利指向役員がいきなり1秒台を叩き出す。 これで一気にトップ争いのレベルが上がる。
余談ですが、私はここでみんなすごいなーと完全にヤムチャ状態でした。
名前 | 実行時間(ms) | エントリー日 |
---|---|---|
ざわ系社員 | 7,732 | 2016/04/27 00:08:29 |
ざわ系社員 | 7,250 | 2016/04/27 00:09:07 |
ざわ系社員 | 7,589 | 2016/04/27 00:09:59 |
JS専門社員 | 3,695 | 2016/04/27 01:24:29 |
JS専門社員 | 4,026 | 2016/04/27 01:26:54 |
JS専門社員 | 4,013 | 2016/04/27 01:29:00 |
ヤムチャ系役員 | 7,764 | 2016/04/27 07:53:36 |
超絶技巧社員 | 3,276 | 2016/04/27 09:41:40 |
ラビット系社員 | 6,729 | 2016/04/28 11:53:47 |
ラビット系社員 | 5,990 | 2016/04/28 14:06:51 |
SQL大好き役員 | 1,460 | 2016/04/29 02:35:55 |
SQL大好き役員 | 1,419 | 2016/04/29 02:36:37 |
SQL大好き役員 | 1,750 | 2016/04/29 02:37:58 |
SQL大好き役員 | 1,860 | 2016/04/29 02:38:47 |
ゴールデンウィーク前の追い上げでSQL大好き役員が逆転(1,478 → 1,419) やはりエンジニアは夜行性なんだろうか。
名前 | 実行時間(ms) | エントリー日 |
---|---|---|
C#系社員 | 2,136 | 2016/05/01 23:34:19 |
C#系社員 | 2,144 | 2016/05/01 23:44:51 |
C#系社員 | 1,666 | 2016/05/02 02:50:21 |
SQL大好き役員 | 2,110 | 2016/05/03 01:53:41 |
SQL大好き役員 | 1,410 | 2016/05/03 01:54:36 |
SQL大好き役員 | 1,756 | 2016/05/03 02:18:03 |
SQL大好き役員 | 1,752 | 2016/05/03 02:21:45 |
SQL大好き役員 | 1,758 | 2016/05/03 02:33:53 |
SQL大好き役員 | 1,523 | 2016/05/03 02:40:05 |
SQL大好き役員 | 3,728 | 2016/05/04 10:29:06 |
SQL大好き役員 | 1,385 | 2016/05/04 10:29:45 |
SQL大好き役員 | 1,399 | 2016/05/06 12:44:39 |
SQL大好き役員 | 1,397 | 2016/05/06 12:52:18 |
SQL大好き役員 | 1,335 | 2016/05/06 15:02:06 |
SQL大好き役員 | 1,488 | 2016/05/06 15:55:09 |
SQL大好き役員 | 1,442 | 2016/05/06 15:55:55 |
SQL大好き役員 | 1,388 | 2016/05/06 17:07:05 |
SQL大好き役員 | 1,317 | 2016/05/06 17:35:37 |
勝利指向役員 | 1,520 | 2016/05/09 02:41:51 |
勝利指向役員 | 1,474 | 2016/05/09 08:06:09 |
勝利指向役員 | 1,495 | 2016/05/09 08:28:43 |
勝利指向役員 | 1,398 | 2016/05/09 08:40:37 |
勝利指向役員 | 1,384 | 2016/05/09 08:47:38 |
SQL大好き役員 | 1,346 | 2016/05/09 10:58:40 |
勝利指向役員 | 1,318 | 2016/05/09 19:27:39 |
勝利指向役員 | 1,345 | 2016/05/09 19:44:22 |
勝利指向役員 | 1,346 | 2016/05/09 19:51:42 |
勝利指向役員 | 1,298 | 2016/05/09 19:52:45 |
SQL大好き役員 | 1,174 | 2016/05/09 22:08:30 |
SQL大好き役員 | 1,126 | 2016/05/09 22:22:58 |
SQL大好き役員 | 1,082 | 2016/05/09 22:53:26 |
SQL大好き役員 | 1,067 | 2016/05/09 22:58:06 |
SQL大好き役員 | 1,057 | 2016/05/09 23:27:24 |
ゴールデンウィークなのに勝利指向役員とSQL大好き役員のエントリーが相次ぐ。 休む気ゼロなのか、余暇がプログラミングなのか。
名前 | 実行時間(ms) | エントリー日 |
---|---|---|
SQL大好き役員 | 1,001 | 2016/05/10 00:16:46 |
SQL大好き役員 | 977 | 2016/05/10 00:17:40 |
勝利指向役員 | 1,232 | 2016/05/10 08:48:22 |
勝利指向役員 | 1,172 | 2016/05/10 08:48:42 |
勝利指向役員 | 1,164 | 2016/05/10 08:48:54 |
勝利指向役員 | 990 | 2016/05/10 09:01:06 |
勝利指向役員 | 946 | 2016/05/10 09:01:16 |
勝利指向役員 | 1,046 | 2016/05/10 09:05:00 |
勝利指向役員 | 914 | 2016/05/10 09:05:11 |
勝利指向役員 | 928 | 2016/05/10 09:05:23 |
SQL大好き役員 | 1,023 | 2016/05/10 09:42:40 |
SQL大好き役員 | 1,363 | 2016/05/10 10:57:00 |
SQL大好き役員 | 1,169 | 2016/05/10 11:40:39 |
SQL大好き役員 | 1,537 | 2016/05/10 13:37:53 |
SQL大好き役員 | 1,045 | 2016/05/10 13:40:01 |
SQL大好き役員 | 1,026 | 2016/05/10 13:50:11 |
勝利指向役員 | 1,207 | 2016/05/10 13:56:10 |
勝利指向役員 | 1,203 | 2016/05/10 13:57:20 |
最終日になりついに1秒を切る。 更なる改良を目指すも最後の方は若干悪化するなどして、914msが最速の結果となる。 5/10は平日なので一般社員はエントリーしにくい中、役員の猛攻が目立つ最終日だった。
最終結果
以下の結果となった。
順位 | 名前 | 実行時間(ms) | エントリー日 | 総エントリー数 | ソース |
---|---|---|---|---|---|
1 | 勝利指向役員 | 914 | 2016/05/10 09:05:11 | 20 | source |
2 | SQL大好き役員 | 977 | 2016/05/10 00:17:40 | 45 | source |
3 | goto3 | 1,624 | 2016/04/26 22:56:17 | 10 | source |
4 | C#系社員 | 1,666 | 2016/05/02 02:50:21 | 4 | source |
5 | 超絶技巧社員 | 3,276 | 2016/04/27 09:41:40 | 3 | source |
6 | JS専門社員 | 3,603 | 2016/04/26 00:47:37 | 13 | source |
7 | ラビット系社員 | 5,990 | 2016/04/28 14:06:51 | 2 | source |
8 | ざわ系社員 | 7,250 | 2016/04/27 00:09:07 | 3 | source |
9 | ヤムチャ系役員 | 7,764 | 2016/04/27 07:53:36 | 1 | source |
エントリー人数: 9
総エントリー数: 101
となった。Interprismには32名の社員がいて、いわゆるエンジニアが29名なので、約31%の人が参加してくれた。
通常業務でほぼ一日は使ってしまう中、多くの人がエントリーしてくれて予想以上に盛り上がった気がする。
感想戦
エントリーした人で集まってみんなのソースファイルを見てあーだこーだ話をしたがそれぞれに個性が出てなかなか楽しかった。
- 2016年4月に入社した新人がエントリー
- 4月からJavaを勉強し始めていきなりエントリーしていて他の人が驚いていた(何位かは言いませんが)
- 若干反則なコード
- 今回はデータファイル、入力ファイルが固定なので、読み飛ばす最小バイト数を予め調査出来た
- その人は駄目って書いてないからOKと言っていた。確かに。
- CPUのレジスタ、2次キャッシュの量まで考えてヒープの使用量をコントロールしていた人もいた
- 速いだけではなく可読性も考えられているものもあった
次回予告(?)
実はもう2回目も実施済みなので、またブログにまとめたらエントリーする予定。
なんでプログラミングコンテストなんてやったの?
ここからは本筋ではないけど、プログラミングコンテストをやった背景を書きます。
Interprismにはエンジニアが多くいますが、ばらばらの場所で仕事していることが多いことからプログラマーとしてのスキルの高さが伝わりにくい状態です。 (噂レベルであの人は凄いねという話は聞こえてくるのですが)
なので、スキルを見せられる場があると良いなと思い、プログラミングコンテストという場を思いつきました。
プログラミングと一言で言っても色々あります。
Interprismでは他社さんの業務システムを実装することが多いのですが、
複雑な業務ロジックを正しく実装すること
が最重要事項で、速度やメモリー量は優先順位的に少し下に来ることが多いです。
業務ロジックを実装することはそれほど簡単ではないのですが、いかんせん凄さが伝わりにくい側面があります。
よって、分かりやすい速度にフォーカスをあてて、メモリーの効率的な使用方法や、アルゴリズムの組み方などが見えたらいいかなと考えました。