다음과 같은 경우 최적의 리펙토링은 어떤방법일까요?

jekai의 이미지

최초 5년전에 프로그램이 완성되었는데, 이것들이 엔드유져들의 요구에 따라,, 제품별로,
기능추가를 꾸준히 하였습니다. 그래서, 함수하나에도 제품별로 기능이 달라서 if 문이 수두룩하고,
결국에는 알아볼수 없는 코드, 그리고 이제 기능을 하나 추가하려고 해도, 제품별로 영향을 끼칠수 있는 수많은 가능성을 생각해야
해야합니다. 즉, 쓰레기 코드마냥 되어버렸습니다.

이것을 전부 뒤엎을려고 하는데, 코드는 공통적으로 쓰는 코드가 있고, 제품별로, 다르게 동작하는 것도 있습니다. C/C++ 기반으로 되어있고요, 앞으로도 계속 확장한다는 점입니다.

이것을 그냥 간단히 생각해보면, C++ 상속개념으로해서, 제품별, 인자값으로 다이나믹하게 동작하는 코드로 만들어주면 될것 같은데, 다른 좋은 개념이 있으면 공유좀 해주시면 감사드릴께요 ;;

체스맨의 이미지

코드를 안보고서야 일반적인 얘기밖에 할 수 없고, 일반적인 얘기들은 이미 오래전부터 알려져 있었습니다.

그나저나, 어떤 회사인지 궁금하네요. 실은 저도 이전 회사에서 비슷한 경우를 겪었고, 바꾸려고 노력도 했었고, 포기도 했었고, 갈등도 했었고, 팀도 바꿔봤고, 결국은 회사를 나왔거든요.

코드가 뒤섞여있는 문제도 있지만, 제가 겪었던 또 다른 문제는 같이 일하는 사람과의 관계도 얽혀있다는 것이었습니다. 그 정도로 뒤얽혀있는 코드가 작성되기까지 적지 않은 사람들의 이해 관계도 얽히기 마련이거든요.

혹시나 제가 다니던 회사가 아닐런지 하는 느낌이 좀 들기도 하네요... 뭐 이런 경우를 겪는 회사가 한 둘이 아니겠지만요. 이니셜이라도 알려주시면... ^^

Orion Project : http://orionids.org

jekai의 이미지

홈페이지에 들어가봤는데, 심비안얘기가 적여있길래 감이 오네요;; 전 통신쪽은 아니고 통신과 라이벌인 쪽입니다 ㅎㅎ

체스맨의 이미지

궁금해서 그러는데, 회사 첫 글자가 i 인가요?
말씀 드렸듯이 저는 두 팀에 걸쳐있었습니다. 그 회사에는 팀 간 라이벌 관계는 아니었는데, 아마 같은 회사는 아닐 듯 싶네요.

혹시나 같은 회사 같은 팀이고, 그 코드를 리팩토링으로 해결하려한다면, 제 소견으로는 말리고 싶군요.

Orion Project : http://orionids.org

jekai의 이미지

아닌것 같은게 아니고 아니네요 ㅎㅎㅎ;;

M.W.Park의 이미지

원론적으로 이야기하자면, test coverage가 적정 수준 이상이 되는 (자동화된) 테스트 코드가 있다면, 어느 정도는 가능성이 있다고 볼 수 있겠습니다.
테스트 코드가 없다면 먼저 테스트 코드를 만들어야할 듯...

최근에 본 책에서는 모듈별로 고사시키는 방법을 추천하더군요.
죽일 모듈을 선택해서, 그와 똑같은 기능을하는 (리팩토링된) 모듈을 제작한 후 시스템에서 legacy 모듈을 제거하는 방법이었는데...
실제로 적용은 안해봤습니다. 참고만 하세요. ^^;

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

체스맨의 이미지

저는 그거 비슷하게도 해봤습니다. 중요한 모듈임에도 불구하고 버그때문에 불안정해서, 대체시킬 새 모듈을 작성하고 ( 리팩토링이 아니라 아예 새로 작성했습니다. ), 기존 인터페이스에 맞췄죠. 해당 모듈은 성공적으로 대체됐습니다만, 기존 모듈안에 있던 꼼수까지 다 맞춰주는 등에 들인 노력이 만만치 않았습니다.

또한 그런 작업으로 나쁜 전체 구조 자체가 변경되기란 먼 얘기라는 것이 중요한 문제 중 하나였습니다. 즉, 근본 문제를 해결하기 어려웠죠.

그래서, 아예 새로 작성하는 것을 목표로 계획을 만들기도 했습니다. 하지만, 그렇게 될 경우, 기존 제품과 자체 경쟁해야 하고, 그것은 팀원간의 인간 관계 문제에 영향을 줄 수 있는 경우도 생겨날 것 같더군요. 기술적인 문제 외로 미묘한 인간 관계의 문제까지 고려해야 하는 아주 재미 없는 상황이 만들어질 것 같았습니다.

그래서, 결과적으로 포기했습니다. 관리자의 결단 없이는 할 수 없는 문제라고 결론 지었고, 당시 제 직위 상 힘이 모자랐습니다.

Orion Project : http://orionids.org

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.