就職おめでとうございます。共に業界を盛り上げていきましょう。

コード以外で書くものと言ったらDD(デザインドキュメント)がもっぱら多いです。要するに基本設計書です。しかし、重要なのは業界に渡って「設計書」の指す内容には明確な合意や基準がないという事です。つまり僕のいう基本設計書があなたの会社での標準的な基本設計書ではないでしょうし、どちらが優れているという話でもありません。

人間の脳は有限なので叩き込んでおけるソースコードの量は限度があります(その限度に10倍以上の個人差があるのも事実ですがそれはそれで置いておきます)しかし、プロジェクト全体像を頭に収めておかなくてはならない立場の人間は必ずいます(大抵管理職)。Googleの場合はプロジェクト内の人間は全員プログラミングの心得がある前提で動いているので、書かれるドキュメントはプログラミングの心得がある人に向けて「普通のプログラマ感覚から見たらこの辺が要所になるであろう」という箇所、例えば素直に書こうと思うと苦労する場所とか、非直感的な勘所とか、単純にデカすぎるのでその概形を示すとか、そういう点にフォーカスを当てて書くことが多くて逆に誰が書いても同じようにしかならない細部は言及すらされません。そうして書かれるドキュメントは自分が書いてない範囲のコードを理解する必要に駆られたプログラマを想定している物ですから問題の形に合わせて柔軟なフォーマットで自由作文していますしおよそブログといっても差し支えないものかもしれません。ただしGoogle Docs上で書いていて、チームメンバーが相互に編集者コメントをつけてそのスレッド上で議論がドバドバと長引く事もあるので英語ネイティブではない僕には残念ながら心理負荷は高いです。かといってせっかく書いたのにコメントの一つも付かないと読んでもらえてないかなという寂しい気持ちになることもあります。

あと、チームで開発する以上は自分の書くコードはあらかじめチーム内で合意が取られたものであって当然なので、まとまった量のコードを書く前には常に「こういう方向でやっていこうと思いますヨロシク!」みたいな感じでドキュメントを書いてコードを書くたびにわかった事実に基づいて適宜修正するスタイルでやっています。

Googleが具体的にどういうドキュメンテーションをしているかというのは文化的な背景まで踏まえたほうがよくわかると思いますし、Googleのソフトウェアエンジニアリングという本の10章ではまるごとドキュメンテーションについて章を割いて説明しています。これが絶対の答えであるとも各社真似するべきであるとも思いませんが、参考の一つにはなると思います。

https://www.oreilly.co.jp/books/9784873119656/

Googleのソフトウェアエンジニアリング

Googleの現役ソフトウェアエンジニアたちが、超大規模ソフトウェアの開発と保守を長期的に支えてきたGoogle社内の多様なベストプラクティスを、文化、プロセス、ツールの側面からこの一冊に凝縮。時間と変化、規模と成長、トレードオフとコストという3つの基本原理に沿って、コードを持続可能にする方法論を紐解きます。「謙虚、尊敬、信頼」、心理的安全性、ダイバーシティとインクルージョンなど公正を重んじる文化から、コードレビューやテスト構成法など人間の行動を規定するプロセス、継続的インテグレーションや大規模変更システムなど変化への対応を支援する自動化ツールの基盤技術まで、Googleが試行錯誤を経て獲得した教訓を余すところなく紹介しています。経済学、心理学、マネジメント論などを背景にした人間への深い洞察をふまえ、データ駆動かつトレードオフから導かれる、定量的かつ定性的な決定プロセスも解説。Googleの成長力の源泉を理解でき、得られる知見は、学生から組織の意思決定者、小規模スタートアップからデジタルトランスフォーメーション(DX)を目指す大企業まで、幅広く活用できます。

www.oreilly.co.jp

何が非自明な要点なのかというのは全然基準がないのですが、プログラムの設計についてチーム内でチャットが盛り上がった場合、そのレスの応酬の果ての結論はドキュメントする価値があることが多いです。なぜなら非自明だからこそチャットが盛り上がったのですから。

質問の内容に立ち戻って「どういったものが普通なのか」という観点でいうと僕は正直な所知らないです。僕のいたNTTとGoogleの間で違うところが多すぎますし2社の例で全部を語る事はできないからです。「どういったものが効率的なのか」というのは読む人次第です。例えば非プログラマな管理職に向けて予算配分やスケジューリングの意思決定の手助けになるようなドキュメントを書かなくてはならない場合、それはGoogleで書いているのとは違うフォーマットが効率的である事は間違いないからです。

9時間
💌 スーパーレターへの回答方針

機密事項は一切答えません。


0 / 20000

利用規約プライバシーポリシーに同意の上ご利用ください

熊崎 宏樹さんの過去の回答
  • Google Summer of Code (GSoC)が良いと思います。が、もう今年の分の募集は締め切っているので毎朝のラジオ体操代わりにAtCoderで緑色ぐらいの問題を一問解くのが良いんじゃないですかね。

    過去に書いた若者向け記事のリンクを置いておきます。

    https://qiita.com/kumagi/items/62ec259ea86bdac1db4c

    若者向けソフトウェア人材おすすめビルドN選 - Qiita

    この記事はpyspaアドベントカレンダー2021の三日目です。前日の記事はykubotaさんです。 はじめに 「自分には才能がある!」と信じてこの業界に踏み込んだものの右も左も怪物だらけで肩身が狭い思いをしているのは僕だけではない。 憧れるのは異世界転生のような俺TUEE...

    qiita.com

    8時間
  • 研究室選びをする時期なのですが、ソフトウェアエンジニアになるために以下のどの教授の研究室に所属するべきか助言を頂きたいです。教授の評価はあくまで生徒視点です。 1. エネルギー効率の良い電子回路を設計するソフトウェアツールを開発。C++やPythonを使った本格的なソフト開発が可能。オープンソースや企業との連携もあり。(教授の評価 1.7/5.0) 2. 組込み向けのOS開発やハードウェア制御を学べる。C/C++を使ってOSやドライバを開発。国際学会での発表機会も。(教授の評価 3.7/5.0) 3. IoTやスマートデバイスの実装とプログラミングが中心。Arduinoなどのマイコンでハード+ソフト開発を体験。(教授の評価 4.7/5.0) 4. 大規模ネットワークやサイバーセキュリティのシミュレーションツール開発が中心。実践的なネットワーク設定とセキュリティ設計が学べる。(教授の評価 3.5/5.0) 5. AIやディープラーニングを画像認識や医療などに応用。PyTorchやTensorFlowを使ってプロジェクト型開発ができる。(教授の評価 4.25.0) 6. 顔認識、医療画像、農業AIなど応用コンピュータビジョンに特化。国際的な共同研究も多く、オープンソースコードへの貢献が可能。(教授の評価 4.3/5.0) 7. 公平性・プライバシーを守るAIやデータ処理ソフトウェアを開発。Pythonを使いアルゴリズムを実装。研究成果はオープンソースで公開することも。(教授の評価 2.7/5.0) 8. ハードウェアとソフトウェアを組み合わせた実験的セキュリティ開発。RFIDやスマートグリッド向けの実装も経験可能。(教授の評価 3.3/5.0)

  • 現在、就職活動を進める中で、将来のキャリアについて悩んでおります。 特に、総合商社への就職と、エンジニアとしてのキャリア(将来的には米国の大学院進学を含む)のどちらに進むべきか、迷いが生じております。 私の就活の軸としては、海外で活躍できることと高い報酬が得られることを重視しております。 商社の場合は、入社後に海外駐在を経験し、その後は責任ある役職でグローバルに活躍する道を考えております。 一方でエンジニアとしては、3年ほど実務経験を積んだ後、米国の大学院へ進学し、将来的には外資系企業での勤務を視野に入れております。商社の仕事内容よりエンジニアとしてコードを考えている方が好きです(センスがあるかは別として)が、日系企業として最も報酬がいい商社にも魅力を感じています。 理想としては、商社(エンジニア職はない)での経験を活かし、大学院を経てエンジニアとしても活躍できればと考えているのですが、外資系エンジニア職では実務経験が重視されると聞きます。そのため、商社に入社してからではエンジニアとしての経験がなく、方向転換が難しくなるのではという懸念もあります。 一方で、給与面では商社の方が有利なのではとも考えており、判断に迷っております。 お忙しい中大変恐縮ではございますが、もしお時間をいただけるようでしたら、 どちらのキャリアパスが私にとってより良い選択肢となるか、ご意見やご経験を伺わせていただければ幸いです。

  • 機械学習を学んでいる学生です。 わからないことがあり、どこで質問していいかわからなかったのでこちらに投稿しました(長文で申し訳ございません)。 わからないところは、"機械学習の設計や評価は恣意的すぎないか?"という点です。 ・例えばCNNのチャネル数は16, 32などのコンピュータで扱いやすい2の累乗に設定されることが多いが、17や18などでもっと良い結果が出ることを否定できていないのでは? ・他にもCNN層の後はプーリング層が続くことが多いが、別の層を挟むことでより良い結果が出ることを否定できていないのでは? ・また、モデルAよりもモデルBの方が精度が高いという論文が多いが、全てのパラメータの通りを全探索して比較しないと厳密に証明できないのでは? ・以上のようなことを論文の査読や発表の質問で指摘されたら、どう答えるべきか? 誤差伝播などの数理的な話はとても面白かったのですが、それ以降の話が構築的でなくてついていけなくなってしまいました。 なんとなくこの層を使い、なんとなくパラメータはこの数値、なんとなくこのモデルを使うといい結果が出るという感じで勉強を進めており、構築的でなくて不安です。 こんなことで悩んでいるのは自分だけでしょうか? それとも何かを読んで解決しているのでしょうか?

  • 小学校に上がる前からずっとゲームが好きで(マリオとかパロディウスとか)それでもゲーム作るのは自分には遠い世界の話だと思ってたんだけど、アニメのデジモン見てたら小学生がプログラミングしてたので「小学校からでもやればできるのでは??」と思い立ってからはパソコン雑誌などで関係ありそうな物を漁るようになりました。今思えばあまり効率的な学習とは言い難いですね…。

    5か月
  • 対面で話さなくてもブログのトラックバックで応酬するのは歓迎なんですけれど、そもそも彼の発信物に対する反論はさざんかぬふさんがいくつか既に書いていて、知る限りそれらに対して反論されて居ないのでそれらへの反論ポストを見てからですね。

    https://zenn.dev/339/articles/e3c174fdcc083e

    https://zenn.dev/339/articles/c5277131c50117

    7か月
  • 要件に基づいて設計した結果、注文サービス・倉庫サービス・商品サービスに分割するのが良い。という結論を出したのならそれで良いと思います。悪いのは「ECサイトを作るんだな?では詳細は知らんけどまずは注文サービス・倉庫サービス・商品サービスの3つを作るんだ!」のように教条主義的に設計するのが良くないという話です。設計の良し悪しはそもそも何らかの教条に沿っているかで評価するのではなく、将来的に保守する段階で実際にその設計が役立ったかによって論じられるべきだという意見を持っています。

    7か月
  • 呼べないと思います。Haskell詳しくないので何故に僕にレターを送ったのかよくわからないですが、僕の知る限りではそもそも「多くの解説ではそれらを包括して「純粋」と呼んで」はいないんじゃないかと思います。

    入力から出力が確定する特性いわゆる参照透過性が無いものは純粋とは呼ばないので、オブジェクトが内部に変数を持っていてそのメンバ関数を呼んでその変数が書き換わってその後の出力が変わるなら参照透過性は存在せず、よって純粋と呼べないと思います。Haskellでも標準入出力はIOであり参照透過ではないという扱いだった記憶です。

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

  • 消えません。

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

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

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

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

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

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

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

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

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

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

    11か月
  • いつも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 にコード片を入れています。ベンチマークを取っている時にタイトなループの内側でインライン化することを期待していた関数がやけに遅い時などに役立ちます。

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

    1年
  • 僕ならPostgreSQLを選びます。

    ローカルで立ち上がるのでアプリ開発中のデバッグが簡単なのとSpannerやAlloy DBやAurora PostgreSQL等のクラウドネイティブなRDBMSが互換インタフェースを備えている事が理由です。

    追記型という形を取っているため行内の更新が多いとインデックス側の更新が多くなりMySQLに乗り換えるUberのような事例もありますがそういうのは発生してから対策しても遅くないのでEarly Optimizationと割り切って行きます。

    2年