소프트웨어 공학에서의 윤리적 코드
공학에 대해
1.공학의 정의
“구조, 기계, 장비, 제조 설비를 설계하거나 개발하기 위해 과학적인 원칙을 창의적으로 이용하거나 이런 원칙을 단독으로 활용하거나 섞어서 활용한다. 설계를 완벽하게 꿰뚫어 동일하게 동작하도록 만들거나 운영한다. 특정 운영 조건에서 동작 방식을 예측한다. 의도된 기능, 운영 경제성, 생명/재산 안전성에 충실한 활동이다”
[The American Engineers' Council for Professional Development]
1.1 공학에 대한 의견
“ 공학은 다양한 방면에서(특히,인류의 복지와 요구에 실질적으로 도움을 줄 때)만족스런 삶을 제공한다.”[ Vannervar Bush ]
“ 창의적인 설계는 전문 엔지니어의 핵심 임무다”
“ 우리 안에 조금씩의 피터팬이 있겠지만, 성숙하게 될수록 공동체의 번영에 공헌하고자 하는 욕구가 생길 것이다. 다시 말하자면 엔지니어는 이러한 열망 실현을 그들의 첫번째 존재 이유로 삼는다.”
[Samuel C.Florman]
1.2 공학의 성숙
CMU의 Mary Shaw는 위 그림과 같이 특정 분야가 전문적인 공학이 되기까지의 진보과정을 위같이 설명한다. 단순 기술은 재능 있는 아마추어가 이끌어가며,자신이 사용할 목적으로 제작됨에 자원에 대한 낭비가 발생한다. 즉, “무계획적으로 발전하는 단계”이다. 상업 단계에서는 제품을 만들기 위해서 자원을 주의 깊게 관리한다. 거대 자본이 주도하며 상품의 가격이 이슈가 되며 생산성을 높인다. 마지막으로 문제에 대한 해결을 위해 관련 과학이 발전하고 상업적 목적에 부응하는 이론이 나오기 시작한다. 전문적인 엔지니어는 이러한 과학적 이론과 실질적인 실험을 통해 진화되며, 자신의 분야의 이론과 실무에 모두 정통한 사람한 사람을 지칭한다.
소프트웨어 공학과 전문성에 대해
2.소프트웨어 공학의 정의
“소프트웨어의 개발, 운영,유지보수를 위해 체계적,절제된,정량적 접근을 하는 응용분야”
[IEEE std 610.12-1990]
2.1 소프트웨어 공학의 접근법
소프트웨어 공학 과정에서 “소프트웨어에 중점을 둬야 하나, 아니면 공학에 중점을 둬야 하나”라는 문제가 있다. 즉, 소프트웨어 엔지니어는 공학 마인드와 접근 방식을 이용한 소프트웨어 개발을 배워야 한다는 것과 소프트웨어 개발쪽에 특별 훈련을 받은 전통적인 엔지니어가 된다는 것이다.예를 들면, 데이비드 파나스 교수가 있는 맥마스터대학은 일반공학(재료역학,동역학,열역학 등)의 기본지식을 중요시하며, R.I.T에서는 일반공학 대신 소프트웨어공학 경영이나 경영정보시스템 등의 특화과정을 중요시 하고 있다.
2.2 베이컨(F.Bacon)의 과학적 방법에 기반한 소프트웨어 공학의 성숙 단계로 가기 위한 조건
편견을 버려라.
조직적으로 관찰과 경험을 축적하라
일단 작업을 중지하고 자신이 본 것을 개관한 후 초기 결론을 내린다.
[“ Novum Organum”, F.Bacon]
위 조건을 소프트웨어 공학에 적용시키면 일단 작성하고 고치는 개발의 악습을 없애고, 유효한 데이터를 모아서 활용하며, 개인,조직,업계의 프로정신의 함양을 통해 새로운 시각을 갖추어야 한다.
3. 전문성
3.1 공인된 전문가(recognized profession) [P.starr]
소속 집단이나 동료에 의해 검증된 지식과 역량
이성적,과학적 기반에서의 유효한 지식 보유
건강과 같은 실질적인 가치에 기반한 전문가적인 판단과 조언
3.2 전문가의 특성
인가된 사회에서 검증된 커리큘럼에 따른 교육
자격과 면허를 통한 실무적 적합성 등록
기술개발과 지속적 전문가적 교육의 특화
전문가 사회를 통한 공동지원
3.3 전문직[The code of Federal Regulation]
고도의 학습과 훈련을 필요로 하는 것
시장에서 널리 용인되는 것보다 높은 수준의 윤리를 그 속에 담는 것
규약을 깨뜨리는 자에 대한 징계
개인이 벌어들이는 것에 대한 사회적 책임의 강조와 영예롭게 훈육된 조직의 일원으로서의 의무
실제 입문에 앞서, 면허를 요구하는 것
3.4 성숙한 전문직요소 (Gary Ford,Norman E.Gibbs ; SEI)
위 그림과 같이 전문직은 위 8가지 요소를 만족시키고, 해당 요소가 오랫동안 존재하고, 활발하게 유지,발전되는 단계를 성숙된 전문직이라고 한다. 각 요소별 예를 들면 다음과 같다.
최초 전문가 교육 : 대학의 입학
인가 : 미국 공학 교육 인증원 등 (ABET,CEAB)
능력개발 : 실무경력
자격증 : 공학기초시험(FE)
면허 : 자발적 응시가 아닌 정부 강제적 성격
연수 교육 : 최신 지식을 유지
전문가 모임/학회 : 지식교환,자격 검증,인가,표준 , 윤리강력과 감시 행동
윤리 강령 : 윤리적 코드이며 규범이자 품위 유지, 위반시 축출되거나 면허 취소
소프트웨어 공학의 윤리적 코드에 대해
4. 소프트웨어 공학 윤리적 코드의 필요성과 목적
4.1 왜 소프트웨어 공학의 윤리적 코드가 필요한가?
전문가들은 다른 사람의 인생과 행복에 영향을 주기 때문에 대부분의 전문분야에서 명확한 윤리적 코드를 대부분 가지고 있다. 거창한 가치를 기술함에 어떤 코드는 사소하고 무관해 보인다. 전문가 코드는 실제적으로 3가지 수준의 의무가 있다. 첫번째는 다른 사람과 공유하는 인간적 가치를 다루는 진실성과 정의와 같은 윤리적 가치들이다. 두번째는 전문가로써 그들의 작업이 다른 사람에게 영향을 주는 부분에 대해서 좀 더 신경을 써야한다. 여기서는 전문가와 전문적인 자세에 대한 의무를 표현된다. 마지막은 위에서 언급한 상위 의무들과 연계된 전문가적 실천들이다. 예를 들면, 윤리적 코드의 “그들의 작업하는 소프트웨어에 대한 적당한 시험,디버깅,리뷰를 확실해하라”와 같은 것이다. 이러한 코드들을 따름으로써 다음과 같은 다양한 기능을 수행한다.
윤리적 수행에 대한 긍정적 자극, 즉,영감(靈感)을 준다.
역사적으로, 벗어난 행동이나 반대에 대해서 처벌하는 규범으로 전이된다.
작업의 질이나 그것을 사용하는 고객과 사용자의 에 대한 행복에 대한 책임을 수행하는 것에 대한 현재와 미래의 소프트웨어 엔지니어에 대한 지침으로 제공된다.
긍정적인 행동을 결정하는 전문가를 지지한다.
훈련과 절제에 대한 수단이 될 수 있다.
전문가의 공공적인 이미지를 강화시킨다.
4.2 윤리적 코드의 목적
소프트웨어 엔지니어의 윤리적/전문가적 의무를 문서화하고, 소프트웨어 공학을 가르치거나 실천하는 데 있어서 표준을 제시한다. 또한 사회가 그들에게 만족하기를 예상하는 표준, 그들의 동료들이 노력하는 것, 상호간에 예상하는 것에 대해 참가자들에게 알려준다.
5. 윤리적 코드 3.0
1997년에 배포된 윤리적 코드 3.0의 배경과 서문, 8가지 원칙과 상세한 내용을 구체적으로 살펴본다.
5.1 배경
the Board of Governors of the IEEE-CS와 ACM council에서 1994년 1월, 산업에 대한 결정, 전문가 인증, 교과목의 기본이 되는 소프트웨어 공학에 대한 전문가적 사례에 대한 적절한 표준을 작성하기 위해서 joint steering committee를 구성하여 다음 4가지에 대한 작업을 수행하였다.
표준적인 정의 도입
필요한 지식영역과 추천사례
윤리적 표준 정의
학부/대학원생,/평생교육을 위한 교육 과정 정의
또한 위 작업을 위해서 다음 3가지 프로젝트 팀을 구성하였다.
소프트웨어 공학의 지식영역과 추천사례
소프트웨어 공학 윤리와 전문가적 사례
소프트웨어 공학 교육 과정
특히, 2번은 소프트웨어 공학에 대한 윤리적, 전문가적인 책임과 의무를 문서화하였으며, 각 전문가 그룹에서의 특화개발하고, 국제적 특징을 반영하기 위해 다국적 회원들에 의해 검증하였다. 이러한 윤리적 코드(code of ethics)는 컴퓨터 분야나 공학코드들에 의해서 진화되었으며, 전문성과 사회에 대한 보호장치를 이루는데 강력한 도구로 활용되고 있다. 또한 전문가 그룹을 고무하고, 교육 및 적용을 위해 시도되며, 대중에게는 전문성에 대한 중요한 책임에 대해서 알리는 역할을 수행한다.
5.2 서문
상업, 산업, 정부, 의료, 교육, 엔터테인먼트, 사회, 일상에서 컴퓨터는 중요한 역할을 수행하며, 소프트웨어 시스템의 개발,설계하는 사람은 다른 사람에게 득이나 해를 줄 수 있다. 좋은 곳에 이용되기 위해서 소프트웨어 엔지니어는 소프트웨어가 이롭게 하고 존경받는 전문가가 되도록 설계,개발하도록 해야 한다. 따라서, 소프트웨어 엔지니어는 윤리적 코드를 반드시 따라야 한다.
윤리적 코드은 전문적인 소프트웨어 엔지니어에 의한 결정과 행동에 관련된 8가지 원칙을 가지고 있다. 각 원칙은 아래의 전문적인 소프트웨어 엔지니어의 3가지 수준의 윤리적 의무를 설명한다.
인간적인 입장에서 모든 다른 사람들과 나누는 윤리적 가치
작업에 의해 영향 받는 사람에 대한 세심한 배려에 대한 의무
전문가적 실천을 위한 요소들에 대한 의무
또한 각 원칙에서는 위 언급한 3가지 수준의 의무에 대한 3가지 다른 형식으로 구성되어 있다.
인간적임 ; 전문가적 행동에 대한 비젼과 목표를 제공 – 명확한 윤리적 판단을 요함.
전문적임 ; 전문가로서의 의무와 자세를 표현 – 구체적인 행동 지침을 표현하지 않지만 전문가적인 책임을 명확히 함.
올바른 실천 ; 소프트웨어 공학에서 최고에 가까운 구체적인 행동적인 책임을 요구
5.3 8가지 원칙
Principle 1: 제품(Product)
소프트웨어 엔지니어는 제 시간에 합당한 가격으로 에러없이 대중과 고용주, 고객, 사용자에게 수용할 수 있는 수준의 질과 그들의 일에 유용한 소프트웨어를 제공해야 한다.
1.01. 잘 작성된 문서 기반의 소프트웨어의 요구사항이 사용자의 요구를 만족하며, 고객의 승인을 받도록 한다.
1.02. 그들이 작업하는 소프트웨어에 대한 요구사항을 완전히 이해하도록 노력해야 한다.
1.03. 작업하는 프로젝트에 대해서 교육과 경험의 적절한 조합으로 검증되도록 한다.
1.04. 제안하거나 작업하는 프로젝트에 대해서 올바르고 성취할 수 있는 목적과 목표를 확실히 한다.
1.05. 작업하는 프로젝트에 대해서 올바른 방법론을 선택하도록 한다.
1.06. 질적 향상과 위험 감소를 위해서 효과적인 절차를 포함한 좋은 관리를 확실히 한다.
1.07. 작업하는 프로젝트에 대해 비용, 일정, 인원, 산출물에 대한 현실적인 견적을 하여 위험 평가를 제공하도록 한다.
1.08. 발견된 문제에 대한 로그나 적용한 솔루션을 포함한 적당한 문서화를 확실히 한다.
1.09. 작업하는 사항에 대한 적당한 시험, 디버깅, 리뷰, 관련 문서를 확실히 한다.
1.10. 해당 소프트웨어에 적용되어지는 프라이버시를 고려한 소프트웨어와 관련 문서를 개발한다.
1.11. 법적 근거에 기반한 정확한 데이터를 사용하도록 유의하고 합당하게 승인되어진 방법으로 사용한다.
1.12. 언제든지 오래되거나 결함있는 정보를 삭제한다.
1.13. 해당 프로젝트에 관련된 윤리적, 경제적, 문화적, 법적, 환경적 이슈를 확인,정의,이해하고 일한다.
1.14. 대중, 사용자,고객, 고용자에게 최고의 질과 최저 비용을 제공한다. 모든 관련된 그룹에 명확한 균형을 맞춘다.
1.15. 기술적 검증부터 시작하여? 일에 대한 가장 합당한 산업 표준을 따르도록 일한다.
Principle 2: 대중(PUBLIC)
소프트웨어 엔지니어는 전문가적 역할에서 대중의 안전,건강,복지에 일치되는 방식으로만 행동한다.
2.01.그들이 책임지고 있는 관련 문서나 소프트웨어, 알고 있는 것들과 관련된 사용자나 3자, 환경의 실질적,잠재적 위험에 대해서 적당한 사람이나 권한자에게 알려야 한다.
2.02.안전하고 요구사항을 만족시킨다는 확실한 믿음과 적절한 시험을 통과하고 인생의 질을 감소시키지 않고 환경에 무해한 소프트웨어에 대해서 승인되어야 한다.
2.03. 준비된 문서나 그들이 동의한 기능영역에 대해서 감독 아래 서명을 해야 한다.
2.04.소프트웨어나 관련 문서에 의해 발생된 심각한 대중적 문제에 대해서 설명하는 노력을 위해 협력해야 한다.
2.05.다양성을 고려하여 소프트웨어를 만드는데 노력을 해야 한다. 언어, 다른 능력, 물리적 접근, 정신적 접근, 경제적 이익의 이슈와 자원의 할당이 반드시 고려되어야 한다.
2.06.관련 문서나 소프트웨어를 고려시 (특별히 공공적인 부분에 대해서) 모든 문장에 대해서 공평하고 신뢰성이 있어야 한다.
2.07.자신의 관심, 고용주의 관심, 고객의 관심, 사용자의 관심보다 대중의 관심이 우선이다.
2.08.규범에 맞게 공적 교육을 위한 기회가 생겼을 때 전문가적 기술을 좋은 원인으로 기여해야 한다.
2.09.자신의 일에 대한 모든 책임을 받아들어야 한다.
Principle 3: 판단 (JUDGMENT)
소프트웨어 엔지니어는 가능한 한 2번째 원칙과 일관성 있으며 그들의 전문가적인 판단과 그 판단에 대한 평편 모두 독립적으로 보호해야 한다.
3.01.평가를 요청받은 관련 문서나 소프트웨어에 대해서 전문가적인 목적성을 유지해야 한다.
3.02.준비된 문서와 그들의 맡은 영역에 대해서 감독아래 서명해야 한다.
3.03.뇌물은 거부한다.
3.04.계약에 관련된 모든 관련자의 동의와 지식을 제외하고는 계약에 대해 3자로부터 지불이나 뇌물을 받아서는 안된다.
3.05.환경이 관련 부서에 완전히 밝혀지고 동의된 경우를 제외하고 특별한 프로젝트나 서비스에 대해서 한 부서에서만 지불을 수용해야 한다.
3.06. 해결하거나 피할 수 없는 이해상충에 대해서 모든 관련 부서에 밝힌다.
3.07. 그들의 고용주나 고객이 재무적 관련이 있는 문서나 소프트웨어의 대해 정부/전문가적 결정에 참가하는 것을 거부한다.
3.08. 인간의 가치를 지원하고 유지하는 데 필요하다면 모든 기술적 판단을 완하시킨다.
Principle 4: 고객과 고용주 (CLIENT AND EMPLOYER)
소프트웨어 엔지니어는 대중의 건강,안정, 복지와 일관성 있으며 고객과 고용주의 신뢰와 신념있는 대리자로써 전문가적인 문제로 항상 행동해야 한다.
4.01. 능숙한 분야에 대해서만 서비스를 한다.
4.02. 승인 권한을 가진 사람에 의해 승인된 문서를 확실히 한다.
4.03.고객이나 고용주의 지식과 동의를 가지고 승인된 방식으로 고객과 고용주의 소유물을 이용한다.
4.04.불법적으로 취득이나 보유된 소프트웨어를 고의로 사용하지 않는다.
4.05.공공적이지 않더라도 전문적인 작업에서 얻어진 기밀정보를 지키다.
4.06.그들이 일하거나 알고 있는 소프트웨어나 문서에서의 사회적 문제를 고객이나 고용주가 확인할 수 있도록 하고 문서화하고 알리도록 한다.
4.07. 문제가 될 수 있는 특허,저작권 위반, 실패 위험, 비용 발생에 대해서 고객이나 고용주에게 즉시 알린다.
4.08.그들의 주요 고용주를 위해 수행하는 일에 해로운 행동은 수용하지 않는다.
4.09. 윤리적 문제가 생기지 않는다고 해도 고용주의 특별한 동의가 없이 고용주에 대한 불리한 것들에 대한 관심을 표현하지 않는다. 해당 경우, 고용주나 다른 적당한 권한자가 반드시 엔지니어의 윤리적 우려를 알게 해야 한다.
Principle 5: 관리 (MANAGEMENT)
관리나 리더쉽 능력을 가진 소프트웨어 엔지니어는 윤리적 코드 기반하여 자신과 단체의 의무들을 만족하도록 이끌고 격려해야 하며 올바르게 행동해야 한다. 특별히, 리더쉽 분야에 있는 소프트웨어 엔지니어는 반드시 적절한 역할을 수행해야 한다.
5.01.일이 주어지기 전에 작업자들이 표준을 알도록 한다.
5.02.작업자들이 비밀번호,파일, 기밀정보를 보호하기 위한 정책이나 절차를 알 수 있도록 한다.
5.03..작업 할당시 수행한 작업을 차후 교육과 경험 공헌을 고려한다.
5.04.작업자의 정책이나 코드의 위반에 대한 법적 절차를 제공한다.
5.05.작업자가 수행하는 프로세스,자사,기록이나 지적 재산의 소유권에 대한 정당한 협의를 한다.
5.06.고용자에게 고용의 조건에 대한 전체적이고 정확한 설명을 한다.
5.07.정당하고 합당한 보상을 제공한다.
5.08.부하에게 적합한 좋은 위치를 가지는 것을 방해하지 않는다.
5.09. 이 코드에 맞지 않는 어떤 것도 작업자에게 요구하지 않는다.
Principle 6: PROFESSION (전문적)
소프트웨어 엔지니어는 모든 전문적인 문제들에 있어서 공공의 건강과 안전, 복지를 고려하여 그들의 전문성의 진실성과 평판을 향상하도록 한다.특별히 소프트웨어 엔지니어는 가능한 한 반드시 그렇게 해야한다.
6.01.평판이 좋은 사업과 조직과만 일을 한다.
6.02.고객과 고용주, 감독관이 소프트웨어 엔지니어가 윤리적 코드에 따라 수행하고 그에 대한 책임감을 가지고 있음을 알 수 있도록 한다.
6.03.코드가 요구한 것을 수행하는 사람을 지지한다.
6.04.윤리적으로 행동하는 것에 호의적인 조직적 환경을 구축을 지원한다.
6.05.권한내에서 코드를 위반되었다고 보이는 것에 대해서 보고한다.
6.06.그들이 작업하는 문서와 소프트웨어에서의 에러를 찾고, 고치고, 보고하는 책임감을 가진다.
6.07.전문적인 자격이나 경험에 맞는 보상만 수용한다.
6.08. 현혹하거나, 오해의 소지가 있거나, 의심스러운 요구나 거짓된 요구를 피하기 위해서 작업하는 소프트웨어에 대한 특징을 설명시 정확히 하도록 한다.
6.09.전문적인 비용에 대한 자신의 이익을 높이지 않는다.
6.10.공공의 건강,안전,복지를 지키기 위해서 일에 관련된 모든 법을 준수한다.
6.11.공공적인 일에 대한 지속적인 봉사로 사회에 대한 전문적인 책임을 다한다.
6.12.대중에게 소프트웨어 엔지니어 지식을 함량한다.
6.13.유용한 소프트웨어 관련 지식이나 신제품,전문성을 가진 발견을 공유한다. 예를 들면, 전문가 모임에서 논문을 발표하거나 기술지에 개제를 하며, 전문적인 표준 작업 활동 같은 것들이다.
Principle 7: COLLEAGUES (동료)
소프트웨어 엔지니어는 협업 활동에 적극적이며, 올바르게 작업해야 한다. 특별히, 적절히 대처해야 한다.
7.01.전문적인 개발과정에서 동료들을 지원한다.
7.02.공공의 건강,안전,행복 분야를 모르는 다른 소프트웨어 엔지니어의 작업을 검토한다.
7.03. 다른 사람의 작업을 신임한다.
7.04.객관적이고 솔직하며 올바르게 기술된 방법으로 동료의 작업을 검토한다.
7.05.동료의 불만이나 의견,관심에 대해서 들어준다.
7.06.다른 기밀정보나 비밀번호,파일,보안수단을 보호하는 절차나 정책을 포함하는 현행 표준을 완전히 인지하도록 동료를 돕는다.
7.07.다른 동료의 전문적인 경력발전을 방해하지 않는다.
7.08.자신의 개인 목적을 위해 다른 소프트웨어 엔지니어의 직업적 전망을 훼손시키지 않는다.
7.09.자신의 권한 밖의 상황의 경우 해당 분야 권한을 가진 다른 전문가들에게 의견을 구한다.
Principle 8: 자신(SELF)
소프트웨어 엔지니어는 실천을 통해서 전문가로서의 능력을 높이는 데 노력해야 한다. 특별히, 소프트웨어 엔지니어는 반드시 지속적으로 노력해야 한다.
8.01.개발 과정의 관리와 함께 소프트웨어의 분석,설계,개발,시험과 관련된 문서에 대한 개발에 대한 지식을 늘인다.
8.02.합당한 가격과 시간에서 유용한 질적 소프트웨어와 안전과 유연성을 줄 수 있는 능력을 향상시킨다.
8.03.그들이 작업하는 소프트웨어에 대한 문서를 정확하고, 유용하고, 가독성이 있도록 쓰는 능력을 향상시킨다.
8.04.사용할 환경과 작업에 대한 문서와 소프트웨어에 대한 이해력을 향상시킨다.
8.05.작업하는 문서나 소프트웨어에 대한 법적 지식을 향상시킨다.
8.06.코드에 대한 지식과 설명과 사용에 대한 지식을 향상시킨다.
8.07.코드 문제로 야기되는 문제가 다른 사람에게 영향을 주거나 필요로 하는 것을 억제한다.
8.08.코드에 대한 위반은 전문적인 소프트웨어 엔지니어와 모순됨을 인지한다.
참고문헌
[1] Don Gotterbarn, Keith Miller, and Simon Rogerson :”Software Engineering Code of Ethics, Version 3.0”, IEEE-CS/ACM Joint Task Force on Software Engineering Ethics and Professional Practices ,1997
[2] Mary-Louise G. Piner :” Computer Society and ACM Approve Software Engineering Code of Ethics”, Computer Society Connection ,1999
[3] Don Gotterbarn :” How the New Software Engineering Code of Ethics Affects You”, IEEE Software ,1999
[4] Awais Rashid, John Weckert, Richard Lucas : “SOFTWARE ENGINEERING ETHICS IN A DIGITAL WORLD”, IEEE Computer Society,2009
[5] Simon Rogerson : “The Software Engineering Code of Ethics and Professional Practice: a case for being proactive”, the 26 th Annual International Computer Software and Applications Conference,2002
[6] Duncan Hall : "The Ethical Software Engineer" ,I E E E S of twa r e,2009
[7] Donald Gotterbarn : "Ethical Considerations in Software Engineering", IEEE, 1991
[8] Jeremy T. Lanman,Saveen Reddy :"COLUMNS & REVIEWS / Ethics and Computer Science",Crossroads ,2004