This page is intended for users in Japan(English). Go to the page for users in United States.

ハイスコアコード付き!コードゴルフ大会を振り返る座談会を上位入賞エンジニアで行いました!

皆さんこんにちは。

この度、エンジニアが主体となって、第2回コードゴルフ大会「令和記念」を開催しました!

コードゴルフとは「与えられたアルゴリズムを、可能な限りもっとも短いソースコードで記述する」競技プログラミングの一種です。2017年に第1回を行いましたが、その時よりも10名以上エンジニアも増え、層も厚くなっていることもあり満を持しての第2回を実施しました!

経緯や問題の詳細はこちらの記事をご覧ください。


想像以上に大変盛り上がり、重複投稿を除いて32件の投稿が集まりました。そんな大会結果はこちらになります!


そして、今回は上位入賞者を中心としたメンバーに集まってもらい、企画した開発責任者の土田を含めた5名で振り返りました。いいエンジニアの仕事振りとコードゴルフのハイスコアにどのような関わりがあるのか。

ぜひ最後までお付き合いください!それでは早速ですがどうぞ!

振り返り座談会スタート!

まだお昼のためお酒はないですが、なくても同じくらい盛り上がっていきたいという心強いコメントで座談会は始まりました。



大盛り上がりだったコードゴルフ!

土田:コードゴルフ大会、思った以上に盛り上がりました。

4月からGW明けまで約1ヶ月弱、途中で熱が冷めるかと思いましたがそんなことはなく、最終的に合計32本のエントリーをいただきました。皆さんはいかがでしたか?

高橋:楽しかったですね。でも、自分はガチで短く書くことからは逃げてしまいました(笑)なので、誰もやらないだろうなという言語で書きました。Erlang、Elixir、Clojureなどで書きました。個人的には一番楽しんだのは内藤さんかなと思います。

内藤:やってみると思ったより深い問題で楽しかったですね。いろんな問題の解き方があるんだと発見が多かったです。

野田:私は皆さんと違い、事業企画チームに所属しているエンジニアという事もあって席も離れていますし、社内で個別に誘ってもらって参加しました。かなり楽しめたので、誘ってもらってよかったですね。

木村:私は言語仕様を利用して短くするというより、アルゴリズムでどうにかしようと楽しみながら取り組みました。

土田:楽しみ方は少し違いますが、皆さんからもそういった言葉が聞けてよかったです。

コードゴルフ初挑戦の方も。どんな学びが?

高橋:コードを見る中でも、 Ruby はいろいろな工夫を凝らした書き方があり、面白かったです。私はせっかくなのでと業務では使わない Elixir で書きましたが、パターンマッチや関数型っぽい機能を使う機会はあまりありませんでした。

野田:こんな書き方があるんだという発見はありましたね。あとは、今回コードゴルフがどういうものか調べるためにいろんな課題の実装例を調べてみたら、いろんな実装アプローチがあってとても面白かったです。


内藤:Javaでやったときは検索しましたね。特に、 class じゃなくて interface でやる方法は調べないとわかりませんでした。 interface は暗黙の public なので、アクセス修飾子が要らなくなるなど。業務だとさすがに役には立たなそうですけど(笑)

土田:皆さん、結果として開発言語の仕様をかなりしっかり勉強していたのは面白かったですね。

木村:内藤さんの C++ のコードは面白かったです。特に、0を数えてから三角形を書くのではなく、三角形を書いてから0を数えるのは見ていて楽しかったですね。

土田:なるほど、そうだったんですね。確かに、ロジックでいかに短くするか、という取り組みだと内藤さんは特に工夫をされていて面白かったですね。

内藤:JavaScript で書いたときは、1 と undefined を XOR するとか、1 + true は 1 + 1 になるとか、その辺りを前提とした細かな工夫はしました。

他にも JavaScript は配列を勝手に拡張してくれるという強みがありますし、変数の宣言もつけなくていいですし。var を書いたら負けだという強い気持ちで実装していました。

JavaScript(62文字)

for(p=[x=z=1];z<2015;)for(i=x++;i;z+=!(p[i]^=p[--i]));print(x)

土田:一方で木村さんはアルゴリズムをどうやって一般化するかという方針でしたね。

木村:そうですね。でも最初はアルゴリズムを工夫していこうというような方向ではなかったんです。Javaで書いていたんですがどうしても短くならなくて、0を数えて、その間に1を置くだけなら、もっとうまい方法があるんじゃないかと思って考えていました。

主に家でコードを印刷して、壁に貼って、ビール飲みながらぼけーっとしながら考えていました。

土田:どっぷりじゃないですか!(笑)

自分もいろいろ考えたのですが見いだせなくて。そんな中、序盤に木村さんが提出したコードがJavaで150文字くらいで、序盤の提出者だとダントツで短かったんです。最終的にはJavaで129文字という、Javaにおいては他を寄せつけない結果を見せつけてくれましたね。言語の仕様などを用いたテクニカルな上手さではなくて、全く違うアルゴリズムで実装されていて、やられた感がありました。

Java(129文字)

class G{static public void main(String a[]){int s=0,n=0;while(s<2014)s+=1-Math.pow(2,Long.bitCount(n))+n++;System.out.print(n);}}

業務では触れない言語を使うということ

土田:そういえば、最初は業務で使っているJavaやScalaが中心でしたが、途中からみんないろんな言語で出してくれるようになったので面白かったですね。代表例だとErlang、Clojure、Haskell、Bash、Elixir、Prolog、Common Lispなどですね。

その中でも、衝撃的だったのは(高橋)栄行さんですね。Elixir や Clojure などは恐らく、若手エンジニアだと触ったことはもちろん、知らない人もいるのではないでしょうか。なんでこの言語に取り組もうと思ったんですか?

高橋:まず Erlang を業務でやってみたので、 Erlang のVMで動作する Elixir を合わせてやってみるかと思って取り組みました。その後、 Elixir の他にないかな、と探していた中で Lisp を狙っていたのですが、内藤さんがすでに Common Lisp で出されていました。なので、JVMの上で動作する Clojure なら Java っぽくかけるので「できるかな?」という感じで書きました。改めていろいろな開発言語に触ることができて、それぞれの仕様など確認できたのは良かったです。

土田:内藤さんは第1回でもいろんな言語で書いてくれたので、正直期待していたんですが、今回は内藤さんに加えて(高橋)栄行さんも負けずに準メジャー言語で書いてくれたのは盛り上がりのきっかけになって良かったですね。

ただその影響で、全てのアルゴリズムを理解するのが大変、主催者泣かせでしたね(笑)皆さんアルゴリズムは大体一緒なんですが、内藤さんの JavaScript や木村さんのアルゴリズムはかなり特殊でした。むしろ、普段使わない言語の Clojure や Erlang で書かれていても、アルゴリズムがオーソドックスだと大丈夫でしたね。

本戦の振り返り

土田:提出が一番早かったのはPONさん(https://www.wantedly.com/companies/www-a-saas/post_articles/170653)なんですよね。開始初日の夜に提出してくれました。その後は舘さん、上村さん、内藤さんと続いていきましたね。ちなみに最終の投稿は5月7日の内藤さんでした。

問題を持ってきた本には、配列で組むパターン、bit演算で定数の条件を拡張する形の例が載っていました。でも、木村さんの更に一般化した形で設計されたアルゴリズムは凄かったです。もしかしたら、最強の回答例は、「木村さんのアルゴリズムをRubyで書く」ではないかと思います。

内藤:実はですね、さっきまた新たに書いてみました。

結果としては54文字でした。コードはこちらですね。

Ruby(54文字)

s=n=0;s-=2**(("%b"%n).count"1")-(n+=1)while s<2014;p n

土田:おー!内藤さんの戦いはまだ終わってませんね(笑)もっとコードゴルフに相性の良い言語を選ぶと、もう少し短くなるかもしれないですね。FlogScriptやGolfScriptとか。

コードゴルフで垣間見えた、いいエンジニアに必要な力

土田:そういえば、始めたての人とベテランだと差がだいぶ出ますね。

やはり、ある程度の経験者だと、言語の仕様からアルゴリズムまで考えられているなと感じます。あとは本人の性格が強く反映されますね。

木村:結局パズル好きということなんですかね。私もつい考え続けてしまいました。

あとは、出力した図形に美しさを求めてフォント変えてみたりとか。楽しみながら、細かいところまでこだわってしまうような性格というのも関係あるかもしれませんね。

土田:コードゴルフが上手い人の共通点は考えることが好き、パズルが好き、ということでしょうか。

木村:あとは負けず嫌いだったり、折れない心をもっていることでしょうか。

土田:たしかにそれは大事ですね!(笑)それでも、どれだけ考えても及ばないのはなんででしょうね。


高橋:あとは経験に基づく発想力になりそうですね。若手のエンジニアだと、ビットシフト演算が出てくるかどうかが一つの分かれ目かなと思います。

木村:せっかく発想が湧いても、知識が不足していて、コードに落とせないこともあります。結局はそのバランスなのかもしれないですね。

土田:コードゴルフで測れるエンジニアとしての優秀さは、発想をどれだけコードに出来るか、ということに尽きるのかもしれないですね。

主催、土田の振り返り

第2回コードゴルフ大会「令和記念」の座談会はいかがだったでしょうか?メンバーの感想を聞いて一緒に楽しんでいただけたようであれば幸いです。

主催者としてコードゴルフについて思うことを書かせていただくと、コードゴルフといいエンジニアにはある程度相関がありそうだなと思っています。

コードゴルフのようなショートコーディング系の競技プログラミングは論理パズル的な感性が求められると感じているためです。コードゴルフをやるときは、パターンを認識してロジカルに組み立てていく必要があります。システム開発と同様に大局的に見た上で、局所的に最適化する必要があります。やきなまし法みたいなことをやってるわけです。

おそらくこのセンスはエンジニアとしての経験値に比例する、いいエンジニアであるための要件かなと思います。コードゴルフには答えがありません。あと何文字か短くなる可能性がいつもどこかに隠れています。もっと短くなるはずという好奇心と向上心を持ってカイゼン作業に集中して取り組むことはいいエンジニアであるために必要な能力なのではないでしょうか。

実際、いいエンジニアが多くいるであろう Google ではコードゴルフが流行している(いた?)ようです。流行のきっかけになったのは、ジェン・ワンさんが20%プロジェクトの中で社内コードゴルフプラットフォームを開発したことに起因します。詳細は Fore! How code golf became a thing at Google を読んでいただきたいのですが、記事の中でジェンさんは「コードゴルフに秀でていることは、プログラミング言語の専門知識と創造的思考能力の強いシグナルです。」とも話されており、コードゴルフは経験豊かなエンジニアの一側面を描き出していそうです。

その一方、コードゴルフは前提となるスキルを非常に絞った競技プログラミングであるため、初心者に近いエンジニアも参加できるゲームです。プログラミング言語の専門知識と創造的思考能力を育むためにも、若手エンジニアにも積極的に挑戦してほしいと思っています。

今後もコードゴルフのようなイベントなどを通じて、エンジニアリングを楽しみながらも、エーサースのエンジニアとして税理士のみなさまに価値を提供していきたいと思っています。ぜひ、創造的なエンジニアの皆さんと働きたいと思っておりますので、今回の記事で興味を持たれた方は、エーサースにご応募ください。コードゴルフのコード持参での参加も歓迎します(笑)

Mikatus株式会社's job postings
42 Likes
42 Likes

Weekly ranking

Show other rankings