소프트웨어 장인 (The Software Craftsman)
- 산드로 만쿠소 지음
1. 21세기의 소프트웨어 개발
- 예전의 개발 문화
- 새로운 문화 (최근)
- 소프트웨어 장인정신이 필요해졌다.
2. 애자일 (Agile, 민첩)
- 나오게 된 배경은 이전 시대의 워터폴 방식의 부족함에서 출발
- 분류
- 절차적 관점: 올바른 목표를 향해 가는지 확인
- 기술적인 관점: 목표한 것을 올바르게 실행하고 있는지 확인
- 애자일 메니페스토(menifesto, 선언문) 원칙들
- 실제 애자일을 실행할 때 기업들은 오해를 한다.
- 절차적인 것을 중시하고 기술적인 것은 무시한다.
- 소웨 개발자들의 기술은 완벽하고 절차만 고치면 된다는 식의 사고방식은 안된다.
- 기업 차원에서 소웨 장인정신이 필요하다
3. 소프트웨어 장인정신
- 정의: 소프트웨어 개발의 프로페셔널리즘에 대한 것 (이념이나 마음가짐)
- 소프트웨어 장인정신 메니페스토 (menifesto, 선언문)
- 스스로 끊임없이 기술연마, 다른 사람들의 기술연마를 도움
-> 궁극적으로 Professional SW 개발 수준을 높인다.
- 동작하는 소프트웨어 뿐만 아니라, 정교하며 솜씨있게 만들어진 작품을,
- 변화에 대응하는 것 뿐만 아니라, 계속해서 가치를 더하는 것을,
- 개별적으로 협력하는 것 뿐만 아니라, 프로페셔널 커뮤니티를 조성하는 것을,
- 고객과 협업하는 것 뿐만 아니라, 생산적인 동반자 관계를,
- 스스로 끊임없이 기술연마, 다른 사람들의 기술연마를 도움
4. 소프트웨어 장인의 태도
- 고객을 만족시키기 위한 투자는 스스로 해야한다.
- 자기계발
- 독서
- 블로그
- 기술 웹사이트
- 끊임없는 훈련
- 카타
- 토이프로젝트
- 오픈소스
- 페어 프로그래밍
- 사회활동 (다른 개발자와 어울림)
- 워라밸 (집중과 삶의 균형)
5. 영웅, 선의 그리고 프로페셔널리즘
- 저자의 예시, 경험 (상파울루) : 손해보면서라도 해내고 싶다는 영웅심리 등
- '아니오' 라고 말하는 방법 배우기 (예시, 마케팅 - PM - 개발팀 간의 실패 이야기)
- 대안 제시: 아니오 라고 할 때는 대안을 준비해서 제시한다.
- 깨어있는 관리자는 개발팀과 동고동락 한다.
6. 동작하는 소프트웨어
- 최근에는, 동작하는 소프트웨어 -> 고품질의 동작하는 소프트웨어 로 변화하고 있다.
- 소프트웨어를 운영하는 것은 정원 돌보기와 유사함: 꾸준히 해야 일이 적음
- 코드 품질과 기능구현 시간의 상관관계는 반비례 관계
- 시간에 대한 인식
- 기술적인 부채를 만들지 말자
- 그러기 위해서 테스트 작성은 중요하다.
- 단위테스트 작성은 별도로 스케줄 잡는 작업이 아니고, 코드 작성에 녹아있어야 한다.
- 레거시(legacy) 코드
- 그린필드 프로젝트만 있지 않다. 브라운 프로젝트가 훨씬 많다.
- 재미있는 도전으로 받아들이고, 부분으로 시작해서 확대해나간다.
7. 기술적 실행 관례
- 관리자나 개발자 등이 TDD, XP 등의 기술적 실행 관례에 관심을 가져야 하는 이유
- 무슨 가치가 있는지, 동료를 설득하기 위함과 상통함
- 애자일은 빠르고 짧은 피드백 루프로 올바른 일(right things)을 하는 것을 확인.
- 소프트웨어 장인정신은 기술적 실행 관례에 집중해서 올바른 실행을 하는 것을 확인.
- 애자일의 기술적 실행 관례는 적용 전에 실상황 파악을 잘 해야한다.
- 절차적 관례 > 실행적 관례 라고 애자일 코치나 컨설팅회사들이 주장하지만 아니다. 둘 다 중요하다.
- 기술적 실행관례 도입으로 현재 일하는 방식과 비교해서 가져올 이익에 집중한다.
- 빠른 피드백 루프
- 요구사항과 비용에 대한 더 나은 이해
- 지식 공유
- 줄어드는 버그
- 전체적으로 자동화되고 릴리즈가 빨라짐
- 실행관례 (XP 등) 예시 및 장점
- 자동화된 테스트: 피드백 루프 빠름, QA를 패스하여 비지니스 시간 단축
- 테스트 먼저: 하나씩 집중, 잘 정리된 요구사항 역할, 오버엔지니어링 줄임
- TDD: 테스트가 코딩 방향을 주도하면 복잡한 코딩 불가함
- 살아있는 문서역할을 함 설계, 단순성, 유지보수 용이성에 빠른 피드백
- 지속가능한 통합: 코드 통합 시 전체 테스트 -> 버그가 쌓이지 않게, "일단 멈추고 버그부터 수정"
- 페어프로그래밍: 코드리뷰는 피드백 루프 주기가 길다.
즉각적인 피드백, 코딩 표준 정의/유지에 도움 - 리팩토링: 자주 건드리는 곳의 작은 부분에서 시작 (꼭 필요한 부분)
유지보수 쉬운 클린코드는 개발속도를 높이고, 버그 가능성을 낮춘다.
- 실용주의
- 진리는 없고 계속 더 나은 방법을 찾아서 고객을 만족시킨다.
- 개방적인 사고방식을 갖는다.
- 항상 무엇을 하고 있고, 왜 하고 있는지를 질문한다.
- 실행관례 적용 전, 무엇을 이루려는지 논의한다.
- 그 이후에 달성하기 위한 실행 관례를 설정한다.
8. 길고 긴 여정
- 저자 경험 (브라질~ 영국)
- 어디로 가고 싶은지 (어떤 목표인지) 설정하고 해나간다.
인생을 큰 장기 프로젝트 개념으로 생각한다. - 기회를 만들기 위해 할 수 있는 활동들
- 컴포트 존을 벗어나서 새로 공부, 기술적 지식 확장 (새로운 프로그래밍 언어나 기술 배움)
- 지역 커뮤니티에 정기적으로 출석하거나 행사에 참여
- 다른 개발자, 비지니스 맨들과 교류
- 새로 배운 것, 지금 하는 것들을 블로깅
- 오픈소스 플젝 참여
- 프로젝트 만들고 공개
- 컨퍼런스 참석, 연사로 참석
- 회사 등의 일도 커리어 투자의 개념으로 접근 (이기적 마음으로 커리어 활동 x)
- 지식은 영원하고 돈과 안정은 영원 할 수 없다.
- 좋은 개발자의 원동력
- 돈: 기본
- 자율성, 통달, 목적의식
- 일(직장)을 신중히 선택하고 고객들을 만족시켜 나가면, SW장인으로서 좋은 커리어 가능
9. 인재 채용
- 새 인재 채용 시, 기업에서는 현재의 문제를 더 키우지 말아야 한다.
- 문제를 파악하고, 해당 문제가 없는 사람을 채용해야 한다.
- 채용 결과는 뽑힌 사람 책임보다는 뽑은 사람 책임이 된다.
- 면접관 중요, 기준 설정이 중요
- 전형적인 직무요건만 나열하는 것을 지양
- 열정, 미래의 성공 가능성을 높여준다.
10. 소프트웨어 장인 면접하기
- 생산적인 파트너십이 중요함
- 면접은 적합한 사람 + 회사에 남아있을 수 있는 사람을 찾는 것
- 회사/프로젝트 장단점을 다 설명해줄 필요가 있다.
- 지원자/회사 모두 서로 파악해나가는 시간
- 원샷면접/다단계면접, 질문의 내용 등으로..
- 좋은 면접은 자유토론과 같다. -> 이를 통해 실제 경험을 알아내기 좋다.
- 회사에선 필요한 가치를 먼저 찾고, 필요한 것만 면접 과정에 넣는다.
- 방법: 토론식, 마인드맵핑, 페어프로그래밍 등
- 면접은 서로에게 중요한 시간이다.
11. 잘못된 면접방식
- 똑똑한 척하는 면접관
- 수수께끼식 질문
- 본인도 답 모르는 질문 (직무 연관이 없는 질문)
- 지원자를 바보 만듦
- 인터넷 접속 금지 (코드 작성 시)
- 종이에 코드 작성
- 알고리즘 문제
- 전화면접 (불가피하면 가능)
12. 낮은 사기의 대가
- 개발팀 사기는 중요함. 기운 빠진 팀에 소프트웨어 장인이 어떤 도움을 줄 수 있을까? 열정.
- 애자일: 절차적 + 기술적 쏠림없이 다 중요하게 적용되어야 한다.
- 낮은 동기부여 -> 회사의 일하는 방식 개선이 불가하다.
-> 소프트웨어 장인이 열정을 불어넣을 수 있다.
13. 배움의 문화
- 사람들 스스로 모든 것을 더 나아지게 하고 싶어하는 동기부여
- 개발자들에게 권한을 위임하고 스스로 배움의 문화를 만들어 갈 수 있게 한다.
- 개발자들이 할 수 있는 일
- 북클럽 가입
- 테크런치 (기술 관련 난상토론)
- 그룹 토론회
- 업무 교환 (얼마의 기간동안)
- 소웨 장인들의 배움의 문화 조성을 위한 조언
- 모범을 보인다.
- 관심 보이는 이들이게 집중한다.
- 배움의 문화는 개발자 포함 모두가 해나가야 할 일
14. 기술적 변화의 실행
- 개발자, 관리자, 아키텍트들이 기술적 변화를 이끌려면, 맹신에 빠진 개발자들을 잘 다루어야 한다.
- 기술적 변화에 대한 회의론 종류들
- 무지, 대중(팔로워), 냉소주의, 트라우마, 너무 바쁜, 상사, 몰상식, 피해망상, 무능력 등등
- 바꾸려면 논쟁이 필요하고 -> 따라서 용기가 필요하다.
- 논쟁의 방법: 상대의 언어로 말하기, 말할 내용에 대해 스스로 잘 이해하기, 상대방 존중, 경청하는 법 알기
- 무지, 대중(팔로워), 냉소주의, 트라우마, 너무 바쁜, 상사, 몰상식, 피해망상, 무능력 등등
- 기술적 변화를 시작하는 방법
- 신뢰를 쌓으라
- 전문성 확보
- 모범을 보여라
- 부분적으로 시작한다
- 점진적 반복/관찰/수용
- 소프트웨어 장인으로서 기술적 변화 도입을 위해서.. 소통을 명확히 하고, 신뢰를 이끌어낸다.
15. 실용주의 장인정신
- 고품질은 고비용이다 -> 편견
- 품질은 선택사항이 아니고, 최소한의 품질을 유지한다.
- 소프트웨어 장인은 TDD 같은 실행 관례들을 마스터하고 있고, 시작부터 짧은 주기로 고객에게 전달하는 것을 목표로 한다.
- 딜리버리 속도가 빠르다.
- 애플리케이션 크기가 커질수록 XP 실행관례를 체득한 소웨 장인이 훨씬 빠르다.
- TDD는 항상 필요한 것은 아니다? (그렇다, 그렇지만 논의가 무의미하다)
- 적응되고 체득하면 모든 부분에서 훨씬 좋다 (UI 제외)
- 리팩토링 -> 레거시 수정 시 or 새로 추가 시 영향 받는 레거시
위의 상황들에 대해 리팩토링 (불필요한 리팩토링 지양) - 소프트웨어 프로젝트는 개발자를 위한 것이 아니다
- 개발 이 후 참여자 등 모두를 고려해서 만든다 (단준하고 쉽게)
- 비범함과 평범함
- 비범함: 가장 훌륭한 코드는 작성할 필요없는 코드. 단순하게 문제를 해결한다.
- 평범함: 복잡하게 해결
- 단순한 설계를 위한 네가지 원칙 (켄트 벡)
- 모든 테스트 통과 (모든 테스트를 통과해야 한다)
- 명료성의 최대화 (명료하고, 충분히 표현되고, 일관되어야 한다)
- 중복의 최소화 (동작이나 설정에 중복이 있어서는 안된다)
- 구성요소의 최소화 (메서드, 클래스, 모듈의 수는 가능한 적어야 한다)
- 디자인패턴: 범용화를 위함
- 범용화가 될 수록 복잡해진다.
- 필요할 때 수정하면서 적용한다.
- 새로운 스킬, 실행 관례 등을 배우는 것은 병목점이 될 수 있지만,
TDD 자체 (타이핑) 가 병목점이 되진 않는다. - 장인으로서의 역할은 특별히 이슈가 되지 않을 정도까지 품질 비용을 낮추는 것
16. 소프트웨어 장인으로서의 커리어
- 소프트웨어 장인: "열정", "겸손", "정직과 용기"
- 장인에게 직장은 커리어를 위한 지속적인 투자 개념도 갖는다.
- 커리어 관련해서 스스로에게 질문해본다.
- 나의 커리어로부터 나는 무엇을 원하는가?
- 그것을 성취하기 위한 다음 단계는 무엇인가?
- 이 일은 나의 커리어 방향과 합치하는가?
- 내가 이 회사에 줄 수 있는 가치의 양은 얼마나 되는가?
- 그러한 투자에 대한 이익은 무엇인가?
- 그러한 투자는 대략적으로 얼마 동안 지속되어야 하는가?
- 내가 되고자 하는 프로페셔널에 이르는 데 이 일은 어떻게 도움이 되는가?
- 이 일에서 나는 자율성, 통달, 목적의식을 가질 수 있나?
- 나의 고용주와 생산적인 동반자 관계를 맺을 수 있나? 양측 모두 가치 얻고 행복할 수 있나?
- 위의 질문들에 대한 답들은 상황에 따라 계속 변한다.
- 이를 맞추어 보면서 계속 생각한다.
- 본인에게 맞는 답들을 잘 모르겠다면 -> 사람들을 만나서 물어라
소프트웨어 장인은 사명을 갖는다.
더 나아지는데 집중하고, 계속 커리어에 투자하고, 배우고, 가르치고, 공유한다.
고객에게 항상 가치를 전달한다.
그러면서, 자부심을 갖는다.
'Programming' 카테고리의 다른 글
개발자의 글쓰기 - 책정리 (0) | 2021.10.26 |
---|---|
객체지향의 사실과 오해 (The Essence of Object-Orientation) - 책정리 (0) | 2021.10.11 |
[Database] Optimistic lock(낙관적 잠금), Pessimistic lock(비관적 잠금) 에 관하여.. (0) | 2021.09.06 |
[Database] 트랜잭션 격리수준에 관하여.. (데이터베이스 Transaction isolation level) (0) | 2021.08.31 |
[네트워크] 세션과 토큰에 관하여.. (feat. 쿠키) / Session, Token, Cookie, Network (0) | 2021.08.30 |