プリンキピア

第9章ソフトウェア工学

THINK IT THROUGH考えてみよう
Professional Responsibility in Software Engineeringソフトウェア工学における専門職の責任
Given the professional responsibility of software engineers working on various projects across the world, what is right or wrong, in your opinion, about the following matters in a software engineering context: developing systems for the military (e.g., creating an autonomous military drone); adding a backdoor to an existing system (e.g., providing authorities with a way to unlock a locked mobile phone); or modeling patient medication needs (e.g., prescribing pain medication for each hospital patient based on historical data).
英語のヒント
世界各地でさまざまなプロジェクトに取り組むソフトウェアエンジニアの、専門職としての責任を踏まえ、次の事柄の何が正しく、何が間違っていると思うか。ソフトウェア工学の立場から考えてみよう。軍用システムの開発(たとえば自律型軍用ドローンの作成)、既存のシステムへのバックドアの追加(たとえばロックされた携帯電話を当局が解除できる方法の提供)、患者に必要な投薬のモデル化(たとえば過去のデータに基づいて各入院患者の鎮痛薬を処方すること)である。
In each of these cases, the development of the system could provide real benefits. For example, an autonomous drone allows the military to act without putting its soldiers’ lives at risk, and a backdoor ensures law enforcement officials can get access to information they may need to solve a crime. But there are also drawbacks to each of these systems. The backdoor risks everyone’s privacy because anyone could use it to access private data on a phone, and relying on past medication data risks institutionalizing existing biases about who needs more (or less) pain medication. It is important for software engineers to consider all of the impacts that a system will have and determine whether these impacts are acceptable or not.
英語のヒント
これらのいずれの場合も、システムの開発は実際の利益をもたらし得る。たとえば、自律型ドローンなら兵士の命を危険にさらさずに軍事行動を取れる。バックドアがあれば、犯罪の解決に必要となり得る情報へ法執行機関の職員がアクセスできる。しかし、それぞれに欠点もある。バックドアは誰でも電話の私的なデータにアクセスするために利用できるため、すべての人のプライバシーを危険にさらす。また、過去の投薬データに依存すると、誰がより多く、あるいはより少なく鎮痛薬を必要とするかについて、既存の偏見を制度に組み込んでしまうおそれがある。エンジニアは、システムがもたらすすべての影響を検討し、それを受け入れられるかどうかを判断する必要がある。

Software Engineer Skillsソフトウェアエンジニアの技能

As mentioned earlier, a software engineer is involved in the creation of software. Software engineers work with others and are a part of a team. They must be able to understand and act on a vast array of requirements. To accomplish what is required, a successful software engineer must have strong analytical and problem-solving skills, must communicate well with their peers, must be a team player, must take responsibility for their commitments, must exhibit attention to detail, and must be pragmatic when adapting software engineering practices based on circumstances. In addition, software engineers must be flexible when it comes to adopting new technologies. Therefore, in terms of technical skills, software engineers must have a solid foundation in the following areas:
英語のヒント
先に述べたように、ソフトウェアエンジニアはソフトウェアの作成に携わる。ほかの人々と協力し、チームの一員として働くため、非常に幅広い要求を理解して、それに応じて行動できなければならない。求められることを成し遂げるには、優れた分析力と問題解決力を持ち、同僚と円滑に意思疎通し、チームとして協力し、引き受けた仕事に責任を持ち、細部に注意を払う必要がある。また、状況に合わせてソフトウェア工学の実践を調整する際には、現実的でなければならない。新しい技術を取り入れる柔軟性も必要である。したがって、技術的な技能として、次の領域に確かな基礎を備えていなければならない。
• Problem-solving and algorithms: Software engineers are like detectives who solve puzzles. They use algorithms, which are step-by-step instructions, to efficiently solve problems. Understanding different algorithms allows them to choose the best approach for a specific task. There are many algorithms that can be considered essential, and it can be hard to learn all of them. Understanding the importance of algorithms and being willing to learn new things is a required skill for software engineers.
英語のヒント
• 問題解決とアルゴリズム:ソフトウェアエンジニアは、謎を解く探偵のような存在である。段階を追った命令であるアルゴリズムを用い、効率よく問題を解く。多様なアルゴリズムを理解していれば、特定の課題に最適な方法を選べる。必須と考えられるアルゴリズムは多く、すべてを習得するのは難しいかもしれない。それでも、アルゴリズムの重要性を理解し、新しいことを学ぼうとする姿勢は、エンジニアに必要な技能である。
• Data structures: Imagine a well-organized toolbox where each tool has its designated spot. Data structures are like these toolboxes, but for data! Knowing different data structures (such as arrays, lists, trees, stacks, and queues) and being able to assess their benefits and drawbacks helps software engineers organize information efficiently for their programs. The knowledge of fundamental data structures is essential because without efficient data structures, you cannot write efficient code.
英語のヒント
• データ構造:道具ごとに決まった置き場所のある、よく整理された道具箱を想像してみよう。データ構造は、いわばデータのための道具箱である。配列、リスト、木、スタック、キューなどの構造を理解し、その利点と欠点を評価できれば、プログラムの情報を効率的に整理できる。効率的なデータ構造なしには効率的なコードを書けないので、基本的なデータ構造の知識は欠かせない。
• Programming languages: There are many programming languages and each one of them has strengths and weaknesses. Software engineers should be familiar with at least a few core languages, such as Java, Python, or C++. Most important, they should be adaptable and willing to learn new languages as needed.
英語のヒント
• プログラミング言語:言語は数多くあり、それぞれに長所と短所がある。エンジニアは、Java、Python、C++など、少なくともいくつかの主要な言語に精通しているべきである。何よりも、変化に適応し、必要に応じて新しい言語を進んで学ぶ姿勢が重要である。
• Software engineering process: Software is usually developed in a team and follows a process. This process describes how to organize a team of developers effectively as well as how to approach the creation of the software. There are many approaches to team-driven software development and software engineering processes can be either continuous or discrete. Discrete processes, such as those advocated by Agile development2 , encourage flexibility as to what activities are required and to what degree within a given project. Usually, all activities will be conducted when using continuous processes. A software engineer should be familiar with the pros and cons of various software engineering processes to be able to apply the best one to their own software development projects. Later in this chapter, both traditional and Agile software development life cycle (SDLC) processes, and various related models and frameworks, are covered in more detail.
英語のヒント
• ソフトウェア工学の工程:ソフトウェアは通常、チームで、一定の工程に従って開発する。この工程は、開発者のチームを効果的に編成する方法と、作成にどう取り組むかを示す。チームによる開発にはさまざまなアプローチがあり、ソフトウェア工学の工程は連続的な場合も離散的な場合もある。アジャイル開発2が提唱するような離散的な工程では、そのプロジェクトでどの活動をどの程度行う必要があるかについて、柔軟性を重視する。連続的な工程では通常、すべての活動を実施する。エンジニアは、自分のプロジェクトに最適な工程を適用できるよう、各種の工程の長所と短所に精通しているべきである。本章の後半では、従来型とアジャイル型のソフトウェア開発ライフサイクル(SDLC)の工程、および関連する各種モデルや枠組みをさらに詳しく扱う。
• Testing: The purpose of testing is to ensure that a software system is free of defects and meets the functional and nonfunctional requirements. It is important to realize that testing is an ongoing activity that occurs throughout the software engineering process. For example, software engineers may conduct unit testing of a website’s checkout functionality as part of their software construction activities to make sure that the software calculates the total of a customer’s order correctly. They may also be involved in integration testing as components developed by other team members are being integrated.
英語のヒント
• テスト:テストの目的は、システムに欠陥がなく、機能要件と非機能要件を満たすことを確かめることである。テストは、ソフトウェア工学の工程の全体を通じて継続する活動だと理解することが重要である。たとえば、構築作業の一環として、Webサイトの購入手続きの機能を単体テストし、顧客の注文合計を正しく計算するかを確かめることがある。また、ほかのメンバーが開発した部品を組み合わせる際に、統合テストへ関わる場合もある。
• Tools: There are many tools that can be used in software development, and these tools go beyond just being used to create software code. They can, for example, facilitate communication within the team, help support engineering tasks, and maintain a historical record of source code versions. Each software engineer should be familiar with major tools and their underlying principles so that they can use them effectively.
英語のヒント
• ツール:ソフトウェア開発で使えるツールは多く、その役割はコードの作成にとどまらない。たとえば、チーム内の意思疎通を円滑にし、工学的な作業を支え、ソースコードの版の履歴を保つこともできる。エンジニアは主要なツールと、その根底にある原理を理解し、有効に使えるようにしておくべきである。
• Computer technology: Software engineers need at least a high-level understanding of the computer technology that might be applicable to the software solutions they may be required to create or work with. This includes areas such as operating systems, cloud services, security, networking, communications, database technology, and UI/UX. Software engineers might also be called upon to work with computer technologies such as machine learning (ML) and its applications to artificial intelligence (AI), business intelligence (BI), and the multitude of ever-evolving applications of computer technologies that are available today. A successful software engineer is aware of current computer technology and understands how to leverage it.
英語のヒント
• 計算機技術:エンジニアは、自らが作成したり扱ったりすることを求められる仕組みに適用し得る計算機技術について、少なくとも全体像を理解している必要がある。オペレーティングシステム、クラウドサービス、セキュリティ、ネットワーク、通信、データベース技術、UI/UXなどがこれに含まれる。また、機械学習(ML)とその人工知能(AI)への応用、ビジネスインテリジェンス(BI)、現在利用できるその他の絶えず発展する多様な計算機技術の応用を扱うことも求められる。有能なエンジニアは現在の技術を把握し、その生かし方を理解している。
• Soft skills: A software engineer should have the soft skills required to assume their role such as problem solving, communication, and time management, as shown in Figure 9.3. Soft skills tend to be more innate, but are often just as critical as the previously listed skills. For example, a software engineer could be tasked with developing a software solution within twelve months that tracks and displays relevant driving information onto a heads-up display presented on the windshield of a new model of an automobile. To deliver this solution on time, the software engineer would need to manage a schedule. As part of a team project, they would also need to understand how to effectively communicate and interact with other project team members. Additionally, they would need to problem-solve the requirements to derive a solution using appropriate algorithms and patterns. Problem-solving includes understanding how and when to bring subject matter experts or non–software engineer resources onto a project. Being able to apply these softer skills can be just as critical to a software engineer’s success as applying the right processes, methods, tools, and data structures/algorithms.
英語のヒント
• ソフトスキル:図9.3のように、エンジニアには、役割を果たすための問題解決、意思疎通、時間管理などのソフトスキルも必要である。ソフトスキルは生来の性質に由来する傾向が強いが、先に挙げた技能と同じくらい重要になることが多い。たとえば、新型車のフロントガラスに映すヘッドアップディスプレイへ、運転に必要な情報を追跡・表示する仕組みを、12か月以内で開発する仕事を任されるとしよう。期限内に納品するには、工程表を管理する必要がある。チームによるプロジェクトに加わるうえでは、ほかのメンバーと効果的に意思疎通し、やり取りする方法も理解していなければならない。さらに、適切なアルゴリズムやパターンを使って解決策を導くため、要求を問題解決の観点から検討する必要がある。問題解決には、分野の専門家や、ソフトウェアエンジニア以外の人材を、いつ、どのようにプロジェクトへ迎え入れるかを理解することも含まれる。こうしたソフトスキルを使いこなせることは、適切な工程、手法、ツール、データ構造・アルゴリズムを適用することと同じくらい、エンジニアの成功を左右し得る。
2 The original goals of Agile development were laid out in the Agile Manifesto. This is at https://AgileManifesto.org.
2 アジャイル開発の当初の目標は、アジャイル宣言に示されている。https://AgileManifesto.orgを参照。
Figure 9.3

attribution: Copyright Rice University, OpenStax, under CC BY 4.0 license · CC BY 4.0 · Source出典

Figure 9.3 These are some of the soft skills required by software engineers. (attribution: Copyright Rice University, OpenStax, under CC BY 4.0 license)
図9.3 ソフトウェアエンジニアに必要なソフトスキルの例。(帰属:Rice University、OpenStax著作権、CC BY 4.0ライセンス。)