본문 바로가기

지원 로그

[보이저 X] 소프트웨어 엔지니어 인턴십 지원 후기

Prelude 1/13

취준을 하면서, 한국의 알짜배기 기업들에 대해 좀 들어보게 됐다. 이 기업들은 프로세스가 빡세서, 합/불합과 무관하게, 지원하는 과정에서 타이트하게 준비를 하면서 내가 원하는 기업을 위한 매우 효과적인 매개로 쓸 수 있다. 물론 합격을 한다면 추가적인 고려가 가능하기도 하다.

 

 

서류 전형 1/13

공고도 매우 특이한 점이, 특정한 질문들을 미리 공개했다. 

 

질문들은 일반적으로 Computer Science를 전공했다면 알만한 개념들이 많았다.

 

[ ] PNG와 JPG의 차이점은?
[ ] Dynamic Programming이란?
[ ] Virtual Memory란?
[ ] Semaphore란?
[ ] Cache란?
[ ] Garbage Collection이란?
[ ] Database Index 추가의 장단점은?
[ ] NoSQL의 장단점은?
[ ] 공유기의 원리는?
[ ] HTTP/2의 특성은?
[ ] 비대칭 암호화란?
[ ] Node.js의 특징은?
[ ] HDD, SSD, DRAM 각각의 성능은?
[ ] Memory Leak 디버깅은?
[ ] GIT의 장점은?

 

이 질문들에 잘 답변할 수 있는지를 자문하도록 했다. 만약 잘 답변할 수 있으면 지원하라고. 매우 흥미로웠다.

 

그러나 데이터 엔지니어 관련 공고가 없었다. 어차피 시뮬레이션이기에 소프트웨어 엔지니어로 지원했다.

 

여기서 또 특이했던 점은, 지원하는 다른 인터페이스가 따로 없었고 이메일로 지원서를 받았다.

그런데 며칠 지난 뒤 다시 봤을 때, "이미 마감된 공고입니다"라고 되어있었다.

어차피 밑져야 본전이라 그냥 강제로(?) 지원했는데,

 

서류 제출 당일날

 

서류 합격 메시지가 왔다. 엄청 빠른 프로세스였다.

당일날 면접시간을 몇가지 찝어서 보내드렸는데, 역시나 한 시간도 안 되어 1차 면접 시간이 확정되었다.

 

보통 서류 다음 단계는 코딩테스트를 보는데, 이 회사는 특이하다 싶었다.

 

 

면접 1/20

잡플래닛을 보니, 면접을 본 사람들 중 합격이 5%. 최종 입사가 5%가 아니고, 전체 지원자 중 5%가 아니고.

면접단계까지 간 사람 중 합격자가 5%. 역시 면접 대비로 딱이다.

 

기존 후기들이 몇개 없었다. 구글링으로 그간 물어봤다는 질문들을 모두어보았다.

 

1 대체로 CS 관련 질문이 많다는 것 같았다. 그래서 CS 전반에 걸쳐서 전방위적으로 리뷰 및 추가 공부를 했다.

특히나 컴퓨터 구조 수업은 들은지 6년이 지났기 때문에, 열심히 리뷰했다. 간만에 하니 재미도 있더라.

 

2 남세동 대표님이 중요하다고 했다는 질문 세트 - 구글링 해보면 나옴 - 에 대해 답변을 전부 준비했다.

 

3 내 이력 관련해서, 내가 쓴 언어나 툴에 대해서 추가로 공부를 했다. 특히 Python, Parquet 등.

 

※ 2, 3번에 대한 답변은 아래에 적어둠.

 

4 회사 관련해서도 좀 공부를 해갈까 했지만 안 해갔다. 1차에서는 그런 것들을 크게 많이 안 보는 것 같았다.

 

5 그리고 자기소개, 마지막 질문 등 - 마지막 할말은 요새 스타트업에서는 안 시키는 것 같지만 - 준비했다.

 

이 과정을 통해 확실히, 적어도 CS 관련해서는 더 이상 공부가 필요없을 정도로 성장해보자, 하는 마음으로 임했다.

 

이번 이 1차면접을 위해 준비한 CS 관련 자료를 모아보니 엄청난 양이 됐다.

모두 예상질문 - 답변으로 이뤄졌는데, 컴퓨터 구조, 네트워크, OS, DB 이렇게 준비했다.

 

그리고 화상으로 면접을 봤다.

 

두분이 들어오셨는데, 두분 다 엔지니어지만 한분은 끝까지 아예 질문 없으셨고, 나머지 한분이 질문을 몰아쳤다.

먼저 자기소개를 했는데, 자기소개의 내용은 거의 중요하지 않은 것 같이 느껴졌다. 애초에 1차에서는, 2차에 갈만한 사람인지를 CS 배경지식을 기준으로 평가할 거라고 했기 때문에 1차 면접에서는 정말 면접관 분들이 준비해온 질문에 대해 답변을 잘 하는 것 이외에는 중요한 것이 없는 것이 체감이 됐다.

 

몇개의 질문인지 셀 수 없을 정도로 많은 질문을 받았다. CS 질문이 주를 이뤘고, 개발하면서 알게 될법한 질문들도 꽤 있었다. 저런 리눅스, 혹은 깊은 OS, 그리고 python 뒷단의 내장함수 등의 구동 이런 것들은, 면접 준비를 한다고 해서 될만한 부분은 아닌 것 같았다.

 

- 1 Byte가 뭐죠?

- 1 Byte로 표현가능한 양수, 음수 범위?

- 1 Byte 짜리 실수값이 두개 있을 때, 이 두개를 어떻게 비교하죠?

- 부동소수점이 뭔가요?

- 부동소수점이 가진 문제가 뭔가요?

    - 오버플로우, 언더플로우가 부동소수점이 가진 문제가 맞나요?

- python에서 연산을 할때, 부동소수점 이슈 때문에 틀린 답이 나온다던가 하는 것에 대해 아는 게 있는지?

    - 0.1 + 0.2 = 0.3000000000001 이런 예시. 어떤 문제가 생기나요?

- base 64가 뭐죠?

 

- array와 linked list의 검색, 삽입, 삭제에 걸리는 시간복잡도 O(n)

- 새로운 array를 복제하는 과정이 어떻게 구동되죠?

- array에서 검색하는 데에 걸리는 시간이 O(1)가  가능한 이유는 뭘까요?

    - 예를 들어 5번째 엘리먼트에 접근한다면, 그걸 내부적으로는 어떻게 구동하나요?

- 그럼 python에서는 서로 다른 엘리먼트들을 하나의 list에 넣을 수 있는데, 어떻게 O(1)에 접근 가능한거죠?

- 정렬 알고리즘 2개 설명해주세요

    - 시간복잡도는 어떻게 되죠?

- 정렬 알고리즘 중 O(nlogn) 보다 빠른 알고리즘이 있나요?

- 세계에서 가장 빠른 정렬 알고리즘이 있다고 가정할 때, 해당 알고리즘의 시간 복잡도의 lower bound는 얼마일까요?

- 데이터가 대부분 0 이고, 일부만 1이라면 - 그러니까 일부 유저들만 1의 값을 가지고 있는데, 유저들의 로그가 다 필요한 경우에 이를 담는 자료구조로는 뭐가 좋을까요?

 

- OS 에서 동시성, 병렬성 이렇게 두개의 키워드에 대해서 설명해주세요.

- 뮤텍스와 세마포어의 차이는 뭘까요?

    - 바이너리 세마포어와 뮤텍스의 차이는 뭘까요?

    - 뮤텍스랑 세마포어에서 점유를 관리하는 주체는 각각 뭐죠?

- 가상 메모리를 왜 쓸까요?

    - 물리 메모리가 엄청 크고, 프로세스는 딱 하나일 때는 그럼 가상 메모리를 안 쓸까요?

    - 32bit와 64bit 시스템에서 프로세스가 가질 수 있는 virtual memory의 최대크기는 얼마일까요?

- 정렬 알고리즘을 쓸때 cpu 내부 레지스터 cache를 쓰면 기존보다 더 빠르게 실행가능한데, 그 원리가 어떻게 되죠?

 

- 네트워크에서의 멱등성이 무엇인지 정확히 뭔지 알고 계신가요?

 

- Virtual Machine과 컨테이너 이 두개가 내부동작이 어떻게 다른지 알고 계신가요?

- shell에서의 pipe가 뭐죠?

 

- interpreter vs. compiler 언어 차이점이 정확히 뭐죠?

    - python에서 코드를 실행하는 과정은 어떻게 진행되죠?

 

- MVC가 어떤 문제를 해결하기 위해 나온 것일까요?

 

- 스케줄링, 빌드 순서 관리 알고리즘은 뭐가 있을까요? 프로세스 스케줄링보다는 하이레벨.

 

- linux의 fork 함수의 내부 구동 방식이 어떻게 되죠?

 

 

 

 

일단 나는 후기들을 기반으로, 주어질 질문들의 50% 정도만 잘 대답하는 것이 목표였다. 결과적으로 한 그 정도 한 것 같기에 개인적인 목표는 이뤘다. 그러나 합이냐 불합이냐 하면, 솔직히 말하면 잘 모르겠고 관심도 크게 없다. 이 정도 수준에 대비하는 그 과정에서 내가 배우는 게 많을 것을 소기의 목표로 뒀기 때문에, 그에 만족한다.

 

이제 큰틀에서는 CS가 거의 준비됐고, 이제 리뷰를 하는 식으로 준비하고, 앞으로 다른 면접에서 새로이 나오는 질문들이 있다면 그것들을 보강해가는 식으로 준비하면 될 것 같다.

 

그리고 이력 기반을 얘기할 때, 적어도 Python에 대해서는 내장함수 등 디테일한 내용까지 공부해보도록 하자.

내장함수가 어떻게 구동되는지, 인터프레팅 등의 과정에서는 어떻게 되는지 등의 질문들을 확실히 준비하자.


2번 관련 준비한 질문들

 

a) 웹브라우저 URL에 http://www.naver.com을 치고 나서 네이버 첫페이지가 표시되기까지 일어나는 일을 본인이 알고 있는대로 최대한 상세하게 설명해 보라. 레이어를 아무리 내려가도 좋고, 설명이 아무리 길어져도 좋다. 10분 동안 해도 된다.


b) 동시사용자 최대 100명, 채팅방1개, 텍스트만 주고 받는 것이 기능의 전부인 최소 스펙의 채팅 서버를 데모가 가능한 정도의 안정성을 확보하는 수준으로 만들어야 한다. 어떤 언어로 몇줄 정도에 어느 정도 기간에 만들 수 있는가?

1 우선 데모가 가능한 정도라고 하면, 제외할 수 있는 기능들은 다음과 같음

고도화된 기능 - 메시지 암호화, 채팅방 구분 등
대규모 트래픽 처리 기능
UI/ UX

반면, 필수적인 기능들은 다음과 같음:
(1) 신뢰할 수 있는 클라이언트 연결
(2) 메시지 전송 및 브로드캐스트
(3) 비정상 데이터 수신 시 에러처리
(4) 테스트 환경
(5) 성능 검증 등

2 구현 방법

우선 100명의 경우는 TCP socket으로 클라이언트와 서버의 안정적인 통신이 가능할 듯.
그리고 동시에 여러 명이 말을 할 수 있기 때문에, 메시지를 보내는 시간을 최소화하기 위해, 동기적으로 작동하는 TCP 소켓을 비동기 처리 해줘야 함. 이때는 python의 asyncio를 활용.
브로드캐스트를 위해서는, 모든 클라이언트를 리스트 등의 자료구조에 저장하고, loop를 돌리면서 메시지 전달함.
역시나 asyncio의 비동기 I/O를 활용해 메시지 송신을 차단 없이 병렬적으로 처리.

만약 1000명 이상이 되면, TCP 기반으로 web socket 등의 방법이 필요할 듯함.
웹소켓은 응용계층, 즉 HTTP 연결을 하여 실시간 양방향 통신을 제공함. 한마디로 HTTP를 쓴다는 것.
또, 브로드캐스트를 하면 서버 부하를 초래할 수 있으므로 메시지 브로커 - Kafka, Redis Pub/Sub 등.
서버도 로드 밸런서가 필요하고, DB도 샤딩이 필요할 듯.

 


c) 디지털 시계 프로그램을 만들어야 한다. 초단위로 표시해야 한다. 어떻게 작성할 것인가? 그렇게 작성 하면 장점과 단점은 무엇인가?

while loop을 만들고, time과 datetime 라이브러리를 활용할 것 같다.
기본적으로 try except 정도의 큰 틀을 짜고, 해당 기능을 멈추고 싶다면 유저 인풋에 의해 while을 탈출할 수 있게 구현을 하고, while 내부에는 우선 datetime 라이브러리를 활용하여 print하는 기능과, time으로 1초를 세는 기능, 예를 들면 time.sleep(1) 을 활용해서 1초를 연장시킬 것 같음.

이때 장점은 구현이 쉽다는 점과 유지보수가 용이하다는 점, 단점은 1초를 time의 sleep에 의지하므로 시간 누적 오차가 발생할 수 있음. 이를 해결하기 위해서는, sleep 대신 다른 함수를 활용하면 되지 않을까? 그런 함수를 찾아볼 것 같음.



d) 전임자가 만든 어떤 프로그램이 있는데 생각보다 너무 느리게 동작하는 것 같다. 어떤 부분을 어떻게 보는 것이 좋을까?

우선 어디서 병목현상이 일어나는지를 확인하기 위해 프로파일링 도구를 사용.
CPU, 디스크, 프로세스 단이라면 작업 관리자를 확인.
CPU를 많이 쓴다면, 알고리즘을 최적화 혹은 병렬 처리.
메모리를 많이 쓴다면, 데이터 구조를 변경한다든가, GC 설정 조정 - Java, C++ 등
I/O의 문제라면, 비동기 처리 적용.
DB 성능의 문제라면, 쿼리 최적화 등.

 

 

f) 압축이란 것은 어떻게 하는 것일까? 손실 압축과 비손실 압축의 차이는 무엇일까?

기본적으로는 기존의 정보를 함축적으로 담을 수 있는 다른 형태의 자료로 변환하여 압축을 진행하고,
손실압축이 가능한 경우에는 불필요하거나 덜 중요하다고 판단되는 데이터를 과감히 제거함으로써 진행.

손실압축은, 정보를 제거함으로써 데이터 크기를 줄이는 것. 압축 해제 시 원본 복원이 불가능함.
압축률이 높아 데이터 크기를 크게 줄일 수 있음. 고로 대규모 데이터 처리에 유리.
ex) JPEG, MP3 등, 양자화

비손실압축은, 압축 해제 시 원본 복원이 완벽히 가능함.
민감한 데이터 등에 적합함.
ex) ZIP, PNG 등, 허프만 코딩



g) 피보나치 수의 함수 f(n)을 작성하는 여러가지 방법에 대해서 떠오르는대로 모두 얘기해 보라.

기본적으로는 top-down과 bottom-up 방식이 있음.

top-down은 재귀적으로 구현함. initial value에 대해서 탈출조건을 구성하고, return을 f(n-1) + f(n-2) 로 구성.
이렇게 구현하게 되면 각각의 값이 반복적으로 필요한 경우가 생김. 그래서 O(2**n)의 시간복잡도를 가짐.

이때 dynamic programming의 일종인 memoization을 활용. 각 값에 맞는 f값을 저장하기 위해 리스트를 활용함.
O(n)의 시간복잡도로 개선됨.

bottom-up 방식은 그냥 반복문으로 작성.
1과 2에 대한 값은 미리 테이블에 넣어두고, 이후 반복문을 진행하면서 나오는 값들을 테이블에 저장해가면서 진행.
애초에 중복이 없으므로 O(n)의 시간복잡도를 가짐.

테이블을 안 쓰고, 파이썬의 교환방식을 활용해도 됨. 이 경우 가독성이 떨어지지만, 공간을 최소화함.

 


h) 데이터베이스에서 인덱스와 관련하여서 생각나는 기술적인 내용들에 대해서 모두 얘기해 보라.

인덱스는 DB 테이블에서 특정 열에 대해 검색 속도를 높이기 위해 사용하는 데이터 구조.
특정한 데이터의 위치 정보를 저장하고, 쿼리 실행 시 인덱스를 먼저 탐색하여 효율적으로 접근 가능.

다양한 구현방식이 있지만,  RDBMS에선 B-Tree 즉 균형잡힌 트리 형태로 많이 사용됨.
NoSQL에서는 해쉬 형태로 많이 사용되는 것으로 앎.

인덱스의 종류는 클러스터형 인덱스, 그러니까 데이터의 물리적 저장 순서를 인덱스 순서와 동일하게 유지.
비클러스터형 인덱스, 저장 순서와 무관하게 인덱스를 구성.
텍스트 인덱스, 텍스트 검색에 최적화, 예를 들어 검색 엔진, 자연어 검색 등.

장점은 검색 속도 향상하고, order by 혹은 group by 연산을 빠르게 진행 가능하게 함.
또한 쿼리 분석 explain을 통해 DB 성능을 극대화할 수 있음.
단점은 쓰기 작업 시 인덱스에 대한 비용이 추가되므로 시공간적 오버헤드 발생.

 


j) 좋아하는 IDE에서 자주 사용 하는 기능들 또는 특별히 좋은 기능들에 대해서 얘기해 보라.

VScode.

통합 터미널 - IDE 내부에 터미널이 내장되어 있어 별도의 창 전환없이 명령어 실행 가능.
Git 통합 - git 상태를 실시간으로 표시하고, 커밋 등의 작업을 GUI로 지원.
코드 디버깅 - breakpoint 설정, 호출 스택, 변수 상태 등을 실시간으로 확인 가능.

그 외에도 협업을 위한 live share, 코드 포맷을 위한 prettier, TS 작업 시에 ESLint 등의 익스텐션이 유용함.

 

 

[ ] PNG와 JPG의 차이점은?

 

 

[ ] Dynamic Programming이란?

정의는, 복잡한 문제를 효율적으로 해결하기 위해 작은 여러 개의 문제로 나누고, 이를 결합하여 문제를 해결하는 방식.
크게 두가지 방법이 있는데,
1 중복되는 부분을 공통으로 뽑아서 그에 대한 함수를 만들 수 있고,
2 하위 문제들의 최적 솔루션이 모여 전체에 대한 최적 솔루션이 보장되는 경우, 하위 문제를 푸는 방식으로 진행.
이를 구현하는 방법으로는 Top-down: memoization, Bottom-up: Tabulation 의 두 가지 방식이 있음.

 


[ ] Virtual Memory란?

기존의 RAM에 배정된 메모리 만으로 프로세스를 진행하는 데에 부족할 때, 그 뒤쪽 보조저장장치 그러니까 HDD, SSD의 물리 공간을 차용하여 마치 물리메모리가 더 큰 것처럼 보이게 가상화 하는 것.
Page Table을 만들어서, 물리 주소와 가상 주소의 변환을 저장함. 변환 과정은 CPU의 MMU가 담당함.
가상 메모리와 물리 메모리를 동일한 크기의 페이지 단위로 나눔. 물리 메모리의 프레임에 매핑됨.
Page Table도 너무 크므로, 이에 대한 캐시를 만든 것이 TLB.

이게 너무 과하게 될 경우, thrashing이 발생할 수 있음.
페이지 폴트가 너무 자주 발생하여, 스와핑으로 인한 오버헤드로 인해 CPU보다 I/O 작업이 과하게 실행되는 현상.
가뜩이나 느린 I/O 작업이 더 많아지니까, CPU의 프로세스 작업이 거의 불가능에 가깝게 됨.

이를 해결하기 위한 방법으로는, 적합한 페이지 교체 알고리즘으로 바꾸거나, 물리 메모리에 적합한 프로세스만 실행.

 

※ 가상 메모리와 캐시 메모리 각각이 헛갈리니까, 각각에 맞는 키워드들을 한번 정리하기.

 


[ ] Semaphore란?

멀티쓰레딩 시 임계영역(Critical Section)에서 발생할 수 있는 Race Condition을 방지하기 위한 동기화 도구 중 하나. 카운팅 세마포어(Counting Semaphore)를 사용하여 특정 자원에 접근할 수 있는 프로세스 또는 스레드의 개수를 제한함.
각각의 스레드가 세마포어를 통해 자원에 대한 권한을 획득하며, 자원 사용 후에는 권한을 반환해야 함. 그러나, 권한을 점유한 스레드가 외부 인터럽트나 우선순위가 높은 프로세스에 의해 권한을 강제로 빼앗길 수 있는 특징이 있음.
비슷한 동기화 메커니즘으로, Mutex는 하나의 스레드만 자원에 접근할 수 있도록 제한하는 이진 락(Binary Lock) 제공.

 


[ ] Cache란?

캐시는 CPU와 메모리(RAM 또는 보조 저장장치) 사이에서 데이터를 빠르게 접근할 수 있도록 CPU에 더 가까운 위치에 일시적으로 데이터를 저장하는 공간입니다.
필요한 데이터가 캐시에 이미 저장되어 있을 경우 캐시 히트(Cache Hit), 그렇지 않을 경우 **캐시 미스(Cache Miss)**라 부릅니다. 캐시 미스가 발생하면 데이터를 메모리 또는 저장장치에서 가져와 캐시에 저장한 후 처리합니다.
이 과정에서 캐싱 알고리즘이 사용됩니다:
LRU(Least Recently Used): 사용된 지 가장 오래된 데이터를 제거하고 새로운 데이터를 캐시에 저장.FIFO(First In First Out): 가장 먼저 캐시에 들어온 데이터를 먼저 제거.비교: LRU는 캐시 히트 비율을 높이는 데 효과적이지만, 구현 난이도가 다소 높을 수 있습니다.
캐시는 CPU와 메모리 간 데이터 접근 속도를 개선하여 시스템 성능을 크게 향상시키는 중요한 역할을 합니다.

 

 

[ ] Garbage Collection이란?

garbage collection이란, 그러니까 프로그램이 실행될 때 동적 메모리 할당이 발생하면, 추가된 메모리는 프로세스 메모리의 힙 영역에 저장되는데, 이 메모리가 수명을 다한 이후 (더 이상 프로그램에서 필요하지 않는 상태) 이를 garbage로 규정하고 해당 데이터들을 제거하는 작업을 말함.
수명이 다했다는 것은 참조를 더 이상 받지 않는지 여부를 확인하여 mark. 그러나 이 경우 순환참조의 경우를 빼먹을 수 있다는 이슈가 있음. 이를 해결하기 위해 cyclic garbage collector를 활용함.
이렇게 필요없는 데이터를 제거하고 나서는, 필요에 따라 메모리를 연속적인 형태로 변경하기도 함.

메모리 관리를 자동화하고 안정성을 높이는 데 유용하지만, 시스템 성능에 영향을 줄 수 있음.

 


[ ] Database Index 추가의 장단점은?

장점으로는, 첫째, 쿼리 성능이 향상. 데이터베이스는 인덱스를 통해 검색 속도를 빠르게 하고, 특히 WHERE, JOIN, ORDER BY와 같은 조건이 포함된 쿼리에서 효율적으로 데이터를 찾을 수 있음.
둘째, 정렬 및 필터링 작업의 효율이 증가. 인덱스는 데이터를 정렬된 상태로 유지하거나 특정 조건으로 데이터를 빠르게 필터링할 수 있도록 도와줌.
반면, 단점으로는, 첫째, 쓰기 작업의 성능이 저하. 데이터를 삽입하거나 수정, 삭제할 때마다 인덱스도 함께 업데이트해야 하므로 추가적인 오버헤드가 발생.
둘째, 메모리 소비가 증가. 인덱스를 관리하기 위해 메모리를 사용하므로, 메모리가 제한된 환경에서는 성능 저하의 원인이 될 수 있음.

 


[ ] Memory Leak이 뭐고, 디버깅은?

Memory Leak은 동적으로 할당된 메모리가 해제되지 않아 발생하는 문제로, 프로그램이 장시간 실행될수록 시스템 자원이 고갈되는 원인이 됩니다. C/C++ 같은 언어에서는 malloc과 free를 올바르게 사용하지 않거나, 순환 참조로 인해 발생할 수 있습니다. Python이나 Java 같은 GC 기반 언어에서도 순환 참조로 인해 누수가 발생할 수 있는데, 이를 해결하기 위해 약한 참조(WeakReference)나 GC를 활용합니다.

 


[ ] git의 장점은?

분산 버전 관리 - 인터넷 없어도 로컬에서 브랜치 생성 및 커밋이 가능.
속도가 빠름 - 대규모 프로젝트에서도 빠르게 커밋, 브랜치 관리, 머지 가능.
PR, 코드 리뷰, 충돌 해결 등의 협업 도구 제공.
코드 변경 이력 추적 기능 제공.
커뮤니티와 생태계.

 

Python 관련 지식

 

python 관련한 내용이 많으니까, python에 대한 이해도 깊이 하고 가야할 것 같음.

 

Q list와 tuple의 차이? 각각 가변성, 불변성

Q set을 사용할 때 중복 제거는 어떤 매커니즘으로 이뤄지나요? 해시 기반으로 진행

Q len()은 어떻게 동작하나요? 객체의 __len__() 메서드 호출

Q enumerate()는 반복 가능한 객체에 인덱스를 추가하여 반환

Q zip()은? 여러 이터러블의 요소를 튜플로 묶어서 반환, 만약 길이 다르면 짧은 이터러블 기준으로 반환

 

Q sort와 sorted에서 쓰이는 방식은?

A

tim sort. 최악의 상황에 O(nlogn)인 매우 안정적인 분류 방식. 병합정렬과 삽입정렬로부터 파생.

 

Q 인터프리터 언어와 컴파일 언어의 차이는 뭐죠?

A

 

python은 인터프리터 언어. 한줄씩 실행됨. 런타임에 동적 타이핑과 같은 유연성을 제공.

.py로 작성된 코드는, 바이트코드로 컴파일되고, 인터프리터를 통해 실행됨. 어쨌든 인터프리터를 통해 실행되므로.

 

Q 이터레이터와 제네레이터는 무슨 차이죠? 그리고 제네레이터의 yield는 어떻게 작동하나요?

A

이터레이터와 제너레이터 모두 반복 가능한 객체를 생성.

이터레이터는 iter과 next 메서드를 정의해야 하므로 구현이 어렵지만, 제너레이터는 yield를 활용해 간단히 작성.

yield는 호출될 때마다 값을 반환하면서 함수의 상태 저장하고, 이후 실행 시 저장된 지점에서 재개됨.

모든 데이터를 로드하는 것이 아니라, 필요할 때 생성, 메모리 절약. 대규모 데이터, 무한 스트림과 같은 작업에서 효율적.

 

Q python의 메모리는 어떻게 관리되죠? GC는 어떤 식으로 구동되나요?

A

메모리를 관리하기 위해 heap space를 활용. 인터프레터가 스페이스를 관리하기 때문에 개발자도 접근 못함.

GC는 아까 정리함.


준비 안한 내용

 

1. PNG 포맷에서 투명을 어떻게 표현하나요?
  a. 하얀색 바탕위에 반투명 빨간색을 올리면 무슨 색이 되나요?
  b. 위 대답을 수식으로 일반화할 수 있을까요?
2. JSON으로 이미지를 전달하려면 어떻게 해야 하나요?
  a. 바이너리 그대로 전송할 때에 비해 용량이 얼마나 커지나요?
  b. 용량이 커지는 것 외에 어떤 단점이 있을까요?
3. 초단위의 간단한 디지털 시계를 구현한다면 어떻게 할 건가요?
  a. 그렇게 했을 때 어떤 단점 또는 문제점이 있나요?
  b. 그 점을 해결할 방법으로 어떤 것들이 있을까요?
4. 사용하고 계신 스마트폰의 해상도가 어떻게 되나요?
  a. 스크린 캡춰용 이미지 포맷으로 뭐가 좋을까요?
  b. 그 포맷으로 스크린 캡춰하면 용량이 어떻게 되나요?
5. 로그인용 암호를 관리자도 모르게 보관하려면 어떻게 하나요?
  a. 그런 용도로 좋은 함수들은 어떤 것들이 있나요?
  b. 동일한 암호가 다르게 보관되게 하려면 어떻게 하나요?
6. 네이버 홈페이지가 표시되기위해 몇개의 파일이 필요할까요?
  a. 그 파일들이 전송되는 순서가 어떻게 되나요?
  b. 그 파일들의 총 용량이 어느 정도 될까요?
7. 사용중인 컴퓨터의 메모리가 어느 정도 되나요?
  a. 실제 메모리가 충분히 커도 가상 메모리가 필요할까요? 
  b. 가상 메모리가 필요한 다른 이유는 어떤게 있을까요?
8. (파이썬 사용자) yield 키워드의 뜻이 무엇인가요?
  a. yield가 좋은 이유는 무엇인가요?
  b. yield의 내부 구현이 어떻게 되어 있을까요?
9. (리눅스 사용자) 쉘에서 파이프의 역할이 무엇인가요?   
  a. 에러는 파이프에서 어떻게 처리 되나요?
  b. 쉘을 만든다면 파이프를 어떻게 만들 수 있나요?

 

e) 메모리, 디스크, 네트워크의 성능과 관련되어서 알고 있는 숫자들을 모두 말해 보라.

i) 어떤 처음 접하는 프로그래밍 언어로 위의 b와 같은 서버를 만들어야 한다. 빠르게 해야 하는 상황이라면 공부 시간 포함해서 얼마나 걸릴 것 같은가?

 

[ ] Node.js의 특징은?

[ ] 공유기의 원리는?
[ ] HTTP/2의 특성은?

[ ] HDD, SSD, DRAM 각각의 성능은?

[ ] 비대칭 암호화란?

[ ] NoSQL의 장단점은?