フリーランスが1人でソフトウェア開発するための技術たち
フリーランスの働き方、稼ぎ方が様々であることは拙著 フリーランスと○○ に書いた通りです。
私の場合、ひとり、もしくは2, 3人のフリーランス仲間と一緒にモバイルアプリ開発を請け負うことが多いのですが、この記事ではそんな 1人(もしくは少人数)で 0 からソフトウェア開発するための技術 を紹介します。
あくまで私の経験の範囲内ですので、当然他にもいろいろありますが、フリーランスの仕事の一例として読んでいただければと思います。
よくある依頼内容
先に、私がフリーランスをしていてよく依頼される内容を説明しておきます。
私がフリーランスをやっていてよく依頼されるのが、「こんなサービス作りたいんだけどどうすれば良いですかね?」というざっくりとした相談からスタートし、相手のアイデアを詳しく聞きながらそれを実現するための技術を選定し、詳しい要件や仕様を取りまとめ、開発し、リリースし、必要に応じて保守をする、というソフトウェア開発のまさに 0 からリリースまでを頼まれるケースです。
ソフトウェアの規模自体はそれほど大きくありません。それこそアプリの画面数にして10ページもないような規模のアプリ上で、相手が保有する何かしらのデータを表示する、というシンプルなものが多いです。
(業界や企業によっては、それだけの「カンタンな」アプリでも十分ビジネスになるのだから世の中面白いですね)
こんな感じの案件が年に2, 3個くらいのペースで契約まで進むので、ひとつずつ話を聞いて開発し、リリースしていくイメージです。
使える技術と使い所
開発するソフトウェアのイメージが(きっと)できたところで、顧客の依頼を実現するために私がよく使っている技術を説明していきます。
Flutter
まさに最近はこればっかりです。
まず私への依頼の内容的に、「モバイルアプリ」として提供するのが最適である要件が多いため、選択肢としてはネイティブ(Swift / Kotlin)か何かしらのマルチプラットフォーム技術かの検討になるのですが、
- 1人(もしくは2, 3人)で開発
- データの出し入れだけのシンプルな要件
という点を考えるとネイティブで Android / iOS それぞれ作るよりもマルチプラットフォーム技術でさくっと両OS対応してしまった方がスピード感も出て、仕様の試行錯誤もこまめにでき、何より書いていて自分が楽しい場合が多いです。
マルチプラットフォーム技術の中でも Flutter は「10年間 Android を提供してきたあの Google が提供している」という理由が非エンジニアの顧客にも分かりやすいアピールポイントになることもあり、提案として通しやすいため、基本的にこの Flutter をよく使っています。
実際に Android / iOS ともネイティブで 0 から作ってリリースした仕事も経験がありますが、それと比べて Flutter だとここが困る、という点は今の所ありません。とても満足して使っています。
当然要件次第ではあるので「Flutter 使っておけばもうネイティブなんていらん」とはなりませんが、私のこれまでの経験を振り返ると Flutter で十分に対応できる案件は多いです。
Firebase
特に Firebase Authentication と Firestore はログイン機能やサーバー上でのデータ共有が要件に入ってくる案件で大活躍します。画像ファイルなどファイルを扱う案件では Cloud Storage もとても使いやすいです。
対抗馬として AWS や Azure があり、わたしもそれぞれ(仕事ではないものの)触ったことがありますが、 Firebase はそれらと比較して サーバー / アプリ間でデータの出し入れするシンプルなアプリの開発に特化してサービス設計されている のがとても良いと感じていて、管理画面を見ればすぐにどのプロダクトをどう使えば自分の目的が実現できるかが分かりやすく作られています。
AWS や Azure は IaaS や機械学習、リモートデスクトップに実機テスト環境など本当に様々なプロダクトが用意されていて「使いこなせれば」大規模で込み入ったシステム要件も対応できるんだろうな、と思っていますが、その分使う側にそれなりの学習と理解を必要とします。これらは私の扱う案件では「多機能すぎ」になってしまうため、これらを採用することは(今のところ)ありません。
Firebase と Flutter を組み合わせれば、私が扱うほとんどの案件は実現できてしまうイメージです。とても便利です。
GAS(Google Apps Script)
案件によっては「データを作る」ところからやらなければならない場合もあります。
例えば学習アプリであれば、問題と解答、解説のデータを何百問も考えて手入力するようなイメージです。この作業は私がやったり顧客がやったりします。
そんなときに役に立つのが、 スプレッドシートに入力して GAS で Firestore に転送する という作戦です。
非エンジニアである顧客にとって、データ入力に使える一番使い慣れたツールが Excel や スプレッドシートです。当然 JSON 形式なんて知らない方も多いですし、好きなエディタで書いて Git で共有、なんてやり方は現実的ではありません。
データ登録用のツールを自作する案もありますが、顧客の慣れや開発コストなどを考えるとすでにある使い慣れたツールで工夫するやり方が最適になる場合がほとんどです。
GAS を使えばスプレッドシートのセルの内容を色や太字などの装飾付きで取得でき、 Firestore との連携もでき、シート上に置いた任意の図形をクリックで実行でき、ダイアログの中に HTML で任意の画面を出したり、その他 JavaScript でできることはほとんどできるイメージです。意外となんでもできちゃって便利です。
この仕事をしているとソフトウェア開発者同士では当たり前のことも通用しない場面が多いため、一般的なビジネスマンが使い慣れているツールでデータ入力できる、というのは GAS のとても大きなメリットです。
Selenium
ちょっと依頼の内容が変わって、「(ブラウザで行う)定型作業を自動化したい」という依頼もたまに入ってきます。管理画面からのデータダウンロード、ECサイトへの商品出品、リアルタイムで変化する情報の監視、などなど、人によって自動化したい内容は様々です。
そんなとき使えるのが Selenium です。
Selenium automates browsers. That's it!
とトップページに大きく書かれている通り、 Selenium はブラウザ操作を自動化するための製品です。私はこれを Python プログラムから操作する Selenium Python bindings で依頼に対応しています。
基本的に自動化プログラムができたらあとはその Python プログラムファイルを先方に渡して実行方法をドキュメントにまとめれば終わり、というパターンが多く、 Python を実行するための環境構築だけ Zoom 越しに一緒に一度行い、無事自動化プログラムが動作すれば案件完了のイメージです。
Selenium はユーザーが手作業で行えるほとんどのブラウザ操作をプログラムで行える技術のため、作業対象のサービスへのログインやバックエンドとのデータのやりとりの仕組みなどを解析しなくても、「ここをクリックして」「ここにこれを入力して」のようなユーザーが手作業で行う操作をそのままプログラムで書き直す感覚で自動化できるのが素晴らしいです。
まとめ
以上、私が1人、もしくは2, 3人で開発案件に対応する際に重宝している技術を挙げてきました。
最初に書いた通り、そして読んでいただければ分かる通り、ここに書いたのはあくまで「モバイルアプリを開発」する案件で使える技術たちです。Web アプリケーション開発やバックエンド開発などの案件ではもちろん別の技術が必要になります。
他のフリーランスの方や、フリーランスを目指している方に、ここに書いた技術を使うことでたとえ1人でも顧客企業が求めるソフトウェアを 0 から作って納品できてしまうこと、そしてそれを仕事にして実際に生活ができることが伝わっていれば嬉しいです。
Discussion