ぶちのブログ

競プロとCTFが趣味なWebエンジニアのアウトプットの場

Rubyistがc++で競技プログラミングを始めて良かったこと

はじめに

業務ではほぼRubyしか使っていない僕(AtCoder緑)が、c++競技プログラミングを始めたところ、c++に触れておいて良かったと思う出来事があったので、ポエムにして共有します。

経緯

大学の講義ではRubyを触り、講義以外でプログラミングを勉強したときはPythonを書き、インターンでもRubyPythonとJSくらいしか書いていなかったが、ふと競技プログラミングをちゃんと取り組みたくなって、c++で問題を解きはじめました。

(今までも競プロは取り組んでいたが、400-500点問題にスクリプト言語で取り組んでTLEに苦しめられるたびにやる気を失っていたので、ちゃんと始める為にとりあえずc++で書いてみようと思いました)

良かった点

ざっくりまとめると、違うパラダイムの言語を学んだことによって視野が広がったと感じます。そのことを特に実感したのは、以下のような経験をした際です。

業務でとあるデータに対するcreateメソッドを作った際に、createに失敗した際にはfalse、成功した際にはデータのidを返すような実装をしました。しかし、falseとid(int)の型が違うという理由で、レビューで修正されました。

ちょうどc++を書き始めた直後だったので、返り値の型が違うのは確かに問題だと、すぐに納得しました。

もしc++を知らなかったら、理由もピンと来ないままに、メソッドの返り値の型はなんか揃えないといけないんだなぁ程度に丸暗記して、そのうち再び同じようなことを繰り返していた自信があります。

苦労している点

ついでに、c++を書いていて、どんなところが辛いかも書いておきます。

  • 標準ライブラリへの見識不足
  • 整数のオーバーフロー
  • 浮動小数の誤差
  • 関数の型、引数の型への不配慮

それっぽい標準ライブラリは一通りincludeして、とりあえずlong long使って、だましだまし問題を解いています。

関数の型や引数の型についての問題が一番慣れず、たとえば同じ天井関数にもceil, ceilf, ceillがあったりして、よく混乱してしまっています。

今のところは全く体系的に学んではいないので、今後は書籍でしっかり勉強します。

 

逆に、Rubyだったらこう書けるのに、と感じることも多く、Rubyに戻った時にRubyの柔軟さに感動したりもしています。

まとめ

今までは、

という軸でしか考えていなかったが、ソフトウェアの安全性という観点も考える必要があるのかなと思い始めました。つまり、

  • スクリプト言語は、柔軟な書き方ができる分、型に関するエラーを埋め込みやすい。
  • コンパイラ言語は、書く時に頭を使うが、型に関するエラーを埋め込みにくい。

といった方が、本質に近いのではないでしょうか。(実際、競技プログラミング以外の文脈で、Ruby等が遅くて困るということは、あまり多くないように見受けられます)

With great power comes great responsibility.

プログラミング関連の書籍でたまに使われているこのフレーズを噛み締めながら、Rubyを書いていく必要があることを実感しました。

また、複数の言語を学ぶ重要性は、こういった学びの積み重ねにあるのだろうなということにも気づかされました。関数型もちゃんと勉強したい……