ドミノソフト公式ブログ

合同会社ドミノソフトの公式ブログです。

設計と命名と抽象化と

はじめにのまえに

赤いりんごとりんごを見ていろいろ連想をしているひと。かしこそう。
りんごを見る人

「この絵ってなんの絵か知ってる?」

「何でこの人ひとりでマジカルバナナしてるんですか?」

「ちゃうねん」

はじめに

こんにちは。shimmer-youthです。良い設計をすることは良い命名をすること、良い命名をするには抽象化が必要だよ、って話をしようとしてたんです。

抽象化って何だ

「抽象化」という言葉は「具体化」の対義語であることから、つい「あいまいにする」という意味にとらえられがちですが、本来は「本質を抽出する」ことです。

本質を抽出するためには、さまざまな事象を多角的な視点で見たり、共通化したり分割したりする必要があります。

そのときに冒頭の絵のひとのように、ひとつの事象に対してもいろいろ発想を巡らせなくてはなりません。実例を交えて考えてみます。

ボタンに名前をつけよう

ダイアログにボタンがふたつ表示されている。どちらも「Button」というキャプションで区別ができない。
ボタンふたつダイアログ

「ここにダイアログと2つのボタンがある。あえて本質的な情報が抜けた状態。この状態だとどんな命名になってしまうか試してみよう。このボタンにどんな名前を付ける?」

「Button1, Button2とかLeftButton, RightButtonとかですかね」

「抽象化できてない状態だから、まあそういう名前しか付けられないね」

ダイアログに赤色と青色のボタンがひとつずつ表示されている。キャプションはどちらも書かれていない。
青赤ボタンダイアログ

「情報を少し増やそう。こんな感じに色がついていたらどうする?」

「RedButton, BlueButtonとか。もしかしたらOkButton, CancelButtonかも」

「いい感じ。でも、どっちがOKでどっちがキャンセル?」

「普通に赤がキャンセルで青がOKじゃあ?」

ダイアログに青色で「×」と書かれたボタンと、赤色で「○」と書かれたボタンが表示されている。
○×ボタンダイアログ

「さらに情報を増やすとこう」

「ああ、これなら赤の〇がOKで青の×がキャンセルですね。OKは赤じゃなくて緑にしましょうよ。それなら勘違いしないです」

「もし左側のボタンにRedButtonという命名をしていたら、こういう変更をするときに命名と実態の乖離が起きるんだよね」

「いやまさか。こういう情報があればRedButtonなんて命名しませんって」

「実際よく見るんだよ……」

まだまだ別解はある

また次のように、ダイアログの内容によってもボタンの適切な名前が変わったりもします。

ダイアログ 〇ボタン ×ボタン
処理を続けますか? OK Cancel
このサイトの評価を教えてください Good Bad
性格診断、あなたは〇〇だと思う? Yes No
得点操作ダイアログ Plus Minus

まとめ

目の前の情報だけにとらわれず冒頭のリンゴを見てひとりマジカルバナナをするひとのように、多角的な思考が大事だって話をしたかったんです。

赤いリンゴとリンゴを見て「ばなな」と言っているひと。あまりかしこくなさそう。
ばなな

このあたりの本質を抽出して命名するのは、ミノ駆動さんの商品クラスがすごくいい例だなとも思いました。 qiita.com

転職フェア初出展!(マイナビ転職フェア@新宿 7/27)

はじめに

はじめまして~。開発やりながら採用もやってる @maqdom です。ちなみに、ただいま from パサール幕張

先日、ドミノソフト初の転職フェア出展を経験しました。7/27 マイナビ転職フェア@新宿です。 そのすったもんだをお伝えします。

社内はこんな感じで動いてるんだな~と感じてもらうと同時に、出展の参考にもなれば。

なんで転職フェアに?🤔

マイナビ転職では、経験者メインターゲットで募集中(掲載期間は9/8まで)。 tenshoku.mynavi.jp

しかし、世はSE経験者採用戦国時代⚔️ 新着期間🆕にチラホラご応募いただいた後は閑古鳥なのです。

状況から察するに、

  • 「東京&IT&常駐なし」とざっくり検索、上から順に力尽きるまで見てくという流れで、検索結果上位に出る新着期間だけ、ドミノソフトのページに到達

というストーリーかと。

そりゃ~そうですよね、今は知名度0のドミノソフト、残念ながらピンポイント検索されることはないです。 う~ん、特色あって面白い会社だと思うんですけどね~。とにかく見てもらえなければ何も始まらない。

ならば💡 転職フェアで、ターゲット層の方と直接お話しして、魅力を知ってもらおう!

なにしろ「フェア」って言葉がいいじゃない。フェスでもカンファレンスでもなく、フェア。なんか、あったかくていい香りがしそう!

さあ課金はOK、レッツゴー マイナビ転職フェア!

さっそく?準備!📝

といっても、まず準備。出展決定はフェア1か月半前、準備余裕だね~・・・。 光陰矢の如しとはよく言ったもので。ハッ!と気づいたらフェア2週間前😱

アピールするべきコアは?🎯

いか~ん!とキックオフ。自分たちの特徴を改めて抽出、過去フェアの様子や他出展企業を調査し、どう差別化するかを検討。

ドミノソフトの特徴として、

  • フルスタック、フル工程開発したい
  • 新しい技術をどんどん使いたい

だって、その方が楽しいんだもん! でも、それって難しいじゃない。だから、

  • 常駐なし、自社内チーム開発で教え合う、サポートし合う、だから成長できる💪
  • 「やってみよう、コケてやろう」で、失敗ウェルカム🦆チャレンジゴーゴー🕺

あたりを基本に、他社とは一味違うところを打ち出すことに。

その上で作成するモノを決めて、準備開始。デザインはすべて自分たちで作るものの、印刷などは外注。スケジュールはギリギリ。ここからはガムシャラです。

作ったモノ・かかったお金ぜんぶお教えします!💰️

ってことで、作ったモノやかかったお金を一覧にしてみるとこんな感じ。

もの どこで? お値段? フェア何日前完成?
Tシャツ オリジナルTシャツを1枚からWebやアプリで格安プリント作成 | UP-T【最短即日】 14,000(@2,800x5) 3日前
テーブルクロス のぼり・旗の印刷が1枚440円〜【全国対応 のぼりキング】 17,617(クロス)
990(クロス止め)
2日前
壁装飾:A0ポスター2枚 印刷のことなら格安・激安の印刷通販【ラクスル】 8,942(@4,471x2) 3日前
壁装飾:待遇などのアイコン 自社 前日
パンフレット アクセア - ポスター印刷、製本、ラミネート、アクリル板、パネル加工 8,276(@51.2x130部+もろもろ) 2日前
パンフレット:差し込み資料 自社 前日
合計 49,825

ま、間に合った! 実質1週間半でモノの準備完成。いや~CEOの素早さは尋常じゃなかった。

どんなモノつくったの?👀

続いて、ひとつずつ簡単にご紹介。

モノ なに?
Tシャツ
dominosoftTシャツ。当日スタッフ着用。フランクで気軽な会社であることを示すアイテム。ただ欲しかっただけでもある。
かっこええやん!と思ったが、かっこよかったのだろうか🤔?
テーブルクロス
dominosoftテーブルクロス。生のテーブルのままだとモグリ感があるな~と思ったので、作成。イスカバーは無くても違和感ないので作成せず。
なお、英国貴族のテーブルを再現し、優雅なイングリッシュティータイム面談案もあったが、飲食提供不可ルールに阻まれ断念。
壁装飾:ポスター

1枚は、会社の価値観「やってみよう、コケてやろう」を表す、冬山登山写真背景のもの。写真はAI作成。
「そこでコケたらやばいじゃん」と、誰もが言う😆
もう1枚は、開発してるIoTサービスを、使っている技術要素の多彩さ・新しさ、という切り口で表現したオシャレ図。
なんだあれは?と足止めきっかけアイテム。
壁装飾:待遇などのアイコン
「常駐なし」など特色アイコン。マイナビ供給のものがあるんだけど、類似品を自分達で作成。
常駐なし、PC約30万円、Copilotあげる、あたりが当日注目を集めた。
パンフレット

やってみよう、コケてやろうをメインキーワードに、特色・マインド・雰囲気を伝えるイメージ広告。
インタビュー、写真撮影、デザイン、文章作成だけでも瀕死状態でしたが、印刷がまあうまくいかないこと。半透明オブジェクトは鬼門👹意図した色にならない😱3回目の印刷で完成。
優しく教えてくれたACCEA西新宿店のお姉さん、ありがとうございました!
ただ、130部作成して、はけたのは44部・・・。
パンフレット差し込み資料

統計情報や、特色、プロジェクト紹介など。
今回の資料中で、唯一、具体的情報を持つ資料。プロジェクト紹介を図入りでもっとわかりやすく書いてあげたかった。
その他物品 電源タップ、飲み物、のど飴。必須です。

こちらが完成図。

テーブルの二人、信じられないだろ、空気イスなんだぜ。 「やってみようコケてやろう」のポスターを持っているのがCEO。

ええやん、ええやん!

展示用にフロントエンドかっこいい化😎

実際に開発している介護施設用見守りIoTサービスの、エッジ(センサー)とフロントエンド(iPad)を展示して、フルスタック開発を想像しやすくすることにしました。

実はフロントエンドのUIは、フェア限定プレミアUIでした。製品版は、介護施設向けにマイルドなデザインとなってます。フェアでは、シュッと引き締まったUIを展示したいね~ということで開発担当が作っちゃいました。

スタッフ割り当て👬👭

当日スタッフとしては、面談担当でCEOと私が出ずっぱり、呼び込み担当は若手社員3名がローテーション。総勢5名、みんなで当日の流れをシミュレーションしてすり合わせました。

呼び込み担当は、来場見込みの方と近い年代で話しやすいメンバーを集め、来場者の方が気軽にドミノソフトを覗けるよう助けることがミッション。

面談担当は、ドミノソフトの魅力をアピールするだけでなく、転職経験者として、SEの先輩として、来場者のお役に立てるといいな、と話し合って準備しました。

準備万端🔥

万全! 準備だけで工数80h弱使ってしまったけど😂、万全のはず!

フェア当日🎪

開場1時間前から準備🔧

11時オープンに向けて、10時から現地で準備開始。

奇しくもこの日はパリオリンピック始まりの日。開会式を見てたCEOが少々遅れて来ましたが、それも見込み通り。 写真に写ってないのですが、呼び込み担当も一緒に、着実に準備を進めます。

  • Before

  • After。写真右がCEO。

ちなみにテーブルの後ろ、めちゃ狭いです。

パンフレット置き場もデコってます。こちらも撮り忘れ。 初めてで少々手間取りましたが、4人で、1時間以内に準備完了。

さあ、11時開場です!

初めてのお客様💖

来た来た~! オープン時の入場は20名ぐらいでしょうか。ドキドキ緊張状態で見てたら、みなさん眼の前をサーッと通り過ぎ、まずはパンフ置き場へ。なるほど~。

うちのブース前には柱があって、来場者の方がちょっと滞留する場所になってました。そこにいた女性二人組、呼び込み部隊の声がけに応えていただけまして、ドミノソフト初出展の初着席!

IT関連企業だけど、開発ではない職種ということで、開発はどんな感じなんだろう?と情報収集されていらっしゃいました。そういう行動力、ほんと素晴らしいですよね。友人と一緒に回るというのも、目からウロコ。エナジーと視点を補い合うことができて、よい方法だな~と思いました。 フランクにお話しいただけたおかげで、私たちの緊張も解けて、とってもありがたかったです!

怒涛の28名様ご着席🙏✨️

11:30頃でしょうか、一瞬客足が途絶えたのですが、その後は15時までほぼノンストップ、怒涛の面談タイムでした。 びっくりしました、ふと気づいたら15時で。さっきまで11時だったのに!

それだけ濃密な時間を過ごせたのだと思います。色々な方とお話できて、とても楽しかったです。狙い通り、ターゲット層である経験者の方々ともお話できました。 ありがたいことに行列も発生して、お待たせした方々には申し訳ありませんでした。

ご着席いただいた方も、有意義な時間を過ごせたのであれば嬉しいです。

最終的に、28名の方と面談させていただきました。2席ブース企業の中ではトップクラスの人数かと思われます。改めて、ご着席いただいた方々、誠にありがとうございました! ぜひ、面接・カジュアル面談のご連絡お待ちしております!

また、呼び込みスタッフの尽力も素晴らしかったです。ありがとう! 面談に手一杯で、みんなの勇姿を撮影できなかったのが悔やまれる~。

祭りの終わり🎉

16時終了で、後片付けに30分ぐらい。 面談担当は全力でお話させていただいたので、終了時にはガチで疲労困憊。 こんな目が死んでるCEO見たことない😆 この後、上の階のイタリアレストランで乾杯&振り返りして疲れを癒やしたのでした。

来場者の方に感じたこと🧗🌟

私個人的には、来場されたみなさんの考え方と行動力に感動すら覚えました。

  • 今の会社での不満、疑問点は、他の会社だとどうなの?
  • 今は人事総務だけど、本当に自分に向いているの? 他の企業・職種はどんな感じなのか覗いてみたい。
  • 今の会社での開発技術は、本当によいもの? 他はどんな技術を使っているのか聞いて比較してみたい。
  • 今やっている専門領域は、世の中的に価値があるの? もっと価値ある開発者になるためには何が必要か、いろんな領域を見て考えたい。

単に「転職先を探す」ではなく、他企業の話を聞くことで自分の状況を相対化し、転職を検討するという考え方。それを実現する行動力。

ほんと素晴らしいです。ぜひ、みなさん、幸せな人生につながる転職を実現してほしいと思いました。

あらためて、ドミノソフトってなんじゃらほい?

転職フェアでの準備や当日の面談を通して、改めてドミノソフトってなんだろう?と考えることができました。

やっぱり、受託開発メインの会社の中でも特色あって面白いと思いましたので、最後にまとめておきたいと思います。

ドミノソフトの特色とは?

  • CEOが遊びたがり。ベースは「楽しいことやりたい!」。
  • 「やってみよう、コケてやろう」で、新技術バリバリ挑戦、失敗ウェルカム。
  • なので、介護用見守りIoTサービスみたいなシステム全体を、フルスタックでまるっと開発。

  • それに、開発工程もまるっと一括受注。プライム案件のみ。

  • これらを成すために、常駐なし&外注なし。気心知れた社内メンバーでチーム開発で、教え合う、支え合う、成長できる。

  • 結果、上場医療機器メーカー様と25年以上一緒に製品開発。
  • 本来の目標は、自社製品開発。
  • 開発者PC約30万円、Copilotなんかも提供。開発体験向上第一。
  • 社員の声でフィットネス手当誕生。ボトムアップ&やわらかさ。

こんなドミノソフトに興味がある方、マイナビからでも、recuruit@dominosoft.co.jp にでも、ぜひご応募ください。 (メールへ応募の場合は、経歴書添付お願いします🙇‍♂️) カジュアル面談にも対応いたします。お気軽にご連絡ください。

みなさんの人生と、ドミノソフトの人生、お互いに求め合うものが一致するならば、ぜひ一緒に人生を歩みましょう!

買って良かったもの紹介(2024年8月)

はじめに

はじめまして。ドミノソフトのnct-dsです。 技術的なことは他の人にお任せして、わたくしは業務と関係のない俗っぽいことを書いていきます。

今回は最近買ってよかったものを3つほどご紹介いたします。

[ブリタ] カラフェ型浄水器

我が家の水道水はまずいのです。 東京の水道水はまずくないという話は聞くのですが、我が家は建物が古く水道管が錆びており(憶測)酷い味がします。 そこでポット型の浄水器を購入しました。

ブリタ カラフェ型浄水器 | BRITA®

カートリッジ式とディスク式があり、どちらにするか悩みましたがディスク式(安い)のカラフェにしてみました。 こちらを使用することで水道水の錆味が無くなり、無味の水を飲むことができています。とてもお勧めです。オサレですし。 ただ、高さが結構あるのと注ぎ口をミスると盛大にこぼれる点には注意が必要です。

[サントリー] 天然水 FRUIT-SPARK グレフル&レモン

わたくしは炭酸飲料が好きです。爽快ですし、夏にはぴったりですよね。 でもやっぱり炭酸ジュースって糖分が気になるじゃないですか。 ゼロシュガーなら・・・とは思いますが、そういうのは体に悪いとも聞きますし。(ソースはありません) そこでこちらを愛飲しております。

フルスパ FRUIT-SPARK(フルーツスパーク)|サントリー天然水

炭酸の爽快感とグレープフルーツ&レモンのフレーバーがマッチして非常においしいです。 カロリーも糖質もなし。ゼロシュガーの炭酸ジュースではなく、炭酸水系なので体に悪い感じもありません。(ソースはありません)

さらに良いのは、時間が経ってぬるくなったり炭酸が抜けたりしても、さほど不味く感じないのです。 このスパークリング感で今年の猛暑を乗り切りましょう。

[キーン] DAYTONA II SANDAL

「ギア系」という単語をご存知でしょうか?アウトドアテイストなアイテムのことです。 わたくしはイイ歳ですので、近年流行のダボっとしたのとか、シュッとしたのとかには食指が動かなくなって参りました。

そんな近年、少し気になりだしたのが「ギア系」のアイテムというわけです。 こういうのってワイルドなタフガイで有能そうな雰囲気あるじゃないですか。まあ自分は引きこもり体質ですけど。 そんなわけでこちらを買いました。

メンズ サンダル | デイトナ ツー | KEEN公式オンラインストア

タフガイな見た目が最高です。履き心地も問題なくスニーカーとあまり変わらない感じでガシガシ歩けます。 ただ、サイズ選びは注意してください。私は革靴で24.5cmですがこちらは25.5cmでジャストでした。

なお、購入時はAmazon Primeの「Try Before You Buy」を利用して複数サイズを取り寄せ、サイズの合わない方を返送しました。 返送は入っていた着払い伝票を利用して、クロネコヤマトに自宅まで集荷に来てもらいました。楽ですねぇ。

以上、ご参考になれば幸いです。

パリオリンピック開幕!!!

はじめに

こんにちは、calico_gingerです😊

人生で初めてブログというものを書くのでこれでいいのかな~とちょっと緊張しています(笑)

記念すべきはじめての記事はパリオリンピックについて書いてみようと思います🏅

バスケットボール日本代表

オリンピック開幕から1週間ほどたちますが、わたしはバスケに大注目です👀!

普段から国内リーグの試合を観ながら晩酌するのがたまらなく幸せなわたしにとって、レベルの高い代表戦(しかもいろいろな国の!)が観られるこの期間は、毎日とっても幸せです🍶💕

何よりも今回はワールドカップでの激闘で格上国を撃破し、男子代表が48年ぶりの自力出場!!!

そして、世界最高峰のバスケットボールリーグNBAとの契約経験のある選手が多く選出されており、男子日本代表歴代最強メンバーと言われています。

もし今回のオリンピックで1勝を挙げれば、1976年のモントリオールオリンピックで不戦勝を挙げたぶり、試合を戦って勝利するのは、1972年のミュンヘンオリンピックでのセネガル戦ぶりという快挙です。

惜敗の男子フランス戦

そんな状況でのおとといの予選第2試合フランス戦、悔しかった~~~~~~~~😢😢😢

延長にもつれこみながらも結果的には歴史的勝利にあと1歩届かず…。

SNSでいろいろな意見が飛び交っていますが、わたしもプレイヤーとしても観戦者としても、そして審判としてもバスケットボールに関わっている身として、正直思うことはありました🤔

まあ勝負の世界、負けは負けだ!

でも格上相手なのに互角以上の試合をみせてもらえて、とても感動でした🤗

男子日本代表が目標として掲げている「史上初のベスト8進出」への条件は、次戦ブラジル戦に勝利しグループBで3位になること、また、得失点差で他グループの3位チームに勝利することが必要となるので、切り替えて次の試合も頑張ってほしいです💪🏻

オリンピック期間は生活リズムがずたずた

次戦は女子も男子も日本時間で18時開始なので、生活リズムに優しい時刻でほっとしています😮‍💨(笑)

気になる国の試合を全部観ようと思うと、24時開始や28時開始があったりして、現在生活リズムがずたずたです…💦

こんなときはお仕事を少しセーブして、オリンピック期間が終わったら感動を糧に3倍頑張ることにします。

そんなことができる職場で本当にありがたいことです🙏🏻QOL爆上がりです。

なのでどうか代表選手団のみなさま、わたしのお仕事へのやる気のために、素晴らしい試合をお願いします🎋(笑)

おわりに

と、こんな感じで、わたしは他の社員さんのように技術的なカッコいいことは書けないので(いつか書けるようになりたいけど)、ときどき好きなことやおいしかったものを書いていきたいと思います。

さあ今日は女子のドイツ戦の応援だ!!!

応援がんばるぞ~~🗾🍺!!!

日本がんばれ~~!!!

それでは~~🖐🏻

新人教育の課題につよつよエンジニアのUtilityプロジェクトを

はじめに

こんにちは。@shimmer-youth です。

VueやNuxt, Viteの開発チームのコアメンバーでVitest, Slidev, VueUseの製作者であるつよつよエンジニアのAnthony Fu氏のUtilityリポジトリ

これって実はすごく新人教育のTypeScriptの課題にもってこいなんじゃないかって話になりました。

背景

「即戦力になるエンジニアが欲しい!」という要望も言うだけならタダですが、実際に即戦力になるエンジニアなんてそこらへんに生えている訳もなく。ソフトウェア開発の未経験の人を採用して、社内で教育して育てていこうという方針になることもままあります。

ドミノソフトも創立から数年経ちましたが、採用するメンバーの経歴や能力も多種多様で、毎年新人教育には試行錯誤を繰り返しています。

TypeScriptの本を読んでもらったら、次は自分で考えて実装するという経験を積もう。でも、実際のプロジェクトに入ってもらっても丁度いい作業がない。課題が無いなら作ればいいじゃない、と思ってもそんな時間は忙しくてとれない。どうしたものか。

と、考えているところにAnthony Fu氏のUtilityリポジトリがいい課題になるのではという話題が上がりました。

Utilityリポジトリの内容

実際にリポジトリの内容を見てみましょう。

export function toArray<T>(array?: Nullable<Arrayable<T>>): Array<T> {
  array = array ?? []
  return Array.isArray(array) ? array : [array]
}

utils/src/array.ts at 325c0f13b34ab9605dc9c55f6166e3a229cb0f4c · antfu/utils · GitHub

numberを渡したらnumber[]に変換、もともと配列ならそのまま返す関数。引数が配列の関数に1個だけ渡したいときとかよく使いそう。

export function ensureSuffix(suffix: string, str: string) {
  if (!str.endsWith(suffix))
    return str + suffix
  return str
}

utils/src/string.ts at 325c0f13b34ab9605dc9c55f6166e3a229cb0f4c · antfu/utils · GitHub

接尾辞がついてるかついてないかわからない文字列に接尾辞がついているように保証する関数。フォルダのパスとかでよく使いそう。

なかなかお仕事でよく使いがちなユーティリティ関数がそろっています。これならそのままお仕事に活かせそう。この関数の実装部分を削除して、実装してもらうというだけで十分な課題になりそうです。

「じゃあ、この関数名と引数からどういう関数かイメージして、その内容をコードにしてみようか」

「……? わかりません。どんなコードを書けっていうんですか?」

しまった。これでは「僕が考えていることを当ててねゲーム」です。

かといってそれぞれの関数に細かい仕様を書こうものなら、結局時間がかかる。

どこかにいい感じにこれらの関数の仕様を記述しているものは無いんでしょうか……

テストコード

it('ensureSuffix', () => {
  expect(ensureSuffix('world', 'hello ')).toEqual('hello world')
  expect(ensureSuffix('123', 'abc123')).toEqual('abc123')
})

utils/src/string.test.ts at 325c0f13b34ab9605dc9c55f6166e3a229cb0f4c · antfu/utils · GitHub

あったわ。さすがつよつよエンジニアだわ。

これなら満たすべき動作の仕様も明示されているし、正しく動作しているか判定にもなるし、テストコードを書いてから実装を進めるのがテスト駆動開発っぽくていい感じです。

課題の内容

(1) 関数名と引数からどんな関数なのかを説明してもらう

既存のコードを読んでどんな実装なのかをイメージする練習。適切な関数名をつけることで読みやすいコードになることを意識してもらいます。

(2) テストケースをもとにテストが通るコードを実装してもらう

もし実装の仕方がわからなくても「とりあえずこのテストケース1つだけ通るように仮実装してみようか」といった感じで小さい歩幅で作業を進めさせることができそうです。

(3) 出来上がったらつよつよエンジニアの実装と比較する

自分で考えてそのあとにつよつよエンジニアのコードを見て比較する。こんな書き方あったのかあたりの感覚を体験してもらいたいです。

おわりに

とりあえず、まだこの施策は「やってみようかな」って思った段階なので、具体的に開発環境をどうやって用意するのかとかも全然考えられていないです。 実際にやってみて、開発環境の構築とか実際に教わった立場からの感想が聞いてから、次どうしようか考えてみたいと思います。

つよつよエンジニアの書いたコードを見られるなんていい時代だなあ。

Evidence based programming

エビデンス

最近、エビデンスという言葉をよく見る気がしているのですが、トレンド調べたら、2020年頃から増えてるようです。コロナのせい?

この言葉、元は医学でのEvidence based medicineがベースだと思うのですが、どうも世に流れてる「エビデンス」という言葉は、証拠といった意味合いで「エビデンスがある」「エビデンスがない」といった使われ方がしているケースが散見されます。

が、Evidence based medicineにおけるEvidenceは、レベルが明確に定められていて、たとえば、「専門家個人の意見」なんてのも、エビデンスレベル6なんですよね。なので、エビデンスについては「ある」「ない」ではなく、本来は「強い」「弱い」といった軸で使うのが正しい用法です。

Evidence based programming

で、ふと思ったのですが、これ、プログラム開発でも近いものがあるのではないでしょうか。

たとえば、とあるライブラリを利用したプログラムを利用する場合、当然ながらライブラリの挙動を考えて設計し、コードを書くわけですが、そこにエビデンスレベルが当てはまりそうです。ちょっと思いつくまま言語化してみると、下記の表になりました。

レベル 内容
1 数学的、物理的に絶対と言えるもの(三角形の内角の和は180、とか)
2 ライブラリ公式のドキュメント
3 書籍化されているドキュメント
4a StackOverflowやQiitaなど、信頼できそうなネット情報
4b 当該技術に精通していると思われる先輩などの意見
4c 個人ブログなど、信頼できるかどうか不明なネット情報
5 様々なネット情報をもとに自分で推測した情報

これらのレベルに、「動作確認を行った(A)」「動作確認はしていない(B)」の軸を加えます。

根拠のないコードは無い

これまで、様々な人の設計やコードのレビューをしてきましたが、疑問点があって担当者にインタビューしてみると、5Aとか4cAなどの情報が元だったりするんですよね。「コードをコピペで持ってきたら動いたのでOK」ってやつです。

レベル2(公式のドキュメント)を見ていない。そこにはエラーや例外となる条件が記載されているが、そこを読んでいない(公式ドキュメントが英語のみだと増えがち)。結果、エラーや例外は自分の想像で仕様を埋めるので、2Aのエビデンスレベルで作れるはずが、5Aベースになっている。当然、エビデンスレベルの低いコードは、バグっている可能性が高い。

レビューで多く指摘を受けてる人と、そうでない人とは何が違っているのか、ってのが、長年言語化したいものだったのですが、このエビデンスレベルの考え方で言えば、前者(指摘を多く受ける人)はエビデンスを「有り」「無し」で考える人、後者はエビデンスを「強い」「弱い」で考えてる人、と表現できそうです。

4cの情報を発見し、動かしたら動作したので4cAとなる。前者はこれで「エビデンス有り」として完了となるが、後者は4cAではまだ「エビデンスが弱い」と考え、より上位のエビデンスを探す。この差があるんじゃないかなー。

JIRA×Toggl×人事労務freeeで作業時間の見える化

Jiraによる時間管理

f:id:uen0yama:20210606180832p:plain

弊社では勤怠管理として人事労務freee、タスク管理としてJiraのServer版*1を導入しています。
さらにJiraのアドオンとして、Timesheet Reports and Gadgetsを使用しています。

これらを以下のルールで運用しています。

  • すべての勤務時間は、必ず何らかのJiraチケットと紐付ける。(ちょっとした雑談の時間なども、専用のチケットを用意してそこに時間を付ける)
  • Jiraに入力した時間の合計が、勤務時間と必ず一致させる。

Jiraにすべての作業時間を入力することで、人事評価の参照資料にしたり、AIによる作業時間予測の学習データに使っています。
しかしながら、これには課題が2点ありました。

  • 細かく作業時間を記録してないよ!
  • Jiraの合計時間が勤務時間と合ってないよ!

細かく作業時間を記録してないよ!

誰かのレビューしたり、作業相談にのったり、お客様の問い合わせに対応したり、という風に、毎日突発的な割り込みが起こりますが、それらの時間をすべて異なるJiraのチケットへ記録するのは、ツールでもなければ実現できません。
そこでToggl trackを使います。
これに、Chrome用の拡張機能を組み合わせます。
そうすると、ChromeでJiraのチケットを表示した際に、時間計測ボタンが出てきます。

拡張機能の適用前

拡張機能の適用後

弊社の作業の流れだと、作業開始時にJiraチケットを確認することが多いため、ここでStart Timerを押すことで、Togglにチケット別の時間が記録されていきます。
あとは、Chrome拡張のToggl to JIRA(FREE)*2を使用することで、Togglに入力した時間が、Jiraに同期されます。 Togglの時間は秒単位で集計、Jiraの方は分単位で集計のため、多少の誤差が出ますが、そこはTimesheet Reports and Gadgetsの画面で勤務時間と比較し、手動で調整します。

Timesheet Reports and Gadgetsの画面

Jiraの合計時間が勤務時間と合ってないよ!

ここまでで、作業ごとの時間入力ができるようになりました。
が、Jiraの合計時間が勤務時間と合っていないことがある、の課題が残っています。
弊社では、勤怠入力は人事労務freeeを利用しているため、当初は、freeeの勤怠画面を見て、それをJiraの合計時間と一致しているか、目視確認としていました。

f:id:uen0yama:20210606163346p:plain
Jiraの勤怠画面

上記画面だと、7時間51分という時間が表示されていますが、この時間は休憩時間が入っていないため、各自が休憩時間を脳内で減算処理する必要があります(画面例だと6時間51分となる)。
休憩が1時間だとシンプルで良いのですが、弊社はスーパーフレックス×自由休憩制度なので、休憩時間が1時間36分など、中途半端なこともしょっちゅうあります(勤務途中に水泳に行ったり) 。 これはアカン。
こんなのを『各自で注意する』運用にしてたら、ミスはいつまでもなくなりませんし、じゃあ『ちゃんとミスがないか目視ダブルチェック』とか言い出すと、イケてない組織へまっしぐらです。

救世主freee API!

見つけたのがfreee APIです! この中の人事労務freee APIを使えば、プログラムで勤務時間を取得することができます。
そこでTampermonkey用のユーザースクリプトを作成し、Timesheet Reports and Gadgetsの表を書き換えるようにしました。

初回アクセス時には、認証情報を求める状態になります。

f:id:uen0yama:20210606165434p:plain

認可情報を取得をクリックすると、別ウィンドウが開きます。

f:id:uen0yama:20210606165544p:plain

ここで許可するを押すと、ユーザースクリプトがアクセストークンを勝手に記憶します。

f:id:uen0yama:20210606170037p:plain

結果、Timesheet Reports and Gadgetsの表がこうなりました。

変更後の画面

入力時間があっているかどうか、一目瞭然!
❌のついた日の時間を修正して、画面をリロードするだけです。
(自転車のアイコンは、自転車通勤した日を意味しており、本記事とは関係ありません)

さいごに

Timesheet Reports and Gadgetsは若干マイナーなアドインだと思いますが、超ピンポイントに合致する人に役立てばいいなと思い、記事にしました。 リモートワークが増えた昨今、『Jiraにすべての勤務時間を入力する』というのは、需要が増えていくのかな、と思っています。 スクリプトはGitHubに公開してますので、興味のある方はコード改造して使ってみてください!

github.com

*1:JiraのServer版は、新規の販売を終了してます。

*2:2021/06/06現在、Chromeウェブストアから削除されており、代替ツールを調査中です。