みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
さて、ノンプログラマーの皆さん。
コードの読みやすさ、気にしていますか?
ノンプログラマーは「書き方」についてのルール無用なケースが多いため、気にしていない方のほうが圧倒的に多いかも知れませんね。
ですが、そのままにしていると…
「2週間前に自分が書いたはずのコード…全然読めん!!」
と、過去作成したコードおw読み返すのに膨大な時間を費やしてしまう…ということもあるかも知れません。
本来、業務を効率化するためにプログラムを活用しているのに、過去のコードに時間をとられてしまうのでは本末転倒ですよね。
ということで、今回は特にノンプログラマーに向けまして、リーダブルコードの重要さについて、またその指針とテクニックについて一部紹介していきます。
※この記事はコミュニティノンプロ研定例会Vol.5「ノンプログラマーのための『リーダブルコード』超入門」の内容の一部を加筆修正して記事にしたものです。セミナーからの抜粋動画もありますので、合わせてご参考くださいね。当日の様子は以下のツイートまとめもご覧くださいませ。
なぜVBAは嫌われているのか
VBAは利用者は多いはずなのに、嫌っている人も多い言語の一つです。
以下の記事で紹介されている通り、数ある言語の中で、嫌いな言語の3位という結果を残してしまっています。
その理由は色々とあると思うのですが、私自身の経験でいうと、「コードが汚くてひどい目にあった」というのも、その理由の一つになっているのではないかと思っています。
業務のうち、かなりクリティカルな部分をマクロ化していて、その保守管理者が突然辞めてしまったり、業務変更があって修正をしなくてはいけなくなったりしたときを想像してみましょう。
そんなときに、いざそのマクロのコードを拝見!と、蓋を空けてみたら、まあ誰も読めない、どこから手を付けて良いかわからない…
まさに、Excelの「xlsm」ファイルが、パンドラの箱のような存在になってしまっていること、私自身も何度も見かけたことがあります。
そういう残念なことが多いから、VBAは嫌われてしまっているのかな、と思ったりしています。
同じ処理をするコードでも書き方でその読み取る速度が異なる
例えばこんなコードをご覧ください。
Sub test()
Dim a, b, c
a = InputBox("入力して下さい")
For b = 1 To a
For c = 1 To a
If b = c Then
ThisWorkbook.Worksheets(1).Cells(b, c).Interior.ColorIndex = 3
Sheets(1).Cells(b, c) = b * c
ElseIf Not b = c Then
Sheets(1).Cells(b, c) = b * c
End If
Next c
Next b
End Sub
何をするプロシージャなのか…かなり読み解かないとわかりませんよね。
さて、このコードですが、同じ目的を達成する別の書き方として以下のように書くこともできます。
'任意の整数を入力して縦n×横nの表を作る
Sub createKuku()
Dim n As Long
n = InputBox("任意の整数を入力して下さい")
Dim i As Long, j As Long
With Sheet1
For i = 1 To n
For j = 1 To n
.Cells(i, j).Value = i * j
If i = j Then .Cells(i, j).Interior.ColorIndex = 3 '縦と横が等しいなら背景色を3:赤
Next j
Next i
End With
End Sub
以下のような理由から、こちらのほうが読み取るのが圧倒的に速いはずです。
- コメントやプロシージャ名から、プロシージャの役割がなんとなくわかる
- 変数名やInputBox関数のメッセージから、それぞれの変数の役割もなんとなくわかる
- 分岐や反復はきちんとインデントされているので、その対象となっているブロックがどこからどこまでなのか、コードのフォルムで把握することができる
このように、同じことを達成するコードだったとしても、その書き方によって読み取るスピードが圧倒的に異なる、ということは現実としてあります。
これも含めて、VBAでよく見た具体的な事例について、以下の動画で紹介していますので、合わせてご覧ください。
汚いコードは負債・良いコードは資産
そうなんです。
読みづらいコードは自分やチームにとって「負債」になってしまうんですね。
逆に、読みやすいコードは、自分やチームにとって「資産」になります。
何かそのプログラムに修正を加えなくてはならなくなったときに、読みやすいので、すぐに修正を加えることができるからです。
それだけではなく、さらに利点があります。
別の新たなプログラムを作ろうとしたときに、「確か似たような処理を作ったっけ」と部分的に再利用をすることができるようになります。
要は、良いコードであれば、書けば書くほど、「再利用できるコードのストック」が増えていくという形になるわけです。
その差は天と地の差がありますよね…!
ノンプログラマーはコードが汚くなりがち問題
しかし、残念ながらノンプログラマーはその事実に気づく機会が非常に少ない…
本業のプログラマーであれば、会社の上司や先輩が「おい、そのコード読みづらいから良くないよ」と教えてくれるのですが、ノンプログラマーは孤独な一人チームのことが多いのです。
そうなると、リーダブルコードの重要性に気づく機会がなく、汚いコードを量産しまくってしまっていた…ということは、実際にありえるのです。
ですから、本来入門書などで、その重要な事実をちゃんと身につけられていれば良いと思うのですが、残念ながら現時点ではそのようにはなっていないようです。
ですから、こういう本を書かざるを得ませんでした。
おかげさまで、多くの支持を頂いています。
できれば、入門書から書きたいです…!
最初からリーダブルコード書くことはできますし、それによる残念な出来事をできるだけ減らしたいという気持ちが強くあります。
リーダブルコードを書くためのテクニック
リーダブルコードとは、「より速く理解できるコード」のことです。
その指針として、以下3つを紹介します。
- よりシンプルなほうを選ぶ
- 情報の密度を高く
- 一貫性をもたせる
例えばコメント。
以下のようなコードがあります。
If n > 50 Then 'nが50より大きい場合
MsgBox "50より大きい"
ElseIf n <= 50 Then 'nが50以下の場合
MsgBox "50より小さい"
End If
このコード、シンプルではありませんよね。
条件式とメッセージと、コメントで同じようなことを表現してしまっているので、情報の密度も薄いです。
これも含めて
- インデントと空行
- 改行
- 変数の宣言と命名
- マジックナンバーと定数
- 関数と部品化
- コメント
- 省略をせずに明示する
などといった観点で読みやすく書くテクニックを駆使することができます。
以下の書籍も超オススメですので、ぜひバイブル的に活用いただければと思います。
「読みやすいコードか?」を常に考えてコードを書く
とはいえ、「絶対にこれが正解」という書き方は存在しません。
例えば、定例会が終わった後に、このようなネタがコミュニティ内で議論になっていました。
#ノンプロ研 でリーダブルコードを学んで出てきた悩み。
「変数のスコープは狭く」を心がける中、唯一Public変数(グローバル変数)にしているのが、プログラムのあちこちで使う設定を格納する変数。
ある時これをPublicでなく狭いスコープにしたら、読みにくいコードになってしまった。#VBA
— otani3 (@otani3nonpro) April 20, 2018
グローバル変数使うと、変数の管理がしづらくなっちゃうという一面がありつつ、スコープを狭くすると、何度もその変数の中身を引数とかで引き渡さなくてはいけなくて、コードが冗長になる…という問題です。
すげー、嬉しかったですね。
おそらく、どんなプログラムを書いているのかにもよりますし、最終的には好みの問題なのかも知れません。
ただ、ノンプログラマーの皆さんが、コードを書くときに「これは読みやすいかな?」と考えてくれるようになったのであれば、もう私の活動としては大成功かなと思います。
これからも、ノンプログラマーの皆さんが、プログラミングを楽に学び、活用できるように支援していければと思います。
本コミュニティでは、セミナーやオンラインでの情報提供やコミュニケーション、定期的な勉強会の開催といった機会を提供させていただいています。
以下ページにて、詳細の確認およびお申し込みが可能ですので、同じような仲間が集まる学び機会が欲しい!という方はご参加いただければうれしいです。
「ノンプログラマーのためのスキルアップ研究会」について
コミュニティ「ノンプログラマーのためのスキルアップ研究会」では、毎月の定例会や勉強会、Slackでのやり取りを通して、皆さんのプログラミング学習の質やモチベーションを高めるための活動をしています。 過去の活動については、以下のページをご覧ください。- コミュニティ「ノンプログラマーのためのスキルアップ研究会」の活動レポートまとめ(2017-2018)
- コミュニティ「ノンプログラマーのためのスキルアップ研究会」の活動レポートまとめ(2019)
- コミュニティ「ノンプログラマーのためのスキルアップ研究会」の活動レポートまとめ(2020)
- コミュニティ「ノンプログラマーのためのスキルアップ研究会」の活動レポートまとめ(2021)
- コミュニティ「ノンプログラマーのためのスキルアップ研究会」の活動レポートまとめ(2022)