SMARTCAMP Engineer Blog

スマートキャンプ株式会社(SMARTCAMP Co., Ltd.)のエンジニアブログです。業務で取り入れた新しい技術や試行錯誤を知見として共有していきます。

【試される大地】北海道でビジネス職の新卒向けにエンジニア研修をした話

f:id:ug_23:20190614180705j:plain

こんにちは。今週はスマートキャンプ札幌オフィスに出張中の米元です。

北海道は空気がきれいで食べ物も美味しく、湿度が低くてとても過ごしやすいです。 また、オフィスの窓からは大通り公園の街路樹が見えて気持ちよく働けています。

本記事ではそんな素敵な札幌オフィスで約一ヶ月前に行われた新卒エンジニア研修の話をご紹介したいと思います!

経緯

弊社では今年度から新卒採用を行っており、4月に5名の新入社員が入社しました。 全員セールスやコンサルタントといった職種のため、4月中はビジネス職向けの研修を受けていました。 そんな中、ある日人事から私に

「新卒研修の一環としてエンジニア研修をしてほしい」

との依頼がありました。 詳しく聞くと新卒メンバーが5日間の研修合宿を札幌にて行うことになっており、そのうちの2日間をエンジニアの研修にあててほしいとのことでした。 という訳で1泊2日の北海道の札幌オフィスにて新卒エンジニア研修を行うことになりました。

目的

今回の研修では大きく2つの要望がありました。

1. SQLを使いこなせるようにしてほしい

弊社ではBigQueryとRedashを用いて自社サービスのデータ分析基盤を構築しており、エンジニアだけでなくセールスやマーケターなど含めた全社員が利用出来るようになっています。

そのためエンジニアではない職種でもRedashを使って自分で必要なデータを抽出・分析し成果につなげているメンバーが多く、新卒も同様に自分でデータ分析できるようにしてほしいとのことでした。

※この時点で講師の1人はSQLが得意な瀧川に決まりました

2. エンジニアと仕事するうえで必要なことを教えてほしい

弊社ではプロダクト開発をするうえでエンジニアと他の職種の方々が関わる機会が多く、新卒のメンバーも近いうちにプロダクト開発に関わる事が予想されます。 そのために必要な知識やスキルを身に付けてほしいという要望でしたが、2日間という限られた時間の中で何をすれば最も効果が高いかを考えるのに苦労しました。

その結果、

  • ビジネス職でかつ開発に関わった事が無いメンバーが分からないこと
  • エンジニア自身がビジネス職の人に知ってもらいたいこと

の2点を重点的に学んでもらうことにしました。

エンジニアとしても他の職種の方から「エンジニアは何をやっているか分からない」「魔法使いみたい」「黒い画面でなんかやってる」などなど言われがちなため自分達の仕事内容があまり理解されていない(理解されにくい)実感があり、それをこの機会に解消したいという思いもありました。

研修内容を決める

2人で考えた結果、最終的にSQLと合わせて下記のような内容で行うことに決めました。

  • エンジニアの思考を知る
  • 自社のサービスがどのように動いているかを知る
  • プログラミングを実際にやってみてエンジニアの仕事内容を体感する
  • 開発をするためにどんな情報が必要なのかを知る
  • SQL基礎・実践

また、準備期間があまり無かったので

  • 資料は最低限にすること
  • ハンズオン形式やグループワーク形式で出来る内容にすること

を念頭において準備を進め、研修当日を迎えました。

そして、北の大地へ・・・

朝8時発の新千歳行きに乗って出発し、11時前に札幌オフィスに到着しました。 若干の眠気を抱えつつ、初めての札幌オフィスの環境の良さに感動しつつ研修スタートです。

f:id:siso9to:20190513110005j:plain
札幌オフィス到着直後。広くてきれい!とはしゃいでます

座学(70分)

最初は私から以下の内容を講義形式で話しました。

自社サービスを例にWebサービスがどのように動作しているかの大まかな仕組み、エンジニアの職種、エンジニアの仕事内容、開発の流れ、思考・文化、障害対応などを説明しました。

内容

  • 弊社主力サービスの1つであるBOXILはどうやって動いているか
  • エンジニアの仕事内容
    • 自社のエンジニア組織の体制
  • 開発の流れ
    • 要件定義、設計、開発、テスト、リリースといった大まかな開発の流れを説明
  • 一緒に働くうえで知っておいて欲しいこと
    • 作業依頼の仕方
    • 好きな事/きらいな事
    • 情報共有の文化
    • 技術的負債とは
  • 障害対応について
    • 障害とは
    • 障害のパターン
    • 障害を防ぐためにしていること(監視、テスト、レビューなど)

実際に使ったスライドの例

エンジニアの好き嫌いを独断と偏見で紹介しました。 仕事をする上で困る曖昧な仕様や無駄・バグの原因になるものは避けたいという思考と、良いものは積極的に共有する文化などについて伝えたいという意図で作ってます。

f:id:siso9to:20190613182507j:plain

プログラミング研修(90分)

座学の後はプログラミング講座です。

ビジネス職のメンバーに対してプログラミング研修を行うかどうかは正直迷いました。 ただ話だけではエンジニアが何をやっているのか理解するのは難しいと思い、実際にプログラミングして簡単なアプリケーションを作ってもらうところまでやる事にしました。

内容については

  • 日々の業務でSpreadSheetsやGmailなどG Suiteを利用している
  • 何が出来るのか目に見えて実感しやすい
  • 開発環境の用意が必要ない

などの理由から今回はGoogleAppScriptを学んでもらうことにしました。

内容

  • プログラミング研修 基礎編
    • プログラミングとは
    • プログラミング言語とは
    • GoogleAppScriptとは
    • GoogleAppScriptの基本文法
  • プログラミング研修 実践編
    • CalendarAPIを使って今日の予定をSlackで通知してみよう
    • 便利ツールを作ってみよう

基礎編では以下のようなコードを書きながら基本的な文法の説明をおこないました。

function myFunction() {
  var message = "Hello, world!"; // String(文字列)
  Logger.log(message)
  
  var number = 1; // Integer(整数)
  var number2 = 2;
  var total = number + number2;
  Logger.log("合計は" + total + "です。");
  
  var hoge1 = "Hoge";
  var hoge2 = "Huge";
  var isHoge = hoge1 === hoge2; // Boolean(真理値, true|false)
  Logger.log(hoge1 + "と" + hoge2 + "は" + isHoge + "です。");
  
  if (hoge1 === hoge2) {
    Logger.log("等しいです。");
  } else {
    Logger.log("違います。");
  }
  
  var message2 = createGreetMessage("takigawa")
  Logger.log(message2)
  var total2 = plus(1, 2)
  Logger.log(total2)
}

function createGreetMessage(name) {
  var baseMessage = "Hello, ";
  var message = baseMessage + name;
  return message;
}

function increment(a) {
  return a + 1;
}

function getSchedule(email, date) {
  return null;
}

その後の実践編ではハンズオン形式で手を動かして実際にプログラムを作っていってもらいました。

流石にほとんどのメンバーはプログラミング自体が初めてのため、括弧が無いだけで動作しなかったり if や for の使い方がよく分からず四苦八苦する状態でした。

ですがGoogleCalendarからAPIを通じて当日の予定を取得し、Slackに通知するところまで作ると「おお・・!」という反応に変わり、正しく動いた時は楽しそうでした。

実際に作ったコードは以下のようなものです。

function getMyMail() {
  var mails = GmailApp.search('smartcamp')
  Logger.log(mails[0].getFirstMessageSubject())
}

function getMyCalendar() {
  var targetDate = new Date("2019/05/07")
  var myCalendar = CalendarApp.getCalendarById('xxxxx@smartcamp.asia')
  var schedules = myCalendar.getEventsForDay(targetDate)
  schedules.forEach(function(schedule) {
    Logger.log(schedule.getTitle())
    Logger.log(Utilities.formatDate(schedule.getStartTime(), 'Asia/Tokyo', 'YYYY-MM-dd HH:mm') + "から始まります!")
    var startDate = Utilities.formatDate(schedule.getStartTime(), 'Asia/Tokyo', 'YYYY-MM-dd HH:mm')
    var endDate = Utilities.formatDate(schedule.getEndTime(), 'Asia/Tokyo', 'YYYY-MM-dd HH:mm')
    var message = startDate + "~" + endDate
    
    if (include(schedule.getTitle(), '来訪')) {
      notify(schedule.getTitle(), message, '#008000', '予定ボット', '@takigawa')
    } else {
      notify(schedule.getTitle(), message, '#cd5c5c', '予定ボット', '@takigawa')
    }
  })
}

function include(message, text) {
  return message.indexOf(text) !== -1
}

function notify(title, message, color, botName, channel) {
  var postUrl = 'SlackのWebhook URL'

  var jsonData = {
    "username" : botName,
    "icon_emoji": ':seedling:',
    "channel": channel,
    "attachments": [{
      "title": title,
      "text": message,
      "color": color,
      "footer": "Script ID: " + ScriptApp.getScriptId()
    }]
  };
  var payload = JSON.stringify(jsonData);
  var options = {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };
  UrlFetchApp.fetch(postUrl, options);
}

function addDays (date, n) {
  var date = new Date(date)
  date.setDate(date.getDate() + n)
  return date
}

最後は2チームに分かれて、私たちでサポートしつつGoogleのAPIを使って以下のような便利ツールを作りました。

  • GoogleDriveから特定の文字列にマッチする名前のドキュメントをメールに添付して送信する
  • 問い合わせフォームからのメールなど、特定のタイトルのメールを受信したらSlackに通知する

最初はプログラムで何が出来るのかピンときてなかった新卒メンバー達も、実際に業務で使えそうなものを作るとプログラミングで出来ることのイメージがついたようでした。

SQL講座(130分)

瀧川先生によるSQL講座です。

新卒メンバーが自分でデータ分析が出来るようになるのが最終目標ですが、今回はまず自分でクエリを書いて欲しいデータを抽出できるようになるところまでがゴールです。

内容

  • 基礎編
    • データベースとは
    • SQLとは
    • BigQueryとは
    • 基本的なクエリ、検索条件の指定、JOIN
  • 応用編
    • リード(見込み客)情報を取得する
    • リードをユーザー属性で分析しよう
    • Redashを使って可視化しよう

私と瀧川の2人でサポートしつつ、基本的なクエリについてはなんとかできましたが、応用編に入るとJOINや検索条件が複雑になったため人によって理解度にばらつきがありました。

f:id:siso9to:20190614153230p:plain
Redashで作成したPIVOT TABLE。ほぼマスクしてます

最後にRedashでPIVOT TABLEを作りましたが、これを見て初めて実際に業務に使えるイメージがついたようです。

グループワーク(360分)

最後はチームに分かれてのグループワークを行いました。

内容

  • 新規プロダクトBiscuetのダッシュボードを設計し、発表する
    • チームに分かれてそれぞれで社内のインサイドセールスのメンバーにヒアリングを実施
    • ヒアリング結果をもとにダッシュボードを設計
      • エンジニアがその設計をもとに開発を始められるものを作る

成果物

以下の2点としました。

  • UIのモック
  • 表示データの取得元とそれらの表示条件をまとめた仕様書

目的

目的は下記のとおりです。

  • 何かを開発する際にエンジニアにどのような情報を渡せば足りるのかを知ってもらう
  • システムの事を意識しながら要件をまとめる過程を体験・理解してもらう

結果

合計360分の長時間の内容でしたが、札幌支社のインサイドセールスメンバーへのヒアリングと合間に中間レビューを挟みつつディスカッションをして、最終的に2チームともダッシュボードの設計を作りあげて発表を行いました。

f:id:siso9to:20190514142824j:plain
中間レビューでUIの説明中

プログラミングやSQL研修の時とは打って変わって、5人の新卒メンバー全員が物怖じせず堂々とした発表を行いました。

f:id:siso9to:20190514165613j:plain
発表後のフィードバックタイム。

ここまでで2日間に渡るエンジニア研修は終了です。

新卒メンバーはこのあともビジネス研修が続きました。私と瀧川だけ先に札幌支社を発ちました。

反省会(空港)

帰りの飛行機の時間が迫っていたため、ダッシュで新千歳空港の回転寿司(函太郎)に駆け込み15分で寿司を食べつつ反省会。 アブラガレイなど初めて食べるネタも多く、美味しかったです 🍣

フィードバック

研修終了後、以下のような項目でアンケートをとりました。

  • それぞれの講義について理解できたかどうか
  • 研修全体を通してよかった事、逆に改善点
  • その他感想など

回答の中からいくつかピックアップしてみました

グループワークで学んだこと

実際に要件定義〜ヒアリングを通じてのUI設計が経験できこと。思った以上にビジネス目線と開発目線を行き来していく苦悩を感じることができたので、エンジニアの方への質問の仕方を工夫しようと思うことが出来ました。

グループワークでの改善点

ワーク終盤のヒアリングでUI設計を改めて考え直さなければならなくなったが課題を解決するアイデアが生まれなかった。こんなサービスを作ることができれば良いという意見は生まれたが、プロダクト側がアイデアを実現するためにどうやって開発するかの視点が不足していた。

研修全体を通してよかったこと

実際にコードを書く(SQL、プログラミング両方)経験出来た点。思った以上にビジネスサイドとの関わりがあるんだなと感じることが出来た点。

その他感想など

コードを書く経験をもう少しして、要件定義までしっかりできるようになる目的で、2日間だけでなく、5日間やって見るのも面白いかなと思いました。

他には時間が足りなかったという意見が多かったです。

反省点

アンケートでの回答にもあったように全体的に時間が足りず、キツめのスケジュールだったのかなとは思いました。 ただ限られた時間の中で、彼らが今後エンジニアと仕事するうえで最低限必要なレベルで「エンジニアが何をしているのか」や「プログラミングとは何か」を理解してもらう事はできたかと思います。

SQLに関してはまだまだ理解が足りていないので、学習機会を増やしたり自分自身で学ぶための情報を整備する事も必要だと感じました。

また、グループワークはエンジニアが仕様を決める時にどのような情報が必要かにフォーカスしたかったのですが、結果的にはユーザーの課題をヒアリングしながら洗い出して要件をまとめるところがメインになってしまい、エンジニア研修というよりは企画に近いものになってしまいました。

研修の目的に沿う形にするには要件は事前に決めておき、

  • どんなデータを表示するのか
  • そのデータはどこから取得するのか
  • どのような条件で表示するのか

などUIやDBの設計を考える内容に絞るべきだったなーと寿司を食べながら反省しました・・・。

今後

今回の研修を通して、他の職種の方達から見た時に自分達が考えている以上にエンジニアの仕事内容がわかりにくい事を改めて実感しました。

弊社ではエンジニアもセールスやマーケティングの勉強をすることが多く、それによって開発依頼の目的や意図が理解しやすくなったりエンジニア側からも提案を出来る機会が増えているのですが、今後は逆にエンジニア自身が何をやっているかを理解してもらう事も必要だと感じました。

異なる職種でも相手が何をやっているかをお互いに理解したうえで業務を進められるようにしていきたいです。

今後は新卒だけでなく他の社員の方にも今回の内容をカスタマイズして提供していきたいと思います!