6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「お前のコードはゴミだ」と言い放った先輩エンジニアを、自動テストで完全論破した話

Last updated at Posted at 2025-06-25

「お前のコードはゴミだ」と言い放った先輩エンジニアを、自動テストで完全論破した話

はじめに

この記事は、技術的な復讐劇です。パワハラ気質の先輩エンジニアに散々馬鹿にされ続けた新人の僕が、最終的に技術力で完全勝利を収めた実話をお話しします。

登場人物

  • :入社2年目のバックエンドエンジニア
  • 田中先輩(仮名):入社5年目、チームリーダー格、プライド高め
  • 佐藤部長(仮名):開発部長、技術に詳しい

事の発端:コードレビューという名の公開処刑

入社して1年が経った頃、僕が書いたユーザー認証機能のコードレビューで事件は起きました。

// 僕が書いたコード(当時)
function validateUser(username, password) {
    if (!username || !password) {
        return { success: false, message: "入力が不完全です" };
    }
    
    const user = getUserFromDB(username);
    if (!user) {
        return { success: false, message: "ユーザーが見つかりません" };
    }
    
    if (bcrypt.compareSync(password, user.hashedPassword)) {
        return { success: true, user: user };
    } else {
        return { success: false, message: "パスワードが間違っています" };
    }
}

田中先輩は僕のプルリクエストを見るや否や、チーム全体のSlackチャンネルでこう発言しました。

田中先輩:「@新人君 このコードはゴミですね。エラーハンドリングもセキュリティも何も考えてない。こんなコードを本番に上げるつもりですか?新人のくせに生意気にPR出す前に、もっと勉強してください。」

チーム全員が見ているチャンネルでの公開処刑。僕は顔から火が出る思いでした。

エスカレートする嫌がらせ

それから田中先輩の僕への風当たりは日に日に強くなりました。

  • コードレビューでは必ず「センスがない」「基礎ができてない」とコメント
  • 会議では僕の発言を遮って「それは違う」と否定
  • 僕が質問すると「そんなことも知らないの?」と小バカにした態度

そして決定的だったのが、3ヶ月後のチーム会議でのこの発言でした。

田中先輩:「新人君のコードはいつもバグだらけで、僕が毎回直してあげてるんです。正直、戦力になってません。」

この時、僕は心の中で誓いました。**「絶対に見返してやる」**と。

密かな特訓期間

僕は毎日終電まで残って勉強し、技術を磨きました。

  • TypeScriptの型安全性を徹底的に学習
  • Jest/Vitestでのテスト駆動開発をマスター
  • セキュリティベストプラクティスを習得
  • CI/CDパイプラインの構築方法を研究

そして半年後、ついにチャンスが訪れました。

運命の新プロジェクト

会社の基幹システムをリニューアルするプロジェクトが始まることになり、田中先輩と僕がメインの担当者に指名されました。

田中先輩は相変わらず僕を見下した態度で、こう言いました。

田中先輩:「新人君には簡単な画面作成をお任せします。重要なAPI設計は僕がやりますから。」

しかし、僕には秘策がありました。

秘密兵器:完璧な自動テスト環境

僕は密かに、プロジェクト全体をカバーする包括的なテスト環境を構築していました。

// 僕が密かに書いていたテストコード
describe('ユーザー認証API', () => {
  describe('田中先輩実装分', () => {
    test('SQLインジェクション脆弱性テスト', async () => {
      const maliciousInput = "admin'; DROP TABLE users; --";
      const response = await request(app)
        .post('/api/auth')
        .send({ username: maliciousInput, password: 'test' });
      
      // 脆弱性があることを確認
      expect(response.status).toBe(500); // エラーになる
    });

    test('パスワード平文保存チェック', async () => {
      const user = await getUserFromDB('testuser');
      // まさかの平文保存が発覚
      expect(user.password).not.toBe('plaintext123');
    });

    test('レート制限テスト', async () => {
      // 100回連続でリクエスト
      const promises = Array(100).fill().map(() => 
        request(app).post('/api/auth').send({ username: 'test', password: 'test' })
      );
      
      const responses = await Promise.all(promises);
      // レート制限が実装されていない
      expect(responses.every(r => r.status !== 429)).toBe(true);
    });
  });
});

決戦の日:デモンストレーション

プロジェクトの中間報告会の日がやってきました。田中先輩は自信満々でプレゼンを始めました。

田中先輩:「新人君の担当分は正直品質が心配でしたが、僕がしっかりレビューしたので大丈夫です。僕の担当したAPI部分は完璧な実装になっています。」

そして僕の番が来ました。

:「それでは、プロジェクト全体の品質を可視化するために、自動テストの結果をお見せします。」

スクリーンに映し出されたテスト結果:

テスト結果サマリー
==================
田中先輩担当分:
❌ セキュリティテスト: 15/23 FAILED
❌ パフォーマンステスト: 3/8 FAILED  
❌ エラーハンドリング: 12/18 FAILED

新人担当分:
✅ 全テスト: 127/127 PASSED
✅ カバレッジ: 98.7%
✅ セキュリティスコア: A+

会議室が静まり返りました。

田中先輩の反撃と完全論破

田中先輩は顔を真っ赤にして反論しました。

田中先輩:「テストなんて飾りです!実際の動作が重要なんだ!新人のテストなんて信用できない!」

そこで僕は、用意していた最後の切り札を出しました。

:「では実際に、田中先輩のAPIにペネトレーションテストを実行してみましょう。」

リアルタイムで実行されるセキュリティテスト。SQLインジェクション、XSS、CSRF、すべての攻撃が成功してしまいました。

極めつけは、田中先輩が「セキュアに実装した」と豪語していたパスワード認証機能で、パスワードが平文でデータベースに保存されていることが発覚したことでした。

佐藤部長の判定

佐藤部長が重々しく口を開きました。

佐藤部長:「田中君、これは看過できない問題です。セキュリティホールだらけのコードを『完璧』と言い張るのは、エンジニアとしてあり得ない。一方、新人君のコードは非常に高品質で、テスト設計も素晴らしい。今後このプロジェクトは新人君にリードしてもらいます。」

田中先輩の顔は真っ青になりました。

佐藤部長:「田中君には、新人君からコードレビューとテスト手法について学んでもらいます。」

完全に立場が逆転した瞬間でした。

その後の展開

プロジェクトは僕主導で進むことになり、大成功を収めました。田中先輩は僕に頭を下げ、技術的なことを質問するようになりました。

そして半年後、僕は昇進してチームリーダーに。田中先輩は別のチームに異動となりました。

技術的な学び

この経験で学んだことをまとめます:

1. テスト駆動開発の威力

// Before: テストなしのコード
function processPayment(amount, cardNumber) {
    // 実装だけして終わり
    return chargeCreditCard(amount, cardNumber);
}

// After: テストファーストなコード
describe('決済処理', () => {
    test('無効なカード番号で例外が発生する', () => {
        expect(() => processPayment(1000, 'invalid')).toThrow();
    });
    
    test('金額が0以下で例外が発生する', () => {
        expect(() => processPayment(-100, validCard)).toThrow();
    });
});

function processPayment(amount: number, cardNumber: string): PaymentResult {
    if (amount <= 0) throw new Error('金額が無効です');
    if (!isValidCardNumber(cardNumber)) throw new Error('カード番号が無効です');
    
    return chargeCreditCard(amount, cardNumber);
}

2. 静的解析ツールの活用

// ESLint + TypeScriptで品質を担保
module.exports = {
  extends: [
    '@typescript-eslint/recommended',
    'plugin:security/recommended'
  ],
  rules: {
    'security/detect-sql-injection': 'error',
    'security/detect-xss': 'error'
  }
};

3. CI/CDでの自動品質チェック

# GitHub Actions
name: Quality Check
on: [pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Run Tests
        run: npm test
      - name: Security Audit
        run: npm audit
      - name: Code Coverage
        run: npm run coverage

まとめ

技術力は嘘をつきません。口だけでなく、実際に動くコード、テスト、セキュリティ対策で勝負すれば、必ず正当な評価を受けられます。

もし今、理不尽な扱いを受けているエンジニアの方がいたら、技術を磨いてください。そして適切なタイミングで、その技術力を証明してください。

最終的に勝つのは、本当の技術力を持った人です。


※※※ 注: この記事はAI記事です ※※※

スカッと系コンテンツってありますよね。因果応報的というか、カタルシス系というか。
こういうのってたぶん人間はどうしても気になっちゃうんだろうなーと思って、それを技術系記事で書かせたらどうなるんだろうって思ってやってみたのが本記事です。
やってみた感想ですが、やっぱり読んじゃいますね。なんなんでしょうね。なんか嫌です。こういうの読んじゃうの。これも人間の性なのでしょうか。
思えば古今東西スカッと系コンテンツってありますよね。さるかに合戦もシンデレラも、言ってしまえばスカッと系ですし。
そういう本能的なのを刺激するのが売れる商品ってやつなのかもしれないけど、倫理的にどうなのかって視点も大事だなと思います。
この記事も倫理的にどうなんって思いながら投稿してます。AI記事ですって書くのもこのように最後に書いてるし。
まあでも、言わないよりはいいかなって思ったりしてます。
スカッとしたとかイラッとしたとか、コメントいただけたら幸いです。

6
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?