[개발자를 직업으로 선택하신 이유가 무엇인가요?]
학생시절 개발을 처음으로 접하고, 고민하고 학습하며 기능을 만들었을 때의 충족감이 좋아서 개발에 관심이 생겼습니다. 이후 주변 친구들에게 개발로 인정을 받으면서 개발자에 대한 꿈을 키우기 시작했습니다.
하지만 직장생활을 시작하고 개발자라는 타이틀과 현실을 괴리를 경험하게 되었습니다.
개발자라는 이름을 쓰지만, 코드 보다 회의와 고객과의 미팅을 더 신경쓰고, 수많은 부서와 협력을 하면서 이윤이라는 공동 목표 앞에서 목소리를 내지 못하는 개발자의 모습을 많이 보게되었습니다.
현실 앞에서 잠시 개발자로서의 삶을 고민한 순간도 있었습니다.
일을 계속 하면서 사람과 관계를 가지고, 코드 외의 것들로 인정을 받으면서 제가 빠져있던 개발자라는 직업에 편견에 제 자신을 가두지 않기로 했습니다.
매일 변화하고 더 나아지는 자신에 대한 꿈을 품고, 새롭게 기술적인 전문성을 지닌 개발자로써 방향성을 잡고자 합니다.
이제는 기능을 만들때 충족감과 더불어, 사람과 협동을 하면서 일을 해낸다는 성취감, 어제에 나보다 더 나아졌다는 개발자로서의 충족감이 개발자를 직업으로 선택한 이유가 되었습니다.
[우리 회사에 지원한 동기가 무엇인가요?]
오늘 에딘트의 채용 세션을 보고서 감명받은 점은 3명의 뛰어난 각 분야의 전문가들과 함께 일을 할 수 있다는 점이었습니다.
물론 한명한명의 인력이 중요한 벤쳐기업 특성 상 교육을 받거나 지속적인 가르침을 받기는 어렵겠지만, 그럼에도 곁에서 보고 들으며 얻을 수 있는 경험이 많다고 생각했습니다.
두번째는 인원이 적은 벤쳐기업 특성상 개인의 경험폭이 넓다는 점입니다.
기술적인 배움이나 진로에 있어서 좁은 분야를 전문적으로 파고 드는것은 매우 중요하다고 생각합니다.
그만큼 기회가 있을 때 다양한 경험과 지식의 폭을 넓혀서 기반을 쌓아두는 것 또한 중요하다고 생각합니다.
전문 개발자를 지향하고 있지만, 제 시야를 개발에 국한시키기 않고, 서비스의 제공, 이윤의 추구, 사람간의 협업 등 다양한 가치를 중심으로 제 자신을 성장시키고 싶기 때문에 지원하게 됬습니다.
세번째는 4차 산업시대 중요 기술의 학습 가능성 입니다.
네트워크와 하드웨어의 발전으로 처리 대상 데이터와 성능은 점점 늘어나며, 이를 뒷바침 하기 위한 AI 기반의 소프트웨어 파워도 점점 발전하고 있습니다. 영상 데이터와 영상 처리 AI는 앞으로도 미래 산업의 중요 기술 포인트가 될 것이라 생각합니다.
물론 AI라는 핵심 기술의 중심이 되는것은 어려운 일이지만, 기술은 연결되어있듯이 AI 처리를 위해 필요한 프론트엔드, 백엔드 기술에 중심이 될 수 있다고 생각합니다.
[개발자로서 본인이 가진 장점 3가지를 근거와 함께 말씀해주세요]
첫번째는 2년간의 고객지원 경험을 통한 고객의 목소리를 듣는 개발자라는 것입니다. 개발자는 때론 자신의 기술을 맹신하거나 집착하는 경향이 있습니다.
일을 함으로써의 제 가치는 복잡한 기술이 아닌 고객이 원하는 제품과 서비스를 제공함을 더 중요하게 생각하고 있습니다.
자신의 결과물 만큼 고객의 요구사항과 피드백 그리고 트러블 슈팅을 소중이 하는 것이 제 장점입니다.
두번째는 협력을 중요시 하는 점입니다. 전 직장에서 가장 많이 했던 업무로는 영업과 함께 고객을 만나 요구사항에 대해서 이야기하고, 내부적으로 다른 개발자들이 만든 결과물을 테스트 하면서 트러블 슈팅을 하는 일이었습니다.
바라보는 관점이 다른 영업의 이야기에 귀기울이면서 개발부 또는 개인의 시야 뿐만 아니라 협동과 공동체의 가치를 공유할 수 있었습니다.
다른 사람의 결과물을 테스트하고 오류를 검출하는 과정에서 어떻게 하면 개인과의 관계에서 좀더 조심스럽게 협동 할 수 있었는지를 배울 수 있었습니다.
공동체로서의 협력과 개인간의 협동에 대한 자세가 제 장점입니다.
세번째는 기술의 제한을 두지않는다는 겁니다.
업력 20년이 넘은 회사에서 일을 하면서 15년도 더 전에 개발된 프로그램을 유지보수 했습니다.
스스로가 도태됨을 느끼면서 기술은 1년마다 변화한다는 이야기에 두려움을 가지기도 했습니다.
퇴사를 하고 새롭게 공부를 하면서 선택한 언어는 React이자 경험이 적은 Front-end 였습니다.
변화가 두려운 만큼 자신을 바꾸고 싶었기에 변화를 맞이하였고, 이제는 기술이 바뀌는 만큼 제 자신도 바뀌는 것을 알기에 변화를 받아들이게 되었습니다.
향후 목표는 Front와 Back을 전부 알고 있는 Fullstack 개발자가 되는 것입니다.
다만, Fullstack의 개념이 모호하고 현실에서는 몽상론에 가까운 것을 알고있습니다.
수십가지의 넓고 얇은 지식 보단 하나의 전문성이 더 좋다고 생각하기에, FullStack 개념대신 Web 개발자라는 범위의 전문성을 키우겠다는 목표로 성장하고자 합니다.
[앞으로 3개월/6개월/1년 동안 어떤 공부를 하실지, 왜 이러한 공부 계획을 세웠는지 말씀해주세요]
앞으로 3개월은 지금까지 진행한 레시피 프로젝트를 다시 구성할 예정입니다.
현재 비용 문제로 spring Server를 내린 상태로, spring 프로젝트와 엘라스틱 서치 구성을 자체적으로 진행 할 수 있는 수준까지 분석하고 구성하는게 목표이며,
React는 기존 라이브러리에 의존했던 이미지 압축 등의 기능을 직접 구현하고, 중복되는 컴포넌트 및 코드 분리 등 리팩토링에 치중할 생각입니다.
앞으로 6개월간은 기존에 진행한 레시피 프로젝트를 기반으로 반려동물 레시피 프로젝트를 진행할 예정입니다.
레시피 관련 사항 말고도 사료에 대한 정보와 영양제 관련 정보를 포함시켜 서비스를 런칭해보는게 목표입니다.
1년 동안은 서비스를 운용하며 들어오는 사용자 피드백에 따라서 서비스를 개선시키는 것으로 경험을 쌓을 예정입니다.
이번 항해를 진행하면서 기술적으로 깊게 파고드는 것도 중요하지만, 서비스를 런칭하고, 사용자의 실제 반응을 수집하여 고객에게 기술이 아닌 서비스를 제공하는 것이 중요하다는 것을 깨달았습니다.
단순 포트폴리오용 프로젝트가 아닌 서비스를 위한 프로젝트 경험을 쌓기 위해 공부 계획을 서비스에 맞춰 세웠습니다.
[React란 무엇인가요.]
사용자 인터페이스 개발을 위한 자바스크립트 기반 라이브러리입니다.
기존 html,css,javascript 로도 웹을 개발할 수는 있지만, 리액트의 다양한 특징들로인해 사용자와 상호작용 할 수 있는 동적 UI의 개발을 좀더 쉽게 할 수 있습니다.
앞서 말씀드린 다양한 특징으로는 Component 기반 구조, Virtual DOM, Props와 State, JSX가 있습니다.
React는 UI를 Component라는 단위로 쪼개고 내부적으로 데이터의 상태나 UI 구성에 대해서 Component 내부적으로 구성하고 Component를 호출하는 것으로 코드 재사용성을 높일 수 있습니다.
동적 UI에서는 수많은 사용자 상호작용이 일어나고, 그에 따른 화면의 재렌더링이 발생합니다.
Virtual DOM은 화면에 그려지는 DOM 구조를 가상으로 만들고, 실제 DOM 구조와 비교해 변경이 일어난 사항만 반영을 해 불필요한 Render를 통한 자원 낭비를 개선해줍니다.
Props 컴포넌트 구조에서 단방향 데이터 흐름에 따른 부모 컴포넌트가 자식 컴포넌트로 전달하는 데이터를 의미합니다.
State는 컴포넌트 내부에서 동적인 데이터를 다룰 때 사용되며, 사용자와의 상호작용을 통한 데이터의 동적 변경 및 렌더링 여부의 지표가 되기도 합니다.
JSX는 Javascript를 기반으로 HTML 태그를 사용할 수 있게 해주는 템플릿 언어입니다. 컴포넌트로 분리되는 React 특성상 html을 Javascript와 함께 component로 통합해 관리 할 수 있도록 해줍니다. 또한 변수 또는 State 등의 상태로 인한 동적인 페이지를 그릴 때, html의 변화를 좀더 직관적으로 다룰 수 있습니다.
[실전 프로젝트 기간의 기술적인 어려움이 있었는지, 그 어려움을 어떻게 해결하고 그 결과는 어땠는지 말씀해 주세요]
가장 어려웠던건 state와 rendering 이었습니다.
기존에 동적으로 변하는 화면을 다루기 위해 state에 list를 선언하는 것으로 화면을 그리는 데이터를 관리했습니다.
state로 그려진 화면에 onChange와 같은 이벤트가 들어가면서 문제가 발생했습니다.
이벤트에 따라서 list에 개별 요소가 변화하면서, state가 변경되니 전체 요소가 새롭게 rendering이 발생했습니다.
초기에는 이벤트가 문제라 생각해 useMemo, useCallback 등의 함수 재사용성을 강화시키는 기능을 사용해서 이벤트가 발생한 개별 요소에 대한 이벤트만 변경을 반영하고자 해봤습니다.
논점을 잘못 잡은 방식이었고, list로 그려진 input에 대한 focus를 상실하는 오류마저 생겼습니다.
이후에 화면을 그려주는 컴포넌트를 분리시키고, list 개수만큼 component를 호출하고, 내부적으로 Event를 처리하는 방식으로 해결을 했습니다.
해결 이후에는 수많은 화면 구조에서 변경이 발생한 부분만 render가 발생하도록 되었습니다.
이 경험을 통해 React의 동작 방식을 좀더 이해하고 사용해야겠다는 생각이 들었습니다.
[최근 공부했던 주제 중에 가장 자신있게 설명할 수 있는 것을 말씀해주세요]
비동기와 동기를 공부하면서 자바스크립트 엔진은 싱글 쓰레드를 기반으로 콜스택으로 올라온 실행문을 바로 처리를 한다는 내용을 읽었습니다.
명령을 순차적으로 처리한다는 내용에서 '자바스크립트는 인터프린터 언어라서 그렇구나'라는 생각을 했습니다.
인터프린터에 대한 내용을 좀더 검색하다보니 자바스크립트는 JITC(Just-In-Time Compilers) 개념으로 컴파일러와 인터프리터 방식을 병행해 사용한다는 것을 깨달았습니다.
인터프린터 방식의 단점으로는 개별 Line을 매번 번역을 하고 실행시킨다는 점에서 성능이 느려진다는 단점이 있었습니다.
특히나 For문 같이 반복되는 구조에서는 매번 동일한 명령을 다시 번역을 하는 문제가 존재합니다.
이러한 인터프린터 타입은 지도처리와 같이 동적으로 변화하는 자바스크립트 명령을 해석하는데 성능적으로 부적합했습니다.
JITC는 Javascript 엔진에 monitor라는 개념을 탑재하고, 코드의 실행 동작상태를 기록하도록 했습니다.
기록에 따라 많이 호출되는 함수는 컴파일되어 browser에게 보내지고 컴파일 된 내용이 저장됩니다.
어떤 코드가 매우 자주 호출되면 monitor는 코드를 최적화 컴파일러에 보내 더 빨리 실행되는 함수의 새로운 버전을 만듭니다.
즉 자바스크립트는 별도의 처리 엔진을 통해 컴파일 되며, 코드의 실행을 기록하고 자주 사용되는 코드를 별도로 컴파일 및 최적화 해 실행 성능을 향상시키는 방법을 사용합니다.
[async와 await에 대해 설명해주세요]
자바스크립트에 비동기 처리 문법으로 기존 callback이나 promise의 콜백 지옥, then() 지옥의 단점을 해소하고자 만들어졌습니다.
async를 함수에 접두어로 지정하면 Promise를 리턴하는 함수가 됩니다.
비동기 처리의 결과값을 원하는 곳에 await를 접두어로 사용하는 것으로 실행 중 Block을 걸어 동기 코드처럼 읽히게 해줍니다.