11/23/2023

좋은 개발자를 만드는 습관

 


좋은 개발자가 되려면 기술적인 능력 이상의 것이 필요하다. 프로그래밍 언어 및 프레임워크에 대한 숙련도가 필요하며 그 외에 일부 습관이 숙련되고 효과적인 개발자로 두각을 나타내는 데 도움이 될 수 있다.

좋은 개발자로 만드는 습관을 적어본다.

꾸준한 연습

기술이 끊임없이 나오고 발전하고 있다. 최신 트렌드를 이해하는 것은 매우 중요하다. 좋은 개발자는 기숧을 배우고 향상시키려는 마음이 있어야 한다.

블로그를 읽는다거나 세미나에 참석하거나 온라인 강좌를 듣는 형태로 새로운 기술에 대해 알고 있어야 한다.

이런 습관이 지속되면 귀중한 사람이 될 수 있다.

협업

혼자 일하는 상황은 없다. 다른 개발자들과 끊임없이 협업을 해야 한다. 협업을 하려면 잘 구성된 코드를 작성해야 한다. 내가 작성한 코드를 다른 이들이 쉽게 이해하고 작업할 수 있게 해야 한다. 좋은 개발자는 코딩 표준을 따르고, 명명 규칙에 일관성이 있고, 이해하고 관리하기 쉬운 코드를 작성한다.

버전 관리

여러명이 협업을 하기에 버전 관리는 매우 중요하다. 코드 변경 사항을 추적하고 꼬이지 않도록 관리를 해야 한다. 좋은 개발자는 Git과 같은 버전 관리 시스템을 사용할 줄 알아야 한다. 이런 도구를 이용해 코드를 관리하고 다른 이들과 협업을 해야 한다.

테스트

좋은 개발자는 작성한 코드를 테스트하는 것에 대한 중요성을 이해한다. Normal 테스트만 하는 것이 아닌, Abnormal 테스트도 진행해야 한다. 이렇게 테스트를 해도 버그가 나오기 때문이다. 코드에 대한 테스트를 작성하고 자동화 테스트 도구를 사용하여 시간 절약 및 완정성을 보장해야 한다. 테스트는 코드 품질을 유지하고 버그를 해결하는데 도움이 된다.

배움

이 바닥에 발을 들였으면, 계속 배워야 한다. 내가 사용하는 기술 스택외의 분야에 트렌드를 인지하고 새로운 기술이 등장하면 왜 기술이 나왔는지, 어떤 목적이 있는지등을 이해해야 한다. 이런 습관이 있어야 앞서 나가는데 도움이 될 수 있다.

좋은 개발자가 되려면 기술적인 능력 이상의 것이 필요하다. 위에서 언급한 것에 대해서 습관화 해야 한다. 이러한 습관은 고품질의 코드를 생성하는데 도움이 되고 귀중한 사람이 될 수 있다.

11/22/2023

문제에 직면 했을 때

 


프로젝트를 진행하다보면 다양한 문제에 직면한다. 문제를 왜 해결하지 못하는지와 문제를 해결하는 것에 대해서 느낀바를 적어본다.

문제를 해결하지 못하는 이유

사람들은 문제를 해결하기 위해 필요한 것이 무엇인지에 대해서 동일한 인식을 갖고 있지 않다. 특히 IT분야의 경우는 더욱 어렵다.

문제를 해결하기 위한 능력이 있더라도 자신감이 없다. 그리고 실수를 두려워한다. 문제를 해결하기 위해 시도할 수 있지만 여전히 방어망을 구축해둔다. 실패를 하더라도 비난 받으면 안되기 때문이다.

문제가 있을 때마다 조언을 구하는 사람들이 있다. 경험있는 사람이 조언과 지도를 해줘서 문제를 해결하더라도 스스로 생각하지 않도록 훈련시키는 결과가 발생할 수 있다.

단순한 문제를 해결하는 데 익숙하지만, 복잡한 문제를 해결하는 데 문제를 재정의하고 제약을 만들고 단위 단위로 분리하는데 익숙하지 않다. 능력이 없는 것이 아니라 좀 더 철저하고 집요하게 생각할 수 있도록 연습이 필요하다.

어떤 사람들은 특정 문제가 심각하다는 것을 인식하지 못할 수도 있다. 이 문제로 인해 발생할 수 있는 영향을 보지 못할 수도 있다. 더 큰 그림을 보려면 도움이 필요하다.

위에서 언급했지만, 집요하게 파고들지 않는 경우도 있다. 이 문제에 대해 무관심해지면 “그건 내 일이 아니라”라는 반응을 하는 경우가 있다.

채용 실수나 역할을 잘못 부여하여 적합하지 않는 경우도 있다. 그들이 무능력하다는 것이 아니라 그들의 능력이 역할에 적합하지 않을 수도 있다는 것을 알아야 한다.

문제를 해결하는 접근 방식

제약의 중요성

문제를 해결하는 사람은 문제에 대해서 명확하게 정의한다. 이게 정말 문제인지 아닌지 판단하기 위함이고, 문제로 인식될 경우에 해결 방안을 모색하기 위함이다.

문제로 인식이 되면, 제약을 만들어야 한다. 집중해야 할 부분과 하지 말아야 할 부분을 알아야 하기 때문이다.

너무 많은 선택권을 주면 창의성이 오히려 제한된다. 충분한 제약이 있으면 새로운 방식으로 해결방안을 찾도록 자극할 수 있다.

제약의 개념을 이해하기 위해서 놀이터를 예시로 들어본다. 놀이터 주변에 울타리를 설치하면 공간 전체를 아이들이 탐험하고 놀기 위해 사용한다. 울타리는 그들에게 안전과 안정감을 주기 때문이다.

반면, 놀이터 경계의 울타리가 제거되면 경계가 불분명해지고 아이들은 안전하게 느껴지는 중앙에 머무르게 된다.

명확한 제약이 없으면 현재 발생한 문제외의 다른 문제와 리스크를 언급하는 상황이 종종 발생한다. 본 문제에 집중하지 않고 다른 문제를 가져오면서 더욱 문제를 키우는 현상이 발생한다.

합의 실패 대응

문제를 해결하기 위한 충분한 지원을 받지 못하고 해결책을 내기 위한 연합을 구축하지 못하기 때문이다. 문제를 해결하기 위해서는 여러 이해관계자의 도움이 필요한데 합의를 얻지 못하는 경우 문제를 해결하지 못하는 상황이 종종 발생한다.

합의를 구축하는 방법에는 여러가지가 있지만, 개인적으로 유용하게 생각하는 것은 조용히 기반을 마련하는 일본의 네마와시 개념을 선호한다.

서양식 접근 방식은 아이디어나 프로젝트를 구상하고 이를 상사에게 제안한 후 아이디어가 좋으면 선택되는 것이다. 이런 접근 방식이 성공한다고 해도 이미 합의가 되지 않는 이해관계자와 협상해야 하기 때문에 진행하면서 수많은 장벽과 마주치게 된다.

네마와시는 초안 형식으로 준비하지만, 상사 뿐만 아니라 이해관계자와 함께 확인하여 합의를 구축한다. 인내심도 필요하고 고도의 정치도 필요하다.

이제까지 잘 지내오던 환경에 다른 것이 전달되었을때, 대부분 저항한다. 이것은 인간의 자연스러운 반응이다.

타이밍

타이밍이 전부다. QR코드가 처음 세상에 나왔을 때, 생각보다 사람들은 많이 사용하지 않았다. 일부에서 사용되긴 했지만 전체가 사용하기에는 어려움이 있었다.

COVID-19가 모든 것을 바꿨다. QR로 인증을 해야 했기 때문이다.

문제를 파악하고 제약 조건을 설정하고, 브리핑하고 해결 방안에 대해 합의 구축 및 실행을 하는 것이 문제 해결에 필요한 구성 요소이다.

트레이드 오프

몇 가지 문제를 해결했을 수도 있지만, 몇 가지 새로운 문제가 생길 수도 있다. 이 부분이 절충점이며 피할 수 없다. 이런 경우 아무런 조치를 취하지 않는 것에도 장단점이 존재한다.

예를 들어, React Hooks는 코드 재사용성에 대해서 대폭 단순화했지만, 추상화를 구축할 때 기억해야 하며 value/reference identity에 대해서 배워야 한다.

궁극적으로는 문제를 해결함으로써 새롭게 나오는 문제를 이전 문제보다 해결하기 쉽고 해결하기 위한 리소스를 저렴하게 만드는 것이다. 즉, 작은 문제 대신 큰 문제를 제거해야 한다.

결론

주의를 기울이고 한발 물러나서 올바른 문제를 해결하고 있는지 자문을 해야 한다. 다른 문제에 대한 해결책에서 발생한 문제를 해결하고 있을 수도 있기 때문이다.

문제는 계속 발생하기에 가장 중요한 것은 문제를 해결하고 더 큰 문제가 발생하지 않도록 하는 것이다.

11/21/2023

Retail Media Network

이미 많은 사람들이 온라인으로 쇼핑을 하고 있다. 소비자의 행동 변화는 기업이 제품을 홍보하는 방식을 변화시키고 있다. 이제까지는 검색 사이트, SNS에서 잠재 고객을 타겟팅하면서 광고를 했지만, 이제는 RMN을 활용해서 잠재고객과 소통해야 할 시대이다.

RMN(Retail Media Network)란?

쇼핑몰 웹사이트/앱 및 매장에서 게재되는 광고를 리테일 미디어라고 한다. 그리고 이러한 광고를 제공하는 것을 RMN이라고 한다.

RMN의 주요 이점은 소비자가 쇼핑할 때 제품을 광고할 수 있다는 점이다. 고객이 구매할 시점이 가까워지면 구매할 가능성이 높은 제품을 적극적으로 찾기 때문이다.

누군가에 쇼핑몰에서 검색을 하거나 상품 카테고리를 살펴볼 때 당신의 광고가 나타날 수 있다. 이는 디지털 소비자 여정 중 가장 영향력이 있는 지점에서 잠재 고객을 확보하는데 도움이 될 수 있다.

RMN은 브랜드가 접근할 수 없었던 디지털 공간에 대해 문을 열어준다. 아마존의 경우에는 이미 스폰서 광고를 도입하여 앞서 나가고 있다. 그리고 다른 온라인 업체들도 뒤를 따르고 있다.

eMarketer의 자료에 의하면 RMN의 광고 지출이 더욱 빠르게 증가할 것으로 예측한다.


RMN의 원동력은 전자상거래이다. 온라인을 기반으로 하는 거의 모든 앱에 적용될 수 있다.

RMN의 장점

RMN은 본질적으로 사업자가 소유 또는 운영하는 광고 기술 플랫폼이다. 웹사이트, 전자상거래 플랫폼, 모바일 앱 전반에 걸쳐 브랜드에 제공한다.

소매업체들을 하나로 묶은 최초의 플랫폼은 Amazon이다. Amazon.com에서 사용자가 수많은 제품과 서비스를 검색하고, 장바구니에 저장하고, 소유한 기기에서 편리한 시간에 구매할 수 있는 플랫폼이다.

Amazon은 아마존 광고 소매 미디어 네트워크를 통해 소매업체에게 광고 공간을 판매한다. 이 비즈니스 모델은 빠르게 성장했고, 다른 소매업체들도 따라하기 시작했다.

RMN은 모든 전자상거래 이해관계자에게 광범위한 영향을 미친다.

온라인 소매업체의 경우, 시장 경쟁으로 인해 영업이익이 감소하고 있다는 점을 고려할 때 이는 엄청난 새로운 수익원을 제공 할 수 있다. 그리고 소비자에게 더 낮은 가격으로 제품을 제공할 수 있다는 것도 의미한다.

RMN은 쇼핑객과 브랜드가 상호 작용하는 방식을 변화시키고 있다. 이 상황에 익숙해지는데에는 시간이 걸리겠지만, RMN의 이점으로 투자가 일어날 것이라고 생각한다. 다음은 브랜드가 소매업체의 웹 사이트와 모바일 앱에 광고를 게재할 수 있는 RMN들이다.

  • Walmart Connect - Walmart는 RMN을 출시하여 2021년에 매출이 약 26% 증가했다.
  • Walgreens Advertising Group - OTT(Over-the-top), CTV 시청자에게 제공하는 RMN
  • Retail Media+ - Home Depot에서 만든 RMN이다.
  • eBay 광고 - 약 1억 3500만 명의 활성 사용자에게 광고주가 다가갈 수 있는 플랫폼이다.

왜 소매업체는 RMN을 구축하려고 할까?

Walmart, eBay의 성공 사례를 따라하고 싶은 마음도 있겠지만, 아래의 이유로 RMN을 구축하고 있다. 즉, 돈을 더 벌기 위해서다.

  • 전자상거래 개발 - COVID19 이후 소비자들이 전자상거래의 편리함에 젖어들었기에 많은 성장을 했다. RMN을 구축하여 이런 현상에 편승
  • 제3자 쿠키의 종말 - RMN을 통해 브랜드는 개인화된 광고를 하고 싶어하고, 이때 자사 데이터와 소매업체의 데이터를 활용한다.

개인 정보 보호가 점점 더 중요해짐으로 브랜드는 자사 데이터를 사용하여 법을 위배하지 않고 타겟 고객을 식별하는 방법을 찾아야 한다.

소매업체는 RMN을 어떻게 활용할 수 있을까? RMN은 소매업체에 다양한 혜택을 제공한다. 브랜드 가치를 높이고, 판매를 간소화하고, 광고 지출에 대해 검색엔진, 소셜미디어와 경쟁할 수 있게 만들어준다.

다음은 RMN의 성장을 나타내는 몇 가지 숫자이다. 아마존은 2021년에 전년 대비 48% 증가한 310억 달러의 광고 수익을 창출했다. 2021년 Walmart Connect는 2020년보다 136% 증가한 21억 달러의 광고 수익을 창출했다.

끝으로, 현재와 미래에는 어떤 종류의 광고가 필요한지 생각해보자. 매장내 디스플레이에 광고를 노출하고 싶다면 Walmart 사례를 보는게 좋다. 다중 채널 캠페인으로 RMN을 이용하려면 아마존과 이베이 사례를 보는게 좋을 것 같다. RMN은 타겟팅 측면에서 브랜드에 많은 것을 제공한다. 더 많은 브랜드가 전략적으로 광고를 활용함에 따라 제품에 대한 경쟁적인 시장 환경이 조성 될 것이다.


10/03/2023

옵시디언(Obsidian) 소개

나는 평소에 노트앱을 잘 사용한다. 새로운 노트앱이 나오면 사용해보면서 기존에 사용하던 노트앱과 비교하는 편이다. 요즘은 옵시디언(Obsidian)이라는 앱을 사용중에 있다. 이 앱은 생각을 체계적으로 정리하고 접근 가능하게 유지하는데 있어서 획기적인 변화를 느끼게 했다. Evernote, Notion, Onenote도 사용했지만 옵시디언처럼 내 기준을 모두 충족하는 제품은 없었다.

내가 노트앱을 선택할 때 우선 순위를 삼는 몇 가지 핵심 요소가 있다.

  • 재사용 가능한 형식으로 내보낼 수 있는 기능이 있어서 해당 노트앱이 사라졌을 때에도 작성한 노트는 활용할 수 있어야 한다.
  • 확장 가능한 기능이 있어야 하고, 우수한 커뮤니티 지원이 존재해야 한다.
  • 로컬에서도 사용 가능해야 한다.

옵시디언은 위 핵심 요소외에 더 많은 것들을 만족 시킨다.

옵시디언의 장점

최소한의 기능

처음 옵시디언을 시작하면, Visual Studio Code의 느낌이 든다. 최소한의 디자인을 통해 노트에 집중할 수 있게 만들어준다.

재사용 가능한 형식 지원

옵시디언은 모든 글을 Markdown 파일로 저장한다. 마크다운은 필요한 경우 다른 앱으로 쉽게 마이그레이션 할 수 있다. 나같은 경우는 Remotely Save Plugin으로 노트를 동기화하지만, 이것과 별개로 Github Repo에 push하여 Markdown으로 글을 보는 경우도 있다.

태그 지정 및 연결

노트에 태그를 지정하고 연결하여 내용이 비슷한 노트끼리 네트워크를 만들 수 있다. 그래픽 보기를 통해 노트가 상호 연결되어 있는지 확인 할 수 있다.

로컬에서 사용 가능

오프라인에서 사용되도록 설계되었기에 인터넷에 연결되어 있지 않아도 노트를 못볼까봐 걱정할 필요가 없다.

확장 기능

커뮤니티에서 만든 수 많은 플러그인이 제공된다. 플러그인은 필요 시 설치가 가능하고, 이런 기능으로 인해 옵시디언의 확장성은 무한하다.


옵시디언의 단점

  • 노션이나 에버노트처럼 노트를 공유하거나 공동 작업할 수 없다.
  • Markdown에 익숙하지 않다면 학습 곡선이 있을 수 있다.

나의 경우에는 노트나 메모를 공동 작업하지 않기 때문에 위 단점이 크게 느껴지지 않았다. 공동작업을 해야 하는 경우에는 Google Docs나 Keep을 주로 이용한다.

옵시디언을 사용하면서 같이 일하는 동료들에게 공유하고 있고, 아직까지도 옵시디언을 사용하는 것에 대해서 만족하고 있다.

내가 노트앱을 사용하는 주 목적은 아이디어 및 히스토리 관리를 돕는 것이고, 세컨드 뇌로 활용하기 위해서다.

기타 다른 노트앱에 비해 개발자스러운 노트앱이기에 이 글을 읽는 개발자분들은 경험을 해봤으면 좋겠다.

5/20/2023

로우코드/노코드 열풍 속 개발자 일자리 괜찮을까?

요즘 IT에 로우코드와 노코드에 대해서 글을 기고 했다. 로우코드/노코드 기술이 점점 발전하고 있고, 주변에서 ChatGPT를 이용하여 개발에 도움을 받고 있는 상황이다. 로우코드와 노코드 기술의 발전으로 인해 누구나 개발자가 될 수 있는 시대가 열렸다고 할 수 있다. 이런 열품 속에서 개발자의 미래에 대한 글을 작성했다.

자세한 내용은 여기서 확인할 수 있다.

3/17/2023

코드 재사용성을 결정하기 전 고려해야 할 것들

요즘IT에 코드 재사용성에 대해 기고를 했다. 업무를 진행하면서 항상 고민되는 점이 “코드 재사용”에 대한 것이었다. 아래 기고글 일부를 발췌했다.

그런데 항상 명확한 결론을 내지 못하고 끝낸 적이 많다. 왜 그럴까? 코드 재사용에 대한 의사결정은 간단해 보이지만 사실 많은 고민이 필요한 일이기 때문이다.

코드 재사용에 대한 논의에서는 종종 다음과 같은 이야기들이 오고 간다.

  • 코드를 재사용할 수 있도록 만들어야 다른 팀, 다른 서비스가 이점을 얻을 수 있고 중복 코드 문제를 피할 수 있다.
  • 코드를 재사용하려고 해서는 안된다. 복제를 하는 것이 좋은 선택이다. 재사용하려고 하면 분기 로직이 추가되는등 오히려 복잡하게 꼬일 수 있다.
  • 다른 팀이 코드를 재사용 할 수 있도록 새로운 서비스를 만들어야 한다.
  • 기존 라이브러리를 재사용해야 할까? 아니면 자체 코드를 만들어야 할까?
  • 인증 로직은 모든 서비스에 동일하게 적용된다. 모든 서비스에서 재사용될 수 있도록 API Gateway에 추가해야 할까? 아니면 프레임워크로 만들어야 할까?

~~ 중간 생략 ~~

자세한 글은 여기서 확인 할 수 있다.

3/15/2023

일정 관리의 중요성

현재 프로젝트는 태스크 관리를 “Jira”에서 하고 있다.

대규모 인원이 오늘 한 업무에 대해서 로깅을 하는 툴중 무난하게 사용할 수 있다는 판단이었다. (물론 회사 공식툴이기도 하다)

어제는 개발 쪽이 아닌 기획 쪽 파트너사와 일정 관련 업무 미팅을 진행했었다.
일정을 따로 관리하고 있다는 얘길 들어서 우리는 Jira로 관리하고 있고, 함께 사용했으면 좋겠다고 의견을 전달했다.
VPN 접속이 어려워서 불편하다. Task가 너무 많아서 느리다. 등 여러 의견이 나왔다.
툴은 툴일 뿐이고 대규모 인원이 같이 Task를 공유하며 효과적으로 사용할 수 있는 다른 방안이 있는지? Task가 많다면 필터를 만들어서 본 적은 있는지? 등을 문의했고, 결국 Jira를 사용하기로 결정했다.

일정을 짜거나 관리해야 하는 것의 문제는, 거의 모든 프로그래머가 원하지 않는 일이라는 것이다.
내 경험상 대부분의 사람들은 태스크를 디테일하게 관리하면서 업무를 진행하지 않는다. (내가 잘못 생각하는 것일 수도 있다.)
그 이유는 일정은 소수의 사람들로 짜여지기 떄문이다. 그리고 대부분 “일정을 제시간에 맞춘 프로젝트는 극소수야”라고 생각한다. 설령 그렇다고 하더라도 일정 목표가 없이 진행하는 것은 더 큰 문제라 생각한다. 그들을 참여시키려면 그들의 불편함을 덜어주는 방법과 이것이 가치가 있다고 믿게 하는 것이다.

데일리 로그 작성 시, 입력 항목을 최대한 심플하게 만드는 것이다. 예를 들어서 이 작업에 쏟은 시간 + 어떤 일을 했는지 요 정도로만 정했다. (진척률은 모듈 리더분들이 관리) 더 세분화되게 관리를 원하는 분은 하위 작업을 생성할 수 있도록 했다. 불편함을 덜어주기 위해 심플 안을 세웠지만, 디테일을 원하는 분들의 기회도 박탈하지 않기 위해서다.

누군가에게 관리를 받는다는 것을 달가와하는 사람은 없다고 생각한다. (나 역시 그렇다.)
회사 혹은 프로젝트에서 진행하는 일은 “혼자”하는 것이 드물다. 거의 대부분 “누군가”와 협업을 해야 하는 경우가 많다. 이 경우에는 일의 순서가 생긴다. 다른 사람이 끝내야 내 일이 시작될 수 있는 상황이 발생한다는 의미이다.
대부분의 사람들은 재미있는 일을 먼저 하고 싶은 성향이 있다. “일의 순서”를 고려하지 않고 모두 재미있는 일을 먼저 한다면 관리하는 입장에서는 매우 난감해진다. 연관된 일이 미뤄지는 상황이 발생하기 때문이다. 불편함은 존재하겠지만, 함께 일하기에 긍정적으로 생각했으면 좋겠다.