Browsed by
[Category:] SW Development

알쓸코기: 알아두면 쓸데있는 코딩기술 – Deque

알쓸코기: 알아두면 쓸데있는 코딩기술 – Deque

개발을 하다보면 어떤 자료구조를 사용하느냐에 따라 성능이 크게 달리지는 경우가 있다. 그리고 느린 성능으로 인해 사후에 원인을 분석하고 해결하려면 생각보다 많은 시간과 비용이 소모된다는 것은 대부분의 개발자들은 알고 있을 것이다. 이를 미연에 방지할 수 있는 가장 쉬운 방법은 개발 과정에서 어플리케이션의 성격과 구조를 충분히 이해하고 그 상황과 궁합이 가장 잘 맞는 자료구조를 선택하는 것이라 할 수 있다. 이런 생각까지 닿으면 명장의 목수가 연장을 자유자재로 다루듯 자료구조를 적절하게 선택, 적용하는 능력은 개발자들에게는 필수 요건이라 할 수 있다. 일반적으로 Java에서 List형태의 자료구조를…

Read More Read More

Get to know the Contraction Hierarchy

Get to know the Contraction Hierarchy

앞서 길찾기 알고리즘 관련해서 2개의 알고리즘(Dijkstra, BidirectionalDijkstra)에 대해 살펴봤다. 컴퓨터를 활용하여 길을 찾아가는 알고리즘의 목적은 크게 최적의 경로를 최대한 빨리 찾아내는 것이라 할 수 있다. 이론적으로 이들 알고리즘은 최적의 경로를 찾아주는 것을 보장하지만 최대한 빨리 찾는 것에는 한계를 드러내고 있다. 앞에서 설명한 BidirectionalDijkstra 알고리즘도 이런 맥락에서 탐색속도를 개선하기 위한 하나의 방법으로 볼 수 있다. 이처럼 Dijkstra Algorithm의 탐색 속도는 탐색공간 크기에 종속적일 수 밖에 없으며 나아가 길찾기가 한 국가를 넘어 글로벌 규모로 확대해 나간다면 탐색 속도는 서비스 경쟁력을 유지에 중요한…

Read More Read More

Understanding Bidirectional Dijkstra Algorithm

Understanding Bidirectional Dijkstra Algorithm

Dijkstra Algorithm은 내비게이션의 길찾기 뿐만 아니라 최단거리를 찾는 알고리즘으로 잘 알려져 있다. Dijkstra Algorithm은 출발지와 목적지 사이의 최단 거리 탐색을 보장하긴 하지만 탐색 거리가 멀면 멀수록 소요되는 시간도 비례적으로 증가한다는 것이 맹점이다. 이런 문제점을 해결하기 위해 다양한 방법들이 시도 되었으며 그 중 대표적인 것이 A*와 양방향 탐색이라 할 수 있다. 이 글에서는 내비게이션 업계에서 주로 적용하고 A*알고리즘보다 최적 경로 탐색을 보장하면서 탐색시간을 거의 절반으로 줄일 수 있는 양방향 탐색(Bidirectional Dijkstra Algorithm)을 자세히 알아보고자 한다. 참고로 Dijkstra Algorithm에 대해 이해가 필요하다면…

Read More Read More

Implementing Mutable PriorityQueue

Implementing Mutable PriorityQueue

내비게이션 경로탐색 알고리즘으로 가장 잘 알려져 있고 많이 이용하는 알고리즘이 Dijkstra 알고리즘이다. 알고리즘 수행 결과로 만들어진 경로는 최단거리를 제외하면 빠른경로/운전하기 편한 경로와 같이 정성적으로 판단하는 부분이 많다. 이와 같은 척도를 제외하면 경로탐색 엔진의 품질을 측정하는 중요한 척도는 경로탐색 과정에서 소요되는 시간일 것이다.  Dijkstra 알고리즘을 이용하면 최적의 경로를 찾긴 하지만 탐색시간이라는 비용을 지불해야 한다. 내비게이션 품질에서 탐색시간이라는 비용을 줄이기 위해 A*와 같이 탐색공간(Search Space)을 줄이는 Heuristic 기법들을 많이 활용하고 있으며 최근에는 개념을 바꿔 전처리(Preprocessing) 단계를 이용하여 좀 더 교통공학적으로 접근하여 탐색속도를 개선하려는…

Read More Read More

Rust memory safety explained

Rust memory safety explained

What makes the Rust language one of the best for writing fast, memory-safe applications? Rust’s memory safety features are baked into the language itself. In Rust, behaviors that are not memory-safe are treated not as runtime errors but as compiler errors. Whole classes of problems, like use-after-free(해제된 메모리 접근) error, are syntactically wrong in Rust. This doesn’t mean that code written in Rust is entirely bulletproof or infallible. Some runtime issues, line race conditions, are still the developer’s responsibility. But…

Read More Read More

Dijkstra Algorithm Explained

Dijkstra Algorithm Explained

개요 이 글은 자동차 내비게이션의 경로탐색 또는 그래프 이론에서 접하는 최단거리 탐색에 대해 설명한다. 출발지와 목적지 사이의 최단거리 경로탐색에 활용되는 알고리즘으로는 다익스트라 알고리즘이 대표적이라 할 수 있다. 다익스트라 알고리즘이 내부적으로 어떤 처리과정을 거쳐 결과를 만들어내는지에 대해 살펴보도록 한다. 다익스트라를 이용한 최단거리 찾기 그래프 이론에서 그래프는 링크(edge)와 노드(vertex)로 구성된다. 링크에 가중치(weight)가 적용되는 그래프를 가중치 그래프(weighted graph)라고 하며 이 가중치 그래프 상에서 출발지 노드가 주어졌을 때 다익스트라 알고리즘은 이 출발지 노드와 연결 가능한 모든 목적지 노드들 사이의 최단거리 경로와 거리(가중치의 합)를 구해낸다….

Read More Read More

ZooKeeper 긁적이기

ZooKeeper 긁적이기

ZooKeeper는 MSA에서 Scalable한 구조를 유지가히 위해 많은 오픈소스 솔루션이 내부적으로 활용하는 Coordination 서비스라 할 수 있다. 대표적으로 Kafka에서 내부적으로 환경을 관리하고 클러스터를 유지하기 위해 사용하는 정도로 알고 있다. ZooKeeper의 탄생을 보면 야후(Yahoo)가 아직은 그 명성이 살아 있을 때 클라우드 환경으로 전환과 맞물려 자체으로 필요에 의해 만든 후 오픈소스로 공개한 서비스이다(2011). 클라우드/MSA환경에서는 안정적인 서비스 운영을 위해 Scalable한 구조가 필수적이다. 이때 서비스의 트래픽 상황에 따라 노드 개수가 늘어나거나 줄어들어야 하며 바이너리 업데이트 배포시에도 모든 노드들에 동일한 환경이 구성되도록 해야 한다. 예를 들면…

Read More Read More

재사용성이 높은 자바 코드를 작성하려면

재사용성이 높은 자바 코드를 작성하려면

재사용성이 높고 보기에도 예쁜 코드를 작성해야 한다라는 얘기를 많이 듣긴 하지만 어떻게 하야 재사용성이 높고 예쁜 코드를 작성하는 것인지 막연할 것이다. 추상적이긴 하지만 아마도 읽기 쉽고 이해하기 편하며 유지보수가 용이한 코드를 말하는 것일 것이다. 이 글에서 재사용성이 높은 코드를 작성함에 있어 개발자들이 쉽게 시작할 수 있는 8가지 방법에 대해 얘기해 보고자 한다. 재사용성이 높은 코드를 작성한다는 것은 개발자들에게 매우 중요하게 요구되는 기술중의 하나라서 많은 엔지니어들이 반드시 알아야 하는 덕목이라 할 수 있다. 근래 마이크로서비스아키텍처(MSA)가 보편화 된 개념으로 자리잡고 널리 적용하고…

Read More Read More

Recursion and Tail-Call Optimization

Recursion and Tail-Call Optimization

프로그래밍에서 Recursive Call을 설명할 때 당골로 언급되는 것이 factorial 예제를 통해 값을 구하는 것일 것이다. 그냥 겉으로 보기에는 코드의 길이가 짧고 깔금해 보이지만 내부적으로 보면 Stack을 과도하게 사용할 수 있고 이로 인해 Stack Overflow가 발생할 가능성이 있어 되도록이면 Recursion보다 Loop을 사용하도록 가이드 하고 있다. Tail Call이란 Java는 단지 언어(language)를 넘어 하나의 플랫폼 역할을 한다. 즉, JVM은 단지 Java 언어 뿐만 아니라 Groovy, Scala같이 다른 언어들도 지원한다는 것을 알고나면 플랫폼이란 말이 이해가 될 것이다. 많은 functional language interpreter들은 recursion 동작을 optimize함으로써…

Read More Read More

Sequential or Temporal Coupling

Sequential or Temporal Coupling

Functional Programming에 관심이 많은 개발자들은 위 제목이 무엇을 뜻하는지 잘 알것이다. 내용을 다시 확인해 보자면 Functional Programming은 할당문(assignment statements) 사용하지 않고 프로그래밍 하는 것이라 할 수 있다. 따라서 Functional Programming은 변수를 사용하지 않고 프로그래밍하는 것이며 functional Programming에서 값(values)는 변하지 않는다라고 할 수 있다. 왜 이것이 바람직한지 아래의 코드를 한번 보자 시스템의 상태는 Block A를 실행할 때와 Block B를 실행할 때가 서로 다를 것이다. 이 말은 Block A가 반드시 Block B에 앞서 실행되어야 한다는 것을 의미한다. 만약 이 두 Block의 순서를…

Read More Read More