반응형
반응형

개발 배우기가 정말 어려운 이유

https://brunch.co.kr/@jypthemiracle/14

 

[번역] 개발 배우기가 정말 어려운 이유

Why Learning to Code is So Damn Hard? | 이 글은 에릭 트라우트먼(Eric Trautman)이 Thinkful이라는 미국 코딩 부트캠프 블로그에 게시한 글입니다. 그는 2014년에 실리콘밸리에서 Viking Education이라는 부트캠프를

brunch.co.kr

1. 강의로 학습하며 자신감이 솟아나는 단계 (The Hand Holding Honeymoon) : 재미와 즐거움으로 가득찬 단계입니다. 조금 어려워는 보이지만, 자료가 잘 정리되어 있고 지원이 빵빵하기에 여러분은 잘 해낼 수 있을 겁니다. 기본적인 문법을 배우고 높은 수준의 성취도를 느낄 것입니다.

2. 혼돈의 카오스 (The Cliff of Confusion) : 강의를 다 봤고 강좌를 모두 수료하고 난 뒤에 느끼는 단계입니다. 생각보다 모든 것이 어렵고 고통스럽다는 사실을 자각하게 됩니다. 아직 스스로 무언가를 할 수 있는 단계가 아니라고 생각이 들 것입니다. 계속 디버깅을 하고 있고 여러분 스스로 무언가를 위해서 어찌저찌 시도해보고 있긴 하지만, 다른 사람들에게 어떻게 질문해야 잘 물어봤다고 할 수 있을 지 명확하지 않은 단계입니다.

3. 절망 한 가운데에 놓임 (The Desert of Despair) : 아주 지리밀렬하고 지루한 단계입니다. 새로운 길 하나하나가 옳은 것처럼 보이지만 나 자신은 원을 그리듯 제자리 걸음입니다. 어려움을 이겨낼 수 있는 자료를 찾아 계속 돌아다닙니다. 마치 사막에서 어디에 홀린 마냥, 사람들의 열광 속에서 신기루에 빠지지 않도록 조심하세요. 자칫하다간 잘못된 길에 빠지고 말 것입니다.

4. 놀라운 성장 (The Upswing of Awesome) : 사막 속에서 결국 길을 찾아내고야 말았습니다. 어떻게 개발해야 하는 지에 대한 이해가 생겼을 때입니다.

여전히 여러분의 코드는 여전히 어디엔가 갇혀진 느낌이고 깨지기가 쉽습니다. 다만, 여러분은 아무튼 작동한다는 사실에서 자신감을 얻게 되지요. 유용한 몇몇 패턴에 익숙해지고, 친구들은 여러분이 만든 화면이 엄청 대단하다고 느끼구요. 하지만 코드를 정작 까 보는 것에 여전히 두려워하고, 자신있게 내세울 수 있는 수준의 코드(production-ready)를 짜는 방법에 대해 결국 찾지 못한 상태입니다. 어떻게 해야 실제 취업이 요구하는 수준까지의 기술 격차(gap)을 줄일 수 있을까요.

 

 

계속 성장하는 방법
여정은 정말 빡세보이고 힘들어보입니다. 솔직히 말하면 종종 그렇습니다. 중요한 것은 여러분이 어느 상태에 있는 지 아는 것입니다. 특히 여러분이 혼자 공부한다면 더욱이 그렇습니다. 하지만 꼭 그럴 필요는 없습니다. 대부분의 경우에 적용할 수 있는 팁들이 있기 때문이지요. 코딩을 배우는 것은 사람들이 생각하는 것만큼 쉽지는 않지만, 절망할 것처럼 그렇게 깊이 어려운 것도 아닙니다. 여기서는 올바른 방법으로 갈 수 있는 팁에 대해 설명해보도록 하겠습니다.

1단계에서 살아남는 방법
정말 많은 종류의 학습 컨텐츠가 있습니다. 코딩에 대해 쉽게 입문할 수 있도록 해줍니다. 두 가지 팁을 꼭 명심하도록 하세요.



1. 여러 다양한 컨텐츠로 시작해보세요. 어떻게 배우는 것이 여러분에게 딱 맞는 방법인지 학습하 수 있을 것이고, 어떤 프로젝트가 흥미로운 지 발견할 수도 있을 것입니다. Khan Academy의 챌린지나 생활코딩의 WEB 강좌, 또는 노마드 코더의 클론코딩, 커넥트재단의 부스트코스, 인프런 강좌, 스터디파이 등이 될 수 있을 것입니다. 처음 시작할 때는 열린 마음을 가지되, 무엇을 꼭 배워야 한다느니 하는 소리에는 신경쓰지 않으셔도 됩니다. 기초 단계에서는 어짜피 다 비슷하거든요.



2. 여러분과 잘 맞다고 생각드는 컨텐츠 하나를 골라보세요. 그리고 그 컨텐츠 하나에 집중하세요. 처음부터 끝까지 다 들어보세요. 기초 스크립트와 앱 등 모든 기본 지식을 끝까지 다 들어보시고, 스스로 만들어보는 연습을 하세요.



2단계에서 살아남는 방법
거의 대부분의 사람들이 2단계를 겪을 것입니다. 왜냐하면 개발자가 되는 방법은 직접 개발을 하는 것이기 때문이죠. 여러분은 튜토리얼을 해보면서 직접 자신이 만들었다고 생각할 지도 모릅니다. 하지만 튜토리얼 따위를 몰아내는 것은 아주 필수적인 일입니다. 튜토리얼은 처음에는 좋지만 이제 스스로 걸음마도 좀 해봐야죠. 그래야 진짜 세계를 볼 수 있습니다.



여러분 스스로 만들기 위한 세 가지 팁을 명심하도록 하세요.

1. 다른 사람들과 함께 하세요. 아무리 초보더라도 두 명이서 함께 페어를 할 때 불가능해 보이는 에러도 디버깅할 수 있답니다.

2. 다른 사람의 코드를 읽으세요. 좋은 패턴에 익숙해지도록 하세요. 다른 사람들이 어떠한 의도로 코드를 작성했는지 파악하려고 노력하세요. 책을 읽지 않고 소설가가 될 수 있나요? 자그마한 문제 하나하나에 귀를 기울이고, 다른 사람이 이를 어떻게 해결했는지 관심을 기울이도록 하세요.

3. 자그마한 것으로 시작하고 계속해서 만들어보세요. 미래에 내가 만들어 볼 큰 프로젝트에 관심 가질 수도 있겠습니다만, 지금은 당장 디버깅에 익숙해지고 자그마한 문제를 해결할 수 있는 능력을 길러야 합니다. 이 과정은 정말 필수적으로 하셔야 합니다.



3단계에서 살아남는 방법
디버깅에 익숙해지면, 여러분의 가장 큰 문제는 학습할 거리들이 아주 많아진다는 점입니다. 이걸 대체 언제 다 공부하고 있나요. 이 경우에 여러분은 자신만의 굳은 믿음과 올바른 길에 대한 전진이 필요한 때입니다. 가끔 사막에서 신기루가 나타나서 빨리 스킬을 얻을 수 있는 방법을 알려주겠노라고 여러분을 홀릴 수도 있겠습니다만, 여기에 속아넘어가면 정말 시간만 낭비하게 될 것입니다.



1. 분명한 목표를 가지세요. 무엇을 이루고 싶은가요? 목표가 없다면 관심이 있는 모든 것에 이리저리 기웃대다가 아무 것도 안 될 것입니다. 여유 부릴 시간이 있으면 공부를 하세요.

2. 분명한 길을 걸으세요. 여러분의 목표로 인도해줄 것이고, 그 곳이 맞다는 사실을 확신시켜 줄 것입니다. 각종 마케팅 슬로건에 속지 않고, 여러분 나름대로 깊이 파고들 수 있게 될 것입니다. 다양한 강좌 웹사이트나 소개자료집, 기술 책 앞에서 "이것이 나의 목표 달성에 있어 꼭 필요한 일인지" 판단할 수 있게 될 것입니다.

3. 집중하셔야 합니다. 여러분이 코딩에 관심이 있다는 것은 여러분은 아마 다른 모든 것에 관심이 있을 거라는 뜻입니다. 코딩이 어려워진다면 금방 질려 다른 거 하지 마시고 여기에 오로지 집중하도록 하세요.



여러분이 나름의 길을 찾고 여기에 오롯이 집중할 수 있을 때, 여러분은 몇 개월, 몇 년 동안 각종 열풍과 환상에 속아 넘어가지 않고 다음 단계로 넘어갈 수 있을 것입니다.



4단계에서 살아남는 방법
사실 여기가 제일 어려운 부분입니다. 앱을 개발할 수 있게 되었지만 정말 진정한 개발자가 되고 싶으실 것입니다. 이 과정을 지나고 취업에 다다르기 위해서는 다음의 과정을 거치셔야 합니다.



1. 모범 사례를 찾아 따라해보세요. 해결책과 베스트 프렉티스의 차이점에 대해 이해하실 수 있어야 합니다. 베스트 프렉티스, 즉 모범사레는 여러분이 스스로 하던 것과 어딘가 차이가 있을 것이구요. 실제 회사환경과 코드 수준차이가 있을 것입니다.

2. 여러분의 상황을 계속해서 점검해보세요. 여러분은 계속 중간중간에 모르는 내용으로 구멍 뚫린 것 때문에 미끄러진 경험이 있을 것입니다. 내가 알지도 몰랐던 지식들 때문이기도 하구요. 이것들을 점검하고 고쳐나가야만 합니다.

3. 하기 싫어했던 것을 공부하세요. 평소에 자주 다뤄지지는 않지만 회사에 업무를 수행하기 위해서는 매우 중요한 것들 말입니다. 테스트 하는 것이나 데이터 모델링, 구조 짜기, 배포하기 같은 것은 지루할 지 모르지만 좋은 개발자가 되기 위해서는 매우 중요한 것들입니다.



사실 제일 중요한 것은 피드백을 얻는 것입니다. 스스로 학습하는 것이 최고라고 믿는 학생들은 읽기 쉬운 코드, 모듈화가 잘 된 코드, 유지보수 하기 쉬운 코드와 같이 업무 환경에서 중요한 요소들에 대한 고민을 해본 적이 없을 것입니다. 여러분 스스로의 환경에 계속 도전할 수 있는 누군가와 함께 일해 볼 필요가 있습니다. 계속 난처한 질문을 던져달라고 요구하시고, 이를 통해 여러분의 부족한 지식을 메꿔두세요.

반응형
반응형

개발 배우기가 정말 어려운 이유  https://www.thinkful.com/blog/why-learning-to-code-is-so-damn-hard/

 

Why Learning to Code is So Damn Hard | Thinkful

What every beginner absolutely needs to know about the journey ahead.

www.thinkful.com



무료 코딩학습사이트에서 코딩을 몇 개월 배우고, 
이것도 조금 배우고, 저것도 조금 배우다가 결국 거의 모든 온라인 강좌는 다 들어본 정도가 되어도 
마지막에 개발자로 취업하기엔 어려움이 있다. 


1단계: 강의로 학습하며 솟아나는 자신감

코딩은 누구나 배워야 한다고 요즘 얘기합니다. 
덕분에 코딩에 대한 진입장벽도 많이 낮아졌고, 생각보다 그렇게 어렵지 않다는 사실을 보여주기도 합니다. 
codecademy 나 생활코딩 같은 웹사이트에서 얻을 수 있는 많은 학습자료 덕분에 
우리 모두가 코딩을 배울 수 있다 수준이 아니라 개발자가 될 수 있다는 자신감을 얻울 수 있게 되었죠. 
결국 문제는 학습에 대한 공포가 아니라 지나친 수준의 기대와 환상이 되어버린 것입니다. 

입문자를 위한 자료들은 대부분 무시무시한 변수와 조건문을 거쳐 기초단계의 프로그래밍 문법을 학습하도록 잘 지도해줍니다. 
마치 어린이가 횡단보도를 잘 지나가도록 가르쳐주는 것과 같다랄까요? 
마치 게임처럼 하나를 배우면 자신감은 하늘을 치솟게 됩니다. 다 할 수 있을겉만 같아. 난 이미 개발자라고!

하지만 한여름 밤의 꿈과 같은 단계에 있다고 할 수 있습니다. 마치 반환점을 돈 것 같이 느껴지지만, 
먼 여행길에서 아주 조금 와 있는 것에 불과합니다. 시작에 불과하다구요...



개발 학습의 일반적인 4단계을 봅시다.

1. 강의로 학습하며 자신감이 솟아나는 단계 (The Hand Holding Honeymoon) : 재미와 즐거움으로 가득찬 단계입니다. 조금 어려워는 보이지만, 자료가 잘 정리되어 있고 지원이 빵빵하기에 여러분은 잘 해낼 수 있을 겁니다. 기본적인 문법을 배우고 높은 수준의 성취도를 느낄 것입니다.

2. 혼돈의 카오스 (The Cliff of Confusion) : 강의를 다 봤고 강좌를 모두 수료하고 난 뒤에 느끼는 단계입니다. 생각보다 모든 것이 어렵고 고통스럽다는 사실을 자각하게 됩니다. 아직 스스로 무언가를 할 수 있는 단계가 아니라고 생각이 들 것입니다. 계속 디버깅을 하고 있고 여러분 스스로 무언가를 위해서 어찌저찌 시도해보고 있긴 하지만, 다른 사람들에게 어떻게 질문해야 잘 물어봤다고 할 수 있을 지 명확하지 않은 단계입니다.

3. 절망 한 가운데에 놓임 (The Desert of Despair) : 아주 지리밀렬하고 지루한 단계입니다. 새로운 길 하나하나가 옳은 것처럼 보이지만 나 자신은 원을 그리듯 제자리 걸음입니다. 어려움을 이겨낼 수 있는 자료를 찾아 계속 돌아다닙니다. 마치 사막에서 어디에 홀린 마냥, 사람들의 열광 속에서 신기루에 빠지지 않도록 조심하세요. 자칫하다간 잘못된 길에 빠지고 말 것입니다.

4. 놀라운 성장 (The Upswing of Awesome) : 사막 속에서 결국 길을 찾아내고야 말았습니다. 어떻게 개발해야 하는 지에 대한 이해가 생겼을 때입니다.

여전히 여러분의 코드는 여전히 어디엔가 갇혀진 느낌이고 깨지기가 쉽습니다. 다만, 여러분은 아무튼 작동한다는 사실에서 자신감을 얻게 되지요. 유용한 몇몇 패턴에 익숙해지고, 친구들은 여러분이 만든 화면이 엄청 대단하다고 느끼구요. 하지만 코드를 정작 까 보는 것에 여전히 두려워하고, 자신있게 내세울 수 있는 수준의 코드(production-ready)를 짜는 방법에 대해 결국 찾지 못한 상태입니다. 어떻게 해야 실제 취업이 요구하는 수준까지의 기술 격차(gap)을 줄일 수 있을까요.


2단계: 혼돈의 카오스
여러분은 지금 1단계에 있습니다. 강의를 통해 자신감을 얻고 있는 단계죠. 코딩 문제들도 하나씩 풀고, 뱃지도 얻고 여러분의 자신감은 무럭무럭 자라나고 있습니다. 나쁘지 않은데, 왜 코딩 배우기가 어렵다고 저렇게 난리지? 이렇게 생각하신다면 여러분은 자신감의 끝을 달리시고 있는 겁니다. 조심하셔야 합니다.. 이제 많은 초심자들을 좌절시킨 절벽으로 떨어지고 있으니까요. 이 절벽에 다다르는 순간은 바로 아무런 힌트나 예제 코드, 브라우저 상에서 돌아가던 학습용 에디터가 사라지고, 그 대신 텍스트 편집기를 열어서 처음부터 모든 것을 다시 짜야할 때 벌어집니다.
 

튜토리얼을 따라하면서 조금 더 버틸 수 있을 지도 모르겠습니다. 하지만 땅을 포기하지 않는 자가 하늘에 다다를 수는 없는 법이죠. 아무 것도 없는 텍스트 파일 하나에서 말 그대로 '마법'을 일으켜야만 할 지도 모릅니다 (...) 이렇게 느껴지신다면 여러분은 2단계에 도달한 셈이 됩니다. 자신감은 땅으로 꺼지고, 혼돈의 카오스를 맛보게 되는 것이지요.

아무튼 계속 코딩을 하긴 합니다. 스스로 자신만의 길을 만들고 대충 돌아가기는 하는데 뭔가 빠진 것 같은 느낌입니다. 버그 잡으려고 고생하다보면, 스타쉽 트루퍼스라는 영화가 마치 상냥하고 친절한 것처럼 느껴집니다. 구글링 어쩌다 한 번 잘해서 버그 하나 잡았지만, 할 수 있는 게 겨우 검색 하나 두들겨 보는 것 뿐이라는 생각에 자신감은 땅으로 떨어집니다.

사실 이 단계는 교육자로서나 산업에 종사하고 있는 사람들로서나 모두에게 고통을 줍니다. 우리는 개발이 모두에게 딱 맞지는 않더라도, 공부하시는 여러분만큼은 꼭 이겨내셨으면 좋겠어요. 왜냐하면 정말 안될 것 같은 경우도 엄청난 성공사례가 되기도 하기 때문이거든요.

모든 교육기간이 끝났습니다. 절벽에서 밀려나 이제는 정말로 날아야만 할 때, 가능성이 있는 친구들이 날개를 펴는 방법을 배우지 못한 채 좌절의 나락에서 맴돌고 있는 모습을 많이 보게 됩니다. 정말로 무서운 것은 아직 제대로 시작도 못해봤다는 것입니다. 혼돈의 카오스를 겪게 되는 2단계는 아직도 너무 초기 단계입니다. 정말 많은 수의 버그를 잡아보세요. 그 때 여러분은 반드시 2단계를 끝낼 수 있을 겁니다. 여러분은 아직 시작에 불과하십니다.

진정으로 개발자로써 커리어를 만들어나갈 준비가 된 사람들은, 이 혼돈의 카오스 단계에서 살아남는 것이 새로운 인생의 반환점이 됩니다. 개발에 올인해야지 하고 생각하는 것이지요. 많은 사람들은 여기서 떨어져 나갑니다. 하지만, 여러분은 이제 절망 한 가운데에 놓이게 될 것입니다.

학습 여정에 중요한 포인트 두 가지가 있어요.

 첫 번째 단계와 나머지 단계의 차이점이 뭐라고 생각하시나요? 왜 2단계가 1단계보다 더욱 끔찍하고 무시무시한가요? 이 차이를 이해한다면, 학습에 어려움을 겪는 것이 여러분 자기자신의 문제점이 아니라는 사실을 깨닫게 될 것입니다
 
 포인트 1: 학습 자료가 얼마나 풍부한가 (Resource Density)
   여러분을 코딩의 세계로 이끌어 줄 자료는 정말 수 없이 많이 있습니다. 구글에 영어로 "Learn to Code" 라고 검색해보세요. 정말 양질의 자료가 너무너무 많이 나옵니다. 솔직하게 말해서 정말 좋습니다. 이렇게나 코딩을 학습하기에 좋았던 적도 없었거든요.
   
   하지만 그 뒤의 단계로 갈 수록 학습 자료들이 정말 빠른 속도로 부족해집니다. 초심자에서 중급자로 넘어간 사람들은 쉽게 공감할 수 있을 것입니다. 여러분이 처음 코딩을 배워야겠다고 마음을 먹은 순간을 생각해보세요. 여러분이 다른 사람의 지도와 안내 없이 스스로 무언가를 만들다가 질문을 해야 하는 상황에 처음으로 놓였을 때를 생각해보세요. 학습 자료의 차이를 쉬이 실감할 수 있을 것입니다.

   학습자료는 소위 3단계에 진입하게 되는 시기, 즉 학습해야 하는 지식이 많아질 수록 급격하게 부족해집니다. 이것이 제가 3단계를 "좌절의 계곡" 이라고 이름을 붙인 이유입니다. 이 단계를 지나면 검색을 통해 필요한 것을 찾는 것이 습관이 되고, 기술 블로그나 컨퍼런스 발표자료와 같이 기술 자료를 학습하면서 업무를 할 수 있게 됩니다. 어떤 질문을 던져야 할 지를 이해할 수 있게 되는 것도 있겠습니다.

   아래의 도표는 각 단계마다 학습자료의 양이 어떻게 변화하냐를 보여주는 것입니다. 선이 두꺼울 수록 더 많은 자료가 있다는 것으로 이해하면 됩니다.


 포인트 2: 학습할 지식의 범위 (Scope of Knowledge)
    학습을 처음 시작할 때 알아야 하는 것은 사실 그리 많지 않습니다. 개발을 배우는 목적이 무엇이든, 어떠한 언어로 학습하든 for 반복문, 조건문과 같은 기본적인 프로그래밍 문법을 익히는 것은 너무 당연한 일입니다. 처음 시작할 때에는 뭔가 대단한 기초지식을 배우는 것이 아니기에 학습할 지식의 범위가 넓지는 않습니다.

    기초 단계에서 벗어나게 되면 여러분이 배워야 하는 지식의 범위가 엄청나게 넓어짐을 실감할 수 있을 것입니다. 그리고 배워야 하는 것들도 점점 어려워집니다. 에러를 이해해야 하고 언제 이 코드를 써야 하는 지 알아야 하고 어떻게 사용하는 지 알아야 합니다. 사실 질문에 명확한 답이 없다는 것이 차이점입니다. 혼돈의 카오스죠.

    이제 3단계로 갑니다. 지식의 범위는 더 넓어집니다. 여러분은 어떠한 툴을 사용할 지를 알고 이해해야 하구요, 어떤 언어를 배워야 하는 지도 알아야 하구요, CS지식도 있어야 하구요, 모듈화에 대해서도 알아야 하구요, 객체지향에 대해서도 알아야 하구요, 좋은 코드 스타일이 뭔지에 대해서도 고민해봐야 하구요, 어떻게 질문을 던져야 하는 지에 대해서도 배워야 하구요. (정말 몇 가지만 이야기한 것입니다.) 구글링을 해봐도 무슨 두더지 잡기 게임하는 것만 같고 모르는 내용에 압도되기 십상이고 대체 무슨 소리인지 모르겠지만 다 보기는 해야 할 것 같고 막 그렇습니다.


계속 성장하는 방법
여정은 정말 빡세보이고 힘들어보입니다. 솔직히 말하면 종종 그렇습니다. 중요한 것은 여러분이 어느 상태에 있는 지 아는 것입니다. 특히 여러분이 혼자 공부한다면 더욱이 그렇습니다. 하지만 꼭 그럴 필요는 없습니다. 대부분의 경우에 적용할 수 있는 팁들이 있기 때문이지요. 코딩을 배우는 것은 사람들이 생각하는 것만큼 쉽지는 않지만, 절망할 것처럼 그렇게 깊이 어려운 것도 아닙니다. 여기서는 올바른 방법으로 갈 수 있는 팁에 대해 설명해보도록 하겠습니다.

1단계에서 살아남는 방법
정말 많은 종류의 학습 컨텐츠가 있습니다. 코딩에 대해 쉽게 입문할 수 있도록 해줍니다. 두 가지 팁을 꼭 명심하도록 하세요.



1. 여러 다양한 컨텐츠로 시작해보세요. 어떻게 배우는 것이 여러분에게 딱 맞는 방법인지 학습하 수 있을 것이고, 어떤 프로젝트가 흥미로운 지 발견할 수도 있을 것입니다. Khan Academy의 챌린지나 생활코딩의 WEB 강좌, 또는 노마드 코더의 클론코딩, 커넥트재단의 부스트코스, 인프런 강좌, 스터디파이 등이 될 수 있을 것입니다. 처음 시작할 때는 열린 마음을 가지되, 무엇을 꼭 배워야 한다느니 하는 소리에는 신경쓰지 않으셔도 됩니다. 기초 단계에서는 어짜피 다 비슷하거든요.



2. 여러분과 잘 맞다고 생각드는 컨텐츠 하나를 골라보세요. 그리고 그 컨텐츠 하나에 집중하세요. 처음부터 끝까지 다 들어보세요. 기초 스크립트와 앱 등 모든 기본 지식을 끝까지 다 들어보시고, 스스로 만들어보는 연습을 하세요.



2단계에서 살아남는 방법
거의 대부분의 사람들이 2단계를 겪을 것입니다. 왜냐하면 개발자가 되는 방법은 직접 개발을 하는 것이기 때문이죠. 여러분은 튜토리얼을 해보면서 직접 자신이 만들었다고 생각할 지도 모릅니다. 하지만 튜토리얼 따위를 몰아내는 것은 아주 필수적인 일입니다. 튜토리얼은 처음에는 좋지만 이제 스스로 걸음마도 좀 해봐야죠. 그래야 진짜 세계를 볼 수 있습니다.



여러분 스스로 만들기 위한 세 가지 팁을 명심하도록 하세요.

1. 다른 사람들과 함께 하세요. 아무리 초보더라도 두 명이서 함께 페어를 할 때 불가능해 보이는 에러도 디버깅할 수 있답니다.

2. 다른 사람의 코드를 읽으세요. 좋은 패턴에 익숙해지도록 하세요. 다른 사람들이 어떠한 의도로 코드를 작성했는지 파악하려고 노력하세요. 책을 읽지 않고 소설가가 될 수 있나요? 자그마한 문제 하나하나에 귀를 기울이고, 다른 사람이 이를 어떻게 해결했는지 관심을 기울이도록 하세요.

3. 자그마한 것으로 시작하고 계속해서 만들어보세요. 미래에 내가 만들어 볼 큰 프로젝트에 관심 가질 수도 있겠습니다만, 지금은 당장 디버깅에 익숙해지고 자그마한 문제를 해결할 수 있는 능력을 길러야 합니다. 이 과정은 정말 필수적으로 하셔야 합니다.



3단계에서 살아남는 방법
디버깅에 익숙해지면, 여러분의 가장 큰 문제는 학습할 거리들이 아주 많아진다는 점입니다. 이걸 대체 언제 다 공부하고 있나요. 이 경우에 여러분은 자신만의 굳은 믿음과 올바른 길에 대한 전진이 필요한 때입니다. 가끔 사막에서 신기루가 나타나서 빨리 스킬을 얻을 수 있는 방법을 알려주겠노라고 여러분을 홀릴 수도 있겠습니다만, 여기에 속아넘어가면 정말 시간만 낭비하게 될 것입니다.



1. 분명한 목표를 가지세요. 무엇을 이루고 싶은가요? 목표가 없다면 관심이 있는 모든 것에 이리저리 기웃대다가 아무 것도 안 될 것입니다. 여유 부릴 시간이 있으면 공부를 하세요.

2. 분명한 길을 걸으세요. 여러분의 목표로 인도해줄 것이고, 그 곳이 맞다는 사실을 확신시켜 줄 것입니다. 각종 마케팅 슬로건에 속지 않고, 여러분 나름대로 깊이 파고들 수 있게 될 것입니다. 다양한 강좌 웹사이트나 소개자료집, 기술 책 앞에서 "이것이 나의 목표 달성에 있어 꼭 필요한 일인지" 판단할 수 있게 될 것입니다.

3. 집중하셔야 합니다. 여러분이 코딩에 관심이 있다는 것은 여러분은 아마 다른 모든 것에 관심이 있을 거라는 뜻입니다. 코딩이 어려워진다면 금방 질려 다른 거 하지 마시고 여기에 오로지 집중하도록 하세요.



여러분이 나름의 길을 찾고 여기에 오롯이 집중할 수 있을 때, 여러분은 몇 개월, 몇 년 동안 각종 열풍과 환상에 속아 넘어가지 않고 다음 단계로 넘어갈 수 있을 것입니다.



4단계에서 살아남는 방법
사실 여기가 제일 어려운 부분입니다. 앱을 개발할 수 있게 되었지만 정말 진정한 개발자가 되고 싶으실 것입니다. 이 과정을 지나고 취업에 다다르기 위해서는 다음의 과정을 거치셔야 합니다.



1. 모범 사례를 찾아 따라해보세요. 해결책과 베스트 프렉티스의 차이점에 대해 이해하실 수 있어야 합니다. 베스트 프렉티스, 즉 모범사레는 여러분이 스스로 하던 것과 어딘가 차이가 있을 것이구요. 실제 회사환경과 코드 수준차이가 있을 것입니다.

2. 여러분의 상황을 계속해서 점검해보세요. 여러분은 계속 중간중간에 모르는 내용으로 구멍 뚫린 것 때문에 미끄러진 경험이 있을 것입니다. 내가 알지도 몰랐던 지식들 때문이기도 하구요. 이것들을 점검하고 고쳐나가야만 합니다.

3. 하기 싫어했던 것을 공부하세요. 평소에 자주 다뤄지지는 않지만 회사에 업무를 수행하기 위해서는 매우 중요한 것들 말입니다. 테스트 하는 것이나 데이터 모델링, 구조 짜기, 배포하기 같은 것은 지루할 지 모르지만 좋은 개발자가 되기 위해서는 매우 중요한 것들입니다.



사실 제일 중요한 것은 피드백을 얻는 것입니다. 스스로 학습하는 것이 최고라고 믿는 학생들은 읽기 쉬운 코드, 모듈화가 잘 된 코드, 유지보수 하기 쉬운 코드와 같이 업무 환경에서 중요한 요소들에 대한 고민을 해본 적이 없을 것입니다. 여러분 스스로의 환경에 계속 도전할 수 있는 누군가와 함께 일해 볼 필요가 있습니다. 계속 난처한 질문을 던져달라고 요구하시고, 이를 통해 여러분의 부족한 지식을 메꿔두세요.

 

 

https://brunch.co.kr/@jypthemiracle/14

반응형
반응형

 

개발자라면 포르투갈로 오세요 : 유럽 포르투갈이 월 2750달러(약 400만원)의 수입이 있는 원격 근무자에게 1년 체류할 수 있는 비자를 10월30일부터 발급한다고 해요.

 

https://www.businessinsider.com/portugal-launches-digital-nomad-visa-2700-month-income-requirement-2022-10

 

 

Remote workers who make at least $2,750 a month can apply to Portugal's new 'digital-nomad visa' starting October 30. Here's how

"Portugal is the next California," one migration expert told Insider. "You have tremendous talent going there, tremendous wealth going there."

www.businessinsider.com

 

반응형
반응형

개발자에게 하면 안되는 말 3 가지

 - 간단한거죠? 일단 해주세요.

 - 이거(특정기간)까지 개발해주세요.

 - 타 서비스에서는 제공하던데요? 

반응형
반응형

ES6 for beginners
https://hackernoon.com/es6-for-beginners-f98120b57414

 

ES6 for beginners | HackerNoon

 

hackernoon.com

Topics I’m gonna cover in this post

  1. Let and Const
  2. Arrow functions
  3. Default parameters
  4. for of loop
  5. Spread attributes
  6. Maps
  7. Sets
  8. Static methods
  9. Getters and Setters

ES6 문법 + 활용 패턴 살펴보기
https://chancethecoder.tistory.com/30

  • 블록 범위 생성자 (Block-Scoped Constructs Let and Const)
  • 화살표 함수 (Arrow Functions)
  • 클래스 (Classes)
  • 프로미스 (Promises)
  • 비구조화 할당 (Destructuring Assignment)
  • 템플릿 리터럴 (Template Literals)
  • 향상된 객체 리터럴 (Enhanced Object Literals)
  • 기본 매개 변수 (Default Parameters)
  • 멀티 라인 문자열 (Multi-line Strings)
  • 모듈 (Modules)

자주 사용하는 ES6 문법 정리
https://velog.io/@kimhscom/JavaScript-%EC%9E%90%EC%A3%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-ES6-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC

 

  1. 기본 매개 변수 (Default Parameters)
  2. 템플릿 리터럴 (Template Literals)
  3. 멀티 라인 문자열 (Multi-line Strings)
  4. 비구조화 할당 (Destructuring Assignment)
  5. 향상된 객체 리터럴 (Enhanced Object Literals)
  6. 화살표 함수 (Arrow Functions)
  7. Promises
  8. 블록 범위 생성자 Let 및 Const (Block-Scoped Constructs Let and Const)
  9. 클래스 (Classes)
  10. 모듈 (Modules)

 

.

개발자가 필히 알아야 할 ES6 10가지 기능

https://blog.asamaru.net/2017/08/14/top-10-es6-features/

 

개발자가 필히 알아야 할 ES6 10가지 기능

ES6(ECMAScript 표준의 6번째 에디션, ECMAScript2015)에 대한 이야기를 하기 전에 자바스크립트와 ECMAScript에 대한 것부터 간략히 소개한다. 넷스케이프(Netscape)에서 1995년 개발한 자바스크립트(javascript)

blog.asamaru.net

ES6(ECMAScript 표준의 6번째 에디션, ECMAScript2015)에 대한 이야기를 하기 전에 자바스크립트와 ECMAScript에 대한 것부터 간략히 소개한다.

넷스케이프(Netscape)에서 1995년 개발한 자바스크립트(javascript)는 웹 브라우저에서 동적인 기능을 제공하기 위한 언어다. 현재는 대부분의 브라우저에서 이 언어를 제공하고 있다. 그런데 표준 규격없이 여러 브라우저에서 독자적인 특성이 추가되면서 호환성 문제가 발생하기 시작했다. 이에 ECMA 국제 기구에서 “ECMAScript Standard”라는 표준을 만들게 되었다. 정확히 이야기 하자면 현재의 자바스크립트는 ECMAScript와 BOM(Browser Object Model)와 DOM(Document Object Model)을 포괄하는 개념이다.

개별적인 설명에 앞서 개발자가 필히 알아야 할 ES6 10가지 기능을 나열하자면 아래와 같다.

  1. 기본 매개 변수 (Default Parameters)
  2. 템플릿 리터럴 (Template Literals)
  3. 멀티 라인 문자열 (Multi-line Strings)
  4. 비구조화 할당 (Destructuring Assignment)
  5. 향상된 객체 리터럴 (Enhanced Object Literals)
  6. 화살표 함수 (Arrow Functions)
  7. Promises
  8. 블록 범위 생성자 Let 및 Const (Block-Scoped Constructs Let and Const)
  9. 클래스 (Classes)
  10. 모듈 (Modules)

 

1. 기본 매개 변수 (Default Parameters)

var link = function (height, color, url) {
    var height = height || 50
    var color = color || 'red'
    var url = url || 'http://azat.co'
    ...
}

함수에 넘겨주는 인자값에 대한 default 처리를 위해 위와 같이 처리 했었다면 ES6에서는 아래와 같이 간단히 처리할 수 있다.

var link = function(height = 50, color = 'red', url = 'http://azat.co') {
  ...
}

단, 주의해야 할 점이 있다. 인자값으로 0 또는 false가 입력될 때 두 예시의 결과는 다르다. ES5에서는 || 처리 시 0 또는 false 값이 입력 되어도 거짓이 되므로 기본값으로 대체된다. 하지만 ES6의 기본 매개 변수를 사용하면 undefined 를 제외한 입력된 모든 값(0, false, null 등)을 인정한다.

2. 템플릿 리터럴 (Template Literals)

ES5에서는 아래와 같이 문자열을 처리해야 했다.

var name = 'Your name is ' + first + ' ' + last + '.'
var url = 'http://localhost:3000/api/messages/' + id

하지만 ES6에서는 템플릿 리터럴을 제공하므로 "`" (back-ticked) 문자열 안에 ${NAME}라는 새로운 구문을 사용해서 아래와 같이 간단히 처리할 수 있다.

var name = `Your name is ${first} ${last}.`
var url = `http://localhost:3000/api/messages/${id}`

3. 멀티 라인 문자열 (Multi-line Strings)

ES5에서는 멀티 라인 문자열을 처리하기 위해 아래와 같은 방법들을 사용해야 했다.

var roadPoem = 'Then took the other, as just as fair,\n\t'
    + 'And having perhaps the better claim\n\t'
    + 'Because it was grassy and wanted wear,\n\t'
    + 'Though as for that the passing there\n\t'
    + 'Had worn them really about the same,\n\t'

var fourAgreements = 'You have the right to be you.\n\
    You can only be you when you do your best.'

하지만 ES6에서는 "`" (back-ticked) 문자열을 이용해서 아래와 같이 간단히 처리할 수 있다.

var roadPoem = `Then took the other, as just as fair,
    And having perhaps the better claim
    Because it was grassy and wanted wear,
    Though as for that the passing there
    Had worn them really about the same,`

var fourAgreements = `You have the right to be you.
    You can only be you when you do your best.`

4. 비구조화 할당 (Destructuring Assignment)

ES5에서는 구조화된 데이터를 변수로 받기 위해 아래와 같이 처리해야 했다.

// browser
var data = $('body').data(), // data has properties house and mouse
  house = data.house,
  mouse = data.mouse

// Node.js
var jsonMiddleware = require('body-parser').json

var body = req.body, // body has username and password
  username = body.username,
  password = body.password

하지만 ES6에서는 비구조화 할당을 사용해 아래와 같이 처리할 수 있다.

var {house, mouse} = $('body').data() // we'll get house and mouse variables

var {jsonMiddleware} = require('body-parser')

var {username, password} = req.body

주의할 점은 var로 할당하려는 변수명과 구조화된 데이터의 property명이 같아야 한다. 또한 구조화된 데이터가 아니라 배열의 경우 {} 대신 []를 사용해서 위와 유사하게 사용할 수 있다.

var [col1, col2]  = $('.column'),
  [line1, line2, line3, , line5] = file.split('\n')

5. 향상된 객체 리터럴 (Enhanced Object Literals)

ES5에서는 아래와 같이 JSON을 사용해서 객체 리터럴을 만들 수 있었다.

var serviceBase = {port: 3000, url: 'azat.co'},
    getAccounts = function(){return [1,2,3]}

var accountServiceES5 = {
  port: serviceBase.port,
  url: serviceBase.url,
  getAccounts: getAccounts,
  toString: function() {
    return JSON.stringify(this.valueOf())
  },
  getUrl: function() {return "http://" + this.url + ':' + this.port},
  valueOf_1_2_3: getAccounts()
}

위 예시와 달리 serviceBase를 확장하길 원한다면 Object.create 로 프로토타입화하여 상속 받을 수 있다.

var accountServiceES5ObjectCreate = {
  getAccounts: getAccounts,
  toString: function() {
    return JSON.stringify(this.valueOf())
  },
  getUrl: function() {return "http://" + this.url + ':' + this.port},
  valueOf_1_2_3: getAccounts()
}
accountServiceES5ObjectCreate.__proto__ = Object.create(serviceBase)

accountServiceES5ObjectCreate와 accountServiceES5는 동일하게 사용할 수 있으나 다른 구조를 가진다. accountServiceES5ObjectCreate는 accountServiceES5와 다르게 __proto__  port  url 속성을 가진 객체를 담고 있다.

ES6에서는 아래와 같이 처리할 수 있다.

var serviceBase = {port: 3000, url: 'azat.co'},
    getAccounts = function(){return [1,2,3]}
var accountService = {
    __proto__: serviceBase,
    getAccounts,
    toString() {
     return JSON.stringify((super.valueOf()))
    },
    getUrl() {return "http://" + this.url + ':' + this.port},
    [ 'valueOf_' + getAccounts().join('_') ]: getAccounts()
};

위 예시에 대해 ES5와의 차이를 요약하면 아래와 같다.

  • __proto__ 속성을 사용해서 바로 프로토타입을 설정할 수 있다.
  • getAccounts: getAccounts, 대신 getAccounts, 를 사용할 수 있다 (변수명으로 속성 이름을 지정).
  • [ 'valueOf_' + getAccounts().join('_') ] 와 같이 동적으로 속성 이름을 정의할 수 있다.

조금 더 자세한 내용을 보고 싶다면 gsfe/es2015features 를 참고하자.

6. 화살표 함수 (Arrow Functions)

화살표 함수는 항상 익명 함수이며 this의 값을 현재 문맥에 바인딩 시킨다.

아래의 예시는 화살표 함수가 지원되지 않는 ES5에서 this를 사용하기 위한 처리 예시다.

var _this = this
$('.btn').click(function(event){
  _this.sendData()
})

다음은 위 예시를 화살표 함수로 대체한 ES6 예시이다.

$('.btn').click((event) => {
  this.sendData()
})

다음은 ES5에서 call을 사용하여 context를 logUpperCase() 함수에 전달하는 또 다른 예제다.

var logUpperCase = function() {
  var _this = this

  this.string = this.string.toUpperCase()
  return function () {
    return console.log(_this.string)
  }
}
logUpperCase.call({ string: 'es6 rocks' })()

ES6에서는 화살표 함수를 사용하면 _this 를 사용할 필요가 없다.

var logUpperCase = function() {
  this.string = this.string.toUpperCase()
  return () => console.log(this.string)
}
logUpperCase.call({ string: 'es6 rocks' })()

화살표 함수가 한 줄의 명령문과 함께 사용되면 표현식이 되어 명령문의 결과를 암시적으로 반환한다.

ES5에서의 처리 예시.

var ids = ['5632953c4e345e145fdf2df8','563295464e345e145fdf2df9']
var messages = ids.map(function (value) {
  return "ID is " + value // explicit return
});

ES6에서의 처리 예시.

var ids = ['5632953c4e345e145fdf2df8','563295464e345e145fdf2df9']
var messages = ids.map(value => `ID is ${value}`) // implicit return

여러 개의 인자를 사용하는 경우는 변수 목록을 () 로 감싸줘야 한다.

ES5에서의 처리 예시.

var ids = ['5632953c4e345e145fdf2df8', '563295464e345e145fdf2df9'];
var messages = ids.map(function (value, index, list) {
  return 'ID of ' + index + ' element is ' + value + ' ' // explicit return
});

ES6에서의 처리 예시.

var ids = ['5632953c4e345e145fdf2df8','563295464e345e145fdf2df9']
var messages = ids.map((value, index, list) => `ID of ${index} element is ${value} `) // implicit return

또한 본문을 괄호로 감싸 객체 표현식을 반환할 수 있으며 ... 을 이용해 가변 파라미터를 사용할 수도 있다.

var ids = ['5632953c4e345e145fdf2df8','563295464e345e145fdf2df9']
var messages = ids.map((value, index, ...abc) => ({v:value, i:index, a:abc}))

7. Promises

ES6에서는 표준 Promise가 제공된다.

아래는 setTimeout 을 이용한 지연된 비동기 실행에 대한 ES5 예시다.

setTimeout(function(){
  console.log('Yay!')
}, 1000)

위 예시를 ES6에서 Promise를 사용해서 재작성하면 아래와 같다.

var wait1000 =  new Promise(function(resolve, reject) {
  setTimeout(resolve, 1000)
}).then(function() {
  console.log('Yay!')
})

위 예시를 화살표 함수를 사용해 재작성한 예시는 아래와 같다.

var wait1000 =  new Promise((resolve, reject)=> {
  setTimeout(resolve, 1000)
}).then(()=> {
  console.log('Yay!')
})

ES5 보다 ES6의 Promise를 사용한 예시가 더 복잡해 보이지만 아래와 같이 중첩된 setTimeout 예시를 보면 Promise의 이점을 확인할 수 있다.

setTimeout(function(){
  console.log('Yay!')
  setTimeout(function(){
    console.log('Wheeyee!')
  }, 1000)
}, 1000)

아래는 ES6 Promise 로 작성된 예시.

var wait1000 =  ()=> new Promise((resolve, reject)=> {setTimeout(resolve, 1000)})

wait1000()
    .then(function() {
        console.log('Yay!')
        return wait1000()
    })
    .then(function() {
        console.log('Wheeyee!')
    });

조금 더 자세한 내용을 보고 싶다면 Introduction to ES6 Promises – The Four Functions You Need To Avoid Callback Hell 또는 gsfe/es2015features 를 참고하자.

8. 블록 범위 생성자 Let 및 Const (Block-Scoped Constructs Let and Const)

let과 const는 중괄호("{}")로 정의된 블록으로 유효 범위(스코프)를 지정하는 새로운 var이다. 단, let은 변수를 const는 상수를 선언한다.

function calculateTotalAmount (vip) {
  var amount = 0
  if (vip) {
    var amount = 1
  }
  { // more crazy blocks!
    var amount = 100
    {
      var amount = 1000
      }
  }
  return amount
}
console.log(calculateTotalAmount(true))

위 예시의 결과는 1000 이다. var는 전역 또는 함수 내부로 유효 범위를 갖기 때문에 예시에 사용된 함수 내부의 "{}" 들은 아무런 역할을 하지 못한다. 아래는 위 예시에서 var를 let으로 바꾼 ES6 예시다.

function calculateTotalAmount (vip) {
  var amount = 0 // probably should also be let, but you can mix var and let
  if (vip) {
    let amount = 1 // first amount is still 0
  }
  { // more crazy blocks!
    let amount = 100 // first amount is still 0
    {
      let amount = 1000 // first amount is still 0
      }
  }
  return amount
}
console.log(calculateTotalAmount(true))

이 예시의 결과는 0 이다. let 으로 선언된 변수는 "{}" 블록 내부로 유효 범위가 한정되므로 100, 1000으로 할당된 변수는 해당 블록 내부에서만 유효하기 때문이다. if 블록 내부에서 let으로 선언된 amount 또한 해당 if 블록 내에서만 유효하므로 아무런 변경이 일어나지 않는다.

아래의 예시는 const를 사용한 예시다. const는 상수를 선언하는 것으로 여러번 선언될 수 없지만 let과 같이 블록 내부로 유효 범위가 한정되므로 아래의 예시는 오류가 발생하지 않는다.

function calculateTotalAmount (vip) {
  const amount = 0
  if (vip) {
    const amount = 1
  }
  { // more crazy blocks!
    const amount = 100
    {
      const amount = 1000
      }
  }
  return amount
}
console.log(calculateTotalAmount(true))

9. 클래스 (Classes)

ES6에는 class 키워드가 추가되어 ES5의 prototype 기반 상속보다 명확하게 class를 정의할 수 있다. get  set 키워드 외에도 static 키워드를 사용해 static 메소드를 정의하는 것도 가능하다.

class baseModel {
  constructor(options = {}, data = []) { // class constructor
        this.name = 'Base'
    this.url = 'http://azat.co/api'
        this.data = data
    this.options = options
    }

    getName() { // class method
        console.log(`Class name: ${this.name}`)
    }
}

constructor 는 class 내부에 하나만 존재할 수 있으며 메소드 정의에 function 또는 콜론(":")이 더이상 필요하지 않다. 단, property의 경우 메소드와 달리 생성자에서 값을 할당해야 한다.

또한 아래의 예시와 같이 class NAME extends PARENT_NAME 형식으로 상속이 가능하다. 상속시 부모 생성자를 호출하기 위해 super() 를 사용할 수 있다. 생성자가 아닌 메소드에서는 super 키워드를 사용해서 부모 메소드에 접근한다.

class AccountModel extends baseModel {
    constructor(options, data) {
      super({private: true}, ['32113123123', '524214691']) //call the parent method with super
      this.name = 'Account Model'
      this.url +='/accounts/'
    }

    get accountsData() { //calculated attribute getter
      // ... make XHR
      return this.data
    }
}

class 는 get  set 키워드를 사용할 수 있으며 선언된 함수는 아래와 같이 사용할 수 있다.

let accounts = new AccountModel(5)
accounts.getName()
console.log('Data is %s', accounts.accountsData)

위 예시를 실행하면 아래와 같은 결과를 얻을 수 있다.

Class name: Account Model
Data is %s 32113123123,524214691

10. 모듈 (Modules)

ES6 에서 모듈을 공식적으로 제공하기 전까지는 CommonJS, AMD, RequireJS 등의 비공식 모듈 스펙을 사용해 왔다. ES6에서 제공하는 모듈 스펙은 기존과 유사하지만 차이가 있다.

ES5에서 CommonJS를 이용해서 모듈을 사용하는 예시는 아래와 같다(module.js).

module.exports = {
  port: 3000,
  getAccounts: function() {
    ...
  }
}

main.js 파일에서 위에서 정의한 모듈을 불러서 사용하는 예시는 아래와 같다.

var service = require('module.js')
console.log(service.port) // 3000

여기서 부터는 ES6의 import  export 를 사용해서 유사한 기능을 구현한 예시다(module.js).

export var port = 3000
export function getAccounts(url) {
  ...
}

main.js 파일에서는 import 를 사용해서 module.js 모듈을 불러올 수 있다.

import {port, getAccounts} from 'module'
console.log(port) // 3000

위와 유사하지만 export 된 모든 변수를 아래와 같이 하나의 구조화된 데이터로 받을 수도 있다.

import * as service from 'module'
console.log(service.port) // 3000

ES6 당장 사용할 수 있는 방법 (Babel)

ES6는 확정되었지만 아직 모든 브라우저에서 완전하게 지원되지 않는다. 따라서 지금 당장 ES6 사용하고 싶다면 Babel과 같은 컴파일러를 사용해야 한다. Babel은 독립 실행형 도구로 실행하거나 빌드 시스템에서 사용할 수 있다. Grunt, Gulp  Webpack 용 Babel 플러그인이 있다.

ES6의 기타 특징

참고로 이 외에도 여러가지 특징이 있으니 관심이 있다면 git.io/es6features를 번역한 ECMAScript 6 Features를 참고하면 된다.

반응형
반응형

frontend-evolution

 

https://github.com/ManzDev/frontend-evolution

 

GitHub - ManzDev/frontend-evolution: Frontend Evolution timeline (1995-2019)

Frontend Evolution timeline (1995-2019). Contribute to ManzDev/frontend-evolution development by creating an account on GitHub.

github.com

https://velog.io/@teo/full-stack-developer#%ED%92%80%EC%8A%A4%ED%83%9D-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C%EC%9A%94-%EA%B5%AC%EA%B8%80%EC%97%90%EA%B2%8C-%EB%AC%BC%EC%96%B4%EB%B4%A4%EC%8A%B5%EB%8B%88%EB%8B%A4

 

풀스택 개발자에 대해서 어떻게 생각하나요?

혹시 풀스택 개발자에 대해서 어떻게 생각하시나요?? 프론트도 재밌고 백엔드도 재밌는데 둘다 하려고 하니 T자형 개발자가 되기 힘들고, 또 "풀스택개발자는 상상속 유니콘이다" 라는 말도 있

velog.io

 

반응형

+ Recent posts