何か着ていればいいよ

ソフトウェア技術者の日常や技術の話を書こうと思います。

人月から価値へ

人月のを提供する企業から価値を提供する企業に転職して一週間。 そこらへんのパラダイムの違いを自分なりに整理してみます。

人月の世界での自分を売る

転職前、人月世界でソフトウェアエンジニアとしての自分の売りは以下のようなものでした。

  • 相対的に人より早く(つまり少ない人月で)ソフトウェアを作り上げたり、修正したりできる。
  • 相対的に人よりバグが少なく(つまり余計な瑕疵による人月浪費をせずに)ソフトウェアを作り上げたり、修正したりできる。
  • 客先で人より長時間労働できる。(つまり人月の売上高が高い)

価値提供の世界で自分を売る

これから自分が売りにしなければいけないことを考えてみます。

  • 人より早く価値を生み出すソフトウェアプロダクトを作り上げたり、修正したりする。
  • 人より価値を生み出すソフトウェアをより高める為修正等保守しやすく作り上げたり、修正したりできる。
  • 人より生産性が最大化できるような時間配分で仕事をし価値を生み出すソフトウェアを世に送り出す。

こんなところでしょうか。

Rubyの配列(あるいはオブジェクト)の振る舞いがよく分からない。

表題の件について、今日は色々はまっているのでその経緯を残しておく。

環境

OS:mac os x
ruby: ruby 2.0.0p481

状況

ruby koansのabout_dice_project.rbを解いていて以下の状況にぶち当たった。
あるクラスのメンバ変数*1を配列クラスでもっており、そのclearメソッドを使うか、別のインスタンスを使うかでランダムなはずの配列の結果が意図と異なる振る舞いをする。
と、文章で書いても意味わからないので実際のコードを抜粋。

class DiceSet
  def initialize
    @values = []
  end
  attr_accessor :values
  def roll(value)
    @values.clear
    value.times{@values << ([*1..6].sample())}
  end
end

dice = DiceSet.new

dice.roll(5)
first_time = dice.values

dice.roll(5)
second_time = dice.values

first_time == second_time # => true だけどなんで?

この場合、first_timeとsecond_timeの内容は非常に稀な可能性を除いて異なる物になることを期待しているんだけど、まったく同じ要素の配列になっちゃうのはなんでなんだぜ?
ってところがわからない。
多分知っている人が見たら一瞬なんだろうけど、自分のググリビティではぱっと何故か?という点にたどり着けなかったので現時点ではよく分かってない状況。
rollメソッド内でclearメソッドを読んでいる箇所を別の配列のインスタンスに置き換えると意図したとおり毎回異なる配列が返るのだけど…。

class DiceSet
  def initialize
    @values = []
  end
  attr_accessor :values
  def roll(value)
    @values = []
    value.times{@values << ([*1..6].sample())}
  end
end

dice = DiceSet.new

dice.roll(5)
first_time = dice.values

dice.roll(5)
second_time = dice.values

first_time == second_time # => ほとんどの場合false

しょぼい、Rubyスキルを晒すことになるけどとりあえず今はこんな感じ。

*1:C++とかJavaっぽい表現だけど、そちらの出身なので…。Ruby的にはなんて言うのかな?

僕はこうして失敗しました - 転職面接でのコーディングについて

ここ数ヶ月ソフトウェアエンジニアとして転職面接をしていて非常に苦手だったのが 面接のその場でコーディングってやつ。
というわけで、その失敗経験をちょっと記録しておきます。

いきなりコーディングはやばい

面接官が入ってきて、自己紹介をするや否や「じゃ、この問題解いてもらえますか?」とコーディングの試験が始まるパターン。
プログラマとして、正直自分はコンテキストスイッチのコストが非常に高い部類*1なので、コーディングすべき内容が頭に入る状態になるまでに制限時間半分とか1/3とか使ってしまっている状態。
「あ、こういうことやるのね」ってなるまでにもう時間的に間違うことできない状態になって精神的に追い込まれていたりする。

事前にコーディングを面接時にやるって知らないとやばい

募集要項とか面接前の連絡でコーディングを出題することがあると書いてあったりすると、多少の心の準備もできるのですが、そういう事前情報無しにいきなりコーディングだとなんだかんだ焦る。
ていうか、面接で何話すかとか自分のスキル棚卸とかそういう部分とコーディングって脳の使う部分が違いすぎて変な感じ。*2

面接官の面前でコーディングやるとやばい

人に見られながらコーディングするとかどういうプレイ?って感じで初めてな訳ですよ。
ペアプロはやるけど、信頼できるチームの仲間と役割分担してやるっていうのと、面接という場で自分の力を証明すべき相手に見られながらというのではえらい違いがある。
で、上がってわけわからなくなるわけです。

1日に複数件の面接とか入れていてコーディングやるとやばい

「はぁ、今日3件目の面接だ」とかそういう状態で「じゃ、コード書いて」ってなって頭が回らないことにびっくりした。
そういうスケジュールで面接やる馬鹿は振るい落とされるというのならば仕方ないが、まぁ失敗したなぁ。

という、失敗談集でしたそれぞれ対策とかも考えれば考えられると思うけどもういいや。

*1:いつも意識をコードに持っていくの時間がかかる

*2:お前の脳ミソが残念すぎるとか、そういう無能を選別するためにやっているのだとかいうのならもうぐうの音も出ないし、しょうがないのだけど…。

第二回表参道.rbに参加してみた #omotesandorb

表題の通り参加してみました。

omotesandorb.connpass.com

なぜ参加したのか?

Rubyをプロダクトとして書いていないがRubyコミュニティに顔を出してみたかった。
でも、歴史のあるコミュニティでは新参ものが浮きそうだし、今回のテーマ=コードレビューはもともと興味もあった事柄だったので参加を決めました。

内容の簡単なまとめ

今回はテーマに沿ったLT的*1な発表中心とした会でした。
全体としては、『日々実務でRubyWebサービスを開発する中でレビューこんな風にやってるよ』という話が多かったと思います。
それぞれ実践的な話*2で、参加者の皆さんの日々の改善活動の成果や試行錯誤が伺えました。

発表内容のLTプレゼンはどこに公開されているかわからないので割愛します。
当日のTLは@yachibitさんがまとめてくれております。

togetter.com

個人的な感想

  • 参加者(発表者)はイケてるWebサービスの開発者
    • 場所柄なのか、Rubyコミュニティの性質なのかは分かりませんがそういう風に見えました。
  • SI的な文脈はなかった。
    • 最近どこいってもそんな感じ。(狭い観測範囲)
    • たとえばWFの中でどうレビューする?とか。
    • レビュー工数の見積とか
  • GitHubあたりまえ
    • PRあたりまえ
    • でも、レビューそのものの本質的な内容も含まれていて自分から見るとハイブリッドで不思議な感じ
  • ツールや自動化への感度が高くて、いい感じ
  • 会社でのプロダクトの話
    • 普通そうか。
    • 個人プロジェクトでレビューどうすっか?とか最近考えているけど…。
      • 自分が無職なんでそういうところあるかな?と勝手に期待したけど…
      • 普通は普段の業務でのコードレビューの話になるよな。そりゃそうだ。
  • 自分の立ち位置*3はかなり異色だったのかもしれないけど、LTやれば良かったかな?とか思った。
    • 異なる立ち位置だという部分で他の人と異なるLT出来たかもしれないな。

*1:でも、かなり実践的というか地に足がついた内容だった。

*2:と普段Rubyで仕事していない自分には思えた。

*3:無職、Java,C#メインRubyほぼ素人、おっさん

ループを使わないFizzBuzz問題の解き方

プログラマの登竜門FizzBuzz問題について。

ループを使わない解き方を書いてみた。

通常、この手のループを使わない系は関数の再帰呼び出しで解くのだけど
そこをもう一捻りしてコンパイル時に全てのループが展開されている方法をやってみた。

つまり、C++テンプレートメタプログラミングコンパイル時にテンプレートが展開されているってやつ。 どうやらC++テンプレートメタプログラミングチューリング完全だそうで、
噂には聞いていたのだけど、実際どんなもんなのか自分の手を動かして確かめてみた。

gist.github.com

一年に一度くらいしか書かないC++でなんか怪しい感じだけど動くは動く。*1
ループの進め方とか色々もっとスマートに出来ないのかな?とも思うけど現状はこんな所で。

*1:Mac OSXのLLVM 6.1.0で動作確認

Virtual Box上でRails 4.2.1で WEBRickを立ち上げたら接続できなかった話

最近、ドットインストールでRailsの勉強していたのですが、レッスン通りにやっても動かなくて困った話。

dotinstall.com

"はじめてのRuby on Rails #3" でブラウザから動作確認すると接続できなかったのでなぜかな?と調べた経緯の記録。 *1

調査方法

  • まずVirtual Box上のGuest OSとの疎通がHost側からできてない?と思いました。
    • そのため、WEBRickの使っているPort:3000ではなく80にアクセスしてみる。
    • そうするとPort:80は正常に以前Apacheに仕掛けておいたページが見える
  • WEBRickが正常に動いてない?と思いました。
    • rails sで起動時に出るpidをpsコマンドの結果から探してみる。
    • あった。なのでWEBRickは起動している。
  • そこで、WEBRick起動時に表示されるPort:3000をListenしていないのでは?と思い立つ。
    • netstatコマンドでListenしているPortを確認Port:3000はListenしている。
    • そこで、気づくPort:80は0.0.0.0でListenしているけど、Port:3000は127.0.0.1でListenしている。

ここまでの調査結果からRailsからWEBRickを立ち上げる際に127.0.0.1にbindしているからHostから繋がらないのだな。とおおよそ推測。

そこで、rails s のオプションをしらべてrails s --bind=0.0.0.0で立ち上げたところHost側からブラウザ経由で繋がることを確認できました。 *2

めでたしめでたし。

と、行きたいところですが少し気になるところがある。

  • 127.0.0.1と0.0.0.0ってどう違いがあるんだっけ?

というわけで次はそこの調査。
とかやっていると全然Rails動かせないけど、こういう足回りというか基礎的なことを固めておかないとあとあと理解せずに泥沼に突っ込むので大事なステップだと思うのです。
拙速を尊ぶような組織では出来ないけど、自分の趣味でやっているので良いよね。

*1:あとあと、よく見たら補足情報に書いてあった…。でも調べたのは無駄じゃないよね。あと、自分で解決まで持っていけると気分が良い。

*2:そこらへん分かってから調べたらずばりの記事もあった。 qiita.com

Native2AsciiのJavaScript版を作ってみた

前職でJavaで他言語Webアプリケーションを書いている時に欲しかった機能をモヤモヤが残っていたので作ってみた。
超適当なものだけど、思ったより簡単にできたので以前困っていた時につくってしまえばよかった…。

やりたかったこととその経緯

Eclipseで開発している場合、property editorを入れてしまえばNative2Asciiは意識しなくてすむのだけど、 自分は常に2-3プロジェクトを抱えていてEclipseVisual Studio同時立ち上げとかEclipseを3つ同時立ち上げとかするはめになりちょっとしたpropertyファイル内の文言確認のためにいちいちEclipseとか立ち上げたくないというのがよくあった。
で、コマンドラインでNative2Ascii打つといっても見たいのは数百行のうち数行分だけとかの場合面倒。
というわけでブラウザ上で簡単に一行分だけNative2Asciiの結果得られないかな?とか考えていた。(2012頃から)

やったこと

上記のような経緯を元に構想はあったものの多忙につきやっていなかったNative2AsciiのJavaScript実装をちっとやってみた。*1
*2

リポジトリとでもサイトはこちら

github.com

native2ascii.js demo

気づいたこと

GitBucketでの手習いが生きた

前職では後輩が社内にGitBucketが立ててくれたのでそちらに色々、あげていたのだけど退職時にほとんどそのまま残してきたので自分のGitHubがお寒いことになっていた。
そこで、枯れ木も山の賑わいとばかりに、どんなにしょぼいものでも上げていこうとGitHubを使ってみた。
GitBucketが流石にGitHub cloneということで使い勝手が似ており何もハマらずに使うことができたのがよかった。

GitHubでWebページを公開できる!

これは知らなかったので、ビックリ。というか前から知っていれば色々できたのに!という悔しさ。

qiita.com

こちらの記事を参考にさせていただきました。

*1:探せばずばりのものがあるのかもしれないけど、前職で困っていた時は見つからなかったし、今は車輪でも再発明してやろうという気概に満ちているので

*2:ていうか今探したら余裕でいっぱい出てくるなぁ、以前は自分のググリティが低すぎたのだ…。