どうも上達の研究家のワタタクです。
クリエイティブコーディングやエンジニアリングの世界は、常に変化と不確実性に満ちています。「次にどんな技術が来るのか」「このバグをどうやって解決すべきか」と、日々頭をフル回転させている方も多いのではないでしょうか。
技術書やビジネス書を読んでインプットすることはもちろん大切です。しかし、それだけでは「どこかで見たことのあるアウトプット」に終始してしまうリスクもあります。
今回は、書籍『本を読む人はうまくいく(Amazon)』をエンジニア視点で読み解き、私たちがクリエイティビティを発揮するために「なぜ今、小説が必要なのか」、そして私が実践し始めた「ある習慣」についてご紹介します。
この記事を書いた人


上達の研究家 / アーティスト
「才能」ではなく「発見」で描く。文系・36歳からの上達ハック。
- ゼロから独学でクリエイティブコーディングに挑戦し、以下の実績を達成
- 開始1年8ヶ月目までに公募6つに挑戦し、3つ入選(勝率50%)
- KITTE大阪の18メートルあるAxCROSS大型スクリーン
- 虎ノ門ヒルズステーションタワーB2F TOKYO NODE エントランスサイネージで展示
- UN:O(東京大手町)にある会員限定のサテライトオフィスにて2作品常設展示
- 開始1年8ヶ月目までに公募6つに挑戦し、3つ入選(勝率50%)
- 開始1年9ヶ月目に、虎ノ門ヒルズ49階、地上250mのインフィニティプールへ作品提供・展示
- 実際の展示作品と動画、音楽やSEOでの実績はポートフォリオに載せております→https://my-portfolio-blue-three-63.vercel.app/works
なぜクリエイティブコーディングに「小説」が必要なのか?
最近の私は、気がつけばビジネス書や技術書ばかりを手に取っており、小説からしばらく離れてしまっていました。しかし、本書に出会い、その偏りにハッとさせられる一節がありました。
【引用】 小説が描く複雑な人間模様や予測不能な展開が、現実世界の不確実性を高めるのだろう(本を読む人はうまくいくKindle版 134ページ)
また、小説の読書が「抽象的思考能力」「異なる視点からの問題理解能力」「あいまいさへの耐性」を高めることはさまざまな研究からも推測できる。(本を読む人はうまくいくKindle版 135ページ)
この言葉、まさにクリエイティブコーディングに必要なスキルそのものだと思いませんか?
1. 「あいまいさへの耐性」が未知のコードを救う
のないビジュアル表現に挑戦するとき、私たちは常に「正解のわからない不確実性」に直面します。小説の予測不能な展開に触れることは、脳の「答えがない状態(カオス)に耐える筋肉」を鍛えてくれます。
2. 「抽象的思考能力」がコードの設計力をあげる
小説は、文字から情景や登場人物の感情を脳内でレンダリング(視覚化)する必要があります。この「具体的メッセージから抽象的なイメージを膨らませる」プロセスは、複雑なロジックをモジュール化したり、概念をコードに落とし込んだりするクリエイティブコーディングやエンジニアの抽象的思考にダイレクトに効いてきます。
3. 多ジャンルの読書が「掛け算」を生む
本を読む人はうまくいくを読んだことをきっかけに、私はビジネス書一辺倒をやめ、小説を含めた「いろいろなジャンルの本をあえて乱読する」ことに決めました。異なる分野のインプットが脳内で衝突したときにこそ、誰も思いつかないクリエイティブなアイデア(表現)が生まれるからです。
【やってみた】「うわ、できるかな?」の迷いを消す、毎日の振り返り
本を読んで「なるほど」で終わらせてはもったいない。そこで私は、自分の行動変容を起こすために内容を参考に新しい仕組みを導入しました。
私はほぼ毎日、1日の終わりに「振り返り」を行っています。 2026年7月8日(水)から、その振り返り項目に以下の新しい問いを追加することにしました。
「今日、何か新しいことに挑戦したか?」
行動のハードルを下げる仕組み
新しい技術に挑戦するとき、これまで読まなかったジャンルの本を開くとき、人間の脳はつい「うわ、自分にできるかな……?」と身構えてしまい、行動が遅くなりがちです。
しかし、「夜の振り返りで書くぞ」とあらかじめ決めておくことで、脳が自然と「何か新しい挑戦のネタを探すモード」に切り替わります。 大きな挑戦である必要はありません。「読んだことのない作家の小説を1ページめくった」「触ったことのないシェーダーのコードを1行書いた」、そんな小さな一歩を書き出す。
この習慣が、「できるかな?」という迷いを、「とりあえずやってみよう」という行動力に変えてくれると確信しています。
今日の1日の振り返りで書く新しいことは、「振り返りに、新しいことを書き始めた」だね。
異分野の衝突をProcessing(Java)で描いてみる
言葉だけではなく、今回の「多ジャンルの乱読による脳内の衝突」と「日々の振り返り」のコンセプトを、Processingのコードで視覚的に表現(レンダリング)してみました。
画面サイズは 1600 × 900 のキャンバスです。
- 左側(Grid): 規則的に並ぶビジネス書・技術書のインプット
- 右側(Chaos): 予測不能な形と角度で飛び交う小説のインプット
- 中央(Brain): それらが衝突し、「抽象的思考」「多角的な問題理解」「あいまいさへの耐性」へと昇華される脳内プロセス
- 下部(Reflection): 2026年7月8日からスタートする、毎日の振り返りパネル
実行した画面をクリックすると、新しい本が脳内にインプットされ、中央のオブジェクトの形状や「あいまいさ耐性メーター」が動的に変化します。
コード


// タイトル: Reading 'Saves' - A Creative Exploration
// ターゲット: 1600x900px, クリエイティブコーディング・エンジニア
int totalBooks = 0;
int novelCount = 0;
int technicalCount = 0;
int businessCount = 0;
float uncertaintyLevel = 0.5; // 小説を読むことで減少する
PVector abstractThoughtPosition = new PVector(400, 450);
PVector problemUnderstandingPosition = new PVector(800, 450);
PVector ambiguityTolerancePosition = new PVector(1200, 450);
String currentThought = "";
color bgColor = color(20);
color highlightColor = color(0, 255, 255); // シアン (技術/未来)
color novelColor = color(255, 105, 180); // ピンク (感情/人間模様)
color ambiguityColor = color(150, 150, 150); // グレー (あいまいさ)
int reflectionTimer = 0;
boolean isNewChallengeAttempted = false;
void setup() {
size(1600, 900);
randomSeed(12345); // 再現性のために
// 初期設定
noStroke();
textAlign(CENTER, CENTER);
// 最初の数冊を「読む」
for (int i = 0; i < 10; i++) {
readBook(random(1) > 0.3); // 最初はビジネス書が多い
}
}
void draw() {
background(bgColor);
drawUI();
drawReadingMetaphors();
drawBrainConnection();
drawReflectionPanel();
// あいまいさへの耐性を表現(時間経過で揺らぐ)
uncertaintyLevel = 0.5 + 0.1 * sin(frameCount * 0.05) - (0.01 * novelCount);
uncertaintyLevel = constrain(uncertaintyLevel, 0.1, 0.9);
}
void drawUI() {
fill(255);
textSize(32);
text("Reading 'Saves': Engineer's Creative Strategy", width/2, 50);
textSize(16);
fill(highlightColor);
text("Total Books Read: " + totalBooks, width - 200, 100);
fill(novelColor);
text("Novels: " + novelCount, width - 200, 130);
fill(200);
text("Other: " + (technicalCount + businessCount), width - 200, 160);
// 引用134-135ページのエッセンス
textSize(12);
fill(150);
text("Based on: \"本を読む人はうまくいく\" [134-135p]", width - 200, height - 30);
}
void drawReadingMetaphors() {
// 左側: 技術書/ビジネス書 (定量的、構造的)
drawStructureGrid(width/4, height/3, technicalCount, businessCount);
// 右側: 小説 (感情的、予測不能)
drawNovelChaos(3*width/4, height/3, novelCount);
}
void drawStructureGrid(float x, float y, int tech, int biz) {
int total = tech + biz;
int cols = 10;
int rows = (total / cols) + 1;
float s = 15;
for (int i = 0; i < total; i++) {
int c = i % cols;
int r = i / cols;
color bColor = (i < tech) ? highlightColor : color(180);
fill(bColor, 100);
rect(x - (cols*s)/2 + c*s, y - (rows*s)/2 + r*s, s-2, s-2);
}
fill(255);
textSize(18);
text("Technical/Business (Grid)", x, y - (rows*s)/2 - 20);
}
void drawNovelChaos(float x, float y, int count) {
for (int i = 0; i < count; i++) {
pushMatrix();
translate(x + random(-50, 50), y + random(-50, 50));
rotate(random(TWO_PI));
fill(novelColor, 80);
beginShape();
vertex(0, 0);
vertex(random(5, 15), random(2, 8));
vertex(random(10, 20), random(10, 20));
vertex(random(2, 8), random(5, 15));
endShape(CLOSE);
popMatrix();
}
fill(255);
textSize(18);
text("Novels (Chaos)", x, y - 70);
}
void drawBrainConnection() {
// 中央: 脳内接続 (引用のエッセンス)
// あいまいさへの耐性 (不確実性)
drawUncertaintyMeter(ambiguityTolerancePosition.x, ambiguityTolerancePosition.y);
// 抽象的思考
drawAbstractThought(abstractThoughtPosition.x, abstractThoughtPosition.y);
// 問題理解
drawProblemUnderstanding(problemUnderstandingPosition.x, problemUnderstandingPosition.y);
// 接続線
stroke(255, 50);
line(width/4, height/3, abstractThoughtPosition.x, abstractThoughtPosition.y);
line(3*width/4, height/3, abstractThoughtPosition.x, abstractThoughtPosition.y);
line(width/4, height/3, problemUnderstandingPosition.x, problemUnderstandingPosition.y);
line(3*width/4, height/3, problemUnderstandingPosition.x, problemUnderstandingPosition.y);
line(width/4, height/3, ambiguityTolerancePosition.x, ambiguityTolerancePosition.y);
line(3*width/4, height/3, ambiguityTolerancePosition.x, ambiguityTolerancePosition.y);
noStroke();
}
void drawUncertaintyMeter(float x, float y) {
float r = 100;
fill(ambiguityColor, 50);
ellipse(x, y, r*2, r*2);
fill(novelColor, 200 * uncertaintyLevel);
ellipse(x, y, r*2*uncertaintyLevel, r*2*uncertaintyLevel);
fill(255);
textSize(14);
text("Ambiguity Tolerance\n(novel input dynamic)", x, y - r - 20);
textSize(12);
fill(150);
text("(lower = better)", x, y + r + 20);
}
void drawAbstractThought(float x, float y) {
float s = 80;
pushMatrix();
translate(x, y);
rotate(frameCount * 0.01);
fill(highlightColor, 150);
rect(-s/2, -s/2, s, s);
fill(novelColor, 150);
ellipse(0, 0, s*0.8, s*0.8);
popMatrix();
fill(255);
textSize(14);
text("Abstract Thought\n(conceptual mix)", x, y - 70);
}
void drawProblemUnderstanding(float x, float y) {
float s = 80;
fill(255, 50);
rect(x - s/2, y - s/2, s, s);
fill(highlightColor, 180);
// 多角形で異なる視点を表現
int sides = 3 + (totalBooks % 5);
float radius = s/2;
beginShape();
for (int i = 0; i < sides; i++) {
float angle = TWO_PI * i / sides + (totalBooks * 0.1);
vertex(x + cos(angle) * radius, y + sin(angle) * radius);
}
endShape(CLOSE);
fill(255);
textSize(14);
text("Problem Understanding\n(multi-view perspective)", x, y - 70);
}
void drawReflectionPanel() {
// 下部: 毎日の振り返り (2026年7月8日〜)
float h = 150;
fill(30);
rect(0, height - h, width, h);
fill(255);
textSize(20);
text("Daily Reflection (Post July 8, 2026)", width/2, height - h + 25);
textSize(16);
if (isNewChallengeAttempted) {
fill(highlightColor);
currentThought = "Today's novel input catalyzed a new visual expression. (Challenge Attempted)";
} else {
fill(novelColor, 150);
currentThought = "Faced 'can I do it?' doubt today. Must attempt a *new* challenge tomorrow.";
}
text("\"" + currentThought + "\"", width/2, height - h/2);
// タイマー
reflectionTimer--;
if (reflectionTimer <= 0) {
reflectionTimer = 180; // 3秒
isNewChallengeAttempted = random(1) > (0.8 - 0.05 * novelCount); // 小説が多いと挑戦しやすくなる
}
// 2026年7月8日のマーク
textSize(10);
fill(200);
text("Start: 2026-07-08", 100, height - 10);
}
void readBook(boolean isNovel) {
totalBooks++;
if (isNovel) {
novelCount++;
} else {
if (random(1) > 0.5) {
technicalCount++;
} else {
businessCount++;
}
}
}
void keyPressed() {
if (key == 'n' || key == 'N') {
readBook(true); // 小説を読む
} else if (key == 'b' || key == 'B') {
readBook(false); // ビジネス/技術書を読む
} else if (key == 'c' || key == 'C') {
totalBooks = 0;
novelCount = 0;
technicalCount = 0;
businessCount = 0;
setup(); // リセット
}
}
void mousePressed() {
// インタラクション: クリックで新しい本を読む
readBook(random(1) > 0.5); // 半分小説
}まとめ:あなたの脳に、新しいレンダリングを
技術のアップデートが早いクリエイティブコーディングの世界だからこそ、一見遠回りに思える「小説」や「多ジャンルの読書」が、長期的なエンジニアの底力(抽象的思考やレジリエンス)になります。
もし最近、ビジネス書や技術書でお腹がいっぱいになっているなら、ぜひ1冊の小説を手に取ってみてください。そして、小さな「新しい挑戦」を日々記録していきましょう。
あなたの脳には、今どんな新しい景色がレンダリングされていますか?
本を読む人はうまくいく(Amazon)読んでみてくださいね。
それでは今日もレッツワクワクコーディング。

