cf. OSI 7계층 레이어 생각하기 3계층 IP -> 4계층 TCP -> 7계층 HTTP
프론트엔드 관점
서버에서 응답받은 리소스들을 기반으로 파싱/렌더링을 수행한다.
1. 렌더엔진이 HTML과 CSS를 파싱하여 각각 DOM 트리와 CSSOM트리를 생성한다.
2. DOM트리와 CSSOM트리를 결합하여 render 트리를 만든다.
(보이지 않는 엘리먼트는 포함되지 않는다. e.g. display:none;)
3. 렌더트리를 기반으로 Layout을 계산 (여기서 position, height등 계산됨)
4. 마지막으로 Paint 과정을 거쳐 렌더링 완성
이때 특정 인터렉션에 의해 DOM에 변화가 생기면 render Tree가 재생성되어 3번 4번 과정에서 각각 reflow, repaint가 발생한다.
Given an integer arraynums, returnthe length of the longeststrictly increasingsubsequence.
Example 1:
Input: nums = [10,9,2,5,3,7,101,18]
Output: 4
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.
Example 2:
Input: nums = [0,1,0,3,2,3]
Output: 4
Example 3:
Input: nums = [7,7,7,7,7,7,7]
Output: 1
Constraints:
1 <= nums.length <= 2500
-104<= nums[i] <= 104
Follow up: Can you come up with an algorithm that runs in O(n log(n))time complexity?
문제풀이
LIS(가장 긴 증가하는 부분 수열)을 구하는 문제로,
대표적인 풀이 방법으로 DP를 사용하는 것이 있다.
D[i]: i번째 원소까지 증가하는 수열의 길이를 저장하는 배열이라 두자.
그리고 i가 순회하는 동안 j가 i번째 까지 순회하며 해당값을 비교해 j인덱스에 위치한 원소가 더 작다면,
D[i]값을 갱신한다. 이때, 원래 존재하는 (D[i]값)과 (D[j]에 1을 더한값)을 비교하여 큰수를 저장.
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
# 가장 긴 증가하는 수열의 길이를 출력
# ex) [10, 9, 2, 5, 3, 7, 101, 18]
# Can you come up with an algorithm that runs in O(nlogn)
# D[i]는? i번째까지 증가하는 수열의 길이
N = len(nums)
D = [1] * N
for i in range(1, N):
for j in range(i):
if nums[i] > nums[j]:
D[i] = max(D[i], D[j]+1)
return max(D)
하지만 해당 방법으로 풀게 되면 최악의 상황에서 O(N^2)의 시간복잡도를 갖게된다.
따라서 O(NlogN)까지 줄일 수 있는 방법이 DP + binary search 를 활용한 방법이 있다.
코드
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
# 가장 긴 증가하는 수열의 길이를 출력
# ex) [10, 9, 2, 5, 3, 7, 101, 18]
# Can you come up with an algorithm that runs in O(nlogn)
# D[i]는? i번째까지 증가하는 수열의 길이
lis = [nums[0]]
for num in nums:
# 현재요소가 마지막 요소보다 큰 경우 추가
if num > lis[-1]:
lis.append(num)
else:
l, r = 0, len(lis) - 1
while l < r:
mid = (l + r) // 2
# 이진탐색을 통한 값
if lis[mid] < num:
l = mid + 1
else:
r = mid
lis[l] = num
return len(lis)
유연한 특성이 있어, flex-grow, flex-shrink, flex-basis 등의 속성을 통해 각 아이템이 차지하는 유연하게 조절할 수 있다. => 다양한 화면 크기(높이, 너비)에 맞게 아이템들이 조정되어 반응형 레이아웃 구현에 효과적이다!
무엇보다 코드가 간소화된다. => 가독성 유지보수성 증대
cf. display 속성에는 무엇이 있나요??
사용법
display: flex;
flex-direction: row; /* row값(기본값)은 주축이 가로방향이 되어 가로정렬 된다. */
flex-wrap: nowrap;
row-reverse 속성값을 이용하게 되면 주축의 시작점이 역전된다고 한다. flex-direction, flex-wrap 속성을 합쳐서 flex-flow: row nowrap; 으로 사용도 가능하다.
박스 모델
border-box vs content-box
요소의 크기 계산방식을 결정하는 역할을 하며, 이들은 box sizing 속성 값으로 사용된다.
content-box 기본값인 content-box가 적용된 엘리먼트의 너비높이는 오직 콘텐츠 영역만을 포함한다. 즉, width가 100px이고 padding: 20px 이 적용되면 요소의 실제 너비는 140px이 된다.
border-box 엘리먼트의 너비 높이가 콘텐츠, 패딩, 테두리 등을 포함한다. width: 100px 을 설정하면 패딩과 테두리를 포함한 너비가 100px이라는 얘기다. 전체 요소 크기 계산하기가 쉬우며 덕분에 레이아웃 설계에 용이하다는 장점. => 반응형 웹을 디자인하는데에 효과적!
position 속성
position: absolute; /* 가장 가까운 "위치지정" 부모 요소에 대해 상대적으로 배치 */
top: 4px;
left: 4px;
=> 위치지정 요소란 position 속성값이 relative, absolute, fixed, sticky 등인것을 의미한다. (static은 아님) position 속성의 기본값은 static이다.
=> 또한 position: absolute; 지정하는 대상이 블록요소라면 inline-block요소로 바뀐다고 한다! (실제로 header element의 크기가 변했따.)
position: relative; /* 자기 기준으로 해당 top,left 등 속성 값에 따라 배치*/
top: 4px;
left: 4px;
position: sticky; /* 가장 가까운 스크롤 되는 부모 요소와, 컨테이닝 블록을 기준으로 적용됨 */
top: 20px;
cf. 페이지 크기가 변해도 항상 같은 비율을 유지하는 요소를 만들고 싶을때, CSS 설계방법은? => 비율 기반의 레이아웃을 만드는 것입니다. 대표적으로 Viewport단위(vw, vh) 등을 사용하여 창의 크기에 따라 요소의 크기도 변화시킬수있습니다. => 또한 비디오 및 이미지 컨테이너로 활용하는 트릭중 하나인 padding-top을 사용하여 비율을 설정하는 것이 있다.
aspect-ratio: 16/9; /* 최신브라우저에서 해당 속성 사용하여 16:9 유지 가능 */
padding-top: 56.25%; /* 16:9 비율로 높이 설정 (9/16)*100% */
cf. 높이를 고정값으로 설정하는게 좋지 않은 이유는? 고정된 높이보다 콘텐츠 양이 더 많을때 잘릴 수 있고, 사용자의 해상도 차이가 있을경우 적절한 UX를 제공하기가 어려움. 따라서 고정값이 아닌 min-height를 이용하여 다양한 장치에서의 화면크기에 유연하게 조절가능하도록 한다.
멘토링
Q) TDD에 대한 글을 읽었는데 효과적으로 실무에 적용하기 위해 고민하는 기업이 있는 반면, 실제로 적용하기에는 시간이나 여러가지 요인으로 제약이 있다는 의견도 있었습니다. TDD에 대한 멘토님의 생각이 궁금하고, 혼자 사이드프로젝트로 경험을 해보고 가는 것이 현업에 도움이 될지 여쭤보고 싶습니다. (프론트, 백 양쪽 관점 모두에서 설명해주시면 감사하겠습니다!)
=> TDD에 대해서는 우호적이지 않다고 하셨다. 이유는 개발과정 중 초기 테스트 케이스 작성을 요구하는 것은, 개발 효율이 너무나 떨어지기 때문이다. 그러나 테스트 주도개발에 대해서 비판적일 뿐이지, 개발하면서 테스트 코드 작성은 멘토님도 많이 한다고 하신다.
찾아보니 요구사항이 또 너무 자주 변경되는 프로젝트의 경우, 유연성을 감소시킨다고 한다. 테스트케이스를 지속적으로 바꿔야하니...
추가로 DDD에 대한 질문도 주셨는데, DDD에 대해서는 주니어 개발자들에게 절대 권하지 않는다고 하신다. 객체지향 프로그래밍을 충분히 이해한 상태에서도 DDD는 굉장히 어려운 접근이라고 하셨다.
오프라인으로 진행되는 과정인점이 개인적으로 마음에 들었기 때문에 꼭 붙고 싶었는데 다행이다!..
그동안 온라인 생활이 힘들었다..
OT때 말씀해주시기를, 서류-코딩테스트-면접에 걸쳐 선발되기까지 경쟁률이 무려 570:17이라 하였다. 자부심을 갖고 믿음과 기대에 부응할 수 있도록 혼신의 힘을 다해 노력해야겠다고 다짐했다. (초심 잃지 않기를 제발...)
오늘은 가볍게 조원들과 아이스브레이킹 및 자기소개를 하였다. 서로의 얼굴을 그려주기도 하고 일어서서 자기소개를 하는데, 여전히 남들 앞에 서서 발표하는 일은 쉬운일이 아닌 것 같다...
그래도 자기소개를 함으로써 조금 더 친근해진 느낌이 들어서 좋았고, 무엇보다 동기분들의 마음가짐, 개발 경력, 개발 철학, 과거 경험 등을 들을 수 있어 자극도 받고 성공적인 프로젝트를 위해 3개월 동안 혼을 갈아 넣겠다는 목표가 생겼다. 또한 이전보다 개발에 대한 마음가짐에 변화가 온 것이 느껴져서 자신감도 생겼다. 교육과정중에 힘든일이 생기거나, 초심을 잃었다고 판단되었을 때는 이 1일차 블로그를 자주 방문하려고 한다.
학습 내용
주소창에 URL을 입력하면?
웹 브라우저 접속 1. 사용자가 웹 브라우저를 통해 URL을 입력. 웹브라우저는 클라이언트 or 프론트엔드로서 작동. 2. Request : 브라우저가 웹사이트를 호스팅하는 원격컴퓨터(서버)에 Request 보냄. 3. Response : 웹사이트를 호스팅하는 서버(백엔드)는 브라우저의 요청을 처리한 후 Response를 다시 웹 브라우저로 보냄. 4. 브라우저 렌더링 브라우저는 서버로부터 받은 응답을 해석하여, 사용자에게 보여준다.
다시 주소창에 url을 입력하면 생기는 일을 자세히 다뤄보겠다. 1. 브라우저는 입력받은 도메인을 ip주소로 변환하기 위해 DNS서버와 대화 시도. 2. ip 주소로 변환받으면 웹서버에 request를 보낸다. 3. 서버로부터 response 받는다.
여기서, 도메인을 IP 주소로 변환하려면 DNS서버에 도메인 쿼리하는 과정은 필수다. 하지만 동일한 도메인을 계속 쿼리한다면 성능면에서 안좋다는건 당연한 일이다. 따라서 DNS 서버에 쿼리하기전, DNS 캐시 정보를 먼저 확인하는 방법도 있다.
그래서 자세히 다룬 동작과정은 다음과 같다.
1. 로컬 hosts파일 확인 2. DNS cache 확인(캐싱) 3. DNS에 질의 4. IP 주소획득 5. TCP 연결 (3-way handshake) 6. 연결 성공하면 http request 7. 그리고 그에 따른 response cf. https://baegopeun-sj.tistory.com/12
HTML
HTML 이란?
HTML은 우리의 웹사이트 컨텐츠가 어떤 구조로 이루어질지 브라우저에게 설명하는 유일한 언어이다. 우리의 웹사이트 문서를 이루는 태그들의 집합이라고 볼 수 있다. 즉 웹페이지라 하면 결국은 html파일이라고 말할 수 있겠다.
<!DOCTYPE html> 브라우저에게 해당문서가 (현대적인 웹 표준을 따르는) HTML 형식을 사용하여 작성됨을 알리는 역할이다.
HTML element
HTML태그 + 콘텐츠
왜 필요할까?? 1. 우리가 만든 컨텐츠들이 브라우저에 제목, 텍스트, 이미지 등으로 표시될수있도록 하기 위해. 2. 검색엔진 크롤러의 탐색을 용이하게 하기위해. (HTML 주석 등 필요로함) 3. 눈으로 볼 수 없는 사용자를 위해. ( e.g. 스크린리더기로 인터렉션하는 시각장애인)
HTML 속성
태그의 이름만으로 정보가 부족할때 속성을 통해 추가요소구성을 할 수 있다.
메타데이터
브라우저에는 영향을 끼치나 사용자에게는 보이지 않는 정보.
메타데이터 <- title, 스타일 등 콘텐츠 <- HTML element
title태그 - 탭과 검색엔진에 표시되는 요소 사이트가 서버에 올라가게 되면 검색엔진 크롤러가 볼수있어, SEO에 중요한 역할을 한다.
CSS
CSS의 본질적인 의미
Cascading Style Sheets
Cascading, 사전적의미로는 '계단식', '폭포가 되어 떨어지는것'이다
즉, CSS의 본질적인 의미는 여러개의 스타일 규칙이 동일한 하나의 요소에 적용될 경우 어느 규칙이 우선 적용될지 정의한 것이라고 봐도 무방하다.
또 CSS는 상속(Inheritance)의 원칙을 담고있는데, 대표적인 예시로 부모요소에서 자식요소로 스타일 속성이 전달되는 것을 말할 수 있겠다.
스타일 적용 우선순위
크게 다음과 같이 나눌 수 있다. 0) !important 키워드
1) 인라인 스타일 2) 구체적인 선택자 (id > class == 가상 > 태그 > 전체) 3) 부모요소로부터 상속
cf. 복합 선택자의 경우 각 선택자의 우선순위 점수를 합산해서 정한다고 한다.
배포 및 호스팅
배포 내 웹사이트의 코드(HTML, CSS, JS 및 기타 이미지 등)를 호스팅 서비스 서버에 업로드 하는것.
호스팅 원격컴퓨터(서버)에서 해당 웹사이트의 코드를 저장.
호스팅 서비스에는 AWS, Netlify, Github Pages, Vercel, Google Cloud Platform 등이 있다.
drop방식으로 파일을 업로드하는 방식도 있기에 배포과정이 굉장히 쉬웠다. 하지만 이 방식은 저장소와의 자동 동기화 같은 고급기능은 사용할 수 없는 단점이 있다. => 더 많은 기능을 위해서 일반적인 배포과정을 활용해보도록 하자.
버전관리 시스템
Git - 로컬 관리 도구
Github - git으로 관리한 프로젝트를 클라우드로 보내는 역할(클라우드 호스팅 제공자
CLI, GUI 인터페이스 - 일련의 상호작용.
즉, 운영체제와의 상호작용을 위해 커맨드라인 방식을 사용하는게 CLI 그래픽으로 상호작용 하는게 GUI
윈도우에서는 CLI로 cmd를 사용한다.
멘토링
myQ) 저번에 말씀하신 부분에 대해, 기술스택이 해당기업에 부합하는 것 보다
부합하지 않더라도 본인만의 기술스택들의 사용이유, 깊이있는 지식 등이 오히려 더 매료시킬수 있다는 것으로 이해했습니다.
타입스크립트나 next.js 등을 사용하는 기업에 가고 싶다고 가정했을경우,
비교적 얕게 공부하더라도 해당 공부들이 우선 되어야할지,
React,js로 한 프로젝트에서 그런 문제해결능력이나, 기타 라이브러리, 툴사용에 대한 본인만의 고민을 잘 녹여내는 것과
본인이 진행해본 기술스택을 좀더 심도있게 학습하는것이 우선되어야할지 궁금합니다.
+ 더하여 강사님께서 생각하시는 좀 더 경쟁력있는 프론트엔드 개발자로서의 역량이 무엇일지 말씀해주시면 감사하겠습니다!
(문제해결능력, 알고리즘능력, CS지식, 백엔드지식, 넓은 프론트 기술스택, 프로젝트 경험)
프론트엔드 개발자로서 최소한의 기술스택 역량 혹은 백엔드 지식, 또 강사님께서 주니어를 뽑을 수 있다면 어떤 개발자를 원하실 것 같은지 말씀해주시면 감사하겠습니다.
A)
1. 일단 깊이있는 공부, 경험을 하는 것이 절대적으로 유리하다.
(얕고 넓은 기술 스택은 오히려 독이 될 수 있다) 예를들어 패키지를 가져다 쓸 때도, 이사람이 이걸 이유없이 썼는가? 아니면 비교분석을 철저히 했는가가 굉장히 중요한 포인트.
2. 기술 이슈 경험
예를 들어 포토폴리오를 보면, 이러이러한 프로젝트가 있는데 완성도나 그런걸 보는것보다 과연 이 사이드 프로젝트를 하면서 이슈가 없었을까??
있었다면 어떻게 인지했고, 어떻게 해결했을까?? 이게 굉장히 궁금한 포인트다! 기술이슈를 겪을만한 난이도의 프로젝트를 선정하는게 일단 베스트.
3. 오픈소스 작은코드라도 기여를 했다는 사실.
(유명한 오픈소스 아니어도)
4. 다양한 문제상황을 고민하는 개발자인가
다양항 문제상황을 생각해보고 코드를 그에 맞게 작성. 틀려도 좋으니 어느 상황이 발생한다면 어떻게 처리하면 되지 않을까?? 이런 고민을 하는 개발자인가. 원리파악에 관심 자체가 없어보이면 곤란하다.
프론트엔드는 백엔드 보다는 알고리즘 능력이 덜 필요시 되지만, 가져다쓰는 패키지가 어떻게 동작할지 보거나 할때는 또 필요하다.
백엔드 능력은 어느정도 간단한 서비스 구축정도를 경험함으로써 협업 시 이해도면에서 유리하다.
Q) 개발자로서의 문제해결능력?
A) 무엇이 문제인지를 먼저 인식하고 그것을 분명하게 정의하는 것이 진정한 문제 해결 능력이며 창의적 문제 해결의 기본이다.
Q) 프론트엔드 기술이슈 겪을만한거.
A) 1. 느린 속도 경험 2. 컴포넌트 분리?(클린코드)
★오늘의 핵심
깊이있는 기술학습이 우선.
기술이슈 겪을만한 깊이있는 프로젝트 1개 선정.
뭘 배울때 원리파악에 관심 가지는지 (메커니즘의 핵심)
오픈소스 작은코드라도 기여
저장소에 프로젝트 두가지 방식 나누기 1. 다양한 기술 많이써보는 프로젝트 2. 심도있게 다양한 문제상황에서의 고민 및 해결한 프로젝트
=> 해당 코드는 "구글의 CDN에 속한 해당 주소에 미리 연결해줘!" 라고 할 수 있겠다. (“fonts.gstatic.com” 해당 도메인은 구글의 CDN에 속한다고 한다.) => Google의 정적 자원(JavaScript 라이브러리, 폰트 등)을 로딩 속도를 향상시키는 데 활용된다.
웅진씽크빅에서 주관하는 유데미X사람인에서 주관하는 취업부트캠프에 합격을 했다..! OT때 말씀해주시기를, 서류-코딩테스트-면접에 걸쳐 선발되기까지 경쟁률이 무려 570:17이라 하였다. 자부심을 갖고 믿음과 기대에 부응할 수 있도록 혼신의 힘을 다해 노력해야겠다고 다짐했다. (초심 잃지 않기를 제발...)
오늘은 가볍게 조원들과 아이스브레이킹 및 자기소개를 하였다. 서로의 얼굴을 그려주기도 하고 일어서서 자기소개를 하는데, 여전히 남들 앞에 서서 발표하는 일은 쉬운일이 아닌 것 같다...
그래도 자기소개를 함으로써 조금 더 친근해진 느낌이 들어서 좋았고, 무엇보다 동기분들의 마음가짐, 개발 경력, 개발 철학, 과거 경험 등을 들을 수 있어 자극도 받고 성공적인 프로젝트를 위해 3개월 동안 혼을 갈아 넣겠다는 목표가 생겼다. 또한 이전보다 개발에 대한 마음가짐에 변화가 온 것이 느껴져서 자신감도 생겼다. 교육과정중에 힘든일이 생기거나, 초심을 잃었다고 판단되었을 때는 이 1일차 블로그를 자주 방문하려고 한다.
TIL을 통해 이번 교육과정에서 학습한 내용과 동시에, 얻은 좋은 경험들을 기록하는 것을 놓치지 않으려고 한다.
학습내용
1. 웹 작동방식
1-1. 주소창에 URL을 입력하면?
웹 브라우저 접속 1. 사용자가 웹 브라우저를 통해 URL을 입력. 웹브라우저는 클라이언트 or 프론트엔드로서 작동. 2. Request : 브라우저가 웹사이트를 호스팅하는 원격컴퓨터(서버)에 Request 보냄. 3. Response : 웹사이트를 호스팅하는 서버(백엔드)는 브라우저의 요청을 처리한 후 Response를 다시 웹 브라우저로 보냄. 4. 브라우저 렌더링 브라우저는 서버로부터 받은 응답을 해석하여, 사용자에게 보여준다.
다시 주소창에 url을 입력하면 생기는 일을 자세히 다뤄보겠다. 1. 브라우저는 입력받은 도메인을 ip주소로 변환하기 위해 DNS서버와 대화 시도. 2. ip 주소로 변환받으면 웹서버에 request를 보낸다. 3. 서버로부터 response 받는다.
여기서, 도메인을 IP 주소로 변환하려면 DNS서버에 도메인 쿼리하는 과정은 필수다. 하지만 동일한 도메인을 계속 쿼리한다면 성능면에서 안좋다는건 당연한 일이다. 따라서 DNS 서버에 쿼리하기전, DNS 캐시 정보를 먼저 확인하는 방법도 있다.
그래서 자세히 다룬 동작과정은 다음과 같다.
1. 로컬 hosts파일 확인 2. DNS cache 확인(캐싱) 3. DNS에 질의 4. IP 주소획득 5. TCP 연결 (3-way handshake) 6. 연결 성공하면 http request 7. 그리고 그에 따른 response cf. https://baegopeun-sj.tistory.com/12
2. HTML
2-1. HTML 이란?
HTML은 우리의 웹사이트 컨텐츠가 어떤 구조로 이루어질지 브라우저에게 설명하는 유일한 언어이다. 우리의 웹사이트 문서를 이루는 태그들의 집합이라고 볼 수 있다. 즉 웹페이지라 하면 결국은 html파일이라고 말할 수 있겠다.
<!DOCTYPE html> 브라우저에게 해당문서가 (현대적인 웹 표준을 따르는) HTML 형식을 사용하여 작성됨을 알리는 역할이다.
2-2. HTML element
HTML태그 + 콘텐츠
왜 필요할까?? 1. 우리가 만든 컨텐츠들이 브라우저에 제목, 텍스트, 이미지 등으로 표시될수있도록 하기 위해. 2. 검색엔진 크롤러의 탐색을 용이하게 하기위해. (HTML 주석 등 필요로함) 3. 눈으로 볼 수 없는 사용자를 위해. ( e.g. 스크린리더기로 인터렉션하는 시각장애인)
2-3. HTML 속성
태그의 이름만으로 정보가 부족할때 속성을 통해 추가요소구성을 할 수 있다.
2-4. 메타데이터
브라우저에는 영향을 끼치나 사용자에게는 보이지 않는 정보.
메타데이터 <- title, 스타일 등 콘텐츠 <- HTML element
title태그 - 탭과 검색엔진에 표시되는 요소 사이트가 서버에 올라가게 되면 검색엔진 크롤러가 볼수있어, SEO에 중요한 역할을 한다.
3. CSS
3-1 CSS의 본질적인 의미
Cascading Style Sheets ★여기서 Cascading이란?? =>
3-2 CSS 선택자
CSS 규칙이 적용되는 요소를 정의하는 역할
3-3 글로벌 CSS 스타일
하나의 CSS 규칙이 페이지의 여러 요소에 적용될 수 있어서 좋다.
4. 브라우저 개발자 도구
네트워크 탭 - 리소스가 정상적으로 받아와졌는지 확인하거나, 리소스의 용량 및 다운로드 시간을 확인할 수 있다. ⇒ 성능 최적화를 위해 활용.
브라우저 개발자도구를 통해 페이지 편집하면? ⇒ 로드된 페이지를 변경하게 된다.
멘토링
Q) 포토폴리오로써 효과적으로 어필할 수 있는 프로젝트가 되게 하려면 주제선정이나 실제 구현에 있어서 어떤 부분에 주안점을 둬야하나요?
A) 결국에 기업에서 개발자를 뽑는 이유는 “문제해결능력” 이라고 하셨다.
어떤 문제를 맞닥뜨렸고, 어떤 상황으로 인지했고, 어떻게 해결해 나갔는지 이게 궁금한거지
이력서에 어떤거 만들었다! 이거는 좋은 평가 받기 힘들다. 라고 하셨다.
포토폴리오 작성시에도, 프로덕트의 완성도에 중점을 두기보다는 “개발자 포토폴리오” 이므로 해당 프로덕트가 실제로 사용되고 있는 상황이고, 어떠한 문제가 있을때 어떻게 해결할 거인가를 인지하고 있는 개발자가 경쟁력을 갖출것이다
그리고 코드의 퀄리티도 중요하지만, 경험의 퀄리티에 강조를 많이 하셨던 것 같아서 좋은 경험을 위해 동작할 메커니즘이나 사용할 기술 스택에 대해서도 왜 해당 스택을 사용해야 하는지 그런 고민들을 늘 가져야겠다고 생각했다.