はじめに
BASE株式会社でシニアエンジニアを務めているプログラミングをするパンダ(@Panda_Program)と申します。本連載は「フロントエンドカンファレンス沖縄2022」で私が発表した内容[1]を記事として再構成したものです。
対象読者
本連載の対象読者は、個人開発に興味があるソフトウェアエンジニアの方です。
個人開発に「失敗」しないための考え方
ソフトウェアの個人開発とは、ソフトウェアエンジニアが自分のプライベートな時間を使ってWebサイトやスマートフォン向けのアプリを作成、公開、運用する趣味活動です。では、本記事のタイトルに含まれている「失敗」という語の指す内容とは何でしょうか。本連載で私はそれを「学習またはリリースを目的としたときに、その目的が達成できていないこと」と定義したいと思います。
個人開発における最大の意思決定はリリースの有無です。自分が開発したソフトウェアをリリースして世界中の人が使えるようにするか否かで、テーマ、技術選定、解決したい課題、日常生活の中での開発の優先順位付けなどが変わるからです。このため、個人開発を始める前にまずはリリースをするかしないか決めることをオススメします。
個人開発の目的を設定しよう
個人開発に挑戦する方に紹介したいのは、その目的を「リリース」または「学習」に大別する考え方です。このことを視覚的に理解しやすいように簡易的なフローチャートを作成しました。本節ではこの内容に沿って解説をします。
目的がリリースの場合
まず、目的をリリースと設定したときのアドバイスを紹介します。リリースを目的にするケースでは、最短でのリリースを目指しましょう。個人開発は趣味活動であるのでプライベートの時間を割いて開発することになります。個人の時間というリソースは有限である一方で、個人開発において考えることは山ほどあります。それは例えば、解決したい課題の特定、仕様決め、デザイン、開発、デバッグなどです。そこで時間というリソースの上手な配分を考えなければなりません。
具体的には、仕様やデザインを極力シンプルにして開発に集中する時間を捻出し、素早く作り上げることが望ましいです。ノーコードツールでプロトタイプを作成しても構いません。また、開発工数をできるだけ削減するために慣れた技術・ツールを使うことがオススメです。
ただし、品質や信頼性の低下に繋がるバグの混入や、セキュリティインシデントにつながる脆弱性を放置してはいけません。スピードは重要ですが、全世界に対して公開するのですから社会的な責任も発生します。バグや脆弱性を放置せずに「動くソフトウェア」をユーザーに届けることを念頭に置きましょう。
また、スクレイピングしたデータを見やすい形で表示するサイトを作ったがそもそもデータ取得元がスクレイピングを禁止していたなど、他サービスの規約違反となるサイトや社会通念上認められないようなソフトウェアは作成しないように注意してください。
目的が学習の場合
もし個人開発の目的を学習に据えるのであれば、馴染みのない技術を使ってミニプログラムを作成することをオススメします。この場合、あえてリリースしなくても構いません。リリースを目的とするケースと異なり、開発スピードより自分にとって新しいことを理解する作業に時間を充てることを重視しましょう。
新しいプログラミング言語を学ぶのであれば、CRUD操作をするブログやTODOリストといった仕様が簡単なアプリケーションを作成しましょう。もし実用的で複雑なアプリを作成するのであれば、RealWorldというプロジェクトを参照するのがオススメです。Real Worldは、Medium.comのクローンアプリをさまざまな言語で実装するプロジェクトで、フロントエンドであればNext.js(React)やNuxt.js(Vue.js)のみならず、RustやKotlin、Elmといった言語のサンプルが揃っています。仕様が定められているため、実装に集中できることが大きなメリットです。
また、JSONパーサーや LISPのインタプリタ、簡易版のReactを作ってみるなど、解決済みの問題を解くことも技術者としての視野を広げてくれます。これらの成果物はGitHubで公開したり、製作の過程で学んだことをブログで発信してみると良いでしょう。どちらも自分に対する自信を得ることができ、次なる挑戦のやる気を高めてくれる上に、就職・転職の時のアピール材料にもなります。
なお、個人開発の目標がリリースでも学習でもない場合は、心が赴くままにやってみてください。