こんにちは
社会人でエンジニア4年目のクラゲちゃんです。
私はよく仕事で上司からこれやっておいて、と渡されたソースコードやサンプルのSQLを読んで、修正やDBからデータを検索することなんかをやる機会があります。
既に仕上がっているシステムの運用的な業務で、
まだ仕様を完全に理解していないけどこういうことを任されることも多いので、
結構複雑なものを読むことも多いんですよね。
頭だけで考えると全くわからん、といった初学者(プロの方や中級者)の方もいるんじゃないかと思い、私がすでに存在するものを解読するときに用いる実際の手法を教えたいと思います。
概要
-
日本語化する
(if = もし~ とか SELECT * from tb1 inner join tb2 on tb1.id = tb2.tb1_idはテーブル1とテーブル2をこのidでつなげて~とか) -
メモ帳に書き起こす (私のお気に入りはサクラエディタ)
-
書き起こした後でこれ本当にあってんの?って感じで開発環境とかで実行しちゃう
(UPDATEとかDB書き込みは絶対やらないで)
実践編
- 日本語化する
先人の知恵が詰まった、ソースコードとかSQLは、
日本語に分解しましょう
if (変数1 = 1) {
println("a");
} else {
println("b");
}
これなら、「もし「変数1」が1だったら「a」の文字列が出力されて、「変数1」が1じゃなかったら「b」が出力されるよ~」といった感じ
SQLでよく見る感じを書き起こすと
SELECT
tb1.*,
CASE
WHEN tb2.id IS NOT NULL THEN "1"
WHEN tb3.id IS NOT NULL THEN "2"
ELSE "0"
END
FROM tb1
left outer join tb2 on tb1.id = tb2.tb1_id
left outer join tb3 on tb1.id = tb3.tb1_id
WHERE
tb1.id => 1 AND tb1.id <= 100 AND delete_flg = 0
GROUP BY tb1.user
ORDER BY tb1.id asc
;
これを
- カラムはtb1を全部SELECTしてんなあ~
- tb1とtb2とtb3を外部でtb1のidで紐づけて、tb1のidが1から100の人で削除フラグが立っていない人を出してるな~
- tb1のuserをグループ化してまとめてるなあ~
- ソートはtb1.idの昇順か~
といった感じで、整理します。
複雑なSQLになればなるほど、サブクエリ→FROM→WHERE
みたいな順番で整理してくのオススメ
- メモ帳に書き起こす
1の頭で考えたものを1と並行してメモ帳に殴り書きします。
テキストエディタはなに使ってもいいんですが、僕は万年サクラエディタの人です。
- 開発環境とかで実行する
整理した後、自分なりに改造や修正ができたら期待する結果になるかバーンっと実行しちゃいましょう。
会社の実務で使うときは必ず他の人に確認してから
(ローカル環境で自己判断で勝手にやる場合は責任取れませんw)
ものによってはSELECTだろうと何だろうと、メモリ不足とかで落ちる場合が無きにしもあらずなので、難しいものはパフォーマンスチェックもしましょうね。
終わりに
僕はあんまり「新規開発」として触れる機会は少なめのエンジニアなんですが、
運用面でキャリア浅い人とか「いや、これわかんねえよ」っていうのも冷静になってみてみると
意外と単純なことやってるケースが多いですよね。
つなげてるだけなんだよね~実は
ってことで読み物に困ったら実践してみたらいかがでしょうか。
以上~