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

Line 1: Error: Invalid Blog('by Esehara' )

または私は如何にして心配するのを止めてバグを愛するようになったか

>> Zanmemo

あと何かあれは 「esehara あっと じーめーる」 か @esehara まで

日報: とある企業に面接に行ってきた(1)

今日の風景

f:id:nisemono_san:20161018180539j:plain

転職しようとする人のモノマネです

本文

シリーズもののように、連番は付けているが、これが続くかどうかはわからないが、感触からすれば続くだろうなと思ったので連番にしようと思った。

一般的に、最近の企業ならば、面接者にコードを書かせるかと思われる。とある企業では、事前に聞いていたテストだったので、ここで種あかしするのは野暮であり、と同時に一部には「とある企業」の「とある」が分かってしまうので、曖昧にぼかすのだけれども、基本的に自分はREPLに甘やかされていて、それで通らないコードを提出してしまった。

なので、今からでもいいから「そのソース書きなおさせろ」と殴りこみをかけたいものだが、良識を分きまえているつもりなので、それは知なかったが、動かないコードが、あとから動かないと気がついて、面接会場から出るというのは、本当に恥かしい経験で、穴があったら入りたいどころか、穴二つ分作りたい気分になったりした。

まあそういうことなので、面接の内容を若干変更して、こういうものだった、というのを解説すると次のようになる。

まず、「esehara」という文字列がある。この文字列を「eeaa」といったように、一文字ずつ飛ばし文字にするにはどうしたらいいか、という課題だったと、ここでは仮定しよう。

最初に、自分が「多分これで動く」というコードをエディタで提出した結果である。

def one_jump(s)
  r = []
  s.each_with_index do |c, i|
    r.shift(c) if i % 2 == 0
  end
  return r.to_s
end

まず最初に、shiftは先頭から要素を取りだしてくるメソッドであるので、これは本来間違いでpushを使うべきだった。あと、to_sも、これも単純に配列を文字列にするだけだから、これも減点。こちらはjoinを使うべき。これは勘違いのご愛嬌だったとしても(普通のRubyistなら間違わない点だから、この時点で失格だろう)、もっとまずいエラーがある。

よく文字列といえば「列」なので、恰も配列のように扱ってしまう傾向にある。例えば"Foobar"[2]であるならば、oという文字列を取ってくる。しかし、Rubyの場合、文字列は厳密には配列(もうちょっと言えばArrayではない)ので、each_with_indexは使えないのである。

これに気がついた瞬間、似非原は激怒した。必ず、かの無知蒙昧なるコードを除かなければならぬと決意した。メロスには転職がわからぬ。メロスは、ただの無職である。ブログを書き、Rubyと遊んで暮して来た。けれどもコードに対しては、人一倍に鈍感であった、というわけである

とはいえ、親友のために走りだしたとしても別にコードは書きなおさせてくれないものであるから、無く無くこの凡ミスを受けいれるしかない(どれだけ採用に響くかは知らないが、すくなくとも「これが残っていると恥ずかしい」というのは誰しもあると思う)。

長々とコメントが続いてしまったけれども、ではどうすればいいのか。これはRubyでは良く付かわれるテクニックで、スニペットみたいなものだけれども、split('')を使えば良い。

def one_jump(s)
  r = []
  s.split('').each_with_index do |c, i|
    r.push(c) if i % 2 == 0
  end
  return r.join('')
end

というわけで、本来はこういうコードが書ければ良かったのだけれども、いざ目の前でコードを書いてみろと言われると、こういう恥ずかしいコードになってしまうわけで、恥ずかしいということはお祈りということにも繋る。まだ、それが明確になっているわけではないから、そのように自分でふてくされるのは意味がないことだが、既に自分の中では「やってしまった」感が強いのは否めない。従って、似非原先生の次回作にご期待下さい、ということになる。(続く)

ちなみに

どうしてもeachを使いたい場合には、each_charというメソッドが用意されていることを教えてもらいました。