You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 22 Next »


10년전 C++로 개발을 시작했을때는 내가 필요한것을 모두 작성해야 했었다.

현재는 내가 필요한것이 어딘가에 오픈소스이든 상용소스인든지 어딘가에 존재한다.


아래 코드는, 모두 작성해야 했을 시점에 코드 샘플이다.

이때는 바이블처럼 메모리누수없는 성능좋은 자료구조를 개발자들이 구현가능했어야 하는 시점이다.

서비스 로직보다. 자신이 작성한 자료구조가 얼마나 더 빠른고 안전한지에대해 더 열정을 퍼 붓던 시절이다.

자신의 기술력을 훈련할수 있는 정량적인 문제 해결에 집중을 하던 시대라고 정의를 하고 1세대 부터 시작해보겠습니다.

1세대 - OOP

#include <iostream>

struct Node{

    Node* prev;
    Node* next;

    void* data;
};

struct List{
    Node* head;
};

List* createList(){

    Node* head = new Node;
    head->prev = head;
    head->next = head;
    head->data = 0;

    List* list = new List;
    list->head = head;

    return list;
}

void insertNodeAfter(Node* node, void* data){
    
    Node* before = node;
    Node* after = node->next;

    Node* newNode = new Node;
    newNode->data = data;
    newNode->next = after;
    newNode->prev = before;

    after->prev = newNode;
    before->next = newNode;
}

void removeNode(Node* node, bool deleteData){

    Node* before = node->prev;
    Node* after = node->next;

    before->next = after;
    after->prev = before;

    if (deleteData)
        delete node->data;
    delete node;
}
............................................
// 이하생략 이만큼의 코드로도 리스트가 제대로 작동하지않는다.
// 또한 스레드 세이프하기위해서 더 신경쓰야할 부분도있다.


그리고 몇년이 흘러,이러한것을 작성할 필요없는(자료구죠) stl이 등장하였고-  stlport라는 c++비공식 라이브러리였으며 표준에 채택되기 까지는 더 많은 시간이 필요했음

자주 사용되는 자료구조를 구현이아닌 이용을 할수 있는  신기방기한 녀석이 등장하였다. 우수한 개발자들의 역량이 자료구조 설계에 있었으며

이때 등장한 STL을 반가울리 없었으며, STL 과 성능 벤치마크까지 해서 자신의 자료구조의 성능을 증명하거나, 마지막까지 고수하였지만  

이 녀석의 등장으로 곧 템플릿+제네릭 프로그램이 유행을하였으며 프라이빗한 자료구조는 몽땅 대체되기 시작하였다. 

자료구조를 아주 잘 작성하는 개발자의 시대가 끝났다란것을 의미하기도 한다.

물론 이러한 개발자가 도메인개발까지 잘할수 있다란것은 별개의 문제이다.


1.5 세대 : 제네릭 프로그래밍

#include <algorithm>
#include <iostream>
#include <list>
 
int main()
{
    // Create a list containing integers
    std::list<int> l = { 7, 5, 16, 8 };
 
    // Add an integer to the front of the list
    l.push_front(25);
    // Add an integer to the back of the list
    l.push_back(13);
 
    // Insert an integer before 16 by searching
    auto it = std::find(l.begin(), l.end(), 16);
    if (it != l.end()) {
        l.insert(it, 42);
    }
 
    // Iterate and print values of the list
    for (int n : l) {
        std::cout << n << '\n';
    }
}

위와같이 자료구조를 컨테이너화하는 제네릭컨셉은 java,c#을 포함하여 여러가지 언어에서 공통적으로 이용할수 있다.

c++은 java가 탄생하기전에 이미 위와같은 컨셉이 적용되고 실험되었으며 OOP의 역사는 c++을 중심으로 보는것이 이해가 쉽다.


2세대 : 멀티스레드 작성의 몰락과 비동기 프로그래밍


하드웨어의 발전과 함께 단일노드에서 멀티스레드를 통한 대용량처리가 주류를 이루었으며

IOCP SOCK에서 절정을 이루었습니다. 이때 고급 개발자의 역량은 단일노드 만명동시처리를

멀티스레드의 작성을 통해 하던 시기 였습니다.

하지만 무어의 법칙에의해 하드웨어 성능의 비약적 발전은 종료되게되며, 공짜점심이 끝났다라고 표현합니다.

인터넷의 발전과함께 사용자가 늘어남과 동시에 사용자한명이 소모하는 트래픽이 늘어나게 되었으며

더이상 단일노드 멀티스레드 최적화를 통해 트래픽 커버를 할수 없게됩니다.

분산처리를 위해 복잡한 멀티스레드 개발방식은  단순화가 필요했으며 , asyn 라는 비동기 프로그래밍이

시작되었습니다.   


콜백헬이라는 몸살을 겪으며 함수형이 함께 도입되며 Future 와 Promice라는

컨셉으로 완결이 되는것으로 보이며 곧바로 함수형시대가 열리게 됩니다.



참고:

Future and Promice

3세대 : 람다와 함께 함수형 프로그래밍의 등장


이제는 람다 + 함수형과 결합을 하여 불변하지 않는 리스트 객체를 이용하여

집계 통계등을 신기방기한 방식으로 간단한 코드로 표현이 가능 해졌습니다.

이것은 복잡한 비동기 처리 개발방법이 필요없어지게 되었고, 알아서 멀티코어를 활용하여

다중 동시 처리를 해준다.

아래코드는 C#이며, JAVA 8 Stream에서도 비슷하게 작성할수가 있다.

List<Person> persons = new List<Person>()
{
    new Person { PersonId = 1, car = "Ferrari" },
    new Person { PersonId = 1, car = "BMW" },
    new Person { PersonId = 2, car = "Audi"}
};


List<Result> results2 = persons
    .GroupBy(p => p.PersonId, 
             (k, c) => new Result()
                     {
                         PersonId = k,
                         Cars = c.Select(cs => cs.car).ToList()
                     }
            ).ToList();


스칼라의 WordCount는 함수형 프로그래밍을 통해 데이터의 집계처리를 단순화한 좋은 예이다.

https://spark.apache.org/examples.html


최근 핫한 스칼라/언랭/파이썬 등에서 위와같은 컨셉이  나왔고 그것을 이용하는것만이 모던한 개발 이고

나머지는 아니라고 잘못된 정의를 내리는 경우를 보았다.

템플릿/람다/제네릭/함수형 그 컨셉이 메니지드 언어에 존재하지도 았을때-예를 들면 자바 4혹은 닷넷 프레임웍 2.0 이하시절

이미 오래전, 10년도 더 전에 C++에서 시도 되었고  Boost(https://www.boost.org/)로 집약이 되어있다.


만약 함수형+스트리밍을 통해 서비스를 처리하는 방식에 도전하고 싶다면

akka http 에서 그 컨셉이 잘 정리되었으니 참고가 될듯하다.  -akka는 비교적 모던한 개발방식뿐아니라, 앞으로 유행될 내용에대해 컨셉을 잘정리하면서 빨리적용되는 편이다. 

https://doc.akka.io/docs/akka-http/current/introduction.html


하지만, 웹서비스에서 Java코드를 사용하는 Spring Boot(의존성자동주입과,어노테이션의 천국)이 여전히 안정적이고

MSA에서 성공한 넷플릭스의 개발패턴을 잘 옮겨온 , Spring Boot Cloud로 다시한번 인기가 이어가고 있다.  


4세대 : 1~3세대의 장점을  잘 융합하는 마이크로서비스의 시대


최근에 다양한 마이크로  서비스를 통해 분산처리되고 관리가 되는 어플리케이션 구성에 고민을 하고 있으며

시대에따라 달라 질수도 있지만 그러한 관점에서 모던한 개발에서 필요한것이 무엇인가? 를 정의를 할필요가 있다고 봅니다.


어떠한 언어나 플랫폼이 아니라, 우리 도메인에서 필요한게 무엇이고? 개발자에게 필요한 역량이 무엇인가를  정리하고 탐구하는것입니다.

이미 잘하고 있는 CRUD만 하는 방식을 최신언어 최신 플랫폼으로 다시 작성하는것은 의미가 없으며, 최신 언어기법만을 사용한것이 모던한 개발을 의미 하지 않습니다.


모던한 개발의 도전과제

  • 도메인 객체인 엔티티,Aggregate,Repository를 OOP를 통해 분리하는 방법 (OOP설계능력 향상을 통한 도메인처리)
  • 대용량 처리에서 역압력 사용을 위한 스트림의 활용과 메시지큐의 활용 ( Akka,Kafka 등등)
  • 분산처리를 위한 라우팅설계및 클러스터활용과 다른 플랫폼을 상호 연동하는 방법
  • 전통적인 예외처리를 개선하는 패러다임의 활용 ( Let it Crash By Supervisor )
  • 다양한 테스트 개발환경 구축과 유닛테스트 커버리지를 올릴수 있는 방안및 지속적 통합(CI)


5세대 : 클라우드의 전성기


 클라우드에는 우리가 필요로하는 모든것이 갖추어지기 시작했으며, 몇가지 개발이 필요했던 인프라들을 그냥 가져다 쓸수가 있으며

도커의 발전과 함께 베어메탈의 시대에서 급격히 변화하고 있습니다. 


지금 시대에 개발자의 지식탐구 방향을 어떻게 할것인가? 를 고민해볼필요가 있으며

어디까지 구현하고 설계할것인가(온프레미스) VS 비용을 지불하고 잘 가져다 사용할것인가(AWS)?

고민을 하게 됩니다. 무엇이되든 가치가 변하지 않는 핵심은 언어및 플랫폼에 종속적이지 않다는것입니다.

 

Next : 무엇이 중헌디?



  • No labels