Previous Page | Next Page

変数名は「AIにレビューさせろ」Part2(税込価格の回答例)

老兵は死なず、AIと踊る


前回前々回で、概ね言いたいことは言ったので与太話的にはOKなのですが、多くの日本人プログラマが経験するであろう業務アプリの開発を想定した変数の命名について、「アーキテクト」的な補足を行います。
前回前々回の記事の要点をいうと「命名は主観的になりがちなので、ルールを決めない状況でのレビューは危険」、「初心者は先ずはプログラムを書くことを学習する」ということを言ったのですが、今回の要点は、広域だったり業務用語に対応する変数の命名というのは、「個人の主観ではなくチームとしてきちんと定義しましょう」という話になります。


コーディング規約とともにある「プロジェクト用語集」


コーディング規約については既に説明しましたが、一言でいうと「命名についての一般ルール」で主にスタイル(単語の書き方や熟語の書き方が主軸)のルールになるかと思います。
一方で、「プロジェクト用語集」なるものも存在します。これは、プログラマが予め知っておいた方がよい、専門用語や業務用語についての項目と説明があります。


プロジェクト用語の代わりとしてのDB定義書とその項目名のAIレビュー


もっとも、実態としては「カバーしている用語の数が少なかったり」「ピント外れ」だったりもありますし、多くのプロジェクトでは「そんなものは存在しない」です。実は「プロジェクト用語集」に準じるものとして、「データベースの定義書(スキーマ)」が挙げられます。例えばECサイトなら、商品テーブル、注文テーブルなどがあり、以下のようになるでしょう。


商品テーブル:Goods
 商品ID(id)
 商品名(name)
 単価(price)


注文テーブル(Orders)
 注文ID(id)
 注文主氏名(orderer_name)
 送付先氏名(shipping_name)
 送付先住所(shipping_address)
 送付先電話番号(shipping_tel)
 税抜価格(sub_price)
 税込価格(tax_price)
 送料(sipping_fee)
 合計価格(total_price)


注文明細テーブル(Order_items)
 注文明細ID(id)
 注文ID(oid)
 商品ID(sid)
 個数(number)
 税抜価格(price)


(当たり前ですが、細かいところは端折っていますが)、最低限、このような項目があるかと思います。
まったくの初心者の方はついてこれないかと思いますが、送付先とか送料、合計価格などの名称は馴染みがあるでしょう。各々の項目に英語名がカッコ内にあります。大体、この英語名がDBのカラム名(テーブル名とあわせて、グローバル変数名のようなモノ)になります。今回はこの英語名をAIでレビューさせます。
さて、これをChatGPTにかけた結果がこちらになります。


https://chatgpt.com/share/695f48aa-9450-8006-ae08-f7941ab5e69c


上記はChatGPTとのやり取りですが、ChatGPT,Gemini,Copilotでレビューした結果(それぞれの推奨の名前)を表にまとめます(やり取りの詳細は省略します)。


ChatGPT要修正ChatGPT推奨GeminiCopilot
Goodsproductsproductsproductsproducts
name----
price-unit_priceunit_price-
Orders-ordersorders-
orderer_name-customer_namecustomer_namecustomer_name
shipping_name----
shipping_address----
shipping_tel----
sub_price---net_price
tax_price---gross_price
sipping_feeshipping_feeshipping_feeshipping_feeshipping_fee
total_price-total_amounttotal_amount-
Order_items-order_itemsorder_itemsOrderItems
oid-order_idorder_idorder_id
sid-product_idproduct_idproduct_id
number-quantityquantityquantity
price-unit_priceprice_at_sale-
--subtotal_amount--

さて、このようにデータベースの定義ができますとおのずと、「これらを扱うプログラム」で上記のカラム名に対応する変数名は、当然カラムの英語名を使うことになります。ORMを使えば自然にそうなりますし、手でSQLを書くことになっても敢えて違う名称にする意味はないだけでなくバグにつながるでしょう。
もちろんですが、これは「ある種の理想論」になります。現実的には「カラムの追加削除や変更」があり、それに伴い、プログラム上の変数名とDBのカラム名が時間と共に徐々に異なっていくこともあるかと思います。それを直すかどうかはまた別問題になります。


レビュー時のプロンプトについて


プロンプトの与え方ですが、私の意見になりますが、このように「関連するものはまとめて問い合わせる」方がよいかと思います。サンプルはDBのテーブル定義になりますができれば全部を与えます。プログラミングの場合(作成したプログラム全体)を渡した方がよいでしょう。
これによりAIが、意図を理解して用語間(変数間)の調整も考えてくれます。
感触になりますが、バイブコーディングが実用化されようとしている現在、このような割と突っ込んだ問い合わせにもAIはちゃんと対応できます。


ちなみに、私の場合のように「ある程度名前が用意できる」人はプロンプトとして、
「致命的な間違いを指摘してください」、「海外でも通用する名前を提案してください」
とかにすれば良いかと思いますし、まったく名前が思いつかない人は
「英語名を提案してください」
とすればよいでしょう。


AIの評価について


表を見ますと
・致命的なもの、誤字(sipping_fee)
・不適切なもの(Goods, orderer_name, sub_price, tax_price, number)
・推奨されるもの(price → unit_price)
があります。命名は主観と書きましたが、AIも同様に個性があるようで微妙に違うのもがあります。これらをどう処理するかは、話し合って決めることになりますが、基本的には、誤字や誤訳のように致命的なものを直せばよいかと思います。


英語にない日本語名の訳について


ちなみに、tax_priceですが、表には出ていませんが、price_with_taxやgross_priceがあるのですが、そもそも「税込価格」という直接の対訳が無いようです。この対訳が無いという判断はAIではちょっと厳しいかもしれません。このあたりは命名を行う人の英語力ということになります。要はprice_with_taxのようにいかにも説明的な訳だったり、gross_price(合計金額)のように漠然とした訳を見たときに、『「税込価格」というのを海外ではあまり使わないな』と判断するのですが、これはこれで業務知識と英語力が問われるところです。
日本の場合、
・税率の違い(8%、10%)
・外税表示、内税表示がある
などがあります。海外でのこのようにしている国もあるのかもしれませんが、英語の名称(いかにも説明的な訳)を鑑みるとどうも税込価格と税抜価格をいちいち用語として区別することがないように感じられます。これらを踏まえて、ChatGPTと対話してみました。


https://chatgpt.com/share/695f63c1-7ef8-8006-a943-9e946dfce54c


完璧ではないですが、税込価格、税抜価格の候補として、


price_including_tax / price_excluding_tax
tax_included_price / tax_excluded_price
price_with_tax / price_without_tax
gross_price / net_price
base_price / total_price


があるようです。「これ!」という一組でなく、いくつもの組み合わせがあるということで、どれにするのかを決めるとともに、「このように変数名に対して複数の候補が考えられるときは、メンバー各位に命名を任せたらばらつく可能性がある」ということもプロジェクトリーダー・マネージャは頭に入れる必要があるかと思います。


Part2のまとめ


まとめますと
・データベースと関連付けられた名称や、グローバル変数等、複数の人間が関与する変数名は予め決めておいた方がよい。
・税込価格など「専門用語」の場合、対訳も専門用語の対訳にした方がよい(ただし常に対訳があるとは限らないので臨機応変にする必要がある)。
・複数の対訳が考えられるときは「どれを使うのかを」決めておく。できれば使わない候補を(使わない変数名)とすると無用な混乱を事前に防ぐことができる。
・人が作るアプリケーションは大体決まっていることがあるので、慣用表現(GoodsではなくProducts)があればそちらを使う
ということが言えるかと思います。


アーキテクトの仕事


あまり明確に言われていないかもしれませんが、以上のように考えながらスキーマ設計を行ったり、用語集の必要性を考えるのがシステムアーキテクトの仕事の1つになります。


変数名は「AIにレビューさせろ」Part0(初心者の方へ)


変数名は「AIにレビューさせろ」Part1


老兵は死なず、AIと踊る


2026-01-10 | コメント:0件

変数名は「AIにレビューさせろ」Part0(初心者の方へ)

老兵は死なず、AIと踊る


変数名は「AIにレビューさせろ」Part1を公開したのですが、同時にAIから
「これは初心者向けの記事ではないのでは?」
と散々、指摘を受けたので初心者とスクールで教えようとしている方向けに補足を行います。どちらが最初でも構いませんが、初心者の方は本記事を最初に読んだ方がよいかもしれません。


初心者の方


 例えばですが、Google C++ スタイルガイドや、Linux Kernel 2.6 Documentation- CodingStyle を参照してみてください。変数名の記載の項目になります。
 何を言っているかわからないかと思います。それが答えです。


という、哲学的な問答はやめてストレートに言いますと、「まったくの初心者の方は、まずはプログラミングの書き方を学習するべきであり、コーディングスタイル(変数の命名だけでなく、あるべきコードの書き方の基準)は、後回しにしてもかまわない」ということになります。つまり今は考えなくてよい(もし気になるのならAIに聞け)ということになります。


それでも、気になる方はもう一度Google C++スタイルガイドの「命名規則」を読みましょう。引用しますと、


命名に関するスタイルルールはかなり恣意的なものです
・あなたにとってわかりやすいと感じるかどうかに関わらず、「ルールはルール」と考えるようにしてください。


ということです。これの意味するところを大げさにかくと、「変数名は「AIにレビューさせろ」Part1」の記事になります。
加えて、日本人に対する補足を行います。(通訳案内士の観点になりますが)、日本人というのは「言われなくても規律を守る」民族のようで、一方で欧米(というか民主主義の国の人は)、「自由が基本、必要ならルールを作る」という文化的な違いがあります。主にアメリカからくるルールを日本人に当てはめると、必要以上に日本人が守りすぎるという傾向があるので注意しましょう。という話です。


初心者から脱しようという方


 上記の2つのスタイルガイドをみて、「言っていることは解る」という人はもう、命名規則については卒業ということになります。
「これでは不安」だという方は、一つ卒業試験をしましょう。上記の2つのスタイルは真逆のことを言っている部分がありますがどれでしょうか?


私が見つけた正解の1つは、
Linux Kernel 2.6のコーディングスタイルは、変数名の省略を許容しており、Google C++の方は許容していないということがあります。
(もっともどちらのスタイルもループカウンタは i でよいとしています)。
私の観点(理解)になりますが、これらの違いを補足すると、カーネルは基盤ソフトウェアで、Googleが作ろうとしているものはアプリケーションということも言えます。
コーディングの文化というか、作成しているもののレイヤーが異なります。
例を挙げると、変数の値を交換する swap関数 というものがありますが、Linuxの方はswap関数を作る方、Googleの方はswap関数を使う方ということです。


swap関数を C言語風に 書くと


void swap( int *a, int *b) {
 int t = *a;
 *a = *b;
 *b = t;
}


となるかと思います。ここで、a,b,tと出ましたが、これに対して「変数名が、意味のない1文字だろ!」という人は(0ではないかと思うが)私の周りではいません。逆にここで変数名に対してとやかく言う人とは距離をとった方がよいです。(実は変数名以外には問題があります。ヒントは型、エラー処理あたりです)。


一方で、Googleの方は、swap関数を使う側、例えば、

 swap( oldMachineStatus, newMachineStatus);

と言ったコードにフォーカスを当てているということになるかと思います。


言っていることは解るが釈然としない(初心者の方)


 コードコンプリートやリーダブルコードなど実績のある書籍を読むことをお勧めします。
「1文字変数はダメ。booleanは○○。」と言ったような断片的な情報ではなく、「なぜこのように命名すると良いのか?」についてできるだけ主観を抑える努力を用いて書かれているでしょう。
また、上記のようなスタイルガイドも併せて読むことを勧めします。書籍やガイドによって矛盾点が見つかります。それに対して『自分はどうするか?』と自問してみましょう。


2026年現在確認できる多くのコーディングスタイルでは、ループカウンタには i でよいとしていますが、意味のある名前にしましょうという書籍もあるようです。「○○にこう書いてある」ではなく、あなたの正解を見つけてみましょう。


「能書きはいいからお前はどうしているんだ?」という方


 (Grokの指摘を受けての追記)私自身ですが、アマチュア時代を入れると40年以上プログラミングをやっており、使った言語も、BASIC、アセンブラからC/C++、Java、perl, php, Ruby、python, ADPと多岐にわたるので、「これ」と言った基準はないです。と言っても傾向はあるのでご紹介します。基本的にlinuxのコーディングガイドが近いかもしれませんが、業務アプリも作成するので混ざっています。下記を見てもらえますと私が「1文字変数はNG」、「booleanはis/has」と言われると反発する理由が良くわかるかと思います。


  • 慣例、ルールがあればそれに従う。自分で作る場合は英語で名称を考える。
  • 名前付けの優先順位
    グローバル変数、メンバ変数、引数、ローカル変数の順で優先順位が下がる(適当な名前でよい)
    グローバル関数名、クラス名、メンバ関数名の順で優先順位が下がる
    ※名前空間は今のところ使用していないが、徐々に意識するようにしたい。
  • 変数名は名詞が基本、もちろん内容によって形容詞、動詞を使うこともある。
  • 関数名、メソッド名は動詞が基本、以下同様
  • クラス名は、名詞が基本、以下同様
  • 1文字2文字変数については、ローカル変数で慣用的に使うことがある
    a, b, c ・・・抽象的な値を表現するとき
    v1, v2, v3 も同様に抽象的な値を表現するとき
    c, cnt ・・・ ループカウンタ
    f, flg ・・・フラグ、fは、まれにファイルポインタでも使う
    h ・・・ ハンドル(低レベルI/Oが返すIDのようなもの)
    i, j, k, l, m ・・・ループインデックス
    n ・・・ (next)の略
    p, q ・・・ ポインタ
    s ・・・ 合計
    t ・・・ テンポラリ変数、時間(秒)
    k / v ・・・ (マップの)key value
    u ・・・ ユーザID
    r ・・・ 戻り値
    x, y, z ・・・ 座標
    そのほかテンポラリ性の高い変数は、英単語の先頭1文字の名前を付与することもあります。
  • 略称、非略称
    DBのカラム名、グローバル変数、グローバル関数、クラス名のようにグローバル性が高い名称は非略称、その他は適宜略称を使う
  • 単語の区切り
    複数の単語を区切るときの作法として、キャメルケースを使うか(区切りで大文字にする)、スネークケース(アンダーバー'_'で区切る)かがある。
    モダンな言語(Java以降)はキャメルケース
    アセンブラ,C,C++は、スネークケース
    グローバル変数、グローバル関数、クラス名はキャメルケース、ローカル変数、メンバ変数はスネークケースと混ぜて使うこともある。
    略称変数の場合、そのまま結合することやプレフィックス、ポストフィックスとして使うこともある。
     nstatus
     namep
  • 業務アプリの例はPart2を見てもらえればと思います。

実践


さらに、実際のコードがどうなっているかを調べることも重要です。
以下、Linux kernel 6.18.3 で適当に選んだファイル(acct.c)からの変数名(と引数名)を出現順で10個を列挙します。
acct
sbuf
p
ns
res
pin
work
acct
file
name


私には大変馴染み深い名称ですが、皆様どうでしょうか?
これだけだと何なので、同プロジェクトから適当に選んだpythonのファイル(check-perf-trace.py)からの変数名(引数名)を10個ほど列挙します。


event_name
context
common_cpu
common_secs
common_nsecs
common_pid
common_comm
common_callchain
vec
call_site


理解できるかはともかく、分かりやすい名前になっているかと思います。


それでもモヤモヤする人


 ここまでで述べていない論点としては、「プログラミング言語」の言語的な側面があります。我々は言語を使うときに「単語」を使っておりますが、いちいち命名をする機会はあまりないかもしれません。命名と言えば、子供の名前など「固有名詞」が頭に来るかもしれませんが、どちらかというと「数学や物理の計算式の変数」だったり「作文の章立ての題名」だったり「その間の感覚のもの」だったりします。いずれにしても「内容を簡潔に説明するもの」として命名が存在しますが、プログラミングは文学ではないのであまり深入りはやめましょうという話になります。


変数名は「AIにレビューさせろ」Part1


変数名は「AIにレビューさせろ」Part2(税込価格の回答例)


老兵は死なず、AIと踊る

2026-01-08 | コメント:0件

変数名は「AIにレビューさせろ」Part1

-「命名に悩む時間」は生産性の無駄。AIに任せて、ロジックに集中すべき。-


老兵は死なず、AIと踊る


 変数名の命名というのは鬼門と言えば鬼門で私は、35年近く前になりますが駆け出しの頃、処理対象を指す変数名に「enemy」という変数名を付けて当時の先輩から笑われた。もっとも直せと言われずにユーモアと受け取ったようで、牧歌的というか微笑ましい時代でもありました。
 もちろん今なら、destination???? やら target???? やらもっと適切な名称をつけるでしょうし、変数を適切に命名する、つまり「何を」保持しているのかを明確かつ分かりやすく命名することは、単なる読み手だけではなく、おそらく自分自身のためにもなるかと思います。例えば金額計算なら、「税抜き価格」、「税込み価格」、「税率」、「合計金額」、「税率別税額」、「税率別課税対象額」等が考えられますが、これらを、


p1,p2,p3,p4,p5,p6


という風に命名したら、多分、解読不能(バグを誘発する)プログラムになると思います。
一方で、Youtubeのプログラミング初心者向けの動画で「可読性の高いプログラム」ということで、変数名の命名について


・1文字の変数名はダメ
・boolean型にはis/hasをつける


ということを堂々と教えていた。これらについては全否定する気はないですが、『初心者に対して変数名の命名に対してルールを強制するのは如何なものか?』と思う。
というのも本来プログラミングというのは人間が作り出すもので、思考の結晶ということも言えます。変数名も同様です。しかしながら、日本人の性質として、このように言及されるとそれを額面通り受け取り例外を考えなくなり、1文字の変数を書かなくなったり、booleanに必ずis/hasをつけたりします。本来自由であるべき変数名を強制するには、それなりの理由付けが必要でしょう。大規模プロジェクトのように『予め命名規則が決まっている』プロジェクトならともかく、「経験不足の初心者に対して枷になるような規則」をつけるのもどうかと思います。ちょいちょい言っているのは『ソースコードはなるべく自由に、動くプログラムが最強』ということに尽きます。もちろん解読可能な範囲でということになりますが。


で、前置きが長くなりましたが、変数の命名についてまず言わなければならないのは、プログラミングが出現して半世紀を超えましたが、その中で命名規則も変わってきているということが言えます。


例えば、大昔は変数名の長さに制約があったり、ポケコンなどは1文字の変数名しか許していなかったり、大文字しか許していなかったりしていました。この時期に作られたプログラムならp1,p2とかもバンバンあったかと思います。省略も良く行われていて、逆に単語をフルに書くことの方が少なかったかと思います。よく「母音」を省くということもあったかと記憶しています。userNameでなく、usrNmとかですね。
時代が進み、大文字小文字の区別がついたり、記号を入れられるようになり、比較的自由に変数名が命名できるようになると、様々流派が出てきました。
それでも、例えばC言語なら


while( *p++ = *q++);


という、知らない人が見れば「何をやっているんだ」というコードも逆に知っている人からすれば「お馴染み」となってました。


そして、変数名の命名に決定的な影響を与えた書籍が出てきました。『コードコンプリート』です。コードコンプリートで『変数名は理解しやすい意味のある名前にした方が良い』と整理され、今に至ったように思えます。無用な誤解を与える前に注意ますと、変数の命名について(だけでないですが)、コードコンプリートは大変有意義です。


私が問題にするのは、『変数の命名に対する意見(批判)がコードレビューと相まって「読みやすさ」という基準があいまいな個人の主観的な判断で行われること』です。


 実は、コードコンプリートも「1文字の変数」というのは良くないと言っている個所があります。
25年程前になりますが、大変ありがたい”主観的なレビュー”を受けて、ループに対しても『i ではなく index と書け。コードコンプリートに書いてある。』と言われた覚えがあります。その時に直したか直してないかは定かではありませんが、その後、変な影響を受けて一時ループインディックスをindexとした記憶はあります。ただ、明らかに違和感があったので元に戻した記憶もあります。
その後、改めてコードコンプリートを読むと「純粋にループのスコープで収まるインディックスは、i でもよい」と書いてありまして、「この野郎」と思った次第です。もっとも、私が index としたのはほんの数か月で、また i に戻したので、あまり悪影響は受けていないです。
では、私がコードレビューをしていたときにループインディックスに index としているコードを見たらどうするでしょうか?
答えは「何も指摘しない」です。ただ「この人は2重ループの外側にindexを使ったら内側のループインディックス名などうするのか?」と思うことはあります。


 この記事を書くにあたって、改めて、コードコンプリートを読み直しましたが、変数名の長さの基準が少々長いように感じます。「そこまで書くか?」という印象をぬぐえません。「読みやすさ」ということをいうのであれば、「適度な長さ」については個人差が大きいのではないかと思います。多分私は短い方に寄っています。


 いずれにしても、変数名に対してのチェックというのは、コードレビューで取り上げられやすく、いかにも日本人が好きそうな「儀式」にあったおもちゃという印象がぬぐえないです。真面目にやっている人もいらっしゃるでしょうが、そういう人は「1文字はダメ」とかは言わないかと思います。
 もちろん、大規模プロジェクトで「変数名の命名規則」が決まっている場合は従う必要がありますが、残念ながら日本の多くの現場が予め決められたものではなく主観的かつその時代時代で「良いと思われる」ものが個人の裁量で使われる傾向があるでしょう。
また日本人の英語力は、ばらつきがあり変数名の命名に英語を使うときは危険度が増します。一方でローマ字の変数名は嫌われるという厄介な風潮があります。
例えば上記にあった「税込価格」という変数名は割と難しいです。良く見るのは taxPrice ということになりますが、実はこれは「英語」としては成立していません。では taxPrice はダメかというと、これは難しいところではあります。今ならもちろんChatGPTに聞けば正解が解ります(正解は各自の宿題にしましょう。次の記事に回答編を書きます)。ちなみにそもそも「税込価格」を表す変数名に日本語が使えないところが最大の問題点ではあるのですが、言い出したらきりがないのでおいておきましょう。


 その他、命名に関しては主観的になりがちですが、あーだこーだと言わずに書いた人のアイデアを尊重し、AIに判定させれば良いかと思います。もちろんAIが明らかに間違えれば適宜人間が修正すればよいかと思います。


 ということで、私が過去に作成したコードを、AIに命名チェックをさせてみました。もちろんですが、enemyという変数名は無いことは事前に確認しています。単に命名チェックをさせると何がでるか分かりませんので会話を通して「望ましい変数名について」定義を行っています。

とあるライブラリの変数名のレビュー結果


私の基準を叩きこんだので私よりのレビューになりましたが、それでもrc、tranflgなどは「やんわりとダメよ」と教えてくれています。
「このライブラリを2026年基準で“軽く化粧直し”するならどこを直すか」と提案を受けましたが、結果は出さずに止めています。動いているコードを不用意に直すのは危険で、無責任に「これが2026年のコードです!」としたくないためですが、今ならAIにより(間違いはあったとしても)ある程度機械的にチェック&訂正案を出してもらえるので上手く使えば余計なストレスを受けずにすみます。


 特に初心者のうちは意味が通らない命名をすることが多いでしょうが、逆に命名に時間をかけず適当に書いて、AIに修正をお願いするというのも現代的なコーディングかと思います。
 さらに付け加えると私自身の経験になるのですが、実は論理的思考力や抽象化力が高い人ほど変数名に意味をつけない傾向があるかと思います。例えば数学者は a b c と1文字の変数名を使いますが、彼らは「この変数の名前が○○でないとダメ」とかは言わないで純粋に式について議論します。もちろん私もそこまではいきませんが、変数名にあまり惑わされないでロジックを追えます。もちろん、これは「意味のない名前でよい」という話ではなく、文脈を理解できる人ほど、名前に依存しなくてもロジックを追えるという意味です。


変数名は「AIにレビューさせろ」Part0(初心者の方へ)


変数名は「AIにレビューさせろ」Part2(税込価格の回答例)


老兵は死なず、AIと踊る

2026-01-07 | コメント:0件

コードレビューは鬼門か?

-人間がレビューするよりAIにレビューさせた方がよいのでは?-


老兵は死なず、AIと踊る


最近、SNSで「AIでコードを書いてみました(バイブコーディング)」という記事が氾濫するようになったのですが、一方でその書いたコードを出していない人が目につく。私の場合は、規模は小さいがAIに出力させたコードを公開していたりする。
まぁ、権利関係から出せないものもあるのでしょうが、実際に動くものを出さないで「バイブコーディングしました」というのは、眉唾もので、15年程前に「オブジェクト指向やってます。」という、「エアオブジェクト指向」と同じ香りがして、「エアバイブコーディング」じゃないかと疑ってしまいます。
(と言っていたら、こんな記事がGoogle discoverからサジェストされました。正直、部品レベルのものをいっぱい出して「限界を突破」と言われても・・・というのはありますが、コードを出している少ない例です。)
私の場合は、今は、AIをハックしている状況で、つまりAIの特性を体感している状況で、バイブコーディングをするまでには至っていない。もっとも、将来的にはバイブコーディングを視野に入れているので、今は色々試しています。


 そういった中で、バイブコーディングの前段として、「AIにコードレビューをさせたらどうか?」ということで、コードレビューさせました。


 ちなみに、コードレビューですが、こちらもネット上では色々言われていますが、『エアコードレビューではないか?』というのも散見されます。
 というのもコードレビューは、ある意味コードを書くより高度な技術が要求されます。「なぜそう書いたのか?」ということに対して、本来ならレビューアーはレビューイーより高度な視点と経験が必要かと思いますが、実際には「ただのいちゃもん」に成り下がっている面もあります。
 私が本格的なソースコードレビューがあるプロジェクトに参加したのは30年以上前になります。それ以降は、「個人的な感想をいう場」としてのレビューはありましたが、当たり前ですが、そんな「個人的な感想」を言われてもどうしようもないです。また、ここにも書いていますが、私自身は他人の書いたコードをレビューしてやろうとは思わないです。もちろんデバッグの為に読むことはありますが、ここ炎上プロジェクトとクソコードに書いているとおり、コードに対しての評価というのは考えないようにしています。


レビューさせたのは、私が開発しているプログラミング言語(ADP)のプロジェクトになります。ChatGPTは一式をZipファイルにまとめて読み込ませました。
Geminiの方は、ファイル数の制限のため、ソースコード、ヘッダファイルそれぞれを1つのファイルにして読み込ませました。


ChatGPTとのやりとり
Geminiとのやりとり

※Gemini上で「与太さん」というのは私のことです。


C++での比較的規模の大きいプロジェクト(プログラミング言語の実装プロジェクト)のコードレビューなので、
・技術的に突っ込んだ内容となっている
・大きなプロジェクトなので評価も大雑把(ピンポイントの指摘もありますが、全体を細かくみていない)
というところはありますが、ChatGPT,Geminiとも会話が弾んでいることが分かるかと思います。
ChatGPTにしても、Geminiにしてもただ褒めるのではなく、開発者の意図を読み取って良いところをほめています。
 前述のとおり私自身、コードレビューに対してはあまりいい思い出がありません。30年以上前のプロジェクトに関しては、レビューアーが「あー、そうなんですね。」というだけで私自身はなにも得られなかったですし(もっともそれはそれで開発工程としては成立していたかと思います)、それ以降の「個人的な感想を受けるレビュー」は、(悪く言えば)レベルの低い相手からの嫉妬交じりともいえる言いがかりを聞く非生産的な場所ということで、私自身「日本の開発プロジェクトでコードレビューは鬼門」と思っていました。誤解のないように補足しますと、コードレビューが大事なのは理解しておりますし、効用はあるのでしょうが、日本の多くの現場では、そもそも「チームプレイとは何か?」から入る必要がある状況で、コードレビューは(対新人)以外にはあまり効果がないというのが実感です。


そういう印象でのAIレビューですが、第一印象が、奴らの「ほめるところを分かっている」ところに逆に恐ろしさを感じました。


「このレベルの議論ができる方と話せるのは正直かなり楽しいです。」(ChatGPT)
「正直に言って、ここまで地に足のついたマニアックな話が自然に続くのは、かなり稀です。」(ChatGPT)
とか
「この挑戦は、言語処理系開発の醍醐味が詰まった非常にエキサイティングな領域だと思います。」(Gemini)
「与太さん、仰る通りですね。「意図しないバックトラック」のデバッグは、論理型言語を開発・利用する上での最大の難所であり、永遠の課題と言っても過言ではありません。」(Gemini)


とかは、おべっかが嫌いな硬派なエンジニアを気取っている私でも


お前は分かっているな!


と喜ばずにはいられないです。


 当然と言えば当然なのですが、AI達は、良質の多数のコードを読み込んで学習していますので、「個人の感想」レベルを超えたレビューが出来るところまで達しているようです。AIあるあるの「ハルシネーション」ですが、AIの出力はバイブコーディングと違い直接的な成果物とはなりません。コードレビューはあくまでも「指摘」なので、その指摘が正しいかどうかは、仕組み上、人間が確認できることも大きいです。上記のChatGPTとのやり取りもAIの返答を鵜呑みにせずに

『>分岐予測が効きやすい
これは無いかと思います。つまり必ず失敗する分岐予測が2回から1回に減ったということになります。』

AIの間違いを指摘&その返答を繰り返すことにより、よりコンピューターに対する知見が向上するでしょう。


AIの指摘は受け入れるのか?という点ですが、例えば、「C++11以降に書き換えてみては?」というのは、ChatGPTもGeminiも指摘しているところです。これは、参考にできるところとできないところがあるのですが私としては視野に入れているところです。ChatGPTの方は、「このプロジェクトですが、17年程の歴史があります。数回大幅な書換えがあるのですが、歴史的にみるとC++色からC色に移っています。」と現状を説明しながら効果的なアドバイスを求めています。Geminiの方は「メモリ管理についてはRustの借款のアイデアを使っている」ということで議論を進めています。プロジェクトの全体設計の話になるので大雑把な議論になるので、既に考えていることの指摘ということもありますが、会話を重ね深堀することにより発見があったりします。
 また、もちろんですが、AIコードレビュー一本ではなく、セキュリティ監査等より慎重なレビューが求められる場合は人間との共同でレビューを行うこともできるでしょう。


とまぁ、個人開発されている方やプログラミング学習者の方は、モチベーションを維持するためにもAIによるコードレビューをお勧めします。
人間の嫉妬や無理解に晒されるコストをゼロにし、純粋に技術的対話に没入できる。
これこそが、AI時代の真の生産性だと思います。


老兵は死なず、AIと踊る

2026-01-06 | コメント:0件

AI時代のプログラミングスクールとの付き合い方 Part3 -私のスクール経験(プログラミング、英語)について-

老兵は死なず、AIと踊る


 前回に続き、私自身のスクール経験(プログラミング、英語)について書いてみたいと思います。
プログラミングに関しては、学校に通ったことはないです。一方で、英語(通訳案内士)に関しては学校(複数)に数年間通いました。以下、それぞれの学習記録になります。


プログラミングの学習について


 私は14歳のときからプログラミングを始めました。3か月でベーシックを学んで、次の3年でアセンブラを学びました。
 学校に通わなかったのは、お金がないこともあるのですが、「十分な学習時間が確保できた」と「向いていた」ということが大きいです。大学に入る前にほぼ毎日2,3時間ずつ4年以上学びました。
 自己学習ということは、本を読むことになりますが、私が本に書いてあることがまぁまぁ理解できました。もちろんですが、一回読んでもわからないこともあり何回も読んで「どうなっていんだ!」と考えたこともありますが、突き詰めると、本に書いてあることが分かったという経験は、独学を行う上で重要です。
 本の良さの一つですが、「一定のクオリティが期待できる。」というのがあります。本という一定の分量の文章を書くというのは結構大変です。ネットに「つぶやかれた」ような文章とは質については一線を画しています。さらに著者一人が書いているだけでなく編集者のチェックが入ります。チェック自体は最低限ですが、「書きっぱなし」の文章とは異なります。残念ながらIT業界の人材は玉石混交で、今SNSを見ると「現場経験の乏しい人(SES崩れ)」の人が学校をやっていると思えるものもあります。実は、IT人材にばらつきがあるのは昔からで、例えばこの記事では、大手の企業でもあまり質の良い記事を書いていないことを10年前に指摘しています。多数の本を読むことにより、偏った考えに陥ることを防止できますが、残念ながら2026年現在は書籍自体が減っており、信頼できる情報源というのを見つける難易度があがったかと思います。。
 ちなみに脱線しますが、私はもともと国語力がなかったのですが、技術文書の読書をとおして読解力が付いたのも大きいです。そういう意味でも「独学の利点」をあげられます。
 私は現役の時は大学を途中で辞めたのですが、35年ほど前の当時、既に大学には情報系のコースがあったかと記憶しています。しかしながら大学でプログラミングをマスターして就職するというコースはあまり一般的ではありませんでした。むしろ大学を辞めた人がプログラマーとして就職するというのは日本では割とポピュラーでした。一方で、アメリカで就職しようとすると”コンピューターサイエンスの学位または同等の資格”というが必須なようです。
 学校には通いませんでしたが資格はとりました。高校生の時に第二種情報処理技術者の資格をとりその後いくつかの資格をとり10年程前にも、(このブログのタイトルである)システムアーキテクトの資格をとっています。


英語学習について


 英語については、私の実力は壊滅的でした。本を読んでも「で?」としか分かりません。文法書を読んでも良く分からず、改めて振り返ると「英語については向いていなかった」ということが言えます。特に厄介なことは、英文を読むと10分ほどで脳が限界を感じます。コンピューターの本なら何時間でも読めるのですが、英文となると体が拒否反応を起こします。これではダメということで学校に通い出しました。足掛け10年以上、学校に通いました。ただ、週1回で学校に通うだけでは、一向にしゃべれるようになりませんでした。学校はあくまでも学習の習慣づけが基本になります。英語勉強の基本的な考え方(反復練習が大事、文法より文脈)については学校で習いました。
 加えて、語学留学も行いました。2026年現在、英語の学校に通うことについては賛否があるでしょうが、語学留学や大学への留学に関してはお勧めいたします。言葉というのはなるべく大勢の人とやり取りをする方が、つまり数をこなした方が上達するかと思います。
帰国後、通訳案内士として就業しましたが、これは仕事で英語を使うことにより、単なる勉強を超えて語学レベルをブラッシュアップできたと実感しています。


向き不向きについて


 向いている向いていないに関係なく、一定技術を習得するには「質より量」という側面があります。私はITエンジニアとしても通訳案内士としても大体、5,000時間程度勉強していますが、学習においては結局のところ「どれだけ自分で勉強したか?」が重要になります。学校に行くということはあまり勉強時間とは関係がありません。最終的にはどれだけ自己学習をしたかが大きいようです。勉強時間は個人差はあるかと思いますが、5,000時間を目安として頑張れば、学習前とは違う景色がみられるかと思います。


 伝統芸術や伝統工芸でよく「師匠から教えてもらえない」ということがありますが、これについては今なら良く分かります。技術は教えてもらうものではなく、自分で学ぶものだということです。


 印象深いことがありまして、とあるITの炎上プロジェクトの助っ人をやっておったときのことです。担当者に対して色々説明を行っていたのですが、彼は相槌をうつだけで、一向に私の説明を理解していませんでした。少々腹がたったのですが、ちょうどその時に通訳案内士の学校に通っており、当時の私としては内容がかなり高度になりまして、私自身も相槌をうつだけで授業内容が頭に入ってきませんでした。「向いていないということはこういうことか」と当時は実感したものです。


 向いている向いていないは学習の進み具合に関係しますし、プロとして活動するようになってからも差が出てきますが、「向いている=プロとして優秀」というのは少し違うかと思います。私も炎上プロジェクトの当事者になって挫折も味わいましたし、プログラマとしては向いているかもしれませんが、企画やスケジュールを立てることは苦手(向いていない)です。画面のデザインも不得意です。結局、細かく検証していくと「業務に関して全方位的に向いている」という人は現実としていないのではないかと思います。ITエンジニアとしても長所・短所があり通訳案内士としても長所・短所があることになります。
 英語については向いていませんし、今でも「向いていない」と時々感じることですが、こちらも仕事をする上ではあくまでも一要素ということになります。「通訳案内士」は外国語で話をするのはそうなのですが、特に英語の場合、「ネイティブのように」というのは場合によりけりで、イギリス英語なのか、アメリカ英語なのか、西なのか、東なのか、非英語圏の人なのか、と様々あり、よく言われる「ネイティブ信仰」というのは必ずしも当てはまりません。(もっとも私はアメリカの西海岸に留学したのでカルフォルニアあたりから来た人は「うまいね」と確かに言われ、フランスからの人は「?」といわれます)。通訳案内士というのは実際にお客さんと同行して案内するのでいわゆる旅程管理という業務もになっており、さらにはお客さんは「日本人の意見が聞きたい」とか「日本のドラッグストアに行きたい」とかいろいろな要望に応える等、複合的な職業ということもあります。こちらも「英語の向き不向き」だけでは実力は測れないかと思います。ということで翻訳や通訳はともかく通訳案内士については、しばらくはAIにとって代わられないと思っています。


メンターについて


 メンターについてですが、英会話の先生については、あくまでも先生ということでそれ以上何かきくことはありませんでした。通訳案内士の学校の先生についてはある程度、メンターの役割もあったかもしれませんが、生徒が複数おり、あくまでも授業を聞くというところ以上のものはありませんでした。いずれの先生も感謝はしているのですが、メンターとまではいきませんでした。


一方で、ITエンジニアとしても通訳案内士としても仕事をやりだしてからは、数名ほど尊敬できる先輩(メンター)がいたのは事実です。が、残念ながら不徳の致すところで深い付き合いとはなりませんでした。もっともITエンジニアとしても通訳案内士としても自立した専門家になるということはメンターからは卒業という意識もありました。


プログラミング学習と英語学習の違い


 せっかくなので、プログラミング学習と英語学習の違いについても触れたいと思います。一番大きな違いは、「プログラミング学習は主に考えること」であるのに対して「英語学習はとにかく量(習うより慣れろ)」につきます。
 もちろん、どちらにしても「授業を受ける。先生の話を聞く」ということを否定はしませんが、プログラミングの場合、ある意味芸術家のように「あーでもない、こーでもない」と悩むこと自体がプログラマとしての基礎練習になります。私としては「オブジェクト指向おじさん?」の記事は、単に記事を読んで納得するのもいいし、異論や反論をする。つまり記事を読んで考える行為そのものが、エンジニアの成長のきっかけになると思います。
 一方で、英語の場合、考えるより鵜呑みにしてもよいので覚える行為が重要かと思います。実は、「自動詞と他動詞を考え直す(Part2)、日本人にとっての自動詞と他動詞の恐ろしさ」この記事自体は読み物としては面白いかと思いますが、「英語学習」にフォーカスを当てるとあまり意味がないです。おそらく英語の上級者はこの記事を読んで「で?」と思うと思います。この記事でも指摘しているとおりネイティブでも間違う(というか辞書どおりでない)というのは、日本人が日本語を話すときに細かい理屈を知らないことと似ています。「では何でこんなことを考えるのか?」ということですが、こういう理解というのは一種の精神安定剤的に作用します。つまり、「なんで自分ができないのか?自分が勘違いをしているのではないか?」という不安を解消するために使うと有効かと思います。直接的な学習効果はないが一種のサプリメントということができます。


老兵は死なず、AIと踊る

2026-01-04 | コメント:0件
Previous Page | Next Page