하마
6k
2019-05-24 11:08:01 작성 2019-07-01 17:28:37 수정됨
5
4620

블록체인 개발사 면접 오픈북과 지원자의 답변 공유


미디움 (채용정보) 는 국내에서 몇 안되는 블록체인 플랫폼을 바닥부터 만들어 나가고 있는 개발사 입니다. 현재 완성도를 높히기 위해 개발에 박차를 가하고 있으며, 그 에 따른 채용을 하고 있는데, 질문을 오픈해서 구인 중입니다. (그 동안 뻘소리 하는 면접관들 많이 보셨죠? ) 

면접 오픈북 바로가기

okky 가족분들과의 지식 공유차 얼마전에 메일을 통해서 받은 답변을 공유하여 드립니다. 

(연차도 많지 않고 블록체인과 무관한 평이한 이력이시지만 그 동안 공부를 얼만큼 한건지 알 수 있는 열정에 감격을..) 

=========================================================

@ inheritance보다 Composition을 사용하라는 말은 무슨 의미인가요?

상속은 합성보다 유연성이 떨어집니다.

상속은 컴파일 타입에 부모 구현을 물려받습니다. 상속을 해버리면 구현부를 실행시간에 바꿀 수 없습니다.

상속한 구현이 새로운 문제에 맞지 않을 때 부모 클래스를 재작성 해야 합니다.

런타임에 다른 것으로 대체하기 힙듭니다.

하지만 합성은 합성한 객체만 런타임에 다른 객체로 대체 가능합니다.

 

예를 들어 전략패턴도 상속을 이용하는 Template Method 패턴과 합성을 이용하는 Strategy 패턴이 있습니다.

상속을 이용한 template method 패턴은 실행시간에 바꾸지 못하고 컴파일 시간에 정적으로 기능이 결합이 되어 교체하기 힘들어 집니다.

하지만 전략패턴은 상속이 아닌 합성을 이용하기 때문에, 컴파일 시간에 구현부가 결합되지 않고 실행시간에 구체 구현체를 교체가 가능합니다.

 

 

@ 주로 사용하는 리팩토링 3가지를 말해 주세요.

자주 사용하는 리펙토링 3가지는 메서드 정리, 클래스 정리, 변수 정리 입니다.

 

1. 메서드 정리

메서드 정리는 리펙토링에서 Extract Method, Rename Method 등으로 불리는 것들입니다.

메서드가 한 가지 일만 담당하게 메서드를 분리하고, 메서드 이름도 적절하게 수정을 합니다.

 

2. 클래스 정리

메서드가 정리되면 클래스 내에서 기능별, 개념별로 독립적인 클래스로 나눕니다.

각 클래스로 나눠서 composite로 합성해서 각 클래스가 특정 일을 담당하게끔 구성을 합니다.

 

3. 변수 정리

변수 정리는 관련된 변수는 struct나 tuple로 합치고 정리합니다.

 

 

@ 디자인패턴은 표현(구조)보다는 의도가 중요하다는 말은 무슨 의미인가요?

디자인 패턴을 공부하다 보면 UML 모양이 비슷비슷한 패턴들이 많이 있습니다.

 

예를 들어 데코레이터패턴과 콤포지트 패턴은 구조가 비슷합니다.

하지만 서로 사용하는 목적이 다릅니다.

데코레이터는 동일 타입의 객체를 받아들여 기능을 추가하는데 목적이 있고,

콤포지터은 부분, 전체 계층의 표현과 개별, 복합 객체를 모두 동일하게(일관성) 다루는데 목적이 있습니다.

 

 

@ 예외에 대해서 어떻게 생각하시나요? (예외 처리에 대한 6가지 화두 참고)

예외를 처리하는 부분은 함수를 호출한 그 부분에서 처리를 합니다.

상위단으로 예외를 전파하지 않고, 호출한 부분에서 예외를 잡아서 처리를 합니다.

 

 

@ 동기,비동기,블록,논블록은 무엇이라고 생각하나요?

블록은 어떤 함수를 호출했을때 그 함수가 하는 일이 끝날 때까지 블록킹되는 함수고

논블록은 함수 하는 일에 관계없이 블록킹되지 않고 바로 리턴되는 함수를 말합니다.

블록/논블록은 함수를 호출했을때 바로 리턴하냐 하지않냐로 나뉘는 것 같습니다.

 

동기는 어떤일을 요청하고 그 요청이 완료될 때까지 다음 일을 진행하지 않고 기다리는 것입니다.

비동기는 어떤일을 요청하고 그 요청이 완료될 때 까지 기다리지 않고, 이어서 다음 일을 진행하는 것을 말합니다.

 

@ 잠금 없는 동시성 프로그래밍이란 무엇인가요?

멀티스레드 프로그래밍을 할때, 스레드들이 공유 데이터에 원자적 접근을 하기 위해 락을 겁니다.

이때 락의 획득/해제 비용, 스레드간 컨텍스트 스위칭으로 인해 성능에 좋지 않은 영향을 미칩니다.

 actor 모델처럼 객체가 쓰레드와 큐를 가지고 일을 처리하고액터 내부 존재하는 큐는 다른 쓰레드나 다른 액터와 공유되지 않도록 설계하면잠금이 필요 없는 동시성 프로그래밍이 가능해집니다.

 

 

@ Actor 패턴과 Go언어의 CSP 모델의 차이점은 무엇인가요?

Actor패턴은 자신이 쓰레드와 큐를 가지고 있습니다.

작업은 큐에 할당을 하고, 스레드가 큐에서 작업을 꺼내 비동기 적으로 작업을 처리합니다.

 

액터는 작업을 담는 큐가 액터 내부에 있고 액터 외부에서 직접 큐에 엑세스 하지 못하지만,

CSP는 채널을 이용해서 외부에서 채널에 데이터를 읽고 쓸 수 있으며, 채널을 액터 사이에 전달할 수도 있습니다.

 

@ 공간(메모리)를 낭비해서 성능을 높이는 방식의 예를 3가지만 들어주세요.

해쉬 : 메모리를 사용해서 해시 테이블을 구성해서 검색 성능을 높임

캐쉬 : 실행시 계산한 결과값을 메모리에 저장해두고, 다음번에는 계산하지 않고 계산된 결과값을 사용

메모리 풀 : 메모리를 미리 할당해두고, 할당/해제에 대한 비용을 최소화

 

 

@ 자바의 메서드 인자 전달 방식과 Shallow Copy / Deep Copy 에 대해 설명 해주세요.

얕은복사 : 주소값만 복사

깊은복사 : 주소가 가리키는 데이터를 전부 복사

 

 

@ 자바 리플렉션은 무엇이며, 활용처가 어떤게 있을 까요?

리플렉션으로 클래스의 정보를 조사,분석을 할 수 있습니다.

특정 형식(리턴타입, 매개변수)의 메소드가 있는지, 필드들은 어떤걸 가지고 있는지, private인지 public인지를 얻어올 수 있습니다.

플러그인 개발에 활용할 수 있음

 

 

@ 자바의 HashMap 은 어떻게 동작하나요?

Key-Value 구조로, 키를 해시해서 해시 버킷의 인덱스로 사용하여 값을 저장하고 조회합니다.

서로 다른 해시 코드가 같은 해시 범킷 인덱스를 사용할때 충돌이 발생합니다.

충돌을 줄이기 위해 해시맵은 보조해시함수를 사용합니다.

보조 해시 함수를 사용해 키의 해시 값을 변형하여, 해시 출동 가능성을 줄입니다.

 


@ C++ 에서 성능하락을 막기 위해 알아야 할 기본적인 것들은 무엇이 있을까요?

- 값 전달보다는 참조 전달 사용

- 복사 생성/대입보다는 move 생성/대입 사용

- 인라인 함수 사용

 

 

@ C++ 에서 성능향상을 위해서 일반적으로 할 수 있는게 무엇이 있을까요?

- 객체 전달시 참조로 받기

- copy대신 move 사용

- vector 삽입시 push_back 대신 emp_back 사용

- 인라인 함수 사용

- 지역객체의 생성을 사용하는 곳에서 생성하기 (생성 늦추기)

- 리턴값 최적화 임시객체 활용

- 공간지역성, 시간지역성 활용 (변수 정렬)

 

 

@ C++ 에서  map 과 unordered_map은 어떤 차이가 있나요?

map은 key 순서로 정렬을 유지하며 저장합니다.

 

unordered_map은 key 순서대로 정렬되어 저장되지 않습니다.

(hash함수를 사용하므로, 정렬하지 않음)


요소 사이에 명확한 순서 관계가 없으면서 키 타입을 사용할 때 가장 유용.

또한 요소의 순서에 맞춰 유지하는 비용이 엄청 비싼 경우에도 유용

원소에 대한 순서관계를 가질 필요 없으며 대신 해시 함수를 사용함.

 

 

@ C++ 에서  STL 컨테이너의 데이터 삭제에 대해서 말해주세요?

remove : 컨테이너에서 데이터를 실제 제거하지 않음. 재배열함

erase :  컨테이너에서 데이터를 실제 제거

그러므로 컨테이너에서 요소를 실제로 제거하려면 remove와 erase를 같이 사용해야 함

 

 

@ C++ 에서 생산자,소비자패턴중 소비자 부분의 코드입니다. 코드를 설명 해주세요

 

   std::unique_lock<std::mutex> ul_que_res(_mtx_recv_endorser, std::defer_lock);

    std::list<SPTR_PROPOSAL_RES> que_recv;

    while (!_bStop)
    {
        ul_que_res.lock(); // 잠금
        if (_que_recv_endorser.empty()) // 비어있으면 대기
            _cond_recv_endorser.wait(ul_que_res); // 대기 시 락이 풀렸다가 wait가 끝나면 다시 잠금

        que_recv.swap(_que_recv_endorser); // 큐와 스왑
        ul_que_res.unlock(); // 잠금해제
       // 소비자 부분에서 처리가 길어지면, 생상자는 소비자의 처리가 완료될 때까지 삽입할 수 없다
       // 그러므로 생산자 버퍼, 소비자용 버퍼 두개를 둠
        while (!que_recv.empty()) // 비어있을때까지 꺼내서 처리
        {
            res = que_recv.front();
            que_recv.pop_front();


@ C++ 에서 std::move 와 rvalue 란 무엇인가요?

std::move : rvalue로 캐스팅 해줌. static_cast<&&>(); 캐스팅만 함


rvalue

등호의 오른쪽에만 놓일 수 있다.

이름이 없고, 주소 연산자로 주소를 구할 수 없다.

값을 리턴하는 함수와 임시객체는 rvalue

 

 

@ C++ 에서 메모리 풀링은 어떻게 구현하나요? (고정크기, 가변크기)

operator new와 operator delete를 재정의 해서

1. 사용할 수 있는 블럭을 가리키는 주소 = T타입 크기 * 개수; 로 할당함

2. T타입 크기만큼 이동하면서, 첫 4바이트에 다음 주소를 기록.

  물리적으로는 배열처럼 선형메모리 공간을 차지하지만, 각 블록은 리스트처럼 연결시켜둠.

3. T타입 할당 요청이 오면, 사용할 수 있는 블록을 가리키는 주소를 리턴해 줌

4. delete 요청이 오면 반환된 블록 첫 4바이트에 다음 사용할 주소 기록해 둠

 

 

@ C++ 에서 unique_lock과 lock_guard의 차이점은? 아래 코드를 설명하시요.

lock_guard는 단순히 생성자에서 lock을 걸고 소멸자에서 unlock을 호출함.

중간 중간에 프로그래머가 명시적으로 lock을 걸거나 unlock할 수 없음

 

unique_lock은 생성 시점에 락을 걸지 않을 수도 있고, 소멸하기 전에 unlock 또는 다시 lock을 걸 수 있음.

만약 소멸 시점에 lock이 걸려 있다면 unlock을 수행함

결국 프로그래머가 명시적으로 lock, unlock을 할 수 있음.


sptr_nt_lbuf pool_nt_lbuf::get_buf(){

   sptr_nt_lbuf pbuf;
   std::unique_lock<std::mutex> ul(_mtx, std::defer_lock); // 생성과 동시에 락 걸지않음

   while (pbuf.get() == nullptr){
    ul.lock(); // 명시적으로 락 호출
    if (_pool.empty())
      _cond.wait(ul); // wait가 락을 풀었다가 wait가 끝나면 다시 잠궈줌
    if (!_pool.empty())
    {
       pbuf = _pool.front();
      _pool.pop_front();
    }
  }

  return pbuf;

}

void pool_nt_lbuf::release_buf(sptr_nt_lbuf pbuf){
  std::lock_guard<std::mutex> lg(_mtx); // 자동 락. 함수 리턴할때 소멸자에서 락을 풀어줌
  _pool.push_back(pbuf);
  _cond.notify_all();
}


 

@ Go의 덕타이핑의 장,단점은 무엇인가요?

인터페이스, 추상클래스 상속을 할 필요 없이, 단지 해당 함수를 구현하면 다형적으로 사용할 수 있습니다

명시적으로 인터페이스라는 약속을 사용하지 않으므로, 해당 메서드를 구현하지 않으면 문제가 됩니다.

 

 

@ Go에서 고루틴&채널은 무엇인가요?

고루틴 : 경량 스레드

 

- 메모리 소비

고루틴은 생성하는데에 많은 메모리를 필요로 하지 않습니다. 오직 2kB의 스택 공간만 필요로 합니다.

반대로 쓰레드는 1Mb를 필요로 합니다. 

 

- 생성과 제거 비용

쓰레드는 생성과 제거에 많은 비용이 듭니다.

왜냐하면 쓰레드는 OS로부터 리소스를 요청해야 하고 작업이 끝나면 리소스를 돌려줘야 하기 때문입니다. 

고루틴은 런타임에서 만들어지고 파괴되는 작업들이 매우 저렴하다

 

- Context Switching 비용

쓰레드가 블로킹된다면 다른 쓰레드가 그 자리를 스케쥴링해야 합니다. 

쓰레드가 바뀔 동안, 스케쥴러는 모든 레지스터들을 저장 및 복원해야 합니다. 

고루틴은 스케쥴링되고 교체가 일어날 때오직 3개의 레지스터만이 저장 및 복원합니다. 그러므로 비용은 훨씬 덜 듭니다.

 

 

채널 : 

- 스레드간 데이터를 교환할 수 있게 하는 장치. 스레드의 안전성을 제공하는 큐

- 스레드의 안정성을 제공하는 큐

- 이 채널에 참조를 가진 작업은 큐에 메세지 추가/삭제 가능

- 보내는 개체와 받는 개체가 서로 알 필요가 없음

 

 

@ Go에서 select 문은 어떻게 사용되나요? 아래 코드를 설명 해 주세요.

 

package main
 
import (
   "fmt"
   "time"
)
 
var scheduler chan string
 
// 소비자
func consuming (prompt string){ 
      fmt.Println("consuming 호출됨")
   select {
   case scheduler <- prompt: // schedular 채널에 문자열 입력
      fmt.Println("이름을 입력받았습니다 : ", <- scheduler) // 채널에서 꺼냄
   case <-time.After(5 * time.Second): // 5초 후
      fmt.Println("시간이 지났습니다.")
   }
}
 
// 생산자
func producing (console chan string) {
   var name string
   fmt.Print("이름:")
   fmt.Scanln(&name)
   console <- name // console에 name문자열을 넣는다
}
 
func main() {
   console := make(chan string, 1) // 채널 생성
   scheduler = make(chan string, 1)
 
   // 소비자 함수 비동기로 실행
   go func(){
      consuming(<-console) // console에 문자열이 들어올때까지 블로킹
                           // producing에서 문자열이 입력되면 consuming 수행
   }()
 
   go producing(console) // 생상자 비동기 실행
 
   time.Sleep(100 * time.Second)
}
 
 
 
func (p *MsgPipeRW) WriteMsg(msg Msg) error 
{
  if atomic.LoadInt32(p.closed) == 0 {
    consumed := make(chan struct{}, 1)
    msg.Payload = &eofSignal{msg.Payload, msg.Size, consumed}
 
   select {
    case p.w <- msg: // msg를 p.w채널에 넣어줌
      if msg.Size > 0 { // msg가 있으면
      // wait for payload read or discard
        select {
          case <-consumed: // consumed채널에 입력될 때까지 기다림
          case <-p.closing:
        }
      }
      return nil
    case <-p.closing:
    }
  }
  return ErrPipeClosed
}

 

@ CAP 이론이란?

세 가지 조건을 모두 만족하는 분산 컴퓨터 시스템이 존재하지 않음을 증명한 정리입니다.

 

일관성(Consistency): 모든 노드가 같은 순간에 같은 데이터를 볼 수 있다.

가용성(Availability): 모든 요청이 성공 또는 실패 결과를 반환할 수 있다.

분할내성(Partition tolerance): 메시지 전달이 실패하거나 시스템 일부가 망가져도 시스템이 계속 동작할 수 있다.

 

 

@ consistent hashing 이란 무엇인가요?

기존의 해시는 슬롯의 개수가 변화하면 기존의 모든 키가 다시 재해싱되어야 합니다.

그러나 Consistent hashing은 슬롯의 크기가 바뀌더라도 대부분의 키들이 슬롯을 그대로 사용할 수 있는 해싱 기법을 의미합니다.

 

 

@ Gossip Protocol 는 무엇인가요?

가십 프로토콜이란, 소문을 퍼뜨리면서 합의를 이룬다로

A가 무작위로 다른 멤버를 골라 그 멤버 B에게 자신이 여태껏 알게 된 모든 정보를 알려주는 것을 말합니다.

A는 또 다른 멤버를 무작위로 선택해 같은 작업을 반복합니다. B 역시 반복적으로 같은 일을 하고, 다른 모든 멤버들도 마찬가지입니다.

이렇게 하여 한 명의 멤버가 새로운 정보를 알게 되었다면, 그 정보는 모든 멤버가 알게 될 때까지 아주 빠른 속도로 퍼저나갑니다.

 

 

@ 트랜잭션에서  Two Phase Commit 이란 무엇인가요?

분산 데이터베이스 환경에서 원자성을 보장하기 위해 분산 트랜잭션에 포함되어 있는 모든 노드가 Commit되거나 Rollback하는 메커니즘을 말합니다.

 

2PC는 Prepare단계와 Commit단계로 나뉘어 실행

 

image.png

begin -> end -> prepare -> commit (시작 -> 끝 -> 준비 -> 커밋)

이고 여기에서 2PC의 두 단계란 prepare -> commit

 

image.png

 

@ WAL (write-ahead logging) 은 무엇인가요?

DB의 원자성과 영속성을 위한 기술 중 하나입니다.

DB 변경 발생시, 실제 조작 전에 로그를 기록하는 것 말합니다.

즉 모든 수정은 적용 이전에 로그에 기록됩니다.

SQL 서버에서는 데이터에 대한 변경은 먼저 로그에 작성되는데, 이것을 로그 선행 기입(WAL)이라고 합니다.

 

 

@ B tree와 B+tree 는 대략 무슨 차이가 있나요?

B 트리 : 내부노드와 외부노드가 동일하게 값을 가지고 있습니다. 즉 각 노드에 데이터가 저장됩니다.

 

B+트리 : 내부노드는(인덱스 노드)와 내부노드(데이터 노드)로 분리되어 있습니다.

인덱스 노드는 데이터의 빠른 접근을 위한 인덱스 역할만 합니다.

데이터 노드끼리는 이중 연결리스트로 서로 연결되어 있습니다.

순차집합이고 오름차순 정렬되어 있습니다.

 

 

@ LSM (log structed merge tree)은 대략 무엇인가요?

주로 RDBMS에서 사용 되고 있는 B+Tree와 비교해서 쓰기(Write) 성능이 우수하다는 특징을 가지고 있습니다.

 

 

@ LSM 에서 무엇을 머지 한다는 건가요?

Data 입력이 많아질수록 중복되는 Entry가 늘어나며 중복을 제거하기 위해 주기적으로 Compaction을 수행합니다.

Compaction은 여러 개의 파일을 병합하면서 파일의 개수를 줄이고 중복된 키나 삭제된 키를 제거합니다.

파일 내부가 정렬이 되어 있기 때문에 병합은 꽤 효율적으로 이루어 집니다.

 

 

@ leveldb의 특징은 무엇인가요?

- Key-Value 기반의 Storage Library.

- 데이터가 구글의 Snappy 압축방식으로 압축되어 저장됨

- Snappy의 특징은 압축률은 아주 높지 않지만 속도가 빠름

- Key와 Value는 Byte Arrays 타입 (가변사이즈 Key, 효과적인 메모리 사용)

- Data는 Key로 정렬해서 저장

- 초당 250M 압축, 초당 500M 압축해제

 

 

@ Kafka 의 브로커,토픽,파티션은 무엇인가요?

 

 

@ Kafka 에서 Zookeeper 는 무엇이고 어떤 역할을 담당하나요?

 

 

@ 멀티쓰레드 방식과 Select or ePoll 방식의 소켓통신 차이점은 무엇인가요?

멀티쓰레드 방식 : 접속자마다 쓰레드를 할당해서 통신하는 방식

이 방식은 접속자 수가 많지 않을 때 큰 문제 없음.

스레드의 수가 많아지면 빈번한 컨텍스트 스위칭 발생

 

select : 소켓리스트를 구성하고 이 소켓리스트 중 변화가 있는지를 감시합니다. 변화가 있으면 리턴해서 변화가 있는 소켓을 찾아 작업함

하지만 100개 소켓 중 io가능 소켓을 찾으려면 루프를 100번 돌아야 함

 

epool : select와 비슷

소켓이 uio가능 상태가 되면 이를 감지해서 사용자에게 알려줍니다. 이때 select와 차이점은 어떤 소켓이 io가능 상태인지 알려줍니다.

100개 소켓 중 io가능이 된 소켓만 epoll을 이용해서 바로 얻을 수 있습니다

루프를 100번 돌지 않아도 됩니다.

 

 

@ 소켓통신에서 가변 read 버퍼와 고정 read 버퍼 각각의 장,단점은? 가변버퍼시 메모리 풀링 방식은?

가변버퍼 : 수신 받는 데이터 양에 따라 buffer의 크기 변화하므로 공간을 효율적으로 사용

 

고정버퍼 : 데이터 양이 고정버퍼 보다 적을 경우 공간낭비.

고정 크기를 크게 잡으면 메모리 낭비므로 비효율적

하지만 너무 작게 잡으면 성능 떨어짐. 큰 데이터 못받음.

 

메모리 풀링방식 : 서로 다른 크기의 메모리를 미리 할당해두고 메모리 풀로 구성.

1K, 2K, 3K..64K의 모두 64개의 메모리 풀을 구성.

3.2K짜리 할당을 요구하면, 메모리 풀에서 4K짜리를 꺼내 반환.

(요구한 사이즈보다 큰 사이즈의 메모리를 메모리 풀에서 찾아 반환해 줌)

 

 

@ 소켓통신에서 타임아웃은 무엇이고 Nagle 알고리즘은 무엇인가요?

타임아웃 : 패킷을 전송할때 타이머를 동작시켜 타이머가 일정시간이 넘도록 ACK 패킷을 못받을 경우, TimeOut이 발생하고 패킷을 재전송합니다.

A데이터 전송 후 일정시간이 지나도(타임아웃 발생) ACK 메시지를 받지 못하면, A 데이터를 재전송을 합니다.

 

네이글 알고리즘 :

전송한 데이터의 ACK 메세지를 받을 때까지, 보낼 데이터를 쌓아두도록 하는 것입니다.

ACK 메세지를 받으면 그간 쌓아둔 데이터를 보냄

또는 쌓인 양이 한계치(최대 세그먼트 길이)를 넘어서면 세그먼트로 만들어 보냄


- 네트워크 상에 패킷들의 넘침을 막기위해 제안된 알고리즘.

- 네이글 알고리즘을 적용하지 않으면 네크워크 트래픽에 좋지 않음

 (1바이트 데이터라 하더라도 헤더정보를 포함하면 40바이트 이상이 되기 때문)

 

 

@ 소켓통신상 SSL/TLS flow를 말해주세요

1. 악수 (핸드쉐이크)

- 클라이언트와 서버가 서로 랜덤값을 주고 받음.

- 중요한 것은 클라이언트가 클라이언트 랜덤값과 서버 랜더값을 이용해서 pre master secret값을 생성하는 것

- 생성한 pre master secret값을 서버에 전송. 전송할 때는 서버의 공개키로 암호화

 서버가 pre master secret값 받으면 서버의 비밀키로 복호화함

- 클라-서버가 pre master secret값을 이용해서 세션키(대칭키)를 생성함

- 이 세션키를 이용해서 클라-서버 사이에 데이터 전송을 암호화/복호화 함

 

2. 세션

- 클라이언트-서버가 실제 데이터를 주고 받음

- 핵심은 전송하기 전에 세션키로 데이터를 암호화 하는것

- 데이터를 전송받은 쪽도 세션키를 알고 있기 때문에 복호화 가능

 

3. 세션 종료

- 데이터 전송이 끝나면 SSL 통신이 끝났음을 서로에게 알려주고, 사용한 세션키를 폐기함

 

 

@ React 방식과 Proact 방식의 차이점은 무엇인가요?  (in POSA2)

Reactor 모델은 I/O 처리가 준비되었는지를 알리는 이벤트가 통지되고, (select, epoll)

Proactor 모델은 I/O 처리의 결과가 이벤트로 통지됩니다. (IOCP)

 

Reactor에서 이벤트는 작업이 가능함을 알리는 이벤트고,

Proactor에서 이벤트는 작업의 완료를 알리는 이벤트입니다.

 

 

@NAT 와 UPnP 는 무엇인가요?


============================================================


블록체인 일반

1. 토큰과 코인의 차이는 무엇인가요? (in 이더리움)

 

2. 토큰 디자인에 대해서 아는대로 말해주세요.

 

3. 이더리움 ERC20 & ERC721 는 무슨 차이가 있나요

 

4.블록체인 트릴레마(Blockchain Trilemma)란 ?

트릴레마란 3가지 문제가 서로 얽혀 이들을 동시에 해결할 수 없고,

어떤 선택을 하든 3가지 중 하나를 악화시킬 수 밖에 없는 상황을 뜻합니다.

3가지 문제는 확장성, 보안, 분산화 등입니다.

 

비트코인

1. 비트코인에서 UTXO 란 무엇인가요?

사용되지 않은 거래 출력값을 말합니다. (사용가능한 모든 출력값)

예를 들어 A가 10비트코인을 가지고 있고, 이중 7비트코인을 B에게 보내다고 하면,

7 비트코인을 생성해서 B에게 보내고,

나머지 잔액 3 비트코인을 생성해서 A가 보관합니다.

즉 10비트코인 전액을 소비하고, 두 개의 출력값(7과 3)을 생성합니다.

 

2. 비트코인에서 트랜잭션 검증은 어떻게 이루어 지나요

모든 풀 노드가 각 거래마다 독립된 검증을 실시합니다.

노드는 전송받은 거래를 검증하여 유효한 거래들을 이웃 노드에게 전파하고, 유효하지 않은 거래들은 폐기합니다.

체크리스트로 모든 거래를 검증합니다.

그 체크리스트 중 하나는

1. 입력값 금액이 출력값 총액보다 같은지 검사합니다.

 

 

3. 비트코인에서 불룸필터는 왜 사용 되나요

노드가 이웃 노드들로부터 수신한 거래를 필터링 하는 용도도 사용합니다.

SVP의 블룸필터로 프라이버시 침해를 줄이기 위해 사용합니다.

 

 

4. 비트코인에서 몇명 중에 몇명의 서명이 있어야 사용 할 수 있다라는 것은 어떻게 표현하나요

 

 

1. 이더리움에서 트랜잭션 검증은 어떻게 이루어 지나요

트랜잭션이 문법에 맞게 구성되어 있는지, A의 공개 키를 사용하여 해당 전자 서명은 유효한지, 사용자 A의 어카운트에 있는 넌스와는 맞는지 검증합니다.

 

 

2. 이더리움에서 블룸필터는 왜 사용 되나요

트랜잭션에서 생성된 로그들이 중복 저장되는 것을 막고, 이들 정보를 쉽게 찾기 위해 사용합니다. 로그를 직접 블록 내에 저장하지 않게 되므로 저장 공간을 절약할 수 있습니다.

 

 

3. 이더리움에서 머클패트리샤트리란 무엇인가요

 

 

4. 이더리움에서 RLP는 무엇인가요? 왜 필요한가요? Protocol buffer 와는 어떤 차이가 있나요

 

 

5. 이더리움에서 플라즈마란 무엇인가요

플라즈마는 블록체인 확장성을 위한 방법중 하나


 

6. 이더리움에서 노드디스커버리는 어떻게 이루어 지나요

 

 

7. 이더리움에서 주소를 public key가 아니라, 이더리움 경우 20byte로 줄여서 사용하는 이유는 무엇인가요

8. 줄여진 주소를 가지고 서명을 어떻게 확인 하나요

9. 이더리움에서 블록싱크 방식은 어떻게 되나요

10. 이더리움에서 저장용량을 줄이기 위한 prunning은 어떻게 할 수 있을까요

 

 이더리움

1. 이더리움에서 트랜잭션 검증은 어떻게 이루어 지나요
2. 이더리움에서 블룸필터는 왜 사용 되나요

3. 이더리움에서 머클패트리샤트리란 무엇인가요
4. 이더리움에서 RLP는 무엇인가요? 왜 필요한가요? Protocol buffer 와는 어떤 차이가 있나요
5. 이더리움에서 플라즈마란 무엇인가요
6. 이더리움에서 노드디스커버리는 어떻게 이루어 지나요
7. 이더리움에서 주소를 public key 자체가 아니라, 이더리움 경우 20byte로 줄여서 사용하는 이유는 무엇인가요 장점은? 줄여진 주소를 가지고 서명을 어떻게 확인 하나요 
8. 이더리움에서 블록싱크 방식은 어떻게 되나요
9. Parity 에서 warp-sync 란 무엇인가요? 
10. 이더리움에서 저장용량을 줄이기 위한 prunning은 어떻게 할 수 있을까요

하이퍼레저 패브릭
1. 하이퍼레저 패브릭에서 트랜잭션 흐름을 설명해 주세요.
2. 하이퍼레저 패브릭에서 MVCC 충돌이란 무엇인가요

3. 하이퍼레저 패브릭에서 MSP 란 무엇인가요
4. 하이퍼레저 패브릭에서 Fabric-CA가 하는 역할은 무엇인가요
5. 하이퍼레저 패브릭에서 RWSet이란 무엇인가요 
6. 하이퍼레저 패브릭에서 블룸 필터는 어떻게 사용 되나요
7. 하이퍼레저 패브릭에서 ACL 은 어떤 정보를 어떻게 가져와서 적용 되나요
8. 하이퍼레저 패브릭에서 저장용량을 줄이기 위한 prunning은 어떻게 할 수 있을까요
9. 하이퍼레저 패브릭에서 Kafka 는 왜 사용 되나요? RAFT 는 왜 등장 한 걸 까요?
10. 하이퍼레저 패브릭에서 토큰은 만들 수 있나요?  FabToken 왜 만들어 졌을까요?  
11. 하이퍼레저 패브릭에서 리더피어와 앵커피어란 무엇인가요?
12. 하이퍼레저 패브릭에서 Gossip Protocol 는 왜 사용하나요?  
13. 하이퍼레저 패브릭에서 블록싱크 방식은 어떻게 되나요? 


암호학

1.HMAC / PKI / ECDSA는 무엇인가요

2. diffie-hellman 키 교환 알고리즘은 무엇인가요? 이더리움에서는 왜 사용하나요

3. 하이퍼레저 패브릭의 ECcert 란 무엇인가요? 패브릭에서는 왜 사용하나요

4. 하이퍼레저 패브릭의 TCert 는 왜 없어졌고, 대체제는 무엇인가요

5. Schnorr signature는 무엇인가요?

6. 이더리움에서 영지식증명으로 활용 할 수 있는 것은 무엇이 있을까요

7. 하이퍼레저 패브릭에서 영지식증명으로 활용 할 수 있는 것은 무엇이 있을까요

 

컨센서스

1. CFT와 BFT의 차이는 무엇인가요

2. RAFT 에서 리더 선출은 어떻게 하나요?

3. PBFT 알고리즘은 무엇인가요

4. DPOS 알고리즘은 무엇인가요



인터프리터


1. 이더리움의 solidity 언어와 다르게, go, c++을 사용하면 비결정적 문제가 생깁니다. 무슨 의미인가요?
2. 이더리움의 solidity 언어는 각각의 명령어에 대해 과금을 하고 있습니다. Go나 C++로도 가능한가요? 
3. C++이나 Go로 만든 프로그램에서 CPU,Memory,Storage 를 사용한 만큼으 지표를 구하고 싶을 때 어떻게 할 수 있을까요?
4. 인터프리터 패넌(Gof) 와 AST 란?
5. LLVM 란?


11
10
  • 댓글 5

  • pannet15
    2k
    2019-05-24 12:51:32

    ㄷㄷㄷㄷ 저는 몇개 답하지도 못하겠군요.

    처음보는 개념이 많네요.......

    1
  • smasma
    2k
    2019-05-28 14:35:44

    굳이 저렇게 까지 해서 사무원이 되고 싶은가요? 저같으면 안감.

    0
  • 라이라
    1k
    2019-05-29 16:07:55
    과연 저렇게 대답하는 사람이 실력도 좋은가요?
    2
  • 하마
    6k
    2019-05-29 16:54:29 작성 2019-05-30 21:14:22 수정됨

    일단 아무 대답 못하는 사람들 보단 훨씬 좋은 것은 당연한건데, 중요한 것은 열의 입니다.

    저 같은 경우는 코딩테스트,이전직장,졸업한학교는 가급적 배제하는 편이고, 서로 토론을 하는 과정을 통해서 현재 실력을 보며 1차 신뢰를 형성하려 합니다. 더 중요한것은 이 분야에 대한 능동적인 열의를 확인 하는 것이구요.

    결국 블록체인의 분야에 열정을 가진 사람들을 만나기 위한 방식으로써, 그렇지 않은 사람은 굳이 만나 볼 필요 도 없는거죠. 도전적인 분야이기 때문에 그런것을 좀 더 강조하는 면이 있습니다.

    0
  • 김예슬
    198
    2019-05-29 17:28:11

    오픈북이면 먼저 스터디를 할수있게끔 하고 면접 준비를 얼마냐 했느냐를 보는거 아닐까용..ㅎㅎ 설마 저렇게 다 평소에 줄줄 생각하고 외우고 다니는 사람이 있겠어용.. 그래도 이 글이 저에게 많은 도움이 됬습니다 ! :)

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.