코드 작성 능력을 향상시키는 방법

Head picture.png

작성자 | Bi Xuan
Source | Alibaba Cloud Native 공식 계정

프로그래머에게는 코드가 능력을 발휘하는 열쇠라고 생각합니다. 좋은 프로그래머가 작성한 코드와 평범한 프로그래머가 작성한 코드의 차이를 쉽게 알 수 있습니다. 코드는 프로그래머의 힘이자 명함입니다. 코드 작성 능력을 향상시키는 방법은 항상 핵심 주제이지만, 불행히도이 기사는 실제로 특정 단계, 은색 총알 방법, 무술의 비밀 등에 관한 것이 아닙니다.이 기사는 제 자신의 인상에 글을 쓰는 것에 대해 이야기합니다. 상대적으로 코드 능력이 크게 개선 된 네 가지 경험을 참고할 수 있습니다.

첫 번째 단락 : 매일 10 억 수준 시스템의 도전을 처음으로 경험

2008 년 당시 타오바오의 가장 중요한 트레이딩 센터에 HSF의 두 번째 버전이 출시되었습니다. 출시 당일 타오바오 웹 사이트 방문 속도가 매우 느려 거래 페이지가 거의 열리지 않았고, 마지막으로 오프라인 HSF에 의해 복원되었습니다.

오프라인 상태에서 문제를 확인하기 시작했습니다. HSF의 두 번째 버전은 jboss-remoting을 기반으로합니다. 현재 버전에서 원격 동기화 호출의 시간 초과 기간은 60 초로 코드에 하드 코딩되어 있으며 호출 된 서비스에는 10 초 이상 걸린 일부 현상이 발생하여 웹 응용 프로그램의 스레드 풀이 웹 요청을 처리하는 데 점차적으로 이러한 느린 요청이 차지하고 요청이 누적되고 결국 페이지 열기가 매우 느려집니다.

이유를 조사한 후 당시 Mina를 기반으로 전체 HSF 통신을 다시 작성하기로 결정했습니다. 두 달 간의 다시 작성을 통해 네트워크 IO 처리에 대한 심층 학습이든 상관없이 코드 작성 능력이 크게 향상되었습니다. 동시성 높은 시스템에 대한 심도있는 학습, 이제 학습에 대해 생각하는 방법은 다양한 유형의 네트워크 IO 인기 과학 자료를 살펴보고 Mina 및 Java 네트워크 IO의 소스 코드를 읽는 것입니다. 동시성에 대한 연구는 주로 고전 책을 기반으로합니다. "Java Concurrent Programming Practice", Java JUC에서 코드 읽기, 이전 Think in Java와 비교하여이 학습 기간의 가장 큰 차이점은 학습 후 HSF의 새로운 재 작성으로 실행에 적용한다는 것입니다. 버전의 릴리스는 기본적으로 이러한 부분의 코드 기능에 대한 진정한 숙달입니다.

코드 기능의 향상 외에도, 10 억 수준의 장기 실행 시스템이있는 시스템의 경우 작은 문제로 보이는 많은 문제가 확실히 심각한 문제가 될 것이라는 점을 배웠습니다. 이것이 바로 높은 동시성 시스템을 작성하는 이유입니다. 어려운 점은 최종 코드의 견고성을 진정으로 보장하기 위해 작성하는 코드와 코드에서 호출하는 다양한 API의 구현에 대해 매우 명확해야합니다.

두 번째 단락 : 민속 "소방대"의 이야기

내 자신의 코드 작성 능력을 향상시킨 두 번째 단락은 특히 민간인 "소방대"에있을 때였습니다. Taobao는 2009 년에 많은 실패를 겪었지만 실패를 처리하기위한 표준 시스템과 조직이 없어 많은 문제가 발생합니다. 오류를 처리 할 사람이 없거나 처리 효율이 높지 않아 당시 운영 및 유지 보수 팀의 동급생이 그룹을 구성하기 위해 일부 사람들을 끌어 들였고, 그룹의 이름은 Taobao Fire Brigade, Taobao의 다양한 오류를 처리했습니다. , 나도이 그룹에 합류하게됐는데 알리가 인정한 또 다른 슈퍼 테크니컬 신인 듀오 롱이있다.

처음 여러 가지 결함을 보았을 때는 어떻게해야할지 몰랐습니다. 일반적으로 결함을 처리하려면 코드를 작성하는 능력뿐만 아니라 지난 몇 년간의 기사와 같은 시스템의 전체적인 그림을 파악해야합니다. 인기 기사, 검색 뒤에서 발생한 일에 대한 기사를 클릭 할 때 특히 시스템의 처리 흐름에 대해 잘 알고 있어야합니다. 이는 결함을 처리 할 때 매우 중요합니다. 결함이 발생한 후에는 매우 중요한 것은이 링크에서 코드 동작 메커니즘의 세부 사항을 제어하는 ​​것입니다. 현재 다양한 도구가 일반적으로 매우 중요하므로 시스템 수준, Java 수준의 top -H와 같은 상황을 효과적으로 파악할 수 있습니다. Btrace 등을 사용하면 실행 상황에 따라 문제를 찾을 수 있습니다.

이 기간 동안 제 개선은 많은 연습에 의존하고 있다고 느낍니다. 실제로 많은 결점이 있습니다. 처음에는 사람들이 어떻게 대처하는지에 의존했습니다. Duolong에서 배운 다음 몇 가지 결점을 스스로 해결하려고 노력했습니다. 그 후 점차 숙련도가 높아졌고, 오류 해결 능력을 향상시키는 것 외에도 코드 수준에서 발생하는 오류를 많이 보았 기 때문에 오류를 피하기 위해 코드를 작성할 때 견고성을 확보하는 방법에 매우 도움이됩니다. 예를 들어, 스레드 풀의 남용으로 많은 수의 스레드가 생성되어 결국 스레드를 생성 할 수없는 경우를 많이 본 적이 있습니다. 스레드 풀을 사용하여 누적을 포함하여 최대 수를 제어하는 ​​시나리오에서 매우 명확해야 함을 이해합니다. 예를 들어, 자체적으로 용량이 증가하는 데이터 구조로 인한 N 개의 OOM 사례를 보았는데, 코드를 작성할 때 데이터 구조가 초대형으로 커지지 않을 것이라고 가정 할 수 없다는 것을 이해할 수 있으므로 아무것도하지 않습니다. 보호의 경우, 내가 지금 이해하고있는 것은 작동 할 수 있고 요구 사항을 충족시킬 수있는 코드를 작성하는 것이 어렵지 않지만 다양한 조건에서 오랫동안 안정적으로 실행될 수있는 코드를 작성하는 것은 정말 쉽지 않다는 것입니다. 비즈니스 시스템을 작성하고 재미로 프로그램을 작성하는 프로그래머의 가장 큰 차이점입니다.

세 번째 단락 : 커뮤니케이션 프레임 워크 재 작성

2010 년에 미들웨어 팀을 떠나 HBase 작업을 시작했는데 그 당시 HBase에서의 통신은 여전히 ​​매우 간단한 방식으로 구현되어 있었는데, 이때 HSF에서 사용한 것을 HBase로 포팅하는 것을 고려했습니다. Duolong은 방금 c를 사용하여 모든 종류의 c 응용 프로그램에 대한 일반 통신 프레임 워크 libeasy를 작성했기 때문에 테스트가있었습니다. 원래 HSF에서 통신 프레임 워크의 높은 동시성이 libeasy와 다르다는 첫 테스트 결과를 기억합니다. 그것은 매우 거대합니다. Duolong과 그가 그것을 어떻게 깨달았는지 논의했습니다. 저는 Java 버전에서 그것을 배우고 변경할 수 있는지를 보았습니다. 그래서 저는 통신 프레임 워크를 재 작성한 경험이있었습니다.

지난 몇 년간의 HSF 작성은 통신 프레임 워크의 코드 관련 능력을 잘 익힌 것으로 간주되어야한다고 생각했습니다. Duolong으로 다시 작성하는 과정에서 여전히 격차가 매우 크다는 것을 알게되었습니다. NIO 기반 통신 프레임 워크의 핵심은 IO 이벤트를 처리하는 데 매우 적은 IO 스레드를 사용하는 것입니다 (일부 부분은 직렬화 만 가능하므로 너무 많으면 쓸모가 없습니다). IO 스레드는 매우 중요합니다. 이러한 IO 스레드에 의한 일부 관련없는 작업의 처리를 최소화해야합니다. 또 다른 요점은 IO 스레드와 업무 처리 스레드 간의 전환을 최소화하는 것입니다. 예를 들어 나중에 스트림에서 여러 요청을 일괄 처리하는 것이 일반적입니다. 비즈니스 처리 스레드에 한 번 던집니다.

이 경험은 코드 로직의 전체적인 세부 사항을 더 깊이 이해하는 데 매우 도움이됩니다. 이는 요구 사항이 높은 시스템을 작성하는 데 매우 중요합니다. 결국 초대형 시스템의 경우 여전히 1 % 개선이 유지됩니다. 많은.

네 번째 단락 : JVM 학습

많은 결점을 다루 곤했는데 한동안 동료들과 결점을 처리하는 방법을 공유하기 시작했는데 나중에는 문제 나 처리 방법이 명확하지 않다는 것을 알게되었고 JVM을 깊이 배워야했습니다. 나는 그것을 전혀 알 수 없으며 JVM 코드를 어디서 시작 해야할지 모릅니다.

다행스럽게도 취미가 같고 나보다 훨씬 강한 동급생 인 사 카야를 만났는데, 보통 서클에서 R이라고 부르는 사 카야. 사 카야와 나는 몇 주말 동안 회사에서 JVM 코드를 시청하기로 약속을 잡았다. 드디어 시작합니다. 읽는 방법을 알고 있고, 두 사람이 함께 코드를보고 서로 공유하고 토론 할 때 효율성이 매우 높습니다.

이 경험을 통해 몇 가지 오류를 계속 처리하면서 기본적으로 JVM의 코드 구현에 대해 점차적으로 이해하게되었고, 마침내 오류 공유 및 문제 해결을 할 때 더 잘 이해할 수있게되었습니다. 이유를 알면 오류를 처리하는 능력과 코드 작성 능력에도 매우 도움이됩니다. 예를 들어, 소위 GC 친화적 인 코드가 이전에 무엇을 의미하는지 더 잘 이해하고 더 깊은 느낌을 갖게됩니다. 실제로 Java 코드는 일반적으로 JVM이 런타임 동안 최대한 많은 최적화를 수행하고 평균 라인까지 끌어 올릴 것이기 때문에 너무 나쁘게 작성되지는 않지만 이해해야하기 때문에 작성하기가 매우 어렵습니다. JVM, JVM에서 OS를 이해하십시오.

요약하자면

사실 모든 사람의 환경이 다르고 개선에 적합한 방법이 있기 때문에 아무 것도 요약 할 수 없습니다. 제 경험을 보면 다음과 같은 생각이 듭니다.

  • 환경을 사용할 수없는 경우 자신에게 도전 제안을 제공합니다. 예를 들어 높은 동시성 커뮤니케이션을 배우고 싶다면 다른 사람들과 비교하고 성능을 발휘하는 pk를 작성해 볼 수 있습니다. 이것은 일반적으로 많이 향상되며 GC를 배워야합니다. , GC 등의 동작을 제어하기 위해 몇 가지 질문을 할 수 있습니다. 환경에 있다면 실제로 더 유익 할 것입니다.

  • 훌륭한 프로그래머와 함께 Duolong과 Sakya에서 많은 것을 배웠고 Netty 및 OpenJDK와 같은 많은 우수한 오픈 소스 코드에서 많은 것을 배웠으므로 우수한 오픈 소스 프로젝트에 참여하는 것도 좋은 생각입니다. 우수한 책을 읽고 개선하는 좋은 방법 (예 : Java Concurrent Programming Practice in Concurrency, Oracle JRockit : The Definitive Guide in JVM, in-depth under the JVM, etc.)은 훌륭한 프로그래머로부터 배우는 방법이기도합니다. 좋은 방법.

  • 문제 / 결함을 많이 해결하려고 노력하십시오. 이것은 확실히 코드 합성 능력을 향상시키는 아주 좋은 방법입니다. 자신의 작업에서 기회가 거의 없다면 좋은 실행 영역 인 스택 오버플로와 같이 인터넷에 많은 기회가 있습니다.

결국 저는 프로그래머의 하드 명함으로서 코드 능력이 프로그래머 능력을 구별하는 데 가장 효과적인 것이라고 말하고 싶습니다. "토크는 싸고, 코드를 보여주세요"라는 말은 항상 사실이라고 생각합니다.

추천

출처blog.51cto.com/13778063/2595695