다음을 통해 공유


개발 세부 사항

소프트웨어 개발을 위해 필요한 중요한 작업은 소프트웨어 설계자의 비전을 필요한 결과를 생성하고, 미리 정의된 조건에서 작동하며, 견고하면서 안전하고, 지정된 매개 변수 내에서 수행되고, 이러한 모든 목표를 최적의 효율과 가용한 리소스를 사용하여 달성하는 실제 응용 프로그램 코드로 변환하는 것입니다. 어려운 일처럼 들리지만 소프트웨어 제작 팀에서 최신 소프트웨어 설계 기술, 도구, 개발 환경 및 방법론을 사용하면 논리적이고 체계적으로 이 작업에 접근하여 성공률을 최대화하고 불필요한 노동력 낭비를 최소화할 수 있습니다.

개발 기술

일반적으로 초기 설계의 품질이 떨어지면 좋은 소프트웨어가 나올 수 없습니다. 시중에는 설계자, 디자이너 및 개발자가 사용할 수 있는, 성공적인 설계의 가능성을 높여 훌륭한 소프트웨어를 생산할 수 있는 도구와 기술이 많이 있습니다. 개발자는 설계 사양에 따라야 하지만 그와 함께 가동 시스템과 구성 요소의 상호 작용 방식을 시각화하고, 응용 프로그램이 실행될 하드웨어 및 인프라에 의한 제약을 파악하고, 필요한 절충에 대해 현명한 판단을 내릴 수 있는 역량도 필요합니다.  

이는 단순히 C# 또는 Visual Basic과 같은 프로그래밍 언어의 사용 방법을 아는 것만으로는 부족함을 의미합니다. 최신 프로그래밍 프레임워크와 언어는 런타임 하드웨어의 내재된 복잡성을 상당 부분 숨기는 가상화된 인터페이스를 제공합니다. 그러나 개발자는 여전히 코드가 어떻게 실행되는지, 다양한 프로그래밍 명령이 기반 하드웨어와 어떻게 상호 작용하는지, 그리고 상호 연계해서 작동해야 하는 구성 요소들(많은 경우 원격지에 위치하여 인터넷과 같은 네트워크를 통해 액세스되는) 간의 통신을 어떻게 구현할 것인지를 파악해야 합니다.

좋은 소프트웨어 설계는 보안, 유용성, 테스트 용이성, 유지 관리 용이성, 성능과 같은 일련의 중요한 요소들을 최대화합니다. 개발자는 자신의 설계 구현이 이러한 요소들에 어떤 영향을 미치는지 파악하고, 이러한 각 요소들을 적절히 절충할 때 설계자 또는 소프트웨어 디자이너와 원활하게 협력할 수 있어야 합니다.

프로그래밍 언어

소프트웨어를 작성할 때는 다양한 언어 중에서 선택할 수 있습니다. 특정 응용 프로그램 유형에만 사용되는 언어도 있고 대부분의 응용 프로그램 유형에 사용되는 언어도 있습니다. 혼자 작업할 때는 많은 경우 다양한 응용 프로그램 유형에 대해 자신이 가장 익숙한 언어를 선택하게 됩니다. 팀에서 작업할 경우 언어는 일반적으로 프로젝트 관리자가 지정합니다.

어떤 응용 프로그램은 두 가지 이상의 프로그래밍 언어 또는 기술을 요구합니다. 그 예가 웹 개발입니다. 웹 개발의 경우 페이지를 만들기 위해 웹 서버에서 실행되는 코드는 ASP.NET Web Forms 또는 WebMatrix Web Pages를 사용하고, 페이지 자체에는 상호 작용을 제공하기 위해 사용자 브라우저에서 실행되는 JavaScript 코드가 포함되어 있고, 데이터베이스와 상호 작용하는 백 엔드 코드는 C# 또는 Visual Basic과 같은 .NET Framework 언어로 작성될 수 있습니다.

이는 여러 언어에 능숙해야 하는 경우가 많다는 것을 의미합니다. 대부분의 언어는 소스 코드 명령을 정의하는 데 있어 비슷한 접근 방법을 사용하고, 차이점은 주로 구문에 있기 때문에 여러 언어를 익히기는 일반적으로 어렵지 않습니다. 다만 각 언어의 미묘한 차이점은 잘 파악해야 합니다. 그러나 일반적으로 프로그래밍의 기본을 이해하고 하나의 언어를 익히면 다른 언어도 훨씬 더 쉽게 익힐 수 있게 됩니다.

오늘날의 응용 프로그램 대부분은 개체 지향 및 이벤트 기반 프로그래밍 언어를 사용하여 작성됩니다. 이러한 프로그래밍 언어 유형은 루프 및 결정문과 같은 코드 명령과 구문을 사용하여 일련의 작업을 실행합니다. 이러한 언어에는 기본 코드의 많은 부분에서 반복적으로 호출되는 프로시저 및 함수가 포함되어 있습니다. 개체는 코드 내에서 정의되며 코드로 조작해야 하는 고객, 주문, 계정과 같은 실제 세계의 항목들을 나타냅니다.

이러한 개체에는 개체에 포함된 데이터를 노출시키는 속성과 데이터를 조작하기 위해 실행할 수 있는 메서드가 있습니다. 개체는 어떤 작업이 발생하면 이벤트를 일으키며, 코드는 필요에 따라 이러한 이벤트를 처리합니다. Microsoft 플랫폼에서 사용되는 일반적인 개체 지향 및 이벤트 기반 프로그래밍 언어는 C#, Visual Basic, C++, F# 및 JavaScript입니다.

프레임워크, 코드 라이브러리 및 패턴

오늘날 필요한 갈수록 복잡해지는 응용 프로그램의 개발 작업을 간소화하는 데 있어 한 가지 핵심적인 요소는 프레임워크, 코드 라이브러리 및 패턴의 사용입니다. 대부분의 사람들은 똑같은 코드를 계속 반복해서 작성하는 것을 좋아하지 않으며(시간과 노동을 낭비하는 반복적인 작업), 현재 만들고 있는 응용 프로그램의 요구 사항과 직접적으로 관련된 개발 프로세스 부분에 집중하는 편을 선호합니다. 이렇게 시간, 비용 및 작업을 최소화하기 위한 한 가지 방법은 미리 정의된 특정 작업을 수행하는 기존 코드를 다시 사용하는 것입니다.

다시 사용할 수 있는 코드는 다양한 형태로 제공됩니다. 개발 팀은 많은 경우 두 개 이상의 구성 요소와 응용 프로그램에서 사용하는 함수 및 프로시저의 라이브러리를 만듭니다. 대표적인 예는 로깅을 구현하고 예외를 처리하고 데이터를 캐시하고 데이터베이스에 액세스하는 기능입니다. 이러한 작업과 다른 광범위한 작업을 수행하는 프레임워크 및 코드 라이브러리를 얻거나 구매할 수도 있습니다. 이미 안정적인 동작에 대한 테스트와 검증을 거친 코드를 다시 사용하면 소프트웨어를 제작할 때 드는 작업을 크게 줄일 수 있습니다. 개발자에게 필요한 기술은 어느 프레임워크가 적합한지, 이러한 프레임워크를 언제, 어떻게 성공적으로 적용할지 파악하는 것입니다.

다시 사용할 수 있는 미리 만들어진 프레임워크나 라이브러리가 없는 경우 개발 팀은 필요한 코드를 직접 작성해야 합니다. 또한 개발 팀은 구성 요소를 연결하고 프레임워크와 코드 라이브러리에서 함수를 호출하는 “연결” 코드도 작성해야 합니다. 이 부분에서 프로그래밍 언어에 대한 깊은 지식이 필요합니다. 실제 코드가 없더라도 다른 사람들의 작업 결과를 이용할 수 있는 방법이 있습니다. 바로 응용 프로그램 소프트웨어 패턴입니다.

패턴은 오랜 시간에 걸쳐 소프트웨어 개발의 일반적인 문제를 해결하면서 획득한 지식과 경험을 공식화하기 위해 고안된 개념입니다. 많은 경우 코드 솔루션이 필요한 시나리오는 이미 다른 개발자들에 의해 연구가 되었으며, 분야 전문가의 검토와 경험을 기반으로 최적의 솔루션이 발전했습니다. 이러한 시나리오는 소프트웨어 설계 패턴으로 문서화되어 있으며 어느 한 코드 언어에 국한되지 않는 포괄적인 솔루션 정의를 포함하고 있습니다. 그러나 이를 통해 문제 해결을 위한 검증된 기법을 제공하므로 개발자가 할 일은 관련된 패턴을 파악하고 패턴에서 설명한 포괄적 솔루션을 기반으로 하되 자신의 응용 프로그램에 맞는 코드를 작성하는 것입니다. 이는 각 시나리오에서 발생하는 일반적인 실수를 피하고 오류를 최소화하는 데 도움이 됩니다.

프로그래밍 기법과 방법론

풍부한 경험을 가진 사람도 코드를 작성할 때 실수를 저지릅니다. 복잡한 응용 프로그램에는 많은 수의 변수가 포함되며 겉보기에 올바른 것처럼 보이는 코드도 코드를 작성한 시점에 명확하게 드러나지 않은 상황에 직면하면 예기치 못하게 동작할 수 있습니다. 오랜 시간에 걸쳐 오류를 최소화하기 위한 기법과 방법론이 발전하여 공식화되었습니다. 팀에 소속되지 않고 혼자서 일하는 경우라도 이러한 기법과 방법론을 익혀야 합니다.

현재 사용되는 주 방법론 중 하나는 TDD(Test Driven Design)입니다. 이 방법론은 실제 코드를 작성하기 전에 개발자가 코드의 요구 사항에 대해 생각하고 필요한 결과를 공식화하는 것을 목표로 합니다. 이 프로세스에서는 일련의 단위 테스트를 만듭니다. 각 단위 테스트는 현재 만들고 있는 코드 섹션의 설계에서 특정 함수를 실행합니다. 예를 들어 고객의 계정에 입금하는 코드라면 테스트에서는 입금 금액과 현재 잔고를 취하여 이를 현재 작성 중인 코드의 함수로 전달한 다음 잔고를 확인하여 결과가 올바른지 확인합니다.

가장 먼저 단위 테스트가 작성되고, 그 다음에는 응용 프로그램에 필요한 기능을 구현하는 코드가 만들어집니다. 그런 다음 테스트 프레임워크(또는 테스트 도구)를 사용하여 모든 단위 테스트를 실행하고 모든 어설션의 결과를 표시하여 이 코드를 확인할 수 있습니다. 코드를 작성하고 지속적으로 수정 및 개선해 나가면서 테스트를 다시 실행하여 결과가 여전히 유효한지 확인할 수 있습니다.

물론 단위 테스트는 실제 데이터로 작업할 수 없고, 아직 작성 중인 응용 프로그램의 다른 부분들에는 액세스하지 못할 수도 있습니다. 대신 개발자는 실제 요소를 반영하지만 개발 시스템에서 로컬로 실행되는 모의 구성 요소를 만들 수 있습니다. 이렇게 하면 테스트가 현재 만들고 있는 코드만 실행하도록 하고 다른 외부 요소가 결과에 영향을 미치지 않도록 할 수 있습니다.

TDD는 다른 프로그래밍 방법론과 결합되는 경우가 많습니다. 예를 들어 짝 프로그래밍(Pair Programming)은 코드의 유효성을 검사하고 오류를 최소화하는 데 일반적으로 사용됩니다. 두 명의 개발자가 하나의 컴퓨터에서 차례로 코드를 작성하고 단위 테스트를 실행합니다. 함께 작업하는 두 개발자는 각자의 경험과 지식을 공유 및 결합하고, 상대 개발자가 작성하는 코드를 비판적으로 분석합니다. 이러한 두 개발자의 부가적인 참여와 경쟁이 더 나은 코드로 이어질 수 있습니다.

테스트, 스테이징 및 배포

많은 경우 개발 중 만들어진 코드는 전체 응용 프로그램 또는 시스템의 일부분에 불과하며 정기적인 간격으로 전체 응용 프로그램 또는 시스템과 통합하여 각 구성 요소 또는 코드의 각 섹션 간 상호 작용에 문제가 없는지 확인해야 합니다. 일반적인 접근 방식은 완성된 응용 프로그램 또는 시스템 빌드가 시작되는 정기적인 간격마다 코드를 체크 인하는 것입니다. 이렇게 하면 컴파일 또는 테스트 중에 충돌이 드러나고, 이러한 충돌은 다음 통합 빌드 전에 해결해야 합니다.

완성된 응용 프로그램이 빌드되고 테스트 주기를 통과하면 최종 승인 테스트를 위해 스테이징 서버 또는 컴퓨터로 옮길 수 있습니다. 개발 컴퓨터 및 빌드 서버와 달리 스테이징 서버는 최종 런타임 환경의 복제본이므로 프로덕션 상태와 동일한 조건에서 소프트웨어를 테스트할 수 있습니다. 여기서도 개발 팀은 스테이징된 승인 테스트 주기 동안 발생하는 모든 문제를 해결해야 합니다.

응용 프로그램에는 일반적으로 스테이징 및 최종 프로덕션 시스템에 배포하기 위한 일종의 설치 프로그램이 필요합니다. 개발 팀은 응용 프로그램의 구성 요소를 설치하는 필수 설치 프로그램을 만들고 이러한 프로그램 및 런타임 환경을 구성하고 시스템을 필요에 맞게 준비해야 합니다. 특히 다른 응용 프로그램들이 이미 있는 광범위한 기반 하드웨어의 다양한 런타임 플랫폼에 설치될 압축 포장 소프트웨어의 경우 이 작업이 복잡해집니다.

프로젝트 팀에서 작업

프로젝트 팀 내에서 작업할 경우 많은 것을 얻을 수 있지만 최선의 결과를 얻기 위해서는 추가적인 기술이 필요합니다. 팀에서 작업할 경우 개발자는 다른 사람들과 원활하게 의사 소통하고 상호 작용할 수 있어야 합니다. 여기에는 관리자, 설계자 및 디자이너, 테스트 팀, 문서 팀 등이 포함됩니다.

프로젝트 관리 스타일에 따라 개발자에게 요구되는 역량도 달라집니다. 어떤 프로젝트는 다음 작업을 시작하기 전에 각 작업을 구획화하여 완료하는 전통적인 "폭포수" 방식에 따라 진행됩니다. 그러나 더 활발한 상호 작용을 기반으로 실행되는 프로젝트가 증가하고 있습니다. 이러한 방식이 많은 응용 프로그램 개발 시나리오에서 유리한 것으로 입증되었습니다.

예를 들어 민첩한(Agile) 방법론을 사용하는 프로젝트가 있습니다. 이 방식에서는 짧은 개발 반복, 일별 기립 회의, 주별 검토 및 반복 계획 회의를 사용하여 프로젝트를 진행합니다. 민첩한 개발은 개발 중 정기적인 소프트웨어 릴리스와 지속적인 피드백을 통한 고객 및 외부 관계자의 의견 반영을 강조합니다. 일반적으로 작업 항목이 포함된 리포지토리를 사용하여 프로젝트를 추적하지만 프로젝트를 진행하기 위해 필요한 부분을 제외하면 중요한 선행 설계는 없습니다.       

또 다른 일반적인 접근 방식은 XP(Extreme Programming)입니다. XP에서는 가장 중요한 요구 사항의 우선 구현, 지속적인 의사 소통과 테스트, 개발 중 정기적인 소프트웨어 전달을 기반으로 소프트웨어 개발이 이루어집니다. 민첩한 개발과 XP 모두 선행 설계보다는 작동하는 소프트웨어를 만드는 것을 강조하며, 불필요한 기능 개발보다는 기대 수준을 충족하는 결과를 달성하는 데 집중합니다. 따라서 팀 구성원들은 생산성을 높이고 관리 및 통제 가능한 방식에 따라 효율적으로 작업하여 주별 작업을 완수해야 하며, 프로세스에 관여하는 다른 모든 사람들과 원활하게 의사 소통해야 합니다.

현대의 소프트웨어 개발 팀에게는 작업자 간 의사 소통이 가장 중요한 요소이며 팀이 같은 건물, 같은 팀 사무실 내에서 함께 작업하는 경우 가장 쉽게, 가장 생산적으로 일할 수 있습니다. 그러나 지리적으로 분산된 팀들도 각 개인이 다른 팀 구성원과의 의사 소통을 잘 관리할 경우 원활하게 운영됩니다. 회의는 전화와 화성 회의 소프트웨어를 사용하여 진행되며 정보 리포지토리는 인터넷을 통해 사용할 수 있고, 팀 구성원들은 일별 및 주별 회의에 맞춰진 세밀한 일정에 따릅니다. 이를 위해서는 개인이 시간대의 제약에 적응하고 다른 국가의 팀 구성원들과 효율적으로 상호 작용해야 하며, 팀의 모든 구성원들이 각자의 역할을 쉽게 수행할 수 있도록 통신 시스템을 활용해야 합니다.

학습과 경험

IT 분야처럼 기술, 방법 및 작업 환경이 빠르게 변화하는 업계는 거의 없습니다. 중요한 건설 및 기계 공학 프로젝트는 몇 년에 걸쳐 진행되는 경우가 흔하지만 초대형 소프트웨어 응용 프로그램이라도 설계-개발-배포에 이르는 전체 수명 주기는 1년이 채 되지 않고 그보다 훨씬 더 짧은 경우도 많습니다. 이와 동시에 사용되는 도구, 프레임워크, 인프라, 기술도 급속도로, 경우에 따라 매년 바뀝니다.

이는 개발자가 시간을 투자해 새 기술, 프로그래밍 언어 및 기타 기술적 진보를 익힘으로써 변화에 보조를 맞추어야 한다는 것을 의미합니다. 또한 변화하는 IT 환경의 추세를 파악하고, 이러한 변화가 현재 개발 중인 소프트웨어에 미치는 영향을 고려하고, 새로운 기능을 최대한 사용하도록 자신의 프로그래밍 역량을 다듬어야 한다는 것을 의미합니다.

개발자의 모든 기술 중에서 성공에 가장 큰 영향을 미치는 것은 경험이며, 이는 오랜 시간을 거쳐야만 얻을 수 있습니다. 팀에 속해서 일하고 다른 개발자와 상호 작용하고 기술을 최신 상태로 유지하는 것이 기본적인 요건입니다. 여기에 논리적인 사고, 창조적인 능력과 완벽함에 대한 열정이 결합되면 소프트웨어 개발자에게 이상적인 기술 집합이 완성됩니다.