読者です 読者をやめる 読者になる 読者になる

解答編 - Erlangプログラマを見分ける16の質問

気が向いたので。まだ問題を見てない方は、問題を見てからやったら楽しいかも。けっこう適当だよ。

  1. ErlangOOPを実現する方法を説明せよ
    • Parametrized moduleというのを使う。ただしできたオブジェクトは結局immutableなので、真面目にオブジェクト指向するときはインスタンスを軽量プロセスで実現するよ。
  2. 例外を用いるべき場面を説明せよ
    • ふつうはok/{error,reason()}でエラーとるが、エラー処理のネストが深くなったりtype/specが収拾つかなくなったりするときはまあ例外でもいいと思う。ここは宗教論争とか水掛け論になれば合格レベルかな。messagepack/erlangではリストにつけたしてくタイプの末尾再帰の関数のエラー処理で苦労した挙句例外を使うしかなかったので、例外を使う場面があってもいいと思う。
  3. BERTについて説明せよ
    • Binary ERlang Termの略。JSONとかより断然速くて、ちっさなデータをやりとりするときはMessagePackよりちょと遅い。ertsにネイティブで組み込まれているので、Erlangが絡む多言語のシステムをつくるときはやっぱりこれが一番。ちょっと前にGithubがBERT-RPCを公開して話題になったよね。
  4. supervision treeとは何か?
    • 日本語でいうとプロセス監視ツリーってところ?OTP使ってたら常識だよね。
  5. 状態機械を実装する方法を説明せよ
    • gen_fsmという単語がでれば合格。gen_fsmの残念なところまで説明できればモアベター
  6. Erlangで静的に型チェックを行う方法とは?
    • Dialyzerを使う。コンパイラに組み込んでくれたらエエのにね…。TypErでtype/specが出せるかどうかもよい指標
  7. 1マシンで何プロセスまで立ち上げてよいか説明せよ
  8. 戦闘機とカンガルーのどちらが優れているか?
    • 英語だとカンガルーが即戦力で強いが、日本語になるとカンガルーは急に弱くなる。最終的には戦闘機の圧勝。戦闘機を乗りこなしたヤツだけがカンガルーを使ってもいいよ。
  9. 現実世界は全てActorであるか?
    • 確信犯的に「はい」と答えたらまあいいんじゃないでしょうか。ぼくはActorだとは思わないけど。
  10. Erlangの言語仕様で残念な点を1個以上説明せよ
    • パターンマッチでorが書けないところとか、Maybeモナド的なのがないところとか。Maybeモナドがあれば例外とかの問題も解決するよね。例外がモナドそのものだよとか言われたらアレだけど。
  11. Erlangの処理系の実装で残念な点を1個以上説明せよ
    • プリエンプティブじゃないところとか?*1個人的にはIOまわりの仕組みがprim_inet/prim_fileを結局みないといけないところかなあ。もっとIOと密結合しても面白かったのになと思う。
  12. Erlangプログラミング言語ではない。理由を説明せよ
  13. プロセス間のメッセージングに ! を使うべきでない理由を説明せよ
    • OTP使ってたら!なんて悪だよなあと気付くはず。noproc喰らった日には涙目だよね。
  14. Erlangで書かれたソフトウェアのデバッグとQAの方法を説明せよ
    • デバッグは基本的には、eunitでかっちりテストキメつつprintfデバッグとなってしまう。付属のデバッガはwxErlangとかTcl/Tkなしじゃと動かないとかいう残念なシロモノなので。erl_crash.dumpの中身も解析できればモアベターだけど。あとはQuickCheck使うくらいか。本当はeunitを超えるテスティングフレームワークの可能性があると思っているけど、ネットワークサーバー書いてる限りはありモノで何とかなる。
  15. Erlangで書かれたプログラムを高速化する方法を2つ挙げよ
    • hipeでネイティブコンパイルするか、NIFで書きなおすか。ただしIO入った処理はNIF使っちゃいけないからね。
  16. 1秒間に"OTP"と30回発声できるか?
    • ちゃんと-smpつけてerlを起動してね。ああ、MacOS限定かも。Linuxとかは方法考えてください。たぶん1秒くらいで終わるはず。timer:tc/2してみたら400msくらいで終わってたぽい。
    [ spawn(fun()->open_port({spawn, "say OTP"},[]) end) || _ <- lists:seq(1,30) ].

本当はメモリのリソース設計とかGCとかその辺りにも触れておきたいのだが、私がよく分かってないという><

補足

Erlangのプロセスはプリエンプティブですね。ウソつきましたごめんなさい。

Scheduling is preemptive. Regardless of priority, a process is preempted when it has consumed more than a certain amount of reductions since the last time it was selected for execution.

番外編

  1. Erlangの処理系の実装を2つ答えなさい
  2. 99.9999999% さて9はいくつでしょう?
    • ないんないん、キュー
  3. Erlangで実装されたLLの名前は?
    • Reia

*1:すいませんウソつきました。補足参照

*2:ErjangってOTP使えるのかなぁ?!有識者の意見求む