私はソフトウェア開発に10年以上携わってきましたが、「新しい」ものを作成することはめったにありません。 「新しい」とは漠然とした用語であることを理解していますが、明らかに新しい大規模プロジェクトから既存のプロジェクトの新しい大きな機能までを定義します(たとえば、設計に何らかの検討が必要で、完了するまでに2週間以上かかります)。仕様書が必要な場合、大まかなガイドラインは新しいものかもしれません。私はほとんどのプログラマーが私が話していることを知っていると思います-あなたはゾーンにいて、速いペースでたくさんのコードを書いています。
とにかく、私がやったことを思い出してみると、私の時間の10%未満が「新しい」仕事に費やされていると推定します。 「この既存のシステムをこの新しい環境で動作するように適合させる」などのことは確かに多くの計画を必要としますが、実際のコーディングと「新しいもの」は、コード全体の多くの場所で小さな変更を加えることになります。同様に、小さな機能のリクエストの場合-何をすべきか知っている場合、これらは1時間以内に終了することが多く、知らない場合は、コードをたくさん読んで、何をすべきかを理解するだけです(これは、読むことではなく、行うことではるかに良くなります)。
一般に、ほとんど何も作成していないような気がします。ほとんどの場所でこれが事実であると私は思っていました-新製品はかなり早く出てきて、その時点で誰もが興奮してコードを急上昇させますが、ライブになるとメンテナンスモードに移行します。その後の変更のいくつかは、「新規および創造的」と見なされます。
私が間違っている?私はほとんどのプログラミングジョブを正確に説明していますか、それともほとんどのプログラマーはしばしば新しいものを作成しているように感じますか?
ソフトウェアの多くの作業はメンテナンスです。もちろん、採用担当マネージャーが実際にこれを教えてくれるわけではありませんが、確かにそうです。
はい、あなたの認識は正確です。新しいシステムの作成よりもシステムの保守にはるかに多くの時間、お金、労力が費やされるというのは絶対的な自明です。ですから、ほとんどのプログラマーの時間配分はそれを反映していることは明らかです。
これの理由の一部は、多くの人々が「新しく創造的な」ことを行うと、それを上手く行かないため、システムのメンテナンスが困難になることです(これは特に、自分でメンテナンスを行ったことがない場合に起こりがちです)。小さなグリーンフィールドプロジェクトに常に取り組んできた人は、本当に有能であると主張することはできません。
別の(おそらくもっと大きな)理由は、ほとんどのシステムが1回限りのイベントだけでなく、継続的に役立つように設計されていることです。そのため、開発にかかる時間よりもずっと長く慣れ続けています。しかし、その間、法律、市場、調査、ユーザーなどの変化により、要件は変更されます(追加されます)。それはメンテナンス作業を意味します。
従来のシステムが成功しています。プロジェクトの50%が失敗した最初の開発プロセスは成功しました(成功が再定義された後でも!)。彼らは変化するビジネス環境を生き延びました。彼らはおそらく、すべてをJavaまたは当時流行だったものすべてに書き直すという若いナイーブプログラマーによる約10の提案を生き残った。彼らは、ソフトウェアが様々な予算削減、再編、合併などを乗り越えて役立っていました。
おそらく、作成されたソフトウェアの5%未満が10年後も実行されます。
したがって、これについてうめき声を上げるのではなく、そのようなダーウィンのサクセスストーリーに取り組む特権であり、現実世界で何が機能し、その理由を学ぶ機会であると考えてください。
古い開発に依存しない新しいプロジェクトによく使用される用語はgreenfield projectです。仕事のリストに時々その用語が表示されることがあります。他の誰かの失敗した努力を引き継ぐのではなく、最初から始めることができることを知っていると、仕事がより魅力的になります。
成功するソフトウェアプロジェクトは、通常、新しいプロジェクトとして構築するよりも維持に多くの時間を費やします。そのため、完全に「新しい」ものをたくさん実行しなくても、驚くことではありません。
また、何かを作成する完全に新しいことはlotの作業です。グリーンフィールドプロジェクトであっても、プラットフォーム、コンパイラ、フレームワーク、ライブラリなど、役立つツールをいくつか選択することになります。これらの選択を行うとすぐに、プロジェクトに特定の制約が課せられます。これは、あなたがもう新しい仕事をしていないと言っているのではなく、「新しい」というのはここでは相対的な用語です。グリーンフィールドプロジェクトとは呼ばない場合でも、既存のプロジェクトに機能またはモジュールを「新規」として追加することは、それほど大きなステップではありません。
それはあなたが求める仕事に依存します。
純粋なソフトウェア製品会社で働いたことが一度しかありませんでした。小規模なスタートアップチームで彼らの単一の金メッキアプリケーションに取り組みました。
それ以外の場合は、社内のR&Dまたは社外の製品をサポートするためのソフトウェアを必要とするテクノロジー企業で働いていました。
良い点は、完全な最初から最後までの製品を構築し、自分が望むものをほとんど構築できることです。時には、既存の市場をリードするアプリケーションに機能を追加するのに行き詰まっている場合よりも、新しいテクノロジーを試すこともできます。
欠点は、製品の一部ではなく、コストの一部であることです。 「私たちはソフトウェアを実行していない」/「ソフトウェアはコアビジネスではない」という理由でプロジェクトを缶詰にしました=ソフトウェアを使用せずに100万ドルの工作機械を販売することができると企業が考えているのは驚くべきことです。
他の誰かの混乱を継続的にクリーンアップするものとしてレガシーコードを見るのではなく、多くの新しいプロジェクトに取り組む機会としてそれを見てください。
考えてみてください。システムに追加されるすべての新機能は、それ自体が小さなプロジェクトです。ジョブを適切に完了させるには、SDLC全体を適用する必要があります。確かに、機能の仕様が与えられる可能性がありますが、通常は細かい部分は残されているため、図のように問題を分析し、変更を適用するための最良の方法を設計し、テストし、コーディングします。それをリリースしてバージョン管理システムに戻します。将来的には維持する可能性があります。
あなたが完全に緑の畑で仕事をすることがあまりないのは私の経験です、そしてあなたがそうするのに十分幸運であるとき、あなたはそれがメンテナンスのかなりの部分を通して、そしておそらくさえのためにプロジェクトを見ることが期待されるでしょう製品の寿命、または特定の雇用者と一緒にいる時間全体。これは、製品との親密な経験がナレッジリポジトリになることを意味し、他の作業に移るのはコストがかかると考えられます。既存の製品を開始するとき、それは雇用主が最近プロジェクトでリソースを失ったか、より多くのリソースを必要としているためであり、彼らのビジネスはそれがソフトウェアへの投資であまり大きな損失を出さないことを確認する必要がある。それがソフトウェアエンジニアであるという現実です。
私はIT業界で22年近く働いており、最後の15年間はソフトウェア開発者でした。その間、私は5つの製品しか作成していません。ほとんどの時間は、これらの製品を長期間維持するか、他の誰かの製品。それぞれが私に解決すべき課題と問題を与えてくれました、そして、それぞれは単に私が一部である大きなプロジェクトとしてだけでなく、完了するべき巨大な一連のマイクロプロジェクトとしても扱われました。
少しの精神体操が、あなたの毎日の仕事に対するあなたの認識と楽しみを完全に変えることができるのは驚くべきことです。 ;-)
既存の製品を改善したり、既存のコードを新しい顧客や市場に適応させたりすることを含む、多くのソフトウェア開発の仕事を考えています。
これは実際には「メンテナンス」ではありません。たとえば、VMWareはバージョン8をリリースしたばかりで、メイン製品のメジャーアップグレードです。 VMWareのコードの最初の行が書かれたときには、この作業を行った開発者はほとんどいなかったと思います。彼らは、ずっと先に進んだ人たちによって書かれたコードに大きなアップグレードを構築しました。
Workplace Betaでは、Googleの20%の個人プロジェクトシステムの仕組みについて質問があります 。
Googleは、最高の開発者が新しいソフトウェア製品の作成に参加したいと考えており、最終的には次のポイントリリースに向けて小さな機能を追加したりGUIを微調整したりすることにうんざりするだろうと確信しています。
20%のプロジェクトを持っていることで、Googleの開発者はGoogleのプロジェクトを改善し続けることを気にせず、何か新しいことを始めてもそこにいることができるという楽しみを持っていると私は推測しています。
それはあなたが働いている会社に依存すると私は言うでしょう。
私の最初の仕事は、主な製品がERPシステムで、Great PlainsまたはPeachtreeとほぼ同じレベルで競合している会計ソフトウェア会社でした(QuickBooksから上に移動したとき、またはGPの難読化されたスキーマまたはPTに問題があると思われることにうんざりしていて、層から完全にSAPのようなパッケージに移動しました。そのジョブは99.99%のメンテナンスで、バグの修正と「小さなもの」の追加として定義されましたソフトウェアの動作方法や実行可能な機能を根本的に変更することなく、CEOがシステムを1ページずつ書き直したいと思ったときに会社を辞めました。インナープラットフォームなどのパターン(基本的に、顧客に低レベルのVS Designerを提供することでプログラムを高度にカスタマイズし、式言語を提供することでビジネスルールをカスタマイズできます)。
その後の私の次の仕事は、「ターンキー開発」を行った契約会社でした。お客様の仕様にあったシステムは、ハードウェアとソフトウェアから完全に構築され、プロジェクトが完了すると、すべて自分で維持するか、月額料金で会社のサービスを維持できるクライアントに引き渡されました。私の仕事はこれらの主要なプロジェクトの1つを開発することでした。そのため、私が働いている間、私がしたことのほとんどすべては、始める前には存在していませんでした。それでも、開発は本質的に反復的です。あなたはいつもあなたがすでに持っているものに追加しています(あなたが持っているものが何もない場合でも)、そしてあなたは退行の問題(古いものを壊す新しいもの)を避けて修正しなければなりません。また、プロジェクトが「保証」ステータスに移行すると、新しい機能が完成し、お客様がUAT中に発見した欠陥を修正することが期待されていました。
私の現在の仕事は、社内監視に戻り、セキュリティ会社がビデオモニタリングとオーディオフィードバックを使用して、アラーム信号の検証やその他の「バーチャルガード」サービスを提供しています。この分野は急速に成長し、まだ発展しています。新しい機器は常に市場に参入し、新しいことを私たちにしてほしいという新しい顧客が登録されており、既存の製品は適応するULおよび政府規制に適合しなくなっています。この仕事の99%は「統合」です。以前は存在しなかった新しいソフトウェアを作成し、新しいが既存の機器またはソフトウェアを、おそらく古い既存の機器またはソフトウェアと連携させて、両方で新しいことを実行できるようにします。
新しい仕様に準拠するために、新しい機能の作成と既存のコードの機能の変更に時間を費やします。
他の人はそのメンテナンスを呼びますが、それは恐ろしい言葉です。これは、ソフトウェアの再設計とリファクタリングまたは再コーディングであり、プログラムが何をすべきかという新しいアイデアに準拠させるためのものです。
それはあなたの役割の性質に大きく依存すると思います。
私は小さなチームの一員なので、自分で作成したものはすべて維持してサポートする必要があります。
5年前、私がしたことのほとんどは「新しい」ものでした-今では、既存のコードの保守は私の時間の少なくとも半分を占め、さらに25%は既存のシステムの「新しい」バージョンでした。
ただし、コードをリリースした後、開発者としてチームでメンテナンスとサポートを担当した場合、技術的にはすべてが「新規」になります。独自のコードを維持する必要のない仕事を見つけたら、それを手に入れましょう!
それはあなたの職位がどれほど危険かによって異なります:;-)
あなたが会社が存続するであろう高いリスクのある新製品を開発する新会社で働いているなら、あなたはおそらくいくつかの素晴らしい新製品を作ります。
市場で安定した位置にある古い会社で働いている場合、メンテナンスモードでコーディングする可能性が高くなります;-)。
新しいソフトウェアの作成は常に非常にtemptingです。 正しい方法でこれを行うのは難しい真実です。保守可能なコードを実行することは簡単な作業ではありません。
これらの多くの側面を考える場合は、適切なロギング、適切なモニタリングと統計の取得、効率的で、見知らぬ人でもプロジェクト、ドキュメント化、自動テスト、およびテスト駆動開発に関与するのに役立つ記述的な設計を作成して、適切なコードを作成する必要があります。
多くの人がそれを正しく行っているわけではないので、私たちは彼らのコードを維持し、適切な状態に磨く必要があります。 ;-)
良いニュースは、会社に十分に長く在籍している場合、新しいコードの記述方法に影響を与えることができるということです:-)
主にメンテナンスを行うかどうかは、少なくとも部分的にはあなたの管理下にあります。私の場合、過去15年以上の私の仕事のほとんどは新しい開発でした。これは、新しい開発を可能にする仕事を探しているからです。私は請負業者ではなく、一般的にWeb開発はしていません。私はほとんど常に小規模な雇用主で働いており、通常はニッチな分野(デスクトップGUI開発、QAツール、開発者ツール、垂直市場)で働いています。
私はまた、チームの優秀なプログラマーが(常にではありませんが)最高の仕事を得られることを直接経験しました。だから、あなたの会社で最高のプログラマであることに焦点を当てれば、あなたは新しい開発があなたの道を歩むのを見始めるでしょう。
メンテナンスの開発は困難な作業であり、新しい開発よりも多くの点で困難です。私の経験では、雇用主は開発者がメンテナンスを続けていることを好んでいます。レガシーテクノロジーの優れたメンテナンス開発者を見つけることは、最新の技術者と協力できる人を見つけるよりも困難です。
私は、すべてメンテナンスである製品チームと、すべて新規開発であるプロジェクトチームに分かれた会社で働いていました。両側に優れた開発者がいましたが、メンテナンス担当者は間違いなくより専門的で、レガシー技術を使用していました。
プッシュバックして新しい開発作業を依頼することを提案できますか?そしてあなたの雇用主がメンテナンスだけをしているなら、あなたは次に進む必要があるかもしれませんか?
それは多くの要因に依存すると私は言うでしょう。どこで働いているか、どのような製品を作っているか、チームはどのように編成されているかなど。
私が私の会社で働いた4年間、私は私の時間の70-80%が何か新しいものを作成することに費やされていると思います。おそらくその全体の50〜60%は、まったく新しいコードである大規模なプロジェクトに費やされ、残りの時間は現在の機能の拡張に費やされます。
私が知っていることの一部は、私の会社の仕組みです。私の開発チームの全員が新しい機能の構築にこれほど多くの時間を費やすわけではありません。バグの修正/狩り以外に時間を費やさない人はたくさんいます。まったく新しい機能である場合や、サポートが必要な場合は、調査のために私に送り込まれます。ただし、一般的には、バグハンターの小さなチームにより、開発者のより大きなグループが中断することなく続行できます。
私は QuickBooks とExcelを使用した会社で唯一の開発者としてほぼ3年間働いていました。これで Windowsフォーム アプリケーション、 SharePoint セットアップ、SQL Server +レポート、Excelアドイン、およびOutlookアドインができました。
todayだけですが、ユーザーが不満を抱かないレートで電子メールリクエストを管理する機能を失ったため、初めてチケットシステムをセットアップしました。これは、メンテナンスモードに入ったことを示しています。
私の以前の仕事は他の人が投稿したものに似ていますが、次の仕事が何をもたらすか分からないことを示すためだけに行くので、私は非定型の経験を投入すると思いました。私は疲れきっていますが、この仕事で学んだことは仕事の価値があります。
私が働いている会社のようないくつかの大規模な組織は、おそらくそれが書かれた開発言語がもう使用されていない(Delphiの誰か?)か、プラットフォームが置き換えられている(Windows XP)ために、数年後にソフトウェアを廃止する方針をとっています。 、または規制上の要件により要求されます。例えば。データベースと直接通信する2層プログラムが廃止され、Kerberos接続を使用してセキュリティを強化する3層が優先されます。
ユーザーは依然としてその元の機能を必要としているため、現在の最先端技術を使用した完全に新しいバージョンが開発されています。
このタイプのものには5〜7年の交換サイクルが必要です。たとえば、2020年までに、私が書いているWPF(クライアント)/ Java(サーバー)ソフトウェアは古い技術であり、新しいものに置き換えられると思います。