[Software Engineering] 소프트웨어 엔지니어링이란?

Software란 무엇인가?
- Software는 ⇒ computer program / config file / system doc / user doc
- Computer Programs (코딩파일)
- Configuration Files ( 구성 파일 )
- System Documentation
- 요구사항 스펙, 디자인 다이어그램, 클래스 다이어그램, 테스팅, 버그리포터
- User Documentation
- 매뉴얼, 개발자가 만들어야함
- 도외시 하는 경우 많음
- 코딩만 하는 것이 아니라 사용 설명서까지 만들어야함
- 등을 포함해야한다.
- 새로운 Software는 2가지 방법에 의해 만들어진다.
- Developing new programs from scratch
- Reusing existing software
Software products는 …
- Generic
- 일반적인 Software, 누구에게나 open 되어있는 Software
- Software를 사기를 원하는 모든 customer에게 팔기위해 개발
- Example . Excel or Word , CAD Software
- Customized
- 특정 고객이 원하는 스펙으로 software를 만듦
- Example . e-commerce software, real-time transportation tracking software
- Generic, Customized 둘 다 사용할 수 있다.
- Example . ERP (Enterprise Resources Planning , 기업의 전산관리 시스템 ) Software
- 인사, 재무, 구매, … 등을 종합적으로 관리하는 시스템
- 제일 유명한 회사 = SAP
- 누가 Software specification을 결정하는가?
- Generic Software : Developer
- Customized Software : Customer
- 홍익 앱 = customized
- 구분하는 것 굉장히 중요하다.
- Generic은 회사
- Customized은 customer
Software Engineering 이란 무엇인가?
- Software 생산의 모든 측면을 고려
- 전문적인 Software 개발을 위한 tools , methods, theories들을 포함
- Cost-Effective한 software development를 고려 (비용 대비 퀄리티를 높이는 개발을 하자)
- Cost vs Quality 를 Balancing하는 것이 Engineering이다.
- 같은 cost면 quality를 높여야한다.
- 같은 quality면 cost를 낮춰야한다
- Cost -Effective
Demands of software engineering
- 산업 자체가 디지털화 되어가고 있음
- Software 복잡도가 더욱 복잡해 지고 있다
Software Engineering의 중요성
- 점점 더 Software Engineering이 중요해진다.
- 장기적으로 본다면 훨씬 더 싸고 빠르게 하기 위해서는 Software Engineering 기술들이 중요하다
- 혼자하는 것이 훨씬 더 쉽지만 장기적으로 보면 혼자하는 것이 훨씬 더 비싸고 신뢰도가 떨어진다.
Software Engineering과 Computer Science의 차이점
- Computer Science
- Software Engineering
- 실용적인 문제 (이론 얘기가 아닌) 실제 개발하는데 필요한 것들
- 그렇다고 Computer Science가 필요 없는 것이 아님
Software Process란 무엇인가?
- 개발 혹은 software 의 진화를 목표로 하는 행위
- Software process들의 일반적인 activies 들 :
- Specification
- 요구사항, 기능들을 명시화한 것
- Software가 무엇을 해야하는지 그리고 software의 제약들을 명시
- Design and implementation ( Development)
- Validation ( Testing ) ⇒ verification(돌아가는지 검증) / validation(요구사항에 맞는지 검증)
- Software가 의도했던 대로 동작하는지 확인
- Evolution (Maintenance)
- 소비자, market의 요구사항을 지속적으로 반영하여 진화 시키고 유지 보수하는 것
Software Engineering의 비용
- 개발(Specification, Design and implementation) 에 대략 60 % 의 비용
- Testing에 대략 40 %의 비용
- 그 중 Implementation ( coding) 에는 20 %의 비용이 차지한다.
- 장기적인 system을 바란다면, 유지 보수 비용은 개발 비용의 몇 배를 차지한다.
- 비용의 결정
- 개발되는 system의 타입, 유형
- performance와 system 신뢰도의 특성
Acitivy cost distribution

Software Engineering diversity and fundamentals
- 다양한 유형의 소프트웨어 시스템이 있으며 이들 모두에 적용할 수 있는 보편적인 소프트웨어 엔지니어링 기술 세트는 없습니다. ( no universal set of software engineering techniques)
- Software 개발을 위해 ad hoc approaches를 사용하라
- 일부 기본 원칙은 사용되는 Software Engineering 기술에 관계없이 모든 유형의 소프트웨어에 적용됩니다.
- 관리되며 이해되는 software를 사용해야한다.
- 요구사항들을 이해하는 것과 software를 design하는 것이 중요하다.
- 새로운 software를 사용하는 것보다 이미 개발 된 software를 사용해야한다.
Good software의 특성들은 무엇인가?
- Maintainability (유지 보수성)
- 유지 보수하기 쉬운 software
- 소비자의 요구에 맞춰 진화하기 위해 작성되어야한다.
- Dependability
- 의존성 ( 신뢰성 ) 이 높은 software
- Availability, reliability, security , safety and integrity를 갖추고 있는 Software
- Availability (가용성) : 서비스를 위해 ready 되어 있다 == 서비스가 항상 준비되어있다.
- 즉, 사용자가 시스템을 필요로 할 때 항상 사용 가능한지 여부를 나타냅니다
- Reliabilty (신뢰성 ) : 서비스를 시작하면 서비스가 중단되지 않고 끝까지 처리해 줄 수 있다
- Security ( 보안성 ) : 외부의 공격에 대해 방어할 수 있는 능력 ( 해킹)
- Safety ( 안정성 ) : Software를 사용하였을 떄 데이터가 망가지거나 부작용이 생기는 일이 없다. ( 데이터 유출)
- Integrity (무결성 ) : 틀린 것이 없는 상태, 했던 연산들이 반영되어 있음, 잘못된 걸로 변경된 것이 없음, 정상적인 연산에 의해서만 바뀌어져 있는 상태, 결함이 없는 상태
- Efficiency
- 효율성
- 목적에 잘 부합한다, 들인 노력에 비해 결과가 좋다 ,System resources를 낭비하지 않는다.
- Acceptability
- 수용성
- 디자인 되어 있던 것 대로 유저에 의해 수용되어야 한다.