PG BATTLE 2023 「企業の部」4位に入賞した、ナビタイムジャパン『ヒューリスティック完全に理解したい』チームの皆様にインタビューを行いました!
企業の部4位入賞チームには、Prizeスポンサーであるサイバージムジャパン様からのご厚意で「サイバージムトレーニング券(各国のハッカーと対決する券)」の個別賞が贈呈されました。サイバージムジャパンの田中様にもご参加いただき、PG BATTLEはもちろん、トレーニング当日の様子や興味深いお話をお伺いしましたので、ぜひご覧ください!
●PG BATTLE 2023 ホームページ
https://products.sint.co.jp/pg_battle_2023
●PG BATTLE 2023 X(旧Twitter) まとめ
https://togetter.com/li/2256146
ナビタイムジャパン『ヒューリスティック完全に理解したい』チームのご紹介
※みなさんもおなじみの会社のロゴを背に、4位のポーズでキメてくれた『ヒューリスティック完全に理解したい』の3名様!なんと2018年の初回から、同じメンバーで毎年参加してくださっています!
(左) 加藤亮吏氏:ましゅまろ担当
(中) 植木修人氏:せんべい担当
(右) 藤倉恭太氏:かつおぶし担当
『ヒューリスティック完全に理解したい』チームはPG BATTLE 2023「企業の部」最多188チームの中で、4位に入賞されました。合計点:260点/280点、タイム:147分42秒/180分※という好成績は、全361チーム中16位という素晴らしい結果となっております。
(※PG BATTLE 2023は、「せんべいの4問目の得点」および「せんべいの解答時間」が順位集計の対象外のため、満点は280点、合計解答時間は180分となっております。詳細はこちら)
インタビュー:PG BATTLE 入賞までの道のり
PG BATTLE 2023の4位入賞、そして「各国のハッカーと対決する券」の獲得おめでとうございます!また、2018年の初回から参加していただきありがとうございます!参加の経緯を教えてください。
(加藤) 最初は植木に誘われて参加したのがきっかけです。そこから毎年PG BATTLEの季節が近づくと、3人のうち誰かしらがやりましょうという話を切り出し始めて…。
(植木) やばい、そろそろ締め切りが近い!という感じでエントリーしています。
(藤倉) 私も植木に誘われて参加しはじめました。2018年は2位だったのですが、そこから上位入賞を果たしてないので、今年こそは3位以内に入賞するぞという意気込みで毎年参加しています。
当日までの練習方法は?
(加藤) PG BATTLEのための特別な練習はしていません。ましゅまろ担当なので速解きの練習をしようとは思っていましたが、結局練習せずに本番を迎えました。ただ、TOPSICのシステムが変わっていないか確認はしました。
(記者) 参加するにあたり、意気込みなどはありましたか?
(加藤) 30分以内で全問解く意気込みでした。昨年はケアレスミスをして1問解けなかったので、同じミスをしないよう手元でテストケースを作り、確かめてから提出するようにしました。
(植木) なるべく速く沢山解くことを心掛けました。せんべいの4問目は毎年難しいので、それに向けて少し難しい問題に触れる機会を増やすようにしました。また一発提出によるミスや保存のし忘れに気を付けるなどのチェックリストを準備しました。
(藤倉) PG BATTLE向けの練習はしていませんが、毎週AtCoderのコンテストに出たり、過去問を解いたりしています。
プログラミングや競技プログラミング(以下競プロ)を始めたきっかけは?
(加藤) 小学生の時に授業でBASICに触れたのが最初のきっかけです。興味があったのでそこから細々とプログラミングを続けて、モノを作ったり動かしたりし始めたのは中学生になってからです。競プロを始めたのは大学院生の時ですね。就職を考えた時にプログラミングで仕事をしたいと思ったのですが、いきなりモノを作るのは難しいので競プロを始めました。
(植木) 中学生の時にプログラミングに興味があったのでC言語の入門書を購入したのですが、理屈は分かるけど黒い画面に文字が出てくるだけでゲームとか作れない、面白くないなと感じました。競プロの存在を最初に知ったのは大学1年生の時です。競プロをやると単位がとれる授業があって、それに参加したのがきっかけです。ただその時は夢中になるまでにはいたりませんでした。大学3年生の時に情報科学科に配属になったのですが、そこが日本一競プロの強い人達が集まる魔窟みたいなところで。同級生に赤コーダーが何人もいるという環境だったので、そこで自分もつられてやり始めてハマっていった感じです。
(藤倉) 中学生くらいの時にプログラミングの本を読んだのがきっかけです。ただ当時は本格的に取り組んでいなくて、ちょっとしたツールを作る程度でした。大学は情報系の学部ではなかったのですが、4年生の時にプログラミングのアルバイトを始めて、そこで勉強しました。競プロを始めたのは、社会人になってからです。Rustの勉強をしていた時、何か題材がほしいなと思い、競プロでRustを練習していたのですが、少しやってずっと放置していました。その後、社内のサークルで植木が競プロの話をしているのを聞いて楽しそうだなと思って、再開して本格的にやり始めました。
(記者) プログラミングに数学の知識は必要だと思いますか?必要ないという意見も見られますが…。
(藤倉) 競プロだと一定の数学力は必要かなとは思います。実務だと必ずしも必要ではないと思いますが、数学力があった方ができる範囲は広がると思います。
プログラミングの勉強方法は?
(加藤) 自分がやりたいと思うことを調べて実践しています。本を読むのがあまり得意ではないので、強い人や詳しい人から話を聞いて知識や考え方を吸収しています。
(植木) 本来は「作りたいモノがあるから作る」というのがプログラミングの王道だと思いますが、私にはそれが特になくて。そういう作りたいモノがない人は、既にテーマが与えられている競プロをやるのもいいと思います。例えばRustを勉強する時に、簡単なものでもいいので毎日必ず1問でも競プロの問題を解く。私はそれをずっと続けているのですが、おかげで基礎文法などが理解できるようになりました。ただ、設計やコアな機能の開発になると、実務に強い人に聞いたり、実際にそういった人が書いたコードを確認したりという作業が必要になると思います。
(藤倉) 意識してプログラミングの勉強はしていませんが、気になったことがあれば「とことん調べる」ことを繰り返しやっています。それ以外では、例えば新しいプログラミング言語を覚える時は、そのドキュメントをひたすら読むことが多いです。もちろん要所要所で気になったところは実際に書いてみて動作確認をしますが、とりあえず全部読むので実践重視というよりドキュメントを重視するタイプです。
初心者がアルゴリズムに強くなる方法は?
(加藤) まずは楽しむことが大事だと思います。自分で楽しいものが分かると継続できるだろうし、次に何をするか考える余裕も生まれてくるので。具体的に何をするかというと、「知っているもの」を増やすことと「使うことができるもの」を増やすこと。この2つが大事だと思います。やり方は色々あると思いますが、本やブログを読んだり話を見聞きして「知っているもの」を増やしたり、実践して「使うことができるもの」を増やしたり。自分は今その2つのうちのどっちをやっているのかなと、楽しみながらやっていくといいかなと思います。
(植木) 続けることが一番大事だと思います。だから、しんどいと思う時は、やらなくても大丈夫なんだと思えるといいですね。例えば蟻本(プログラミグコンテストチャレンジブック)だと、特に動的計画法のところは図解されても発想を頭に入れるのはなかなか難しいことがあります。本を買ったからよしやるぞ!とやり始めても、分からなくなった時に止まって挫折してしまうと勿体ないので、その時は飛ばして別の分野にいっても、各分野は独立しているので大丈夫。分からないところを一旦飛ばしても、続けることの方が大事なので。とは言え、自分が分かっていない概念を1日とか時間をかけてすごく悩んで理解する経験も、どこかのタイミングでできるといいんだろうなと思いもしますが、それは心身に余裕がある時に出来たらいいという感じですかね。あとは、出られるだけコンテストに出るといいですね。競プロ以外でも思っていることですが、同じ経験をしても、それについてどれだけ考えたかということで得られる経験値は変わってくると思います。解けなかった問題の復習をしてみるとか、解けた問題でももっと速く解答できなかったか、もっと分かり易く書けなかったかとかそういうものを見ていく。例えば15分で速解きできたと思った問題でも、8分で解いている人がいたらその差は何なのか、そのコードを覗きにいくとか、そういう風にしっかり復習していくと復習しない人とは差がついていくと思います。
(藤倉) アルゴリズムというか競プロが強くなるという観点だと1点目は最近のコンテスト、特にAtCoderでは要求される典型知識の量が非常に増えてきていると感じるので、演習あるのみだと思っています。蟻本などの参考書でいろんな典型知識を学んだり、過去問を解いたりするのがいいかなと思います。もう1点は若干相反するのですが、新しいテクニックや動的計画法を学んだ時に表面だけ理解するのではなく、どうしてそうなるのか、どうしてそういう風にして解けるのかをしっかり理解しながら1つずつものにしていくと応用も利くし、実力もつくと思います。
※ナビタイムジャパン様の社内から見渡せる素晴らしい景色をご覧ください!
PG BATTLE当日はどうでしたか?
(加藤) ましゅまろの3問目が、2進数と10進数が与えられて値の大小を比較する問題で、Pythonで解くと有利な問題のように思われたのですが、実はPythonの最近の仕様変更で、一定の長さ以上の値を扱うとエラーが発生するようになっていました。私はテストケースで最大ケースと最小ケースで試して失敗したのを見て、そういえばこんな話あったなと思い出して修正できたので、本番での失敗は逃れました。コードテストはローカル環境だとバージョンの差で動きが違ったりするので、ちゃんとWeb上で確認しました。昨年と同じミスは絶対しないという意気込みでちゃんと通せたところが、当日印象に残ったことでした。
(藤倉) PG BATTLEはAtCoderとは違って、提出してからじゃないと結果が分からないので、事前にコーナーケースに注意するなど、強く意識して気を付けていました。
(植木) 個人的には一発提出は面白いと思っています。今回私は結構失敗しまして、3問目までは10~15分で解けたのですが4問目で苦戦しました。上手いまとめ方がなかなか思いつかず、15分ぐらい考えた時にこれはちょっと難しそうだなと思ったのですが、そこから更に30分ぐらい粘って考えてしまって。結局諦めて60分で提出したので、もうちょっと早く見切りをつけた方がよかったなと。今回のせんべいの解答時間はノーカウントになったのでおかげで助かったんですけどね。(苦笑)
(藤倉) 満点を目指して臨みました。3問目まではよかったのですが、4問目がどうしても解けずとても悔しかったです。今回ありがたくも4位をいただけましたが、3位以内に入りたかったですね。X(旧Twitter)を見ていても、かつおぶしの4問目を解けている人は多かったので、難易度的にも上位入賞を目指すなら解けているべき問題だと感じているので、本当に悔しかったです。
PG BATTLEに参加してよかったことや反省点はありますか?
(加藤) 一発提出方式、個人的にはいいなと思っています。難しい問題に当たった時、粘って解いた方がよいか、すぐに諦めた方がよいかを上手く判断する必要があるのですが、そのためには自分の実力の把握と問題の難易度を瞬時に判断する力が必要で、そこが他のコンテストと違っていいなと思います。そんなこと言いつつも私はましゅまろ担当なので、全問解く以外の選択肢がないのですが。(笑)反省点としては、満点で30分を切りたかったのですが、57分かかってしまったことです。
(植木) 年に1回、他の競プロとは違う特殊な要素もあり、上手く嚙み合えば上位も狙えるところが楽しくていいですね。初回の2018年は2位に入賞してRaspberry Pi(ラズパイ)を頂けて、それが今自宅でNAS(Network Attached Storage) として働いています。ありがとうございます。(笑)あと、家庭の事情でAtCoderなどの土曜夜のコンテストに基本出られないのですが、PG BATTLEは昼間開催で参加できるのでありがたいです。反省点としては、失敗すると戦犯みたいな感じになってしまうのが申し訳ないなと思うところです。あと、初回からずっとこの3人で参加しているのですが、せんべいとかつおぶしの担当が途中から入れ替わっているんです。チームメンバーが自分よりも強く成長して、嬉しいなと思っています。
(藤倉) 個人のコンテストだとまだ上位が狙えないのですが、チーム戦だと狙えることですね。反省点は、4問目が解けなくて悔しかったことです。自分の中で競プロ熱の波があるのですが、今回のPG BATTLEの時期はその熱が下がっている時でした。対策せずに受けたので、ちゃんと熱を上げて過去問を解いていたらよかったなと反省しています。
PG BATTLEの相談禁止ルールについてはどう思いますか?
(加藤) どちらでもいいかなと思います。相談なしだとそれぞれがベストを尽くす必要があるので大変ですが、それはそれでいいものだと思っています。
(植木) 相談禁止の方が普通かなという印象はありますが、相談ありにすると、チームメンバーの一番強い人とチーム成績の相関が強くなると思います。相談ありと相談禁止で年2回開催して頂くと面白いかと…。(一同大爆笑)
(藤倉) 相談禁止の方がやりがいがあるのかなと。チーム内で実力差が大きいと、強い人だけ頑張るような状況になった場合、強くない人はつまらなくなってしまうような気がします。
競技プログラミングは実務にどのようなメリットがあると感じられますか?
(加藤) 多くはないですが、競プロで出てきたアルゴリズムを実務で使うことがあります。検索システムなどでは文字列検索のアルゴリズムとの関連が強く、背景知識を調べたりすると競プロで見たことがある話が出てきて、面白いなと思いました。
(植木) 高度なアルゴリズムの知識が完全に当てはまることはあまりないので、たまにあった時はとても嬉しいですね。競プロをやるとプログラムと戯れる力、つまりデバックやコードを読み解く力が付いてくると思います。また人の書いたコードを読んだりすることで、バグりそうな部分に気を付ける力も付いてきます。アルゴリズムというよりプログラミングの地力が付くというところで、役に立つのかなと思います。
(藤倉) アルゴリズムだけではなく問題の性質を見極めるのも大事で、それらを踏まえてコードに落とし込んでいく力は実務でも共通する部分だと思います。なので、プログラマーとしての基礎体力は鍛えられると思います。また、コーデイングスピードも競プロだと重要になるので、実務でも速く書けるようになっているのが役に立っている部分かと思います。
チーム名『ヒューリスティック完全に理解したい』の由来は?
(藤倉) 今年のPG BATTLEがAtCoderのヒューリスティックコンテストの開催時期と被っていたので、そちらも頑張るぞという意気込みを込めて付けました。チーム名は毎年ものすごく悩んで付けています。
結果発表はご覧になりましたか?
(加藤) 昨年は見たのですが、今年はリアルタイムでは見れていないです。ごめんなさい。(笑)
(藤倉) 4問目が解けなかったので、入賞は無理だなと思って見ていませんでした。
(植木) 私は、毎年とてもソワソワしなから見ています。
(記者) ありがとうございます!
●PG BATTLE 2023 結果発表会
インタビュー:ハッカーとの対決
サイバージムジャパン様からのご厚意で「各国のハッカーと対決する券※」を獲得されましたが、ハッカーと対決すると知っていかがでしたか?
(加藤) 嬉しかったのですが、セキュリティに関してど素人なのに対決していいのかな?と結構不安でした。過去の4位の入賞者のインタビュー記事を見ると、とにかくハッカーにやられてしまったという内容だったので、ドキドキしました。
(植木) 4位、ハッカーじゃん、やったね!と。セキュリティは少しだけCTF(Capture The Flag)をやっているのですが、なすがままにボコボコにされるんだろうなと思いました。あと、毎年企業の部4位はインタビューがあるので、インタビュー受けるのかなと気になっていました。
(藤倉) え?ハッカー?どういうことやるんだろう、と不安でした。
(※「各国のハッカーと対決する券」とは、サイバージムジャパン様のトレーニングプログラム「Cyber-Threats and Defense Essentials」のこと。実際のサイバー攻撃を受け、複数の検出・監視ツールを駆使してサイバー攻撃を検出し、その分析を行うためのスキルを習得するのが目的。トレーニング期間は事前座学と当日実践の2日間。『ヒューリスティック完全に理解したい』チームの皆さんは防御側として、攻撃側のサイバー攻撃に立ち向かいました)
ハッカーとの対決当日の様子を教えてください。
(加藤) 事前に講義の動画を見て、当日参加しました。初めて使うツールがあったのですが、実践直前の講義でも丁寧に教えていただきました。当日は他社の方と併せて10人ぐらいのグループを組んで、その中で検知をするチームと、何をされたかを調べるチームに別れました。私は調べるチームにいて、何かが起こったらチームリーダーに報告して、リーダーの指示に従う感じでした。正直何も分かっていないので、これも報告した方がいいのかな?と思いながら、とにかく報告していたら、ズレた報告をしてリーダーを困らせたこともありました。(笑) 最終的には攻撃されて何もできなかったのですが、講義で説明してもらったツールを使って、悪意のあるプログラムが何をしているのか分かったんです。あと、最終攻撃を受けたらPCの操作ができなくなって終了になるのですが、実は我々3人ともう1人がその攻撃を回避していたんです。
(記者) すごいですね!
(加藤) なぜ回避できたかというと、それが不審なプログラムだと共有されていたので、止めていたんです。ですが、その後の感想会でそれは危険な行為だと教えてもらいました。PCがフリーズしてしまうと実際に動いていた時のデータがなくなって不利になるので、ネットワークを遮断して担当者に報告することが大事だと教わりました。
(記者) なかなか熱い戦いでしたね!
(植木) 個人戦ではなく全員が同じチームで、他の参加者は業務で参加しているようだったので、迷惑をかけてしまわないか心配でした。講義は分かり易く、実際手も動かして為になりました。私は攻撃を検知して報告するチームだったので報告するのですが、その先は何もできない状態でした。攻撃についてある程度理解できていると、こういうことが起きたら次はこの辺が怪しい、この辺のアクセスを遮断したほうがよい、といった考えになると思うのですが、その辺の流れや定石みたいなものを全く知らないので、なすがままでした。そういう知識が付いてくると、ゲーム戦としては競プロとそんなに遠くないのかなと思いました。典型を沢山知っていると難しい問題が解けるように、競プロだったら問題文の性質から見るものが、攻撃だったらその動きみたいなものからやるべきことの当たりをつける、そういう面白い世界なのかなと思ったりしました。最初の攻撃のとっかかりになったところが、非常に有名なXSSとかSQLインジェクションの脆弱性で、そこから初手の侵入が始まったので、そこは本当に馬鹿にできなくて。当たり前なんだけど大事なんだなと感じました。
(藤倉) 当日はほぼ何もできなくて、たまに変な挙動があったら報告するぐらいでした。セキュリティツールの使い方などは直接実務で使うわけではないですが、教訓が得られたと思いました。というのも、侵入される糸口がXSSの脆弱性だったのですが、普段の業務においても脆弱性を作らないように心掛けていても、実際どういう風に攻撃されるのかの具体的なイメージがついていませんでした。ですが、実際に攻撃を体験してイメージが付いたので、脆弱性には気を付けないといけないなという意識がより強くなりました。最初は不安でしたが、トレーニングを受けてよかったです。
(サイバージムジャパン) おそらく業務では使われることのないソフトを、みなさんには今回初めて学んでいただき、ハッカーとの対決を体験していただいたのですが、業務でも活かせられるところがありそうだというお話をしていただいて、それが私としては一番嬉しいことでした。弊社のトレーニングで攻撃しているのは本物のハッカーで、みなさんのレベルや動きにあわせて、仕掛ける内容やレベルを毎回変えて行っています。みなさんに体験していただいたのは防御側のチームですが、教える側のチームも攻撃する側のチームも、4位の企業の皆さんが来るのを毎回とても楽しみにしています。というのも、セキュリティ関連の部門から受講される人とは絶対違う動きをどこかでされるんですね。視点が違うので、王道ではないアプローチが毎年垣間見られ、面白いそうです。当日みなさんを担当した講師が、普段自分達が使っているセキュリティソフトも、アルゴリズムをよりよくすれば、もっと速く動いたりもっといろんなことができたりするんじゃないかと思っているので、そういう観点でぜひお話してみたかったと言っていました。
PG BATTLE 2024も開催予定です。参加していただけますか?
(加藤) もちろん参加したいと思っています!社内で他にも競プロをやっているメンバーがいるので、誘ってみるつもりです。
(植木) 是非出たいなと思っています。
(藤倉) 来年こそは3位以内に入りたいです!。
※本文中では敬称を省略させて頂きました。また記事内容は取材当時(2023年12月)のものです。
最後に
お忙しい中インタビューに参加して下さったサイバージムジャパン様、『ヒューリスティック完全に理解したい』チーム様、誠にありがとうございました!チーム名は毎年変えつつも、2018年のPG BATTLE第1回目から同じメンバーでずっと参加してくださっている、大変ありがたい全バトル参戦チームの3名様!このような貴重なチームの皆さまに会えるということで、我々はインタビュー前からとてもわくわくしていました。インタビュー中もとても真摯に沢山お答えいただき、素敵なお人柄が伝わってきました。来年はどんなチーム名で参加してくださるか、今からとても楽しみです!みなさんもぜひ予想してみてください!
PG BATTLE 2023「企業の部」には全体で最多の188チーム(564名)の皆様にご参加いただき、誠にありがとうございました。飛び賞(スポンサー賞)も充実しておりますので、我こそは!と思われる方はぜひご参加をお待ちしております。
●PG BATTLE ホームページ
https://products.sint.co.jp/pg_battle
- カテゴリ:
- PG BATTLE
- キーワード:
- プログラミングコンテスト
- PGBATTLE