본문 바로가기
👨‍💻Computer Science/소프트웨어공학

[소프트웨어공학] 1장 소프트웨어가 무엇이며 왜 하는지?

by 코푸는 개발자 2021. 6. 29.
728x90

- 전문적인 소프트웨어 개발( Professional software development)

소프트웨어공학이 무엇인지 -> 좀 더 구체적인 의미

소프트웨어공학 윤리(Software engineering ethics)

소프트웨어 개발자들이 가져야할 윤리의식

소프트웨어공학의 예시(Case studies)

전반적으로 많이 사용되는 사례 예시

 

소프트웨어 -> 나라에서 많은 역할을 해주는 기능을 제공해줌

ex. 네이버나 배달의 민족과 같은 소프트웨어 회사들이 소프트웨어 개발을 통해 많은 수익을 창출하고 있다.

거의 모든 산업은 소프트웨어로 이루어져있다.

점점 물리적인 것은 로봇이 하고 그 로봇을 통제하는 것을 소프트웨어가 해줌

ex. 키호스크 -> 서비스업에서 주문접수를 기계 소프트웨어로 대체되고 있다.

우리가 소프트웨어공학에서 추구하고자 하는 것은 개인 목적으로 만드는 것이 아니 전문적인 역할(만들어서 돈을 받고 팔 던지 비즈니스적인 형태로 만드는 것) ‘어떻게 하면 제대로 잘’ -> 이것을 뒤에서 구체적으로 배움 (비용을 줄이는 것, 일정을 맞추는 것, 인력 절감, 성능 향상, 안전, 제한된 시간을 맞춤)

-> 따라서 소프트웨어 공학에서는 이런 측면에서의 이론과 방법론을 배움

-> 실제로 소프트웨어 분야에서 사용되는 비용들은 점점 늘어나고 있음.

 

소프트웨어에서 비용이 늘어난다는 의미는 무엇인가?

>비용을 고려한다는 것은 개인적인 목적이 아닌 상용적인 목적에서 만들었음을 알아야한다

-> 이러한 비용이라는 것이 소프트웨어공학에서 중요한 목적, 목표가 될 수 있음

소프트웨어에서의 비용은 총 2가지를 들 수 있음

 

1) 소프트웨어를 구동하기 위한 환경(컴퓨터, 소프트웨어) -> 소프트웨어가 최초에 만들어질 때에 개발 운용 과정에 들어가는 초기 비용 (추세는 컴퓨터 <<<< 소프트웨어)

컴퓨터는 싸게 살 수 있지만 소프트웨어는 머신러닝, AI, 비디오랜더링과 같은 부분의 소프트웨어들은 상당이 비싼 비용을 지불해야 마련이 가능하다.

ex. 인텔 CPU는 저렴하게 구매가능 하지만 여기다 MS Windows, office, 넷플릭스 와 같은 소프트웨어를 추가하게 되면 많은 비용이 필요해진다.

2) 유지보수 비용 -> 실제로 컴퓨터 환경을 조성하여 지속적으로 사용됨에 있어 그러한 환경이 앞으로도 쭉 유지하는 행위에 초기 비용보다 훨씬 많은 비용이 들어간다.

-> 따라서 회사는 새로운 소프트웨어 만들어 수익을 창출할 것인지 현재 수익을 내고 있는 소프트웨어에 대한 유지보수를 통해 수익을 낼 것인지를 고민함.

->1번이면 적은 비용으로 소프트웨어를 제작하는 것을 추구하고 2번이면 유지보수에 들어가는 비용을 절감하는 것이 소프트웨어공학에서 추구하는 최종적인 목표가 될 수 있음

 

소프트웨어공학 -> 소프트웨어를 잘 만드는 것 + 잘 유지보수 하는 것

 

소프트웨어들은 점점 늘어나고 그 소프트웨어들에 대하 유지보수가 많이 필요해짐

-> 소프트웨어를 만드는데 있어 실패를 하면 안 되고 유지보수 역시 적은 비용으로 가능해야함

 

왜 소프트웨어를 만드는데 실패하는지? 2가지 이유(이건 지극히 저자 입장이긴 함)

1)시스템에 복잡도가 증가함

최초의 디지털 컴퓨터 에니악이 등장하고 이를 통해 수학 계산을 많이 했다. 현재는 소형화가 되어 여러 CPU를 이용해 굉장히 많이 사용가능해지고 이에 따라 형태 역시 복잡해지고 있고 시간이 지남에 따라 변화에 따른 요구들도 많아지기 때문에 복잡도가 증가해 오고 있다.

소프트웨어 역시 빨리 만들어져야함 -> 계속 복잡해질 수밖에 없음

-> 아무리 잘 예측해도 그 것이 늘어나는 요구와 변화를 모두 수용하기 어렵다.

2)소프트웨어공학 기법 사용을 실패함

- 최초 제작 시 이후사용에 대한 간과를 많이 하여 점점 늘어나는 요구의 사이즈를 버티지 못함 -> 대부분의 사람들이 최초 소프트웨어를 설계할 때 여러 이론적인 내용을 충분히 고려하여 개발하지 않음

 

-> 따라서 중요한 것은 충분히 많은 경험을 해보는 것이 중요하다!

 

 

 

Professional software development

>소프트웨어가 무엇인가?

소프트웨어를 만들기 위해서는 프로그래밍보다 문서 작성(설계 및 분석)작업이 더 많이 필요하다.

용도는 보편적인 것을 만들어 마켓에 팔거나 개인이 원하는 요구(커스터마이징)를 만족시키기 위한 프로그램 또는 문서들을 의미한다.

>좋은 소프트웨어의 조건

- 필요로 하는 기능을 제공

- 그것을 잘 제공을 한다.

- 또한 이러한 소프트웨어가 유지보수가 잘되고 안전적으로 필요한 것을 필요로 할 때에 잘 제공하는 것

>소프트웨어공학은 무엇인가?

소프트웨어가 만들어지고 사라질 때까지의 모든 측면을 의미한다. -> 우리는 다양한 원칙들, 이론들, 방법론들, 도구들을 소프트웨어 엔지니어링에서 설명하려는 것임

>소프트웨어공학이 어떤 일을 하나?

- 필요한 기능을 명세화

- 소프트웨어 개발/구현

- 소프트웨어 테스트

- 소프트웨어 유지보수/ 발전

>소프트웨어 공학과 컴퓨터 공학의 차이점은 무엇인가?

- 컴퓨터 과학은 이론과 기초에 초점을 맞춘다.

- 소프트웨어 공학은 실용성과 관련되며 유용한 소프트웨어를 개발하고 제공합니다.

>소프트웨어 엔지니어링과 시스템 엔지니어링의 차이점은 무엇입니까?

- 시스템 엔지니어링은 다음의 모든 측면에 관련되어 있습니다.

- 다음을 포함한 컴퓨터 기반 시스템 개발 하드웨어, 소프트웨어 및 프로세스 엔지니어링.

- 소프트웨어공학은 이 보다 일반적인 과정의 일부이다. (시스템이 더 큰 범위)

 

소프트웨어공학에서 자주 물어보는 질문

>제한적인 상황에서 좋은 소프트웨어를 어떻게 만들어 낼지 고민이 필요하다

- 다양성, 신뢰성있는 소프트웨어 개발

- 다양성 : 다양한 분산 시스템과 상호 작용해야한다.

- 비즈니스와 사회변화에 빠르게 따라가야 한다.

- 보안성과 신뢰감을 주는 소프트웨어여야 한다.

>소프트웨어 개발 시 필요한 비용의 사용 비율 : 60%(개발), 40%(테스팅)

- 소프트웨어 개발이 종료된 후 유지보수와 진화하는 비용은 개발 비용보다 훨씬 많이 든다.

>가장 좋은 소프트웨어를 만드는 방법은 무엇인가?

- 소프트웨어 공학에는 정답이 없으면, 어떤 종류의 프로그램을 만드는 가에 따라 답이 다르다.

>소프트웨어에서의 Web이 방대해지면서 사용가능한 서비스가 많아졌다. 또한 분산처리시스템이 가능하다.

- 웹 분야에서의 소프트웨어개발 또한, 그 소프트웨어의 목적에 따라서 기본적인 소프트웨어공학을 따른다.

 

소프트웨어 제품 종류

1) 불특정 다수에게 제공

필요한 요구는 MS와 같이 만드는 회사가 함

2) 커스터마이즈 된 제품 개인의 입맛에 맞춰 제공

ex. 임베디드 컨트롤 시스템 -> 원자력발전소 시스템

필요 요구는 개인

 

제품 명세서

-불특정 다수를 위한 제품 -> MS와 같은 회사가 정의

-개인을 위해 맞춘 제품 -> 사용하는 고객님께서 정의

-> 소프트웨어에서 많이 강조하는 것 대화를 많이 하고 의견을 최대한 많이 수렴해 보자

 

좋은 소프트웨어의 필수요소 4가지

- 유지보수가능성 -> 유지보수를 통해 변화를 잘 받아드릴 수 있어야함

- 신뢰성 및 보안 -> 안정적인 것, 보안, 논리적 안정적인지

- 효율성 -> 원하는 소프트웨어가 잘 만들어졌는지(효율적, 수치적인 것 만족)

- 수용성 -> 원하는 소프트웨어가 제대로 만들어졌는지

 

소프트웨어는 점점 더 다양해지고 추상화 될 수밖에 없다! -> 이러한 것들을 가능한 도구화 문서화 하여 사용가능 하게 하자

소프트웨어공학은 어떠한 완벽한 형태의 것이 아닌 여러 사람들의 경험적인 것들이라고 이해하자!!

 

Software process activities(소프트웨어공학 활동)

- Software specification(누구의 요구를 수용하는 것인지, 개인 또는 회사의 요구사항을 명세화)

- Software development(설계, 개발 -> 소프트웨어를 명세 요구에 맞게 설계 구현하는 것)

- Software validation(제대로 돌아가는지 명세화된 요구가 제대로 수행됐는지를 확인한다)

- Software evolution(버그는 수정되고 버전은 업그레이드되며 소프트웨어는 지속적으로 유지보수 발전됨)

 

소프트웨어에 문제를 야기하는 주된 이슈들 4가지

-다양성

컴퓨터를 예로 들면 최초에 에니악이 만들어지고 이후에 더 많은 종류에 컴퓨터들이 개발되면서 하나의 소프트웨어가 개발되면 여러 개의 다른 컴퓨터들에서 작동이 가능해야 되면서 그 소프트웨어에 요구되고 수행되어야하는 것들로 인해 소프트웨어 역시 다양성을 가지게 된다.

-비스니스와 사회의 변화(잘못된 것이 아님 변화된 것임, 자연스럽게 받아드려야 함)

이미 만들어진 소프트웨어가 변화되는 비즈니스 환경이나 사회에 맞춰 변화가 필요함

ex. 이전까지 데스크탑으로 많이 했던 기능들일 스마트폰이 발전하면서 휴대용 소프트웨어적 측면으로 많이 변모함

-보안과 신뢰

여러 금융적인, 금전적인 큰 비즈니스에 영향을 주는 것들이 많아지면서 안전성 보안 신뢰에도 중요성이 커짐(ex. 군대 정보, 원전 자동화)

전적으로 안전, 보안, 신뢰가 커지는 것도 컴퓨터 입장에서 좋은 것은 아님 시간도 오래 걸리고 소모되는 것도 많아지고 법규적으로 절차가 많아져 사용되는 시간이 많아짐

-크기

서버베이스 시스템 등이 개발되면서 클라우드 역시 사용되는 소프트웨어 서버스의 영역이 전방위적으로 넓어짐 -> 따라서 여러 개의CPU를 다루는 scale 역시 고려해야한다.

 

소프트웨어의 다양성

정해진 하나의 방법이 있는 것이 아님 여러 가지 방법론 중에서 자신에게 맞는 방법론을 잘 고려해서 사용하는 것이 중요함

 

소프트웨어 종류(Application types)

- Stand-alone application(ex. MS office)-한대의 컴퓨터에 설치되어 수행이 되는 것

- Interactive transaction-based application(ex. naver, google)-서버에 접속하여서 요구와 응답이 오고가는 것

- Embedded control systems(전통적인 전자제품들에 들어가는 소프트웨어, 단적인 기능수행)

- Batch processing systems(ex. 입시, 금융)

- Entertainment systems(ex. 영화, 게임)

- Systems for modeling and simulation

- Data collection systems(ex. sensor, 데이터를 수집하는 역할)

- Systems of systems(기존의 시스템들을 한 단계 위해서 관리하는 것)

-> 예전에는 Stand-alone application, Embedded control systems, Batch processing systems와 같은 것들이 중요했지만 현재는 Interactive transaction-based application, Entertainment systems같은 것들이 중요해짐 -> 따라서 소프트웨어공학도 변화를 수용하며 변화해 나간다!

 

소프트웨어공학의 기반

-소프트웨어를 개발할 때 사용할 수 있는 정형화된 개발 프로세스는 존재한다.

-소프트웨어가 보장해야하는 기능성, 신뢰성 역시 반드시 존재함

-특정 요구사항이 존재하고 그 요구사항을 반영하여 구현한 것이 소프트웨어임

-가장 중요한 재사용 -> c++의 클래스가 재사용을 위해서 등장한 것임

-재사용은 비용과 시간적인 측면에 우수성을 만들어준다.

 

Web-based software engineering

-클라이언트는 웹 브라우저를 통해서 보지만 복잡하고 다양한 서버가 존재함

-기존의 것들을 잘 가져다가 사용함

 

웹 소프트웨어공학

-이곳에서도 소프트웨어 재사용이 이루어지고 애자일 방법을 사용하여 개발을 한다.

-시장의 반응을 보면서 그에 맞춰 개발을 해나감

-과거에는 수많은 기능을 가진 하나의 서버였다면 현재는 수많은 기능을 제공하는 작은 서버들로 운용개발이 됨(Service-oriented systems)

-상호작용을 위한 인터페이스 -> UI, UX까지 구현을 확장함

 

소프트웨어 개발자가 가져야할 윤리의식

ex. 삼풍백화점, 자율주행 문제

 

전문적 책임의 문제

>기밀성(Confidentiality)

- 엔지니어는 공식 비밀유지협약의 체결 여부와 관계없이 일반적으로 고용주나 고객의 기밀성을 존중해야함.

>역량(Competence)

- 엔지니어의 역량 수준을 잘못 표현해서는 안 된다. 그들은 자신의 역량과 맞지 않는 일을 고의로 받아서는 안 됨.

>지적재산권(Intellectual property rights)

- 엔지니어는 특허, 저작권 등 지적재산권 사용에 관한 현지법을 숙지하여야 함

- 그들은 고용주와 고객의 지적 재산이 보호되도록 주의해야 한다.

>컴퓨터 오남용(Computer misuse)

- 소프트웨어 엔지니어는 자신의 기술력을 이용하여 타인의 컴퓨터를 오용해서는 안 됨

ex. 바이러스 배포, 비트코인 체굴...

 

윤리원칙이 많이 강조됨

소속되어 있는 단체에서 파면당할 수 있음

ACM(컴퓨터 엔지니어링 관련 단체)/IEEE(소프트웨어, 전기, 전자)

 

윤리원칙

1. Public - 소프트웨어 엔지니어는 공공의 이익에 부합되게 행동해야 한다.

2. CLIENT AND EMPLOYER - 소프트웨어 엔지니어는 최선의 방법으로 행동해야 한다.

->공공 이익에 부합하는 고객과 고용주의 이익

3. PRODUCT - 소프트웨어 엔지니어는 제품과 관련성이 있는지 확인해야 한다.

수정은 가능한 최고 수준의 전문적 기준을 충족합니다.

4. JUDGMENT - 소프트웨어 엔지니어는 무결성과 독립성을 유지해야 한다.

직업상의 판단

5. MANAGEMENT - 소프트웨어 엔지니어링 관리자 및 리더는 가입해야 한다.

소프트웨어 개발 및 관리에 대한 윤리적인 접근 방식을 촉진한다.

유지 관리

6. PROFESSION - 소프트웨어 엔지니어는 다음의 무결성과 명성을 향상시켜야 한다.

공익에 부합하는 직업

7. COLLEAGUES - 소프트웨어 엔지니어는 동료와 공정하고 협력해야 합니다.

8. SELF - 소프트웨어 엔지니어는 평생학습에 참여해야 하며, 평생학습은 다음과 같다.

그들의 직업과 직업의 실천에 대한 윤리적 접근을 촉진한다.

 

 

Case studies 대표적인 4가지

>인슐린 펌프

임베디드 시스템 하드웨어 장치를 제어해서 몸 안에다 인슐린을 투여

>정신건강 측면에서 환자의 관리 시스템(멘탈케어)

데이터베이스형태 검색

>날씨정보 시스템

데이터 컬렉션함, 센서데이터를 수집해 옴

>iLearn(원격 러닝시스템)

서버베이스시스템으로 사용자에게 교육을 하는 시스템

 

<인슐린 펌스 조절 시스템>

-사람 혈액 안에 있는 당 관련 정보를 센서를 통해 가져와서 인슐린 부족정도를 측정을 해서 부족하다고 하면 적정량을 투여하기 위한 계산 다음으로 몸 안으로 투입

-이를 위해 몸 안에 당 관련 정보를 주기적으로 가져오는 일을 수행해야함

-부족하다고하면 인슐린을 투입함

-정해진 시간 안에 계산을 하고 주입을 해야함

-신뢰성이 중요함(정확하지 않으면 심각한 문제를 초래함)

-정확한 시간에 정확히 판단해서 정확한 양을 투여해야하는 임베디드 시스템이다.

(ex, 원전, 핵미사일 시스템 등)

(UML예시)

소프트웨어 수행

혈액의 정보를 센서를 통해 가져옴 -> 센서가 가져온 정보를 분석(저당or과당) -> 분석을 통한 판다 -> 투입이 필요한 인슐린 양을 계산함 ->판단이 되면 인슐린의 투여 -> 언제 얼마만큼 인슐린을 투입했는지 log정보를 저장하고 트랙킹을 해야 함(이후 참조를 위함) or 펌프에 명령을 내림 -> 펌프가 정보에 의거 -> 인슐린 펌프를 조절 -> 인슐린을 체내에 투입함

임베디드 시스템이기 때문에 정확하고 신뢰성 있는 동작이 중요함

 

<멘탈케어 시스템>

-가장 주된 임무는 환자에 대한 정보를 저장하고 관리하고 필요한 사람들이 볼 수 있게 해주는 역할을 수행

-의사가 다르더라도 동일한 정보를 볼 수 있게 해야 함

-전통적이고 전형적인 데이터베이스를 이용하여 정보를 저장관리 함

-목적 : 정신 질환을 가지고 있는 환자들에 대한 치료를 목적으로 함, 제대로 된 진료 판다, 래포트/매니저 역할

-중앙 집중 데이터베이스 형태를 가져서 환자의 정보를 저장함(온라인, 오프라인 병행 지원 가정)

-온라인방식 업로드 방식으로 접근을 하며 보안성이 있어야한다.

-오프라인방식 다운로드받아 정보를 사용함, 정보에 대한 보안성이 있어야함, 타인에 대한 노출이 있으면 안 됨.

요구사항(각각의 요구는 전통적일 수 있다)

-개인정보에 대한 보호가 필요, 환자에 대한 정보를 보고, 수정하고, 삭제할 수 있어야함

-특정 환자에 대한 모니터링 기능(특이사항을 발견 함)

-총괄관리 레포팅(관리되는 내용 보고)

-개인의 정보 보호

-환자 또는 타인에게 주의가 필요한 내용확인

>>전형적인 데이터베이스 시스템이다!!!

 

<날씨정보 시스템>

-정보 수집을 목적으로 사용됨

-정부기관이 전국에 기상관련 정보들을 수집할 수 있는 센서들을 설치해 놓음(여기서 정보를 보내줌)

-관리자체에 대한 고려도 해줘야함

구성요소

-날씨정보를 알려주는 센서 시스템(데이터수집)

-데이터관리와 저장 시스템

-장치에 대한 지속적인 유지보수 관리시스템(위성 등)

>>시스템 오브 시스템

기능적인 요소 전력, 커뮤니케이션, 자체발전 기능과 전환되는 부분도 있어야함

또한 시스템 사용에 실패했을 때 최소한의 기능이라도 수행될 수 있게 해야 함.(백업)

원격으로 버전을 업그레이드 기능이 있어야함 -> 임베디드 시스템

>>결과적으로는 첨단 IoT기능임

 

<iLearn(원격 러닝시스템)>

ex. e-campus

-일반용도와 특별한 기능을 가지는 부분이 합쳐져 있다.

Service-oriented systems

-각각의 시스템은 독립적으로 동작을 함

-각각은 상호호환이 가능

-동적으로 사용자에게 맞는 기능을 수행해줌(다양한 기능이 있음) -> 필요한 서비스 그룹을 만들어 줌

-관리 저장 공간도 별도로 있음

-아마존, 구글, 네이버 같은 웹서비스가 이러한 형태이다.

2가지 형태

-Independent service 사용자가 직접와서 사용하는 것(사용자와 서비스 어플리케이션 간)

-Integrated service 서비스들 간에 서비스 진행(service to service)

 

 

1장 요약

- 소프트웨어 공학은 소프트웨어 생산의 모든 측면에 관련된 공학 분야이다.

- 소프트웨어 제품의 필수 특성은 유지관리성, 신뢰성 및 보안성, 효율성 및 수용성입니다.

- 사양(The high-level activities of specification), 개발(development), 검증 및 진화(validation and evolution)의 고급 활동은 모든 소프트웨어 프로세스의 일부입니다.

- 소프트웨어 엔지니어링의 기본 개념은 모든 유형의 시스템 개발에 보편적으로 적용된다.

- 다양한 유형의 시스템이 있으며 각 시스템은 개발을 위해 적절한 소프트웨어 엔지니어링 도구와 기술을 필요로 합니다.

- 소프트웨어 엔지니어링의 기본 개념은 모든 유형의 소프트웨어 시스템에 적용할 수 있습니다.

- 소프트웨어 엔지니어는 엔지니어링 전문직과 사회에 대한 책임이 있습니다. 그들은 단순히 기술적인 문제에 관심을 가져서는 안 된다.

- 전문사회는 구성원에게 기대되는 행동기준을 제시하는 행동강령을 발표한다.

 

 

 

728x90

댓글