ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 9. 예상하지 못한 것을 예상하기
    Technique/Programmer 2017. 2. 6. 14:57
    반응형

    드 작성 시 벌어질 것으로 예상되는 상황에 대한 대비만으로는 부족하다. 모든 단계에서 조금이라도 발생할 가능성이 있는 특이 사항들은 모두 고려해야 한다.


    1. 오류


    호출되는 어떤 함수도 예쌍대로 작동하지 않을 수 있다.

    • 운이 좋다면 오류 코드를 전달받을 수 있을 것이다. 그렇다면 값을 확인하라. 절대 무시하지 말자
    • 함수는 자신의 기능이 제대로 이행되지 않을 때 예외를던질 수도 있다. 코드가 예외 발생에 대해 대처하도록 하자. 직접 예외를 처리하든 아니면 스택 호출을 통과하게 놔두든 간에, 코드가 정확히 카동하도록 하자. ( 여기서 말하는 정확함이라 함은 리소스 누수가 없고 프로그램이 부적절한 상태가 되지 않도록 하는 것 )
    • 함수가 실패의 징후인 반환 코드나 예외 등을 돌려주지 않은 채, 기대되던 기능을 수행하지 않을 수도 있다. 함수에게 어떤 메시지를 출력하도록 요청했다고 하자. 항상 함수는 메시지를 출력하는가? 아니면 때때로 기승 수행에 실패한 채 매개 변수로서 전달한 메시지를 먹어버리는가?

    항상 오류를 고려한 코드를 작성하여 그로부터 복구할 수 있도록 하자.

    복구하지 못할 오류 역시 고려하자. 

    오류 상황에서도 최선을 다하도록 코드를 작성하자. 

    오류를 무시하지 말자.


    오류 처리가 언어의 문법에 적합하고 적절한 언어 메커니즘을 사용하다록 하자. 예를 들어 얼랭에서는 "실패하도록 두라" 라는 철학이 있다. 방어적인 코딩을 하는 대신 오류로 인해 시끄럽고 눈에 잘 띄는 실패 상황이 발생하도록 놔둠으로써, 프로세스 수준에서 오류가 처리되도록 하는 것을 권장한다.



    2 스레딩


    세상은 단일 스레드 애플리케이션에서 출발해 더 복잡하고 때에 따라서는 스레드를 극심하게 사용하는 환경으로 변화했다. 이 환경에서 각 코드들 사이의 비정상적 상호 작용은 초보적인 문제이다. 문제가 되는 특정한 상호 작용을 재현해느는 것도 어렵지만, 모든 코드 경로 사이에서 발생 가능한 조합을 일일이 나열하는 것은 더 어렵다.

    이런 예측 불가능의 수준을 다루기 위해서는, 기본적인 동시 실행의 원리와 함께 스레드 간의 결합도를 완화하여 위험하게 상호 작용 하지 않도록 하는 방법을 반드시 이해해야 한다. 경합 조건을 발생시키거나 불필요하게 스레드를 마지 않은 채 스레드 간에 안정적이고 신속하게 메시지를 전달하는 메커니즘에 대해서 숙지해야 한다.



    3. 셧다운


    우리는 시스템을 어떻게 생성할지에 대한 계획을 새웠다. 즉 어떻게 모든 객체가 생성되고 모든 톱니바퀴가 돌아가기 시작하게 만드는지에 대해 알아보았다. 이 객체들이 어떻게 계속 작동하고 톱니바퀴들이 계속 돌아가게 만드는지에 대해서도 알아보았다. 하지만 생명주기의 반대 측면에 대해서는 신경 쓰지 않았다. 즉 리소스의 누출이나 데드락, 충돌 없이 코드를 우아하게 중단시킬 수 있는지에 대해서는 아직 확인하지 않았다.


    시스템을 종료하고 모든 객체를 파기하는 것은 다중 스레드 시스템에서는 특히 어려운 일이다. 애플리케이션이 종료되면서 작업자 객체를 파기하므로, 그 과정에서 이미파기한 객체를 사용하면 안 된다. 목표 객체가 이미 다른 스레드에 의해 제거된 콜백을 작업 큐에 넣으면 안 된다.


    예상하지 못한 것 은 결코 이상한 것이 아니며, 버그의 구성 요소라 할 수 있다.

    코드를 작성할 때는 이를 고려해야 한다.

    다만 개발 초기에 고려해야 한다. 나중에는 해당 이슈를 적절히 처리하기 어렵다. 왜냐하면 이런 문제는 개발자도 모르는 사이에 코드 기숙한 곳에서 진행되기 때문이다. 이 괴물은 코드가 커진 뒤에는 더욱 제거하기 어렵다.


    좋은 코드를 작성한다는 것은 낙관론자 혹은 비관론자가 되는 것에 대한 이야기가 아니다. 현재 컵 안에 물이 얼마나 차 있는지를 논하는 것도 아니다 .그것은 물이 새지 않는 컵을 만드는 과정으로서 아무리 많은 물을 컵에 담아도 물이 새지 않도록 하기 위한 과정이다.




    반응형

    'Technique > Programmer' 카테고리의 다른 글

    11. 테스트 하기  (0) 2017.02.22
    10. 버그 사냥하기  (0) 2017.02.08
    8. 오류 무시하지 않기  (0) 2017.02.06
    7. 똥통에서 뒹굴기  (0) 2017.02.05
    6. 경로 탐색  (0) 2017.02.02

    댓글

Designed by Tistory.