概要
まず始めに、ここでは比較的抽象的な表現を使用します。それは、一言に「ソフトウェアエンジニア」とは言っても、「サラリーマンとして」「フリーランスとして」「コーダーとして」「設計者として」など、立場によって在り方(この場合、ほとんどの場合働き方とほぼ同義に使用していると思ってください)が変わります。
私の単なる所感なので、まぁ参考程度に。
必要知識
私はソフトウェアエンジニアとして以下の知識があれば、何となくソフトウェアが作成できると思っています。
- コーディングスキル
- データ型
- 制御文
- 関数
- クラス
- 設計手法(オブジェクト指向やコンポーネント指向 etc.)
- 開発ツールの使い方(ライブラリ含む)
- IDEの使い方
- 言語ごとのパッケージ管理ツール
- バージョン管理ツール(GItなど)
- OS知識(これは開発環境構築の都合上エンジニアの種類を問いません)
- パッケージの理解(DBMSなどはこちら)
- 通信仕様
- 検索エンジンでの調べ方
- 説明書をよく読む
- (組込みエンジニアの場合はデバイス仕様)
- (Webエンジニアの場合はクラウド知識)
- (必要であればコンテナ技術)
本来であれば、ソートアルゴリズムとかバイナリデータ処理、文字列処理などが挙がるものですが、近年は標準のライブラリが充実していたり、OSSの利用が当たり前になってきたりしているので、ここで特別に挙げる必要がないと考えています。それらは「検索エンジンでの調べ方」さえ分かっていれば、特段として覚える必要はないと思います。繰り返し調べるのが面倒である場合、スニッピングツールに登録すれば良いだけであると思います。
ここで重視している考えは、「ツールの使い方」「設計手法の理解」です。超絶コーディングスキルなんて後でついてきます。それよりは、腐りにくい知識をしっかり修める方が大切です。
会社にいると、あまりツールの使い方については重視していないように思います(組込み系は特に)。ここで勘違いしてほしくないのは、ツールにこだわった方が良いということではないということです。「目的ごとに」「最適なツールを」「必要な機能だけ」使用することが大切ということです。
労働時間
ソフトウェアエンジニアに限りませんが、エンジニアという職業の方は本質的なところで業務時間外で勉強しなければなりません。これは機械/電気エンジニアよりもソフトウェアエンジニアの方がその気質があります。
機械/電気エンジニアは、現実の物/現象を相手にしているので、その知識が腐りにくいです。鉄の質量はいきなり変わらないし、電気の速さが極端に遅くなることはありません。
それに対して、ソフトウェアエンジニアが対象とする技術は「情報」という曖昧なものなので、目にも見えなければ鮮度も悪くなりやすいです。今持っている知識も数年後には使われなくなったりもします。そのため、ソフトウェアエンジニアは常に新しい技術について調べないといけません。「調べないといけない」と言ってますが、それはエンジニアとして大成したければ、という前提です。そうでなければ、調べる必要はありません。これは機械/電気エンジニアでも言えることですが。
「勉強する」ことを「労働」と捉えるのかによって「労働時間」の捉え方は変わります。上記の通り、ソフトウェア開発界隈の流行り廃りのサイクルが早いです。この流れに乗れるか乗れないかで、食っていける領域に乗り続けることが出来ないと私は考えています(これは極論でもありますが)。最近は終身雇用が破綻するとも言われてますし、そうなると最初に切られるのって「勉強しないエンジニア」だと思います。こういうところが一番ソフトウェアエンジニアの業の深さを表しているように思います。