1.5.3.1.1 기능 구현 중심의 코드베이스에서 신뢰성 중심의 구조적 코드(Structural Code)로 리팩토링

1.5.3.1.1 기능 구현 중심의 코드베이스에서 신뢰성 중심의 구조적 코드(Structural Code)로 리팩토링

연구개발(R&D) 초기 단계, 즉 개념 증명(PoC) 기간 동안 엔지니어의 지상 과제는 “일단 화면에 결과를 띄우고 모터를 돌리는 것(Make it work)“이다. 이 시기에는 투자사(VC) 시연 일정을 맞추기 위해 파라미터가 하드코딩되고, 전역 변수(Global Variable)가 남발되며, 함수 간의 결합도가 극도로 치솟는 이른바 ’스파게티 코드(Spaghetti Code)’가 묵인된다.

그러나 최고기술책임자(CTO)는 프로토타입 시연이 끝나는 즉시, 비즈니스 로직의 “기능 추가“를 전면 중단(Feature Freeze)해야 한다. 시장에 수만 대의 장비를 출하하는 양산(Mass Production) 단계에서 요구되는 철학은 “새로운 무언가를 하는 것“이 아니라, “무슨 일이 있어도 시스템이 절대 죽지 않게 만드는 것(Make it reliable)“으로 180도 전환되어야 하기 때문이다.

1. 땜질식 코드(Tinkering Code)의 붕괴와 한계

PoC 단계의 코드는 실험실의 완벽한 Wi-Fi 환경과 불량 없는 센서를 가정한 ‘해피 패스(Happy Path)’ 위주로 작성되어 있다. 다음과 같은 파괴적인 코딩 관행이 만연하다.

  • if/else의 끝없는 중첩: 새로운 조건이 생길 때마다 제어문(if)을 덧붙이는 땜질식 코드는, 결국 개발자 본인도 예측하지 못한 엣지 케이스(Edge Case)에서 프로그램의 논리적 무한 루프나 데드락(Deadlock)을 발생시킨다.
  • 오류 방치(Error Ignorance): “센서 데이터가 항상 들어올 것이다“라는 오만함은, 네트워크 단절 지연이 발생할 때 프로그램 전체를 치명적인 패닉(Panic) 상태로 몰고 간다.

2. 유한 상태 기계(FSM) 도입을 통한 제어의 규격화

특히 자율주행, 로보틱스, 산업용 IoT 하드웨어를 제어하는 비즈니스 로직은 인간의 직관에 의존하는 순차적 코딩(Sequential Coding)에서 벗어나, 수학적으로 증명 가능한 아키텍처로 통제되어야 한다.

그 핵심 해법이 유한 상태 기계(FSM, Finite State Machine) 아키텍처의 전면 도입이다.
로봇의 상태를 “초기화(Init) → 대기(Idle) → 구동(Running) → 비상 정지(E-Stop)” 등으로 명확히 분절화(Structuring)하고, 오직 사전에 정의된 조건(이벤트)만이 상태 간의 전이(State Transition)를 허용하도록 설계해야 한다. FSM을 프레임워크 수준에서 강제하면, 외부의 센서 노이즈나 해킹 시도가 들어와도 시스템이 설계자가 정의하지 않은 비정상 상태(Invalid State)로 빠지는 것을 원천적으로 차단할 수 있다.

3. 결함 허용(Fault Tolerance)과 방어적 프로그래밍(Defensive Programming)

양산용 코드는 우아하게 동작하는 것보다, 최악의 상황에서 우아하게 죽거나(Graceful Degradation) 안전하게 복구되는 것이 더 중요하다.

  • 방어적 마인드셋 내재화: 모든 네트워크 통신과 센서 인터페이스는 실패할 수 있다는 가정(Default to Failure)에서 출발해야 한다.
  • 복원력 설계 (Resilience): 통신이 끊어졌을 때 일시적인 오류인지 서버 다운인지 판별하기 위해 ‘지수 백오프(Exponential Backoff)’ 알고리즘을 통한 재시도(Retry) 로직을 짜넣어야 한다. 또한 특정 센서가 고장 났을 때 시스템 전체가 다운되는 대신, 해당 모듈만 정지시키고 기체를 안전 지대로 복귀시키는 ‘페일 세이프(Fail-Safe)’ 계층을 반드시 코드 베이스에 통합해야 한다.

4. 결론

코딩은 번뜩이는 영감을 기록하는 예술이 아니라, 수만 번의 타격에도 무너지지 않는 성벽을 쌓는 공학(Engineering)이다. CTO가 R&D 인력의 개인기에 의존하는 파편화된 코드 베이스를 엄격한 디자인 패턴(Design Pattern)과 SOLID 원칙에 입각한 ’구조적 코드(Structural Code)’로 뜯어고치는 양산 이행(NPI) 리팩토링의 고통을 겪지 않는다면, 결코 하드웨어-소프트웨어 융합 제품을 상용 시장에 안착시킬 수 없다.

참고 문헌 및 추천 논문:

  • Fowler, M. (2018). Refactoring: Improving the Design of Existing Code (2nd ed.). Addison-Wesley Professional.
  • Hunt, A., & Thomas, D. (1999). The Pragmatic Programmer: From Journeyman to Master. Addison-Wesley.
  • Samek, M. (2008). Practical UML Statecharts in C/C++: Event-Driven Programming for Embedded Systems. Newnes.