※제가 서술할 내용은 개인의 경험에서 느낀 지극히 주관적인 정보입니다. 틀린 정보가 있다면 언제든지 알려주시고, 모든 내용을 맹목적으로 수용하지 마시고 참고용으로만 읽어주시길 바랍니다.
개발자가 되려면 전공지식이 꼭 있어야 하나요?
복수전공을 하기 전, "전공자가 아니어도 개발자가 될 수 있나요?"라고 인터넷에 여러번 검색을 해봤던 기억이 난다. 인터넷 상에서 대부분의 대답은 "요새는 전공자가 아니어도 상관 없던데.."와 같은 반응이었다. 그 말은 지금 생각해보면 맞는 말이었다. 전공자가 아니더라도 개발자가 될 수 있다.
하지만 "개발자가 되려면 전공지식이 꼭 있어야 하나요?"라는 질문의 대답은 다르다. 개발자가 되기 위해서는 전공지식은 꼭 필요하다. 본전공자, 복수전공자, 부전공자, 비전공자 중 어떤 사람이든지간에 반드시 전공지식은 필요하다. 개인적으로는 본전공자일지라도 제대로된 전공지식이 없다면 좋은 회사의 개발자로 취업하기는 어려울 것이라고 생각한다.
그 이유는 바로 개발자가 하는 일이 단순히 코드를 작성하는 것만은 아니기 때문이다. 애플리케이션을 개발하고, 관리하기 위해서는 컴퓨터에 대한 전반적인 이해가 있어야 하기 때문에 좋은 기업들은 반드시 지원자의 전공지식을 검증한다. 아무리 많은 프로젝트 경험을 가지고 있더라도, 지원자가 전공 질문에 제대로 대답하지 못하는 경우 회사에서는 이를 "요란한 빈 수레" 케이스로 보고 탈락시키는 경우도 있다.
그러므로 반드시 학부시절 수업을 들을 때부터 열심히 듣고 정리해놓을 필요가 있다. 똑같은 과목을 사설 학원에서 들으려면 매우 많은 비용이 든다는 점을 생각해서라도, 한번 들을 때 확실히 듣기를 추천한다.
단연 모든 과목을 고루고루 많이 들으면 좋겠지만 그중에서도 면접 질문과 필기 시험에 필수적으로 등장하는 과목들이 있다. 이 5가지 과목들은 꼭 유의해서 나중에 필기시험 전이나 면접 전에 볼 수 있도록 공부 내용을 정리해놓길 추천한다.
과목이름 | 직무 | 중요도 | 주요내용 |
알고리즘 | 상관없음 | 상 | 정렬, 탐색, 그래프 탐색, Big-O 표기법 등 |
자료구조 | 상관없음 | 상 | 스택, 큐, 트리, 그래프, 힙, 해시테이블 등 |
네트워크 | 웹개발, 클라우드 등이라면 더 중요 | 중상 | OSI 7계층, TCP/UDP, 3-way Handshaking, DHCP, 웹통신 과정, HTTP 등 (+REST api, Json) |
데이터베이스 | DBA, 웹개발 등이라면 더 중요 | 중하 | 트랜잭션, 트랜잭션의 조건(ACID), join, 정규화 등 |
운영체제 | 상관없음 | 중하 | 데드락, 뮤텍스, 세마포어 등 |
직무에 맞는 프로그래밍 언어 과목 (ex. 자바) | 선택한 직무에서 주로 사용하는 언어로 선택 *예를 들어 웹개발은 자바, 게임개발은 C# 등.. |
상 | 자바의 경우라면 JVM, 오버라이딩, 오버로딩, 지시자, OOP 등 |
위의 표는 내가 필기시험과 면접에서 질문을 받은 빈도를 기반으로 정리한 내용이다. 일단 알고리즘과 자료구조는 두말할 필요 없이 면접에 가면 반드시 2번 이상 질문을 받았다. 정렬 방식의 시간복잡도는 거의 매번 물어보는 질문이었고, 탐색 방식과 그래프 탐색 같은 경우는 면접 질문으로는 물어보지 않았지만 필기 시험에서도 등장할 수 있고 많은 코딩테스트에 등장하는 개념이기 때문에 반드시 숙지해놓아야 할 것 같다. 또한 Big-O 표기법도 마찬가지로 같은 맥락에서 숙지해놓을 필요가 있다. 코딩테스트 볼 때 시간복잡도를 고려해서 코드를 짜야하기 때문이다. 그렇게 하기 위해서는 자신이 짠 코드에 대해서 최악의 시간복잡도를 바로바로 알 수 있어야 한다.
그리고 네트워크의 경우에는 웹개발을 하기 위해서는 애플리케이션 계층, 트랜스포트 계층 정도에 대해서 질문을 받아 보았고, 필기 시험에서는 네트워크 계층까지 출제되기도 했었다. 그리고 웹개발과 관련된 개념인 REST api나 Json에 대해서도 질문을 받아보았다. 이 두가지는 전공 외 지식이기 때문에 필기에서는 출제된 적 없었고, 개인 프로젝트 경험 내에서 관련된 내용이 있다면 보충하는 것이 좋겠다.
그리고 데이터베이스는 자주 질문을 받은 것은 아니지만, 가장 최근에 본 면접에서 질문을 받았고 필기시험에서 출제된 적이 있다. 주요 내용들이 그렇게 많지 않기 때문에 트랜잭션, 트랜잭션의 조건(ACID), join, 정규화, 인덱스 위주로 질문을 받았다.
운영체제는 스레드와 프로세스 차이는 면접에서 매번 물어보는 단골 질문이고, 그 외에는 면접에서는 물어본 적 없지만 필기시험에서 출제된 적이 있었다. 운영체제 또한 주요 내용들이 그렇게 많지 않아서 데드락, 레이스 컨디션, 그리고 그에 대한 해결방법을 위주로 질문을 받았다.
그리고 또 중요한 것이 자기가 지원한 직무에서 자주 사용하는 언어에 대해 심도있게 공부하기를 추천한다. 한가지 언어를 자신이 있을 정도로 공부해야 한다. 자신이 있다는 의미는 그 언어로 코드를 짜는 것도 짜는 것이지만, 언어의 특징에 대해 명확히 알고(자바라면 OOP는 무엇인지, 상속은 무엇인지 등 다른 언어와 비교했을 때 고유한 특징은 더 잘알아두기) 그 언어에서 지원하는 기본 라이브러리에 대해서 잘 알고 있는 것을 말한다.
면접이나 필기시험 과정에서 필요한 전반적인 지식 수준에서 보자면 전공 공부 했던 내용들을 잘 정리해놓고 주요 내용들을 위주로 리마인드해가며 준비한다면 문제 없을 것이라고 생각한다. (코딩테스트에서 필요한 알고리즘 공부는 학교에서 배우는 것 외에 따로 공부를 해야한다. 이것에 대해서는 다음에 따로 정리를 하겠다.)
배우긴 배웠는데 기억이 안나는데요..?
솔직히 몇학기 전에 배운 내용들은 금방 까먹는다. 아무리 학점을 잘 받아도 기억이 안나는 것은 어쩔 수 없다. 나는 공부를 할 때 정리해서 공부하는 것을 좋아해서, 모든 과목에 대해서 정리본을 만들어 두었다. 정리본 덕에 학점도 잘 받긴 했지만, 진정 빛을 발한 것은 취업준비 과정에서였다.
대부분 면접과 필기시험에서 물어보는 전공 부분은 학사 전공 과정에 포함되어있기 때문에 정리본만 보아도 기억이 떠오르면서 시험에 대비할 수 있다. 까먹은 부분은 다시 구글링하면서 이해한 부분도 있지만 어쨌든 전체 전공 목차에 대해서 다시한번 상기시켜주기 때문에 "무엇을 위주로 공부해야하지?"하는 당황스러운 상태에서 벗어나는 데에 도움이 된다. 컴퓨터 전공이 광범위하기도 하지만, 광범위하기 때문에 오히려 우리가 배운 범위를 벗어나서 질문을 하지는 않는다. 그 범위를 벗어난 질문을 받으면 사실 모르는게 당연하기 때문이다. (그리고 나도 모르면 경쟁자도 잘 모른다..) 그러므로 배운 내용에 대해서라도 확실히, 깊이 아는 것이 중요한 것 같다. 그게 많은 기업들에서 말하는 기초가 튼튼하다는 의미인 것 같다.
아직 전공 과목을 듣고 있다면, 꼭 한번 자기만의 방식으로 정리해보기를 추천한다. 인터넷 상에 많은 사람들이 정리해놓은 내용을 볼 수도 있겠지만 스스로 정리한 내용이 당연히 그 흐름이 이해가 잘될 뿐 더러, 인터넷 상에는 잘못된 정보들도 많고 또 전체 개요를 다 커버하는 블로그들은 많이 없다. 대부분의 글들이 다들 배우는 과정에서 정리용으로 쓰는 글이기 때문에 깊이가 얕은 글들이 많고, 단편적인 내용들이 많다. 일부의 사람들은 정보처리기사 책을 보면 된다는 의견들도 있는데, 개인적으로는 정처기 내용은 전공과목에서 배우는 내용보다는 깊이가 매우 얕다고 생각한다.
이미 수업은 다 들었고.. 정리해놓은 것은 없는데 어떡하죠?
이미 다 지나가버린 수업을 다시 들을 수는 없을 것이다. 하지만 다행이도 우리의 기억 한 구석에는 배웠던 전공 지식이 남아있다. 면접을 볼 때 그것을 끄집어내기 위해서는 주요 내용을 위주로 면접 예상질문을 만들고, 답변을 작성하면서 전공지식을 다시 리마인드하는 것도 좋은 방법이다. 당연히 미리 다 정리해놓은 경우보다 시간이 들고 지엽적인 내용까지는 커버하지 못할 수 있지만, 다시 전공책을 펴고 처음부터 정리하는 것보다는 훨씬 나을 것이다. 보통 이렇게 전공공부를 하는게 서류 합격하고나서 1~2주 내로 필기시험 혹은 면접을 봐야하는 경우이기 때문에 시간 제약을 고려한 응급처치라고 생각할 수 있겠다.
그러면 예상 질문을 어떻게 뽑아야할지 모르는 사람들도 있을텐데, 일단 전공책을 펴두고 쭉 뽑는 것도 좋다. 하지만 더 빠르게 하기 위해서는 인터넷에 "00 개발 직무 면접 예상 질문" 혹은 "00 개발 직무 면접 질문" 이런 식으로 검색해보면 여러가지 글들이 나올텐데 그 내용을 바탕으로 추리는 것도 나쁘지 않다.
나같은 경우에는 이미 정리해놓은 내용이 있기 때문에, 그 내용을 바탕으로 질문을 뽑아 예상 답안을 모두 정리해두었는데 물론 면접에서 한번도 질문받지 않은 내용도 있었지만 거의 이 범위를 벗어나는 질문을 받아본 적은 없었던 것 같다. 참고용으로 올리니 혹시나 필요한 사람이 있다면 참고하시길 바란다. (하지만 한번도 질문 받지 않은 지엽적인 내용도 있고, 알고리즘과 자료구조는 이미 숙달하고 있는 내용을 생략한 부분도 있기 때문에 올린 질문 안에서만 답변을 찾아다는 것은 추천하지 않는다.. 취사선택을 잘 하시고 개인적으로 보강하시길!)
목차 보려면 더보기 클릭!
운영체제
1. 멀티 프로그래밍 시스템과 멀티 프로세싱 시스템은 같은 것인가요? 8
2. 타임 쉐어링 시스템에 대해서 설명해보세요. 8
3. 인터렉티브 시스템에 대해서 설명해보세요. 8
4. 커널이 뭐죠? 8
5. 그럼 커널모드는 뭐죠? 8
6. 운영체제가 시스템에 존재하는 자원들의 현 상황을 어떻게 파악할까요? 9
7. 그럼 폴링은 뭐죠? 9
8. 인터럽트는요? 9
9. 인터럽트 종류는 어떤 것들이 있죠?9
10. DMA에 대해 들어본 적 있나요? 9
11. 프로세스와 스레드가 뭐죠? 9
12. 멀티 스레딩은 뭐죠? 스레드는 한개인가요? 10
13. 스케줄링에 대해 설명해보세요. 10
14. 알고있는 스케줄링 방법이 있나요? 10
15. 라운드 로빈 방식이 뭐죠? 10
16. 멀티 레벨 큐는요? 10
17. MFQ는요? 10
18. 병행성(concurrency)이 뭐죠? 11
19. 비동기성(async)은 뭐죠? 11
20. 동기화(sync)는요? 11
21. 임계영역이 뭔데요? 11
22. 상호배제(Mutual exclusion)가 뭐죠? 11
23. Race condition에 대해 들어봤나요? 11
24. 그럼 상호배제를 할 수 있는 방법에는 뭐가 있나요? 11
25. 세마포어에 대해서 더 자세히 설명해주세요 12
26. 뮤텍스에 대해 설명해주세요. 12
27. 모니터에 대해 설명해주세요. 12
28. 데드락이 뭔지 아세요? 12
29. 데드락의 기본원인 4가지를 얘기해보세요. 12
30. 데드락을 어떻게 해결할 수 있을까요? 12
31. 종료비용을 어떻게 최소화할 수 있을까요? 13
32. 단일 프로그래밍과 다중 프로그래밍의 차이가 무엇인가요? 13
33. 그럼 메모리를 어떻게 분할할 수 있을까요? 13
34. 그러면 고정분할에서 지정된 분할크기보다 프로그램이 크면 어떻게 해결할 수 있을까요? 13
35. 고정분할은 어떤 문제점이 있을까요? 13
35. 절대주소 지정과 상대주소 지정이 어떻게 다른가요? 13
36. 메모리 배치기법이 뭐죠? 14
37. 배치기법 종류가 뭐뭐있죠? 14
38. coalescing(병합)에 대해 들어봤나요? 14
39. compaction(통합)은요? 14
40. 사용중인 공간을 옮기는게 왜 부담인가요? 14
41. 버디시스템에 대해 알고 있으세요? 14
42. 가상메모리에 대해 설명해보세요. 15
43. 페이징 시스템에 대해서 더 자세히 설명해주시겠어요? 15
44. 그럼 페이징시스템에서 어떻게 가상주소를 실주소로 변환하죠? 15
45. 세그멘테이션 시스템은요? 15
46. 세그멘테이션이 공유와 보호에 장점이 있다는게 무슨 말이죠? 15
48. 배치(placement) 정책에 대해 설명해보세요. 16
49. 교체(replacement)정책에 대해 설명해보세요. 16
50. 지역성이 뭘까요? 16
51. 워킹셋에 대해 더 설명해주세요. 16
자료구조& 알고리즘
1. 스택에 대해 설명해보세요 16
2. 큐에 대해 설명해보세요 17
3. 그래프에 대해 설명해보세요 17
4. 트리에 대해 설명해보세요 17
5. 힙에 대해 설명해보세요 17
6. 연결리스트에 대해 설명해보세요 17
7. 배열에 대해 설명해보세요 17
8. 해시 테이블에 대해 설명해보세요. 18
9. 알고있는 탐색 방법이 있나요? 18
10. 알고있는 O(n^2) 정렬 방법이 있나요? 18
11. 알고있는 O(NlgN) 정렬 방법이 있나요? 18
12. 자릿수가 정해진 데이터들은 어떻게 정렬할 수 있을까요? 19
13. MST에 대해 알고 계신가요? 19
14. 문자로 이루어진 파일을 압축할 수 있는 알고리즘에 대해 알고있나요? 20
15. 다익스트라 알고리즘에 대해 알고있나요? 20
16. A*알고리즘에 대해 알고있는지? 20
17. BST에 대해 설명해보세요. 21
네트워크
1. 인터넷 프로토콜 스택에 대해 설명해보세요 21
2. OSI 7계층에 대해 설명해보세요. 22
3. http에 대해 설명해보세요 22
4. 사용자가 웹브라우저를 통해 서버에 이미지를 요청해서 사용자에게 보여주기까지 과정을 설명하세요 23
5. 그러면 서버와 클라이언트간의 TCP 연결은 하나의 요청을 보내면 바로 종료되는 것인가요? 24
4. 쿠키와 캐시에 대해 설명해보세요. 24
5. DNS에 대해 설명해보세요. 24
6. 그럼 DNS를 왜 분산시킬까요? 24
7. TCP, UDP에 대해 설명해주세요 25
8. UDP 체크섬이 뭘까요? 25
9. 파이프라인 프로토콜에 대해서 아나요? 25
10. go-back-N에 대해 설명해주세요 25
11. selective repeat에 대해 설명해주세요 25
12. TCP 통신에서 reliable data transfer를 할 때 어떻게 센더는 문제가 발생했다는 것을 알 수 있을까요? 26
13. flow control과 congestion control을 비교해보세요. 26
14. 3-way handshake에 대해 설명해주세요. 26
15. 4-way handshake에 대해 설명해주세요. 27
15. 네트워크 레이어의 기능에 대해 설명해 보세요 27
데이터베이스
1. 로그가 뭘까요? 27
2. 트랜잭션이 뭔가요? 28
3. 트랜잭션의 성질을 말씀해보세요. 28
4. 트랜잭션을 병행으로 처리하려고 할 때 어떤 문제가 발생할까요? 28
5. 데드락에 대해서 설명해보세요. 28
6. 그럼 데드락을 안 생기게 하는 방법을 설명해보시오. 28
7. COMMIT과 ROLLBACK에 대해 설명해보세요. 29
8. 정규화의 목적이 무엇인가요? 29
9. 각 정규화 단계를 설명해보세요. 29
10. 체크포인트 회복기법에 대해 설명해보세요. 29
11. 관계형 데이터베이스와 비 관계형 데이터베이스 차이점에 대해 설명해보세요. 29
12. 어떤상황에서 NoSQL을 쓰는 것이 더 적합한가요? 29
13. 인덱스에 대해 설명해보세요.29
이번 편에서는 취업준비 과정에서 중요하다고 여겨지는 전공 과목에 대해 정리해보았다. 이렇게 5가지 과목+자신있는 언어 1가지만 알고 있다면, 일단 면접을 보는데 큰 문제는 없었던 것 같다.
그렇다면 다른 과목은 들을 필요가 없을까? 당연히 아니다. 아직 학점에 여유가 있는 상황이라면 여러가지 심화과목들을 들으며 진로탐색도 하고, 프로젝트 경험도 쌓기를 추천한다. 자신이 어떤 분야의 개발자가 될지는 사실 모르는 일이고, 또 어떤 업무가 주어질지 모르기 때문에 일단 학부 수준에서 여러 분야에 대해 기초 수업을 들어두면 생소한 개발을 하더라도 시작하는데에 밑거름이 되는 경우가 있다. 나같은 경우에는 "데이터 사이언스" 과목을 들어둔 것이 인턴 생활 때 프로젝트를 하는 데에 큰 도움이 되었다. 언제 어떻게 도움이 될지 모르는 귀중한 수업이라고 생각하고 흥미가 있는 분야에 대해서는 최대한 넓게 많은 수업을 듣기를 추천한다.
다음 편에서는 프로젝트 경험과 인턴 경험을 왜, 어떻게 쌓아야하는지에 대해 경험에 비추어 써내려가 보겠다.
'1. 개발자가 될 수 있을까? > 개발자 취준 팁' 카테고리의 다른 글
[개발자 취준 팁] 3. 알고리즘 준비(코딩테스트) (0) | 2023.08.06 |
---|---|
[개발자 취준 팁] 2. 프로젝트 경험 및 인턴 (9) | 2021.02.03 |
[개발자 취준 팁] 0. 서론 (0) | 2019.09.25 |