• 僕はクリーンアーキテクチャやレイヤードアーキテクチャについて真面目に学んだ訳ではないのですが、僕宛に質問という形でしたので僕が理解している範囲でお答えします。

    まずクリーンアーキテクチャは「なんにでも画一的なコンポーネント分割」を適用しようとは提唱していないはずです。過去に作った何らかのソフトウェアでとあるコンポーネント分割をしたらとても良く上手く行ったのでクリーンだと呼んでいるだけで、パターンを抽出してみたので使えそうな所は使ってね、ぐらいの温度感で聞く必要があります。使いどころを間違えるとかえっておかしなコードになる事は他のデザインパターン等と同様です。

    ソフトウェア開発は常に効率との戦いで、将来的に必要になる改変が過去に書いたコードの応用やパラメータ変更等で達成できた場合に高い開発効率が出せたと言えるのですが「何らかのアーキテクチャを取ったときに何らかの改変に強くなった」というのはあらゆるアーキテクチャに対して言える上に、あらゆる改変に対して強い無敵のアーキテクチャは存在しないので、つまるところ何らかのアーキテクチャが良かったというのは「この時にやった設計判断がたまたま当たった」以上の事はありません。「この株買ってたので儲かった」と過去の話をされてもこれから先も儲かるとは限らないのと同じです。株の予想で何らかの銘柄をやたら宣伝したり、過去に儲かった取引を後出しで自慢しているような物なので一層眉唾であると感じます。

    レイヤードという観点で言うとRuby on Railsは天才的で、プロジェクトとして初期化した時点で走るコードの形でModel/View/Controllerが別のディレクトリに分けられてレイヤー構造が出来ています。これは「Webアプリを作りたいならこういうアーキテクチャを取れ」というのをコードのレベルから押し付けており、逆にWebアプリ以外には使えません。目的を絞れば共通部分が定義できるというのは原理的に正しく、教義自体がコードの形に具現化されている点で現場レベルでの混乱を抑えています。せっかく天才が傑作なアーキテクチャを提案してくれたのがRailsなのにそれにDDDを導入するという倒錯が世の中にあるそうで実に残念です。どちらも2004年ごろに登場した物で、Railsが優れているというのは10年以上の世の中の流れが証明したのにそこに劣った方の概念であるDDDを導入するのは、ガソリン車からエンジンとハンドルを取っ払って馬に引かせるような錯誤であると認知されて欲しいものです。

    レイヤーを分ける事でコードの見通しがよくなるという思想自体には賛成ですが、DDDの人たちが言うようなドメインロジックを中心に据えてストレージをリポジトリやインフラ層に追い出したりするアイデアには反対です。疎結合を有難がる風潮が念仏のように唱えられがちですが、データはアプリケーションの本尊そのものであって、脇に置いたりあとから気軽に挿げ替えたりするものではありません。言い換えるとそこに疎結合を求めてはいけません。要件を満たすためにたまたま都合が良いからRDBMSの力を借りるのが定番になっているだけであって、本来であれば毎度ビジネス要件から逆算して大真面目に実装コストや障害への要件や実行速度などを充分吟味した果てにRDBMSを使おうという結論に至る順序で考えるべきなのです。

    プログラミング一般に言えるソースコードのレイヤーの分け方という観点でいうとA Philosophy of Software Designという本が僕の思想に一番近いです。この回答の趣旨に沿った部分だけこの本に書かれている指南を僕なりに解釈して抽出するとこうなります。

    • クラスやインタフェースは少なければ少ないほど認知負荷が減るし変更に強い

    • 少ないインタフェースでより多くの事ができるのが良い設計。その向こうでどんな複雑な事をしても認知負荷を増やさないので。

    • 再利用の予定がなくても再利用性を意識して一般化したインタフェースを定義すると直交性が高まり生産性が上がるが、時には段階をすっ飛ばす事が良いこともある

    いかがでしょうか。とにかく大量のクラスを定義することを是とする風潮に対して正面から反対してくれる良い本だと感じています。

    2年(29日更新)
熊崎 宏樹さんの過去の回答
  • DDD以外の設計手法についてご教示いただきたく、DDDの主張をある程度正確に理解した上でDDDをこき下ろしているイメージの強いくまぎさんに質問させていただきました。 最近はソフトウェアの設計について調べると、DDDについての記事ばかりで辟易する一方、私がエンジニアになった頃にDDDに勢いがあった影響もあって私自身DDD以外の良い設計とされているものを知らず、DDDに胡散臭さを感じつつもDDDの考え方にとらわれている、毒親の影響を受けた子供のような状態から抜け出せずにいます。 その最たる例がリポジトリパターンです。 よく依存性の逆転・DIと一緒に語られますが、くまぎさんがおっしゃる通り余計にインターフェースを切るのはイケてないと感じます。また、DI抜きにしても、リポトリパターン由来の様々な問題(N+1やバルクアップデート、管理画面用のメソッド生やしたくなる問題など)に対する解決策として提示されている手法をみて、自分で問題をでっち上げているように見えます。その一方で、ドメインのモデルを集約という単位で、リポジトリを介してDBに出し入れするのは便利そうに感じます。リポジトリパターンを使わずにドメインのモデルの入出力が書き散らされるとモデルにプロパティを追加するときなどにあちこち修正の必要が出て面倒です。 そもそもリポジトリパターンのようなDBとのやりとりをするところにドメイン知識を持ち込まないという考えに無理があるのでしょうか?別の方への回答に「DDDの人たちが言うようなドメインロジックを中心に据えてストレージをリポジトリやインフラ層に追い出したりするアイデアには反対です。疎結合を有難がる風潮が念仏のように唱えられがちですが、データはアプリケーションの本尊そのものであって、脇に置いたりあとから気軽に挿げ替えたりするものではありません。言い換えるとそこに疎結合を求めてはいけません。」と書いていましたが、くまぎさんがアプリケーションを書くときは、DBとドメインロジックをベッタリさせて書いていますか?ドメインロジックのテストを書くときはDBを立ち上げてデータを入れてテストしているのでしょうか? くまぎさんが実践しているプラクティス等あればぜひご紹介いただきたいです。

  • 消えません。

    産業革命の時ですら「蒸気機関で労働が消える」などと騒いでいたという話がありますが一向に労働はなくなっていません。汎用AIをうまく使える人にさらなる仕事が降り注ぐだけであって、飛脚100人分の労働がトラックの運転手一人で置き換わったみたいな話がそこかしこで起きるだけと見ています。

    1か月
  • 趣味として何かを作ってるぶんには「影響力の大きいものを作った」という事を持ってして「あいつは技術力が高い」としています。

    ソフトウェアエンジニアの本職としては「あの人がいると仕事が進む」というのが技術力の高い人の肌感覚です。つまり仕様を手早く整理して人に伝え懸念点を素早く解決し、メンバーの疑問に答え役割分担を適切にこなしながらマネージャからの信頼も厚い、そういう人が強いです。

    1か月
  • 「日本はいつでも自販機でミルクティーが買えるのが嬉しい」とインド系の人が言っていたのが意外でした。午後の紅茶が好きみたいです。

    1か月
  • 再帰とか抽象構文木とかマクロですかね…。人によって「最低限」の基準が違うので論じにくい話です。

    この手のメタな知識はまさにLISPの世界で熱心に研究され続けて来たので「計算機プログラムの構造と解釈」通称SICPという本に集まっており、だからこそ熱心なプログラマはこの分厚い本を崇めたりLISP使いになったりします。昔はSICPがマサチューセッツ工科大学の教科書だったりしたのですが最近はPythonをやるようになったという噂もあって、それほどLISPが必須知識として見做されなくなってきた風潮を感じます。もちろん興味が有るのであれば是非邁進してください。

    2か月
  • テック企業で働く気ならスキルセットをテックに寄せる方が近道ですし、アメリカ系の企業なら社内の公用語は英語でしょうから英語を社内公用語に使っている会社なら英語の練習にもなっていいですね。

    英語が公用語かつテック系で日本にオフィスを置いている会社は都内にたくさんありますのでぜひ検索してみてください。

    3か月
  • そんなに高い志など無く、自分が好きな分野の中で社会から需要がある所を選んだ感じです。ただし、MLとかデータサイエンティストなどは数式とにらめっこする時間の方が長そうなので、数学力ではなくてCPUアーキテクチャとかそういう知識が活かせそうな分野を選びました。

    最近は「異世界転生するなら俺TUEEEできる所を狙いたい」というモチベーションぐらいで充分なんじゃないかと思っています。

    3か月
  • いつもXでmondの回答拝見して参考にさせて頂いたいます。 今回初質問になりますが、よろしくお願い致します。 相談内容は「どうすれば自分がわからない部分を言語化して自分で解決して理解できるようになるか」です。 自分は普段Webアプリケーション開発に従事しておりエンジニア歴は6年目になります。 簡単なCRUDのAPIを実装したり、フロントエンドで画面を構築はできるつもりです。 しかし、少しでも知識の深掘りが要求されると途端につまづいてしまいます。 例としてパフォーマンスの高いSQLを書けるようになるためRDBMSにおけるB-Tree Indexの仕組み(なぜインデックスを貼るとクエリ処理が早くなるのか)を勉強したものの、どんな入門書やネットの解説記事、各種RDBMSの公式リファレンスを読んでも理解出来ませんでした。 他にもRDBだけでなくアルゴリズムとデータ構造やネットワークなどあらゆる分野で少し難しいレベルが要求されると何が分からないのかが分からず八方塞がりになってしまいます。 そんな状態がここ2,3年続いており、自分のエンジニアとしての技術レベルが停滞しています。認めたくないものの自分のエンジニアとしては限界なのかもしれないと感じています。 もちろん、他の方が自分の何倍も技術に向き合われていて単に自分の努力不足であることは承知しております。 しかし、「何を勉強しても何を勉強しても何が分からないのかを言語化できず、自学自習のサイクルを回せない」のではエンジニアとして失格であると考えています。 しかしエンジニアであることを諦められないため、「どうすれば自分がわからない部分を言語化して自分で解決して理解できるようになるか」をアドバイス頂きたいです。 お手数おかけしますがお手数おかけしますが、ご回答頂けますと幸いです。

  • お世話になっております。コンピュータサイエンスについて質問があります。 現在 23 歳の高卒ソフトウェアエンジニアで CS を体系的に学びたく学士を取得しようと思っています。やる気があれば修士以降もやりたいです。 単純にコンピュータやコードを書くのが好きでもっと詳しくなりたかったり、自分に出来ることを増やしたりビッグテックで働いてみたいなど理由は色々あります。 選択肢は2つ考えていて、働きながら海外の大学のオンライン講義を受けるか、国内の大学で学ぶため受験からやり直すかです。 単純に比較をするのは難しく懸念点も様々ですが、気にしているのは卒業後の年齢で入社しようとしても足切りされるのではないかという点を心配しています。高度な仕事をやりたくて勉強したのに土俵に立つことすら出来なくなってしまったら少し悲しいです。社会人大学生としてやっていく方がリスクが少ないのは分かっているのですが、まだ決め切れておらず kumagi さんが同じ立場だったらどうするか意見をいただきたいです。 色んな求人を見たりするのですが大体必須条件に CS の学士・修士または同等の実務経験と書かれていることが多く CS に関する知識の必要性を日々感じています。コーディングテスト?は受けたことが無いので分からないのですが一応 AtCoder 黄なのでなんとか行けるかな、、と思っていたりもするのですが… 競プロをやってきて凄い人に沢山出会うのですが、経歴を見ると大体東大を通っていて凄い事をやりたいなら自分もそういうところで学ぶべきなのかと考えてしまいます。 長文になってしまいました、申し訳ありません。 お手数をおかけしますがご回答いただけますと幸いです。

  • 全くですね。アセンブラを眺めるのなんて顕微鏡で拡大して観察するようなもので、今どこを見ているかを把握することすら難儀です。

    僕はアセンブラと日常的に戯れるエンジニアではないのですが、自分の書いたC++が自分の狙った通りの機械語に変換されているかを確認するために godbolt.org にコード片を入れています。ベンチマークを取っている時にタイトなループの内側でインライン化することを期待していた関数がやけに遅い時などに役立ちます。

    5か月
  • どれだけ正確に覚えているかは個人差があると思いますが、うちの子は語ってくれます。ただし「ママのおなかのなかにいるときにあーまーどこあくりあしたの」ぐらい適当な事いうので僕も「うんうん、お腹の中は暇だろうからプレステ入れといたんだよね」と応じています。

    8か月