전체 글
함께 자라기 프로젝트 회고 - 1. 개발자의 빠른 성장을 위한 방정식 세우기
본 시리즈의 글은 개발자뿐만 아니라 IT 교육 업계에 종사하시는 분들도 흥미롭게 읽을 수 있을 것 같습니다. 개인적인 생각들도 꽤 담겨있어서, 더 논의해보고 싶거나 아니라고 생각되는 부분들이 있다면 댓글로 남겨주거나 편한 방식으로 연락을 주시면 감사하겠습니다. 더 나은 성장에 대한 고민을 할 때 좋은 영향을 주었던 최진석 교수님의 '탁월한 사유의 시선'도 읽어보는 것을 추천합니다. 0. 시리즈를 시작하기에 앞서 글쓴이는 현재 스타트업에서 데이터 플랫폼 엔지니어로 재직하고 있는 동시에, 개발자의 성장을 촉진하는 교육을 만드는 것에 관심이 많다. 그래서 비개발 직군, 비전공자 개발자, 주니어 개발자를 위한 콘텐츠를 만들고 교육을 진행했다. 요새는 팀에 신입으로 들어온 개발자 동료들을 보고 도와주고 싶은 마음..
'소프트웨어 장인'을 읽고
[책] 소프트웨어 장인 감상평 소프트웨어 엔지니어로서 뽕을 심어주는 책. 책에서 다루는 안티 패턴들이 대부분 내가 행하던 행위들이라고 느껴져 부끄러움과 한편으로 성장해나가야 할 것들이 많다는 것에서 나오는 즐거움이 교차하였다. 솔직히 개발을 어느 정도 하다보면 더 나은 소프트웨어 엔지니어링을 위한 개념들에 대해 어느정도 인지는 하고 있었다. 코드 레벨에서, 테스트 코드는 필수이며 주기적인 리팩토링을 통해 레거시 코드 + 잠재위험요소를 줄이는 일이 필요하다는 것. 또 개발자라는 한 명의 프로로서 오너십을 가지고 주어진 것만 해야 하는 것이 아닌, 본인이 주체적으로 의사결정에 참여해야 하고 거기서 나오는 모든 과정(문서화, 일정 산정, 일감 관리)도 책임을 저야 한다는 것 하지만 인지한다는 것고 행동한다는 ..
2021년 그랩의 회고
벌써 2022년이 시작되었습니다. 매번 회고할 때 마다 ‘작년의 나는 미래의 나에게 왜 이렇게 관대했을까’라는 생각을 하게 됩니다. 기웃거리는 것 하나는 만렙인 저는 하고 싶은 것들은 항상 많습니다. 그래서 막상 해야 할 것들을 잘 하지 못할 때가 많습니다. 네 2021년도 그랬네요. 하나를 제대로 한다는 것에는 많은 시간과 에너지가 필요하다는 사실을 더 절실하게 느꼈습니다. 그래서 2022년은 해야 할 것을 명확하게 해서 새로운 것에 고개를 돌리지 않도록 지속적 회고와 노오력이 뒷받침되어야 할 것 같습니다. 이번 회고는 작년 2021년에 큼지막하게 했었던 일들을 요약하고 3L 방식으로 진행해보고, 내년 계획을 이야기하는 방식으로 짧고 간결하게 진행하도록 하겠습니다. 2021년 기록 1. 데이터 엔지니어..
SOLID - 의존성 역전 원칙 (Dependency Inversion)
SOLID - Dependency Inversion 개념 Dependency Inversion Principle(의존성 역전 원칙)은 의존성을 항상 고수준으로 향하게 하여 예측할 수 없는 의존성의 변화를 줄이자는 원칙입니다. 일반적으로 의존성을 가지는 대상이 변경되면 의존하는 주체도 함께 변경됩니다. 만약 자주 바뀌는 구현체(저수준)를 의존하게 된다면 코드의 변경이 잦을 것이며, 버그와 사이드 이펙트가 날 확률이 높아집니다. 이때 코드가 덜 바뀌는 인터페이스나 추상 클래스(고수준)를 의존한다면 상대적으로 안정적인 코드를 작성할 수 있습니다. [참고] 고수준은 상위 수준 + 추상화되어 있는 개념입니다. 일반적으로 잘 변하지 않는 특성을 가집니다. 코드 개념에서 고수준은 인터페이스, 추상클래스 등을 예로 들..
에러 핸들링 잘하기 (feat. 클린코드)
클린 코드 - 에러 핸들링 오류 코드보다는 예외 사용하기 오류 코드를 사용하게 되면 상단에 오류인지 확인하는 불필요한 로직이 들어가게 됩니다. 오류의 범주에 들어가지 않은 상태를 나타내는 것이 아니라면, 예외(Exception)로 명시적으로 에러 처리를 표현해주는 게 좋습니다. as-is from enum import Enum class ErrorCodes(Enum): VALUE_ERROR="VALUE_ERROR" def we_can_raise_error(): ... return ERROR_CODES.VALUE_ERROR def use_ugly_function(): result = we_can_occur_error() if result == ErrorCodes.VALUE_ERROR: # 처리 코드 .....
PubSub 사용할 때 주의할 것
이번에 차량 블랙박스의 화각이상을 탐지하는 프로젝트에 참여하게 됐다. 실시간은 아니고 배치로 돌아가게 하면 됐으며 자연스럽게 비동기 메시지 큐를 고민하게 됐다. 결국 메시징 큐를 처음 써보는 입장에서 갓구글이 매니징해주는 PubSub을 사용하게 됐다. 공식 문서나 사용 방법은 꽤 직관적이었지만, 처음 사용해본 나의 입장에서 실수를 했던 부분들이 있어 트러블슈팅기한 몇가지를 정리해봤다. 1. Ack Deadline 일반적으로 구독(Subscription)에서 메시지를 가져오는 방식은 비동기 방식과 동기 방식이 있다. 나는 동기 방식으로 메시지를 배치로 가져왔고 이후 인퍼런스 모델이 인퍼런스를 끝낸 후, 빅쿼리 적재 + 모니터링 서버에 요청까지 마친 후 acknowledge(ack라고 줄여 이야기하겠습니다)..
도커 컨테이너에서 멀티 프로세싱을 하면?
데이터 엔지니어링을 하다 보면 실제로 컴퓨팅 리소스를 최대한으로 사용할 수 있도록 멀티스레딩 혹은 멀티프로세싱을 사용한다. 더불어 요새는 국 룰이 돼버린 컨테이너를 활용해서 프로세스를 격리하고 배포, 테스팅을 훨씬 쉽게 진행할 수 있게 되었다. 그러다 문득 궁금한 점이 하나 생겼다. 만약 멀티 프로세싱을 구현했을 때 컨테이너에서는 어떻게 동작할까. 사실 도커를 사용한 지는 오래 됐지만, 그냥 단순하게 하나의 격리된 프로세스라고만 생각했었다. 그래서 본 질문에 대해 대답이 제대로 떠오르지 않았다. 결과부터 이야기하면 컨테이너 내에서 Multi Process 동작은 한 컨테이너에서 호스트 머신의 CPU 자원을 최대한 활용하여 동작한다. 컨테이너의 네임스페이스 내부에서 멀티 프로세스들이 동작하며, 주어진 리소..
Airflow 2 버전으로 Migration 한 후기
데이터 엔지니어 포지션으로 회사에 들어간 지 3개월이 되었습니다. 취준을 하면서 데이터 파이프라인에 중요한 역할을 하는 Airflow를 처음 알게 되었고, execution_date와 start_date가 계속 헷갈렸었는데... 어느덧 회사에서 성공적으로 Airflow 1.10.14 버전에서 2.1.0 버전으로 migration을 완료하였습니다. 본 글에서는 Airflow 2로 migration의 레슨 런을 정리해봤습니다. 잘 정제된 글은 아닙니다만, 해당 주제로 조만간 회사 기술 블로그에서 더 상세하게 다루도록 하겠습니다. Airflow v2 Airflow란? Airflow는 Python으로 개발된 워크플로우 작성 + 스케줄링 관리 플랫폼입니다. 간단한 스케줄링 툴은 많지만, airflow의 매력은 태..
다시 글쓰기를 다짐합니다
재작년 당차게 회사를 나온 후, 1년 정도 세계 여행을 하는 디지털 노마드가 되어야겠다고 생각했다. 퇴사 이후 태국 → 필리핀 → 일본 → 인도네시아(발리)를 여행하면서 본격적으로 세계 여행 계획을 세우고 있던 즈음, 코로나가 퍼졌고 모든 비행길이 닫히면서 한국으로 다시 돌아왔다. 2주간 집에서 자가격리를 하면서 밀린 외주도 마무리하고 올해 계획을 재조정하면서 '개발 크리에이터'의 꿈을 처음으로 꾸기 시작했다. 그렇게 올해 2월까지 개발 크리에이터로 활동하면서 개인 블로그, 브런치, 뉴스레터 등 다양한 플랫폼에 글을 작성했다. 나름 조회수가 잘 나왔고 주변에서 조금씩 '그랩'을 들어봤다고 한 사람들이 나오면서 잘 순항하고 있었고 대한민국 IT 업계에서 유명해지지 않을까라는 망상을 잠깐 했었다. 그러나 혼..