프로덕션에 몰래 들어간 어리석은 버그

2645 단어 todayilearnedruby
이것이 일어난 일입니다.

나는 어떤 작업을 하는 도중에 갑자기 이전에 추진했던 다른 작업으로 컨텍스트 전환을 해야 했습니다. 실패 사례를 처리하는 것을 잊어버렸고 코드는 이미 생산 단계로 넘어갔습니다. 그러나 변화는 매우 간단했습니다.

이와 비슷하게 보이는 일부 기존 코드에 조건을 추가해야 했습니다.

Good code

이것이 내가 추가해야 하는 조건이라고 생각하십시오.

Buggy code

이 작업을 완료하고 추진하기 전에 이것을 테스트해야 하는지 스스로에게 물었고 내 천재는 이것이 간단한 변경이며 테스트 없이 진행할 수 있다고 대답했습니다. 나는 또한 구문 오류로부터 나를 구하기 위해 이것을 가지고 있었습니다. 그래서 나는 내가 꽤 많이 덮여 있고 갈 수 있다고 느꼈습니다.

나는 그것을 밀었고, 사전 커밋 후크가 통과되었고, prod에도 배송되었습니다. 🚀 다른 작업으로 돌아갔습니다.

몇 분 안에 오류 모니터링 도구가 훨씬 더 많은 오류를 표시하기 시작했습니다. 이전에 실패한 무시할 수 있는 1% 요청에 비해 이번에는 요청의 100%가 실패했습니다.

이미 무엇이 잘못되었을 수 있는지 짐작하셨습니까? 감사합니다.👏

그렇지 않은 경우 오류를 찾는 데 도움이 되는 오류가 있습니다.

TypeError (class or module required)

MyObject가 클래스나 모듈이 아니라고 생각한다면 오산입니다. 해당 코드 조각이 이미 생산 중이고 구문상 괜찮기 때문입니다.

그래서 무엇이 잘못되었을 수 있습니까? 잠시 시간을 내어 다시 살펴보세요.

좋습니다. 루비에게 실행 우선 순위에 대해 명시적으로 알리지 않았고 결과적으로 루비는 MyObject && (self.some_validation? || self.other_validation?)를 메서드self.is_a?의 인수로 간주했습니다.

따라서 MyObject && (self.some_validation? || self.other_validation?)?의 결과는 다음 중 하나입니다.

MyObject && true #true
MyObject && false #false


결과적으로 self.is_a?에 대한 인수는 이제 부울입니다.

self.is_a? true


오류가 발생합니다. * TypeError(클래스 또는 모듈 필요) *

수정은 매우 간단합니다. 루비가 실행 우선 순위를 알 수 있도록 대괄호를 추가하기만 하면 됩니다.

Fix for the bug

이런 날이 오기 마련이고 겸손해지고 언어의 뉘앙스를 배우게 됩니다.

좋은 웹페이지 즐겨찾기