본문 바로가기

프로그래밍 고찰/고찰

[고찰] 힙스터 개발자 회고

#이뭐야?
:반올림이요
:#은 전처리기 지시자 이다
   전처리기 지시자가 뭔데
   :컴파일하기 전에 처리해야할일을 수행하는 프로그램
      컴파일이 뭔데?
      :고급언어를 저급언어를거처 기계어로 변경하는 프로그램
         고급언어가 뭔데?
         :인간이 이해하는 자연어와 가까운언어
         저급언어는 뭔데?
         :어셈블리와 같이 기계어와 가까운 언어
            어셈블리가뭔데
            :기계어와 1대1 대응되는 언어
         기계어가 뭔데?
         :0과1로 이루어진 언어
         컴파일하면 뭐가 나오는데
         :목적파일 (.obj/.su) 등이 나온다
            목적파일은 실행하면되는것인가?
            :목적파일은 실 동작방법이 없기때문에 링킹과정을 거쳐야함
               링킹이 뭔데?
               :링커가 목적파일과 라이브러리 파일을 연결해주는 과정
                  라이브러리가 뭔데?
                  :프로그램이 참조할 일종의 모듈 여기서 목적파일이 ["Hello World"를 출력하라] 내용이 기계어로 되어있다면 라이브러리는 [~~ 을 모니터에 출력하는방법] 이 있음.
      프로그램이 뭔데?
      :컴퓨터에서 실행되는 일련의 작업체
include 가 뭐야?
:include 는 뒤에 나오는 파일내용을 복사하여 현제 파일에 집어놓음
   뒤에 파일이 어디있는데?
   :IDE 등에 설정된 폴더와 현재 프로젝트에서 지정해놓은 폴더 기준
      IDE가 뭔데?
      :통합 개발 환경
< > 가뭐야?
:  컴파일러가 미리 정해놓은 위치에서 찾음 "" 은 소스파일위치에서 찾음
   진짜?
   :근데 왠만해서는 알아서 둘다 찾음
iostream 이 뭐야?
: 헤더파일이며 (정확히는 .h 가 아니라 아니지만) 표준 입출력 라이브러리
   헤더파일이 뭔데
   :일반적으로 선언부분만 있는 파일
      선언이 뭔데?
      :내가 이것 이것을 사용할꺼다/구현할것이다 를 미리 말하는것, 실제 동작을 기술한것은 구현
using namespace std 가 뭐야?
:std 라는 네임스페이스를 쓴다는 선언 std는 표준 네임스페이스
    네임스페이스가 뭔데?
    :말 그대로 이름공간, 다른 네임스페이스에서는 이름이 같아도 다른것으로 처리함, 이원준과 김원준이 성이 다른것 처럼
int 가 뭐야?
:정수형 자료형, 32비트
   32비트야?
   :일반적으로 32비트 CPU 32비트 OS 에서 32비트, 그러나 언어 Spec 이므로 컴파일러에 따라 정의됨
main 이 뭐야?
:프로그램이 시작될때 처음으로 시작되는 함수, 엔트리 포인트
   함수가 뭔데?
   : 특별한 작업을 수행하기 위한 서브 루틴 독립적으로 설계된 코드의 집합
() 가 뭐야?
:함수에서 사용할 파라미터 여기서는 아무 파라미터를 쓰지 않기때문에 비어있음
   main은 파라미터가 없어?
   :여기서는 없는데, argv argc (C++ 기준) 등으로 사용가능함
{ 가 뭐야?
:함수 또는 특정 영역 뎁스를 구분하기위한 브레이스
cout 이 뭐야?
:콘솔아웃, 콘솔에 특정 정보를 출력함
   콘솔이뭐야?
   :그 키면 나오는 검은창
<< 가뭐야
:비트 왼쪽 시프트 연산자
   그게 뭔데?
   :모든 비트를 왼쪽으로 이동시킴
   그럼 콘솔 비트를 이동시키는거야?
   :여기서는 오버로딩된것이라 뒤에 정보를 앞으로 전달하는 역할을 함
"가뭐야
:문자열 표시
   문자열이 뭐야?
   :문자의 집합, 일련의 문자들을 표시
      문자가뭐야?
      :' 으로 표시됨, 캐릭터
         0101만 이해하는 컴퓨터가 문자를 어떻게 이해하는데?
         : 아스키 코드/유니코드
endl 이 뭐야
: 줄바꿈, '\n' 과 동일
return 이뭐야?
: 함수를 호출한 곳에 return 값을 되돌려줌, 여기서는 main 은 OS 가 호출한 엔트리포인트 이므로 OS 에 반환

이게 뭐냐하면... 제가 컴퓨터공학과에 처음 입학한 다음 동아리에서 오자마자 시켰던것중 하나로
"C++ 에서 Hello World 를 출력" 하는 코드를 가지고 처음(#)부터 끝(return)까지에 대하여 물어보는것 입니다.
꼬리물기식으로 계속 물어면서 진행되는데 그때 이렇게 선배가 계속 질문하면 미쳐버리는줄 알았습니다만.. (반대로 제가 교육부장을 해서 애들한테 물어볼때는 통쾌했음)
지금 생각해보면 이런식 (Why.. Why... Why...) 으로 생각해보는걸 저는 좋아하는것 같아요.

원래 호기심도 많아서 이를 해소하기위해서 찾아보는걸 좋아해요
뭐 그래서 갑작스럽게 생긴 궁금증을 해소하곤 합니다.
[C++ 에서 this 를 쓰는이유], [숨겨진 this pointer] 요런것들..

당연히 모든걸 공부할때 이렇게 타고 들어가지 않습니다... 언제 다하냐 이걸..

다른글에도 종종 올렸지만 저는 기술스택을 초월하는 프로그래밍 통찰력이 있다고 믿습니다.
뭐 혼자 그렇게 생각하는걸수도 있고 제가 넓게~~ 넓게~~ 알고있어서 그런것일지도 모르죠.

넓게~ 넓게~ 알게된 계기는 아마 제 성격적인 특징 때문일것입니다.
저는 호기심이 많고 하고싶은게 많습니다.
초등학교시절엔 발명 영재교육도 받았었고, 애초에 컴공과를 온것도 게임이랑 어플리케이션만들고 싶어서 였습니다.

그래서 포토샵이랑 3D 모델링도 (아주아주) 조금 할수있습니다.. 중고등학교때 취미로..
그땐 이게 게임이라 어플리케이션 만드는건줄 알았어요.

모델링이나 아이콘 그리기등..

그래서 아이디어같은걸 계속 핸드폰 메모장에 계속 정리합니다.
"어 이런게 있으면 재밌겟는데?" 나  "야 이거 괜찮지 않냐?" 같은것들
이런건 아이디어니까 도메인을 가리지 않죠, 어플리케이션, 서비스, 유틸리티, 게임.. 뭐 코인만든적도있고요..
뭐 작은 유틸리티나 뚝딱 나오는것들은 그냥 바로 합니다 보통
근데 아이디어라는게 그렇게 한번에 제품이 되는게 아니잖아요? 그래서 그냥 일단 묵히는 경우가 많아요

근데 약간 제 로망은, 사실은 모두가 그렇겠지만,
(연금복권 당첨되서) 방에서 혼자 하고싶은 개발을 계속하고, 서비스하고, 또 다른걸 만들고.. 이거 입니다..
지속적으로 계속 챙겨는 봅니다.
예를들면 저는 만들고싶은 VR 게임이 있는데, 언리얼에서 매달 에셋을 한 5개정도? 기간한정으로 무료로 뿌리거든요.
이걸 거의 2년 넘게 꼬박꼬박 챙기고 있습니다. 뭐 언젠가 만들겠지~ 하면서

언젠간 쓰지않을까?



그래서 이게 힙스터랑 무슨 상관이냐?
사실 저는 힙한걸 좋아하는 사람이 아닙니다...
제가 좋아하는게 하필 남들이 볼때 "저거 저거 힙스터네" 하는거 뿐입니다.

동아리에서 프로그래밍 교육을 받았을때, 이때는 정말 재미있게 공부했던것 같습니다.
맨위에 저런것도 하고

방학때 동아리에서 방학중 교육이라고 학교에 나와서 OOP 를 배웠는데 그때가 제일 재미있었던거 같아요.
아침부터 밤까지 코딩만 시키긴 했지만..


그 이후에, 솔직히 학부때에는 정말 많은 활동을 했습니다. 방학에도 쉰적도 거의 없고요
연구실에서 아르바이트일도 하고, 외주, 소프트웨어 마에스트로 활동, 재능기부 챌린지, 해커톤, 수상경험, 방학 인턴도 2번이나 했고, 학부연구생으로 들어가기도 했고 그리고 결국 "연구"자체는 어떤것인가 궁금해서 석사 활동까지 했고요.
(해보니 더 알겠더라고요, 저는 리서처보다는 엔지니어가 몸에 맞습니다..)


그러나 이런 활동을 하면서 항상 의문이었습니다.
기술을 구글링하고 프로젝트를 하는것..
백엔드, 프론트, 어플리케이션..
뭔가... 뭔가 하면할수록 이게 잘하는것인가? 하는 생각이 들었습니다.
"이게... 의미가 있나?" /"내가 성장하고 있는것인가?" / "이걸 오래하면 성장하는것인가?"
"트러블슈팅 경험이 곧 성장인가?" 하는것들..

그런데 이것 저것 해보다가 동아리 사람이랑 SICP (컴퓨터 프로그램의 구조와 해석) 이라는책을 가지고 스터디를 한적이 있는데, 뭐 일단 책 내용도 좋아요 유명하잖아요,
근데 그것보다 더 관심이 간것은 스킴이였고
스킴을 찾아보다가 Lisp 이나 Clojure를 알게되었죠

그리고 로버트 C 마틴의 Why Clojure 같은것도 찾아보게 되었습니다.
뭐 자연스럽게 FP 를 찾아보게된건 덤이고요

재밌었습니다. "복잡성 제거, 추상화, Simple"
"아니 그냥 Map 으로 데이터를 표현한다고? 왜?" 하는 의문이 있으면 또 찾아보고.. 리치히키의 강연을 보고...

점점 더 메타적이고 추상적인 것에 흥미를 가지게되고
약간 그런것들 "와 개천재인데? 어떻게 이런생각을 했냐?"
넓게보면 패러다임적 요소, 기술로따지면 퓨리에변환, 그걸 비디오 코덱에 적용한 DCT, 비전의 허프 변환 등등..

이런걸 공부하면서 그동안 "제가 넓게~ 넓게~ 알고있던것을 횡단하는 본질적인 무엇"이 존재한다고 느끼게 되었습니다.
그리고 혼자 생각해 봣을때 일종의 "통찰력 향상" 이 아닌가 생각하게 되었고 그게 지금까지 이어지고 있습니다.

저는 컴퓨터 엔지니어링이 라는것은 디커플링과 추상화 두가지가 전부라고 생각해요

OOP 쓰는이유 : 인터페이스 분리해서 데이터 격리해서 디커플링 / 연관 데이터를 모아서 추상화
FP 쓰는이유 : 순수함수로 사이드이펙트 분리해서 디커플링 / 기능과 데이터를 분리해서 추상화
MSA 쓰는이유 : 서비스 분리해서 디커플링 / 서비스별로 분리해서 추상화

그래서 어떤 기술이든 패턴이든 저 두가지 관점에서 생각하고, 추상화 도메인이 뭔지 추측해보고.. 이것의 아이덴티티는 무엇인가 생각해보고.. 이런것들이 더 재미있습니다.
이런것은 사용법을 익히지 않죠 사용법은 제 주요 관심사가 아닙니다.
공부해도 계속하지 않으면 까먹는거고.. 까먹어도 한번 공부했으면 금방 다시 할수있을테니까요

그렇기 때문에
JVM 의 메모리 구조 (에단, 퍼시스턴트, 올드, 영.. 이런것들),
흔하게 하는 OS 적인공부 (쎄마포어/ 뮤텍스 / 데드락 / 프로세스 / 쓰레드 / 비동기 / 동기)
SQL (인덱스 / 클러스터드 / 넌 클러스터드 / Join )
오케스트레이션 (docker / K8s) 
프레임워크 (Spring / Django / ...)
알고리즘 (DP/그래프/더블포인터) 이런것들, 저는 나름 전공 성적도 좋았고, 교내 알고리즘 수상도 했지만
이런것 자체에 큰 흥미를 느끼지 않습니다. (중요하지 않다는것이 아닙니다. 저도 열심히 공부했었습니다..)

OSS 같은것도
솔직히 말해서 저는 "OSS 철학에 감명받아서~", "내 기술의 원론적인 부분의 이해", "대형 프로젝트의 커미터가 되자" 이런 거창한 마음가짐은 없습니다.
그냥 내가먼저 발견했으니까 고치는거고, 내가 쓰고싶으니까 추가하는겁니다. 일종의 보이스카우트원칙?


단순히 알아야하기때문에 공부한다. 또는 취업을 위해서 공부한다. 이런것은 안타까운 일이라고 생각합니다.

우리는 고통받기위해 코딩하는것이 아니고,
우리는 누군가에게 인정받기위해 코딩하는것이 아니잖아요?

인정 받을수 있고, 인정받는것은 좋지만, 인정받기위해서 하는것은 아닙니다.
좋아하니까 하는것입니다.

흥미가 있으니까 알아보는것이고,
학습하는것이고 공부하는것입니다.

후회할수도 있죠 근데 아마 과거로 돌아가도 똑같은 선택을 했을것 같아요.

728x90