面接で実装上の課題に遭遇した際にChatGPTを使って解決するというエンジニアを笑ってられない件について

こんにちは。Q太郎です。ChatGPT使ってますか?
私は毎日のように使っています。自分ですぐにコーディングに取り掛かるべき時でも、ChatGPTにもっと良い解決策はないか?自分の方針より良い判断がないかを聞くようにしています。もちろん、業務上の詳細な情報は入力しませんが。

Twitterでこんなつぶやきを見かけました。

確かに、なんでもかんでもChatGPTに質問して解決するのは難しいのです。
しかし、個人的にはそんなに笑ってる場合でもないよなぁという気持ちになりました。

私自身、結構ChatGPTを使ってるので、面接でChatGPT使ってって答えられると、どんな風に使ってますか?って乗り気になって、その人からもプロンプトを作る技を奪おうとしちゃうかも知れません。

ChatGPTは間違うけれど、、、

ChatGPTが間違った答えを出すかも知れない。ということをみんな恐れすぎなのでは?と僕は思っています。もちろん間違った答えを出すこともあるのですが、ブレイクダウンしていけばある程度は未知の抽象的な問題でも、ChatGPTで解決していけると思います。

抽象度の高い問題をChatGPTで扱うときに僕がどんな風にしてるか説明していきたいと思います。今回はよく面接で聞かれるらしいこの質問。「 Web ブラウザのアドレス欄に URL を入力し、エンターにキーを押してから起こることを説明してください」がお題です。

最初のプロンプト

「 Web ブラウザのアドレス欄に URL を入力し、エンターにキーを押してから起こることを説明してください」とChatGPTに入力してみました。

ウェブブラウザのアドレスバーにURLを入力し、エンターキーを押すと、以下のプロセスが起こります:URL解析: ブラウザは入力されたURLを解析して、アクセスすべきウェブサイトのアドレスを特定します。URLには、プロトコル(通常はhttpまたはhttps)、サーバーのアドレス(ドメイン名またはIPアドレス)、場合によっては特定のページやリソースへのパスが含まれます。
DNSルックアップ: ブラウザはドメインネームシステム(DNS)を使用して、ドメイン名(例:www.example.com )を対応するIPアドレスに変換します。これにより、ブラウザはウェブサイトのサーバーと通信できるようになります。
サーバーへのリクエスト: ブラウザは変換されたIPアドレスを使用してサーバーに接続し、HTTPまたはHTTPSプロトコルを通じてウェブページのデータをリクエストします。
サーバーからのレスポンス: サーバーはリクエストを受け取り、適切なレスポンス(通常はHTMLファイル)をブラウザに送り返します。場合によっては、リダイレクト、エラーメッセージ、またはその他の種類のレスポンスが送られることもあります。
ページの表示: ブラウザは受け取ったHTML、CSS、JavaScriptなどのデータを解析し、ユーザーにウェブページとして表示します。この過程で、画像やスタイルシートなどの追加リソースの読み込みも行われることがあります。
インタラクティブな機能: ページにJavaScriptやその他のインタラクティブな要素が含まれている場合、ブラウザはこれらを実行して、動的なユーザー体験を提供します。

この一連のプロセスは、一般的に非常に迅速に行われ、ユーザーは数秒以内にウェブページを閲覧できるようになります。

これが回答です。
口頭であればこの程度の説明ができれば、とりあえずは及第点でしょうか。
DNSやIP、HTTPS証明書などは色々と切り分けが簡単じゃないところもありますし、もう少し詳しく答えて欲しいところなど、ところどころ気になる回答もあります。

「TCP/IPやHTTPS証明書、HTTPあたりについてもう少し掘り下げて教えてください。」と入力してみました。

もちろんです。TCP/IP、HTTPS証明書、およびHTTPについてもう少し詳しく説明します。

TCP/IP(Transmission Control Protocol/Internet Protocol)概要: TCP/IPはインターネット通信の基本的なプロトコルセットです。IP(インターネットプロトコル)は、データパケットを正しい宛先にルーティングするためのメカニズムを提供します。TCP(トランスミッションコントロールプロトコル)は、データが正確かつ信頼性のある方法で送受信されることを保証します。
機能: IPは各デバイスに一意のアドレス(IPアドレス)を割り当て、インターネット上のデバイス間の通信を可能にします。TCPは接続指向のプロトコルで、データが損失、重複、または乱れることなく順序正しく到達することを保証します。データはパケットと呼ばれる小さな単位に分割され、目的地で再構築されます。
重要性: TCP/IPはインターネット通信の基盤であり、さまざまな種類のデータ(ウェブページ、電子メール、ファイル転送など)の送受信に使用されます。


HTTPS証明書概要: HTTPS証明書(SSL/TLS証明書とも呼ばれる)は、ウェブサイトが安全な通信を行っていることを証明するためのデジタル証明書です。
機能: HTTPS証明書は、サーバーが本物であることを証明し、データの暗号化を行います。これにより、ユーザーがサーバーに送信する情報(パスワード、クレジットカード情報など)は、中間者による傍受や改ざんから保護されます。
信頼性の確保: 証明書は認証局(CA)によって発行されます。ブラウザはCAが信頼できるかどうかを判断し、証明書が有効かつ信頼できるものである場合にのみ、安全な接続を確立します。


HTTP(Hypertext Transfer Protocol)概要: HTTPは、ウェブブラウザとウェブサーバー間の通信を行うためのプロトコルです。
機能: HTTPは「リクエスト-レスポンス」プロトコルです。ブラウザ(クライアント)はHTTPリクエストを送信し、サーバーはHTTPレスポンス(通常はHTML文書)で応答します。
非セキュアな通信: HTTPは暗号化されていないため、送受信されるデータは第三者によって容易に傍受や改ざんが可能です。そのため、セキュリティが必要な場合はHTTPSを使用することが推奨されます。


これらの技術は、インターネットの基盤を形成し、安全かつ効率的なオンライン通信を可能にする重要な要素です。

おっと、最初の質問を忘れてプロトコルだけの説明をさせてしまいました。プロンプトが悪かったですね。

ウェブブラウザのアドレスバーにURLを入力し、エンターキーを押してからウェブページが表示されるまでの流れを、TCP/IP、HTTPS証明書、HTTPを交えて説明します。URLの入力と解析:
ユーザーがアドレスバーにURLを入力し、エンターキーを押します。
ブラウザはURLを解析して、アクセスすべきウェブサイトのアドレスを特定します。
DNSルックアップ(TCP/IP):
ブラウザはTCP/IPプロトコルを使用して、URLのドメイン名を対応するIPアドレスに変換します。これはDNSルックアップと呼ばれます。
サーバーへのリクエスト(TCP/IP):
変換されたIPアドレスを使用して、ブラウザはサーバーに接続します。この接続はTCP(トランスミッションコントロールプロトコル)を使用し、信頼性のあるデータ転送を保証します。
安全な通信の確立(HTTPS証明書):
HTTPSを使用している場合、ブラウザはサーバーからHTTPS証明書を要求します。
ブラウザは証明書を検証し、サーバーの正当性とセキュアな接続を確立します。これにより、送受信されるデータは暗号化され、安全に保護されます。
HTTPリクエストの送信とレスポンスの受信:
ブラウザはHTTPプロトコルを使用してウェブページのデータをリクエストします。
サーバーはHTTPレスポンスとして、要求されたウェブページ(通常はHTMLファイル)をブラウザに送信します。
ページの表示とレンダリング:
ブラウザは受信したHTML、CSS、JavaScriptなどのデータを解析し、ユーザーにウェブページとして表示します。
必要に応じて、画像やスタイルシートなどの追加リソースの読み込みが行われます。
インタラクティブな機能の実行:
ページにJavaScriptやその他のインタラクティブな要素が含まれている場合、これらが実行され、動的なユーザー体験が提供されます。


この一連のプロセスは迅速に行われ、ユーザーは数秒以内にウェブページを閲覧できるようになります。TCP/IPはデータのルーティングと信頼性のある転送を担い、HTTPS証明書は安全な通信を保証し、HTTPはウェブページのデータのやり取りを可能にします。これらが組み合わさって、インターネットの基本的な機能と安全性を実現しています。

さらに、「上記をアドレスバーでエンターキーを教えてWebページが表示されるまでの流れに合わせて説明してください。」と説明を求めましたが、少し雑多な情報が含まれる状態になってしまいました。

失敗したのでリベンジ

また新しいプロンプトを立ち上げます。
このプロセスが大事です。自分も未知のものを理解しようと行なっているわけですから、この作業をしている間に、自分の脳もクリアになっていきます。

僕がよく使う手法に抽象的な問いを複数の具体的な問いに分割する方法です。
まずは「Web ブラウザのアドレス欄に URL を入力し、エンターにキーを押してから起こることを説明してください。」という内容をいくつかのステップに分割します。自分の脳みそでそれができない場合は、これもChatGPTに行ってもらいます。今回はそのパターンをやってみます。

「Web ブラウザのアドレス欄に URL を入力し、エンターにキーを押してから起こることを説明してください。 まず、詳細を答える前にそれぞれの処理をいくつかのフェーズに分割して、サマリーを教えてください。」と入力してみます。

ウェブブラウザでURLを入力してエンターキーを押すと、以下のフェーズに分けて処理が行われます:

URL解析とDNSクエリ: ブラウザは入力されたURLを解析し、対応するサーバーのIPアドレスを見つけるためにDNS(Domain Name System)に問い合わせます。
サーバーへのリクエスト: 解析されたIPアドレスを使用して、ブラウザはサーバーに接続し、ウェブページのデータを要求します。
データの受信と処理: サーバーからの応答として、HTML、CSS、JavaScriptなどのウェブページデータがブラウザに送信されます。ブラウザはこれらのデータを解析し、ページをレンダリングします。
ページのレンダリング: ブラウザは受信したデータを元に、ウェブページをユーザーに表示するためにレンダリングします。このプロセスには、レイアウト計算、スタイルの適用、スクリプトの実行などが含まれます。
インタラクティブな動作の可能性: ページにインタラクティブな要素(例えば、フォームや動的なコンテンツ)がある場合、それらはユーザーの操作に応じて動作し、場合によっては追加のデータをサーバーから取得したり、サーバーにデータを送信したりすることもあります。
これらのフェーズは、ユーザーがウェブページを閲覧する際の基本的な流れを表しています。各ステップは複雑で、多くのサブプロセスを含んでいます。

すると、このような問いが返ってきました。

これらを知ることができれば、それぞれを詳細に尋ねていくことができます。
DNSについては理解してると前提として、サーバーへのリクエストを詳細に尋ねてみます。

「あなたはGoogleの一流エンジニアです。ブラウザが入力されたアドレスからIPアドレスを特定してサーバーに接続するときに行われてることでできるだけ詳細に教えてください。」

Googleの一流エンジニアとして、ブラウザが入力されたアドレスからIPアドレスを特定してサーバーに接続するプロセスについて詳しく説明します。このプロセスはいくつかのステップに分かれています。URLの解析: ブラウザに入力されたアドレス(URL)は、まずプロトコル、ホスト名(ドメイン名)、パスなどに分解されます。例えば、https://www.example.com/pathというURLでは、httpsがプロトコル、www.example.comがホスト名、/pathがパスです。
DNSルックアップ: ブラウザはホスト名(ドメイン名)をIPアドレスに変換する必要があります。これはDNS(Domain Name System)ルックアップと呼ばれます。ブラウザはまずローカルのキャッシュを確認し、キャッシュにない場合はDNSサーバーに問い合わせます。DNSサーバーはドメイン名をIPアドレスに変換してブラウザに返します。
TCPコネクションの確立: IPアドレスが得られたら、ブラウザはそのサーバーとの間にTCP(Transmission Control Protocol)コネクションを確立します。このプロセスでは、通常「TCPハンドシェイク」と呼ばれる手順が行われます。
HTTPリクエストの送信: TCPコネクションが確立されたら、ブラウザはHTTP(HyperText Transfer Protocol)またはHTTPS(HTTP Secure)を介してリクエストを送信します。このリクエストには、要求するリソースのパス、ブラウザの種類、受け入れ可能なレスポンスの種類などの情報が含まれています。
サーバーからのレスポンスの受信と処理: サーバーはリクエストを処理し、レスポンスをブラウザに返します。このレスポンスには、リクエストされたデータ(HTMLページ、画像など)、ステータスコード、追加のヘッダー情報などが含まれています。
レンダリング: ブラウザは受け取ったデータを解析し、画面に表示するためにレンダリングを行います。HTMLはドキュメントを形成し、CSSはスタイルを適用し、JavaScriptはインタラクティブな要素を提供します。


この一連のプロセスは非常に迅速に行われ、ユーザーはほとんど待つことなくWebページを閲覧することができます。

かなり得たい回答に近いものが得られました。

もしわからない部分があったとしても、同じように何度も深掘りをしていけばブラウザでWebページを表示する時に行われてることを詳細に知ることができます。

「あなたはGoogleの一流エンジニアです」などもプロンプトの精度を上げるロールプレイプロンプトとして知られていますが、工夫の仕方はどんどん編み出されていますので、どんどん習得していきましょう。有名どころでは https://www.promptingguide.ai/ などがあります。

まとめ

生成AIがなかった時代は、「ブラウザがWebページを表示するまで」や「PCが電源ボタンを入れてから操作可能になるまで」に行われていることは、一つの本で短時間で学ぶものではなく、さまざまな本を読みながら少しずつ学ぶ知識でした。

しかし、生成AIが生まれた今では抽象的な質問をどんどん具体的な質問にブラッシュアップしていくことで、どんどん知識を得ることができます。

どう考えてもいくつもの本を読んで、知識を得ていくよりも、どんどん生成AIを活用して、自分の学ぶべき羅針盤を得てから、詳細な本や論文を読む方が学びのスピードが早いです。

というわけで、わからないことがあったときにChatGPTで解決してるエンジニアを馬鹿にできない件でした。

この記事が気に入ったらサポートをしてみませんか?