노드 그래프 아키텍처

[섬네일|[블렌더 (소프트웨어)|블렌더의 셰이더 노드]]
**노드 그래프 아키텍처**(Node graph architecture)는 노드 그래프 개념을 중심으로 구성된 소프트웨어 설계이다. 소스 코드와 사용자 인터페이스는 모두 원자적 기능 단위의 편집 및 구성(또는 연결)을 중심으로 설계된다. 노드 그래프는 시각적 프로그래밍 언어의 한 유형이다.

소프트웨어 애플리케이션의 소스 코드는 노드라고 불리는 원자적 기능 단위로 구성된다. 이는 일반적으로 모든 노드의 기반 클래스에서 파생된 클래스를 사용하여 수행된다. 각 노드는 입력과 출력을 가질 수 있으며, 이는 일반적으로 모든 입력 및 모든 출력의 기반 클래스에서 파생된 클래스를 사용하여 구현된다. 출력과 입력은 서로를 참조할 수 있으며, 일반적으로 다른 출력 또는 입력의 인스턴스에 대한 포인터를 보유하여 참조한다. 노드가 기능을 실행할 때, 노드는 입력에 저장된 포인터를 따라 다른 노드에서 출력된 데이터를 검색하여 입력을 가져온다. 그런 다음 노드는 이러한 입력에 대해 작업을 실행하여 자체 출력을 생성한다. 이러한 방식으로 노드를 함께 연결하는 능력은 복잡한 작업이나 문제를 이해하기 쉬운 원자적 노드 단위로 분해할 수 있게 한다.

소프트웨어 애플리케이션의 사용자 인터페이스는 종종 사용자에게 노드 그래프를 시각적으로 표시한다. 노드는 종종 직사각형으로 그려지며, 노드 간의 연결은 선 또는 스플라인으로 그려진다.

**노드 그래프 아키텍처**의 사용은 1960년대에 시작되었다. 오늘날 노드 그래프의 사용은 폭발적으로 증가했다. 그래픽스, 게임 및 기계 학습 분야는 이 소프트웨어 설계의 주요 채택자이며 대부분의 도구가 노드 그래프 아키텍처를 사용한다.

오늘날까지 시각적 프로그래밍과 노드 그래프 아키텍처의 이점에 대한 논쟁이 있다. 옹호자들은 노드 그래프가 제공하는 추상화가 도구를 사용하기 쉽게 만든다고 강조한다. 비판자들은 시각적 프로그래밍이 너무 제한적이며 작업을 수행하기 위해 소스 코드나 스크립트를 수정해야 한다고 강조한다.

## 역사

모든 소프트웨어 애플리케이션에 있는 모든 노드 그래프 사용자 인터페이스의 스냅샷을 수집하려는 의 지속적인 노력이 있다. 이 노력은 노드 그래프 사용자 인터페이스의 초기 뿌리부터 시작하여 진화와 폭발을 문서화하려고 시도한다. 이 시각적 역사는 Visual Programming Languages - Snapshots라는 블로그 페이지에서 호스팅된다. 노드 그래프 아키텍처와 시각적 프로그래밍으로 이어진 작업은 1960년대 "인간-기계 통신"이라는 분야에서 시작된 것으로 보인다.

윌리엄 로버트 서덜랜드의 MIT 논문(1966년) "Online Graphical Specification of Procedures"에서 그는 2D 그림 언어를 둘러싼 주제를 설명하고 분석한다. 이것은 데이터플로 기반 워크플로 또는 프로그램에 대한 최초의 조사 중 하나이다. 그 이후 그의 논문은 오늘날 데이터플로 아이디어에 대한 소송을 진압하기 위한 "선행 기술"로 사용되어 왔다. 그의 작업은 오늘날 컴퓨터 지원 설계(CAD)로 알려진 것에 길을 열었다고 종종 생각된다.
# 그림 프로그램은 병렬 프로세스를 표현하는 자연스러운 방법이다. 언어의 2차원적 특성은 동시에 발생하는 많은 것들을 시각화하는 데 도움이 된다.
# 프로그램, 특히 병렬 프로그램의 디버깅 용이성은 그림 언어 형태로 향상될 것이다. 데이터 프로브를 연결하고 프로그램이 실행되는 것을 볼 수 있으면 다른 어떤 방법으로는 얻기 어려운 세부 사항을 파악할 수 있다.
# 프로그램 실행은 일반적인 명시적 순차 흐름 규칙에 의해 제어될 필요가 없다. 프로그램 내 데이터의 이동이 작동을 결정할 수 있다. 데이터 제어 규칙은 그래픽 프로그램이 어떻게 작동해야 하는지에 대한 우리의 직관적인 아이디어와 밀접하게 일치하며 명시적인 흐름 지정 없이 병렬 프로그래밍을 허용한다.

1969년, T. O. 앨리스, J. F. 힐프너, W. L. 시블리는 GRAIL(Graphical Input Language)에 관한 논문을 발표했다. 그들의 작업은 아이번 서덜랜드가 사용자가 태블릿에 직접 컴퓨터 명령을 쓸 수 있는 시스템인 스케치패드 연구에서 시작된 RAND 태블릿과 관련이 있었다. GRAIL 시스템은 흐름도 기반의 그래픽 프로그래밍 언어를 사용했으며 손글씨와 제스처를 인식할 수 있었다. 앨런 케이는 GRAIL 시스템의 여러 데모를 선보였지만, 그는 시스템 생성에 참여하지 않았다.

# GRAIL 시스템의 중요한 조직 개념은 제어의 순차적 흐름, 서브루틴의 계층 구조, 그리고 처음 두 개념 내에서 조직을 그림으로 나타내는 언어(흐름도)이다.
# 제어의 순차적 특성은 사람이 특정 기능에 적응된 독립적인 프로세스를 구상할 수 있게 해주며, 이는 결국 조직자가 전체 프로그램을 관리 가능한 하위 부분으로 생각할 수 있게 해준다.
# 서브루틴 계층 구조는 독립적인 프로세스 개념을 더욱 강조한다.
# 흐름도는 이러한 상호 관계를 2차원으로 표현함으로써 사람이 자신의 제어 옵션과 프로세스 간의 관계를 시각화하는 데 도움을 준다.

center|섬네일|400px|블렌더 노드 그래프, 2006

노드 그래프 아키텍처의 최근 사용 중 일부는 2005년경에 시작되었다. 이 시기의 노드 그래프는 노드 그래프의 복잡성을 다루기 위한 패러다임을 개발하기 시작한다. 그래프의 노드와 링크 수가 증가함에 따라 복잡성이 발생했다. 복잡성을 다루는 주요 아이디어 중 하나는 노드를 그 자체 내부에 숨기고 그룹의 입력과 출력만 노출하는 그룹 또는 패키지 노드 개념이었다.

* 카타나, 파운드리
* 후디니, 사이드FX
* 누크, 파운드리
* 마리, 파운드리
* 마야, 오토데스크
*  — 공식 문서
* 그래스하퍼, 맥닐 앤 어소시에이츠
* 다이내모, 오토데스크

## 추상화 및 복잡성

"소프트웨어 아키텍처의 계층적 작은 세계(Hierarchical Small Worlds in Software Architecture)"라는 논문에서 저자 세르히 발베르데는 대부분의 대규모 소프트웨어 시스템이 모듈식 및 계층적 방식으로 구축되며, 노드 그래프를 사용하여 대규모 소프트웨어 시스템을 분석할 수 있다고 주장한다. 다른 많은 소프트웨어 분석 논문은 종종 노드 그래프를 사용하여 대규모 소프트웨어 시스템을 분석하며, 이는 노드 그래프가 소프트웨어의 내부 구조 및 작동에 대한 좋은 모델임을 시사한다.

## 시각적 프로그래밍 논쟁

노드 그래프는 더 넓은 범위의 시각적 프로그래밍 언어의 하위 집합이다. 노드 그래프를 사용하면 소스 코드를 작성하는 대신 시각적이고 구조적인 방식으로 프로그램을 설계할 수 있다. 영화 및 비디오 게임 산업에서 노드 그래프는 시각적 프로그래밍과 동의어이다. 현재 노드 그래프 및 시각적 프로그래밍 언어의 힘, 추상화 및 필요성에 대한 논쟁이 진행 중이다.

* 시각적 프로그래밍 옹호자들은 일반적으로 시각적 프로그래밍이 많은 세부 사항을 추상화하고 해당 도메인에 필요한 제어만 노출함으로써 프로그래밍을 얼마나 단순화하는지 강조한다. 이러한 제어는 노드의 동작을 제어하는 노드의 매개변수와 노드 간의 링크이다.
* 시각적 프로그래밍 비판자들은 일반적으로 시각적 프로그래밍이 충분한 제어를 제공하지 않으며, 더 복잡한 작업을 위해서는 소스 코드를 작성해야 할 필요성이 커진다고 강조한다. 그러나 이러한 더 복잡한 작업은 종종 노드 그래프의 의도된 사용 또는 도메인 범위를 벗어난다.

이는 오늘날까지 공개 포럼에서 새로운 토론이 이루어지는 활발한 논쟁 영역으로 남아 있다. 다음은 현재까지 가장 큰 토론 중 일부이다.

* 해커 뉴스 토론, 2014
* 해커 뉴스 토론, 2019
* 레딧 토론, 2019

연구는 이러한 토론에 더 많은 세부 사항을 제공하고 노드 그래프의 장점과 단점을 더 많이 강조하는 경향이 있다. 연구 결과는 노드 그래프와 시각적 프로그래밍이 새로운 사용자에게는 이해하기 쉽지만, 사용자가 더 복잡한 작업으로 전환할 때 종종 텍스트 소스 코드를 작성해야 한다는 것을 보여준다. 또 다른 설문조사는 시각적 프로그래밍의 인지적 효과에 대한 사람들의 신념에 초점을 맞추었으며, 전문 프로그래머가 시각적 프로그래밍에 가장 회의적이라는 것을 발견했다. 다른 연구에서는 심리 실험에서 시각적 프로그래밍이 인지 작업의 성능에 상당한 긍정적인 영향을 미칠 수 있음을 보여주었다.

## 노드 그래프
center|섬네일|400px|노드 그래프 예시

소프트웨어 구조의 맥락에서 **노드 그래프**는 노드라고 불리는 원자 단위로 소프트웨어 기능을 조직하고, 노드들이 링크를 통해 서로 연결될 수 있는 것을 의미한다. 노드 그래프에서 노드와 링크를 조작하는 것은 종종 프로그래밍 가능한 API를 통해 또는 마우스를 사용하여 시각적 인터페이스를 통해 수행할 수 있다. 위 다이어그램에서 노드 그래프는 오른쪽에 나타난다.

현대적 용법에서 "node graph"라는 용어는 개방 복합어이다. 그러나 이전 소프트웨어에서는 "nodegraph"라는 폐쇄 복합어로 불렸다.

* 노드그래프, 밸브 소프트웨어
* 노드그래프, 노치

### 노드
노드는 어떤 종류의 계산을 수행한다. 노드는 이러한 실행 가능한 기능을 캡슐화하며 종종 입력 값을 받아들이고 실행의 부산물로 출력 값을 생성한다. 간단한 예시는 두 숫자를 더하는 노드이다. 입력은 더할 두 숫자이고 출력은 두 숫자의 합이다.

노드는 다음 형태의 수학 함수와 유사하다.

여기서 f_{nodeA}는 노드의 계산, inputs_{nodeA}는 노드의 입력 값 벡터, {outputs}_{nodeA}는 노드의 출력 값 벡터이다.

시각적으로 노드는 종종 직사각형으로 표현된다. 그러나 이는 모든 애플리케이션에서 따르는 규칙은 아니다. 위 다이어그램에는 "비디오", "별 추가", "원 추가"라고 레이블된 세 개의 노드가 있다.

### 노드 매개변수
노드는 종종 실행을 정의하는 추가 매개변수를 갖는다. 이 매개변수들은 노드의 소스 코드에 있는 자료형에 의해 뒷받침된다.

수학적으로는 노드의 계산 함수에 대한 추가 입력 값으로 생각할 수 있다. 유일한 차이점은 이러한 값이 다른 노드에 의해 실행의 부산물로 출력되는 대신 사용자가 직접 제어한다는 것이다. 예를 들어, 두 숫자를 더하는 노드에 대한 위 간단한 예시에서, 노드에 편향 매개변수를 도입하여 노드가 합계에 추가 고정 숫자를 더할 수 있도록 할 수 있다.

시각적으로 노드의 매개변수는 사용자가 노드를 클릭한 후에 종종 노출된다. 이는 노드 그래프의 시각적 혼잡을 줄이는 데 도움이 된다. 위 다이어그램에서 "별 추가" 노드 옆에 매개변수 창이 열리는 것을 볼 수 있다.

### 노드 입력 및 출력
위에서 논의했듯이 노드는 종종 입력과 출력을 갖는다. 입력과 출력은 노드의 소스 코드에 있는 자료형에 의해 뒷받침된다. 입력과 출력은 노드의 실행 전후에 값을 저장하는 데 중요하다.

수학적으로 노드의 입력과 출력은 함수의 입력과 출력 값과 유사하다.

여기서 f_{nodeA}는 노드의 계산, inputs_{nodeA}는 노드의 입력 값 벡터, {outputs}_{nodeA}는 노드의 출력 값 벡터이다.

시각적으로 노드의 입력과 출력은 종종 원으로 표현된다.

### 노드 링크
링크는 자료형에 저장된 값을 다른 노드 간에 전송한다. 이는 수학적 합성(composition)과 유사하다. 예를 들어, 노드 A가 노드 B에 출력을 공급하는 경우, 이는 수학적으로 다음과 같이 표현될 수 있다.

여기서 f_{nodeB}와 f_{nodeA}는 노드 B와 노드 A에 의해 수행되는 작업, inputs_{nodeA}는 노드 A의 입력 값 벡터, outputs_{nodeB}는 노드 B의 출력 값 벡터이다.

### 노드 유형
노드의 유형은 실행될 때 수행할 계산 작업을 나타낸다. 노드 그래프에는 종종 다양한 노드 유형이 참여한다. 다음은 몇 가지 예시이다.
* 인기 있는 시각 효과 합성 프로그램인 누크에는 수백 개의 노드가 포함되어 있다. 각 노드는 합성과 관련된 특정 작업을 수행한다.
* 인기 있는 룩 앤 라이팅 소프트웨어인 카타나에는 수백 개의 노드가 포함되어 있다. 각 노드는 컴퓨터 그래픽스 장면의 조명과 관련된 특정 작업을 수행한다.
* 인기 있는 3D 페인팅 소프트웨어인 마리에는 수백 개의 노드가 포함되어 있다. 각 노드는 3D 페인팅과 관련된 특정 작업을 수행한다.

복잡성을 관리하는 데 가장 중요한 노드 유형은 그룹 노드이다. 이 노드 유형은 다른 노드와 같은 방식으로 소프트웨어 코드를 실행하지 않는다. 이 노드는 연결된 노드 하위 집합을 함께 그룹화하고 그룹 안팎으로의 입력 및 출력을 관리한다. 이는 그룹 노드 내부의 복잡성을 숨기고 그룹 외부의 다른 노드와의 결합을 제한한다. 이는 더 작은 그래프가 그룹 노드에 포함되는 계층 구조로 이어진다. 다음은 연결된 노드 하위 집합을 그룹화하고 그래프를 단순화하는 데 사용되는 그룹 노드의 예이다.
* 누크의 그룹 노드.
* 카타나의 그룹 노드.

### 사용자 인터페이스
노드 그래프 아키텍처를 사용하는 소프트웨어 애플리케이션은 일반적으로 노드 그래프를 시각적으로 또는 그래픽적으로 사용자에게 노출하여 사용자가 노드 그래프를 변경할 수 있도록 한다. 마우스를 사용하여 사용자는 일반적으로 다음을 수행할 수 있다.
* 새 노드 만들기
* 노드의 매개변수 편집
* 노드 연결
* 특정 노드까지 그래프 평가
* 노드의 현재 출력 값 보기

노드 그래프 사용이 증가함에 따라 사용자 친화적인 인터페이스를 만드는 데 대한 관심이 높아지고 있다. 종종 이러한 새로운 인터페이스는 사용자 인터페이스 전문가와 그래픽 디자이너에 의해 설계되고 있다. 다음은 예술가와 디자이너가 설계한 일부 사용자 인터페이스이다.

* 드리블의 노드 그래프
* 드리블의 노드

### 유향 비순환 그래프
center|섬네일|550px|유향 비순환 그래프 예시

그래프 이론의 많은 이론적 결과는 노드 그래프, 특히 위상과 관련하여 적용된다. 노드가 함께 연결되어 그래프를 형성하는 이 주제 영역은 잘 연구되어 있다.

노드 그래프 평가 중 특히 우려되는 영역은 순환이다. 노드 그래프에 순환이 존재하면 링크를 따라 노드가 계속 실행되므로 평가가 끝나지 않는다. 이러한 문제를 피하기 위해 많은 노드 그래프 아키텍처는 유향 비순환 그래프로 알려진 그래프의 하위 집합으로 자신을 제한한다.

## 컴퓨터 그래픽스에서의 사용

center|섬네일|400px|노드 그래프 기반 사용자 인터페이스의 예시

소프트웨어 설계에서 **노드 그래프 아키텍처**의 사용은 영화 및 비디오 게임 산업에서 특히 인기가 많다. 위 다이어그램은 비디오 편집 및 제작을 위한 예술 도구의 단순화된 사용자 인터페이스를 보여준다. 노드는 직사각형으로 표시되며 곡선(베지에 곡선)으로 서로 연결된다. 이 소프트웨어의 작동 모델에서는 비디오 시퀀스가 선을 통해 다음 노드로 전달되고, 각 노드는 비디오 시퀀스에 추가적인 수정을 수행한다. 이 예시에서는 하나의 비디오가 2D로 변환되고, 다른 하나는 픽셀화되며, 마지막으로 두 스트림이 병합된다.

다음은 영화 및 비디오 게임 산업에서 **노드 그래프 아키텍처**를 사용하는 소프트웨어의 몇 가지 예시이다.

* 카타나, 파운드리
* 후디니, 사이드FX
* 누크, 파운드리
* 마리, 파운드리
* 마야, 오토데스크
* 블렌더

## 기계 학습에서의 사용

center|섬네일|300px|간단한 신경망 계층

소프트웨어 설계에서 **노드 그래프 아키텍처**의 사용은 최근 기계 학습 애플리케이션에서 매우 인기를 얻었다. 위 다이어그램은 3개의 계층으로 구성된 간단한 신경망을 보여준다. 3개의 계층은 입력 계층, 은닉 계층 및 출력 계층이다. 각 계층의 요소는 가중치이며 다른 계층의 가중치에 연결된다. 추론 중에 기계 학습 알고리즘은 이전 계층의 가중치에 대한 일련의 함수 평가를 통해 출력 계층의 가중치를 평가한다. 훈련 중에 기계 학습 알고리즘은 손실 함수를 최소화하기 위해 최적화를 사용하며, 손실 함수는 출력 계층의 가중치와 예상 값의 차이에 따라 달라진다. 노드 그래프는 이러한 신경망 계층을 시각화하고, 구성하고, 디버깅하는 데 사용된다.

다음은 노드 그래프용 그래픽 인터페이스가 없는 **노드 그래프 아키텍처**를 사용하는 기계 학습 소프트웨어의 예시이다.

* 파이토치, 깃허브, 페이스북
* 텐서플로, 깃허브, 구글

다음은 **노드 그래프 아키텍처**를 사용하는 기계 학습 소프트웨어의 몇 가지 예시이다.

* 그래프북, 세레브렉
* 퍼셉티랩스, KDnuggets
* 딥 코그니션, 딥 코그니션 인크.
* 뉴럴 네트워크 모델러, IBM
* 뉴럴 네트워크 콘솔, 소니
* 디지트, 엔비디아

## 같이 보기
* 어도비 서브스턴스 디자이너

## 내용주

## 각주
* 구조적 거리에 기반한 소프트웨어 아키텍처 변경 메트릭
* 소프트웨어 표현 및 분석
* 
* 
* 
* 
* 비주얼 프로그래밍의 역사: 베이직부터 버블까지
* 스크래치 소프트웨어
* 블록클리 소프트웨어
* 시각적 프로그래밍이란 무엇인가

분류:소프트웨어 구조