7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「言語◯年」だけで採用を判断するのは解像度が低い

7
Posted at

はじめに

転職活動の募集要項などで「 PHP実務経験3年以上 」というのを見たことありませんか?

「PHP実務経験3年以上」という線引きはとても抽象的なので、3年以上携わっているがコードをあまり書いたことが無い人は対象、Pythonで10年以上の経験があるエンジニアが対象外になっています。

これだと、せっかくの優秀なエンジニアを見逃してしまう問題があります。

私自身も、JavaScriptは10年だけどVueは3年以下(個人開発のみ)ということで諦めた経験があり、企業の採用担当やSESの営業などにこの問題が届けばいいなと思います。

改善したいこと

「PHP実務経験3年以上」という条件はとても抽象的です。Laravel(フレームワーク)を使ってWebアプリを開発してきたのか、WordPress(CMS)でサイト制作をしてきたのかで、求められる能力はまったく違います。同じ「PHP3年」でも、DBまわりの設計に強い人もいれば、画面まわりのカスタマイズに強い人もいます。

一方で、Pythonで画像解析を10年やってきた人は、PHPの実務経験がゼロでも「画像処理」や「画像を扱うロジック」を組む能力はすでに持っています。

つまり、「PHP3年以上」という条件だけで足切りをしてしまうと、こうした優秀なエンジニアが応募条件に引っかからず、仕事の幅が狭まってしまうケースが起きているのではないかと思います。これは候補者にとってもったいないですし、本来ならマッチできたはずの案件を紹介できていないという意味で、仲介する側にとっても機会損失なのではないでしょうか。

こう考えていくと、「言語」という単位だけで技術力を語るのはちょっと解像度が低いなと思いました。「どの言語で」「どんな用途のことをやってきたか」 を軸にすれば、言語をまたいだ経験ももっと具体的に説明できるのではないかと思い、視覚化してみました。

作成したもの

「言語 × 用途」の2軸でライブラリを一覧できるライブラリマトリックス表 をGithub Pagesで公開しています。

Web画面

image.png

縦軸に言語(PHP、Python、JavaScriptなど)、横軸に用途(フレームワーク、画像処理、AI・機械学習、DB操作など)を並べて、それぞれのマス目に該当するライブラリ名を表示しています。(ライブラリは比較的有名なもののみにしています)

例えば、PHPでスクレイピングをしていたエンジニアは、Pythonのスクレイピングもほぼやり方は一緒なので、Pythonの beautiful Soup も少し勉強すれば習得できるという判断ができます。

用途カテゴリ一覧

横軸の「用途」は、独自の判断で26カテゴリに分類してみました。
カテゴリの粒度は「実務でよく聞かれる技術要素」を基準に、細かすぎず大きすぎない単位を意識して分けています。

足りないものがあればご指摘いただければと思います。

No. 名称 説明
1 CMS コンテンツ管理システム、ヘッドレスCMS
2 フレームワーク Webフレームワーク、アプリケーションフレームワーク
3 テスト ユニットテスト、E2Eテスト、モック
4 画像処理 画像変換、リサイズ、最適化
5 スクレイピング Webスクレイピング、クローリング
6 AI・機械学習 機械学習、LLM、自然言語処理
7 DB操作 ORM、クエリビルダー、マイグレーション
8 タスク管理 ジョブキュー、バックグラウンド処理
9 認証・認可 ログイン、JWT、OAuth
10 HTTP通信 APIリクエスト、GraphQL
11 バリデーション 入力検証、スキーマ定義
12 日付・時間 日付操作、フォーマット、タイムゾーン
13 ファイル操作 アップロード、パース、ストレージ
14 メール送信 SMTP、テンプレート
15 決済 Stripe、PayPal連携
16 検索 全文検索、あいまい検索
17 ログ・監視 ロギング、エラートラッキング
18 UIコンポーネント コンポーネントライブラリ
19 状態管理 グローバルステート管理
20 国際化 多言語対応、翻訳
21 リアルタイム通信 WebSocket、イベント駆動
22 PDF操作 PDF生成、パース、編集
23 動画・音声 メディア処理、ストリーミング
24 ユーティリティ 汎用ヘルパー関数
25 CLI作成 コマンドラインツール作成
26 グラフ・可視化 チャート、データ可視化

システム構成

Nuxt3で作成しており、マトリックス表は、以下のようなファイル構成になっています。
(現在はDBを使用していませんが、今後移行予定です)

├── types/
│   └── index.ts          # ライブラリ1件分のデータ形式を定義
├── data/
│   └── libraries/
│       ├── index.ts      # 横軸(カテゴリ)の一覧を定義
│       ├── php.ts        # PHPのライブラリ一覧
│       ├── python.ts     # Pythonのライブラリ一覧
│       └── ...           # その他言語ごとにファイルを分割
└── pages/
    └── libraries.vue      # 縦軸×横軸を掛け合わせて表を描画

「型を決める」「横軸を用意する」「縦軸を用意する」「掛け合わせる」という4ステップで表ができあがっているので、この順番でコードを見ていきます。

実装

① データの形式を決める

まず、ライブラリ1件分がどんな情報を持つかを型として定義します。

types/index.ts
export interface Library {
  id: string
  name: string
  category: LibraryCategory   // 用途(横軸)
  language: 'php' | 'python' | 'javascript' | ...  // 言語(縦軸)
  description: string
  officialUrl?: string
  packageName?: string
  features?: string[]
}

ポイントは categorylanguage の2つのプロパティです。この2つがそれぞれ表の列と行に対応するので、ライブラリを1件追加するたびに「どの言語の」「どの用途に」属するかが自動的に決まる仕組みになっています。

② 横軸(用途)を用意する

用途カテゴリは、以下のように一覧として定義しています。

data/libraries/index.ts
export const libraryCategories: LibraryCategoryInfo[] = [
  { id: 'framework', name: 'Framework', nameJa: 'フレームワーク',
    description: 'Webフレームワーク、アプリケーションフレームワーク' },
  { id: 'image', name: 'Image', nameJa: '画像処理',
    description: '画像変換、リサイズ、最適化' },
  // ... 全26カテゴリ
]

ここに1件追加するだけで、表の列が1つ増えます。「PHP3年」の中身を分解する軸(フレームワークなのかCMSなのか画像処理なのか)は、すべてこの配列で管理しています。

③ 縦軸(言語)ごとにライブラリを用意する

言語ごとにファイルを分けて、その言語の代表的なライブラリを①の型に沿って登録します。

data/libraries/php.ts
// data/libraries/php.ts
export const phpLibraries: Library[] = [
  { id: 'php-laravel', name: 'Laravel', category: 'framework', language: 'php',
    description: '最も人気のPHPフレームワーク。Eloquent ORM、Blade' },
 
  { id: 'php-intervention', name: 'Intervention Image', category: 'image', language: 'php',
    description: '画像処理ライブラリ。GD/Imagick対応' },
  // ...
]

④ 縦軸×横軸を掛け合わせて表にする

最後に、①〜③で用意したデータを使って、表の各マス目に該当するライブラリを表示します。処理自体は「言語と用途が一致するものを絞り込むだけ」というシンプルなものです。

pages/libraries.vue
const getLibsForCell = (language: string, category: string): Library[] => {
  return libraries.filter(
    lib => lib.language === language && lib.category === category
  )
}

これをテーブルの行(言語)×列(用途)の組み合わせごとに呼び出すことで、マス目ごとに該当するライブラリが並びます。

まとめ

こうして表にしてみると、「PHPはWeb系フレームワークの選択肢が豊富だがAI・機械学習はほぼ無い」「PythonはAI・機械学習が圧倒的に強いがCMS系は薄い」といった、言語ごとの得意不得意が一目でわかるようになりました。

冒頭で触れた「JavaScript10年だけどVueは3年以下だから諦めた」という自分の経験も、この表に当てはめれば「JavaScriptで培ったDOM操作・非同期処理・状態管理の経験は、Vueのどの用途カテゴリにもほぼそのまま活きる」と説明できます。つまり「Vue経験3年未満」という条件だけでは見えなかった強みが、用途で分解することで可視化できるわけです。

スキルシートに「PHP3年」「Python5年」と書くだけでなく、「用途」という軸を意識するだけで、実際の技術が具体化されたり、興味のある範囲が理解できたりします。

言語名だけでなく「どんな用途を経験してきたか」で会話できるようになれば、ミスマッチが減ると思うので、この内容が頭の片隅でも記憶して貰えればいいかなと思います。

おわりに

今回は、ライブラリマトリックスを作成しました。
このサービスを開発する過程で、触ったことの無い分野や言語を知ることができました。
自分が触れてきた技術はIT技術全体からするとごく一部でしかないんだな、と改めて実感しました。

足りないライブラリや言語などもあると思うので、気づいた方はGitHubのIssue、もしくはこの記事のコメントで教えていただけると嬉しいです!

今回紹介したWEBサービスでは、ライブラリマトリックスだけではなく、「言語やライブラリやツールやクラウドでの技術などを一覧で表示」したり、「プログラミング言語の関係性や思想を受け継いでいるか」なども整理しているのでぜひ触ってみてください。

WEBサイト

Github リポジトリ

ここまで読んでいただきありがとうございました!

7
5
0

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
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?