POCU/후기

웹개발자면 C++언어 학습하지 마세요!

성수아자 2024. 8. 22. 00:07

뻘소리를 건너 뛰고 C++ 후기만 보고싶은 분들은 목차를 클릭하시면 됩니다! 사회초년생의 지극히 주관적인 좁은 견해이니 너그러이 이런 생각을 하는 사람도 있구나 하고 봐주시면 됩니다!

들어가기에 앞서..

COVID19 이후 전세계가 온라인화 되면서 개발자에 대한 수요가 증가했다. 거기다 미국이 경기침체에 대비하여 시중에 엄청난 유동성을 공급하여 시장에선 엄청나게 많은 사업을 테스트 해볼 시간과 자금이 생겼고 이로 인해 성공한 사례들이 곧곧에서 등장했다. 여기까진 좋았다.

하지만.. 기존의 개발자 공급 풀은 정해져 있었고 수요는 빠르게 급증하여 개발자의 몸 값이 치솟았다. 이는 곧 개발자의 공급 증가 유인이 되어 많은 비전공자(?)들이 나포함 개발자 시장에 뛰어 들었다. 빠른 공급으로 인해 학습 시간이 현저히 적었고 급하게 코딩 문법을 익히고 프레임워크를 배우고 추상적인 말들로 컴퓨터를 배우는 현상이 나타났다. 여기서 문제가 있었는데 이러한 공급이 성공했다는 것이다. 적당히 빠르게 공부한 사람들이 좋은 회사에 취직하고 막대한 부를 얻는 등 여러 성공 사례들이 나오면서 기존 컴퓨터 지식에 대해 학습하는 건 힙하지 않고 고전적인 방법이고 빠르게 공식문서 읽고 적용하는 것이 힙한 개발로 평가되는 거 같았다.

여기까지가 팬데믹 이후 엄청난 유동성 자금이 풀리고 경기가 좋아져서 발생한 일들이다. 만약 해당 시기만 보고 어떻게 개발자가 되냐고 묻는다면 파이썬으로 문법 대충 배우고 프레임워크 배워서 프로젝트하고 빠르게 취업하는 것이 경제적이며 효율적이다. 해당 시기에 웹개발자가 C/C++언어를 공부하고 있다면 그것은 합리적이지 않은 선택일 것이다.

경기는 순환한다. 경기는 좋아질 때도 있고 나빠질 때도 있다. 물론 특정 국가가 수출 상황이 매우 좋고 내수도 좋아서 경기가 침체되지 않더라도 일시적일 뿐이다. 엄청나게 급성장한 우리나라도 고도 성장이 끝나고 선진국 반열에 들어서며 성장률이 한자릿 수를 기록하고 있는 상황이다. 결국 이 글을 쓰는 시점에서 우리는 경기침체에 대비해야 한다. 경기침체에서 기업들은 공격적으로 투자하지 않는다. 여러 상황에 대비해야 하기에 현금 확보가 우선순위이기 때문이다. 여기서 현금 확보를 위해 최대한 짜낼 것이다. 소프트웨어 회사에서 인건비는 매우 많은 고정비이다. 이를 줄이려고 수단과 방법을 조금은 가려가며 사람들 평가할 것이다. 만약 내가 재무팀의 일원으로서 사람을 평가한다면 당연하게도 실력으로 가를 것이다. 여기서 실력은 프레임워크를 얼마나 잘 쓰느냐도 있겠지만 결국 프레임워크는 컴퓨터 기본 언어로서 추상화된 소프트웨어에 불과하며 전공 지식을 충분히 학습하고 이를 활용한 프레임워크를 사용해본 경험을 실력있다고 생각할 것이다.

전공을 하지 않고 COVID 시기에 프레임워크보다 전공 지식에 치중한 사람으로서의 자기 위로 글이라고 볼 수도 있다. 그래도 나름 설득력이 있었다면.. 다행이고 궤변에 불과하다고 생각한다면.. C++ 언어 학습하지 마세요!

 

 

웹개발자의 C++언어 학습 기록

(POCU 아카데미 COMP3200 C++ 언매니지드 프로그래밍 후기)


▶ 나의 POCU 학습 기록

▶ 스타트업에서의 근황

▶ 커머스 스타트업에서 개발하기

▶ 그럼에도 계속 POCU 아카데미를 수강하는 이유

▶ C++ 강의를 수강해서 좋은 점

▶ C++는 빠르다고 하는데.. 그럼 모든 것을 C++로 작성하면?

▶ 최근 프런트엔드의 최적화

▶ 간단 회고와 나의 공부법

▶ 앞으로의 계획

▶ 추가된 초미세먼지팁..


나의 POCU 학습 기록

https://sungsuaza.tistory.com/47

 

POCU 아카데미 COMP1500 후기

수강 동기 군 전역 후 방황하다 여러 매체에서 광고하는 마케팅에 넘어가 21년 5월에 개발자가 되기로 마음 먹었다. 국비 지원과 부트캠프 중 고민하던 중 국비 지원에서 떨어져 어쩔 수 없이 부

sungsuaza.tistory.com

https://sungsuaza.tistory.com/74

 

POCU 아카데미 COMP2200 후기, C언어 제대로 공부하기

POCU 아카데미 COMP2200 후기 ▶ POCU 아카데미 간단 소개 ▶ 자기 소개 ▶ 나에게 C 언어란? ▶ POCU 아카데미의 C 언어 ▶ 제대로 배우는 언매니지드 언어 ▶ 수강 후 달라진 점 ▶ 풀코스를 마치며 ▶

sungsuaza.tistory.com

https://sungsuaza.tistory.com/90

 

POCU 아카데미 COMP3500 후기, 알고리즘과 자료구조 제대로 공부하기

POCU 아카데미 COMP3500 후기 ▶ 후기 시작하기에 앞서 ▶ 포큐 아카데미를 선택하기 까지 ▶ 지금 하고 있는 일 ▶ 많은 선택지 중에 알고리듬 강의를 선택한 이유 ▶ 비싼 가격과 높은 난이도에도

sungsuaza.tistory.com

https://sungsuaza.tistory.com/94

 

웹서버 개발자(?)의 OOP 제대로 공부하기

POCU 아카데미 COMP2500(개체지향 언어 및 설계) 후기 ▶ 코딩 여정 ▶ 내가 하고 있는 일 ▶ 또 다시 포큐 아카데미 ▶ 구조적 프로그래밍과 OOP ▶ 개체지향 프로그래밍 (OOP) ▶ 상속에서 시작해 인

sungsuaza.tistory.com

이번 학기도 건너 뛸 생각이었지만 학기 시작 하루 전 나태해진 내 모습이 너무 보기가 싫어서 급하게 하나 남은 쿠폰을 이용해서 등록하게 되었다. 이로써 나는 7과목 중 5과목을 수료했다. 

 

스타트업에서의 근황

부트캠프로 인연이 닿은 첫 회사에 지금까지 다니고 있다. 따로 이직을 하지 않은 가장 큰 이유는 나도 최종적으로 창업이 목표지만 월급 없이 창업을 할 상황은 아니기에 돈 못 버는 회사가 어떻게 성장하는 지 바로 옆에서 지켜보고 싶었다. 처음은 정보의 불균형으로 생기는 리셀 시장을 바꿔보고자 해당 리셀러들의 발매처들의 데이터를 긁어서 앱에 노출시키는 프로젝트였다. 20년 네이버 Kream이 생긴 이후로 기존 마이너한 시장에서 이제는 누구나 신발 프리미엄을 알 정도로 메이저로 자리매김 한 거 같다. 그렇기에 나는 단지 개발자에 불과하지만 풀이 큰 시장에서 수익성 BM 없이 일단 최대한 유저를 끌어모아 보면 어떻게든 되겠지라고 생각했다. 이 프로젝트는 처참히 망했다. 사용자들에게 유인을 전혀 제공하지 못했다. 리셀러들에겐 이미 다른 정보처가 있으며 우리 프로젝트보다 기능적으로 앞섰다. 일반 유저들은 굳이 우리 앱에 들어와서 소통하며 응모할 이유가 없었다. 사용자 풀이 적었기에 근거가 많이 부족하지만 첫 사용까지도 끌어내지 못했다.

이후 회사의 결정에 따라 의류 플랫폼을 만들었다. 국내 의류 브랜드를 앱 내에 노출시켜 전세계에 수출한다. 무신사 글로벌 버전이랑 크게 다르지 않다. 차별점은 기존의 상품만을 보고 구매가 이뤄지던 방식에서 게시글 이미지는 따로 존재하고 상품을 태그걸며 해당 상품을 바로 구매할 수 있는 기능이다. 구매 여정이 길긴 하지만 상품과 상품의 배경, 컨셉을 분리하므로써 소비자들에게 좀 더 디테일한 연출을 했다고 볼 수 있다. 5개월에 걸쳐 개발을 했고 올해 6월 런칭을 했다. 아직은 마케팅을 본격적으로 하지 않았어서 크게 반응이 없다. 올해까진 상황을 지켜봐야 할 거 같다. 요즘 드는 생각이 누군가에게 돈을 받고 가치를 제공하는 과정이 매우 복잡하다는 것이다. 기존 단순 판매, 구매 매커니즘에서 복잡한 매커니즘으로 바뀐 거 같다.

 

 

커머스 스타트업에서 개발하기

중개 커머스에서 필요한 페이지는 크게 1. 셀러 페이지 2. 어드민 페이지 3. 판매 페이지(앱 포함) 이다. 5인 미만 스타트업에서 프런트와 백을 러프하게 나눠서 작업하는 건 쉽지 않다. 주 역할을 정하고 손이 남을 때 도와주는 방식으로 일을 하고 있다. 크게 앱 개발과 서버 개발을 나누고 웹페이지는 함께 개발하는 방식이다. 없는 비용으로 최대한 많은 시행착오를 겪어서 팔리는 프로젝트로 만들어야 하는 입장에서 모든 케이스를 테스트하면서 진행할 수가 없었다. 자바를 할 줄은 알지만 (잘한다는 것이 아니라 어떤 기능이 있고 어떻게 도는 지 정도만) 스프링을 사용해본 경험은 없었기에 스프링을 학습하여 서버를 만드는 건 불가능했다. 그렇다고 express만을 사용해서 결제가 있는 시스템을 개발한다는 건 주니어인 나로썬 상당히 위험해보였다. 결국 최근에 엔터프라이즈급에서 자주 사용한다는 nest.js와 postgreSQL을 선택했다. 사실 지금도 드는 생각이 이 정도 규모의 시스템을 버그 없이 내가 혼자 감당할 수 있을까? 라는 생각이 매우매우 강하지만.. 한 편으론 내가 이런 거 개발하고 싶어서 개발자 했지란 생각으로 꾸역꾸역 개발하고 있다. 커머스 시스템을 전부 파악하고 들어간 것이 아니었기에 개발을 하던 중 가장 골치아팠던 건 환불이었다. 국내 서비스로 주문, 취소, 환불만 있다면 수월했겠지만 1차적으로 미국 대상으로 서비스를 진행하기에 환불 상품의 목적지는 미국이었다. 그걸 처음에 염두에 두지 못하고 개발하여서 계속적으로 추가를 해주었다. 또 내부적으로 erp 시스템과 비슷한 어드민을 보고싶다고 하셔서 그게 맞게 db entity를 또 수정하는 일이 발생했다. 아직까지 환불이 없기에 그나마 다행이었지만 환불 데이터가 쌓이고 db 관계를 수정하기 어려운 상황이 오면 골치가 아플 거 같다. 나도 큰 경험이 없다보니 서비스가 결정되면 개발을 맡아야 하는 상황이라 어떤 기능이 바뀌면 현재 db 관계로는 비효율적인 상황이 발생한다. 최대한 이런 상황을 피하고 어떻게 하면 유연하게 잘 개발할 수 있는 지 계속 고민하고 있다.

 

 

그럼에도 계속 POCU 아카데미를 수강하는 이유

모든 걸 혼자 처음부터 개발하다 보니 할 일도 많고 공부해야할 것도 산더미이다. 예전에 microservice가 대세일 때 아무 것도 모르고 알림 기능은 큐에 담아서 관리하는 것이 좋다는 글을 보고 (당근 마켓의 글을 봤다.) 따라서 구현해봤는데 작은 프로덕트에서는 굳이라는 생각이 강하게 들어 이번에는 그냥 모놀리식 개발을 선택했다. 중간에 서버가 멈추면 모든 것이 멈추기에 큰 리스크가 있지만 사용자 풀이 적은 상황에서는 멈추지 않는다. 멈추더라도 바로 메일 알림으로 모니터링을 해뒀다. 아직 서버가 꺼져서 문제가 생긴 적은 없다. (그만큼 유저가 적다는 의미이기도 하다.) 이런 상황에서 db며 aws, 에저 같은 클라우드 컴퓨팅이며 많이 사용하는 메모리 db redis 등 공부해야할 것도 많고 기능적으로 추가해야할 것도 많음에도 불구하고 POCU 아카데미를 수강하는 이유는 다음과 같다.

1. 모든 소프트웨어는 CS에 기초하여 작동한다.

문장이 좀 이상할 수 있는데 결국 CS를 알아야 소프트웨어의 작동원리를 깊이있게 이해할 수 있다. 사실 이건 선이 있다. 컴퓨터의 최상단이 유저들이 사용하는 소프트웨어라고 한다면 그 밑에는 프로그래머의 소프트웨어, 보조 소프트웨어, 언매니지드 언어, 어셈블리어, 기계어 등등 최하단으로 가면 하드웨어가 있고 하드웨어의 원리까지 가게 되면 전자적 현상과 그 밑에는 또 양자들의 상호작용이 있을 것이다. 관점마다 선이 다를 것이다. 빠르게 프로덕트를 개발하고 소규모 비지니스를 하는 사람은 프로그래머의 소프트웨어와 보조 소프트웨어까지만 알면 된다. 대기업에서 네이버를 개발하는 사람은 역할마다 다르겠지만 적어도 운영체제까지는 깊게 알아야한다. 인텔, AMD, 엔비디아에서 cpu, gpu 칩을 만드는 사람을 하드웨어와 전자적 현상을 알아야한다. 양자컴퓨팅으로 핫한 아이온큐 (주식으로 잠깐 핫했다.) 에서 개발을 담당하는 사람이라면 양자역학도 당연히 알아야한다. 이는 관점과 역할의 차이며 누군가에겐 정답이 다른 누구에겐 오답이 될 수 있다. 각자 맡은 역할을 잘 파악하고 어떤 역할을 하고 싶은지도 잘 생각해서 어디까지 공부할 지 정하는 것도 개발자로 성장함에 있어서 중요한 능력인 거 같다.

2. 성격 상의 이유로 마법을 좋아하지 않는다.

솔직하게 나는 진성 개발자가 되지 못할 것이다. 개발자를 하고 있는 이유도 (부업으로 마케팅도 하고 있다.) CS에 강한 호기심을 느꼈고 어릴 때 프리메이플(지금은 불법일 수도 있음)을 만들어서 친구들을 초대한 경험도 있고 해서 괜찮겠다 싶어서이다. 진득하게 앉아서 개발만 하라고 하면 절대 못한다. 어떤 게 궁금해지고 만들고 싶은 게 생기면 그때 몰아서 열심히 하는 성격이다. 이런 성격임에도 모르는 건 지나치지 못한다. 공부를 잘하지도 머리가 막 좋은 편도 아니지만 예를들어 C언어로 코드를 짜고 exe 파일을 만들면 실행되는 것이 처음엔 이해가 되지 않았다. 부트캠프 멘토가 저 부분은 그냥 넘어가라고 했지만 나는 넘어가기 힘들었다. 그래서 공부함에 매우 오랜 시간이 들었다. 그러던 중 찾은 것이 POCU 아카데미이다. 내 궁금증을 적정 선까지 알려주었다. 

3. 한국어로 된 CS 강의 중에서 최고다.

당연히 개인적인 견해다. 다만 모든 한국어 강의 인프런, 패스트캠퍼스, 유데미(이건 한글 번역이 많다.) 등등이 있지만 POCU만큼 CS 강의를 체계적이고 연속적으로 가르치는 곳이 없다. (연속적이라고 하면 각 강의와 선행 강의가 연결되며 중복이 매우 적음을 의미함.) 거기에 풀코스까지 듣게 된다면 알아서 실습과 복습을 다 할 수 있어서 나에겐 최고의 선택지이다. 한국어로 범위를 좁힌 이유는 단순히 영어를 못해서 영어 강의는 들어본 경험이 없기 때문이다. 내가 최근까지 pt를 50회 정도 받았다. 자세도 좋아졌지만 운동하면서 계속 큐잉을 넣어주셨는데 끝난 지금도 개인운동할 때 떠오른다. 아 여기선 가슴을 빼고 힙힌지를 잡고 의도를 세게 가져가야지! 이런 식으로. 코딩을 하다가 포프님의 말씀이 머릿 속에 문득 떠오른다. 아 이건 null을 반환하니깐 함수 시그내처를 잘 적고.. 이런 식으로 말이다.

 

나는 관심사가 매우 다양한 편이다. 관심있는 모든 것을 다 잘하면 좋겠지만 학습 속도가 빠른 편은 아니기에 특정 분야에 관심이 생기면 다른 분야는 잠깐 멈춘다. 지금까지 개발자로서 성장 속도는 더딘 편이다. 21년 6월에 처음 개발 공부를 하여 24년 8월인 지금 약 3년의 시간이 흘렀지만 아마 서비스 기업의 3년차로 들어가기는 힘들지 싶다. 물론 남들은 4년 공부하니까 아직 대학교 3학년이라고 위로할 수 있지만 20대 초반과 20대 후반은 다르지 싶다. 최근엔 마케팅과 투자에 관심이 생겨 퇴근 후에 해당 분야를 공부하고 있다. 하지만 앞으로 POCU에 나올 db, 운영체제, 네트워크 강의는 강의 가격이 오르더라도 들을 생각이고 나중에 내 관심 분야가 좁혀졌을 때 어셈블리어와 수학까지 들을 생각이다. 그냥 다 들을 계획이다!

 

C++ 강의를 수강해서 좋은 점

해당 강의 수강 전 C++에 대해 게임 업계에서 주로 사용하며 C++로 작성된 코드는 빠르긴 하지만 매우 복잡하여 조금만 실수를 하면 큰일날 것 같았다. 강의 수료 후 아직까지도 까다롭긴 하지만 여러 규칙들을 정하고 내부를 잘 이해해서 사용한다면 매우 큰 이점을 가져갈 수 있을 거라고 생각한다. 자바스크립트를 주로 다룬 입장에서 알게되서 좋은 점은 다음과 같다.

1. 객체와 객체의 할당, 대입, 복사, 해제, 이동에 대해 좀 더 깊게 알게 된다.

포큐 아카데미에선 객체를 개체로 명명하지만 자바스크립트에선 객체가 더 익숙하므로 객체로 표기했다.

부트캠프에서 처음 배운 건 파이썬이지만 초반에만 조금 배우고 프로젝트 내내 자바스크립트를 사용한다. 자바스크립트는 함수가 일급객체로서 변수에 대입이 가능하며 함수의 매개변수로도 사용이 가능하다. 자바스크립트에 가장 익숙했던 나로서는 당연히 다른 언어들도 함수를 넘길 수 있는 줄 알았다. C, C++, 자바, C# 모두 함수를 변수에 직접 대입할 수 없다. 함수 포인터와 인터페이스, 람다 함수 등이 존재한다.  왜 자바스크립트만 매개변수와 변수에 함수를 사용가능한지, 어떻게 그게 가능한지 궁금증이 들었다. 이를 알기 위해선 웹의 역사를 조금 알아야 한다.

현재 웹페이지는 어플리케이션이라고 불릴만큼 여러 기능을 가지며 사용자 친화적이며 상호작용을 할 수 있지만 기존에는 클릭하면 다른 페이지로 넘어가는 기능만 있었다. 웹페이지는 html, css, javascript로 만들어진다. 웹의 뼈대를 담당하는 html, 뼈대의 스타일을 담당하는 css, 그리고 움직임을 담당하는 javascript. 다만 초기에는 사용자 경험이란 개념이 없었고 javascript의 중요성 또한 몰랐으며 표준도 정해지지 않은 시기였다. 하지만 웹의 빠른 발전으로 동적인 요소가 필요했고 이를 위해 특정 회사에서 빠르게 만들어진 것이 javascript이다. 

초기 네이버
현재 네이버

자바스크립트는 경쟁사의 여러 이슈로 10일만에 설계된 것으로 알려져 있고 빠른 개발을 위해 타입 없이 변수에 값을 넣을 수 있게 유연하게 설계되었다. 이는 함수도 마찬가지였다. 유연함을 철학으로 가지고 있는 언어이기에 함수 또한 변수에 대입, 매개변수로 넘길 수 있었다.

자바스크립트는 C, C++,Java, C# 언어와 다르게 따로 컴파일 하는 언어가 아니다. 자바스크립트는 C++로 개발된 프로그램 위에서 실행된다. 여기에서 지금까지 사용되며 유명한 소프트웨어는 구글이 개발한 V8 엔진이다. V8 엔진은 크롬에 사용된 엔진이며 오픈소스로 공개되어 있다. 오픈 소스를 들어가보면 매우 읽기는 힘들지만 Javascript 함수를 다루는 JSFunction 클래스의 헤더를 조금 보면 함수를 객체로 사용하는 것을 알 수 있다. 

V8 엔진 소스코드 일부

자바스크립트의 함수는 C++ 언어의 객체로 표현된다. C++에서 특정 객체는 힙에 만들 수 있는데 자바스크립트의 함수는 힙에 할당된다. 또한 C++ 는 객체를 함수의 매개변수 인자로 사용할 수 있고 변수에 할당할 수 있다. 즉, 자바스크립트는 C++ 언어에선 객체로 표현되기 때문에 C++에서 객체가 할 수 있는 행동을 모두 취할 수 있는 것이다. 

여기에서 C++가 객체를 어떻게 다루는지 이해한다면 한층 더 이해가 깊어질 것이다. 자바는 OOP를 목적으로 설계된 언어이기 때문에 모든 것이 클래스이며 클래스의 인스턴스들이 상호작용하는 것을 전제로 프로그램이 돈다. 객체는 클래스가 메모리에 생성해낸 인스턴스를 뜻한다. 이는 고유 메모리 주소를 가지며 변수로 참조할 수 있다. 자바에는 포인터가 없으며 (포인터 연산을 못하는 것이지 사실은 모두 포인터라고 봐도 된다.) 메모리 연산 따위는 존재하지 않는다. 메모리 관리는 자동으로 하자는 철학을 가지고 있는 언어이므로 메모리 관리 관련된 대부분을 언어 자체에 넣지 않았다. 그래서 파이썬, 자바, 자바스크립트만 경험한 웹 개발자라면 객체의 복사는 깊은 복사와 얕은 복사, 만약 객체 변수를 대입하게 된다면 주소만 복사된다고 생각할 것이다. 이 부분에서 C++와 차이점이 발생한다. 자바에서 객체는 모두 힙에 생성되는데에 반해 C++은 스택에도 객체가 존재할 수 있다. 스택에 값의 형태로 객체가 존재할 수 있기 때문에 자바의 대입처럼 객체의 주소만을 대입하는 방식으로는 C++의 변수에 객체를 대입할 수 없다. 여기에서 복사 생성자, 대입 연산자가 필요하다.

GPT 4-o 코드

정리하면 C++에는 객체의 생명 주기 관련해서 생성자, 소멸자가 존재하며 해당 객체는 스택에도 생성될 수 있으므로 여러 대입, 복사 연산을 위해 복사 생성자, 대입 연산자 등이 필요하다. 물론 이것까지 이해하지 않더라도 자바스크립트의 동작 방식을 이해하는 데 무리는 없겠지만 내부적으로 어떻게 도는 지에 대한 이해는 더 깊어졌다.

2. 가비지컬렉터와 참조 카운팅 대해 알게 되었다.

가비지컬렉터에 대해 자세히 배우지는 않지만 왜 GC 기반의 프로그램들은 병목 현상이 생기는 지, 아이폰은 끊김 현상이 적은 반면 예전 안드로이드 폰은 잠깐 멈춤이 잦았는데 이런 이유에 대해서도 알게 되었다. C++에서 메모리 관리가 힘든 것을 알기에 포인터를 관리할 수 있는 여러 표준이 들어왔다. 따로 할당, 해제할 필요 없고 소유권을 하나만 가질 수 있는 unique_ptr, 여러 변수들이 소유권을 가질 수 있지만 아무도 참조하지 않을 때 자동으로 해제를 해주는 shared_ptr, 참조하는 것이 없을 때 자동으로 정리해주는 가비지컬렉터, 참조 카운팅 등이 여기에 해당한다. 

일반적인 가비지컬렉터는 주로 메모리가 부족한 경우 루트(전역변수, 스택, 레지스터)를 시작으로 모든 참조를 따라가며 참조되지 않는 메모리를 모두 해제하는 방식으로 작동한다. 이는 자동으로 메모리를 해제하지 않아도 되는 이점이 있지만 사용하지 않는 메모리가 정리되지 않은 상태로 존재하며 언제 가비지컬렉터가 작동하는 지 완벽히 예측할 수 없는 문제가 있다. 거기에 요즘은 워낙 컴퓨터가 빨라져서 GC를 멀티쓰레드를 활용하면 성능이 크게 낮아지진 않지만 그래도 언젠가는 싱크를 해줘야하며 어찌됐든 GC 작동을 위해 자원을 쓴다는 것이다.

오래된 갤럭시를 사용해보신 분들은 버벅임에 대해서 공감할 것이다. 갤럭시를 썼을 당시 휴대폰이 버벅인다는 느낌을 많이 받았다. 그러다가 아이폰을 처음 썼을 때는 화면 움직임이 너무 부드러워 놀랐다. 또한 폰이 오래되어도 뚝뚝 끊긴다는 느낌은 없었다. 

 

물론 하드웨어적인 부분에서의 차이가 있을 수도 있겠지만 내부적으로 안드로이드는 가비지컬렉터를 사용하는 자바 언어를, 아이폰은 참조 카운팅을 사용하는 swift를 주로 사용해서 개발하기 때문이다. 참조 카운팅은 따로 메모리를 정리하는 시간을 내는 것이 아닌 메모리가 참조, 소멸될 경우 숫자를 따로 세서 메모리를 그때그때 정리하기 때문에 갑작스러운 병목 현상은 GC보다는 적을 것이다. 다만, 최근 스마트폰은 워낙 하드웨어가 좋기에 폰을 극단으로 사용하지 않는 이상 이런 문제들은 적을 것이다.

자바스크립트 또한 가비지컬렉션을 사용하여 메모리를 관리한다. 위에서 설명한 것처럼 RootVisitor 클래스에 Trace란 함수가 추적하여 사용하지 않는 메모리를 해제한다.

 

완벽한 마법에서 조금씩 그 마법이 걷어지고 있는 중이다. 위에서 설명한 것 처럼 양자들의 상호작용의 마법을 푸는 건 아직 현대의 과학 기술로는 힘들지만 적당한 선까지는 알면 마법이 아니다. 특정 학문을 공부한다는 건 기존 마법같은 현상을 설명 가능한 무언가로 바꾸는 것 같다. 

3. 자바스크립트는 C++로 만들어진 소프트웨어 위에서 작동한다.

위에서 언급했지만 가장 유명한 V8 엔진의 깃헙을 보면 C++ 언어로 작성된 것을 알 수 있다. 크롬 외에 사용되는 브라우저의 자바스크립트 실행기는 모두 C++ 로 작성되었다고 한다.

V8 engine github

이는 결국 모든 자바스크립트 코드가 C++ 언어를 거쳐서 작동됨을 의미하며 C++ 언어 이상의 기능은 쓸 수 없음을 뜻한다. 이는 자바스크립트가 어떤 기능까지 할 수 있을까에 대한 선을 알게 해준다. 시험도 범위를 알면 공부하기 수월한 것 처럼 어떤 언어도 어디까지 할 수 있는 지 대강이라도 이해 한다면 해당 언어를 사용함에 있어서 매우 큰 도움이 될 것이다.

 

부트캠프를 수료하고 취업한 사람 중 여기까지 이해하는 사람은 따로 C++ 수업을 듣지 않거나 공부하지 않는 이상 드물지 않을까 생각된다. 뇌피셜 여기까지의 이해가 얼마나 나중에 나에게 도움이 될 지는 모르겠고 사실 아직 이해한 부분은 빙산의 일각에 불과하지만 지속적으로 마법 걷어내다보면 좀 더 나은 개발자, 좀 더 좋은 설계를 하는 개발자가 될 수 있다고 믿고있다.

 

C++는 빠르다고 하는데..  그럼 모든 것을 C++로 작성하면?

그럼 이런 의문이 들 수 있다. 아니 그럼 C++가 가장 빠르다는데 모든 소프트웨어를 C++로 작성하면 되는 거 아니야? 이는 GPT의 답변을 토대로 나의 생각을 첨언하는 식으로 정리해보겠다.

 

C++가 빠르면 모든 소프트웨어를 C++로 작성하면 되지 않아?

 

GPT 4o 답변
C++는 매우 빠르고 강력한 언어이지만, 모든 소프트웨어를 C++로 작성하는 것이 항상 최선의 선택은 아닙니다. 소프트웨어 개발에서 성능은 중요한 요소 중 하나이지만, 다른 많은 요인들도 고려해야 합니다. 아래는 C++를 사용하지 않을 수도 있는 여러 이유와 고려사항들입니다.

1. 개발 속도와 생산성
언어 복잡성: C++는 강력하지만 매우 복잡한 언어입니다. 메모리 관리, 포인터, 복잡한 템플릿 메타프로그래밍, 다중 상속 등은 개발자가 실수를 저지를 가능성을 높이고, 코드 유지보수와 읽기를 어렵게 만들 수 있습니다.개발 속도: C++는 상대적으로 저수준 언어로, 많은 세부 사항을 개발자가 직접 관리해야 합니다. 반면, 고수준 언어들은 메모리 관리와 같은 많은 부분을 자동으로 처리하여 개발 속도를 높여줍니다. 예를 들어, Python, JavaScript, 그리고 C# 같은 언어들은 개발자가 보다 빠르게 프로토타입을 만들고 수정할 수 있도록 도와줍니다.

2. 안전성과 메모리 관리
메모리 관리의 어려움: C++에서는 메모리 할당과 해제를 개발자가 직접 관리해야 합니다. 잘못된 메모리 관리로 인해 메모리 누수, 이중 해제(double free), 그리고 다른 메모리 관련 버그들이 발생할 수 있습니다. 이런 문제들은 디버깅이 어렵고, 시스템의 안정성에 영향을 줄 수 있습니다.언어 안전성: 많은 현대 언어들은 메모리 안전성과 동시성 문제를 방지하기 위해 고안된 기능들을 가지고 있습니다. 예를 들어, Rust는 메모리 안전성을 보장하면서도 높은 성능을 제공합니다. Java와 C# 같은 언어들은 가비지 컬렉션을 통해 메모리 관리를 자동화합니다.

3. 플랫폼 간 호환성 및 이식성
가상 머신 언어: Java와 C# 같은 언어들은 가상 머신(VM)에서 실행되기 때문에, 동일한 코드를 여러 플랫폼에서 쉽게 실행할 수 있습니다. 이식성 측면에서 이러한 언어들은 C++보다 더 유리할 수 있습니다.웹 개발: 웹 브라우저에서 실행되는 JavaScript는 웹 개발에 필수적인 언어입니다. 브라우저는 JavaScript를 실행할 수 있는 환경이 내장되어 있기 때문에, 웹 애플리케이션을 작성하려면 C++보다 JavaScript를 사용하는 것이 자연스럽습니다.

4. 도메인 특화
특화된 도메인 언어: 특정 작업에 최적화된 도메인 특화 언어(DSL)가 존재합니다. 예를 들어, R이나 Python은 데이터 분석과 머신 러닝에 매우 적합하며, SQL은 데이터베이스 쿼리에서 표준으로 사용됩니다.대규모 애플리케이션 관리: Java나 C# 같은 언어들은 대규모 엔터프라이즈 애플리케이션에서 자주 사용됩니다. 이러한 언어들은 대규모 시스템 관리, 모듈화, 그리고 안정적인 환경에서의 실행을 위해 설계된 기능들을 많이 포함하고 있습니다.

5. 개발자 커뮤니티 및 생태계
라이브러리 및 프레임워크: 다양한 언어들은 특정 목적에 맞게 설계된 풍부한 라이브러리와 프레임워크를 가지고 있습니다. Python은 데이터 과학, 머신 러닝, 웹 개발 등에서 매우 강력한 라이브러리 생태계를 가지고 있으며, JavaScript는 웹 개발에서 강력한 프레임워크와 도구들을 제공합니다.커뮤니티 지원: 특정 언어가 강력한 커뮤니티를 가지고 있다면, 문제 해결이 더 쉽고, 라이브러리나 프레임워크의 발전도 빠르게 이루어질 수 있습니다. 개발자는 이러한 커뮤니티의 도움을 받을 수 있기 때문에, 생산성을 높일 수 있습니다.

6. 학습 곡선과 개발자 선호학습 곡선: C++는 배우고 마스터하기 어려운 언어로, 개발자들이 처음부터 C++를 선택하기보다는 다른 더 간단한 언어들을 선택할 수 있습니다.개발자 선호도: 각 개발자는 특정 도메인이나 프로젝트에 가장 적합한 언어를 선호합니다. 예를 들어, 데이터 과학자는 Python을 선호할 수 있고, 시스템 프로그래머는 C++를 선호할 수 있습니다.

결론C++는 매우 빠르고 강력한 언어이지만, 모든 상황에서 최적의 선택은 아닙니다. 소프트웨어 개발에서는 성능뿐만 아니라 개발 속도, 안전성, 유지보수성, 이식성, 그리고 특정 도메인에 적합한 언어 선택이 중요합니다. 이러한 이유로 다양한 프로그래밍 언어들이 존재하며, 각 언어는 특정 상황과 목적에 맞게 사용됩니다. C++는 여전히 시스템 프로그래밍, 게임 개발, 실시간 애플리케이션 등 성능이 중요한 영역에서 널리 사용되지만, 다른 언어들도 각자의 장점을 가지고 다양한 분야에서 사용됩니다.

 

소프트웨어 개발에 속도는 일부분에 불과한 거 같다. 전세계에 인종, 나라, 언어가 다양한 것과 같은 맥락으로 소프트웨어 개발에 있어서도 매우 다양한 형태가 존재할 수 있다. 미국에서는 영어를 써야 소통이 쉬운 것 처럼 특정 소프트웨어는 목적을 가지며 해당 목적을 위해 필요한 요구사항도 다양할 것이다. 만약 실시간 주식 정보를 사용자에게 보여줘야 하는 소프트웨어는 속도가 가장 중요할 것이고 돈을 인출, 입금, 전송하는 소프트웨어는 안전성을 가장 중요하게 여길 것이다. 모든 관리에는 비용이 들고 모든 소프트웨어는 사람이 작성하기에 완벽하지 않다. 코딩을 잘못한 경우부터 여타 프레임워크의 오류 등등 여러 상황들을 가정하여 프로그램을 작성해야 하는데 얼마나 관리를 할 지 조차도 목적에 따라 다르다. 그냥 개인이 쓰는 프로그램은 버그가 나면 바로 고치면 된다. 하지만 핵을 쏠 수 있는 프로그램은 버그가 난다면 되돌릴 수 없는 일이 발생할 것이다. 여러 사용가능한 도구들로 소프트웨어의 목적, 사람의 선호도에 맞춰 개발하는 것이 이상적인 개발 방법이지 않나 싶다.

 

최근 프런트엔드의 최적화

온라인 상에서 웹이 엄청난 영향력을 가지면서 웹의 성능 또한 매우 중요한 요소가 되었다. 앱은 설치에 진입 장벽이 있는 반면 웹은 클릭 한 번에 리소스에 접근할 수 있는 아주아주 큰 장점이 있다. 웹을 이용하여 사용자에게 좋은 경험을 주고 자체 앱까지 끌어들이는 것이 초기 스타트업에겐 매우 중요한 목표일 것이다. 이를 위해 웹 프런트엔드의 최적화는 매우 중요해졌다. 요즘 디자이너들이 가장 많이 사용하는 소프트웨어는 피그마일 것이다. 가장 큰 장점은 실시간 협업 기능인데 이를 아주 부드럽게 유지하기 위해 엄청난 최적화가 들어갔을 것이다. 피그마는 이를 웹어셈블리를 사용했다고 한다. 웹페이지의 로드타임과 다운로드 사이즈를 획기적으로 줄인 것을 자사 홈페이지 글을 통해 알리고 있다. 현재 웹어셈블리는 C++ 혹은 러스트에서 컴파일하면 얻을 수 있다.

https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x/

 

Figma is powered by WebAssembly | Figma Blog

Because our product is written in C++, which can easily be compiled into WebAssembly, Figma is a perfect demonstration of this new format’s power.

www.figma.com

출처 : https://www.figma.com/ko-kr/blog/webassembly-cut-figmas-load-time-by-3x/
출처 : https://www.figma.com/ko-kr/blog/webassembly-cut-figmas-load-time-by-3x/

 

미래를 섣부르게 예측할 순 없지만 애플의 비전 프로, 페이스북의 메타로의 사명 변경, 테슬라의 자동차의 컴퓨터화 등등 여러 가지를 조합해 봤을 때 앞으로 프런트엔드는 기존 2D에서 3D로 확장되지 않을까 생각한다. 3D를 계산하기 위해선 3차원 배열이 필요하다. 소프트웨어적인 최적화가 필수라는 소리다. 속도가 중요한 프로그램은 현재 대부분 C++ 언어로 짜여 있다. 추후 어떤 최적화된 언어가 나올지는 모르겠지만 러스트처럼 C++ 언어를 알면 빠르게 이해할 수 있는 형태로 나오지 않을까 싶다.

애플 공식 홈페이지
메타 공식 홈페이지

간단 회고와 나의 공부법

이번 과목은 내가 자주 사용하는 언어가 아니기에 강의 수강마다 새로웠다. 또한 따로 프로젝트를 할만한 시간도 없어서 아직 C++ 언어가 익숙하지는 않다. 웹개발을 주로 하는 나로써 C++로 토이 프로젝트를 하기가 쉽지가 않다. 시간 여유가 생기면 꼭 해보고 싶다.

저번 학기는 그래도 여러 훈장? 들이 있었는데 이번 학기는 실습, 과제를 모두 통과하면 주는 훈장 밖에 받지 못하였다. 물론 실습, 과제를 모두 통과한 것으로 충분히 만족하지만..? 원샷원킬이란 훈장이 있는데 내가 잘 못받는 훈장 중 하나이다. 테스트를 좀 더 꼼꼼하게 한다면 받을 수 있을 거 같다. 매번 회고 때마다 다짐하지만.. 다음 학기엔 좀 더 꼼꼼히 그리고 활발히 수업을 진행하고 싶다. 그래도 성적은 꽤나 만족스러웠다. 후반엔 학습에 투자를 거의 하지 못했음에도 불구하고 나쁘지 않은 성적을 받아서 나름 만족 중이다.

 

 

웃긴 건 분명 중간고사를 더 열심히 공부 했는데 기말을 더 잘봤다는 거다. 시험은 시험 가능 일부터 차주 월요일 8시59분까지 완료해야 한다. 나는 직장인이기에 주로 주말에 시험을 보는데 해당 날짜가 정해지면 대략 2~3일 정도는 통으로 공부하는 시간을 가진다. 

23일에 4시간 정도 투자했고 평일에는 계획은 세웠지만 출근길 정도에 한 번 읽은 것 정도가 다여서 28일 연차를 내 4시간 정도 더 투자를 하여 29일에 시험을 보았다.

 

최근 본 기말고사는 계획은 5~11일로 잡았지만 여러 개인적인 일정 때문에 11일 하루(4시간) 밖에 공부를 하지 못하였고 평일에 1시간 정도 씩 복습을 해주고 회사가 15일에 출근하고 16일에 쉬어서 16일에 마무리로 2시간 정도 공부한 뒤 오후에 시험을 치뤘다. 대략 시험 공부에 8~10시간 정도 투자한 거 같다. 

나는 강의 수강 시 노션에 모든 강의 내용을 적거나 캡처하고 아래 부분에 이해가 안되거나 모르는 부분을 작성하여 정리한다. 강의를 들으면서 이해 안되는 코드도 쳐보고 해당 부분을 노션 콜아웃으로 기록한다. 다만 가끔 귀찮을 땐 코드는 다음에 쳐보기로 적어놓고 강의만 듣는 경우도 있다. 이러면 시험 때 공부할 양이 많아짐..

시험 공부는 위에 기록한 노트를 복습하고 모르는 부분은 코드를 다시 실행시켜 본다. 그리고 강의 퀴즈와 코드보기 부분을 복습한다. 그리고 포큐 측에서 준 연습 문제를 풀어보고 시간적 여유가 있다면 실습, 과제를 복습하지만 여기까지 해본 적은 COMP2500에서 말고는 없는 거 같다. 대부분 연습문제까지만 풀고 시험을 본다.

OOP에서 시험을 더 못봤음에도 0%를 받았지만 C++은 다른 사람들에게도 좀 더 쉬웠는지 3%를 받았다. 수능으로 치면 그래도 1등급..?

아 그리고 연속적으로 보는 분이 당연히 없겠지만 만약 있다면 알고리듬 강의를 재수강해서 통과했다! 간당간당하게 86%로 통과 알고리듬 토너먼트 금메달도 받음. 물론 대진운이 좋았어요..

 

앞으로의 계획

출처 :https://publy.co/content/5365

사진 찾기 귀찮아서 2500 후기에 썼던 사진 재탕..

현재 수강 가능한 과목 중에선 어셈블리어와 수학이 남았다. 다만 당장에 필요성을 못느끼고 있기에 이는 추후로 미룰 예정이고 다만 앞으로 나올 DB는 나옴과 동시에 바로 들을 거 같다. 현재 DB를 혼자 관리하고 있는데 DB를 자세하게 모른다. 아직 사용자가 적어 괜찮지만 만약 사용자가 늘거나 더 큰 회사로 이직하게 된다면 이 부분이 치명적이지 않을까 싶다. 디비에 궁금한 점이 매우 많지만 다른 좋은 강의를 찾지 못했..? 는 핑계.. 디비 강의가 나오기 전까지는 퇴근 후 주로 마케팅과 투자 공부를 하지 않을까 싶다. 물론 DB 강의 런칭 전에 갑자기 트래픽이 늘거나 필요하면 다른 루트로 학습을 하겠지만.. 

아 그리고 영어 공부를 할 생각이다. 올해 초 영어 학원을 잠깐 다녔는데 또 갖가지 핑계를 대며 중단 되었다. 사실 프로그래머의 가장 기초이자 중요한 언어는 영어이지 않나 싶다. https://your.uopeople.edu/ 이라는 무료 온라인 미국 대학 홈페이지인데 여기서 약간의 돈을 내면 ESL 프로그램에 참여할 수 있다. 컴퓨터 공학 학위 또한 받을 수 있다. 저기 컴공이 POCU 만큼 자세하진 못하겠지만 학위가 없는 나에게 학위라는 선물을 가져다줄 지도 모르기에 해당 ESL 프로그램 참여를 계획하고 있다. 

추가된 초미세먼지 팁..

COMP2500 후기에서 강의 구매가 처음인 분들을 위해 링크를 뿌렸는데 7분이 해당 링크로 강의를 구매해주셨다.. 만약 해당 수업을 잘 들었으면 후기에 반드시 할인 링크를 남겨라!! 코드 있는 거 알았으면 C++ 강의 할인 받아서 사는 거 였는데.. 후기 이벤트에도 참여할 수 있고 나처럼 할인 코드도 받을 수 있다! 할인 링크 https://pocu-ko.teachable.com/?referral_code=C18JVD

 

제목은 유튜버들이 종종 제목 어그로를 끌길래 나도 한 번 해봤다. 결론은
"시간적 여유가 있는 웹개발자는 C++ 배우는 것이 좋다" 이다!