JavaRush /Java Blog /Random-JA /ソフトウェアエンジニアとは誰ですか? ソフトウェアエンジニアリング VS 「単なる」プログラミング

ソフトウェアエンジニアとは誰ですか? ソフトウェアエンジニアリング VS 「単なる」プログラミング

Random-JA グループに公開済み
ここでは、ソフトウェア エンジニアリングとプログラミングの違い、またはソフトウェア コンセプトの開発が「単なるコーディング」とどのように異なるかについての Samer Buna による 記事を改作したものを 紹介します。
ソフトウェアエンジニアとは誰ですか?  ソフトウェアエンジニアリング VS
すべてのソフトウェア エンジニアはコーディングできますが、すべてのプログラマーがソフトウェアの概念を開発できるわけではありません。「ソフトウェア エンジニア」(別名ソフトウェア エンジニア)という用語を好まない人もいます。これは、建設など、より物理的なものについて話すときに「エンジニア」という用語がよく使われるためです。もちろん、私たちの記事はこの用語そのものについてではありません。突然拒絶反応を引き起こした場合は、創造性に関連するものに簡単に置き換えることができます。「ソフトウェア作成者」、「ソフトウェア作成者」...あるいは「ソフトウェア作成者」でも構いません。
「ソフトウェア エンジニア」について話すとき、私たちはコードを書くだけではなく、高品質のアプリケーションを作成することを主な仕事とする人を意味します。そしてこの点に、彼は自分の仕事に科学的アプローチと統計的手法を適用するという自分の天職を見出しています。彼にとって、プログラミングは単に食費を稼ぐための手段ではありません。
プログラミング能力があれば自動的にソフトウェア エンジニアになれるわけではありません。コーディングは誰でも学ぶことができ、見た目よりもはるかに簡単です。誰でも自分用に簡単なプログラムを作成できますが、同じプログラムが他の人でも機能するという保証はありません。私のお気に入りの例はこれです。私たちの多くはシャワーの中で歌いますが、残念なことに、このパフォーマンスは必ずしもプロのステージに値するとは限りません。もちろん、質の高い音楽体験を求めるなら、プロに頼ることになるでしょう。 さらに例が必要ですか?
  • 私たちは皆、学校で数学と文章を学びますが、だからといって私たちが数学者や作家になるわけではありません。
  • 私たちのほとんどは、まずまずの、時には非常においしい料理を準備することができますが、大使館の夕食会のために100人分のテーブルを準備する勇気のある人は誰もいません。この場合、料理人を雇います。
  • レゴで印象的な傑作を生み出す近所の子供に新しい家の建設を完全に任せる準備は今すぐできていますか?
この記事で私が伝えたい主な点は、単純なプログラムはエンジニアが設計したプログラムとは大きく異なるということです。 プログラミング プロセスの最も単純な定義: 与えられた入力パラメーターを指定して、出力として特定のものを取得するためにコンピューターのアクションの順序付けられたシーケンスを作成すること。 ソフトウェア エンジニアリングのプロセスは、多くのユーザーの問題を解決するためのコンピューター プログラムの設計、作成、テスト、およびキュレーションです。それは、時の試練に耐え、明白を超えた未知の課題に対処できる、信頼性が高く安全なソリューションを作成することです。
ソフトウェアエンジニアとは誰ですか?  ソフトウェアエンジニアリング VS
ソフトウェア エンジニアは、自分たちが解決する問題、提案するソリューション、それらのソリューションの制限、プライバシーとセキュリティについてすべてを知っています。私の意見では、問題の本質を理解していない人は、解決策のプログラムを開始すべきではありません。

エンジニアリングの考え方 - 応用ソリューションの検索

ソフトウェア エンジニアは、ソフトウェアを書くこと自体が主な目標であるとは考えていません。彼らはニーズを満たし、問題を解決するという観点から考えます。すべての問題がソフトウェアによる解決策を必要とするわけではないため、これは重要です。それらの中には、既存のプログラムを使用して対処できるものもあります。一部の問題の発生は事前に予測できる場合があり、適切なプログラム設計の助けを借りて、将来的には回避できる可能性があります。

「知識人は問題を解決し、天才は問題を防ぐ」

- アルバート・アインシュタイン

ソフトウェアエンジニアとは誰ですか?  ソフトウェアエンジニアリング VS
複雑な問題では、多くの場合、大量のプログラムを作成する必要があります。アプリケーションの並列実行が必要なタスクもあれば、複数のプログラムの順次実行が必要なタスクもあります。多くの問題は、ユーザーをトレーニングするだけで解決できます。ソフトウェア エンジニアは、プログラムの作成を開始する前に、次のようないくつかの質問を自問します。
  • どのような問題を解決すればよいでしょうか?
  • それらを解決するコードを書く以外に何ができるでしょうか?
  • アプリを使ってこれらのタスクを簡単にするにはどうすればよいですか?

プログラムの品質とコードの品質

優れたプログラムは明確で読みやすいものです。これらは拡張が簡単で、他のプログラムとうまく連携し、作業するのは悪夢ではありません。コードの品質は交渉の余地がありません。高いはずだ、それだけだ。それを考えると、プログラマーの機嫌が悪いとか、締め切りが厳しすぎる(ああ、締め切りだ!)などの言い訳は受け入れられません。ソフトウェア開発の最も重要な側面の 1 つは、将来の保守と変更が容易になるようにプログラムを設計することです (こんにちは、OOP!)。現在、ほとんどすべてのソフトウェアは変更可能であり、多くの場合、このプロセスはユーザーの参加がなくても実行されたり、「プログラムが更新されました。[OK] または [延期] をクリックしてください」以外のユーザーの操作は必要ありません。もちろん、ユーザーにはアプリケーションに新しい機能を要求する権利があります (特に、Java で書かれた長期稼働のエンタープライズ ソフトウェアや、何年もプレイできるオンライン ゲームについて話している場合)。
Java プログラミングについてもっと知りたいですか? Java 開発者グループに参加してください。
コード自体は、有用とは言い難いです。ソフトウェアの有用な機能は、異なるアプリケーションが相互に通信し、データを交換し、連携してデータとインターフェイスをユーザーに提示するタスクを実行するところから始まります。
ソフトウェアエンジニアとは誰ですか?  ソフトウェアエンジニアリング VS
プログラムはこれらの点を念頭に置いて設計する必要があります。彼らはどのようなメッセージを受け取りますか? どのようなイベントが監視されますか? 認証と認可はどのように行われるのでしょうか? 優れたプログラムのもう 1 つの同様に重要な兆候は、アプリケーションが合格したテストの数や良好なテスト カバレッジではなく、コードの明瞭さです。一見単純な質問: 「私以外の人は私のコードを理解できますか?」、「今日このコードを書いて、数週間後に理解できるでしょうか?」プログラミングにおける最も難しい 2 つのことについてのよく知られた引用は次のとおりです。

「本当に難しいことは 2 つだけです。キャッシュの無効化とエンティティの命名です。」

— フィル・カールトン。

コードの読みやすさは、一般に考えられているよりもはるかに重要です。残念ながら、コードを明確にするための正確なメトリクスやパラメータを定義することはできません。一般に受け入れられている言語規範、優れたソフトウェア モデル、開発方法を覚えておくと、部分的には役に立ちます。しかし、通常、これでは十分ではありません。真のプロフェッショナルは、時間と経験を経て、いわば直感に似た「明晰さの感覚」を身につけます。ここでは、文章の比喩がうまく機能します。多くの単語を知っていても、簡潔で意味が明確な文章を書くのには役立ちません。

「もっと短く書けばよかったのですが、時間がありませんでした。」

- マーク・トウェイン。

バグを迅速かつ簡単に修正できることは、優れたソフトウェアの重要な機能です。プログラム内のエラーは明確なメッセージを送信し、追跡のために一元的に記録される必要があります。新しいエラーが報告された場合、それを修正する人はそれをデバッグする能力を持っていなければなりません。システムに簡単に接続し、いつでも実行情報にアクセスでき、システムのどの部分の機能も簡単にチェックできる必要があります。

環境とテスト

ソフトウェア エンジニアは、アプリケーションを開発するとき、異なるアーキテクチャのコンピュータや異なるオペレーティング システムで動作するように最善を尽くします。ソフトウェアがさまざまな解像度や画面の向きで動作すること、また必要以上にメモリや処理能力を「消費」しないことが重要です。
ソフトウェアエンジニアとは誰ですか?  ソフトウェアエンジニアリング VS
Web アプリケーションに関しては、すべての主要なブラウザで動作する必要があります。デスクトップ アプリケーションを作成するときは、それが Mac、Windows、および Linux 上で正しく起動し、動作することを確認する必要があります。そうですね、プログラムはデータに依存しているため、データ接続が遅い場合やデータ接続がない場合でもアプリケーションは動作するはずです。ソフトウェアを作成するために、エンジニアはあらゆる種類のシナリオのオプションを検討し、それらをテストする計画を立てます。すべては、すべてがエラーなしで機能する理想的なオプションを選択することから始まります。次に、潜在的な問題を文書化し、テスト計画に書き込みます。一部のエンジニアは、考えられるすべての問題やエラーのシナリオをシミュレートする、テスト ケースと呼ばれるコードを作成することから始めます。そして、検討されたオプションのいずれかを使用できるプログラムが作成されます。才能あるソフトウェア エンジニアに特有の能力は、コードの書き方を知らないことではなく、アプリケーションが出力として何をすべきか、そしてそれをどのように達成するかを理解していることです。顧客のソフトウェア要件が不完全で、曖昧な可能性がある場合、エンジニアはそれを正しく評価し、「理解」する必要があります。

コストと効率性

ほとんどの場合、ソフトウェア エンジニアは問題をすぐに解決できます。「高価な」経験豊富なプログラマーを雇うとコストが増えると考えている場合は、考え直してください。雇用されたプログラマーの経験が豊富であればあるほど、シンプルできちんとした、信頼性が高く使いやすいソリューションをより早く提供できるようになります。長期的には、これによりソフトウェア開発コストが確実に削減されます。
ソフトウェアエンジニアとは誰ですか?  ソフトウェアエンジニアリング VS
プログラムの実行コストも考慮する必要があります。どのプログラムもコンピューティング リソースを使用しますが、それらは無料ではありません。
ソフトウェア エンジニアの仕事は、コンピューティング リソースを不必要に使用しない効率的なコードを作成することです。
たとえば、頻繁にアクセスされるデータをキャッシュすることは、望ましい結果を達成するために使用できる戦略の 1 つです。しかし、これは、プログラムをより高速かつ効率的に実行できる、おそらく何百ものツールやソリューションのうちの 1 つにすぎません。初心者のプログラマーは安価なソリューションを提供してくれるかもしれませんが、そのようなソリューションを使用すると、最初から効果的なソリューションを作成した経験豊富な開発者と協力する場合よりも、最終的にはあなたとクライアントのコストがはるかに高くなります。

ユーザーエクスペリエンスに重点を置く

優れたプログラマーは、ユーザー エクスペリエンス (UX) を念頭に置いて開発します。人間と機械のインタラクションは、終わりのない研究と解決策が存在するテーマです。より多くのソリューションを適用すればするほど、プログラムはより良いものになるはずです。この方向性がどのようなものかを感じていただくために、いくつかの例を示します。
  • 電子メールなどのデータ入力フォームを設計する場合、優れたプログラムでは電子メール アドレスの大文字と小文字を無視する必要があります。電子メール アドレスは小文字で一意であるため、CAPSLOCK キーが押されてもエラーはスローされません。プログラムが新しい電子メール アドレスの入力を受け入れる場合は、入力プロセスの早い段階でそのアドレスを確認し、間違ったアドレス形式を使用していることをユーザーに警告します。このソリューションには、「@」記号の欠落などの明白なチェックと、「gmail.ocm」などの文字の順序が間違っていないかのチェックなど、それほど明白ではないチェックの両方が含まれています。

  • ユーザーが何らかのアクションを実行するためにリダイレクトされた場合、優れたプログラムはユーザーの現在位置を記憶し、終了後にユーザーを元に戻す必要があります。優れたプログラムは、ユーザーがすでに送信したデータも記憶している必要があります。これは、ユーザーとのさらなる対話にとって重要です。

    Expedia のゲストとして航空旅行を検索しているとします。後で、アカウントを作成することにします。アプリは以前のすべての検索を新しいアカウントに保存し、他のデバイスからアクセスできるようにする必要があります。


  • ソフトウェアエンジニアとは誰ですか?  ソフトウェアエンジニアリング VS
  • 優れたプログラムは、ユーザーの行動シナリオを念頭に置いて設計されています。「まあまあ」ベースで新機能を追加するだけでなく、ユーザーの立場に立って考えてください。ある日、飛行機のチケットを予約していたのですが、マイレージ番号を記入するのを忘れてしまいました。確認を受け取った後、航空会社のウェブサイトにアクセスして、割引を受けるために追加することにしました。これを行う方法を見つけるために、私は 10 分ほどサイトをいじりました。アプリケーションは非常に分かりにくいものであったため、必要なものを見つけるためにサイトのさまざまなページを目的もなくさまよっただけでした。後で、私はすでに何度か正しいページにたどり着いていることに気づきましたが、必要なフィールドが巨大なフォームの他の同様のフィールドの中に紛れ込んでいたため、それを理解することさえできませんでした。

    旅行情報を編集するには、フォームを約 20 行スクロールしてポイント カード番号と電話番号を入力する必要があり、それがないと確認のためにフォームを送信できないことがわかりました。これは、ユーザーがどの程度快適に使用できるかを考えずに開発されたプログラムの一例です。

信頼・安心・安全

私の意見では、プロのソフトウェア開発者とアマチュアの最も重要な違いは、アプリケーションを作成するときにアプリケーションの信頼性、セキュリティ、安全性などのパラメータを考慮することです。
真のプロフェッショナルは、自分のソリューションの安全性とセキュリティに対して責任があることを知っています。
プログラムの一部は、誤った入力、誤った状態、および誤った相互作用を許容する必要があります。これは確かに強制するのが非常に難しく、ソフトウェアのバグが原因で死亡した人の話を聞く主な理由です。ユーザーは、プログラムに間違ったデータを入力しており、入力し続けており、今後も入力し続けます。これは事実として受け入れなければなりません。さらに、アプリケーションを破壊して利用可能なリソースにアクセスすることを目的として、意図的にこれを行う人もいます。
ソフトウェアエンジニアとは誰ですか?  ソフトウェアエンジニアリング VS
これが実際の例です。最近の Equifax のデータ漏洩の責任者とされる人物は、一般に公開されているすべてのソフトウェア製品における悪意のある入力に対抗するソリューションを開発するという職務上の責任を怠ったとして告発されています。情報セキュリティに関連するインシデントには、誤った悪意のある入力だけでなく、誤って入力されたデータも関係します。ユーザーがパスワードを忘れた場合、何回パスワードの入力を試行できますか? この後彼をブロックしますか?他の人が自分のアカウントをブロックしようとした場合はどうなりますか? ユーザーは、暗号化されていないデータ チャネルを介して資格情報を送信できますか? ログイン要求が通常とは異なる場所から送信された場合はどうなりますか? ログイン試行が自動的に行われたように見える場合はどうしますか? クロスサイト スクリプティング、クロスサイト リクエスト フォージェリ、一般的なフィッシングからユーザーを保護するために何をしましたか? サーバーに対する DDoS 攻撃に備えたバックアップ戦略はありますか? これらの質問は、考慮する必要がある問題のほんの一部を明らかにしています。保護されたプログラムは重要な情報をテキスト形式で保存しません。複雑な一方向暗号 (暗号化は簡単ですが、キーがなければ復号化はほぼ不可能) で保護されています。これらはプログラムがハッキングされた場合のバックアップ手段です。ハッカーは、自分たちにとって役に立たない暗号化されたデータを発見します。最良のプログラムであっても予期せぬ問題が発生します。そうした事態に備えることができないプログラマは、プロフェッショナルとは到底言えません。予期しない動作が予想されるまでは、彼はエンジニアではありません。彼は「安全でないプログラムの作者」です。プログラム内のエラーは必ずしも明らかであるとは限りません。既知のエラーを予測して防止する私たちの知的能力には限界があります。このため、ソフトウェア エンジニアは、正しく安全なソフトウェアを作成できる優れたツールの重要性を理解しています。

必要なツール

異なる優れた開発ツールが必要であることは疑いの余地がありません。その役割は過小評価されがちですが、実際には、多くの時間と労力を節約し、一部のタスクを桁違いに簡素化します。デプロイメントのために、いわば昔ながらの方法でファイルを FTP 経由でアップロードする必要がある場合を想像してみてください。Chrome DevTools を使用せずにネットワークとパフォーマンスの問題をデバッグできることを想像してみてください。そして、最近、ESlit と Prettier なしで JavaScript コードを書くのは、なんと非効率的でしょう。
ソフトウェアエンジニアとは誰ですか?  ソフトウェアエンジニアリング VS
コードを作成する際のフィードバック時間を短縮するツールはすべて歓迎されるべきです。以前はなじみのなかった、しかし本当に便利で効果的なツールを見つけたとき、その幸せな瞬間を迎える前にそれを使わなかったことを後悔するだけです。
より優れた最新のツールは、より優れたプログラマーになるのに役立ちます。それらを見つけて、使用し、評価し、可能であれば改善してください。そして、同じことに執着しないでください。新しいツールをインストールして一度学習するのに時間を費やすだけで、その後は何倍も早く問題を解決できるかもしれません。

ソフトウェアエンジニアリングの進化

ソフトウェア エンジニアリングを 2 か月、6 か月、さらには 1 年で学ぶことはできません。ソフトウェア エンジニアになる方法は、コース、大学、ブートキャンプでは教えられません。私は過去20年以上勉強しており、今も勉強を続けています。私は、何千人ものユーザーが使用するアプリケーションを学び、開発、作成、保守してきた 10 年間を経て、初めて自分を経験豊富なプログラマーと安心して呼べるようになりました。ソフトウェア エンジニアリングは誰にでも適しているわけではありませんが、誰もがコンピューターを使用して問題を解決する方法を学ぶ必要があります。簡単なプログラムの書き方を学べるなら、そうすべきです。公開されているソフトウェアの使用方法を学習できる場合は、学習する必要があります。オープンソース ソフトウェアの使い方を学び、それを自分用にカスタマイズできれば、あなたはスーパーパワーを手に入れたことになります。開発者には毎日、新たな課題や新たな問題が降りかかるため、ソフトウェア エンジニアリングが必要となります。この職業の主な仕事は、一般の人が何年もソフトウェアを扱う必要がないようにソフトウェアを作成することです。そのため、プログラムを操作するために長い時間をかけて勉強する必要はありません。それでも、ソフトウェア エンジニアは、より複雑な既知の問題を解決できるより良いツールを作成することを常に考えており、新しい問題ができるだけ発生しないようにできる限りのことを行っています。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION