ユニファ開発者ブログ

ユニファ株式会社システム開発部メンバーによるブログです。

ユニファのシステムの移り変わり(中編)

おはこんにちばんは! ユニファのインフラ見てますすずきです。

先週に引き続き書いています。(ホントはこれも先週出す予定…)
引き続きなので今回はユニファのシステム変化の中編(後編では収まらなさそうだ…

前編はこちら

tech.unifa-e.com

さっそく中編始めます。

続きを読む

RSGT2020 参加レポート

こんにちは。スクラムマスターの渡部です。

まだまだスクラムマスターとしての経験が浅い私ですが、幸運にもRSGT2020に参加させていただくことができたので、ここにまとめたいと思います。

あらゆるセッション、あらゆる出会いと体験が素晴らしいものでした。

ですので、その全てに触れるのはここでは諦めます。 今回の記事では、特に印象に残ったこといまのチーム・組織に活かせそうなこと考える必要がありそうなことにフォーカスします。

社外の方はもちろんですが、社内の方にも見ていただきたい内容に、きっとなっていると思います。

RSGT2020とは

RSGT2020と略称を連呼していますが、正式にはRegional Scrum Gathering Tokyo 2020(リージョナル スクラム ギャザリング 東京)と言います。

2020.scrumgatheringtokyo.org

アジャイル / スクラムに関わる方が400人ほど集まり、スクラム開発の成功 / 失敗体験の共有や、スクラムを理解する助けになるようなお話、理想に向かって進むときの問題と必要なアプローチなど、様々なテーマのセッションが行われます。

また、参加されている方はみな、各々の現場でより良いチーム、良いプロダクト、良い組織のために悩み抜いていらっしゃる方ばかりなので、セッション外の時間でのコミュニケーションからも多くの学びを得られる、ワクワクが満載のイベントでした。

因みに私は、(恐らく無関係な)複数の方から「まだまだコントロールしようとしている」という趣旨の指摘を受けています。「難し〜!!」と心の中で叫びつつも、その通りだと理解しているので、今後の課題の一つとして認識しています。

…これでもちょっと意識しているつもりなんですが、本当に難しいんですよ!!!(大泣)

雰囲気

会場

f:id:unifa_tech:20200203184429j:plain
会場となったソラシティカンファレンスセンター

f:id:unifa_tech:20200203162932j:plain
セッションが行われる場所

前回までは別の開催場所だったようですが、今回は御茶ノ水にあるソラシティカンファレンスセンター*1で開催されました。

会場は、写真ではちょっと伝わりにくいのですがかなり広く、多分400名くらい入ると思います。また、写真の部屋の他にもう一会場ありますので、かなり規模が大きいことがわかるかと思います。

積極的な採用活動

f:id:unifa_tech:20200203184518p:plain
一緒に保育をハックするプロダクトを作りたい方、募集中!!

ロビースペースにはジョブボードが張り出され、皆さんの会社が一言コメント付きで募集をかけていました。当然弊社も参加しています。

興味がある方はぜひ一度ご連絡ください(笑)

herp.careers

おすすめのAgile / Scrum本アンケート

ロビーの壁に投票用紙があり、参加者のおすすめ本アンケートが行われていました。

iwakiri.hatenablog.com

詳細な結果は上記リンクをご覧いただければと思いますが、良書と言われている本はやはり強いですね。「アジャイルサムライ」は全参加者層から1位を獲得していたようです。

他の本もほとんどは見聞きしたラインナップでしたが、「Joy,Inc.」のみ知らず…個人的にAmazonで購入したのはまた別のお話です。

以下、セッションについての感想です。

良い悪いではない。あなたはいま、どの段階なのか?

confengine.com

1日目のKeynoteでは、スクラムを「禅の入門書」に照らし合わせて、(言い方に語弊があるかもしれませんが)初心者から熟練者までのそれぞれのフェーズを解説する内容でした。

その中で都度「いまのあなたはどの段階ですか?良い悪いではありません、いまの段階を知ることが重要です」と話されていたことが、非常に印象的でした。

「段階をすっ飛ばして一気に理想を追い求めるべきではない、まずは正しく現状把握をせよ。そして次の段階へ進むために必要な適切な行動をすべし。」

そう言われているように感じ、プレッシャーとともに、勇気をもらえたような気がしました。(そう思えるようになったのは2日目以降でしたが)

何をするにしても、理想と現状の間にはギャップがあります。それはスクラムに限らず、個人のスキル、チームの状態、あらゆることに当てはまります。

大事なのは、いま私たちがどの段階にいるのかを理解すること。そして、次の段階に進むために何が不足しているかを考え、一歩一歩前進していくことなのです。

会社やチームのことを、めっちゃ嬉しそうに語れるか?

Tadahiro Yasuda - 日本にJoy,Incを創る!ぼくらのジョイインクジャーニー3年間の軌跡

www.slideshare.net

おすすめのAgile / Scrum本で見事第二位を獲得した、話題のあの本が関連するお話です。

発表されていた会社は、昔は会議が暗い雰囲気で、チーム間でいがみ合いがあったり、業績も良くなかったそうです。(そんなことを声を大にして発表するなんて、非常に勇気がいることだったと思います)

そんな時にJoy,Inc. *2に出会い(恐らく憧れを抱き)、チームを、会社を変えるために行ってきた施策とその効果が紹介されていました。

その中でも比較的簡単に導入できて、特に面白そうだったものを紹介したいと思います。

ふるふるリレートーク

輪になって順番にリレートークするのですが、誰か一人を「ふるふると震えるほど」褒めまくるとのこと。

単純に面白そう、ということもありますが、忘れられがちな良いところを言語化して話すことで、聞いてる人もその人を知ることができますし、言われる側も改めて何が貢献できているかを理解できるのは素晴らしいですね。

チームの他の人が自分に対して何を期待しているのか、何をしてもらったら嬉しいのかは、わかっているように思えて、実は少しずつずれているものです。

そういったミスコミュニケーションを減らせるので、日々の仕事の効率も少しずつ上がっていきそうな気もします。やってみたいですね。

雑談

合間合間で積極的にコミュニケーションできるよう心がけていたのですが、まさか「雑談だけの時間」を作ってしまうとは驚きでした。

改めて考えてみると、「効果がある」とされていることを、業務時間で取り入れていけない訳が無いんですよね。

ただ、続けていくと話す人が偏ったり、ネタ切れになったりと課題はあったらしく、こころかるた*3というものを使って解消されていたそうです。

詳しいやり方、やってみた効果のまとめはこちらにあるので、よければご覧になってみてください。 www.creationline.com

カルチャーと業績は連動する

私たちは同じ会社で一緒に働いてはいますが、意識的に相手を理解しようと努めないと、仕事のアウトプット以外はよく知らないなんて状態になります。 そうなると、心理的安全性*4も低い状態になり、生産性も低下していくのでしょう。

セッションでは、「繋がりができて仕事がスムーズになった」、「心理的安全性が高まった」ということが強調されていました。

心理的安全性はパフォーマンスに繋がりますからね、素晴らしい!

そして、上記のような施策を実施し、カルチャーをカイゼンし続けた結果、従業員のエンゲージメントスコア会社の業績が連動して上昇したという結果が出たそうです。

「ふるふるリレートーク」も「雑談」も、時間さえ確保できればカンタンに実践できるので、私も早速取り入れてみたいと思います。皆様も是非!

最後に

参加された方のブログもたくさん拝見したところ、みなさん「ブログでは書ききれない」「学びの多い時間」「勇気をもらえた」と口を揃えて仰っていますが、本当にその通りでした(笑)

今も昔も悩みだらけですが、一つ違うのは、「自分だけではなく、みんなも同じように理想と現実とのギャップに悩みながら、明日が少しでも幸せになるように足掻いていることを知った」という点です。

RSGTに参加したからと言ってすぐさま劇的に状況が変化することはありませんが、今スプリントよりちょっとだけ素敵な来スプリントへ向かって、一歩一歩着実に、楽しく、勇気を持って進んでいきたいと思います。そんなチームに、会社になっていけるよう、引き続き精進していきたいと思います。

最後の最後になりましたが、RSGT2020参加者・関係者・スポンサー企業の皆様、そして、快く送り出してくれたチームのみんなに感謝を。

f:id:unifa_tech:20200203175248j:plain
スポンサーロゴ

Pytorch Tiny Edge Detection

By Matthew Millar R&D Scientist at ユニファ

Purpose

This blog will show how to make a custom edge detector using a very small Convolutional Network and Pytorch. This will be a very simple approach to making a fast and accurate Edge detector which is better than Opencv Canny Edge Detector.

Edge Detection

Edge detection is a basic computer vision technique that allows for the edges or boundaries of an image to be found. This is one of the basic methods for CV that most people do when they start using OpenCV as their Canny edge is fairly good, but will have to be worked over several times to find the optimal parameters per image which cannot be applied to every image that is processed. That is where CNN can help out.

CNN for edge detection

CNNs are very good at extracting features from an image. These features can then be used to generate edges of the image. The process starts by reading in an image then converting it to a grayscale image. To get good results, building out your own filters would be best, but for ok results using a very basic filter can be used. Then using these filters in CNN as the kernel size will allow for the extraction of features from the image. The activation layer (normally Relu) will give you the black and white extraction that you would expect.

Let's walk through the Code.

The imports you will need

import cv2
import matplotlib.pyplot as plt
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F

Using a photo I took from an American Air Show in Japan we will show how to work with Pytorch and edge detection from scratch.

f:id:unifa_tech:20200129153649j:plain
F-18
Next we will read in the image and transform it into a grayscale image.

img_path = 'data/f18.jpg'
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = gray.astype('float32')/255
plt.imshow(gray, cmap='gray')
plt.show()

Next we need to define our filters which will do the feature extraction in the CNN

# Vizulization filters
base_filter = np.array([[-1, -1, 1, 1], [-1, -1, 1, 1], [-1, -1, 1, 1], [-1, -1, 1, 1]])
print("Filers: ", base_filter.shape)
# Defining four different filters, 
# all of which are linear combinations of the `filter_vals` defined above

# define four filters
filter_1 = base_filter
filter_2 = -filter_1
filter_3 = filter_1.T
filter_4 = -filter_3
filters = np.array([filter_1, filter_2, filter_3, filter_4])
print('Filter 1: \n', filter_1)

Here is what the filters will look like in Numpy

Filers:  (4, 4)
Filter 1: 
 [[-1 -1  1  1]
 [-1 -1  1  1]
 [-1 -1  1  1]
 [-1 -1  1  1]]

That may not look very nice so lets visualize them a bit better.

# visualize all four filters
fig = plt.figure(figsize=(10, 5))
for i in range(4):
    ax = fig.add_subplot(1, 4, i+1, xticks=[], yticks=[])
    ax.imshow(filters[i], cmap='gray')
    ax.set_title('Filter %s' % str(i+1))
    width, height = filters[i].shape
    for x in range(width):
        for y in range(height):
            ax.annotate(str(filters[i][x][y]), xy=(y,x),
                        horizontalalignment='center',
                        verticalalignment='center',
                        color='white' if filters[i][x][y]<0 else 'black')

f:id:unifa_tech:20200129154136p:plain
Filters
Now that makes sense right. This shows which part of the image the filter will look for sharp contrast in the pixels.
Next we will define a simple CNN and our own weights.

# Conv Arch
class Net(nn.Module):
    def __init__(self, weight):
        super(Net, self).__init__()
        # initializes the weights of the convolutional layer to be the weights of the 4 defined filters
        k_height, k_width = weight.shape[2:]
        self.conv = nn.Conv2d(1, 4, kernel_size=(k_height, k_width), bias=False)
        self.conv.weight = torch.nn.Parameter(weight)
    def forward(self, x):
        # calculates the output of a convolutional layer
        # pre- and post-activation
        conv_x = self.conv(x)
        activated_x = torch.relu(conv_x)
        return conv_x, activated_x

Then we will define the weights (randomly initiazlized)

# instantiate the model and set the weights
weight = torch.from_numpy(filters).unsqueeze(1).type(torch.FloatTensor)
model = Net(weight)

# print out the layer in the network
print(model)

Now to call the model we can do this which will return both the convolutional outputs as well as the activation outputs

# convert the image into an input Tensor
gray_img_tensor = torch.from_numpy(gray).unsqueeze(0).unsqueeze(1)
# get the convolutional layer (pre and post activation)
conv_layer, activated_layer = model(gray_img_tensor)

The pre activation output will be this
f:id:unifa_tech:20200129154656p:plain
and the post activation output will be this
f:id:unifa_tech:20200129154721p:plain
Now this may not look like the common edge detection that you are used to, that is because we need another step to get the final output of edges.
We will have to add each edge together which will give what you would expect.

print(activated_layer.detach().numpy().shape)
# print out (1, 4, 2617, 4653)
edge = activated_layer.detach().numpy()
edge = np.squeeze(edge)
merged_1 = np.add(edge[0], edge[1])
merged_2 = np.add(edge[2], edge[3])
merged_edge = np.add(merged_1, merged_2)
print(merged_edge.shape)
# prints out (2617, 4653)
plt.imshow(merged_edge,cmap='gray')
plt.show()

Which will then give you the final edge detection image.

f:id:unifa_tech:20200129154917p:plain
Edge Detection

Now lets compare to OpenCV built in one

img = cv2.imread('data/f15.jpg',0)
edges = cv2.Canny(img,100,200)
plt.imshow(edges,cmap='gray')
plt.show()

Which will give you this image.

f:id:unifa_tech:20200129155034p:plain
OpenCV

Conclusion

Better results can be obtained by working with both of these two. But using the most basic of filters the CNN outperformed the OpenCV version. Ways you can improve both is by working with the filter of the CNN and adding layers to the CNN to improve the quality of features that are extracted. OpenCV you can adjust its parameters to fine-tune it for the specific image, but this will not work for a different image, while the CNN new filters will. Both of these can be put on as Raspberry Pi, but the Pytorch model will run just as fast as the OpenCV method but will give much better results in the end.

ユニファのシステムの移り変わり(前編)

おはこんにちばんは! ユニファのインフラ見てますすずきです。

私は新年最初のブログになります。 そして春になれば私も入社4年が経つなと思い、ユニファのシステムの遍歴でもまとめてみるかとおもい、ブログに書いてみます。

ただ、入社前の部分も書いてるので、そのあたりが適当なのはご容赦ください。

続きを読む

Swift for TensorFlowで頭部姿勢推定をやってみる

こんにちは、iOSエンジニアのしだです。
前回、Swift-Jupyter について書いたのですが、本当はSwift for TensorFlowを使って頭部姿勢推定(Head pose estimation)をやりたかったのでこちらをやってみたいと思います。

tech.unifa-e.com

頭部姿勢推定(Head pose estimation)

頭部姿勢推定は、カメラからみた頭の向きの推定を行うことです。 そのままですが、画像から頭の向きを pitch、 yaw、 roll の3つの値を予測することになります。

続きを読む

ユニファ開発チームの2020年-今年は洗練の年!

あけましておめでとうございます! エンジニアの田渕です。
みなさま、どんな年末年始を過ごされましたか?

ユニファは海外エンジニアも在籍しておりますので、きっと多種多様な過ごし方が……と思って話を聞いてみると意外と「寒いし混んでるんで出かけません。」と言う返事が多く(笑) 話を聞いてみると、国によっては日本みたいに「お正月だからホテルの料金が高くなる」みたいなことがないところもあるようなのです。 確かにそうなると、わざわざ高い時期に出かけることに躊躇いが出るのは納得です。

さて、まだ今年の仕事も始まって一週間経っておりませんが、早速年始からバタバタバタ……。。。 このブログも、うっかり書き忘れそうになっていたのを思い出し書いているところです。

昨年末のUniFa Advent Calendar 2019は好評のうちに終了。 (読んでくださったみなさま、ありがとうございました!執筆したみなさま、お疲れ様でした!) 最終日25日に書いたCTO赤沼の記事が良かったと内輪で話題になりましたので、 今回はその内容を受ける形で、私の方で今年の展望を書いて行こうと思います。

<プロダクト>「スマート保育園構想」の実現に欠かせないものとは

「スマート保育園構想」とは

最近は色々な場所で、弊社のメンバーが登壇した際に「スマート保育園構想」と言う言葉を口にしていると思います。

改めて、「スマート保育園構想」とはなんなのか。

昨年3月の赤沼のインタビュー記事と、12/28(土)に放送されたBSフジの「この国の行く末2」のリンクです。

job-draft.jp

「この国の行く末2」

konokuni.jp

プロダクトが増えてきた!でもそれだけでいいの?

f:id:unifa_tech:20200109234529p:plain
スマート保育園構想
上の図は、前回のブログで書かせて頂いたRuby Biz Grandprix 2019のプレゼンテーション資料中の図です。 (この俯瞰図はうちのデザイナーが書いてくれたもので、とても好評です。)

当初は写真サービスである「ルクミーフォト」しかなかった弊社ですが、現在ではこの図に記載されていないサービスも含め、保育園・幼稚園・こども園内の業務のより広い範囲をカバー出来るようになっています。 直近では、「ルクミーシフト管理」のリリースも発表されました。

プロダクト/機能が増えていくこと自体は良いことですが、それに伴い新たに生まれてくる問題もあります。

作り手としては「システム構成・アーキテクチャの複雑化」、使い手としては「機能が多すぎて使いこなせない。」 特に後者の「機能が多すぎて使いこなせない。」と言う問題は、利用者の方々にご不便をおかけすることになるので、早急な対策が必要と考えています。

私はもともと地方出身なので、東京に来たばかりの頃は巨大なデパートの中で目的のものが探せずにとても疲れた思い出があります。自分が欲しいものだけが揃ったセレクトショップあったらなーとそんな時に思った訳ですが、弊社サービスをご利用頂く利用者の皆様にはそんなご苦労はおかけしたくない。。。

プロダクトに関しては、今年も昨年同様に新しい物をどんどん世に送り出しながら、プロダクトが増えた次の段階である

「より効率的に利用者の方がやりたいことをやれる様になるには。」

「欲しいものを、欲しいタイミングで見てもらえるには。」

を追求していくのが今年だと考えています。

<チーム>「多様性を受け入れる」ことから、より充実した環境へ

その「当たり前」は本当に「当たり前」ですか?

さて、昨年は赤沼の記事中にもあった通り、エンジニアメンバーが大きく増えた年、多様化が進んだ年でした。 開発チームの19名の新メンバー中、11名は外国籍メンバー。 年末に行った忘年会では、各国の早口言葉で盛り上がったところもあったようです。

日本では当たり前の「お正月のATMのメンテナンス」。 毎年の恒例行事ながら、日本人でも忘れてしまう人がいます。 年末に外国籍メンバーから「他の外国籍メンバーに教えてあげたほうがいいです。」と言うお話を貰って慌ててアナウンスしました。 言われてみれば、日本での年末年始が初めての方は知らなくて当然です。

こんな感じで、日常的に「当たり前」と思っていることが実は当たり前じゃない、と言う経験をしています。 そのお陰で、最近では色々なことに対して「それって当たり前なんだっけ?」と考えられる様になってきた気がしています。

これは、プロダクトを作っていく中ではとても大切な感覚であり、今後役に立っていくといいなと思っています。

去年は精一杯だったけど、今年はもう一歩先へ

昨年は様々な方々を受け入れ、実際に業務をしていくための基盤づくりの年だったと思っています。

コミュニケーションはどうやって取るのが一番いいのか?

何が必要なのか?

色々と、みんなで試行錯誤してきました。 現在では各チームでそれぞれのやり方を見つけ、臨機応変に対応してくれています。

昨年は受け入れるところで精一杯でしたが、今年は「より効率的に、充実した情報を届けるには、質の高いコミュニケーションを取るには」と言う一歩先の観点を持ち、活動していきたいと思っています。

今年もHackします!

ここまで、「今年やっていきたいこと」について書かせて頂きました。

今年は、 「昨年広げた色々な物を整理/綺麗にしてより洗練させていく年」 と考えています。

また一年間、予想していることもしていないことも含め、色々なことがあると思いますが、来年は次のステージの抱負を書けるように、一年頑張っていこうと思います。

引き続き、変わり続けるユニファで一緒に保育をHackしてくれる方を募集中です!

unifa-e.com

今年も宜しくお願いいたします!

できることもできないことも増えていく。ユニファ開発チームの2019年を振り返る

みなさまメリークリスマス、ユニファCTOの赤沼です。

UniFa Advent Calendar 2019 もついに最終日。この記事を読んでいただけているということは私もちゃんと役目を果たせたということで仕事納め気分です(まだ早い)。

さて、2019年ももうすぐ終わりですが、今年もユニファではスタートアップらしく、一年の間で色々なことがありました。その中で今回は開発に関連するトピックを雑に振り返った後で、最近思ったことを書いてみたいと思います。

プロダクトの追加・拡大

プロダクトに関連することとしては、念願の一つであったルクミーフォトのリニューアルを実施しました。2013年創業時のファーストプロダクトであるルクミーフォトは、サービスの立ち上げスピードと初期ユーザ獲得を最優先としていました。リリースから時間も経ち、サービスのフェーズも変わってくるとどんなプロダクトでもレガシーな部分に対するコストが増大していきます。ルクミーフォトも今後のサービス拡大やユーザビリティ向上のためにも今リニューアルすべきという決断のもとリニューアルを実施しました。リニューアル中は大きな機能追加等はできなくなりますので、ビジネスのメンバーからも多大な協力を得て実現することができました。

tech.unifa-e.com

tech.unifa-e.com

tech.unifa-e.com

tech.unifa-e.com

また、今までリクルートマーケティングパートナーズさんが開発・運用されていた保育園向けICTサービスである Kidsly を、弊社の販売パートナーであるフレーベル館さんを経て事業譲渡いただき、弊社での開発・運用が開始しました。すでに多くのユーザに利用いただいている大規模なサービスの移管は弊社でも初めての経験で、手探りなことも多かったのですが、無事に完了し、今後のユニファの保育園向けICTサービスの中核となっていくプロダクトが加わりました。

kidsly.jp

ルクミー午睡チェックも正式リリースから一年が経過し、弊社初のIoTサービスとしてまずは1年間運用が行えたことにホッとしています。導入数も順調に伸びていますので、今後も安心・安全を提供するプロダクトとして安定的な開発・運用を続けていきたいと思います。

unifa-e.com

開発チームのスケール&開発プロセス改善

開発チームとしても体制が大きく変わりました。今年だけでも開発チームに19名の新メンバーが加入し、今までの倍の規模になりました。また、そのうち11名は外国籍メンバーということで、一気に多国籍チーム化が進みました。開発者採用はスタートアップにとっては特に厳しい市場環境である中、これだけのメンバーに入社いただけたのは本当に嬉しい限りです。

エンジニア以外にもディレクターやデザイナーメンバーも増え、各ロールでのチーム体制や、ディレクターを中心としたプロダクト開発体制も以前より充実させることができ、スクラムを主軸としたアジャイル開発プロセスのプラクティスも積極的に導入しています。ビジネスメンバーも含めたプラクティス浸透のための取り組みもメンバーが積極的に実施してくれているので、今後さらにプロセスの改善が進めていけるのではないかと思っています。

tech.unifa-e.com

R&Dのメンバーも増員され、主に Machine Learning / Deep Learning 領域について今まで以上に幅広く取り組むことができてきました。ビジネスメンバーとも連携して、企画案についての技術的な実現可能性の検討なども行なっています。スタートアップでR&Dチームを置いているケースはあまりないと思いますが、我々が目指すスマート保育園の実現のためには欠かせないと思っています。

podcast.unifa-e.com

デザイナーも人数が増え、やっとチームと言える形になってきました。自社プロダクトのデザインはもちろん、外部向けの露出も増やしていくことができそうですし、社内全体においてのチーム作りという点でもデザインが持つ力は大きいと思っています。

podcast.unifa-e.com

ちなみに入社時から現在の規模になるまでのチームのスケールについては、今年の CTO Night & Day での登壇時にお話しさせていただき、下記の資料も公開しています。

prezi.com

技術ブランディング注力

今年多くの開発メンバーが入社してくれたということは、年始の段階でもそれだけの採用を見込んでたということで、今まで以上に外部向けの技術ブランディングに注力した年でした。以前から継続していた開発者ブログもメンバーが増えたことによって投稿数も大幅に増え、今回のような Advent Calendar が成立するまでになりました。昨年末からスタートした Podcast も不定期ながらなんとか継続し、今月で一年が経過しました。またカンファレンスのスポンサーも初めてやらせていただき、RubyKaigi や builderscon でスポンサーさせていただいた他、 RubyWorld Conference や ServerlessDays Tokyo、 プロダクトマネージャーカンファレンス等ではブースも出させていただきました。当日は登壇させていただく機会があったり、ブースにお越しいただいた方と色々とプロダクトについてお話しさせていただいたり、私たちとしても世界が広がっていく感覚を持つことができました。さらには自社単独や他社との共催での Meetup イベントも開始し、参加いただいた方の中から入社が決まった方もいました。

podcast.unifa-e.com

podcast.unifa-e.com

podcast.unifa-e.com

tech.unifa-e.com

tech.unifa-e.com

podcast.unifa-e.com

tech.unifa-e.com

tech.unifa-e.com

tech.unifa-e.com

これらの実行については準備段階から実際の運用まで、今までの規模では行うことが難しかったですが、メンバーが増え、それぞれ積極的に協力してくれたからこそのもので、開発だけではなく人事や広報等の他の部署のメンバーの協力もあったからこそ実行できたものです。その甲斐あって最近他社の方と会って話をする際に、ユニファのことを目にしたことがある方が増えてきた感触がありますし、すでに繋がっていた方からも、露出機会の多さに注目いただくことが増えました。

また、今年はユニファ開発チームから初めて海外のTech系カンファレンスに1人ではありますが参加することができました。AWS re:Invent や Google I/O、 WWDC など、海外のカンファレンスは日本のものとはスケールが違いますし、最新の技術情報のキャッチアップももちろん重要ですが、何よりテクノロジーに対しての盛り上がりを実際に体験してくるということはとても重要なことだと考えています。来年以降どうなるかはまだわかりませんが、ひとまず最初の一歩が踏み出せたという点では前進できたと思っています。

tech.unifa-e.com

できることが増えてきた。でもできないことも増えていく

ここまでは主に今年やったこと、規模が大きくなったことでできるようになったことをお話ししてきましたが、一方で、できないことも増えてきているとも感じています。規模が小さい時には、今後人数が増えてくればどんどんできることも増えていって、できないことは減ってくるイメージをしていましたが、実際に開発チームや会社全体の規模が大きくなってくると、もちろんできることが増えてきてはいるものの、今までとは違ったできないことが増えていっているという感じです。

プロダクト数や開発チーム、会社規模が拡大してくると、工数などの問題以外にも様々な力学が発生してきます。また、人が増えればやりたいことの総数も増え、指向性も多様になっていき、いずれかを選択せざるを得ないケースも増えてきます。さらにスタートアップとしては対象とする業界の情勢や自社の状況などは日々めまぐるしく変わっていきます。

こういった中では、会社も個人も自分を変えていき、向上させていく必要があります。自分が今までと同じアウトプットを出していたとしても、周りが変わっていき向上していく中では、相対的に自分達のバリューは下がっていってしまいます。

一方で、どれだけ変化する状況の中でも変えてはいけないもの、守らなくてはいけない大事なものがあるのも確かだと思っています。この、変えていくべきことと変えてはいけないことの判断は簡単ではありません。痛みを伴ってでも変えるべきことなのか、流されずに抗うべきことなのか、この判断がとても難しいと最近は感じています。経営、チーム、プロダクト、どの面を取ってもこの判断を間違えた場合、リカバリが困難になる可能性があります。

日々の 1 on 1 等でメンバーと話す中で上がってくるボトムアップでの課題、マネージャー陣から上がってくる会社組織としての改善点、経営陣と話す中で論点になる事業上の問題点など、それぞれ違った視点から、みんなもっと現状を改善したいという想いで様々な課題があげられます。意思決定をしていく立場としては、上がってきている課題は適切な内容か、自分の判断は会社の経営者として正しいのか、CTOとして開発視点から通すべきことを主張できているか、単にメンバーの要望に迎合しているだけになっていないか、他の経営陣の声に流されていないか、セクショナリズムを排除してフラットに判断できているか、こういった様々な思いが日々渦巻いています。

自分の判断が正しかったのかどうかはその瞬間にはわかりません。後になってわかるものです。そうした中で意思決定していく上で大切なのは、自分の中で芯のある結論を出せたか、これで間違っていたら仕方ないと思えるような、これならメンバーにどう思われても仕方ないと思えるような決断になっているかなのかなと思っています。なんとなくで決めてしまったものは失敗することも多いですし、その後もモヤモヤしたものが残りがちです。もちろん考え抜いた上で決定したことでも失敗することはあるのですが、その場合には自分の中で整理もつけやすく、次に向けてピボットしていける気がしています。要はそれぞれの意思決定に対して自分にも他者にも真摯に向き合って手を抜かずに考え抜けたかどうかなのだと思っています(できているとは言ってない)。

来年も保育をハックする

さて、とりとめもなく色々と書いてしまいましたが、我々ユニファ開発チームは来年も保育をハックしていきます。この「保育をハックする」というのは我ながら開発チームのマインドを一言で表していて良い感じだなぁと思っています。また、上記で色々と書いたように組織としてももっと強くしていく必要がありますので、チームをハックしていくことも必要だなと思っています。今年は技術ブランディング等で外向けの施策にも注力していましたが、来年はどちらかというとチームを強くしていくための内部的な施策に重点を置きたいなと思っていますので、保育をハックしていくためのより強いチームを作っていけたらと思っています。一緒に保育をハックしていくためにチームに加わっていただける方もまだ募集していますので、興味のある方はぜひご連絡ください。

unifa-e.com

今年の Advent Calendar の記事としてはこれが最終回となりますが、今後もいろんなところで露出していけるように頑張りたいと思います。また、一年後に2020年を振り返った時に、あの決定は正しかったと言える決定を一つでも増やせるように取り組んでいきたいと思いますので、このブログを始め、引き続きユニファをよろしくお願いします。それでは、良いお年を。

f:id:akanuma-hiroaki:20191223222353j:plain