現場で求められるコード
Twitterで見かけたこちらの記事が元ネタです。
小学生向けプログラミングの本でしれっと有害な嘘を書くの、やめてくれませんかね…。前後は正しいから尚更厄介だ。 pic.twitter.com/xgbotOSi86
— まっつん総研 (@matsun_research) 2019年4月24日
・わかりやすく「美しい」ソースコードはあまり求められない
・動けばOK♪
ということなので裏を返せばどんなに分かりづらくても読みにくくても、そのプログラムが意図したとおりに動けばそれで良いということでしょう。
あともう一つ、日本語が使えないと書いてありますが、C#(VisualStudio?)はクラス名、メソッド名、変数名に日本語が使えます。
使いたくはありませんが。
美しいソースコード
ということで"美しい"という文字列を2行出力する非常に美しいプログラムを作成してみました。
実際に動きます。
解説はしません。
Don't think. feel.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace BeautifulProject
{
class Program
{
static void Main( string[] args )
{
var 美しい変数 = new 美しいクラス();
goto 尾張;
hell:
Console.WriteLine( 美しい変数.美しいメソッド( "美しい" ) );
goto おしり;
尾張:
goto hell;
小張:
Console.WriteLine( 美しい変数.超絶美麗( "1000" ) );
goto おわり;
おしり:
goto 小張;
おわり:
Console.ReadLine();
}
class 美しいクラス
{
public object 美しいフィールド = (int)0f;
public object 美しいプロパティ { get { return 美しいフィールド = "美しい"; } set { 美しいフィールド = "美しい".ToList(); } }
// 美しいメソッド
public object 美しいメソッド( object 美しい引数 )
{ return new string( "美しい".ToString().ToCharArray() ); }
// すごく美しいメソッド
public object 超絶美麗( object 美麗引数 )
{
Thread.Sleep( int.Parse( (string)美麗引数 ) * 0 + 1000 );
for( int i = 0; i < 5; i++ );
{ 美しいフィールド = 美しいプロパティ = 5; }
return 美しいメソッド( 美麗引数 );
}
}
}
}
自分なりに最大限のクソコードを書いたつもりですがインデントが揃っていたりオペレーターの左右にちゃんとスペース入れていたり育ちの良さが出てしまいました。
(IDEのオートフォーマットのショートカットキーを押すのが癖になっているので逆に崩すのが難しかったです)
正しく意図通りに動けばそれで良いのか
私としてはNOと言いたいです。
上記のサンプルを見ていただければわかると思いますが、2行の"美しい"という出力をするためだけに全く意味のないコードが大量に記述されています。
極端な例ではありますが動けばそれで良いということはこの美しいソースコードで問題ないということになってしまいます。
やむを得ない場合
とはいえ、最大限のパフォーマンスを出すためにはやむを得ずトリッキーな処理を組んだりして結構わかりづらいコードが出来上がってしまうことがあります。
その辺は本当に現場単位で、メンテナンス性を最重視するのか、最大限のパフォーマンスを出すことを最重視するのかの判断になってくるかと思います。
"正しい"知識だけでもだめ
ここで言う正しい知識とは、教科書通りの、行儀のよいプログラミングの知識ということです。
これは私の個人的な考えになりますが、美しく見やすいコードを書くためには、何がきれいで何が汚いコードなのかははっきりと区別できるようになっていなければならないと思います。
大体の参考書では基礎的な正しい知識を教えてくれますが、逆にやってはいけないような記述や実装などは本当に現場でもまれないと結構身につかないものでもあります。
(やらかしたり痛い目を見ると結構覚えますから)
バッドノウハウをまとめた記事なんかも探してみると結構あったりして、自分の中の固定観念が覆されたりして面白かったりします。
そのバッドノウハウが正しいかどうかは別として、そういう考え方もあるのか~って感じで。
美しく書こうとする努力
私自身も全然ソースコードを分かりやすくきれいにかけているとは思いません。
ミスすることもありますし、後から見返して一瞬「あれ?この時なんでこうしたんだっけ?」となったりすることもあります。(わかりづらいソースコードに理由があるならコメントも大事)
しかし「インデントをそろえる」だったり「forやifの中身がたった1行だけでも中かっこは絶対につける」など所々で記述がバラバラにならないようにしたりといった最低限の努力はしているつもりです。
分かりやすく簡潔にメソッド単位で処理をわける、変数、プロパティ、メソッド名のつけ方、気にするところはいくらでもあります。
※コーディングルールがあればそれに従います。
プログラムを書くことはあくまで手段なので、最終的には意図通りに動作することが絶対的に正義ですが、メンテナンスするのは人間なので人間が読んで見やすい、追いやすい、そういったプログラムを書ける人が実際の現場では求められるのではないでしょうか。
美しくコードを書くことについては色々な意見があり、色々な方がまとめてらっしゃるので一度そういう記事に目を通してみると良いかと思います。
絶対的にこうだというのはないですが一般的にこうだというのはあると思います。
まとめ
美しいと感じる感覚は人それぞれですし、自分がいくら見やすいと感じても他の人からしたらなぜそうしたのか、意図がわからないと思われるかもしれません。
自分の知識不足で他の人が書いたコードが美しいのか美しくないのか判断ができないかもしれません。
やむを得ず分かりづらいコードを書いてしまったらその理由をコメントとして残しましょう。
他の人のソースコードの意味が分からなかったら勉強しましょう(それでもやっぱり意味が分からなければそれはクソコードの可能性があります)。
そして最低限、Twitterなどでクソコードとして糾弾されるようなものを生み出さないようにみんなで努力していきましょう。
それが世界(主にIT業界の)平和につながるかもしれません。