Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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

1세대 - OOP

Code Block
languagecpp
themeEmacs
#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;
}
............................................
// 이하생략 이만큼의 코드로도 리스트가 제대로 작동하지않는다.
// 또한 스레드 세이프하기위해서 더 신경쓰야할 부분도있다.

...

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


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

Code Block
languagecpp
#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';
    }
}


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

...

멀티스레드 프로그래밍이아닌 동시성 처리를 위한 비동기처리를 위한 여러가지 언어스펙이 발생하게되며

콜백헬을 방지하는 여러가지 방안이 생기기 시작합니다.

그리고 Future 와 Promice라는 컨셉으로 완결이 되는것으로 보입니다.

Image Added


참고:

Future and Promice

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

...

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

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

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

다중 동시 처리를 해준다.

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

...

이러한 코드를 사용하는것이  고급개발자인것처럼 포장되는경우도 있다.

이것이 지원되지 않는 언어는 구닥다리 언어인것처럼 배척하기도한다.


더 본질적이고 중요한 가치에대해 이야기를 하고 선택을 해야할것이다.

예를 들면 빅데이터를 빠르게 분석하기위해 Spark+Scala(Python) 를 선택했을때

얻는 이점과 기존 플랫폼과의 연동방안등이다. 

여기서 자바/닷넷  혹은 최근 핫한 스칼라등에서 위와같은 컨셉이  최근배운 언어스펙에서


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

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


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

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

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

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

즉, 람다와 함수형 언어를 사용하는것이 모던한 개발이 아니란 말이다. 이것은 오래전부터 시도 되고, c++에서는  진작에 구현되고

실험되던 녀석들이다. 다만 최근에와서 특정분야에 유행되기 시작하고, 전파되기 시작하면서 효율을 보이고 있으며

라이프가 길었던 언어(c#,java등)에서는 그 도입이 약간 늦고, 비교적 태생이 늦었던 언어들은 공격적인 버젼업을 하면서

그 도입이 빨랐을뿐이다.  

최근에는 자료구조가아닌 수많은 되어있다.


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

최근에는 단순하게 언어가 지원하느냐 아니냐가 아닌

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

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


모던한 개발에서 요구되는 사항

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


그리고 이것은 다음과 같은 두가지 주제로 확장이 됩니다.

...