『アイデアのつくり方』読書メモ     技術職にとっての創造の技術

こんにちは、中島です。
今回は、ジェームス・W・ヤングの名著『アイデアのつくり方』を読んだ感想と内容をまとめました。

この本はたった60ページほどと短く、一見すると軽く読めそうですが、実際には「良いアイデアはどのように生まれるか?」という根本的な問いに、非常に本質的なアプローチで答えてくれています。

この本を読んで「技術職にも通じる考え方だ」と強く感じました。
以下では、その内容と5つのステップ、そして読んで感じたことを詳しくご紹介します。

◆ アイデアとは「既存の要素の新しい組み合わせ」

著者ヤングは、アイデアとはまったくのゼロから生まれるものではなく、「既存の要素」を新しい視点で組み合わせたものだと述べています。

この考え方は、システム開発や設計、コードの改善など、日々何かしらの課題に向き合っているエンジニアにとっても非常に腑に落ちます。
私たちも、技術的な制約やユーザー要件といった“素材”をもとに、最適な組み合わせを探ることが日常的です。

◆ アイデアを生み出す5つのステップ

ヤングは、再現可能な形でアイデアを生み出す手法として、以下の5つのステップを提案しています。
ここではそれぞれのステップを、本の内容に加えて技術職としての視点から解釈しながら紹介します。

1. 【情報収集】あらゆる素材を集める

まずは、課題に関する情報を集めます。ヤングは、一般的な知識と専門的な知識の両方を意識的に集めるべきだとしています。

実務の中で言えば:

  • 過去のプロジェクト事例やベストプラクティスの調査
  • 使用中ライブラリの仕様確認、業務フローの把握、類似プロダクトの機能調査など

情報を幅広く集めておくことは、後の発想に大きく影響します。何か新しい提案を求められたとき、手持ちの知識の広さと深さで対応力が決まってくると実感しています。

2. 【情報の咀嚼】集めた素材を頭の中で整理し、関連づける

次に、集めた情報を「どう組み合わせると面白くなるか?」という視点で検討していきます。

実務との接点:

  • フレームワークの制約をどう機能設計に反映させるかを考える
  • 顧客のニーズと技術的制約をどう両立させるかを検討する
  • 既存の設計と、新しい要件の接続点を探る

この段階では、すぐに答えが出なくても、頭の中でいろんなパターンを試していくような作業になります。メモや図解などを活用しながら、思考を整理することが大切だと感じました。

3. 【孵化】一旦考えるのをやめて、無意識に任せる

情報を咀嚼したあとは、あえてその課題から距離を置きます。
意識的には考えるのをやめ、しばらく別のことをすることで、無意識が働く時間をつくります。

実感としては:

  • 帰り道やお風呂に入ってるときに、突然ひらめいた
  • 他の作業中に、さっきまで悩んでいた課題の糸口が見えてきた

「考え続けるよりも、意識から手放すことで思いつく」という経験は、誰しもあるのではないでしょうか。この“孵化の時間”を怖がらずに取ることも、発想力を鍛えるためには重要だと思いました。

4. 【ひらめき】ふとした瞬間にアイデアが生まれる

十分に準備と孵化の時間を経たあと、ある瞬間に「これだ!」というひらめきが訪れます。

例えば:

  • 設計で悩んでいた構成が、一つのクラス設計案を思いついたことで一気に整理された
  • APIの設計方針が、過去のドキュメントと照らしたときに「こう組み合わせればいい」と気づいた

この「点と点がつながる瞬間」は、何度経験しても気持ちが良いものです。

5. 【検証と具体化】現実に落とし込み、改善していく

最後に、ひらめいたアイデアを実行し、現実的に機能するかを検証します。ここで初めて、アイデアが「使えるもの」になるわけです。

例えば:

  • コードとして動かし、挙動を確認する
  • チームレビューを通して意見をもらい、改善点を見つける
  • プロトタイプで動かして、ユーザーの反応を見る

「良いアイデアかどうか」は、現実に実装・運用できるかどうかで初めてわかる。だからこそ、この最終ステップが非常に重要です。

◆ 読んで感じたこと

この本を通して、「アイデアの創出もスキルであり、再現性のあるプロセスで身につけられる」ということが、何よりの学びでした。

エンジニアという仕事は、与えられた仕様を実装するだけではなく、設計や提案の場面で「今あるものをどう活かすか」「よりよくするには何を変えるか」といった視点が求められます。

また、定期的にコードレビューやリファクタリングを行う中で、アイデアを出す機会も意外と多い。
そうしたときに、「情報を集め→咀嚼し→一度忘れ→ひらめき→検証」という流れを意識することで、感覚的だった“発想”が技術として扱えるようになると思います。

◆ まとめ

アイデアとは、既存の要素の新しい組み合わせで、それを生み出すには「5つの段階」があるのものだと思いました。

『アイデアのつくり方』は、クリエイティブな職業の人向けの本と思われがちですが、実は論理性と創造性の両方が求められる技術職にも非常に役立つ内容でした。

特に印象に残ったのは、「アイデアは天才のひらめきではなく、再現可能なプロセスで生み出せるものだ」という考え方です。

つまり、”アイデアを生み出す”という行為は、特別な才能がないとできないことではなく、正しいステップを踏めば誰でも実践できるものなのです。

「なんとなく」で考えていた発想も、5つのステップに沿って見直していくことで、もっと確実に、そして効率的に進められる。
そう思わせてくれる、技術職の人にもぜひ読んでほしい1冊です。

今回はここまで
最後までご覧いただきありがとうございました!

[PHP]PHP-Parserを用いたメタプログラミングについて

こんにちは。24年度入社の吉岡です。
案件で、システムで用いられているPHPソースコードとフレームワークのバージョンアップ作業を行いっています。作業の内容として大量に同様の変更を行いたい箇所があり、自分たちのチームはPHP-Parserを使用しました。PHP-Parserは今後の案件でも作業の効率化に役立ってくれると思いまので、共有させていただきます。

〇PHP-Parserとは
PHP-Parserは「PHPで書かれたPHPパーサー」のことです。
PHPパーサーはPHPソースコードをAST(抽象構文木)に変換し、変更を加え、変更後のASTをPHPソースコードに出力することができます。
AST(抽象構文木)は指定されたプログラミング言語の文法に従ってソースコードの構造を表す中間プログラムです。ソースコードのアイテムごとに対応するノードを用いて表現されます。

「手作業でよいのでは?」と思われるかもしれませんね。確かに変更箇所が少数であったり複雑な変更を加えたい場合は手作業の方が楽な場合も多いでしょう。
しかし、単純な変更を大量にしなければならない場合はどうでしょうか?
システム内のすべてのファイルに declare(strict_types=1); を追加したい」「システム内のすべての配列を、array() から [] に記述を統一したい」という場合に、手作業で行うと多くの時間が掛かりミスが生じやすくなってしまうかもしれません。

そんな時はPHP-Parserの使用を検討されてはいかがでしょうか?


〇PHP-Parserを用いた変更処理の流れ
1 PHPソースコードからASTへパース
2 ASTへ変更を加える
3 新ASTから新PHPソースコードへパース


*インストール
パースしたいPHPソースコードのバージョンによって、PHP-Parserのバージョンを選択してください。

・PHP-Parser 4.x
動作環境: PHP7.0以上で動く
サポート範囲: PHP5.2~8.3( PHP5.xの解析を完全にサポート)
https://github.com/nikic/PHP-Parser/blob/4.x/doc/0_Introduction.markdown

・PHP-Parser 5.x
動作環境:PHP7.4以上で動く
サポート範囲:PHP7~8( PHP5.xの解析も部分的にサポート)
https://github.com/nikic/PHP-Parser/blob/master/doc/0_Introduction.markdown

コマンド

1 PHPソースコードからASTへパース
PHPソースコードを取得し、パーサーを用いてASTへパースを行います。

・入力用PHPソースコード (inputSampleData.php)

・パース処理(changePhp.php)

・実行

・実行結果(変換されたAST)
コストコのレシートくらい長いですので、ざっと目を通していただければ十分です。「Stmt_Classってやつはクラス定義のことなんだろうな」「Expr_Array_って書いてあるから配列のなんだろうな」ぐらいでOKです。

ノードを用いて変更箇所を指定して、追加・変更・削除などの変更処理を行います。それぞれのノードクラス定義に関する詳細は、nikic/php-parserの公式ドキュメント(5.x版) または vendor/nikic/php-parser/lib/PhpParser/Node/ ディレクトリ配下から探してください。(どのクラスなのか名前で推測できるものが多いと思います)

2 ASTへ変更を加える
今回の本命である、パースされたASTに対して変更を行います。変更を行うにNodeVisitorクラスを基に任意の操作を行うクラスを作成し、「どのタイミングでどの操作を」定義します。

・変更処理セットして実行(changePhp.php 続き)

・PHPの厳密な型判定を設定する記述を追加するNodeVisitor(StrictModeRevisingVisitor.php)

・配列をarray()から[]に統一するNodeVisitor(ArrayKindRevisingVisitor.php)

これで変更を加えることができました。

3  新ASTから新PHPソースコードへパース

・changePhp.php 続き

・出力ファイル(outputSampleData.php)

変更できました。ただこの記述だとパース時に空欄削除などのフォーマットが行われます。

元のソースコードの書式を保ったままパースする記述を載せておきます。

・変更処理セットして実行(changePhpNoFormat.php)

・実行結果

入力したPHPソースコードと同じく、クラスメソッドが値を返す処理の前に空欄行が残したままにできていますね!

〇おわりに
プログラミングやITの知識だけではなく、「必要な情報を得る力」は本当に重要ですね。特に、ネットの記事で親切丁寧に紹介されていない知識を得たい場合や古いドキュメントから使用を知りたい場合などだと、自分の「必要な情報を得る力」のなさを痛感することが多くあります…
今後AIがより身近になってきて仕事上でも活用しそうだからこそ、検索の仕方や質問の仕方をより一層鍛えていきます!

・参考にさせていただいた記事
https://www.komtaki.com/posts/php-meta-programming-introduction
https://qiita.com/ktplato/items/23ad2893d741bfb564f9meta-programming-introduction

https://qiita.com/ktplato/items/23ad2893d741bfb564f9