소프트웨어 공학
Software Crisis
rabbit-jun
2025. 3. 11. 23:13
Software Crisis (소프트웨어 위기)
컴퓨터가 처리해야 할 데이터와 변수의 양이 증가함에 따라 메모리 용량 부족, 계산 복잡도 증가, 소프트웨어 개발 비용 및 시간 증가 등의 문제가 발생했다.
이러한 문제를 해결하기 위해 차원 축소 기법(예: PCA, t-SNE)이나 최적화된 알고리즘(예: 동적 계획법, 분할 정복, 탐욕 알고리즘)이 필요하게 되었다.
1. 소프트웨어 위기의 원인:
대형 프로젝트의 증가 → 관리 복잡성 증가
하드웨어 발전 속도 대비 소프트웨어 개발 속도의 한계
비효율적인 개발 방법론으로 인한 일정 지연 및 비용 초과
소프트웨어의 유지보수 및 확장성 부족
2. 소프트웨어 위기 해결책:
소프트웨어 공학(Software Engineering)의 등장
구조적 프로그래밍, 객체지향 프로그래밍, 디자인 패턴, 애자일 개발 방법론 등이 발전함.
3. 소프트웨어 개발이 어려운 이유
- 의사소통 오류 (Communication Errors)
- 다양한 이해관계자(개발자, 기획자, 사용자, 경영진 등) 간의 요구사항 해석 차이로 인해 개발 중 충돌이 발생함.
- 요구사항 명세서 작성이 중요해짐.
- 3차원 실세계의 개념을 2차원 평면의 코드로 변환해야 함
- 현실 세계의 문제를 수학적, 논리적 모델로 변환해야 하는 과정이 필요함.
- 프로젝트별로 다양한 변수(개발자 수, 일정, 사용자 수준 등)가 존재하며 요구사항이 다르므로 획일적인 개발 프로세스를 적용하기 어려움.
- 애자일(Agile), 스크럼(Scrum), 폭포수 모델(Waterfall) 등 다양한 개발 방법론을 알아야 한다.
하드웨어 vs 소프트웨어의 수명주기 차이
1. 하드웨어의 수명주기
하드웨어는 물리적인 부품으로 구성되므로 시간이 지나면서 마모되고, 부품 노후화로 인해 고장률이 증가함.
일반적으로 MTBF(Mean Time Between Failures, 평균 고장 간격)을 통해 내구성을 평가함.
2. 소프트웨어의 수명주기
소프트웨어는 물리적인 마모가 없지만, 사용자의 요구사항 변화, 보안 문제, 성능 저하 등의 이유로 어느 순간 유지보수가 불가능해지는 변곡점이 발생함.
기계학습 알고리즘의 주요 유형
1. 지도 학습 (Supervised Learning)
- 입력 데이터와 정답(label)이 주어진 상태에서 학습하는 방식.
- 예: 선형 회귀(Linear Regression), 로지스틱 회귀(Logistic Regression), 신경망(Neural Network)
2. 비지도 학습 (Unsupervised Learning)
- 정답(label) 없이 데이터를 그룹화하거나 패턴을 찾음.
- 예: K-Means 클러스터링, PCA(차원 축소)
3. 준지도 학습 (Semi-Supervised Learning)
- 일부 데이터는 정답이 있고, 일부 데이터는 정답이 없는 상태에서 학습.
- 예: GAN(Generative Adversarial Network)
4. 강화 학습 (Reinforcement Learning)
- 보상을 최대화하는 방향으로 학습하는 방식.
- 예: 알파고(AlphaGo), 로보틱스 제어
5. 비선형 회귀 방정식과 머신러닝
- 기계학습 알고리즘에서 사용하는 모델은 대부분 비선형 함수이다.
- 예: 딥러닝에서 사용하는 신경망(Neural Network)은 비선형 활성 함수(ReLU, Sigmoid, Tanh 등)를 사용하여 복잡한 패턴을 학습함.
- 단순 선형 회귀 모델이 아닌 비선형 회귀 모델(다항 회귀, 신경망 등)이 사용됨.
소프트웨어 개발 역사
1. 1970년대: 구조적 프로그래밍 (Procedural Programming)
- C 언어 등의 절차적 프로그래밍(Procedural Programming) 언어가 등장.
- 모듈화(Modularization), 단계적 상세화(Top-Down Design) 개념이 발전.
단계적 상세화 :추상화 → 요구 명세서 → 알고리즘 → 프로그래밍
2. 1980년대: 객체지향 프로그래밍 (Object-Oriented Programming, OOP)
- C++ 및 Smalltalk 등의 객체지향 언어 등장.
- 캡슐화(Encapsulation), 정보 은닉(Information Hiding), 상속(Inheritance), 다형성(Polymorphism) 등의 개념이 등장.
UML(Unified Modeling Language)이 개발 방법론으로 도입됨.
3. 1990년대: 소프트웨어 재사용과 컴포넌트 기반 개발
- 재사용 가능한 소프트웨어 컴포넌트(Component-Based Software Development, CBSD) 개념이 등장.
- 객체지향 설계를 활용하여 코드 재사용성 증가, 유지보수 비용 절감, 개발 속도 향상.
프로그램과 소프트웨어의 차이
1. 프로그램 (Program)
- 원시 코드(Source Code) 또는 실행 가능한 바이너리 코드.
- 컴파일(Compile) 또는 인터프리팅(Interpreting) 과정을 거쳐 실행 파일로 변환됨.
a. 실행 과정: 파싱(Parsing, 구문 분석) → 실행 파일 생성 → RAM 로드 → 실행 RAM에는 OS, 데이터, 명령어(Command) 등이 존재함.
2. 소프트웨어 (Software)
- 프로그램뿐만 아니라, 설계 문서, 데이터베이스 구조, 사용자 매뉴얼, 테스트 결과 등 개발 과정에서 생성된 모든 산출물을 포함.
- 소프트웨어 개발 과정은 제조업과 달리 개발자의 개인 능력에 따라 품질 차이가 큼.
반응형