仕事でフィヨルドブートキャンプというRailsエンジニアになるためのスクールをやっています。

https://gyazo.com/4dd7bd6b8e3e2c56659ff7a9f33d969b

FJORD BOOT CAMP(フィヨルドブートキャンプ)

勉強したあとにRailsエンジニアとして企業に紹介することでなりたっているのですが、

「どのレベルになったら就職できるの?」

という点がイメージできないと、就職したい人側、紹介される企業側の双方にとってわかりづらいなと思ったので明確にしておきたい。

戦力として計算できるRailsエンジニアとは

僕の考える、Railsエンジニアとして就職できる・企業に紹介できる最低レベルは、

「少しでもプラスの戦力として計算できる」

というものです。

「Issueを一人でこなせる」

といっても良いかもしれません。

「は?みんな10の戦力持ってるところに1とかじゃ困るんだけど?」

と思うかもしれませんが、Railsプロジェクトにとってほとんどの人類は1の戦力も無くて、マイナスです。

Railsチュートリアルを終わったばっかりで実務レベルの開発したことないぐらいの人もマイナス戦力です。

「教えるのに大量のパワーが割かれて、居ない方がプロジェクトが進む」

という状態がマイナス戦力です。

Railsプロジェクトのリーダー的な役割をした人なら感覚的にわかると思います。

「Rails経験無くてJava経験だけの人が2人送られてきても困るなぁ・・・」

これがマイナス戦力です。

「多少の教育コストはかかるけど、レビューをしっかりやればトータルで見れば助かる」

このレベルがプラス戦力です。

「Railsのコードは書かせられないけどテスト仕様書を書いててもらおう」

こんな工夫が必要な場合、マイナス戦力です 😅

プラス戦力になるための工夫

このイメージが固まってからカリキュラム終盤の内容も変わりました。

  • 弊社プロダクト(怖話など)へPRを送って5回採用される。
  • Railsプログラムのアルバイトの斡旋
  • DB設計のカリキュラム追加
  • RESTful Webアプリ設計のカリキュラム追加
  • メンターとペアプロするカリキュラム追加。

Railsの機能を一通り覚えただけじゃ駄目で、実際のプロジェクトに入るには必須の知識がかなりあります。

弊社としては一般的なプログラマー新人研修もやっているのでその中でこの辺ももっと固めていきたい所存です。

  • 早さ
  • 機能
  • 安定性(バグの少なさ)

これらはトレードオフ。そして、

実装力 = 早さ x 機能 x 安定性

https://gyazo.com/e85c2b4af83c473d5cad53c2b3e90dbc

しかし、レベルアップすることで、早さそのままで多くの機能を実装できたり、早さそのままでバグが少なく作れるようになったりするんだよね。

割り振れるスキルポイントが増えるみたいな感じで。

Railsのおかげでちょっと早く作れるようになったからっつって、

「俺、作り込むよりプロトタイプ作るのが得意なんだよね。早さと完成度ってトレードオフじゃないですかぁ?」

とか言ってないで、同じ早さのままもっと作り込んだもの作れるようになれ!バグ減らせ! > 俺

https://gyazo.com/d6bd00fa98c7ad07d29bf5aec84c4924

RailsGirls Tokyo 9thにコーチとして参加させていただきました。

また、スポンサーにもなったのでスポンサーLTでフィヨルドブートキャンプの紹介もさせてもらいました。

https://gyazo.com/6bd4dcb2b479a590d90297d2539782d7

スポンサーLTや一般LTはRailsGirlsから興味をもってプログラマーを目指してる人、または既にプログラマーになった人が、

「すごい面白いからお前らもやろうぜ」

という内容が多くて、既にプログラマーである僕でも、

「へぇ〜、プログラマーって良さそうねぇ」

と思ってしまいました。

また、@a_matsuda さんの文字通りのすばらしい話もあり、全体がしまりましたね 😁

プログラミングに興味を持ってもらう方法

コーチとして参加して、もっとわかりやすく教えるにはどうしたらいいか、という点も気になりましたが、RailsGirlsはプログラミングを単に教えるというより、プログラミングの楽しさを知ってもらって興味を持ってもらうのが目的だと思います。

何をやってもらったら一番、「プログラミングって面白い」って思ってもらえるんだろう?

ひいては「プログラミングの面白さって何?」というところが気になりました。

いろんなプログラマーの皆さんに聞いてみたいですね。

参加者・参加目的

参加されてる方は下記のような人が多かったです。

  • プログラマーの求人をしてる会社の人事の人がプログラマーをよく知るために。
  • 今の会社が退屈過ぎてプログラマーに転職したい。
  • プログラミングで困ってるWebデザイナー。
  • 会社でプログラマーになれと言われたけど聞く人がいない。
  • リモートワークなど、プログラマーの自由な働き方が気になってる。

会場がSpeeeさんで、オシャクソラウンジだったので良さ出てましたね。

改善したい点

Railsアプリをいきなり作るので当然なんですが、

「全然わからないことに対するストレスがある」

という感想を聞いたので、「Rails Moreで聞けるよ」だけでなく、

「あなたがわからないのはどこですか?皆さん疑問に思われる点はだいたい下記の5点です。それぞれはこれを読むことでわかるようになりますよ」

ぐらいの道筋を示せるとその編のストレスが軽減されるのかなと思ったので、今後参加するならばその辺りの資料を作ったりしたいなと思います。

Fjord Boot CampでRails入門終わったぐらいの人のために、普通どんな感じでrailsで開発していくのかをペアプロ感覚で何を考えているか喋りながら1機能作ってみる動画を作りました。

適当にググりながら作っていく感じとか、間違っているときどうしてるのかの雰囲気が伝わればいいなと思います。

rubyでいえばGemfileに

gem "foo", path: "~/foo"

みたいに書くヤツ。

npm linkを使う

いい感じにシンボリックリンクを貼ってくれるnpm linkを使うと良い。

npmモジュール側のディレクトリで下記。

$ npm link

利用側のディレクトリで下記。

$ npm link foo

モジュールが完成したら、下記で解除。

$ npm unlink foo

webpackerでrailsプロジェクトでもjsの再利用が進んだのでgemに負けじと活用したいです。

= render @posts

を省略しないで書くヤツ、毎回忘れてググるので貼っておきます。

= render partial: "posts/post", collection: @posts, as: :post

これが便利なシチュエーションは、@postsにPost以外のものが入ってるけど、viewとしはposts/postで出したいという時。

例えばPostをSTIしてUnpublishedPostというクラスがある場合にunpublished_posts/unpublished_post.html.slimを見に行かないようにするとか。

今までの流れはこうでした。

  1. @machidaがslimでモックとして作る。
  2. 僕がjsにするためにhtmlに翻訳してfoo.vueに移す。

これがクッソ面倒だったのですが、pugならslimとほとんど同じなのでコピペでいけました。

$ yarn add pug

templateタグにlang="pug"を追加する。

app/javascripts/packs/components/foo.vue:

<template lang="pug">
  header.content
    h1 トップページ
</template>
<script>
いろいろ
</script>
<style>
いろいろ
</style>

https://gyazo.com/749f392120b56c47372ffa524b5f06b1

「ヒューッ!」

webpackerの設定は一切無し。

RubyMineを使ってるなら、pugプラグインを入れればシンタックスハイライトもちゃんと動きますね。

create_join_tableでuuidを使う場合はどう書けばいいのか。

column_options: { type: :uuid }を使う。

class CreateJoinTableUserWork < ActiveRecord::Migration[5.1]
  def change
    create_join_table :users, :works, column_options: { type: :uuid } do |t|
      t.index [:user_id, :work_id]
      t.index [:work_id, :user_id]
    end
  end
end

現場からは以上です。

皆様におかれましては、webpackerでのrubyとjsのインテグレーションが思いのほかうまくはまり、

javascript_include_tag "application"外したい!」

などと言っている方も多いでしょう。俺もです。

rails-ujsからrails-ujs(npm)へ

これも皆そうだと思いますが、rails-ujsは「削除リンク」でしか使ってないけど、いつも使ってるので欲しい。

rail5.1からrails-ujsは単独reposからactionviewの中に入ったそうです。

rails-ujs(npm)を追加。

$ yarn add rails-ujs

app/javascripts/packs/rails-ujs.js作成。

import Rails from 'rails-ujs';
Rails.start();

app/javascripts/packs/application.jsに下記追加。

require("./rails-ujs.js");

turbolinksもnpmで(行けるなら)行きたいですね。

「知り合いの凄腕エンジニアに聞いたんだけど、/users/32ってURLにユーザー数が丸見えになってるって、このセキュリティーは流石にまずいよ、駒形さん」

みたいに言われることが稀によくあるので、idをuuidにしました。

postgresの設定

rails5からpostgresのuuidを生成する関数を簡単にidとして使えるようになってるそうです。 herokuのpostgresは対応してるのでいいかもです。

Macのbrewで入れたpostgresはデフォルト無効なので有効にしてあげる必要がありますが、superuserじゃないと駄目です。

postgres=# SELECT uuid_generate_v4();
ERROR:  function uuid_generate_v4() does not exist

↑関数がない。

デフォルト状態ならばsuperuserはpostgresかつパスワード無しなので、下記をやっといてくださいと各位に伝えます。

$ psql -d postgres -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";'
postgres=# SELECT uuid_generate_v4();
           uuid_generate_v4           
--------------------------------------
 06162241-ad98-4795-8bab-3801194f76d7
(1 row)

関数が有効になりました。

railsの設定

generatorがデフォルトでuuidを使うようにします。

# config/application.rb:
module Foo
  class Application < Rails::Application
    config.generators do |g|
      g.orm :active_record, primary_key_type: :uuid
    end
  end
end

こちらを参考にidのdefaultを設定する。

2 UUID Primary Keys

class PostProperties < ActiveRecord::Migration[5.1]
  def change
    create_table :posts, id: :uuid, default: "gen_random_uuid()" do |t|
      t.string :title
      t.text :description
      t.belongs_to :user, foreign_key: true, type: :uuid

      t.timestamps
    end
  end
end

foreign_keyを設定する時に、type: uuidを忘れないこと。

# SELECT id FROM users;
                  id                  
--------------------------------------
 75a61708-a959-5889-83cd-4d86df9cd771
 7c6b7130-3896-53a1-938d-2ab4364011d2
 f94db8c4-6786-5027-8d90-aa187594addb
 bafbab57-d268-548a-a111-11c13bbcbcc2
 2fc060cd-98d2-58d2-9b33-50f36df1fd8f
 8338b729-ff29-55d2-b5ba-6d68dbfc7b03
 917358a7-8995-5d88-b635-925e21841f68
 529aa2fb-93b3-5739-a8d4-64dd87ed08a9
 6ea9b086-d16b-5b02-81b6-97edb74f3dfb
 71f372c5-b0cc-5904-a583-921766bf4508
(10 rows)

ウェーイ。

おもてなし

何かと外見も重要な、出資を受けたスタートアップのサービスのアプリを開発する時にはさらっとやっておくとよいかもしれません。