give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

パターンマッチ&コピペプログラミングと、塾講師時代の思い出

はじめに

最近ネットを見ているときに知ったのですが、世間には「パターンマッチとコピペ」と呼ばれるプログラミングスタイルがあるそうです。

これはあまり深く考えずに、

困ったらググる
 ↓
とりあえずそれっぽいコードを見つけてコピペする
 ↓
動けばOK、動かなければ他のコードを探してコピペする

という手順を繰り返してプログラムを完成させるプログラミングスタイルなんだそうです。

「パターンマッチとコピペ」というプログラミングスタイルが語られたのは、僕が知る限りこちらのツイートが最初です(もしかすると、もっと昔からあるのかな??)。

このスタイルを良しとするかどうかは人によって意見が分かれるようですが、僕自身はあまり良くない考え方だと思っています。

余談:本来のプログラミング用語としての「パターンマッチ」とは

ご存じの方も多いと思いますが、「パターンマッチ」とは関数型言語でよく使われる言語機能のことです。
たとえば、以下はパターンマッチを使ったF#のコード例です。

type Color =
    | Red = 0
    | Green = 1
    | Blue = 2

let printColorName (color:Color) =
    // パターンマッチで処理を分岐させる
    match color with
    | Color.Red -> printfn "Red"
    | Color.Green -> printfn "Green"
    | Color.Blue -> printfn "Blue"
    | _ -> ()

printColorName Color.Red
printColorName Color.Green
printColorName Color.Blue

出典: パターン マッチ (F#) | Microsoft Docs

注意していただきたいのは、関数型プログラミングにおける「パターンマッチ」はただの言語機能(またはプログラミングテクニック)であり、それ自体にまったくネガティブな意味はない、ということです。
ですので、関数型プログラミングを学んでいるときに「パターンマッチ」という言葉に出会っても、「これって使わない方がいいのかな?」とか思ったりしないようにしてください。

塾講師時代の生徒にも「パターンマッチ」で解こうとする子がいた

ところで話は変わりますが、僕は大学時代、塾講師のバイトをやっていました。
成績のいいクラスも成績の悪いクラスも、どちらも受け持っていましたが、今考えると「あー、あれは一種のパターンマッチだったのかもしれない」と思うことがあります。

たとえば、成績の悪い子のクラスを受け持っていたときによく見られたのが、こんな光景です。

Aくん、ここの式はどうなるかわかる?
 ↓
う〜ん、y=3?(と言って、僕の顔を見る)
 ↓
(僕が首をかしげたのを見て)いや、違う違う、y=5分の3?(また僕の顔を見る)
 ↓
(相変わらずダメそうなのを見て)あー、そうそう、y=8!!なあ、そうやんな!?(と言いながら、また僕の顔を見る)
 ↓
(以下これの繰り返し・・・)

このとき、Aくんは問題文に載っている数字を適当に組み合わせ、僕が「うん、そうだね」と言うまで、それらを足したり引いたり掛けたり割ったりし続けます。
ですが、本質的なことは何も分かっていないので、そう簡単には正解にたどりつけません。
もし仮にパターンマッチに成功して正解が得られたとしても、それはただの偶然なので、本番のテストではまったく点が取れません。

一方、成績のいいクラスではこういう光景はほとんど見られませんでした。
同じような質問をしても、成績のいいクラスの子はすぐには答えず、じ〜っと問題文を見つめて頭の中で何かを考えます。
そして、しばらく経ってから静かに自分の答えを口に出します(で、だいたい正解します)。

三つ子の魂百まで?(パターンマッチ魂も百まで?)

プログラミングを学んでいる人の中にも、このように「じっくりとロジックを追いかけて正しいコードを見つける人」と、「とりあえずググる!コピペする!ググる!コピペ!ググる!コピペ!を延々と繰り返す人」に大きく分かれるのではないでしょうか。
そして、後者の人はもしかすると、小さい頃からパターンマッチで勉強の答えを見つけようとしてきた人なのかもしれません。

ただし、学校の勉強や入試とは違い、コードを書くときは「ググる」というオプションは禁じ手ではありません。
また、正直に白状すれば、僕自身もたまに「パターンマッチ&コピペ」で動くコードを探してくることがあります。
ですので、「パターンマッチ&コピペ」が100%ダメだとは言いません。

とはいえ、ググって答えが見つからなければそこで詰んでしまいますし、たとえ答えが見つかっても自分が書いたコードを自分が理解できていないので、それ以上自分のコードをどうすることもできません。
そう考えるとやはり、「パターンマッチ&コピペ」プログラミングは害悪の方が大きいと言えるでしょう。

もしあなたが「パターンマッチ&コピペ」ばかりを繰り返してコードを書いているプログラマなのであれば、一度立ち止まって、じっくりと順序立ててロジックを追いかける練習をしてみてください。

2018.11.29追記:「パターンマッチ&コピペ」で帰納的に学習する?

「パターンマッチ&コピペ」は害悪が大きいと書きましたが、次のような場合は例外かもしれません。
それは「パターンマッチ&コピペ」でプログラムを目的通りに動かしたあと、自分が書いた(というかコピペした)コードをふりかえって、コードの意味や構文を理解しようとした場合です。

つまりこれは「パターンマッチ&コピペ」を利用して帰納的に学習するスタイルです。
この方法であれば「パターンマッチ&コピペ」でプログラムを書いたとしても、結果的にはきちんとプログラミングスキルを向上させたことになるはずです。

ですが、このやり方はイージーではなく、むしろ高度な学習方法だと思います。
そして、「パターンマッチ&コピペ」を多用するプログラマで毎回この手順を踏んでいる人は、おそらくごく少数ではないかと推測します。

まとめ(と宣伝)

・・・などと、なんか偉そうにつらつら書いてしまいましたが、もともと言いたかったことはなんてことはありません。
「あー、最近よく目立つコピペプログラマと塾講師時代に見てきたあの子たちは、きっと同じ部類なんじゃないかなー」とふと思ったので、それが言いたかっただけです(笑)。


ちなみに、僕が執筆した「プロを目指す人のためのRuby入門」は読者のみなさんが「パターンマッチ&コピペ」プログラマにならないよう、しっかり順序立てて体系的にRubyプログラミングを説明しています。

本書を読めば「今まで呪文のようにしか見えなかった不思議なRubyの構文」や「実はあまりよくわからないまま、見よう見まねで書いているRubyコード」も自信をもって読み書きできるようになるはずです。

「パターンマッチ&コピペ」プログラマから脱却したい人はぜひご一読くださいませ!(という宣伝でなぜか締めくくりますw)