[SE] Introduction to SE
Software Engineering

[SE] Introduction to SE

Professional Software Development

Software engineering is an engineering discipline that is concerned with theories, methods, and tools for professional software development.

software를 개발하는데 있어서 고려해야 할 3가지 : quality, cost, time-to-market

 

Software Costs

 

Waterfall Model

  • 가장 전통적인 소프트웨어 개발 모델로 소프트웨어 개발 뿐만 아니라 모든 공학 분야에서 사용되고 있는 engineering model이다.
  • Requirement definition을 기반으로 design, implementation, test and maintenance가 이루어진다.
  • 40 - 20 - 40 rule
    • Requirement definition과 design 단계에서 약 40%, implementation 20%, test와 유지 보수가 40%의 비용을 차지한다.
  • 시스템을 개발하는 초기에 사용자의 requirement가 명확하다라는 전제

 

Iterative Model

  • 사용자의 requirement가 명확하지 않은 경우에 적용
  • Outline을 기반으로 specification, implementation, validation의 작업을 사용자의 requirement를 모두 충족할 때까지 반복
    • 결과물이 한 cycle마다 나오고 그 결과물이 중간 단계에서 고객, 시장에 전달될 수도 있고 최종 결과물을 release하는 경우도 있다.
  • 일련의 개발 작업이 반복적으로 수행된다.
  • 개발 특성에 따라 cost의 분포가 waterfall model과는 다르다.
    • Why?

 

Component-based Model

  • Waterfall model이나 iterative model과의 차이
    • Software란 개발하는 것이 아니라 조립(assembling)하는 것이다.
  • 기존에 이미 존재하고 충분히 검증되어진 좋은 component들을 찾고 모아서 시스템을 만들어나가는 것
  • open-source 기반의 소프트웨어 개발

 

Development and Evolution Costs for long-lifetime system

  • 개발하고자 하는 시스템이 굉장히 긴 lifetime을 갖는 경우
    • Evolution의 비용이 훨씬 크다.
    • lifetime이 긴 시스템을 개발할 때는 어떻게 개발할 것인가도 중요하지만 그것을 어떻게 유지보수하기 쉽게 만드는지가 중요하다.

 

Software Products

  • Generic Products
    • 공용적 목적을 위해서 만들어지는 시스템
  • Customized products
    • 특정 고객, 특정 목적을 위해 만들어지는 고객형 제품

요구사항을 도출해내는 방식, 테스트를 하는 방식 등에 차이가 있다.

 

Frequently Asked Questions about Software Engineering

  • What is software?
    • Computer program and associated documentation. Software products may be developed for a particular customer or may be developed for a general market.
  • What are the attributes of good software?
    • Good software should deliver the required functionality and performance to the user and should be maintainable, dependable and usable.
  • What is software engineering?
    • Software engineering is an engineering discipline that is concerned with all aspects of software production.
  • What are the fundamental software engineering activities?
    • Software specification, software development, software validation and software evolution.
  • What is the difference between software engineering and computer science?
    • Computer science focuses on theory and fundamentals;
    • Software engineering is concerned with the practicalities of developing and delivering useful software.
  • What is the difference between software engineering and system engineering?
    • System engineering is concerned with all aspects of computer-based systems development including hardware, software and process engineering.
    • Software engineering is part of this more general process.
  • What are the key challenges facing software engineering?
    • Coping with increasing diversity, demands for reduced delivery times and developing trustworthy software.
  • What are the costs of software engineering?
    • Roughly 60% of software costs are development cost, 40% are testing costs. For custom software, evolution costs often exceed development costs.
  • What are the best software engineering techniques and methods?
    • While all software projects have to be professionally managed and developed, different techniques are appropriate for different types of system.
  • What differences has the web made to software engineering?
    • The web has led to the availability of software services and the possibility of developing highly distributed service-based systems. Web-based systems development has led to important advances in programming languages and software reuse.

 

Essential Attributes of Good Software

  • Maintainability
    • 변경에 대한 요구가 발생했을 때 시스템을 얼마나 쉽게 수정할 수 있는가, 유지보수가 얼마나 쉬운가를 정의하는 것
  • Dependability and security
    • 시스템에 대한 사용자의 신뢰도. 시스템이 얼마나 trust-worthy하는가. Dependability를 달성하기 위해서는 시스템이 available, reliable, secure, safe 해야 한다. (복합적 의미를 갖는다)
  • Efficiency
    • 시스템이 가지고 있는 하드웨어 요소가 fully 효율적으로 사용 가능한가
  • Acceptability
    • 시스템이 목표로 하는 사용자 층에 대해서 충분히 받아들이기 쉬운가. 시스템이 뛰어난 UX를 갖고 여러 환경에서 다른 시스템들과 호환성 좋게 만들어져야 한다.

 

Software Process Activities

  • Software specification
    • 명세화. 고객이 가지고 있는 요구사항을 명확히 하는 것이 목적이다. 시스템을 개발, 운영하는데 반드시 충족해야 하는 제약사항을 명확히 하는 중요한 작업.
    • 제약사항 - development constraints (개발하는 과정에서 반드시 충족해야 하는 비용, 시간, 사용 가능한 human resource, 품질적 측면에서의 표준 등), operational constraints (기존의 다른 시스템들과 연동해서 돌아가야 하므로 기존의 시스템과 통신을 위한 프로토콜, 데이터 포맷, operation을 위한 각종 표준 등)
  • Software development
    • 설계와 프로그래밍.
  • Software validation
    • 개발한 소프트웨어가 고객의 요구를 제대로 충족하는가
    • Verification
      • 소프트웨어가 그것이 만들어지는 과정에서 만들어진 문서들과 일치하는지 검증
      • -> Review (문서와 결과물 대조)
    • Validation
      • 만들어진 결과물이 고객이 원하는 것을 충족하는지 확인
      • -> Testing
  • Software evolution
    • 시스템이 폐기되기 전까지 여러 요인으로 발생하는 변화에 맞춰서 시스템을 변경해나가는 작업

 

Software Engineering Diversity

한 가지 방법론만으로 모든 경우에 적용할 수는 없다.

경우에 따라 가장 적절한 방법을 선택할 수 있어야 한다.

 

Application Types

  • Stand-alone applications
  • Interactive transaction-based applications
  • Embedded control systems
  • Batch processing systems
  • Entertainment systems
  • Systems for modeling and simulation
  • Data collection system
  • Systems of systems
    • 시스템 안에 다른 시스템을 포함하는 메타 시스템의 구조

 

Software Engineering Fundamentals

소프트웨어 공학에서 사용되는 technique에서 '가장 좋다'라는 것은 없다. 개발하는 시스템에 따라서 가장 적절한 방법을 그때그때 결정된다. 그럼에도 몇가지 fundamental principle이 존재한다.

  • 시스템은 잘 관리되고 이해하기 쉽게 개발되는 것이 필요하다.
  • Dependability, performance는 거의 예외 없이 모든 시스템에서 중요한 속성이다.
  • 개발하는 소프트웨어의 specification, requirement를 제대로 이해하고 관리하는 것이 중요하다.
  • 가능하다면 reuse하는 것이 좋다.

 

Software Engineering and the Web

과거의 web은 문서를 서로 연결해주는, 인터넷을 통해 연결되어 있는 문서들 상호 간의 관계를 설정해주는 역할을 했다.

오늘날의 소프트웨어 공학 측면에서의 web은 개발 과정에서 필요로 되어지는 software components를 찾고 그것을 binding해서 새로운 소프트웨어를 개발할 수 있는 기본 infra, framework을 제공해주는 중요한 역할을 한다.

Web service가 우리가 개발하는 소프트웨어 시스템의 구체적인 component로 사용된다.

Cloud computing

 

Ethics for SW Engineers

Software Engineering Ethics

Ethical behavior란 단순히 법을 지키는 것 뿐만 아니라 도덕적으로 바람직한 행동을 의미한다.

소프트웨어 엔지니어의 책임 - Professional Responsibility, Ethical Responsibility

 

Issues of Professional Responsibility

  • Confidentiality
  • Competence
  • Intellectual property rights (지적 재산권)
  • Computer misuse

 

ACM / IEEE Code of Ethics

ACM (Association for Computing Machinery)

IEEE (Institute of Electrical and Electronics Engineers)

 

Ethical Principles

  1. PUBLIC
  2. CLIENT AND EMPLOYER
  3. PRODUCT
  4. JUDGMENT
  5. MANAGEMENT
  6. PROFESSION
  7. COLLEAGUES
  8. SELF

 

어느 것보다도 PUBLIC이 우선이다!

소프트웨어를 개발하는 과정에서 딜레마, conflict이 발생할 경우 public interest가 가장 중요하다.