Street coder – about this book

Street Coder fills in the gaps of the professional experience of a software developer by tackling well-known paradigms, showing anti-patterns, and seemingly bad or less- known practices that can be useful in the streets—the professional world. The goal of the book is to equip you with a questioning and practical mindset and to help you understand that the cost of creating software is more than just Googling and typing. It also shows that some mundane work can help you save more time than it takes. In general, the book aims to be a perspective changer.

Street Coder

저자인 Sedat Kapanoglu는 미디엄 블로그도 운영중이다. https://ssg.dev/

스트리트 코더는 잘 알려진 패러다임에 도전하고, 잘못된 패턴을 보여주고, 길거리, 즉 직업 세계에서 유용할 수 있는 겉보기에는 나쁘거나 덜 알려진 관행을 보여줌으로써 소프트웨어 개발자의 직업적 경험의 공백을 메워줍니다.
이 책의 목표는 질문과 실용적인 사고방식을 갖추게 하고, 소프트웨어를 만드는 데 드는 비용이 단순히 구글 검색과 타이핑 그 이상이라는 것을 이해하도록 돕는 것입니다.
또한 일상적인 작업으로 시간을 절약할 수 있다는 것을 보여줍니다. 전반적으로 이 책은 관점을 바꾸는 것을 목표로 합니다.


Who should read this book
This book is for beginning- and medium-level programmers who have managed to learn programming by means other than traditional schooling, but who still need an expanded perspective on paradigms and best practices of software development. The examples are in C# and .NET, so familiarity with those languages can help as you read, but the book strives to be, as much as possible, language and framework agnostic.

Street coder

이 책을 읽어야 하는 대상
이 책은 전통적인 학교 교육 이외의 방법으로 프로그래밍을 배웠지만 소프트웨어 개발의 패러다임과 모범 사례에 대한 확장된 관점이 필요한 초급 및 중급 프로그래머를 위한 책입니다. 예제는 C#과 .NET으로 작성되었으므로 해당 언어에 익숙하면 읽는 데 도움이 될 수 있지만, 이 책은 가능한 한 언어와 프레임워크에 구애받지 않으려고 노력했습니다.

agnostic = 불가지론적

by means other than : 이외의 방법으로 

can help as you read : 

Apache 라이선스 버전 2.0

Apache 라이선스 버전 2.0은 Apache 소프트웨어 재단에서 관리하는 오픈 소스 라이선스입니다. 이 라이선스는 사용자에게 소프트웨어를 사용, 복제, 수정, 배포할 권리를 부여하면서도 몇 가지 중요한 법적 보호와 요구 사항을 명시하여 개발자와 사용자의 권리를 모두 보호합니다.

라이선스의 주요 특징

  1. 저작권 보호 및 허가: Apache 라이선스 2.0은 저작권 보호를 유지하면서 사용자에게 소프트웨어를 자유롭게 사용, 복제, 수정 및 배포할 수 있는 권한을 부여합니다.
  2. 명시적 특허 라이선스: 라이선스는 소프트웨어와 함께 제공되거나 기여된 모든 특허에 대해 명시적인 라이선스를 제공합니다. 이는 사용자가 해당 소프트웨어를 사용할 때 특허권 침해의 우려 없이 사용할 수 있음을 보장합니다.
  3. 상표: 라이선스 하에 배포되는 소프트웨어에서 원본 상표를 사용하지 못하도록 제한하며, 사용자가 자신의 버전의 소프트웨어를 배포할 때는 상표에 대한 명확한 규칙을 따라야 합니다.
  4. 재배포: 소프트웨어의 재배포시, 원본 소스 코드 또는 수정된 소스 코드와 함께 라이선스 사본과 변경 사항을 명시해야 합니다. 이는 소프트웨어의 이전 버전과 변경된 버전을 명확하게 구분할 수 있게 합니다.
  5. 변경된 파일의 명시적 표시: 수정된 파일은 명시적으로 표시되어야 하며, 해당 변경의 날짜와 내용에 대한 기록을 포함해야 합니다.
  6. 배포 제한 없음: Apache 라이선스 2.0은 소프트웨어를 상업적이거나 비상업적 목적으로 사용하는 데 제한을 두지 않습니다. 사용자는 소프트웨어를 자유롭게 배포할 수 있으며, 소프트웨어를 판매하는 것도 허용됩니다.
  7. 책임의 부인: Apache 라이선스는 소프트웨어가 ‘있는 그대로’ 제공됨을 명시하며, 어떠한 종류의 보증도 명시적으로 거부합니다. 이는 사용자가 소프트웨어 사용으로 인한 위험을 감수함을 의미합니다.
  8. 기여자에 대한 보호: 라이선스는 기여자가 제3자의 소송으로부터 보호받을 수 있도록 조치를 제공합니다. 사용자가 소프트웨어를 사용하여 발생한 문제에 대해 기여자를 고소할 수 없습니다.

Apache 라이선스의 주요 조항

  • 정의: 라이선스에서 사용하는 주요 용어와 정의를 명시합니다.
  • 저작권과 특허권: 소프트웨어를 사용할 권리와 함께, 소프트웨어에 대한 특허권 사용 권한도 부여합니다.
  • 재배포: 소프트웨어를 재배포할 때는 라이선스의 사본과 함께 변경 사항, 저작권 표시, 그리고 원본에서 수정된 파일을 명시해야 합니다.
  • 상표 사용 제한: 소프트웨어에서 원본의 상표를 사용할 수 없습니다.
  • 보증 거부: 소프트웨어는 보증 없이 제공되며, 소프트웨어의 사용으로 발생하는 모든 위험은 사용자가 감수합니다.
  • 책임의 제한: 라이선스는 소프트웨어 사용으로 인해 발생할 수 있는 책임을 제한합니다.

사용 사례와 예

Apache 라이선스 2.0 하에 라이선스된 소프트웨어를 사용하는 경우, 사용자는 다음과 같은 활동을 할 수 있습니다:

  1. 소프트웨어 수정 및 개인화: 필요에 따라 소프트웨어를 수정하고, 이를 재배포할 수 있습니다.
  2. 상업적 사용: 소프트웨어를 상업적 제품이나 서비스의 일부로 사용할 수 있습니다.
  3. 배포 및 판매: 수정된 소프트웨어를 자유롭게 배포하고, 필요한 경우 판매도 가능합니다.
  4. 오픈 소스 프로젝트 기여: 다른 오픈 소스 프로젝트에 기여하거나, 새로운 오픈 소스 프로젝트를 시작할 때 Apache 라이선스 2.0을 사용할 수 있습니다.

Apache 라이선스 2.0은 그 유연성과 명확성으로 많은 오픈 소스 프로젝트 및 상업적 프로젝트에서 선호되는 라이선스 중 하나입니다. 이 라이선스는 개발자와 사용자 모두에게 명확한 권리와 의무를 제공하며, 오픈 소스 커뮤니티의 활성화에 크게 기여하고 있습니다.

릭 루빈 2 – 튜닝 인

튜닝 인


우주를 영원히 펼쳐지는 창조적 공간이라고 생각하세요. 나무는 꽃을 피웁니다.
세포는 복제합니다.
강은 새로운 지류를 형성합니다.
세상은 생산적인 에너지로 진동하며, 이 지구상에 존재하는 모든 것은 그 에너지에 의해 움직입니다.
이러한 전개의 모든 현상은 우주를 대신하여 각자의 방식으로, 각자의 창조적 충동에 충실하게 자신의 일을 하고 있습니다.
나무가 꽃과 과일을 키우듯 인류는 예술 작품을 창조합니다. 금문교, 화이트 앨범, 게르니카, 아야 소피아, 스핑크스, 우주 왕복선, 아우토반, ‘클레어 드 룬’, 로마의 콜로세움, 필립스 드라이버, 아이패드, 필라델피아 치즈스테이크 등…….
주위를 둘러보면 감사할 만한 놀라운 업적이 너무나 많습니다. 벌새가 둥지를 짓고, 복숭아나무가 열매를 맺고, 뭉게구름이 비를 내리는 것처럼, 이 모든 것들은 인류가 스스로에게 진실한 존재가 된 것입니다.
모든 둥지, 모든 복숭아, 모든 빗방울, 모든 위대한 업적은 저마다 다릅니다. 어떤 나무는 다른 나무보다 더 아름다운 열매를 맺는 것처럼 보일 수 있고, 어떤 사람은 다른 사람보다 더 위대한 작품을 만들어내는 것처럼 보일 수 있습니다. 맛과 아름다움은 보는 사람의 눈에 달려 있습니다.
구름은 비가 올 때를 어떻게 알까요? 나무는 봄이 언제 시작되는지 어떻게 알까요? 새는 새 둥지를 지을 때가 언제인지 어떻게 알까요?
우주는 시계처럼 작동합니다:

모든 것에
계절이 있고
하늘 아래 모든 일에는 때가 있네 태어날 때와 죽을 때가 있네
심을 때, 거둘 때
죽일 시간, 치유할 시간
웃을 때, 울 때
쌓을 때와 무너뜨릴 때 춤출 때와 슬퍼할 때
돌을 버릴 시간
함께 돌을 모으는 시간

이러한 리듬은 우리가 정한 것이 아닙니다. 우리 모두는 우리가 수행하지 않는 더 큰 창조적 행위에 참여하고 있습니다. 우리는 지휘를 받고 있습니다. 예술가는 모든 자연과 마찬가지로 우주의 시간표에 따라 움직입니다.
마음에 드는 아이디어가 있어도 그것을 실현시키지 못한다면, 그 아이디어가 다른 제작자를 통해 목소리를 내는 경우가 드물지 않습니다. 이는 다른 아티스트가 아이디어를 훔쳐서가 아니라 아이디어의 시대가 왔기 때문입니다.
이 거대한 전개 속에서 아이디어와 생각, 주제와 노래, 기타 예술 작품은 에테르 속에 존재하며 일정에 따라 숙성되어 물리적 세계에서 표현될 준비가 되어 있습니다.
예술가로서 우리는 이 정보를 끌어내어 변환하고 공유하는 것이 우리의 임무입니다. 우리 모두는 우주가 보내는 메시지의 통역사입니다. 최고의 예술가들은 특정 순간에 공명하는 에너지를 끌어당길 수 있는 가장 민감한 안테나를 가진 사람들입니다. 많은 위대한 예술가들은 예술을 창조하기 위해서가 아니라 자신을 보호하기 위해 예민한 안테나를 먼저 개발합니다. 그들은 모든 것이 더 아프기 때문에 자신을 보호해야 합니다. 그들은 모든 것을 더 깊이 느끼기 때문입니다.

예술은 종종 사조로 등장합니다. 바우하우스 건축, 추상 표현주의, 프랑스 뉴웨이브 영화, 비트 시, 펑크 록 등 최근의 역사에서 몇 가지 예를 들 수 있습니다. 이러한 사조는 물결처럼 나타나며, 일부 예술가들은 그 문화를 읽고

문화를 읽고 그 파도를 타기 위해 스스로를 포지셔닝합니다. 다른 사람들은 파도를 보고 그 흐름을 거슬러 헤엄치는 것을 선택할 수도 있습니다.
우리 모두는 창의적 사고를 위한 안테나 역할을 합니다. 어떤 신호는 강하게 잡히지만 어떤 신호는 더 희미하게 잡히기도 합니다. 안테나가 민감하게 조정되지 않으면 잡음 속에서 데이터를 잃을 가능성이 높습니다. 특히 우리가 감각 인식을 통해 수집하는 콘텐츠보다 더 미묘한 신호가 들어오는 경우가 많기 때문입니다. 이러한 신호는 촉각보다 더 활기차고, 의식적으로 기록하는 것보다 직관적으로 인식됩니다.
대부분의 경우 우리는 오감을 통해 세상으로부터 데이터를 수집하고 있습니다. 더 높은 주파수로 전송되는 정보를 통해 우리는 물리적으로 파악할 수 없는 에너지적인 물질을 전달하고 있습니다. 이는 전자가 동시에 두 곳에 존재할 수 있는 것과 마찬가지로 논리를 거스르는 것입니다. 이 파악하기 어려운 에너지는 그 가치가 매우 크지만, 이를 받아들일 수 있을 만큼 개방적인 사람은 거의 없습니다.
들리지도 정의할 수도 없는 신호를 어떻게 포착할 수 있을까요? 답은 찾지 않는 것입니다. 또한 그 신호에 도달하는 방법을 예측하거나 분석하려고 시도하지도 않습니다. 대신, 우리는 그것을 허용하는 열린 공간을 만듭니다. 우리 마음의 일반적인 과대 포장 상태에서 벗어나 진공 상태처럼 작동하는 공간. 우주가 제공하는 아이디어를 끌어내려 보세요.
이러한 자유를 얻는 것은 생각만큼 어렵지 않습니다. 우리 모두는 그렇게 시작합니다. 어렸을 때 우리는 아이디어를 받아들이고 내면화하는 데 간섭이 훨씬 적습니다. 우리는 이미 믿고 있는 것과 비교하는 대신 새로운 정보를 기쁜 마음으로 받아들이고, 미래의 결과에 대해 걱정하기보다는 현재를 살아가며, 분석적이기보다는 즉흥적이고, 지루해하기보다는 호기심이 많습니다. 인생의 가장 평범한 경험조차도 경외감으로 다가옵니다. 깊은 슬픔과 격렬한 흥분이 한순간에 찾아올 수 있습니다. 이야기에는 겉치레도 없고 애착도 없습니다.
평생 훌륭한 작품을 지속적으로 창작할 수 있는 예술가들은 종종 이러한 어린아이와 같은 자질을 보존할 수 있습니다. 때묻지 않은 순수한 눈으로 세상을 바라볼 수 있는 존재 방식을 연습하면 우주의 시간표에 맞춰 행동할 수 있는 자유를 얻을 수 있습니다.

어떤 아이디어가 떠오를 때가 있고, 그들은 우리를 통해 자신을 표현할 방법을
우리를 통해 표현할 방법을 찾습니다.

릭 루빈 1 – 누구나 크리에이터입니다

누구나 크리에이터입니다

전통 예술에 종사하지 않는 사람들은 스스로를 예술가라고 부르는 것을 경계할 수 있습니다. 창의성이란 특별한 것이거나 자신의 능력을 넘어서는 것으로 인식할 수 있기 때문입니다. 이러한 재능을 타고난 특별한 소수의 사람들만 할 수 있는 일이라고 생각하죠.
다행히도 이는 사실이 아닙니다.
창의성은 희귀한 능력이 아닙니다. 접근하기 어렵지 않습니다. 창의성은 인간의 근본적인 측면입니다. 그것은 우리의 타고난 권리입니다. 그리고 우리 모두를 위한 것입니다.
창의성은 예술 작품 제작에만 국한되지 않습니다. 우리 모두는 매일 이 행위를 합니다.
창조한다는 것은 이전에 없던 것을 존재하게 하는 것입니다. 대화, 문제에 대한 해결책, 친구에게 보내는 메모, 방 안의 가구 재배치, 교통 체증을 피하기 위한 새로운 귀가 경로 등 모든 것이 창작의 대상이 될 수 있습니다.
여러분이 만든 것이 예술 작품이 되기 위해 목격되거나, 기록되거나, 판매되거나, 유리로 포장될 필요는 없습니다. 우리는 일상적인 존재의 상태를 통해 이미 가장 심오한 방식으로 현실에 대한 경험을 창조하고 우리가 인식하는 세계를 구성하는 창작자입니다.
매 순간 우리는 감각이 정보를 수집하는 미분화된 물질의 영역에 몰입하고 있습니다. 우리가 인식하는 외부 우주는 그 자체로 존재하지 않습니다. 일련의 전기적, 화학적 반응을 통해 우리는 내부에서 현실을 만들어냅니다. 우리는 숲과 바다, 따뜻함과 추위를 만들어냅니다. 우리는 단어를 읽고, 목소리를 듣고, 해석을 만들어냅니다. 그런 다음 순식간에 반응을 만들어냅니다. 이 모든 것이 우리가 만든 세상에서 이루어집니다.

공식적으로 예술을 하고 있든 아니든, 우리는 모두 예술가로 살아가고 있습니다. 우리는 데이터를 인지하고, 필터링하고, 수집한 다음 이 정보 집합을 기반으로 자신과 타인을 위한 경험을 큐레이팅합니다. 의식적으로든 무의식적으로든, 우리는 살아 있다는 사실만으로도 현재 진행 중인 창작 과정에 적극적으로 참여하고 있습니다.
예술가로 살아간다는 것은 세상에 존재하는 방식입니다. 지각하는 방식입니다. 주의를 기울이는 연습입니다. 더 미묘한 음표에 귀 기울일 수 있도록 감수성을 다듬는 것입니다. 무엇이 우리를 끌어당기고 무엇이 우리를 밀어내는지 찾습니다. 어떤 감정 톤이 발생하고 그것이 어디로 이어지는지 알아차리기.
조율된 선택에 의한 조율된 선택, 여러분의 삶 전체가 자기 표현의 한 형태입니다. 여러분은 창조적인 우주에서 창조적인 존재로 존재합니다. 하나의 예술 작품이죠.

선언형 코드(Declarative Programming)

선언형 코드(Declarative Programming)는 프로그래밍에서 어떤 작업을 수행하는 방법보다는 수행하고자 하는 결과에 초점을 맞춘 접근 방식입니다. 이 방식은 ‘무엇을’ 할 것인가에 집중하며, ‘어떻게’ 할 것인가는 시스템이 결정하도록 합니다.

선언형 프로그래밍의 특징은 다음과 같습니다:

  1. 추상화의 수준이 높음: 선언형 코드는 복잡한 로직이나 상태 관리를 숨기고, 더 높은 수준의 추상화를 제공합니다. 프로그래머는 세부적인 구현보다는 전체적인 목표나 명세에 집중할 수 있습니다.
  2. 코드 간결성: 선언형 프로그래밍은 일반적으로 더 간결하고 읽기 쉬운 코드를 작성하는 데 도움이 됩니다. 이는 코드의 의도를 더 명확하게 전달하고 유지 보수를 용이하게 합니다.
  3. 코드 재사용성 및 모듈성 향상: 선언형 코드는 재사용 가능한 구성 요소로 작성되기 쉽습니다. 이러한 구성 요소는 다른 컨텍스트에서도 쉽게 사용될 수 있으며, 모듈성을 향상시킵니다.
  4. 부작용 감소: 선언형 프로그래밍은 부작용(side effects)을 최소화하는 경향이 있습니다. 이는 프로그램의 예측 가능성과 신뢰성을 높이는 데 도움이 됩니다.

HTML과 SQL은 선언형 프로그래밍의 좋은 예시입니다. 예를 들어, HTML에서는 웹 페이지의 구조를 선언하지만, 이를 어떻게 렌더링할지는 브라우저가 결정합니다. SQL에서는 데이터를 어떻게 조회하고 조작할지를 선언하지만, 실제 데이터베이스가 그 쿼리를 어떻게 처리할지는 숨겨져 있습니다.

React.js 역시 선언형 프로그래밍의 접근을 사용합니다. React에서는 UI의 상태를 선언하고, 그 상태가 변경될 때 UI가 어떻게 업데이트되어야 하는지 React 엔진이 결정합니다. 이는 개발자가 UI의 세부적인 동작보다는 UI의 전체적인 구조와 동작에 더 집중할 수 있게 해줍니다.

선언형 프로그래밍을 이해하기 쉽게 만드는 좋은 방법은, 선언형과 명령형(절차적) 프로그래밍의 차이를 예시를 통해 설명하는 것입니다. 각각의 스타일은 ‘무엇을’ 하고 싶은지(선언형)와 ‘어떻게’ 해야 하는지(명령형)에 초점을 맞춥니다.

명령형 프로그래밍 예시:

문제: 리스트에서 모든 짝수를 찾아 그 합을 계산합니다.

명령형 접근:

  1. 빈 합계 변수를 생성합니다.
  2. 리스트를 순회합니다.
  3. 각 요소가 짝수인지 확인합니다.
  4. 짝수라면 합계에 더합니다.
  5. 최종 합계를 반환합니다.
numbers = [1, 2, 3, 4, 5, 6]
sum_even = 0
for num in numbers:
    if num % 2 == 0:
        sum_even += num
print(sum_even)  # 결과: 12

이 접근 방식에서는 ‘어떻게’ 계산을 해야 하는지 단계별로 설명합니다.

선언형 프로그래밍 예시:

선언형 접근:

  1. 짝수만 필터링합니다.
  2. 필터링된 숫자의 합을 계산합니다.
numbers = [1, 2, 3, 4, 5, 6]
sum_even = sum(num for num in numbers if num % 2 == 0)
print(sum_even)  # 결과: 12

이 접근 방식에서는 ‘무엇을’ 할 것인지를 선언합니다. 즉, “짝수를 찾아 그 합을 구한다”고 선언하며, 구체적인 ‘어떻게’에 대해서는 걱정하지 않습니다.

HTML의 예시:

HTML은 웹 페이지의 구조를 선언적으로 정의합니다. 예를 들어:

<!DOCTYPE html>
<html>
<head>
    <title>My Page</title>
</head>
<body>
    <h1>Welcome to My Page</h1>
    <p>This is a paragraph.</p>
</body>
</html>

여기서는 웹 페이지의 구조를 선언합니다: 제목이 있고, 그 아래에 단락이 있습니다. 이를 어떻게 브라우저에 표시할지는 선언하지 않습니다. 그 결정은 브라우저의 렌더링 엔진이 담당합니다.

React의 예시:

React에서는 UI를 선언적으로 구성합니다:

function WelcomeMessage() {
    return <h1>Welcome to My Page</h1>;
}

ReactDOM.render(<WelcomeMessage />, document.getElementById('root'));

이 코드는 “Welcome to My Page”라는 제목이 있는 컴포넌트를 선언합니다. 이 컴포넌트가 어떻게 렌더링되고, 화면에 어떻게 표시될지에 대해서는 걱정하지 않습니다. 그 작업은 React 라이브러리에 의해 처리됩니다.

이러한 예시들은 선언형 프로그래밍이 ‘무엇을’ 할 것인지에 집중하고, ‘어떻게’ 해야 하는지는 프로그래밍 언어나 프레임워크에 위임한다는 개념을 잘 보여줍니다.

좋은 아이디어는 멍때리기에서 나온다? DMN 탐구

미국 뇌과학자 마커스 라이클 박사의 연구에 따르면, 사람이 아무런 인지 활동을 하지 않을 때 활성화되는 뇌의 특정 부위가 있는데, 이를 ‘디폴트 모드 네트워크'(DMN)라고 합니다.

DMN은 휴식을 취할 때 활성화되며, 몽상을 즐길 때나 잠을 자는 동안에 활발한 활동을 합니다. DMN의 발견은 뇌가 아무것도 하지 않을 때도 몸 전체 산소 소비량의 20%를 차지하는 이유를 설명합니다.

또한, DMN이 활성화되면 창의성이 생겨나고 특정 수행 능력이 향상되는 것으로 나타났습니다. 예를 들어, 일본 도호쿠 대학 연구팀은 아무런 생각을 하지 않을 때 뇌 혈류 상태를 측정했고, 그 결과 백색질의 활동 증가와 혈류의 흐름이 활발해진 실험 참가자들이 새로운 아이디어를 신속하게 내는 데 높은 점수를 받았습니다

디폴트 모드 네트워크(Default Mode Network, DMN)는 뇌과학 분야에서 중요한 개념입니다. 이 네트워크는 뇌의 여러 부분이 서로 연결되어 있으며, 특히 주의가 외부 자극에서 벗어나 내부 사고나 기억에 집중될 때 활성화되는 것으로 알려져 있습니다.

DMN의 구성

  • 주요 영역: DMN은 뇌의 여러 영역을 포함하며, 특히 전전두엽 피질, 측두엽, 후두엽 상부, 그리고 후엽부(특히 시상하부와 연결된 부분)를 포함합니다.
  • 연결성: 이 네트워크는 이러한 뇌 영역들 간의 강한 기능적 연결성을 특징으로 합니다.

DMN의 기능

  • 내부적 사고: DMN은 자아 관련 사고, 과거의 추억 회상, 미래에 대한 상상, 그리고 다른 사람들의 관점을 이해하는 데 중요한 역할을 합니다.
  • 정신적 휴식: DMN은 외부 환경에 대한 주의력이 감소했을 때 활성화되며, 이는 정신적 휴식이나 명상과 같은 상태와 관련이 있습니다.
  • 자기 성찰: 자기 생각과 감정에 대한 성찰, 자아성찰의 과정에 중요합니다.

DMN과 질병

  • 정신 질환: 우울증, 불안 장애, 조현병과 같은 정신 질환에서 DMN의 활성화 패턴이 변화하는 것이 관찰되었습니다.
  • 신경퇴행성 질환: 알츠하이머병과 같은 신경퇴행성 질환에서도 DMN의 연결성 및 활성화에 변화가 나타납니다.

연구 및 응용

  • 뇌 이미징 연구: 기능적 자기 공명 영상(fMRI)을 통해 DMN의 활동을 연구하고 있으며, 이를 통해 다양한 신경정신 질환의 메커니즘을 이해하는 데 기여하고 있습니다.
  • 치료적 접근: DMN의 활동을 조절하는 것이 명상, 인지 행동 치료 등의 효과를 설명할 수 있으며, 이를 바탕으로 새로운 치료 방법을 모색하는 데 도움이 됩니다.

요약

DMN은 뇌의 여러 부분이 연결되어 있으며, 내부 사고, 자기 성찰, 그리고 정신적 휴식과 관련이 있는 중요한 뇌 네트워크입니다. 이 네트워크는 다양한 정신 질환의 이해와 치료에 중요한 역할을 하고 있습니다.


디폴트 모드 네트워크(DMN)는 인간 두뇌의 기본 구성 요소로, 고유한 역할과 특성으로 인해 신경과학 연구에서 큰 주목을 받고 있습니다.

인지 과정에서의 DMN의 역할: DMN은 특히 외부 작업에 집중하지 않고 공상, 과거 또는 미래 관조, 다른 사람의 관점 고려와 같은 내성적인 활동에 참여할 때 활성화됩니다. 이 네트워크는 깨어 있는 상태에서도 활성화되지만, 정신이 힘든 작업에 몰두하지 않는 휴식 상태에서는 더욱 활발하게 활동합니다.

정보와 감각의 통합: DMN은 공상, 회상, 미래 계획과 같은 내부 지향적 인지 과정에 특화된 ‘내재적’ 시스템으로 간주됩니다. 이 시스템은 들어오는 외재적 정보를 이전의 내재적 정보와 통합하여 상황에 따른 풍부한 상황 모델을 형성하고 공유 커뮤니케이션, 내러티브 및 소셜 네트워크에 기여하는 역동적인 역할을 합니다.

정신 질환에 대한 관여: DMN의 조절 장애는 다양한 형태의 정신 질환과 연관되어 있습니다. 예를 들어, DMN 내 연결성 문제는 우울증 환자의 높은 수준의 반추와 관련이 있습니다. 또한, DMN은 알츠하이머병이나 파킨슨병과 같은 질환에서 중요한 에피소드 기억 처리에 관여하여 기억 처리에 영향을 미칩니다.

창의력 향상에 기여: DMN은 다른 뇌 네트워크와 함께 창의력을 키우는 데 중요한 역할을 하는 것으로 알려져 있습니다. 사람의 머릿속이 공회전하는 동안 DMN의 활동은 아이디어를 생성하는 데 도움이 될 수 있으며, 이 아이디어는 다른 네트워크에 의해 추가로 처리될 수 있습니다.

수면 중 활동: DMN은 수면 중에도 활동하며, 정신적 이미지 및 꿈과 관련이 있습니다. 공상과 몽상은 비슷한 뇌 메커니즘을 사용하는 것으로 추정되며, 몽상은 공상이나 정신적 방황의 더 강렬한 형태라고 할 수 있습니다.

구조적 측면: 신경학자 마커스 라이클이 발견한 DMN은 전두엽, 두정엽, 측두엽 피질의 일부를 포함한 여러 뇌 영역에 걸쳐 있습니다. 이러한 영역은 특정 정신 기능과 관련하여 공동 활성화 또는 비활성화를 나타내며, 이는 DMN의 복잡성과 전두엽 네트워크 및 실행 제어 네트워크와 같은 다른 뇌 네트워크와의 통합을 강조합니다.

시간에 따른 이해의 진화: 지난 20년 동안 DMN의 기능에 대한 이해는 크게 발전해 왔습니다. 이제 DMN은 자기 참조, 사회적 인지, 에피소드 및 자서전적 기억, 언어, 의미 기억, 정신적 방황에서 그 역할이 인정받고 있습니다. DMN은 기억, 언어, 의미적 표현을 통합하고 방송하여 자아와 의식의 구성에 중심이 되는 ‘[[내적 내러티브]]’를 생성합니다.

이처럼 광범위한 인지 및 감정 과정에 관여하는 DMN은 인간 정신의 전반적인 기능과 안녕에 있어 그 중요성을 강조합니다. DMN은 내부 및 외부 정보를 통합하고 처리하는 데 중요한 네트워크 역할을 하며, 우리 자신을 인식하고 다른 사람과 상호 작용하며 창의적이고 반성적인 사고 과정에 참여하는 방식에 영향을 미칩니다.

OpenAI Whisper 새로운 버전 large-v3


OpenAI의 Whisper가 새로운 버전인 large-v3로 업데이트되었습니다. 이번 업데이트에서 주목할 점은 다음과 같습니다:

  1. 입력 오디오 처리: 새로운 모델은 128개의 Mel 주파수 빈을 사용하여 오디오를 처리합니다. 이는 이전 모델의 80개에 비해 증가한 수치입니다.
  2. 언어 지원 추가: Cantonese(광둥어) 언어 토큰이 새롭게 추가되었습니다.
  3. 학습 데이터: large-v3 모델은 large-v2를 사용해 수집한 1백만 시간의 약하게 레이블링된 오디오와 4백만 시간의 의사 레이블링된 오디오로 학습되었습니다.
  4. 성능 향상: large-v3는 다양한 언어에 대한 성능이 향상되었으며, 특히 오류율이 60% 미만인 모든 언어에서 large-v2에 비해 오류율이 10%에서 20% 감소한 것으로 나타났습니다.
  5. 캐릭터 오류율 사용: 일부 언어(한국어, 중국어, 일본어, 태국어, 라오스어, 미얀마어)는 문자 기반 오류율(CER)을 사용하여 평가했습니다.
  6. 사용 방법: large-v3 모델은 openai-whisper==20231106 버전 이후로 사용 가능하며, pip install -U openai-whisper 명령어를 통해 패키지를 업데이트한 후 "large-v3" 이름으로 모델을 로드할 수 있습니다

https://github.com/openai/whisper/discussions/1762

Fail-fast 전략, 실수를 빠르게 찾아내는 방법

안녕하세요. 오늘 이야기할 주제는 ‘Fail-fast’라는 전략인데요, 이는 소프트웨어 개발에서 많이 사용되는 개념입니다. Fail-fast는 ‘빠르게 실패하다’라는 말 그대로, 오류를 발생하게 하고 이를 빠르게 수정하는 방법을 지향하는 것을 의미합니다.

소프트웨어 시스템을 운영하다 보면 여러 가지 오류가 발생하곤 합니다. 이런 오류 중 일부는 무시하거나 넘어가도 크게 문제가 되지 않지만, 일부 오류는 시스템에 큰 피해를 줄 수 있습니다. Fail-fast 전략은 이러한 큰 문제를 초래할 수 있는 오류를 조기에 감지하고, 그에 따른 대응을 즉시하기 위한 것입니다.

예를 들어, 프로그램에서 잘못된 입력 값이 들어오면, 해당 프로그램은 즉시 오류를 반환하고 작동을 중단합니다. 이렇게 해서 잘못된 입력 값이 프로그램 내에서 더 이상 전파되는 것을 방지하며, 문제가 더 커지는 것을 막습니다.

이런 Fail-fast 전략은 테스트 주도 개발(Test-Driven Development, TDD)과 밀접한 관계가 있습니다. TDD에서는 먼저 테스트 케이스를 작성하고, 이를 통과하는 코드를 개발합니다. 그렇게 해서 개발 초기 단계에서부터 오류를 발견하고 수정하게 됩니다.

하지만 모든 상황에서 Fail-fast가 최선의 전략인 것은 아닙니다. 예를 들어, 네트워크 통신과 같이 일시적인 오류가 발생할 수 있는 상황에서는, Fail-fast보다는 재시도하거나 대체 경로를 제공하는 등의 복구 전략이 필요할 수 있습니다.

결국, Fail-fast는 소프트웨어 개발에서 오류를 빠르게 찾아내고 대응하는 중요한 전략입니다. 하지만 상황에 따라 적절한 전략을 선택해야 하며, 항상 Fail-fast가 최적의 해결책은 아닙니다.

GPTQ-for-LLaMa

GPTQ-for-LLaMa는 Google AI의 LLaMa 대규모 언어 모델에 대해 특별히 설계된 양자화 프레임워크입니다. GPTQ는 “Gradient-Perturbed Training for Quantization”의 약자이며 모델 가중치를 양자화하여 메모리 사용량과 계산 비용을 줄이는 데 사용할 수 있습니다.

LLaMa는 175억 개의 매개변수를 가진 방대한 언어 모델입니다. 텍스트 생성, 언어 번역, 다양한 종류의 창의적인 콘텐츠 작성, 유익한 방식으로 질문에 답변할 수 있습니다. 그러나 LLaMa와 같은 대규모 언어 모델은 메모리 집약적이고 계산 비용이 많이 들 수 있습니다.

GPTQ-for-LLaMa를 사용하면 LLaMa 모델의 메모리 사용량과 계산 비용을 줄일 수 있습니다. 이를 통해 LLaMa를 저전력 장치에서 실행하고 더 많은 요청을 처리할 수 있습니다.

GPTQ-for-LLaMa는 아직 개발 중이지만 LLaMa 모델의 메모리 사용량과 계산 비용을 줄이는 데 효과적인 것으로 나타났습니다. 또한 LLaMa 모델의 성능 저하가 적은 것으로 나타났습니다.

GPTQ-for-LLaMa는 LLaMa 모델의 메모리 사용량과 계산 비용을 줄이는 데 유용한 도구입니다. 또한 LLaMa 모델을 다양한 장치에서 실행할 수 있으므로 더 많은 사용자에게 액세스할 수 있습니다.

JAX란 무엇인가요?

JAX란 무엇인가요?
JAX는 고성능 머신 러닝 연구를 위해 결합된 Autograd와 XLA입니다.

업데이트된 버전의 Autograd를 통해 JAX는 네이티브 Python과 NumPy 함수를 자동으로 구분할 수 있습니다. 루프, 브랜치, 재귀, 클로저를 통해 차별화할 수 있으며, 파생 함수의 파생 함수를 취할 수 있습니다. 정방향 미분뿐만 아니라 그라데이션을 통한 역방향 미분(일명 역전파)도 지원하며, 이 두 가지를 임의의 순서로 구성할 수 있습니다.

새로운 기능은 JAX가 XLA를 사용하여 GPU와 TPU에서 NumPy 프로그램을 컴파일하고 실행한다는 것입니다. 컴파일은 기본적으로 내부에서 이루어지며 라이브러리 호출은 적시에 컴파일되고 실행됩니다. 그러나 JAX를 사용하면 단일 함수 API인 jit를 사용하여 자체 Python 함수를 XLA에 최적화된 커널로 적시에 컴파일할 수도 있습니다. 컴파일과 자동 차별화를 임의로 구성할 수 있으므로 Python을 벗어나지 않고도 정교한 알고리즘을 표현하고 최대 성능을 얻을 수 있습니다. pmap을 사용하면 여러 개의 GPU나 TPU 코어를 한 번에 프로그래밍하고 전체를 통해 차별화할 수도 있습니다.

조금 더 자세히 살펴보면 JAX가 실제로 컴포저블 함수 변환을 위한 확장 가능한 시스템이라는 것을 알 수 있습니다. grad와 jit는 모두 이러한 변환의 인스턴스입니다. 그 외에도 자동 벡터화를 위한 vmap과 여러 가속기의 단일 프로그램 다중 데이터(SPMD) 병렬 프로그래밍을 위한 pmap이 있으며, 앞으로 더 많은 기능이 추가될 예정입니다.

https://github.com/google/jax