作曲・指導・C言語・Linux

金沢音楽制作

金沢音楽制作では、楽曲・楽譜の制作と、作曲や写譜などレッスンを行っています。


163)ケイプロ必要/不要論

定期的に、競技プログラミングの必要/不要論が盛り上がっている。ぼくは競技プログラミングを否定はしない。しかし、しっかりとしたプログラミングを学びたい人には勧められるものではないと思っている。というのも、競技プログラミングは、アプリケーション開発といった現実的なプログラミングの実際と大きく乖離しているからだ。つまり、競技プログラミングに参加することで、後述するような「悪いクセ」が付いてしまう可能性があるのだ。

競技プログラミングは、競技ということもあり他人よりも早く完成させることが重要な評価点になっている。そのため、動けばよい、という思想でコードを書くことになる。たとえば、scanf()といった非推奨関数を使うのは当然として、不必要なライブラリを大量に呼び出し、#ifndefを介さない#defineによく分からないマジックナンバーを設定する。そして、自作関数も殆ど使わず、main関数の中にすべて処理を書く。ここに挙げたことは、競技プログラミングでは普通のことだが、通常のプログラミングでは到底考えられないことである。

競技プログラミングは、絵のデッサンや音楽の和声法の課題に似ているのではないか、と思うかもしれない。しかし、本質的に大きく異なったものである。デッサンや和声は、とにかく丁寧に作るものだ。基礎を固めると共に、一定の水準を持つ作品として完成を目指している。一方で競技プログラミングは、あくまでもアルゴリズムが完成するまでの速度を競うものだ。率直にいって、それだけじゃプログラミングの基礎は付かないし、作品と呼べる程の強度もないだろう。

よく見かける意見に、やらないよりはやったほうがいい、というものがある。やらないよりはやった方がいい、こんなバカ丸出しの文言をよく書けるなと思う。やらない/やる、が比較になってないことにまるで気がついていない。それとも、競技プログラミングが人類にとって普遍的な価値があるとでも思っているのだろうか(思っていそうだ)。あと、作りたいものがないなら、とりあえず競技プログラミングをすればよい、という意見もよく見かける。これは全くもって意味不明で、プログラミングなんかやめて、別のことに時間使った方がいいですよ。

最後に、競技プログラミングのよい点も書いておきたい。それは、既存のアルゴリズムの学習に適していることだ。既存の、といったが知っているのと知らないのでは雲泥の差があると思う。たとえば、アクセスが集中するサーバーでは、少しでも早く処理を終わらすことは、そのまま利益につながるだろう。そういった場合に、アルゴリズムを少しでも知っている方が有利なのは間違いない(問題の本質を見抜けるかは別)。

追記(2021-06-03):ケイプロでは、C++がよく用いられるのだが、それをもってC++を分かった気になるのは、とても問題だと思う。というのも、オブジェクト指向などどこ吹く風で、古臭い手続き型で書かれているからだ。このようなものはベターCと呼ばれている。

2021-04-20