Uploaded avatar of iHiD

이제 더 깊이 파볼 시간이에요!

@iHiD
거의 4년 전
동영상

Exercism에서 연습 문제를 푸는 건 첫걸음일 뿐이에요. 진짜 배움은 그다음에 시작돼요!

이번 주에 연습 문제에 새로운 "Dig Deeper" 탭을 출시했어요. 이 탭은 멘토에게 물어보지 않고도 풀이 단계를 넘어 연습 문제의 미묘한 차이와 장단점을 살펴볼 수 있도록 만들었어요.

소개

연습 문제의 풀이는 놀랄 만큼 다양해요. 대부분의 트랙에서 가장 기본이 되는 "제대로 된" 연습 문제는 TwoFer예요. 전형적인 풀이는 이렇게 생겼어요 (루비 기준이지만 대부분의 언어에서 비슷해요):

module TwoFer
  def self.two_fer(name='you')
    "One for #{name}, one for me."
  end
end

그런데 테스트를 통과한 최근 풀이 500개 중 350개가 넘는 풀이가 서로 달랐어요 😲 공백이나 변수 이름 같은 걸 모두 같게 맞춰 봐도 절반이 넘는 풀이는 여전히 서로 달라요.

그래서 사람들이 각자 어떻게 문제를 푸는지 살펴보는 건 정말 흥미로워요. 하지만 그건 현실적으로 불가능하기도 해요. Exercism에는 수백만 개의 풀이가 있고, 그걸 다 읽으려면 말 그대로 평생이 걸릴 테니까요.

그런데! 연습 문제를 직접 설계하고 수십만 명을 멘토링해 온 저희 팀은 사람들이 어떤 다양한 접근법을 쓰는지 꽤 잘 알고 있어요. 그래서 연습 문제를 푸는 여러 관용적인(혹은 관용적이진 않지만 흥미로운) 방식을 보여 주려고 새로운 Dig Deeper 탭을 추가했어요.

예시

이게 실제로 어떻게 동작하는지 예를 하나 들어 볼까요. C#에서는 문자열을 뒤집는 방법이 여러 가지예요.

Array.Reverse() 메서드를 쓸 수 있어요:

var chars = input.ToCharArray();
Array.Reverse(chars);
return new string(chars);

아니면 더 짧은 LINQ 기반 접근법을 쓸 수도 있어요:

return new string(input.Reverse().ToArray());

StringBuilder를 쓸 수도 있고요:

var chars = new StringBuilder();
for (var i = input.Length - 1; i >= 0; i--)
{
    chars.Append(input[i]);
}
return chars.ToString();

아니면 조금 덜 관용적이지만 (성능은 더 좋은!) Span<T>를 쓸 수도 있어요:

Span<char> chars = stackalloc[input.Length];
for (var i = 0; i < input.Length; i++)
{
    chars[input.Length - 1 - i] = input[i];
}
return new string(chars);

이런 각각의 방식을 접근법이라고 부르고, 각 접근법에는 이를 설명하는 별도의 글이 있어요. 이 연습 문제의 Dig Deeper 페이지는 그 글들을 한데 모아 주고, 성능과 관련해 장단점을 다루는 글도 함께 제공해요.

👉🏾 한번 확인해 봐요 (아직 연습 문제를 풀지 않았다면 시크릿 모드로 접속해야 해요)

더 있어요!

이런 다양한 접근법을 다룬 문서뿐만 아니라, 커뮤니티가 만든 수천 개의 영상도 있어요. 연습 문제를 살펴보거나, 풀이 과정을 녹화하거나, 코딩 세션을 스트리밍하면서 관용적인 풀이를 만드는 요소를 깊이 파고드는 영상들이죠. 저희는 그런 영상을 모두 모아서 페이지에 올리고 있어요.

함께 참여해요

앞으로 몇 주 안에 사이트 곳곳의 연습 문제에 Dig Deeper 탭이 하나둘 나타나기 시작할 거예요.

접근법이나 연습 문제 글을 기고하고 싶거나, 여러분의 영상을 알려 주셔서 저희가 추가할 수 있게 하고 싶다면 jonathan@exercism.org로 연락해 주세요. 시작할 수 있도록 도와드릴 거예요.

그리고 마지막으로, 여러분의 생각을 알려 주시고 아이디어와 의견을 포럼 글에 남겨 주세요!

2022년 10월 30일 · 유용했나요?