극도로 잘못 작성된 코드를 처리 할 때 어떻게 생산성을 유지합니까?


63

저는 소프트웨어 산업 분야에서 일을하기로 결정하기 전에 자율적이고 오픈 소스에 참여한 경험이별로 없습니다. 돈을 위해 일하기 때문에 불쾌한 일도 처리해야합니다. 물론 정상입니다.

최근에는 작업을 코딩하는 것을 배우는 프로그래머가 작성한 대규모 SharePoint 프로젝트에 로깅을 추가하도록 할당되었습니다. 2 년간의 협력 끝에 고객은 회사로 전환했지만 피해는 있었으며 이제는이 코드를 유지해야합니다.

코드 를 읽기 가 너무 어렵다는 것은 아닙니다 . 문제에도 불구하고 각 프로젝트에는 여러 개의 복사하여 붙여 넣은 메소드, 거대한 if중첩, Systems Hungarian, 무분별한 연결로 구성된 하나의 클래스가 있으며 여전히 읽을 수 있습니다.

그러나 로깅을 추가하는 것만 큼 간단한 작업에도 불구하고 절대 비생산적이었습니다. 기본적으로 코드를 단계별로 살펴보고 추적 호출을 추가해야합니다. 그러나 코드의 관용구가 너무 성 가셔서 시작한지 ​​10 분 안에 피곤해 졌습니다. 처음에는 using구성 을 추가 하고를 역순으로 중첩을 줄이고 if변수의 이름을 읽을 수있는 이름으로 바꿨지 만 프로젝트가 커서 결국 포기했습니다. 나는 이것이 내가해야 할 일이 아니라는 것을 알고 있지만 적어도 혼란을 줄이면 어떤 종류의 심리적 보상을 얻었으므로 계속 갈 수있었습니다. 이제 트릭이 작동을 멈추고 여전히 60 %의 작업을 수행해야합니다.

나는 일을 마치고 두통을 앓기 시작했고, 더 이상 내가 느끼곤했던 만족감을 얻지 못합니다. 보통 10 시간 동안 코드를 작성해도 신선하게 느껴집니다.

이것은 실제로 큰 질문이 아닙니다. 실제로 질문이 있습니다.

생산성을 유지하고 풍차와 싸우지 않는 방법이 있습니까?

이전 프로그래머의 또 다른 영리한 속임수를 볼 때마다 “어떻게 바보 입니까?” 라고 생각 하는 대신 과제에 계속 집중해야 할 심리적 트릭 있습니까 ? 로깅 추가의 문제점은 실제로 코드의 기능 을 이해해야 하며 그렇게하면 불쾌한 방식으로 뇌가 아프다는 것입니다.


헝가리어 표기법은 나쁘지 않습니다. 원고를 읽고 자신이 무엇에 관해 이야기하고 있는지 확인하십시오 :)
Woot4Moo

14
나는 헝가리어가 나쁘지 않다는 것을 안다. 이것이 바로 내가 Apps Hungarian (원본)이 아닌 Systems Hungarian을 작성한 이유 입니다. C #에서 Systems Hungarian을 사용하는 것은 의미가 없습니다. 시스템 유형이 훌륭하고 IDE이기 때문입니다. 기본적으로 읽을 수 없기 때문에 모든 범위에서 시작하는 동일한 범위에 10 개의 변수 가있는 것은 어려운 일입니다. obj
Dan

2
이 질문에 둘 이상의 투표권을 부여 할 수 있기를 바랍니다!
o6tech


9
나는 내가 downvoted하게하는 심하게 심문을 던지면서 증기를 날려 버렸다.
Erik Reppen

답변:


32

유감스럽게도 모든 직무에 햇빛과 화려 함이 가득한 것은 아닙니다. 대부분의 개발 작업에는 이와 같은 준설 작업이 포함됩니다. 슬프지만 사실이야.

페인트가 마르는 것을 볼 때 지루하더라도 중요한 일을해야합니다. 중요한 두 가지 이유는 다음과 같습니다. 1. 큰 시스템에 필요한 로깅을 추가하여 문제가 발생했을 때이를 쉽게 찾을 수있는 도구를 제공합니다. 그리고 2. 코드베이스에 익숙해 져서 무언가 잘못되었을 때에 뛰어 들어 고칠 수 있습니다.

당신은 기본적으로 여기에 자신의 안전망을 만들고 있습니다. 글래머, 아니,하지만 중요한 네!

그래서, 당신은 어떻게 자신에게 동기를 부여해야합니까? 직장에서 정신 마비가되었을 때, 나는 스스로 목표를 세웠다. 일주일이 끝날 때까지 작업 x를 마칩니다. 목표를 달성하면 보상을받습니다. 시도하고 싶은 새로운 식당? 내가 끝내면 금요일 밤에가 새 영화가 나왔어요? 내가 끝내면 주말에 그것을 참조하십시오.

나는 상사와 이야기하고 내가 어디 있는지, 어떻게 진행하고 있는지 알려주는 것을 알게되었습니다. 내가 금요일에 끝날 것이라고 말하면, 금요일에 끝낼 것이라고 더 생각합니다.

일단이 작업을 완료하고 사람들이 알아 차릴 수있는 예산과 예산에 맞춰, 그리고 시니가 새 프로젝트가 나올 때, 당신의 이름은 그것을 얻는 사람으로 제안 될 수 있습니다. :)


나는 금요일 동기 부여에 대한 요점을 특히 좋아합니다. 현재 릴리스가 금요일에 예정되어 있다는 것은 재밌습니다. 감사의 동기가 움직이는 동기라고 덧붙일 가치가 있다고 생각합니다. 다른 사람이 귀하의 작업에 감사하도록하거나 다른 작업을 변경해야합니다. 진심으로 '감사합니다'는 종종 불안한 시간을 롤백합니다.
Dan

1
@gaearon-제안이 도움이되어 기쁩니다. 좋은 동기 부여로 준설 작업을 완료하면 결국에는 돈을 지불하게됩니다. 작년에 현재 직장에서, 당신이하고있는 것과 비슷한 일을해야했습니다. 올해 처음부터 새로운 앱을 만들었습니다. 사람들은 당신이 무엇을하고 얼마나 잘 일하는지 알게 될 것입니다.
Tyanna

3
-1 왜 직장 생활과 개인 생활을 연결합니까? 이것은 지속적으로 초과 근무를 유지하는 것과 비슷하게 들립니다 –I didn't finish my under-estimated task by Friday - so I need to stay at home and feel bad.
Vorac

@Vorac ~ 나는 그것이 내가 동기를 부여하는 일이라고 말했다. 모두 다릅니다. 그리고 나는 당신에게 확신 할 수 있습니다. 저는 OT를 일관되게 일하지 않습니다. 동기를 부여하여 사용하는 것을 찾으십시오. 나는 원하지 않는 일을 할 때 가장 중요한 보상을 얻는다는 것을 알게되었습니다.
Tyanna

1
@IntegrityFirst ~ 예, 그렇습니다. 할 일 목록을 끝내기 위해 늦게까지있을 것입니다. 나는 그것을 때리기 위해 시간을 할애 할 것이다. 내가 완성하겠다고 말하면 무언가를 완성하는 것은 나 자신과 동료들에게 충절이다. 그러나 내가 말한 시간에 할 수없는 일을 발견하면 계획을 변경하고 관리자에게 알립니다. 조금 늦게 끝나면 다음 주에 영화 / 레스토랑에옵니다. :)
Tyanna

30

dailywtf.com에 제출할 후보 코드 스 니펫 파일을 보관하십시오. 실제로 제출하지 않으려는 경우에도 평균보다 더 나쁜 코드를 찾는 데 큰 도움이됩니다.


한 번 더 투표 할 수 있으면 좋겠습니다. 이 사람들이 실제 설정 직전에 변경 로그를 응용 프로그램 구성 파일에 저장한다는 것을 알았으므로 정말 큰 제안이었습니다.
Dan

24

나는 비슷한 상황에 처해 있었고, 불완전하게 쓰여지고 대량으로 복사하여 붙여 넣은 코드를 정리하는 임무를 맡았습니다.

내 동기와 건강을 유지하기 위해 current_score프로젝트에서 LOC를 계산 하는 스크립트를 작성했습니다 (이것은 중복을 제거하고 더 나은 알고리즘으로 전환함에 따라 꾸준히 감소했습니다). 시작했을 때 LOC와 비교했습니다. 내가 겪고있는 코드의 산에 실망하거나 좌절 할 때마다, 달리는 current_score것은 나에게 실질적인 진보의 느낌을주고 이미 성취 한 것을 떠올리게 할 것입니다. 그리고 특히 나쁜 코드 섹션을 처리 할 때 얼마나 높은 점수를받을 수 있는지 보는 것이 재미있었습니다.

나는 당신이 쉽게 진보를 느끼고 그것을 일종의 게임으로 바꾸기 위해 쉽게 스크립팅 할 수있는 비슷한 메트릭을 찾고 싶습니다. 코드 라인 (실행 wc -l), 순환 복잡성 (불필요하게 중첩 된 "if"를 정리할 때 내려 가야 함), 이전 모델 대신 사용자가 건 드리는 코드 라인 ( FireEye 가 $ 10) 등. 아직 로깅 명령문이없는 코드 블록 수를 세는 데 많은 어려움없이 Perl 스크립트작성할 수도 있습니다.


나는 SourceMonitor
UmNyobe를 사용합니다

13

이 책이 권장하는 것을 보았습니다 : 레거시 코드로 효과적으로 작업하기는 했지만 운 좋게 읽을 필요는 없었습니다.

당신이하고있는 것처럼 코드를 이해하고 시스템을 소생시키는 것을 기억할 수 있도록 필요한 것을 리 팩터하십시오.
그것은 집으로가는 길에 당신의 발판에 스프링을 넣어야합니다.


2
이 책은 기존 코드를 리팩토링하여 테스트 할 수 있도록합니다. 나는 그것이 동기 부여에 많은 도움이 될 것이라고 생각하지 않습니다.
Billy ONeal

2
@Billy ONeal이 좋은 점이지만 테스트 가능한 코드와 관련 메트릭이 있으면 동기 부여가 될 수있는 진행 상황이 표시 될 수 있습니다.
StuperUser

1
이 책을 읽었습니다. 확실히 읽을만한 가치가 있습니다. 실제로 WEWLC가 내가 가지고있는 정확한 종류의 좌절감을 이해하고 그 좌절감을 완화시키는 효과적인 방법을 고안 한 사람이 있다는 것을 알게 되었기 때문에 동기를 부여했습니다.
Jason Swett

1
그 책은 다소 오래되고 구식입니다. 읽지 않았다면 왜 권장합니까?
BЈовић

1
@StuperUser 읽은 내용이 오래되었다고 말할 수 있으며 초보자에게 유용한 조언을 제공 할 수 있습니다.
BЈовић

6

프로젝트를 여러 덩어리로 나눕니다. 매일 특정 덩어리가 어떻게 작동하는지 배웁니다. 한 번에 모든 것을 이해하려고 노력하는 것이 아마도 당신에게 스트레스를 줄 것입니다.

프로젝트 개선에 자부심을 가지고 있습니다. 대화 할 수있는 다른 코더가 있습니까? 그것은 당신이 발견 한 최신 논리를 논의하고 웃고있는 물 냉각기 주위에서는 데 도움이됩니다. 나는 일을 즐겁게하기 위해 이것을하기 위해 노력한다.


예, 저는 덩어리로 작업하고 있으며 이미 한 동안 작업 해 왔으므로 각 구성 요소에 대해 대략적으로 알고 있습니다. 여전히 이해하는 데 시간이 걸리는 작은 논리이기 때문에 많은 도움이되지 않습니다. 10 분 동안 30 라인을 사용한 30 가지 방법을 실제로 2 줄로 다시 쓸 수 있다는 사실을 알게되면서 화를냅니다. 불행히도 회사의 경우이 프로젝트의 유일한 개발자이며 현재 고객의 사무실에서 일하고 있으므로 실제로 대화 할 수있는 사람이 없습니다.
Dan

@gaearon-2 라인 솔루션을 구현하지 못하는 이유는 무엇입니까? 당신은 당신이해야 할 일을 수행하는 방법을 알아 내야합니다. 코드가 문제는 클라이언트 사무실에 없을 때 나중에 해결할 수 있습니다. 수행 한 작업, 작동 방식에 대한 메모를 유지해야하며 나중에 다시 돌아가 변경 사항을 구현하여 코드 검토 및 통합 테스트를 수행 할 수 있습니다.
Ramhound

@gaearon 아하! 당신은 유일한 코더입니다. 당신 앞에있는 사람은 유일한 코더였습니다. 당신이 유일한 코더 일 때 (전임자에게서 알 수 있듯이) 많은 것을 피할 수 있습니다. 다음 직업을 찾을 때이 점을 명심하십시오. ;)
davidhaskins

@Ramhound 나는 코드 리뷰가 없을 것이라고 내기하고 있습니다. 공식적인 통합 테스트가 없을 것입니다. 저는이 직책에서 몇 차례 일했습니다. 일반적으로 사람들은 충분히 잘 작동하는 코드 만 원하고 가능한 빨리 코드를 원합니다. "모범 사례"를 설명하는 것은 벽과 대화하는 것과 같습니다 (IMHO).
davidhaskins

@Ramhound,이 프로젝트에 대한 테스트는 없으며 더 깨끗한 코드를 위해 시스템을 망칠 책임이 없습니다. 현재 코드가 예외를 삼키는 것을 암시하거나 명백하지 않은 다른 종류의 나쁜 행동에 의존하는 경우가 많이 있습니다. 이것은 내가 로깅을 추가하는 이유 중 하나입니다.
Dan

6

시스템에 대한 질문, 생각 및 이해를 구성하기 위해 광범위한 메모 를 작성하십시오. 이것은 큰 레거시 시스템을 다룰 때 놀라운 일이었습니다. 이해를 구체화하고, 열린 질문을 말로 표현하는 데 도움이되고, 생각이 이미 정리되어 있기 때문에 문제 / 질문 / 아이디어 / 등에 대해 다른 사람들과 자연스럽게 의사 소통하기가 더 쉽습니다.

예를 들어, 코드를 살펴보면서 지속적으로 메모를 할 것입니다. 이것은 나 자신과의 대화입니다. 단순한 글쓰기로 더 많은 생각이 나오고 더 잘 이해할 수 있습니다. 잠시 후, 나는 유레카를 가질 수 있고 종이에 "더 큰 그림"으로 작은 다이어그램을 그려서 내가 방금 생각한 것 또는 방금 만든 조각을 설명해야합니다. 나는 항상 종이에 대해서만이 작업을 수행하여 컴퓨터의 모든 방해 요소를 제거합니다. 이를 통해 내가하고있는 일에 대해보다 체계적이고 신중하게 대처할 수 있습니다.

이것은 기본적으로 도메인 전문가와 끊임없는 대화를 나눌 수있는 편리한 방법입니다. :)


3

실제로 로깅을 추가하고 많은 리팩토링을 수행 할 때 '로깅 만 추가'라는 관점에서 보면 비생산적이라고 느낄 수 있습니다. 관리자가 코드 상황을 알고있을 것입니다. 모든 사람이 지금은 그것을 인정하지 않을 수도 있지만, 정말로 흥미롭고 도전적인 기능을 추가하라는 요청을 받으면 코드를 정리하게되어 기쁩니다.


프로젝트를 다시 작성하게 될까봐 걱정됩니다. 우리는 이미 그것에 대해 이야기했습니다. 이 옵션이 더 좋지만 버리기 코드 작업에서 생산성을 추가하지는 않습니다. 나는 다음 릴리스에서 로깅이 필요하다는 것을 알고 있으며 내 물건과 함께 갈 수는 있지만,이 코드를 실행하여 내 머리를 가두는 것은 나를 미치게합니다. 나는 그것을 이해 한 후 어리석은 것 같아 :-)
Dan

1
"그것은 버리기 코드 작업에서 생산성을 추가하지 않습니다" Suuure는 말합니다. 위험도가 낮은 작업 (로깅)을 수행하면서 코드 이해에 도움이되는 코드의 많은 부분을 살펴볼 수 있습니다. 당신이 얻고있는이 지식 은 다시 쓰면 엄청나게 도움이 될 것 입니다. 다시 쓰기가 없다면 많은 양의 앱을 정리할 때 느낄 수있는 보상을 기대하십시오. 일관성 있고 지속적인 노력으로 인해 코드 기반이 얼마나 더 나을지.
quentin-starin

2

이 경우 코드 섹션을 다시 작성하는 경향이 있습니다. 한 영역을 덜 빨리 게하고 다른 곳에 로깅을 추가합니다. 그런 다음 코드를 더 정리하십시오. 나쁜 코드는 당신이 그것을 떠나야 만 나쁜 것입니다.


시스템은 나쁜 방법에 크게 의존하여 방법을 올바르게 다시 작성해야합니다. 전체 프로젝트를 다시 작성해야합니다 (아마도 결국은 할 것이지만 현재 릴리스에는 약간의 마감 기한이 있습니다).
Dan

나중에 이해합니다. 나는 내 인생을 고통스럽게 만들고 정리하고 다음 영역을 정리하지 않고 청소할 수있는 섹션을 선택합니다. 코드 수정은 시간이 걸리지 않지만 항상 시간을 내야하는 프로세스입니다.
Erin

2

당신의 일을 게임 화하십시오. 예를 들어, 코드에 대해 좋은 질문을 할 때마다 5 점, 답변 할 때마다 10 점을 부여하십시오. 분석법을 리팩터링하거나 새로운 기능을 추가 할 때마다 배지를 제공하십시오. 포인트가 충분하면 커피 브레이크 또는 비스킷과 같은 특권을 얻습니다. 당신이 전체 프로젝트를 완료하면 당신은 당신이 정말로 원하는 것으로 자신을 대우하는 특권을 얻습니다.


0

지루하거나 화를 내지 않고 생산성을 유지하는 비결은 코드가 제대로 설계되지 않았다는 것입니다. 코드를 이해하고 업데이트해야한다는 입장을 받아들이면 "어리석은 방법"에 대해 계속 언급하지 않고 대신 조용히 받아들이고 계속 진행할 수 있습니다.

또 다른 요령은 하루가 끝날 때까지 좋은 가정 생활을하는 것입니다. 여자 친구, 친구, 게임 등 모든 것이 효과가 있으며 하루 종일 끝내고 나쁜 코드이지만 가치있는 코드를 만드는 것이 목표입니다.


0

Michael Feathers의 "레거시 코드로 효과적으로 작업하기"가 도움이 될 수 있습니다.

변경시 문제가 발생하는 경우 먼저 테스트를 작성하고 변경 전후에 통과해야합니다. 테스트를 작성하면 주어진 코드가 수행하는 작업을 요약하고 이해하는 데 도움이되며 자신있게 편집 할 수 있습니다.


불행히도이 프로젝트는 SharePoint 프로젝트이므로 거의 테스트 할 수 없습니다. Microsoft Moles를 사용하여 과거에는 SharePoint 용 멋진 샌드 박싱을 작성했지만 추가 작업이 많이 필요합니다.
Dan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.