グラニ インターン体験記
インターン体験記
8/15~9/2の間、株式会社グラニにエンジニアとしてインターンに行っていました。
少し(だいぶ)遅れましたが、簡単にどんな感じだったのかまとめておきたいと思います。
(以下の話でおかしな点があった場合、僕の解釈間違いです。念のため。)
グラニ
グラニはモバイル端末向けゲーム開発会社です。
スローガンの一つとして「using CSharp;」を掲げており、C#とVisual Studioを主軸において開発を行っています。
.NET 界隈ではMS MVPでUniRxの作者である@neueccさんがCTOを務めていることでも有名だと思います。
インターンの経緯
もともと夏休みはこれといった予定がなく、せっかくなのでアルバイトかインターンをしようかなあと思っていました。
どういった会社にするかは少し迷いましたが、最近開発のモチベーションが落ちてきていて良くないなあと思っていたこともあり、モチベーションを上げるためにも開発業務が行える会社でアルバイトかインターンをしようと決めました。
僕はC#が好きなので、C#をメインで使っており、開発者のレベルが高い会社で本格的な開発現場を体験したいと思いました。 最近ではC#統一を掲げている会社にも幾つか候補がありますが、以前から名前を知っているグラニに一番にお願いすることにしました。
ただ、グラニの公式サイトを探してもインターンとアルバイトの申し込みページが見つからなかったので、neueccさんにDMを送ってお願いすることにしました。 しかし、DMを送る直前になって「公式サイトに無いということは募集してないということなのでは...」「自分程度の技術力で申し込むのは迷惑なのでは...」といった不安にかられ、とても緊張して送信ボタンを押したのを覚えています。女の子に告白するときくらい緊張しました(?)。
実際には募集ページはちゃんと存在していて、僕が見つからなかっただけのようでした。(DMの返信で教えていただきました。「新卒採用」ボタンをクリックした先のページにあったようです。 募集職種一覧) ただ、今までグラニはエンジニアのアルバイトやインターンを受け入れたことが無かったので、社内での「エンジニアのインターン」という存在の知名度も低かったようです。 (あと実は筑波大学にもインターンの募集をかけていたらしいのですが、僕は全く知りませんでした...)
その後応募ページから応募して後日の面接を行い、日付、だいたいの内容、待遇などを相談し、グラニでインターンすることが決定しました。
職場の環境
オフィスは六本木ヒルズ 森タワーの15階にあり、ビルの入口付近に設置されているゲートに社員証(画像)をかざして中に入る形でした。
15階が全てグラニのフロアというわけではないので、15階に上がった後またグラニの中に入る際に社員証をかざさないと入場できません。
お手洗いはグラニの外にあるので、社員証の携帯が必須なのですが、一度社員証を机に忘れ、NEW GAME!1話の青葉みたいになるところでした。
PCは3面ディスプレイでメモリ32GBのものが一台貸し与えられました。
椅子も高級そうな感じで、一日そこで作業してても疲れにくかったように感じました。インターンのお給料でまともな椅子を買おうかなと真面目に検討中です。
また、最高だったのがフリードリンクです。(「自由ソフトウェア(free software)」ではなく「ドリンク飲み放題(free drink)」と考えて下さい)(伝わりにくいネタ)
レッドブルからヨーグルトジュース、オレンジジュース、コーラ、お茶、ココア、コーヒー、炭酸水、牛乳その他諸々があり最高でした。コーヒとココアに関しては↓みたいな感じの自販機が2種類置いてあって、無料で使えました。(適当にググってきたのでまんまこれではないかも)
さらに、朝ごはんの支給もありました。始業時間30分前(午前10時)から社員の方がトーストを焼いてくれるので、毎日美味しくいただいてました。トーストの他にはコーンフレークやバナナ、ゆで卵等もありました。
モバイル端末ゲーム開発業界はブラックなところも多かったりするという話を以前聞いたことがありましたが、グラニは全くそんなことはなく、社員が働きやすい環境を整えることに非常に気を使っているように感じました。
職場環境を整える他にも、(僕はインターン生なので関係ありませんでしたが)福利厚生が充実していて、「オシャレ手当」というので申請すると服代が一定額支給されたり、職場近くに住む場合は家賃手当が出たりするそうです。そのため、六本木ヒルズから徒歩10分~15分くらいの距離に住んでいる方が多くいるようでした。
やったこと
本来ここがメインなような気もしますが、書けないことが多いので短めです。
当然使用言語はC#です。HTML/JS/SQL等も多少いじりはしました。グラニというと最近はUnityという感じもしますが、僕は基本的にASP.NET MVC 5上での開発を行っていました。僕はWeb方面がかなり弱点だなあと思っていたので、いい経験になりました。
また、実装完了後に仕様が変わるという「エンジニアの洗礼」も受けることができ、感動しました。(非常に妥当な変更で、作業量もそれほど多くなかったので負の感情等はないです。念のため。)
開発そのもの以外では、社内で「.NETのクラスライブラリ設計」輪読会が行われており、それに参加させていただきました。5,6人の少人数で対象の本の特定の章を事前に読んでおき、書いてある内容について、主にneueccさんがそれに対するコメントをした後、他の参加者も自分の考えを述べるというような形式でした。
主な目的は「設計思想の共有」でした。あるフレームワーク上でプログラムを書くとき、そのフレームワークの思想に沿ってプログラムを書くことによって、より自然で使いやすい形になります。また、プログラムの設計に関しては様々な思想がありますが、少なくとも同じプロジェクトのチーム内ではその思想が統一されているべきです。
そこで、この会では.NETというフレームワークがどのような思想で設計されているのかに加え、社内フレームワークの思想についても、現状のプロジェクトの失敗と成功の例もあげながら語られていました。
対象の章は大した量ではありませんでしたが、2時間~3時間くらいかけてじっくり行われました。
特に印象に残っているのが、「三種の神器」の話です。(以下の話はまとめたもので、実際はより掘り下げた話がありました。)
- IntelliSensability インテリセンスを使いやすくする
- Navigatability(多分違う命名をされてましたが忘れました...) コードナビゲーションを大事に。F12や「参照」などから、定義元に飛びやすくする。
- Stacktraceability スタックトレースで呼び出し元を探しやすくする
C#はその言語仕様からしてVisualStudioを始めとしたリッチな開発環境での開発しやすさを考えられています。.NET Frameworkに関しても同様です。そのため、上記のようなC#特有のことにも気を配ると、「実際に扱いやすい」プログラムを書くことができます。
上の話も含め、普段適当にネットの記事を見ていてもあまり触れられていない話を多く聞くことができたので、本当に勉強になりました。
他にも、株式会社一休さんとのミーティングに参加させていただいたり、「Team Geek」から、「HRT」の講義をしていただきました。HRTとは、
- Humility (謙虚)
- Respect (尊敬)
- Trust (信頼)
の略です。グラニではこのHRTを常に意識し、コミュニケーションを円滑に行おうという運動が社内全体であるようです。(詳しくは書籍「Team Geek」で)
ちなみに、上で触れている「.NETのクラスライブラリ設計」と「Team Geek」の書籍をインターン最終日にいただきました。圧倒的感謝...!🙏 (ちなみに .NETの本は現在廃盤なので物理書籍の方は結構レアものです。)
(画像)
感想
3週間を通して、本当に勉強になりました。「開発者のレベルが高い会社で本格的な開発現場を体験」という目的も果たすことができました。
グラニの皆様、そして色々と面倒を見てくださったして下さった@xin9leさんへの感謝の気持ちでいっぱいです。本当にありがとうございました。
おまけ お昼ごはん
お昼ごはんはグラニの皆様のご厚意で六本木の様々なところに連れて行っていただきました。せっかくなので紹介したいと思います。
1日目 トリュフハンバーガー
ちなみに一緒に来た他の方はステーキを食べており、「六本木のエンジニアは昼からステーキを食べるのか...」と衝撃を受けました。 (実際は普段ははなまるうどんを食べているそうです)
2日目 焼肉
社内チャットサービスでC#を動かすことが出来るので、C#で抽選するプログラムを書いた結果焼肉になりました。
3日目 寿司
4日目 ニョッキ
写真撮り忘れました。
5日目 ササミかつ
ものすごくサクサクで感動しました。
6日目 ペヤング ソース焼きそば
台風だったので... 社内コンビニで買いました(会社が半額以上負担してくれる。商品が置いてあってコインを入れて持ってく形式。)
7日目 会社弁当
社内で弁当が販売されています。500円でした。
8日目 ラーメン+親子丼
9日目 とんかつ
10日目 おうどん+とろたく丼
つるとんたんってお店で変わったうどんがたくさんあります。(自分は比較的普通のうどんをたのみました)。あと容器がすごくでかいです。
11日目 ラーメン
普段食べてるラーメンよりだいぶ美味しかったです。
12日目 天ぷら
13日目 うどん
写真を撮り忘れたので食べログからの借り物です。
これもかなり美味しかったのでまた食べたいです。
14日目 ビュッフェ
15日目 ピザ
美味しいものを食べすぎた副作用か、インターンの期間が終わった後から平気で高いものを食べようとしてハッとなることがあります。怖い怖い...
ちなみに、お昼休みは主にスマブラWiiUで遊んでました。(一度ポーカーにも誘っていただきました。) インターンのときに使ってたもの以外のキャラも多少使えるようになったのでまた勝負したいです。
ICPC予選参加記
ICPC(国際大学対抗プログラミングコンテスト) 2016 国内予選にチームprinding–purantei–として参加し、予選を通過しました。ヤッター!
さて、prinding-purantei-のチーム編成は、僕(1年)、中国人留学生(1年)、先輩(2年)となっていました。
ICPC予選出場経験のある先輩と、中国のJOI(Jじゃないけど)に参加していた留学生という頼りがいのある二人と組むことができ、いいチームで出られたと思います。
予選本番では
A: 僕, B:先輩, C:僕, D:留学生
の問題をそれぞれ通しました。
D問題は留学生がバグらせて少し時間がかかっていたので、僕も実装をしようとしてパソコンを交代してもらったりもした(ICPCでは1チーム1台のPCしか使えません)のですが、最終的に彼のプログラムでACしました。
彼がプログラムをバグらせ続けて通せないという最悪のケースが起こらないように、と考えての行動でしたが、結果論では僕が余計なことをしなければもっと早くACできたわけで、どうするのが正解だったのかなあと思いました。
プログラムを再実装すること以外にも、彼のコードを印刷してバグ探しをしたり、ペアプログラミングをしたりすることもできたので、もしかしたらそちらのほうが良かったのかもしれません。
順位としては 全体49位 学内2位 で予選敗退ラインだったのですが、選抜ルール手順3のワイルドカード枠で予選を通過しました。(順位表)
手順3で選ばれるチームはアジア予選のホスト校から選ばれることが多いらしく、
僕が所属するチームは今年のホスト校である筑波大学内の(手順2までの)不通過チームのうち順位が最も高いチームだったため選ばれたのだと思います。筑波大学でよかった~~~
ちなみに、他の手順3での通過チームには、6位の東京大学のチームと48位の神奈川工科大学のチーム、56位の金沢高専のチームが選ばれたようです。
ホスト校枠で通ってしまったので、4完して同じくらいの順位だったのに予選落ちしてしまった他大学の友人のチームには少し申し訳ない気もしますが、彼らの悔しさも背負って(?)10月のアジア地区予選に向けて精進したいと思います。
SuperCon 2016 予選問題をCSPソルバーで解く
SuperCon 2016 参加者の皆さん予選お疲れ様でした。予選通過するといいですね。 僕は高校生で無くなってしまったので本戦への参加権はありませんが、予選問題を読んだところCSPソルバーでさくっと解けそうだったのでやってみました。
※この記事はしっかりとした解説記事ではなく、紹介程度のものです。
CSPソルバーとは
CSPソルバーとは、問題の制約を決まった形式のテキストに変換し、そのファイルをCSPソルバーに渡して上げると、内部で「いい感じ」に問題を解いてくれるというツールです。予選参加者のみなさんは頑張って探索を最適化していったと思いますが、CSPソルバーを使うと簡単なテキストファイルを生成するだけでそれなりに高速に問題を解いてくれます。(とは言ってもみなさんのガチガチにチューニングしたプログラムの方がだいぶ速いと思います。)
CSPソルバーで虫喰い魔方陣を解く
百聞は一見にしかず。CSPソルバーについての詳しい説明は横において、今回の問題を解く様子を見てみましょう。CSPソルバーにはSugarを使います。
とはいっても、魔方陣の解法については自分が書くことはあまりなく、「CSPソルバー 魔方陣」で検索すると
http://bach.istc.kobe-u.ac.jp/sugar/puzzles/sugar-puzzles.pdf
というスライドのPDFが引っ掛かり、このスライドにある3×3魔方陣のCSPファイルと同じように6×6用のCSPファイルを生成するだけで解くことができます。
具体的には以下のようになります。
;それぞれの魔方陣のマスに入る数をx_i_jという変数で表す (int x_0_0 1 36);整数変数 x_0_0 の宣言。範囲は 1 <= x_0_0 <= 36 となる。 (int x_0_1 1 36) (int x_0_2 1 36) (int x_0_3 1 36) (int x_0_4 1 36) (int x_0_5 1 36) (int x_1_0 1 36) (int x_1_1 1 36) (int x_1_2 1 36) (int x_1_3 1 36) (int x_1_4 1 36) (int x_1_5 1 36) (int x_2_0 1 36) (int x_2_1 1 36) (int x_2_2 1 36) (int x_2_3 1 36) (int x_2_4 1 36) (int x_2_5 1 36) (int x_3_0 1 36) (int x_3_1 1 36) (int x_3_2 1 36) (int x_3_3 1 36) (int x_3_4 1 36) (int x_3_5 1 36) (int x_4_0 1 36) (int x_4_1 1 36) (int x_4_2 1 36) (int x_4_3 1 36) (int x_4_4 1 36) (int x_4_5 1 36) (int x_5_0 1 36) (int x_5_1 1 36) (int x_5_2 1 36) (int x_5_3 1 36) (int x_5_4 1 36) (int x_5_5 1 36) ; すべての変数は互いに違う数を取る (alldifferent x_0_0 x_0_1 x_0_2 x_0_3 x_0_4 x_0_5 x_1_0 x_1_1 x_1_2 x_1_3 x_1_4 x_1_5 x_2_0 x_2_1 x_2_2 x_2_3 x_2_4 x_2_5 x_3_0 x_3_1 x_3_2 x_3_3 x_3_4 x_3_5 x_4_0 x_4_1 x_4_2 x_4_3 x_4_4 x_4_5 x_5_0 x_5_1 x_5_2 x_5_3 x_5_4 x_5_5) ;縦、横、対角線のマスに入る数の和が111になる(ポーランド記法で書く) (= 111 (+ x_0_5 (+ x_0_4 (+ x_0_3 (+ x_0_2 (+ x_0_1 x_0_0)))))) (= 111 (+ x_1_5 (+ x_1_4 (+ x_1_3 (+ x_1_2 (+ x_1_1 x_1_0)))))) (= 111 (+ x_2_5 (+ x_2_4 (+ x_2_3 (+ x_2_2 (+ x_2_1 x_2_0)))))) (= 111 (+ x_3_5 (+ x_3_4 (+ x_3_3 (+ x_3_2 (+ x_3_1 x_3_0)))))) (= 111 (+ x_4_5 (+ x_4_4 (+ x_4_3 (+ x_4_2 (+ x_4_1 x_4_0)))))) (= 111 (+ x_5_5 (+ x_5_4 (+ x_5_3 (+ x_5_2 (+ x_5_1 x_5_0)))))) (= 111 (+ x_5_0 (+ x_4_0 (+ x_3_0 (+ x_2_0 (+ x_1_0 x_0_0)))))) (= 111 (+ x_5_1 (+ x_4_1 (+ x_3_1 (+ x_2_1 (+ x_1_1 x_0_1)))))) (= 111 (+ x_5_2 (+ x_4_2 (+ x_3_2 (+ x_2_2 (+ x_1_2 x_0_2)))))) (= 111 (+ x_5_3 (+ x_4_3 (+ x_3_3 (+ x_2_3 (+ x_1_3 x_0_3)))))) (= 111 (+ x_5_4 (+ x_4_4 (+ x_3_4 (+ x_2_4 (+ x_1_4 x_0_4)))))) (= 111 (+ x_5_5 (+ x_4_5 (+ x_3_5 (+ x_2_5 (+ x_1_5 x_0_5)))))) (= 111 (+ x_5_5 (+ x_4_4 (+ x_3_3 (+ x_2_2 (+ x_1_1 x_0_0)))))) (= 111 (+ x_5_0 (+ x_4_1 (+ x_3_2 (+ x_2_3 (+ x_1_4 x_0_5))))))
ただし、このCSPファイルはすべての魔方陣のマスが開いている状態の制約を表しているので、既に埋まっている場所は制約として追記して上げる必要があります。 例えば次の魔方陣の場合、
18 | 13 | 35 | |||
20 | 33 | 19 | 7 | ||
2 | 32 | 10 | 9 | ||
30 | 3 | 15 | |||
29 | 4 | 26 | 28 | ||
5 | 31 | 16 |
以下の様に制約を追記します。
(= x_0_1 18) (= x_0_3 13) (= x_0_4 35) (= x_1_1 20) (= x_1_2 33) (= x_1_3 19) (= x_1_4 7) (= x_2_1 2) (= x_2_2 32) (= x_2_4 10) (= x_2_5 9) (= x_3_0 30) (= x_3_3 3) (= x_3_5 15) (= x_4_1 29) (= x_4_2 4) (= x_4_4 26) (= x_4_5 28) (= x_5_2 5) (= x_5_3 31) (= x_5_4 16)
あとはこのファイルを適当な名前(ここではmahou.cspとします)で保存し、sugarに渡すだけです。
% sugar mahou.csp s SATISFIABLE a x_0_0 6 a x_0_1 18 a x_0_2 25 a x_0_3 13 a x_0_4 35 a x_0_5 14 a x_1_0 11 a x_1_1 20 a x_1_2 33 a x_1_3 19 a x_1_4 7 a x_1_5 21 a x_2_0 36 a x_2_1 2 a x_2_2 32 a x_2_3 22 a x_2_4 10 a x_2_5 9 a x_3_0 30 a x_3_1 34 a x_3_2 12 a x_3_3 3 a x_3_4 17 a x_3_5 15 a x_4_0 1 a x_4_1 29 a x_4_2 4 a x_4_3 23 a x_4_4 26 a x_4_5 28 a x_5_0 27 a x_5_1 8 a x_5_2 5 a x_5_3 31 a x_5_4 16 a x_5_5 24 a
この通りに埋めると
6 | 18 | 25 | 13 | 35 | 14 |
11 | 20 | 33 | 19 | 7 | 21 |
36 | 2 | 32 | 22 | 10 | 9 |
30 | 34 | 12 | 3 | 17 | 15 |
1 | 29 | 4 | 23 | 26 | 28 |
27 | 8 | 5 | 31 | 16 | 24 |
となり、確かに解けていることが分かります。(すごい!)
実行時間をtimeコマンドで計測すると
real 0.94 user 0.46 sys 0.47
となりました。まぁまぁですかね。実行環境はVirtualBox上のUbuntu(メモリ1GB、CPU Core i7-6650U 2.20GHz)、内部で使用しているSATソルバーはMinisatです。
最悪ケースでどうなるかは自分も確かめてないので試してみてください。
このように、CSPソルバーを使うと問題の解が簡単に得られます。もちろん魔方陣以外にも様々な問題を解くことができます。
SuperConのような単一のソースファイルを提出するコンテストではこれをそのまま回答コードとして流用するのは難しいですが、覚えておくとテストケース生成の際などに役立つかもしれません。
参考
- パズルをSugar制約ソルバーで解く
- パズルをSugar制約ソルバーで解く(pdf)
- Sugarの導入方法 開発環境
Sugarの動作には別途java、perl、minisatが必要です。minisatはUbuntuではapt-get install minisat2 でインストールできました。また、動作させるためにはsugarファイルを編集し、sugarのjarファイルのパスとjavaとperlのパスを書き換える必要が有ることがあります。詳細はSugarのReadmeを読んで下さい。 - SAT ソルバー入門
Sugarが内部で利用しているSATソルバーについての非常にわかりやすい説明です。 - SATソルバーに基づく制約ソルバーとその性能評価 SugarがCSPの制約をどのようにSATの形式に変換しているかについての説明が書かれています。
ひとりごと
本当は魔方陣のルールをdirect encodingとorder encodingで表すプログラムをそれぞれ書いて比較するっていうテーマにして、Sugarはついでで紹介するだけみたいなブログ記事にする予定だったけど、ちょっと時間が取れ無さそうだったのでとりあえずSugarの紹介だけすることにしました...
あと本当はWindows上でSugarを動作させたかったけど、うまく行かなかったので後回し中。でも大体原因がわかった(と思う)ので、もしできたらそれについてのブログも書くかも...?
SuperCon、現役としてもう一回やりたかったなあ。
SRM 677 Div1 Easy DoubleOrOneEasy
https://community.topcoder.com/stat?c=problem_statement&pm=14101&rd=16627
問題概要
整数a, b, newA, newBが与えられる。 (a, b)に対しそれぞれ同時に+1または*2する操作を繰り返して(newA, newB)に変える時の、操作の最少回数を求める。(変えられないなら-1)
ゆるふわな解法
+1を2回することは*2を1回することと等しいので、一番最初に*2をする前以外で+1を2回以上するのは無駄だよね。
という話から、最初に+1する回数をx、*2をする回数をnとすると、操作は(a * 2^n) + (x * 2^n) + (1or0 * 2^(n-1)) + ... + (1or0 * 2^1) + (1or0 * 2^0)
みたいな式で表せることがわかる。
(x * 2^n) + (1or0 * 2^(n-1)) + ... + (1or0 * 2^1) + (1or0 * 2^0)
をkとおくと、a * 2^n + k == newA && b * 2^n + k == newB
となる時のnが答えの操作で*2する回数になる。
このnはたかだかlog(newA)<30程度なので1から順に試せばOK。
ちなみに(1or0 * 2^(n-1))
以降の1or0の並びはnewA - (a * 2^n) + (x * 2^n)
を2進数で表した時と等しくなるので、この部分で+1した回数はpopcountで求められて嬉しい。
計算量O(log(newA))
コード
INT_MAXのところを始めINF(= 1 << 29)にしていて落ちたりした。不注意...
そもそもa==bの時以外はremA==remBになったらすぐreturnしてもいいんだけどね。
#include "bits/stdc++.h" using namespace std; const int INF = 1 << 29; //VSでコーディングしてるので拝借してきました http://www.nminoru.jp/~nminoru/programming/bitcount.html int popcount(int bits) { bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555); bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333); bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f); bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff); return (bits & 0x0000ffff) + (bits >> 16 & 0x0000ffff); } class DoubleOrOneEasy { public: int minimalSteps(int a, int b, int newA, int newB) { int kake = 1; int ksum = 0; int ans = INT_MAX; while (a * kake <= newA && b * kake <= newB) { int remA = newA - a * kake; int remB = newB - b * kake; if (remA == remB) { int tmp = ksum + remA / kake + popcount(remA % kake); ans = min(ans, tmp); } kake *= 2; ksum++; } return ans == INT_MAX ? -1 : ans; } };
解いた問題をブログに上げるというのを初めてやってみたところ、意外と書くのが面倒で解説はもはや分からせる気も厳密に書く気もない感じになってしまった。
この問題はなんとなく競プロしようと思って最近の問題から適当に選んだけど、久しぶりに(自分にとって)やるだけじゃない問題を解いた気がする。
SRM Div1の問題を提出したのは初めてかもしれない。TopCoderとCodeforcesは今までほとんどやって来なかったのでどんどんやっていきたいなあ。
(操作ミスで記事を消してしまったため再投稿です)
優秀な同世代の仲間を見つけよう
この記事について
中高生プログラマ Advent Calendar 2015 6日目です。
どうも皆さん。とさか2です。高校3年生をやっています。
「中高生プログラマ」という肩書の中では一応年長者(このアドベントカレンダーでは高専4,5年生の方も参加していますが)なので、今までの経験から、まだまだ中高生をやっていられる優秀で有望な皆さんに向けて伝えたい的な記事です。あまり技術的な話はしません。
自己紹介
この企画は学生間の交流を兼ねてるらしいので、自己紹介をします。
一番得意な言語はC#です。開発と競技プログラミングをしてます。コンピュータ部の部長を務めていたりもしました。CTFはあまりやってませんが、scryptosで準メンバー的に何回か参加してました。
他の分野だとゲームAI・機械学習・ヒューリスティックアルゴリズムの勉強をしたりコード書いたりしています。
CombGigでは一応運営側として参加してたので、そこで会ったことがある人もいるかもしれません。
twitterは@nanTosaka2です。( 諸事情あって鍵がかかっています。もう少ししたら外すかも。 鍵外しました)
本題
皆さん御存知の通り、一口に「プログラミング」と言っても様々な用途があります。
それに伴い、プログラマのコミュニティも用途ごとに形成されています。特に最も人口が多い「ソフトウェア開発」に関しては、使用言語やフレームワークなどでそれなりに強くコミュニティが分断されています。
それ以外の要素として、所属組織や住んでいる地域によって分けられることを考えると、各々が所属するコミュニティは必然的に小さくなります。
さらに、開発コミュニティは平均年齢が高く、中高生が同世代と同じコミュニティで出会うというのはなかなか難しいように感じます。
結果として、同世代の中で自分が一番優秀なのではないかという気がしてくるのがよくあるパターンです。
それはそれで幸せな生き方だとは思います。しかし、技術力を上げるという観点から見ても、「自分が一番優秀だ」というのが思い込みだった場合、早めにそれに気付いた方が良いでしょう。
勘違いをしていなくても、優秀な同世代の仲間がいたほうがモチベーションが上がると思います。さらに言えば、将来的に有用な人脈になるかもしれません。
というわけで、ここでは優秀な同世代の仲間と出会う方法について書いていきたいと思います。
1.twitter
すべてはtwitterのアカウント作成から始まります。 以下で紹介する方法で出会った人と繋がりを保つにはtwitterが一番です。 また、ある程度繋がりが広くなってくるとtwitterを通じて新しく知り合うことも出てきます。 アカウントを持っていない人は絶対に作りましょう。
2.セキュリティ・キャンプ
セキュリティ・キャンプは、合宿形式の情報セキュリティ技術に関する勉強会です。
大学生以下対象なので、一度に大量の同世代の人々と出会うことが出来ます。参加者は、セキュリティに詳しくない人でも、別のコンピュータ技術分野には精通している人であることが多いので、そのつもりで交流すると良いでしょう。
参加のためには選考を通る必要がありますが、それさえ通れば交通費含め全額無料で参加できるので最高です。
夏に一度ある全国大会以外にも、地方大会が行われているそうなので、地方の方はまずそちらに参加してみてもいいでしょう。
3.競技プログラミングの大会への参加
競技プログラミングは、「アルゴリズム」の設計と実装の能力を競うプログラミングを使った「競技」です。与えられた問題を解くプログラムを作成し、提出すると機械的に採点され、それの結果に応じて順位が付きます。
プログラミングコンテストと呼ばれることもありますが、アプリケーションを作成して提出するもの(U22プログラミングコンテストなど)とは全くの別物です。
順位がつくので強さがはっきりと分かります。初めたばかりの頃は上位陣の圧倒的な実力に驚かされるでしょう。
一応書いておくと、これはソフトウェア開発とは非常に異なるものなので、プログラマだからといって競技プログラミングが出来なければいけないわけでは決してありません。
しかし、プログラミングと深い関わりを持ちながらも、開発ではあまり触れることのない「アルゴリズム」を身をもって体験できるので、一度くらい取り組んで見るのが良いと思います。練習を重ねると実装速度が上がるので、開発にも役立ちます。あと単純に面白いです。
中高生向けの大会では以下の三つが有名です。
以下の全ての大会では競技時間とは別に懇親会等の時間が設けられているので、勝ち上がったら存分に交流することが出来ます。
1. 日本情報オリンピック
2. パソコン甲子園 プログラミング部門
3. SuperCon
日本情報オリンピックは予選で勝ち上がると関東にある会場に集められ本戦を行い、そこで20位以内に入ると代表選考合宿に参加できます。さらにそこで3位以内になると、日本代表として、海外で行われる国際情報オリンピックに参加できます。ここでかかる交通費や宿泊費等は全て無料です。最高。
パソコン甲子園の本戦は会津大学で行われます。勝つとガッツリ賞金をもらえます。
SuperConの本戦は大阪大学と東京工業大学で行われます。この本戦は独特で、 スーパーコンピュータ上で行います。スパコンプログラミングは通常のプログラミングと異なる部分が結構多いので、結構面白いです。
ちなみに、以上の三つで結果を残せば大学受験で有利になったりもします。参加しない手はないな!
中高生向けの大会以外でも、様々なコンテストが開催されています。国内だとAtCoderが有名です。社長は@chokudaiさんです。
基本オンラインですし、参加費も無料なので気軽に参加してみましょう。
「競技プログラミングをしている」というだけで結構簡単に繋がりが広げられると思うので、おすすめです。
4.JOI夏季セミナー
夏期セミナーは先述の情報オリンピックを開催している団体が開いている合宿です。書類選考はありますが、競技プログラミングが出来なくても参加できます。
情報科学に関連する本を読んで演習(実装)したり講義を聞いたりします。これは参加者も扱う内容もレベルが高いです。
僕は日程が合わず一度も参加できなかったのでものすごく後悔しています。皆さんは後悔の無いようぜひ参加してください。
5.中高生向け勉強会
中高生向けの勉強会に参加するか、皆さんの手で開催してください。様々な人と交流できます。
CombConfやCombGig・Comb Meetup等の前例があります。
開催のノウハウは@mt_caretに相談すれば喜んで教えてくれると思います。お気軽にどうぞ。
僕はもう中高生では無くなりますが、次の開催者が現れることを期待しています。
以上です。
これらのイベントに参加する際は、名刺を用意しておくのが一般的なので、作っておきましょう。twitterのハンドルを書くのを忘れずに!