작업 할 디자인 연습을 어디서 찾을 수 있습니까? [닫은] .

문제 해결 기술을 계속 연습하는 것이 중요하다고 생각합니다. 내 자신의 미니 프로젝트를 작성하는 것은 한 가지 방법이지만, 다른 방법은 온라인에 게시 된 문제를 시도하고 해결하는 것입니다. 영리한 알고리즘을 적용하여 해결해야하는 흥미로운 프로그래밍 퀴즈를 온라인에서 쉽게 찾을 수 있습니다. Project Euler 는 잘 알려진 예입니다.

그러나 많은 실제 프로젝트에서 소프트웨어 설계 , 특히 초기 단계에서 큰 영향을 미치며 이후 단계에서 일반 알고리즘만큼 쉽게 조정할 수는 없습니다. 이러한 기술을 향상시키기 위해 디자인 문제 모음을 찾고 있습니다.

“디자인”이라고 말하면 소프트웨어 솔루션의 추상적 인 디자인을 의미합니다. 예를 들어 어떤 모듈이 있고 모듈 간의 종속성, 프로그램에서 데이터가 흐르는 방식, 데이터 저장에 필요한 데이터 종류 등이 있습니다. 설계 문제는 모든 프로젝트의 초기 단계에서 해결해야하는 문제이지만 솔루션은 단일 코드 줄이없는 화이트 보드 다이어그램입니다.

물론 이러한 종류의 문제에는 하나의 올바른 해결책이 없지만 문제에 접근하는 데 사용할 수있는 일반적인 솔루션의 장단점을 표시하는 모든 장소에 특히 만족합니다.



답변

코드 카타는 어떻습니까 . 나는이 중 몇 가지를 해왔고, 그들은 재미 있고, 항상 배울 것이있을 정도로 도전적입니다.

각 kata에 대한 의견에는 일반적으로 붙어있는 모든 것에 대한 답변을 제공하기에 충분한 정보가 있습니다.


답변

시작 고전적인 디자인의 문제 : KWIC합니다.

David Parnas 는 모듈화에 대한 그의 고전 논문에서 KWIC를 예로 사용했습니다. 시스템을 모듈로 분해하는 데 사용되는 기준 .

문맥에서 키워드 인 KWIC 는 텍스트 행을 읽은 다음 키워드를 기준으로 각 행을 회전 (예 : “the”, “with”제외)하여 각 행을 추가 하는 간단한 색인 및 정렬 문제입니다 . 그런 다음 정렬하십시오. KWIC을 사용하면 책의 색인을 생성하는 데 유용합니다. 파나 스는 그의 고전 논문 당시 숙련 된 프로그래머가 1-2 주 안에 문제를 해결할 수 있다고 말했지만, 야 니스의 법칙에 따르면 이제 1-2 시간 안에 해결할 수 있다고한다 . [운영 체제 및 표준 라이브러리가 훨씬 향상되었습니다.]

Parnas의 논문을 읽고 KWIC 프로그램이해야 할 일을 파악하자마자 디자인 연습으로 자신의 글을 쓰십시오. 그런 다음 나머지 두 가지 디자인에 대해 논의하는 나머지 문서를 읽으십시오. 둘 다 모듈 식이지만 하나는 정보를 숨기고 다른 하나는 그렇지 않습니다.

KWIC 예제를 알고 나면이를 사용하는 다른 소프트웨어 디자인 용지를 감상 할 수 있습니다. 예를 들어 Michael VanHilst의 논문 Decoupling Change from Design 은 C ++ 템플릿을 사용하여 실제로 흥미로운 디자인 기법을 보여줍니다. 그리고 C ++ 템플릿과 디자인에 관해 이야기하는 한 Czarnecki와 Eisenecker의 Synthesizing Objects 논문을 읽으십시오 .

KWIC 에서 시작한 Spacewar 예제 와 같은 다른 고전적인 예 는 Python 및 AspectJ 와 같은 여러 언어로 포팅 / 재 설계되었습니다 .

물론 모든 프로그램을 설계 연습으로 사용할 수 있지만 KWIC 및 Spacewar는 여러 대안을 볼 수있는 예입니다.


답변

이런 종류의 “카타 프로그래밍”이라고 들었습니다. 카타 (Kata)는 완벽하게 반복해서 반복되는 형태 또는 일련의 움직임을 나타내는 무술 용어입니다. 선택한 언어로 카타를 검색하면 무언가를 낼 수 있습니다. 🙂


답변

Katas와 Euler가 알고리즘을 설계하고 코딩을 연습하는 데 유용하다는 데 동의합니다. 아마도 알고리즘을 확장하고 문제 중 하나를 중심으로 약간 창의적이고 시스템을 설계 할 수 있습니다.

예를 들어, 나는 가장 빠르고 짧은 답변을 찾기 위해 Euler의 문제를 해결하는 것뿐만 아니라 분산 방식으로 해결하려고 노력하고 있습니다-문제 중 하나를 해결하기 위해 일련의 Erlang 노드를 설정하고 싶습니다. 물론 이것은 문제를 분리 된 덩어리로 분리하고 진행 상황을 다시보고하고 결과를 함께 집계하도록하는 방법을 모두 알아야한다는 것을 의미합니다 (모두 내가 전문가가 아닌 기능적 언어 내에서).

아마도 이러한 문제 중 하나를 비즈니스 솔루션으로 해결하기위한 시스템을 설계 할 수 있습니다. 여러 “고객”이 한 번에 문제에 액세스 할 수 있도록하는 방법, 클라이언트 및 서비스 계층 상호 작용 설계를 진행할 수 있습니다. 등

창의력과 즐거움이 중요합니다.