表参道.rb #4に参加したよ #omotesandorb
ちょっと、時間が経ってしまったのですが上記のイベントへ行ってきました。
目的
Rubyエンジニアとして成長したいが実務では触らないので、勉強会で刺激を受けたい。
個人でやるにも限界が…。
ということで第二回から一回飛んでの参加です。*1
感想
まず、会場となったクラウドワークスさん。
非常に綺麗な会社で、立地的にもおしゃれ。このような場を提供いただきありがとうございます。
渋谷の街行く人にビビりながら歩いてたどり着きました。
ちょっとギリギリすぎて、Wifiが繋がらず「あれ?あれ?」とかやっている間にどんどん進行していきました。 wifi気にしすぎて、せっかくの発表が上の空になってしまって、勿体無いことをしてしまった…。
全体としては、自分はRuby/Railsでプロダクトを作ってないので細かい空気感は分からないのですが、メタな部分ではあるあるな内容でした。
なんというか、Rubyを書いている人間は結構幸せそうにプログラミングしてるな。とか勝手に印象で思っていたのですが、*2プログラマーとしての辛みというか闇の部分はどこでも変わらないんだなぁという変な安心を覚えたのが印象的でした。
ただ、それでもこの勉強会は2回目ですが、Rubyコミュニティの特徴なのか、この勉強会の特徴なのか非常にポジティブで向上心に飛んだ参加者、発表者で健全なコミュニティだと思います。
自分はRuby関連技術でプロダクトを作ってないという引け目であまり積極的に何かしたわけではないのですが、何かこのコミュニティのために出来たらなぁとぼんやり考えている。
そんな感じです。*3
人月から価値へ
人月のを提供する企業から価値を提供する企業に転職して一週間。 そこらへんのパラダイムの違いを自分なりに整理してみます。
人月の世界での自分を売る
転職前、人月世界でソフトウェアエンジニアとしての自分の売りは以下のようなものでした。
- 相対的に人より早く(つまり少ない人月で)ソフトウェアを作り上げたり、修正したりできる。
- 相対的に人よりバグが少なく(つまり余計な瑕疵による人月浪費をせずに)ソフトウェアを作り上げたり、修正したりできる。
- 客先で人より長時間労働できる。(つまり人月の売上高が高い)
価値提供の世界で自分を売る
これから自分が売りにしなければいけないことを考えてみます。
- 人より早く価値を生み出すソフトウェアプロダクトを作り上げたり、修正したりする。
- 人より価値を生み出すソフトウェアをより高める為修正等保守しやすく作り上げたり、修正したりできる。
- 人より生産性が最大化できるような時間配分で仕事をし価値を生み出すソフトウェアを世に送り出す。
こんなところでしょうか。
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なので、コーディングすべき内容が頭に入る状態になるまでに制限時間半分とか1/3とか使ってしまっている状態。
「あ、こういうことやるのね」ってなるまでにもう時間的に間違うことできない状態になって精神的に追い込まれていたりする。
事前にコーディングを面接時にやるって知らないとやばい
募集要項とか面接前の連絡でコーディングを出題することがあると書いてあったりすると、多少の心の準備もできるのですが、そういう事前情報無しにいきなりコーディングだとなんだかんだ焦る。
ていうか、面接で何話すかとか自分のスキル棚卸とかそういう部分とコーディングって脳の使う部分が違いすぎて変な感じ。*2
面接官の面前でコーディングやるとやばい
人に見られながらコーディングするとかどういうプレイ?って感じで初めてな訳ですよ。
ペアプロはやるけど、信頼できるチームの仲間と役割分担してやるっていうのと、面接という場で自分の力を証明すべき相手に見られながらというのではえらい違いがある。
で、上がってわけわからなくなるわけです。
1日に複数件の面接とか入れていてコーディングやるとやばい
「はぁ、今日3件目の面接だ」とかそういう状態で「じゃ、コード書いて」ってなって頭が回らないことにびっくりした。
そういうスケジュールで面接やる馬鹿は振るい落とされるというのならば仕方ないが、まぁ失敗したなぁ。
という、失敗談集でしたそれぞれ対策とかも考えれば考えられると思うけどもういいや。
第二回表参道.rbに参加してみた #omotesandorb
表題の通り参加してみました。
なぜ参加したのか?
Rubyをプロダクトとして書いていないがRubyコミュニティに顔を出してみたかった。
でも、歴史のあるコミュニティでは新参ものが浮きそうだし、今回のテーマ=コードレビューはもともと興味もあった事柄だったので参加を決めました。
内容の簡単なまとめ
今回はテーマに沿ったLT的*1な発表中心とした会でした。
全体としては、『日々実務でRubyでWebサービスを開発する中でレビューこんな風にやってるよ』という話が多かったと思います。
それぞれ実践的な話*2で、参加者の皆さんの日々の改善活動の成果や試行錯誤が伺えました。
発表内容のLTプレゼンはどこに公開されているかわからないので割愛します。
当日のTLは@yachibitさんがまとめてくれております。
個人的な感想
- 参加者(発表者)はイケてるWebサービスの開発者
- 場所柄なのか、Rubyコミュニティの性質なのかは分かりませんがそういう風に見えました。
- SI的な文脈はなかった。
- 最近どこいってもそんな感じ。(狭い観測範囲)
- たとえばWFの中でどうレビューする?とか。
- レビュー工数の見積とか
- GitHubあたりまえ
- PRあたりまえ
- でも、レビューそのものの本質的な内容も含まれていて自分から見るとハイブリッドで不思議な感じ
- ツールや自動化への感度が高くて、いい感じ
- 会社でのプロダクトの話
- 普通そうか。
- 個人プロジェクトでレビューどうすっか?とか最近考えているけど…。
- 自分が無職なんでそういうところあるかな?と勝手に期待したけど…
- 普通は普段の業務でのコードレビューの話になるよな。そりゃそうだ。
- 自分の立ち位置*3はかなり異色だったのかもしれないけど、LTやれば良かったかな?とか思った。
- 異なる立ち位置だという部分で他の人と異なるLT出来たかもしれないな。
ループを使わないFizzBuzz問題の解き方
プログラマの登竜門FizzBuzz問題について。
ループを使わない解き方を書いてみた。
通常、この手のループを使わない系は関数の再帰呼び出しで解くのだけど
そこをもう一捻りしてコンパイル時に全てのループが展開されている方法をやってみた。
つまり、C++のテンプレートメタプログラミングでコンパイル時にテンプレートが展開されているってやつ。
どうやらC++のテンプレートメタプログラミングはチューリング完全だそうで、
噂には聞いていたのだけど、実際どんなもんなのか自分の手を動かして確かめてみた。
一年に一度くらいしか書かないC++でなんか怪しい感じだけど動くは動く。*1
ループの進め方とか色々もっとスマートに出来ないのかな?とも思うけど現状はこんな所で。
Virtual Box上でRails 4.2.1で WEBRickを立ち上げたら接続できなかった話
最近、ドットインストールでRailsの勉強していたのですが、レッスン通りにやっても動かなくて困った話。
"はじめてのRuby on Rails #3" でブラウザから動作確認すると接続できなかったのでなぜかな?と調べた経緯の記録。 *1
調査方法
- まずVirtual Box上のGuest OSとの疎通がHost側からできてない?と思いました。
- WEBRickが正常に動いてない?と思いました。
- そこで、WEBRick起動時に表示されるPort:3000を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動かせないけど、こういう足回りというか基礎的なことを固めておかないとあとあと理解せずに泥沼に突っ込むので大事なステップだと思うのです。
拙速を尊ぶような組織では出来ないけど、自分の趣味でやっているので良いよね。