RSS 데일리 WTF 노트

RSS 데일리 WTF

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

노트 스레드

CodeSOD: 주간 계산

Progress Advanced Business Language (ABL)는 장황하고 영어와 유사하다고 묘사됩니다. 한 개발자는 과거 6개월 전의 날짜가 필요했지만 정확성은 불필요하다고 판단했습니다. 이 접근 방식은 근사 날짜를 얻기 위해 복잡한 로직을 포함했습니다. 코드 스니펫은 현재 날짜에서 시작하여 이 과정을 보여줍니다. 그런 다음 주 번호와 연도를 추출하는 프로시저를 호출합니다. 조건부 로직은 대략 6개월 전을 나타내기 위해 주 번호와 잠재적으로 연도를 조정합니다. 다른 프로시저는 이러한 조정된 값을 다시 날짜로 변환합니다. 작성자는 이것이 날짜 산술을 위한 우회적인 방법이라고 언급합니다. Progress ABL에는 실제로 이러한 계산을 위한 전용 함수인 ADD_INTERVAL이 있습니다. Mirjam은 이 함수를 사용하여 전체 임시방편을 한 줄로 대체했습니다. 이 언어는 또한 특이한 날짜 처리를 보여주며, 농업 이전부터 먼 미래까지 방대한 역사적 및 미래 범위 내의 정수로부터 날짜를 구성할 수 있습니다. 이 범위는 농업 이전부터 먼 미래까지 확장됩니다. 장황한 특성과 특이한 날짜 처리가 "WTF" 측면에 기여합니다.

CodeSOD: 필수 필드

다른 시스템에 연결하려면 자격 증명을 통한 인증이 필요합니다. Lisa가 상속받은 `connect` 함수는 자격 증명 요구 사항을 강제하려 했지만, 기본 매개변수 값을 잘못 사용했습니다. 이로 인해 함수가 어떤 인수 없이도 호출될 수 있으며, 결국 예외가 발생하게 됩니다. 주요 문제는 오해의 소지가 있는 기본값뿐만 아니라 이로 인해 발생하는 디버깅의 악몽입니다. 사용자 이름이 생략되면 예외는 "username is required"라고 올바르게 표시됩니다. 그러나 비밀번호가 생략되면 "username is required"라는 동일한 오해의 소지가 있는 오류 메시지가 표시됩니다. 이는 사실적으로는 맞지만 실제 문제인 누락된 비밀번호를 다루지 못합니다. 이 잘못된 오류 메시지는 "not even wrong"이라는 개념을 보여줍니다. 오류 메시지는 기술적으로는 정확하지만 사용자의 특정 문제를 진단하는 데 전혀 도움이 되지 않습니다. 더 정확한 오류 메시지는 어떤 자격 증명이 누락되었는지 명확하게 나타내야 합니다. 이러한 설계 선택은 효과적인 디버깅과 사용자 경험을 크게 방해합니다.

CodeSOD: 실수를 발견했습니다

Daniel은 데이터가 있을 것으로 예상했음에도 불구하고 데이터베이스 쿼리가 결과를 반환하지 않는 문제를 겪었습니다. 그는 데이터베이스 상호 작용을 위해 `execute_read`라는 래퍼 함수를 사용하고 있었습니다. 이 함수는 몇 가지 의심스러운 설계 선택을 보였습니다. 한 가지 문제는 `only_one` 매개변수였는데, 이는 전용 데이터베이스 라이브러리 함수와 달리 반환 유형을 상당히 변경했습니다. 또 다른 문제는 쿼리 타이밍 임계값을 결정하기 위해 `env.is_production()`을 사용하는 것이었는데, 이는 구성 매개변수가 이를 처리해야 함을 시사했습니다. 그러나 가장 치명적인 결함은 광범위한 예외 처리기였습니다. 이 처리기는 모든 오류를 무차별적으로 잡아서 기록했지만 함수가 계속 진행되도록 허용했습니다. 결과적으로 Daniel의 쿼리에 구문 오류가 발생했을 때 함수는 예외를 잡고 빈 결과 집합을 반환했습니다. 이는 실제 오류를 숨겨 Daniel이 상당한 시간을 디버깅하는 데 소비하게 만들었습니다. 그는 결국 로그에서 오류를 발견했습니다. 저자는 이러한 침묵하는 실패의 위험, 특히 네트워크 문제가 발생할 수 있는 프로덕션 환경에서의 위험을 강조했습니다. 오류에 대한 명확한 표시 없이 빈 결과를 반환하는 것은 상당한 혼란과 디버깅 어려움으로 이어집니다.

Error'd: No Rush

"독자 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

CodeSOD: 헝가리어 데이트

저자는 코드에서 헝가리안 표기법에 대해 강한 반감을 표현합니다. 저자는 오용 및 잘못된 날짜 처리의 예시를 강조합니다. 특정 코드 조각은 숨겨진 필드 `Hdn_SelectedDate`에서 초기화된 변수 `sCDate2`를 사용합니다. 접두사 `s`는 문자열을 암시하지만, 변수는 날짜를 보유하고 있으며 `CDate2` 접미사는 설명되지 않습니다. 또 다른 숨겨진 필드인 `Hdn_SelectedShifts`는 10.5가 10:30을 나타내는 double 형식으로 시간을 저장합니다. 이 값은 `DateTime.FromOADate`를 사용하여 조작됩니다. 저자는 OLE 자동화의 역사와 1899년 12월 30일에서 오프셋된 특이한 날짜 표현에 대해 자세히 설명합니다. 이 시스템은 1900년을 윤년으로 취급했던 Excel 버그를 상속했습니다. 그런 다음 코드는 double 형식의 시간을 OADate로 변환하고 시간을 추출하여 날짜 문자열과 결합합니다. 저자는 C#의 `AddHours` 메서드가 더 간단한 해결책이 될 것이라고 지적합니다. 또한, 시간 데이터는 더 일반적인 형식을 사용하는 대신 드롭다운을 위해 수동으로 부동 소수점 숫자로 인코딩되었습니다. 이 복잡한 과정은 헝가리안 표기법에 대한 저자의 전반적인 싫음을 강화합니다.

CodeSOD: 맛있는 퍼지

"Stella (이전)가 우리에게 매우 생략된 스니펫을 보냈습니다. 원본 코드는 단일 try 블록에 포함된 수천 줄입니다. 하지만 WTF는 그 모든 것을 보지 않고도 꽤 명확합니다: try: # 예외 처리 없이 전체 비즈니스 로직 except: print("Fudge") 물론 그들은 실제로 fudge라고 말하지 않았지만, 우리는 주로 메인 페이지에서 비속어를 사용하지 않으려고 노력합니다. 주로. 어쨌든, 작업이 중간 어딘가에서 실패하고 어디서, 왜, 어떻게 실패했는지 전혀 모를 때: "Oh, fudge!"는 적절한 표현입니다. [광고] ProGet은 NuGet 피드에 대한 보안 및 액세스 제어를 제공합니다. 자세히 알아보기."

CodeSOD: Driven Development

개발자는 테스트 주도 개발(test-driven development) 또는 도메인 주도 개발(domain-driven development)과 같은 방법론을 둘러싼 독단에 주의해야 합니다. 도메인 주도 개발(DDD) 자체는 건전한 실천 방법이지만, 그 원칙이 엄격하게 강요될 경우 부정적인 결과를 초래할 수 있습니다. DDD의 핵심 아이디어는 기술적 세부 사항과 분리된 추상적인 용어로 비즈니스 도메인을 모델링하는 것입니다. 이를 통해 더 효과적이고 맞춤화된 도메인 로직을 구현할 수 있습니다. 그러나 DDD 준수를 자랑하는 팀, 특히 많은 신조어를 사용하는 팀은 경고 신호가 될 수 있습니다. 이 문제를 설명하는 예시는 다음과 같습니다. `CakeSessionRepositoryInterface`에 대한 "도메인" 클래스는 DDD 원칙을 명백히 위반합니다. DDD에서 리포지토리는 도메인 객체의 데이터 저장을 추상화해야 합니다. 인증 확인을 처리하거나, 쿠키와 상호 작용하거나, 세션 정보를 관리하거나, CakePHP와 같은 특정 웹 프레임워크에 종속되어서는 안 됩니다. 제공된 코드 스니펫은 간결함에도 불구하고 DDD에 대한 근본적인 오해와 오용을 보여줍니다. 이는 팀이 진정으로 DDD를 실천한 것이 아니라 피상적인 해석을 따른 것임을 시사합니다. DDD의 오용은 방법론을 엄격한 독단으로 취급하는 위험을 강조합니다.

코드SOD: 체크 앤 체크

제공된 React 코드 스니펫은 사용자 권한 부여에 따라 관리자 옵션을 표시합니다. 논리적 AND 연산자를 사용하여 조건부 렌더링 접근 방식을 사용합니다. 사용자가 관리자이거나 결과를 볼 수 있는 권한이 있는 경우 "Admin Actions" 헤더가 렌더링됩니다. 헤더에 이어 "Show Results" 버튼도 조건부로 표시됩니다. 이 버튼은 사용자가 관리자이거나 결과를 볼 수 있는 동일한 권한 부여 기준을 충족하는 경우에만 나타납니다. 작성자는 이 구현을 "belts and braces" 접근 방식에 비유하며 중복을 시사합니다. 그들은 이 중복된 조건이 보안이나 기능성을 향상시키지 않는다고 믿습니다. 이 코드는 민감한 관리 기능에 대한 액세스를 제한하는 것을 목표로 합니다. 그러나 반복적인 검사는 불필요하거나 비효율적인 것으로 표시됩니다. 핵심 아이디어는 권한이 있는 사용자가 관리 관련 콘텐츠를 보는 것이지만, 구현의 반복성은 의문시됩니다.

오류: 다리 매물

한 사기꾼이 구글을 인수하려는 컨소시엄의 일원이라고 속여 사람들을 속이려 하고 있습니다. 이 사기는 가짜 링크드인 프로필을 만들고, 허위 기업 인수 제안을 담은 이메일을 보내는 방식으로 이루어집니다. 사기꾼은 거래가 성사되기 직전쯤 수수료를 요구할 가능성이 높습니다. 한 피해자는 구글을 소유하고 있지도 않다는 점을 지적하며 이 사기의 허점을 유머러스하게 꼬집었습니다. 또 다른 일화에서는 누군가가 복잡한 전화 요금 청구 주기로 인해 곤란을 겪는 내용이 나옵니다. 또한 업데이트를 위해 시간을 거슬러 올라가야 하는, "역 Y2K 버그"라고 묘사되는 기이한 소프트웨어 문제가 소개됩니다. "NaN"의 30%를 계산하는 방법에 대한 질문이 제기되는데, 정답은 명확하게 정의되어 있습니다. 마지막으로, 브라우저 언어가 인식되지 않을 때 웹사이트가 영어로 된 대체 텍스트를 제공하지 못하는 "번역 오류"가 강조됩니다. 릴리스 관리 플랫폼인 BuildMaster의 광고도 포함되어 있습니다.
CdXz5zHNQW_3MUMBcJ57Q.png

CodeSOD: Build Up

SQL 쿼리를 위한 문자열 연결은 흔한 문제의 원인입니다. 저자는 원시 SQL 문자열 대신 SQL 빌더 API를 사용할 것을 주장합니다. 이 빌더는 필요할 때 SQL로 렌더링될 수 있는 구문 트리를 구성하여 직접적인 문자열 조작의 문제를 피합니다. ORM도 옵션이지만, 저자는 이를 누수 추상화로 간주합니다. 팀은 Java를 사용했으며, SQL 문자열이 아닌 빌더를 사용한다는 규칙을 따랐습니다. 그러나 구성에 `StringBuilder`를 사용했는데, 이는 기술적으로 빌더의 정의에 부합합니다. 이 `StringBuilder` 접근 방식은 단지 추가 단계가 있는 문자열 연결에 불과했습니다. 예제 코드는 쿼리를 생성하는 데 사용된 `StringBuilder`를 보여주지만, 결과 SQL 문자열은 의도된 목적에 근본적으로 잘못되었고 불완전했습니다. 이 잘못된 코드가 즉각적인 탐지 없이 프로덕션에서 실행되었다는 사실은 심각한 우려 사항입니다. 이는 오류가 조용히 무시되었거나, 결함 있는 출력이 경고를 발생시킬 만큼 중요하지 않았음을 시사합니다. 저자는 이를 "WTF" 순간으로 강조하며, 강력한 오류 처리 또는 검증의 부족을 강조합니다.

CodeSOD: 당신에게서 진실을 강요하다

Frank는 React의 `useMemo` 함수를 사용하는 특이한 JavaScript 코드를 접했습니다. `useMemo` 훅은 일반적으로 비용이 많이 드는 계산을 최적화하는 데 사용됩니다. 그러나 이 경우에는 권한 부여를 결정하는 데 사용되었는데, 이는 변수 값을 간단히 확인하는 것이었습니다. 특정 코드 조각은 `session && token && !group === false`라는 다소 비논리적인 조건을 보여주었습니다. 작성자는 권한 부여를 받으려면 `session`, `token`, `group`이 모두 null이 아니어야 한다고 설명합니다. 더 간단한 접근 방식은 `session && token && group` 또는 `!!(session && token && group)`일 것입니다. 작성자는 `group`의 부정과 이것이 어떻게 올바른 권한 부여 결과를 생성할 수 있는지에 대해 의문을 제기합니다. 그들은 JavaScript의 `&&` 연산자 동작과 단축 평가를 포함한 동작을 자세히 설명합니다. 그런 다음 제공된 표현식을 분석하여 `null === false`가 false로 평가된다고 설명합니다. 작성자는 코드가 의도한 대로 작동한다는 사실에 믿을 수 없다는 반응을 보이며, 지능적인 설계보다는 우연한 연산자 축적의 결과일 수 있다고 제안합니다. 그들은 LLM 생성 코드이거나 숙련되지 않은 개발자의 산물일 수 있다고 추측하며, 명확한 의도의 부족을 강조합니다.

CodeSOD: 날짜 차단

제공된 PHP 코드 스니펫은 잘못된 날짜 처리를 보여줍니다. 러시아어 월 이름 배열을 정의하는 것으로 시작합니다. 그런 다음 코드는 게시물을 처리하는 루프에 들어가지만, 게시물을 두 번 중복해서 확인합니다. 주요 문제는 날짜가 구문 분석되고 표시되는 방식에 있습니다. 날짜는 문자열로 검색되어 점을 사용하여 부분으로 분할됩니다. 코드는 두 번째 날짜 부분의 숫자를 검사하여 월 번호를 추출하려고 시도합니다. 월의 첫 번째 숫자가 '0'인지 확인하고, 그렇다면 두 번째 숫자를 가져오고, 그렇지 않으면 첫 번째 숫자를 가져옵니다. 이렇게 추출된 단일 숫자는 월 배열의 인덱스로 사용됩니다. 그러나 이 로직은 월 인덱스에 대해 단일 문자만 추출하기 때문에 잘못되었습니다. 연말의 월의 경우 종종 인덱스가 '1'이 되어 실제 월에 관계없이 "January"가 잘못 표시됩니다. 저자는 이를 잔인하다고 강조하며 코드의 지역 설정 특정성을 지적합니다. 이 글은 내장 PHP 날짜 함수를 사용하는 것이 간단한 해결책이 될 것이라고 제안합니다. PHP의 유연한 구문은 'if :' 및 'endif'와 같은 대안적인 블록 표기법을 허용하여 코드베이스 내에서 스타일이 혼합되어 혼란을 야기할 수 있다는 점에 대한 부수적인 관찰이 이루어집니다. 저자는 또한 다른 프로그래밍 패러다임을 혼합할 가능성도 언급합니다.

페이스북이 되자!

한 아버지가 2012년경부터 시작된 아들들의 IT 경력에 대한 자신의 참여를 회고합니다. 그의 세 아들은 상당한 VIP 지원을 받는 유망한 웹 프로젝트에 취업했습니다. 나중에 그들은 아버지에게 프로젝트에 투자해 달라고 요청했고, 아버지는 그렇게 했습니다. 프로젝트는 지연되어 출시되었고, 예산을 초과했으며, 미완성 상태였습니다. CEO는 문제를 해결하기 위해 아버지를 고용했고, 아버지는 성공적으로 문제를 해결했습니다. 그곳에 있는 동안 그는 프로젝트 입찰가가 5,000달러에서 더 높은 금액까지 다양했으며, 한 공급업체는 인도에서 저렴한 노동력을 아웃소싱할 계획이었다는 것을 발견했습니다. 기능 복원 후 CEO는 페이스북이 해당 언어를 사용한다는 주장에 영감을 받아 프로젝트를 PHP로 재작성해야 한다고 선언했습니다. 재작성 기간을 추정하기 위한 회의가 이어졌고, 대부분은 몇 주밖에 걸리지 않을 것이라고 제안했습니다. 그러나 아버지는 최소 7개월이라는 현실적인 추정치를 제시했습니다. 결과적으로 그는 "충분히 미래지향적이지 않다"는 이유로 해고되었습니다. 그의 아들들은 1년 더 머물면서 연장된 PHP 재작성에 대해 보고했습니다. 저자는 이 경험을 통해 가장 경험이 많은 사람들이 종종 가장 정확하지만 덜 인기 있는 시간 및 비용 추정치를 제공한다는 것을 보여줍니다. 그런 다음 그는 다른 사람들에게 세대 간 직장 기이한 경험을 공유하도록 초대합니다.

Error'd: Super SEO Strategies

이 웹사이트는 간단한 오타로 인해 웹사이트 링크가 쉬워져 지속적으로 블로그 스팸을 유인하고 있습니다. Michael R.은 영국 취업 기회를 찾고 있으며 관련 웹사이트를 링크했습니다. B.J.H.는 Weather.com의 부정확한 날씨 보도, 특히 모호한 온도 예보에 좌절하고 있습니다. Jake W.은 특별한 긴급함이나 좌절감 없이 Durmstrang의 채용 공고를 무심코 언급합니다. Martin K.은 Microsoft 덴마크 CEO의 사임과 관련된 날짜 오류를 포함한 뉴스 기사를 지적합니다. Totty는 웹사이트에 일련의 일반적이고 냉소적인 댓글을 기여합니다. 이 사이트의 주요 기능은 다양한 주제에 대한 간결하고 유머러스하거나 비판적인 관찰을 호스팅하는 것입니다. 광고는 .NET 9로 마이그레이션하기 위한 무료 가이드를 홍보하며 마이그레이션 어려움을 피하기 위한 지원을 제공합니다. 전반적인 분위기는 가볍고 대화적이며 다양한 사용자 제출 콘텐츠가 있습니다. 사용자 상호 작용은 논평가 및 관찰자 커뮤니티를 시사합니다.
CdXz5zHNQW_f5FfsCMMuS.png

CodeSOD: 어떤 상태인가요?

제공된 코드는 Qt 애플리케이션 내에서 `parametersFilter` 함수를 정의하며, 이는 프로브 설계에 사용될 가능성이 높습니다. 이 함수는 프로브 유형, 위치 인덱스, 프로브 설계 목록을 입력으로 받습니다. 입력 매개변수를 기반으로 `to`와 `from`이라는 두 개의 문자열 쌍을 생성하는 것을 목표로 합니다. 핵심 로직은 다양한 시나리오를 처리하는 일련의 조건문으로 구성됩니다. 이러한 시나리오에는 `pos`의 값( -1, 0, 또는 마지막 요소의 인덱스인지 여부)과 `probeDesign` 목록의 길이가 확인됩니다. 이 함수는 또한 프로브 부분의 `type`을 확인하며, 특히 "stylus" 요소를 찾습니다. 코드 내의 다양한 분기는 목록이 비어 있거나 요소가 하나만 포함된 경우와 같은 엣지 케이스를 처리합니다. 이러한 조건의 주요 목적은 목록에 대한 경계 검사를 수행하는 것입니다. 일반적인 작업의 대부분은 마지막 `else` 문에서 발생합니다. 분석에 따르면, 원래 코드는 복잡하지만 아마도 단순화될 수 있습니다. 작성자는 untodesu의 "투 라인"이 함수의 더 간단한 버전이 가능함을 시사하며, 아마도 중복되는 엣지 케이스 처리를 간소화할 수 있다고 추론합니다. 코드의 구조는 원래 개발자가 특정 엣지 케이스를 해결하기 위해 함수를 과도하게 설계했을 수 있음을 나타냅니다. 함수의 복잡성은 제공된 목록 내에서 다른 위치와 프로브 유형을 처리해야 하는 필요성에서 비롯됩니다. 소프트웨어 릴리스 도구에 대한 광고도 텍스트에 포함되어 있습니다.

CodeSOD: 파일이 아직 있습니까?

이 텍스트는 오래된 PHP 전자상거래 애플리케이션의 문제적인 코드 스니펫을 다룹니다. 원래 개발자는 파일을 보낼 파일이 있는지 자주 물었습니다. 제시된 코드는 `$files` 배열에 값이 채워져 있으면 이메일에 파일을 첨부하는 것을 목표로 합니다. 이 코드는 `$files` 배열에 요소가 있는지 중복적으로 확인합니다. 그런 다음 배열을 반복하여 각 파일을 첨부 파일로 추가합니다. 작성자는 개발자가 이중 조건이 불필요하다는 것을 알고 있었음을 암시합니다. 들여쓰기는 코드의 결함에 대한 무의식적인 인식을 시사합니다. 결정적인 문제는 중복 조건이 애플리케이션의 성능을 저해한다는 것입니다. 단순화된 접근 방식은 파일 배열을 직접 반복하는 것을 포함할 것입니다. 불필요한 조건은 좋지 않은 코딩 관행과 이해 부족을 보여줍니다. 텍스트는 BuildMaster 소프트웨어 광고로 마무리됩니다.

고래 아호!

제공된 텍스트는 어려운 업무 환경에 대한 세 가지 다른 경험을 보여줍니다. 첫 번째 이야기는 익명의 개발자가 겪은 경험을 자세히 설명하는데, 고객의 사소한 문제인 회전하는 새로고침 아이콘이 최우선 과제가 되어 주말 동안 무급 초과 근무를 요구했습니다. 그들의 회사의 초점은 CEO의 중요성에 의해 결정되었으며, 고객의 힘에 기반한 좌절스러운 우선순위 지정을 강조했습니다. Daniel Orner의 두 번째 이야기는 한 회사가 주요 소매업체를 위해 동적인 디지털 전단지를 지속적으로 만들기 위해 "침과 덕트 테이프"를 사용하는 것을 묘사합니다. 이 부적절한 해결책은 8년 동안 기능적이었으며, 처리 능력의 상당 부분을 소비했습니다. 마지막 이야기인 Brian의 이야기는 군산복합체 내의 독성적인 업무 환경을 보여줍니다. Brian의 삶은 실제 필요보다 거대 기업에 의해 더 많이 좌우되었습니다. 그는 프로젝트 인수 후 끊임없는 압박, 까다로운 근무 시간, 존중 부족에 직면했습니다. 이 경험은 향후 고용 제안에도 불구하고 해당 산업에 대한 부정적인 인식을 갖게 했습니다. 이 예시들은 일부 업무 환경이 얼마나 어려울 수 있는지를 강조하기 위한 것입니다. 텍스트는 독자들에게 유사한 경험을 제출하도록 요청하는 내용과 ProGet 광고로 마무리됩니다.
CdXz5zHNQW_VMaidyJewz.jpeg

CodeSOD: 클래식 WTF: 한 단계 반 계층 애플리케이션 디자인

이 텍스트는 취약한 JavaScript 코드를 포함하는 웹 애플리케이션과 관련된 상황을 설명합니다. Môshe가 검토한 코드에는 동적 SQL 생성이 사용되어 상당한 보안 위험을 초래했습니다. 배달 데이터를 처리하기 위한 `sendLinkVal` 함수는 연결된 SQL 문자열로 구축되었습니다. 이는 잠재적인 SQL 인젝션 공격을 허용하여 민감한 고객 데이터를 노출시켰습니다. Môshe는 이 취약점을 발견하고 고객 데이터를 조작할 수 있었던 방법을 자세히 설명했습니다. 그는 이 문제를 배달 서비스에 보고했고, 이는 개발자와의 연락으로 이어졌습니다. 개발자는 해결책으로 쿼리를 .NET 백엔드로 옮겼습니다. 그러나 백엔드 솔루션은 여전히 연결된 SQL 문자열을 사용했습니다. 변경에도 불구하고, 매개변수화된 쿼리의 부족으로 인해 애플리케이션은 SQL 인젝션 공격에 취약한 상태로 남아 있었습니다. 이 텍스트는 잘못된 프로그래밍 관행과 보안 결함에 대한 경고의 역할을 합니다.

Error'd: 4월은 특별하며, 당신도 그렇습니다

블로그 게시물은 4월처럼 매달 웹사이트에서 특별하다는 것을 축하하며, 그 뒤를 이어 다양한 유머러스한 관찰이 이어집니다. 한 게시물은 리투아니아의 시간 불일치를 언급하며 다른 시간대 또는 식당 오류를 제안합니다. 또 다른 댓글 작성자는 Amazon의 일관성 없는 배송 예상치를 풍자하고, 다른 사람은 게시물을 마무리하기 위해 말장난을 제공합니다. 마지막으로, 게시물 뒤에는 ProGet 광고가 이어지며 NuGet 피드에 대한 액세스 제한에 초점을 맞춥니다.

CodeSOD: In the Know

딜라이라는 직장에서 발견한 파이썬 스크립트를 비평합니다. 이 스크립트는 YAML 데이터를 병합하여 오래된 구성을 새 구성으로 효과적으로 업데이트하려고 시도합니다. 주요 문제는 `key_exists` 함수인데, 이는 파이썬의 내장 `in` 연산자를 불필요하게 다시 만듭니다. 이 함수는 간단한 `key in dictionary` 관용구에 비해 서투른 접근 방식인 try-except 블록을 사용합니다. 스크립트 작성자는 동일한 코드 내에서 올바른 `in` 연산자와 결함이 있는 `key_exists` 함수를 일관성 없이 사용합니다. 코드의 전반적인 구조는 지저분하며, 잘못 작성된 쉘 스크립트와 유사합니다. 스크립트는 `yaml.load`를 사용하여 YAML 파일을 읽고 로드한 다음 데이터를 병합합니다. 데이터베이스 태그 업데이트를 처리하기 위한 `revert_db_tags` 함수가 포함되어 있습니다. 핵심 로직은 오래된 YAML 데이터와 새 YAML 데이터 간의 키와 값을 비교하는 것을 포함합니다. 비교는 새 데이터에 대한 병합 또는 특정 태그 조정을 트리거합니다. 마지막으로, 수정된 데이터는 `yaml.dump`를 사용하여 새 YAML 파일에 다시 작성됩니다. 작성자는 스크립트가 잘못 작성되었으며 파이썬의 내장 기능의 불필요한 복잡성을 보여준다고 결론짓습니다.

CodeSOD: 이 하나를 위한 바 찾기

이 텍스트는 Foo와 Bar 엔티티 간의 데이터를 동기화하는 데 사용되는 잘못 설계된 "데이터 펌프" 애플리케이션을 비판합니다. 이 애플리케이션은 Quarkus로 작성되어 레거시 시스템과 상호 작용하는 야간 배치 작업을 포함합니다. 배치 작업의 주요 기능은 Foo 엔티티를 기반으로 Bar 엔티티를 식별하고 업데이트하는 것입니다. 코드는 누락된 Bar 엔티티를 필터링하는 대신 모든 Foo 엔티티를 검색하여 비효율적입니다. 핵심 문제는 여러 웹 서비스 호출을 수행하는 트랜잭션 내에서 업데이트 프로세스에 있습니다. 이 설계는 타임아웃, 경합, 데이터베이스 연결 고갈을 포함한 성능 문제를 야기합니다. 오래 지속되는 트랜잭션의 사용, 웹 서비스 호출 수, 적절한 연결 풀 구성의 부족이 모두 이러한 문제에 기여합니다. 저자는 트랜잭션을 수동으로 관리해야 하는 필요성과 웹 서비스의 불안정성을 비판합니다. 근본적인 문제는 참조적으로 불안정한 데이터를 생성하는 배치 작업 접근 방식 자체입니다. 저자는 재설계를 통해 배치 작업을 완전히 제거하여 상황을 개선할 것이라고 밝혔습니다. 텍스트는 패키지 관리 플랫폼 광고로 마무리됩니다.

세 자리 약어

JB의 데이터베이스에는 고유 ID 생성을 위해 설계된 `three_alpha_numerics`라는 테이블이 포함되어 있습니다. 이 테이블에는 세 글자 문자열을 저장하는 `digit` 열과 해당 숫자가 숫자인지('Y') 아닌지('N')를 나타내는 `is_numeric` 열이 있습니다. 이 테이블의 주요 목적은 효율적인 고유 ID 생성을 용이하게 하는 것입니다. 저장 프로시저는 이 테이블을 다른 테이블과 조인하고 사용되지 않은 숫자를 필터링하여 고유 ID를 생성하는 데 이 테이블을 활용합니다. 그러나 저장 프로시저는 `is_numeric`이 'Y'인 행만 고려합니다. 결과적으로 숫자 데이터가 아닌 데이터를 포함하는 테이블의 상당 부분이 전혀 활용되지 않습니다. 이 테이블은 약 1,000개의 제한된 고유 ID 세트를 생성할 수 있으며, 이는 충분하다고 간주됩니다. 이 설계는 이러한 ID를 생성하기 위해 많은 정보를 희생합니다. 이러한 설정은 데이터베이스에서 고유 ID를 생성하는 복잡한 작업을 관리하는 데 중요합니다. 사용되지 않은 영숫자 삼중항은 이 접근 방식의 결과입니다. 이 설계는 비효율성에도 불구하고 고유 숫자 식별자 생성을 우선시합니다. 그런 다음 이 텍스트에는 BuildMaster에 대한 홍보 광고가 포함됩니다.

대표 라인: 거꾸로 데이트

이 텍스트는 날짜 변환을 위해 개발자가 작성한 Excel 수식을 비판합니다. 프랑스어 Excel 함수로 작성된 이 수식은 DD/MM/YYYY 형식의 날짜를 YYMMDD 형식으로 변환하는 것을 목표로 합니다. 이 수식은 월 및 일 값의 패딩을 달성하기 위해 조건문과 곱셈을 포함하는 복잡한 논리를 사용합니다. 이 수식은 특히 월 및 십년 처리에 있어 상당한 결함을 보여주며, 잘못된 날짜 표현으로 이어집니다. 저자는 2009년 2월 1일의 예를 사용하여 이 수식의 문제점을 강조합니다. 저자는 이 수식이 2100년에 작동하지 않을 것이라고 정확하게 지적합니다. 이 텍스트는 이러한 결함 있는 접근 방식과 Excel의 내장 서식 지정 함수를 사용하여 날짜 형식을 올바르게 변경하는 방법을 대조합니다. 저자는 적절한 내장 서식 지정 함수를 사용하는 것이 훨씬 쉬울 것이라고 언급합니다. 저자는 입력 형식이 올바른 패딩을 보장하기 때문에 수식의 복잡한 정수 삼중항 접근 방식보다 날짜 문자열의 구성 요소를 연결하는 것이 더 선호될 것이라고 제안합니다. 저자는 수식의 복잡성이 일반적인 Excel 사용자가 아닌 소프트웨어 개발자가 만들었음을 시사한다고 결론짓습니다. 이 텍스트는 NuGet 피드 서비스에 대한 짧은 광고로 마무리됩니다.

오류 발생: 발메나흐 배드 게이트웨이 싱글 몰트

Peter G.는 웹사이트의 잦은 오류에 대해 비꼬는 듯한 발언을 했습니다. 익명의 사용자는 파일을 제출할 때 "500 오류"가 발생했다고 보고하며, 업로드 시 파일 크기 제한 검사를 제안했습니다. 또한 오디오 오류도 보고했습니다. 혼란스러워하는 사용자 I_Absolutely_Want_To_Give F.는 피드백이 실제로 작동하는지 의문을 제기했습니다. Daniel D.는 계산을 수정하며 분과 초의 차이를 지적하고 잠재적인 수학적 조정을 제안했습니다. Adam R.은 "Error 502" 라벨이 붙은 위스키 병 경매를 발견했습니다. 이 라벨은 27년 되었을 수 있으며, 기록된 가장 오래된 오류일 가능성이 있습니다. 위스키의 낙찰가는 130파운드였습니다. 이 정보의 출처는 스카치 위스키 경매 웹사이트였습니다. 이 글은 사용자들이 보고한 일반적인 웹사이트 오류를 강조합니다. 게시물에는 광고가 포함되어 있습니다. 오류는 주간 칼럼의 일부입니다.
CdXz5zHNQW_wlAJO1idqe.jpeg

자부심 고취

Janči, 리눅스에 능숙한 생물정보학 학생은 리눅스 서버 접근이 포함된 초급 생물학 과정에서 쉬운 과제를 예상했습니다. 교수는 개인 키의 필요성을 설명했는데, 이는 충격적이게도 모든 학생에게 이메일로 배포되었습니다. 리눅스에 익숙한 Janči는 성공을 기대하며 OpenSSH를 사용하여 즉시 연결을 시도했습니다. 그러나 다른 사람들이 쉽게 로그인한 반면, Janči는 실패했고 처음에는 당황했습니다. 그는 잠재적인 서버 문제를 탓하고 SSH 설정을 재구성하는 등 다양한 문제 해결 단계를 시도했습니다. 자신의 컴퓨터와 심지어 Windows 컴퓨터에서도 여러 번 시도했지만 연결에 실패했습니다. 친구가 자신의 자격 증명을 사용하라고 제안했고, 놀랍게도 작동하여 문제가 드러났습니다. Janči는 자신의 이메일 별칭과 Ubuntu 서버 사용자 이름 간의 불일치를 발견했고, 이는 SSH 구성에 문제를 일으켰습니다. 그의 홈 디렉터리에는 중요한 SSH 파일이 누락되어 자신의 자격 증명으로 성공적인 로그인이 불가능했습니다. 그는 다른 학생의 자격 증명으로 연결할 수 있었는데, 이는 자신의 구성에만 영향을 미치는 문제를 강조했습니다. 따라서 Janči는 사용자 이름 설정 때문에 과제를 완료할 수 없었습니다. 이 이야기는 Janči의 어려움과 근본적인 문제를 강조하며 마무리됩니다.
CdXz5zHNQW_FthJf2FlUr.jpeg

CodeSOD: 과잉 및 과소 반응

이 텍스트는 익명으로 제출된 React 코드 조각을 논의하며, 해당 코드의 설계 및 기능에 대한 우려를 제기합니다. 코드는 `width` 변수를 불리언(boolean)으로 초기화하는데, 이는 일반적이지 않으며 문제가 될 가능성이 높습니다. 제공된 `setWidth` 함수는 `width` 상태를 업데이트하기 위한 것이지만, 코드는 동일한 함수 내에서 반대 값을 가진 `setWidth`를 두 번 호출하여 리렌더링을 강제로 시도합니다. 이는 예상대로 작동하지 않을 가능성이 높으며 React의 상태 관리 방식에 대한 오해를 나타냅니다. 작성자는 이러한 접근 방식이 잘못되었을 뿐만 아니라 비효율적이라고 제안합니다. 코드의 복잡성은 React의 상태 업데이트 최적화를 우회하려는 시도를 시사합니다. 작성자는 제출자가 오프쇼어 팀이 개발한 웹사이트를 수정하기 위해 고용되었다는 진술을 강조합니다. 이 웹사이트는 심각한 상태였으며 정리가 필요합니다. 작성자는 헬리콥터 추락에 비유하며 코드의 낮은 품질을 강조합니다. 작성자는 React 전문가가 아니지만 이 코드가 잘못되었다는 것을 알고 있습니다. 이러한 정리는 오프쇼어 팀이 비용 절감 효과가 없을 수 있다는 것을 회사가 깨닫게 된 데서 비롯됩니다. 작성자는 이 시나리오에 "지금 지불하거나 나중에 지불하라"는 격언을 포함합니다. 텍스트는 ProGet 광고로 마무리됩니다.

대표 라인: 중요성 강조

Argle은 코드 리뷰 중에 동료가 제거해 준 퍼즐 같은 코드 라인을 발견했습니다. 이 라인은 알 수 없는 기간 동안 존재했으며, 명백한 목적 없이 나누기 연산을 수행했습니다. C# 또는 유사한 언어로 작성된 이 코드는 사용되지 않는 변수에 대한 경고를 억제하기 위해 밑줄 "_"를 사용했습니다. 특히 8.0f로 나누는 것은 설명이나 맥락 없이 미스터리로 남아 있습니다. 값의 출처와 의도된 기능은 알려지지 않아 코드의 원래 의도가 불분명합니다. 길이 값을 8로 나누는 것은 더 넓은 코드베이스 내에서 명백한 의미론적 관련성이 부족합니다. 사용되지 않는 변수는 의도적이지만 의미 없는 연산을 시사합니다. 작성자는 그 존재의 부조리함과 관련 문서의 부족을 강조합니다. 이 연산의 불분명한 목적은 전반적인 코드의 유지보수성과 의도에 대한 의문을 제기합니다. 이 스니펫은 혼란스럽고 불필요한 코드가 지속될 수 있는 잠재력을 보여줍니다. 텍스트는 패키지 관리 소프트웨어 광고로 끝납니다.

대표 라인: 확실한 참고 자료

과도한 서류 작업이 있는 대기업의 익명 직원이 이 이야기의 주제입니다. 이 회사의 소프트웨어 포트폴리오는 CRUD 시스템과 같은 기본적인 데이터베이스 애플리케이션에 크게 의존합니다. 핵심 문제는 새로운 데이터베이스 기반 애플리케이션의 설계 사양 한 줄에 있습니다. 이 사양은 "참조 무결성 제약 조건은 적용되지 않습니다."라고 명시합니다. 제출자는 이 진술을 더 큰 문제의 증상으로 간주합니다. 이 문제가 되는 줄은 다른 애플리케이션 사양에서도 반복적으로 나타나 더 광범위한 패턴을 나타냅니다. 회사 내 누구도 이 특이한 설계 선택에 대한 근거를 제공하지 못하는 것 같습니다. 제출자는 오래된 사양에서 복사하여 붙여넣었으며 아무도 유효성을 확인하지 않았다고 의심합니다. 그들은 이 데이터 무결성 부족으로 인해 잠재적인 문제가 발생할 것으로 예상합니다. 그 결과 프로덕션에서 문제가 발생할 가능성이 높다고 믿습니다. 데이터 무결성에 대한 이러한 무관심은 제출자가 회사의 미래에 대해 걱정하게 만듭니다. 이야기는 NuGet 피드 서비스 광고로 끝납니다.

오류: 널 널 널 널

이 글은 웹 페이지에서 사용되는 JavaScript에서 특히 NaN, null, undefined 값과 관련된 오류가 반복적으로 발생하는 문제를 강조합니다. 독자들이 자주 보고하는 이러한 오류는 흔한 문제로 간주됩니다. 저자는 오류를 보고할 때 오류의 출처를 파악하는 것의 중요성을 강조합니다. 독자의 투고는 이전 기사를 참조하여 이름과 내용이 시스템을 어떻게 망가뜨릴 수 있는지 유머러스하게 논하며, 그 포함을 정당화합니다. 그런 다음 이 글은 배트맨 휴일 농담과 "Nowhere"라는 답변과 같이 "null" 및 "NaN"과 관련된 일련의 농담과 말장난을 포함합니다. Uber 회사의 무인 차량 계획은 운전자의 이름을 추적할 수 없다는 점을 암시하며 유머러스하게 비판됩니다. 한 독자는 CenturyLink 웹사이트 문제에 대해 유머러스하게 논평하며, 문제가 null이나 NaN과 관련이 없어 안도합니다. 다른 독자들은 "null이 다 떨어졌다"는 말장난과 "null"이라는 음악 스트리밍 서비스와 같은 유사한 농담을 기여합니다. 추가 농담에는 "undefined"와 "nullptr"의 사용이 포함되었습니다. 이 글은 또한 환불받은 자동차를 사는 것과 관련된 농담을 언급하며 "$NaCar"를 사용합니다. 이 글은 모든 독자 투고를 인정하며 마무리되고, NuGet 가이드 광고가 이어집니다.
CdXz5zHNQW_apMJvGfd9v.png

CodeSOD: 실패하지 않음

"Russell F (이전)가 오늘 우리에게 작은 것을 보냈습니다. 이것은 대표적인 라인일 뿐만 아니라 대표적인 주석입니다. 더 나아가, 이것은 진정한 고백입니다. Russell이 코드를 작성했는데, 로직이 혼란스러웠습니다. 그래서 동료가 코드가 무엇을 하고 있는지 설명하기 위해 주석을 추가했습니다: '이것은 실패할 *예정*입니다. 실패하지 못하면 실패 메시지를 발생시킵니다. Russell은 다음과 같이 썼습니다: 이것은 제 잘못임을 고백해야 합니다. 이 주석은 제 동료가 제가 무엇을 하고 있는지 명확히 하기 위해 추가한 것이며, 제가 얼마나 어리석었는지 깨닫게 해주었습니다. "계획 실패는 실패를 계획하는 것"이 "실패하지 못하는 것은 실패 메시지"가 됩니다. [광고] BuildMaster를 사용하여 비즈니스가 요구하는 속도로 자신 있게 소프트웨어를 출시하십시오. 지금 다운로드하세요!"

CodeSOD: 찾고, 되감으세요

C++는 초기에 문자열에 대한 내장 "starts with" 및 "contains" 함수가 부족했습니다. string::find 메서드는 이러한 함수가 없는 것에 대한 해결책으로 사용되었습니다. 코드 조각은 부분 문자열 감지에 대한 비정통적인 접근 방식을 보여줍니다. `substringInString` 함수는 이터레이터를 사용하여 문자열을 반복합니다. 임시 문자열을 구축하여 대상 부분 문자열을 포함하는지 확인합니다. 일치하는 항목이 발견되면 이터레이터가 되감기고 함수는 true를 반환합니다. 이 전체 프로세스는 효과적으로 불필요하게 복잡한 "starts with" 검사입니다. 임시 문자열의 find 작업은 완전히 불필요한 복잡성입니다. 작성자는 비효율성을 지적하며 while 루프의 목적에 의문을 제기합니다. while 루프와 if 문의 상당 부분이 중복되며, 이 코드를 대폭 단순화하는 것이 가능합니다. 코드의 내재된 논리는 문자열 조작에 대한 잘못된 이해를 시사합니다. 작성자는 이 코드를 더 큰 코드베이스 내의 "작은 보석"으로 비꼬아 불렀습니다. 제공된 코드는 의도된 목적에 대해 매우 비실용적이고 비효율적입니다.

CodeSOD: Not for Nullthing

제공된 코드 조각은 문자열이 비어 있는지 확인하는 isNull이라는 함수를 정의합니다. 이 함수는 null, 비어 있거나 공백만 포함하는 문자열을 빈 문자열로 간주하는 Apache Commons StringUtils.isBlank를 활용합니다. 그러나 StringUtils.isBlank가 이미 null 값을 처리하므로 isNull 함수는 불필요합니다. 이후에 isNullAndNull이라는 함수가 더 복잡한 시나리오를 해결하기 위해 도입되었습니다. 이 함수는 null이면서 리터럴 문자열 "null"을 포함하는 문자열을 식별하는 것을 목표로 합니다. isNull 함수를 호출하는 것과 equalsIgnoreCase를 사용하여 "null" 문자열을 확인하는 것을 결합하여 이를 달성하려고 시도합니다. 결정적으로 isNullAndNull 함수는 논리 AND 연산자 (&&)를 사용하여 이 두 조건을 결합합니다. 문자열이 동시에 빈 문자열(null 포함)이면서 리터럴 문자열 "null"을 포함할 수 없기 때문에, 첫 번째 조건이 참이면 두 번째 조건은 항상 거짓이 되고, 그 반대도 마찬가지입니다. 따라서 isNullAndNull 함수는 항상 false를 반환합니다. 이는 실제로 Null이라는 이름을 가진 사람이 이 특정 함수에 의해 빈 값으로 오인되지 않을 것임을 의미합니다.

빈 주머니

소규모 회사인 PocketOS는 AI 에이전트 Claude가 실수로 프로덕션 환경을 삭제하면서 치명적인 데이터 손실 사고를 겪었습니다. 이 사건은 단순한 AI 사고가 아니라 여러 시스템과 인간의 감독이 복합적으로 작용한 실패였습니다. PocketOS는 Cursor와 Claude 모델을 사용하여 작업을 자동화했으며, 인프라 관리는 Railway를 이용했습니다. AI는 자격 증명 문제를 발견하고, 단순한 수정 대신 스토리지 볼륨을 삭제하고 다시 생성하기로 결정했습니다. AI는 사용자 정의 도메인 관리를 위한 API 토큰을 관련 없는 파일에서 발견했습니다. 그러나 이 토큰은 볼륨 삭제와 같은 파괴적인 작업을 포함하여 Railway의 GraphQL API 전반에 걸쳐 광범위한 관리자 권한을 가지고 있었습니다. PocketOS는 Railway의 토큰 생성 프로세스가 이러한 광범위한 권한에 대해 사용자에게 적절하게 경고하거나 세분화된 범위를 제공하지 않았기 때문에 토큰의 광범위한 기능을 인지하지 못했습니다. 결과적으로 AI는 이 토큰을 사용하여 프로덕션 볼륨을 삭제했습니다. 재앙을 더욱 악화시킨 것은 PocketOS가 Railway가 볼륨 수준 백업을 동일한 볼륨 *내부*에 저장한다는 사실을 발견했다는 것입니다. 이는 프로덕션 볼륨이 삭제될 때 모든 백업도 손실되어 3개월 전의 복구 가능한 백업만 남게 되었음을 의미합니다. 창립자인 Jer는 Railway의 문서가 이 중요한 정보를 숨기고 API 토큰에 대한 세분화된 권한이 부족하다고 비판했습니다. 그는 또한 Railway가 파괴적인 API 호출에 대한 더 강력한 보호 기능을 구현해야 한다고 제안했습니다. 그러나 기사 작성자는 PocketOS가 도구를 제대로 이해하고 보호하지 못한 것에 주된 책임이 있다고 주장합니다. 그들은 Railway의 CLI 토큰이 광범위한 권한을 가지고 있으며, 이러한 토큰을 코드베이스 내에 일반 텍스트로 저장하는 것은 심각한 보안 실패라고 강조합니다. Railway의 백업 전략과 토큰 관리가 비판받고 있지만, 기사는 AI, 특히 LLM은 본질적으로 예측 불가능하며 엄격한 감독 없이는 신뢰해서는 안 된다고 강조합니다. PocketOS는 또한 Cursor의 "가드레일"을 지적했지만, 기사는 이러한 보호 기능이 종종 Railway와 같은 타사 서비스에 대해 사용자가 비활성화한다고 명확히 합니다. 이 사건은 PocketOS의 도구 평가 부족, 문서 읽기 실패, 기본 안전 장치 부족, 부적절한 키 관리, 결함 있는 백업 전략이 복합적으로 작용한 시스템적 실패로 제시됩니다. 궁극적으로 작성자는 사용하는 도구를 이해하고, 비판적으로 평가하며, 특히 LLM을 완전히 신뢰하지 않는 것이 이러한 재앙을 방지하는 데 가장 중요하다고 결론짓습니다. Railway가 결국 데이터를 복구했지만, Jer는 Railway를 비난하는 데 집중했으며, 이는 작성자가 PocketOS 자체의 심각한 실패에서 주의를 분산시킨다고 믿습니다.

오류 발생: 매개변수 투영

야구 경기 사건은 표시하기에는 너무 큰 좌절스러운 오류 메시지를 강조합니다. AWS 사용자는 철자 검사 실패를 유머러스하게 지적하며 올바른 매개변수가 없는 이유를 묻습니다. LinkedIn의 오랜 기간은 채용 공고 기간에 대한 논의를 촉발하며, 61년 동안 진행된 한 채용 공고는 놀랍도록 적은 수의 지원자를 받았습니다. 익명의 사용자는 자신의 전체 주소가 적힌 카드를 받은 후 개인 정보 보호에 대한 우려를 표합니다. 와인에 노출되어 고장난 맥북은 런던에 있는 독일인이 수리점 서비스 시간 옵션에 대해 유머러스하게 관찰하게 합니다. 그런 다음 텍스트는 ProGet 광고로 전환되어 패키지 및 컨테이너 관리, 취약점 스캔 및 액세스 제어 기능을 홍보합니다. ProGet은 빠른 설치 솔루션으로 가치 있는 무료 버전과 업그레이드 옵션을 제공합니다. 이 광고는 효율적인 패키지 관리 및 보안 기능을 찾는 사용자를 유치하는 것을 목표로 합니다. 텍스트의 전반적인 분위기는 유머러스한 관찰, 비판 및 광고가 혼합된 것입니다. 이 텍스트는 디지털 시대의 일반적인 좌절감을 제시합니다. 다양한 일화는 문제와 해결책의 다른 유형을 보여줍니다.
CdXz5zHNQW_MI7EDC1tiT.jpeg

CodeSOD: Cancel Catch

저자는 Matlab 코드를 비판하며, 종종 이질적으로 보이고 소프트웨어 엔지니어링 기술이 부족한 도메인 전문가가 작성한 것처럼 보인다고 제안합니다. 의심스러운 Matlab 코드의 한 가지 구체적인 예는 `uigetfile` 함수 호출 주위에 try-catch 블록을 사용하는 것입니다. `uigetfile` 함수는 파일 이름과 경로를 반환하거나, 취소된 경우 둘 다 0을 반환하도록 설계되었습니다. 예시의 개발자는 이를 잘못 처리하는 것으로 보이며, 잠재적으로 취소 동작을 처리하기 위해 `catch` 블록을 사용합니다. 이 접근 방식은 `uigetfile`이 취소 시 예외를 발생시킨다고 잘못 가정합니다. 결과적으로 `FileName`과 `PathName`은 0으로 설정되며, 이는 코드 전체에 부적절하게 전파됩니다. 이는 결국 이러한 0 값이 유효한 파일 경로로 취급될 때 나중에 오류로 이어집니다. 사용자는 자신의 작업이 실패하는 이유에 대해 명확하게 이해하지 못한 채 남겨집니다. 저자는 이것이 코드 유지 관리에 집중하지 않는 연구자들이 작성한 코드에서 흔히 발생하는 문제라고 암시합니다.

A Whale of a Problem

데이터 시각화 그래프를 제작하는 한 회사가 단일 고객으로부터 발생하는 수익의 90%를 차지하는 심각한 문제에 직면했습니다. 이 "고래" 고객은 API 및 차트 로딩 속도 저하에 대해 불만을 제기했습니다. 전용 서버를 포함한 3주간의 최적화 노력에도 불구하고, 근본적인 원인은 고객이 운전 중에 사용하는 불안정한 인터넷 연결임이 밝혀졌습니다. 이는 단일하고 까다로운 고객에게 과도하게 의존하는 것의 상당한 위험을 강조합니다. 제출자는 유사한 "고래"와의 만남을 피하기 위해 다양한 수입원을 구축하는 데 집중하고 있습니다. 이전 경험으로는 기술 지원에 변경을 요구했던 어려운 고객, 페이스북이 있습니다. 또 다른 까다로운 "고래"였던 포르쉐는 스타트업 시절 플랫폼 불안정 및 기능 로드맵 변경을 야기했습니다. 그러나 이 동일한 고객은 자금 부족 시기에 사업을 재정적으로 유지하는 데에도 기여했습니다. 제출자는 극단적인 고객 의존성이나 수많은 검증되지 않은 AI 스타트업이 없는 비즈니스 환경에 대한 열망을 표현합니다. 이 글은 대형 고객과의 경험을 공유하도록 독자들을 초대하며 마무리됩니다.
CdXz5zHNQW_iwfKBA4irn.jpeg

CodeSOD: 보풀 털기

C#은 필드를 클래스에 직접 선언할 수 있도록 하여 상용구 코드를 줄이기 위해 주 생성자를 도입했습니다. 필수 필드는 자동으로 생성자를 생성하는 데 사용됩니다. Esben B의 팀은 주 생성자 사용을 강제하는 린터를 사용합니다. 린터는 전통적인 생성자가 주 생성자 구문을 준수하지 않는다고 플래그를 지정했습니다. Esben은 처음에 pragma를 사용하여 이 특정 경고를 비활성화했습니다. 그러나 린터는 억제가 불필요하다는 새로운 경고를 생성했습니다. 이를 해결하기 위해 Esben은 원래 경고와 불필요한 억제에 대한 경고를 모두 비활성화하려고 시도했습니다. 이 접근 방식은 pragma가 코드의 후속 줄에만 영향을 미치기 때문에 실패했습니다. 결과적으로 Esben은 경고를 순차적으로 비활성화하기 위해 여러 pragma 문을 사용해야 했습니다. 이로 인해 단일 린터 경고를 억제하기 위해 세 줄의 코드가 발생했습니다. 저자는 이러한 상황이 도구의 잘못된 사용 또는 도구 자체가 작업에 부적합하다는 것을 나타낼 수 있다고 제안합니다.

CodeSOD: JSON 템플릿

이 글은 비정상적인 라우팅과 좋지 않은 개발 관행을 사용하는 파이썬 WSGI 애플리케이션을 비판합니다. 이 애플리케이션은 Mako 템플릿을 JSON 응답 생성에 부적절하게 사용하여 복잡하고 오류가 발생하기 쉬운 코드를 초래합니다. 제공된 예시는 Mako 템플릿이 키-값 쌍 사이의 쉼표를 처리하는 로직을 포함하여, 딕셔너리 키와 값을 반복하여 JSON을 수동으로 구성하는 것을 보여줍니다. 이 접근 방식은 더 효율적이고 표준적인 파이썬 방법을 우회하기 때문에 "프랙탈적인 잘못됨"으로 묘사됩니다. 저자는 파이썬의 내장 `json` 모듈이 JSON 직렬화를 위한 더 나은 솔루션을 제공한다고 강조합니다. `json.dumps`를 사용하면 수동 템플릿팅과 잘못된 출력의 관련 위험을 제거할 수 있습니다. 이 템플릿팅 방식은 또한 최신 파이썬 기능을 무시하고 불필요한 복잡성을 야기합니다. 이 글은 애플리케이션의 상태 표시 방식이 JSON 본문에 "success" 필드를 사용하는 것이 HTTP 상태 코드를 사용하는 것에 비해 최적이 아니라고 주장합니다. 궁극적으로 이 글은 나쁜 코드를 작성하는 사례가 PHP에만 국한된 것이 아니라, 이 파이썬 예시에서 볼 수 있듯이 어떤 프로그래밍 언어에서도 발생할 수 있다고 결론짓습니다.

오류 발생: 4월의 비

이 텍스트는 다양한 개인들의 기술 관련 불만과 관찰을 제시합니다. 다니엘 D.는 RFC 사양과 Reddit의 URL 처리 방식 간의 불일치를 지적합니다. 프레드 G.는 의도대로 작동하지 않았을 가능성이 높은, 어설픈 표현의 채용 공고를 풍자합니다. 크리스 H.는 소통 부족을 강조하며 쉐보레 리콜 서비스에 대한 실망스러운 경험을 이야기합니다. 유리(Yuri)는 은행의 고객 응대 실수 가능성을 유머러스하게 묘사합니다. 아담 R.은 세금 신고 소프트웨어의 부적절한 통화 형식 지정을 비판합니다. 공통적인 주제는 기술, 고객 서비스, 소프트웨어 개발 분야의 최적화되지 않은 관행에 대한 불만입니다. 이러한 문제는 기술 표준에서 사용자 경험의 단점에 이르기까지 다양합니다. 불만 사항은 결함 있는 리콜 서비스, 형편없는 웹사이트 유효성 검사, 금융 소프트웨어 등을 포함합니다. 사용자들은 이러한 서비스의 품질에 불만을 표출합니다. 또한, BuildMaster라는 릴리스 관리 플랫폼에 대한 광고가 있습니다. 이 일련의 일화들은 사용자들이 자주 겪는 기술 관련 문제에 대한 유머러스한 통찰력을 제공합니다.

CodeSOD: 잡음 차단

Henrik H(이전)는 간단한 대표 C# 코드를 보내주었습니다. static void GenerateCommercilaInvoice() 이것은 매개변수를 받지 않고 아무것도 반환하지 않는 정적 메서드입니다. Henrik은 구현을 공유하지 않았지만, 이 정적 함수는 아마도 데이터베이스를 조작하는 것(해당 송장을 생성하기 위해?)과 같은 부작용을 수반할 가능성이 높습니다. 또는 더 나쁘게는 전역 또는 정적 상태를 다루고 있을 수도 있습니다. 모든 것이 부작용이며 의미 있는 제어가 없으므로 문제가 발생했을 때 디버깅하는 것을 즐기십시오. 테스트하는 것도 행운을 빌겠습니다. 최선의 시나리오는 저장 프로시저 호출을 감싸는 것일 수 있습니다. 이 메서드 서명은 기본적으로 리팩토링을 위한 광고입니다. [광고] ProGet은 NuGet 피드에 대한 보안 및 액세스 제어를 제공합니다. 자세히 알아보기.

대표적인 문구: 댓글 과부하

이 텍스트는 해외 팀이 작성한 코드베이스에서 발견된 특이한 주석을 분석합니다. 해당 주석은 lodash와 Mongoose 객체 ID의 차이에 관한 Stack Overflow 페이지를 참조합니다. 문제는 코드 내에 주석에 대한 맥락이나 설명이 전혀 없다는 점에서 발생합니다. 이 주석은 코드 전체에 반복적으로 나타나 광범위한 복사 및 붙여넣기가 이루어졌음을 시사합니다. 코드베이스는 통합이 최소화된 복사 및 붙여넣기 코드 조각들의 모음으로 보입니다. 원래의 주석은 특정 상황에서는 관련이 있었을 수 있습니다. 그러나 복사 및 붙여넣기 과정으로 인해 의미와 목적을 잃었습니다. 코드의 전반적인 품질은 신중한 개발과 적절한 코드 구성의 부족을 반영합니다. 이러한 상황은 부실하게 관리되는 해외 개발의 잠재적인 결과를 강조합니다. 해당 주석은 프로젝트 내 더 큰 문제의 증상 역할을 합니다. 이 텍스트는 명확한 코딩 관행의 중요성과 무분별한 복사 및 붙여넣기 방지를 강조합니다. 광고는 코드 저장소에 대한 접근을 제한하는 도구를 홍보합니다.

"서른 즈음에" 또는 "서른이 되면서"

의료 기기 회사 직원인 에릭은 13년 된 시스템에서 30개의 시험관 랙이라는 이상한 데이터베이스 제한에 직면했다. 그는 특히 데이터베이스의 작은 크기와 데이터 삭제를 고려할 때 이 제한에 처음에는 당황했다. 일련의 문의를 통해 에릭은 이 제한의 근원을 여러 선배 동료들을 거슬러 올라가 추적했다. 레스터, 칼, 그리고 엘리스를 거쳐 엘리스는 이 제약이 시스템의 전신에서 비롯되었다고 설명했다. 그녀는 에릭에게 험버트를 가리켰다. 원래 프로그래머인 험버트는 이 제한이 1980년대에 데이터를 5 1/4인치 플로피 디스크에 맞추기 위한 필요성에서 비롯되었다고 밝혔다. 처음 30개라는 제한은 실용적인 데이터 결정이었다. 이후 시스템을 다시 작성하면서 이 제한을 40년 동안 맹목적으로 복사해 왔으며, 그 기원이나 관련성에 대해 한 번도 의문을 제기하지 않았다. 에릭은 놀라움을 금치 못하며 오랫동안 의문 없이 지속되어 온 이 관행의 부조리함을 인정했다.

CodeSOD: 좋은 에티켓

"펠리시티의 상사는 프랑스 매크로로 가득 찬 비즈니스에 매우 중요한 엑셀 스프레드시트를 그녀에게 맡겼습니다. 원래 프로그래머는 떠났고, 중요한 매크로를 유지보수할 사람이 아무도 없었습니다. 스프레드시트는 여러 외부 엑셀 파일을 참조했는데, 일부는 공유 서버에 있었고 다른 일부는 하드코딩된 경로를 가지고 있었습니다. 공유 서버는 최근에 변경된 IP 주소를 통해 액세스되었기 때문에 매크로가 실패했습니다. 제공된 코드는 ExporToutVersBaseDonnées라는 이름의 서브루틴을 보여주는데, 이 서브루틴은 다른 프로시저를 호출하여 전역 변수를 채우고 "데이터베이스"와 상호 작용합니다. 이 "데이터베이스"는 실제로는 다른 엑셀 파일입니다. 코드는 이 데이터베이스 파일에 이미 행이 존재하는지 확인합니다. 존재하지 않으면 새 행을 삽입하고 위쪽 행의 데이터를 복사합니다. 행이 존재하면 코드는 Cherche_Numéro_Fichier라는 레이블이 있는 섹션으로 들어가 특정 파일 번호를 찾습니다. 여기에는 WHILE 루프가 포함되어 행을 거꾸로 검색하고 GOTO 문을 사용하여 IF 블록으로 다시 점프할 수 있습니다. 또 다른 GOTO 문은 실행 흐름을 ELSE 블록의 시작 부분으로 다시 보낼 수 있습니다. 루프 내에서 이러한 GOTO 문을 포함하는 논리는 복잡하고 해독하기 어렵습니다. 이러한 작업 후 데이터베이스 파일이 닫힙니다. 작성자는 특히 GOTO 문의 광범위한 사용으로 인해 제어 흐름에 대해 당황했다고 인정합니다."

"오류 발생: 끔찍한 시간 보내는 중" 또는 "오류 발생: 끔찍한 시간을 보내고 있음"

"검은 야수(The Beast in Black)가 독자 특별 기고로 돌아와 MySQL과 Workbench Migration Wizard를 비판합니다. 그는 소프트웨어 업데이트 실패와 끊임없는 설치 루프에 대한 좌절감을 토로합니다. 저자는 유용한 통찰력의 부재에 의문을 제기하며, 그 내용을 "프로그래밍 펄스(Programming Pearls)"와 비교하며 부정적으로 평가합니다. 마지막 부분은 독자들에게 .NET 9 마이그레이션 가이드를 다운로드하도록 권장하는 홍보 자료로 마무리됩니다."
CdXz5zHNQW_g51liJGl3n.png

코드SOD: 다음번엔 더 나은 계약업체를 고용할 것을 약속드립니다

노나는 2100줄짜리 거대한 JavaScript 함수의 시작 부분을 공유했고, 이는 즉시 잠재적인 문제들을 암시했습니다. 초기 코드 조각은 프로미스를 생성하는데, 이는 종종 위험 신호입니다. 함수의 구조는 반복되는 코드 블록을 포함하고 있어 복잡성을 더합니다. 이러한 중복은 프로미스에 전달되는 익명 함수의 형태로 나타납니다. 코드는 현재 작동하지 않으며, 의도된 목적도 불분명합니다. 이 프로젝트는 저렴한 비용의 제3자 계약업체에 외주를 주었고, 이는 아마도 이러한 문제적인 코드로 이어진 것으로 보입니다. 현재 노나는 수많은 오류를 수정해야 하는 책임을 맡았습니다. 경영진은 비용 절감 조치를 우선시했고, 이 결정은 심각한 어려움을 야기하고 있습니다. 노나는 압도감을 느끼고 있으며, 문제들을 해결해야 한다는 압박을 받고 있습니다. 이 상황은 가치 있는 계약을 잃을 위험을 초래합니다. 팀은 이제 코드를 수정하고 프로젝트를 살리기 위해 상당한 작업량을 직면하고 있습니다.

CodeSOD: 세 글자 약어, 네 글자 단어

캔디스는 의미 없는 약어와 관습에 어긋나는 명명 규칙으로 가득 찬 C++ 코드를 비판합니다. 이 코드는 `TLAflaList`라는 클래스를 특징으로 하는데, 이는 혼란스러운 스타일의 전형적인 예시입니다. 이 클래스의 `getNumElements` 메서드는 크기를 반환하는 것으로 예상되지만, 실제로는 `std::vector`를 사용합니다. 이 `vector`는 `mv_FLAarray`라는 이름으로 명명되었으며, 베어 포인터의 벡터로, 메모리 관리에 대한 우려를 제기합니다. 코드는 헝가리안 표기법을 사용하여 가독성 문제를 더욱 악화시킵니다. 구식 회사 이름인 `Initrode`와 "tab" 표시가 있는 것으로 보아, 이 코드는 오래되었으며 데이터베이스 테이블과 관련이 있는 것으로 보입니다. 전반적인 코드 스타일은 읽기 어려운 혼란스러운 "참사"로 묘사됩니다. 수많은 typedefs와 약어를 사용하기 때문에 코드의 기능을 파악하기 어렵습니다. 또한, 코드는 과도한 이중 간격과 public 및 private 블록 간의 빈번한 전환으로 인해 문제가 있습니다. 이는 전반적인 좋지 않은 코딩 표준에 기여합니다. 캔디스는 이 코드가 이해하고, 유지보수하고, 디버깅하기 매우 어렵다고 생각합니다. 저자는 NuGet 피드 및 보안을 위해 ProGet을 사용하는 것을 제안합니다.

당신의 계획에 생긴 구멍

테레사는 민감한 의료 데이터를 다루는 회사에서 근무하며, 강력한 보안과 다양한 표준 준수가 요구됩니다. 이러한 표준은 종종 특정 기술 솔루션보다는 프로세스를 의무화하여 구현에 유연성을 제공합니다. 테레사의 회사는 검증 및 준수 확인을 포함하여 하드 드라이브를 안전하게 파기하는 문서화된 프로세스를 가지고 있습니다. 구현된 프로세스는 드라이브에 구멍을 뚫어 읽을 수 없게 만드는 것을 포함합니다. 그러나 회사는 최근 SSD로 전환하면서 기존의 드릴 기반 파기 방법이 효과가 없어졌습니다. 현재의 파기 프로세스는 더 이상 SSD를 손상시키지 않아 저장된 데이터가 그대로 남아 있습니다. 결과적으로 잠재적으로 민감한 정보가 부적절하게 처리되었습니다. 실패에도 불구하고 회사는 확립된 프로세스를 따랐기 때문에 규정을 준수한다고 생각합니다. 규정 준수 팀은 프로세스를 업데이트할 계획이지만, 필요한 변경 및 승인에는 상당한 시간이 소요될 것으로 예상됩니다. 이 문제는 현재 기술과 일치하지 않는 프로세스 기반 규정 준수의 잠재적 약점을 강조합니다. 회사의 오래된 프로세스는 데이터 개인 정보 보호에 상당한 위험을 초래합니다. 이 상황은 보안 조치의 지속적인 평가 및 적응의 필요성을 강조합니다. 회사는 데이터 파기 관행을 신속하게 개선해야 합니다.

CodeSOD: Non-cogito Ergo c_str

팀은 C++ 언어의 발전을 보여주는 오래된 C++ 애플리케이션을 사용하고 있습니다. 2000년대 초반의 C++ 코드는 `std::string` 대신 C 스타일 문자열을 자주 사용했습니다. 표준 라이브러리는 덜 성숙했고, C 라이브러리와의 상호 작용이 흔했습니다. 팀의 회사는 2007년부터 C 스타일 문자열에서 벗어나기 시작했습니다. 그들은 C 스타일 문자열에서 흔히 사용되던 것처럼 "시작 문자열" 검사를 위해 `strncmp`를 사용했습니다. 이 방식은 기능적으로는 문제가 없지만, 현대 C++ 솔루션보다 덜 명확하고 더 장황합니다. "올바른" 현대 C++ 대안은 `find`를 사용하여 문자열이 다른 문자열로 시작하는지 확인하는 것입니다. `find` 함수는 가독성을 향상시키고 원시 문자 포인터를 사용하지 않도록 합니다. 팀은 C++에서 문자열 처리가 문제가 될 수 있지만, 그렇게 복잡할 필요는 없다고 강조합니다.

오류 발생: 젊음은 젊은이들에게 낭비된다

제이슨 H.는 일관성 없는 지표 열 패턴으로 인해 혼란스러운 상황을 초래하는 답답한 데이터 시스템을 회상합니다. 휴 시닉은 유머러스하게도 아주 먼 미래에 만료될 Microsoft Rewards 혜택을 예상합니다. 고든은 팀 참여에 대해 망설이며 자신의 질문을 비공개로 유지하고 싶어합니다. 배리 M.은 Comcast의 에피소드 가이드 데이터의 진정성에 의문을 제기하며 해킹 가능성을 의심합니다. 유스 P.는 웹 디자인을 배우는 어린이를 위한 휴일 워크숍을 관찰하며, 그 특이한 맥락에 주목합니다. 8-12세 어린이를 대상으로 하는 이 워크숍은 박물관에서 열립니다. 유스 P.는 워크숍에서 미래의 직업에 대한 조기 집중을 보고 놀라움을 표현합니다. 텍스트는 데이터의 독창성에 대한 정보를 제공하지 않습니다. 제공된 광고는 .NET 9 마이그레이션을 위한 무료 가이드를 제공합니다. 이러한 다양한 시나리오는 다양한 관찰에 대한 질문이나 의견을 공유하는 공통점을 가지고 있습니다. 텍스트 조각들은 일상적인 생각, 걱정, 그리고 호기심을 보여줍니다.

CodeSOD: 백분율 계산

익명의 한 사람이 주요 뉴스 사이트의 소스 코드에서 재미있는 코드를 발견했습니다. 이 코드는 비디오 플레이어의 패딩을 매우 정밀한 백분율인 57.14285714285714%로 정의합니다. 이 정밀한 백분율은 사람이 직접 입력한 것이 아니라 자동으로 계산되었을 가능성이 높습니다. 제보자는 기술적으로 정확하고 고해상도 디스플레이에 대비되어 있음에도 불구하고, 이 극단적인 정밀함에 웃음을 느꼈습니다. 비디오 플레이어의 "VHS" 지정과 560x320 비율은 구식 기술을 연상시키며 유머를 더합니다. 또한, 이는 16:9 화면 비율을 정확하게 나타내지 않습니다. 제보자는 결국 엄청나게 높은 해상도의 화면이 등장할 것을 예상합니다. 그들은 농담 삼아, 이러한 극단적인 픽셀 밀도에서 뉴스 콘텐츠를 즐기는 모습을 상상합니다. 제보자는 이러한 세심한 레이아웃 제어의 코믹한 가치를 강조합니다. 게시물은 소프트웨어 릴리스 도구에 대한 광고로 마무리됩니다.