News & Events
* 이 글은 towardsdatascience에작성된 Richmond Alake의 글을 번역하였습니다.
난 프로그래밍이 싫어!
7년 전 인턴십을 하면서 코호트에게 했던 말이다. 사실이었다. 필자는 대중 교통에서 마스크를 착용하지 않은 사람을 피하듯 프로그래밍 프로젝트를 피했다. 지금은 코딩 관련 두 개의 고급 학위를 취득했고, 다섯 개의 회사에서 웹 개발자로 일했다. 그리고 지금은 컴퓨터 비전 엔지니어로 일하고 있다.
나는 프로그래밍이 좋아!
왜 기술에 열광하는지 묻는 사람들에게 말하는 것이다. 프로그래밍에 대한 필자의 사랑은 코드로 애플리케이션을 구현하는 것이 기술 중심 사회에서 말 그대로 기회를 열어준다는 깨달음에서 비롯되었다.
이번 포스팅에서는 프로그래밍 스킬이 향상되고 지속적으로 향상시키기 위한 방법을 설명한다. 프로그래밍 기술의 레벨을 높이기 위해 할 수 있는 5가지 전략을 소개한다.
1. 알고리즘을 연습하라.
알고리즘은 필자를 포함한 많은 머신 러닝 실무자들을 겁먹게 하는 경향이 있다. 머신 러닝 분야는 패턴을 탐지할 때 휴리스틱 알고리즘을 구현할 필요성을 제거하기 위해 생겨났으며, 우리는 특징 탐지를 신경망에 맡겼다.
그럼에도 불구하고 알고리즘은 소프트웨어와 컴퓨팅 영역에서, 그리고 분명히 머신 러닝 분야에서 상당한 위치를 차지하고 있다.
알고리즘 구현을 연습하는 것이 프로그래밍 기술 향상을 위한 방법 중 하나이다. 메모리 효율적인 코드를 구현하는 데 있어 직관을 쌓는 것의 명백한 이점 외에도, 알고리즘을 다루는 것에는 또 다른 이점이 있다. 바로 문제 해결 사고 방식의 개발이다. 알고리즘을 구현하려면 선택한 프로그래밍 언어로 다양한 데이터 구조와 데이터 수정 접근 방식을 탐색해야 한다. 프로그래밍 언어 내에서 데이터 객체, 방법 및 기타 유용한 기능을 활용하는 방법을 이해하면 프로그래밍 생산성이 향상된다.
데이터 사이언티스트는 종종 데이터 마이닝 및 웹 스크래핑 알고리즘을 구현한다. 알고리즘과 데이터 구조를 잘 이해하면 생산 속도를 높이는 효율적인 코드를 구현하는 데 도움이 될 수 있다. 그리고 이는 전체 프로젝트 시간을 단축하는 효과가 있다. 알고리즘의 복잡함은 종류 별로 천차만별이다. 여기 간단한 알고리즘에 대한 설명이 있다.
개인적인 경험
모바일 컴퓨터 비전 엔지니어로서 필자는 포즈 에스티메이션, 오브젝트 디텍션 등과 같은 일반적인 CV 작업에 많은 딥러닝 모델을 사용한다. PyTorch, TensorFlow, Keras와 같은 플랫폼은 모델 구현의 복잡성을 추상화하지만, 필자는 특정 사용 사례에 대한 사용자 지정 알고리즘을 구현할 필요가 있다고 생각한다. 예를 들어 코사인 유사도를 가진 포즈 매칭 알고리즘을 만들거나 머신 러닝 모델에서 출력으로 얻은 데이터 구조를 효율적으로 트래버싱할 수 있다. 필자는 다양한 알고리즘에 대한 충분한 지식을 쌓기 위해 이 책을 구입했다. 이 책은 초보자의 경우 이해하기 어려울 수 있다. 초보자에게는 HackerRank나 CodeWars 같은 플랫폼이 유리하다.
2. 기술 서적 읽기
책을 통해 배운다는 것은 마치 다시 학생으로 돌아간 것 같은 기분을 느끼게 하지만, 잘 쓰여진 기술 서적에서 얻은 지식만큼 좋은 것은 없다. 프로 생활 초기에 유튜브 튜토리얼 동영상을 보는 것을 그만두고 코딩 책을 사서 읽었다. 몇 년 후 필자는 얼마나 많은 책을 읽던 간에 지금껏 배웠던 프로그래밍 언어보다 앞으로 배울 수 있는 것이 훨씬 더 많다는 것을 깨달았다. 유튜브 코딩 튜토리얼 동영상을 통해 배우는 것을 즐기지만, 잘 쓰여진 기술 코딩 책 안의 풍부하고 간결한 지식을 대체할 수 있는 것은 아무것도 없다.
데이터 사이언티스트들의 표준 프로그래밍 언어인 Python을 예로 들어 보자. 파이썬은 이해하기 쉬운 언어이다. 몇 주 동안 구문, 데이터 구조 및 공통 기능을 공부한 후 사용자 지정 파이썬 스크립트를 구현하고 실행할 수 있다. 아마 이 영상을 통해 파이썬 중급 기술까지 배울 수 있을 것이다. 그러나 파이썬 프로그래밍 언어에는 여러분의 프로그래밍 기술을 향상시킬 수 있는 더 많은 것들이 있다. 필자가 파이썬 언어에 대해 더 많이 알게 된 한 가지 방법은 기술 서적, 특히 Fluent Python을 통해서이다. 이 책은 초보자에게 적합하지는 않지만, 대신 파이썬 내에서의 숙련도를 높이려는 중간급 프로그래머들을 타겟으로 하고 있다.
요약하자면, 기술 서적은 프로그래밍 언어에 대한 간단한 소개를 제공함으로써 데이터 사이언티스트의 프로그래밍 기술을 향상시킨다. 또한 프로그래밍 언어에 대한 심층적인 탐색을 통해 데이터 사이언티스트의 기존 프로그래밍 기술을 향상시킬 수 있다.
3. 다른 개발자들의 코드 접하기
Photo by heylagostechie on Unsplash
최근 필자는 딥러닝 합성곱 신경망인 인셉션 네트워크를 구현하려고 시도했다. Python과 TensorFlow 라이브러리를 사용하여 네트워크를 구현하는 방법이 있었지만, 다른 머신러닝 실무자들은 네트워크 구현을 어떻게 진행했는지 궁금했다.
필자의 호기심은 나를 GitHub 리포지토리로 이끌었다. 다른 개발자들의 코드를 조사했고 말할 필요도 없이, 필자의 구현 접근 방식을 개선하고 기존의 프로그래밍 기술을 더 일반적으로 개발하는 방법을 배웠다. 탐색하고 배울 수 있는 많은 퍼블릭 깃허브 리포지토리가 있다. Google이나 Facebook과 같은 테크 회사 내의 개발자에게 배울 필요가 없다. 엔지니어가 개발한 프로젝트의 퍼블릭 리포지토리를 탐색하기만 하면 된다. 데이터 사이언티스트의 경우 최근 출시된 Detectron2 또는 기타 오픈 소스 머신 러닝 툴과 같은 저장소를 탐색하는 것과 같다.
직장에서 내부 개발 팀 내에서 코드 검토를 수행하는 것 역시 적절한 학습 방법이 될 수 있다. 다른 개발자의 구현 접근법 이면에 있는 추론과 직관을 이해함으로써, 간접적으로 여러분의 시야를 넓히고 프로그래밍 지식을 넓힐 수 있을 것이다.
4. 다른 프로그래밍 언어 공부하기
다양한 프로그래밍 언어를 공부하는 것은 당신의 프로그래밍 기술을 향상시키는 확실한 방법이다. 프로그래머는 여러 프로그래밍 언어에 대한 지식과 문제를 해결하기 위해 코드를 구현한다. Python을 알면 데이터 사이어스의 핵심 실무 측면에서 학습할 수 있다. 전문적, 실용적 환경에서의 소프트웨어 개발은 각각 기능 접근 및 구현에 사용되는 특정 언어를 가진 서로 다른 플랫폼을 포괄한다. 전문적인 머신 러닝 실무자들은 아래 나온 방법에서 다양한 프로그래밍 언어를 활용할 수 있다.
- JavaScript: 인터넷에서 데이터 스크랩
- SQL: 데이터베이스 수정 및 쿼리
- Python: 알고리즘과 ML 모델 구현
- Swift/Kotlin/Java 모바일 기기 애플리케이션 개발
- 등등…
한 프로그래밍 언어에 이미 정통한 후에 새로운 프로그래밍 언어를 선택하는 것이 더 쉽다. 객체 지향 프로그래밍, 함수형 프로그래밍 등 기존 소프트웨어 개발 패러다임을 이해하면 더욱 편리해진다. 소프트웨어 개발 패러다임 지식은 모든 프로그래밍 언어에 걸쳐 응용할 수 있다.
5. 소프트웨어 개발 원칙 준수하기
단순성을 수용하고, 반복을 방지하며, 가독성을 향상시킬 수 있다.
이는 필자가 몇 년 동안의 코딩 경험을 통해 배운 것이다. 단순하게 들릴지 모르지만, 이러한 원칙들은 대부분의 개발자들이 부족한 것이기 때문에 가끔 이러한 기본적인 규칙을 고수하는 것을 잊곤 한다.
아래는 소프트웨어 엔지니어링 영역 내에서 개발자가 깔끔하고 효율적인 소프트웨어 개발을 연습할 수 있는 몇 가지 원칙이다.
KISS
‘Keep It Simple Stupid’는 소프트웨어를 개발할 때 단순성의 개념을 적용한다. 소프트웨어 개발의 설계 및 구현 단계에서 단순하게 작성된 코드를 쉽게 이해하고 유지할 수 있도록 함으로써 문제 해결 방법이 복잡하지 않도록 한다.
그렇다, 과시하고 싶은 욕구가 있을 수 있지만 가독성을 위해 단순하게 유지하라. 여러분은 Mr.robbot이 아니다.
SOLID
SOLID는 객체 지향 개발자가 재사용 가능하고 확장 가능하며 유지 관리가 가능하며 효율적인 프로그램을 구축하도록 설계된 일련의 원칙을 말한다. SOLID 원칙의 사용법과 실용성에 대해 자세히 알아보려면 Katerina Trajchevska의 이 영상을 참조하라.
- Single responsibility principle(단일 책임 원칙)
- Open-Closed principle(개방-폐쇄 원칙)
- Liskov Substitution principle(리스코프 치환 원칙)
- Interface segregation principle(인터페이스 분리 법칙)
- Dependency inversion principle(의존 역전 원칙)
DRY
Don’t Repeat Yourself. 반복하지 마라. 이 원칙은 매우 자기 서술적이다. 프로그램을 구현할 때 이미 존재하는 기능을 수행하는 코드를 작성하는 것은 개발 시간을 비효율적으로 사용하는 것이다. 반복을 피하는 좋은 방법은 프로젝트 폴더 내에서 유틸리티 파일을 활용하는 것이다. 유틸리티 파일에는 소스 코드 내에서 자주 수행해야 하는 일반적인 태스크가 포함되어 있다.
조언
개인 프로젝트
개인 프로젝트를 수행해보며 새로운 도메인, 라이브러리, 플랫폼, 프레임워크 및 프로그래밍 언어를 접할 수 있다.
프로그래밍 기술을 향상시키기 위해 개인 프로젝트를 할 때의 주요 이점은 소프트웨어 개발 시 발생하는 다양한 문제에 노출된다는 것이다. 프로그래밍으로 해결된 각 문제는 유의미한 경험이 될 것이다.
가르쳐보기
여러분이 경험한 언어로 프로그램을 작성하는 방법을 다른 사람들에게 가르치는 것은 여러분의 프로그래밍 기술을 향상시키고 여러분의 전문 지식을 보여줄 수 있는 검증된 방법이다.
여러분은 유튜브 동영상, 온라인 강좌, 또는 필자가 좋아하는 미디엄 기사를 통해 다양한 방법으로 가르칠 수 있다.
결론
프로그래밍 기술을 향상시키는것은 목적지가 없는 여행과도 같다. 프로그래밍은 학습하거나 개선할 수 있는 특성이 있다.
배우는 과정을 즐기자!
때때로 일이 까다로워지고 스택 오버플로우에서 해답을 얻지 못할 수도 있지만, 여러분의 프로그래밍 기술을 연마하는 데 드는 모든 노력과 시간을 기억하라.
번역 – 핀인사이트 인턴연구원 강지윤(shety0427@gmail.com)
>원문 보러가기