의존성에 대한 두려움을 다루는 방법


54

내가 속한 팀은 회사 파트너가 플랫폼과 통합하는 데 사용할 수있는 구성 요소를 만듭니다.

따라서 (타사) 종속성을 도입 할 때는 각별히주의해야합니다. 현재 타사 의존성이 없으며 프레임 워크의 최저 API 수준을 유지해야합니다.

몇 가지 예 :

  • 우리는 프레임 워크 (.NET 표준)의 최저 API 레벨을 유지해야합니다. 이에 대한 추론은 언젠가는 매우 낮은 API 수준 만 지원하는 새로운 플랫폼이 도착할 수 있기 때문입니다.
  • JSON을 직렬화 해제하기 위해 자체 구성 요소를 구현했으며 JWT에서도 동일한 작업을 수행하고 있습니다. 이것은 상위 레벨의 프레임 워크 API에서 사용 가능합니다.
  • 표준 라이브러리의 HTTP 구현에 대한 의존을 원하지 않기 때문에 표준 라이브러리의 HTTP 프레임 워크를 래퍼로 구현했습니다.
  • XML과의 매핑을위한 모든 코드는 같은 이유로 "손으로"작성됩니다.

나는 우리가 그것을 너무 멀리 가져 가고 있다고 생각합니다. 나는 이것이 이것이 우리의 속도에 큰 영향을 미친다고 생각하기 때문에 이것을 다루는 방법이 궁금합니다.


20
이것에 대한 정당성이 있습니까 (예 : 외부 요구 사항) 아니면 무지에서 이루어지고 있습니까?
Blrfl

6
코드베이스의 작은 부분으로 실험하고, 일반적인 라이브러리가 아닌 격리 계층을 만들지 만 요구 사항을 모델링하는 추상 인터페이스를 정의하십시오. 그런 다음 자신의 구현과 타사 종속성을 둘 다 놓고 두 버전의 작동 / 성능을 비교하십시오. 장단점을 측정하고 구현을 교체하는 것이 얼마나 쉬운 지 (또는 얼마나 어려운지) 평가 한 다음 결정을 내립니다. 요컨대, 비교적 위험이 낮은 방식으로 테스트하고, 어떻게되는지 확인한 다음 결정하십시오.
Filip Milovanović

73
"현재 타사에 의존하지 않습니다"사람들이 이것을 주장 할 때 항상 웃게 만듭니다. 물론 그렇습니다. 표준 라이브러리의 자체 컴파일러, IDE, 구현을 작성하지 않았습니다. 간접적으로 (또는 직접적으로) 사용하는 샤드 객체 라이브러리를 작성하지 않았습니다. 의존하는 타사 소프트웨어 및 라이브러리의 양을 알면 "종속성이 나쁘다"라는 생각을 버리고 바퀴를 다시 발명하지 않아도됩니다. 나는 당신이 가지고있는 의존성을 플래그 한 다음 왜 수용 가능한지 묻지 만 json 파싱은 허용되지 않습니다.
UKMonkey

8
그것은 프로젝트를 끝내지 않는 것과 같은 대안적인 단점이 있다고 말했습니다. 그러나 그것은 소프트웨어 직업과 고용을 장려합니다 :)
마샬 크래프트

5
상용 소프트웨어를 다시 발명하여 노력을 낭비하고있는 것이 맞습니다. 이것이 "모든 의존성을 피하는 것"과는 거리가 멀다는 잘못된 점이 있습니다. 마이크로 소프트 엑셀 팀은 한 번 C 팀에 종속성을 복용하지 않도록 자신의 C 컴파일러를 썼다 마이크로 소프트 . 운영 체제, 높은 수준의 프레임 워크 등에 엄청난 의존성을하고 있습니다.
Eric Lippert

답변:


94

... 우리는 프레임 워크 (.NET 표준)의 가장 낮은 API 레벨을 유지해야합니다…

이것은 당신이 잠재적으로 자신을 너무 많이 제한 할뿐만 아니라, 당신의 접근 방식으로 불쾌한 가을을 향하고 있다는 사실을 강조합니다.

.NET Standard는 " 프레임 워크의 가장 낮은 API 레벨 "이 아니며 절대로 사용되지 않습니다 . .NET에 대한 가장 제한적인 API 세트는 Windows Phone 및 Silverlight를 대상으로하는 이식 가능한 클래스 라이브러리를 작성함으로써 달성됩니다.

타겟팅하는 .NET Standard 버전에 따라 .NET Framework, .NET Core , MonoXamarin 과 호환되는 매우 다양한 API 세트가 생길 수 있습니다. 또한 .NET 표준과 호환되는 많은 타사 라이브러리가 있으므로 이러한 모든 플랫폼에서 작동합니다.

2019 년 가을에 출시 될 예정인 .NET 표준 2.1이 있으며 .NET Core, Mono 및 Xamarin에서 지원 될 예정입니다. .NET Framework의 모든 버전 에서는 최소한 가까운 장래에 항상 지원 될 것입니다. 따라서 가까운 장래에 " 프레임 워크의 가장 낮은 API 레벨 "이 아닌 .NET 표준은 프레임 워크를 대체하고 후자가 지원하지 않는 API를 갖게됩니다.

" 이 이유는 새로운 플랫폼이 이전 프레임 워크보다 더 높은 레벨의 API를 지원할 가능성이 높기 때문에 언젠가는 매우 낮은 API 레벨 만 지원하는 새로운 플랫폼이 도착할 수 있기 때문입니다."

그런 다음 타사 라이브러리 문제가 있습니다. 예를 들어 JSON.NET은 .NET 표준과 호환됩니다. .NET Standard와 호환되는 모든 라이브러리는 해당 버전의 .NET Standard와 호환되는 모든 .NET 구현에서 작동하도록 API 방식으로 보장됩니다. 따라서 사용하지 않고 JSON 라이브러리를 작성하여 추가 호환성을 얻지 못합니다. 당신은 단순히 더 많은 일을 만들고 회사에 불필요한 비용을 발생시킵니다.

그래서, 당신은 분명히 내 견해로는 이것을 너무 멀리 가져 가고 있습니다.


16
"단순히 더 많은 업무를 창출하고 회사에 불필요한 비용을 발생시킵니다." -그리고 보안 책임. 재귀 객체를 제공하면 JSON 인코더가 스택 오버플로와 충돌합니까? 파서는 이스케이프 문자를 올바르게 처리합니까? 이스케이프 처리되지 않은 문자는 거부해야합니까? 짝을 이루지 않은 대리 캐릭터는 어떻습니까? JSON이 2 ^ 64보다 큰 숫자를 인코딩하면 오버플로가 발생합니까? 아니면 eval쉽게 우회 할 수있는 위생 검사가 있는 작은 포장지입니까?
John Dvorak

4
".NET 용으로 가장 제한적인 API 세트는 Windows Phone 및 Silverlight를 대상으로하는 휴대용 클래스 라이브러리를 작성함으로써 달성됩니다." 나는 사지로 나가서 존재했던 모든 가능한 구현에 의해 지원되지 않는 하위 집합에 API가 적어도 있다고 주장 할 것입니다 (아무도 Microsoft가 아닌 WinPhone 또는 Silvernight에 대해서는 신경 쓰지 않습니다). 최신 프레임 워크의 대상으로 .NetStandard 2.0을 사용하는 것은 매우 신중하며 특별히 제한되지는 않습니다. 2.1로 업데이트하는 것은 다른 이야기이지만 그렇게 할 것이라는 징후는 없습니다.
Voo

미래의 플랫폼을 제외하고 아마도 덜 지원하는 것보다 더 많은 것을 지원하는 경우 발생할 있는 모든 것을 개발하는 것은 엄청나게 비쌉니다 (어쨌든 무언가를 놓칠 수 있습니다). 대신, 바퀴를 재발 명하지 않고 개발 하면 새로운 상황에 적응하는 것보다 비용이 많이 드는 시간 절약 할 수 있습니다.
재스퍼

51

우리는 프레임 워크 (.net 표준)의 최저 API 레벨을 유지해야합니다. 이에 대한 추론은 언젠가는 매우 낮은 API 수준 만 지원하는 새로운 플랫폼이 도착할 수 있기 때문입니다.

여기에서 추론은 오히려 거꾸로입니다. 오래되고 낮은 API 레벨은 새로운 API 레벨보다 더 오래되고 지원되지 않을 가능성이 높습니다. 언급 한 시나리오에서 합리적인 수준의 호환성을 보장하기 위해 "최첨단"을 편안하게 유지하는 것이 합리적이지만 앞으로 나아갈 수는 없습니다.

JSON을 직렬화 해제하기 위해 자체 구성 요소를 구현했으며 JWT에서도 동일한 작업을 수행하고 있습니다. 이것은 상위 레벨의 프레임 워크 API에서 사용 가능합니다. 표준 라이브러리의 HTTP 구현에 의존하고 싶지 않기 때문에 표준 라이브러리의 HTTP 프레임 워크를 감싸는 래퍼를 구현했습니다. XML과의 매핑을위한 모든 코드는 같은 이유로 "손으로"작성됩니다.

이다 광기 . 어떤 이유로 든 표준 라이브러리 기능을 사용하지 않더라도 오픈 소스 라이브러리는 위의 모든 작업을 수행하는 상용 라이센스로 존재합니다. 이미 작성되었으며 기능, 보안 및 API 설계 관점에서 광범위하게 테스트되었으며 다른 많은 프로젝트에서 광범위하게 사용되었습니다.

최악의 상황이 발생하고 해당 프로젝트가 사라지거나 유지 관리가 중단되면 어쨌든 라이브러리를 빌드하는 코드가 있고 유지 관리 담당자를 지정합니다. 그리고 당신은 가능성이 여전히 당신이 현실에 더 돌봐, 청소기, 더 유지 보수 코드를 테스트 한 것이기 때문에, 자신의 압연 줄 것보다 훨씬 더 나은 위치에.

프로젝트가 유지되고 해당 라이브러리에서 버그 또는 악용이 발견 될 가능성이 훨씬 높은 시나리오에서는 무료로 최신 버전으로 업그레이드하거나 버전을 패치하는 등의 작업을 수행 할 수 있습니다. 당신이 복사본을 찍은 경우 수정 프로그램과 함께.


3
할 수없는 경우에도 다른 라이브러리로 전환하는 것이 자신의 롤링보다 훨씬 쉽고 좋습니다.
모니카와의 가벼움 경주

5
낮은 레벨의 물건이 더 빨리 죽는다는 훌륭한 포인트. 이것이 추상화를 설정하는 요점입니다.
모니카와의 가벼움 경주

"오래된 낮은 API 수준은 새로운 수준보다 더 오래되고 지원되지 않을 가능성이 높습니다." 응? NetSTandards는 내가 아는 한 서로 위에 구축됩니다 (2.0은 1.3 + X를 의미합니다). 또한 표준은 단순히 구현이 아닌 표준입니다. 지원되지 않는 표준에 대해 이야기하는 것은 이치에 맞지 않습니다. 해당 표준의 대부분의 특정 구현은 미래에있을 수 있습니다. 라이브러리가 NetStandard 1.3 이외의 것을 필요로하지 않는다면이를 2.0으로 변경할 이유가 없습니다
Voo

11

전체적으로 이러한 것들이 고객에게 좋습니다. 인기있는 오픈 소스 라이브러리조차도 어떤 이유로 사용할 수 없을 수도 있습니다.

예를 들어, 오픈 소스 제품을 사용하지 않기로 약속 한 고객과 계약을 체결했을 수 있습니다.

그러나 지적했듯이 이러한 기능에는 비용이 들지 않습니다.

  • 시장에 시간
  • 패키지 크기
  • 공연

이러한 단점을 제기하고 고객과 협의하여 고객이 제공하는 uber 수준의 호환성이 실제로 필요한지 확인하십시오.

예를 들어 모든 고객이 이미 Json.NET을 사용하는 경우 자체 직렬화 해제 코드가 아닌 제품에서이를 사용하면 크기가 줄어들고 개선됩니다.

타사 라이브러리와 호환되는 라이브러리를 사용하는 제품의 두 번째 버전을 소개하는 경우 두 제품 모두를 파악할 수 있습니다. 고객이 타사를 사용하여 최신 기능을 조금 더 일찍 얻거나 '호환'버전을 고수합니까?


11
예, 분명히 동의합니다. 목록에 "보안"을 추가하겠습니다. 잘 테스트 된 프레임 워크 및 표준 라이브러리와 비교할 때 특히 JSON / JWT와 같은 코드에 취약점이 발생할 가능성이 있습니다.
Bertus

그렇습니다. 보안 및 성능과 같은 것은 양방향으로 진행될 수 있기 때문에 목록을 작성하기가 어렵습니다. 그러나 마무리 기능과 내부 구성 요소의 완벽한 기능 / 이해 보장 사이에는 분명한 이해 상충이 있습니다.
Ewan

12
"오픈 소스 제품을 사용하지 않기로 약속 한 고객과 계약을 체결했을 수 있습니다."-오픈 소스 인 .NET Standard를 사용하고 있습니다. 전체 제품을 오픈 소스 프레임 워크를 기반으로 할 때 계약에 서명하는 것은 좋지 않습니다.
스티븐

아직도 사람들은 그렇게합니다
Ewan

7

짧은 대답은 타사 종속성을 도입해야한다는 것입니다. 다음 스탠드 업 회의에서 다음 주 직장에서 몇 년 동안 가장 즐거웠을 것이라고 모든 사람에게 알리십시오. JSON 및 XML 구성 요소를 오픈 소스 표준 라이브러리 솔루션으로 대체 할 것입니다. 모든 사람에게 JSON 구성 요소를 교체하는 데 3 일이 걸린다고 말합니다. 완료 후 축하합니다. 파티를. 축하 할 가치가 있습니다.


2
이것은 뺨에 혀 일지 모르지만 비현실적이지는 않습니다. 나는 "노인"개발자 (교육에 의한 노인)가 국가 기계 라이브러리를 작성하여 주니어 개발자를 맡았던 회사에 합류했습니다. 5 개월의 개발자 개월이 있었고 여전히 버그가 있었기 때문에 며칠 만에 그것을 찢어 턴키 솔루션으로 대체했습니다.
TKK

0

기본적으로 모든 노력과 위험이 있습니다.

추가 종속성을 추가하거나 프레임 워크를 업데이트하거나 더 높은 수준의 API를 사용하면 노력을 줄일 수 있지만 위험을 감수합니다. SWOT 분석을 제안 합니다 .

  • 장점 : 직접 코딩 할 필요가 없으므로 노력이 줄어 듭니다.
  • 약점 : 손수 만든 솔루션만큼 특별한 요구에 맞게 맞춤 설계된 것은 아닙니다.
  • 기회 : 출시 시간이 짧습니다. 외부 개발을 통해 이익을 얻을 수 있습니다.
  • 위협 : 추가 종속성으로 고객을 화나게 할 수 있습니다.

수제 솔루션을 개발하기위한 추가 노력은 위협을 낮추는 데 투자하는 것입니다. 이제 전략적인 결정을 내릴 수 있습니다.


-2

구성 요소 라이브러리를 종속성이없는 "핵심"세트 (본질적으로 현재 수행중인 작업)와 "핵심"및 써드 파티 라이브러리에 대한 종속성이있는 "공통"세트로 분할하십시오.

그렇게하면 누군가 "핵심"기능 만 원한다면 가질 수 있습니다.

누군가가 "공통"기능을 원한다면 가질 수 있습니다.

"Core"와 "Common"을 관리 할 수 ​​있습니다. "공통"에 기능을 더 빠르게 추가하고 구현을 제공하는 것이 합리적 일 경우 자체 "핵심"구현으로 옮길 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.