프로그래머의 세계 이해하기
프로그래밍의 다양한 분야
- 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
윈도우, 안드로이드는 설정을 쉽게 바꿀 수 있는 대신 보안에 취약
임베디드 운영체제: 가전제품, 비행기 등등 다양한 분야에서 사용됨
- 용도: 데스크톱/랩톱 용도, 모바일 용도, 서버 용도와 임베디드 용도
- 특징
- 기계의 전원을 켜면 자동으로 실행됨
- 실시간 운영 체제(RTOS: Real-time operating system)에서는 속도보다는 안정성이 중요함
- 입출력 관리: 마우스, 키보드의 입력, 화면의 출력을 매끄럽게 연결
애플리케이션과 입출력 기기 사이에서 운영체제가 기기의 제조사, 연결방식등을 조사해서 고려한 후 둘을 연결해줌
- 저장과 불러오기 - 컴퓨터 저장장치의 종류
(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(웹페이지): 접근성이 비교적 좋음 (간단한 기능일수록 선호되는 방식)

웹의 활용
- Single-page Application - 예시: facebook, gmail, googlemap
- Hybrid Web Application: native app에서는 원래 광고 이미지를 교체하고 싶더라도 새로운 버전을 배포하고 사용자가 앱스토어에서 새 버전을 다운받는 과정이 필요했음. 그러나 새로운 광고 이미지를 위해 업데이트를 다운받는 사용자는 없을 것이므로 이들이 고안해낸 새로운 방식은 native app의 작은 부분에 구멍을 뚫어두고 그 부분에는 web url을 삽입해두는 것임. 이 방식을 통해 광고를 바로바로 update해서 제공할 수 있음.
- 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),
몇 개의 코어가 있느냐 (멀티 코어)
프로그램 실행속도 높히기
- Instruction의 개수 줄이기: 실행코드(머신코드)가 짧아지도록 만들자
- 언어(C처럼 기계어에 가까울수록 머신코드는 짧아짐), 알고리즘, 컴파일러에 따라 머신코드의 길이가 달라짐
- Instruction의 실행속도 높히기
- 파이프라인: instruction들을 동시에 여러개 실행하기

- 예측: 다음에 사용될 데이터를 예측해서 cache 메모리에 저장해두기

- make the common case faster
반도체의 집적도: 하나의 칩 안에 몇개의 회로를 넣을 수 있는가
집적도를 높히려면 연결선을 아주 얇게 만들어야 함. 그러나 14나노미터 정도의 수준에 이르자 발열, 자기장 등의 문제로 인해 현재 더 얇게 만드는 과정은 멈춤