エラーコードは googlability や greppability にも着目するといい事があるよ

# きっかけ
@nrslib さんの [あなたのエラーコードは何ですか？](https://qiita.com/nrslib/items/1287b5888f7db6166320) という記事に触発されて書きはじめました。
単なる数値よりも enum を使う方がいいという点に非常に共感します。
スプレッドシートが正よりも、コードが正のほうがいいですからね。

それでも個人的にはあくまで正をコードとしながら、従としてコード以外の方法でまとめてもいいと思います。
重複管理になるリスクはもちろんありますが、システムに関連した何らかのデータを手動で作成してもらう時, [importrange(...)](https://support.google.com/docs/answer/3093340) と [vlookup(...)](https://support.google.com/docs/answer/3093318) を使うと非常に便利です。

# エラーが出るとみんなググるものだ
その昔、はてなダイアリーに技術的な日記をよく書いていました。
当時の自分の日記のアクセス解析のリファラーで、常に上位を占めていたのはエラーコード関連をサーチエンジンにかけた時のリファラーでした。
つまりユーザーにエラーコードが提示される時、大抵は情報不足でユーザーは解決方法がわからないものなのです。

その解決方法や、試してみたけれど上手くいかなかったアプローチでも記事にしておけば、他の人にとって有益です。
自身にとっても、アクセス数が伸びる事や誰かの役にたつことはモチベーションに繋がる事だと思います。

# エラーコードの googlability を高めよう
誰かが記事を書いた時、その記事が検索結果で上位にくる程度には googlability を高めることで、こちらの情報提示不足を補う事ができると思います。
この時、関係ない記事しか検索結果に出ないエラーコードになってしまったら、あなたはユーザー対応に更に時間を消費する事になるか、
あるいはユーザーがあなたやあなたのシステムに見切りをつけて、あなたの価値が下がることに繋がります。

例えあなたが携わっているのがローカルなシステムだとしても、ユーザーから問い合わせがあった時に、何が起こったのかを迅速に把握する為にはエラーコードの固有性は高いほうがいいはずです。[^1]

# どうすればいい?
ほとんど一般名詞だけからなるエラーコードになってしまうと、googlability や greppability は下がります。
それ単体ではよくわからない謎の数字やコード体系のコードなども併記してあげる事で、これに対応する事が可能なはずです。

賢明なユーザーの中には、こうしたよく分からないコードが問題解決の役に立つ可能性がある事を知っていて、問題に直面した際に報告に含めてくれる人が少なくありません。

以下に Java の enum での例と C# の enum での例を挙げたいと思います。
これはあまり深く考慮していない例なので、もっと良いやり方がある可能性は高い事を先にお詫びしておきます。

```ErrorCodeExample.java
// To use: ErrorCodeExample.SOME_TERRIBLE_ERROR.getInternalErrorCode()
public enum ErrorCodeExample {
	SOME_HORRIBLE_ERROR("EC-000001"),
	SOME_TERRIBLE_ERROR("EC-000002"),
	SOME_SERIOUS_ERROR("EC-000003"),
	SOME_MALICIOUS_ERROR("EC-000004"),
	;
	
	private String internalErrorCode = ""; // StringUtils.EMPTY
	
	ErrorCodeExample(String internalErrorCode) {
		this.internalErrorCode = internalErrorCode;
	}
	
	public String getInternalErrorCode() {
		return this.internalErrorCode;
	}
	
	// Other details are omitted.
}
```

```ErrorCodeExample.cs
// To use: ErrorCodeExample.SomeTerribleError.ToInternalErrorCode());

public enum ErrorCodeExample
{
	[ErrorDetail(internalErrorCode: "EC-000001")]
	SomeHorribleError = 0,
	
	[ErrorDetail(internalErrorCode: "EC-000002")]
	SomeTerribleError,
	
	[ErrorDetail(internalErrorCode: "EC-000003")]
	SomeSeriousError,
	
	[ErrorDetail(internalErrorCode: "EC-000004")]
	SomeMaliciousError,
}

public static class ErrorCodeExampleExtensions
{
	public static string ToInternalErrorCode(this ErrorCodeExample errorCodeExample)
	{
		var type = errorCodeExample.GetType();
		var stringExpr = errorCodeExample.ToString();
		var runtimeField = type.GetRuntimeField(stringExpr);
		var attr = runtimeField.GetCustomAttribute(typeof(ErrorDetailAttribute), false);
		var errorDetailAttribute = attr as ErrorDetailAttribute;
		if (errorDetailAttribute == null)
		{
			return string.Empty;
		}
		
		return errorDetailAttribute.InternalErrorCode;
	}
	
	// Other details are omitted.
}

[System.AttributeUsage(System.AttributeTargets.Field)]
public class ErrorDetailAttribute : System.Attribute
{
	public ErrorDetailAttribute(string internalErrorCode)
	{
		this.InternalErrorCode = internalErrorCode;
	}
	
	public string InternalErrorCode { get; private set; } = string.Empty;
	
	// Other details are omitted.
}
```


[^1]: この点はエラーコードに限らず、コード内の識別子名や製品名の付け方にも通ずる所があると思います。個人的に最近の製品名は一般名詞性が高すぎて googlability を損なっているケースが多いと思います。著名ないくつかのプログラミング言語などは、この観点から見ると最低レベルの命名だと思います。対してこの観点からの素晴らしい命名を挙げると Hadoop などは実に素晴らしい命名であると感じます。