The Daily WTF 한국어 노트

The Daily WTF 한국어

Daily WTF는 알렉스 파파디무리스가 소프트웨어 개발과 기술 세계에 대한 이야기를 기반으로 하는 프로그래밍 지향적 유머 블로그입니다. 주로 프로젝트 문제, 코드 예제 및 IT와 관련된 재미있는 이야기를 중심으로 합니다. 이 사이트에는 많은 개발자들이 직장에서 경험한 이상하고 재미있는 일화들을 포함하는 광범위한 컬렉션을 보유하고 있습니다. 이러한 경험은 항상 기술과 관련이 있지만 기술적이거나 개인적인 측면에서 다양한 경우를 포함합니다.

노트 스레드

화자는 갑작스러운 질병으로 사망한 친구이자 멘토인 애기 쇼(Aggie Shaw)의 갑작스러운 상실에 대처하기 위해 고군분투하고 있습니다. 화자는 슬픔에 압도되어 상사의 기대에도 불구하고 평소처럼 업무에 복귀하는 것이 불가능하다고 느낍니다. 그들은 감정을 처리하고 상실을 받아들이기 위해 유급 휴가를 사용하기 시작합니다. 화자의 친구 메건이 연락하여 만나자고 제안하며, 절실히 필요한 경청과 위안을 제공합니다. 만남 동안 화자는 직장에 대한 자신의 감정과 좌절감을 털어놓고, 메건은 동등한 파트너와 함께 자신들만의 IT 그룹을 시작할 수 있다고 제안합니다. 화자는 이 아이디어에 영감을 받아 프리랜서로 일하거나 메건과 함께 새로운 사업을 시작하는 등 다양한 옵션을 탐색하기 시작합니다. 조사하고 계획하면서 위험과 불확실성에도 불구하고 목적의식과 흥분을 느낍니다. 화자는 직장으로 돌아가지만, 2주간의 통지를 하고 새로운 미래를 계획하기 위해서입니다. 그들은 애기의 옛 사무실에서 애기의 존재를 상징하는 고무 오리를 발견하고, 이는 그들에게 연결감과 앞으로 나아갈 동기를 부여합니다. 화자는 메건과 함께 옛 직장을 뒤로하고 새로운 장을 시작하기로 결심합니다. 화자가 직장을 그만두기로 한 결정은 단순히 어려운 업무 환경에서 벗어나기 위한 것이 아니라, 새로운 목적의식과 성취감을 찾기 위한 것입니다.
CdXz5zHNQW_k8sU0XsDKx.png
레미는 불쾌한 날씨 때문에 어둡고 환기가 안 되는 동굴로 후퇴하자고 유머러스하게 제안합니다. 이러한 감정은 관리자들이 괴짜 소프트웨어 개발자들을 용인했던 과거 직장 역학 관계를 반영합니다. 90년대 후반, IT 붐과 함께 관리자들은 개발자들의 특이한 행동에 익숙해져 있었습니다. 훌륭한 추천서를 받은 스텐을 채용하면서 배리와 그의 팀은 괴짜스러움에 대비했습니다.첫날, 스텐은 자연광이 없고 환기구를 닫을 수 있는 작업 공간을 요청했습니다. 배리는 지하에서 스텐의 사무실을 발견했고, 스텐은 형광등을 제거하여 공간을 어둡게 하고 있었습니다. 스텐은 자신을 "스텐"이라고 지칭하며 대명사를 혼란스럽게 사용하는 등 오직 3인칭으로만 말했습니다. 그는 또한 많은 양의 비타민과 이상한 냄새가 나는 차를 마셨습니다.스텐의 코딩 스타일도 마찬가지로 특이했는데, 모든 변수와 메서드에 여자 이름들을 사용했으며, 이는 그의 여자친구들이라고 주장하는 사람들의 이름을 따서 지은 것이었습니다. 일부 명명 규칙이 존재했지만, 문서화되지 않았고 해독하기 어려웠습니다. 코드 리뷰는 복잡한 서사가 되었고, 실제 로직을 이해하기 어렵게 만들었습니다.그의 괴짜스러움과 코딩 스타일에도 불구하고, 스텐의 주된 몰락은 느린 생산성이었습니다. 그는 팀의 요구 사항을 따라가지 못했고, 결국 해고되었습니다. 배리는 나중에 다른 회사에 조심스러운 추천서를 제공하며, 스텐에게 자신의 코드를 설명하도록 하라고 제안했습니다. 그 회사는 스텐을 채용하지 않았고, 배리는 감사 선물 바구니를 받았습니다.
기술자들은 제대로 관리되지 않은 인프라와 비정상적인 해결책으로 인해 반복되는 문제에 직면합니다. 흔한 문제 중 하나는 전력이 부족한 에어컨에서 발생하며, 이는 서버실 문이 열려 있는 근처에서 넘어질 위험에 주의하라는 경고를 유발합니다. 또 다른 기술자는 광범위한 문제 해결과 회선 테스트에도 불구하고 습한 날씨에만 간헐적으로 작동하는 팩스 기계로 어려움을 겪었습니다. 이 문제는 결국 케이블이 보호되지 않은 채 방치된 노출된 통신 사업자 금고에서 비롯되었으며, 경영진에게 사진 증거가 전송된 후 신속하게 수정되었습니다.또 다른 불안한 발견은 소프트웨어 회사 내 나무 서버 랙 위에 임의로 놓인 "오프사이트 백업" 드라이브와 관련이 있었습니다. 임시방편적인 해결책의 추가적인 예로는 표준 전기 관행에서 벗어나 적절한 설치 대신 노출된 연결을 선호하는 비정상적인 배선 사용이 있습니다. 맨해튼의 한 호텔은 네트워크 장비가 공용 계단에서 케이블에 위태롭게 매달려 있고 전혀 고정되지 않은 상태임을 드러냈습니다. 중국에서는 금속 가공 공장의 기둥에 몇 미터 높이로 볼트로 고정된 스위치가 발견되어 산업 환경에서의 더욱 특이한 설치를 강조했습니다.이러한 사건들은 다양한 환경에 걸쳐 IT 인프라 관리에서 전문적인 표준의 만연한 부족을 강조합니다. 이는 모범 사례를 준수하기보다는 즉흥적인 대처와 방치를 보여주는 패턴을 시사합니다.
CdXz5zHNQW_LC8T1Da23x.jpeg
제공된 Ruby 코드는 boolean value의 약자인 bv라는 함수를 정의하며, 이는 boolean 값을 보기 좋게 출력하고 문자열로 변환하는 데 사용됩니다. 이 함수는 속성 이름, true 값, false 값, null 값을 각각 나타내는 prop, tv, fv, nv의 네 가지 매개변수를 받습니다. 이 함수는 send 메서드를 사용하여 이름으로 클래스의 멤버에 접근하는데, 이는 문자열을 통한 메타프로그래밍을 허용하는 Ruby 관용구입니다. 이러한 접근 방식은 비 boolean 필드에 대해 "Not Specified"를 반환하는 것과 같이 오해의 소지가 있는 잠재적인 문제를 야기할 수 있습니다. 비 boolean 필드에 함수를 사용하려고 시도하면 대신 예외가 발생해야 한다고 주장됩니다. 속성이 존재하지 않거나 접근하는 것이 매개변수를 받는 함수인 경우 예외가 발생하므로 함수의 동작은 놀라울 수 있습니다. Ruby 문서는 이러한 문제를 피하기 위해 허용되는 boolean 값의 좋은 목록을 갖는 것을 권장합니다. 그러나 문자열을 전달하여 런타임 메타프로그래밍을 사용하는 것은 여전히 문제를 야기하고 코드베이스를 유지 관리하기 어렵게 만들 수 있습니다. 텍스트의 저자는 이 접근 방식을 싫어하며, 더 간단하고 명확하다고 생각하는 C++ 템플릿을 메타프로그래밍에 사용하는 것을 선호합니다. 저자는 사소하지 않은 Ruby 코드베이스가 메타프로그래밍의 사용으로 인해 유지 관리할 수 없게 되는 경우가 많다고 믿습니다. 전반적으로 코드와 그 접근 방식은 문제가 있고 오류가 발생하기 쉬운 것으로 간주됩니다.
CdXz5zHNQW_PE38MQ2etW.png
"Dragoncoder" 애플리케이션은 사용자에게 대기 시간을 구현하는데, 이는 작성자가 선호하지 않지만 실제적인 정당성이 있을 수 있음을 인정합니다. 핵심 문제는 이 대기 시간을 표시하는 데 책임이 있는 JavaScript 코드에 있습니다. minutes 변수는 12로 하드코딩되어 있으며, 코드는 예상 대기 시간을 표시하는 데 특이한 로직을 보여줍니다. 실제 minutes 값에 관계없이, 표시되는 대기 시간은 대부분의 시나리오에서 일관되게 "12 minute" 또는 "12 minutes"입니다. 대기 시간이 정확히 60분일 때조차도 "0 hour"로 표시됩니다. 작성자는 변수가 클라이언트 측 JavaScript임에도 불구하고 출력 텍스트도 서버에서 생성된 것이라고 추측합니다. 더 효율적이고 사용자 친화적인 접근 방식은 템플릿 리터럴을 사용하여 시간과 분을 동적으로 계산하고 표시하는 것입니다. 작성자는 대기 시간 기능 자체의 필요성에 의문을 제기하며, 존재 이유가 강력하지 않다면 제거될 수 있다고 제안합니다. 대기 시간 페이지는 초기 백엔드 렌더링 후 CDN에 의해 캐시됩니다. minutes 변수의 백엔드 렌더링 또한 이상적이지 않은 데이터 전송 방법으로 언급됩니다. 작성자는 복수형 처리가 누락된 것을 또 다른 사소한 결함으로 강조합니다. 60분을 "0 hour"로 표시하는 코드의 출력은 유명 영화와 풍자적으로 연결됩니다. 작성자는 대기 시간 표시를 위한 더 간단하고 동적인 클라이언트 측 계산을 제안합니다. 궁극적으로 작성자는 대기 시간 기능의 필요성을 재평가할 것을 제안합니다.
저자는 독립선언을 예고 없이 직장을 그만두는 것에 비유하며 이야기를 시작합니다. 스티브는 새 회사에서 첫 주를 보내며 코드베이스에 어려움을 겪고, 아키텍트인 빌의 도움이 필요합니다. 빌은 필수적인 금요일 회사 회의 때문에 자리를 비울 수 없습니다. 스티브는 회사가 스타트업이라는 점을 감안할 때 회의가 파티처럼 비공식적일 것이라고 예상합니다. 하지만 그는 면접에서 시간 관리와 까다로운 성격의 사람들을 다루는 것에 초점을 맞췄던 것을 기억합니다. 스티브는 곧 까다로운 성격의 인물이 보스인 프랭크라는 것을 알게 되고, 프랭크는 그가 휴게실에서 시간을 보내는 것에 대해 그를 꾸짖습니다. 프랭크는 개발자들의 시간과 활동을 극도로 통제합니다. 계획 회의 중에 프랭크는 빌이 휴식을 취했다는 이유로 공격적으로 그를 질책합니다. 목요일에는 기능 시연 회의가 스티브의 개인화된 컴퓨터 바탕화면에 대한 프랭크의 격론으로 인해 중단됩니다. 프랭크는 어떤 개발자든 어떤 컴퓨터든 사용할 수 있도록 개발자들이 자신의 워크스테이션을 개인화해서는 안 된다고 믿습니다. 금요일 오후가 되자 스티브는 프랭크의 명령으로 청소 업무를 위한 대걸레를 받게 됩니다. 프랭크는 청소 인력을 불신하기 때문에 개발자들이 직접 사무실을 청소하도록 의무화합니다. 이 경험은 스티브가 다른 곳에서 일자리를 찾게 만들고, 프랭크의 시간 관리 교훈을 적용하여 직장을 그만둡니다.
나쁜 비디오 게임 코드에 대한 논의는 드물지만, 유지보수성 문제보다는 전문적인 성능 최적화에 초점을 맞추는 경우가 많습니다. 소규모 팀의 전문적인 제품임에도 불구하고 출시된 게임에는 멀티플레이어 기능과 관련된 주목할 만한 설정 파일이 포함되어 있습니다. 이 설정 파일은 네트워킹 매개변수에 대한 광범위한 조정을 허용합니다.net_socks_buffer_size라는 한 설정에는 변경하지 말라는 경고가 있습니다. net_max_message_sizenet_max_download_frames와 같은 다른 설정은 수정 시 게임 재시작이 필요하며 2의 거듭제곱이어야 합니다. net_udp_packet_size는 큰 값으로 설정되어 있으며, 권장 조각 차단 및 IPv6 요구 사항에 대한 메모가 있습니다. 추가 설정은 UDP 패킷 버퍼 크기를 제어하며, 수신 버퍼가 가득 찼을 때 패킷이 삭제될 수 있다는 경고가 포함됩니다.UDP 패킷 크기에 대한 운영 체제 권장 사항을 재정의하는 옵션도 있으며, 이는 잠재적으로 네트워킹을 비활성화하거나 게임을 충돌시킬 수 있습니다. UDP 체크섬을 비활성화하는 결정은 선택적이며 아마도 불필요한 기능으로 제시됩니다. 결정적으로, 플레이어가 이러한 설정을 구성할 수 있다는 것은 다른 플레이어의 네트워크 스택에 대한 서비스 거부 공격을 시작할 수 있는 잠재력을 의미합니다.설정 파일은 특정 매개변수를 변경하는 것에 대해 "딕(dick)"이 되지 말라고 유머러스하게 경고합니다. 네트워킹을 넘어, 진정으로 충격적인 설정은 명시적으로 "DANGEROUS AS F*"로 표시된 sys_ignore_variable_constraints입니다. 저자는 잠재적으로 파괴적인 목적으로 이 위험한 플래그를 모든 게임과 심지어 자신의 로봇 소프트웨어에도 추가할 것을 유머러스하게 옹호합니다.
화자는 기술 지원 전문가로서 새로운 도전에 직면합니다. 인사부의 프린터가 "알 수 없는 문자를 인쇄"하는 문제입니다. 티켓 보유자인 토니로부터 이 문제가 직접 방문이 필요할 정도로 심각하다는 것을 알게 됩니다. 가는 길에 그는 승진한 전 멘토인 애기와 잠시 재회하며 커피 미팅을 예약합니다. 그의 목적지는 평소 꺼리는 부서인 인사부지만, 이전에 어려운 사건을 도와줬던 임원인 레일라를 떠올리기도 합니다.도착하자 그는 토니의 상사인 나이 지긋한 남자가 헤어드라이어로 프린터를 고치려다 기계 손상을 감수하는 것을 발견합니다. 화자는 개입하여 헤어드라이어를 뽑고, 정중하지만 단호하게 "핫헤드"에게 프린터에 대한 잠재적 손상을 알립니다. 그런 다음 핫헤드에게 다른 프린터를 사용하도록 지시하고, 자신도 문제를 해결하겠다고 약속하며, 이 사건에 대해 레일라에게 알릴 계획도 세웁니다.핫헤드가 떠난 후, 화자는 프린터를 검사하고 놀랍게도 손상되지 않았으며 일련의 테스트 인쇄 후 완전히 작동함을 발견합니다. 그런 다음 그는 토니를 만나고, 토니는 핫헤드가 자신의 상사임을 확인하고 화자가 이 사건을 새로운 인사부장에게 보고하려는 의지에 감사를 표합니다. 토니는 프린터가 오래되었지만 부서에는 "새로운 것"이라고 설명합니다.나중에 담배를 피우러 나갔을 때, 화자는 동료인 메건과 레이날도에게 아침의 사건을 이야기하며 "알 수 없는 문자" 인쇄물을 보여줍니다. 이 페이지에는 "나는 셰릴과 함께 일하는 것이 안전하다고 느끼지 않는다"와 "존이 계속 나를 쳐다본다"와 같은 다양한 익명의 인사부 불만이 포함되어 있습니다. 메건은 네트워크 문제일 수 있다고 제안하며, 테스트 인쇄가 잘 작동한다는 사실이 이 이론을 뒷받침합니다.네트워크 관리자인 레이날도는 인쇄물의 성격을 알아보고, 익명의 인사부 불만을 위한 오래된, 폐기된 것으로 추정되는 인트라넷 시스템을 기억해냅니다. 불만이 의도치 않게 인쇄되고 있음을 깨달은 레이날도는 문제의 출처를 조사하기 위해 IP 주소를 추적하기로 결정합니다. 화자는 이 특이한 기술 문제를 해결하는 데 도움을 줄 준비가 되어 있습니다.
파일 경로 구분자는 크로스 플랫폼 소프트웨어를 작성할 때 어려움을 야기할 수 있으며, 모든 프로그래밍 언어가 이를 처리하기 위한 명확한 API를 제공하는 것은 아닙니다. C++ 17 이전에는 개발자들이 종종 Boost 라이브러리 제품군을 사용하여 전처리기 마법을 사용해야 했습니다. 일반적인 해결책은 조건부 컴파일 지시문을 사용하여 경로 구분자에 대한 전처리기 상수를 정의하는 것이었습니다. 이 접근 방식은 개발자들이 서로 다른 파일 경로 규칙에 맞춰 작동하는 방식으로 경로를 조립할 수 있도록 했습니다. 그러나 일부 개발자들은 경로 구분자를 추가한 다음 올바른 것으로 바꾸는 등 잘못된 접근 방식을 취했으며, 이는 중복되고 오류가 발생하기 쉬운 코드로 이어졌습니다. 이 잘못된 접근 방식은 종종 코드베이스 전체에 복사되어 붙여넣어졌고, 동일한 결함 있는 논리가 여러 인스턴스로 존재하게 되었습니다. 여러 개발자가 사용했음에도 불구하고 코드는 리팩토링되지 않았으며, 일부 경우에는 여전히 잘못된 경로 구분자를 생성했습니다. 다행히도 최신 Windows는 잘못된 경로 구분자를 용인하지만, 이것이 잘못된 코딩 관행을 정당화하지는 않습니다. 더 나은 접근 방식은 경로 구분자에 대한 상수를 정의하고 코드베이스 전체에서 일관되게 사용하는 것입니다. BuildMaster와 같은 셀프 서비스 릴리스 관리 플랫폼을 사용하면 개발 프로세스를 간소화하고 이러한 오류의 가능성을 줄일 수 있습니다.
최근 프로젝트 성공으로 인해 Gary는 관리자들과의 회의에서 칭찬을 기대했습니다. 그는 터무니없이 많은 중복 컨트롤러와 정리되지 않은 인프라를 가진 혼란스러운 애플리케이션을 물려받았습니다. 시스템은 낮은 가동 시간과 수동적이고 신뢰할 수 없는 배포 프로세스로 고통받고 있었습니다. 백로그 또한 우선순위나 명확한 작업 설명이 부족하여 관리하기 어려웠습니다. 그러나 Gary와 그의 팀은 중요한 문제들을 해결하기 위해 주도적으로 나섰습니다. 그들은 중복된 리소스를 제거하고 전략적 계획을 구현함으로써 클라우드 비용을 크게 절감했습니다. CI/CD 파이프라인을 구현함으로써 배포가 간소화되었고 시스템 가동 시간이 크게 향상되었습니다. Gary는 이러한 성과를 발표할 준비가 되어 있었고, 칭찬을 기대했습니다. 대신, 그의 관리자들은 오래된 로드맵에 대한 그의 진척 부족에 대해 우려를 표했습니다. Gary가 상당한 비용 절감과 개선된 개발 주기에도 불구하고 설명을 했음에도 불구하고, 그의 관리자들은 해결되지 않은 로드맵 항목에 집착했습니다. 그들은 로드맵 수정에 대한 그의 제안을 비생산적인 것으로 일축했습니다. 결국 Gary는 인정받지 못했다는 느낌으로 회의를 마쳤습니다. 이 경험은 Gary가 자신의 불만을 나타내며 이력서 업데이트를 시작하게 만들었습니다.
그레첸의 개발팀은 회사 인수 과정에서 Initech에 인수되었습니다. Initech는 그들의 성공적인 소프트웨어 제품과 개발 인재에 관심을 가졌습니다. 처음에는 그레첸의 팀은 프로젝트에 대한 자율성을 부여받아 성공적이었습니다. 기존 코드를 재사용하거나 다시 작성하고 자체 도구를 선택할 수 있었으며, 이는 긍정적인 결과로 이어졌습니다. 그러나 그레첸은 나중에 지속적인 "긴급 조치"로 특징지어지는 문제가 있는 프로젝트에 배정되었습니다. 프로젝트의 코드베이스는 부적절한 null 처리와 같은 좋지 않은 관행을 보였습니다.애플리케이션은 더 이상 업데이트되지 않는 구식 NodeJS 버전에 국한되었습니다. 그레첸은 일관된 코딩 규칙의 부족과 로깅의 부재를 지적했습니다. 기존 로깅 메커니즘조차 효과가 없었으며, 메시지 내용에 관계없이 "DEBUG"라는 단어만 출력했습니다. 코드는 요청 본문을 유효성 검사 없이 데이터베이스에 직접 삽입하여 HTTP 요청을 처리했습니다. 이 특정 함수는 요청 데이터를 복사하기 위해 두 가지 다른 방법을 시도함으로써 우유부단함을 보여주었습니다.또한, 시스템은 많은 영역에서 직접 SQL 쿼리에 의존하여 상당한 SQL 삽입 취약점을 야기했습니다. 코드에는 중요한 권한 부여 검사가 부족했으며, 대부분의 엔드포인트는 완전히 보호되지 않았습니다. 관리 API와 같은 중요한 엔드포인트조차 인증이 구성되지 않은 중복 버전이 있었습니다. 이러한 상황은 프로젝트 내에서 보안 및 코드 품질의 심각한 결함을 강조했습니다.
레거시 금융 애플리케이션에는 C# 메서드인 ValueAGPFund가 포함되어 있는데, 이는 수많은 부작용으로 비판받고 있습니다. 이 메서드는 입력 매개변수와 내부 클래스 멤버를 수정하며 여러 가지 별개의 작업을 수행합니다. 또한 CheckPreviousValuationIfRequired라는 메서드와 상호 작용합니다. 이 후자의 메서드는 특정 매개변수를 기반으로 이전 평가 데이터를 검색하고 처리하도록 설계되었습니다.ValueAGPFund가 CheckPreviousValuationIfRequired를 호출하고, 이것이 다시 ValueAGPFund를 호출하는 순환 종속성에서 심각한 문제가 발생합니다. 또한 CheckPreviousValuationIfRequired의 반환문이 잘못되어 null 값을 액세스하려고 할 때 NullReferenceException을 발생시킵니다. 이 오류는 이전 평가 데이터가 존재할 때만 ValueAGPFund를 재귀적으로 호출하려던 의도된 로직을 가릴 가능성이 높습니다. 현재 구현은 이 함수가 null을 반환하거나 예외를 발생시킨다는 것을 의미합니다.이러한 명백한 결함에도 불구하고 애플리케이션은 올바르게 작동하는 것으로 보고되었습니다. 제출자는 문제가 되는 코드인 CheckPreviousValuationIfRequired와 ValueAGPFund와의 상호 작용이 중복될 수 있다고 의심합니다. 그러나 예상치 못한 부작용이 있는지 또는 시스템의 다른 부분이 발생한 NullReferenceException에 의존하는지 확인하지 않고 제거하는 것을 망설이고 있습니다. 제출자는 단위 테스트가 일반적으로 이러한 위험을 완화할 것이라고 비꼬아 말하며, 단위 테스트의 부재 또는 부적절함을 암시합니다. 핵심 문제는 이러한 상호 의존적인 메서드의 복잡하고 잠재적으로 잘못된 로직에 있습니다.
Daniel은 데이터가 있을 것으로 예상했음에도 불구하고 데이터베이스 쿼리가 결과를 반환하지 않는 문제를 겪었습니다. 그는 데이터베이스 상호 작용을 위해 execute_read라는 래퍼 함수를 사용하고 있었습니다. 이 함수는 몇 가지 의심스러운 설계 선택을 보였습니다. 한 가지 문제는 only_one 매개변수였는데, 이는 전용 데이터베이스 라이브러리 함수와 달리 반환 유형을 상당히 변경했습니다.또 다른 문제는 쿼리 타이밍 임계값을 결정하기 위해 env.is_production()을 사용하는 것이었는데, 이는 구성 매개변수가 이를 처리해야 함을 시사했습니다. 그러나 가장 치명적인 결함은 광범위한 예외 처리기였습니다. 이 처리기는 모든 오류를 무차별적으로 잡아서 기록했지만 함수가 계속 진행되도록 허용했습니다.결과적으로 Daniel의 쿼리에 구문 오류가 발생했을 때 함수는 예외를 잡고 빈 결과 집합을 반환했습니다. 이는 실제 오류를 숨겨 Daniel이 상당한 시간을 디버깅하는 데 소비하게 만들었습니다. 그는 결국 로그에서 오류를 발견했습니다. 저자는 이러한 침묵하는 실패의 위험, 특히 네트워크 문제가 발생할 수 있는 프로덕션 환경에서의 위험을 강조했습니다. 오류에 대한 명확한 표시 없이 빈 결과를 반환하는 것은 상당한 혼란과 디버깅 어려움으로 이어집니다.
"독자 Adam R.은 매일 우편물 스캔을 이메일로 보내주는 USPS Informed Delivery 서비스에 대한 제보를 보냈다. 그는 이메일 제목에 "None"이라는 특이한 문구가 있는 것을 발견하고 프로그래밍 오류를 시사했다. 또 다른 독자인 Carlos는 Mint Mobile의 템플릿 엔진 문제를 공유하며 시스템상의 실수를 암시했다. Robert F.는 Carbonite 알림에서 백업 파일이 백만 일 이상 후에 삭제될 것이라는 기이한 내용을 보고했는데, 이는 드라이브를 다시 연결하기에 터무니없이 긴 시간이었다. The Beast in Black은 Claude Code가 사용한 단어에 대해 논평하며 그 의미를 의문을 제기하고 느린 시스템이 의도적으로 정직할 수 있다고 제안했다. Peter S.는 Sixt의 로열티 프로그램에 대한 좌절감을 표현했는데, "실버" 등급에 도달하기 위해 광범위한 데이터 필드를 작성해야 했으며 상위 등급에 비해 불분명한 혜택을 받았다. 저자는 Adam의 제보를 받은 후 YouTube 동영상에 산만해져 칼럼 완성을 지연시켰다. 이러한 제보들은 사용자들이 디지털 서비스에서 겪는 다양한 기술적 오류와 기이한 현상들을 강조한다. 이러한 오류들은 알림의 이상한 텍스트부터 중요한 조치에 대한 불가능한 시간까지 다양하다. 저자는 공유된 동영상 링크로 인한 산만함을 유머러스하게 인정했다."
CdXz5zHNQW_T1g81Fpnst.png
개발자는 테스트 주도 개발(test-driven development) 또는 도메인 주도 개발(domain-driven development)과 같은 방법론을 둘러싼 독단에 주의해야 합니다. 도메인 주도 개발(DDD) 자체는 건전한 실천 방법이지만, 그 원칙이 엄격하게 강요될 경우 부정적인 결과를 초래할 수 있습니다. DDD의 핵심 아이디어는 기술적 세부 사항과 분리된 추상적인 용어로 비즈니스 도메인을 모델링하는 것입니다. 이를 통해 더 효과적이고 맞춤화된 도메인 로직을 구현할 수 있습니다. 그러나 DDD 준수를 자랑하는 팀, 특히 많은 신조어를 사용하는 팀은 경고 신호가 될 수 있습니다.이 문제를 설명하는 예시는 다음과 같습니다. CakeSessionRepositoryInterface에 대한 "도메인" 클래스는 DDD 원칙을 명백히 위반합니다. DDD에서 리포지토리는 도메인 객체의 데이터 저장을 추상화해야 합니다. 인증 확인을 처리하거나, 쿠키와 상호 작용하거나, 세션 정보를 관리하거나, CakePHP와 같은 특정 웹 프레임워크에 종속되어서는 안 됩니다. 제공된 코드 스니펫은 간결함에도 불구하고 DDD에 대한 근본적인 오해와 오용을 보여줍니다. 이는 팀이 진정으로 DDD를 실천한 것이 아니라 피상적인 해석을 따른 것임을 시사합니다. DDD의 오용은 방법론을 엄격한 독단으로 취급하는 위험을 강조합니다.
제공된 PHP 코드 스니펫은 잘못된 날짜 처리를 보여줍니다. 러시아어 월 이름 배열을 정의하는 것으로 시작합니다. 그런 다음 코드는 게시물을 처리하는 루프에 들어가지만, 게시물을 두 번 중복해서 확인합니다. 주요 문제는 날짜가 구문 분석되고 표시되는 방식에 있습니다.날짜는 문자열로 검색되어 점을 사용하여 부분으로 분할됩니다. 코드는 두 번째 날짜 부분의 숫자를 검사하여 월 번호를 추출하려고 시도합니다. 월의 첫 번째 숫자가 '0'인지 확인하고, 그렇다면 두 번째 숫자를 가져오고, 그렇지 않으면 첫 번째 숫자를 가져옵니다. 이렇게 추출된 단일 숫자는 월 배열의 인덱스로 사용됩니다.그러나 이 로직은 월 인덱스에 대해 단일 문자만 추출하기 때문에 잘못되었습니다. 연말의 월의 경우 종종 인덱스가 '1'이 되어 실제 월에 관계없이 "January"가 잘못 표시됩니다. 저자는 이를 잔인하다고 강조하며 코드의 지역 설정 특정성을 지적합니다.이 글은 내장 PHP 날짜 함수를 사용하는 것이 간단한 해결책이 될 것이라고 제안합니다. PHP의 유연한 구문은 'if :' 및 'endif'와 같은 대안적인 블록 표기법을 허용하여 코드베이스 내에서 스타일이 혼합되어 혼란을 야기할 수 있다는 점에 대한 부수적인 관찰이 이루어집니다. 저자는 또한 다른 프로그래밍 패러다임을 혼합할 가능성도 언급합니다.
한 아버지가 2012년경부터 시작된 아들들의 IT 경력에 대한 자신의 참여를 회고합니다. 그의 세 아들은 상당한 VIP 지원을 받는 유망한 웹 프로젝트에 취업했습니다. 나중에 그들은 아버지에게 프로젝트에 투자해 달라고 요청했고, 아버지는 그렇게 했습니다. 프로젝트는 지연되어 출시되었고, 예산을 초과했으며, 미완성 상태였습니다. CEO는 문제를 해결하기 위해 아버지를 고용했고, 아버지는 성공적으로 문제를 해결했습니다. 그곳에 있는 동안 그는 프로젝트 입찰가가 5,000달러에서 더 높은 금액까지 다양했으며, 한 공급업체는 인도에서 저렴한 노동력을 아웃소싱할 계획이었다는 것을 발견했습니다. 기능 복원 후 CEO는 페이스북이 해당 언어를 사용한다는 주장에 영감을 받아 프로젝트를 PHP로 재작성해야 한다고 선언했습니다. 재작성 기간을 추정하기 위한 회의가 이어졌고, 대부분은 몇 주밖에 걸리지 않을 것이라고 제안했습니다. 그러나 아버지는 최소 7개월이라는 현실적인 추정치를 제시했습니다. 결과적으로 그는 "충분히 미래지향적이지 않다"는 이유로 해고되었습니다. 그의 아들들은 1년 더 머물면서 연장된 PHP 재작성에 대해 보고했습니다. 저자는 이 경험을 통해 가장 경험이 많은 사람들이 종종 가장 정확하지만 덜 인기 있는 시간 및 비용 추정치를 제공한다는 것을 보여줍니다. 그런 다음 그는 다른 사람들에게 세대 간 직장 기이한 경험을 공유하도록 초대합니다.
제공된 코드는 Qt 애플리케이션 내에서 parametersFilter 함수를 정의하며, 이는 프로브 설계에 사용될 가능성이 높습니다. 이 함수는 프로브 유형, 위치 인덱스, 프로브 설계 목록을 입력으로 받습니다. 입력 매개변수를 기반으로 tofrom이라는 두 개의 문자열 쌍을 생성하는 것을 목표로 합니다. 핵심 로직은 다양한 시나리오를 처리하는 일련의 조건문으로 구성됩니다. 이러한 시나리오에는 pos의 값( -1, 0, 또는 마지막 요소의 인덱스인지 여부)과 probeDesign 목록의 길이가 확인됩니다. 이 함수는 또한 프로브 부분의 type을 확인하며, 특히 "stylus" 요소를 찾습니다. 코드 내의 다양한 분기는 목록이 비어 있거나 요소가 하나만 포함된 경우와 같은 엣지 케이스를 처리합니다. 이러한 조건의 주요 목적은 목록에 대한 경계 검사를 수행하는 것입니다. 일반적인 작업의 대부분은 마지막 else 문에서 발생합니다. 분석에 따르면, 원래 코드는 복잡하지만 아마도 단순화될 수 있습니다. 작성자는 untodesu의 "투 라인"이 함수의 더 간단한 버전이 가능함을 시사하며, 아마도 중복되는 엣지 케이스 처리를 간소화할 수 있다고 추론합니다. 코드의 구조는 원래 개발자가 특정 엣지 케이스를 해결하기 위해 함수를 과도하게 설계했을 수 있음을 나타냅니다. 함수의 복잡성은 제공된 목록 내에서 다른 위치와 프로브 유형을 처리해야 하는 필요성에서 비롯됩니다. 소프트웨어 릴리스 도구에 대한 광고도 텍스트에 포함되어 있습니다.
제공된 텍스트는 어려운 업무 환경에 대한 세 가지 다른 경험을 보여줍니다. 첫 번째 이야기는 익명의 개발자가 겪은 경험을 자세히 설명하는데, 고객의 사소한 문제인 회전하는 새로고침 아이콘이 최우선 과제가 되어 주말 동안 무급 초과 근무를 요구했습니다. 그들의 회사의 초점은 CEO의 중요성에 의해 결정되었으며, 고객의 힘에 기반한 좌절스러운 우선순위 지정을 강조했습니다. Daniel Orner의 두 번째 이야기는 한 회사가 주요 소매업체를 위해 동적인 디지털 전단지를 지속적으로 만들기 위해 "침과 덕트 테이프"를 사용하는 것을 묘사합니다. 이 부적절한 해결책은 8년 동안 기능적이었으며, 처리 능력의 상당 부분을 소비했습니다.마지막 이야기인 Brian의 이야기는 군산복합체 내의 독성적인 업무 환경을 보여줍니다. Brian의 삶은 실제 필요보다 거대 기업에 의해 더 많이 좌우되었습니다. 그는 프로젝트 인수 후 끊임없는 압박, 까다로운 근무 시간, 존중 부족에 직면했습니다. 이 경험은 향후 고용 제안에도 불구하고 해당 산업에 대한 부정적인 인식을 갖게 했습니다. 이 예시들은 일부 업무 환경이 얼마나 어려울 수 있는지를 강조하기 위한 것입니다. 텍스트는 독자들에게 유사한 경험을 제출하도록 요청하는 내용과 ProGet 광고로 마무리됩니다.
CdXz5zHNQW_VMaidyJewz.jpeg