4. 공학의 특징은 재현가능, 반복 가능하다는 점이다. 그 방법, 그 프로세스대로 하면 동일한 결과가 나와야 한다. 그런데 SW는 실제 그렇게 안 된다. 즉, 공학으로 설명 안 되는 중요한 요인이 있다 4 Why Code Craft ? 공학으로 SW를 설명하기에는 난처한 점들이 많다
5. SW는 자동차와 같은 그런 종류의 자본 상품이 아니다 SW는 차의 디자인에 상응하는 어떤 것이다 기계적인 세계에서는, 무엇인가를 디자인한다는 것과, 그 디자인에 의거하여 상품을 생산한다는 것은, 서로 구분된 두 개의 활동이다 SW도 유사하다. 전자의 경우 지적인 작업이라고 하고 후자의 경우 사무적인 작업으로 비교할 수 있다 5 Why Code Craft ?
6. SW 개발은 반복적이고 재현 가능한 경우가 별로 없다 SW 개발은 매우 지적인 작업들이기 때문이다 SW 개발은 혼자만의 지적인 작업이 아니다 수 많은 커뮤니케이션을 필요로 하는 협력적이고 사회적인 작업이다 6 Why Code Craft ?
7. SW 공학 접근은 소프트웨어 개발 프로젝트의 부분을 설명할 수 있다 “왜 사람들은 우리가 가르치는 것을 실행하지 않는가?” –Watts Humpries- “우리가쓴 논문은 실제 SW 개발에 사용되지 않는다” –David Parnas- 실제 SW 이해하고 적용하기 위한 비유 모델은 CRAFT 7 Engineering에서 Craft로 이해해야 합니다
8. 진정, 코드는 잘 쓰십니까(write)? 구글: 6-7번 걸친 논리적 해결 능력과 코딩 실력 테스트 애플: Unit Test code 작성 의무 다른 산출물은 없을 수 있지만 코드는 있다! 기초적인 컴퓨팅 능력 없이 분석, 설계자, 아키텍트가 길러질 리 만무하다. 우린 SW의 기초인 code에서 다시 시작해야 합니다 8 Code Craft는 SW Craft로 가기 위한 출발점
44. 22 Practice 1: 사람이이해할 수 있는 코드를 짜라 컴퓨터가 이해하는 코드는 어느 바보나 다 짤 수 있다. 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러-
45. 가독성이 뛰어나다. 간단하고 작다. 의존성을 최대한 줄였다. 의도와 목적이 명확한 코드 타인에 의해 변경이 용이 한 코드 중복이 없는 코드 개체(Class, Method)가 한가지 작업만 수행하는 코드 23 사람이 이해할 수 있는 코드란 무엇일까요? For people For people For people For people For people For people For people
46. 24 왜 사람이 이해하는 코드를 만들어야 하나요 ? 사람 SW 공장은 ( )이기 때문입니다 행태 일반적인 SW 개발 ( )때문입니다
47. 25 일반적인 SW 개발은 기존 코드에서 시작합니다 Evolution Enhanced More complex Modified Drift away from its original design Adapted
48. 26 기능만 추가할 뿐 코드 품질의 개선 작업은 미비합니다 Product 1 productization Product 2 Product 3 Base Code update
49. 27 개선되지 않은 SW는 늙게 되어 Dirty code 가 됩니다 Dirty code는 SW Aging을 가속화 The Spiral of Complex
52. 의도를 분명히 하라 30 주석이 필요 없는 코드를 작성하라 //Login Client으로부터의 Login요청을 처리함. void CMessageProcFunc::Net_CLIENT_INFO() void CMessageProcFunc::processLoginRequestFromClient() public List<int[]> getList(){ List<int[]> list1 = new ArrayList<int []>(); for(int[] x : theList) { if(x[0] == 4) { list1.add(x); } } return list1; } public List<Cell> getFlaggedCell(){ List<Cell> flaggedCells = new ArrayList<Cell>(); for(Cell cell : gameBoard){ if(cell.isFlagged()){ flaggedCells.add(cell); } } return flaggedCell; }
53. 그릇된 정보를 피하라 31 길고 서로 흡사한 이름은 피하라 public Class Vehicle { controllForEfficientHandlingOfString (); controllForEfficientStorageOfString (); } public Class Y { private Vehicle vehicle = new Vehicle(); public void method A(){ vehicle.controllForEfficientStorageOfString(); } } IDE 자동완성기능에서 선택할 때 실수의 여지가 있음
54. 그릇된 정보를 피하라 32 연속적인 숫자를 붙인 이름을 피하라 public class Car{ private Tire tire1 = new Tire(); private Tire tire2 = new Tire(); private Tire tire3 = new Tire(); private Tire tire4 = new Tire(); } public class Car{ private Tire leftFrontTire = new Tire(); private Tire rightFrontTire = new Tire(); private Tire leftBackTire = new Tire(); private Tire rightBackTire = new Tire(); } public class Vehicle{ public moveControl(intmoveType){ if(moveType==0){ }else if(moveType==1){ } else if(moveType==2){ }else{ throw Exception(); } } } public class Vehicle{ Const int GO_STRAIGHT = 0; Const int TURN_LEFT = 1; Const int TURN_RIGHT = 2; Const int STOP = 3; public controlMovement(intmoveType){ if(moveType== GO_STRAIGHT){ }else if(moveType== TURN_LEFT){ } else if(moveType== TURN_RIGHT){ }else{ throw Exception(); } } }
55. 클래스 이름을 일관성 있게 작성하라 33 클래스이름은 명사또는 명사구로 작성하라 : 클래스는 행위(멤버함수)의 주체로서 명사 또는 명사구로 표현됨
56. 함수 이름을 일관성 있게 작성하라 34 함수 이름은 동사 또는 동사구로 작성하라 : 함수는 클래스가 행하는 행위로서 동사 또는 동사구로 표현됨 SRP Test: 클래스가 스스로 멤버함수 한다.
59. 큰 클래스 작은 클래스 여럿작은 클래스와 협력해 시스템에 필요한 동작 수행SRP 35 ____________가 스스로 ___________ 한다. 각 줄의 첫 번째 공백에 모듈명을 적습니다. 두 번째 공백에 모듈의 메소드/함수 중 하나를 적습니다. 모듈의 모든 함수/메소드마다 이를 수행합니다. 각 줄을 소리 내어 읽습니다. 읽은 내용을 이해할 수 있습니까? 실제로 모듈의 함수/메소드가 의미하는 내용에 책임을 갖고 있어야 합니까?
61. Why에대한 답변으로 주석 그 외에 달지 말 것 37 Practice 3: 주석시간에 Clean code에 신경 써라
62. 주석대신 코드로 의도를 표현해라 38 코드만으로는 의도를 표현하기 힘들 때만 주석을 사용해라 그러나 될 수 있으면 코드로 표현해라 //플레그된 셀을 반환 public List<int[]> getList(){ //플래그된 셀을 List형태로 저장 List<int[]> list1 = new ArrayList<int []>(); for(int[] x : theList) { if(x[0] == 4) { //플래그 되어있다면 list1.add(x); // 리스트에 저장 } } return list1; } public List<Cell> getFlaggedCell(){ List<Cell> flaggedCells = new ArrayList<Cell>(); for(Cell cell : gameBoard){ if(cell.isFlagged()){ flaggedCells.add(cell); } } return flaggedCell; }
63. 이런 주석은 삭제해야 합니다 39 없어도 되는 주석 PublicintgetDayOfMonth(){ private intdayOfMonth; return dayOfMonth; } /** The name */ Private String name; /** The version */ Private String version; /** The licenceName */ Private String LicenceName; /** * 달중 날짜를 반환한다. * *@return 달중 날짜 */ //달중 날짜
64. 이런 주석은 삭제해야 합니다 40 이력 및 저자를 기록하는 주석 SCM 도구를 사용해서 해결할 것 /* 11-Oct-2001 작성자: 김민수 변경내용: 클래스를 다시 정리 하고 새로운 패키지 인 com.jrefinery.date로 옮김 02-Nov-2001: 작성자: 홍길동 변경내용: com.jrefinery.date로 옮김 NoitableDate클래스 제거 getDescription() 메소드 추가 */ l_hFile = CreateFile(strName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS /*CREATE_ALWAYS*/,//youyou_2009_03_18_OPEN_ALWAYSFILE_ATTRIBUTE_NORMAL, NULL);
66. 한국 소프트웨어 산업 경쟁력 OECD 19개국 중 14위 절대 규모 측면에서 미국, 일본, 영국 등 소프트웨어 선진국에 비해 크게 낮은 상황 투입 대비 산출을 나타내는 효율성은 63점으로 영국, 일본, 미국 등의 소프트웨어 선진국보다 약 26∼37점 낮은 수준 한국의 소프트웨어 활용도선진국의 3분의 1 수준 생산에서 소프트웨어를 얼마나 활용하고 있는지를 측정하는 소프트웨어 활용도지수에서 한국의 점수는 소프트웨어 선진국의 34.2%에 불과 - 한국의 소프트웨어 활용도는 13점으로 미국(41점), 영국(40점), 일본(33점) 등 소프트웨어 선진국보다 낮은 상황 42 Practice 4: 도구를 활용하라