Problem Definition
Problem Definition
"문제 해결"의 측면이 아니라 소프트웨어를 개발함에 있어서 고려해야하는 "문제"를 다루는 측면이다.
즉, 소프트웨어의 특성을 충분히 고민하는 단계이다.
1. Software
System Software
- 기본 시스템 리소스 및 프로세스를 관리하는 범용 소프트웨어
- low-level assembly language나 machine code로 작성됨 => 언어의 폭이 좁음
- 하드웨어와 밀접하게 상호작용함, 특정 하드웨어 요구 사항을 충족해야함
- OS와 동시에 설치됨, 일반적으로 제조업체에서 설치함
- 컴퓨터가 켜져있으면 계속 실행됨
- 백그라운드에서 실행되고 사용자는 보통 접근할 수 없음
- 독립적으로 실행됨
- 시스템이 작동하는 데 필요함
Application Software
- 사용자의 요구를 충족시키기 위해 특정 작업을 수행하는 소프트웨어
- higher-level language로 작성됨(ex-Python, JavaScript)
- 보통 하드웨어를 고려하지 않음, 하드웨어와 직접적으로 상호작용을 하지 않음
- 사용자가 필요할 때 설치함
- 사용자가 프로그램을 실행하고 끔
- 포그라운드에서 실행되고 사용자는 특정 작업을 수행하기 위해 직접 접근함
- 실행하기 위해 시스템 소프트웨어가 필요함
2. Purpose
순전히 나만을 위한 목적이거나 다른 사람의 요구에 의한 것이다.
3. Legacy
백지 상태에서 새로 짜거나 이미 존재하는 플랫폼을 기반으로 짠다.
- Reverse Engineering (Reengineering): 연역적 추론을 통해 이전에 만든 소프트웨어가 어떻게 작업을 수행하는 지 이해하려고 하는 것이다. 요구사항을 분석하고 디자인, 코드 등을 분석하여 통찰력을 얻는다.
- Software Reuse: Design Patterns, Program Libraries, Application Program Lines 등을 재사용한다.
- Refactoring: 코드의 가독성을 높이기 위해, 복잡성을 줄이기 위해, 확장성과 성능을 향상시키기 위해, 프로그램 실행을 빠르게 촉진하기 위해 refactoring을 한다.
4. Project Characteristics
- 기한: 언제까지 서비스를 출시해야 하는 지
- 성능: 최소한 어느정도의 성능을 내야하는지(capacity, response time)
- 리소스: 개발자의 수, 개발자 능력, 돈
- 성능 지표(핵심 성능 지표 KPI): 성능 측정의 한 유형이다. KPI는 조직 또는 조직이 참여하는 특정 활동(프로젝트, 프로그램, 제품)의 결과를 평가한다. 전략 및 운영의 개선을 돕고, 의사 결정을 위한 분석을 만들고, 가장 중요한 것에 집중할 수 있도록 돕는다.
5. Hardware Dependency
하드웨어에 의존적임
일반적으로 하드웨어 구성요소에 의해 성능이 제한된다. 길이 딱 정해진 대신 최대한 낼 수 있는 성능이 제한되는 것이다.
ex) 아두이노(ATmega, C, Sketch IDE), 라즈베리파이(ARM Processor, GPIO, USB), 쿠다(NVIDIA GPU, C, C++, Fortran)
하드웨어로부터 독립적임
다양한 방식이 가능하다. 양과 질적 방법에 대한 고민을 해야한다.
어떤 것으로 할 지 고르기 위해 많은 것을 알아야 하고 일이 닥치기 전에 미리 고민해야 한다.
ex) 웹 서버 개발
- C++ & Proxygen: C++ 자체만으로는 웹 서버 개발이 힘들어 외부 라이브러리를 사용해야 한다.
- Python & Django: 언어 자체에 웹 서버의 핵심 기술인 HTTP가 있으며 비교적 쉽다.
- JavaScript & Node.js: 성능이 탁월하다.
- Apache/ Nginx
6. Mobile Application Development
Native Platform(IOS/ Android)
성능을 극대화할 수 있다. 두 개 이상의 플랫폼 지원이 힘들다. 해당 플랫폼에 완전 특화된 소프트웨어를 개발할 수 있다.
- 아키텍처? 플랫폼 마다 앱을 따로 만듦
- 성능? 최대로 낼 수 있음
- 개발 시간? 길다
- 비용? 비싸다
- 타겟? 특정 플랫폼으로 한정됨
- 유저 경험? 우수하다
- 코드 재사용? 거의 없음
- 하드웨어 접근성? 완전히 하드웨어 지원 가능
Cross Platform(HTML/ CSS/ JavaScript)
성능 제한이 있지만 한 번 만들어서 여러 플랫폼에 돌릴 수 있다는 것이 큰 장점이다.
- 아키텍처? 하나의 앱으로 다양한 플랫폼에 가능
- 성능? 성능 이슈가 있음
- 개발 시간? 짧다
- 비용? 싸다
- 타겟? 한정되지 않음
- 유저 경험? 모든 플랫폼에 대한 통합 UX로 떨어짐
- 코드 재사용? 60% 가량 재사용
- 하드웨어 접근성? 제한됨
Cross Platform이 점점 더 인기를 얻어가고 있는 추세다. 또한 Cross Platform의 성능이 Native에 비해 밀리지 않는다.
본 글은 2학년 1학기 학부 강의 내용을 정리한 글입니다. 혹시라도 틀린 부분이 있다면 댓글로 편하게 알려주시면 감사하겠습니다.