2023.06.07 TIL

0

TIL

목록 보기
31/37
post-thumbnail

오늘의 나는 무엇을 잘했을까?

투두리스트를 넥스트로 포팅하였다. 이전에 진행했던 프로젝트를 이렇게 유지보수하고 나아가 다른 플랫폼으로 포팅하는 경험은 처음인데, 너무 좋았던 것 같다. 포팅 또한 모든 파일을 지우고 create-next-app으로 다시 시작한게 아니라 npm install next를 해서 실무에서 마이그레이팅 하듯이 해봐서 좋았다.

오늘의 나는 무엇을 배웠을까?

실행 컨텍스트

실행 컨텍스트 개요

실행 컨텍스트은 다른 프로그래밍 언어에는 없는 자바스크립트만의 코드 실행에 기반이 되는 로직이다.

실행 컨텍스트는 한 마디로 표현하자면 코드 실행을 위해 필요한 요소들이 갖추어진 환경이라고 할 수 있다.

즉, 모든 자바스크립트 코드는 실행될 때 실행 컨텍스트 안에서 실행된다고 말할 수 있고, 코드의 실행에 필요한 요소들, 즉 변수나 함수의 식별자, this, 스코프, closure등이 전부 실행 컨텍스트 안에 정의되어 있고, js엔진은 현재 활성화된 실행 컨텍스트를 참조하여 코드를 실행시킨다고 할 수 있다.

이 그림을 보면서 실행 컨텍스트가 무엇이고 어떻게 생성되고, 코드의 시행 단계에서 어떤 역할을 하는지 알아보자.

실행 컨텍스트는 코드가 평가되면서 만들어진다. 코드의 평가란, 코드의 실제 실행 전에 js엔진이 코드를 쭉 훑으면서 변수, 함수등의 선언문을 먼저 실행하여 실행 컨텍스트를 생성함과 동시에 스코프에 등록하는 일을 말한다.

코드의 평가가 끝나면 실행 컨텍스트가 생성되어 있고, 이 실행 컨텍스트가 콜 스택에 push되고 나서 코드가 순차적으로 실행된다. 코드가 실행될 때 참조할 변수, 함수 등은 모두 실행 컨텍스트의 스코프를 검색하여 취득하고, 코드의 실행 결과로 변수 값이 변경되거나 하면 그 결과가 다시 실행 컨텍스트가 관리하는 스코프에 등록된다.

실행 컨텍스트 구조

실제로 실행 컨텍스트는 어떻게 생겼을까?

실행 컨텍스트는 실제 메모리에 물리적으로 객체로서 존재한다. 그리고 이 객체는 다음과 같이 3가지 구성 요소를 가진다.

  1. LexicalEnvironment: 식별자와 바인딩된 값, 상위 스코프 참조를 기록하는 객체
  2. VariableEnvironment: 실행 컨텍스트 초기의 렉시컬 스코프의 스냅샷1번과 2번은 실핸 컨텍스트가 초기에 생성되었을 때는 서로의 복사본이다. 하지만 코드가 실행되면서 변경되는 점이 있다면 LexicalEnvironment에 기록된다. VariablaEnvironment는 코드의 실행에도 변함이 없는 초기의 스냅샷 역할을 한다.

렉시컬 환경

렉시컬 환경은 렉시컬 스코프를 물리적으로 구현한 객체이다. 이 객체는 다음과 같은 구성요소를 가진다.

  1. EnvironmentRecord: 스코프의 식별자를 등록하고 바인딩된 값을 관리하는 저장소
  2. OuterLexicalEnvironmentReference: 상위 스코프에 대한 참조1번은 함수의 arguments, 선언된 식별자들과 바인딩된 값을 관리하고, this가 가리킬 객체또한 바인딩한다. 2번은 스코프체인을 구현한 단방향 링크드 리스트의 노드역할을 한다.

큰 그림

이렇게 알아본 실행 컨텍스트를 다음 코드의 실행 때 큰 그림으로 보면 다음과 같다.

 const x = 1;
 const y = 2;
 
 function foo(a){
 	const x = 10;
 	const y = 20;
 
 	console.log(a + x+ y);
 }
 
 foo(100);
 
 console.log(x + y);

김준비 당근마켓 안드로이드 엔지니어 특강

개발자로서 성장은 어떻게 하는가

좋은 개발자란?

일찍이 다음 두 가지 유형중 어떤 개발자가 되고싶은가를 정하는 것이 중요하다.

일 잘하는 개발자 vs 개발 잘하는 개발자

빠르게 개발하는 개발자 vs 안정적으로 개발하는 개발자

다양한 분야의 개발 지식을 갖고있는 개발자 vs 한 분야에 전문성이 높은 개발자

협업은 잘하는데 개발은 평범한 개발자 vs 개발은 엄청 잘하는데 협업은 못하는 개발자

회사의 성장을 개인의 성장보다 우선으로 하는 개발자 vs 개인의 성장을 회사의 성장보다 우선으로 하는 개발자

내가 생각하는 아래 질문에 대한 답을 리스트업 해보자.

같이 일하고 싶은 개발자는 어떤 개발자일까?

같이 일하고 싶지 않은 개발자는 어떤 개발자일까?

메타인지

자기 객관화: 인지함을 인지함, 알고 있음을 아는 것, 내가 뭘 알고 뭘 모르는지를 제대로 알고있는 능력

헬스장에서 원하는 부위를 기르려면 그 부위의 자극에 집중해야 하는 것처럼, 개발자로서도 내가 기르고 싶은 능력치를 특정한 후 집중하자.

자기 점검을 먼저 해야한다. 보완할 점을 정리하고 원하는 부위의 성장에 집중하자.

현재 내 능력치를 알아보는 법

Engineering ladders에서 엔지니어에게 필요한 역량을 검사할 수 있다.

조급함은 제거하자. 개발 일정은 넉넉하게 잡자.

내가 어떤 강점을 가졌는지.

메타인지의 핵심은 가장 가까운 과거의 나를 돌아보는 것.

때로는 주변을 활용해도 좋다(티타임, 동료 평가 등)

우리 회사가 OOO님을 채용해야 하는 이유는 뭘까요?

매력을 키우자. 내 입으로 말하지 않아도 상대방이 내 매력을 느끼게끔 해야하고, 메타인지가 잘 되어있을수록 나의 매력을 알고 극대화할 수 있다.

꾸준히 가져가야할 습관

메타인지를 통한 균형 맞추기

강점을 부각시키고, 약점은 강점으로 만드려는 노력을 하기보다, 무난할 정도로 보완하자.

생각으로만 가지지 말고, 문장으로 직접 적어봐야 한다.

당근마켓 필수 면접 질문

  1. 님이 생각하는 좋은 개발자는 어떤 개발자인가요?
  2. 님은 어떤 환경에서 가장 높은 퍼포먼스를 발휘할 수 있나요?

오늘의 나는 어떤 어려움이 있었을까?

투두리스트를 넥스트로 포팅하는데 정말 하루 종일 걸렸다. 그래서 원래 하기로 했던 블로그 글 쓰기, 알고리즘 문제 등을 하지 못했다. 왜 이렇게 오래 걸렸을까 생각해봤는데, 집중력이 부족한 탓이 큰 것 같다. 뭔가 내가 해결해야 하는 문제가 뭔지 명확히 정의하고 그것에 집중하는게 필요해보였다. 왜냐하면 실제로 개발 작업을 하다 보면 내가 원래 하려고 했던것보다 예상할 수 없는 곁다리 문제들이 계속 파생된다. 내가 원래 해결하려고 했던 부분을 잊지 않고 중심으로 계속 파고들어야 하는 것 같다.

내일의 나는 무엇을 해야할까?

  • 실행 컨텍스트(딥다이브 스터디) 준비
  • 타입스크립트 특강 듣기
  • 위클리 미션 시작해보기

0개의 댓글