수요일, 9월 27, 2017

[Java] Java 9의 모듈 시스템에 대한 단상

우여곡절 끝에 자바 9에 jigsaw 즉, Java Platform Module System이 포함되어 출시되었다.

오래동안 사용되던 ClassLoader 기반의 OSGi와 다르게 Java Platform Module System은 JDK 내부적으로 module을 지원한다.

이를 위해 java.lang.ClassLoader 등의 클래스가 module 관련 선언에 있는 내용대로 접근성이 허용되는지를 내부적으로 체크하도록 JDK 코드가 수정되었다.

그 외에도 모듈에 선언된 것 외에는 타 모듈의 클래스를 액세스할 수가 없는데 Class.forName(...)을 통해 Class 객체는 구할 수 있지만 newInstance 등을 통해 인스턴스 객체를 만들려고 시도하는 순간 에러가 나게 된다.

이 점은 기존 코드와 심각하게 비호환되게 하는데 이를 완화하기 위해 java.util.ServiceLoader를 통해서 객체를 만들 수 있도록 하고 있다. (이게 가능하려면 해당 제공 모듈에서 provides를 선언해야만 한다.)

기존의 자바는 클래스로더의 자유도를 기반으로 모듈화를 저해하는 일들을 많이 하는 일들을 많이 해왔다. 특히 프레임웍들은 그러한 형태를 권장해왔다.
모듈에 대한 제어가 없고 이를 통해 더 많은 기능을 제공할 수 있으니까.
자바 9 이후부터는 이러한 모듈화를 저해하는 것들이 많이 줄어들 것 같다.

아니, 새로 작성되는 프로그램들은 자바 9과 쉽게 호환할 수 있도록 자바 코드를 모듈화하여 분리시키는 설계를 항상 선행하여야 할 것 같다.

OSGi는 표준 Java API를 기반으로 사용하므로 특별히 JPMS 기준의 타 모듈에 액세스하지 않는 한 잘 동작할 것이다.
현재로서는 JPMS는 같은 모듈의 멀티 버전을 지원하지 않는다. 그리고 동적 업데이트나 동적 unload도 지원하지 않는다.
엔터프라이즈 환경에서 동적 업데이트/unload는 여러 가지 상황에서 필요하다. 이 글에서 언급한 것처럼 IoT만 필요한 것은 아니다.
물론 클라우드 환경의 blue-green deployment가 이러한 동적 update/unload의 필요성을 줄여줄 수는 있다.
어쨌든 당분간 이 dynamic behavior는 여전히 커스텀 클래스로더나 클래스로더 기반 기술인 OSGi를 사용할 수밖에 없다.


참고자료
  • Java 9, OSGi and the Future of Modularity (Part 1)
  • The Top 10 Jigsaw and Java 9 Misconceptions Debunked
  • Getting Started with the Modules Project
  • Project Jigsaw: Complete!
    (참고) JDK 소스 코드 중 모듈 관련 변경 사항들


    • JSR 277 API, implementation, and configuration files
      • src/share/classes/java/module/*
      • src/share/classes/sun/module/*
      • src/share/lib/module/*
    • JSR 294 reflective API
      • src/share/classes/java/lang/reflect/Superpackage.java
      • src/share/classes/java/lang/Class.java
      • src/share/classes/java/lang/ClassLoader.java
      • src/share/classes/java/lang/annotation/ElementType.java
    • JSR 269 updates
      • src/share/classes/javax/lang/model/*
    • java launcher
      • src/share/bin/java.c

    금요일, 9월 22, 2017

    집단 창의의 기반을 만드는 포용적 리더쉽

    창의성과 포용적 태도
    창의성, 무언가 없던 걸 새로 만드는 것과 포용적인 태도가 어떤 관계가 있을까?

    창의성의 핵심은 창의적인 문제 해결로 그 과정의 가장 어려운 부분은 엄밀한 사고critical thinking에 있다고 언급한 바 있다.

    실제 문제를 해결하는 아이디어를 어떻게 구할 것인가에 대해서는 여러 가지 방법이 제시되고 있지만 개인별로 아하 현상을 어떻게 체험할 것인지는 개인별 발견이 중요할 수 있다고 생각한다. 여기에는 집요한 반복된 생각이 중요할 수 있고, 엄밀한 사고가 중요할 수도 있고, 몰입이 중요할 수도 있고, 혼자가 아닌 토론과 대화가 중요할 수도 있고, 또 깊은 사고 후의 뇌가 회복하는 멍한 순간이 중요할 수도 있다. 아마도 이 모든 것이 다 문제를 창의적으로 푸는 과정에 관여할 것이다.
    일례를 들어 끙끙 앓던 문제를 대화를 통해 공유하면서 스스로 문제를 해결하는 경우도 종종 발생한다. 대화 자체를 통해 답을 얻었다기보다는 대화를 하면서 자신의 머리 속에 있던 생각을 외부로 전달하는 과정에서 답을 얻는 경험이다.
    일화를 들자면 다음은 아인슈타인이 특수 상대성 이론의 아이디어를 얻은 계기이다. 친구인 미셸 베소에게 안 풀리는 문제를 토론하러 갔다가 갑자기 통찰을 얻었다.
    "이렇게 대화를 시작했다. '요즘 어려운 문제를 풀고 있는데, 오늘 자네와 이 문제를 두고 전투를 벌리려고 왔네. '  우리는 이 문제의 모든 측면들을 토론했다. 그런데 갑자기 이 문제의 해법이 어디에 있는지 이해하게 되었다. 다음 날 다시 친구에게 와서 인사도 하지 않고 말했다. '고맙네. 문제를 완전히 풀어버렸어.'" 
    그렇다면 왜 포용적인 태도를 얘기하려는 걸까.
    포용적인 태도는 문제 해결에 있어서 다양한 문제를 인지하고 또 다양한 측면들을 받아들일 수 있는 입력의 문제를 다룬다. 문제 해결 과정을 입력과 출력을 가진 블랙박스로 본다면 포용적 태도는 입력을 충분히 주기 위한 선결 조건이라고 볼 수 있다. 다양한 문제를 인지할 수 있고, 다른 이들의 해법을 참조할 수 있기 때문에 존중하면서 문제 설정부터 필요 정보들을 받아들이는 과정까지를 포용적 태도를 통해 개선할 수가 있다.

    물론 해법을 찾아내는 출력 과정은 포용적인 태도로 이룰 수 없는 부분이라고 본다. 그 부분은 앞에서 언급한 다양한 창의적 사고에 대한 논리들이 도움이 될 것이다.

    포용적 리더쉽의 특질
    포용적 태도는 다양한 의견을 존중하는 데서 출발한다.
    리더쉽이란 보통 방향을 정하고, 비전을 만들고, 사람들을 움직이는 것에 대한 이야기이지만 리더쉽을 실행하는 방식으로서 포용성이 중요함을 이야기하는 것이 바로 포용적 리더쉽이다.
    포용적 리더쉽은 포용적 마음가짐mindset과 포용적 행동behavior을 뜻한다.
    컨설팅 회사인 딜로이트에서 다양한 시장, 고객, 생각, 재능 등의 세상에 대응하기 위해 필요한 리더쉽의 덕목으로 포용적 리더쉽을 연구한 내용이 있다.
    이 글에 따르면 사람들은 다음과 같은 경우에 포용되고 있다고 느낀다고 한다.
    • 공정하게 대우받고 있다
    • 각자가 개인으로 존중되고, 평가받고 있다
    • 소속감을 느낀다
    • 의사 결정에 목소리를 낸다
    따라서 포용적 리더쉽은 다음 요소들을 가진다.
    • 사람들과 그룹을 각 개인으로서 공정하게 대우하기.
    • 개인을 그룹의 성원으로 인정하면서도 다양한 개개인의 고유성을 인정하고 평가
    • 현명한 아이디어의 수집과 의사결정에 다양한 그룹의 생각들을 최대한 활용하기
    이러한 리더쉽의 목표를 달성하기 위해 포용적 리더쉽은 다음 여섯 가지 주요 특성을 가지고 있다고 한다.
    1. 확약 commitment : 다양성을 포용하는 것을 확약한다. 각 성원의 가치를 최대한 활용하고 공정하게 대우하고, 이것이 높은 우선순위임을 이해한다. 이를 위해서 리더 스스로는 겸허함을 필요로 하고 정보를 공유하고 공감한다.
    2. 용기 courage : 겸손하면서도 용감해야 한다. 각 성원의 장점과 단점을 이해하고 개인의 한계를 극복할 수 있는 다른 이들의 역할을 적극 추구한다. 진정을 가지고 다양성과 포용을 대한다. 일괄적으로 대하는 조직의 태도와 실행에 대해 적극적으로 문제 제기를 하고 변화를 위해 노력한다.
    3. 편향 인지 cognizance of bias : 개인이 아닌 어떤 전형으로 편향되어 인지하는 경향을 극복하기 위해 노력한다. 편향으로 다른 사람을 평가하지 않도록 노력을 기울인다. 소통과 의사 결정 과정, 결과 등에서 공정하고 장점에 기반한 평가를 해야 공정함을 이룰 수 있다.
    4. 호기심 curiosity : 열린 마음을 가지고 타인들의 시각과 세상 경험에 대해 궁금해하고 모호함이나 불확실한 부분에 대해서는 인내를 가진다. 다양한 개인들로부터 호기심어린 질문을 던지고, 적극적으로 듣는 자세가 핵심 기술이다. 이 과정에서 생각의 흐름을 질식시키는 너무 빠른 결정은 절대 금물이다.
    5. 문화 이해력 culturally intelligent : 다양한 문화를 경험하고 이해한다. 다양한 문화적 배경을 가진 개인들을 이해하고 문화를 수용하기 위해 행동 방식을 고칠 필요도 있다.
    6. 협업적 자세 collaborative : 개인에게 권한을 주고 다양한 그룹의 생각들을 만들고 활용한다. 생각의 흐름을 통제하지 말고 팀에게 자율성을 주고 다양한 견해를 얻기 위해 다른 그룹과 소통할 것을 권한다. 모든 팀 성원이 목소리를 낼 수 있도록 스타일과 프로세스를 맞춰간다.
     The six signature traits of an inclusive leader


    포용성과 창의성
    살펴본 대로 포용성은 다양성을 인정하고 이로부터 아이디어를 끌어내는 방법이다. 리더는 늘 목표를 분명하게 가지는 사람이다. 포용성을 가진 조직 즉, 다양한 목소리를 듣고 자율적인 조직을 만들어내는 것은 지속적으로 창의를 만들어내는 조직이 되기 위한 매우 중요한 기반이라 할 수 있다.
    포용적 조직을 위한 코칭은 목표를 공유하고 각 저해 요소들을 여러 가지 방법으로 소통하면서 해결해나가는 방향으로 이루어질 수 있다.

    포용적 리더쉽과 포용적 조직은 개인의 창의적 문제 해결을 집단의 창의적 문제 해결로 발전시키는 중요한 매개체라고 할 수 있겠다.

    포용적 자세는 조직 뿐만아니라 개인의 창의를 위해서도 중요하다. 앞서 말한 대로 점점 더 다양성의 시대로 접어드는 세상을 살아가는 개인이 더 좋은 판단을 하기 위해서는 다양한 견해를 인정하는 데서 출발해야 한다.
    판단은 엄밀해야 하지만, 출발은 포용적이어야 한다. 개인이 포용적이 되려면 다른 개인이나 지식들의 결과물에 대해 인정과 존중을 하는 것이 필요하다. 물론 존중이 추종이거나 무비판적 수용이어서는 안된다. 출발점으로서 존중하되 엄밀한 사고를 거쳐서 변화된 새로운 것을 받아들여야 한다.
    이것은 개인의 학습 능력 개선과도 밀접한 관련이 있다.
    아무리 개인의 재능이 뛰어나더라도 학습 능력이 떨어지면 창의적 성과를 만들기가 어렵다.

    포용하는 개인의 엄밀한 사고가 필요한 시대이다.