web-dev-qa-db-ja.com

いつ仕事を止めて道具を作ればいいの?

ソフトウェアエンジニアとして、私たちは常に、生産性を向上させるための効果的なツールを入手したいと考えています。そして私たちの日常の作業では、既存のツールに満足できないことが多く、GDBスクリプト構成、Vimスクリプト、退屈なものを自動化するためのいくつかのPythonスクリプト)などのより良い方法が欲しいです。

ただし、ツールの作成には時間とエネルギーも必要になるため、実際にはトレードオフになります。すぐに生産性が向上するわけではありません。したがって、仕事をやめ、将来の痛みを和らげるためのツールを作成する時がきたかどうかをどのように判断しますか?

25
xiao

次のいずれかに該当する場合は「ツールを作成」​​します。

  1. タスクは私を悩ませています
  2. タスクでの人的ミスのリスクが大きすぎる

2番目のオプションの「リスク」は大きい必要はありません-1つの小さなツールを構築するコストは通常​​小さいので、保存するすべてが週に1回10分のビルドを再度実行するリスクである場合、それは通常非常に迅速に返済します。

私はツールをできるだけ小さくしようとしています。今すぐタスクを少し簡単にし、次回は改善するかもしれません。

つまり、毎回最大の痛みを修正するだけであり、実際には害を及ぼさない問題の修正は作成しません。

27
aviv

経験から、大げさな仕事に一生懸命取り組むことが、通常最も時間効率が良いことがわかりました。道具を作ることはしばしば魅力的です。私は次の場合に抵抗をあきらめます:

  • ツールには複数の目的があります。優れたチェスプレーヤーは、各移動で2つのことを達成しました:対戦相手の駒をブロックし、司教を解放します。初心者はおそらくそれを行うために2ターンを必要とするでしょう。同様に、ツールが1つの処理のみを実行するか、わずかな労力で2つの処理を実行するかを検討します。いくつかの生データファイルを修正し、人工的なテストデータを作成することもできます。
  • 将来の有用性。今週の仕事の時間を節約できるかもしれませんが、来週新しいプロジェクトの時間を節約できるでしょうか?
  • 新しい言語、ライブラリ、デザイン手法などを学ぶ良い機会であり、私にはそれを行う時間があります。このツールは、すでに教育に与えられた時間を利用して、何か教育を行うことの有益な副作用です。
  • 物事を機能させるために深刻な問題を抱えているとき。パラシュートのないスカイダイビングのように、あなたは本当にパラシュートを作るか買うために時間をかけるべきです。意味のある実験結果が得られない場合、または新しいWebアプリがまったく機能しない場合は、停止して、見えないものを測定したり、コンポーネントを駆動したり、部品の一部を交換したりするためのツールを作成または購入する必要があります。システム。ツールを必要とする仕事が完全にハングアップしたとき、私は将来の使用または複数の使用を気にしません。必要性は十分に重い。
9
DarenW

私の経験則では、3度目に何かをする必要があるときは、それを自動化する小さなスクリプトを書くか、私のアプローチを再考するときです。

この時点では本格的な「ツール」を作成するのではなく、以前手動で行っていた作業を自動化する小さなスクリプト(通常はbashまたはpython、Perlでも機能するか、PHPでもかまいません)を作成します。これは基本的にDRY原則(または本質的に同じものである単一の真実のソースの原則)の適用です)-2つのソースファイルを同時に変更する必要がある場合、それらが共有するいくつかの共通の真実と、その真実は、1つの中央の場所に分解して格納する必要があります。これをリファクタリングによって内部で解決できればすばらしいことですが、これが実現不可能である場合があり、そこでカスタムスクリプトが登場します。

その後、スクリプトは本格的なツールに発展する場合と発展しない場合がありますが、私は通常、多くのことがハードコードされた非常に具体的なスクリプトから始めます。

私は情熱を持って不平を言う仕事が嫌いですが、それはまた、それが悪いまたは正しくないデザインの兆候であると強く信じています。怠惰であることはプログラマーにとって重要な特質であり、反復作業を避けるために長い時間を費やすようなものである方がよいでしょう。

もちろん、バランスが悪い場合もあります。コードのリファクタリングやスクリプトの作成に3時間を費やして、繰り返し作業を1時間節約できます。しかし、通常、バランスはプラスです。そのため、直接的には明らかではないコストを考慮すると、人為的障害(人間は反復作業が本当に悪い)、コードベースが小さい、冗長性の減少による保守性の向上、自己文書化の向上、未来の高速化開発、よりクリーンなコード。したがって、バランスがマイナスに見える場合でも現在の場合、コードベースはさらに大きくなり、3つのデータオブジェクトのWebフォームを生成するために作成したツールは、30のデータオブジェクトがある場合でも機能します。私の経験では、おそらく反復作業は見積もりが容易であり、したがって過小評価されているため、バランスは大まかな作業に有利に見積もられていますが、リファクタリング、自動化、および抽象化は予測可能性が低く、危険であり、したがって過大評価されていると見なされています。結局のところ、自動化はそれほど難しいことではありません。

そして、それを行うのが遅すぎるというリスクがあります。3つの新しいデータオブジェクトクラスを形にリファクタリングし、それらのWebフォームを生成するスクリプトを作成するのは簡単です。これを行ったら、27個のクラスを簡単に追加できます。また、スクリプトを操作します。しかし、30のデータオブジェクトクラスがあり、それぞれに手書きのWebフォームがあり、それらの間に一貫性がない(別名「オーガニックグロース」)場合、そのスクリプトを書くのはほぼ不可能です。これらの30のクラスをフォームで維持することは、反復的なコーディングと半手動での検索置換の悪夢です。共通の側面を変更するには、30倍の時間がかかりますが、問題を解決するためのスクリプトを書くことは、昼休みだったでしょう。 -プロジェクトが始まったときの非常に簡単なことは、バグの修正、ユーザーの教育、そして場合によっては諦めて古いコードベースに戻すことで構成される1か月にわたる余波の恐ろしい見通しを持つ恐ろしい2週間のプロジェクトになりました。皮肉なことに、30クラスの混乱の記述は、便利なスクリプトにずっと乗っていた可能性があるため、クリーンなソリューションよりも時間がかかりました。私の経験では、反復作業を遅らせて自動化することは、長時間実行される大規模なソフトウェアプロジェクトにおける主要な問題の1つです。

5
tdammers

私はこれを思い出しました:

xkcd - Is It Worth the Time?

もちろん、これの問題は、実際の状況では、これらのデータを簡単に測定してテーブルの適切なセルを選択できないことです。そして、他の回答で述べたように、方程式に追加する必要がある他の変数があります(エラーのリスク、タスクは一度でも実行するには退屈すぎる、など)。

だから私の答えは、それは本当に状況に依存するということであり、すべての状況に対して「正しい」答えを得ることを望んでいるわけではありません。私たちがすべての料理本を持っているとしたら、やっぱり人生は退屈でしょう。

4
Honza Brabec

これは私の経験では大きな問題です。通常、ツールの作成は、ツールを作成するための作業をやめるやる気のある開発者に任されています。これは、たとえ価値があっても、開発を妨げることがよくあります。ツールの構築は、開発「プロセス」の統合された部分と見なす必要があります。

ヘッダーエラーが原因で別のレビューがスケジュールされるコードレビューに参加したことを覚えています。これらの多くは、ツールによって検出された可能性があります。例えば不正なslocカウント、不足している要件、フォーマットエラー。 Perlで記述された私のツールは、提供されたコードからヘッダーを生成し、Oracleデータベースから要件を検証しました。それは私たちの「プロセス」の一部ではなかったので、短期的には、ツールは配信の遅延と見なされていました。

チーム全体が定期的に停止し、ツールの作成によって自動化できる手動の作業がある場所を確認する必要があります。

3
donleslie

他のすべての答えは良いですが、小さなツールを構築するために時間を費やすことが重要である理由をもう1つ追加します(そして、.vimrc、.emacsなどをカスタマイズします)。

時には、創造的または動機的に「わだちに突き刺さる」ようになり、何かを行うと、「隠喩を混ぜるために」再び「ジュースが流れるようになります」。理想的には、それは生産的にプロジェクトを推進するものになるでしょうが、それが少し接線であり、あなたに刺激を与えるなら、それも良いことです。

空白の画面を見つめていない可能性がありますが、その代わりに、大きなタスクで行っている進捗状況を簡単に確認できません。そのような状況では、具体的なものをカチカチ音をたてると、どこにも行かないように感じることができなくなります。

これのバリエーションは、「バックバーナー」にあるべきものについて考え続けるときです-少し時間をとってそれを実行すると、それが頭から離れて、メインのタスクに再び全力を注ぐことができます。

2
Tom

それはあなたが道具を作ると考えるものに依存します。間違いなく、他の開発者が軽薄だと考えるような方法でそれらをロードします...最も基本的なファイルシステムコマンドを除いて、約everythingで作成するためです。

それをサポートするために2つの根拠を使用します。

  • これはDRY原則の拡張です。何かを繰り返したい場合、人的資源の最も効果的な使用は手作業です。
  • これは私が行った作業を記録する効果的な方法です。そのため、何かを作成した場合、私(または他の誰か)は、数週間または数か月後にそれを作成した方法を参照し、プロジェクトの作業ログを保持することができます。

時々、それらはより大きなツールに成長し、インタラクティブな機能を獲得しますが、そうでない場合でも、レコードとしての価値があります。

1
James Snell