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

teo.yu·2023년 3월 26일
568

테오의 프론트엔드

목록 보기
38/44
post-thumbnail

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

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

프롤로그

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

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

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

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

축구 교재를 열심히 보고, 축구 교육 영상과 축구 경기를 열심히 보지만 내가 실제로 공을 차지 않으면 당연히 실력이 늘 수가 없습니다. 마찬가지로 처음 성장에서는 공부보다도 실제로 몇 번이라도 하는 것이 훨씬 더 실력 향상에 도움이 됩니다.

또한 한 번에 많은 것을 배운다고 해도 꾸준히 하지 않으면 실력이 단번에 늘지 않습니다. 운동처럼 내가 한번에 성장할 수 있는 성장폭에는 한계가 있기 때문에 꾸준히 하는 것이 중요합니다.

그렇다고 무조건 실전만 하는 것은 좋지 않습니다. 시간을 효율적으로 사용할 수 없으며 안 좋은 습관이나 형태가 만들어질 수 있기 때문에 공부와 훈련을 적절히 병행하는 것이 굉장히 중요하다고 생각을 합니다. 그렇지만 처음에는 실전의 비중 - 일단 하는 것 - 이 훨씬 더 중요합니다.

이후 일정 궤도에 올라가면 반복적인 연습뿐만 아니라 많은 경험과 시야가 굉장히 중요해집니다. 새롭고 다양한 경험과 학습을 하는 것이 굉장히 중요해집니다.

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

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

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

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

우리가 보통 개발을 잘한다라고 하는 사람에게는 그가 하고 있는 언어나 생태계에서 잘한다는 것과는 또 다른 잣대가 존재하는 것 같습니다. 잘하는 개발자는 뭘 해도 다 개발을 잘한다는 것을 우리는 잘 압니다.

개발 실력을 늘리고 잘 하기 위해서는 도구의 숙련도 외에 개발의 본질에 대해서도 이해를 하고 잘 하는 것이 필요합니다.

React나 Svelte, 혹은 Javascript나 Typescript와 같은 언어들을 학습하고 잘하는 것은 특정 도구의 숙련도를 높이는 것이지만 개발을 잘한다고 하는 것은 그와는 다른 본질적인 부분이 있다고 생각합니다.

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

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

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

이 글에서는 크게 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의 숫자의 세상에 살고 있기 때문에 컴퓨터의 관점으로 바라본다는 것은 곧 데이터의 관점으로 세상을 인식하는 것입니다. 데이터의 세상에서 다시 구축한 요구사항을 변수, 타입, 조건, 반복, 함수로 표현하는것이 컴퓨터적으로 사고하는 핵심이자 출발점입니다.

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

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

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

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

화이팅입니다!

profile
AdorableCSS를 개발하고 있는 시니어 프론트엔드 개발자입니다. 궁금한 점이 있다면 아래 홈페이지 버튼을 클릭해서 언제든지 오픈채팅에 글 남겨주시면 즐겁게 답변드리고 있습니다.

47개의 댓글

comment-user-thumbnail
2023년 3월 26일

되게 글 자체에 많은 인사이트와 고민이 담겨있네요!! 좋은글 감사해요 테오!!!

1개의 답글
comment-user-thumbnail
2023년 3월 26일

일반적인 내용도 테오님이 정리해주시는 글로 읽으면 훨씬 많은 것이 와닿는 것 같아요!! 좋은 글 감사합니다 :)

1개의 답글
comment-user-thumbnail
2023년 3월 27일

항상 좋은 글 감사합니다.

1개의 답글

매번 인사이트를 주셔서 감사합니다 테오
누군가 개발을 시작하겠다고 한다면 꼭 얘기하고 싶은 내용이네요 :)
'개발은 학문이 아니고 운동과도 같은 것이다'라는 말 인용해도 될까요? ㅎㅎ

1개의 답글
comment-user-thumbnail
2023년 3월 27일

테오 정성스러운 이번 글도 너무 감사드립니다 :)

1개의 답글
comment-user-thumbnail
2023년 3월 28일

좋은 내용 뿐만아니라 재미있어서 술술 읽히네요! 잘보고 갑니다!

1개의 답글
comment-user-thumbnail
2023년 3월 28일

좋은 글 감사합니다 !!
'어떻게' 공부해야 하는지에 대한 방법을 얻은 것 같습니다.✨

1개의 답글
comment-user-thumbnail
2023년 3월 28일

학습하는 양반식 공부 방법보다 상놈식개발로 훈련하는 방법으로 공부해왔었는데 테오가 정리해주니까 더 와닿는것 같아요 감사합니당:)

1개의 답글
comment-user-thumbnail
2023년 3월 30일

요즘 이 부분에 대해 고민이 많았는데, 마침 포스팅을 해주시다니....
좋은 글 너무 감사합니다!!

1개의 답글
comment-user-thumbnail
2023년 3월 30일

잘읽었습니다 .. !

1개의 답글
comment-user-thumbnail
2023년 3월 30일

클릭하지 않을 수 없는 제목이었습니다.
좋은 글 정말 감사해요!! 여러번 정독하려 합니다. :)

1개의 답글
comment-user-thumbnail
2023년 3월 31일

재밌게 잘 읽었습니다! 의식적인 훈련 가즈아!!

1개의 답글
comment-user-thumbnail
2023년 4월 1일

좋은 글 잘 읽었습니다! 짜깁기도 훌륭한 훈련 방법이 될 수 있군요

1개의 답글
comment-user-thumbnail
2023년 4월 1일

귀한 시간 내어, 이런 귀한 정보와 인사이트를 공유해 주셔서 진심으로 또 진심으로 감사드립니다!
행복한 일들만 가득하시길 바랄게요!

1개의 답글
comment-user-thumbnail
2023년 4월 2일

띄엄 띄엄 공부하는 것은 전혀 아무런 문제가 되지 않습니다. 오히려 한 번에 다 이해를 해야만 넘어가겠다고 하는 생각 자체가 개발개발 실력을 키우는 데 굉장히 큰 방해 요소가 됩니다.

위의 문장이 이제껏 공부하면서 항상 의구심이 들었던 부분에 대해 명쾌한 답변이 되었습니다.
끝까지 좋은 글 잘 읽었습니다.
감사합니다.

1개의 답글
comment-user-thumbnail
알 수 없음
2023년 4월 3일
수정삭제

삭제된 댓글입니다.

1개의 답글
comment-user-thumbnail
2023년 4월 3일

너무재밌어서 술술 읽혔어요 많은 인사이트 얻고갑니다 감사해요..!

1개의 답글
comment-user-thumbnail
2023년 4월 4일

이런 글을 찾고 있었어요! 감사합니다.

1개의 답글
comment-user-thumbnail
2023년 4월 7일

감사합니다

1개의 답글
comment-user-thumbnail
2023년 6월 2일

개발자 취업을 준비하면서 알고리즘 문제 푸는 것, 뭔가 만들어 보는 것의 균형을 잡기가 어렵다고 느꼈는데 큰 도움이 됐어요 :D 어떻게든 돌아가게 만들어보는 과정에서 정말 배우는 게 많은 것 같아요. 좋은 글 감사합니다!

1개의 답글
comment-user-thumbnail
2023년 7월 31일

어떻게 성장할 수 있는지, 구체적으로 코딩실력을 어떻게 키우고 어떤 방향으로 나아가야 할지 고민해볼 수 있었습니다.

1개의 답글
comment-user-thumbnail
2023년 9월 11일

좋은 글 감사합니다. 개발은 역시 즐거운 것 같습니다. 잘 읽었어요 !

1개의 답글
comment-user-thumbnail
2023년 10월 12일

항상 완벽하게 알고 넘어가자는 생각을 갖고 있었는데 공감되는 문구가 많네요.. ㅋㅋㅋㅋ 이제는 모르는 건 잠시 내려두고 다음에 또 보는 식으로 공부해야겠습니다..

1개의 답글
comment-user-thumbnail
2024년 1월 31일

주니어로써 항상 개발을 잘하는 사람들을 보면서 나는 뭐가 문제일까? 고민도 많이했는데 저한테 너무 와닿는 글이네요. 좋은 글 감사합니다 ~!

1개의 답글