2020년 7월 29일 수요일

비대면 소프트웨어 개발을 위한 핵심 시스템 10가지

비대면으로 소프트웨어를 잘 개발하는 방법은 비대면이 아니라도 일반적으로 소프트웨어를 잘 개발하는 방법과 다르지 않다. 그래서 비대면으로 소프트웨어를 잘 개발하는 방법을 도입하는 것은 의미가 있다.

비대면으로 소프트웨어를 효과적으로 개발하기 위해서는 필수적으로 도입해야 하는 툴, 시스템이 있다. 이 툴 중 대부분은 비단 소프트웨어 개발 뿐만 아니라 회사의 일반 업무에도 필요한 시스템이다. 소프트웨어 회사가 아니라도 관심을 가지고 보자. 툴과 시스템을 도입하는 것은 회사의 문화, 인식, 프로세스를 바꾸는 것보다는 쉽다.

좋은 툴, 시스템을 도입해야 개발 및 업무 효율성이 배가 된다. 툴, 시스템은 오랫동안 진화를 해왔고, 지금도 진화하고 있다. 이것들을 잘 선택하는 것도 실력이다. 워낙 많은 툴, 시스템을 도입해야 하기 때문에 선택도 쉽지는 않다. 그렇다고 잘 도입해서 사용하고 있는 한 회사의 사례를 그대로 따라하는 것도 좋은 것은 아니다. 회사마다 프로젝트의 성격, 규모, 문화, 환경이 다르기 때문이다.

꼭 비싼 툴을 도입하는 것이 좋은 것은 아니다. 그렇다고 무료 툴이 무조건 좋은 것도 아니다. 비싼 툴은 비싼 값을 하지만 기능이 너무 많거나 복잡해서 회사에 따라서는 오히려 과한 경우도 있다. 회사의 규모, 문화, 프로세스에 따라서 적합한 툴의 조합을 잘 선택해야 한다.

툴, 시스템을 도입하는 것은 쉽지만 잘 쓰는 것은 어렵다. 도입만 하고 안쓰거나 형식적으로 쓰는 경우도 많다. 툴만 도입하고 프로세스와 연계를 안하거나 회사의 상황에 너무 과한 툴, 시스템을 도입한 경우에도 정착에 실패할 수 있다.

회사의 기존 프로세스를 잘 적용할 수 있는 시스템을 선택하기 보다는 툴, 시스템의 철학에 맞게 회사의 프로세스와 업무 방식을 바꾸는게 낫다. 업무 방식은 좀더 자율적이고 능동적이어야 하며 수평적으로 바뀌어야 한다. 그래야 비대면 업무가 효율적으로 진행될 뿐만 아니라 생산성도 증가한다.

각 툴, 시스템들은 서로 연결이 되어서 유기적으로 작동한다. 한 회사에서 개발한 여러 툴 세트를 쓰면 연동이 잘 되기는 하지만 그렇다고 한 회사의 툴을 쓰는 것이 무조건 좋은 선택은 아니다. 회사의 프로세스와 잘 엮어서 여러 회사의 툴을 섞어 사용하기도 한다.

그럼 비대면 소프트웨어 개발을 위해서 꼭 도입해야 할 시스템을 알아보자.

1. 문서 공유 시스템


문서들이 직원들의 각자 PC에서 생산되고 이메일을 통해서 돌아다닌다면 보통 혼란스러운 것이 아니다. 문서의 버전을 관리하기도 어렵고, 보관도 어렵다. 문서 공유 시스템을 도입하면 문서의 버전을 철저히 관리하고 적절한 공유, 권한 제어, 외부 전달, 백업이 가능하다. 비용이 들기는 하지만 비용 이상의 생산성 향상을 줄 수 있는 시스템이다.

가장 마음이 드는 기능 중 하나는 검색 기능이다. 시스템마다 차이는 있지만 회사의 수만 개의 문서 중에서 내가 찾는 문서를 간단한 검색을 통해서 몇 초 만에 찾아준다. 문서의 본문까지 모두 찾아주는 시스템도 있으니 매우 편리하다.

몇몇 문서 공유시스템은 PC의 파일 탐색기와 연동하여 편리하게 사용할 수 있도록 해준다.

회사의 문서를 외부 공간인 클라우드에 저장하는 것에 보안 상 우려를 하는 기업도 있지만, 회사 내부에서 여기저기 문서가 굴러다니는 것보다 더 안전할 수 있다.

대표적인 시스템으로는 Dropbox, Apple iCloud, Google Drive, MS Sharepoint, Amazon WorkDocs 등이 있다.

국내 기업으로는 사이버다임사의 문서관리시스템이 있다.

2. 문서 공동 작업/리뷰 시스템


문서 공유 시스템과 접목하여 문서를 공동 작업 및 리뷰할 수 있도록 하는 시스템이다. 여러 사람이 동시에 문서를 작업해도 충돌 없이 같이 작업할 수 있다. 완벽한 문서 공동 작업 솔루션이 나온 것은 그렇게 오래되지 않았다. 불과 수년 전만 해도 상상하기 어려웠던 기능인데, 이제는 일반화 되었다.

문서를 리뷰할 수 있는 기능도 제공한다. 문서 리뷰를 실시하면 여러 관련자가 문서의 곳곳에 자신의 의견을 댓글로 남기면서 토론을 할 수 있다. 그 결과를 문서에 반영하고 다시 리뷰를 진행하는 사이클로 진행된다. 이렇게 문서 온라인 리뷰를 진행하면 관련된 모든 사람의 의견을 꼼꼼히 문서에 반영할 수 있다. 이런 시스템 없이 오프라인으로 문서를 리뷰하고 반영하는 것은 보통 어려운 일이 아니다. 오프라인으로 문서를 작성한 것보다 훨씬 완성도 높은 문서를 작성할 수 있다.

이렇게 문서를 온라인으로 보관하고 공동 작업하고 리뷰하는 프로세스를 적용하고 적응해 나가면 어느덧 비대면 업무 방식에 익숙해져 간다.

대표적인 시스템으로는 MS Office 365, Google Docs, Apple iWork 등이 있다.

3. 요구사항 관리 시스템


소프트웨어를 개발하는데 있어서 가장 중요한 것 하나를 꼽으라면 요구사항을 분석해서 스펙을 작성하는 일이다. 스펙을 문서화 하기 위해서 MS Word로 작성하기도 하고, GoogleDocs, Wiki를 이용하기도 하지만, 전문적인 관리시스템을 사용하기도 한다.

MS Office와 같은 문서 위주의 편집 툴을 사용하여도 소프트웨어 요구사항을 충분히 분석하고, 협업하고, 리뷰할 수 있지만, 전문적인 요구사항 관리 시스템은 조금 더 많은 기능을 제공한다.

요구사항을 수집, 관리, 협업, 리뷰, 버전 관리, 요구사항 추적, 재활용 등에서 좀더 많은 기능 및 편리함을 제공한다. 요구사항 분석 역량을 충분히 갖춘 회사라면 한번 도입해 볼만하다.

대표적인 시스템으로는 Jama, Orcanos, DOORS, ReqSuite, Accompa 등이 있다.

4. 이슈 관리 시스템


이슈 관리 시스템은 소프트웨어 회사만 필요한 시스템이 아니다. 이슈 관리 시스템은 버그 관리 시스템에서 출발하여 점차 진화를 거듭하여 회사의 모든 이슈를 관리하는 시스템으로 성장하였다. 이제는 거의 모든 형태의 회사에 필요한 시스템이 되었다.

이슈 관리 시스템은 단순히 설치해서 사용하는 것 만으로는 그 혜택을 다 볼 수 없다. 회사의 업무 철학과 방식이 바뀌어야 한다. 업무 방식을 지시와 보고 형태에서 자발적 업무와 모니터링 형태로 바뀌어야 한다. 일일이 업무를 지시하고 추후 결과 보고를 받는 형태로 업무를 계속 하면서 그 프로세스를 이슈 관리 시스템에 적용하면 비대면 프로세스로 전환하기도 어렵고, 이슈관리시스템의 철학과는 좀 멀어지고 업무 효율성도 떨어진다.

이슈 관리 시스템이 완전히 정착되면 모든 업무가 투명하게 진행되는 효과가 있다. 투명한 업무 진행을 꺼려하는 조직도 있지만, 적응하고 나면 업무 생상선이 대폭 증가하는 것을 경험할 수 있다.

이슈 관리 시스템을 도입하여 효과를 최대로 보고 비대면 업무를 효율적으로 진행하려면 업무 방식을 바꾸는 것에 많은 노력을 들여야 한다는 것을 명심하자.

대표적인 시스템으로는 Jira, Redmine, Mantis, Bugzilla, Trello 등이 있다.

Jira는 상용 소프트웨어지만 현재 10유저까지는 무료로 제공하고 있어서 스타트업에서 매우 유용하게 쓸 수 있다.

5. 소스코드 관리 시스템


소스코드 관리 시스템을 사용하지 않는 소프트웨어 회사는 거의 없을 것이다. 만약에 특별한 이유로 소스코드 관리 시스템을 사용하고 있지 않다면 꼭 도입을 해야 한다. 특별한 이유라는 것도 소스코드 관리 시스템을 사용하지 못하는 결정적인 이유는 아닐 것이다.

소스코드 관리 시스템은 도입은 쉽지만 제대로 쓰는 것이 만만치는 않다. 브랜치, 머지, 베이스라인, 체크인에 대한 여러가지 규칙을 잘 만들고 지켜야 한다.

소스코드 관리 시스템은 중앙 집중형과 분산형이 있으니 회사의 상황에 맞게 선태하면 된다.

대표적인 시스템으로는 Subversion, Git, Murcurial, Perforce 등이 있다.

설치형, 클라우드 형이 있으며, 클라우드 형으로는 Github, Gitlab, Bitbucket 서비스 등이 있다. 각자 유/무료 정책이 있으니 비교하여 선택하면 된다.

6. CI(지속적인 통합) 시스템


개발자들이 서로 떨어진 장소에서 얼굴 안보고 실시간으로 협업을 하기 위해서는 소스코드가 항상 빌드가 가능한 상태로 유지가 되어야 한다. 소스코드는 매시간, 매분 새로 업데이트가 된다. 그런데, 한 개발자가 빌드가 안되는 상태의 소스코드를 등록하면 개발팀 전체가 개발에 차질이 생긴다. 개발자는 항상 빌드 가능한 소스코드를 등록해야 하며 이 규칙은 매우 엄격하다.

CI(지속적인 통합) 시스템을 이용하면 소스코드를 등록할 때마다 소스코드를 점검하고, 빌드 가능한 상태를 유지하도록 도와준다. 이때 회사의 코딩 규칙 검사, 자동 테스트 등을 수행하며 소스코드의 버그를 줄여주기도 한다.

CI 시스템이 잘 구축되어 있으면 개발자는 자신이 담당한 모듈을 코딩해서 소스코드 관리시스템에 등록하기만 하면 된다. 나머지는 시스템이 알아서 해준다.

대표적인 시스템으로는 Jenkins, Bamboo, Cirble CI, GitLab CI 등이 있다.

7. 코드 리뷰 시스템


코드 리뷰는 온라인, 오프라인으로 진행하며 여러가지 방법이 있지만, 비대면 개발을 위해서는 코드 리뷰 시스템이 필수다. 모여서 코드 리뷰를 할 필요가 없고, 온라인 코드 리뷰 시스템에 코드 리뷰를 등록하면 관련된 수많은 사람이 온라인으로 코드 리뷰를 진행한다. 온라인 코드 리뷰는 오프라인보다 훨씬 많은 사람이 참여할 수 있고, 시간을 많이 절약해준다. 그래서 코드 리뷰를 좀더 활성화하는데 도움을 준다.

회사의 프로세스마다 다른데, 소스코드를 등록한 후에 코드 리뷰를 하기도 하고, 코드 리뷰를 통과한 소스코드만 회사의 메인 소스코드 저장소에 등록하도록 하기도 한다.

코드 리뷰가 활성화 된 회사일수록 개발자가 더 잘 성장한다. 그리고 고참 개발자가 될수록 코드 리뷰에 더 많은 시간을 할애해야 한다. 고참 개발자는 코드 리뷰를 통해서 후배를 양성하기도 하지만, 본인이 성장하는 수단이 되기도 한다.

많은 회사들이 코드 리뷰 도입에 실패하지만, 좋은 온라인 코드 리뷰 시스템을 도입하면 코드 리뷰 정착에 도움이 된다.

대표적인 시스템으로는 Gerrit, Crucible, GitHub, GitLab, Review Board 등이 있다.

8. 지식 공유 시스템


소프트웨어 회사만 필요한 시스템은 아니다. 회사에서 업무를 하다 보면 공유할 수많은 정보, 지식이 생성된다. 지식 공유 시스템이 없다면 이런 정보는 연기처럼 사라지거나 개인의 저장소에 묵히게 된다.
정보를 생산할 때 실시간으로 정보를 정리하여 공유할 시스템이 필요하다. 그래서 지식 공유 시스템은 비대면 개발의 핵심이다.

회사, 제품, 프로젝트, 프로세스 등 여러가지 분야로 잘 나뉘어서 정리된 지식과 정보는 이 사람 저 사람 찾아다니면서 물어보지 않아도 업무를 할 수 있게 해준다. 원격으로 접속 가능한 시스템이므로 지역적인 제약없이 일할 수 있다.

대표적인 지식 공유 시스템은 Wiki와 KMS다. Wiki의 용도는 매우 다양하다. 이를 회의록으로 사용하는 경우도 많고 회의록 기능을 강화한 Wiki 시스템도 있다.

설치형, 클라우드형이 있다. 장단점이 있으니 상황에 맞게 선택해야 한다.

대표적인 Wiki 시스템으로는 Confluence(10유저 무료), Bookstack(무료), Wiki.js(무료) 등이 있다.
KMS는 국내업체인 사이버다임날리지큐브가 제공하고 있다.

9. 화상 회의 시스템


비대면 개발을 하더라도 얼굴을 보고 회의를 해야 할 때도 있다. 재택 근무가 완벽하게 진행되어 모든 업무를 문서와 시스템으로 진행한다고 하더라도, 정서상의 이유와 팀워크 유지를 위해서 얼굴을 보고 얘기를 할 필요도 있다. 또 온라인으로, 문서로 쉽게 답이 안나오는 이슈는 얼굴 보고 논의하는 것이 훨씬 효율적이다. 이럴 때는 웹캠을 이용해서 화상 회의를 실시하는 것이 좋다.

화상 회의는 주기적인 프로젝트 회의로 진행하기도 하고, 이슈가 있을 때 비정기적으로 실시하기도 한다.

회상 회의는 1:1 뿐만 아니라 여러 명이 동시에 회의를 할 수도 있다. 여러 명이 원활히 화상 회의를 하기 위해서는 빠른 인터넷도 필수다. 화상 회의는 일반 회의와 마찬가지로 용건만 짧게 빠르게 진행해야 한다.

화상 회의 시스템은 부가 기능으로 녹화, 화면 공유, 화이트 보드, 그룹 스케줄러 기능을 제공하기도 한다.

대표적인 시스템으로는 Teams, Skype Business, Google Meet(hangout), Zoom 등이 있다.

10. 협업 시스템


협업을 위한 여러가지 기능을 한꺼번에 넣어 놓은 종합 선물세트다. 소프트웨어 회사 뿐만 아니라 모든 형태의 회사에 비대면 업무를 효율적으로 진행하기 위해서 필요한 시스템이다.

기본적으로 팀 관리, 채팅, 파일관리 등이 기본 기능이지만 화상 회의, Wiki 등 위에서 언급한 여러가지 툴 중 일부를 포함하고 있는 경우도 많다.

비대면 업무 필요성이 증가할수록 도입하는 기업이 늘 것으로 생각된다.

대표적인 시스템으로는 Teams, Slack, Swit, 잔디, 라인웍스 등이 있다.

이상 10가지의 시스템을 알아봤는데, 이런 시스템을 모두 사용한다고 완벽하게 비대면으로 소프트웨어를 개발할 수 있는 것은 아니다. 또한 모두 비대면으로 소프트웨어를 개발해야 더 생산성이 높은 것은 아니다. 시스템을 잘 활용하여 개발과 업무를 진행하면 비대면 비율이 높아질 수 있다. 그 자체가 개발 및 업무 생산성이 높아지는 것과 일맥상통한다.

이 글은 ZDNet Korea에 기고한 칼럼입니다.

2020년 7월 10일 금요일

코로나19 시대에 비대면 소프트웨어 개발이 필수

코로나19가 우리의 일상을 바꾸고 일하는 방식도 변화 시키고 있다. 그러면서 여러 분야에서 직접 만나지 않고 일을 하는 비대면 방식으로의 업무 방식을 도입할 수 밖에서 없게 되었다.

이러한 비대면으로 일하는 방식은 소프트웨어 개발에 있어서 긍정적인 측면이 있다. 비대면 방식의 개발이 글로벌 수준의 소프트웨어 개발 방식과 일맥상통한다. 또한 비대면 방식은 소프트웨어 개발 비용의 감소와 효율적인 개발과도 맞닿아 있다. 그동안은 이런 비대면 방식의 개발이 많은 기업에서 도입이 어려웠다. 그동안 해오던 방식을 바꾸기 쉽지 않는 것이 한 이유인데, 이제는 필수적으로 비대면 방식을 도입해야 한다. 따라서 비대면 방식이 소프트웨어 개발에 어떠한 영향이 있는지 짚어보고자 한다.

그럼 소프트웨어를 비대면 방식으로 개발해야 하는 가장 큰 이유는 무엇일까?

개발 비용이 적게 들기 때문이다.


가장 큰 이유는 개발 비용이 적게 들기 때문이다. 믿기 어렵겠지만, 사실이다. 프로젝트가 점점 커지고, 복잡해지고, 유지보수까지 감안하면 그 비용의 차이는 점점 커진다. 

좀더 나아가 비대면 개발 방식을 재택 근무까지 확장하면 회사 입장에서는 거주지에 상관없이 개발자를 채용하는 이득이 있고, 꼭 하루 8시간 일하는 개발자를 채용할 필요도 없고, 개발자 채용이 훨씬 유연해진다. 또한 사무실 임대비용도 감소하여 많은 장점이 생긴다.

직원 입장에서도 개발 외의 시간을 덜 뺏기게 되어 업무 집중도가 높아지고, 감정 소모가 감소하는 장점이 있다. 전체적으로 개발 생산성도 향상된다. 하루 4시간 밖에 일하지 못하는 개발자에게도 취업의 기회가 생기고, 생활의 질도 올라갈 것이다. 

사회적으로는 회사들이 몰려있는 수도권의 집값도 떨어지는 효과도 생길 것이다. 회사, 직원, 사회 모두가 이익이 된다.

문제는 얼굴을 보지 않고 일을 할 수 있냐는 것이다. 게다가 일을 열심히 하고 있는지 믿을 수 있냐는 것이다.

이제부터 사례를 비교해보고 어떻게 해야 비대면 방식으로 소프트웨어를 개발할 수 있는지 알아보자.

먼저, 미국의 경우를 보자.

미국에서는 이미 약 20%의 개발자는 재택근무를 하고 있다.


미국에서는 이미 약 20%의 개발자는 재택근무를 하고 있다. 대부분의 회사에서 개발자로 입사를 하면 재택근무를 선택할 수 있는 옵션이 있다. 코로나19 이후 재택근무는 훨씬 더 증가하고 있다. 즉, 미국에서는 이미 비대면으로 개발하는 방식에 익숙해져 있고, 비대면 개발에 별 문제가 없다.

미국에는 비정규직 포함 1200명의 직원이 모두 재택근무를 하고 있는 소프트웨어 회사가 있다. 바로 GitLab이다. GitLab의 모든 프로세스는 온라인으로 진행할 수 있도록 되어 있고, 문서를 통해서 개발이 이루어진다. GitLab은 급속도로 성장하고 있다.

Facebook은 개발자가 입사한 첫날 버그를 고친다. 이렇게 고친 버그는 전세계 서비스 된다. 개발자가 입사를 하면 버그관리시스템에서 버그를 할당해주고, 개발자는 온라인으로 주어진 정보를 바탕으로 소스코드를 내려 받고, 수정 후, 온라인으로 코드리뷰를 받고 소스코드를 등록한다. 한 사무실에 있는 동료들의 얼굴을 볼 수 있지만, 얼굴을 보지 않아도 일하는 방식은 똑같다.

최근 실리콘밸리의 소프트웨어 회사들은 대대적인 재택근무를 선언하고 있다. Facebook은 향후 5~10년에 걸쳐 직원 절반이 영원히 원격근무를 할 것이라고 한다. 이로 인해서 실리콘밸리 집값도 떨어지고 있다고 한다.

하지만 국내의 회사들은 전면적인 재택근무는 엄두를 내지 못하고 있다. 특정 직군만 재택근무를 시행하거나 일주일에 며칠만 재택근무를 시도하곤 한다. 아예 비대면으로는 일을 하기 어려운 상황이다.

그럼 우리나라 회사의 사례를 살펴보자.

스펙 문서를 보고 개발자가 개발을 못한다.


A사는 공공 프로젝트를 위주로 사업하던 회사다. 공공 프로젝트에서 업무를 분석하는 것은 가장 중요한 일이다. 그래서 업무 분석가가 핵심이다. 업무 분석가가 소프트웨어 스펙을 작성해서 개발자에게 넘겨주면 문서를 보고 개발하는 것이 목표였지만, 실제는 업무 분석가가 개발 기간 내내 옆에서 기능을 설명해줘야 했다. 업무 분석가는 프로젝트가 끝날 때까지 프로젝트에 묶여서 다른 프로젝트를 수행할 수가 없다. 회사 입장에는 수주할 수 있는 프로젝트가 줄어 들기 때문에 손해가 아닐 수 없었다. 하지만, 몇 년을 노력해도 스펙 문서를 전달해서 개발자들이 스펙 문서를 보고 개발한다는 목표는 달성하지 못했다.

B사는 신입 개발자가 입사를 하면 사수를 정해주고 이거 저거 가르쳐줘야 하는 것이 많다. 신입개발자는 최소 한달은 되어서 실제 개발에 투입이 될 수 있다. 사수인 고참 개발자도 시간을 많이 빼앗기고, 신입개발자도 월급 값을 하려면 시간이 오래 걸린다. 개발자가 입사할 때마다 이런 일은 반복된다. 신입 개발자에게 문서를 전달해주고 알아서 개발을 하게 하고 싶지만, 고참 개발자는 이를 위해서 문서를 따로 만들 시간이 없다.

왜 대면 개발이 문제인가? 대면으로 밖에 개발을 못하면 진짜 문제인가?

대면 위주로 개발하면 초기에는 뭔가 더 효율적인 것 같지만, 효율은 점점 떨어진다. 시간이 흐를수록 더 많은 개발자가 필요하고 초기 개발자가 유지보수에 더 매달려야 하고, 업그레이드 할수록 개발 비용이 증가한다. 

비대면 개발은 시스템, 문서 위주로 개발이 진행되기 때문에 자연스럽게 기록이 남고 혼선이 줄어들며 유지보수 준비가 된다. 

위기가 곧 기회


일본의 수출규제가 우리 부품 산업이 자립도를 높였듯이 위기가 곧 기회가 될 수 있다. 어쩔 수 없이 바뀌어야 하겠지만, 한국인의 저력과 맞물려서 소프트웨어 개발 역량이 몇 단계 업그레이드 될지도 모른다. 그러기 위해서 방법을 알아야겠다.

비대면 소프트웨어 개발을 하기 위해서는 크게 3가지가 필요하다.

첫째, 비대면 개발을 위한 시스템, 툴이 준비되어야 한다.

작은 툴부터 시스템까지 10~20여가지의 시스템이 도입되어서 내재화되어야 한다. 많은 것 같지만 적응해서 사용하다 보면 하나하나 필수적인 것이고 이것들 없이는 개발을 못할 것 같은 생각이 들것이다. 여러 회사를 살펴본 필자의 경험에 의하면 비대면 개발 프로세스를 위한 시스템, 툴을 촘촘히 전부 도입하고 있는 회사는 드물다. 일부 시스템만 사용하고 있어서 프로세스 중간중간 비대면 프로세스가 끊어지는 경우가 많다. 필수 시스템 중 몇가지만 예로 들면 문서관리시스템, 지식관리시스템, 소스코드관리시스템, 이슈관리시스템, CI시스템, 코드리뷰시스템 등이다. 추후 하나씩 자세히 알아보려고 한다. 이렇게 비대면 프로세스가 끊어지면 지속적으로 비대면 개발을 할 수 없고, 중간중간 얼굴을 보고 일하지 않으면 안된다.

둘째, 문서작성 역량이다.

단순히 워드 문서 같은 것을 말하는 것은 아니다. 온라인 시스템을 사용하려면 모든 것을 다 적어야 한다. 말로 하는 커뮤니케이션보다 글로 적는 커뮤니케이션에 익숙해져야 하고, 문서를 통해서 의사를 전달하고 문서를 보고 개발할 수 있는 수준의 문서를 작성할 수 있어야 한다. 그렇다고 자세하게 적는 것이 능사는 아니다. 최소한으로 문서를 적는 것이 더 중요하다. 이런 역설적인 말을 이해해야 한다. 개발에 관련된 문서는 많다. 기획문서, 스펙문서, 백서, 설계문서, 테스트 관련 문서 등 여러 문서를 온라인 프로세스를 통해서 작성하고 리뷰하고 확정하고 변경 관리를 해야 한다. 

셋째, 개발 문화다.

그중 대표적인 것이 수평 문화다. 온라인으로 비대면 개발을 하면 업무가 수평적으로 진행된다. 프로젝트에서 자신의 역할이 존재할 뿐이고 수직 관계가 없어져야 한다. 그래야 제대로 개발이 된다. 온라인에서도 수직관계가 여전히 존재한다면 일이 잘 진행 안될 것이다. 각자 자신이 맡은 일을 전문적으로 처리하는 것이다. 연공서열, 장유유서, 상명하복 이런 것들이 점점 희박해지고, 전문성이 강조되는 문화로 바뀌어 나가야 한다. 얼굴 안보고 일하면 이런 문화가 바뀔 가능성이 더 높아진다.

코로나19는 우리에게만 닥친 것이 아니다. 전세계가 동일한 환경에 처했다. 전세계가 비대면 방식으로 업무를 바꾸고 있고, 우리가 조금이라도 더 빨리 적응해 나가야 한다. 승부는 2,3년 안에 나게 되었다. 여기서 뒤쳐지면 따라잡기 어렵다.

비대면 방식이 소프트웨어 개발은 이제 선택이 아니고 필수가 되어가고 있다. 오늘은 비대면 방식의 개발에 대해서 간단히 소개만 했는데, 앞으로 하나씩 자세히 소개를 할까 한다. 하루아침에 습득할 수 있는 것은 아니지만, 차근차근 알고 익혀 나가는 것이 가장 빠른 길 일 것이다. 

이 글은 ZDNet Korea에 기고한 칼럼입니다. 



2020년 4월 26일 일요일

[Software Spec Series 11] 스펙 문서에 대한 오해

많은 회사에서 소프트웨어 프로젝트를 진행할 때 스펙 문서를 작성한다. 정확하게 말하면 스펙 문서라는 이름의 문서를 작성한다. 하지만 회사에서 작성한 스펙 문서를 살펴보면 진짜 스펙 문서인 경우는 매우 드물다. 이름만 스펙 문서이지 내용은 스펙이라고 부르기에는 뭔가 좀 다른 경우가 많다. 그 사례를 살펴보자.

문서 이름이 문제


일단, 스펙 문서라고 하여 여러가지 이름의 문서가 사용되고 있다. “기능명세서”, “요구사항 기술서”, “시방서” 등이 있다. 하지만 이런 문서를 보면 이름만 봐도 스펙 문서라는 생각이 안 든다. 왠지 스펙의 극히 일부분의 내용이 적혀 있을 것으로 생각되고 실제로 내용을 보면 이름에 걸맞게 내용도 반쪽짜리 또는 극히 일부의 내용만이 언급되어 있다. 나름 노력을 해서 스펙 문서라고 적어서 이를 토대로 프로젝트를 진행하지만 주먹구구식 프로젝트보다 약간의 진보가 있을 뿐 큰 차이는 없다. 스펙 문서는 이름도 중요하다. 누가 봐도 스펙 문서라는 것을 알 수 있도록 SRS라고 부르거나 Specification이라는 말이 들어간 이름을 쓰는 것이 좋다.

문서 내용의 문제


“기능명세서”, “요구사항 기술서”, “시방서” 등의 이름을 가진 문서들은 대부분 요구사항이나 기능에 집중된 내용이 들어 있다. 그래서 이런 문서는 “스펙”이라고 하기에는 반쪽짜리 문서다. 스펙 문서는 비전, 전략, 기능, 환경, 비기능, 시스템 특성 등 여러가지를 포함해야 한다. 또한 요구사항도 그대로 적는 것이 아니라 잘 분석이 되어서 여러 기능이나 비기능으로 분해가 되어 있어야 한다. 이런 분서에서 빠져 있는 내용은 프로젝트를 진행하면서 수많은 문제와 혼동을 야기할 것이다.

절차의 문제


“스펙” 문서라고 하면 일반적으로 인정하는 프로세스가 있다. 작성과 리뷰, 승인 과정을 거친다. 그래서 책임을 지고 작성하는 “분석 아키텍트”가 정해지고 프로젝트에서 적절한 분석 시간을 할당 받는다. 분석 활동으로 공식적으로 인터뷰, 워크샵, 관찰, 토론 등을 진행할 때 이해관계자들의 협조를 받으며 공식 리뷰에 많은 이해관계자들이 자신의 의무를 다하기 위해서 신중하고 꼼꼼하게 리뷰를 하고 승인을 한다. 승인에 대한 압박감도 상당하다. 우리는 “스펙”이라는 용어를 듣는 순간 이러한 프로세스도 거쳤을 것이라고 생각을 한다. 이런 절차 없이 개발팀에서 알아서 작성해서 진행을 하면 안된다.

필자는 “스펙”, “소프트웨어 스펙” 또는 “SRS”라는 용어를 사용하길 권장한다. 이런 용어를 사용해서 대화를 한다면 서로 같은 의미로 소통을 하고 있을 가능성이 높다. 특히 외국인 개발자를 채용하거나 글로벌 업체와 협력을 하게 된다면 용어의 사용은 매우 중요하다. “스펙”, “SRS”라는 용어로 소통을 하고 문서를 작성할 때 외국 업체와의 협업이 더 원활할 것이다. 물론 용어만 쓴다고 되는 것은 아니다. “스펙”, “SRS”를 제대로 작성할 수 있어야 한다.

2020년 4월 12일 일요일

[Software Spec Series 10] 요구사항과 스펙의 차이

스펙에 대해서 얘기할 때 종종 혼동해서 사용하는 것이 요구사항이다. 영어로는 Specification과 Requirement(s)다. 두 용어는 같은 것일까? 다른 것일까? 가끔은 혼용해서 사용하지만 우리는 스펙의 원리를 정확하게 이해하기 위해서 두 용어의 차이를 명확하게 구분하는 것이 필요하다.

“요구사항"이라는 용어는 소프트웨어 업계 외에서도 일반적으로 의미와 비슷한 뜻으로 사용된다. 고객이나 이해관계자가 요구하는 것을 뜻한다. 하지만 소프트웨어 “스펙”은 좀 다른 의미를 가지고 있다. 그래서 수많은 회사에서 또, 여러 개발자들이 그 의미를 미묘하게 서로 다르게 생각하고 있나보다. “스펙”도 소프트웨어 업계 외에서도 많이 사용한다. 취업 시장의 후보자도 “스펙”이란 용어를 쓰고, 스마트폰 등 디바이스도 “스펙”이란 용어를 쓴다.

일반적인 의미로 소프트웨어도 “스펙”은 비슷한 의미를 가지고 있지만, 소프트웨어 “스펙”이라고 하면 머리 속에 그려지는 모습이 있다. 그리고 그 모습은 전세계 개발자들이 공통적으로 생각하는 것이 있다. 적어도 이런 내용들이 포함되어 있고 이런 절차를 통해서 만들었을 것이라는 생각을 할 수 있다.

그래서 요구사항은 한 줄 또는 몇 줄에 불과하지만 그 요구사항을 잘 분석해서 스펙을 작성하면 수 페이지 또는 수십, 수백 페이지의 문서가 될 수도 있다. 그래서 스펙을 제대로 작성하지 않고 요구사항만 가지고 프로젝트를 시작하면 큰 재앙이 닥칠 수 있다. 특히 외주 프로젝트라면 그 재앙은 회사를 매우 어렵게 할 수도 있다.

내부에서 진행하는 프로젝트든 외주나 SI로 진행하는 프로젝트든 스펙을 제대로 작성하지 않고 요구사항 수준의 요청으로 진행을 하면 분석이 제대로 되지 않았기 때문에 프로젝트를 진행하는 내내 수많은 문제가 발견되고 난상토론, 불 끄기, 고치기 반복이 발생한다. 물론 스펙을 적절히 잘 작성하면 이런 문제 상황을 훨씬 줄어든다.

지금도 수많은 사람들이 “요구사항”과 “스펙”이란 용어를 혼동해서 사용을 하고 있다. “요구사항”과 “스펙”의 차이를 사전적으로 아무리 설명해도 그 차이를 실감하기는 불가능하다. 외울 수는 있어도 금방 잊어버려서 실전 개발 프로젝트에 적용을 하지 못한다. 유일한 방법은 소프트웨어 “스펙”의 원리를 제대로 이해하면 “요구사항”과 “스펙” 차이를 명확하게 알게 된다. 그래서 이 시리즈에서는 “스펙”의 원리에 대해서 자세히 다루고 있다.

(요구사항과 스펙의 차이)
share abctech.software


2020년 3월 29일 일요일

[Software Spec Series 9] 여러 종류의 스펙 문서 유형

소프트웨어는 하루짜리부터 몇 년짜리 대형 프로젝트도 있다. 이런 모든 프로젝트에 동일한 스펙 문서를 적용하면 비효율적이다. 스펙 문서의 형태는 매우 다양하며 상황에 맞는 문서를 적절히 사용하는 것이 좋다.

이슈관리시스템의 한 줄 또는 몇 줄의 설명


스펙이라고 하면 수십에서 수백페이지의 문서를 먼저 떠올리지만 상황에 따라서는 Jira나 Redmine과 같은 이슈관리시스템의 이슈 하나, 또는 한 줄이 스펙이 될 수도 있다. 보통 작은 유지보수를 위한 변경에서 주로 적용되지만 무엇을 개발해야 하는지 명확하게 정의가 된 것이라면 한 줄 또는 몇 줄의 글이라도 훌륭한 스펙이 될 수 있다.


엔지니어링 One-pager


SRS 등의 제법 큰 템플릿을 가진 문서에 정식으로 스펙을 작성하기에는 프로젝트의 규모가 작거나 이슈가 별로 없을 경우에 작성을 한다. 이슈관리시스템에 간단히 이슈를 정리하고 진행하기도 하지만 굳이 엔지니어링 One-pager라는 문서를 작성하는 이유는 스펙을 작성하는 정식 절차를 밟기 위함이다. One-pager라도 스펙을 일단 작성하면 공식 리뷰를 거쳐서 여러 사람의 의견이나 도움을 공식적으로 받을 수 있다. 그러면 개발하려고 하는 방향이 맞는지 이미 다른 팀에서 비슷한 것을 개발하거나 검토해 놓은 것이 있는지 더 좋은 방법은 없는지 의견을 받을 수 있다. 또한 One-pager의 내용은 공식적으로 다른 사람, 다른 팀에게 공유가 되어서 회사내에서 지식 공유에 도움이 된다.

보통 다음과 같은 경우에 엔지니어링 One-pager를 작성한다.


  • 메모리를 50% 절약하는 알고리즘 구현 시도
  • 최신 버전의 Visual Studio로 이식하는 프로젝트
  • 새로운 그래픽 엔진으로 교체를 하는 일주일짜리 프로젝트


수십페이지의 SRS


가장 일반적으로 스펙을 작성하는 방법이다. 비즈니스 전략, 환경, 기능, 비기능, 성능 등 소프트웨어를 개발하면서 고려해야 할 대부분의 내용이 포함되어 있다. 이 책에서는 SRS에 대한 내용을 자세히 다룰 것이다.

수백, 수천페이지의 거대 방법론의 스펙 문서


거대 방법론에서는 문서를 수십개 이상 작성하기도 한다. 이런 방법론에서는 스펙이 하나의 문서로 정리되는 것이 아니고 여러 개의 문서에 분산되어서 작성된다. 장점으로는 프로젝트에 투입된 역할별로 필요한 문서를 정해서 보면 되는 것이다. 단점으로는 중복이 많이 발생하고 하나의 업무를 하기 위해서 매우 많은 문서를 봐야 한다. 또한 한번 작성하고 나면 수정이 매우 어렵다. 아래와 같은 문서들이 그 예다.

  • 요구사항정의서
  • 업무기능분해도
  • 업무흐름도
  • 액터카달로그
  • 유스케이스 다이어그램
  • 논리 ERD
  • 도메인 엔티티 정의서
  • 분석패키지 다이어그램
  • 코드정의서
  • 인터페이스 정의서
  • 컴포넌트 명세서
  • 화면 정의서
  • 메뉴 구조도

기타


  • 테스트 코드로 스펙 작성하기
  • 소스코드로 스펙 작성하기
  • 유저 스토리
share abctech.software

2020년 3월 15일 일요일

[Software Spec Series 8] 어떻게 소프트웨어를 빠르게 개발하는가?


소프트웨어는 빠르게 개발하는 것이 매우 중요하다. 소프트웨어 개발 기간이 오래 걸린다면 적절한 시장 진입 시기를 놓칠 수 있다. 소프트웨어 시장 변화는 매우 빨라서 너무 오래 개발을 하면 그동안 시장의 상황이 바뀐다. 경쟁자들은 새로운 제품을 출시하여 우리 회사에서 지금 개발하고 있는 제품이 뒤쳐지곤 한다. 또한 오랜 프로젝트는 개발자와 프로젝트 참여 인원들을 지치게 만든다. 이런 현상이 프로젝트를 더욱 더디게 한다. 프로젝트가 기간이 길어지면 그동안 새로운 요구사항이 추가될 가능성이 높다. 기획자는 변화하는 시장의 상황을 무시할 수가 없기 때문이다. 그래서 프로젝트는 더욱 늘어지고 품질은 떨어진다.

최근의 대부분의 개발 방법론들은 소프트웨어를 빠르게 개발하는 것을 중요시하고 있으며 회사에서도 소프트웨어를 빠르게 개발하기 위한 많은 노력을 들이고 있다. 그럼 어떻게 해야 소프트웨어를 빠르게 개발할 수 있을까? 소프트웨어를 빠르게 개발하기 위해서 고려해야 할 것은 매우 많지만, 여기서는 스펙 관점으로 살펴보려고 한다.

(느린 순차적 개발)


빌딩을 쌓을 때는 1층을 쌓고 2층을 쌓아야 한다. 1층을 쌓기 전에 2층을 쌓는 것은 불가능하다. 조립식 빌딩이라면 얘기가 다르지만 대부분의 빌딩은 순차적으로 쌓아 나간다. 소프트웨어도 이런 방식으로 순차적으로 개발을 해야 한다면 매우 오랜 시간이 걸릴 것이다. 거대한 소프트웨어는 수십년이 걸릴 수도 있다.

하지만 소프트웨어는 빌딩과 같이 1층이 완성되기를 기다렸다가 2층을 만들 필요가 없다. 1층과 2층의 인터페이스만 잘 정하면 따로 만들어서 합치면 된다. 다 만들어서 나중에 합치는 방법도 있지만, 1층과 2층의 뼈대만 만들어 놓고 동시에 만드는 방법을 더 많이 사용한다. 나중에 합치게 되면 합치는 과정에서 문제가 발생하기도 하지만, 처음부터 합쳐 놓고 동시에 만들면 합치는 과정에서 생기는 문제가 줄어든다.


(빠른 병행 개발 - 개발 후 통합)


(빠른 병행 개발 - 통합 후 개발)


이렇게 소프트웨어를 동시에 개발하여 프로젝트 기간을 단축하려면 분석, 설계가 잘 되어 있어야 한다. 특히 컴포넌트를 잘 나누고 인터페이스를 견고하게 정의해야 한다. 인터페이스는 간결하게 정의를 해야 각 모듈 간의 연동이 쉬워진다. 인터페이스는 확고하게 정의를 해야 하며 나중에 함부로 바꾸면 안된다. 물론 한번 정의한 인터페이스가 프로젝트 종료 시까지 변경되지 않으면 가장 좋겠지만 쉬운 일이 아니다. 개발 도중에 인터페이스를 변경하면 처음에 잘 정의한 경우보다 수십배의 변경 비용이 들어간다. 따라서 분석, 설계 시 최대한 노력을 하여 인터페이스가 가능하면 변경되지 않도록 정의를 해야 한다.

프로젝트가 크고 참여 인원이 많을수록 순차적인 개발보다 병렬 개발이 훨씬 좋다. 수십명의 개발자가 참여하는 프로젝트에서 순차적인 개발이란 거의 불가능하다. 수십명의 개발자가 처음부터 잘 통합된 소스코드를 기반으로 병렬로 개발을 해야 프로젝트를 빨리 끝낼 수 있다.


(순차개발과 병행개발의 개발 속도 차이 비교)


인터페이스는 상호간의 약속이다. 클라이언트와 서버 모듈을 병렬 개발할 때 인터페이스는 클라이언트 개발팀과 서버 개발팀의 약속이다. 인터페이스를 확정하면 서로 약속을 한 것이고 서로 헤어져서 따로 개발을 해도 문제가 없을 정도로 신뢰를 할 수 있어야 한다.

프로젝트 기간 내내 인터페이스를 잘 유지하기 위해서는 지속적인 통합이 필요하며 유닛 테스트, 테스트 자동화도 유용하다. 개발자는 자신이 작성한 모듈을 완성한 후에 소스코드관리시스템에 등록하는 것이 아니라 좀더 잦은 주기로 등록을 하여 프로젝트 주기 내내 소스코드가 정상적으로 빌드가 되도록 유지해야 한다. 너무 늦게 통합을 할 경우 많은 문제를 발생시키는 “통합의 지옥”을 맛보게 된다.

커밋은 하나의 기능이 완성이 되었을 때, 전체 클래스 또는 전체 컴포넌트를 모두 구현할 때까지 기다릴 필요가 없다. 하지만 항상 빌드는 되어야 한다. 또한 내가 소스코드를 수정하는 동안 다른 곳을 수정한 동료들의 소스코드와 머지(Merge)가 잘 되어서 제대로 빌드가 되는지 확인을 해야 한다. 보통은 적어도 하루에 한두 번 이상 커밋을 한다. 며칠씩 커밋을 하지 않고 지나가지는 않는다.

지속적인 통합을 위해서는 툴을 사용해도 되고, 직접 스크립트를 작성해서 구축을 해도 된다. 지속적인 통합을 도와주는 툴을 CI툴이라고 하며 Jenkins, Bamboo 등이 있다. CI툴 자체가 중요한 것은 아니지만 CI툴은 지속적인 통합을 조금 쉽게 해준다. 중요한 것은 지속적인 통합 활동을 성실히 하는 것이다.

지속적인 통합을 위해서는 주기적인 빌드가 필수다. Build on commit을 하기도 하고 Daily build를 하기도 한다. 밤에 빌드를 한다고 해서 Nightly build라고 하기도 한다. 프로젝트 기간 내내 Daily build는 실패가 없어야 한다. Daily build가 실패하면 인터페이스가 깨졌거나, 어떤 개발자가 깨진 소스코드를 올렸을 수 있다. 빌드가 깨지면 여러 개발자들이 개발에 차질을 빚게 된다. Daily build가 깨진 것을 브로큰 트리(Broken tree)라고 부르며 즉각 해결을 해야 한다.

거대한 시스템일수록 병렬 개발은 꼭 필요하다. 거대한 시스템의 구조를 얼마나 간결하게 하는지가 설계의 중요 요소다. Architect는 복잡한 시스템을 최대한 간결하고 복잡도를 줄여서 시스템의 개발, 유지보수 효율을 높여야 한다. 병렬 개발을 할 때 어려운 점은 내가 필요로 하는 컴포넌트가 아직 구현이 안되어 있어서 기능을 확인할 수 없다는 것이다.

예를 들어보자. 나는 사용자 관리 화면을 개발하고 있고 getUserList()라는 함수가 필요하다. 나는 사용자 목록을 출력하는 화면을 만들고 있는데 getUserList()를 개발하는 개발자는 아직 이 함수를 구현하지 않은 상태다. 그럼 나는 getUserList() 함수가 개발되기 전까지는 내가 만든 사용자 목록 화면을 테스트 해볼 수가 없다. 그럴 때는 getUserList() 함수에 가짜 코드를 추가하면 된다. 실제로는 DB에 쿼리를 해서 사용자 목록을 가져와야 하지만, 가짜로 Hard coding을 해서 사용자 목록을 넘겨주는 것이다. 물론 이런 가짜코드는 필요에 따라서 언제든지 넣고 뺄 수가 있어야 한다.

C언어로 개발을 한다면 다음과 같은 형태가 될 것이다. 아주 간단한 예를 든다.
#define USE_FAKE
RET getUserList(userdata *pData[], int &num)
{
#ifdef USEFAKE
  // make fake data
  num = 2;
  pData[0]->userid = 1;
  pData[0]->username = “John”;
  pData[1]->userid = 2;
  pData[1]->username = “Tom”;
#else
  // get data from database
#endif
  return RET_SUCCESS;
}
(병행 개발을 위한 소스코드 예)

이와 비슷하게 개발 언어에 따라서 적절한 방법으로 병렬 개발하는 아이디어를 적용하면 된다. 병렬 개발을 위와 같이 각자 서로 다른 모듈을 개발하는 경우도 있고 하나의 모듈을 여러 개발자가 개발하는 경우도 있다.

잘 분석, 설계된 소프트웨어는 이와 같은 방법을 사용하여 병렬 개발을 진행하여 소프트웨어를 빨리 개발할 수 있다.

share with abctech.software

2020년 3월 1일 일요일

[Software Spec Series 7] SRS란 무엇인가?

소프트웨어 요구사항을 분석해서 작성하는 스펙 문서의 형태와 종류는 셀 수 없을 만큼 다양하다. 개발방법론에 따라서 제시하는 문서도 다르고 그 개수도 천차만별이다. 이 시리즈의 글에서 소개하고 주로 다룰 문서는 SRS다.

SRS는 Software Requirements Specification(s)의 약자다. Specification 혹은 Spec(스펙)이라고도 한다. SRS는 IEEE830에서 문서를 작성하는 가이드가 정의되어 있고, DoD(미국 국방부) 표준 문서이다.

SRS는 스펙 작성의 원리를 이해하는데 매우 유용하다. 어떠한 형태의 스펙 문서를 작성하더라도 스펙 작성의 원리를 이해하는 것은 매우 중요하다. 스펙을 작성할 때 생각하는 방법, 작성하는 프로세스, 포함되어야 할 내용, 각 내용에 대한 작성 가이드가 모두 포함되어 있다. SRS 역사는 오래 되었지만 스펙을 작성하는 원리는 지금도 변하지 않았다. 앞으로도 크게 변하지 않을 것이다. 그래서 SRS를 작성하는 원리를 깨우친다면 어떠한 방법론 하에서도 스펙을 잘 작성할 수 있을 것이다.

SRS는 IEEE에서 만든 표준 템플릿과 작성 가이드가 있다. 회사마다 조금씩 수정해서 자신의 회사에 맞는 템플릿을 별도로 가지고 있지만, 서로 매우 유사하여 SRS는 전세계 표준이라고 보면 된다. 소프트웨어 회사라면 각자 회사와 개발하는 제품의 특성에 맞게 커스터마이징 해서 사용하는 것이 좋다.

share with abctech.software