코드를 작성할 수는 있지만 잘 디자인 할 수는 없습니다. 어떤 제안? [닫은]


83

나는 비트와 조각으로 코드를 작성하는 데 능숙하다고 생각하지만 내 디자인은 정말 짜증납니다. 문제는 디자인을 어떻게 개선하고 더 나은 디자이너가 되는가입니다.

학교와 대학은 수학적 문제 해결에 능숙 해지는 방법을 사람들에게 가르치는 데 많은 도움이되지만 학교에서 만든 대부분의 응용 프로그램은 일반적으로 약 1000-2000 줄 정도의 길이라는 사실을 인정합니다. 실제 소프트웨어의 복잡성은 수십만에서 수백만 줄의 코드로 반영되지 않습니다.

이것은 topcoder / project euler와 같은 프로젝트조차도 큰 도움이되지 않을 것이라고 생각합니다. 수학적 문제 해결 능력을 향상시킬 수는 있지만 학업 프로그래머가 될 수 있습니다. 멋지고 깨끗한 물건에 더 관심이 있고 대부분의 응용 프로그램 프로그래머가 다루는 일상적인 평범하고 털이 많은 물건에 전혀 관심이없는 사람.

제 질문은 디자인 기술을 어떻게 향상 시키는가입니다. 즉, 수천 줄의 코드로 들어가는 중소 규모의 응용 프로그램을 설계 할 수 있습니까? 더 나은 HTML 편집기 키트 또는 김프와 같은 일부 그래픽 프로그램을 빌드하는 데 도움이되는 디자인 기술을 어떻게 배울 수 있습니까?


1
"학교에서 만든 대부분의 응용 프로그램이 일반적으로 1000-2000 줄 정도라는 사실을 인정해야합니다. 이는 대부분 실제 소프트웨어의 복잡성을 반영하지 않는 학문적 연습이라는 것을 의미합니다." 한 학기 소프트웨어 프로젝트로 10 명의 학생으로 구성된 팀이 6-8 개월 동안 상당히 복잡한 응용 프로그램을 개발했습니다. 또한 많은 회사 (적어도 독일에서는)는 공부를 마치기 전에 연습을 원하는 학생들을 위해 짧은 계약을 제공합니다.
Giorgio

답변:


87

무언가를 정말로 잘하는 유일한 방법은 시도, 눈부신 실패, 다시 시도, 이전보다 조금 덜 실패한 후 시간이 지남에 따라 실패의 원인을 인식하여 나중에 실패 가능성을 관리 할 수있는 경험을 개발하는 것입니다. 소프트웨어 개발의 모든 측면을 배우기 때문에 좋아하는 1 인칭 슈팅 게임에서 악기 연주, 자동차 운전 또는 심각한 PWN 나이를 배우는 것도 마찬가지입니다.

실제 지름길은 없지만 경험을 쌓는 동안 문제가 발생하지 않도록 할 수있는 방법이 있습니다.

  • 좋은 멘토를 찾으십시오 . 이미 회비를 지불 한 사람과 문제에 대해 이야기하는 것보다 더 좋은 것은 없습니다. 지도는 빠른 학습을 돕는 훌륭한 방법입니다.
  • 읽고 , 더 읽고 , 읽고있는 것을 연습하고, 경력 전체에 걸쳐 반복하십시오. 나는 20 년 이상이 일을 해왔으며, 매일 새로운 것을 배우기 시작합니다. 초기 설계뿐만 아니라 새로운 설계, 테스트, 모범 사례, 프로세스 및 방법론에 대해서도 배우십시오. 모두 디자인이 어떻게 등장하고, 형태를 취하며, 시간이 지남에 따라 지속되는 방식에 다양한 영향을 미칩니다.
  • 어설프게 시간을 찾으십시오 . 직장을 통해 스 unk 크 워크 프로젝트에 참여 하거나 자신의 시간에 연습하십시오. 이것은 새로운 지식을 실천하고 그러한 것들이 어떻게 작동 하는지를 보며 독서와 함께 진행됩니다. 이것은 또한 멘토와 좋은 대화를 나누는 것들입니다.
  • 가져 뭔가 기술과 관련된 외부 직장의. 이것은 프로젝트 또는 포럼 일 수 있습니다. 사물에 대한 새로운 관점을 유지하기 위해 즉각적인 동료 집단 밖에서 이론과 아이디어를 테스트 할 수있는 것.
  • 인내심을 가지십시오 . 경력을 쌓는 데 시간이 걸린다는 점을 인식하고 실패한 이유와 장소를 배우기 위해 잠시 물러서야한다는 것을 배우십시오.
  • 작업, 생각, 실패 및 성공에 대한 일기 또는 블로그 를 유지하십시오 . 이것은 꼭 필요한 것은 아니지만, 시간이 지남에 따라 어떻게 발전해 왔는지, 기술이 어떻게 발전하고 생각이 바뀌 었는지 보는 것이 큰 도움이 될 수 있다는 것을 알게되었습니다. 몇 달에 한 번씩 자신의 일지로 돌아가서 4-5 년 전에 쓴 내용을 살펴 봅니다. 그 당시에 내가 얼마나 배웠는지 발견하는 것은 진정한 눈을 뜨는 것입니다. 또한 때때로 문제가 있음을 상기시킵니다. 건강 개선에 도움이됩니다.

45
시도와 실패의 경우 +1 왜 디자인 패턴이 있는지 이해하지 못하면 해당 패턴을 효과적으로 사용할 수 없습니다.
Mert Akcakaya

2
+1 큰 답변이지만 다소 불완전하다는 것을 알았습니다. 나는 지금까지 가장 중요한 기여는 리팩토링에 대한 좋은 식욕을 갖는 것이라고 믿습니다. 쓰기, 이론의 내용 (기사, 서적 또는 멘토), 리 팩터 / 다시 쓰기, 이론으로 돌아 가기, 리 팩터 / 다시 쓰기-친숙한 코드로 작업하면서 구조에 집중할 시간을줍니다. 최악의 비평가가 되십시오. 또한 자신의 일을 지속적으로 재 방문하여이 식욕을 잃어 버리지 않는 것이 매우 중요하다고 말합니다.
vski

1
@vski 내가 포함 할 수있는 많은 개념이 있지만 문제는 이러한 개념 자체가 OP가 자신을 개선 된 디자이너로 간주하는 데 필요한 경험을 얻는 데 합리적인 경로를 제공하는지 여부입니다. 내 대답의 범위에서, 나는 리팩토링을 연습으로 보았습니다 (두 번째 요점에 따라). Clean Code, Test First, BDD 및 기타 여러 개념도 연습하고 있습니다. 나는 시간이 지남에 따라 경험과 지식을 습득하면서 디자인 기술이 등장하고 성장할 수있는 수준으로 발전하기 위해 많은 기술과 경험이 필요하다는 접근 방식을 취했습니다. :)
S.Robins

2
멘토를 얻기 위해 +1. 이상적으로, 멘토가 당신과 함께 코드 검토를하도록하십시오. 다른 사람이 귀하의 코드를 읽고 비판하도록하면 더 좋고 깨끗한 디자인에 도움이 될 수 있습니다.
Leo

2
"시도해 보았습니다. 실패했습니다. 상관없이 다시 시도하십시오. 다시 실패하십시오. 더 잘 실패하십시오." --- 사무엘 베켓.
Peter K.

16

글쎄요, 이런 종류의 질문에 대한 황금 사과는 없으며, 아마도 이것이 모든 코더 자신이 자신에게 맞는 것을 찾는 것입니다. 어쨌든 여기에 내 테이크가 있습니다.

당신은 수있는 주제에 대한 책을 읽고. 훌륭한 책. 환상적인 책. 그러나이 책은 응용 프로그램을 빌드하고 디자인하려고했지만 실패한 경우에만 도움이됩니다.

나를 위해, 그것은 경험에 관한 모든 것입니다. 신인으로 시작했을 때 디자인 방법에 관한 책을 읽었습니다. 당시에는 내용을 많이 이해하지 못했습니다. 작업을 시작하고 응용 프로그램을 직접 디자인해야 할 때 매우 지저분한 응용 프로그램을 만들었습니다. 그들은 일했지만 유지하기가 힘들었습니다. 그런 다음 그 책들을 다시 읽었습니다. 이번에는 더 잘 이해했습니다.

이제 저는 계속해서 새로운 실수를하고 옛 실수를 배웁니다.


10
여기에 언급 할 가치가있는 좋은 점이 있습니다 . 새로운 실수를 계속하십시오 . 동일하게 유지하지 않는 오래된 실수를 - 그들로부터 배우고, 새로운 뭔가.
Bevan

11

설계를 중단하고 코드 리팩토링을 배우십시오. 지속적이고 공격적인 리팩토링을 통한 증분 ​​개발은 초기 설계보다 훨씬 최종 제품이 더 깨끗합니다.


2
이머전 트 디자인은 아름다운 IMHO이지만, 징계가 없으면 "어머 전트 스파게티"가 발생할 위험이 있습니다. 초기 디자인의 문제점은 사람들이 그것을 전혀 또는 전혀 제안하지 않는 것으로보고, 상황이 나빠질 때 나쁜 담당자가된다는 것입니다. 이것은 Joel 이 디자인이 중요하다고 언급 한 Joel의 기사 중 하나를 상기시킵니다 . 그러나 시간과 자원을 빼앗기지 않고 디자인을 변화시킬 수있는 충분한 선구자가 필요하며, 깔끔한 코드를 통해 아름다운 지원 디자인이 유기적으로 나타날 수 있습니다.
S.Robins

@ S.Robins : OP가 TDD 및 지속적인 리팩토링으로 매우 잘 완료 될 정도로 작은 프로젝트를 여전히 공격하고 있다고 생각했습니다. 따라서 그는보다 복잡한 프로젝트에 얼마나 많은 디자인이 필요한지 알기 위해 필요한 훈련을 배울 수 있습니다.
케빈 클라인

나는 그럴 수도 있다고 생각했지만, "모든 선불 디자인"이 완전히 등장하는 것보다 잠재적으로 더 나빠질 것이라는 의미에 반격을 가할 가치가 있다고 생각했다. 그러나 OP가 추구하는 필요한 경험을 구축하는 방법은 디자인에 대해 처음부터 걱정하지 않고 잘 정리되고 깨끗한 코드를 작성하는 데 집중하는 것입니다. :-)
S.Robins

리팩토링이 항상 최상의 디자인으로 이어진다는 것에 동의하지 않습니다. 물론 리팩토링을 사용하면 문제를 탐색하고 이해할 수 있지만 리팩토링을 통해 디자인이 향상되는 것은 아닙니다. 때로는 훨씬 더 나은 해결책을 찾고 현재 코드가 코드에서 너무 멀리 떨어져있어 다시 작성하는 것이 리팩토링보다 훨씬 빠르다는 것을 알고 있습니다.
Giorgio

나는 최근 에이 경험을했다 : 나는 리팩토링과 리팩토링을 계속 유지하고 같은 문제를 반복해서 반복한다. 나는 반복자를 사용하여 무언가를 코딩하고 코드는 복잡해졌다. 그런 다음 반복자를 잊기로 결정하고 많은 코드를 다시 작성해야했지만 논리가 이전보다 훨씬 명확하고 간결 해졌습니다. 이 "공격적 리팩토링"이라고 부르는지 모르겠습니다. 응용 프로그램의 전체 구조는 변경되지 않았지만 일부 기본 부분은 버려지고 처음부터 다시 작성되었습니다.
Giorgio

7

패턴에 대해 읽으십시오. 그러나 가장 먼저 안티 패턴에 대해 읽으십시오. 안티 패턴을 인식하는 것이 중요하며, 왜 그렇게해야하지 않는지 왜 그렇게하지 않아야 하는지를 이해하는 것이 더 쉽습니다.

예를 들어 http://sourcemaking.com/antipatterns/software-development-antipatterns 를 참조 하십시오 .

요구 사항이 변경되면 프로덕션 환경에서 매우 일반적으로 빠르게 조정할 수 있도록 코드를 작성하십시오.

"단지 하나의 작은 핵"을 추가하는 것에 대해 회의적입니다. 하나 더, 하나 더, 코드는 유지 보수가 불가능 해집니다.

가치 폐쇄 / 개방 원칙을 .

테스트를 작성하십시오 (TDD에서와 같이). 실제로 구현하기 전에도 디자인을 생각하게합니다.

오픈 소스 프로젝트의 코드를 찾아보십시오 (합리적인 규모의 프로젝트). 나는 일반적으로 너무 많은 추상화 수준을보고 놀랐습니다. 나는 그것이 예술을위한 예술이 아니라는 것을 이해합니다. 그것이 이런 식으로 이루어진 이유가 있습니다.


4

좋은 디자인에 매우 중요하다고 생각하는 한 가지 원칙은 분해입니다. 클래스가 너무 큰 경우 (300-400 줄 이상의 코드) 작은 클래스로 나눕니다. 메소드가 너무 큰 경우 (예 : 50 줄 이상의 코드) 분해합니다. 프로젝트에 50 개 이상의 클래스가 포함되어 있으면 분해하십시오.

핵심은 시스템의 크기를 추정하고 몇 가지 추상화 계층 (예 : 서브 시스템, 응용 프로그램, 프로젝트, 모듈, 클래스, 방법)을 구성하여 코드를 이해하기 쉬운 단위로 분해하고 소수의 종속성을 갖는 이해 가능한 단위로 분해 할 수 있도록하는 것입니다.


1
제안에는 약간의 장점이 있지만 코드 줄은 중요하지 않지만 동작은 중요합니다. 메소드가 둘 이상의 작업을 수행하는 경우 리팩토링해야 할 때입니다. 그중 하나가 단지 하나의 일을하는 메소드를 호출하고 함께 묶는다면 괜찮습니다.

1
@jer : 물론 경험 법칙입니다. 100 개의 다른 메소드를 호출하는 메소드는 말 그대로 스티칭 (하위 함수 목록을 호출하는 것)입니다. 나는 실제 논리를 포함하는 메소드에 대해 더 많이 생각하고 있습니다. 메소드가 수행하는 작업을 이해하기 위해 많이 스크롤 해야하는 경우 일반적으로 나쁜 징조입니다. 멤버가 많은 클래스 정의를 볼 때도 마찬가지입니다 (클래스는 단순한 플랫 속성 모음이 아닙니다).
Giorgio

"프로젝트는 50 개 이상의 클래스를 포함하고 분해합니다"는 심각하지 않습니다
동적

@ yes123 : 아이디어를주기위한 것이 었습니다. 정말 등 어떤 언어로, 당신은 개발에 따라 달라집니다
조르지오

리팩토링을하는 동안 초기 설계에는 도움이되지 않지만 향후 설계를 개선 할 수있는 패턴과 모범 사례를 배우는 데 도움이 될 것입니다.
Craig Bovis

0

힘든 것은, 우리가 실제로 이야기하는 것은 더 나은 코드를 만드는 것이 아니라 추상화하는 능력이지만, 두 가지가 더 나아지고 한 가지가 더 행복해집니다.

"보다 나은"

A) 당신이 할 수있는 최고의 디자이너를 찾고 프로그램을 함께 디자인하고 디자인을하십시오. 그들이 문제를 해결할 때 생각하고있는 것을 설명하고, "정확하다고 느낀다"는 말을하지 말고 계속 파십시오. 그 과정은 "멘토링"파티에도 도움이 될 것입니다

B) 모든 것을 개별 배우와 그들 간의 대화로 생각하십시오. 각 액터는 단일 역할 / 책임을 가져야하며 각 그룹은 다른 시스템을 처리합니다. 그 대화가 효과가 있고 각 배우가 일관되고 응집력이 있다면 당신은 가고 있습니다.

그리고 "행복한"

C) 최선을 다 했는데도 여전히 일어나지 않는다면 어떤 사람들은 어떤 일을 할 수 없다는 것을 받아들이는 데 아무런 문제가 없습니다. 타이트하고 화려한 코드를 작성할 수는 있지만 디자인하거나 설계 할 수는 없습니다. 그래서 무엇? 나는 토피를 위해 육체적 스포츠를 할 수없고, 잘 보이지 않으며 내 차 운전이 평균보다 더 나을 수 없습니다. 당신이 잘하는 것을보고 활용하십시오.


-1

내 개인적인 경험에서 다른 사람의 코드를 읽는 것은 "영감"의 좋은 원천입니다. 다른 사람들의 디자인을 이해하고 왜 그런 식으로 일을하는지 스스로에게 물어보십시오.

연구를위한 많은 오픈 소스 프로젝트를 찾을 수 있습니다.

어쨌든 연습이 필요합니다.


-1

두려워하지 마십시오

단순성을 위해 노력하십시오

사용자의 의견을 경청하십시오

많은 아이디어를 시도하십시오

무언가를 만든 다음 더 나아지십시오

가치를 더하는 일을하고, 그렇지 않은 것을 버린다


-1

올바른 질문을하는 법을 배우십시오. 종종 다른 각도에서 문제를 살펴봄으로써 디자인을 향상시킬 수 있습니다. 특히, 이는 현재 문제를 해결하는 데 주력하지 않고 여러 관련 문제를 해결하는 솔루션을 더 많이 찾는 데 도움이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.