초보자가 프로그래밍 학습의 주요 요소를 마스터해야 하는 이유 (The main pillars of learning programming — and why beginners should master them)

SHARE

초등학생들 사이에서도 코딩 교육 열풍이 불 정도로, 요즘 연령대를 막론하고 프로그래을 배우고자 하는 열기가 뜨거워짐을 느끼고 있습니다. 하지만 초보자가 단시간 내에 유명한 웹사이트, SNS, 애플리케이션을 뚝딱 만들어내는 전문가가 되기는 어렵습니다. 독일의 시니어 프로그래머 Rainer Hahnekamp는 아래 글에서 초보자일 수록 기본적인 프로그래밍의 요소들을 마스터하고 끊임없는 연습을 하는 것이 중요하다고 지적합니다. 


[번역] 초보자가 프로그래밍 학습의 주요 요소를 마스터해야 하는 이유 (The main pillars of learning programming — and why beginners should master them)
(원문 : https://medium.freecodecamp.org/the-main-pillars-of-learning-programming-and-why-beginners-should-master-them-e04245c17c56 )

저는 20년 넘게 프로그래머로 일해 왔습니다. 그 동안, 저는 많은 사람들과 일하는 즐거움을 누렸고, 그 사람들에게서 많은 것을 배웠습니다. 또한 대학을 갓 졸업한 학생들을 대상으로 교사나 멘토 역할을 맡기도 했죠.

최근에 저는 완전 생 초보자들에게 코딩을 가르치는 프로그램에 트레이너로 참여했습니다. 사실, 프로그램을 짜는 법을 배우는 것은 쉽지만은 않습니다. 저는 종종 대학 과정과 부트캠프가 프로그램의 중요한 측면을 놓치고 초보자들을 가르치는데 약간 잘못된 접근을 한다는 것을 알았습니다.

저는 성공적인 프로그래밍 과정에서 반드시 갖춰야 한다고 생각하는 다섯가지 기본적인 요소를 공유하고 싶습니다. 언제나 그렇듯이, 주류 웹 응용 프로그램의 맥락을 다루고 있습니다.

프로그래밍 과정 신입생의 목표는 프로그래밍의 기초를 마스터하고 라이브러리 및 프레임워크의 중요성을 이해하는 것입니다. 클라우드, 전반적인 운영 또는 빌드 툴과 같은 고급 주제는 초보자 커리큘럼에 포함되지 않아야 합니다. 이런 맥락에서 소프트웨어 디자인 패턴에 대해서도 회의적입니다. 그들은 초보자들이 결코 해보지 못한 경험을 가정합니다.

새로운 프로그래머들이 어디서부터 시작해야 하는지 살펴 보겠습니다.


테스트 주도 개발 (TDD)

TDD는 많은 이점을 가져다 주지만, 안타깝게도 초보자들이 완전히 준비할 수 없는 어려운 주제입니다.

초보자는 가급적이면 테스트를 작성하면 안됩니다. 이것은 그들의 기본적인 기술 수준에 비해 너무 버거운 것입니다. 대신, 그들은 테스트를 이용하고 작업하는 방법을 배워야 합니다.

각 프로그래밍 과정은 연습 문제 중심으로 진행되어야 합니다. 저는 단위 테스트로 그것을 확장하고 학생들에게  이러한 테스트를 실행할 수 있는 환경을 제공합니다. 학생들이 해야 할 일은 코딩 후 테스터의 불이 빨간 색에서 녹색으로 바뀌는 것을 지켜보는 것입니다. 그 결과로 생기는 게이미피케이션은 ‘좋은’ 부작용입니다.

예를 들어 선택된 기술이 Spring이라면 Spring 프로젝트 내에서 연습과 테스트를 제공합니다. 학생들은 Spring에 대해 아무것도 알 필요가 없습니다. 그들은 테스트의 위치와 테스트 트리거를 위한 버튼에 대해서만 알면 됩니다.

또한 학생들은 디버거를 사용하는 방법을 알아야 하고, REPL(Read-Eval-Print 루프)를 사용할 수 있어야 합니다. TDD에서는 런타임 동안 코드를 분석하고 소규모 테스트를 위한 공간 갖는 기능이 필수적입니다.

핵심 요점은 학생들이 핵심 프로그램 기술을 습득한 후 기본적인 TDD행동을 배우지 않아도 된다는 것입니다. 나중에 학생들이 엔지니어가 돼서 그 습관을 바꾸는 것은 지금 그런 습관을 배우는 것보다 훨씬 더 어려울 것입니다. 그렇기 떄문에 처음부터 살아 숨 쉬는 단위 테스트를 실행해야 합니다.

연차가 쌓인 전문 개발자들은  단위 테스트가 없는 프로젝트에 대해 반감을 가져야 합니다. 그들은 단위 테스트의 부재를 안티 패턴으로 직관적으로 파악해야 합니다.

기본 원리

초보자들은 프레임워크부터 바로 시작해야 한다는 말을 자주 듣곤 합니다. 이것은 사람들을 바로 경주용 스포츠카에 태워서 운전하는 법을 가르치고 과속을 피하라고 하는 것과 같습니다. 이는 단순히 브레이크를 스로틀과 혼동한다는 사실을 무시하는 것입니다.

Angular와 같은 프레임워크로 시작할 때도 마찬가지입니다. 초보자들은 우선 프로그래밍의 기본을 이해할 필요가 있습니다. 다른 사람이 작성한 코드를 사용하기 전에 기본적인 요소와 코드를 작성하는 것이 무엇을 의미하는지 알아야 합니다.

함수, 변수, 조건, 그리고 루프의 개념은 초보자들에게는 완전히 별세계의 것일 수 있습니다. 이 네가지 요소는 프로그래밍의 기초를 이룹니다. 프로그래밍으로 만들어지는 모든 것은 이 네가지 요소에  의존합니다.

학생들은 처음으로 이런 개념을 배우고 있지만, 학생들이 그것에 능숙해 지는 것이 가장 중요합니다.  기초를 제대로 갖추지 못하면, 뒤따르는 모든 것들이 마법처럼 보이고 혼란과 좌절로 이어지게 됩니다.

가르치는 사람들은 이러한 기본 원리를 가르치는 데에 더 많은 시간을 보내야 합니다. 하지만, 안타깝게도, 많은 사람들이 너무 빨리 움직입니다. 문제는 일부 가르치는 사람들이 학생 역할을 하려고 애쓴다는 것입니다. 그들은 오랫동안 프로그래밍을 해왔기 때문에 정작 초보자들이 다루어야 할 문제가 무엇인지 잊어 버렸습니. 마치 전문적인 경주용 드라이버와 상당히 비슷합니다. 그는 누군가가 제동 전에 생각할 필요가 있다는 것을 상상할 수 없습니다. 그냥 자동으로 움직입니다.

저는 보통 위의 네가지 주요 요소를 조합하여 도전적이지만 합리적인 시간 내에 해결할 수 있도록 연습 테스트를 설계합니다. 그 좋은 예는 로마 숫자와 아랍어 숫자 변환기입니다. 이 도전은 학생들의 인내심을 필요로 하죠. 일단 그들이 도전을 해결하기 위해 함수, 변수, 조건, 루프의 요소를  성공적으로 적용하면, 그들은 동기 부여 차원에서도 큰 힘을 얻게 됩니다.

기초를 다지는 것은 무엇보다도 중요합니다. 그들이 문제를 해결할 때까지 움직이지 마세요..

라이브러리 및 프레임워크

초보자들이 코딩을 위해 많은 시간을 소비한 후에는, 대부분의 코드가 이미 라이브러리나 프레임워크의 형태로 존재한다는 것을 배워야 합니다. 이것은 패턴이라기보다는 사고 방식의 한 종류입니다.

저는 이전에 썼던 글에서 요즘 개발자들은 올바른 라이브러리를 알고 선택한다고 밝힌 바 있습니다. 그들은 그들 스스로 버그 버전을 작성하는 데 몇 시간을 소비하지 않습니다.

성공적으로 그러한 사고 방식을 전환하기 위해서는, ‘기본적인 단계’의 예졔들이 Moment.js, Jackson, Lodash또는 Apache Commons와 같은 잘 알려 진 라이브러리를 사용함으로써 해결되어야 합니다.

이런 식으로, 학생들은 라이브러리의 가치를 즉시 이해할 수 있게 됩니다. 그들은 그 복잡한 문제들로 머리를 쥐어짰을 테죠. 이제 그들은 라이브러리가 연습 테스트를 즉시 해결해 준다는 것을 알게 되었습니다.

TDD와 마찬가지로, 학생들은 동료들이 Redux를 불필요하게 만드는 자체 제작 상태 관리 라이브러리에 대해 자랑할 때, 의심을 해볼 수 있게 됩니다.

프레임워크의 경우,  학생들은 라이브러리의 유용성을 이해하면 그 중요성을 이해하는데 아무런 문제가 없습니다.

과정 속 짜여진 일정에 따라 프레임워크에 시간을 할애하기 어려울 수 있습니다. 하지만 제가 이미 지적했듯이, 가장 중요한 것은 학생들의 모든 사고방식을 처음부터 모든 것을 프로그래밍하는 것에서 라이브러리 탐색 및  이용하는 것으로 바꾸는 것입니다.

이 기둥은 숙련된 개발자에게만 사용되기 때문에 나는 이 기둥에 도구를 추가하지 않았습니다. 이 초기 단계에서 학생들은 도구를 통합하고 구성하는 방법을 배울 필요가 없습니다.

전문가 & 견습생

20대 초반에 저는 피아노를 배우고 싶었습니다. 나는 선생님을 원하지 않았고, 혼자서 배울 수 있을 거라 생각했습니다. 5년 후, 나는 결국 전문적인 피아노 레슨 강사와 상담했습니다. 글쎄… 뭐라고 해야 될까요. 저는 5년 전보다 강사에게 배운 한달 동안 더 많은 것을 배웠습니다.

제 피아노 선생님은 제가 연주하는 동안 발생하는 실수를 지적하셨고, 결코 상상하지 못했던 해석적인 것들을 깨닫게 해 주셨습니다. 결국, 그녀는 내게 음악과 예술에 대한 마음가짐을 심어 주었는데, 둘 다 지극히 기술적인 사람이었던 제가 깨닫기 어려웠던 것이었습니다.

로그래밍도 마찬가지입니다. 만약 누군가가 프로그래밍에 경험이 없다면, 독학만으로 그것을 배울 수 있다는 것은 잘못된 생각일 수 있습니다. 비록 독학에 대한 많은 성공적인 사례들이 있지만, 저는 프로그래밍 독학의 효율성에 의문을 제기합니다.

대신에 ‘전문가와 견습생’관계가 있어야 합니다. 처음에 전문가들은 견습생들이 반드시 지켜야 할 규칙을 줍니다. 맹목적으로요! 전문가들은 규칙을 설명할 수도 있지만, 대개 그 추론은 견습생의 이해력 밖에 있기 마련입니다.

이 내재화된 규칙들은 일종의 안전망을 형성합니다. 만약 누군가가 길을 잃게 되면, 그 사람은 항상 돌아올 안전한 장소를 가지고 있는 것과 마찬가지죠.

가르치는 것이 독백이 되어서는 안 됩니다. 전문가는 각각의 학생들을 개별적으로 다루어야 합니다. 그는 학생들이 어떻게 공부하는지 확인하고, 조언을 해 주고, 과정의 속도를 그들의 진도에 맞추어야 합니다.

견습생들이 일정한 수준의 전문가가 되면 새로운 영역을 개척하도록 격려해야 합니다. 전문가는 이때 ‘지혜’를 공유하고 토론할 수 있는 멘토로 진화합니다.

도전과 동기부여

“페이스북을 베껴서 뭔가를 만들자!” 이것은 C레벨 소프트웨어 개발자들과 수백만 유로의 예산이 뒷받침되는 기업 CEO의 말이 아닙니다. 프로그래머들을 위한 입문 과정의 연습입니다. 그러한 사업은 사실상 불가능힙니다. 더 나쁜 것은, 학생들이 무엇이든 할 수 있는 망상의 세계에 갇히고, 그들이 진정으로 그들의 능력을 넘어서는 능력을 가지고 있다고 믿는 착각에 빠진다는 것입니다.

가르치는 이들이 그것을 알고 있다는 것에는 의심의 여지가 없지만, 동기 부여를 위해 그러한 액션들을 만들어 냅니다.

연습의 주된 목표는 즐겁게 그것을 하는 것이 아닙니다. 특정한 기술을 중심으로 만들어져야 하고 학생들이 그 기술을 이해할 수 있도록 도와야 합니다.

동기 부여는 좋지만 콘텐츠를 희생하는 것은 아닙니다. 프로그래밍은 쉽지 않습니다. 학생들이 본질적인 동기를 가지고 있지 않다면, 코딩은 그들이 갈 길이 아닐 수 있습니다.

초보자들은 전문적인 개발자가 된다는 것이 어떤 의미인지 경험해야 합니다. 그들은 많은 시간을 투자하기 전에 무엇이 그들을 기다리고 있는지 알아야 합니다.

예를 들어, 많은 비즈니스 애플리케이션은 복잡한 형태와 그리드를 중심으로 합니다. 이것들을 만드는 것은 반복된 연습만이 줄 수 있는 중요한 기술입니다. 페이스북과 비슷한 애플리케이션을 만드는 것은 학생들이 즉시 배우기에 좋은 교훈이 아닐 수도 있습니다.

마찬가지로, 프로그래머가 아닌 사람은 개발자가 하루에 작성하는 코드 라인이 얼마나 적은지에 놀랄 수 있습니다. 코드를 제거하거나 심지어 아무것도 얻지 못하는 경우도 있습니다.

왜일까요? 왜냐하면 항상 일이 잘 풀리지만은 않기 때문입니다. 우리는 아주 이상한 버그를 고치는데 끝없는 시간을 보냈는데, 알고보니 그것들은 단순한 오타일 때가 있습니다. 일부 도구는 라이브러리가 보조 버전으로 업그레이드되었기 때문에 작동하지 않을 수 있습니다. 또한 누군가가 Github에 파일을 추가하는 것을 잊어 버렸기 때문에 시스템의 충돌이 일어날 수 있습니다. 이러한 일들의 목록은 계속 진행될 수 있습니다.

학생들은 이런 경험을 즐겨야 합니다. 시간의 압박을 받고 있는 알 수 없는 라이브러리를 목표로 하는 운동은 시간이 지날 수록 옳은 경험이 될 수 있습니다.

실제로 태양이 항상 빛나는 것은 아닙니다. 초보자들은 프로그래밍의 현실에 대해 잘 대비해야 합니다.

마지막 조언

마지막으로 정말 중요한 것은, 2주, 2달 또는 1년이라는 시간 안에 누구나 프로그래밍의 전문가가 될 수는 없다는 것입니다. 끊임없는 시간과 인내가 필요합니다.

가르치는 사람들은 서두르거나 거짓된 약속을 하면 안됩니다. 학생들이 개념을 이해하고 너무 빨리 서두르지 않는지에 초점을 맞춰서 가르쳐야 합니다.

■ 패스트캠퍼스 홈페이지 바로가기

■ 기초부터 단단하게 다져주는, 패스트캠퍼스의 프로그래밍 캠프 바로가기

Facebook Comments