Skip to content

Latest commit

 

History

History
183 lines (125 loc) · 8.31 KB

Week1.md

File metadata and controls

183 lines (125 loc) · 8.31 KB

1 주차: 7월 14일

반갑습니다!

요즘 보면 개발자 좋은 직업처럼 보인다... 넓은 개발분야, 다양한 개발환경, 잘 정리/누적된 개발 경험들

이 분야는 굉장히 이상함. (아니면 진행자가 이상함. 판단은 스터디 참여하시는 분들께서...)

개발 잘하는 분들이 자주 하는 말: "아 개발 잘하고 싶다."
초고수 개발자님들은 이미 개인 프로젝트를 해서 공개하기도.

어느 순간 여러분이 자신의 기술적 능력/비전에 대해서 말하고 계실지도...

스터디 추천자료

요즘은 스타팅 레벨의 자료는 충분히 많음. 순전히 검색의 문제. 조금 추려보았습니다.

보고 들으며 따라하는 스타일

  • 인프런
    구글 검색하면 '인프런 같은 사이트'가 나오는데 그런거 찾지 마시고 '인프런'을 들어가면 됩니다.

  • Microsoft Virtual Academy
    특강 진행하는 사람은 여기서 대부분을 배웠습니다.

  • edX / Coursera
    좀 더 학문적인 접근, 컴퓨터 이외의 분야를 들어보고 싶을때 쉽게 찾을 수 있음 실제로 과제를 제출해가면서 수료증/학위를 받고 싶을 때

  • 생활코딩 Youtube 채널
    프로그래머가 아니어도 따라할 수 있는 강의. 전공자들이 교양지식을 더 갖추기에도 좋은 곳. 웹 서비스를 만들어나가는 과정

문헌 중심으로 공부하는 스타일

주변에 추천을 요청해도 되지만, 좋은 책들은 도서관에 있습니다. 서점에 가는 건 도서관에서 찾아본 이후에 해도 늦지 않아요.

  • Head First 시리즈
    딱딱한 설명이 싫은 경우. 입문서라는 정체성에 충실함

  • 프로그래밍 언어 계열
    한 언어를 정해서 쭉 파고 들어가는 것을 추천. 낡고 오래된 책이어도 얕보지 않는 것이 좋음. 존 스튜어트 밀 독서법으로 단계적으로 접근.

  • [만화로 배우는] 시리즈
    유투브로 프로그래밍을 배우는 시대. 만화로는 못배울 이유가 없죠.

외가 무공에 통달하고 싶다

  • 플랫폼을 먼저 정해본다
    주니어로써 한 사람이 할 수 있는 시도는 정해져 있다. 마음에 드는 환경, 혹은 접하기 쉬운 환경을 중심으로 공부.

  • 기술 블로그
    대표적으로 Naver D2. 검색하고, Trial만이라도 따라해 보는 것도 방법

  • 개발자 커뮤니티 / 세미나 / 스터디
    자타의 공인을 받는 개발자분들을 볼 수 있기도, 기술의 원리나 동향에 대한 이야기. 프로그래머로써의 안목, 방향 설정에 영향. 쓰기 어려운 혹은 비주류 기능/기술에 대해서 공부하는 경우, 대개 단기간에 배울 수 없는 경우가 많음. 환경 설정 하는데만 1주일~1달이 걸리는 경우도.

시스템

이것을 공부 해서 얻게 되는 것: 통찰

닌자는 멀리본다. 화면 밖까지...

유념할 것들?

  • 오해를 하지 않기 위한 노력
  • 멍청한 질문은 없다

잘못된 지식을 가지는 것에 경계해야 함. 셀 수 없는 수고가 이미 각 분야를 위해 지불되었음. 질문하고 검색하는 것이 혼자서 애를 쓰는 것 보다 효율적. 질문하는 것은 시간을 뺏거나 괴롭히는 것이 아님. 검색하는 것은 시간을 낭비하는 것이 아니라 간접적인 형태로 경험을 쌓는 과정.

분야

'시스템' 사전적 정의: 제도/체계

요컨대, 이미 갖춰진 것들이 있다는 이야기

  • 배경철학, 프로토콜(절차와 방법), 표준화, 문헌자료...

전산 하는 사람들이 시스템이라 부르는 것?

  • 임베디드
  • 운영체제/가상기계
  • 프로그래밍 언어/개발도구(컴파일러, 라이브러리...)
  • 미들웨어(프레임워크, 런타임...)
  • 데이터베이스(+ SQL)
  • 네트워크 인프라(보안, 라우팅, 클라우드...)
  • ...

모두 굵직굵직한 분야들...

프로그래밍

특정 목적을 위한 프로그램을 만들어나가는 일련의 과정들

시스템 프로그래머

운영체제, 네트워크 소프트웨어, 컴파일러, 디버거, 가상 기계, 임베디드와 관련된 개발

머신의 구조 / 실행환경(Runtime Environment)에 주의를 기울임 (+ 관련 표준) 정확성 / 호환성 / 동시성 / 효율성 등에 대한 고려

프로그램 & 프로그래밍 언어

  • 프로그램: 실행 가능한 기계 명령의 집합
  • 라이브러리: 프로그램을 만드는데 사용되는 프로그램들

해결하는 문제 Problem (혹은 분야 Domain)에 대한 이해, 알고리즘 Algorithm (자료구조와 수학), 실행기 Machine(하드웨어, 혹은 가상기계)에 관한 지식 등이 결합된 결과물. 프로그래밍 언어를 사용해서 작성하게 됨. C++ Korea에서 진행하기 때문에 C++를 중심으로 하지만, 아래의 문구를 먼저 기억해주기를 바랍니다.

"좋은 프로그래밍 언어는 프로그래밍에 대하여 사고하는 개념적인 세계를 제공해준다" - 앨런 펄리스(Allen Perlis)

유명한 프로그래밍 언어? TIOBE Programming Index

프로그래밍 언어와 자연어의 다른점?

  • 대화 상대: 실행기(Machine)가 무엇을 해야하는가?에 대한 내용
  • 표현하는 영역: 실행기가 수행할 수 있는 작업(task)에 대해서 기술하는 것이 목적

구문구조(Syntax) / 문법(Grammar) / 타입 시스템(Type) / 의미구조(Semantics)

  • 어셈블리?
    사람이 읽을 수 있는 명령어.
    컴퓨터(계산기, 실행 기계의 구조)에 의존적.
  • 고수준 언어?
    컴퓨터(계산기, 실행 기계의 구조)에 독립적으로 작성된다는 이야기

프로그래밍 언어에 요구되는 것

  • 단순성: 코드가 복잡하지 않은가? 작성하기 쉬운가? (즉, 배우기 쉬운가?)
  • 명확성: 프로그래머의 의도를 그대로 표현할 수 있는가?
  • 신뢰성: 후원사? 개발 도구?
  • 생산성
  • ...

널리 알려진 패러다임들

  • 명령형: 프로그램은 명령문을 나열한 것이다
  • 개체지향: 메시지의 교환
  • 함수형: 프로그램을 함수로 모델링한 것

프로그램이 가지는 속성?

성능, 혹은 품질이라는 용어는 굉장히 추상적이다. 일반적으로 사용되지만 이는 여러가지 속성을 고려해서 사용하여야 함

  • 동시성(Concurrency): 정보의 공유, 동기화에 대한 것. 어디서든 발생가능함.
  • 병렬성(Parallel): 물리적으로 동시에 실행됨
  • 정확성(Correctness): 이 프로그램이 증명(검증) 가능한가? (모델링)
  • ...

언어 표준(Standardization)

목적

  • 오-래된 코드를 한번 보면...
  • 프로그램(+ 소스코드)의 이식성 내용
  • 구문구조/타입/의미구조 등
  • 언어에서 사용되는 문자집합(ASCII)
  • 프로그램을 작성하기 위한 기본 라이브러리

바인딩(Binding) 이라는게 있습니다... 언어에서 필요한 요소들이 결정되는 시간들

  • 언어 정의: 언어를 정의할 때
  • 언어 구현: 컴파일러/인터프리터의 제작시기
  • 프로그램 작성: 함수, 변수의 선언
  • 프로그램 실행: Re-binding / Mutation

소스코드에서 프로그램까지

대부분 손 그림으로 설명할 부분. 스터디 진행기간동안 그림자료 추가 예정

프로그래밍 언어로 작성된 프로그램을 분석하는 것

Compile: 실제 컴퓨터에서 실행가능한 형태로... Interpreting: 가상기계에서 실행가능한 형태로...

Build = Compile + Linking

Compile

  • 소스코드 > 어휘 분석 | 구문 분석 | 타입 검사 | 코드 향상 | 코드 생성

추상기계를 위한 중간언어로 번역하는 경우도... 추상기계? 대표적으로 JVM과 CLR. 요컨대 실제 실행기계를 특정할 수 없다는 의미

현재는 JIT compile 기술을 활용 (다음 시간에 살펴볼 것. CLR의 동작?)

Linking

링커 / 링크-에디터가 개입

그림 추가 필요

바이너리의 구조

ELF 파일을 살펴봅시다. https://ko.wikipedia.org/wiki/ELF_%ED%8C%8C%EC%9D%BC_%ED%98%95%EC%8B%9D