토요일, 4월 28, 2018

[B급 프로그래머] 4월 4주 소식(빅데이터/인공지능, 암호화폐/블록체인, 읽을거리 부문)

(오늘의 짤방: Evolution of the English Alphabet via @usefulcharts)
  1. 빅데이터/인공지능
  2. 암호화폐/블록체인
  3. 읽을거리
(보너스: 현대인의 3대 영양소 via @minase_u_tchi)
EOB

[B급 프로그래머] (Quora) 구글 또는 아마존에 다니는 경력 개발자들이 가장 유용하다고 생각하는 자료 구조는?

(그림은 (MIT) 6.851: Advanced Data Structures에서...)

Can anyone at Google or Amazon share what algorithms you find most useful over the years of your career?(구글 또는 아마존에 다니는 경력 개발자들이 가장 유용하다고 생각하는 자료 구조는?)라는 흥미로운 질문과 대답을 읽다가 독자 여러분들이 생각나서 간략하게 정리해본다. (참고로 답변을 다신 분은 마이크로소프트, 구글, 페북에 근무한 경력 소유자다)

  • set/map: 코딩 과정에서 가장 중요한 자료 구조로 빠르게 값을 찾고, 값의 존재 유무를 확인할 수 있다. 물론 자세한 내부 구조는 몰라도 되지만 코드를 명확하고 효율적으로 작성하기 위해서는 언제 어떻게 사용할지 알고 있어야 한다. (본인 생각 추가: 키-쌍 NoSQL 데이터베이스를 다룰 때도 map 개념은 상당히 유용하다)
  • tree: 디렉터리에 있는 파일을 재귀적으로 순회하거나, JSON 객체나 XML 문서, 아니면 산술 연산이나 표현식을 다룰 때도 상당히 중요하다. RB(Red-Black) 트리 구현 방법은 몰라도 되지만 정렬된 set이나 map이 필요한 상황에서 문제를 풀기 위한 수단으로 사용법은 잘 알고 있어야 한다. (본인 생각 추가: DOM(Document Object Model)을 이해하고 탐색하는 과정에서도 tree가 한 몫을 담당한다)
  • graph: 엔티티 사이의 관계를 파악해야 하는 문제가 있을 경우 만능 해법이다. 소셜 네트워크, 컴퓨터 네트워크, 짝 짓기와 경매 시스템에 광범위하게 적용할 수 있다. 그래프는 특정 영역에 국한된 문제의 표현 방식을 일반적인 해법을 적용할 수 있는 일반화된 프레임워크로 전환할 수 있기에 강력한 위력을 발휘한다. 최단 비행 경로, 최단 도로 경로, 네트워크에서 최단 라우팅 경로는 실제로 최단 거리 계산이라는 동일한 알고리즘으로 표현할 수 있다. (본인 생각 추가: 요즘 뜨는 암호화폐의 부정 거래를 추적하는 과정에서도 그래프가 강력한 위력을 발휘한다)
  • 이진 탐색: 이진 탐색은 (정렬된 트리나 벡터에서) 어떤 값이 너무 적거나 많지 않은지를 기준으로 빠르게 정확한 값을 찾는 효과적인 수단이다. 이진 트리 탐색에 연결시킬 경우 효과적으로 트리의 특정 원을 탐색할 수 있게 된다.

독자 여러분들께서도 평상시에 많이 사용하는 자료 구조가 있는지? 데이터베이스를 많이 사용하는 분이라면 SQL등을 효과적으로 작성하고 수행하기 위해 관계형 모델도 잘 숙지하고 있으면 큰 도움이 되리라는 생각이다.

보너스: 10 Common Data Structures Explained with Videos + Exercises를 읽어보면 자주 사용하는 자료 구조에 대한 기억을 되살릴 수 있을 것이다.

EOB

토요일, 4월 21, 2018

[B급 프로그래머] 4월 3주 소식(개발/관리도구, 고성능 서버/데이터베이스 부문)

(오늘의 짤방: memory allocation via @b0rk)
  1. 개발/관리도구
  2. 고성능 서버/데이터베이스
(보너스: shared library via @b0rk)
EOB

토요일, 4월 14, 2018

[B급 프로그래머] 4월 2주 소식(빅데이터/인공지능, 암호화폐/블록체인, 읽을거리 부문)

(오늘의 짤방: The Palmer Principle: no matter the consensus mechanism, in practice, 51% of stake/mining power will be owned by at most 3 entities. via @nic__carter)
  1. 빅데이터/인공지능
  2. 암호화폐/블록체인
  3. 읽을거리
(보너스: This is what may have happened in the recent Tesla Autopilot Crash)
EOB

토요일, 4월 07, 2018

[B급 프로그래머] dqlite - Go 애플리케이션을 위한 분산 SQLite

오늘은 정말 간만에 기술적인 글을 하나 쓰려고 한다. 최근 블록체인이 관심을 끌면서 더불어 분산 데이터베이스에 대한 관심도 늘어나고 있다. 분산 데이터베이스를 위해 덩치크고 무거운 데이터베이스 엔진에서 출발하는 방법과 경량 임베디드 데이터베이스 엔진에서 출발하는 방법이 있는데, 설치/구성/운영 관점에서 경량 임베디드 데이터베이스에서 출발하는 방법이 여러 가지 유리한 점이 많다.

블록체인에서는 주로 구글이 만든 NoSQL 계열의 LevelDB를 기반 엔진으로 많이 사용하고 있는데 일반적인 애플리케이션을 만들 경우에는 SQL 계열이 적합할 경우가 많기 때문에 다른 대안을 찾아야 한다. 오늘은 SQLite를 기반으로 만들어진 dqlite를 소개하겠다.

dqlite가 나오기 전에 이미 rqlite라는 소프트웨어가 나와 있었다. SQLite 데이터베이스를 여러 노드에서 구동한 다음에 발생하는 모든 변경 내역이 SQLite 데이터베이스의 쿼럼에 반영되거나 반영되지 않게(딱 두 가지 상태) 만들기 위해 모든 개별 SQLite 데이터베이스 인스턴스 사이에 합의가 필요하다. rqlite에서는 r이 의미하는 Raft 합의 알고리즘을 사용해 결함 포용 분산 시스템 구현에서 부딪히는 여러 가지 골칫거리를 해결하고 있다. Raft는 이론만 나와 있지 않고 이미 자바, C/C++, Go, 파이썬 등 다양한 프로그래밍 언어로 구현되어 있으므로 손쉽게 적용할 수 있다.

rqlite는 손쉽게 배포가 가능하며, SQL 데이터베이스를 사용 가능하며, 손쉬운 HTTP(S) API로 여러 서비스를 제공하며, 핫백업도 지원하지만, 몇 가지 단점이 존재한다. 완벽한 트랜잭션을 지원하지 않고, SQL 구문이 결정적이어야 하며(예: time이나 random 등을 사용하지 못한다), 복제 과정에서 성능이 떨어진다. 이런 단점을 보완하기 위해 만든 소프트웨어가 바로 dqlite이다. dqlite는 Go 라이브러리 형태이므로 그냥 SQLite처럼 프로그램에서 사용하면 되며, Hashicorp에서 만든 Go Raft 패키지를 사용해 모든 노드에서 동작하는 SQLite의 WAL(Write-Ahead-Log) 프레임을 충돌없이 복제한다.

SQLite를 멀티프로세스 뿐만 아니라 분산 환경에 적용하고 싶은 분들에게 적절한 해법이라는 생각이다. 복잡한 합의가 필요하지 않으며 데이터 무결성을 완벽하게 보증할 필요가 없는 경우라면 이런 유형의 소프트웨어를 고려하는 편이 훨씬 유리할 것이다.

EOB

목요일, 4월 05, 2018

[B급 프로그래머] 4월 1주 소식(개발/관리도구, 고성능 서버/데이터베이스 부문)

(오늘의 짤방: Compile vs Runtime Error via @JoBoccara)
  1. 개발/관리도구
  2. 고성능 서버/데이터베이스
EOB