[컴퓨터 개론] 프로그래머의 세계 이해하기

업데이트:

컴퓨터 사이언스의 기본기

프로그래밍의 여러 영역은 서로 꽤 밀접하게 연결되어 있다.
비슷한 접근 방식과 문제 해결 방식을 공유하고 있기 때문에 하나를 잘 하면 다른 하나도 더 쉽게 배울 수 있다.
예를 들어, 뛰어난 서버 개발자가 애플리케이션을 학습하게 되면 조금만 적용해도 금방 배울 수 있고, Java개발자는 C++도 쉽게 배울 수 있다.

프로그래밍의 기본적이 개념이 튼튼하면 새로운 기술이나 언어가 나와도 빠르게 적용 할 수 있다.

컴퓨터 사이언스의 기본에는 객체 지향 프로그래밍, 알고리즘, 자료 구조등이 있다.
이 세 과목은 어느 분야의 개발을 하던 선택이 아닌 필수 사항이다.
그 외에도, 컴퓨터 구조, 운영 체제, 컴파일러, 웹 개발, 데이터베이스, 네트워크 등 과목이 있으며 기본적인 이해를 갖추고, 깊은 내용은 실제 개발 시 필요에 따라 공부하면 된다.



소프트웨어 공학

소프트웨어 공학은 소프트웨어로 제품/서비스를 만드는 방법에 대한 학문이다.
기획, 제작, 테스트, 출시, 사후관리 등 모든 프로세스를 포함한다.

기획 : 어떤 것을 만들지 정하는 단계이다.
어떻게 하면 기획자가 원하는 것을 정확하게 개발자에게 전달할 수 있을지 고민한다.

개발 : 기획한 것을 만드는 단계이다.
어떻게 하면 정해진 기획을 코딩으로 정확히 구현할 수 있을지, 어떻게 하면 큰 규모의 프로그램을 여러 사람이 분업해서 효율적으로 만들 수 있는지 고민한다.

테스트 : 개발이 기획대로 잘 되었는지 오류는 없는지 확인하는 단계이다.
어떻게 하면 소프트웨어의 문제점을 출시 전에 효율적으로 찾아 낼 수 있을지, 어떻게 하면 찾아낸 문제점들을 빠짐없이 개선할 수 있을지 고민한다.

배포 : 개발된 제포/서비스를 사용자가 사용하는 단계이다.
어떻게 하면 각 사용자의 실행 환경에 맞는 소프트웨어를 잘 배포할 수 있을지 고민한다.

유지/보수 : 출시된 서비스를 변화시키는 단계이다.
어떻게 하면 이미 만들어진 소프르웨어를 쉽게 변경할 수 있을지 고민한다.


모든 과정을 거치고나면 어떻게 이 모든 프로세스를 매끄럽게 진행할 수 있을지, 어떻게 제한된 자원으로 정해진 일정 안에 좋은 소프트웨어를 완성할 수 있을지 고민하게 된다.

소프트웨어 공학도 다른 공학과 마찬가지로 이론에만 머물러 있으면 안되고 실질적으로 이루어져야하기 때문에 각 실무에 맞게 조금씩 변하기도 한다.



프로세스 관리

개발자의 코드가 실제로 출시되기 까지 여러 단계를 거치게 된다.
기획 -> 개발 -> 테스트 -> 배포 -> 유지/보수
그 결과 하나의 소프트웨어를 출시하기 까지 다양한 사람이 협업하게 된다.(관리자, 기획자, 개발자, 디자이너, 테스터 등)

여러 사람이 협업하다보니 의사 소통에 문제가 발생할 수 있다.
이런 문제를 해결하기 위해 사람들은 협업 방식을 생각하게 된다.
그 중 가장 유명한 것은 폭포수 방식과 애자일 방식이다.

  • 폭포수(Waterfall)

폭포수 방식은 예전부터 사용되는 고전적인 방법이다.
각 단계를 완료하고 다음 단계로 넘어가는 방식으로 이해와 관리가 쉽다.
하지만, 만들고자하는 것이 복잡해질 경우 각 단계를 한번에 완벽하게 끝내기 힘들 수 있다.
왜? 기획 단계에서 상세하게 문서를 정리한다고 해도, 프로그램이 너무 복잡하면 의도한대로 완벽히 전달되지 않을 수 있다.
또한, 무언가 의도하지 않은 방향으로 진행이 되도 완성이 되기 까지 그 문제를 발견할 수 없기 때문에 완성된 후에 수정을 진행해야 한다.

수정 사항이 많이 생길 가능성이 높고, 개발자들이 수정 사항을 반영하기가 힘들다.


  • 애자일(Agile)

애자일 방식은 결과물을 만들어 미리 확인하고 수정하며 진행하는 방법이다.
프로그램을 적당한 크기의 기능으로 나누고, 각 기능에 대해 실제 동작하는 소프트웨어로 확인하면서 서로 소통하면서 개발하는 방식이다.

중간중간 사용하면서 발전시키기 때문에 기능 변경이 유연하다.

애자일 방법을 팀 전체가 쉽게 도입할 수 있게 스크럽이나 칸반같은 구체적인 실행 방식이 존재한다.



두 가지 방식은 모두 장단점이 있기 때문에 팀 구성원이나 제품의 성격 등에 따라 개발 방식을 선택하면 된다.



테스트 프로세스

프로그램에서 잘 못 실행되는 동작, 의도하지 않은 에러를 버그라고 한다.
소프트웨어에 버그가 생기지 않으려면 테스트를 미리 해야한다.
기본적인 테스트는 개발자가 직접 개발하는 과정에서 함께 진행한다.
테스트는 똑같은 작업을 반복하는 경우가 많다 보니 자동화 테스트 도구를 사용하거나 테스트 코드를 개발해서 직접 자동화 하기도 한다.

개발 단계에서 발견하지 못한 문제나 특정 상황에서만 발생하는 문제들도 있기 때문에 테트스 단계가 따로 있는 경우와 테스트만을 위한 부서가 따로 있기도 하다.
신뢰성이 중요한 제품일 경우 추가 테스트를 여러차례 거치게 된다.

테스트 부서가 따로 존재하는 경우 테스트 부서는 에러없이 퀄리티 높은 소프트웨어를 출시하는 것이 주 목적이 되고, 개발 부서는 일정에 맞춰 개발을 완료하고 테스트를 통과하는 것이 목적이라 두 부서 사이의 의견 차이가 생기기도 하며 조율이 필요하기도 하다.

  • 현업에서 테스트 과정이 진행되는 방식

누군가 버그를 발견한 후 담당 개발자에게 알려줘서 수정하게 된다.
소프트웨어 개발 시 버그가 많이 발생되기 때문에 이것을 관리하기 위한 프로세스가 필요하다.

버그가 얼마나 시급한지, 담당자가 누구인지, 버그를 빼먹지 않았는지, 버그가 잘 고쳐졌는지 등을 확인하기 위해 버그 관리 툴(지라, 아사나, 트렐로)을 사용한다.

버그에 대한 정보를 툴에 작성한 것을 이슈라고 부른다.
개발자는 자신이 원하는 시간에 버그를 확인할 수 있게 된다.

하나의 이슈에 대해 상태를 설정할 수 있다.

  1. 처음 이슈를 만들면 미해결(OEPN,TODO)상태가 된다.
  2. 개발자가 확인해서 개선 작업에 들어가게 되면 진행중(In-Progress)상태로 변경한다.
  3. 문제가 해결되면 해결(Resolved) 상태로 변경한다.
  4. 해결된 이슈에 대해 테스트를 해보고 문제가 해결된 것을 확인하면 종료(Closed)상태로 변경한다.
  5. 추가적으로 문제가 생기거나 재발하는 경우 다시 Open(Reopen)상태로 돌아가며 1번부터 다시 차례대로 진행된다.


그리고 각 단계에 담당자를 지정해주게 되는데 그것을 Assign(담당자 지정)이라고 한다.

하지만 이슈가 너무 많아지면 이슈 해결이 원활히 진행되지 않기 때문에 이슈가 원활히 해결될 수 있도록 프로젝트 매니저가 있는 경우도 많다.



버전 관리

프로그래밍을 하다보면 코드 수정이 많이 발생하며, 여러 사람이 함께 작업을 하다 보니 수정 이력이나 버전 관리를 하는 것이 매우 어렵다.
그래서 여러가지 문제가 발생하게 된다.

프로그래밍에서는 전체 코드를 여러 버전으로 저장하지 않는다.
왜? 똑같은 부분이 너무 많아 용량이 커지고 코드의 수정 내역이나 순서를 확인하기 어렵기 때문이다.

Git : 버전 관리를 하는 소프트웨어

GitHub : git을 이용해 코드를 저장하는 온라인 저장 공간

git의 코드 저장 방법
하나의 코드에 수정 사항이 생기면 어떤 내용이 바뀌었는지 수정 사항 정보만 저장이 된다.
누군가가 수정 했는지, 각 버전에서 어떤 변경 사항이 있었는지, 왜 수정했는지를 기록한다.

그래서 특정 버전을 보고 싶으면 처음부터 그 버전 까지의 수정 사항만 합치면 확인할 수 있다.
이 경우 코드를 저장하는 데 필요한 용량도 줄어들고, 각 상황에서 어떤 변화가 있었는지 코멘트를 기록할 수 있기 때문에 이력을 파악하기가 쉽다.

git을 이용하면 비슷한 여러 버전의 프로그램을 만들거나, 실행 기기별로 버전을 만드는 경우에 매우 유용하다.




개발자의 필수 프로그램 IDE

IDE는 통합 개발 환경을 의미하며, 개발자들이 코딩할 때 도움이 되는 기능을 모아둔 프로그램이다.

프로그래밍 코드는 텍스트이기 때문에 메모장에 코딩을 해도 상관이 없으나, IDE는 코드를 효율적으로 작성할 수 있도록 많은 기능들을 제공하기 때문에 IDE를 이용해서 코딩을 하는 것과 비교할 수 없을 정도로 힘들고 오래 걸린다.



개발자들이 많이 쓰는 프로그램들

IDE 외에도 개발자들이 많이 사용하는 프로그램들에는

프로젝트 관리 툴인 Jira, Trello, Asana, Confluence
메신저인 Slack, Skype, Jandi
디자인 협업 툴인 Sketch
등이 있다.


StackShare에서는 개발자 혹은 개발팀에서 사용하는 다양한 툴을 찾아볼 수도 있다.



[코드잇-컴퓨터 개론]https://www.codeit.kr/courses/intro-to-computer

태그:

카테고리:

업데이트:

댓글남기기