이 문제에서 시작했습니다
때는 2월입니다. 18개월 전 팀이 작업했던 집에서 보일러가 고장 났습니다. 그때 방문 기록은 어딘가에 남아 있습니다. 문자 메시지에, 사진첩에, 트럭에 실린 종이 청구서에, 그리고 누군가의 머릿속에 있습니다. 하지만 정작 현관 앞에서는 그 어느 것도 손에 없습니다. 그래서 작업은 맨바닥에서 다시 시작됩니다. 같은 질문, 같은 점검, 같은 한 시간의 작업. 다시 비용을 청구하거나 손해를 감수해야 합니다.
이 문제를 풀어야 했던 소프트웨어는 대부분 풀지 못했습니다. 배차 담당자와 책상이 있는 사무실을 겨냥해 만든 것들입니다. 가격도 그런 사무실을 둘 수 있는 회사에 맞춰졌습니다. 그리고 정작 일이 벌어지는 현장에서는 멈춰 버립니다. 그래서 현장 기술자들은 계속 종이를 썼습니다.
저희는 정반대로 만들었습니다. 작업한 주소마다 기록을 남기는 앱입니다. 방문, 사진, 견적서, 청구서, 메모가 모두 그 주소에 붙습니다. 신호가 있든 없든 현관 앞에서 바로 열립니다.
만드는 방식
저희가 절대 어기지 않는 네 가지 규칙
포스터에 적힌 멋진 말이 아닙니다. 각 규칙은 저희가 매일 소프트웨어를 만드는 방식을 제한합니다. 그리고 컴퓨터가 규칙마다 자동으로 확인합니다. 사람이 알아차려 주기를 그저 믿는 방식이 아닙니다.
신호가 없는 것은 여기서는 정상입니다. 고장이 아닙니다
기계실, 지하실, 좁은 공간, 그리고 시골 서비스 지역의 절반은 신호가 잡히지 않습니다. 그래서 앱은 작업 내용을 휴대폰에 먼저 저장하고, 서버로는 나중에 보냅니다. 아직 보내지 못한 목록은 앱이 따로 들고 있습니다. 앱을 닫아도, 휴대폰이 앱을 강제로 닫아도, 주차장에 하루를 세워 두어도 그 목록은 그대로 남습니다. 어디로든 보내지기 전에 작업 내용은 이미 저장되어 있습니다.
앱에는 휴대폰 안에 자체 데이터베이스와 보낼 목록이 따로 있습니다. 저희 서버에 있는 데이터를 잠깐 복사해 둔 것이 아닙니다.
금액은 항상 정수 센트 단위로 계산되며, 소수는 사용하지 않습니다
모든 금액은 정수 센트로 저장되고, 모든 세율은 퍼센트의 정수 백분의 일 단위로 저장됩니다. 반올림은 규칙이 정한 그 지점에서 딱 한 번, 의도적으로 합니다. 작은 합계 수백 개를 거치며 조금씩 몰래 반올림하지 않습니다.
자동 테스트가 실제 데이터베이스를 읽어, 금액으로 지정된 열이 정수가 아닌 다른 값을 저장하도록 설정되어 있으면 실패합니다.
한 회사는 다른 회사를 절대 볼 수 없습니다
모든 기록에는 소유 회사가 찍히고, 데이터베이스로 가는 모든 요청은 요청한 회사 범위로 제한됩니다. 그 아래에서는 데이터베이스 자체도 같은 벽을 세워 둡니다. 테이블마다 자체 규칙이 걸려 있습니다. 두 벽이 동시에 무너져야만 데이터가 새어 나갑니다.
자동 테스트가 실제 데이터베이스를 읽어, 이 규칙이 없는 회사 기록 테이블을 이름으로 찾아내어 실패합니다.
이력은 추가만 가능하며, 절대 수정되지 않습니다
이력 항목과 결제 기록은 절대 수정되거나 삭제되지 않습니다. 실수를 바로잡을 때는 예전 항목을 상쇄하는 새 항목을 추가합니다. 그래서 몇 년이 지나도 작업의 경위가 그대로 읽힙니다. 무엇을 언제 합의했는지 서로 말이 다를 때 이것이 중요합니다.
데이터베이스가 자동으로 이를 막습니다. 단순히 사람들에게 지켜달라고 요청하는 규칙이 아닙니다.