Treasureに参加して失ったもの
目次です。
Treasureとは
Treasureとは、 株式会社 VOYAGE GROUPが開催したサマーインターンのことです。 株式会社VOYAGE GROUP | 人を軸にした事業開発会社
Treasureに参加して来たので、その感想など書こうかなと思います。来年参加を検討している人のちょっとでも役に立てればと思います。
選考
全員がそうではないと思いますが、僕の場合は選考は一日で3回面接をしました。 一人目が人事の方、二人目、三人目は共にエンジニアの方でした。それぞれ約30分ずつ、休憩時間合計したら約2時間ほどでした。 一日でこれだけ面接やるのは初めてだったので非常に疲れました。
そして面接の後に、適性テストあります。(テストというよりアンケートっぽかったです。)
一人目の人事の方とは、こんな感じの話をしました(確か)
- これまで頑張ったこと
- その中でも大変だったことは何か
- その経験から何を学んだか
- 将来何がしたいのか
的な話です。特に準備することなく、今までのことをそのまま伝えました。
二人目のエンジニアの方とは
- 自分の今まで作ったものを見せる
- 実装で苦労した面
- 工夫した点
的な話をしました。
三人目のエンジニアの方とは
- セキュリティの知識問われたり
- DBの知識問われたり
- 今まで実装したものをホワイトボードをつかってDB構造を解説したり
より技術的な話をしました。
この時、会社の印象としては、すごいラフでフレンドリーな感じだなぁと思いました。(あと、オフィスが遊び心出しすぎちゃいましたテヘペロって感じのレイアウト・デザインでした。奇抜でした。)
内容・スケジュール
無事合格の連絡をいただき、参加することが決定しました。
ここまで読んでいただいた方には申し訳なのですが、 筋トレがしたくなり、そろそろジムに行く時間なので、
「内容とスケジュール」
に関しては、 こちら↓のブログを参照してください。(ごめんなさいふざけているつもりはないです。僕は「感想」の部分がメインなので)
同じ時期に参加したインターン生の僕の100倍真面目なブログです。みんなめちゃめちゃ優秀な人ばかりです。
感想
結論、Treasure最高でした。(以上。で終わりたいところですが。軽く書きます。)
最高な点↓
前半の講義も内容は濃く・学びが多く最高
事前課題もあり、やる内容は多いですが、学びは多いです。
中間課題(があります)にもしっかりとしたレビューが最高
スーパーエンジニアが全員分見てくれます、辛そうでした。
TAのエンジニアの皆さんも親身になって指導してくれて最高
こんなのもわからねぇのかよwwwwみたいなひねくれたエンジニアはいません。
インターン生同士の助け合いが活発で最高
みんな優秀な人ばかりで、わからないことがあってもインターン生同士で教えあったりしてました。
おやつが美味しくて最高
インターン期間中は15時に社員さんからの差し入れで個性豊かなおやつが用意されてました。(食いきれないほどのうまい棒の山とか、かき氷とか良い感じに意味不明でした。)
インターン生もAJITOが利用できて最高
AJITOとは社内にあるバー的な所です。AJITOでは、毎就業後、お酒が無料で飲めるという制度があり、インターン生も飲んでいました。お酒が好きな人にとっては最高の環境だと感じました。(お高いお酒もあるっぽいです) ちなみに僕はお酒が苦手です。
青春感が半端なくて最高
青春感が半端ないです。日本代表の大迫選手も驚くほどの青春感だと思います。(面白いですよね?)
特に後半のチーム開発は、全チームが本気で優勝を狙いに行くサービス開発に取り組んでいて、チーム全員で一つの目標に向かって取り組んでいる感じが最高です。開発最終日はほとんどのチームが会社に泊まり込みで開発してました。
サポーターの方が最高
後半のチーム開発では、一つのチーム対して2人のエンジニアの方と1人の人事の方がサポーターとしてチームに付きっきりになります。
アイディア出しの段階から、チームで提案したアイディアに対して、技術的な面、ビジネス的な面、両方の側面からレビューしてくれます。
めちゃくちゃ学びが多かったです。(学びについては書きません。何度も言いますがこのブログはtreasureが最高であったということだけを全面に伝えたいと思います。そいう方針です。決定事項です。)
さらに、疲れているインターン生を気遣って様々な差し入れをしてくださり本当に助かりました。
などなど、
本当にこの期間をインターン生に尽くしてくれてるなぁという印象を持ちました。 あと5000個くらい最高な点を挙げれるのですがこれ以上文字数書いたらHatenaさんのサーバーが落ちるのでやめておきます。
今後活かしたいこと
技術力を上げることはもちろんのこと、
Treasureの内容からは大きく逸れますが、(許してください)
自分の考えを主張すること、積極的にコミュニケーション取ることは大事だなと思いました。(当たり前のこと) (なぜそう思ったのかの経緯は割愛します。)
エンジニアという職業に限ったことではないですが、自由な環境にいると
「自分のやりたいこと・興味のあること」を主張しないと特に誰も興味を持ってくれません。
(たかだか、三週間しかいない)短期インターン生なりの中途半端な印象ですが、VOYAGE GROUPという会社はエンジニアの裁量が大きく、自由度が高く、まさに「働きやすい」環境なのかなと思いました。 こういった環境には、甘えることもできるし、逆にモチベーションや好奇心の高い人にとってはやりたいことをやらせてもらえるので大きく成長できるような環境ではあるのかなと思いました。
誰も「やれ」とは言わない。そのかわり、やらなければ誰にも相手にされない。
自由なエンジニアの世界はまさにこんな感じ↑かなと思いました。
で?失ったものは?
無いです。(ごめんなさい。怒った?)(タイトル釣りっぽくてごめんなさい。)
得ることばかりでした。
強いていうならば、「自信」は多少失いました。
周りのエンジニア、そしてインターン生が非常に優秀で僕はこの世界で勝負するのかぁ、、、と3秒くらい落ち込みました。 もちろん、今までの優秀なエンジニアの方と仕事をすることはありましたが同世代の人とは全然ありませんでした。
今まで自分がいかに「井の中の蛙」だったかを実感できました。
そもそも情報学の基礎的な知識の土台が全く違うなと本当に感じました。(土台がしっかりしている人は初めての言語にもすぐに対応している印象です)
でも、性格の問題ですが僕は、一旦ボコボコにされた方が頑張れるタイプなので、これからそういった優秀な人たちに近づくために頑張ろうと思えました。
treasureの内容を書くはずが、話は530度くらい逸れましたが、
結論、 どっかのタイミングでtreasure参加を検討・迷っている人がいれば、参加することを強く薦めます。
rubyのシンボルについてのお話
rubyを触り始めた頃、シンボルとはなんぞやと謎に思い、調べてみたら、まぁ文字列とそんなに変わらない。という結論に至ったが、 やっぱり違うだろう。とふと思いました。普段の開発ではあまり気にする場面が少なかったシンボルについてもう一度勉強し直してみました。 参考にしたのは
シンボルの定義
さすがに知っているとは思いますが。。。。
:シンボル名
ですね。
本題
シンボルと文字列の違い
1. オブジェクトが違う
まぁ、当たり前ですよね。
2. 高速に処理される
シンボルと文字列は同じようなものと捉えられがちですが、シンボルの中身は整数らしいです。 したがって、比較する場合、二つの値が同じかどうか調べる場合、文字列よりも高速に処理されます。
3. メモリの使用効率が良い
シンボルは「同じシンボルであれば同じオブジェクト」という特徴があります。 これによって文字列、シンボル、共に大量に作成した場合、シンボルの方がメモリ使用効率が良いそうです。 なに言っているかさっぱりな人のために↓
% irb irb(main):001:0> 'string'.object_id => 70151974972520 irb(main):002:0> 'string'.object_id => 70151974957260 irb(main):003:0> 'string'.object_id => 70151974942200
irb(main):004:0> :string.object_id => 272348 irb(main):005:0> :string.object_id => 272348 irb(main):006:0> :string.object_id => 272348
シンボルが同じオブジェクトであることがわかりますね。
4. 破壊的な変更ができない(イミューダブルなオブジェクト)
irb(main):011:0> a = 'string' => "string" irb(main):012:0> a.upcase! => "STRING" irb(main):013:0> a => "STRING" irb(main):014:0> b = :string => :string irb(main):015:0> b.upcase! NoMethodError: undefined method `upcase!' for :string:Symbol
変更できませんでした。
というお話です。
ruby の配列のeach_with_indexのお話、とcatch throwのお話
最近rubyの「プロを目指す人のためのruby入門 伊藤淳一」という書籍を読んでいるので、 へぇこんな感じだったんだ、こんなのあるんだというものを軽く書こうと思います。今日読んだのは第4章の「配列や繰り返し処理を理解する」の部分。
そこでへぇとなった部分は2点。
・with_indexメソッドを使った添え字付き繰り返し処理
・throwとcatchを使った大域脱出
のお話です。
まず1点目
with_indexメソッドを使った添え字付き繰り返し処理
よくコードを書く際に添え字を用いた繰り返し処理の時にeach_with_indexを使うのですが、ここではeachの代わりにしか使えません。(って書いてあり、確かに、と思いました。笑) でもwith_indexメソッドを用いたらmapとかdelete_if とかにも使えるよって話です。
members = ['太郎', '二郎', '三郎'] members.map.with_index {|member, i| "#{i}: #{member}"} => ["0: 太郎", "1: 二郎", "2: 三郎"]
みたいになるよってお話です。 また
members = ['太郎', '二郎', '三郎'] member.delete_if.with_index{|member, i| member.include?('郎') && i.odd?} => ["太郎", "三郎"]
となってしまうというお話です。 ではなぜ使えるのかという話ですが。 with_indexメソッドはEnumerateオブジェクトのインスタンスメソッドです。 そしてmemberにmapやdelete_ifのメソッドにブロックを渡さない状態の返り値のEnumerateオブジェクトとなります。 したがってこのようにwith_indexが使用できるって話ですね。
throwとcatchを使った大域脱出
もう一つへぇと感じた、というか知らなかったお話です。繰り返し処理を抜け出す際や、次の要素の繰り返しに回したい時に使うのがbreakやnextですが(それしか知りませんでした)、実はその繰り返しのブロックしか抜け出せないらしいです。
2重繰り返し(重ね合わさった繰り返しなど)は1階層分しか抜け出さないようです。それらの上の層にある繰り返し処理とかも全部抜け出すのが、catchとthrowになります。(多分そいう認識で合ってます。) 例をみてみましょう まずbreak を使う場合
sum = 0 # ループ1 [*1..8].each do |n_1| #ループ2 [*1..10].each do |n_2| sum = n_1*n_2 break if n_2 == 5 end # 一回分ループ終了したら結果を出力する p sum end =>15 45 90 150 225 315 420 540
この場合はbreakはループ2のみを抜け出すのでループ1内の最後に記述されているp sumは実行され8回分の結果が表示されます。
ではcatch throwを使った場合
sum = 0 catch :doen do # ループ1 [*1..8].each do |n_1| #ループ2 [*1..10].each do |n_2| sum = n_1*n_2 throw :doen if n_2 == 5 end # 一回分ループ終了したら結果を出力する p sum end end =>
この場合結果は何も現れません。なぜかというと一回目のループ2でthrowが実行され(ループ2の5週目で)1回目のループも抜け出してしまうからです。
というようなお話でした。 ある程度railsを使って実装できるようになったものの知らないメソッドとか色々あるもんだなぁって感じました。
pythonのfor文の話
1、2か月前にデータサイエンス・機械学習をかじりました。せっかくなのである程度できるようになりたいので、もう一度pythonの勉強からやり直してます。 今回はpythonのfor文がいろんな種類あるよって話です。 まずは普通の(よく知ってるやつ)
children = ['jack', 'bob', 'alex'] for child in children: print(child) => 'jack' 'bob' 'alex'
range()も使えるよって話
for num in range(5): print(num) => 1 2 3 4
range()のちょっと応用の話
# 0~8を2つ飛ばしで表示 for num in range(0, 9, 2): print(num) => 0 2 4 6 8
zipのお話
for文でzipを使うと2つのオブジェクトから要素を取り出して、繰り返しできるって話です。 下の例は2つの配列オブジェクトから要素を取り出す話です。
children = ['jack', 'bob', 'alex'] fathers = ['太郎', '二郎', '三郎'] for child, father in zip(children, fathers): print("{}'s father is {}".format(child, father)) =>jack's father is 太郎 bob's father is 二郎 alex's father is 三郎
とか
片方のオブジェクトをrange()にしてもできます。
enumerateのお話
for文でenumerateを使うと、zipでrange()を使ったみたいになります。rubyでいうとeach_with_indexみたいに勝手にinitがついてきます。(違います?)
children = ['jack', 'bob', 'alex'] for num, child in enumerate(children): print("No{}. is {}".format(num, child)) =>No0. is jack No1. is bob No2. is ale
というお話でした。