창의성은 특이성이 아니다

지적 노동을 하면서 오래도록 창의성에 민감하게 고민한 편인데 최근엔 창의성이 인공 지능과 생체 지능의 차이로 간주되어 인공 지능을 공격하는 데 사용되기도 해서 새롭게 해석을 해보게 된다. 조금 시간을 뒤돌아보면 스티브 잡스 시대의 창의성에 대한 강조가 있고 창조성을 기계적인 프로세스로 만들어내려는 시도들이 전 세계적으로 이루어지기도 했다. 지금도 특이한 생각에 대한 태도는 사람들마다 사뭇 다른데 가끔은 천재성에 대한 판단과 혼용되기도 한다. 서로 다른 생각, 특이한 생각, 천재적 생각, 창의적 생각 이런 것들이 좀 경계가 애매하게 사용된다고 할까? 가끔씩은 무엇이 생각이고 무엇이 발상인가 하는 것도 혼동될 때가 있다. 질문을 통해 의견을 개진해보자면 … 1. 색다른 의견을 많이 내는 사람의 의견들은 창의적인가? 의견이라 할 수 있는 생각의 수준은 어느 정도엘까 하는 건 해결하고자 하는 문제의 수준에 따라 다르다. 브레인스토밍 수준의 생각들이 필요한 시점이 있을 것이다. 여러 가지 떠올리는 것이 필요할 때 색다른 의견들은 어떤 제약 없이 화두를 다양하게 끄집어내는 데 유용할 수 있다. 다른 측면에서 본다면 생각을 모두 많이 한다면 의견이 모두 많이 나와야 하는 게 아닐까 의문해볼 수 있다. 전문성을 가진 사람들은 생각을 의견으로 출력하기 전에 검증과 심화의 필터링 과정을 거친다. 특이한 생각이 많으나 필터링 없이 주장하는 경우는 창의적일까? 창의성이란 실질적인 창조(개작 포함)를 위한 유용성을 포함하는 개념이므로 개인이 아닌 집단을 위한 생각이라면 집단의 능력과 상관이 있다. 매우 불완전하더라도 그것을 보완해갈 능력을 집단이 갖추고 있느냐는 측면. 또하나는 수많은 아이디어들이 매우 약한 필터링을 거쳐 나올 때 실제 유용할 확률 측면이 있다. 어느 정도 유용할 확률까지 감당할 수 있을까? 흔히 말하는 촉이 좋은 사람들이 있다. 어떤 전문성에 속하여 일을 하다 보면 톡톡 튀는 아이디어를 많이 내고 그 아이디어들이 사후적으로 좋은 방향의 창의로 많이 발전하는 경우. ...

솔루션은 무엇을 자동화하고 무엇을 기록해야 하나? 기업 업무 프로세스 관리에 대한 생각

약 20년 전에 BPM 솔루션을 만들기 시작했었는데 그때에는 어떻게 하면 사용자(기업 고객)가 개발을 할 필요없이 (혹은 최소화하도록) 솔루션에서 자동으로 코드를 생성하거나 간단한 룰로 처리하려고 많은 노력을 했다. 몇일 전에 30년만에 만난 대학 후배의 회사에서 후배가 10년에 걸쳐 만든 회사 솔루션을 봤는데 같은 문제를 핵심 메타 정보 중심으로 쉽게 관리해주고 탑레벨의 일들을 굳이 실제 업무랑 연동시키지 않는 방식으로 문제를 풀었다. 그런데 그 후배의 솔루션이 내겐 약 15년 가까이 이전 직장에서 고민했던 합리적인 풀이로 느껴졌다. 탑레벨에서 실제 구현까지 모든 걸 연결하면 오히려 다양한 변화를 쫓아가기 어렵다. 사람의 아이디어와 의사결정 변화를 바로 반영하려면 시스템적으로 실행을 엮으면 오히려 어려워질 수 있다. 자동화가 사실 인간의 의사결정 능력을 대체힐 수 없다는 점에서 잘못된 목표를 가졌던 것이다. BPM은 이걸 adhoc process나 performance monitoring으로 대체하려고 했었지만 결국 사라졌다. much ado for nothing인 셈이었다.  Hype은 5년을 넘기지 못하고 시들게 마련이고 실질적인 가치를 찾을 때 10년을 넘어갈 수 있다는 생각은 내겐 신념처럼 굳어진 기준이다. (기술을 활용한 가치를 추구하는 사람으로써 더욱더 중요하게 생각하는 신조) AI의 시대에도 무엇을 자동화하고 무엇을 사람에 종속시켜 뒤따르도록 해야 할지는 매우 중요한 의사결정 요소이다. 자동화하는 것이 무조건 가치를 추가하지 않는다. 인간의 판단 능력, 임기응변 적응성 등을 잘 반영하는 것들은 대체할 필요가 없고 한시적으로 집중적인 일들은 파트타임 잡을 통해 사람이 해도 된다. (이 부분의 일부는 거대 언어모델 기반 AI가 인간 고유의 영역이 아님을 선언하고 대체해줄 것이다) 코드 생성, reflection, injection 등의 기술과 데이터베이스 설계, 룰 엔진 등으로 소프트웨어가 할 수 있는 갖은 방법으로 모두 직접 연결하기 위해 ...

macOS Catalina 버전부터 JDK의 System.loadLibrary 가 에러가 날 때

정말 오래간만에 자바 관련한 블로깅입니다. 불편한 사람들이 있을 것 같아서 정보 공유 차원에서 현재까지 파악한 이슈를 남깁니다. macOS Catalina(10.15.3) 버전부터 JDK의 System.loadLibrary를 통한 dylib 파일 로드가 실패합니다. 이와 관련해서는 크게 두 가지 문제가 관련되어 있습니다. 1. System.loadLibrary 버그 공식 JDK 관련 이슈는 다음 이슈에서 볼 수 있습니다. Java Bug System :  System.loadLibrary fails on Big Sur for libraries hidden from filesystem GitHub :  System.loadLibrary fails on Big Sur for libraries hidden from filesystem System.loadLibrary()를 통한 경로 찾기가 실패하는가 하고 여러 시도를 해보면 곧 System.load()를 통해 dylib 파일을 직접 읽어도 제대로 동작하지 않는다는 것을 알게 될 것입니다. JDK 라이브러리 로딩 버그의 원인(아직 미해결)을 옮겨봅니다. System.loadLibrary 실패 원인 문제 설명:  OSX Big Sur no longer ships with copies of the libraries on the filesystem and therefore attempts to load a native library via System.loadLibrary no longer works. 애플 페이지 내용: New in macOS Big Sur 11.0.1, the system ships with a built-in dynamic linker cache of all system-provided libraries. As part of this change, copies of dynamic libraries are no longer present on the filesystem. C...

소프트웨어 창업에 대한 생각

이 글은 2021년 3월 13일에 페이스북에 올렸던 글이다. 창업은 소프트웨어 기술을 활용하여 산업을 재정의한 것 얼마전 창업은 소프트웨어 기술을 활용하여 기존 산업을 재정의하는 것이고 기존 산업을 유지하는 법규와의 충돌은 필연적이라는 이야기를 들었다. 소프트웨어나 인공지능 등 기술의 발전을 활용하여 기존의 산업 전반을 완전히 바꾸는 것이 현 시대의 창업 개념이고 이를 가속화하기 위해 법규의 재해석과 개정은 불가피하다는 것. 물론 기존 법규가 무조건적으로 배척될 이유는 없을 것이다. 사회적 가치, 인간애적 가치를 전제한 가치의 관점을 가질 필요가 있고, 자동화, 가속, 정보 집중에 의한 더 지능적인 의사결정에 기반하여 새로운 산업을 만드는 것이 누구에게 가치를 줄 수 있을까 혹은 정말 가치로운 일인가를 스스로와 대중에게 설득해야 하는 건 역사적으로도 늘 새로움을 추구하는 이들이 감당해야 할 의무처럼 주어진 것 같다.  협업과 문제 해결을 확장하는 창업 어제 신입 사원들이 부서로 배치되었다. 늘 개발자는 가치를 만드는 게 직업인 사람이며 이 부서(기업 R&D 조직)의 미션은 개발이 아니라 소프트웨어 전문 지식을 기반으로 한 문제해결이란 점을 강조하는 편이다. 나혼자 개발만 잘하면 된다는 생각이 강하면, 문제를 풀기 위해 학습하고 협업하는 과정을 학습하지 못한다. 새로운 문제를 찾으려 하지 않고 더 나은 아이디어를 찾는 노력을 하지 않는다. 이미 잘 알고있는 문제를 잘 알고 있는 기술로 빠르게 찍어내는 게 목적인 시스템 통합 프로젝트처럼 개발을 이해한다면 소프트웨어적 혁신은 애시당초 불가능하다. 물론 벨 연구소에서 유닉스가 탄생한 과정에서 보듯이 정말 똑똑한 사람들은 부서의 목적이 분명하지 않아도 목적에 구애받지 않는 혁신들을 만들어낸다. 우스개로 똑똑한 해커들을 한동안 컴퓨터만 주고 가둬두면 유닉스 비슷한 운영체제를 만들거라는 이야기가 한동안 떠돌기도 했었다. 하지만 그렇게 창업은 할수 없을 것이다. 스티브 잡스가 얘기한 것처럼 해커와 기업가 정신...

개발자들은 '일단 안돼'라고 말하고 본다는 전형성에 대한 생각

개발자들은 '일단 안돼'라고 말한다 보통 이런 얘기를 들을 일이 없는데 개발자가 아닌 분들과 얘기하면 이런 얘기를 듣는다. '무조건 안돼' 족이 있고 '무조건 돼' 족이 있다고... (둘 다 말이 안되는 건데 ^^) 실제 개발자들은 자신이 개발하고 있는 모듈의 변화를 좋아하지 않는다. 부담스러워 한다. 해야 할 일이 갑자기 생기는 것에 대해 부담스러워 하는 것도 있고 업무 자체가 좀더 깊은 집중을 요구하는 성향이 있어 일련의 인터럽트에 즉자적으로 반응하는 성향도 학습된다. 그럼에도 함께 제기된 문제에 대해 문제 해결을 위해 토론하고 분석하는 시간을 들이는 것은 마다하지 않는다. 두 가지 허들을 풀어야 한다. 하나는 갑자기 던지면 숙고를 거친 반응이 나올 수 없다는 것 또 하나는 중요한 자신의 업무인 이해 당사자이기 때문에 이해 관계를 내려놓고 판단하기 쉽지 않다는 것 첫번째는 좀더 시간을 주고 문제를 여러번 remind하여 enough thinking 후에 답을 구하는 게 방법이라고 볼 수 있는데 두번째는 좀더 까다롭다. (그런데 이 이해 관계란 이 개발자의 업무 로드가 증가하는 부분이므로 이 의사결정의 주제 관점에서만 보면 크게 중요하지 않은 요소일 수 있다.) 많은 한국의 소프트웨어 개발 회사는 개발 조직이 계층 구조를 이루고 있다. 가장 잘 아는 사람이 개발자인 매니저이고 심지어 핵심 모듈을 개발하기도 한다. 의사 결정에 주요한 권한을 행사하는 사람이 직접적인 이해당사자인 개발자인 경우가 많다는 것이다. 물론 훈련을 통해 개선된다. 업무 로드에 대한 관점, R&R에 대한 관점은 내려놓고 의사 결정 후에 별도 주제로 다루는 게 일반적으로 가능하다 그런데 한 가지 요소를 더 생각해보자면, 풀고자 하는 문제가 무엇인가에 따라 좀더 많은 전문 정보를 공유하고 의사결정의 원칙을 잘 찾는 것이 좋은 의사 결정의 핵심 요소일 텐데 과연 개발자가 문제를 해결하는 전문 정보를 충분히 갖고 있는가, 의사결정의 원칙을 학습을...

일론 머스크의 First Principle Thinking (제1원리 기반 사고)

이미지
제1원리 기반 사고, First principle thinking. 첫번째 원리로부터 생각하기 혹은 제일원리 기반 사고 정도로 해석할 수 있겠다.  아리스토텔레스가 형이상학이란 책에서 언급한 것으로 더 이상 추론될 수 없는 원칙에서부터 추론되어야 한다는 원칙이다. 예를 들어 Unmoved mover 즉 우주에 최초의 움직임을 만든 무언가는 움직임이 없었어야 한다는 추론이 이러한 원칙 하에서 추론된 것이다. 수학에서 공리에서 출발하는 것과 같은 논리인데 일론 머스크가 SpaceX를 만들면서 제일원칙에 기반한 사고 실험을 사용하였다고 언급하면서 의사결정의 원칙 혹은 문제해결의 방법론으로서도 많이 언급된다. 일론 머스크의 First Principle Thinking 머스크 이야기는 이렇게 시작된다. 화성에 가야겠다고 목표를 세운 머스크가 첫번째 마주한 문제는 천문학적인 로켓 가격이었다. 머스크는 물리학에서 배운 제1법칙 기반의 사고를 이 문제 해결에 적용하기로 했다. “물리학은 유추가 아닌 제1원리로부터 추론하는 것을 가르쳐준다. 좋다, 제1원리들을 한번 들여다보자. 로켓은 무엇으로 만들지?  우주항공산업 등급의 알루미늄 합금들과 약간의 티타늄, 구리, 탄소 섬유이다. 다시 생각해봤다. 일반 상품 시장에서 이 물질들 가격은 얼마쯤 하나? 로켓에 사용되는 재료들 가격은 로켓 일반 가격의 약 2%에 불과했다.” 머스크는 원 재료를 사서 직접 로켓을 만들기로 했고 SpaceX를 세웠다. SpaceX는 1/10 가격으로 로켓을 만들면서도 수익을 내고 있다. 제1원리 기반의 사고를 머스크는 진실이라고 생각되는 좀더 근원적인 부분으로 내려가서 거기에서부터 다시 의사결정에 이르는 논리를 쌓아올리는 문제 해결 과정으로 적용한 것이다. 진리와 근원적 사고 사람은 수많은 참으로 믿은 불확실한 가설들이나 관성으로부터 판단하는 경향이 강하므로 중요한 의사결정을 좀더 근원적인 진위로부터 추론하는 것은 더 나은 해결 방법, 더 높은 진위 추정의 확률을 위해 매우 유용한 방법...

매니지먼트 코칭

신입 코칭을 굉장히 중요하게 생각하고 장시간 직접 챙기는 편이지만 생각해보면 매니지먼트에 대한 코칭이 훨씬 더 중요할 수 있다. 경험적으로 매니저들에 대해서는 코칭보다는 기대치만 부여해서 전체 조직이 비효율적이 되거나 중요한 문화적 자산을 단절시키거나 하는 경우가 많았다. 기술 조직에서 코칭은 기술에 대한 측면이 강하고 기술에 관한 협업적 의사결정의 사례 경험의 성격도 강하다. 곰곰 생각해보면 기술 축면의 코칭이란 전공 요소들을 반영하는 것이라 개인의 상당한 학습 노력과 결합하거나 기반 지식을 갖추고 있을 것을 요구한다. 매니지먼트에 대한 코칭은 그런 전제 조건이 약하기 때문에 훨씬 쉽고 효과도 클 가능성이 있다. 매니지먼트는 의사결정의 원칙에 대한 것이고 이 원칙이 무엇이어야 할지를 세워보도록 경험을 쌓는 게 코칭의 핵심일 수 있다. 의사결정이 계속 관행이나 주어와 목적 없는 프로세스에 의한 것이라면 누구도 새로운 상황에서 혹은 새로운 인적, 환경적 조건에서 의사결정 기준을 정리하고 이에 따라 판단하려고 하지 않을 것이다. 기준을 명시적으로 세워보지 않으면 친소 관계나 관행이 중요한 기준이 될수밖에 없다. 의사결정을 원칙을 세우고 판단하는 과정은 대부분 2,3회면 충분히 학습할 수 있다. 사람을 특별히 싫어해서 독단적 의사결정에 의존하는 경우나 의사결정 자체를 못하는 특수하게 적성에 맞지 않는 경우가 있긴 하지만 수년에 걸친 노력을 축적해야 하는 기술 관련 학습에 비해 정말 효율이 높다고 볼 수 있다. 물론 좋은 의사결정은 각 문맥별로 요구하는 사항이 다르고 그 적응력은 개인차가 있겠지만 많은 경우 충분히 가치있는 의사결정을 할수 있을 것이다.

네트웍, 불확실성, 가설과 검증, 비전

빅파일 전송 프로그램 빅파일 전송 프로그램을 급 제작해서 작년부터 고객사에서 쓰고 있는데 신규 고객사가 생기거나 고객사의 고객이 파일 전송하다 오류가 생기면 연락이 온다. ㅠㅠ (연락이 뜸해지면 고객사 사업이 잘안되나 걱정부터 듬 ㅠㅠ 모니터링하는 방법과 로그를 개선하였지만 업데이트를 꺼리는 고객이라 ㅋㅋ) 원인의 추정 클라이언트쪽 PC 방화벽부터 기업 방화벽, 그리고 서버쪽 타임아웃 설정 등 이슈가 엔드투엔드로 발생하는데 이게 100GB~1TB 가량 되는 파일 전송이다보니 별별 상황이 다 생긴다. “Network is unreliable”이기 때문에 혹시 모를 경우의 수를 생각해서 신중하긴 하지만 최근에는 금요일 밤 늦게 온 전화 때문에 화를 낸 적이 있다. 한참 오류 상황을 듣고 있었는데 파일 내용이 우리가 준 툴로 자동 생성한 파일이면 전송이 실패한다는 것 ㅠㅠ 100GB 파일 전송하면서 내용을 체크해서 뭘 할수도 없고 버퍼별로 암복호화 압축 체크섬 계산(이건 필요없다고 생각하지만 테스트 용도로 넣어둔 전체 파일 체크섬의 map-reduce 버전. 고객들은 매우 중요하게 생각 ㅠㅠ) 등을 하기 때문에 파일 내용이란 건 암호화하는 순간 아무 의미도 없는 얘기. 신뢰할 수 없는 상황에서 문제를 해결할 때에는 확실한 증거 기반으로 가설을 재수립해가야 하는데 지나치게 많은 중첩된 가설로 이상한 이야기를 주말 밤에 전화로 한 거. 프로젝트 오픈하느라 바쁠텐데 이런 걸 상의 없이 테스트 하느라 하루를 통째로 날린 게 답답하고 안쓰러운 게 컸다. 이 분에게 네트웍 환경 체크를 하랬더니 집에 가서 또 해보겠다고 셀룰러에 테더링으로 전송하고 또 자신의 주장이 맞다고 연락 ㅠㅠ 다행히 http tunneling 방식으로 구현해서 앞쪽 아파치 서버에 액세스 로그가 남아있어서 408 에러코드 확인하고 고객분이 테스트하신 환경인 코워킹스페이스 FAQ 사이트 가서 대역폭 제약 관련 조항을 캡쳐해서 보내줌. 셀룰러로 100GB 보내도 대역폭 제약이 안걸릴 거라는 생각을 하면 안된다...

개발 조직을 관리할 때 목적 지표, parallelism과 aggregate intelligence

개발 조직을 관리하면서 가장 중시하는 목적 지표 중 하나는 parallelism 수준, 또하나는 더 나은 의사결정을 하는 aggregate intelligence 수준으로 생각하는 편이다. 1. parallelism 혹은 vectorization 병렬화 수준 혹은 동시성 수준은 각자 자신의 일을 진행하는 데 병목이 되는 기다림이나 동기화를 최소화하는 것이고, 그 이전에 자신의 일이 가지는 목표가 분명하고 또 스스로 업무를 잘 큐잉해서 언제든지 자신의 큐에서 넣고 뺄 수 있어야 한다. 물론 목표가 자신의 수준에서 조직의 수준에서 다를 수 있기 때문에 기다림을 최소화하면서 동기화하는 리뷰나 이슈 토론 같은 것들이 오히려 중요할 수 있다. 업무를 나눌 때에도 다른 사람이 의존하는 일들은 우선 순위를 좀더 높인다거나 협업에 대한 부분을 미리 스케줄링하는 것들이 중요하게 된다. 여러 사람의 업무와 관련한 의사결정이 필요한 시점에는 어쩔 수 없이 waiting이 있을 수 있다. 이를 최소화하고 잘못된 의사결정으로 인한 폐기 업무, 반복 업무를 최소화하는 것은 의사결정에 책임이 있는 사람들에게 매우 높은 우선 순위가 된다. 2. aggregate intelligence or collaborative decision making 여러 사람의 아이디어가 한 사람의 아이디어보다 더 나을 가능성이 크다는 것은 인간의 불완전함이나 생각의 바이어스 등을 고려할 때 단순한 산수 이상이라고 할 수 있다. 더 나은 의사 결정을 하는 것은 단순히 개인이 돌아가면서 의사결정을 하거나 한 사람의 의사결정을 투표하는 것이 될 수 없다. 여러 의견들 중 최선의 의견에 기반하면서도 공유 과정에서 더 나은 의사 결정으로 발전시키는 과정은 수많은 의사결정을 여러 조직 단위에서 이루어내는 문화 구축과 상관 있다. 기술적 의사 결정은 보다 더 깊은 기술적 이해와 여러 가지 가설에 대한 분석, 연구 등의 반복적인 과정을 필수적으로 요구한다. 물론 이 과정에서 여러 사람의 아이디어를 수집하고 이해하고 논의할 ...

솔루션 기능 만들 때 우선순위 판단 기준

 제품 기능 만들 때 우선 순위 판단.  1. 꼭 필요한 기능, 이 중에도 복잡도가 높은 기능과 핵심 경쟁력이 될 차별성을 줄 수 있는 기능은 더 가중.  2. 당락을 결정하는 기능 항목은 명목만. 3. 그냥 필요할 것 같은 기능, 좋아보이는 기능은 끝까지 미루다가 실 요구사항이 생기면 … Straightforward 기능들은 언제든지 만들 수 있지만 복잡도가 높은 경우는 시행착오와 아이디어가 더 많이 필요하기 때문에 개발 시간의 변동성이 커서 좀더 일찍 파일럿 개발을 해가면서 검증이 필요합니다. 사실 복잡도가 있는 기능은 시간을 미리 계획해서 하는 건 무의미하기도 해서 조직적으로도 우선순위를 높이고 계속 아이디어를 공유해서 핵심 문제의 해결책을 검증하고 나야 유의미한 시간 계획을 세울 수 있죠. 복잡도 = 미검증된 주요 이슈가 있는 경우. 즉자적인 단순 아이디어로 개발할 경우 quality가 떨어져 솔루션으로서 가치를 이야기할 수 없는 경우라고 생각할 수 있습니다. 어떤 경우에도 솔루션 성격을 띄는 제품이나 서비스는 핵심 문제를 해결하려면 중요한 요소는 있게 마련이고 그중 아이디어가 필요한 복잡한 요소를 찾는 것은 가장 중요한 과정 중 하나라고 볼수 있어요. 문제를 인지하면 생각을 거듭하고 또 모을 수 있기 때문에 해가 되는 아이디어가 나오기 마련이니까요. 

O&KR 가설과 검증, 그리고 실제 적용

O&KR, 가설과 검증 구글이 전통적인 관리 기법은 모두 거부했지만 O&KR(목표와 핵심결과) 방식은 채택했다는 것은 잘 알려져 있는데 엄청난 인재들을 모아두고 불필요한 간섭을 하기보다는 스스로 목표를 설정하는 최소한의 관리 원칙만 두겠다는 것이었다고 생각한다. 목표 설정은 생각의 방향에 관한 것이니까 전반적으로 어떤 방향으로 갈 것인지가 어느 정도 연결되도록 하는 것이 핵심이고 그외에는 자율적으로 판단할 수 있게 했다고 생각할 수 있다. 목표 설정 외에 핵심 결과를 지표로 두는 것은 과학적 사고의 핵심과 연결된다고 생각하는데 구글에서는 핵심 결과 즉, Key Results를 평가 지표로 생각하지 않았고 스스로 목표를 구체화하는 검증 방법으로 바라보았다. 검증할 수 없는 추상적 목표를 검증 가능한 구체적 결과물로 리타겟팅하여 사고할 수 있게 해주는 것으로 가설과 검증에 관련된 과학적 사고 기법과 연결된 관리 방식인 셈이다. 물론 O&KR의 핵심 결과는 엄밀한 검증을 위한 것은 아니다. 목표를 직간접적으로 측정할 수 있는 방법을 설정하는 것이며 목표를 정량화한다기보다는 목표의 수준 혹은 개인적 방향을 간접적으로라도 계량할 수 있는 숫자이면 충분하다고 본다. 구글의 가이드라인을 보면 너무 쉬운 목표가 되거나 너무 어려운 목표가 되지 않도록 개인이 판단하기에 60~70% 달성을 목표로 할 수 있는 수치를 잡으라고 권고한다.  분기별로 알아서 업데이트하는 방식으로 최소한 분기별로는 한번 더 목표를 구체적으로 생각할 수 있게 해서 중점적으로 생각하는 방향을 스스로 관리하는 관리 방법이라고 할까. (O&KR을 평가 지표로 사용하는 경우도 있는데 그런 경우에는 좀더 KPI에 가까워지리라고 생각한다.) 우리는 과학이란 용어를 쉽게 사용하면서 검증을 게을리하는 것을 종종 본다.  과학이 절대적인 답을 주는 경우는 그렇게 많지 않다. (어쩌면 그것이 과학과 수학의 차이점일지 모르겠다.) 요즘은 데이터가 모든 것이라는 슬로건과 함께 데...

매니저의 역할

 매니저는 목표와 방향을 다루는 역할이다. 매니저가 아니라도 목표가 중요하지만 개별 목표와 그룹이나 조직의 목표는 다를수밖에 없고 어떻게 방향을 집합적으로 정렬해갈 것인가가 매니저의 핵심 미션이다. 좀더 개인들의 역할이 목표에 기반해있고 조직의 방향과 스스로 연결지어 간다면 관리 계층 구조를 좀더 줄여갈 수 있을 것이다. 관리 구조가 여러 층으로 수직화되면 매니저의 커뮤니케이션 역할이 더욱 중요해지는 반면 그럼에도 불구하고 전반적인 수동성이 높아지고 의사결정들이 복잡해지고 추상적이 될 우려가 있다.  목표의 공유는 사람들이 어떤 방향으로 생각을 한번 더 하게 할것인가의 문제이고 매니저의 의사결정은 그 사람들의 생각을 수집하고 수렴하고 체계화하는 것이라고 볼 수 있다. 지적인 문제 해결이 핵심인 조직에서 매니저의 의사결정이 방향에 대한 것을 빼고 나면 대부분 멤버들의 생각에 기반할수밖에 없다. 물론 충분히 좋은 생각을 만나지 못하고 시간만 흐를 경우에는 매니저 스스로 생각을 만들고 잠정적인 결정을 하는 역할도 있겠지만 대부분 보조적 역할이어야 잘 활성화된 조직일 것이다. (좋은 아이디어에 대한 판단 능력과 수렴 능력은 필수) 매니저의 보조적 역할은 멤버들의 질문을 도와주는 것이 멤버들의 솔루션을 도와주는 것보다 중요한 역할이라 할 수 있다   하지만 매니저가 항상 숟가락 얹기(?)만 하면 단순 논리의 중재, 정리 역할을 할 우려가 있는데 집단의 수준에 따라서 큰 문제가 안될수도 있겠지만 결과적으로는 대부분 단순한 추인의 의사결정이 된다고 하더라도 (그렇게 된다면 매우 좋겠지만) 결정의 방향성에 좀더 장기적인 관점을 부여하기 위해 훨씬 많은 노력을 기울여야 한다. 우수한 인재들이 많다면 장기적인 관점과 방향성에 대해서도 좀더 오픈하고 자주 논의하면 좀더 나은 숟가락을 만들 수 있을 것이다. 내가 하고 있는 일에 대해 스스로 어떤 목표를 부여하고 일정 간격으로 리마인드하게 하는 것, 너무 자주일 필요는 없지만 가끔씩 목표를 다시 생각하게 해...

지능

이미지
 지능을 이루는 건 크게 두 가지밖에 없는 것 같아. 하나는 집중의 수준과 지속력. 하나는 끝까지 목표를 향해 물고늘어지는 추진력. 첫번째는 타고 나는 것도 상당한 것 같고 학습을 통해 강화하는 것도 맞고... 두번째는 인생이 길기 때문에 더 중요한 ...  

백발이 성성한 코더는 아름다운 꿈일까

이미지
image from  xkcd.com 나이가 들어도 코딩을 할수 있는 건 맞지만 단순히 코딩 능력의 관점에서만 본다면 능력이 감소하는 것도 맞다. 미국에서 볼수 있던 백발을 휘날리는 코더는 대부분 COBOL 개발자들이었겠지만 실리콘밸리의 미래에 중장년의 코더가 어떤 역할을 할지는 모르겠다. 내 생각에 코더로서의 전성기는 사람마다 다르겠지만 40대 후반(45~48 무렵)이 아닌가 싶다. 코딩에 필요한 여러 경험의 축적에 따른 판단 능력을 충분히 고려해서 꾸준히 자기 관리를 학습과 체력면에서 가꾸어왔을 경우를 가정했을 때. 코딩이란 게 단순 개발을 뜻하는 건 아니므로 아키텍처나 질적 관점, 소통 능력, 협업 능력 등등을 고려했을 때 관리 측면과 개발 측면을 분리해서 개발 측면만으로 볼 때 이런 판단을 할수 있다. 성과 위주 관점에서는 순수 개발 역할만 하는 이의 나이는 관리를 잘하더라도 한계가 온다는 뜻이다. 직업적 운동 선수가 나이 한계가 있듯이. 한계는 경험적으로 보면 아무래도 집중하여 판단할 수 있는 시간이 줄어드는 데 있다. 장시간 집중해서 상세 판단을 하는 능력은 떨어질 수밖에 없다. 흔히 말하듯 추상 능력의 향상이 보완할 수 있을텐데 그 추상 능력이란 젊은 친구들보다 훨씬 더 오랫동안 판단을 거듭한 이들이 당연히 가지는 결과물인 거라고 생각된다. 그렇게 관리하지 못한 경우는 오히려 사고의 가소성 부족으로 학습 능력이 떨어지고 소통 능력도 떨어져서 급격하게 코더로서 부적격해질 우려도 있다. 꾸준히 학습하고 자기 관리를 한 경우 코딩 속도나 판단 능력에서 급격한 저하는 없다. 다만 더 좋아지기 어렵다. 나이가 든다고 개발 일을 못할 건 아니다. 하지만 굳이 개발 일을 시니어에게 맡기는 시장은 훨씬 좁기 마련이다. 경험과 협업적 코칭 등 단순 개발 관점 이외의 요소들이 필요한 시장인데 젊은 친구들과 소통하는 건 매우 도전적인 일이기도 하다. 세대간 문화의 차이를 무시할 수 없는데 개발 조직은 젊은 친구들의 문화를 기준 규범으로 상당 부분 기초해야 하고...

Java 15에 Biased Locking이 deprecate 된다.

이미지
최근 릴리스된 Java 15 버전의 new feature를 보다가 깜짝 놀람. JEP 374: Disable and Deprecate Biased Locking Biased locking은 실제로는 synchronized를 통해 lock을 쓰고 있으나 single thread에서 실행되는 경우가 더 많다고 가정하여 이 경우는 lock 오버헤드 없이 실행되도록 자바의 내부 스택에 상태 필드를 유지하는 방식의 최적화이다. 기존 JDK의 util 클래스들이 기본적으로 synchronized를 하도록 구현되어 있었기 때문인데 그후 sync 없는 클래스들이 API에 대부분 추가되었다. 하지만 여전히 java.io 패키지의 스트림 클래스들은 그대로이긴 한데 실제로는 IO를 하지 않는 ByteArray...Stream 같은 류는 biased locking의 여전한 수혜자이고 예전 API 기반으로 설계되어 Hashtable, Vector, Properties 같은 클래스를 인자로 받는 경우도 마찬가지이다. 물론 biased locking은 contentio n이 발생할 때에는 오버헤드가 있다. 이런 낙관적 최적화는 어느쪽이 더 전형적이냐가 분명할 때 효과가 있다. Java 15에서 biased locking을 제거하면 기존 코드들 중 이건 biased locking 덕분에 큰 차이가 없어 하고 넘어갔던 코드들이 모두 영향을 받을 것이다.  15년 가까이 biased locking을 전제로 decision을 했던 터라  약간 난감하다. 물론 가능하면 StringBuilder,ArrayList 등을 쓰는 건 당연했지만 약간 API적으로 선택이 모호한 경우에는 biased locking을 고려하여 lock free 모듈을 만들지 않고 넘어갔던 경우가 계속 떠오른다. (ByteArray stream 같은 경우는 별도로 Lite 클래스를 만들어 쓰긴 했지만 항상 그럴 수 있었던 건 아니다) 제거를 결정한 근거는 대부분 코드들이 lockfree new API로 옮겨갔다...

근래 최고의 Java 혁신은 GraalVM Native Image가 아닐까

이미지
GraalVM의 Native Image가 리눅스 컨테이너에서 Spring Boot 기반 서비스들을 실행하는 데 점점 더 많이 사용되는 이유 중 하나가 메모리 footprint가 기존 서버 JVM처럼 미리 Heap을 전체 할당하는 방식이 아니라는 것일듯. 참고 : Quarkus - SUPERSONIC SUBATOMIC JAVA A Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM, crafted from the best of breed Java libraries and standards.  GraalVM의 Native Image는 SubstrateVM이라는 유사 JVM(?)을 사용하는데 그야말로 기판에 사용되는 자바 모듈들을 AOT 방식으로 컴파일해서 붙여가는 방식이라서 이렇게 이름을 붙인듯. -Xmx 기본값이 unlimited 이다. 와우! SubstrateVM은 closed world라는 전제로 만들어졌는데 런타임에 사용되는 모듈들은 빌드 타임에도 알 수 있다는 전제이다. 그래서 동적으로 로드되는 자바 코드나 JNI 코드나 다 찾아서 빌드 타임에 미리 함께 빌드되도록 옵션 처리해줘야 한다. 한마디로 상당량의 삽질이 기본 전제된다. ㅠㅠ 그런데 점점 더 활용도가 높아져서 많이 쓰는 모듈들은 (JVM 런타임을 포함해서) 분명 누군가가 이 삽질들을 해놓았을 거라고 기대할 수 있다. 내가 짠 모듈들만 잘 챙기면 많은 경우 해결이 될 것이란 기대... 게다가 graalvm native image는 polyglot이다. 아직 실험적이지만 R과 python 코드를 컴파일할 수 있다. numpy와 pandas 패키지를 포함해서... 서버뿐 아니라 클라이언트 프로그램으로도 java를 좀더 잘 활용할 수 있게 되었다. 대부분 관심이 없겠지만(!) 이제 JavaFX로 작성한 프로그램을 GraalVM Native Image로 쉽게 컴파일할 수 있게 되었다. 윈도우에서 하나의 exe 바이너리로 쉽게 ...

마틴 파울러가 소프트웨어 아키텍처를 the important stuff이라고 했다.

이미지
  마틴 파울러가 짧은 강의를 통해 소프트웨어 아키텍처란 the important stuff 라고 정의한다. 아키텍처는 두 가지 측면을 가지고 있다고 하는데 "이해를 함께 해야 할 부분"이자 "변경이 어려운 부분"이라고. 이 두가지가 합쳐져서 "중요한 무언가"를 이루는데 이것을 아키텍처라고. 공감하는 부분도 있지만  소프트웨어 아키텍처를 너무 컴포넌트 중심으로 바라보는 것 같다. 시스템 구조적 측면을 단순히 컴포넌트로 보기는 어렵다. 구조의 측면을 고려하면 무조건 변경이 어려운 것은 아니다. 사실 시간의 기준으로 보면 그렇게 어려운 게 아니고 어렵다는 것을 마틴의 얘기 중 하나인 "지식의 깊이"로 보면 맞다고 볼 수 있다. "지식의 깊이"를 가진 사람들이라면 아키텍처는 하나의 aspect처럼 간주될 수 있다. 물론 비즈니스 로직은 잘 동작하고 최소한의 가독성을 가진 코드들로 구성되어 있다는 가정 하에서. 아키텍처는 리팩토링처럼 일상적일 순 없지만 계단식 개선이 간헐적으로 발생해야 하는데, 시간적 관점에서도 hard to change이면 그 소프트웨어의 품질은 나오자마자 이미 한계에 달한 것이 된다. 소프트웨어나 서비스의 아키텍처 측면 품질은 매우 중요한 결정적 요소가 되기 쉬운데 이를 개선하기 위해서는 개발 조직은 아키텍처를 이해할 수 있는 지식의 깊이를 갖춰야 한다고 단순 결론을 내릴 수 있다.

Websocket Java spec에 대한 단상

이미지
WebSocket  프로토콜은   하나의  tcp ( 실제로는  http  확장   형태 )  소켓으로   여러   개의   논리적   연결인   세션  개념을   지원한다 . 그런데  tcp  레벨에서   같은   연결을   사용하기   때문에   논리   세션은   각   특성에   따라   효율적이기   어렵다 .  적당한   크기의   프레임이란   메시지   단위로   잘라서   여러   세션   메시지를   섞어   보내다보니   원래는   하나의   양방향   큐를   구성하는  tcp  연결을   다시   에뮬레이트해야 해서   오버헤드가   있다 . 자바   웹소켓   스펙을   보면   메시지   유형이   스트림이면   큰   메시지라고   간주하여   매   프레임별로   별도의   쓰레드로   보내고   그렇지   않으면   하나의   쓰레드로   보내게   되어있는데   나는   이   스펙은   지나친   쓰레드   모델과   메시지   유형의   커플링이라고   본다 . 오히려   큰   파일일수록   순서대로   하나의   쓰레드에   큐로   보내고   작은 ...

R&D 조직 관리 - 목적 지향성, 협업성, 성장

이미지
관리는 정적인 프로세스가 아니다 팀장의 역할은 이러하고 프로세스는 이래야 하고 ... 관리를 정적인 형태로 이해하는 경우 흔히 나오는 이야기이다. 실제로 관리자가 조직 성원들 간에 기술적인 의사 결정을 하는 것을 절차적인 부분만 생각해서 round-robin, random, expert 등에게 맡기는 경우도 있고 혹은 위계 조직답게 일방적으로 결정하고 지시만 하는 경우도 많다. R&D 조직은 기술적 검증을 보통 조직 성원이 1차 진행하므로 의사 결정과 검증이 분리되는 현상은 의사 결정의 오류를 키울 가능성이 높다. 하지만 개인이 완벽하게 검증한 내용 기반으로 의사결정 하는 것은 일반적으로 더 나은 결정을 가로막을 가능성이 크다. 특히 각이한 수준, 각이한 경험의 개인들이 항상 조직 관점에서 최선의 선택을 하기는 쉽지 않다. 매니저는 상대적으로 더 많은 정보를 접하는 허브 역할을 하기 때문에 정보 접근성 관점에서 보더라도 앞에 설명한 다양한 의사결정 규칙은 적은 정보로 결정을 요구하게 되므로 큰 오류가 있다. 일방적 의사결정 경험적으로 최악의 매니저는 의견을 청취하지 않고 지위를 사용하여 결정하는 유형이다. 기술 회의의 의견은 기술적 관점이어야 하나 지위를 발언권으로 이해하고 아무 얘기나 마구 해서 실질적인 회의의 집중과 심화를 훼방하는 습성을 가진 경우다. 기술적 의사 결정을 위한 회의가 딱딱할 필요는 없고 다양한 의견을 폭넓게 듣기 위해 범위를 가능하면 제약하지 않는 게 좋지만 습관적으로 생각 없이 말을 하는 습성은 여러 사람의 시간을 낭비하게 하는 큰 장애물이다. 의사 결정에서 지위는 물론 존중되어야 하지만, 청취를 통해 더 나은 지식과 아이디어를 의사 결정의 근거로 만들지 못하는 것은 최악의 권위적 결정이 되고 이 과정에서 배제된 부원들은 점점 더 흥미를 잃고 수동화되고 성취욕이 강한 친구들은 능력을 발휘할 수 있는 곳을 찾아 조직을 떠날 것이다.  의견을 청취하는 것은 어려운 기술은 아니지만 훈련없이 그냥 얻어지진 않는다. 의견을 이해하고...

튜닝을 하려면 무엇을 고려하여 기준점을 잡아야 하나

이미지
(작은 에피소드였지만 흔히 접하게 되는 일이다.) " 웹크롤러 사용해서 데이터 수집이 일주일 걸리던 것을 멀티 쓰레드로 돌려서 1일 걸립니다. 멀티 쓰레드로 바꿀 때 concurrency 문제를 해결하기 위해 O(1) 복잡도를 가진 CopyOnWriteArraySet을 사용하였습니다." 이런 뿌듯한 발표를 듣고 너무 답답했다. 물론 O(1) 복잡도도 완전히 틀린 얘기이고 (아마도 array list의 배열 색인 접근 시 연산 복잡도를 잘못 본듯) 배열을 중복 허용하지 않은 기반 자료구조로 쓰기 때문에 조금만 커져도 접근이든 삽입이든 엄청 느리겠지만 무엇보다 concurrent 자료구조이다. COW는 빈번하게 변경이 여러 쓰레드들간에 걸쳐 발생하는 상황에서는 전혀 적합하지 않다. Concurrency 문제가 개별 연산 복잡도보다 훨씬 지배적인 상황이다. 하지만 개별적인 오류는 차치하고 성능 최적화를 할 때에는 병목이 무엇이고 시스템 자원이 포화가 되는지를 기준으로 판단해야 하는데 전혀 고려되지 않는다. 네트웍 대역은 아직 널널하고 CPU 자원도 별로 일을 하지 않는데 (물론 자료구조와 concurrency logic을 잘못 선택해서 좀 많이 낭비하긴 한다) 기준 시간이었던 7일(너무 naive한 구현)이나 개선한 1일이나 큰 의미가 있을까. Enough 라는 기준을 만족하면 되 는데 하루라는 시간이 어떤 경우에 만족이 될까. "시스템 자원을 70~80%까지 활용도를 높였는데 더 이상은 기존 로직을 세부 변경해야 해서 성능 때문에 논리 가독성을 포기하는 것은 희생이 커서 이만큼만 튜닝했어요." 이런 결론이 나야 하지 않을까. 학교마다 다르긴 하지만 많은 수도권 대학에서도 이제 운영체제와 같은 시스템 과목은 잘 가르치지도 않고 학생들이 수강하지도 않는다고 한다. 자바와 python, 웹 프로그래밍 중심의 대학 과정이 실용성의 이름으로 이루어진다. 놀랍게도 코딩만 가르쳐서 청년 실업을 해결하겠다는 움직임도 보이는데 인공지능 시대 소...