오늘 거래처의 프로그램 수정 요청들어온걸 맡았다. 직무스트레스라는걸 평가하는 코드가 버그가 있는지 계속해서 잘못된 결과가 나온다는 것이었다. 코드 디버깅 시작.... But.. 주석 없다... 업무파일 없다... 헐~ 나도 주석을 잘 안달고 업무 파일 안만드는 편이지만 막상 디버깅 시작하니 답답하구먼 ㅡ..ㅡ;

일단 프로그램의 로직을 살펴봤다.

직무스트레스 평가는 성격 검사나 인적성 검사처럼 몇가지 항목에 답변을 한후 최종 결과에 따라 진단해주는 것이다.
일단 로직은 7개 영역에대해 검사를 하는데 각 영역마다 몇가지 질문이 있고 그 질문에 대한 답변을 1~4중 선택한다. 7개 영역의 모든 문제 총합은 24개 문제다. 그렇게 얻어진 결과를 분석하는 로직은 아래와 같다.

점수환산법
- 각 영역별 환산점수 = (해당 영역 점수 총합 - 문항수) X 100 / (답변 최고점수의 합 - 문항수)
- 직무스트레스 총 점수 = (각 영역별 환산점수의 총합) / (영역갯수 7)


일단 코드를 디버깅 하기 시작했는데 우리쪽 개발자가 요구사항을 잘못 이해해 코드를 짜다보니 로직도 약간 잘못되어서 요구사항에 맞게 코드를 디버깅했다. 일단 값들이 이제 정상적으로 보여졌다.. 그런데 문제는 마지막 총 점수가 틀리게 나오는 것이었다. "음 이상하네. 분명히 맞게 수정했는데.. 내가 잘못짰을리는 없는데.." 개발자라면 자신의 코드에 대해 맹신해서는 안되지만 아무리 소스를 훌터봐도 분명히 맞게 잘 수정했다고 판단이 됐다...

"각 영역별 환산점수는 맞게 나오는데 왜 총 점수부분은 틀리게 나오는거지?" 코드를 몇번을 훌터봤지만 문제가 없었다... 헐... 이럴수가... 뭔가 이상하다... 직무스트레스 평가 방법에 대해 구글링해봤다. 직무스트레스평가는 KSOS였나? 하여튼 평가 방법을 개발한 사이트를 찾아내 평가 방법에 관한 PDF문서를 받아서 읽어봤다. 아마도 전 개발자도 똑같이 했을터인데... 점수환산법은 위처럼 그대로 나와있었다. 이런걸 개발한 사이트가 방문자수가 자꾸 리셋되는지 방문자 숫자도 너무 적고 좀 이상했지만 어쨋거나 평가 방법이란걸 개발한곳이니 믿고 로직을 훌터봤다. 로직에는 이상이 없었다. 보통 PHP로 코드를 짜면 소스를 볼수 없기 때문에 로직만을 가지고 고민했다. 이 평가방법을 개발한곳에도 똑같은 평가 페이지가 있다. 내가 임의의 값을 설정해 양쪽 사이트에 쪽같이 적용해봤는데 영역별 환산점수는 같으나 역시 마지막 총점수가 자꾸 틀리게 나왔다..

아 이사람이 짠 소스좀 보고 싶네 어떻게 짰길래 자꾸 나랑 틀리지... 혹시나 하는 마음에 평가방법을 개발한 곳 사이트에서 익스플로러 소스보기를 했더니.. "오우 이사람은 사이트는 PHP인데 이 평가 로직은 Javascript로 짰네!!" 진작에 볼껄... -_-;;;

Javscript로 짜여져있는 원본 사이트 코드를 훌터봤다.... "어?!!! 뭐지? 왜 이렇게 연산했지?"
분명 이 평가방법을 개발한 사이트에 적힌 점수환산법은 위처럼 나와있었는데 이 개발자는 다르게 총 점수를 구했던 것이다. 아까 임의로 대입했던 점수들로 이 Javascript로직을 고대로 따다가 계산해봤더니 동일하게 나왔다. 과연 이사람의 코드가 맞는가 내 코드가 맞는가 분석했다.

<문제의 스크립트>
 var jobtotal = (Number(frm.a1.value) +  Number(frm.a2.value) + Number(frm.a3.value) +  Number(frm.a4.value) + Number(frm.a5.value) +  Number(frm.a6.value) + Number(frm.a7.value) +  Number(frm.a8.value) + Number(frm.a9.value) +  Number(frm.a10.value) + Number(frm.a11.value) +  Number(frm.a12.value) + Number(frm.a13.value) +  Number(frm.a14.value) + Number(frm.a15.value) +  Number(frm.a16.value) + Number(frm.a17.value) +  Number(frm.a18.value) + Number(frm.a19.value) +  Number(frm.a20.value) + Number(frm.a21.value) +  Number(frm.a22.value) + Number(frm.a23.value) +  Number(frm.a24.value) - 24) * 100 / 72;

분명 각 영역별 환산점수를 구한후 그 영역별 환산점수를 더한후 영역의 갯수로 나누라고 했다. 그런데 이 원사이트의 소스는 다르게 연산했다. 점수환산법에서 볼수 있듯이 각 영역별 환산 점수는 백분율로 결과 값이 나오고 이 7개의 백분율을 합한후 7로 나눠야 한다. 그런데 본판 사이트 개발자는 스크립트에서 각 질문에 대한 대답 값을 모두 더한후 총 문제 갯수를 빼고 거기에 100을 곱한후 대답값의 최고값합으로 나눴다.
고로 로직은 (대답값의 총합-총문제수)*100/(대닶값의 최고값합) 이 된다. 어떻게 보면 같은 연산 같지만, 내가 짠 코드의 로직은 평가방법에 설명돼있는 로직 그대로 적용한것이다. 아마도 이 개발자는 각 영역별로 백분율을 구한후 그 백분율의 평균을 구해야 하는걸 간단하게 미리 합쳐서 뺴고 합쳐서 나눌려고했던것 같다. 고로 내가 맞는것이라고 난 믿고 있다.............

아래는 실제 값 예제로 계산기 까지 뚜들겨봤다. -_-;

#직무요구
1 1 4 1 (총합=7) (가능최고점=16) (영역별 환산점수=3*100/12=25)

#직무자율
4 4 4 4 (총합=16) (가능최고점=16) (영역별 환산점수=12*00/12=100)

#관계갈등
4 4 4 (총합=12) (가능최고점=12) (영역별 환산점수=9*100/9=100)

#직무불안정
1 1 (총합=2) (가능최고점=8) / (영역별 환산점수=0*100/6=0)

#조직체계
4 4 4 4 (총합=16) (가능최고점=16) / (영역별 환산점수=12*100/12=100)

#보상부적절
4 4 4 (총합=12) (가능최고점=12) / (영역별 환산점수=9*100/9=100)

#조직문화
1 1 1 1 (총합=4) (가능최고점=16) / (영역별 환산점수=0*100/12=0)

- 직무스트레스 총 점수 = (25+100+100+0+100+100+0) / 7 = 425 / 7 = 60.71......

각 영역별 환산점수는 둘다 똑같이 나왔다.
나의 총점 계산에서는 결과값은 총 점수가 60.71....
본 사이트 총점 계산에서는 문제의 스크립트로 계산하면 결과값은 총 점수가 62.50로 나왔다.
(분야1환산점+분야2환산점+분야3환산점+분야4환산점+분야5환산점+분야6환산점+분야7환산점) / 7 이 되야할터인데....
설마 내가 로직을 잘못 이해한거? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ