요즘IT
위시켓
최근 검색어
전체 삭제
최근 검색어가 없습니다.

혹시 개발 실력 늘리는 방법 효과 보신 글이나 유튜브 영상 있으시면 공유해 주실 분 계신가요... 인강 보면서 개발 공부 중인데 이게 맞는 공부법인가 싶네요. ‘컴퓨터적으로 사고’하는 개발자가 살아남는다는데 그런 공부법을 모르겠습니다.

회원가입을 하면 원하는 문장을
저장할 수 있어요!

다음

회원가입을 하면
성장에 도움이 되는 콘텐츠를
스크랩할 수 있어요!

확인

개발

컴퓨팅 사고와 개발 실력 늘리는 공부법

년차,
어떤 스킬
,
어떤 직무
독자들이 봤을까요?
어떤 독자들이 봤는지 궁금하다면?
로그인

 

컴퓨팅 사고 개발 공부법

 

혹시 개발 실력 늘리는 방법 효과 보신 글이나 유튜브 영상 있으시면 공유해 주실 분 계신가요... 인강 보면서 개발 공부 중인데 이게 맞는 공부법인가 싶네요. ‘컴퓨터적으로 사고’하는 개발자가 살아남는다는데 그런 공부법을 모르겠습니다.

이번 글을 쓸 수 있도록 인사이트를 주신 "SHIBA INU"님 감사드립니다.

 

프롤로그

이번 글은 개발 실력을 늘리기 위한 방법과 컴퓨터적으로 사고하는 법에 대한 개인적인 고찰에 관한 글입니다.

 

운동이라 생각하고 꾸준히 훈련하기, 요구사항을 데이터 관점으로 사고하기라는 핵심 철학을 바탕으로 어떻게 하면 개발 실력을 효과적으로 키우고, 컴퓨터적으로 생각하게 할 수 있을지에 대해 얘기하려고 합니다. 이 글이 개발 실력을 늘리고 나에게 맞는 공부법을 찾는 데 도움이 되기를 바랍니다.

 

개발은 학문이 아니라 운동과도 같은 것이다.

우선 첫 번째로 꼭 알려드리고 싶은 내용은 개발은 분명 공부가 많이 필요하지만 오히려 학문보다는 운동에 더 가깝다고 생각을 합니다. 저는 보통 개발 실력을 키우는 것을 축구 실력을 키우는 것에 빗대어 주로 설명을 하곤 합니다.

 

컴퓨팅 사고 개발 공부법

 

축구 교재를 열심히 보고, 축구 교육 영상과 축구 경기를 열심히 보지만 내가 실제로 공을 차지 않으면 당연히 실력이 늘 수가 없습니다. 마찬가지로 처음 성장에서는 공부보다도 실제로 몇 번이라도 하는 것이 훨씬 더 실력 향상에 도움이 됩니다. 또한 한 번에 많은 것을 배운다고 해도 꾸준히 하지 않으면 실력이 단번에 늘지 않습니다. 운동처럼 내가 한 번에 성장할 수 있는 성장폭에는 한계가 있기 때문에 꾸준히 하는 것이 중요합니다.

 

그렇다고 무조건 실전만 하는 것은 좋지 않습니다. 시간을 효율적으로 사용할 수 없으며 안 좋은 습관이나 형태가 만들어질 수 있기 때문에 공부와 훈련을 적절히 병행하는 것이 굉장히 중요하다고 생각을 합니다. (그렇지만 처음에는 실전의 비중이 훨씬 더 중요합니다.) 이후 일정 궤도에 올라가면 반복적인 연습뿐만 아니라 많은 경험과 시야가 굉장히 중요해집니다. 새롭고 다양한 경험과 학습을 하는 것이 굉장히 중요해집니다.

 

뿐만 아니라 축구처럼 개발은 혼자서 하는 것이 아니라 협업이 굉장히 중요한 과제입니다. 개발 역시 팀 스포츠에 가깝기 때문에 어떻게 하면 효과적으로 커뮤니케이션을 하고 효과적으로 내 역할과 남의 역할을 어떻게 조율할 수 있는가에 대한 부분들에 대한 부분 역시 굉장히 중요한 부분입니다.

 

그래서 개인기를 갈고닦는 것 역시 굉장히 중요하지만 어떻게 하면 골을 만들기 위해서 더 좋은 협업을 할 수 있을지 그리고 자신의 포지션에 대한 이해와 함께 어떻게 커뮤니케이션을 하는지를 학습하는 것 역시 중요합니다.

 

도구의 숙련도를 올리는 것과 본질을 이해하는 것은 별개의 것이다.

리액트를 공부했는데 뷰를 하는 회사에 합격했는데 잘할 수 있을까 걱정이 돼요.
걱정 마세요. 리액트를 잘하면 뷰도 금방 합니다. (물론 Svelte도요!)

 

우리가 보통 개발을 잘한다라고 하는 사람에게는 그가 하고 있는 언어나 생태계에서 잘한다는 것과는 또 다른 잣대가 존재하는 것 같습니다. 잘하는 개발자는 뭘 해도 다 개발을 잘한다는 것을 우리는 잘 압니다. 개발 실력을 늘리고 잘하기 위해서는 도구의 숙련도 외에 개발의 본질에 대해서도 이해를 하고 잘하는 것이 필요합니다.

 

리액트나 스벨트, 혹은 자바스크립트나 타입스크립트와 같은 언어들을 학습하고 잘하는 것은 특정 도구의 숙련도를 높이는 것이지만 개발을 잘한다고 하는 것은 그와는 다른 본질적인 부분이 있다고 생각합니다.

 

많이 알고 있는 것과 잘하는 것은 또 다른 이야기이다.

"면접에서는 대답도 잘하고 많이 알고 있는 것 같아서 뽑았는데 막상 일을 시켜보니까 그렇게 잘하지는 않더라고요."

 

이런 얘기들이 종종 들리는 것 역시 개발은 학문만으로 되어 있는 것은 아니라는 반증입니다. 개발을 잘하게 되기 위해서는 많이 학습해서 많이 알기만 하는 것으로 되는 것은 아니라는 것입니다.

 

이 글에서는 크게 2가지의 이야기를 하려고 합니다. 하나는 개발의 언어나 생태계를 떠나서 컴퓨터적인 사고를 한다는 것이 무엇인지 개발의 본질 중 일부에 대해서 얘기를 하려고 합니다. 이러한 이해는 개발을 이해하고 학습을 하는데 좋은 체계가 되어 줄 것입니다.

 

또한 학습이 아니라 훈련을 하기 위해서는 어떤 방식으로 개발을 훈련하는 것이 좋을지에 대해서 개인적으로 추천하는 방법에 대해서 얘기하고자 합니다.


1. 컴퓨터적으로 사고하는 개발자 되기

출처: 위키백과 '컴퓨팅 사고'

컴퓨팅 사고 또는 전산적 사고(電算的 思考, 영어: computational thinking, CT)는 컴퓨터가 효과적으로 수행할 수 있도록 문제를 정의하고 그에 대한 답을 기술하는 것이 포함된 사고 과정 일체를 일컫는다. 정답이 하나가 아니라 여러 가지일 수 있는 문제(Open-ended Problem)는 다양한 변수에 기반한 포괄적이며 유의미한 해답 도출이 필요한데, 컴퓨팅 사고를 통해서 발견한 문제 분해(decomposition), 자료 표현(data representation), 일반화(generalization), 모형(modeling), 알고리즘이 필요하다.

 

컴퓨터적으로 사고한다는 것은 문제를 해결하기 위해 필요한 답을 컴퓨터가 효과적으로 수행할 수 있도록 정의하고 그에 대한 답을 기술하는 것을 말합니다. 이러한 과정에서 문제를 작은 조각들로 분해하고, 필요한 자료를 표현하며, 일반화하여 해결책을 모델링하고, 최종적으로 알고리즘을 도출하는 것이 중요합니다.

 

이러한 컴퓨터적 사고 능력을 보유한 사람들은 다양한 문제에 대해 컴퓨터로 해결할 수 있는 유의미한 해답을 도출할 수 있으며, 당연히 프로그래밍 능력도 높아집니다.그렇다면 사람의 생각을 사람이 아니라 컴퓨터에게 더 효과적이게 하려면 어떻게 생각을 해야 할까요? 그 핵심에 대해 한번 알아봅시다.

 

'데이터'로 인식하는 것, 컴퓨터적 사고의 출발

컴퓨터는 0과 1의 세계에서만 작동하는 기계입니다. 이러한 숫자의 조합을 통해 숫자, 문자, 음성, 이미지 등 다양한 형태의 데이터를 생성하고 표현할 수 있습니다. 반대로 말하면 사용자의 요구사항을 컴퓨터가 이해하도록 하기 위해서는 숫자로 변환을 해야 한다는 것을 의미합니다.

 

결국 개발이란 사용자의 요구사항을 프로그래밍 언어를 사용하여 숫자(=데이터)로 표현된 방법을 전달하는 것이 됩니다. 따라서 사용자의 요구사항을 데이터의 관점에서 다시 생각하고 작성하는 것이 컴퓨터적인 사고의 출발점이자 기초가 됩니다.

 

불을 켜고 끄기 vs isLight = true;

우선 제일 단순한 예시로 전등을 켜고 끄는 프로그램을 작성한다고 생각해 봅시다.

먼저 사용자는 불을 켜거나 끌 수 있는 동작을 수행할 수 있습니다. 그러나 이러한 동작을 바로 컴퓨터에게 이해를 시키는 것은 어렵습니다.

 

컴퓨터에게 이해를 시키는 것이 어렵다는 것이 무슨 의미인가요?

사람은 불을 켜는 동작을 하면 당연히(!) 불이 켜질 거라고 말하지 않아도 인식하지만 컴퓨터는 그렇지 않습니다. 컴퓨터는 사람이 인식하는 것과 달리, 불이 켜져 있는 상태와 꺼져 있는 상태를 직접 인식할 수 없기 때문에 이를 반드시 데이터로 표현해 주어야 합니다. 즉, 사용자가 요구하는 동작을 기계어로 직접 변환하여 실행할 수 없다는 의미입니다. (이걸 하도록 하는 게 요즘 유행하는 AI입니다. 그만큼 어렵다는 얘기죠).

 

이를 프로그램으로 구현하려면 불의 상태를 표현할 수 있는 데이터가 필요합니다. 이 경우, "불이 켜져 있다"와 "불이 꺼져 있다" 두 가지 상태를 나타내는 논리값인 boolean 값을 사용할 수 있습니다.

 

따라서 "불을 켠다"라는 행위는 boolean 값이 false인 상태에서 true로 변경되는 것이며, "불을 끈다"라는 행위는 boolean 값이 true인 상태에서 false로 변경되는 것입니다.

 

이러한 상황에서 우리는 "불을 켜고 끄기"라는 사용자의 요구사항을 데이터의 관점에서 생각하고, 이를 처리할 수 있는 프로그램을 작성해야 합니다. 따라서 boolean 값을 활용하여 다음과 같은 함수를 작성할 수 있습니다.

 

let isLight = false;  // 불이 꺼져 있는 상태

const turnOnLight = () => {
  isLight = true;
};

const turnOffLight = () => {
  isLight = false;
};

 

위의 함수를 실행하면, "불을 켜다"라는 요구사항을 처리할 때 turnOnLight() 함수를 실행하여 boolean 값이 false인 isLight 변수를 true로 변경합니다. 반대로 "불을 끄다"라는 요구사항을 처리할 때에는 turnOffLight() 함수를 실행하여 boolean 값이 true인 isLight 변수를 false로 변경합니다.

 

이렇게 문제를 데이터의 관점에서 인식하고 처리하는 것이 바로 컴퓨터적인 사고의 시작입니다.

 

컴퓨터적 사고가 중요한 이유!

우리는 코딩을 배울 때에는 이렇게 데이터 관점으로 인식하는 과정을 보통 직관적으로 그냥 이해를 하고 넘어가기 때문에, 어디까지가 컴퓨터적인 사고이고 어디까지가 요구사항의 경계인지를 잘 모르곤 합니다. 이를 분명히 의식적으로 인지를 하다면 조금 더 컴퓨터적으로 사고를 하는 것을 연습을 할 수 있게 됩니다.

 

따라서 우리는 프로그램을 작성하기 전에 먼저 문제를 데이터의 관점에서 인식하고 처리하는 것이 중요하다는 것을 인지해야 합니다. 이렇게 의식적으로 인식하고 있다면 어떤 데이터를 어떤 방식으로 처리해야 하는지를 생각하며 코드를 작성할 수 있게 됩니다. 이를 통해 보다 효율적이고 정확한 코드를 작성할 수 있을 뿐만 아니라, 컴퓨터적인 사고를 연습하면서 더 나은 프로그래머가 될 수 있습니다.

 

Todo를 통해서 한 번 더 생각해 보자

입문 최고의 교보재인 Todo 애플리케이션으로 조금 더 심화된 예시를 한번 생각해 봅시다.

 

요구사항:
1. Todo 애플리케이션에서는 할 일을 추가하고 체크를 하거나 삭제할 수 있는 기능이 있습니다.
2. 그리고 이러한 일들은 일정 목록에 저장되어 있습니다.
3. 사용자가 완료한 일만 볼 수 있는 기능을 추가하려고 합니다.

 

단순한 전등의 불 켜기/끄기와 달리 할 일을 추가하고 삭제하고 목록화하기 위해서는 새로운 형태의 데이터 구조가 필요합니다. 우리는 이렇게 목록화하고 추가/삭제가 가능한 데이터 구조를Array라고 배웠기에 이러한 데이터 구조를 통해 할 일 목록을 표현할 수 있습니다.

 

또한 체크를 하거나라는 요구사항을 표현하기 위해서 할 일에 새로운 상태인 completed를 추가해서 체크를 하거나= 완료를 했는지 아닌지라는 데이터로 표현을 할 수 있습니다.

 

그래서 이를 토대로 다음과 같은 형태의 데이터 구조를 생각해 볼 수 있습니다.

const todoList = [
  {
    id: 1,
    title: "코드 공부하기",
    completed: false,
  },
  {
    id: 2,
    title: "운동하기",
    completed: true,
  },
  {
    id: 3,
    title: "청소하기",
    completed: false,
  },
];

 

이 데이터 구조를 기반으로 3번째 요구사항인 "3. 완료한 일만 볼 수 있는 기능"을 한번 생각해 봅시다. 이를 위해서는 completed 속성이 true인 todo 아이템들만 골라내면 됩니다. 이를 위해 filter 함수를 사용할 수 있습니다.

 

const completedTodos = todoList.filter(todo => todo.completed === true);

 

위 코드는 todoList 배열에서 completed 속성이 true인 todo 아이템들만 골라내어 새로운 배열 completedTodos에 저장합니다.

이렇게 데이터 구조를 활용하여 사용자 요구사항에 맞는 데이터를 찾아내는 것이 바로 프로그래밍의 핵심입니다.

 

프로그래밍을 조금 배웠다면 얼핏 당연해 보이는 이러한 구현을 이렇게나 다시 설명을 하는 것은 이러한 것을 인식하지 않으면 그냥 직관에 의존하며 개발을 하게 되는데, 이러한 관점과 세계를 인지하고 의식적으로 생각하려고 노력한다면 직관력도 키울 수 있고 본질적인 개발 능력을 키우는 데 큰 도움이 됩니다.

 

데이터 구조를 활용하기 = 알고리즘 그리고 함수

앞선 예제에서 우리는 완료한 일만 볼 수 있는 기능을 만들기 위해서 Array라고 하는 데이터 구조에서 filter라고 하는 함수를 통해서 조건에 맞는 결괏값만 추려내어 새로운 데이터를 찾아내는 것을 해보았습니다. 이렇게 데이터 구조를 활용하여 원하는 결과를 도출하는 과정을 알고리즘이라고 합니다.

 

위에서 사용한 filter 함수는 배열을 입력받아 주어진 조건에 해당하는 요소만을 걸러내어 새로운 배열을 반환하는 알고리즘입니다. filter는 실제로는 아래와 같은 과정(=알고리즘)을 가지고 있습니다.

 

function filter(array, predicate) {
  const result = [];
  for (let i = 0; i < array.length; i++) {
    if (predicate(array[i])) {
      result.push(array[i]);
    }
  }
  return result;
}

 

이렇게 한 번 만들어진 filter() 함수는 이제 매번 동일한 과정을 반복적으로 구현할 필요 없이, 다른 곳에서 필요할 때 재사용할 수 있습니다.

이를 통해 우리는 필요한 데이터를 추출하는 과정을 *추상화할 수 있게 되었습니다.

 

컴퓨터 과학에서 추상화란 무엇일까요?

프로그래밍에서 추상화는 세부 사항을 숨기고 필요한 부분만 노출시키는 과정입니다. 예를 들어, 우리는 자동차를 타고 운전을 할 때 모터나 엔진의 내부 동작과 같은 세부적인 부분을 알 필요가 없습니다. 대신, 운전할 때 필요한 인터페이스인 핸들, 악셀, 브레이크 등을 조작하면 되는 것입니다. 이렇게 세부적인 부분을 추상화하여 필요한 부분만 사용자에게 노출시키는 것이 추상화의 핵심 원칙입니다. [출처: ChatGPT]

 

위에서 작성한 filter 함수의 본질은 ‘조건에 맞는 요소만 걸러낸다’입니다. 이를 구현하기 위한 반복과정과 Array에 값을 넣는 세부과정은 외부에 노출을 할 필요가 없습니다. 추상화라는 관점에서 다시 한번 filter 함수를 다시 살펴보세요.

 

function filter(array, predicate) { // filter라는 동작과 Array와 조건만 있으면 된다.
  const result = []; 
  for (let i = 0; i < array.length; i++) { // <- 반복하는 과정과
    if (predicate(array[i])) { 
      result.push(array[i]); // <- Array에 값은 넣어주는 세부과정은 알 필요가 없다.
    }
  }
  return result;
}

 

이렇게 데이터의 구조와 알고리즘을 알고 있으면 조금 더 추상화된 형태로 데이터를 다룰 수 있게 되고 더 간결하고 쉬운 형태로 데이터를 다룰 수 있게 됩니다.

 

// 완료된 할일 목록(추상화 O)
const completedTodos = todoList.filter(todo => todo.completed === true);


// 완료된 할일 목록(추상화 X)
const completedTodos = []
for (let i = 0; i < todoList.length; i++) {
  if (todo.completed === true) {
    completedTodos.push(todoList[i]);
  }
}

 

이렇게 요구사항을 더 나은 데이터의 구조와 추상화된 알고리즘을 통해서 생각하는 것 역시 컴퓨터적으로 사고를 하는 중요한 개념입니다. 데이터의 관점으로 사고하는 것이 컴퓨터적 사고의 출발이었다면 그다음은 추상화라고 하는 개념을 이해하고 잘 활용하는 것이 그다음 과정이라고 할 수 있습니다.

 

변수, 타입, 조건, 반복, 함수 - 프로그래밍의 핵심 요소

컴퓨터가 효과적으로 수행하기 위해서는 사용자의 요구사항을 데이터의 관점에서 이해하고, 데이터를 컴퓨터가 이해할 수 있는 형태로 표현해야 합니다. 그리고 이를 위해 데이터의 구조알고리즘을 기술해야 한다고 알아보았습니다. 이렇게 컴퓨터가 이해할 수 있도록 표현하는 언어를 프로그래밍 언어라고 부릅니다.

 

지금껏 컴퓨터가 발전하면서 많은 프로그래밍 언어와 도구들이 생겨났지만, 프로그래밍의 본질은 크게 달라지지 않았습니다. 여전히 변수, 타입, 조건, 반복, 함수의 기본 개념을 사용하여 데이터를 컴퓨터가 이해할 수 있는 형태로 표현합니다.

 

변수는 값을 저장하는 공간이며, 타입은 변수가 저장할 수 있는 값의 종류를 결정합니다. 조건문은 주어진 조건에 따라 프로그램이 다르게 동작하도록 하는 것이며, 반복문은 반복적으로 실행되는 코드를 간단하게 작성할 수 있도록 해줍니다. 함수는 코드의 재사용성을 높여주는 중요한 개념으로, 입력값을 받아 출력값을 반환하는 기능을 합니다.

 

종합해 보면, 컴퓨터적 사고란 사용자의 요구사항을 데이터의 관점에서 바라보고, 변수, 타입, 조건, 반복, 함수 등을 이용하여 데이터를 컴퓨터가 이해할 수 있는 형태로 표현하는 과정이라는 것을 이해하여, 결국 인간의 관점에서 기술된 내용들을 컴퓨터가 이해할 수 있는 형태로 바꾸어 생각하는 것이 컴퓨터적 사고력을 키우는 중요한 과정이라고 할 수 있습니다.

 

이걸 검증(훈련) 하고자 하는 것이 바로 코딩 테스트!

지금까지의 얘기를 듣다 보면 아마 여러분들도 코딩 테스트를 떠올렸을 거라고 생각합니다. 코딩 테스트의 문제들은 이러한 컴퓨터적 사고력을 훈련하고 검증하는 역할을 합니다.

 

생각해 보면 코딩 테스트들의 문제들은 특정 언어나 라이브러리 등에 종속되지 않는다는 것을 알 수 있습니다. 왜냐하면 코딩 테스트의 목적이 실무능력의 평가가 아니라 데이터를 다루는 방법, 즉 컴퓨터적인 사고에 대한 평가를 하기 위함이기 때문입니다. 코딩 테스트는 데이터의 구조와 알고리즘을 이해하고, 주어진 문제를 해결하기 위한 적절한 방법을 고민하는 능력을 요구합니다. 이러한 능력들은 컴퓨터적 사고력을 향상시키는 데 매우 중요합니다.

 

컴퓨터적으로 사고하기, 어떻게 하면 잘할 수 있을까?

우선 지금까지 배웠던 내용들은 한번 정리해 보겠습니다.

 

  1. 컴퓨터적인 사고란 사람의 언어로 작성된 요구사항을 컴퓨터가 이해할 수 있는 형태로 바꾸어 문제를 재정의하고 답을 찾는 과정이다.
  2. 컴퓨터는 숫자로 이루어져 있기 때문에 데이터의 관점에서만 이해할 수 있으며 데이터는 구조를 가지고 있어 추상화된 알고리즘을 활용할 수 있습니다.
  3. 이를 위해 변수, 타입, 조건, 반복, 함수 등을 통해 데이터의 구조와 알고리즘을 기술할 수 있습니다.
  4. 종합하면 컴퓨터적 사고는 요구사항을 데이터의 관점으로 이해하고 적절한 구조와 알고리즘을 선택하고 연결하여, 변수, 타입, 조건, 반복, 함수로 생각하여 표현하는 것을 의미한다.

 

하지만 무엇보다 중요한 것은 위와 같은 개념을 이해한 채로 의식적으로 사고와 훈련을 하는 것입니다. '하다 보면 늘겠지.'라는 생각으로 열심히 코딩을 하면 어느 정도까지는 직관력에 의해 잘 되는 부분도 있겠지만 한계에 부딪히면 성장이 더뎌질 수가 있습니다.

 

[중요!] 의식적으로 훈련하기

컴퓨팅 사고 개발 공부법

 

중요한 얘기라서 반복해서 강조하지만, 가장 중요한 것은 ‘의식적으로’ 컴퓨터적 사고를 훈련하는 것입니다.무작정 코드를 두드리면서 run & fix를 반복하면서 생각하지 않고 직관에 의존하지 마세요. 의식적으로 생각하는 연습을 하다 보면 실무 실전에서는 자연스럽게 직관에 맡기더라도 자연스럽게 컴퓨터적인 사고가 발동하여 좋은 코드를 작성할 수 있게 됩니다.

 

들어보면 뻔한 얘기일 수 있지만, 무엇을 어떻게 연습을 해보면 좋을지 적어 보았습니다. 막연히 알고 있는 것보다는 잘 정리된 문장으로 읽어보면 훨씬 더 머릿속에서 선명해지는 효과가 있습니다.

 

첫째, 요구사항을 받았을 때 그 요구사항을 데이터의 관점에서 나눠서 적어보는 훈련을 해보세요. 이를 통해 요구사항이 어떤 데이터를 다루는지 파악하고, 데이터를 어떻게 다룰지에 대한 방향성을 정할 수 있습니다.

 

둘째, 데이터의 구조를 먼저 기술하고 생각해 보는 연습을 해보세요. 변수, 타입, 조건, 반복, 함수 등을 활용하여 데이터의 구조와 알고리즘을 기술하는 방법을 익혀보세요. 이를 통해 추상적인 개념을 구체적인 코드로 표현하는 능력을 기를 수 있습니다.

 

셋째, 적절한 알고리즘을 선택하는 연습을 해보세요. 주어진 문제에 따라서 어떤 알고리즘이 적합한지를 판단하는 능력을 기를 수 있습니다. 이를 위해서는 많은 문제를 풀어보고 다양한 알고리즘을 경험해 보는 것이 중요합니다.

 

넷째, 기존 데이터의 구조와 알고리즘을 연결하여 새로운 데이터를 도출하는 연습을 해보세요. 이를 통해 데이터를 어떻게 다룰지에 대한 방법과 알고리즘을 어떻게 적용할지를 연결하는 능력을 기를 수 있습니다.

 

이러한 방법을 통해 의식적으로 컴퓨터적 사고를 훈련하면서, 직관에 맡기는 것이 아니라 데이터의 관점에서 문제를 접근할 수 있게 됩니다. 이를 통해 나중에는 훈련된 컴퓨터적인 사고를 통해서 직관적으로 좋은 코드를 작성할 수 있고, 성장하는 프로그래머가 될 수 있습니다.

 

못다 한 이야기들...

컴퓨팅 사고에 대해서는 제가 설명한 ‘데이터의 관점에서 바라보기’ 외에도 여러 가지 키워드들이 존재합니다. 문제 해결, 알고리즘, 자료구조, 추상화, 모델링, 시뮬레이션, 패턴인식, 디버깅, 디자인 패턴, 애자일 개발 방법론 등 여러 가지 사람들의 요구사항을 컴퓨터의 관점에서 이해할 수 있도록 알게 해주는 지식들이 존재합니다. 특정 언어와 도구를 넘어서는 프로그래밍의 본질을 계속 공부를 해보시는 것을 추천드립니다.

 

그중에서도 저는 "데이터의 보관과 전파", "더 나은 구조 생각하기", "협업"이라는 관점을 가지고 추가적인 이야기들을 다음 글에서 이어 나가보려고 합니다. 다음 글을 기대해 주세요.

 

코딩 테스트와 실무의 차이점

그렇다고 컴퓨터적인 사고를 훈련하기 위해서 코딩 테스트를 중심으로 연습하는 것은 추천하지 않습니다. 코딩 테스트는 사실 평가를 위한 도구이기에 시간적인 제약사항이 있습니다. 그래서 보통 특정한 알고리즘과 자료구조 등을 활용하여 문제를 해결하는 능력을 평가하기 위한 문제 위주로 만들어지게 됩니다.

 

반면에 실무에서는 문제를 해결하기 위해 다양한 요소들을 고려해야 합니다. 단순한 컴퓨터적인 사고뿐만 아니라 언어의 특성과 주요한 기능을 연결하고 디자인을 고려하고 일정과 협업, 보안, 유지 보수 등 다양한 것들을 고려해야 합니다.

 

그렇기 때문에 실제 개발 실력을 늘리고 싶다면 학습도 중요하고, 컴퓨터적 사고를 의식적으로 생각하는 것도 중요하고 코딩 테스트를 열심히 공부하는 것도 좋겠지만, 결국은 실전처럼 공부하는 것을 가장 추천합니다.그래서 다음번 글에서는 어떻게 개발 공부를 하면 좋은지에 대해서 이야기를 해보려고 합니다.


2. 개발, 학습 말고 훈련하기

글 서두에서 설명했듯이 개발은 운동과도 같기에 학습 외에도 많이 하는 것이 중요하지만, 어느 정도 검증된 훈련 방법이 있다면 조금 더 효율적으로 성장할 수 있습니다.

 

그중에서 개인적으로 제가 제일 효과적으로 성장을 경험했던 "남의 코드를 베껴와 일단 돌아가는 코드로 합치는 훈련 방법"을 알려드리려고 합니다.

 

본인이 이미 알고 있는 방법과 크게 다르지 않을 수도 있습니다. 원래 정석은 크게 달라지지 않는 법입니다.

 

이 외에도 대부분의 좋은 개발 학습방법의 큰 골자는 사실 크게 다르지 않습니다. 일단 먼저 만들어봐라. 다 배우고 난 다음에 하려고 하지 마라. 책으로 공부하지 마라. 공식 문서를 봐라 등등 언제나 지름길은 없는 법이고 남들이 아무도 모르는 그런 감춰진 꿀팁 같은 건 존재하지 않습니다.

 

저 역시 뭔가 특별한 것을 말하지는 않을 것이고 특별한 것을 기대하지 마세요. 다만 이 글을 보고 나서 나도 이렇게 해봐야겠다!라는 동기부여만 생긴다면 만족합니다.

 

만들고 싶은 목표부터 정하자!

컴퓨팅 사고 개발 공부법

 

내가 만들고 싶은 것들을 하나 목표를 정하시는 게 좋습니다. 목표가 없이 단순히 개발 공부를 하는 것은 큰 효과도 의미도 없다고 생각합니다. 다시 말하지만 개발은 학문이 아닙니다. 무언가 유용하거나 재미있거나 하는 가치를 기술을 통해서 만들어내는 것이기에 만들지 않으면 아무런 의미가 없습니다. 그래서 개발은 결과를 만들고자 하는 것에 집중을 해야 합니다. 그러기 위해서는 내가 지금 필요하거나 재밌다거나 만들어 보고 싶은 것들을 생각해서 만드는 것이라고 생각을 합니다.

 

개발자가 되고 싶다는 생각 이면에는 반드시 "무언가를 만들어보고 싶다!"라는 생각이 있었을 거라고 생각을 합니다. 만약 무엇을 만들어야 할지 잘 모르겠다면 지금 공부하고 있는 책에 있는 예제라도 일단 만들겠다는 목표를 먼저 정해 보세요!

 

일단 돌아가는 남의 코드를 가져오자!

목표를 정했다면 그다음으로 해야 할 것은 그것을 만들기 위해서 가장 유사한 코드를 찾는 일입니다. 일부만이라도 내가 필요했던 기능이 있는 코드라면 무엇이든 좋습니다. 그리고 그 코드를 그대로 가져와서 어떻게든 내 환경에서 돌아가게 하세요. 한 번에 바로 실행되어도 좋고 뭔가 잘되지 않는다면 눈에 보이는 에러들을 구글에도 좋고 ChatGPT에도 좋으니 입력해서 어떻게든 돌아가게 해 보세요.

 

코드를 돌아가게 하기 위해서 그 코드들을 분석하고 할 필요는 없습니다. 그 코드를 어쨌든 간에 일단 돌아가게 하는 것이 제일 중요합니다.

 

컴퓨팅 사고 개발 공부법

 

수정해서 내 것으로 만들자!

어떻게든 돌아가게 만들었다면 이제 내가 원하는 형태로의 커스텀을 시도합시다. 우리가 공부했듯이 컴퓨터는 숫자로 돌아갑니다. 그 말은 그 숫자를 바꾸기만 해도 뭔가 바뀐다는 것입니다. 눈에 보이는 숫자들, 혹은 문자들을 바꿔가면서 그 변화를 느껴보세요. 그러면 자연스럽게 이 부분을 바꾸면 이렇게 되는구나라고 느끼면서 그 코드의 일부나마 맥락을 이해할 수 있게 됩니다.

 

도저히 어디를 바꿔야 하는지 감이 안 온다면 인근에 있는 코드를 중심으로 검색하면서 공부를 시작하세요. 사람은 목적이 있을 때와 목적이 없을 때는 사고하는 뇌 구조가 다릅니다. 그렇기에 내가 특정한 목적이 있을 때 공부했던 것들은 정말로 빠르게 내 지식이 됩니다.

 

'그런 부분들만 골라내서 일부만 학습을 하는 게 효과가 있는지 모르겠다. 나는 처음부터 다 알고 놓치는 것 없이 깊이 알고 싶다. 그래야만 다음으로 넘어갈 수 있다.'라고 하는 문제의 유혹에 빠지지 마세요. 띄엄띄엄 공부하는 것은 전혀 아무런 문제가 되지 않습니다. 오히려 한 번에 다 이해를 해야만 넘어가겠다고 하는 생각 자체가 개발 실력을 키우는 데 굉장히 큰 방해 요소가 됩니다.

 

바퀴를 다시 발명하지 마라! - 추상화를 기억하자.

프로그래밍에게 정말 유명한 격언입니다. 이미 만들어진 것을 다시 만들려고 하지 말고 재사용해서 새로운 것, 더 나은 것을 만들어내는 문화야말로 개발문화의 꽃인 공유 문화입니다.

 

추상화란 복잡한 세부내용을 숨기고 필요한 것만 노출하는 것으로 개발에서는 아주 중요한 개념입니다. 남이 만들어 낸 것을 하나하나 다 이해해서 내가 다시 만들려고 하지 말고 필요한 것만 이해하고 사용해서 더 나은 것을 만들고 기여하세요.

컴퓨팅 사고 개발 공부법

 

궁극적으로 개발자라는 직업은 남이 만들어 놓은 코드에서 필요한 부분만 수정해서 내가 원하는 것을 만들어 공유하고 그걸 통해서 또 다른 사람이 더 새로운 것들을 만들어내는 직업입니다. 그렇기 때문에 이 연습대로 훈련을 하시는 것이 가장 개발을 빨리 늘릴 수 있는 본질적인 방법인 거죠. 그리고 이건 절대로 쉽지 않습니다.

 

그리고 결합하라!

컴퓨팅 사고 개발 공부법

 

내가 원하는 코드가 100% 존재할 수는 없습니다. 이미 그러한 코드가 있다면 내 아이디어의 가치는 이미 누군가가 실현을 하고 있다는 이야기일 테고 바퀴는 재발명을 하는 것이 아니니 그것을 똑같이 만들고 있는 것은 좋은 개발자라고 할 수 없습니다.

 

비록 내 코드가 프랑켄슈타인이 될지언정 이렇게 저렇게 조립을 해서 만들어서 내가 만들고자 하는 가치를 만들어내 보는 연습을 해보세요.

 

컴퓨팅 사고 개발 공부법

 

두 개를 다른 코드를 결합하는 코드를 결합하는 작업은 절대로 쉽지 않습니다. 그리고 이 과정에서 무수한 에러들을 만나게 되실 거예요. 그리고 이 결합을 배우는 과정에서 굉장히 많은 것들을 배울 수가 있어요.

 

대부분의 문제 해결과 대부분의 어떤 문제 상황들은 이 결합하는 과정에서 발생하고 그렇기에 이 과정에서 성장하게 됩니다. 이렇게 부분적으로 결합을 하는 과정에서 배우게 되는 지식이 정말 참 지식입니다. (사실 깨지고 부딪히고 힘들 때 얻은 지식이라서 오래 기억에 남는 것일 수도...)

 

끊임없이 반복하고 완성하자!

사실 이미 여러분들은 이렇게 공부를 하고 있을 거라고 생각합니다. 중요한 것은 꺾이지 않는 마음이죠. 내 코드가 다른 데서 봤던 코드들 위에서 위태위태하게 서 있을지라도 이렇게 조금씩 조금씩 쌓아 올라가다 보면 자연스럽게 안정적인 코드를 작성하고 있을 거예요.

 

그리고 한번 위험에 처해봐야 "아... 내가 다시 이렇게 코딩하면 사람이 아니다.."라면서 느끼는 바가 많을수록 더 크게 성장할 거라고 생각을 합니다.

 

컴퓨팅 사고 개발 공부법

 

무엇보다 이 과정에서도 역시 중요한 역시 의식적으로 컴퓨터적으로 사고하고자 하는 생각들입니다. 우선 어떻게든 돌아가도록 하게 만들라고 하는 것과 의식적으로 생각하라고 하는 것들이 일순 모순되어 보이겠지만... 어쩌겠습니까? 이것이 가장 빠르게 개발 공부가 되는 방법인걸요.

 

“일단 뭐든 만들어 봐! 생각은 좀 하면서...”


끝으로...

고리타분한 소리를 하자면 뭐든 잘하고자 하면 꾸준히 연습을 하는 것이 가장 중요합니다. 개발 역시 마찬가지겠죠. 그 어떤 방법을 제시한들 꾸준히 열심히 하지 않고 한 번에 개발 실력을 더 낫게 만들어 주는 방법은 없다고 생각을 합니다. 그렇지만 적어도 이 글이 조금 더 효율적이고 막연하지 않고 선명한 비전을 그려 줄 수는 있을 거라고 생각합니다.

 

개발을 잘하기 위해서는 컴퓨터적인 사고가 필요합니다. 컴퓨터적인 사고는 인간의 문제를 컴퓨터가 효과적으로 수행하기 위해 컴퓨터의 관점으로 문제를 재정의하고 답을 찾는 사고과정입니다. 컴퓨터는 0과 1의 숫자의 세상에 살고 있기 때문에 컴퓨터의 관점으로 바라본다는 것은 곧 데이터의 관점으로 세상을 인식하는 것입니다. 데이터의 세상에서 다시 구축한 요구사항을 변수, 타입, 조건, 반복, 함수로 표현하는 것이 컴퓨터적으로 사고하는 핵심이자 출발점입니다.

 

개발은 학문의 영역이 아니기에 단순히 이 사실을 알고 있는 것이 중요한 것이 아니라 의식적으로 훈련을 하는 것이 중요합니다. 그렇기에 요구사항을 데이터의 관점으로 인식하면서 이름을 붙이고 타입을 생각하고 구조를 먼저 생각하는 훈련을 해보는 것을 추천합니다. 그렇게 연습을 하다 보면 나중에는 자동으로 그리고 직관적으로 컴퓨터적인 사고를 할 수 있게 될 것입니다.

 

이러한 생각을 바탕으로 하되 언제나 실습을 통해 개발 훈련을 하시기를 바랍니다. 개발은 기술을 통해서 무언가를 만들어내는 작업이기에 만들기 않고 공부만 하는 것은 아무런 도움이 되지 않습니다.

 

뿐만 아니라 개발은 기존에 만들어 놓은 것을 다시 만드는 직업이 아닙니다. 바퀴는 재발명하는 것이 아닙니다. 그렇기에 늘 새로운 것을 목표로 남의 코드에서 필요한 것들만 수정해서 결합해서 내 것을 만들어 내는 방식을 바탕으로 개발적인 성장을 해 나가시기 바랍니다.

 

진리는 뻔하고 단순하지만 명쾌합니다. 이 글이 새로운 인사이트가 되지는 않을지언정 "그래! 나도 이렇게 일단 한번 해보자!" 하는 마음을 가지고 당장은 이게 맞는 공부법이라고 믿고 한번 해보시길 바랍니다. 화이팅입니다!

 

<원문>

컴퓨팅 사고와 개발 실력 늘리는 공부법

 

요즘IT의 모든 콘텐츠는 저작권법의 보호를 받는 바, 무단 전재와 복사, 배포 등을 금합니다.

좋아요

댓글

공유

공유

댓글 7
dhdbtkd
            글을 참 잘쓰시네요. 인상적이에요
          
2024.01.18. 오후 15:34
시니어 웹 프론트엔드 개발자입니다.
129
명 알림 받는 중

작가 홈

시니어 웹 프론트엔드 개발자입니다.
129
명 알림 받는 중
Svelte를 좋아하는 시니어 프론트엔드 개발자입니다. 카카오엔터프라이즈에서 프론트엔드를 통해 종합 업무 플랫폼을 만드는 것을 함께하고 있습니다. 개인적으로 Svelte+Rx 상태관리 라이브러리 Adorable과 Vite기반의 Rapid on-demand Atomic CSS 프레임워크인 AdorableCSS를 개발하고 있습니다.

좋아요

댓글

스크랩

공유

공유

지금 회원가입하고,
요즘IT가 PICK한 뉴스레터를 받아보세요!

회원가입하기
요즘IT의 멤버가 되어주세요! 요즘IT의 멤버가 되어주세요!
요즘IT의 멤버가 되어주세요!
모든 콘텐츠를 편하게 보고 스크랩해요.
모든 콘텐츠를 편하게 보고 스크랩 하기
매주 PICK한 콘텐츠를 뉴스레터로 받아요.
매주 PICK한 콘텐츠를 뉴스레터로 받기
로그인하고 무료로 사용하기