[요약] 죽을 때까지 코딩하며 사는 법

마크맨 2021. 6. 9. 03:09

요구사항을 관리하자

  • 프로젝트의 복잡성은 요구사항과 개발기술의 변화에 의존한다.

  • 프로젝트의 요구사항은 지속적으로 변화한다.

  • 요구사항을 관리하지 않으면 기술변화에 대처할 수 없으며, 혼돈으로 가버린다.

    • 새로운 기술 도입에 있어서 '프로젝트 일정 밀리면 너가 책임 질꺼지?' 가 되어버린다.

위기에 대응하기

  • 1957년대 미국 500대 기업 중 200년대에 500대 기업으로 남은 기업은 단 47개 뿐
  • 위기가 찾아올 때, 그에 대비하였다면 더욱 성장하고 가치가 높아지지만, 대비하지 않았다면 몰락한다.
  • 바람은 촛불을 꺼버리지만, 모닥불은 키운다.

모닥불 개발자 되기

L모드와 R모드

L모드 : 좌뇌 사용, 순차적인 사고방식, 실제 구현 시

  • 코드와 마법수

    • 마법수 : 인간이 단기기억하기 쉬운 단위의 수는 4
    • if 문 중첩이든, 콜 스택이든, 클래스 상속 구현이든 동시에 봐야 하는 부분이 4단계를 넘어가면 읽기 힘든 코드가 된다.

R모드 : 우뇌 사용, 설계시

  • UML을 사용하자

    • 원활한 의사소통을 위해 만들어졌지만, 의사소통은 L모드의 내용이다.
  • R모드를 잘 사용하는 법

    • L모드를 끄자, R모드를 시작하기 : 샤워 등산, 조깅 등

R모드를 적극적으로 사용하는 법

  • 함수형 프로그래밍

    • 논리의 순차적 전개가 어려움
    • 지역변수를 사용하지 않음
  • 어떤 패러다임을 충실히 따르고, 주력 언어가 패러다임을 지원하지 않더라도 패러다임의 원리를 추구하며 코딩하자

    • C에서 구조체를 객체지향적으로 사용해보기
    • js 클래스를 클래스 지향이 아니라 객체지향으로 사용하기
  • 클래스 지향과 객체지향 판별하기 : 조합보다 상속을 많이 쓴다면 클래스지향일 가능성이 높다

    • 객체란 서로 메세지를 주고 받는 생물학적 세포와 비슷해야 한다
    • 상속의 대상도 언제나 인터페이스 또는 추상 클래스여야 한다
  • 변수를 최소화하기

  • 코드의 세가지 기능

    • 구현한 목적에 맞게 실행
    • 유지보수 가능
    • 읽는 사람이 작성 의도를 파악할 수 있어야 함

낮선 사람 효과

  • 몇 년에 한번씩 이직하기, 좋은 관계를 유지한 상황에서 네트워크의 범위를 넓힌다

    • 네트워크의 가치는 사용자 수의 제곱에 비례한다
    • 약한 연결 : 가끔 한번 연락하는 관계
    • 동호회 모임이나 컨퍼런스 등
  • 적응 : 새로운 환경에 적응하는 과정에서 학습효과가 상당하다

  • 낮선 것을 익히기

    책, 기사, 블로그 트윗을 읽어라. 컨퍼런스에 가라. 여러 모임에 참가하라. 스터디 그룹에 들어가라. 익숙한 영역을 벗어나 낯선 것을 익혀라. .NET 프로그래머라면 자바를 배워라. 자바 프로그래머라면 루비를 배워라. C 프로그래머라면 리스프를 배워라. 두뇌를 유연하게 만들고 싶다면 프롤로그와 포스를 배워라 - 로버트 C 마틴, <클린코더>, 58p

  • 바벨 전략

    • 바벨에 바퀴 두 개가 있는 것 처럼, 두 개의 생존전략을 확보하여야 한다.
    • 백엔드라면 프론트엔드를 해보기 등
    • 인공지능도 좋을 수도
    • 나는 ETL 파이프라인도 좋을 것 같다.

독서의 중요성

  • 통찰력이 없으면 안된다.

  • 개인의 생각을 깊게 해주는 훈련도구이다.

  • 특정 주제에 대해 다양한 저자의 책을 읽기

    • R모드에가 이렇게 쌓이는 지식 속에서 통찰을 제공한다.
  • 다른 견해를 접하면서 스스로를 성장

  • 새로운 아이디어 얻기 : 읽기 L모드이다가 잠깐 다른 곳 보면 R모드가 되어서 내용을 섞어서 의견을 내놓음

  • 책에 메모하기를 권장 (!!)

전문가로 살기

  • 스스로의 한계를 알고 그걸 제어할 방법을 알아야 한다.

  • 전문적인 지식 노동자 : 자기 두뇌의 정신 에너지를 아껴 쓰는 방법 알기

    • 주커버그, 오바마 : 옷 갈아입기 귀찮
  • 집중력 마나 : 엉뚱한 일 - 회의, 개인 스트레스- 등에 에너지를 쏟으면 지식 노동을 수행할 수 없다

  • 집중력 마나를 효율적으로 쓰려면 몰입이 필요하다

    • 마하이 칙센트 미하이 교수의 <몰입의 기술>에서, 몰입 상태의 모델은 행동능력(기술, x축)과 행동 기회(도전, y축)이 비례로 상승하게 될 때에 몰입이 유지된다고 함
    • 어떤 도전을 통해 성취감을 느끼면서, 기술이 함께 성장할 수 있는 일을 해야 한다.
  • 몰입하지 못할 경우

    • 도전 기회만 많은 경우나 기술만 많은 경우에는 불안을 느낀다
    • 기술에 비해 도전 기회만 많은 경우 근심을 하게 된다 -> 더 공부하기
    • 기술에 비해 도전 기회가 없으면 권태를 느끼게 된다 -> 더 일 만들기
  • 뽀모도로 사용하기

    • 집중 시간을 1시간 30분 이상 유지하면 마나가 더 빨리 없어진다고 한다
    • 화이트 노이즈가 도움이 된다.
    • 10개 선에서 왔다갔다 조절해보고, 하루 최대 많이 할 수 있는 뽀모도로 수를 알고 있는 것도 중요
  • 인터럽트 줄이기

모닥불 조직

로젠탈 효과

  • 샘 라이트 스톤 <프로그래머로 사는 법>

    • 마리사 메이어의 성공 환경

      • 사고의 자유를 만끽하고 자기 의견과 생각을 자유롭게 공유할 수 있는 곳에 있기
      • 자신에게 투자해주고 도전거리를 주는 사람과 있기
      • 똑똑한 사람과 일할 수 있는 곳에 있기
      • 아직 준비되지 않은 일을 할 수 있는 곳에 있기
  • 천재를 만드는 조직

    • 평범한 사람이 비범한 일을 하게 만드는 조직의 능력 == 조직을 평가하는 기준
    • 구성원이 가진 능력에 주목하고, 그 능력을 최대한 발휘하게 하기
  • 로젠탈 효과

    • 누군가의 기대를 받는다는 것만으로 지능지수가 상승하는 효과
    • 조직문화 속에 기대감이 흐르고 있다면?

멘토

  • 멘토가 하는 일

    • 당신에게 투자하는 사람과 당신에게 도전거리를 안겨주는 사람을 위해 일하세요. - 샘 라이트 스톤 <프로그래머로 사는 법>
    • 도전거리를 주고 학습하도록 유도 -> 몰입 상태에 머물게 해주기
    • 조언도 해주기
    • 책임을 부여하기

대중의 지혜

  • 대중의 지혜의 요소

    • 의견의 다양성 : 다양한 개개인의 정보를 가질 것
    • 독립성 : 각자 독립적으로 의견을 가질 것
    • 분권화 : 개개인의 개별적 지식에 의존할 것
    • 통합의 매커니즘 : 각자 의견을 집단 결정으로 전환시키는 구조를 가질 것
  • 전문가는 못보는 것이 있다. 전문가의 의견만을 취합하는 것은 아주 큰 위험을 함께 가져가는 것

  • 대중의 지혜를 구축하기 위해서는 구성원 개개인에게 독립성을 보장하고 권한을 이야하는 과정이 필요

오른쪽을 보시오

  • 전문가의 문제 : 자신이 무엇을 알지 못하는지를 모른다.

  • 리처드 몬손 하펠, <소프트웨어 아키텍트가 알아야 할 97가지>

  • 전문가들이 현실을 무시하곤 한다.

  • Mangement By Objectives

    • 조직이 목표를 빠르게 처리하려면 조직 구성원에게는 적당한 여유가 필요한데, 이를 톰 드마르코는 슬랙이라 부름
    • 슬랙을 방해하는 조직내 문제점 해결: MBO를 버려라
    • 변화가 없다, 성과를 단순하게 정의할 수 있다는 두가지 가정을 기틀로 MBO가 만들어짐
    • 목표는 한달만 되어도 바귈 수 있음
    • 원래 의도는 비전이 있는 목표를 세우자였음
  • 식스시그마 : 품질경영 기법

    • 원래 의도는 창의력 없애기가 아님
    • 오류율을 최소한으로 줄이기 위해 시스템을 짜내는 족쇄가 아니라, 오류율을 빌미로 시스템에 문제점을 찾아 해결하는 쪽
  • 변명

    • 마이크 콘 <경험과 사례로 풀어낸 성공하는 애자일>
    • 익숙하지 않아서 안하는건데, 비효율적이라고 변명하기 - 다양한 회피 방법
  • 10배 법칙 - 대중의 지혜를 조직문화에 흡수시키기

    • 10퍼센트 나은 결과는 과거의 방법을, 하지만 10배 더 나은 것은 기존 전제를 버리고 모든 것에 새로운 방식으로 접근하기
    • 당연하다고 여기던 프로세스 방식을 모두 다시 검토하기

목표에 대해서

  • 간트 차트 : 공정별로 일정을 기입하고 그 일정을 연결하는 방식

    • 공정에 집중하게 만듬, 병목이 발생하는 공정이 있다고 해도 알아차리기 힘듬

    • 마이크 콘 < 불확실성과 화해하는 프로젝트 추정과 계획> 에서의 간트 차트의 문제점

      • 어떤 공정이 고객에게 어떤 가치를 제공했는지 알 수 없음
      • 계획 검토 시 어떤 기능을 빠뜨렸나가 아니라 무얼 하지 않았나가 검토 관점이 됨
      • 일정을 어기게 되면 공정을 시간 안에 맞춰야 하기 때문에 소프트웨어의 질을 포기하게 됨
    • 간트 차트 일정으로 개발팀을 관리하면 소프트웨어의 질은 떨어지고 요구사항에는 빈틈이 생김

모닥불 조직 == 애자일을 제대로 하는 조직

  • <맨먼스 미신>, 폭포수 모델은 틀렸다

  • 크레이그 라만, <UML과 디자인 패턴 활용> - 폭포수모델을 버리고 IID 를 표준으로 채택한 사례들

  • 소프트웨어 개발 목표

    • 고객은 뭘 원하는지 말해줄 수 없다.
    • 동작하는 소프트웨어를 보기 전까지 고객은 스스로 원하는 것이 뭔지 모름
    • 애자일 선언 : 작동하는 소프트웨어로 고객과의 협력을 하며 변화에 대응하겠다
  • 애자일과 제약이론

    • 정확한 목표 -> 전체 공적 그림 -> 병목구간 파악 -> 병목 해소
  • 마이클 거버 <사업의 철학>

죽을 때까지 코딩하기

두 개의 마음

  • 습관 만들기 -> 마음가짐

  • 마음가짐

    • 고착 마인드 세트 : 성장 가능성에 한계를 정하는 것

      • 노력이나 도전에 큰 의미를 두지 않음
    • 성장 마인드 세트 : 성장 가능성에 한계를 두지 않음

      • 오늘보다 내일, 더 성장해 나갈 수 있다고 믿는 것
      • 노력과 도전이 많은 의미를 지님
    • 칙센트 미하이 <몰입>의 부제 : 미치도록 행복한 나를 만나다

  • 마음가짐의 결과

    • 과정에 대한 칭찬이 필요하다
    • 결과에 대한 칭찬은 고착 마인드 셋을 가져온다

머니볼

  • 개개인이 슈퍼맨이 아니라 조직이 이길 수 있도록 개개인의 능력을 살린다

  • 인력이 부족한 개발팀, 기존의 방식

    • R&R을 나누고
    • R&R에 맞게 작업 분배
    • 관리자는 일정 모니터링
    • R&R에 맞게 열심히 하면 성공할 것이라 기대
  • 병목구간을 찾을 수 없기에 개선의 여지가 없음

  • 목표를 정하고 목표에 다라 공정을 재배열해야함

    • 목표 : 자기가 뭘 원하는지 모르는 고객이 원하는 걸 이해하고 가치를 충족하게 하는 것
    • 따라서 요구사항은 지속적으로 변화할 것이다
  • 스크럼과 스프린트

    • 2주 단위의 스프린트 -> 요구사항의 변화를 막는다, 목표 고정
    • 병목구간을 찾아서 개선할 수 있다
    • 데일리 스크럼에서 '한 일', '할 일', '방해요소'를 이야기하기
    • 방해요소는 병목구간을 가리킨다
  • 애자일 하지 않을 경우 역효과 - 브룩스의 법칙

    • 간트차트와 R&R을 보면서 플젝 -> 인력 부족 -> 일정 밀림 -> 인력 추가 -> 일정 밀림
    • 이유 : 인력 투입 시 적응 시간 필요, 기존 개발자의 도움 필요, 커뮤니케이션 비용 증가
  • 프로세스 개선의 외적인 방법 : 프로그램 제대로 만들기

    • 제대로된 소프트웨어를 만들면 아주 적은 인력만으로도 새로운 기능을 추가하거나 유지보수할 수 있다 - 로버트 C 마틴, <클린 아키텍쳐>

새로운 미래가 온다

  • 비전의 역할

    • 라이트 형제와 랭리의 비교

      • 지원과 학위와 인맥이 막강한 랭리보다 자전거 수리공 라이트 형제가 먼저 비행기 발명
      • 비전의 차이 : 라이트형제는 비행기를 발명하면 세계 역사의 흐름을 바꿀 수 있다고 생각, 랭리는 단순히 돈벌려고
    • 비전이 변연계에 심어진다

  • 비전이 없는 조직

    • 자기에게 이익이 되지 않는 일은 하려하지 않음
    • 비전이나 열정을 가진 사람은 소외됨
    • 일을 시키기 위해 R&R과 간트차트 사용
    • 진화가 어려워짐
  • 죽을때까지 코딩하기

    • 프로덕트에 대해 '왜'를 설명할 수 있는 기업

    • 자기계발의 습관을 가지기

      • L모드에서 R모드로
      • 순차적 논리 전개는 빈틈이 만흥니 공간적, 직관적, 총체적 방식으로 코딩하기
      • TDD를 사용하고 소프트웨어 개발 패러다임을 공부하고 익히기
      • 애자일에 익숙하기
    • 창조와 공감이 필요한 소프트웨어 - 자기가 뭘 원하는지 모르는 고객들이 뭘 원하는지 알게 만들기

    • 성장 마인트 셋 가지기

레퍼런스 책 중 읽어볼 책

  • 구글의 아침은 자유가 시작된다, 라즐로 복
  • 생각하지 않는 사람들, 니콜라스 카
  • 클린 시리즈, 로버트 C 마틴
  • 실용주의 프로그래머, 앤디 헌트
  • 맨먼스 미신, 프레더릭 브룩스
  • 경영의 실제, 피터 드러커
  • 객체지향의 사실과 오해, 조영호
  • 고객과 함께 하는 도메인 특화 언어 DSL, 마틴 파울러
  • 구글의 미래, 토마스 슐츠
  • 나는 왜 이 일을 하는가?, 사이먼 사이넥
  • 리스크, 피터 L. 번스타인
  • 린 소프트웨어 개발, 톰 포피딕
  • 린스타트업, 에릭 리스
  • 모든 기획자와 프리젠터가 알아야 할 사람에 대한 100가지 사실, 홍윤주,
  • 몰입, 미하이 칙센트미하이
  • 미래를 만든 Geeks, 엔디 허츠펠드
  • 불확실성과 화해하는 프로젝트 추정과 계획, 마이크 콘
  • 블랙스완, 나심 니콜라스 탈레브
  • 사업의 철학, 마이클 거버
  • 소프트 스킬, 존 소메즈
  • 소프트웨어 아키텍트가 알아야 할 97가지, 리처드 몬손헤펠
  • 소프트웨어 공학의 사실과 오해, 로버트 글래스
  • 스위치, 칩 히스, 댄 히스
  • 슬랙, 톰 드마르코
  • 실용주의 사고와 학습, 앤디 헌트
  • UML과 패턴의 적용, 크레이그 라만
  • CODE COMPLETE, 스티브 맥코넬
  • 테스트 주도 개발로 배우는 객체 지향 설계와 실천
  • 프로그래머로 사는 법, 샘 라이트스톤,
  • 프로그래머의 길 멘토에게 묻다, 에디웨일 오시나이, 데이브 후버
  • 피플웨어, 톰 드마르코, 디모시 리스터
  • 코딩 호러가 들려주는 진짜 소프트웨어 이야기, 제프 앳우드

'' 카테고리의 다른 글

Learning Spark - 1. Introduction to Apache Spark, The Genesis of Spark  (0) 2021.08.17