앱은 내 기준에서 완성되었다. 마커와 경로 이를 파일로 관리하고 저장할 수 있게 하는 것이 핵심 기능이었으니. 하지만 앱을 빌드 하면서 예상치 못한 에러에 봉착했고 빌드를 하기 위해서 수없는 환경 세팅과 node_modules를 갈아 엎고 환경 세팅을 하는 등 일종의 삽질을 했다. 오늘만 그런 것이 아니기에 익숙했지만 내가 코드를 그만 짜게 된 것도 코딩 자체 보다는 환경 세팅에 코드에 쓸 집중력을 서서 재미가 없어진 거다. docker는 이 부분을 건드리고 react-native를 docker로 구축할까? 하지만 현재 문제를 해결했고 빠른 출시를 해야 되니 잠시 미뤄두기로 했다.
앱은 그렇게 어렵지 않았던 것 같았다. 인공지능에게 물어보면 어려운 기능이라고 소개 했다. 마커와 루트를 기록하고 파일 단위로 이를 저장하고 융합 할 수 있게 만드는 기술 말로만 들으면 어렵지만 본질은 데이터가 어떻게 흐르는지만 알면 된다.
export interface file{
title: string
description: string
routes: Route[]
markers: Marker[]
isRecord: boolean
currentRoute: Pos[]
}
이렇게 보면 결국 루트는 루트 폴더 안에 입력하면 되고
현재 루트 정보를 루트 안에 넣는다면 옮겨 주고 현재 루트는 초기화 해주면 된다
마커를 등록할때도 현재 루트는 최신의 위치 정보를 포함하고 있기에 마지막에 있는 값을 가지고 와 추가해주면 된다. 현재는 정확도에 이슈가 생겨 마커를 등록할때 위치를 가져와 등록하게 했지만 전에 한 방법이 api를 덜 호출하고 끝낼 수 있는 좋은 방안이라는 생각에는 변함이 없다.
그리고 이 파일을 저장하고자 하면 sqlite를 활용해 데이터를 저장한다. 데이터를 가지고 올때도 sqlite구조화 한 데이터를 가지고 오니 빨라지고 등록도 persist 기능을 제공하는 라이브러리를 활용하는 것보다 성능상의 이점과 코드의 간결함도 폴더 구조도 더 잘 만들 수 있다.
그래서 기술 자체로는 완벽했고 나도 테스트 이후에 잘 되는줄 알았다. 그렇게 react-native 로 빌드를 하고 만들어준 apk파일을 공유하고 친구에게 테스트를 맡겼다. 난 하루는 더 기다려야 할 줄 알았지만 답변은 바로 왔다.
마커와 루트 를 선택하는데 바로 튕겨 그래서 v3에서 삭제를 권유 했어
처음 들었을때 내가 뭘 잘못했는가 싶었다. 난 이렇게 잘 만든 것 같아서 칭찬을 기대했던 것인데 버그라니 이게 무슨 소리야!
그때서야 난 내 앱을 에뮬레이터에 설치하고 테스트를 진행했다. 처음에 위치 추적 권한과 알림 권한을 요청하지 않았고 내 위치에서 경로도 그려지지 않으며 마커와 루트를 클릭했을때 바로 튕겼다. 난 전에 짠 코드를 테스트 해보지 않고 바로 빌드를 돌렸다. 이 정도면 잘 돌아갈 것이다. 방심했던 것이다. 코드도 기술도 결국 사용되어야 하기 때문에 테스트는 필수적이다. 난 앱이 돌아가기도 전에 테스트를 하지 않았던 것 그저 빌드만 하면 자동으로 돌아갈 것이라는 착각에 친구에게 꾸중을 받고 다시 앱 수정에 들어가게 됬다.
친구에게 피드백이 왔다. 2년 전에 나온 아이디어였고 난 이를 구현하고자 했지만 그때는 돌아가기 위한 코드 작성에 급급했고 성능과 백그라운드 위치 추적도 없었다. 현재 코드를 지금 보자면 이해는 할 수 있지만 보기는 싫은 코드였다. 전에 코드를 그 전전에 코드를 보면 볼 수록 내 코드를 보기 싫어졌다. 폴더 구조도 명확하지 않고 데이터가 어디에서 어디로 흐르는지 recoil를 사용했지만 객체로 관리하지 않고 각각으로 구분하여 하나가 변경되면 여러 컴포넌트의 의존성에 발생되어 성능의 문제가 생겼던 것도 그래서 난 다시 만들기로 한 것이고 이 앱이 1개월 안에 코드로 만들게 되어 앱을 프로토타입 까진 만들 수 있었다.
ui와 디자인 성능 그리고 사용자 경험 전반적으로 모든 것이 나아졌고 내가 다음에 봐도 누군가가 보더라도 이해하기 쉬운 코드를 작성했다고 스스로 생각한다. 어떤 코드도 그렇게 어렵지 않고 알고리즘을 활용하는 것도 아니고 변수명으로 이름짓기를 잘한 덕분에 안에 데이터의 흐름이 한 파일을 향해 가게 되는 것도 (context) 유지보수에 이점을 가지게 된다.
그리고 결국 난 라이브러리도 개발 전에 설계하여 추가했고 이후 라이브러리는 크로셀과 react에서 자동생성이 안되어 uuid생성을 위한 get-random-value 의 라이브러리 셋만을 설치했다.
난 코드는 문제 해결 능력에 달려 있다 본다. 여러 프로그래밍 언어와 라이브러리 파이썬을 써도 웹을 만들 수 있고 이는 자바도 c++도 c도 rust go 등등 다양하다. 하지만 웹 개발을 위해 c를 쓰지 않듯이 각자의 영역에서 쓰이는 언어의 특징 또한 다르다. 프로그래밍 언어 하나를 잘 다루는 것은 그리 어렵지 않지만 웹개발을 잘 하는 것은 여러 프로그래밍 언어를 다루는 것보다 어려운 것이다. 왜냐면 기술적인 영역은 명확한 해결책이 있지만 비즈니스는 문제를 일으켜야 하기 때문이다. 웹개발이 가치를 가지게 된 것도 결국엔 돈이 되기 때문인 것이고 현재 채용시장에서도 개발자를 잘 뽑지 않고 다른 직군 마케팅과 디자이너에게 더 관심이 가게 된 것도 이 이유에서라고 본다. 전에 부트캠프에서도 개발자를 뽑고 교육만 시켰다면 현재는 게임 개발자, 프로젝트 매니저, 인공지능, 빅데이터 등 여러가지가 생긴 것을 보면 이익을 위해 움직인다는 것을 알았다. 더 이상 개발자가 실력만을 가지고 살아남기가 힘들듯 개발자는 문제 해결을 위해 언어를 쓰는 사람이 되어야 한다는 것 그리고 문제를 스스로 발견하고 혹은 일으키면서 변화를 발생시켜야 한다는 것을 알게 되었다.