야곰 커리어 스타터 캠프를 회고하며

catcota·2021년 12월 11일
3

야곰아카데미에 대한 회고를 하기 전 이번 한 해 개발자라는 직업을 가지기 위해 무엇을 했는지 정리해 보았다.

  • 2021년 1월
    어떻게 하면 개발자가 될 수 있을지에 관한 정말 많은 유튜브와 글을 보며 나의 생각을 정리하는 시간을 가졌다.

  • 2021년 2월
    iOS개발자가 되고싶다는 목표를 세운 후 Swift, iOS관련 강의를 듣는 스터디를 만들고 스터디원을 모집했다.

  • 2021년 2-4월
    프로그래밍 공부는 정말 너무나 어려웠다. 한국어 강의를 듣는데 이게 영어인지 한국어인지 모르겠는경우가 정말 많았다. 이렇게 시행착오를 겪다보면 결국엔 알게되겠지만 그 시간을 줄이고 더 많은걸 배우고 싶다는 생각이 강하게 들었다.

  • 2021년 5월
    iOS와 관련된 여러 부트캠프를 찾아보았다. 당시에 내가 못 찾은 것인지 아님 최근들어 iOS관련 부트캠프가 많이 생긴건진 모르겠지만 그때 당시엔 많은 수의 부트캠프가 있진 않았다. 여러 고민 끝에 야곰아카데미에 지원하였고 사전과제와 면접을 진행한 후 5월 마지막 주 부터 캠프생활을 시작하였다.

  • 2021년 5-11월
    야곰 커리어스타터캠프에서 6개월간의 과정을 수료하였다.

야곰 커리어 스타터 캠프를 선택한 이유

  • 여타 다른 부트캠프와는 다르게 (커리어)스타터 캠프라는 이름이 진솔하게 느껴졌다. 스타터라니.. 개발자가 되고 싶어하는 차고넘치는 사람들에게 눈 먼 희망을 주며 결제를 유도하는 곳은 적어도 아니겠구나 하는 생각이 들었다. (너무 과몰입했던 것 일 수도 있다...ㅋㅋㅋ)
  • 부트캠프 수료 후 네카라쿠배에 간 수료생들을 홈페이지에서 보여주는 다른 부트캠트들과는 달리 당시 야곰아카데미의 소개 사이트는 정말 담백했다. 교육에 초점이 맞추어져 있는 느낌이 들었다.
  • 사전과제를 제출 한 후 받은 메일에서 야곰은 면접이 아닌 면담이라는 단어를 사용했다. 면담시간의 첫 마디도 감히 제가 00님을 평가한다는건 아닙니다 였다. 그 때 이 곳에 지원하길 잘했다는 확신이 들었다.
    iOS개발자로 업계에서 10년 이상을 일하며 iOS개발자가 되고 싶어하는 많은 사람들의 입문서로 여겨지는 책을 쓴 저자임에도 불구하고 이렇게 겸손하시다는게 정말 놀라웠다. 이건 내 생각이지만 자기 멋으로 꽉 차있는 사람은 겸손한 척 하는 말조차도 하지 못한다. 적어도 야곰은 그런 사람이 아니라고 느껴졌다.

야곰아카데미 후기가 많이 없는 이유
여담이지만 여러 부트캠프 후기를 찾아보았는데 야곰아카데미가 정말 전무하다 싶을 정도로 없었다. (내가 못 찾은 걸수도 있지만) 그 이유를 이제 알 것 같다. 우선 기수가 아직 많이 진행되지 않았고 후기작성은 정말 전적인 캠퍼들의 선택이기 때문이다.

야곰아카데미에서 배운 것

야곰아카데미에서 무엇을 배우는지에는 홈페이지에도 자세히 설명이 나와있으니 내가 어떤 것을 배웠는지 작성해 보려한다.

  1. 몰입하자. 하지만 매몰되진 말자
  • 처음 아카데미에서 공부할 땐 지금 내가 무엇을 공부해야하고 앞으로는 무엇을 공부할 것인지에 대한 계획이 한 눈에 보였기 때문에 공부 할 때 정말 재밌었다. 정말 시간가는 줄 모르고 공식문서를 읽으면서 잠들면서도 어떻게 하면 프로젝트의 요구사항을 구현할 수 있을까 고민했다.
  • 그러나 아무리 공부해도 어떤 개념이 이해되지 않는 상황을 만났을 땐 정말 내가 개발자가 될 수 있는 자격이 없다고 느껴졌다.(그 자격이 뭔지는 모르겠지만ㅜㅜ) 공부를 포기하고 싶었던 순간은 팀원과의 불화도, 개발에 대한 권태기도 아닌 바로 그런 순간이었다.
  • 하지만 그런 개념들은 언젠가 이해가 된다. (마치 테이블뷰delegatedataSource처럼..ㅜㅜㅋㅋㅋ) 중요한 것은 몰입하되 그 상황들이 나를 무력화 할 수 없도록 하는 것이다.
  1. 모르겠는건 즉시 공부하자.
    (부제 : 적어도 기록은 꼭 해야한다.)
  • 캠프 초기엔 공식문서 한 페이지를 보는데 체감상 3줄에 하나는 모르는 개념이나 단어가 꼭 나왔다. 하지만 뒤에 더 나오면 그 때 알아봐야지 하는 생각으로 읽었는데 이게 꼭 뒤에 내가 넘어간 개념과 연관된 내용들이 나왔다. 잠시 멈추고 내가 모르는 부분을 해결하고 가는게 결국 가장 빠른 길이라는 생각이 들었다.
  • 정말 아무리 읽어보고 이해하려 노력해도 이해되지 않는 개념에 대해선 잠시 내려놓는게 좋다. 하지만 정말 내가 깊게 공부했는지 꼼꼼히 체크해야 한다. 지금 내가 공부하기 싫고 귀찮아서 내려놓는 경우가 더 많기 때문이다. 쉽게 내려놓다보면 어느샌가 아무것도 제대로 알지 못하는 상태가 된다.
  1. 코드의 이유를 생각해라.
  • 내가 왜 이 코드를 작성하는지, 이 타입을 선택하고 구현했는지 설명하지 못 한다면 수 많은 선택의 기로에서 결정을 내릴 수 없다. 정말정말 중요하다. 잘 모르겠으면 잘 모르겠지만 이게 맞는 것 같다라는 이유라도 있어야 한다. 그래야 어떤걸 알고 작성했고 어떤걸 모르고 작성했는지 구분 할 수 있다.
  • 특히 디버깅 과정에서 오류가 생긴 기능과 연관된 코드를 검증하고 이 코드가 오류의 원인인지 아닌지 실험해야하는데 이유없이 작성한 코드로는 이게 정말 어렵다.
  • 현업은 마감기한이 있으니 매번 지키긴 어렵겠지만 그래도! 중요하게 생각해야하는 요소가 아닐까 하는 생각이 든다.
  1. 깊게 공부해야한다. 정말 깊게
  • 1번의 내용과 비슷한 맥락이다. 내가 아무리 노력해도 이해되지 않을 때 까지(혹은 더 공부할 시간이 없을 때 까지) 깊게 파야하는 것 같다.
  • 깊게 공부해야한다는 것은 야곰아카데미 동기 캠퍼에게 배웠다. (Shout out 루얀🎉)
  1. 절대적인 솔루션은 없다. 그것이 야곰의 조언일지라도
  • 사실 야곰의 조언은 틀린적이 없었다😉
  • 포인트는 다른 사람의 생각을 무작정 따라가선 안 된다는 것이다. 특히 코드에 있어서 이 부분이 더욱 중요한 것 같다. 서로의 이해가 없는 코드는 관계의 불협화음과 디버깅의 늪으로 가는 지름길이다.
  1. 휴식은 나에게 주는 선물이 아니라 절대적으로 지켜져야 하는 것이다.
  • 휴식이 없는 개발공부는 개발에 대한 열정을 팔아 사오는 시간들인 것 같다. 쉴 땐 쉬어야 한다.
  1. 생각의 공유는 곧 성장이다.
  • 내가 지금 하고 있는 고민은 누군가가 반드시 하고 있다. 대화의 장을 열고 집단지성을 이용하다보면 결국 문제는 해결되는 것 같다. 그리고 그 과정에서 나의 역량도 자연스럽게 성장하지 않을까?

여기까지 읽으신 분들은 왠지 이런 생각이 드실 것 같다.

그래서 이 캠프 듣고 나면 취업할 수 있다는거야 아니라는 거야

감히 나의 지식이나 경험으로는 취업에 대한 기준 제시가 어려우니 야곰아카데미 지원하면서 작성 한 코드와 수료 후 나의 코드를 공유해 보고자 한다.
(캠프 수료 후 각자의 실력은 정말 다양하니 이 코드들로 수료 후 역량을 일반화하진 말아주세요.🙇‍♀️ )

야곰아카데미에서 처음으로 작성 해 본 코드

당시엔 guard문을 작성하는 법을 몰라 모든 if문 마다 optional unwrapping을 해주었다.

 func receiveUserInput() -> Any {
        
        let input = readLine()
        
        if let inputs = Int(input!), inputs <= 1 {
            print("입력값이 잘못되었습니다. 다시 입력해 주세요 :", terminator: " ")
            return receiveUserInput()
            
        } else if let inputs = Int(input!), inputs > 1 {
            return inputs
        }
        else if let inputs = input, inputs == "exit" {
            return "exit"
        } else {
            return "wrong"
        }
    }

지금의 나

guard도 몰랐던 코린이가 어느정도 성장했는지 가장 직관적으로 볼 수 있는게 무엇일지 고민하다가 가장 최근에 진행한 프로젝트의 일부분, 리드미, 깃헙을 공유해 보면 좋을 것 같다는 생각이 들었다. 공부해야할 것들은 정말 한참많이 남아있고 내가 지금까지 배운 것들을 모두 완벽하게 알고있는 것은 아니지만 그래도 6개월간의 노력을 공유해 보고자 한다.

  1. 가장 최근에 진행한 모기업 사전과제에 Clean Architecture를 적용해 보았다. 아래는 구분한 레이어들인데 UseCase를 구현하지 않아도 되는 정도의 요구사항들이었기 때문에 Repository Pattern에 집중하여 구현하였다.
  • 에러는 사전과제 구현 시 중요한 부분이 아니라고 생각해서 상세하게 진행하지 않았다.
    사전과제 응시 기업의 정보가 노출되면 안되기 때문에 해당 부분들은 some이라는 키워드로 대체하거나 주석처리하였다.
  final class SomeDataNetworkService<EndPointType: EndPointable>: NetworkService {
	enum SomeURLs: String {
            case example = "www.-----"
        }

        private let apiKey = ///

        private var task: URLSessionDataTask?

        func request(with route: EndPointType,
                     and session: URLSession,
                     completionHandler: @escaping (/*DataDecodingModel*/) -> ()) {
            do {
                let request = try self.buildRequest(from: route)
                task = session.dataTask(with: request) { data, response, error in
                    if error != nil {
                        return
                    }

                    guard let data = data else {
                        print("NoData")
                        return
                    }

                    do {
                        let result = try Parser()
                                    .decode(data, 
                                            to: /*DataDecodingModel*/.self)
                        completionHandler(result)
                    } catch {
                        print(error)
                    }
                }
                self.task?.resume()
            } catch {
                print(error)
            }
        }

        func cancel() {
            self.task?.cancel()
        }
  }

      extension SomeDataNetworkService {
          private func buildRequest(from route: EndPointType) throws -> URLRequest {
              guard let url = URL(string: SomeURLs.example.rawValue) else {
                  throw NetworkError.invalidURL
              }

            var request = URLRequest(url: url)
            request.setValue(apiKey, forHTTPHeaderField: "Authorization")
            insert(queryItems: route.urlElements, to: &request)

            return request
        }

        private func insert(queryItems: GasStationURLQueryElements?,
                            to urlRequest: inout URLRequest) {
            guard let queryItems = queryItems,
                  let url = urlRequest.url,
                  var urlComponents = URLComponents(
                    url: url,
                    resolvingAgainstBaseURL: false) else {
                print("\(#function), Query Items Insertion Error")
                return
            }

            let convertedQueryItems = makeQueryDictionary(from: queryItems)
            urlComponents.queryItems = [URLQueryItem]()

            for (key, value) in convertedQueryItems {
                let queryItem = URLQueryItem(name: key, value: "\(value)")
                urlComponents.queryItems?.append(queryItem)
            }

            urlRequest.url = urlComponents.url
        }

        private func makeQueryDictionary(from urlQueryItems:
                                         SomeURLQueryElements) -> [String: Any] {
                return  /* Dicationary타입의 쿼리구성 요소 리턴 */
        }
    }
  1. 동기화 메모장 리드미 중 일부분 프로젝트 깃헙
  • 캠프기간 중 방학과 겹쳐 가장 많은 시간을 쓸 수 있었던 리드미. 데이터전달에 참여하는 타입들을 구현하고 코어데이터와 SplitViewController를 사용 하는 경험을 했다.


다시 5월로 돌아간다면, 난 야곰아카데미 커리어캠프에 지원할까?

무조건 할 것 같다. 다만 사전에 코드 스타터 캠프를 하거나 입문을 할 수 있는정도의 실력을 쌓은 후 지원할 것 같다. 프로젝트의 퀄리티나 배우는 양이 프로그래밍을 접한지 얼마 되지 않은 사람에겐 버겁기도하고 캠프의 전 과정을 스폰지처럼 쏙쏙 빨아들이기 위해선 어느정도의 기본이 필요하지 않을까 하는 생각이 든다.

야곰아카데미 캠프 종류

  • 아래 사이트에서 자세히 볼 수 있다. 커리어스타터 뿐 아니라 코드스타터 캠프도 있으니 둘 중 자신의 현재 상황에 맞추어 지원하면 좋을 것 같다.
    야곰아카데미

회고를 마치며

정말 좋은 사람들을 캠프에서 만났고 6개월간 같이 울고 웃으며 개발자라는 목표를 위해 노력했던 소중한 시간들이었다. 많은 사람들이 야곰아카데미에서 학습의 재미를 느끼고 개발에 몰입할 수 있는 기회를 가졌으면 좋겠다.

profile
to be iOS Developer

1개의 댓글

comment-user-thumbnail
2021년 12월 11일

'나는 비 전공자니까 못 하는 게 당연해' 라는 핑계를 댈 수 없게 만드는 고수 타코캣...❤️
6개월 동안 고생 많으셨습니다.
그리고 타코캣과 함께 3기 캠퍼로 활동할 수 있어서 너무 즐거웠고 늘 감사합니다.
싸랑해요 타코캣~~~🥰❤️

답글 달기