felipecsl.com/2021/04/26/nobody-cares-about-your-beautiful-code.html 글에서 뽑아본 마음에 드는 영어 문장

 

Harsh truth is that "Users couldn't care less about the programming language you used or how beautiful, clean, modular and maintainable your code is. In face, they dont't give a crap about it"

가혹한 현실은 "사용자들은 당신이 어떤 프로그래밍 언어를 사용하는지, 코드가 얼마나 아름답고, 깔끔하고 유지보수가 가능한 수준인지에 대해 신경을 쓰지 않는다. 실제는 아예 그에 대한 관심이 없다."

 

Truth is, companies need to make a tradeoff between "move fast and break things" or grow in a steady, sustainable and healthy pace and be eaten up by competition. In the end, its' all about which startup is able to move faster and adapt quicker until they finally achieve enough traction to then take a step back and reevaluate early technical decisions

사실, 기업은 "빨리 움직여서 무언가를 혁신하여 깨부수거나" 꾸준히 지속가능한 건강한 페이스를 만들어 성장하지 않으면 경쟁자들에게 먹혀버린다. 결국 스타트업들은 충분한 추진력을 얻을때까지 빨리 움직이고 빨리 적응해야지만 한발  물러서서 초기 의사결정을 재평가할 수 있게 된다.

 

Often I see developers that seems to care more about wrting clean and beautiful code just for the sake of it. completely forgetting the bigger picture, why they are doing.  Still, wring highly clean, resusable and maintainable code is usually not a priority for companies in this category, It's just about shipping, getting the feature in front of users, A/B testing which flow works best, rip apart the failed experiments,rinse and repeat.

깨끗하고 아름다운 코드를 만드는데만 온통 신경을 쓰고, 정작 왜 그 일을 하고 있는지 큰 그림을 잊어버리는 개발자들을 많이 본다. 스타트업같은 기업들에게 깔끔한, 재사용가능한, 관리할 수 있는 코드를 작성하는 것은 우선순위가 아니다. 배포하고, 사용자들에게 새로운 기능을 제공하고, 어떤 동선이 최선인지 A/B테스트를 하고, 실패한 것에서 뭔가 수정해 보고 다시 내놓고 이 과정을 반복하는 것 뿐이다.

 

Ultimate, there is no right or wrong approach, it's mostly just the cost of doing business.

결국 옳고 그른 접근 방식은 없다. 이건 사업을 하는 비용일 뿐이다.

 

 

어제 고객지원용 프로그램 소스를 보다가 개발팀 일부가 Ping의 역할을 잘못 이해하고 있어서 글을 적게 되었습니다.

발단은 고객 컴퓨터에서 우리가 서비스하는 API로의 연결이 안되는 경우가 있는 것 같은데, 그 경우를 테스트해서 로그를 보내주는 프로그램에서 네트워크 연결 테스트를 ping으로 하더라구요. 결론부터 말하면 Ping은 TCP 연결과는 무관합니다.

 

ICMP구현체, Ping

Ping은 ICMP 프로토콜을 구현한 프로그램입니다. ICMP는 RFC 792에 정의되어있죠. 해당 문서 Introduction 첫파트 내용만 따와서 읽어봅시다.

The Internet Protocol (IP)  is used for host-to-host datagram service in a system of interconnected networks called the Catenet. The network connecting devices are called Gateways. These gateways communicate between themselves for control purposes via a Gateway to Gateway Protocol (GGP). Occasionally a gateway or destination host will communicate with a source host, for example, to report an error in datagram processing. For such purposes this protocol, the Internet Control Message Protocol (ICMP), is used. ICMP, uses the basic support of IP as if it were a higher level protocol, however, ICMP is actually an integral part of IP, and must be implemented by every IP module.

IP(인터넷 프로토콜)은 Catenet이라는 상호 연결된 네트워크의 시스템에서 호스트-호스트 데이터그램 서비스용으로 사용되었다. 기기들을 네트워크로 연결하는 것을 게이트웨이라 부른다. 이 게이트웨이는 GCP(게이트웨이 프로토콜)로 통신을 제어한다. 종종 게이트웨이나 연결대상 호스트는 연결하려는 소스 호스트와 통신을 해야할 경우가 있는데, 예컨데 데이터그램 처리에 발생하는 오류를 알려주어야 한다. 이런 용도로 사용되는 규약이 ICMP이다. IP 프로토콜의 기본 기능을 이용하기 때문에 IP 프로토콜 상위 계층이기는 하지만, 실제로 IP의 일부로 통합되며, 모든 IP 모듈에서 구현되어야 한다.

위 설명에서 알 수 있듯이 ICMP는 실제로는 OSI 7 계층중 Network 계층에 속합니다. 네트워크 연결이라 부르는 것은 전송계층(Transport)계층을 이야기하는 것으로, ICMP는 TCP/UDP의 정보를 가지고 있지 않습니다. 즉 TCP/UDP가 가지는 source port 및 destination port 정보를 접근할 수 없습니다. IP의 연결성 관련 오류를 알려주기 위한 메커니즘으로 이해하는 것이 좋겠죠.

 

IPv4 헤더: 출처:위키피디아
ICMP 헤더 -출처:위키피디아
TCP 헤더: 출처 : 위키피디아

일반 사용자들 중에서는 네트워크 연결 여부를 ping(icmp)로 알아보는 경우도 있는데, 반쯤 맞는 말입니다. 목적지 IP 주소까지 연결이 되면 ping back이 될텐데, 대체로 호스트에서 echo를 보내주면 통신이 되겠죠. 하지만  ICMP 패킷 조차도 네트워크 장비들의 리소스를 사용하기 때문에 그 패킷이 내부망에 흘러들어오지 않도록 네트워크 관리자가 막아버리는 경우도 있습니다. (예: ping flooding)

 

Ping은 막혔지만, HTTP연결은 유효할 수도 있다.

예를 들어 봅시다. 아래 스크린샷은 naver와 cisco에 ICMP를 보내본 것입니다. 네이버 접속은 잘되지만, ICMP는 아예 막아버린 것을 알 수 있습니다. 하지만 네트워크 회사인 시스코는 열어두고 있지요.

따라서 네트워크 연결을 확인하고 싶다면 TCP/UDP 연결까지는 해봐야 합니다. HTTP REST API를 제공하고 있는 곳의 경우, 고객컴퓨터로부터 해당 API가 아무 문제없이 접근할 수 있는지 알아보려면  TCP연결프로그램인 telnet을 이용해서 확인해 봐야죠. 아쉽게도 telnet은 기본 프로그램에서 빠져있기에 별도 설치해야 합니다. 제어판> 프로그램 설치 > 윈도우 피쳐 켜기로 가서 Telnet Client를 설치해 줍시다.

 

 

telnet 설치후 아래 명령을 실행해 보면 연결이 맺어지는 것을 확인할 수 있습니다.

 

자, 이제 정리해 볼까요?

  • network connection을 확인하려면 ping으로는 알 수 없다.
  • ICMP는 네트워크 계층(+살짝 위)에 속하기 때문에 전송계층 TCP/UDP의 포트(port)라는 개념이 없다.
  • ICMP 실패는 네트워크 관리자가 막았기 때문일 수도 있다.

이제 고객지원 프로그램에서 통신 연결하는 코드를 수정하러 갑시다. :)

 

적고보니, 이 글도 토요일에 적고 있네요...

+ Recent posts