티스토리 뷰

반응형

우아한테크코스는 배달의민족의 우아한형제들에서 1년동안 개발을 배우며 개발자로 성장할 수 있게끔 해주는 좋은 프로그램이다.
훌륭한 개발자가 되고 싶어 우아한테크코스 4기에 지원하였다.
우테코 선발 과정은 자기소개서 -> 1차 코딩 테스트 -> 프리코스 -> 2차 코딩 테스트 이다.

선발 과정에 대한 후기들을 작성해보려한다.

 

자기소개서 🧾

자기소개서는 5문항으로, 프로그래밍 역량, 몰입 경험, 지원 이유, 어떤 프로그래머가 되고 싶은 지 등의 질문이 있었다.

우테코는 교육을 위한 선발인만큼, 취업 시에 작성하는 자기소개서와는 다르다고 생각했다.

나 이만큼 잘한다 가 아니라 나 이만큼 열정있다! 를 보여줘야한다고 생각한다.

잘하는 사람을 뽑는 것이 아니라 열정이 있는 사람, 성장 가능성이 있는 사람을 뽑는 것이기 때문이다.

그런 이유에서 몰입 경험도 묻는 것이다.

 

이런 점을 자기소개서에 잘 드러낸다면, 뽑힐 수 있을 것이라 생각한다.

또 중요한 점은, 열정을 보여줄 증거를 제출하는 것이 중요하다고 생각한다.

나 열정 많아요. 라고 말은 누구나 할 수 있지만, 그것을 깃허브/포트폴리오/블로그 등으로 증거를 제출한다면, 신뢰성이 간다.

나는 자기소개서 경험이 없어서 글을 잘 못쓰는데도 불구하고 열정을 녹여내려 노력했더니 뽑힐 수 있었다.

그리고 다른사람에게 피드백을 받는 것도 중요하다. 나의 관점이 아닌 3자의 시선에서도 봐야 부족한 점을 알 수 있기 때문이다.

우테코 선발과정에서는 자소서가 엄청 중요한 것 같다. 다시 한번 말하지만 코딩을 잘하는 사람을 뽑는 것이 아니기 때문이다.

 

 

1차 코딩테스트 💻

1차 코딩테스트는 최소한의 코딩 역량을 가지고 있는지 확인하기 위해서 보는 시험이다.

아마 일정 기준 개수를 맞추면 통과하는 것 같다. 

그래서 어려운 알고리즘 문제라던지, 많은 생각을 요하는 복잡한 문제는 나오지 않는다.

최소한 코딩을 할 줄 알고, 어느정도의 구현을 할 줄 알면 풀 수 있는 문제들이 나온다.

크게 걱정을 하지 않아도 될 것 같다. 

 

 

프리코스 📁

3주간의 프리코스를 통해 많은 것을 배웠다.
이전 기수들의 후기들을 보면 프리코스를 통해 많이 성장했다는 글을 많이 봤다.
내가 몸소 겪어보니 많이 성장했다는 그 말에 아주 공감이 된다.
프리코스를 진행하면서 성장한 점이 아주 많지만 짧게나마 요약해보려한다.

미션을 코드로 구현하기전에는 깃허브의 리드미에 구현할 기능들을 작성해야했다.
이전에는 무작정 구현부터 시작했었는데 이 방법을 사용해보니 아주 효과적이었다.
예외 상황에 대해 고려하며 작성할 수 있어서 실수도 줄일 수 있었다.
또, 기능별로 구현을 하고 커밋을 기능단위로 할 수 있었다. 마구잡이로 구현했던 이전의 나를 반성하게 되었다.

코드를 작성할 때는 이전에는 고려해보지 못한 것을 고려하면서 작성해야했다.
자바 코드 컨벤션 을 지키면서 코드를 작성해본것도 처음이었고,
함수 15줄 이하, 인덴트 2이하 등 여러가지를 고려하면서 작성해야했다.

그러면서 거의 전무했던 자바의 람다와 스트림에 대해서 능숙하게 사용할 줄 알게 되었으며,
클래스/함수 쪼개기, 상수 사용 등 좀 더 좋은 코드를 작성하려 노력하면서 성장할 수 있었다.

또, 객체지향에 대해 더 공부하기 위해 '객체지향의 사실과 오해' 라는 책을 읽었다.
객체지향이란 정확히 뭘 말하는 것인지 머릿속에 정리할 수 있었던 좋은 책이었다.
여기서 배운 '객체에 메시지를 보내라' 를 내 코드에 적용하면서 결합도를 낮추고 응집도를 높이도록 노력하였다.

 

최종 코딩 테스트 👩‍💻

프리코스가 끝나고 드디어 최종 코딩테스트를 보게 되었다.
코로나19 상황 때문에 온라인으로 진행되었다.
3주간 프리코스를 하면서 많이 성장했음에도 최종 코테는 5시간이라는 짧은 시간내에 주어진 것을 구현해야했기 때문에 걱정이 되었다 ㅠㅠ..
최종 코테는 생각했던 것보다 더 난이도가 있었다.
하지만 그걸 고려하더라도 구현을 너무 못했던 것 같다.
아직도 많이 부족한 나를 뼈저리 느낄 수 있었다..ㅠㅠ

사실 정말 붙고 싶어서 속상한 마음이 컸다.
하루정도 우울해하다가 이내 마음을 다 잡으면서 든 생각이 있었다.
"내가 부족한 점을 알 수 있다는 것만으로도 정말 큰 수확이다."

부족한 점을 발견했다는건 그곳을 메꾸면 그만큼 성장할 수 있다는 말과 같다.
그래서 정확히 어떤 점들이 부족했을까, 왜 다 구현하지 못했을까 코드를 보며 고민해보았다.
부족한 점을 파악한 후에, 풀지 못한 최종 코테를 다시 구현해보고 싶었다.

많은 이유들이 있을 수 있지만, 제일 크게 내린 결론이 enum에 대한 응용 부족이었다.
enum을 알고는 있었지만, 어떻게 사용하는 것이 좋은지, 언제 사용하는 것이 좋은지를 몸소 알고 있진 않았던 것 같다.
특히 이전에는 C++을 자주 사용했기 때문에 enum은 그저 자바의 static final 같은 상수 같은 느낌이 박혀있었다.
enum을 사용하면 효율적일 상황에서 사용하지 않다보니 쓸데없이 시간을 많이 보냈다는 것을 깨달았다.

enum 공부를 이전에도 하면서 정리한 포스팅이 있다.
하지만, 직접 응용하면서 사용해보는 것은 또 다른 부분이었나보다.
그래서 enum을 어떻게/언제 사용하는 것이 효과적일까 예제를 보면서 다시 자세히 공부해보려했다.
그러면서 예전에도 봤던 이 글을 다시 보았다.
이전처럼 그냥 읽을때랑 다르게 최종 코테에서의 상황을 적용해보며 글을 읽었다.
https://techblog.woowahan.com/2527/

 

Java Enum 활용기 | 우아한형제들 기술블로그

{{item.name}} 안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 E

techblog.woowahan.com


어느정도 학습을 진행하고 최종 코테를 다시 풀어보았다.
내가 깨달았던 부분, 부족했던 부분을 어떻게 다시 풀어봤는지 정리해보았다.
최종 코딩 테스트 깃허브 레포 링크

데이터들 간의 연관관계 표현 및 상태와 행위를 한 곳에서 관리

위 글에서도 이 내용을 볼 수 있다.
최종 코테의 상황을 적용해보면, 대표적으로 메뉴에 적용해볼 수 있을 것 같다.
나는 최종 코테 당시 Menu 라는 클래스와 MenuItem 클래스를 만들었다.
ex) 1. 페어 매칭 -> MenuItem에서 "1"과 "페어 매칭"을 인스턴스변수로 관리하게 만들었다.
그 후에 MenuItem 객체들을 Menu 클래스에서 리스트로 관리하여 메뉴를 만들었다.

"1"과 "페어 매칭" 모두 같은 의미의 기능을 말한다.
위와 같이 구현할 경우, 사용자에게 메뉴를 입력받을때 매번 MenuItem 객체들에 접근하여 확인해야하는 번거로움이 있다.

또, 메뉴의 여러 기능의 각자 다른 동작을 구현할 때 너무 많은 if문(분기점)이 발생하여 좋지 않은 코드를 작성하게 된다.
최종 코테 미션의 경우 메뉴 기능이 다음과 같았다.
1.페어 매칭
2.페어 조회
3.페어 초기화
Q.종료

내가 구현했던 방법으로 구현한다면, 다음 코드와 같이 메뉴의 기능마다 if문을 작성하여야한다.

public boolean run() { if (selectedMenu.equals(Constants.MENU_PAIR_MATCHING)) { PairMatchingController pairMatchingController = new PairMatchingController(); pairMatchingController.run(); } else if (selectedMenu.equals(Constants.MENU_PAIR_RETRIEVE)) { PairRetrieveController pairRetrieveController = new PairRetrieveController(); pairRetrieveController.run(); } else if(selectedMenu.equals(Constants.MENU_PAIR_INITIALIZATION)) { PairInitializationController pairInitializationController = new PairInitializationController(); pairInitializationController.run(); } else if (selectedMenu.equals(Constants.MENU_EXIT)) { return false; } return true; }

위와 같이 번거로운 작업들을 enum으로 깔끔하게 정리할 수 있다.
먼저, enum으로 Menu를 만들었다.
자바에서 enum은 결국 객체이기 때문에 활용할 수 있는 부분이 많다는 것을 깨달았다.

public enum Menu { PAIR_MATCHING("1", "페어 매칭", new PairMatchingController()), PAIR_RETRIEVE("2", "페어 조회", new PairRetrieveController()), PAIR_INITIALIZATION("3", "페어 초기화", new PairInitializationController()), QUIT("Q", "종료", null); private final String character; private final String name; private final MenuActionController menuActionController; Menu(String character, String name, MenuActionController menuActionController) { this.character = character; this.name = name; this.menuActionController = menuActionController; } /* 코드 생략 */ public boolean run() { if (this == Menu.QUIT) { return false; } menuActionController.run(); return true; } }

"PAIR_MATCHING", "1", "페어 매칭"를 한 묶음으로 만듦으로써 데이터의 연관관계를 표현할 수 있다.
또한, enum에서 상태와 행위를 한번에 관리할 수 있다.
위에서 if문으로 나눴던 메뉴 기능들의 동작을 enum 한곳에서 구현할 수 있다.

먼저, 메뉴의 각 동작을 진행할 controller 클래스들의 interface로 MenuActionController을 만들어주었다.
MenuActionController에서는 run() 함수를 정의하여 이를 구현하는 클래스들은 모두 run() 함수를 오버라이딩해야한다.

각 controller 클래스들은 모두 MenuActionController을 구현하는 클래스이기 때문에 다형성을 이용하여
MenuActionController 타입으로 참조할 수 있다.
이를 이용하여 각 enum 객체의 생성자에서 해당 동작을 진행할 클래스를 넣어주면 된다.
그 후에 enum에 정의한 메서드에서 menuActionController.run()을 작성해주면, 각 메뉴 controller 클래스에서 오버라이딩한 run() 을 실행하게된다.

이와 같이 작성하면, 아까 enum을 사용하지 않았을 때보다 훨씬 효율적이고 가독성이 좋다.
새로운 타입을 작성하기에도 편하고, 새로운 객체를 생성하기에도 편하다.

Menu 뿐만 아니라, Course, Level, Mission 또한 enum으로 사용하면 비교적 쉽게 구현할 수 있다.
이에 대해 잘 알지 못했던 나의 지식 부족으로 구현에 성공하지 못한 것 같다.
학습을 한 후에 다시 풀어보니, 훨씬 쉽게 느껴졌다. 그만큼 성장했다는 것이니 뿌듯하기도 하면서 아쉬웠다. 😥



최종 코테 미션을 다시 구현해보면서 아쉬움과 동시에 배워가는 재미가 있었다.못풀었던 부분들을 작성한 후에 테스트 케이스를 모두 통과하는 것을 보면서 정말 재밌었다. 😮

최종 결과가 어떻게 나올지 기다려봐야한다.
혹시나 붙게 되면 정말 열심히 할 자신이 있지만, 너무 구현을 못한터라 걱정이 된다.
성장할 준비는 얼마든지 되어있지만, 운영진분들이 그것을 알아주실 수 있을지는 모르겠다..ㅠㅠ
그래도 1차 준비기간부터 프리코스, 최종 코딩테스트까지 약 두달 기간동안 최선은 다한 것 같다.
조금 더 잘할 수 있었을까 하는 아쉬움도 있지만, 너무 좋은 경험이었기에 이를 발판으로 더 성장해야겠다고 결심했다.
훌륭한 개발자가 되기에 정말 멀은 것 같다..! 열심히 노력하자 😎

 

+

불합격을 했다..! 아쉽지만 SSAFY가 붙었기때문에 SSAFY에서 열심히 할것이다. 좋은 경험이었다!😊

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday