aka.love(programming)
どうもakaです. ふと, 「どうして私はプログラミングが好きなのだろう?」と思ったので, 言語化してみました.
この記事では, 私がプログラミングに夢中になったきっかけや, どういう思考の変遷を辿ったかも踏まえて振り返ってみます.
aka.showHistoryAbout(programming)
きっかけはゲーム🎮
私は一人っ子で, さまざまなおもちゃを与えられ, 一人でよく遊ぶ子どもでした.
保育園の頃, たまたま従兄弟からゲーム機を譲り受けたのですが、それをきっかけにゲームの世界にのめり込むようになりました. ドラゴンクエストに熱中し, 両親がいる時はテキストが出るたびに「この漢字なんて言っているの? 」と聞いて, 疲れさせていたのを覚えています😅
小学生になってもゲームに熱中し, あるとき"PAR"や"コードフリーク"といった改造ツールの存在を知って購入しました. 信長の野望であらゆる値を65535(FFFE)にしたり, ポケモンでありえない数値を入れて無双したり, バグらせたりしていました😃
もちろん, こんな子どもだったので将来はゲームプログラマーになりたいと思っていました. しかし, 当時はどうやって勉強するかの情報が少なく, どこでゲームについて学べるのかもわからなかったため, 高校卒業までは普通校で勉強・部活動・ゲームなど, 気の赴くままいろいろなことをやっていました.
初めてのプログラミング 💻
私が初めてプログラミングに触れたのは, 大学に入学してからでした. 最初に習ったのはC言語です. 四則演算を学んだときに「電卓アプリ(CLI)を作れるのでは?」と思い立ち、実際に不格好ながらも作ってみました(bcコマンドのようなものの劣化版といった感じです).
その後, 「Unity」というゲーム作成ツールの存在を知り, 独学でいくつかゲームを制作しました. 入学して1〜2か月目にはGameJamにも参加したのですが, 当時は右も左も分からず, 先輩に教わりながらなんとか形にしたことを思い出します.
大学時代は個人でゲームを4~5個ぐらい作っていたのですが, 公開せず途中で投げ出してしまいました. というのも, 私は絵や音楽, 3Dモデリングなどにはまったく魅力を感じず, 勉強する気が出ませんでした. そして, そこら辺を手抜きして作成したゲームなどウケないと思ったからです. ただプログラミングはとても楽しく, 講義の課題でも「あぁ工夫したらどうだろうか」などと気合を入れて取り組んでいました.
この時, 私はゲームを作ることに楽しさを見出せず, どうプログラムを綺麗に作るかを独学していました. 当時の私はアーキテクチャ設計を知ないため, 今の私から見れば綺麗も何もないのですがw 適当にメソッドを作ってコードを分割したり, 変数名を適切に直したりなど, 可愛いことをしていました.
AIやブロックチェーンなども勉強していました. ほとんど忘れましたが😅
ちなみに研究は分散アルゴリズムです. Paxosを勉強したり, 実装したりしていました. Raftも実装したかったですね.
Clean Architecture, TDD, DDDとの邂逅
名著を読んでアーキテクチャ設計というジャンルを知り, 影響を受けました.
以下名著たちのAmazonのリンクも貼っておきます.
- Clean Architecture 達人に学ぶソフトウェアの構造と設計 (アスキードワンゴ)
- 実践テスト駆動開発: テストに導かれてオブジェクト指向ソフトウェアを育てる
- エリック・エヴァンスのドメイン駆動設計
プログラミング5年まではアーキテクチャ設計という考え方があると思わず, 独学でプログラムを組んでいました. プログラミング2~3年目ぐらいに リーダブルコードも読んでいたのですが, 当時は「当たり前のことが書かれているな」という印象しか受けませんでした😅 今ならアーキテクチャ設計の観点でまた違った味わいがありそうなので, 読み直してみたいと思います.
これらを読んでOOP, TDD, DDDの基礎とその難しさ, アーキテクチャ設計の楽しさを知りました. これらの名著を教えてくださった先輩には感謝しかないです.
OOP, TDD, DDDについてはまた別記事で作ろうと思います.
ちなみにDDDは本だけだと難しいので little hands' lab - はてなブログ さんの 記事とYouTubeをよくみていました. 実例も交えて解説しているので一層学べました.
アーキテクチャ設計を深める
そこから現在までアーキテクチャ設計を学び, 仕事や趣味のプロジェクトを通して実践していきました.
(読み物としてFizzBuzzEnterpriseはおもしろかったですw ネタとして
https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition
アーキテクチャ設計を深めていく中で私がなぜアーキテクチャ設計, プログラミングに面白さを感じるか, 少し言語化できてきました. 後ほど話します.
現在
現在は, 既存アプリケーションのインフラ改善や機能のAPI化, レガシーコードの改善・リファクタリングなどを担当しています. インフラやAPI設計も大切な仕事ですが, 私としてはやはり, アーキテクチャ設計やコードの改善に携わる, レガシーコードの改善・リファクタリングの方が好きですね.
aka.thoughtsAbout(programming)
私がなぜアーキテクチャ設計, プログラミングに面白さを感じるかを言語化すると, 以下2点に集約されます.
- プログラムの実行結果として正解, 不正解がわかる.
- プログラムの中身, つまりコードは開発者が自由に表現できる.
1についてはそのままです. やりたいこと(要求・仕様)さえ決まっていれば, それができるかどうかがプログラムを動かした時にわかります.
2についてがまさに, アーキテクチャ設計, プログラミングの醍醐味です. コードを読みやすく書いたり, パフォーマンスを重視して書いたり, もしくは動けばいいやで適当に書いたり…多種多様な表現方法があり, ここに面白さが詰まっていると思います.
DDDを学んでいたときに, 「なぜアーキテクチャ設計やプログラミングに惹かれるのか?」という問いに対する答えが見えた気がしました. プログラミングは"プログラミング言語"をコードに落とし込む作業です. 小説家が自分の想像や物語, 意見を言葉で読者に共有するように, プログラマーはそれらをプログラミング言語でコード化し, コードで共有することができます.
以下のような端的な表現で書くこともできますし,
class aka {
public YesOrNo love(Person you){
return you.answer();
}
}
以下のような表現で書くこともできます. (be crazy about person → personを熱狂的に愛している)
class aka {
public Ending isCrazyAbout(Person you){
if(you.answer().Yes) return Ending.Happy;
return Ending.Bad;
}
}
この表現の違いを書けるということは, プログラマーは小説家のように, 単語をメソッドやクラスという形で作れ, その内容を定義できるということです. しかも, それをコードとして実行することによって, 仮想世界を自由に動かすことができるのです. 自分で妄想した概念が動くのは, とても面白いです.
ちなみに, コードの可読性を上げることは, 私たちプログラマーにとって重要な作業です. なぜなら, コードは"書く"よりも"読む"時間のほうが圧倒的に長いからです. 単純に考えると, 書くのは1回に対し, 既存のコードを改善するには読む作業が何度も発生します.
しかもコードはコピーが簡単なので, コピー先でも読まれる時間が生まれます. そのため, コードの可読性を向上・維持するのは大事です. (その観点から行くと, aka#isCrazyAbout は没です🤣 題材がヤンデレ系のノベルゲームだとありかもしれないですが.
長くなりました. まとめると, プログラミングは私自身が使える表現方法の一つです. 画家や音楽家, 小説家が作品を通じて何かを伝えるように, 私はプログラムとその中のコードを用いて, 自分の考えを表現しています. さらに, プログラムを動かすことによって, 自分で作った定義が正しく動くことを検証できます.
妄想力がある心配性で内向的な性格の私にとって, 考えることが好きな私にとって, プログラミングはとても楽しい活動です.
aka.isContinue(programming)
プログラミングによって, 「自分の考えを検証し, 表現するのが楽しい」と言語化できました. それを踏まえた上で, 私は将来もこのままプログラミングを続けるかどうか悩んでいます.
私が楽しんでいるのは「自分の考えを検証し, それを表現する」ことであって, 必ずしもソフトウェア開発に限定されるわけではありません. しかも, 最近はAIによって検証や表現が簡単になってきました.
プログラミングの代わりにAIを使い, 妄想を現実にする日は近づいていると思います. やがてAIが, 私の欲求を十分に満たす形でソフトウェアを実装してくれるかもしれません. もしその時代が来たら, プログラミングという"手段"から離れて、別の手段を試す日が来るのかもしれません.
まぁそれまでは, 慣れ親しんだ表現方法としてのプログラミングを楽しんでいくと思います. ではまたお会いしましょう.