The roadtocodecraft

879 views

Published on

Published in: Education, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
879
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

The roadtocodecraft

  1. 1. SEEG<br />Software Engineering<br />Expert Group<br />The Road To Code Craft<br />김진 태<br />2011. 07. 05<br />
  2. 2. SEEG is …<br />2<br />도메인<br />전문기술<br />요구공학 / 설계 기법<br />패키지솔루션<br />프로세스<br />임베디드시스템<br />엔터프라이즈 시스템<br />재공학<br />품질 보증<br />SW 프로<br />세스 개선<br />컨설팅 영역<br />SW 품질보증<br />SW 개발 방법론<br />
  3. 3. 내가 듣고 싶은 ‘나’<br />3<br />개발자<br />코더<br />엔지니어<br />장인<br />
  4. 4. 공학의 특징은 재현가능, 반복 가능하다는 점이다.<br />그 방법, 그 프로세스대로 하면 동일한 결과가 나와야 한다. <br />그런데 SW는 실제 그렇게 안 된다.<br />즉, 공학으로 설명 안 되는 중요한 요인이 있다<br />4<br />Why Code Craft ?<br />공학으로 SW를 설명하기에는 난처한 점들이 많다 <br />
  5. 5. SW는 자동차와 같은 그런 종류의 자본 상품이 아니다<br />SW는 차의 디자인에 상응하는 어떤 것이다<br />기계적인 세계에서는, 무엇인가를 디자인한다는 것과, 그 디자인에 의거하여 상품을 생산한다는 것은, 서로 구분된 두 개의 활동이다<br />SW도 유사하다. 전자의 경우 지적인 작업이라고 하고 후자의 경우 사무적인 작업으로 비교할 수 있다<br />5<br />Why Code Craft ?<br />
  6. 6. SW 개발은 반복적이고 재현 가능한 경우가 별로 없다<br />SW 개발은 매우 지적인 작업들이기 때문이다<br />SW 개발은 혼자만의 지적인 작업이 아니다<br />수 많은 커뮤니케이션을 필요로 하는 협력적이고 사회적인 작업이다<br />6<br />Why Code Craft ?<br />
  7. 7. SW 공학 접근은 소프트웨어 개발 프로젝트의 부분을 설명할 수 있다<br />“왜 사람들은 우리가 가르치는 것을 실행하지 않는가?” –Watts Humpries-<br />“우리가쓴 논문은 실제 SW 개발에 사용되지 않는다” –David Parnas-<br />실제 SW 이해하고 적용하기 위한 비유 모델은 CRAFT<br />7<br />Engineering에서 Craft로 이해해야 합니다<br />
  8. 8. 진정, 코드는 잘 쓰십니까(write)?<br />구글: 6-7번 걸친 논리적 해결 능력과 코딩 실력 테스트<br />애플: Unit Test code 작성 의무<br />다른 산출물은 없을 수 있지만 코드는 있다!<br />기초적인 컴퓨팅 능력 없이 분석, 설계자, 아키텍트가 길러질 리 만무하다.<br />우린 SW의 기초인 code에서 다시 시작해야 합니다<br />8<br />Code Craft는 SW Craft로 가기 위한 출발점<br />
  9. 9. The Road To Code Craft<br />9<br />
  10. 10. 코드의 장인으로 가는 길은 동행길입니다<br />
  11. 11. 11<br />코드장인이 되는 길과 무술 장인이 되는 길이 유사합니다<br />
  12. 12. 12<br />각 주체가 해야 할 몫이 있습니다<br />지적<br />개인<br />조직<br />사무적<br />
  13. 13. 13<br />개인의 지적인 역량은 SW 개발의 핵심입니다<br /><ul><li>어릴 적부터 시작
  14. 14. 20代 이상 : 비용 대비 효과 미흡
  15. 15. 그 사람이 그 사람이다
  16. 16. 복잡성 핸들링문제
  17. 17. 읽기, 말하기
  18. 18. 듣기, 쓰기
  19. 19. 구조를 어떻게 잡을까?
  20. 20. 고객이 원하는 것이 이것인가?
  21. 21. 이걸 어떻게 테스트할까?
  22. 22. 2개의 서브함수로 나누자</li></ul>지적<br />개인<br />조직<br />사무적<br />
  23. 23. 14<br />개인의 사무적인 영역은 충분히 향상이 가능합니다<br /><ul><li>지금부터 시작
  24. 24. 20代 이상 : 비용 대비 효과 탁월
  25. 25. 그 사람이 다른 사람이다
  26. 26. 습관의 문제
  27. 27. 연습에 의해 달라 질 수 있다
  28. 28. 이름을 직관적으로 작성하라
  29. 29. 예쁘게 작성하라
  30. 30. 방어적 프로그래밍을 하라
  31. 31. 도구를 최대한 활용하라
  32. 32. 체크인 전에 코드를 한번 훑어봐라</li></ul>지적<br />개인<br />조직<br />사무적<br />
  33. 33. 15<br />조직의 사무적인 역량은 지적인 역량이 발휘하도록 환경을 조성하는 것<br />지적<br /><ul><li>지적인 일에 집중할 수 있는 작업환경 조성
  34. 34. 지적인 역량이 높은 개발자 채용 채용방식의 변화요구</li></ul>개인<br />조직<br />사무적<br />
  35. 35. 16<br />조직의 사무적인 역량은 지적인 역량이 발휘하도록 환경을 조성하는 것<br />조직이실제 할 수 있는 사무적인 일<br />
  36. 36. 17<br />조직의 사무적인 역량은 지적인 역량이 발휘하도록 환경을 조성하는 것<br />쉽게<br /><br />조직이실제 할 수 있는 사무적인 일<br /><ul><li>SCM
  37. 37. Issue tracking
  38. 38. Daily Build
  39. 39. Daily meeting</li></li></ul><li>18<br />조직의 지적인 역량은 개인의 역량이 발휘하도록 환경을 조성하는 것입니다<br />지적<br />개인<br />조직<br /><ul><li>멘토를찾고, 붙여주고, copy할 수 있는 환경
  40. 40. 무엇이 best practice인지 식별,발굴,전파</li></ul>사무적<br />
  41. 41. 19<br />조직은 개인이 사무적인 일에서 자유하도록개인은 지적인 일이 집중하도록<br />지적<br />어렵고,<br />고비용<br />쉽고,<br />저비용<br />개인<br />조직<br />사무적<br />
  42. 42. 20<br />-프로그래머의 길,멘토에게 묻다-<br />
  43. 43. 코드 장인으로 가는 기초 practices<br />21<br />
  44. 44. 22<br />Practice 1: 사람이이해할 수 있는 코드를 짜라<br />컴퓨터가 이해하는 코드는 어느 바보나 다 짤 수 있다. <br />훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 짠다 <br />- 마틴파울러-<br />
  45. 45. 가독성이 뛰어나다.<br />간단하고 작다.<br />의존성을 최대한 줄였다.<br />의도와 목적이 명확한 코드<br />타인에 의해 변경이 용이 한 코드<br />중복이 없는 코드<br />개체(Class, Method)가 한가지 작업만 수행하는 코드<br />23<br />사람이 이해할 수 있는 코드란 무엇일까요?<br />For people<br />For people<br />For people<br />For people<br />For people<br />For people<br />For people<br />
  46. 46. 24<br />왜 사람이 이해하는 코드를 만들어야 하나요 ?<br />사람<br />SW 공장은 ( )이기 때문입니다<br />행태<br />일반적인 SW 개발 ( )때문입니다<br />
  47. 47. 25<br />일반적인 SW 개발은 기존 코드에서 시작합니다<br />Evolution<br />Enhanced<br />More complex<br />Modified<br />Drift away <br />from its original design<br />Adapted<br />
  48. 48. 26<br />기능만 추가할 뿐 코드 품질의 개선 작업은 미비합니다<br />Product 1<br />productization<br />Product 2<br />Product 3<br />Base Code<br />update<br />
  49. 49. 27<br />개선되지 않은 SW는 늙게 되어 Dirty code 가 됩니다<br />Dirty code는 SW Aging을 가속화<br />The Spiral of Complex<br />
  50. 50. 28<br />SW 노후화는 품질을 급격히 떨어뜨립니다<br />
  51. 51. Practice 2: 이름 좀 제발 잘지으라<br />29<br />
  52. 52. 의도를 분명히 하라<br />30<br />주석이 필요 없는 코드를 작성하라<br />//Login Client으로부터의 Login요청을 처리함.<br />void CMessageProcFunc::Net_CLIENT_INFO()<br />void CMessageProcFunc::processLoginRequestFromClient()<br />public List<int[]> getList(){<br /> List<int[]> list1 = new ArrayList<int []>();<br /> for(int[] x : theList) {<br /> if(x[0] == 4) {<br /> list1.add(x);<br /> }<br /> }<br /> return list1;<br />} <br />public List<Cell> getFlaggedCell(){<br /> List<Cell> flaggedCells = new ArrayList<Cell>();<br /> for(Cell cell : gameBoard){<br /> if(cell.isFlagged()){<br />flaggedCells.add(cell);<br /> }<br /> }<br /> return flaggedCell;<br />}<br />
  53. 53. 그릇된 정보를 피하라<br />31<br />길고 서로 흡사한 이름은 피하라<br />public Class Vehicle {<br />controllForEfficientHandlingOfString ();<br />controllForEfficientStorageOfString ();<br />}<br />public Class Y {<br /> private Vehicle vehicle = new Vehicle();<br /> public void method A(){<br />vehicle.controllForEfficientStorageOfString();<br /> }<br />}<br />IDE 자동완성기능에서 선택할 때 실수의 여지가 있음<br />
  54. 54. 그릇된 정보를 피하라<br />32<br />연속적인 숫자를 붙인 이름을 피하라<br />public class Car{<br /> private Tire tire1 = new Tire();<br /> private Tire tire2 = new Tire();<br /> private Tire tire3 = new Tire();<br /> private Tire tire4 = new Tire();<br />}<br />public class Car{<br /> private Tire leftFrontTire = new Tire();<br /> private Tire rightFrontTire = new Tire();<br /> private Tire leftBackTire = new Tire();<br /> private Tire rightBackTire = new Tire();<br />}<br />public class Vehicle{<br /> public moveControl(intmoveType){<br /> if(moveType==0){<br /> }else if(moveType==1){<br /> } else if(moveType==2){<br /> }else{<br /> throw Exception();<br /> }<br /> }<br />}<br />public class Vehicle{<br /> Const int GO_STRAIGHT = 0;<br /> Const int TURN_LEFT = 1;<br /> Const int TURN_RIGHT = 2;<br /> Const int STOP = 3;<br /> public controlMovement(intmoveType){<br /> if(moveType== GO_STRAIGHT){<br /> }else if(moveType== TURN_LEFT){<br /> } else if(moveType== TURN_RIGHT){<br /> }else{<br /> throw Exception();<br /> }<br /> }<br />}<br />
  55. 55. 클래스 이름을 일관성 있게 작성하라<br />33<br />클래스이름은 명사또는 명사구로 작성하라<br /> : 클래스는 행위(멤버함수)의 주체로서 명사 또는 명사구로 표현됨<br />
  56. 56. 함수 이름을 일관성 있게 작성하라<br />34<br />함수 이름은 동사 또는 동사구로 작성하라<br />: 함수는 클래스가 행하는 행위로서 동사 또는 동사구로 표현됨<br />SRP Test: 클래스가 스스로 멤버함수 한다.<br />
  57. 57. 단일책임의 원칙<br />단일책임원칙(Single Responsibility Principle)<br /><ul><li>클래스가 한가지 책임만 가져야 한다는 원칙
  58. 58. 클래스나 모듈을 변경할 이유가 하나 뿐이어야 함
  59. 59. 큰 클래스  작은 클래스 여럿작은 클래스와 협력해 시스템에 필요한 동작 수행</li></ul>SRP<br />35<br />____________가 스스로 ___________ 한다. <br />각 줄의 첫 번째 공백에 모듈명을 적습니다. 두 번째 공백에 모듈의 메소드/함수 중 하나를 적습니다. 모듈의 모든 함수/메소드마다 이를 수행합니다.<br />각 줄을 소리 내어 읽습니다. 읽은 내용을 이해할 수 있습니까? 실제로 모듈의 함수/메소드가 의미하는 내용에 책임을 갖고 있어야 합니까?<br />
  60. 60. SRP(Single-Responsibility Principle)<br />SRP Test 예<br />Automobile 모듈(혹은 클래스)에 SRP 적용하기<br />Automobile<br />start();<br />stop();<br />changeTires(tires []);<br />drive();<br />wash();<br />checkOil();<br />getOil();<br />SRP 준수 SRP 위반<br /><br /><br /><br /><br /><br /><br /><br />
  61. 61. Why에대한 답변으로 주석<br />그 외에 달지 말 것<br />37<br />Practice 3: 주석시간에 Clean code에 신경 써라<br />
  62. 62. 주석대신 코드로 의도를 표현해라<br />38<br />코드만으로는 의도를 표현하기 힘들 때만 주석을 사용해라<br />그러나 될 수 있으면 코드로 표현해라<br />//플레그된 셀을 반환<br />public List<int[]> getList(){<br /> //플래그된 셀을 List형태로 저장<br /> List<int[]> list1 = new ArrayList<int []>();<br /> for(int[] x : theList) {<br /> if(x[0] == 4) { //플래그 되어있다면<br /> list1.add(x); // 리스트에 저장<br /> }<br /> }<br /> return list1;<br />}<br />public List<Cell> getFlaggedCell(){<br /> List<Cell> flaggedCells = new ArrayList<Cell>();<br /> for(Cell cell : gameBoard){<br /> if(cell.isFlagged()){<br />flaggedCells.add(cell);<br /> }<br /> }<br /> return flaggedCell;<br />}<br />
  63. 63. 이런 주석은 삭제해야 합니다<br />39<br />없어도 되는 주석<br />PublicintgetDayOfMonth(){<br /> private intdayOfMonth; <br /> return dayOfMonth;<br />}<br />/** The name */<br />Private String name;<br />/** The version */<br />Private String version;<br />/** The licenceName */<br />Private String LicenceName;<br />/**<br />* 달중 날짜를 반환한다.<br />*<br />*@return 달중 날짜<br />*/<br />//달중 날짜<br />
  64. 64. 이런 주석은 삭제해야 합니다<br />40<br />이력 및 저자를 기록하는 주석<br />SCM 도구를 사용해서 해결할 것<br />/*<br />11-Oct-2001<br />작성자: 김민수<br />변경내용: <br />클래스를 다시 정리 하고 새로운 패키지 인<br />com.jrefinery.date로 옮김<br />02-Nov-2001: <br />작성자: 홍길동<br />변경내용: <br />com.jrefinery.date로 옮김<br />NoitableDate클래스 제거<br />getDescription() 메소드 추가<br />*/<br />l_hFile = CreateFile(strName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS /*CREATE_ALWAYS*/,//youyou_2009_03_18_OPEN_ALWAYSFILE_ATTRIBUTE_NORMAL, NULL);<br />
  65. 65. 이런 주석은 삭제해야 합니다<br />41<br />주석 처리한 코드<br />
  66. 66. 한국 소프트웨어 산업 경쟁력 OECD 19개국 중 14위<br />절대 규모 측면에서 미국, 일본, 영국 등 소프트웨어 선진국에 비해 크게 낮은 상황 <br />투입 대비 산출을 나타내는 효율성은 63점으로 영국, 일본, 미국 등의 소프트웨어 선진국보다 약 26∼37점 낮은 수준<br />한국의 소프트웨어 활용도선진국의 3분의 1 수준<br />생산에서 소프트웨어를 얼마나 활용하고 있는지를 측정하는 소프트웨어 활용도지수에서 한국의 점수는 소프트웨어 선진국의 34.2%에 불과 - 한국의 소프트웨어 활용도는 13점으로 미국(41점), 영국(40점), 일본(33점) 등 소프트웨어 선진국보다 낮은 상황<br />42<br />Practice 4: 도구를 활용하라<br />
  67. 67. 43<br />전 산업에 걸쳐 SW에 의한 업무 수행 안됩니다<br />출처:SERI 보고서<br />
  68. 68. Tool chain 이라는 의미 조차 많은 개발자가 모릅니다<br />요구분석, 설계, 구현, 테스트, 유지보수, 관리, 빌드, 형상을 통합하는 tool chain 구축 필요<br />44<br />소프트웨어 개발도 마찬가지입니다<br />
  69. 69. 45<br />쿵후 팬더로부터 배웁니다<br />작업에 집중할 수 있는 환경을 만들어 주세요<br />
  70. 70. 46<br />쿵후 팬더로부터 배웁니다<br />멘토가 있어야 합니다<br />
  71. 71. 47<br />쿵후 팬더로부터 배웁니다<br />도구를 활용하세요<br />
  72. 72. 48<br />쿵후 팬더로부터 배웁니다<br />기본기를 다지세요<br />읽혀지는 코드 작성<br />
  73. 73. 시간 제약으로 5일 과정을 40분 분량으로 정리했습니다.<br />더 관심이 있으시거나 오해 소지가 있는 부분은 따로 아래에 연락주세요.<br />김진태<br />jtkim@swexpertgroup.com<br />Twitter: @swexpertgroup<br />49<br />알립니다<br />

×