SW는 Slow (Steady) work가 아닐까..

gurugio의 이미지

함수 하나를 고쳐야 합니다.
함수 중간에 있는 비교문이 에러값을 반환하는데 경우에 따라서 정상인 경우에도 에러값을 반환합니다.
이 함수 하나를 고치는 것은 간단합니다.

그런데 마침 퇴근시간이 다 되서 메모를 해놓고 퇴근했습니다.
버스에서 멍하니 있다가 비슷한 방식으로 동작하는 함수가 두세개 더 있다는걸 생각했습니다.
그리고 나도 모르게 고민을 시작했고 결국 내가 고치려고 했던 방식이 잘못되었다는 생각이 들었습니다.

집에 도착하고 아내와 저녁을 먹고 산책을 나왔는데
아내와 대화가 될리가 없습니다. 계속 멍한 상태로 있으면서
무의식 컴퓨터를 돌려서 생각을 합니다.

결국 다음날 출근후 다른 개발자들과 이러이러한 경우에 대한 정책부터 논의하고
처음의 함수를 고치고, 그 함수와 유사한 다른 함수도 고치고
다른 부서에도 알려서 그 함수를 호출하는 코드들도 고치고...

기가 막히는 건 이 함수를 10개 서버에서 유닛테스트를 돌리고
그중 하나에서만 문제가 발생했었다는 것입니다.
게다가 다른 제품의 버그를 추적하다보니 몇단계를 트레이스하다가 발견했습니다.
최종 문제있는 함수를 찾는데만 이틀이 걸렸습니다.

버그하나가 에러 처리 정책까지 올라갔다가 다시 여러 코드에 영향을 미치게 되는데
이게 애초에 설계를 못해서인것 같기도 하고,
설계를 제대로 따르지 않은것 같기도 합니다.
변명할 거리가 없는 제 잘못이지요 뭐...

그때 퇴근하지 않고 바로 수정했더라면 어떻게 되었을지 생각해보지만
알수는 없는 것이지요.
단지 앞으로는 전체 그림을 항상 생각하면서 개발해야겠다
설계 문서나 디자인 회의에 빠지지 말아야겠다 반성했습니다.

너무 서두르지 말고 윗분들은 너무 재촉하지 말았으면 좋겠습니다.

댓글

johan의 이미지

그런 경우 가끔 있죠. 저도 새벽에 아들녀석이 오는 바람에 잠을 설치고 다시 잠을 청하다가 어제 있었던 문제를 생각하기 시작했고 결국 새벽에 일어나서 동료에게 생각해낸 해결책에 대한 의견을 묻는 메일을 보낸 후 다시 잤습니다. 결국 오늘 그 일을 했는데, 동료가 처음에는 ok 사인 냈다가 2-3시간 후 아예 일관성 있고 더 간단하게 만들면 어떻겠냐고 해서 기능을 대폭 빼버린 해결책으로 구현했습니다. 아예 처음 디자인을 바꿔버린 것이죠.

이게 새 버전 소프트웨어 사용을 위한 기존 버전의 데이터를 마이그레이션 해주는 부분이었는데, 기존 것은 하나 이상의 버전을 마이그레이션 하도록 되어 있었습니다(즉, v1 -> v4, 마이그레이션 시 v2, v3, v4 마이그레이션을 한번에 순서대로 실행). 이것을 한번 실행마다 하나의 마이그레이션만 하도록 바꿔버렸습니다(즉, v1-> v4 마이그레이션 시 업데이트 3번 실행). 훨씬 간단하고 나중에 문제될 소지도 아예 다 없애버린 셈이 되더군요.

어제 RC1 컷 했는데, 벌써 곧 RC2 컷 해야 합니다. 그 버그 때문에.

winner의 이미지

ACM-ICPC 준비 한창 할 때 안 풀리던 문제를 2년 후에 친구에게 다른 문제(좀더 간단하다고 판단되지만 명확히 증명은 하지 않았던)를 설명해줄려고 노력하다가 안 풀렸던 문제의 해결책을 찾은 적이 있습니다.
실제 programming은 안 해봐서 맞는지는 모르겠는데 제 생각으로는 동일한 graph modeling이 되더군요.
NP Complete이라는게 이런 식이구나하고 생각했습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.