초보 개발자가 실력을 키우려면

모 커뮤니티에 초보 개발자가 실력을 확 늘리려면 무엇을 해야하는지에 대한 질문과 함께 아래 항목 중 어느 것이 좋을지 추천을 해달라는 글이 올라왔다.

  • 내가 만들고 싶은 앱을 기획, 개발, 디자인까지 혼자 다 해본다
  • 기존에 있는 앱을 카피해본다
  • 릿코드를 많이 풀어본다
  • 인턴으로 취직해본다
  • 수업만 열심히 듣는다. (방학 포함)

의외로 첫 번째 항목을 추천하는 사람이 가장 많았다. 내가 보기에 이건 오히려 가장 나중에 해야할 것으로 보인다. 어느 정도 자신만의 작업 흐름을 구축하고 일정 수준 이상의 생산성을 발휘할 수 있는 시점에서야 도전해볼만한 것이 1인 개발이라고 생각하기 때문이다. 경험이 없는 상태에서는 기획, 디자인만으로도 상당히 많은 시간을 써야한다. 정작 중요한 개발 이슈보다는 잘못된 기획이나 디자인 때문에 코드 갈아엎느라 상당한 시간을 쏟게 될 가능성이 크다.

프로젝트를 통해서 실력을 키우고자 한다면 기존에 있는 앱을 기능 구현 위주로 카피해보는 것이 좋다고 본다. 아주 단순해보이는 걸로. 간단해보이는 앱이라도 제대로 하나 만들려면 신경써야하는 부분이 아주 많다. 예를 들어, 그냥 배경 이미지에 텍스트가 있는 목록을 하나 보여주기만 하는 앱이라 하더라도 여기에는 스크롤을 고려한 UI 설계, 네트워크/디스크 작업을 위한 비동기 처리, 페이징 처리, 에러 핸들링, 뷰 캐싱(e.g RecyclerView), 이미지 로더가 필요하다. 목록에 새로운 항목을 추가하는 기능이 있다면 당연히 삭제하는 기능도 따라가게 된다. 삭제 기능은 대부분 개별 삭제, 선택 삭제 두 가지 방식을 지원하게 된다. 새로운 항목을 중간에 삽입하려면? 기존 항목들의 순서를 바꿀 수 있게 하려면? 여기에 또 정렬이 들어가면 어떨까? 초보 개발자라면 이런 기본 기능만으로도 엄청난 삽질을 하게 될 것이다. 그런데 기획, 디자인까지 같이 하겠다고 덤비면 무엇하나 제대로 하기 힘들어진다. 밤새면서 시간도 많이 쓰고 머리도 많이 쓰고 고민도 많이 하고 그랬던 것 같은데 개발 실력은 별로 늘지도 않았고 결과물은 기획도 이상하고 디자인도 조잡하고 이도저도 아닌 엉망진창인 코드일 뿐일 확률이 매우 높다. 기존 앱을 카피하는 프로젝트도 결과물만 놓고 보면 비슷할 수 있다. 하지만 기획이나 디자인에 신경쓰는 시간 대신, 구현에 더 집중하고 개발 과정에서의 시행착오를 더 많이 겪어볼 수 있고, 그로부터 더 많이 배울 수 있다.

사실 위 항목들 중 그 무엇도 실력을 ‘확’ 늘려주지는 못한다. 한가지만 골라서 ‘빡세게’ 하다보면 뭔가 되지 않겠느냐는 흔한 착각. 나도 학생때는 비슷한 생각을 했다. 바이블같은 책을 딱 한 권 추천 받아서 오직 그 책 하나만 붙들고 독파해봐야지 하는 그런 것. 틀린 방법이다. 이 책도 보고, 저 책도 보고, 다른 사람들은 어떻게 하는지도 봐야한다. 수업도 열심히 들어야하고 프로젝트도 해보고 릿코드도 풀어봐야한다.

릿코드를 풀다보면 프로그래밍을 통해 해결하려는 문제를 어떻게 접근해야할지를 배울 수 있고, 언어의 기본 라이브러리가 제공하는 다양한 자료구조를 알 수 있다(만약 이런 것들을 거의 쓰지 않고 난잡하고 장황한 코드로 풀고 있다면 뭔가 잘못하고 있다는 신호다). 학교 수업을 열심히 들으면 그런 자료구조들이 구체적으로 어떻게 구현되고 이론적으로 증명되는지 배울 수 있다. 인턴을 해보면 실무에서는 어떻게 코딩을 하고 프로젝트가 진행되는지, 팀이란게 어떻게 돌아가는지 알 수 있을 것이다.

이런 것들을 하는 동안에는 별로 실력이 느는 줄도 모르겠고 정신없이 바쁘기만 한 것 같다는 생각이 들 수도 있다. 그러나 그런 경험들이 누적되다가 어느 수준에 도달하는 순간, 연결 지점에 닿는 순간, 갑자기 다른 세상이 보이게 될 것이다.

마지막으로 덧붙이고 싶은 말은 이런 것들을 혼자 하지 말라는 거다. 잘 하는 사람이 있으면 이것저것 물어보고, 수준이 비슷한 사람과 같이 공부하고 토론해보고, 다른 사람들에게 지식을 공유하고 도와주기도 하는 것이 안전하다.

Leave a Comment

Your email address will not be published. Required fields are marked *