RAKUS Developers Blog

株式会社ラクスのエンジニアブログ

WIP制限の大切さ

はじめに

はじめまして。開発エンジニアのstrongWhiteです。

ラクスに入社して今年で2年目になります。

今回は、仕事を進めていく上でWIPを制限する大切さをお伝えしようと思います。
堅苦しい話にならないように、あるゲームの内容をもとにお伝えできればなと思います。

WIP

WIPとは「work in progress」の略で、仕事が進行中である あるいは 仕事が完了状態ではないことを意味します。
簡単にいうと、やりかけの作業 ということになります。

突然ですが、みなさんは仕事ができる人 や 仕事が早い人と聞くと、どんな人をイメージされるでしょうか。
いろいろな仕事を同時並行的にこなしている人をイメージされますか?

実は仕事を同時並行的に行うと、かえって完了が遅くなります。
仕事ができる人 や 仕事が早い人は、ひとつひとつの仕事を確実に終わらせる人です。
ここが今回の記事の肝になりますので、念頭に置いておいてください。

コインゲーム

先日、社内で開催された勉強会でコインゲームを開催しました。
このゲームはWIPを制限する大切さを実感できるゲームです。

ゲームに必要なもの

  • コインをひっくり返す「作業者」
  • 作業者の作業時間を計測する「管理者」
  • 1人の「顧客」
  • テーブル
  • 同じサイズのコイン20枚
  • ストップウォッチ(あるいはストップウォッチ機能付き携帯電話)
  • 結果を書き出す紙

遊び方

作業者と顧客はテーブルを囲んで着席します。
1人の作業者の後ろに1人の管理者が付き、管理者はストップウォッチを持ちます。
また、顧客もストップウォッチを持ってスタンバイします。

作業者・管理者・顧客の役割はそれぞれ以下の通りです。

  • 作業者…すべてのコインをひっくり返して、次の作業者に渡す。(最後の人は顧客に渡す。)
  • 管理者…作業者がコインをひっくり返すのにかかった実質作業時間を計測する。
  • 顧客…最初のコインが届くまでの時間とすべてのコインが届くまでの時間(最後のコインが届くまでの時間)の2つを計測する。

ゲームは3回繰り返してプレイします。
最初は20枚のコインを一括で行い、2回目は5枚ずつに分けて行います。そして最後は1枚ずつに分けて行います。
勘のいい方はこの時点で気付いたかもしれませんが、このゲームでは、コインがひとつのWIPを示しています。
3回とも全く同じようにプレイしますが、違うのはWIPが徐々に小さくなっていくことだけです。

今回、勉強会では作業者3名、管理者3名、顧客1名の計7名でゲームを行いました。
結果は以下の通りです。

20枚 5枚 1枚
Aさん 20秒 28秒 28秒
Bさん 23秒 26秒 28秒
Cさん 21秒 28秒 29秒
最初のコイン 67秒 23秒 4秒
合計時間 67秒 42秒 31秒

ゲームから学べること

WIPが小さくなるにつれて作業者の作業時間は長くなりますが、最初のコインがゴールするまでの時間と合計時間は短くなります。 つまり、同時に作業する作業項目を減らすと、リードタイムが短くなるということになります。
ひとつひとつのコインを皆さんが仕掛っている仕事に当てはめると、同時並行的に仕事をするとすべての仕事が完了するのにとても時間がかかってしまうということになります。 この点から、WIPを減らすことによる重要性が理解できるかと思います。興味がある方はぜひ周りの人とゲームをプレイしてみてください。

まとめ

今回はWIPを制限する大切さをお伝えしました。効率的に仕事を進めるには、ひとつひとつの仕事を確実に終わらせるように立ち回ったほうがいいということが少しでも伝われば幸いです。
抱えている仕事が多いと、つい気が焦って何でもかんでも手をつけてしまいがちです。ですがそのまま進めても何もかもが中途半端に終わってしまい、何ひとつ完了している仕事がないという状況に陥ります。
そんなときは今回の記事を思い出していただき、WIPを制限していま取りかかっている作業を終わらせることに集中してみてください。

参考

Marcus Hammarberg、Joakim Sunden 著 『カンバン仕事術-チームではじめる見える化と改善』

続いて3年!月1開催の社内有志イベント「ビアバッシュ」の紹介

はじめに

はじめまして。エンジニアのnorthmkyです。
ラクスに新卒で入社し、今年で2年目になります。

他エントリが技術の内容だったので少し趣向を変えて
ラクスが行っている技術交流会、ビアバッシュを紹介したいと思います。

ビアバッシュとは

“ビア"とついている通り
「ビールなどのアルコールを片手に(+軽食)フランクに技術内容について発表したり語り合う交流会」
のことを指します。

だいたい月に一度くらいの頻度で有志が集まって開催しています。
参加費は…なんと無料です。
というのも技術交流会を会社が応援してくれていまして補助金がでるのです。
そのおかげもあり、ラクスでは本イベントが3年も途切れることなく続いています。
(実はここまで会社内で技術イベントが続いてる事例は少ないんだそうです)

ビアバッシュの流れ

以下のような流れでやっています。

  1. ビアバッシュ開始
  2. お酒をたしなみつつ…
  3. 発表スタート!!
    • (発表 + 質疑応答) x 3名ほど
  4. 発表が終わりと思いきや…
  5. 飛び入り参加枠スタート
  6. ビアバッシュ終了

発表後半になると聴いていた参加者側の人が登壇したくなり、
飛び入り参加枠で話し始める…ということが結構あります。

気になる発表内容ですが…実に幅広いです。

  • 話題の技術を使ってみた
  • 勉強したことを整理してみた
  • 実務をしていて身につけたTips紹介
  • 読んだ本(技術書あるなし問わず)の紹介
  • 実務をしていて感じたこと・大事だと思うこと
  • 勉強会レポート
  • 趣味について熱く語る
  • 新卒一年目で感じたこと

などなど。
熟練エンジニアから新卒で入りたての人まで、様々な人が登壇します。

前回の様子はこちら

では実際に前回ビアバッシュの様子の一部を紹介したいと思います。
f:id:northmky:20170808104118j:plain:w250

開催前、司会進行のスライドです。
開催前に参加可否のアンケートをとり、発表者とそのテーマをタイムテーブルに落とし込みます。
たまに発表はじまりの前、後に個人で宣伝したいことを宣伝する時間をとることがあり、
そのときもこの資料に記載しています。
「平日毎○曜日、勉強会開催してるよー」だったり「趣味のイベント参加者募集!」だったり
技術以外の宣伝もあります。

f:id:northmky:20170808104122j:plain:w250

軽食といいながらお寿司がでちゃいます。
その会の運営している人のさじ加減で内容は変わります。
写真では伝わりませんが、BGMも流しています。
テンションがあがります。

f:id:northmky:20170808104126j:plain:w400

実際の発表風景です。
お気づきかもしれませんが、本ブログのTOP画像の場所、 通称「コワーキングスペース」にて行いました。
この写真の登壇者の発表内容は数学よりの話だったので皆さん真剣に耳を傾けています。

上記のような感じで毎月やっています。
飛び入り枠の雰囲気もお伝えしたかったのですが、自身が飛び入りをしたのでお見せする写真はありませんでした…

ビアバッシュのよいところ

私が参加してみてよいなあと思うところは
「普段仕事で関わる/関わらない人にかぎらず興味深い話が気軽に聞ける」
ところかなと思います。
なかなか他部署のエンジニアの方と話す機会って業務ではなかなかないのではないかと思います。
また同じ部署でも話さなかった人って実はいたりして、そのいう方々の話を聴くと
案外自分が気になっている情報を持っていらっしゃったりして、そこからより関係性が深まることもあります。
自分の好きな技術の話になりますと、やはり発表者もイキイキした表情と声で発表しているので、
伝染して楽しい気持ちになりますし、もっと知りたい!という知識欲をかりたたせられます。

おわりに

ラクスでのビアバッシュを紹介しました。

お酒が入った中自由に技術の話をする/聴くのはやはり楽しいです。
そしてこのイベントを会社が推奨してくれるのもありがたいなと思います。
これからも続いていけるようにしていきます。

実は、外部の方を招いて勉強会をしようという声も上がっています。
その時はまた周知しますので気になった方はぜひ参加してみてくださいませ。

以上northmkyからのビアバッシュ紹介でした。

ソートアルゴリズムで見るプログラムの計算量

はじめに

はじめまして。開発エンジニアのCarboxyです。
ラクスに新卒で入社して、今年で2年目になります。

今回は、新卒(≒エンジニア初心者)が、効率の良いプログラムを書けるようになるきっかけになればと思い、プログラムの計算量の求め方とその比較方法をソートアルゴリズム(選択ソート)を例に紹介します。

計算量とは

ある問題を解くためにどのくらい計算が必要かどうか(どのくらい時間がかかるか)

アルゴリズムの性能評価に使用できる。

O(オーダー)記法を用いて示す。
※計算量には時間計算量と空間計算量があるが、この記事では時間計算量の事を指す。

O(オーダ)記法

計算量の一般的な記述方法。大まかな時間計算量を表す。
例として、入力サイズ n の関数として表される時間計算量T(n)が

{ \displaystyle T_{(n)} = 10n^2  + 100n + 1000}

で与えられる場合、オーダー記法では最も次数の高い項の係数を省いて

{ \displaystyle O(n^2)}

となる。なぜこのように最も次数の高い項(主要項)の係数を省くような、漸近的な評価が使われるかというと、入力サイズ n が十分に大きい場合は、時間計算量は主要項にのみ依存するからである。

選択ソート

選択ソートを例に計算量を考える。
選択ソートは最も基本的なソートアルゴリズムの1つで、次のようなアイデアに基づきソートを行っていく。

1,入力データの中から最大のデータを見つける。
2,見つけた最大のデータをソートの対象から除外する。
3, 1と2 の操作を n - 1 回繰り返す。

ソースコード

入力サイズ n の配列 D[0]、D[1]、・・・、D[n-1]

for (i=n-1; i>0; i=i-1) {
max = D[0];
maxIndex = 0;
for (j=1; j<=i; j=j+1) {
if(D[j]>=max) {
max = D[j];
maxIndex = j;
}
}
swap(D[maxIndex],D[i]);
}

このアルゴリズムは、2重のfor文により構成されている。変数 n に依存する i , j の2重ループなのだからO(n^2)になることは安易に想像できるが、計算すると次のようになる。

外側のfor文の繰り返し実行回数は n - 1 回であり、内側のfor文は外側のfor文の変数 i に依存し、i 回の繰り返しとなっている。したがって、このアルゴリズムの計算量は、以下の式で表される。

{ \displaystyle O(1) × \sum_{i=1}^{n-1}i}

{ \displaystyle =O(1) × \{1 + 2 + 3 + ... + (n-1)\} }

{ \displaystyle =O(1) × \frac{n(n - 1)}{2}}

{ \displaystyle =O(n^2)}

計算量の比較

複雑になるため詳細は省略するが、その他のソートアルゴリズムの計算量を計算すると、例えばクイックソートの場合はO(n logn)になる。オーダー記法の漸近的な大小関係は以下のようになることから、選択ソートとクイックソートを比較するとクイックソートのほうが計算量が小さい事が数値的にわかる。

{ \displaystyle log n < \sqrt{n} < n < n log n < n^2 < n^3 < ... < 2^n <n!}

まとめ

オーダ記法によって漸近的な時間計算量を示すことができる。
プログラムを実行して時間を測定しなくとも、入力サイズ n に対してどのアルゴリズムが一番速いか数値的に比較できる。

【新米エンジニア向け】ログ調査に便利なLinuxコマンド

はじめに

はじめまして。開発エンジニアのwest-cです。
ラクスに新卒で入社し、今年で3年目になります。

ラクスでもエンジニアブログをはじめることになりました。
記念すべき1エントリ目を書くことになり光栄です。

本題

そんな1エントリ目のテーマですが、現在、私自身が新卒メンバーの育成を担当していることもあり、今年入社した新米エンジニアを対象にお話をしたいと思います。

大学や会社の研修でプログラムは学ぶかと思いますが、ログの見方・調査方法についてしっかり学んだことのある方は少ないのではないでしょうか。

個人で作成したプログラムであればエラーが発生したとき程度しか見ないログですが、お客様に提供するアプリケーションとなると話はちょっと変わってきます。
ログは、ユーザがとった行動の証跡(証拠)となることから、利用状況の把握から問題が発生した場合の原因特定まで非常に重要な役割を担います。

ログの形式はソフトウェアによって異なるためそれぞれの公式ドキュメントに譲るとして、ここではログ調査にあたり知っておくと便利なLinuxコマンドを紹介したいと思います。
なお、今回は Apache のアクセスログを例として説明を行います。

リアルタイムでログを監視したい

$ tail -f access_log

ファイルの末尾が更新されると自動的に追加分が表示されます。
例えば、検証環境にて画面遷移をした瞬間のログを確認したい場合などに重宝します。
長いスタックトレースを確認する場合は、予めEnterキーでいくつか改行を入れておくとログの切れ目が分かりやすくなり便利です。

ログをスクロールして表示したい

$ less access_log

行数の長いファイルの場合、catでファイルの中身を見ようとすると画面に収まり切らず、目的のログに辿り着くのにひと苦労します。
そのようなときにlessを利用すると、スクロールしながら閲覧することができます。
lessコマンド内で利用できる操作のうち、個人的によく使うものは以下になります。

キーバインド 説明
b 1画面分上にスクロール
スペース 1画面分下にスクロール
g ファイル先頭に移動
G ファイル末尾に移動
/文字列 ファイル内を文字列で検索
n 次にヒットした検索文字列の行に移動
N 前にヒットした検索文字列の行に移動
F リアルタイムで監視(tail -fと同様)
q lessコマンドを終了する

表示する行を絞り込みたい

以降は、以下のようなアクセスログを前提として説明を行います。
(GET or POST の前の数値はリクエスト処理にかかった時間(単位:秒)、末尾の数値はレスポンスサイズと解釈してください)

$ cat access_log
192.168.10.11 - - [10/Oct/2000:13:55:36 -0700] 1 "GET /index.php HTTP/1.0" 200 2326
192.168.10.11 - - [10/Oct/2000:13:55:36 -0700] 0 "GET /top.jpg HTTP/1.0" 200 310
192.168.20.8 - - [10/Oct/2000:13:56:01 -0700] 10 "POST /login.php HTTP/1.0" 200 1793
192.168.30.50 - - [10/Oct/2000:13:57:11 -0700] 5 "GET /mypage.php HTTP/1.0" 200 831
192.168.30.50 - - [10/Oct/2000:13:57:11 -0700] 0 "GET /room.png HTTP/1.0" 200 4530

特定の文字列が含まれる行のみを抽出したい場合はgrepの出番です。

$ grep "login" access_log
192.168.20.8 - - [10/Oct/2000:13:56:01 -0700] 10 "POST /login.php HTTP/1.0" 200 1793

ファイルから「login」という文字列が含まれる行のみが抽出されました。

逆に「login」という文字列を含まない行を表示する場合は、-vオプションを付けましょう。

$ grep -v "login" access_log
192.168.10.11 - - [10/Oct/2000:13:55:36 -0700] 1 "GET /index.php HTTP/1.0" 200 2326
192.168.10.11 - - [10/Oct/2000:13:55:36 -0700] 0 "GET /top.jpg HTTP/1.0" 200 310
192.168.30.50 - - [10/Oct/2000:13:57:11 -0700] 5 "GET /mypage.php HTTP/1.0" 200 831
192.168.30.50 - - [10/Oct/2000:13:57:11 -0700] 0 "GET /room.png HTTP/1.0" 200 4530

grep -Eまたはegrepを利用すると、検索文字列に正規表現を利用することができます。

上記を組み合わせると、画像ファイル(*.jpg, *.gif, *.png)を除外したログを表示したい場合に、以下のように記述することができます。

$ egrep -v "\.(jpg|gif|png)" access_log
192.168.10.11 - - [10/Oct/2000:13:55:36 -0700] 1 "GET /index.php HTTP/1.0" 200 2326
192.168.20.8 - - [10/Oct/2000:13:56:01 -0700] 10 "POST /login.php HTTP/1.0" 200 1793
192.168.30.50 - - [10/Oct/2000:13:57:11 -0700] 5 "GET /mypage.php HTTP/1.0" 200 831

表示する列を絞り込みたい

例えば以下の3つの情報がログ調査に必要であるとします。

  • アクセス日時
  • リクエストURL
  • リクエストにかかった時間

この3つ以外の情報は今回は必要の無いノイズ情報ですので、awkで表示する列を絞り込みましょう。

awkで列を絞り込む場合、デフォルトでは空白(スペース)またはタブ単位で区切られます。
今回の例だと、4列目(アクセス日時)・6列目(リクエストURL)・8列目(リクエストにかかった時間)だけを表示したいことになります。

$ awk '{print $4,$6,$8}' access_log
[10/Oct/2000:13:55:36 1 /index.php
[10/Oct/2000:13:55:36 0 /top.jpg
[10/Oct/2000:13:56:01 10 /login.php
[10/Oct/2000:13:57:11 5 /mypage.php
[10/Oct/2000:13:57:11 0 /room.png

必要な情報のみが表示され、見通しが良くなりました。

$の後の数字には、区切り文字で行を分割した際の順番が入ります(1始まり)。
区切り文字を変更したい場合は、-F '区切り文字'とオプションを付与すれば良いです。

ちなみにcutコマンドでも同様のことは実現できますが、次に紹介する話との関連で、ログの確認時にはawkを利用することをおすすめします。

条件に合致するログのみを抽出したい

ひとつ前の例に追加して「リクエストに3秒以上かかったログのみを抽出したい」場合を考えてみましょう。
awkプログラミング言語なので、条件分岐を記述することもできます。

$ awk '$6>=3{print $4,$6,$8}' access_log
[10/Oct/2000:13:56:01 10 /login.php
[10/Oct/2000:13:57:11 5 /mypage.php

このように「○番目の項目が□□だった場合」と記述することができるため、単純な文字列一致の条件の場合でもgrepよりも細かく絞り込みを行うことができます。

まとめ

私自身、入社したての頃にログファイルをviで開いて怒られたりログファイルを根こそぎExcelに貼り付けてちまちま絞り込みを行ったりと苦い経験があったため、今回このテーマを選ぶことにしました。

今回取り上げた内容は基本的なものであり、さらに高度なログ集計を行おうとすると、sortuniqsedなども必要になるかと思います。
まずはこの記事を足がかりに、その他のコマンドも習得してステップアップしてもらえると嬉しいです!

Copyright © RAKUS Co., Ltd. All rights reserved.