메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

소프트웨어 문제를 해결하는 4단계

한빛미디어

|

2019-03-26

|

by Emily Cain

3,527

문제 해결은 학생, 신입 프로그래머, 그들과 함께 일하는 사람들에게 가장 중요한 스킬입니다.

 

저는 기술 교육 분야에서 모든 소프트웨어 개발자들이 갖추고 있어야 하는 스킬의 공백이 발생하는 것을 알게 되었습니다. 바로 문제 해결 프로세스입니다. 저의 소프트웨어 경력은 온라인 튜토리얼과 코딩 부트캠프로 시작했지만, 대학의 컴퓨터 과학 프로그램에 대해서도 비슷한 불평을 들었습니다.

 

저는 어느 누구도 공식적으로 이런 스킬들을 가르치지 않는다고 말하지는 않습니다. 하지만, 일반적으로는 개발자들 스스로 알아내야 하는 것처럼 보입니다. 화이트보드 문제 풀이와 머리를 써야하는 질문같은, 전형적인(그리고 논란이 있는) 기술 인터뷰의 많은 부분은 이런 스킬들을 테스트하려고 시도합니다.

 

그래서, 저는 초보자들의 코드 작성을 도와줄 때마다, 직장에서 하는 것과 같은 방법으로 문제를 해결하는 과정을 자세하게 설명하려고 노력합니다. 코딩에 "완전히" 압도된 소프트웨어 새내기들(newbies)과 숙련된 개발자들이 사용하는 프로세스가 어떻게 비교되는지, 그 단계들을 여기서 명료하게 설명하고 싶습니다.

 

일반적으로, 소프트웨어 개발 문제를 해결하는 프로세스는 4단계로 나눌 수 있다고 생각합니다.

  1. 문제를 확인한다. (Identify the problem)
  2. 정보를 수집한다. (Gather information)
  3. 가능성 있는 솔루션을 반복한다. (Iterate potential solutions)
  4. 솔루션을 테스트한다. (Test your solution)

학생과 경험이 적은 개발자를 염두에 두고 이런 단계들을 작성하는 동안, 소프트웨어 분야에서 일하는 모두가 우리의 개발 프로세스에 유용하게 반영할 수 있는 부분을 찾아보기 바랍니다. 프로그래밍 강사와 신입 프로그래머의 멘토라면 누구나 자신의 학생이나 멘티에게 필요한 특별한 전문적인 스킬과 함께 문제를 해결하는 프로세스를 확실하게 알게 해야 합니다.

 

어떤 문제인가?

 

제가 소프트웨어 개발 문제에 관해 이야기할 때는, 모든 크기와 범위의 문제를 의미합니다.

  • 매우 구체적인 것만 시도하면, 기대하는 것의 일부를 얻을 수 없습니다.
  • 이상한 에러 메시지가 보이지만 무엇을 의미하는지 모릅니다.
  • 레거시 코드의 수수께끼 같은 부분을 알아내야 하는데, 초기 개발자들이 모두 조직에서 떠났습니다.
  • 만들려는 것에 대해 대강 알고 있지만, 프로젝트의 개별 컴포넌트가 어떤 모습일지 알 수 없습니다.
  • 어떤 소프트웨어 패키지를 사용할 것 인지 결정하려는 데, 어떤 패키지가 최선인지 모릅니다.
  • 당신이 원하는 것을 정확하게 하는 기능이 있다는 것은 알지만, 무엇이라 불러야 하는지 기억하지 못합니다.

문제를 인식하고 이해한다.

 

이 단계는 다른 경우들에 비해 쉽습니다. 가끔은 명확한 에러메시지를 통해 문법 오류, 함수에 필요한 변수를 전달하는 것을 잊었거나, 패키지를 임포트 하는 것을 소홀히 하는 작은 실수를 했음을 깨닫습니다.

 

반면에, 때때로 완전히 이해할 수 없는 에러도 있습니다. 종종 당신이 원하는 대로 동작하지 않는 프로그램의 버그는 깜빡이는 빨간 불빛으로 자신을 드러내지 않습니다.

 

이런 경우에도, 문제를 확실히 하기위해 최선을 다할 수 있습니다. 스스로에게 아래의 질문을 해보세요. (답을 적어 내려갈 수도 있습니다.

  • 내가 무엇을 하려고 하는가?
  • 내가 이미 한 것은 무엇인가?
  • 프로그램이 해야 한다고 생각하는 것은 무엇인가?
  • 프로그램이 실제로 무엇을 하는가?

정보를 수집한다.

 

저는 가끔 사람들이 전 단계를 마치지 않고 바로 이 단계로 건너뛰는 것을 봅니다. 예를 들면, 

  • 처음부터 스택 오버플로우를 검색하는 것
  • 코드 무엇을 하는 지에 이해하지 않고 스택 오버플로우, 튜토리얼이나 코드 베이스의 다른 위치에서 코드를 복사, 붙여넣기 하는 것

저는 이런 습관이 문제를 완전히 이해하지 못하고 문제를 "해결" 하는 것으로 이어진다고 생각합니다. 이런 리소스들(스택 오버플로우, 튜토리얼, 당신이 찾은 다른 예제들)이 나쁘다고 얘기하는 것은 아닙니다. 하지만 그것들은 문제 해결 프로세스의 시작과 끝이 아닌 도구상자에 있는 하나의 도구처럼 다루어야 합니다.

 

이런 도구상자를 어떻게 다르게 사용할 수 있을까요? 당신이 찾고 있는 정보에 대해서 생각해보세요.

 

사용하는 외부 패키지나 서비스를 사용할 때 어떤 함수, 클래스, API 엔드 포인트인지 정확하게 알고 있다면, 다양한 모든 옵션을 보기위해 문서에 있는 관련된 페이지로 이동할 수 있습니다.

  • 오픈 소스 패키지에 문제가 있고 왜 인지 모르겠다면, 추정하는 것이 명확하게 무엇을 하는지 확인하기 위해 관련된 기능의 소스 코드를 읽어보세요.
  • 새로운 툴이나 프레임워크의 개요를 살펴보기 위해, 튜토리얼이나 퀵 스타트 가이드를 찾으려고 해보세요.
  • 당신의 코드 베이스가 왜 그렇게 설계되어 있는지 이해하지 못하겠으면, 관련 파일이나 파일들의 커밋 히스토리를 살펴보세요. 종종 과거의 개발자들이 왜 그렇게 했는지 짜 맞추어 종합해 볼 수 있습니다.
  • 그리고 맞습니다. 검색엔진입니다. 때로는 무엇을 원하는지 명확하게 알지만, 그것을 무엇이라고 불러야 하는지 모를 때가 있습니다:
  • "PHP에서 두개의 변수 할당하기." 때로는 무언가를 하는 방법에 대한 아이디어를 원합니다.
  • "JavaScript로 카드 한 벌 섞기" 때로는 생각 없이, 유사한 다른 사람들의 문제를 살펴보고 다음 단계에 시도할 것을 알아내는데 도움을 받습니다.
  • "Django 폼 유효성 검사가 동작하지 않음" 이렇게 검색했을 때, 찾은 링크나 관련 문서를 읽으면 이슈에 대해 광범위하게 이해할 수 있습니다.

이런 방법들 중 하나를 사용했는데 진전이 없는 것 같아 보이면, 저는 종종 다른 방법으로 변경합니다. 제가 아는 많은 개발자들이 검색엔진에 먼저 손이 간다는 것을 발견했습니다. 하지만 저는, 의도적으로 이해의 범위를 넓히는데 도움이 되는 다양한 방법들을 사용합니다.

 

가능성 있는 솔루션을 하나씩 시도해본다.

 

시도하세요. 완벽할 필요는 없습니다. 결과로 무엇이든 변화를 보게 된다면, 그것은 성공입니다. 당신은 그것을 곧 개선할 것입니다. 문제에 대한 실질적인 진전이 있을 때까지 계속 시도하세요.

 

만약 잘 모르는 영역에 있다면, "솔루션"을 아주 작은 단위로 세분화하고, 조금씩 시도하는 것이 도움이 될 수 있습니다. 어떻게 렌더링할지 걱정하기 전에 콘솔에 출력하세요. 이전에 사용하지 않았던 함수를 간단하게 하드 코딩한 인자로 호출하고, 애플리케이션에 사용할 실제 데이터로 바꾸기 전에 예상대로 실행되도록 하세요.

 

모든 코드 라인 다음에 당신이 무언가를 하는 것은 더 어렵지만 괜찮습니다. 그것은 몇 시간 동안 타이핑한 코드에서 동작하지 않는, 왜 그런지 알 수 없는 부분을 찾아내야 하는 상황을 피하기 위한 것입니다. 중간 부분을 찾아서, 결과를 얻게 되면 상대적으로 짧은 시간을 쓰면서 확인할 수 있습니다.

 

오랜 시간 이런 식으로 반복했는데, 진전이 없는 것처럼 보인다면, 첫 단계로 돌아가서 다른 것을 시도할 때입니다. 하지만, 동작하는 무언가를 얻을 수 있다면, 생각했던 것과 정확히 일치하지 않더라도, 지금이 다음 단계로 넘어가기 좋은 시점입니다.

 

솔루션을 테스트한다.

 

종종 우리는 웹 페이지를 로드하고 포함되어 있는 모든 엘리먼트들이 우리가 예상한대로 그려지는지 확인하는 작업을 직접 손으로 합니다. 버그를 유발하는 조건들을 복제하고, 버그가 더 이상 발생하지 않는지 확인하세요. 몇 가지 다른 방법으로 추가한 기능을 사용해서 무슨 일이 일어나는지 확인하세요.

 

우리가 이것을 하는 또 다른 방법은 자동화 테스트입니다. 기능의 동작을 예측해서 단언(assert)하거나, 예상되지 않은 문제를 방지하는 테스트를 추가해서 버그가 더 이상 발생하지 않도록 하세요.

 

테스트 주도 개발은 테스트를 끝까지 미루기 보다는 테스트와 함께 시작하는 다른 방식의 접근입니다. 프로젝트를 변경할 때마다, 변경이 예상 대로 동작할 것이라는 테스트를 작성한 다음, 변경합니다.

 

테스트 주도적 접근의 한 가지 이점은 프로젝트의 주어진 부분에서 작업을 시작하기 전에 성공의 의미가 무엇인지 생각하게 한다는 것입니다. 테스트를 작성하면서 시작하든, 마지막에 테스트를 작성하든, 다른 방법으로 변경을 검증했는지 여부와 관계없이, 작성자 스스로에게 성공의 의미를 생각하게 합니다. 성공의 의미를 생각하게 하는 것은 이미 규정한 첫 번째 단계, 문제에 대한 인식과 이해의 일부분입니다. 문제에 대한 인식과 이해는 해결책을 찾는데 있어 필수적이기 때문입니다.

 

프로그램 코드를 추가하기 전에 자동화된 테스트를 작성하는 경우, 테스트 스위트를 실행하고 기능이 예상대로 동작하는지 확인하여, 주어진 부분의 동작이 당신이 하려는 것을 충족시키는지 살펴보게 될 것입니다.

 

다음은 무엇인가?

 

이 단계들은 제가 코딩할 때 문제를 해결하기 위해 취하는 단계이고, 학생들과 주니어 개발자들의 문제와 함께 그들을 도울 때, 전달하려고 하는 것들입니다. 대학의 컴퓨터과학, 부트캠프, 자습형 튜토리얼에 상관없이 문제 해결 프로세스에 대해 지도하는 더 많은 코딩 교육 프로그램을 보고 싶습니다. 정확한 프로세스는 사람, 조직과 그들이 하는 일에 따라 다를 것이지만, 문제를 해결하는 방법을 아는 것은 프로그래머가 되기 위해 기초적인 스킬입니다. 만약 학생들이나 경험이 적은 개발자들과 일한다면, 문제를 해결하는 스킬을 개발하는데 당신이 도와줄 수 있는 것을 찾아보세요.

 

*****

Emily Cain은 오리건 주, 포틀랜드의 소프트웨어 개발자입니다. 그녀가 가장 좋아하는 언어는 Python, JavaScript, Go입니다. 그녀는 PyLadies, Women who Code, Django Girls의 자원 봉사자입니다. 그녀는 하이킹, 역도, 보드게임, 고양이도 좋아합니다. 자세한 내용은 emcain.github.io에서 확인하세요.

 

원문 : 4 steps to solving any software problem

번역 : 김준환

댓글 입력
자료실