デンキヤギの採用の考え方 2018-08-11版

このイベントに弊社も出てきた。いい機会なので、会社説明時に説明しているようなことを書いておく。

nagoya-career.connpass.com

発表資料

他社がキレイなスライドで発表している中、弊社は私がTwitterをしながら3時間ぐらいで新規で書き起こしたスライドを持っていった。

www.slideshare.net

発表資料の補足

フリータイム中に質問されたことを思い出しながら、補足していく。

想定する会社規模、求人自体の考え方

求人イベントに出ておいて言うのは何だが、現状は何が何でも人を採用したいという状況ではない。当然、社内ニーズや社風にマッチする人間が、会社の状況を理解したうえで入社してくれるというのであれば採用したいし、社員が10人ぐらいまでは増えてもいいかなという感じでも考えている。

受託開発が売上100%の状況のため、人員不足で案件受注を見送ってきた面もあるし、人員が増えればその分の営業・管理が大変になる面もあるので、人が増えれば単純に良いという考え方は持っていない。10人というのは、2-3チームぐらいが構成できる人数感で、もしこれ以上スケールさせるには管理職を増やさないといけないが、現状は社内に自分以外の適任が居ない。

とはいえ、自社開発が軌道に乗ったらと言うことが変わると思う。

キラキラを求める人はマッチしない

社員旅行やBBQなどの社内の一体感!みたいなイベントをする気は一切ない。社内行事としての飲み会は、人が増えたときの歓迎会をやる程度で、会社が全額費用を負担する。

技術者採用

現状の社内人員は技術好きな人で偏ってしまっている傾向があり、顧客と折衝できるタイプの人が限られてしまっている。理想を言えば、一人親方もしくは2-3人程度のチームで顧客と調整を行いながら技術もやる現場リーダー経験者、もしくはそれができそうな人が採用したい。

ただ、ある程度技術を抑えているうえで調整事ができる人間なんて存在自体が希少なことも理解しているので、最低限としてはチーム開発に興味がある、技術が好き、本意ではない技術選択をせざるを得ない状況でも仕事として淡々とこなせる人を求める事になる。いくら「この技術がやりたい!」と思っていようが、(ある程度は配慮はするが)その仕事が割り当たるとは限らないし、プロジェクト全体の最適解で技術選択を行ってそれに従ってもらうことになる。ここが割り切れない人は向いていないので他社をあたった方が良い。

また、会社サイトの取引実績にも書いてある取り、今回の求人イベントに出ていた来栖川電算さんなどと取引をしている。弊社に入って、いきなり来栖川電算さんの仕事をするというケースも普通に考えられる。もちろん、違う仕事も色々あるのだが、この辺りに違和感を感じてしまう人も、素直に他社をあたった方が良い。

総務採用

代表取締役の私が色々雑務をやりすぎなので、それをお任せするために雇いたい意思がある。電話応対、来客対応(宅配物受け取りと飛び込み営業への塩対応がほとんど)、売掛/買掛の管理、物理媒体を納品しなければならない場合の出荷作業、郵便物チェック、書類の郵送、社内の備品管理、福利厚生設備の導入計画(例えばコーヒーサーバーとか、どれを買ってどこに置くのとか)、日程調整、スポンサーイベントの運営準備、社内清掃(ルンバのメンテやゴミ出し程度)など、定型・非定型業務に関わらず多岐に渡る。

ただ、現状はフルタイムにするほどの仕事量がないのも事実なので、短時間正社員か、何か他の業務と兼務してくれると助かる。総務 兼 技術支援みたいな人が一番都合がよい。

給与水準

給与は、ベース給与+業績連動賞与という構成になっている。

今期の計画では、役職なしフルタイムプログラマー職の場合、ベース給与が各種手当込みの額面で年350-450万円ぐらい、業績連動賞与が年100万円以上ぐらいで設定している。ベース給与は確定で支給するが、業績連動賞与は業績が極端に悪い時は0円もありうるし、業績が計画よりも良ければ増えることになる。

給与としては低い訳でもないが、特段高い訳でもない。あくまでも目安額なので、採用条件によってはこれ以上出すこともあるだろうし、その逆もある。

人事評価制度の設計は非常に難しいのだが、デンキヤギの売上が受託に完全依存している関係上、各個人の受託単価(に各種事情の補正をかけた推定の市場価値)を基準に給与額を設定している。これが絶対的に正しいとは思っていないのだが、現状はこれがシンプルだろうという判断をしている。

短時間正社員

短時間正社員の勤務時間は、特に週何時間と決まっている訳ではなく、採用都度の相談となる。

ストックオプション

今のところ発行予定がない。受託が売上100%の状況でストックオプションとか訳がわからないので、給与(というか賞与)で還元する方針になっている。

将来的に自社サービスが流れに乗って、VCから資本調達して出口戦略がどうとかを考える状況が来た場合は、その時に改めて考える。

受託案件

いわゆるSI業界における多重下請け構造の案件は原則請けていない。基本的には、エンドユーザーと直接取引するプライム案件と、プライムベンダーと直接契約する技術支援系の案件が大半になっている。ただ、過去に全く無かったかというと、残念ながらそういうこともなく、どうしても営業タイミングが合わず繋ぎで請けたケースも僅かにある。

案件では、技術検証・プロトタイピング・新規事業立ち上げみたいなことに関わることが多い。これはデンキヤギの営業スタイルによるところが大きいと思われる。

代表取締役の私が、おもしろそうな会社に"遊び"に行って、ついでに「仕事がない?」かと聞いてくると、3社だか5社だかに1社ぐらいの割合で実際に仕事を出してくれる。ただ、仕事を出してくれる側も、取引実績もない会社にいきなり事業コアを任せるようなことはしてこない。いつかやろうと思っていたものや、技術検証してほしいみたいなものを、技量を測るにお試しで投げてくる事が多い。幸いなことに「思いの外いいやつが出てきた」と評価されることが多く、「じゃあこれを使って新規事業をやってみようか」というような流れで食わせてもらっている。

また、私が10年以上勉強会に出入りし続けている関係から、他社の技術キーマンの人と仲が良かったりするので、ありがたいことにバイネームで呼ばれることもある。また、他社では人手が足りずに請けきれなかった案件を丸々紹介してもらうこともある。

会社の規模が小さいので、成り立っている営業スタイルかもしれない。

自社開発

スライド動画配信をコア技術にしたサービスを開発している。スライドに音声とページ送りを記録して、動画として配信させることを、Webブラウザ単体で行うことができ、安価に使う事ができる。厳密には異なるのだが「音声付きで自動再生されるSlideShareみたいなやつ」といえばイメージできる人もいるかと思う。

元々は勉強会を簡単にネット配信するために作った技術である。カメラを買って、セッティングして、撮影して、ライブ配信して、後から編集してアップロードして、みたいなことを個人でやるのコストが高すぎてできねーだろという考え方から来ている。最近でこそYouTubeなどで高画質ライブ配信ができるようにはなったが、UStreamというものが現役だったころは折角ライブ配信しても「画質が悪すぎてスライドが読めねーぞクソ」という反応が多く、これでは配信側のモチベーションが続くわけがない状況だった。TV会議システムベースで簡単にWebinarができるというシステムも存在はするのだが、同時配信100人とかで考えると、とても個人が手を出せる価格帯ではない。

技術を作ったのはいいが、勉強会相手だけでは市場規模が小さすぎてビジネスとしては難しいだろうという判断があり、販売先を色々探してきた。だが、「動画はコストが高い」から「使ったことがない」ので「使う場面が想像できない」ため、要は文化がないという事がわかってきた。

なので、ここ最近腹を括ったこととしては、文化を創りにいく方針で進めることにした。正直、VCやらからは「実際に売ってから持ってこい」と全く見向きもされてないのだが、幸いなことに受託でそれなりに企業体力がついてきたことと、役員定額働きたい放題に毛が生えた程度で開発はできそうなので、その範囲でやっていく。

ここが許容できない人は他社をあたった方がよい。

技術

広義のWeb開発:Webフロントエンドからバックエンドまで

Haxe/JS, Scala(Scala.js), Javaを使ったWebシステム開発やWebフロントエンド開発が実績の大半を占める。複雑度の高いUI・ハイパフォーマンスが求められる開発対象でも、構造を破綻させずに作り切れる会社自体がなかなかないので、このあたりは技術的な強みとして言ってもよいかと思う。

昨今のニーズでビジュアライゼーション関係の開発にも関わることがある。サーバーサイドの設計構築を含め、大規模データセットでも破綻しないようにすることは得意としているが、社内にデザイナーが居ないため視覚的なところは強くない。ここは強化できるなら強化したいポイントではある。

サーバーサイドのランタイムはJVMやNode.jsを使う開発が多い。サーバーレス環境の開発が増えてきているので、Node.jsの比率が高まってきている。AWSとAzureは普通に使っているが、GCPは今のところ実績はない。

その他、AkkaやRabbitMQなどを使った分散システムの開発実績がある。Kafkaはタイミングが合わずに今のところ実績はない。ZooKeeperのような分散協調システムや、Cassandra, AWS DynamoDB, Azure Cosmos DB, Elasticsearchあたりの開発実績・知見もある。ErlangはちょっとだけRabbitMQやVerneMQのプラグインを書いた程度。

モバイルアプリ

モバイルアプリ開発は何故か今まで案件がマッチングしてこなかったため、会社としての開発実績がない。開発経験がある技術者も在籍しているので対応は可能だが、会社としてもあまり優先はしていないので、最新情報がキャッチアップできているわけではない。

.NET系技術

MS/.NET系の技術は私個人としては大好きなのだが、まともな案件が流れてくることが少なく、あまり実績がない。

機械学習

機械学習は積極的には手を出していない。機械学習のプロジェクトでWebフロントエンド開発を担当することはまぁまぁある。

開発言語

特に強いこだわりがある訳ではなく、技術選定では適切なものがあればそれを選択する。

プログラミング言語については、静的型付き言語が選択できる状況であれば、必ず選択するという考え方をしている。また、余程の理由がない限り、静的型付き言語が使えないプロジェクトは避ける方針で考えている。今のところ社内における第一公用語Scalaで、Haxeは全員がガリガリ書けるという訳ではない。

名古屋の小さめな企業で集まって求人イベントを開催しました

こういうイベントを開催しました。

nagoya-career.connpass.com

開催までの経緯

適当なことを言ってたら、意外と趣旨に賛同する会社が集まってきたので、一時のノリで開催が決まりました。

もう少し真面目に書くと、

  • 各社、人員を増やしたいが募集してもなかなか集まらずに困っている
  • 大きい会社はカネをかけて求人イベントをバンバンやってるが、そんなカネもないし知名度もない
  • だったら小さい会社で集まってイベントをやれば、イベントのコストも分散するし、小さな会社でも興味のある人を集められそう

という算段は何となくあって、実際にやってみようということになりました。

イベント初回ということで正直どれだけ人が集まるかはわかっていなかったんですが、過去にNGKというイベントを開催してきた経験と使える集客媒体から、「おそらく20-30人ぐらい、うまく集客できると40-50人ぐらいになるかも」という仮説を提示して、「動員目標30人、20人来たら成功」という設定で開催準備を進めました。

正直、私は最初の声がけぐらいしかやってなくて、会場を提供してくださった Misocaさん とケータリングの手配を行ってくださった PREVENTさん が特に大変だったのではないかと思います。

また、どうなるんかよくわからないイベントに参加して頂いた以下の各社もありがとうございました。

開催結果

結果的に大して告知をしてないにも拘わらず、結果的に動員目標の30人を超えて、35人に定員を増員+キャンセル待ちが発生するという、思っていた以上の集客がありました。申込・参加いただいた方ありがとうございました。

これだけ人が集まることがわかれば、今後も半年~1年の周期ぐらいで定期的に開催していくこともできそうです。もし次にやるとしたら、来年3月とかのインターンや新卒求人の募集時期になるんでしょうかね。

また、やはり複数の会社が集まると、事業内容が違うのは当然として、企業文化、資金調達の意思・状況、出口戦略、利用技術など、それぞれに特徴があり、参加者側にもなかなかメリットがあるイベントにできたのではないかと思います。

人月単価で80万円ぐらいの仕事

Twitterでこういうことを書いたら、そこそこ反応があった。

意図通りには伝わらないだろうなぁと思いつつ、所詮Twitterだしなーと思いぶん投げたんだけど、想定してた範疇の誤解が広まってきたので、一応補足する。

「人月単価で80万円ぐらいの仕事」の難易度

ちゃんと書いてないから伝わらなくて当然といえば当然なんだけど、行間をちゃんと補うと、

  • エンドユーザー直案件
  • 技術難易度的には、いわゆるマスタメンテナンス機能に毛の生えた程度のもの
    • 一覧/詳細/編集みたいな3画面の構成で、あまり複雑なSQLを発行しないようなやつ
    • これにCSVのインポートエクスポート機能がついたり、簡易的な承認フローがつくようなやつ
  • 実装技術とは別で、現状の業務分析であったり、システム化後の運用フローがどうなるかを考えたり、開発完了後の導入やユーザー教育(操作方法レクチャー)を行うことが必要

割と具体的な例を出すと、経費精算みたいな社内業務。

  • 現行はExcel方眼紙フォーマットに入力して、印刷して提出
  • 上長がハンコを押したら経理に回る
  • 次の給与の際に清算される
    • 申請当人への給与の支給
    • 会計システムに仕分けデータを入力

こんな感じの業務を、業務フローを見直しつつ、システム化していくみたいな話。この要件を80万円で1か月で作るという話ではないし、ヒアリングしたら印刷が必要だとか会計システムとはAPI連携が必要だとか、ミッションクリティカルなシステムだとか、セキュリティの事をちゃんと考えないとダメだとか、技術難易度が上がる要素があれば当然その部分は単価を80万円から割り増しする。

上記の業務例を、単価レンジ80万円で対応できる内容に落とすと、

  • ユーザーロールは一般ユーザーと承認者の2つ
  • 一般ユーザーはWebフォームに申請内容を入力し、入力ができたら申請ボタンを押す
  • 承認者は一覧画面で未承認のデータが検索でき、個別に内容を確認して承認ボタンを押す
  • 一覧画面で年月を指定して承認済みデータが検索でき、該当データの一覧がCSVファイルとして出力できる
    • あわよくば会計・給与システムと連携できるCSVフォーマットになっているとよい
  • インターネット非公開(社内からしかアクセスできない)サーバーに配置して、サーバーにアクセスできる人ならデータ自体は誰でも見えてOK
    • サーバー構築は不要(今時だと何らかのSaaS上に構築するみたいのが多いと思う)
  • 対応ブラウザはPC版Chromeのみ

という程度のシステム化具合。業務要件のヒアリング・設計・開発・システムテスト・ユーザーテスト兼ユーザー教育・導入初期の運用・不具合サポートみたいなところをもろもろやると、2-3人月かかるよねぇ、単価と期間を掛け算して最終的な請求額は200万円ぐらいかなぁ、という感じ。実装部分だけ抜き出すと1か月分相当ぐらいだろうし、使うフレームワークSaaSや技術の練度によってはもっと期間短縮したりできるとは思う。あと、フル稼働が必要な部分は実装~システムテストの部分だけで、それ以外はお客さんからの回答待ちや待機のような拘束時間には変わりはないが実質何もしてないみたいな時間もある。

人月単価80万円ぐらいという相場感

前述の例のような紙やらExcelで日常業務を回してるところは大量に存在していて、当人たちも効率が悪いことは自覚していてシステム化も検討してはいる。しかし、SIerに相談するとクソ高い見積もりが出てくるとか、仕事のロットが小さすぎるから請けてくれないとか、過去発注したシステムが金をかけた割にクソだった経験があるとかで、結局放置されていることが本当に良くある。

そういった相手に話をする際に、基準となってくるのが80万円ぐらいかなぁというのが個人の肌感覚である。もちろん仕事でやっていく際は、相手の懐具合を見て多めに要求することもある(実際には相手が大きな会社だと、AD連携がどうとか、瑕疵の保証がどうとかの要素が増えてくるので、懐具合関係なしに割増が生じる)し、逆に予算がほぼないところもある。

ここまで書いて、会社によって営業費とか間接費のかけ方が違うので「人月単価80万円では安すぎる」という話はあるでしょう。ただ、繰り返しになるが、ある程度の規模のSIerだと単価レンジが80万円の2-3倍ぐらいになるはず(前述の例だと請求額で500万円を超えてきたりとか)で、これが高すぎるからシステム化出来てないみたいのは腐るほど存在している。

80万円という単価レンジは、クライアントから見ると割安な価格設定に見える。同時に営業費用をあまりかけていない会社であっても単価80万円を割ってくると、おちんぎんが少なくなるので、ここは守らないといけないラインかなと設定している。

人月単価80万円ぐらいの仕事を工夫して、割の良い仕事にする

ジョイゾーさん

直接話をしたことはないので私が勝手にそう思ってるだけですが、ジョイゾーさんのKintone SIがこんな費用感をベースにやっている認識です。

まともに開発すると2-3か月かかるような話をテンプレートを適用していくことで開発工数を減らすものと、テンプレートではどうにもならないものを1週間20万円で対応しますよというもの。

弊社の例

アジャイル開発契約というか、ソニックガーデンさんの「納品のない受託開発」もどきというか、みたいな定額制の契約モデルで請けているお客さんがいる(全てではない)。

「納品のない受託開発」もどきの定額制の契約モデルというのは、

  • 納品自体はしている
  • 月額費用は数十万円ぐらい(作業ボリュームに合わせて調整)
  • 開発初期はどうしても労力が大きいので、ギリギリ赤字にならないレベルの額を初期費用として請求している
  • 最低限の機能を実装した段階でお客さんに納め、運用しながら改善をしていく
  • 毎月1回定期訪問して、改善点等のヒアリングを行う
  • 月間に対応できる改善工数に上限値があり、それをどうしても超えたい場合は別途お見積りで対応
  • 対応速度はベストエフォート(手が空いている場合は即日対応、契約上は10営業日以内に着手)

というように、費用・開発規模共にスモールスタートでやって長期的に改善をおこなっていき、売上的には初期導入費用+月額サブスクリプションみたいな感じになっていて、トータルで見たときに単価80万円ぐらいに設定している。効率的に仕事を捌けば実際の作業に対する売上効率は良くなる。

これの良いところは、

  • 初期費用を抑えていて、納品後も機能追加を継続的に行うことが前提になってるので、開発スコープの絞り込みで合意が取りやすい
    • 「とりあえず優先順位の高いこれに絞りましょう」「実際に使い始めて足りなかったら機能追加しましょう」
  • 安定稼働して、ユーザーもシステムに慣れてくると、やることがかなり減ってくる
  • 継続的な収入があって、構造的に作りすぎが発生しにくいので、瑕疵対応がつらくない(お客さん側も機能改善の一環として見てくれることが多い
  • 毎月1回定期訪問すると、納品したものとは別のシステム化の話が出てくるので、お金をもらいながら営業してる状況になる

といったところ。

悪いところ?としては、プログラミング言語の知識とかを生かすことがほぼなくて、本当にITコンサルタント的な動き方になるので、技術だけやりたいみたいな人だとやりたがらない。

追記:運用・改善フェーズに入ったら、 月々の実稼働が1日と想定して10万円みたいな価格設定 になっている(実際の想定日数とか、技術難易度とかで割り増しはある)。当然運用は長期になるので、大儲けはないが効率の良いお仕事。あと、運用してる間に「あれもシステム化したい」みたいな話は当然出てくるので、「それも初期開発は別料金になりますねー」みたいなサイクルが続く。

追記2:この話の文脈

togetter.com

HaxeのUnitTestライブラリ(2018年版)

2018年におけるHaxeのUnitTestライブラリについて書く。この記事を書いている時点ではutestを使っている。

この記事で挙げているものはすべて試したが、多少機能は少ないが枯れていて面倒が少ないのはutest、高機能なものがよければbuddyという感じかなという印象。tink_unittestは使いやすいAPIなんだけど、枯れてないので将来に期待という印象。

utest

Assertion Style(JUnit風)。API設計も素直なので、学習コストが低い。ユーザー数も多く、十分に枯れている。

ただ、テスト内容を日本語で書けない点が欠点と言えば欠点。Haxeは識別子に日本語を使えないので、クラス名・メソッド名ベースでテストレポートを出力するutestでは日本語出力はできない。

buddy

BDD Style。シンタックスが若干変態的だが、テスト内容を日本語で書ける。非同期テストでtimeoutが設定出来たり、コンパイルエラーが発生することがテストできたり、高機能。

Browserテストサポートが若干弱く、レポートがconsole.log()に出力される。

tink_unittest

Assertion Style。Haxeをがっつりやってると必ず目にするTinkerbell系のライブラリ。@:describeでテスト内容を日本語を設定したり、assertionがマクロになっていたり、非同期テストでtimeoutが設定できたり、こちらも高機能。

ただ、どうもv0.5.5の時点では、JS出力でBrowserテストに対応してないっぽい(Browserify通せば行けそうだが)。

MassiveUnit(munit)

数年前はこれがデファクトスタンダードという状況だった。おそらく今でも一番ユーザー数が多いと思われるが、いかんせん設計が古い面が否めない。個人的には、既に役目を終えつつあるものと認識している。

haxe.unit

Haxe標準ライブラリに含まれるUnitTest。機能不足過ぎ、Haxe 4.0で廃止が決まっているため、使う理由はない。

Breaking changes in Haxe 4.0.0 · HaxeFoundation/haxe Wiki · GitHub

補足

日本語の扱いについて記述しているが、実際に試してみたところ、NekoVMでは日本語がコンソールに正しく出力されなかった。Node.jsでは大丈夫だった。

Node.jsのcallbackスタイルAPIをPromiseに変換するHaxe macroが書けた

執筆時のバージョン情報: Haxe 3.4.6

Node.jsのcallbackスタイルAPIを毎回手でPromiseに変換するのがダルすぎる。

最初はNode.jsの util.promisify() を使おうかなと思ってたんだけど、Promiseを返す関数に変換するだけで、そのままcallしてくれるわけではないのと、型がどうしても付けづらいのでやめた。次の方法として、マクロでどうにかならないか試していたら、思いのほか良いものができた。

import haxe.macro.Expr;
import haxe.macro.Context;

class PromiseTools {
    public static macro function callAsPromise<T>(
            fn: Expr, ?params: ExprOf<Array<Dynamic>>, ?cb: ExprOf<Array<Dynamic> -> T>): ExprOf<js.Promise<T>> {
        var args = (if (isNull(params)) {
            [];
        } else {
            switch (params.expr) {
                case ExprDef.EArrayDecl(exprs): exprs;
                case _: Context.error("params must be EArrayDecl", params.pos);
            }   
        }).concat([
            if (isNull(cb)) {
                macro function (error, result) {
                    if (untyped error) {
                        reject(error);
                    } else {
                        // workaround for `Error -> Void -> Void` callback.
                        resolve(untyped result);
                    }
                }
            } else {
                macro untyped function (error) {
                    if (untyped error) {
                        reject(error);
                    } else {
                        var data = untyped __js__("Array.from(arguments).slice(1)");
                        resolve((${cb})(data));
                    }
                }
            }
        ]);

        return macro new js.Promise(function (resolve, reject) {
            $e{ {expr: ExprDef.ECall(fn, args), pos: fn.pos} };
        });
    }

    static function isNull(expr: Expr): Bool {
        return switch (expr.expr) {
            case ExprDef.EConst(CIdent("null")): true;
            case _: false;
        }
    }
}

usingを使えば、割とすっきりとしたコードになる。

import js.node.Fs;

using PromiseTools;

class Main {
    static function main() {
        Fs.readFile.callAsPromise(["test.txt"]).then(function (data) {
            trace(data);
        });
    }
}

コールバックが Error -> T -> Void ではなく、Error -> T -> Dynamic -> Void みたいな引数が2個を超える変形パターン(Cosmos DBのNode.js SDKがこんな感じ)にも対応できた。

// var client: DocumentClient = ...;

client.readDatabase.callAsPromise([DATABASE_URI], function (ret): Database {
    trace(ret[0]);
    trace(ret[1]);
    return ret[0];
});

これでだいぶ治安が良くなった。

Haxeで型パラメータに構造的部分型を指定した時の挙動

執筆時のバージョン情報: Haxe 3.4.6

Haxe/JSでCosmos DBクライアント(npm documentdb)のexternを書いているのだが、Haxeでexternを書くたびにたまにハマることがある(ハマるたびにググってる)ので、メモを残しとく。

DocumentClient#createDocument() というAPIは、JSONid がrequired、ttl がoptional、あとは任意をフィールドを指定できる(指定した値がCosmos DBに保存される)インターフェースになっている。

これを何も考えずにexternに落とすと(というか、TypeScriptの.d.tsを下手に書き直すと)こんな感じになる。
※説明用に簡略化しているため、実際のnpmのインターフェースとは異なっているので注意。

@:jsRequire("documentdb", "DocumentClient")
extern class DocumentClient {
    function createDocument(link: String, body: Document): Void;
}

typedef Document = {
    var id: String;
    @:optional var ttl: Int;
    /* id以外のフィールドは動的設定可能 */
}

これをこんな感じで使おうとするとコンパイルが通らない。

// var client: DocumentClient = ...;
// var link = "...";

client.createDocument(link, {
    id: "xxxx",
    name: "hoge"
});

こんな感じのコンパイルエラーが出る。 name なんていうフィールドが余計についとるよと怒られる。

{ name : String, id : String } has extra field name

で、 Haxeのマニュアル に従ってexternを書き直すとこんな感じになる。

createDocument()の型パラメータとして <TBody: Document> を指定している。TBodyはDocument型で定義されたフィールドを最低限持ってれば、他に余計なフィールドを持っててもいいよという定義になる。

@:jsRequire("documentdb", "DocumentClient")
extern class DocumentClient {
    function createDocument<TBody: Document>(link: String, body: TBody): Void;
}

typedef Document = {
    var id: String;
    @:optional var ttl: Int;
    /* id以外のフィールドは動的設定可能 */
}

で、これでめでたしめでたしかと思いきや、コンパイルが通らない。

client.createDocument(link, {
    id: "xxxx",
    name: "hoge"
});
Constraint check failure for createDocument.TBody
{ name : String, id : String } should be js.npm.documentdb.Document
{ name : String, id : String } should be { ?ttl : Null<Int>, id : String }
{ name : String, id : String } has no field ttl

ttl フィールドがねーぞと怒られる。@:optionalだから許してくれてもいい気がするんだがー…。

仕方ないので、利用側のコードでこういう感じに書いて回避する。

client.createDocument(link, {
    id: "xxxx",
    ttl: js.Lib.undefined,  //nullだと期待通りに動作しないライブラリがある
    name: "hoge"
});

もしくは、次のようにDocumentをカスケーディングした型を定義して、型が自明になるようなコードにする。ここでは変数に型を明示しているが、関数を作って引数の型として指定するようなコードでも当然良い。

typedef User = {>Document,
    var name: String;
}
var user: User = {
    id: "xxxx",
    name: "hoge"
}

client.createDocument(link, user);

「労働者側の裁量で深夜労働もできる勤務体系」をまじめに考えるとクッソ大変な話

これを読んだ。

tech.grooves.com

就業規則おじさん枠として、「労働者側の裁量で深夜労働もできる勤務体系」について言及しようと思う。労働法のエキスパートではないので、実際に検討をする場合は社労士と相談が必須。

お前誰よ

過去にこんなことをした。

terurou.hateblo.jp

本業ではないので労働法のエキスパートではないが、

  • 自分で就業規則をゼロから書き起こした零細企業実務者
    • 就業規則は執筆中~施行前まで社労士チェックが何度も行われている
  • みなさんが期待する裁量労働制・なんでもありフレックスタイムを本気で検討したが、制度設計・運用がともに無理だと思ったので断念した

という前置きで。

蛇足だが、就業規則GitHubをした影響で本業の社労士さんからコメントを頂くことがチョイチョイあるが、「ちょっと気になるところがあるけど、大体こんなところだよね」という評価である。

元記事に対する個人的な総評

  • 着手開始から実質3-4か月程度で制度導入が完了していることを考えると、会社としてはすごくスピーディにやっていて評価できる
  • ただ、軽微な誤り(フレックスタイム制コアタイムが必須は誤り)があったり、省略しただろうなぁという行間を感じる部分がある
  • はてブやらTwitterでの言及を見ていると好意的な反応が多いが、ちらほら「法があるのはわかったが、もっとできるはず」「まだ厳密な労働時間管理なんて」「なんで今頃知ったみたいなこと言ってんの」みたいな、ほぼ言いがかりなコメントもついていて、社会の厳しさを感じる

就業規則の変更に必要なこと

就業規則の変更には、労使間の同意(と労基署への提出)が必要で、変更の際、

  • 合理的な理由および労使間の合意がなく、労働条件の不利益変更はできない
  • 同一労働同一賃金(特定個人のみの待遇が良い・悪いがあってはならない)

という原則は厳守する必要がある。

追記:法的義務は「労働者側の話を聴かなければならない」までなので、会社側は話を聴いた上で無視することも可能だが、不利益変更や特定人物のみに損得が発生することをごり押しするような会社に人が残るかというのは…。それこそ労働問題で訴訟リスクも発生するので、ごり押しするメリットは会社側には薄い。

深夜労働の法規制

そもそも深夜労働(深夜業)は法規制の対象で、健康を害する危険があるからアカンというスタンスである。その上で、どうしても深夜労働を行う場合は、

  • 深夜労働には割増賃金の支払いと労務管理が必要
  • 年少者や妊産婦の深夜労働は禁止
  • 常時500人以上の深夜労働に従事する労働者がいる事業所では、産業医の設置と6か月で1回以上の健康診断の義務
  • 6か月間で月平均4日以上の深夜労働をしている労働者が自発的に健康診断を受け、診断結果に異常があり、それを会社に提出した場合は、会社側は深夜労働を減らすなどの対策を講じる必要がある

という規制に従わなければならない。 労働者が自由意志で深夜労働を行うということは、労働法で想定がされていないし、おそらく今後も想定されるとは思えないようなイレギュラーな話である。

「労働者側の裁量で深夜労働もできる勤務体系」での給与モデル

元記事でもあったが「能力は同じでも、自由意志で深夜に働いたか否かで給与額が異なる」というのは、「同一労働同一賃金に反して不平等(=特定個人だけ利益/不利益が生じる)」ということになる。

よって、これが生まれない給与モデルを考える必要があるが、現実的にとれる選択肢は「みなし残業(みなし深夜労働)」を導入するしかない。具体的には、「全ての労働日において深夜労働をしたものとみなす割増賃金」を最初から給与に織り込めばよい。

  • 深夜労働の割増率は25%
  • 深夜労働の対象は22時~翌5時の7時間
  • 一般的な8時間労働の事業所であれば、全ての労働日で深夜労働したとすると、7/8が深夜労働に該当する
  • 25% * 7 / 8 = 約21.9%

ということで、「労働者側の裁量で深夜労働もできる勤務体系」が適用される部門の全員に、給与額の21.9%分を固定手当として支給すれば要件は満たせる。

しかし、「労働者側の裁量で深夜労働もできる勤務体系」を導入するために、人件費がいきなり21.9%上がることを承認できる経営者はまず居ないと思う。上がった人件費以上に売上や何らかの価値が得られるのであれば喜んで承認すると思うが、ここの合理性を説明するのは相当ハードルが高い。

そうなると別の方法として、現行給与の支給額を変更せずに、手当の構成を変更するという方法しかない。例えば、現行の毎月給与の額面が40万円だったとして「基本給328,205円+みなし深夜労働71,795円の計40万円」とすれば、要件は満たせる。

ただ、この手法も「現行よりも基本給が下がる」という割と致命的な問題がある。基本給は割増賃金を算定する際の基準額となるので、深夜労働以外の超過労働や休日労働に係る割増賃金の額も下がってしまう。ただの給与の切り下げでしかないので、「深夜労働ができなくても何も問題がないよ」という社員からすると寝耳に水でしかない。

給与モデルの面から考えたときに、適用部門の全員がこれを望んでいるか「希望者のみに深夜労働もできるようにするよ。ただし自由な勤務が得られる代わりに、基本給が下がるから超過労働や休日労働をした場合に得られる給与額は減るよ。これを会社から強制適用することはないよ」という労使協定があれば、就業規則に盛り込めるのではないかと思う。ただ、社労士(と労基署)に確実に相談が必要となることは忘れてはいけない。

勤怠・給与計算のルール・システムの複雑化

給与モデルが決まったとしても、次の山として給与計算ルールが複雑化するという問題が生じる。勤怠システムを作ったことがある人間であれば既に気づいていると思うが、「深夜に仕事しても良く、翌日は遅く仕事しても良い」をやると、「一日の切れ間がわからなくなる」という問題ある。

極端な例を出すが、

  • 1/15 10:00-19:00
  • 1/16 17:00-26:00
  • 1/17 欠勤
  • 1/18 24:30-33:30
  • 1/19 21:00-30:00

みたいな勤怠を扱えなければならない。これをシステム化するとして、要件として書き出すと、

  • 24時以降の時間も入力可能とすること
  • 別の日付の勤怠の時間帯が重なっている場合は入力エラーとすること
  • 欠勤があったことが判定できること
  • 休日出勤を判定できること
  • みなし深夜労働手当者とそうでない勤務体系の従業員で遅刻・早退等の計算方法が切り替わること
  • ...

のような要件でシステム化を行う必要がある。業務システムの開発で良く見聞きする「この要件必要なんですか?実装すると工数が膨らむんですけど」「業務をパッケージの方に合わせろよ」という話が大型ブーメランとして返ってくる。

システム化の方から先に書いたが、これを就業規則として明文化しなければならず、さらに社労士チェックを通す必要がある。

社労士相談コストの増大

既に前述している通りだが「労働者側の裁量で深夜労働もできる勤務体系」は、労働法制上想定されていない(むしろ規制されている)イレギュラーな働き方で、システムも複雑になりすぎる。

これらを就業規則として盛り込むには、労働法に違反していないことを社労士にチェックしてもらう必要がある。下手に運用を開始すると、昨今のブラック企業取り締まりが強化されてきている状況下では一発レッドカードになりかねない。

一般的な就業モデルをパッケージ適用するのであれば簡単だが、イレギュラーケースの制度設計になるので、相談される社労士の方も慎重に進めていかなければならないため、相応のスキルと工数が必要になる。

これは確かなことは言えないのだが、一般的な就業規則パッケージをそのまま導入するのなら30-40万円で済むのに対して、「労働者側の裁量で深夜労働もできる勤務体系」を導入しようしたら、就業規則の完成までで数百万円+顧問契約料を割増で契約、作業期間は数か月~半年みたいなことになるのではないかと思う。これに更に労務管理部門での社内運用体制の構築が必要になる。

追記:制度の設計・運用を外部委託する部分だけの費用を書いたが、これに社内担当者の人件費もかかる。制度設計は総務・法務部門に丸投げできないので、直接部門の人間もかなり時間を取られる。

考えれば考えるほど「業務をパッケージの方に合わせろよ」と言いたくなる。

労務管理・コミュニケーションコストの増大

就業規則・システムの山を越えたとして、まだ考えないといけないことはある。

「労働者側の裁量で深夜労働もできる勤務体系」を導入と、勤務時間が人によってバラバラになるので、コミュニケーションが取りづらくなる。それこそ、昼勤・夜勤みたいな社内で2交代みたいな状態になる可能性もある。

深夜労働者に対して、管理監督者が同一時間帯に管理監督を行う義務はない(はず)なのだが、健康管理等の面で常に野放し状態にするという訳にもいかないので、毎日ではないせよ監督が必要になる。

コミュニケーションコストが増大した分だけ、組織としての生産性は下がる。これが解決していれば、リモートワークとかはもっと普及している。人材採用の幅を広げることと、生産性の低下・コスト増加のバランスが取れるかは、組織によってくると思う。

ここであえて書くが「朝に弱いから勤務時間を深夜でもOKにしてほしい」という人間がいる一方で「家族がいるから深夜勤務とかありえない」というような事情を持つ人間もいることは、念頭に置かねばならない。後者の人間が管理監督者で、前者の人間の労務管理・コミュニケーションのために深夜労働を行わざるを得ないという不幸が出ないようにしなくてはならない。管理監督者の方も前者タイプならいいんですが。

追記:ここはコミュニケーションがほぼ不要な業態なら大した懸念点にならない可能性はある。ただ、完全にコミュニケーション不要の仕事というのも考えられないし、労務管理からは逃げられないので、例えば週1回は決まった時間に打ち合わせを行うとかの制約は必要になってくる。

まとめ

「労働者側の裁量で深夜労働もできる勤務体系」について、

  • 社会システムで想定されていないイレギュラーな働き方であって、労働法制で規制すらされている
  • イレギュラーを通すには様々なコストがかかるし、会社全体の生産性が低下する可能性もある
  • コストを払ってでも得られるメリットがあるのか

という話で、「朝に弱いからやってほしい」というレベルで導入するは無理。

そもそも昼夜逆転は人体には悪いとされていて、健康の範疇の人間であれば朝に弱いといっても昼までには起きれるでしょ(起きられない人は何らかの病名が付くはずで、まずは通院すべき…)というところがあり、落としどころとしてはコアタイムの緩いフレックスタイムだよね、となるのが自然な流れだと思う。

とはいえ、深夜勤務完全OKという会社も実在しているので、そういう会社はこの記事で書いてきた山を全て超えてきたんでしょう(グレーなまま労使間の紳士協定でやってる可能性もある)。