숙련 된 C ++ 엔지니어 팀에 OOP / OOD를 "소개"하는 가장 좋은 방법


17

기존 팀원에게 OOP 개념을 도입하기위한 모욕적 인 방법이 아닌 효율적인 방법을 찾고 있습니까? 내 팀원은 OO 언어를 처음 사용하지 않습니다. 우리는 오랫동안 C ++ / C #을 해왔으므로 기술 자체가 친숙합니다.

그러나 나는 노력 (주로 코드 검토의 형태)을 크게 주입하지 않고 둘러보고, 우리가 생산하는 것은 클래스 내부에서 발생하는 C 코드 인 것 같습니다. 단일 책임 원칙, 추상화 또는 커플 링을 최소화하려는 시도는 거의 사용되지 않습니다. 생성자가 없지만 인스턴스화 될 때마다 0으로 memset되는 클래스를 보았습니다.

그러나 내가 OOP를 시작할 때마다 모두가 항상 고개를 끄덕이며 내가 말하는 것을 정확히 알고있는 것처럼 보입니다. 개념을 아는 것은 좋지만 실제 작업을 수행하는 데있어 개념을 적용하는 데 어려움을 겪는 것 같습니다.

코드 검토는 매우 도움이되었지만 코드 검토의 문제점은 사실 이후에만 발생하므로 일부는 방금 작성된 코드를 다시 작성하는 것입니다 (주로 리팩토링이지만 여전히 많은 시간이 걸립니다). 또한 코드 검토는 전체 팀이 아닌 개별 엔지니어에게만 피드백을 제공합니다.

프레젠테이션 (또는 시리즈)을 수행한다는 아이디어를 가지고 놀면서 더 잘 작성되고 리팩토링 될 수있는 기존 코드의 예와 함께 OOP를 다시 시도하려고합니다. 아무도 더 이상 소유하지 않은 오래된 프로젝트를 사용할 수 있으므로 적어도 그 부분은 민감한 문제가되어서는 안됩니다. 그러나 이것이 효과가 있습니까? 내가 말했듯이 대부분의 사람들은 C ++을 오랫동안 해왔 기 때문에 내 추측은 a) 왜 내가 이미 알고있는 것들을 말하고 있는지 왜 생각하는지 앉아있을 것입니다 .b) 그들은 실제로 모욕으로 생각할 수 있습니다 그들에게 그들이 수십 년이 아니더라도 몇 년 동안 해왔 던 일을 어떻게해야할지 모른다고 말합니다.

코드 검토보다 더 많은 잠재 고객에게 도달 할 수있는 다른 방법이 있지만 동시에 처벌 강의처럼 느껴지지 않습니까?

나는 완벽하게 설계된 코드의 유토피아 적 이상을 가진 대학에서 신선한 아이가 아니며 다른 사람으로부터 그것을 기대하지 않습니다. 제가이 글을 쓰는 이유는 종이에 실제로 고급 디자인을 한 사람을 검토했기 때문입니다. 그러나 클래스를 A-> B-> C-> D로 묘사하면 코드 B, C 및 D는 거의 동일한 공용 인터페이스를 구현하고 B / C에는 하나의 라이너 기능이 있으므로 최상위 클래스 A가 절대적으로 수행됩니다. 모든 작업 (메모리 관리, 문자열 구문 분석, 설정 협상 ...)은 주로 4 가지 몽고 방법으로 이루어지며 모든 의도와 목적을 위해 거의 직접 D로 호출합니다.

업데이트 : 저는 기술 책임자 (이 역할에서 6 개월)이며 그룹 관리자를 전적으로 지원합니다. 우리는 매우 성숙한 제품을 개발하고 있으며 유지 보수 비용이 확실히 알려지고 있습니다.



3
어떤 식 으로든 감독자 또는 상사입니까? 그렇지 않은 경우, 여러분 모두의 사장 인 기술 책임자의 지원이 있습니까? 딥 OOP 디자인을 사용하지 않고 몇 년 동안 개발 및 개발이 꾸준하고 생산적 이었다면 프로그래머가 작업 코드가 작동하지 않고 관리하지 않아도된다는 확신을 심어주기 위해 오르막길을 벌이고 있습니다 코드를 생성하는 데 더 많은 비용이 들었습니다.
Patrick Hughes

이 게시물을 작성한 후 programmers.stackexchange.com/questions/43214/… 와 같은 관련 링크가 나타납니다 . 똑같은 것이 걱정됩니다. 문제는 팀에 2 명의 개발자가 있었고 코드 검토를 통해 확실히 관리 할 수 ​​있다는 것입니다. 팀 규모 (10+)에서 작동하는 접근법을 찾고 있습니다. 모든 개발자와 내가 원하는만큼 일대일로 의사 소통을 할 수는 없습니다.
DXM

답변:


5

SOLID 원칙 에 대한 간단한 교육을 개발 하여이 교육을 제공하지 않겠습니까? 현재 조직에서 저에게 매우 효과가있는 것으로 보이며, 짧은 훈련을받는 것이 실제로는 재미 있음을 알게되었습니다 (모든 관련자에게).

훈련을했을 때 나는 (다양한 프로젝트의) 기존 코드에서 병리학적인 "나쁜"예제를 검색하는 데 시간이 걸렸으며 원리를 사용하여 단계별로 프레젠테이션에서 리팩토링했습니다. 이것은

  1. 이러한 리팩토링을 수행하는 것은 그리 어렵지 않습니다.
  2. 오래 걸리지 않습니다
  3. 최종 결과 (주의 깊게 ;-) 선택)는 원래 코드보다 분명히 낫습니다.

5

코드 검토는 매우 도움이되었지만 코드 검토의 문제점은 사실 이후에만 발생한다는 것입니다.

한 프로젝트에서 설계 검토를 수행했습니다.

15 분. 화이트 보드에서. 코딩하기 전에 디자인을 통해 대화하십시오.

가장 중요한 부분은 구현 작업 전에 설계 검토를 예약하는 것입니다.

우리는 또한 "심각한 디자인 리뷰"를 가지고있었습니다. 그들은 많은 문서와 긴 프리젠 테이션을 포함했습니다. 일정을 잡기 어려웠으며 코딩이 시작될 때까지 거의 항상 푸시 아웃되어 값이 0으로 줄었습니다.

코딩 이전의 비공식적 설계 검토-압력 없음-문서화 없음-책임 할당 방식 및 객체 협업 방식에 대한보다 나은 토론이 가능합니다.


그렇습니다. 우리는 이미 당신이 묘사 한대로 정확하게 디자인 리뷰를하고 있습니다. 문제는 중간 규모의 작업입니다. 작업이 충분히 큰 경우 일반적으로 팀에 의해 개선 된 초기 클래스 다이어그램을 작성하는 데 시간이 걸립니다. 작업이 작 으면 기존의 고급 디자인으로 충분합니다. 그러나 중간 규모의 작업의 경우 디자인에 대해 충분한 생각을 할 수있는 능력이 없으므로 기본 규칙은 "최상의 판단 사용 및 OOP 준수"입니다. 이 작업을 직접 수행하려면 코딩부터 시작하여이를 연속 리팩토링과 혼합해야합니다.
DXM

... 코드가 최종 디자인의 모양을 결정하도록합니다. 그러나 이러한 작업을 일부 팀원에게 맡기면 코드 검토에서 찾은 내용이 초기 게시물에서 설명한 것과 같습니다.
DXM

1
@DXM : 무엇? 당신은 그들을하고 있습니까? 아니면하지 않습니까? 크기가 크면 디자인 검토를하지 않고 다른 사람을 위해 디자인을하는 것입니다. 디자인을 할 때 배우는 사람은 누구입니까? 작 으면 디자인 검토를하지 않는 것입니다. "기존 디자인만으로도 충분합니다"-디자인을 무시하면 누가 몸을 기울입니까? 중간 크기 인 경우 디자인을하지 않고 디자인을 검토하지 않습니까? 실제로 실제 설계 검토를 수행하는 것처럼 들리지 않습니다. 왜 자신이라고 말한 다음에 그렇지 않은지 세 가지 예를 들어보십시오.
S.Lott

@Lott : 귀하의 답변을 반영 할 때, 유일한 결론은 당신이 절대적으로 옳다는 것입니다. 내가 말해야 할 것은이 정확한 생각을 적어도 8 번 제기했고 모두가 항상 동의했다는 것입니다.하지만, 우리가 정한 리듬을 되돌아 보면 실제로는 아무 것도하지 않습니다. 이 문제에 대해 더 자세히 논의하고 싶지만 Q & A 사이트에 대한 토론을 벌써 개조 한 사람들은 이미 훈련을 받았습니다. 채팅으로 넘어갈 수 있을까요? 나는 상황을 더 설명하고 아마도 당신의 두뇌 (또는 참여하고 싶은 다른 사람)를 조금 선택하고 싶습니다. 채팅을 한 적이 없어요, 어떻게 작동하는지 아십니까?
DXM

@DXM : 채팅의 사소한. 그리고 너무 도움이되지 않습니다. 이 초기 질문보다 더 자세한 질문이 있으면 더 자세한 질문을해야합니다. 그게 요점입니다. 경우에 따라 "추가 토론"은 "다음 질문으로 인해 귀하의 질문에 대한 답변이 마음에 들지 않습니다 ..."에 해당합니다. 답변을 좋아하지 않는 것은 단순히 답변을 좋아하지 않으며 토론이 필요하지 않습니다. 몇 가지 경우에, 토론은 "나의 질문은 모호하지 않으며, 읽을 수는 없다"고한다. 정말 도움이되지 않습니다. 질문하십시오. 질문으로.
S.Lott

4

나는 당신이 일부 개발자보다 젊지 만 먹이 사슬에서 더 높다고 가정합니다.

다운 보트에 묻힐 위험이있을 때, '경험이 풍부한 엔지니어'가 실제로 옳은 일을하고 있거나, 수십 년 전쯤되었을 수도있는 성숙한 제품이기 때문에 한때 옳았 던 일이었을 수 있습니다.

오래된 코드는 당시 하드웨어에서 빠르게 실행되도록 최적화 된 경향이 있습니다. 무엇보다도 이것은 상속 수준을 줄이고 사소한 작업을위한 함수 / 메소드 호출을 피하는 것을 의미합니다.

컴파일러는 수년에 걸쳐 훨씬 더 똑똑해 졌으므로 지금은 모든 것이 사실이 아닙니다. 예를 들어, 컴파일러는 작은 함수를 인라인하기로 선택할 수 있습니다.

아마도 앞으로 나아가는 길은 다른 접근법을 채택하는 것일 것입니다. 개발자들에게 그들의 방법이 당신이 배운 이론보다 어떻게 / 왜 더 나은지를 설명하도록 요청하고 그것에 대해 진심으로 이야기하십시오.


0

새로운 / 변경된 각 방법 의 100 % 분기 적용 범위로 단위 테스트를 추진하면 방법 간의 결합이 최소화되지 않습니다.


UT는 좋은 생각이지만 이것이 원하는 결과를 얻을 것이라고 확신하지는 않습니다. 또한 OO의 기본 원칙 중 하나는 함수 간의 결합을 피할 수 없다는 것이므로 이러한 결합 된 함수를 단일 클래스로 명시적이고 그룹화하는 것이 좋습니다.
MSalters

나는 "함수 사이의 각각의 결합은 피할 수 없다"는 것에 동의합니다. 그러나 우수한 설계는 각 기능이 결합 된 다른 기능의 수를 줄입니다. (수업은이 목적을위한 수단 일뿐입니다)
Ian

0

Gang of Four에서 "디자인 패턴"책을 선택할 수 있습니다. C ++에만 국한된 것은 아니므로 동료 C ++ 지식을 공개적으로 비판하지는 않습니다. 그러나 동시에 관련성있는 주제를 다룹니다. 또한이 책은 관련성이 높은 것으로 널리 받아 들여 져서 이론적이거나 비현실적인 책으로 쉽게 기각 할 수 없습니다.

반면에 C ++은 디자인이나 실제적으로 순수한 OO 언어가 아니라고 생각하십시오. 전체 생성자 / memset 이야기는 RA ++을 소개해야한다고 들립니다. 이는 OO 기술이 아니며 C ++에만 해당됩니다 (불행히도 .Net의 IDispose는 RAII가 나중에 생각 될 때 발생하는 일을 보여줍니다). 여기에 관련된 책은 (More) Effective C ++ 및 (More) 예외적 C ++입니다.


2
그러나 저자들은 디자인 패턴이 일반적으로 OOP / OOD에 대한 소개가 아니라고 분명히 밝힌다! 청중은 먼저 하드 코드 디자인 패턴 카탈로그에 들어가기 전에 OOP가 제공하는 기술에 익숙해야합니다! "헤드 퍼스트 디자인 패턴"은 좋은 소개가 될 것입니다.
팔콘

2
OP 설명에서 OOP / OOD를 알고있는 것으로 보이며, OOP / OOD를 사용하지 않고 (어쩌면 너무 복잡 할지도 모른다는 두려움에서) 유용한 경우 코드 예제보다 유용한 이유를 설명하는 책이 있습니다.
wildpeaks

@wildpeaks : OP는 반대입니다. 그들은 OOP / OOD를 모른다. 그들은 절차 적 방식으로 OOP를 프로그래밍하고 있습니다. 디자인 기법을 소개 할 무언가가 필요하며 GoF 책은이 시나리오에 적합하지 않습니다.
팔콘

나는 문장으로 언급했다 But every time I bring up OOP, everyone always nods and makes it seem like they know exactly what I'm talking about하고 My teammates are not new to OO languages, 그러나 그들은 단지 OOP를 알고에 대해 거짓말을 할 수 있기 때문에 나는 그것이 참으로 조금 애매한 방법을 볼 수있을 때 그것에 대해 그들에게 OP 회담.
wildpeaks

1
@MSalters-디자인 패턴의 서문 : "이 책은 객체 지향 기술이나 디자인에 대한 소개가 아닙니다. 많은 책들이 이미 그 일을 잘 수행하고 있습니다.이 책은 적어도 하나의 객체 지향 프로그래밍 언어에 능숙하고 자신이 있다고 가정합니다. "객체 지향 디자인에도 경험이 있어야합니다." 이 책은 요구 사항에 맞지 않습니다. 그들은 엔트리 레벨 OOD 자료를 읽어야합니다.
팔콘
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.