220 likes | 391 Views
공학적 측면에서의 프로그래밍 교육. July, 2002. 박 수 용 서강 대학교 컴퓨터학과 sypark@ccs.sogang.ac.kr. 목차. 서론 학생들의 프로그래밍 기술 발달 과정 공학 기반의 프로그래밍 교육 Software Development Process Design Pattern 해외의 패턴 교육 가상 시나리오. Program Vs. Software. Program = Software ?. Program = Set of executable computer instructions.
E N D
공학적 측면에서의 프로그래밍 교육 July, 2002 박 수 용 서강 대학교 컴퓨터학과 sypark@ccs.sogang.ac.kr
목차 • 서론 • 학생들의 프로그래밍 기술 발달 과정 • 공학 기반의 프로그래밍 교육 • Software Development Process • Design Pattern • 해외의 패턴 교육 • 가상 시나리오 Software System Engineering Lab
Program Vs. Software • Program = Software ? • Program = Set of executable computer instructions • Software = Computer program and related documents including analysis, design, project planning etc. • Programming 교육 • Software 개발 교육 Software System Engineering Lab
Engineering 학문의 발전 과정 Science Ad-hoc practice ProfessionalEngineering Production Commercial Craft • 교육된 전문가들 • 분석과 이론 • 과학에 의한 진전 • 전문 클래스에 의한 교육 • 분석을 통하여 새로운 응용이 가능 • 제품의 다양화에 의한 시장 분할 • 대가(Virtuoso)와 재능있는 아마츄어들 • 직관과 맹목적인 압력(Force) • 우연에 의한 진전 • 계획없는 전파 • 가능한 자원의 지나친 사용 • 판매 보다는 사용을 위한 생산 • 숙련된 기술자들 • 절차가 수립되어 있음 • 실용적인 정제 작업 • 기계적인 훈련 • 자원의 공급과 비용에 대한 경제적인 고려 • 판매를 위한 생산 Software System Engineering Lab
학생들의 프로그래밍 기술 발달 과정 Engineering 교육 Ad-hoc practice Programmer 코드예제 Art 자신만의 기법 숙제용 코드 • 학생 벤처, 프로그래밍 아르바이트, 삼성 멤버십 등으로 용돈 충당(일부 3 ,4학년) • 1000-5000 라인의 코드 • 코드 가독성에 대해 인식 • 소프트웨어 생명주기에 대해 인식 • 자신만의 분야 구축 • 미래에 대한 뚜렷한 비전 • 대부분의 학생(1-2학년) • 100-500 라인의 코드 • 시행 착오에 의한 코드 작성 • 주위의 도움에 의한 완성 • 책의 샘플코드 따라하기 • 맹목적인 압력(Force): 학점 • 우연에 의한 진전 • 코딩 잘하는 학생(2, 3학년) • 500-1000 라인의 코드 • 나름대로의 기법 수립 • 절차가 수립되어 있음 • 60년대의 방식 • 숙제완성에 대한 • 예측력 확보 • 코드 작성에 대한 자신감 • 코드 이상의 것에 대해 무지 Software System Engineering Lab
공학 기반의 프로그래밍 교육 • Software Development Process and Technology • Software development planning • Software architecture • Analysis & design • Implementation & Testing • Design Pattern Software System Engineering Lab
시나리오 주어진 상황 반응/대응 인지하고 적용할 수 있는 학생 인지 못한 학생 1. 개발 공정 2. 디자인 패턴 Software System Engineering Lab
예제 시나리오: 채팅 프로그래밍 숙제 • 인터넷 프로그래밍 과목의 숙제로 자바 애플릿을 이용해서 채팅 프로그래밍을 4명이 프로그래밍해야 합니다. • 기간은 중간고사 이후부터 성적제출일까지 약 2개월입니다. • 실제로 프리챌 같은 커뮤니티 사이트에 판다고 가정하고, 학생들은 잘 팔릴 것 같은 소프트웨어를 구축해야 합니다. Software System Engineering Lab
개발 공정을 인지 못 한 팀 • 시작: 일단 코딩부터! • 대략적인 UI 구성 후, 한 명에게 UI 전담 • 한 명에게 클라이언트(자바 애플릿) 전담 • 두 명이 서버 담당 • 3주 후: 1차 통합시도 • 통합 불가능 • 서로간의 불화 시작 • 잘 팔릴 것 같은 아이디어는 도출 되었으나, 현재 코드에 그러한 내용을 추가하는 것이 불가능 • 4주 후: 야합 성립 • 서버를 담당했던 두 명이 전체 코드를 담당하고, 나머지 두 명은 간식 조달 및 보고서 작성 • 7주 후: 밤샘 작업 돌입 • 완성 여부 불확실 • 잘 팔릴 것 같은 소프트웨어 보다는, 일단 작동하는 소프트웨어의 작성에 치중. • 8주 후: ? Software System Engineering Lab
개발 공정을 인지하고 적용할 수 있는 팀 • 시작: 요구사항 수립 • 벤치마킹을 통해 잘 팔릴 것 같은 채팅 소프트웨어의 특성에 대해 회의(1일) • 요구사항 정의(1일) • 1주 후: Risk Analysis • 평범한 애플릿으로는 화려한 UI가 불가능 • 웹 브라우저에서 애플릿 로딩 속도가 매우 느림 • 일반적인 서버에서는 많은 동시 사용자를 수용할 수 없음 • 2주 후: Risk 해결 • 애플릿에서 사용할 수 있는 무료 UI Component를 찾아서 1명이 전담 • IE 4.0 이후부터는 애플릿 로딩 속도 빠름 • ulimit으로 파일 디스크립터 한계를 높인 후, 많은 동시 사용자를 수용할 수 있는 프로토타입 제작 • 3주 후: 작업 분담 • 위험요소가 해결되었고, 3주간의 작업을 통해 팀워크 향상 • 서로간의 스킬라인에 따라 작업을 분배 • 1주 간격으로 계속적인 통합 • 6주 후: 개발 완료 • 피자 파티 Software System Engineering Lab
두 팀의 차이 개발 공정을 인지 못한 팀 개발 공정을 인지하고 적용할 수 있는 팀 • 팀원의 실수 가능성 존재 • 코드의 작동에 중심 • Waterfall • 성공했다면 그것은 슈퍼프로그래머의 노력에 의한 우연적 성공 • 실패했을 경우 그에 대한 해결책을 하루만에 수행해야 함 • 팀원의 실수 가능성 원천 봉쇄 • 코드의 품질에 중심 • 짧은 반복의 소중함을 인식 • 2주차의 관문을 통과하면 성공 • 혹은 2주차에 이미 실패를 예견하고 다른 방법을 모색. 남은 시간은 6주 대부분의 팀 약 1, 2 개 팀 Software System Engineering Lab
디자인 패턴을 인지 못 한 팀 public class 대기실 extends Thread { private 대기실리스너스레드[] 대기실리스너 = null; public static final LISTENER_PORT = 2000; public 대기실() { for (int i=0; i<20; i++) { 대기실리스너[i] = new 대기실리스너스레드(LISTENER_PORT + i); } … } } 팀장: 이 클래스의 인스턴스는 하나야!!!! Software System Engineering Lab
디자인 패턴을 인지하고 적용할 수 있는 팀 public class 대기실 extends Thread { private 대기실 instance; private 대기실리스너스레드[] 대기실리스너 = null; public static final LISTENER_PORT = 2000; static { instance = new 대기실(); } public 대기실 getInstance() { return instance; } protected대기실() { for (int i=0; i<20; i++) { 대기실리스너[i] = new 대기실리스너스레드(LISTENER_PORT + i); } … } } Singleton 패턴 Software System Engineering Lab
두 팀의 차이 디자인 패턴을 인지 못한 팀 디자인패턴을 인지하고 적용할 수 있는 팀 • 팀원의 실수 가능성 존재 • 코드의 작동에 중심 • 자신의 코드에 대한 자부심 결여 • 코딩을 ‘노가다’ 에 비유 • 팀원의 실수 가능성 원천 봉쇄 • 코드의 품질에 중심 • 자신의 코드에 대해 자랑하고 싶어하고, 아름다운 코드에 대해 인식 • 코딩을 ‘Art’에 비유 대부분의 팀 약 1, 2 개 팀 Software System Engineering Lab
패턴의 정의 패턴이란 특정 설계 컨텍스트에서 반복해서 발생하는 특정한 문제를 기술하고, 그 해결책으로서 검증된 방법을 제시한다. 그 해결책은 그 구성 컴포넌트들, 그들의 역할과 관계, 그리고 그들간의 상호작용을 기술함으로 구성된다. [POSA Volume I] • 일반적으로 패턴은 다음의 네 부분으로 구성된다. • 패턴 이름 • 문제점 • 해결책 • 결과 • [GoF] Software System Engineering Lab
소프트웨어 패턴의 종류 • Design patterns • architecture • design • idiom • Analysis patterns • Organization patterns • Process patterns • Domain-specific patterns Software System Engineering Lab
왜 패턴을 익혀야 하는가? • Becoming Chess Master • Becoming a Software Design Master • 패턴의 묘용 Software System Engineering Lab
Becoming Chess Master • 먼저 체스의 규칙을 익힌다. • 예를 들어 킹, 비숍 등의 움직이는 방법 • 그리고 원칙들을 익힌다. • 예를 들어, 각 기물들의 상대적 가치(킹은 나이트보다 중요하다), 각 기물들의 전략(나이트는 중앙에서 보다 강하다) • 그러나 체스 마스터가 되기 위해서는 다른 마스터들의 게임을 복기해야 한다. • 이러한 다른 마스터들의 게임에는 반드시 이해하고 외우고 반복해서 적용해봐야 하는 패턴들을 담고 있다. • 이러한 패턴은 수백가지가 존재한다. Software System Engineering Lab
Becoming a Software Design Master • 먼저 기본적인 규칙을 익힌다. • 프로그래밍 언어, 알고리즘, 자료 구조 등 • 그리고 원칙들을 익힌다. • 구조적 프로그래밍, 모듈, 객체지향 등 • 그러나 진정한 소프트웨어 설계의 마스터가 되기 위해선 다른 마스터들의 설계를 공부해야 한다. • 이러한 다른 마스터들의 설계에는 반드시 이해하고 외우고 반복해서 적용해봐야 하는 패턴들을 담고 있다. • 이러한 패턴은 수백가지가 존재한다. Software System Engineering Lab
패턴의 효용 • 소프트웨어 패턴은 다음과 같은 효용이 있다: • 실세계의 문제를 해결한다. • 문제영역의 전문지식을 전달해준다. • 설계의 결정과 이론적 근거를 문서화해준다. • 마스터들의 지혜와 경험을 재사용할 수 있다. • 전문가의 통찰력을 초심자에게 전달한다. • 문제를 해결하는 토의에서 공통의 어휘로서 사용할 수 있다. • 단순한 해결책 이상의 것을 제공한다: • 컨텍스트(언제 그리고 어디에 패턴을 적용할 것인가) • forces (상충되는 대안들, 부적합한 상황, 목표+제약사항) • 스펙트럼 (그 해결책이 force에 따라 그리는 균형의 함수) Software System Engineering Lab
패턴을 교육하는 대학 • http://www-2.cs.cmu.edu/afs/cs/project/tinker-arch/www/html/1998/ CMU • http://theory.lcs.mit.edu/~dnj/6898/index.html MIT • http://www.cs.lth.se/Education/Courses/96.Dokt.Patterns/LectSchedule.html Lunds Universitet • http://www.eli.sdsu.edu/courses/spring98/cs635/notes/ San Diego State University • http://sern.ucalgary.ca/courses/SENG/609.04/W99/ University of Calgary • 그 외 다수 존재 Software System Engineering Lab
결론 • 프로그래밍 위주의 교육의 위험 • 프로그래밍 교육 시 어떻게 하여야 하는가의 제시가 필요 • 소프트웨어 개발 절차 • 분석 및 설계 원칙 • 각종 유용한 패턴들 • 이러한 것들을 실제 응용하고 실습 할 수 있는 교육이 필요함 Software System Engineering Lab