ソフトウェアエンジニアという生き方

以下の記事に記載の通り、色々あって再びソフトウェアエンジニアをわりとガチめにやっているので、別の生き方も数年してみた上での、ソフトウェアエンジニアというものについて最近考えていることをつらつらと書いてみます。

https://qiita.com/shinichinomura/items/6841a1f9a8bda571af7c

## どんな人が向いているか

### 前置き

人の内面というのは非常に複雑で豊かなものです。「大雑把に見えて実は繊細」（＝大雑把な一面もあり、繊細な一面もある）などの表現がよくあるように、何か断定的に表現できるような単純なものでははありません。

以下は、そのような前提のもとに、「こういう傾向があるのではないか」と私が普段感じていることを言語化してみたものです。

### 1. 内向的な人

ソフトウェアエンジニアに向いていると思う特性その1は「内向的な人」です。

#### またも前置き

「内向的」という単語には人によってはネガティブな印象を持っているかもしれませんが、本稿ではそのような意図は一切ありません。この辺の話は、以下の本が良書かと思いますので、興味のある方はぜひ読んでみてください。

https://www.amazon.co.jp/dp/4062178591

#### そもそも内向的な人とは何か

以下は上記の書籍に記載されているチェックリストで、YESが多いほど内向型の性質が強いと言えます。
ちなみに自分は、一つを除いて残りは全部YESですw

1. グループよりも一対一の会話を好む
1. 文章の方が自分を表現しやすいことの方が多い
1. 一人でいる時間を楽しめる
1. 周りに比べて、他人の財産や名声や地位にそれほど興味がないようだ
1. 聞き上手だと言われる
1. 大きなリスクは冒さない
1. 邪魔されずに「没頭できる」仕事が好きだ
1. 誕生日はごく親しい友人一人か二人や、家族だけで祝いたい
1. 他人と衝突するのは嫌いだ
1. 考えてから話す傾向がある
1. 外出して活動したあとは、たとえそれが楽しい体験であっても、消耗したと感じる
1. 忙しすぎる週末より、何もすることがない週末を選ぶ
1. 一度に複数のことをするのは楽しめない

ほかにも、「生真面目」「短期的な満足を求めない」「起きるかもしれないことをあれこれ想像する」といったような傾向もあるようです。

ちなみに上のいくつかの質問は、外向型の人からすると、「え？ NOに決まってるじゃん？ YESの人っているの？」という感じらしいです（ソースはうちの奥さん）。

#### なぜ内向的な人がソフトウェアエンジニアに向いているのか

##### 予測可能性や制御可能性を好む

「内向的な人」の上記のような特徴を見たときに、私が感じる一つの共通項は、「予測可能性（や制御可能性）が高いものを好み、そうでないものを好まない」ということです。

上記のチェックリストのいくつかの項目からは

- 外からの刺激を好まない（7, 11）
- 大人数より、よく知った少人数あるいは自分一人で過ごす時間を好む（1, 3, 8, 9）

という傾向が見てとれると思います。これは、「外界」あるいは「他人（特に、よく知らない他人）」という「予測不可能」なものに対する非選好性と自分は解釈します。

一方、ソフトウェア開発という仕事の最大の特徴は、プログラムというものは書いた通りにしか動かないこと、すなわち、その動作が「完全に予測可能であること」であると思います。

##### 正確さや厳密さを好む

上記のチェックリストで言うと、2, 10 あたりが該当します（ていうかこの2つの項目似てるなw）。発話はその性質上、後戻りしての修正がしにくく、物事を正確に表現するには向いていません。一方、文章は（自然言語という制限はあるものの）物事を正確に表現するには相対的に優れた手段であるということができます。

このことから、内向型の人間の性質として、正確さや厳密さを好むという点があると考えます。

そして、ソフトウェア開発という仕事において「正確さ」は絶対的に必要であることは言うまでもないでしょう。

##### 物事に「集中する」ことを好む

上記のチェックリストでは、1, 7, 13 など該当します。上でちらっと書いた「制御可能性を好む」という性質にも通じる部分かもしれません。「色々なことに手を出す」よりも「一つのことに集中して取り組む」ことを好む傾向が見てとれます。

自分は、平日の朝や週末はしばしば料理をするのですが、「なぜ一度に一つのものしか作れないのか」と奥さんによくdisられていますw
まあ、「一つずつしかできない」というスキルや能力面の制約もありますが、同時に「一つずつやりたい」という気持ちもあります。料理が煮込まれるのを、ただ見守っていたい。

話が逸れましたが、このような性質を持つ内向型の人間に、高い集中力を要するプログラミングという仕事が適しているであろうことは、これまた言うまでもありません。

### 2. 結果よりもプロセスに重きを置く人

1が思いのほか長くなってしまいましたが、ソフトウェアエンジニアに向いていると思う特性その2は、「結果よりも（控えめに言うと、結果“だけでなく”）プロセスに重きを置く人」です。

#### 「結果よりもプロセスに重きを置く」人とは

これは引用できる書籍がない（あるとは思うが、自分が読んだことがない）ので、個人的な経験の中から書いてみます。

- 仕事以外で自ら目標を設定することはあまりない
- 授業のノートを必要以上にキレイにとってしまう
- 物事の「仕組み」が気になる
- 他人に勝とうという気持ちがあまりない
- 「決められた通りにやる」と言うことに対してそれほど抵抗がない

こういう人、いると思います。自分がそうですw

#### なぜ「結果よりもプロセスに重きを置く人」がソフトウェアエンジニアに向いているのか

ソフトウェア開発とは、「より優れたプロセスを作る仕事」だからです。そもそもプログラミングというもの自体が「プロセス」を記述する行為です[^1]。

また原則的に言って、全てのソフトウェアの「結果（＝開発したソフトウェアの出力）」は決まっています[^2]。その、あらかじめ決まった「結果」を出力するためのプロセスを作るのがソフトウェアエンジニアという仕事なのです。

例えば比較してみると、良い営業とそうでない営業の違いは、一般に「結果（＝売上の量）」だと思います。一方、良いプログラマとそうでないプログラマは、出力する「結果」は同じです。違うのはコードの品質や処理の効率性などの「プロセス」です。

というわけで、「結果よりもプロセスに重きを置く人」はソフトウェアエンジニアに向いていると思います。

[^1]:SQL等、プロセスを記述しない形式のプログラミング言語もありますが、まあ基本的にはプロセスを記述する行為であると言ってよいかなと
[^2]:実際の業務としては、決まっていないことも往々にあるのですが、今回はあくまでも原則論ということでw

## ソフトウェアエンジニアとの付き合い方

### 解決策ではなく課題を伝える

ソフトウェアエンジニアは、一言で言うと「課題解決のスペシャリスト」です。課題が解決された状態という「結果」を導くための「プロセス」を作る専門家です。なので、必要なことは「課題を正確に伝え、解決策は任せる」ことです。

#### 仕事編

例えば、システムに関して「XXな機能ってできますか？」って質問する人、いますよね？ これはダメな例です。「XXな機能」という解決策を伝えてしまっているからです。

ソフトウェアエンジニアが知りたいのは、「そもそもの課題はなんなのか？」です。それによっては、「XXな機能」が最適とは限らず、そもそも「機能を作ること」が最適解とも限らないためです。「そもそもの課題」が何なのかがわかるように、「何のために」「結果としてどうなっていればよいか」という、「目的」と「ゴール」を伝えましょう。そうすれば、最適な解決策をきっと実現してくれます。

その解決策は時として「プログラムを書く」という手段でないこともよくあります。皮肉なことに、ソフトウェアエンジニアはプログラムを書くことがシステムの複雑さやメンテナンスコストの増大という負債を生み出すことを一番よく知っているので、できるだけプログラムを書かずに済ませたいと思っているところすらあります。

#### プライベート編

「帰りに牛乳買ってきて」、こういう依頼する人、いますよね？ これはダメな例です。「牛乳を買ってくる」という解決策を伝えてしまっているからです。さらに、「解決策に関する情報が不十分で、かつその不十分さを埋めるための課題の詳細やそのコンテキストが提供されていない」ためです。

ソフトウェアエンジニアは、「課題解決のスペシャリスト」なので、与えられた課題に対する最適な解決策を提供したいという気持ちが強いです。

上記の例では、例えば以下のような解決策の詳細を判断するのに必要な情報（＝課題の詳細やそのコンテキスト）が提供されていません。

- 1lパックが良いのか、250mlパックが良いのか
- 優先すべきは品質なのか、価格なのか
- 今日の夜ご飯に必要なのか、単になくなったので補充したいのか（「帰りに買ってくる」ことの優先度がどの程度なのか、帰宅時間がいつも通りであることも暗黙に期待されているのか）

例えば「明日の朝食はフレンチトーストにしたいんだけど、牛乳がない」というように課題の詳細を伝えてもらえれば、「明日の朝までに、200ml程度のほどほどの品質の牛乳があればよいんだな」という明確な解決策を導くことができます。

※この文例はあくまでも本記事全体の趣旨に従った必要最小限の表現にしていますので、実際には「〜ので、牛乳買ってきて」と書くのがよいでしょう。

## ソフトウェアエンジニアという生き方の将来性

一言で言うと、揺るぎないと思います。

ご存知のように、世の中はどんどんソフトウェアに置き換わっていっています。ソフトウェアエンジニアの仕事がAIに置き換わるという議論もありますが、そのAIを作れるのも、使いこなすことができるのもソフトウェアエンジニアです。

参考までに、[経産省の調査](https://www.meti.go.jp/policy/it_policy/jinzai/houkokusyo.pdf)によれば、2030年に最大約79万人のIT人材が不足すると言われています（ちなみに現在のIT人材数は約100万人らしい）。

またアメリカの労働統計局によれば、

> Overall employment of software developers, quality assurance analysts, and testers is projected to grow 25 percent from 2021 to 2031, much faster than the average for all occupations.

だそうです。

Good luck!