はじめに
N1! Machine Learning Product Engineerの中村です。普段はニュースサイトやアプリのバックエンド開発を担当し、その他機械学習をプロダクトに実装することを目的としたスペシャリスト(ニフティにはN1!というスペシャリスト制度があります)としても活動しています。
https://recruit.nifty.co.jp/interview/nakamura.htm
社内LT大会
ニフティでは2ヶ月に1回ぐらいのペースで社内LT大会をしています。コロナ禍になり現在は完全オンライン開催に移行していますが、オフラインで開催していた時期も様々な社員が技術ネタに限らず、いろいろな話題でLTに登壇していました。
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/image-5-1024x387.png)
※一部スライドを修正しています
LTはじまり
以下、実際のLTと同じ口語調に近い形で綴ります。![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/4e52cc328eed600722c499438d12843a-1024x576.png)
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/37d6319821a42f50b59ea690532e34b7-1024x576.png)
今回は設計の話をしたいんですけど、自分の好きな言葉を紹介したいと思います。
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/5cd80be53cebfeb5bddbebe5e9dc70e2-1024x576.png)
良い設計というのをほとんどの人が追い求めていると思います。
![](https://m.media-amazon.com/images/I/51mQrYTahJL.jpg)
![](https://m.media-amazon.com/images/I/6181Uutb1tL._SX260_.jpg)
![](https://images-na.ssl-images-amazon.com/images/I/51DuWqWrujL._SX357_BO1,204,203,200_.jpg)
ただ、こういった本って読んでみてもほとんどの場合って「お前は何を言ってるんだ」状態になりがちなんですよね。
個人的に思うのは、こういった書籍って、例えばクリーンアーキテクチャのオニオン図だったり、ドメイン駆動設計はドメイン知識をモデル化していくんだよ、とか、オブジェクト指向はオブジェクト同士がメッセージをやりとりし合うんだよ、とかそういうことは書いているんですけど
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/f26586c38247697425d93c669777917c-1024x576.png)
![](https://images-na.ssl-images-amazon.com/images/I/41nGf5PrhsL._SX350_BO1,204,203,200_.jpg)
悪魔と戦う
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/367b8ebdde26935187128edaef56260d-1024x576.png)
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/87e2ce34255647f45318f263305949c6-1024x576.png)
関係のないクラスが雑多に置かれがちなcommon/utilクラス
何が書いているかわからなくなるとにかく巨大なネスト
例外をキャッチはするけど何もなかったかのように振る舞う握りつぶし
もっと踏み込んだ考え方として、内部でうまく責務が分割できておらず複雑になったクラス
あらゆるインスタンス変数、処理を内包した全ての処理を持つ神クラス
など、こういった悪しき構造が「悪魔」です。
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/f12400f100cb6425856cdcf3a897a19e-1024x576.png)
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/ad830280591d25be67fea3ec83926c72-1024x576.png)
共通処理クラスを作るのではなく、オブジェクト指向の基本に基づいてどのように設計をするのか。
ネストの解消では、単純な方法である早期returnの他、interfaceを使った抽象化で排除したり、デザインパターンであるストラテジパターンを使って排除するなど、かなり深い考え方も使いながら解消をしていきます。
どのようにして責務を分割するのかも具体例があるので、なぜJavaでは継承よりも委譲を使うべきといわれるようになったのか、なども実際のコードで理解できます。
人間と開発
ここまでも技術的に盛り沢山な内容だったのですが、個人的には後半の章がかなり好きで![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/4fac4548d62676112ab1596cf7eea29d-1024x576.png)
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/12843b08a0bb93bfc7b7adc9138d8e9e-1024x576.png)
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/cca7e6418a07d3afb224d4af4257d864-1024x576.png)
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/eaf6a9ec8de565459f1cfbdeed5ee7c5-1024x576.png)
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/e36888db71c69f16fd09faa8f9cafb34-1024x576.png)
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/c049d5d892d79493bf0681434a7e116c-1024x576.png)
エンジニアチームに当てはめてみると、20人ほどのチームであれば自分以外の1人を仲間にできれば、20人のチームで影響を持つことが可能になります。つまり1人2人の働きかけから、直感よりもかなり大きな人数を動かすことができるということです。
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/4476cfd874bd138d1c88b5da0bb42959-1024x576.png)
![](https://engineering.nifty.co.jp/wp-content/uploads/2022/06/2bda676de70680691dd2158bda5d1047-1024x576.png)
最後に
実はこのLT大会では投票の結果、優勝者には副賞があるのですが、自分のこの発表は同点優勝の結果、最終的に運ゲーに負けて名誉だけが残りました。(次も優勝するぞ)ニフティでは定期的にこのようなLT大会を開催することで、それぞれの社員の知見や考えを互いに知る機会を設けています。
トークテーマフリーなLT大会の他、データ分析に特化したLTやチーム内で行われているLTも存在し、日々互いに刺激を受ける環境となっています。
カジュアル面談も行っていますので、お気軽にお問い合わせください。 https://meety.net/matches/jokPNZdaaovV
We are hiring!
ニフティでは、さまざまなプロダクトへ挑戦するエンジニアを絶賛募集中です!ご興味のある方は以下の採用サイトよりお気軽にご連絡ください! Tech TalkやMeetUpも開催しております!
こちらもお気軽にご応募ください!