Yo-mi 2023. 8. 13. 01:48
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학기 학부 강의 내용을 정리한 글입니다. 혹시라도 틀린 부분이 있다면 댓글로 편하게 알려주시면 감사하겠습니다.