メモ

20年間ソフトウェアエンジニアとして働いて学んだ20個のことまとめ

By Sergey Galyonkin

ソフトウェア開発企業・Simple Threadの創設者であるジャスティン・エセリッジ氏が、ソフトウェアエンジニアとして20年活動した経験を基に、学習において重要なポイントやコーディングにおいて意識するべきポイントなどを20個にまとめて公開しています。

20 Things I've Learned in my 20 Years as a Software Engineer - Simple Thread
https://www.simplethread.com/20-things-ive-learned-in-my-20-years-as-a-software-engineer/

◆1:自分がまだ多くを知らないことを自覚する
エセリッジ氏は、たとえ何十年間ソフトウェアエンジニアとして働いたとしても、それぞれのエンジニアが持つ知識には違いがあり、他のソフトウェアエンジニアから多くのことを学べると主張しています。また、自身が無知であることを自覚すれば、他人から学んだり、逆に他人に教える喜びを得たりできるとのことです。

◆2:ソフトウェア開発の最も難しい部分は「正しく設計すること」である
ほとんどのソフトウェアエンジニアは、「自分の仕事の価値を下げる」と考え、設計を軽視しているとのこと。エセリッジ氏は適切な設計が行われなければ作業が複雑になり、多くの時間を失うことになると指摘。設計を軽視することなく設計専任メンバーを頼るか自らの設計能力を上げることで、多くの利益が得られると主張しています。

◆3:最高のソフトウェアエンジニアはユーザー目線で考える
優れたソフトウェアエンジニアは、開発するソフトウェアを「誰が」「なぜ」「どのように」使うのかを考え、さらにユーザーにとって何が重要なのかを考えます。優れたユーザーエクスペリエンスを実現するには、ユーザーのニーズを念頭に置くことが重要です。


◆4:最良のコードはメンテナンスの必要がないコードである
ほとんどのソフトウェアエンジニアは、コードを書く際にいくつかのミスを犯します。それにもかかわらず、エンジニアリングチームは既存のソフトウェアを流用できる場面で新たなソフトウェアを開発しようとする「NIH症候群」に陥りがちです。エセリッジ氏は「新たにソフトウェアを開発することはソフトウェアエンジニアを成長させる可能性がありますが、ミスを犯すリスクがあることに注意してください」と述べています。

◆5:ソフトウェアは手段である
ソフトウェアは目的を解決するための手段であり、ソフトウェアエンジニアの仕事は手段を提供することです。エセリッジ氏は、ソフトウェアを開発することを目的にしてしまうと、ニーズに合っていないソフトウェアを開発する可能性があると警告しています。

◆6:行き詰まったら手を止めてみる
ソフトウェアエンジニアによっては、直感的にコードを書き始める人もいれば、問題を詳細に分析してからコードを書き始める人もいます。この時、問題の分析に力を入れすぎると考えが煮詰まって作業に移行できない「分析のマヒ」と呼ばれる状況に陥ることがあります。これを避けるために、エセリッジ氏は問題の分析に期限を設定することを推奨しています。


◆7:システム設計時には実現可能な範囲を把握する
エセリッジ氏は、開発に取り組んでいるシステムで「何が可能か」「何が利用できるか」を理解していない場合は、合理的な解決策を設計することは不可能だと主張しています。また、特に長い間コードを書いていない人が設計を担当する場合は注意が必要とのことです。

◆8:失敗を前提にして、それを乗り越える力をつける
完璧なソフトウェアを開発することは不可能です。ソフトウェアエンジニアは、この事実を受け入れて継続的な改善を目指すことが重要です。

◆9:答えが明確になるまで質問を続ける
エセリッジ氏は、「これまで通りの方法」に疑問を持つべきだと主張しています。例えばクライアントから用途が不明瞭な機能リクエストを受け取った場合は、そのまま実装するのではなく「この機能がなぜ必要なのか」「どこで必要なのか」といったことが明確になるまで質問を続ける必要があるとのことです。

◆10:超絶スキルのプログラマーを見つけるよりもチームの足を引っ張るプログラマーを避けることに重点を置くべき
エセリッジ氏によると、「優秀なプログラマーを見つければ、他のプログラマーが2週間で生み出すものを1日で生み出せる」といった考えは愚かであるとのこと。優秀なプログラマーを見つけるよりも「フィードバックを求めない」「コードをテストしない」「極端なケースなどを考慮しない」といったチームの足を引っ張るプログラマーをチームから遠ざけることこそ重視されるべきです。


◆11:熟練したエンジニアはツールに関する独自の意見を持つ
熟練したソフトウェアエンジニアは、多くのツールやアプローチを試し、それらに関する独自の意見を形成します。特定のツールに対する独自の意見を持っていない場合は、他のユーザーとは異なるツールやテクニックを使ってタスクを実行する方法を積極的に模索するべきです。

◆12:人々はイノベーションを望んでいない
人々はイノベーションについて多くのことを話しますが、実際にソフトウェアエンジニアがイノベーションを導入しようとすると主に否定的なフィードバックを受けることになります。そのイノベーションが本当に物事を改善すると信じているならば、否定的な意見との長い戦いに備える必要があります。


◆13:顧客のデータはシステムの最重要部分である
データの整合性が重視されるシステムを開発する際は、顧客から受け取ったデータの形式が原因で悪夢のような修正作業が必要になる場合があるとのこと。エセリッジ氏は顧客から受け取ったデータを整然とした状態に整えることにコストをかければ、システムのメンテナンスが容易になり、長期的な視点では報われることになると述べています。

◆14:枯れた技術を活用する
「枯れた技術」は長年の蓄積によって高い安定性を手に入れ、テクノロジーの世界で起きる大きな変化の中で生き延びている技術です。これらの技術に派手さはありませんが、採用することで「システムの安定性が不安で夜も眠れない」といった事態を避けることができます。

◆15:謙虚な人を無知と誤解しない
ソフトウェアエンジニアの中には、尋ねられない限り意見を述べない人がたくさんいるとのこと。そのため、「自身に意見を投げかけてこない」という理由で相手を無知と判断してはいけません。周囲の人を無知と判断する前に自分からフィードバックやアドバイスを求めることで多くの意見を得られる可能性があります。


◆16:定期的に文章を書く
エセリッジ氏は、「ソフトウェアエンジニアは、定期的にブログ・ジャーナル・ドキュメントを書き、書面によるコミュニケーションスキルを鋭く保つ必要があります」と主張しています。エセリッジ氏によると、それらの文書を書くことは自身の問題点について考えることや、チームとの効果的なコミュニケーションに役立つとのことです。

◆17:プロセスをできる限りスリムに保つ
近年、計画・設計・実装・テストを短いサイクルで繰り返す「アジャイル開発」が多くの企業で導入されています。しかし、エセリッジ氏は「もし誰かがアジャイル開発をしつこく推奨してくる場合、何らかの商品を売ろうとしている可能性があります」と指摘。さらに「他にも必要なものがあると分かるまでは、プロセスに頼ってください。あなたのチームを信頼すれば、チームメンバーは成果を挙げるでしょう」と述べています。

◆18:ソフトウェアエンジニアは、製品の運用にもかかわるべき
もし、開発した製品の成果からソフトウェアエンジニアを引き離すと、ソフトウェアエンジニアはその仕事に興味を示さなくなります。近年、この問題を防げる開発手法として、開発担当者と運用担当者が連携する「DevOps」の人気が高まっています。エセリッジ氏は「情熱的な開発チームに設計・構築・運用に関する完全な権利を与えれば、驚くべきことが起きるでしょう」と主張し、ソフトウェアエンジニアが製品の運用にも関われる環境の構築を推奨しています。


◆19:面接時に企業に在籍しているエンジニアチームの能力を見極めるのは不可能
面接の場で「パワハラ気質なメンバーがいる」「遅刻癖のあるメンバーがいる」といったことを暴露する面接官はいません。そのため、エセリッジ氏は「面接の中でエンジニアチームの能力や知識の豊富さを見極めようとするのは無駄な努力です。面接に臨む際は、自身が専門分野に対してどんな興味を持っているかを理解させることに力を費やす方がずっといいです」と述べています。

◆20:常にシステムの小型化に努める
「予算の割り当ての都合」「機能をどれだけ削減できるかを事前に決定できない」「システムの『最適なバージョン』を提供したい」といった理由から、ソフトウェアエンジニアが開発しなければならないシステムが肥大化することはよくあります。エセリッジ氏は「あなたはこれに立ち向かうべきです。システムを構築している間に多くのことを学べば、最終的には最初に設計したものよりもはるかに優れたシステムを作り上げることができます」と述べ、何度もシステムを開発することでシステムを小型化する能力を習得できると主張しています。

この記事のタイトルとURLをコピーする

・関連記事
「良いコード」を書くための10のポイントとは? - GIGAZINE

一流プログラマーになるためには「1万時間の法則」ならぬ「3万時間の法則」が適用される - GIGAZINE

プログラミングで問題解決するためにとるべき3つの手順 - GIGAZINE

ソフトウェアエンジニアがハードウェアのプログラミングをする時に注意すべきこと - GIGAZINE

プログラムのコードを読む時に活性化される脳の領域は言語処理と同じではない - GIGAZINE

in メモ, Posted by log1o_hf

You can read the machine translated English article here.