주니어 프로그래머와 지속적으로 배포 할 수 있습니까?


11

마이크로 서비스 아키텍처에서 API 버전 관리를 엄격하게 시행하고 많은 자동 작성을 수행하는 것보다 모든 것이 함께 작동하도록 모든 마이크로 서비스를 한 번에 배포하는 데 일주일을 기다리는 것이 더 무섭다는 순간이 있습니다. 커밋이 단계적으로 테스트를 통과하자마자 테스트 (각각 비트 : 단위 및 탐색, 통합) 및 프로덕션에 자동 배포합니다.

이제 테스트를 작성하고 커밋하기 전에 변경 사항을 테스트하고 API 버전 관리를 사용하는 방법을 알고 배포시 실행되는 증분 DB 업데이트 스크립트에 데이터베이스를 삭제하지 않는 한 좋은 아이디어처럼 보입니다. 무대에서 실패해야하므로 큰 문제는 아닙니다.

그러나 주니어 프로그래머와 함께 할 수 있습니까? 풀 요청 스키마를 구현해야 할 수도 있습니다. 이것은 지속적인 배포처럼 덜 만들 것입니다 (내 추측)?

나는 이것이 의견에 근거하지 않기를 바랍니다. 감사합니다.

CI 나 지속적인 전달에 대해서는 묻지 않습니다. 우리는 이미 그것을 가지고 있습니다. 우리가 지금 시도하는 것은 코드 배치 직후에 프로덕션 환경에 모두 배치하는 연속 배포를 만드는 것입니다.


it is more scary to wait a week to deploy all micro services at once to make sure that everything works together, than to strictly enforce api versioning, write lots of automatic tests (...), and auto deploy to production as soon as your commit passes as tests on stageIMHO는 모 놀리 식 접근 방식보다 독립적 인 서비스 배포를 통한 성공을 보장하기가 훨씬 어렵습니다 : softwareengineering.stackexchange.com/a/342346/187812 . 그리고 진정한 CI (기능 / 통합 지점 없음)를 사용하면 일주일을 기다릴 필요가 없습니다.
Dan Cornilescu

좋은 CI 시스템이 도움이 될 것입니다. 모두 가 주니어가 아닌 실수를 저지 릅니다. 그리고 파손이 반드시 개발자가 실수를하거나 제대로 일을하지 않았다는 것을 의미하지는 않습니다. 사전 검증 된 변경이 성공적으로 어떻게 회귀를 유발할 수 있습니까?를 참조하십시오.
Dan Cornilescu

답변:


16

왜 안돼? 지속적인 배포 사용 여부에 관계없이 설명하는 내용이 문제가 될 수 있습니다. 문제는 주니어가 치명적인 실수를 저지르는 것이 걱정되는 것 같습니다. 그리고 그 실수는 누군가가 그것을 잡기 전에 생산에 몰려들 것입니다.

그래서 코드 검토 및 테스트를 수행해야합니다. 어떤 것이 마스터 브랜치에 병합되고 릴리스 예정일 전에 다른 주니어 (경험을 얻음)와 상급 개발자 (코드를 개선하기 위해 전문 지식을 사용하기 위해)에 의해 코드를 검토해야합니다. 누구나이 치명적인 버그를 찾아야합니다. 그리고 그들을 막아야합니다. 그렇지 않은 경우 준비 환경에서 더 나은 QA / 테스트가 필요할 수 있습니다 (코드 검토에서 누락 된 경우 더 나은 개발자가있을 수 있음).


1
기능 분기 및 풀 요청을 사용하면 지속적인 배포가 덜 걱정됩니다. 해결하려는 측면 중 하나는 구성 요소 간의 호환성입니다. 서비스 중 하나를 한 번 변경 한 후에는 그들이 함께 일할 것이라고 확신합니다. 많은 변화 후에 모두를 함께 밀어야 할 때 스트레스를받습니다. 마스터 브랜치에 가입하기 전에 변경 사항을 검토하면 구성 요소가 다른 저장소에 있으므로 변경 순서를 혼동 할 수도 있습니다.
doker

@doker 많은 서비스를 함께 제공해야한다면 걱정하지 마십시오. 각 서비스 (및 변경 사항)는 자체적으로 유지되어야합니다. 서비스 A가 변경된 경우 빠른 코드 검토를 수행하여 새로운 변경 사항과 함께 작동하고 자체적으로 배포 할 수 있는지 확인하십시오. 주요 변경 사항이 있으면 코드 검토를 사용하여 API 버전 관리를 시행하십시오. 서비스 B가 서비스 A에 의존하는 경우 A에 대한 작업을 먼저 수행 한 후이를 수행하십시오. 그런 다음 B에 대해 작업하십시오. 후손이 A, B, C 및 D로 변경하고 모두 상호 의존적이면 검토 할 수 있도록 문서화해야합니다.
Becuzz

1
@doker 이러한 종류의 시나리오는 지속적인 배포 / 배달 직원이 종종 매우 기능을 전환하는 이유입니다. 변경 사항이 일반적으로 기능 스위치 뒤에있는 경우 (모든 작은 변경 사항은 아님), 기능을 해제 할 때마다 조각을 배포하고 모든 조각이 제자리에있을 때 기능을 켜고 심각한 문제가 발견되면 기능을 끌 수 있습니다.
데렉 엘 킨스가 SE

3

우수한 자동 테스트 세트가 있으면 지속적인 배포가 잘 작동합니다.

주니어 개발자는 자신의 작업에 대해 흥분을 느끼고 자신의 일을 어기는 것을 보지 못합니다. 일부 자동화로이 문제를 해결할 수 있습니다. 항상 테스트를 실행할 빌드 서버를 설정하고 CatLight 빌드 알리미 와 같은 도구를 사용하십시오 . 그들이 일을 깰 때 그들에게 빠르고 명확한 피드백을 줄 것입니다.

CatLight 빌드 상태 아이콘

작은 문제가 발생할 때이를 해결하고 지속적인 배송을 계속 유지합니다.


3

좋은 습관을 배우는 유일한 방법은 습관을 익히는 것입니다. 따라서 주니어 개발자도 지속적인 배포를 연습 할 수 있습니다. 테스트 범위 확인 및 정적 코드 분석 실행과 같은 작업을 수행하기 위해 파이프 라인에 단계를 추가하는 방법에 대해 생각하고 테스트 범위가 충분하지 않은 경우 빌드에 실패 할 수 있습니다. 이를 통해 주니어 개발자는 무언가가 완성 된 것으로 간주되기 전에 기대를 이해하게됩니다.


1

주니어 개발자와 함께 할 수있을뿐만 아니라 필요합니다. 첫째, 그렇지 않으면 소프트웨어 품질이 떨어지고 둘째는 주니어 개발자가 훌륭한 소프트웨어 개발 기술을 배우는 데 도움이됩니다.

유추 할 수 있습니다 : 의사가 젊은 견습생의 실수를 두려워하기 때문에 의사가 지식을 최대한 발휘하지 않기를 원하십니까? 의사는 잠재적 손상을 어떻게 처리합니까?


1

감독되지 않은 많은 주니어 개발자들이 수년에 걸쳐 자연스럽게 진화 한 Big Ball Of Mud 코드베이스에 대한 과거의 경험을 바탕으로 개발자들과 CI를 연습 하지 않을 때 어떤 일이 발생하는지 지적하고 싶습니다 .


편집 / 업데이트 : RubberDuck의 의견에 따라; 이 답변에서는 통합을위한 병합 대상이 평가 또는 릴리스 분기가 아닌 개발 분기라고 가정합니다.

  • 릴리스 및 라이브 배포를 위해 코드를 훨씬 더 많이 제어해야합니다. 별도의 프로덕션 브랜치가없는 경우 마스터 릴리스 브랜치와 함께 마스터 개발 브랜치 (통합 테스트에 사용되며 릴리스에는 사용되지 않음)를 실행하기 위해 브랜칭 / 병합 전략을 변경하는 것이 좋습니다. 이를 통해 CI의 모든 이점을 유지하고 생산 코드를 위반하지 않고 자주 병합합니다.

1. 주니어 개발자는 동료 또는 감독자와 의사 소통 할 가능성이 적습니다.

지속적인 통합은 단순히 코드를 병합하는 문제가 아니라 개발자가 다른 이해 관계자와 상호 작용해야하는 시점입니다.

의사 소통은 중요하며, 지나치게 일반화하기를 원치 않으면, 팀 환경에서 일하는 데 익숙하지 않은 숙련 된 개발자보다 경험이 부족한 개발자에게 덜 자연스럽게 전달되는 학습 기술인 경향이 있습니다.

주니어 개발자가 빈번한 보고서 / 검토를 요청하지 않고 큐비클에 앉아 몇 주 동안 코드를 쏟아 내면 의사 소통을 완전히 피할 가능성이 높습니다.

2. 그들이 생성하는 코드는보다 엄격한 검토가 필요할 것입니다

당신은 당신이 이전에 그것을 집어 들고 그것을 작성하는 것을 막기를 원했을 정도로 나쁜 것을 검토 한 적이 있습니까? 이것은 많이 일어난다.

잘못된 코드가 작성되는 것을 막을 수는 없지만 낭비되는 시간을 제한 할 수 있습니다. 빈번한 검토 및 병합을 약속하면 낭비되는 시간 범위를 최소화합니다.

최악의 시나리오는 자신의 미니어처 프로젝트에서 주니어 개발자를 몇 주 동안 방치 할 수 있으며, 최종적으로 코드 검토를 준비 할 때 전체 혼란을 겪을 시간이 충분하지 않다는 것입니다. 처음부터 다시 시작하십시오.

너무 늦을 때까지 아무도주의를 기울이지 않을 때 나쁜 코드가 가득 찼기 때문에 많은 프로젝트가 진흙탕 이되었습니다.

3. 주니어 개발자 또는 다른 새로운 팀원이 요구 사항을 이해했음을 확실하지 않습니다.

때때로 개발자는 잘못된 문제에 대한 완벽한 솔루션을 구축 할 수 있습니다. 누군가가 프로세스 초기에 올바른 질문을했을 경우 피하기 쉬운 간단한 오해로 인해 이것은 슬픈 일입니다.

다시 말하지만, 이는 요구 사항의 지혜를 묻지 않고 반박 할 때 액면가에서 "나쁜"요구 사항을 받아 들일 가능성이있는 경험이없는 개발자에게 영향을 줄 수있는 문제입니다.

4. 일반적인 패턴, 기존 코드의 아키텍처 및 잘 알려진 도구 및 솔루션에 익숙하지 않을 수 있습니다.

때로는 개발자가 더 나은 솔루션이 존재한다는 것을 몰랐기 때문에 불필요하게 바퀴를 다시 발명하는 데 많은 시간을 소비합니다. 또는 그들이 잘못하고있는 것을 깨닫지 않고 사각 구멍을 둥근 구멍으로 망치려고 노력하는 데 며칠이 걸릴 수 있습니다.

다시 말하지만, 이런 종류의 경험은 경험이 부족한 개발자에게 발생할 가능성이 높으며 문제를 해결하는 가장 좋은 방법은 정기적 인 검토를 보장하는 것입니다.

5. 코드 커밋 / 병합 사이의 오랜 기간 동안 결함을 식별하고 수정하기가 더 어려워 짐

몇 주 분량의 코드 변경 사항이 마스터 브랜치에 병합 된 직후 버그가 발생하면 어떤 변경으로 인해 버그가 발생했는지 파악하기가 더 어려워집니다.

분명히 전체 분기 전략도 여기에 적용됩니다. 이상적으로 모든 개발자는 자체 브랜치에서 작업하거나 기능 브랜치에서 작업하거나 마스터 / 트렁크에서 직접 작업하지 않습니다.

전체 팀이 모두 마스터 / 트렁크에서 동시에 직접 작업하는 상황을 보았습니다. 이는 CI의 끔찍한 환경이지만, 운 좋게도 마스터 / 트렁크에서 모든 사람을 끌어내는 솔루션은 일반적으로 개별 작업에 충분한 안정성을 제공합니다. 품목 / 티켓 / 등

병합이 정기적으로 이루어져야한다는 점을 이해하고 변경 사항과 결함을보다 신속하게 식별해야하므로 더 빨리 해결 될 수 있다는 점을 이해하면 모든 개발자가 마스터 / 트렁크 브랜치 를 중단 하는 것은 항상 "OK" 여야합니다. 최악의 결함은 일반적으로 몇 달 또는 몇 년 동안 발견되지 않은 결함입니다.


요약해서 말하자면; 지속적인 통합 / 연속 배포의 주요 장점은 다음과 같습니다.

  • 팀 간의 커뮤니케이션이 향상됩니다
  • 코드 품질은 일반적으로 더 높은 표준으로 유지됩니다
  • 요구 사항을 놓치거나 잘못 해석 할 가능성이 적습니다.
  • 아키텍처 및 디자인 문제는 더 빨리 감지되어야합니다.
  • 결함은 초기 단계에서 감지되고 수정 될 가능성이 더 높습니다

따라서 하급 개발자와 함께 CI를 연습하지 않으면 나머지 팀원보다 더 많은 팀원이 필요하기 때문에 불필요한 위험을 많이 수용하게됩니다.


OP는 마스터 커밋으로 실제 배포 작업 을 수행 하는 모델에 대해 이야기하고있다 . 그래서 안돼. 해당 모델에서 마스터 분기를 중단하는 것은 좋지 않습니다.
RubberDuck

@RubberDuck의 좋은 점은이 방법이 통합 테스트를위한 것이며 새로운 코드 변경 사항을 생산 지점으로 직접 푸시하는 것이 아니라는 점을 분명히하기 위해 의견을 추가했습니다.
Ben Cottrell

0

예, 주니어 개발자와 함께 CI를 연습 할 수 있습니다. 현재의 개발 환경에서는 그렇지 않을 것입니다. 리포지토리로 푸시 한 다음 스테이징 코드에 자동으로 병합하고 Travis (또는 Bamboo, Pipelines 등)에서 실시간으로 모두 볼 수 있다면 정말 유용합니다!

DevOps 직원을 데려가 프로세스를 진행하고 대기중인 수석 개발자가 사물을 살펴보고 코드 검토와 연결하십시오.

염려가 쉬트 코드가 통과 할 것이라는 우려가 있다면, CI에는없고 주니어도 아닙니다 : 그것은 당신 입니다.

따라서 더 나은 스테이지 및 제품 코드 배포에 익숙해 지도록 도와주십시오. 당신은 장기적으로 자신에게 감사합니다.


1
OP는 지속적인 통합 / 배달이 아닌 연속 배포 에 대해 이야기하고 있습니다.
RubberDuck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.