2주차

김민지·2024년 5월 21일

프로그래머의 세계 이해하기

프로그래밍의 다양한 분야

  • CS의 기초: 객체지향프로그래밍, 알고리즘, 자료구조
  • 폭포수 방식, 애자일 방식 등의 협업 방법들이 존재함
    애자일 방식을 팀 전체가 쉽게 도입할 수 있도록, 스크럼이나 칸반 등의 실행 방식이 존재한다.
    애자일 방식은 동작하는 프로그램을 만들어서 소통하기 때문에, 기획 단계에서 미처 생각하지 못한 문제점을 발견할 수 있다.
    폭포수 모델은 각 단계를 완전히 마치고 다음 단계로 넘어가는 방식이다.
    기능 변경이 많은 서비스의 경우, 기능 변경이 유연한 애자일 방식이 더 효율적인 경우가 많다.
  • 버그 관리 툴(=이슈 트레킹 툴): Jira, Trello, Asana, Confluence
  • 버전 관리 소프트웨어: Git
  • IDE: 개발자도구
  • 디자인 협업툴 Sketch: https://www.sketch.com/
    세로줄 동시에 선택, 변수명 동시 변경, 창 동시에 띄우기 등등
  • 기타 툴, 기업들의 기술정보(스택) 참고 가능: https://stackshare.io/

기술 스택 선택하기

  • 활발한 기술: 기술은 많은 사람들이 사용하고, 많은 사람들이 사용하면 커뮤니티가 활발해 지고, 좋은 토론과 자료들이 많이 만들어지므로 바람직하다.
  • 인정받는 기술: 여러 회사들이 선택하거나 기업에서 직접 관리하는 기술은 주로 뛰어난 개발자들의 많은 고민과 상의 끝에 내려진 결정이므로 참고하면 좋음 ← StackShare
  • 유망한 기술: 산업 트렌드가 바뀌면, 기술이나 경험의 활용도가 갑자기 커지거나 줄어들기도 하므로 개발자의 실력과 관계 없이 입지가 늘어날 수도, 줄어들 수도 있음

소프트웨어 이해하기

애플리케이션

  • 사용자(엔드유저)가 직접 사용하는 프로그램으로, 줄여서 앱이라고 부르며, 일반적으로 스마트폰에 설치하는 프로그램으로 알고 있지만 사실 컴퓨터나 노트북에서 우리가 사용하는 프로그램들도 모두 포함된다고 할 수 있다.
  • 프로그래밍 코드를 애플리케이션으로 만들어 주는 소프트웨어 → 컴파일러와 인터프리터

컴파일러

  • High level language → compiler → machine code
  • 단점: 코드를 수정하고 잘 실행되는지 run할 때마다 컴파일러를 돌려야 하기 때문에 시간이 많이 소요된다.
  • 장점: 실행속도는 더 빠르다
  • 첫번째 컴파일러의 개발? 어셈블리어를 사용해서 작성됨
print("Hello")

어셈블리어

        extern printf
        section .data
msg:    db "Hello", 0
fmt:    db "%s", 10, 0
        section .text
        global main
main:
        push    rbp
        mov     rdi,fmt
        mov     rsi,msg
        mov     rax,0
        call    printf
        pop rbp
        mov rax,0
        ret
0010011010011001
1101010011100101
1100010101001010
0100101101010010
1101011000101100

인터프리터

  • 한 줄씩 즉시 실행해주는, 코드 번역기보다는 코드 실행기에 가까움
  • 장점: high level language로 코드를 전달하는데 코드는 low level에 가까워질수록 길어지므로 프로그램 용량이 비교적 작고 전달속도 또한 비교적 빠름
  • 단점: 프로그램의 코드가 그대로 전달되어 유출 위험이 있음

운영 체제(OS: Operating System) 개요

  • 종류: window10, Mac OS, Linux, Android, iOS
    윈도우, 안드로이드는 설정을 쉽게 바꿀 수 있는 대신 보안에 취약
    임베디드 운영체제: 가전제품, 비행기 등등 다양한 분야에서 사용됨
  • 용도: 데스크톱/랩톱 용도, 모바일 용도, 서버 용도와 임베디드 용도
  • 특징
  1. 기계의 전원을 켜면 자동으로 실행됨
  2. 실시간 운영 체제(RTOS: Real-time operating system)에서는 속도보다는 안정성이 중요함
  • 역할
  1. 입출력 관리: 마우스, 키보드의 입력, 화면의 출력을 매끄럽게 연결
    애플리케이션과 입출력 기기 사이에서 운영체제가 기기의 제조사, 연결방식등을 조사해서 고려한 후 둘을 연결해줌
  2. 저장과 불러오기 - 컴퓨터 저장장치의 종류
    (1) 컴퓨터의 전원이 켜져있는 동안만 유지되는 장치 (휘발성): 저장용량이 제한적이기 때문에 휘발성 정보도 필요함(램) vs 비휘발성(하드디스크)
    (2) 읽고 쓰는 속도의 차이: 빠른 저장장치는 작은 용량으로, 느린 저장장치는 큰 용량으로 장착해두고 운영체제의 판단에 따라 데이터를 분리해 저장함 ← 빠른 저장장치는 비싸므로 무한정 사용하기는 어려움
    (3) 데이터 수정 가능 불가능 여부: 컴퓨터 기본 세팅 등을 저장해두어서 수정이 불가한 메모리를 ROM(Read-Only Memory)라고 부른다.
    (4) 멀티테스킹 관리: 애플리케이션이 겹치지 않도록 관리함
  • UNIX: 대부분 C언어로 작성되었으며 다른 컴퓨터에서 수정해 적용이 쉬움. 최다인원이 투입된 프로젝트로 수많은 큰 기업들의 참여로 오늘날까지도 발전되어옴. 누구나 사용이 가능하며, 변형시 반드시 코드를 공개해야 함.
  • POSIX에 UNIX라면 갖춰야 할 규격과 기능이 정의되어있으며 이를 만족하면 UNIX로 인정받을 수 있음
  • GNU: UNIX의 코드와는 한 줄도 겹치지 않으나 POSIX를 만족하는 유닉스의 규격과 기능을 갖춘 프로그램 → Free Software에서 제작 (오픈소스)

플랫폼

  • 플랫폼? 프로그래밍이 실행되는 하드웨어/소프트웨어 환경 (애플리케이션의 플랫폼은 운영체제이며, 운영체제의 플랫폼은 하드웨어임)
    프로그래밍 다운로드시 win64bit 이런 식으로 버전을 나눠서 배포하는 이유 → 플랫폼 의존성
  • 플랫폼 파편화 문제 → 해결책: 표준 설정, 크로스 플랫폼(가상머신, 웹)!
    - 예: 이어폰이 처음 출시되었을 때, 특정 이어폰과 특정 휴대폰만 연결된다면 경우의 수가 지나치게 많아지므로 표준을 설정해야 함
    • 개발자들이 가상의 컴퓨터를 사용해서 하나의 규격을 지정하듯 설정함(자바의 JVM)
    • 웹에서는 ISO에 등록된 규격인 웹표준이 존재하며, 반응형 웹디자인으로 설계함 (한계: 브라우저 호완성)

네이티브 애플리케이션과 웹 애플리케이션

  • native application(휴대폰앱): 인터넷 연결이 반드시 필요하지는 않음. 그러나 설치가 반드시 필요함.
  • web application(웹페이지): 접근성이 비교적 좋음 (간단한 기능일수록 선호되는 방식)

웹의 활용

  1. Single-page Application - 예시: facebook, gmail, googlemap
  2. Hybrid Web Application: native app에서는 원래 광고 이미지를 교체하고 싶더라도 새로운 버전을 배포하고 사용자가 앱스토어에서 새 버전을 다운받는 과정이 필요했음. 그러나 새로운 광고 이미지를 위해 업데이트를 다운받는 사용자는 없을 것이므로 이들이 고안해낸 새로운 방식은 native app의 작은 부분에 구멍을 뚫어두고 그 부분에는 web url을 삽입해두는 것임. 이 방식을 통해 광고를 바로바로 update해서 제공할 수 있음.
  3. Progressive Web Application (PWA): 설치 없이 실행 가능(주소 입력만으로 접근 가능), 실시간 업데이트, 인터넷 없이 실행 가능, OS 기능 사용 가능 등의 기능들을 대다수 만족하는 웹을 지칭하는 용어

컴퓨터 구조 이해하기

필요성

  • 시스템 개발자: 시스템 소프트웨어 (하드웨어와 애플리케이션을 연결하는 역할)를 개발하는 역할이므로 컴퓨터의 구조를 알아야 함 - 연봉 높음 ㅎㅎ
  • 애플리케이션 개발자: 오류 발생 시 본인 코드의 문제인지 실행환경의 문제인지 등을 구분하기 위해서 컴퓨터의 구조를 알아야 함
    첫번째 노트 읽어보고 복붙해서 정리(CPU, RAM, harddisk)

이진법

  • 모스부호, 점자, 손전등(점등/소등) 등 2가지 상태만으로 많은 내용을 표현하려는 시도는 늘 있어왔음

  • 2가지 상태만으로는 표현이 쉽지 않지만 표현된 결과를 어떻게 해석할 것인지에 대한 ‘약속’이 있다면 가능함

  • 2진법 표현

  • 2진법 연산: 올림 개념

  • 비트(bit), 바이트(byte)
    비트(bit): binary digit의 약자로 데이터의 최소 단위 → 1001 = 4비트, 11001011 = 8비트
    바이트(Byte): 바이트는 비트의 8배 → 1 Byte = 8 bit

논리연산

  • 필요성: 휴대폰 화면을 켤 때 → 전원버튼 클릭 OR 화면 터치

회로설계(Cirucuit Design)

  • 한자릿수 덧셈

  • 여러 자릿수 덧셈

CPU(중앙처리장치)

  • 하나의 칩(CPU)에 여러 기능 담는 방법: opcode(instruction 앞 6자리)사용
    opcode의 값과 각 기능을 연결지어서 설계하기


    → 연산칩 = ALU
    CPU의 opcode 자릿수는 6자리 정도임

  • CPU의 instruction들: 대부분 저장장치 관련 내용들임

  • 저장장치 종류
    - CPU 외부(하드디스크, RAM)
    - CPU 내부
    레지스터: 용량이 작은 대신 속도가 가장 빠른 저장장치로, 컴퓨터의 성능을 좌우함. nbit-register로 저장공간이 n인 레지스터를 표현함

  • 머신코드 실행하기(CPU의 instruction)
    CPU 동작의 최소 단위는 Instruction

    (예시) computer의 명령: 0010 메모리 주소에 있는 값을 레지스터 A에 저장해

  • RAM의 공간 분리

  • 어셈블리 언어(symbolic machine code): 읽을 수 있는 머신코드

    어셈블러를 활용해 변경함

컴퓨터의 성능

  • GHz: Hz는 1초에 몇 번을 반복하는지를 의미하고 G는 10억을 의미하므로 3.6GHz는 1초에 36억번을 반복한다는 의미임

  • Cycle: 각 명령어마다 다름
    → MIPS 시스템에서는 LOAD 명령어에 5cycle이 소요되므로 (3.6GHz / 5)번의 LOAD 연산이 가능함

  • Clock rate: 1초에 실행할 수 있는 사이클의 개수

  • CPI (Cycles per instruction): 한 Instruction이 평균적으로 몇 사이클만에 완료되는지

  • IPC (Instructions per cycle): CPI의 역수

  • IPS (Instructions per second): 하나의 클럭에 얼마나 많은 코드를 얼마나 소화할 수 있는지

  • 멀티 코어 (Multi-Core)
    듀얼 코어, 쿼드 코어, 헥사 코어, 옥타 코어 → CPU 개수가 2, 4, 6, 8개인 컴퓨터
    Clock rate(speed)를 증가시키는데에는 한계가 있으므로 도입된 개념
    이론상 듀얼 코어는 2배의 속도로 빨라져야 하겠지만, 프로그램이 실행될 때, 동시에 실행할 수 있는 것과 동시에 실행할 수 없는 작업들이 있으므로 2개의 코어 중 하나만 일하고 하나는 쉬는 시간도 발생해서 실제로는 50% 정도 더 향상됨

  • CPU의 성능 결정요소들:
    클럭이 얼마나 빠르냐 (Clock Speed),
    한 클럭에 얼마나 많은 일을 할 수 있느냐 (CPI, IPC, IPS),
    몇 개의 코어가 있느냐 (멀티 코어)

프로그램 실행속도 높히기

  1. Instruction의 개수 줄이기: 실행코드(머신코드)가 짧아지도록 만들자
  • 언어(C처럼 기계어에 가까울수록 머신코드는 짧아짐), 알고리즘, 컴파일러에 따라 머신코드의 길이가 달라짐
  1. Instruction의 실행속도 높히기
  • 파이프라인: instruction들을 동시에 여러개 실행하기
  • 예측: 다음에 사용될 데이터를 예측해서 cache 메모리에 저장해두기
  • make the common case faster
    반도체의 집적도: 하나의 칩 안에 몇개의 회로를 넣을 수 있는가
    집적도를 높히려면 연결선을 아주 얇게 만들어야 함. 그러나 14나노미터 정도의 수준에 이르자 발열, 자기장 등의 문제로 인해 현재 더 얇게 만드는 과정은 멈춤

0개의 댓글