『プリンシプル オブ プログラミング』を10問で学べるクイズサイト

コードレビュー道場 #3
落ちるコードを非機能要件で鍛え直せ!

公開日:
最終更新日:

このページでは、『プリンシプル オブ プログラミング』で登場する非機能要件(性能・信頼性・保守性など)の視点を、実際のコード断片を使ったコードレビュー形式の4択クイズで体験します。

負荷がかかるとすぐ落ちる処理や、タイムアウトしがちなAPI、ログも残さず例外を握りつぶすコードなど、「なぜ落ちるのか/なぜつらいのか?」を読み解きながら、本番環境でも踏ん張れるコードへ鍛え直す感覚を身につけていきましょう。

今すぐクイズに挑戦
(10問・約3分・解説つき)
プリンシプルオブプログラミング
1分で理解&101の原則総まとめ!

目次

  1. クイズに挑戦する(10問)

  1. プログラミング クイズ一覧へ
  2. コードレビュー道場 目次へ
  3. 次のクイズへ(DRY/KISSで太りすぎた関数を救え!)
  4. 前のクイズへ(密結合な設計を疎結合に変えよ!)
  5. 『プリンシプル オブ プログラミング』101の原理・原則総まとめ

  1. 参考文献・出典
  2. このページの著者
  3. シェア

コードレビュー道場 #3~落ちるコードを非機能要件で鍛え直せ!~

1. 次のコードは、ダッシュボード表示のたびに重い集計処理を実行しています。性能とスケーラビリティの観点から、もっとも有効な改善はどれでしょうか?

function renderDashboard(userId) {
  const stats = calculateAllStats(userId); // 重い処理
  return buildHtml(stats);
}

2. 次のコードは、すべてのジョブが毎分ぴったりのタイミングで重い処理を走らせる設計になっています。他のサービスも同じタイミングで動くと、一時的な負荷スパイクを招く可能性があります。非機能要件(安定性・スループット)の観点から、もっともよい改善はどれでしょうか?

// 毎分0秒に実行される
setInterval(runJob, 60 * 1000);

function runJob() {
  // 重い集計処理
}

3. 次のコードは、エラーが発生した場合にローディング表示が消えず、ユーザーが操作不能な状態になる可能性があります。ユーザビリティと信頼性の観点から、もっとも重要な改善はどれでしょうか?

async function loadData() {
  showLoading();
  const res = await fetch('/api/data');
  const data = await res.json();
  hideLoading();
  render(data);
}

4. 次のコードは、大量のアイテムを描画するときにブラウザが固まりやすくなります。性能とユーザビリティの観点から、もっとも効果が大きい改善はどれでしょうか?

function renderList(items) {
  const container = document.getElementById('list');
  container.innerHTML = '';
  items.forEach(item => {
    const li = document.createElement('li');
    li.textContent = item.name;
    container.appendChild(li);
  });
}

5. 次のコードは、重い処理のたびに詳細なログを出しており、高負荷時にログI/O自体がボトルネックになる恐れがあります。性能と運用性のバランスをとるために、もっとも適切な改善はどれでしょうか?

function processItem(item) {
  console.log('START PROCESS', item);
  doHeavyWork(item);
  console.log('END PROCESS', item);
}

6. 次のコードは、機能フラグを毎回リモートから取得しており、外部サービス障害時にアプリ全体が影響を受けやすくなっています。信頼性と性能の観点から、もっとも適切な改善はどれでしょうか?

async function getFeatureFlags() {
  const res = await fetch('https://flags.example.com/config.json');
  return res.json();
}

7. 次のコードは、典型的なN+1クエリ問題を抱えています。性能とスケーラビリティの観点から、もっともインパクトの大きい改善はどれでしょうか?

async function listOrdersWithUser(db) {
  const orders = await db.query('SELECT * FROM orders');
  for (const order of orders) {
    const rows = await db.query(
      'SELECT * FROM users WHERE id = ?',
      [order.user_id]
    );
    order.user = rows[0] ?? null;
  }
  return orders;
}

8. 次のサーバーコードは、リクエストのたびに同期的なファイル読み込みを行っています。負荷が高まると応答が極端に遅くなる危険があります。スループットと応答性の観点から、もっとも有効な改善はどれでしょうか?

const fs = require('fs');

function handleRequest(req, res) {
  const content = fs.readFileSync('./template.html', 'utf8');
  res.end(content);
}

9. 次のコードは、グローバル変数に状態を持っており、並行リクエストが増えると値の整合性が崩れやすくなります。信頼性とスケーラビリティの観点から、もっとも適切な改善はどれでしょうか?

let currentCount = 0;

async function handleRequest(req, res) {
  currentCount++;
  // いろいろな処理...
  res.end('count: ' + currentCount);
}

10. 次のコードは、重い計算をクリックイベント内で同期的に実行しており、UIを長時間フリーズさせる可能性があります。ユーザビリティと応答性の観点から、もっとも適切な改善はどれでしょうか?

function handleClick() {
  let sum = 0;
  for (let i = 0; i < 1_000_000_000; i++) {
    sum += i;
  }
  alert(sum);
}

次のクイズ(DRY/KISSで太りすぎた関数を救え!)へ

落ちるコードを非機能要件で鍛え直せ!
採点結果

正答率:0%

-

-

参考文献・出典

  • プリンシプル オブ プログラミング ~3年目までに身につけたい一生役立つ101の原理原則~
  • 上田 勲(著)/秀和システム/第1版14刷/2025年/ISBN978-4-7980-4614-3

※本ページは学習支援を目的とした要約です。実務適用時は原典もご参照ください。

このページの著者

もちもちみかん(システムエンジニア)

社内SEとしてグループ企業向けの業務アプリを要件定義〜運用まで一気通貫で担当しています。

経験:Webアプリ/業務システム

得意:PHP・JavaScript・MySQL・CSS

個人実績:フォーム生成基盤クイズ学習プラットフォーム

詳しいプロフィールはこちら!  もちもちみかんのプロフィール

もちもちみかん0系くん
TOPへ

もちもちみかん.comとは


このサイトでは、コーディングがめんどうくさい人向けのお助けツールとして、フォームやCSSをノーコードで生成できる、
 もちもちみかん.forms
 もちもちみかん.css1
 もちもちみかん.css2
と言ったジェネレーターを用意してます。

また、このサイトを通じて、「もちもちみかん」のかわいさを普及したいとかんがえてます!