출처 https://grantslatton.com/software-pathfinding#algorithms-we-develop-software-by
저는 최근에 저명한 기술 CEO 겸 엔지니어와 대화를 나누었습니다. 그는 가끔 사용했던 소프트웨어 개발 방법론을 설명해 주었는데, 이를 듣고 다른 발견적 기법과 일반화에 대해 다시 생각하게 되었습니다.
하루가 시작되면 기능 개발을 시작합니다. 만약 하루가 끝날 때까지 완료하지 못한다면, 모든 것을 삭제하고 다음 날 다시 시작합니다. 작성했던 유닛 테스트는 유지할 수 있습니다.
며칠이 지나도 기능을 구현할 수 없다면, 그 기능을 구현하기 위해 필요한 기반, 인프라, 리팩토링이 무엇인지 생각해 보십시오. 이 방법을 사용하여 그것을 구현한 후, 기능으로 돌아갑니다.
그는 이 방법을 자신이 발명한 것은 아니지만, 90년대 말과 2000년대 초의 극단적 프로그래밍 운동과 인접한 것이라고 말했습니다.
제가 주니어 엔지니어들에게 주는 조언 중 하나는 모든 것을 두 번 작성하라는 것입니다. 문제를 해결한 후, 코드를 별도의 브랜치에 저장하고 다시 모든 코드를 작성합니다.
저는 며칠 간의 작업이 들어 있던 노트북이 고장난 후 우연히 이 방법을 발견했습니다. 솔루션을 다시 작성하는 데 초기 구현의 25%의 시간만이 필요했고, 결과는 훨씬 더 나아졌습니다.
이렇게 하면 1.25배의 시간이 소요되지만, 코드 품질은 약 2배 향상됩니다. 장기적으로 유지 관리해야 할 프로젝트라면 일반적으로 좋은 선택입니다.
N.B. 물론 모든 것을 문자 그대로 두 번 작성하라는 것은 아닙니다. 이것은 하나의 발견적 기법이므로 지혜롭게 적용하십시오.
매일 다시 시작하는 방법은 이보다 더 극단적인 버전입니다. 매번 재작성할 때마다 더 매끄러운 솔루션 경로가 만들어지며, 최종 솔루션은 정말로 깔끔할 수 있습니다.
거의 확실히 아포크리팔인 스탈린의 이 인용은 훌륭한 소프트웨어 엔지니어가 되기 위해 적용될 수 있습니다. 주니어 엔지니어에게 있어서는 첫 10만 줄의 코드를 작성하는 것이 매우 중요합니다. 매일 다시 시작하는 방법은 이 10만 줄에 빨리 도달하도록 도와줍니다.
동일한 작업을 여러 번 반복하는 것이 다양한 코드 10만 줄을 작성하는 것만큼 가치가 없다고 생각할 수 있습니다. 하지만 동일한 문제를 반복해서 해결하는 것은 패턴을 유지하는 데 매우 유익합니다.
완벽한 5천 줄만 있으면 주요 패턴을 한 번씩 볼 수 있습니다. 나머지 9만 5천 줄은 뉴런을 재배치하는 반복 작업입니다.
제가 사용한 또 다른 발견적 기법은 누군가에게 문제의 해결책을 생각해보도록 하는 것입니다. 만약 그들이 구현하는 데 4주가 걸릴 것이라고 말하면, "당신은 하루 만에 끝내야 합니다. 어떻게 하시겠습니까?"라고 묻습니다.
이 기법의 목적은 그들의 프레임과 기준점을 깨는 것입니다. 한 달이 걸릴 것이라고 말했으니 하루 안에 끝내려면 전혀 다른 솔루션이 필요하겠죠.
이 기법이 얼마나 자주 효과가 있는지는 놀랍습니다. 한 달이 걸릴 계획을 제시한 지 몇 분 만에, 하루 안에 해결할 수 있는 방법을 찾아내는 경우가 많습니다.
실제 일일 계획이 하루 만에 끝나는 경우는 없습니다. 총구가 실제로 머리에 있는 것은 아니며, 집에 가서 잘 수 있습니다. 그러나 새로운 해결책은 종종 며칠 안에 실제로 완료될 수 있습니다. 10분간의 사고 실험이 10배의 시간을 절약해 줍니다.
이 사고 실험의 목적은 진짜 해결책을 생성하는 것이 아닙니다. 해결책의 하한선을 설정하는 것입니다. 그런 다음 하한선을 염두에 두고 진짜 해결책을 생각해 보면, 종종 원래의 해결책보다 더 나은 경우가 많습니다.
글의 마지막 부분에서 언급된 경로 탐색은 다양한 문제 해결 접근 방식을 시도하면서 최적의 솔루션을 찾는 과정을 말합니다. 각 경로는 하나의 솔루션이며, 엔지니어는 최선의 솔루션을 찾아야 합니다. 이를 위해 여러 가지 시도를 통해 경험을 쌓고, 매번 더 나은 해결책을 찾는 노력을 하게 됩니다. 이런 탐색 과정은 마치 복잡한 미로에서 출구를 찾는 것처럼 끊임없이 새로운 경로를 시도하고, 최적화된 경로를 발견하기 위해 이전 경험을 활용하는 것과 비슷합니다.
이러한 발견적 기법과 다양한 경로 탐색 알고리즘 간에는 유사점이 많이 있습니다. 예를 들어 반복적 깊이 탐색, 경계 완화 A*, 빔 탐색, 시뮬레이션 담금질 등이 있습니다. 각 탐색 알고리즘은 특정 상황에서 최적의 경로를 찾기 위해 사용되며, 특정 알고리즘이 가진 장단점에 따라 결과가 달라질 수 있습니다.
비슷하게, 엔지니어링에서도 다양한 발견적 기법이 각자의 상황에 맞는 유용성을 가집니다. 더 나은 엔지니어가 되는 것은 문제 공간에서 최적의 해결책을 탐색하면서 효율적인 경로를 찾아가는 경험을 쌓는 과정입니다. 이와 같은 경험의 축적이 결국 복잡한 문제에서도 신속하고 정확한 해결책을 찾아내는 능력을 길러 주는 것입니다.
이러한 발견적 기법을 통해 우리는 소프트웨어 개발에 대한 다양한 접근 방식을 탐구할 수 있습니다. 최선의 솔루션을 찾기 위한 방법은 다양하며, 어느 정도의 창의성과 인내가 요구됩니다.
결국 좋은 엔지니어가 되는 것은 문제 공간에서 최적의 해결책으로 향하는 다양한 경로를 탐색하고 시도하는 경험을 쌓는 것임을 강조하는 대목이죠.
이 공간에서 설득력 있는 일반 이론을 만들어 볼 수도 있을 것 같습니다. 하지만 그것은 이 글의 범위를 벗어납니다. 머릿속의 백그라운드 스레드를 돌리며 생각해 보세요. 좋은 해결책으로 가는 경로를 찾을 수도 있습니다.