2/15/2017

Googleでのソフトウェア・エンジニアリング (2.6、2.7)

Googleでのソフトウェア・エンジニアリング」と題する論文。

2.6. プログラミング言語

Googleのソフトウェアエンジニアは、Googleで公式に認可された5つのプログラミング言語、C++、Java、Python、GoあるいはJavaScriptのうち一つでプログラムすることが強く推奨されている。使用されるプログラミング言語数を最小限に抑えることで、コードの再利用やプログラマのコラボレーションへの障害が少なくなる。

会社全体のコードが、スタイル、レイアウト、命名規則などが同じように記述されることを保証するため、各言語のGoogleスタイルガイドがある。さらに、コードの可読性(readability)について注意を払う経験豊かなエンジニアが、レビュー担当者が作者はその言語で可読なコードを書く方法が分かっていると確信するまで、変更あるいは一連の変更を十分にレビューすることで、特定の言語での可読で自然なコードを書く方法を他のエンジニアに訓練する全社的な可読性のトレーニングプロセスがある。特定の言語で重要な新しいコードを追加する変更は、それぞれその言語で可読性トレーニング・プロセスを合格した人によって承認されなければならない。

これらの4言語に加えて、特定な目的(例えば、ビルド・ターゲットや依存性を指定するために使われるビルド言語)のため、多くの専門のドメイン固有言語(DSL)が使われている。

これらの異なるプログラミング言語間の相互運用は、主にProtocol Buffersを使って行われている。Protocol Buffersは効率的だが拡張可能な方法で構造化データをエンコードする方法である。これらのオブジェクトの組み立て、アクセス、シリアライズ、デシリアライズのための記述を取り込み、C++、Java、Pythonでコードを生成するコンパイラと共に構造化データを規定するドメイン固有言語を含んでいる。GoogleのProtocol BuffersはGoogleのRPCライブラリに統合されており、RPCフレームワークによって自動的に処理される要求や応答のシリアライズやデシリアライズを行うことで、簡単に言語間のRPCを実現している。

プロセスの共通性は、コードベースが膨大で多様な言語であっても、開発を容易にするための鍵である: 通常のソフトウェア・エンジニアリング・タスク(例えば、チェックアウト、編集、ビルド、テスト、レビュー、コミット、バグ報告など)をすべて実行する単一のコマンドセットが存在する。そして、何のプロジェクトあるいは言語であろうと同じコマンドを使うことができる。開発者は、編集中のコードが異なるプロジェクトの一部であっても、異なる言語で書かれているというだけなので、開発者は新しい開発プロセスを習得する必要はない。

2.7. デバッグとプロファイル・ツール

Googleサーバは実行中のサーバをデバッグするための様々なツールを提供するライブラリにリンクされている。サーバがクラッシュした場合、シグナルハンドラが自動的にスタックトレースをログファイルにダンプすると同時にコアファイルを保存する。クラッシュがヒープメモリ不足によるものなら、サーバはライブ・ヒープ・オブジェクトのサンプリングされたサブセットの割り当てサイトのスタックトレースをダンプする。入力方向と出力方向のRPC(タイミング、エラー率、速度制限など)、コマンド行フラグ値の変更(例えば、特定のモジュールのロギングの詳細度を増すこと)、リソース消費、プロファイルなどを分析できるデバッグ用ウェブ・インタフェースも存在する。これらのツールは、gdbのような従来のデバッガを起動することが稀であるため、デバッグ全体としての容易さを大幅に向上させる。