이것에 대해 생각하는 한 가지 방법은 시간 / 날짜로 의미하는 것 입니까? 컴퓨터는 이러한 개념이 무엇인지 모릅니다. 어떻게 든 프로그래밍해야합니다. 유닉스 형식으로 "시간 이후 초"로 시간 을 나타내는 것이 일반적이며 OS 호출을 통해 특정 값을 프로그램에 공급하는 것이 일반적입니다. 그러나이 사용법이 아무리 흔하더라도 "실제"시간이 아니라 단지 논리적 표현이라는 점을 명심해야합니다.
다른 사람들이 지적했듯이,이 메커니즘을 사용하여 "마감일"을 정했다면 다른 시간에 먹이를주고 "마감일"을 깨는 것은 사소한 일입니다. NTP 서버 요청과 같은보다 정교한 메커니즘도 마찬가지입니다 (자체 인증서, 인증 기관을 대체하거나 암호화 라이브러리를 패치 할 수 있기 때문에 "보안"연결을 통해서도). 처음에는 그러한 개인이 당신의 메커니즘을 해결하는 데 잘못되었다고 생각 될 수도 있지만, 자동 적이고 합당한 이유로 수행 된 것일 수도 있습니다 . 예를 들어, 재현 가능한 빌드 를 사용하는 것이 좋으며 , 결정적이지 않은 시스템 호출을 자동으로 재설정 / 차단할 수있는 도구가 있습니다. libfaketime 은 정확히 그렇게합니다.모든 파일의 타임 스탬프를로 설정하고 1970-01-01 00:00:01
Qemu의 레코드 / 재생 기능은 모든 하드웨어 상호 작용 등을 위조합니다.
이것은 Goodhart의 법칙 과 유사합니다 . 프로그램의 동작이 논리 시간에 의존하게되면 논리 시간은 "실제"시간의 측정 기준이되지 않습니다. 다시 말해서 사람들은 일반적으로 시스템 시계를 엉망으로 만들지 않지만 이유를 제시하면 사람들은 그렇습니다.
시간에 대한 다른 논리적 표현이 있습니다. 그 중 하나는 소프트웨어 버전 (앱 또는 일부 종속성)입니다. 이는 UNIX 시간보다 "마감일"에 대해 더 바람직한 표현입니다. 이는 관심있는 기능 (특성 세트 / API 변경)에 더 구체적이기 때문에 직교 관심사를 짓밟을 가능성이 적기 때문입니다 (예 : UNIX 시간을 마감 시한을 지키면 로그 파일, 크론 작업, 캐시 등이 손상 될 수 있습니다.)
다른 사람들이 말했듯이, 라이브러리를 제어하고이 변경 사항을 "푸시"하려는 경우 기능을 더 이상 사용하지 않는 새 버전 (경고를 유발하고 소비자가 사용법을 찾아 업데이트하는 데 도움이 됨)을 제거한 다음 완전히 기능. (다시) 버전은 단지 시간의 논리적 표현이기 때문에 "실제"시간과 관련 될 필요가 없기 때문에 원한다면 서로 즉시 게시 할 수 있습니다. 시맨틱 버전 관리가 도움이 될 수 있습니다.
대체 모델은 변경을 "풀"하는 것입니다. 이것은 "계획 B"와 같습니다. 소비 애플리케이션에 테스트를 추가하십시오.이 종속성의 버전이 최소한 새로운 값인지 확인합니다. 일반적으로 빨강 / 녹색 / 리 팩터는 코드베이스를 통해이 변경 사항을 전파합니다. 기능이 "나쁜"또는 "잘못된"것이 아니라 "이 사용 사례에 적합하지 않은"경우 더 적합 할 수 있습니다.
"풀 (pull)"접근 방식의 중요한 질문은 종속성 버전이 " 기능 "단위로 계산되는지 여부 와 테스트 가 필요한지 여부입니다 . 또는 단지 "개인"구현 세부 사항인지의 여부, 실제 단위 ( 기능 ) 테스트 의 일부로 만 실행되어야합니다 . 나는 말할 것입니다 : 의존성 버전 사이의 구별이 실제로 응용 프로그램의 기능으로 계산되면 테스트를 수행하십시오 (예 : Python 버전이 3.x 이상인지 확인). 그렇지 않다면, 하지시험을 추가하십시오 (취약하고 유익하지 않으며 지나치게 제한적이므로); 라이브러리를 제어하는 경우 "푸시"경로로 내려갑니다. 라이브러리를 제어하지 않으면 제공되는 버전을 사용하십시오. 테스트가 통과되면 자신을 제한 할 가치가 없습니다. 그들이 통과하지 않으면 바로 거기에 "마감"입니다!
의존성 기능의 특정 사용을 권장하지 않으려는 경우 (예 : 나머지 코드와 잘 어울리지 않는 특정 기능 호출), 특히 의존성을 제어하지 않는 경우 다른 방법이 있습니다 : 코딩 표준을 금지하십시오 / 이러한 기능의 사용을 권장하지 않으며, 검사 기능을 린터에 추가하십시오.
이들 각각은 서로 다른 상황에서 적용됩니다.