はじめに
こんばんは。Akerunエンジニア @ishturk です
今回はポエムです。
スタートアップで働くサラリーマンエンジニアがソフトウェア開発を実現するために大事だと思う技術について書いてみます。
うそっ 私の技術力、低すぎっ
(数年前に新卒で入社した頃の僕の話です)
新卒入社したてほやほやの僕は当然、技術ゼロでした。当然自信もへったくれもない。 技術力にあふれるエンジニアがいっぱい。
目をキラキラ(どちらかというとギラギラ)させていた僕は思いました。
「この人達はめちゃめちゃいろんなことを知っているんだろうな。たくさん勉強せねば」
ところがどっこい。入社して数ヶ月の僕は気づきました。
「あれ、(プログラム言語のことなら)知識そんなに変わんなくね?」
しかし、彼らには間違いなくプロダクトを完成させる力があります。僕には無理です。何が違うのでしょう。
製品を完成させるために必要なもの
製品、いわゆるプロダクトやサービスを完成させるには、知識だけでは足りないのです。
いろんな知識を掛け算した「技術」が必要なのです。
たとえば
アルゴリズムに詳しい人は「技術がある」か? 否。「知識がある」ですね。
などなど。
これらはすべて「知識」です。
知識を製品に変える技術 = 設計力
設計と一言にいってもいろいろありますが、僕の経験からは、 「どの知識」を採用して「どう組み合わせるか」を「最適化」したものを「アウトプット」するスキルだと思っています。
ここで「最適化」という言葉をあえて使っているのは理由があって、サラリーマンエンジニアなら、開発対象には必ずプロダクトコンセプトや、納期、生存期間があります。
重要な部分は緻密に設計し、納期にミートする内容で設計し、生存期間の長いソフトウェア(またはその一部)の場合はメンテしやすい工夫をする。重要じゃない部分は工数最低限になるように設計する。これが設計力。
そして、「アウトプット」。
形はなんでもいいです。設計書でもUML図だけでもコードスケルトンでも。あ、ソースコードでもいいかな(ガソリン投下)
「アウトプット」がないとどれだけスバラシイ設計でも0点になってしまいます。(ただの妄想だもの)
そして、レベルアップするにはアウトプットを繰り返すことが非常に重要だと僕は感じています。
使う技術
設計するには当然「知識」が必要ですが、設計しているスコープのすべてを完璧に知るのは不可能ですよね。
社内(あるいは委託先)にその道のスペシャリストがいたらもう最高。ぽいっと丸投げしちゃいましょう。
OSSや、ロイヤリティを払ってライブラリを使用するのもいいでしょう。
丸投げできない場合は、有識者じゃなくていいので、複数のエンジニアで意見交換をしましょう。
周りをうまく使うのも大事な技術ですね。(リソース管理の話ではないです。)
重要なのは、無理して自分だけでやろうとしないこと。じっくり煮込んだクソコードが出来上がります。
実装力
「設計できていればその通り実装するだけでしょ」 そう言い放つマネージャー職もいますね。きっと現役時代はクソコードを量産してきたことでしょう。 今日は深く掘りませんが、以下に僕が意識しているキーワードを挙げておきます。
- 「わかりやすく書く」(短く書くではない)
- 「バグを潜ませないように書く」
- 「あらゆるパターンに対応する」
- 「適度に手を抜く」
自分の技術、確認してみませんか?
僕がいままで一緒に仕事をしてきたエンジニアでイケてる方々はほぼ例外なく、「アウトプット」が上手い人達でした。
なぜなら、「アウトプット」をすると「フィードバック」があるから。そこでブラッシュアップされ、知識が増える。
何度も「アウトプット」をすることでみせ方もうまくなる。
「アウトプット」とあわせて、「レビュー」することは、クオリティをあげる目的だけでなく、技術レベルをあげるのにも非常に有効です。
僕らはスタートアップです
僕は、新卒で入社した大手企業を退職し、現在はスタートアップでエンジニアをやってます。
駆け出しのスタートアップの場合、同じレイヤーのエンジニアが社内にいることは稀でしょう。
それでも(だからこそ)設計レビュー・コードレビューは重視したいと思ってます。毎回、新しい発見があり、
誰かに説明するだけで自身で気づくことも多いです。人間だもの。
ひとりで全部やる時代は終わっています。
社内外のエンジニアと、どうコミュニケーションしていくかでエンジニアライフも、大きく変わると感じています。
告知
弊社ではエンジニアを募集しています!