インフラ配属の新卒エンジニアが入社後3ヶ月でやってきたこと 【IaC編】

こんにちは。 2018 年度新卒入社で開発室インフラチームに配属された高畑です。 今回は、入社して 3 ヶ月が経過した今までにやってきたことを振り返っていきたいと思います。

Infrastructure as Code(IaC)の活用

現在、ウィルゲートで運用しているメディアサービスは、「Terraform」と、「Ansible」を利用して各種サーバの構成を行なっています。

■Infrastructure as Code(IaC)とは

インフラの構成管理をコード化し、 Git 管理やプルリク(レビュー)、 CI などソフトウェア開発のプラクティスを適用すること。

■Terraform とは

  • HashiCorp 社が提供している OSS
  • 管理画面触らなくてもコード 1 つで AWS EC2 などの SaaS 環境が構築できる
  • 冪等性がある
  • tf ファイルで構成を記述

■Ansible とは

  • RedHat 社が提供している OSS
  • サーバのミドルウェアをコードで管理・構築ができる
  • 冪等性がある
  • 構成ファイルは yml
  • Dynamic Inventory がアツい

手作業でインフラ環境を構築するとなると、台数が少ない分には問題ないのですが多くなっていくにつれて各種サーバのパラメータなどの構成管理が難しくなっていきます。

また、インフラの構築手順を手順書に纏めたとしても、手作業による設定・作業ミスが起こるリスクがあり、結果障害へと繋がっていきます。

そこで、インフラの構成をコード化し自動で設定できるようにすることで、手作業による作業ミスがなくなり、また誰が実行しても同じ状態のインフラ環境が構築できるようになるため、より安全に構成を変更できるようになります。

私自身、 IaC に関してはウィルゲートに入社してから触るようになったのですが、 web メディアの運用保守や運用改善を行う際にサーバの構成が書かれた Ansible のコードを修正してレビューをしてもらうのはとても新鮮でした。

f:id:tkhttty:20180619170935p:plain
コードレビューの様子

インフラセクションでの取り組み

TerraformやAnsibleなどの技術についてどのように活用したのか、またどのように使用すると良いのかをインフラチーム内でナレッジの共有を定期的に行っています。

また、後編で紹介する新規技術についても、技術検証した結果や実際に使用してみた事例などを共有して、他のプロジェクトに活かせないかを議論しています。

f:id:tkhttty:20180619175816j:plain
インフラセクションの様子

後編はこちら↓

tech.willgate.co.jp

CakePHP1系からCakePHP3系へ移行した直後に起きたサービス障害と学び

f:id:toropoko002:20180717200616j:plain

はじめに

18年度新卒の垣花です。

僕は現在サグーワークス開発チームに所属しています。

インターン時代に過去に発生した障害の事後対応を行ったことがありました。

内定者がチャレンジ!遠方インターンで事業と会社を知る - WILLGATE tech blog

今回はその障害の内容とそこからの学びを紹介しようと思います。

障害の背景

サグーワークスではCakePHP3系へ移行した直後に、ユーザの生年月日を登録できるページを作成し、以下のように保存処理を書いていました。

<?php 
    # CakePHP3
    $birthday = '1969-01-01';
    $userTable = TableRegistry::get('Users');
    $user = $userTable->get($userId);
    $user->birthday = date("Y-m-d H:m:s", strtotime($birthday);
    $userTable->save($users);
?>

この処理を通して1969年が誕生日のユーザが保存されると、2069年が誕生日として保存されてしまっていました。

障害の原因を調査後に下記のように修正することで無事1969年生まれとして誕生日が保存されます。

<?php 
    # CakePHP3
    $birthday = new Time('1969-01-01');

    $userTable = TableRegistry::get('Users');
    $user = $userTable->get($userId);
    $user->birthday = $birthday->i18nFroamt('yyyy-MM-dd HH:mm:ss');
    $userTable->save($users);
?>

なぜ障害が発生したのか

2069年として保存されてしまう原因を調査した結果、下記のことがわかりました。 問題点について順番に説明していきます。

  • CakePHP1系とCakePHP3系のfind結果の違い
    • datetime型がCakePHP1系ではstringが、CakePHP3系ではFrozenTimeClassのオブジェクトが返ってくる
  • strtotimeの仕様
    • 年を下2桁で指定した場合に2069年など、未来の年月日のunixtimeが出力されてしまう。
  • FrozenTimeClassの仕様
    • マジックメソッドである_toString()が下2桁の年を返す

CakePHP1系とCakePHP3系のfindの違い

まずはfind結果を見比べてみます。

今回は関係ありませんが、CakePHP1系は結果が配列で返ってくるのに対し、CakePHP3系ではEntityClassのオブジェクトが返っていますね。

見るべきポイントは"birthday"がどのように返ってくるのかです。

CakePHP1系ではstringで、CakePHP3系ではFrozenTimeClassのオブジェクトが返っています。

<?php
    # Cakephp1
    $this->loadModel('User');
    $example = $this->Users->find('first', ['fields' => ['birthday']]);
    var_dump($example);
?>
    /* 出力結果
    * array (size=1)
    * 'User' =>
    *   array (size=1)
    *     'birthday' => string '1969-01-01 18:00:00' (length=19)
    * /
<?php 
    # Cakephp3
    $Users = TableRegistry::get('Users');
    $example  = $Users->find('all')->select('birthday')->first();
    var_dump($example);
?>

    /* 出力結果
    * object(App\Model\Entity\User)[1346]
    *   public 'birthday' =>
    *     object(Cake\I18n\FrozenTime)[1335]
    *       public 'time' => string '1969-01-01T18:00:00+09:00' (length=25)
    *       public 'timezone' => string 'Asia/Tokyo' (length=10)
    *       public 'fixedNowTime' => boolean false
    *       ...
    * /

CakePHP3系の場合、FrozenTimeClassはDateFormatTraitを読み込んでいるので、i18nFormatが使えるためデータのフォーマットが簡単ですね。

<?php 
    # CakePHP3
    $Users = TableRegistry::get('Users');
    $example  = $Users->find('all')->select('birthday')->first();
    var_dump($example['birthday']->i18nFormat('yyyy-MM-dd HH:mm:ss'));
?>

    /* 出力結果
    * string '1969-01-01 18:00:00' (length=19)
    */

一方CakePHP1系の場合、string型の日付だと以下のようにフォーマットしなければいけません。

<?php
    # CakePHP1
    $this->loadModel('User');
    $example = $this->Users->find('first', ['fields' => ['birthday']]);
    var_dump(date("Y-m-d H:m:s", strtotime($example['User']['birthday'])));
?>

    /* 出力結果
    * string '1969-01-01 18:00:00' (length=19)
    */

strtotimeの仕様

PHP Manualのstrtotimeのページをみていると以下の注意事項が書かれています。

年を 2 桁の数値で指定した場合、その値が 00-69 なら 2000-2069 に、 70-99 なら 1970-1999 にそれぞれ変換されます。

PHP: strtotime - Manualより引用

今回の障害の対象となったユーザの誕生日が1969年です。

00-69の間は2000-2069年としてunixtimeに変換される為、下2桁だけ見ると00-69の間に入っていました。

次はFrozenTimeの設計をみていきます。

FrozenTimeClassの仕様

FrozenTimeにはDateFormatTraitが読み込まれているので、DateFormatTraitを確認してみます。

cakephp/FrozenTime.php at 3.2.10 · cakephp/cakephp · GitHub

マジックメソッドの__toStringが存在していました。返り値はi18nFormat()の返り値です。

<?php
    # DateFormatTrait.php
    public function __toString()
    {
        return $this->i18nFormat();
    }
?>

cakephp/DateFormatTrait.php at 3.2.10 · cakephp/cakephp · GitHub

i18nFormat()では$formatを引数として渡さない場合、$ _toStringFormatを日時の形式として使っています。

<?php 
    # DateFormatTrait.php
    public function i18nFormat($format = null, $timezone = null, $locale = null)
    {
        $time = $this;
        if ($timezone) {
            // Handle the immutable and mutable object cases.
            $time = clone $this;
            $time = $time->timezone($timezone);
        }
        $format = $format !== null ? $format : static::$_toStringFormat;
        $locale = $locale ?: static::$defaultLocale;
        return $this->_formatObject($time, $format, $locale);
    }
?>

cakephp/DateFormatTrait.php at 3.2.10 · cakephp/cakephp · GitHub

DateFormatTraitを読み込んでいたFrozenTimeClassに戻ってみると$_toStringFormatのデフォルトが設定されています。

# FrozenTimeClass
protected static $_toStringFormat = [IntlDateFormatter::SHORT, IntlDateFormatter::SHORT];

cakephp/FrozenTime.php at 3.2.10 · cakephp/cakephp · GitHub

IntlDateFormatterClassの定数としてSHORTが呼び出されているのでみてみると、12/13/52のような日時形式が定義されています。

年が下2桁で表現されていたようです。

<?php
    # IntlDateFormatterClass
    /**
    * Most abbreviated style, only essential data (12/13/52 or 3:30pm)
    * @link http://php.net/manual/en/intl.intldateformatter-constants.php
    */
    const SHORT = 3;
?>

3つの問題点のまとめと問題点を踏まえた解決策

以前CakePHP1系からCakePHP3系へ移行に関しての取り組みをブログ記事で紹介しましたが、サグーワークスでは長期間CakePHP1系で開発をしてきていたことで移行後すぐはまだCakePHP1系の方法で日付をフォーマットしていました。

PHPフレームワークのバージョンを上げるための取り組み - WILLGATE tech blog

そのため、CakePHP1系のfind結果を想定してCakePHP3系のFrozenTimeオブジェクトを日付フォーマットしたため以下のようなことが起こっていました。

$user['birthday']はFrozenTimeClassのオブジェクトのため、文字列出力しようとすると"1969/01/01"が"01/01/69"としてフォーマットされてしまいます。

その後、strtotime()の引数として"01/01/69"が渡り、2069年として解釈されstring型でunixtimeの"3124256400"が返ります。

そのunixtimeをdate()で見やすいようにフォーマットすると、2069年生まれのユーザが誕生してしまいます。

これらを踏まえると以下の点に気をつけることで未来に生まれるユーザの発生を防げます。

  • 年を下2桁の形式で取り扱わないこと
  • CakePHP3系ならTimeClassで定義されている関数を用いること(find結果のカラムがdatetime型であればFrozenTimeClass)

最初に紹介したコードの解決策として以下のように修正しました。

<?php
    # CakePHP3
    $birthday = new Time('1969-01-01');

    $userTable = TableRegistry::get('Users');
    $user = $userTable->get($userId);
    $user->birthday = $birthday->i18nFroamt('yyyy-MM-dd HH:mm:ss');
    $userTable->save($users);
?>

終わりに

CakePHP1系からCakePHP3系のfind結果が同じだろうとこれまで通りの実装してしまうことはあっても、strtotimeの仕様やFrozenTimeClassの設計を把握していれば防げた問題だろうと思います。

納期の問題などで言語やフレームワークの全ての仕様を把握することは膨大で難しいですが、今回のような障害を防ぐためにも利用する関数の仕様だけでも把握することが大切です。

内定者がチャレンジ!遠方インターンで事業と会社を知る

サグーワークス開発チームの石川です。

今回は18卒エンジニアの垣花さんに、選考時の会社の印象や、インターンでの経験、今後の目標についてインタビューしたので、その模様をお届けいたします。

f:id:char1129:20180711161837j:plain

自分が選考を受ける上で、大事にしていたポイント

--- 就職活動中、内定者時代の垣花さんは、ウィルゲートについてどういう印象でしたか?

 ウィルゲートについては大学の先輩が働いている会社ということは知っていました。最初ウィルゲートの話を聞いた時は、エンジニアが大勢いる会社ではなく、総合職の方や営業の方がいて、どちらかというと体育会系的なノリが強い会社だなという印象を持ちました。会社の様子を面談中に人事の担当者に聞いた後は印象が変わり、「社員を大切にしている会社」と思うようになりました。「社員を大切にしている会社」というところが、自分が選考に進む上で大事にしたいポイントで、合致していたので、面接を受ける決意をしました。  また面接や社員面談の過程で、社内でエンジニアが総合職の社員と協力して事業を作っている様子や、社員が成長するための人事制度の話を聞いて、ますます惹かれていきました。

--- 内定時に持っていた印象と夏休みを利用したインターンの後の印象は大きく違いましたか?

 印象という点で言うと、期待していたよりも良い印象を持つことができて、入社への期待が膨らみました。というのも、面談・面接の過程で社員の方から聞いていた、会社内部の様子は決まって「いい人が多いよ」という返事をもらって、どこまで信じたらいいんだろうとずっと疑問に思っていました(笑)  ただ、実際にインターンで開発室のみなさんや、事業部の方とお話しさせてもらって、親切で、人との心の距離が近い「アットホームな職場」という印象を受けました。仕事中に困ったことがあれば、親身になって解決策を一緒に考えてくれる人がいたり、チームとして働いている雰囲気はすごく楽しく、インターンの限られた時間でも、充実した時間を過ごすことができました。

チームの一員として協力しているという実感を持って仕事に臨めた

--- 10月からリモートでのインターンが開始しましたが、経緯について教えてください。

 もともとリモートでの仕事であったり、リモートでの開発に興味がありました。そこで、夏にインターンしていた時に、リーダーの横道さんに飲みに連れて行っていただいた際にお話ししてみました。

 同じくらいのタイミングで自分の友人もリモートインターンという形で働いていて、現場の社員さんと一緒に仕事していることや、技術的に得たことを話してくれたのをきっかけに、自分もやりたいと思い、お酒の席で相談してみました。  すると、翌日くらいには横道さんから当時GMだった鶴飼さんにまで話を伝えていただいて、すぐにリモートでのインターンの準備が進みました。こういうテンポの良さを知れた時、ウィルゲートはベンチャーらしいスピード感を持っている会社なんだなと思いました。

f:id:char1129:20180628141841j:plain

--- 私の時はそういったことはできなかったと思うので、羨ましいですね。周りの反響はありましたか?

 僕も同じことを色んな人に言われました(笑)

 改めて自分は恵まれているなと思いました。このご縁もあって、先日社内のHacker’s Gateでも登壇させていただいて、社内での事例作りに貢献できたのは嬉しく思ってます。

-- インターンの質問に戻りますが、実際働いてみて、リモートとリアルな現場の違いは何かありましたか?

 結構違いましたね。実際現場だと相手の表情を伺って、画面と言葉を駆使してコミュニケーションをとることができるのですが、リモートだと、どうしてもテキストベースのコミュニケーションになってしまいます。なのでコミュニケーションの方法について、いろいろ模索しながら行っていきました。

 例えばSlackでのコミュニケーションは、固くなりすぎないように注意したり、アイコンを利用して、無感情なテキストにならないようになどは注意しました。

 実装物に関しても事業部の方にどう伝えれば動きだったり仕様を伝えられるだろうかと考えるようになりました。そのなかで、効果的だったのはイメージを利用することで、スクリーンショットを撮って文字を書き込んでみたり、画面を録画して、アニメーションGIFで共有したりすることで、挙動の確認や仕様の確認をしてもらうことをしました。

 また実装時の品質を担保するために、テストケース・テストコードについてもチームの方にご指導いただきました。なので、リモートでのインターンを通じてコミュニケーション面での成長、エンジニアとしてのスキル面での成長につながりました。

 こういった機会で、チームの皆さんの全面協力をしていただいたので、リモートでもチームの一員として協力しているという実感を持って仕事に望めたことがすごく良かったです。本当に協力していただいた皆さんに感謝しています。

f:id:char1129:20180628153139j:plain

自信を持って、自分が作ったものをリリースしたい!

--- 最後になりますが、今後の目標について教えてください!

 僕個人として、技術的なチャレンジを続けて、開発室や会社の事業に貢献をしていきたいです。そのためにも、まだまだ学ぶことが多く、色んな人のサポートの上で今は業務ができている状態なので、早く一人前になって、自信をもって自分達が作ったプロダクトをリリースができるようになりたいです。

ウィルゲートエンジニアの開発環境事情

こんにちは。
今年の5月にウィルゲートに入社してサグーワークスの開発チームに配属された藤田です。
ウィルゲートでは入社時にWindowsMacのノートPCを選ぶことが出来て、モニタ1台とOfficeやセキュリティソフトが設定されている他は自由です。
なので、エンジニアではキーボードやマウスは自分が使い慣れたものを使用している方が多いです。
そこで今回は、私自身もウィルゲートの開発チームをより深く知るために、開発チームの皆さんが普段どんなツールを駆使して、日々開発を行っているのかをご紹介します。

メディアサービス主幹エンジニアのMさん

使っているハードウェア(デスク周りの使用物)

キーボード:ErgoDox EZ
ウィルゲートのエンジニアでは、キーボードやマウスなど周辺機器にこだわる人が多いのですが、ErgoDox EZを使っているのは他にいませんでした。
エンジニア感あるデスクですね。

f:id:fujita-takumi:20180628130928j:plain


使っているソフトウェア

開発用エディタ:PHPStorm
JetBrains社で提供しているPHPer御用達のIDEですね。
ウィルゲートではPHPで開発されたサービスが多く、開発メンバーの1/3の方がPHPStormを使用しておりました。

メモ用エディタ:boostnote
Maisin&Co社が提供しているソフウェア
Google Driveなどと同期することができるので、複数デバイスでも利用することが可能です。


~本人コメント~

キーボードを新しくしたのはいいのですが、移行に苦労しています。。
慣れると早くなりそう!



メディアユニットマネージャーのFさん

使っているハードウェア(デスク周りの使用物)

デスク周りで使っているもの山善 デスクファン (風量2段階) ホワイト YDS-N12(W)
  

これから暑くなってくる季節で必要なアイテムですね。
ちなみに、温度と生産性は深く関係があるらしく、夏に作業する最適な温度は25℃といわれており、オフィスで一定の温度設定になっている場合、生産性向上のためにもこういったデスクファンも必要そうです。


使っているソフトウェア

開発エディタSublime Text 3
コミュニティによって作成されたクロスプラットフォームテキストエディタです。

DBクライアント:Navicat
PremiumSoft CyberTech Ltd.が提供するグラフィカルデータベース管理 / 開発ソフトウェア
ウィルゲートの開発チームでは約半数の人が使っているツールです。
以前は、無償版に制限されていましたが、近年では有償版も申請して導入できるようになりました。

ブラウザ拡張機能Google Arts & Culture
世界の名画をブラウザで鑑賞できる拡張ツールです。
開発ツールとしては直接関係ないのですが、とてもユニークなツールです。
こんな感じで新しいタブを開くと様々な世界の名画がブラウザで鑑賞できます。


f:id:fujita-takumi:20180629162639p:plain


~本人コメント~

Google Arts & Cultureは毎日の楽しみが増えてすごくオススメです。画面見せて説明しているときなどの会話のネタにもなります!



サグーワークス開発PLのIさん

使っているハードウェア(デスク周りの使用物)

会社で使っているもの:Nespresso

ネスプレッソ コーヒーメーカー イニッシア ルビーレッド C40RE

ネスプレッソ コーヒーメーカー イニッシア ルビーレッド C40RE

デスクを通り越し、会社共有で使えるエスプレッソマシンを置いていただいております!
ちょっとしたブレークタイムにはありがたいです!


使っているソフトウェア

メモ用エディタ:iA Writer
Information Architects Incorporatedによって開発されたiOS用のテキストエディタ

DBクライアントツール:DBeaver
ロシアのRider Soft LTD合同会社で提供されているフリーのデータベース管理ツールです。

ツール:GitKraken
GitHubが開発したElectronベースで作られたGitクライアントツールです。
ウィルゲートではCUIまたは、Sourcetreeをつかっている人がほとんどなので珍しいです。


~本人コメント~

git karakenは簡単なコンフリクトの解消が自動でできます。
最近増えたgloはtrelloのような看板機能で、タスク管理にも便利です。



サーバサイドから機械学習まで手がけるOさん

使っているソフトウェア

ブラウザ拡張機能:Vue.js devtools
Vue.jsの開発をサポートする Chromeブラウザの拡張機能です。
サグーワークスの開発ではVue.jsを用いているので、開発を効率よく行う上では必要な拡張機能です。

ツール:f.lux
時間帯に合わせて色温度の調整をして、目を保護してくれるフリーツール
1日中PCを見ているエンジニアには、体のケアのためにも必要なツールですね。


~本人コメント~

f.lux は最初オカルトの類だと思っていたのですが、今では無効化されていると画面が眩しくて辛くなるほどに依存してます。とてもオススメのツールですが、色に敏感な(デザインなどの)仕事するときに無効化するのを忘れずに!



サービスをまたいだフロントエンジニアのIさん

使っているハードウェア(デスク周りの使用物)

キーボード:REALFORCE91UBK-S
東プレ株式会社のキーボードです。
人差し指、中指でタイプするキーと小指、薬指でタイプするキーとで、タイプするときの負担が変わっており、疲れにくいタイプができるように設計されたキーボードです。
私も同じキーボードを使用しています!

f:id:fujita-takumi:20180702140941j:plain

使っているソフトウェア

ブラウザ拡張:Vimium
vimキーバインドGoogle Chromeを使えるようにできるプラグインです。
ページのスクロール、リンクのクリック、ページを戻る/進むなどがマウスを使わずに操作することができるので、使いこなすことができれば作業効率がアップしそうなツールです。

ツール:Franz
複数のチャットツールを一元管理して使えるツール。
基本的にはチャットツールは1つのツールのみ使用するのが望ましいと思います。
お客さん都合など場合によっては、チャットワークとSlackを使うということもあると思うので、そういった場合にはとても便利なツールです。


~本人コメント~

REALFORCEは、新卒のときに初任給で買いました。4年目経った今でも毎日使ってます。
コトコトとしたタイピング音がなんとも心地よいです!



最後に

ウィルゲートのエンジニア内では個人やチームによって様々な開発ツールを駆使して開発を行っています。 チームを兼任している人も多いため兼任している人を通してチーム間で優良なツールの共有も行っています。 チーム間で優良なツールを共有することで、ウィルゲート全体で効率のよい開発が出来ています。 また、ツールの共有だけでなく定期的に開催される勉強会やLT会などを通して、ノウハウの共有も行っています。 今後もエンジニア全体で知識やツールの共有をして、成長していきたいと思います。



アルバイトから正社員に!元開発アルバイトにインタビューしてみた

こんにちは。サグーワークス開発チーム PM の横道です。
2016 年 10 月からサグーワークス開発チームで開発アルバイトとして参加していた大津くんが 2018 年新卒として入社してくれたので、アルバイト時代に感じたことや経験できたこと・ウィルゲートに入社を決めた理由などをインタビューしてみました!

f:id:m_yokomichi:20180627192110p:plain

――― 緊張してる?インタビューしていくのでよろしくね!

はい(苦笑)インタビューされることないので緊張しています・・・
頑張って話したいと思いますのでよろしくお願いします!

――― アルバイト時代の話を聞く前に・・・ 大津くんは最近どういった仕事をしていますか?

新しく開発しているサービスのサーバサイドプログラミングを行っています。コードを書くだけではなく DB の設計も少しだけ携わっていて、プロジェクトメンバーとして PL (プロジェクトリーダー)をサポートできるように意識して開発業務を行っています。
開発系以外の業務では、開発ブログを執筆や社内 LT 会で登壇したりしています。あと業務ではないですが、同期入社のエンジニアと一緒に業後に集まって勉強会を実施していたりします。

――― それでは本題に入るね、開発アルバイトを始めるきっかけって何でしたか?

アルバイトを始める前はチーム開発をしたことが無く、学校で開発をするときは一人で開発をしてきました。なのでチーム開発の経験を積んで成長したかったのでアルバイトを始めようと思いました。
それと、エンジニアを目指していたものの実際に働いたときのイメージが全く付かなかったので、エンジニアとして働くとはどういったものなのか感じてみたかったです。

――― 今は実際にエンジニアとして働いてるけどイメージ付いてるかな?

昔よりはエンジニアとして働いていくイメージは付いてきましたが、個人的に「働く」=「総合職」のイメージが強かったので未だにエンジニアで稼ぐイメージが沸かないことがあります(笑)

f:id:m_yokomichi:20180627192641j:plain

――― 実感できるようになるといいね(笑)開発アルバイトとして1年半居たけど、その間に経験できて良かったこと感じたことを教えてください

経験できたこととしては、チームで開発するときにしかやらないことをたくさん経験することができたので良かったです。 Git のブランチ管理・コンフリクトの対応・報告 / 連絡 / 相談・システムについての説明などなど・・・ 一人で開発してるときはコンフリクトとかまず起きませんからね。説明することは未だに課題が残ってるので上手く話しできるようにしていきたいです・・・
感じたこととしては、環境はそこまで整っていませんでしたがウィルゲートで働いているエンジニアの技術探求心に貪欲なところがあって、この人たちと一緒に成長したいと感じていました。それでウィルゲートに入社を決めました。 2016 年度の当時と比べたら環境は徐々に整ってきていていますよね。

――― アルバイトから正社員になるタイミングで考えていたことはありますか?

アルバイトと正社員だと立場と責任が全然違うので意識を変えていかないといけないな と考えていました。 それと、同期入社のエンジニアが自分を含めて 6 人いて、自分より技術力が高い人ばかりなので危機感を感じています。開発で新しいことを始めることになって、開発室から誰か抜擢するといったシチュエーションがあった時に、今のままでは自分ではなく技術力が高い開発メンバーが選ばれるので負けていられないな とも考えていました。

――― 実際正社員として入社してみて変わったことは何ですか?

いい意味で変わっていないことが多いというのが印象です。アルバイト時代から幸いなことに数カ月規模のプロジェクトにアサインさせてもらっていたので色んな経験をすることができていました。今も数カ月規模のプロジェクトで開発を行っているのでその点では変わっていないです。
いい経験ができるので、大学後輩には絶対開発アルバイトをやったほうがいいと進めています。

――― これから会社でやっていきたいことは何ですか?

能力面で足りないことが多いので色々と伸ばしていきたいですが、まずはシステム設計できるようになって PL を担えるようになりたいです。 そのためには技術もそうですが説明も上手くならないといけないですね(笑)
開発以外だと同期入社のエンジニアと進めている勉強会のスコープを広げていって、自分たちでイベントを企画して行きたいと考えています。

――― インタビューお疲れ様でした!今後ともよろしくね!

インタビューされたことがなかったので何を話せばいいか緊張しました。
今後ともよろしくおねがいします!

f:id:m_yokomichi:20180627191138j:plain

チーム開発でも迷わない!Laravel を「みんなで、きちんと」使っていくために取り組んだ 3 つのこと

こんにちは。ウィルゲートで開発を行っている岡田 (@okashoi) です。

私の所属するソリューションチームでは web アプリケーションフレームワークとして Laravel を採用しています。

以前に CakePHP との比較を行った際にも取り上げたとおり、Laravel は目的に合わせて柔軟に拡張できる仕組み提供しているのが特徴です。

CakePHP と Laravel の比較まとめ
「拡張するための仕組みが提供されている」のが長所のひとつ

個人的にはその豊かな表現力が好きな一方で、特にチーム開発においてはその自由度の高さゆえ、設計方針についてメンバー間の認識のすり合っていないと道を見失いやすいというデメリットも抱えています。

この記事ではソリューションチームにおいて、道に迷わずに(迷っても再び戻って来られるように)Laravel を使っていくために実施した取り組みを紹介していきます。

続きを読む

プロジェクトを遅らせずに現場の要望にも対応するための仕組み

サグーワークス開発チーム PM の横道です。
サービスを運用していると利用者や運営メンバーから不満や改修依頼を受けることが少なからず発生してきます。一方で、開発からも運用を楽にするための提案をしているため、優先度をしっかりと判断して進めていく必要があります。そこでサグーワークスではどうやって要望を吸い上げて対応しているのかを紹介します。

要望の吸い上げる方法

1.定常的に発生する運営メンバーからの要望や依頼

業務を行っているとシステムに関する要望や質問が出てくるはずです。そうした内容を漏らさず対応するために要望を上げるときは下記の運用ルールに沿って運用しています。

要望の内容 依頼方法 補足
簡単なデータ取得 / 変更 Google フォーム 「簡単」の目安は 30 分以内に終わる規模
質問 Slack 相談チャンネル
開発要望 Slack 相談チャンネル
システム不具合 Slack 相談チャンネル
その他 Slack 相談チャンネル どれに該当するか判断がつかない場合も該当

※どれに該当するか運営メンバー側で判断します。

Googleフォームの場合

開発へ依頼する専用の Google フォームに投函してもらい、投函された内容は当日中に開発側で対応することにしています。急遽入った依頼で丸一日時間を使ってしまうことが無いように、投函されてから長くても 1 時間以内に収まる規模にしています。
サグーワークスチームでは週末に 1 週間の開発計画を立てるようにしていて、その際に依頼への対応分も見積もりに入れているため、対応する度に予定していた開発が遅れるということは起きないようにしています。 とはいえ、時間が掛かる依頼の中で「今日中にやってほしい」とお願いされることもあります。その場合は本当に本日中にやらなければいけない依頼か判断した上で、現在行っている開発が遅れる旨を伝えて合意を取った上で作業を進めていきます。

f:id:m_yokomichi:20180606103742p:plain

Slack 相談チャンネルの場合

Slack に専用の相談チャンネルがあるのでそこで以下の流れでやり取りを行います。

f:id:m_yokomichi:20180606104550p:plain

依頼したことが無い人は Google フォームで依頼するべきことか、Slackで相談するべきことか判断がつかないことがあります。その場合は Slack チャンネルで相談してもらい、必要に応じて Google フォームに促すことで次回から正しいフローで依頼してもらえるようにしています。サービスの質問に関しては web ディレクターが回答できることは回答してもらい、システムの詳しい仕様については開発が回答する形を取っています。 開発要望やシステム不具合の場合は「開発要望リスト(後述)」に記載して、相談者に要件リストに載せて判断をしていく旨を伝えます。

2.会議中や雑談から生まれる発想

会議の時や雑談の時にアイデアが突然降りてくるときがあります。そのアイデアも他の要望と同列にした上で対応する・しないを判断する必要があります。 しかしながら、全ての思い付きを開発要件として並べると時間がいくらあっても足りません。 そこで、 web ディレクターがその要望を聞いて開発要件として並べるべきかどうか判断し、開発したほうがいい要件を「開発要望リスト(後述)」に記載していきます。
開発から出た改善案は開発チーム内で要件として立てたほうがいいか議論した上で「開発要望リスト(後述)」に記載し、他の要望と同列に判断できるようにしています。

口頭で相談するという点以外は Slack で相談が来た時と同じフローになるようにしています。

開発要望の判断

上記で登場した「開発要望リスト」を元に web ディレクターと開発でミーティングを実施して判断しています。 ミーティングは毎日 10 分~ 30 分で実施し、 1 日で上がった要望の確認を行います。

〇開発要望シート

要望内容 期待効果 対応方法【ミーティング時に追記】 対応予定工数【ミーティング時に追記】 優先度【ミーティング時に追記】
手動で行っている〇〇作業を自動化してほしい 10 h/月の運用工数削減 運用のフロー確認・開発 30 h 4
〇〇機能の絞り込み条件を追加してほしい 2 h/月の運用工数削減 検索フォームの条件追加 4 h 6
  • 開発内容  :どういった要望なのか、何をしてほしいかを記載する
  • 期待効果  :要望が達成された場合の期待効果を書く。(不具合時は対応しなかった場合も記載する)
  • 対応方法  :ミーティングで開発内容を聞き、開発時に何を対応するか分かるように開発側で記載する。
  • 対応予定工数:対応にどれくらいの工数が必要か見積もりを行う
  • 優先度   :対応内容と見積もりから web ディレクターが優先度を決める

要望の内容が不明確な場合はどういった対応を行えばいいか分からない為、発案者と web ディレクターですり合わせを行ってから開発が内容を確認します。期待効果の記載が無い場合は開発の対応工数に比べ効果が余りでない可能性があることと、期待に添えることができるかがわからないので期待効果を記載するようにしています。

こうして優先度と対応内容が確定した要件は順に開発が対応していきます。 毎月どれくらいこの要望リストに時間を当てるか計画して、優先度の高い要望が多い場合は次月以降で「開発要望リスト」の要件に割り当てる時間を増やし対応していきます。

webディレクターを窓口にしている理由

数年前は運営メンバーから直接開発に改修依頼がいく仕組みになっていました。その場合、新しく入った依頼が対応されやすくなり、本当は優先するべき依頼がないがしろにされる事がありました。 さらに web ディレクターを通していなかったので、事業サイドはどういった機能が開発されたかも把握できていないという問題もありました。
全ての依頼に対して web ディレクターを通すことで、要望を横に並べて正しく判断して対応できる仕組みにしています。