[프로그래머의 뇌] 코딩 중 겪는 혼란에 대한 이해

Uno·2022년 11월 13일
1

Book

목록 보기
3/9

코딩을 하다보면, 이런 순간 있지 않으신가요?
저만 있던 걸 수도..

  • 아 진짜 어떤식으로 코드 작성을 시작해야할지도 모르겠다.
  • 모르는게 무엇인지도 모르겠다. (그래서 질문안함)
  • 다른 사람들은 천잰가? 이걸 어떻게 다하지?
  • 배울 것들이 왜이렇게 많아. 그만할까? 적당히 먹고살자.

이러한 고민이 있으셨다면, 이 책 내용의 도입부에서 "해결" 은 안해줍니다. 단지 어떤 상황인지 알려줍니다. 하지만 상황을 아는 것 만으로도 심리적으로는 나아지더라구요. 앞으로 이어서 작성하는 부분에서 문제해결방법을 보기로 하고 이번 내용은, "왜 내가 코딩하면서 혼란스러울까?" 에 대한 내용을 작성해보겠습니다.

인지과정을 통해 본 3 가지 혼란

코딩하면서 겪는 혼란은 3 가지가 있습니다.
1. 언어(or 알고리즘, 업무영역에 대한 지식) 에 대한 지식이 없어서 혼란스럽다.
2. 필요한 정보가 없어서 혼란스럽다.
3. 두뇌의 처리 용량이 부족하여 혼란스럽다.

책에서는 이렇게 3 가지를 말합니다.

언어에 대한 지식이 없어서 혼란스럽다.

이 말은, 말그대로, 프로그래밍 언어 문법에 대해서 잘 몰라서 이해를 못하거나, 자기가 맡은 프로그래밍 영역(ex. 앱개발) 에 대한 기본 개념이 없어서 이해를 못한다는 뜻 입니다. iOS 와 Android 로 앱을 만들고 있는데, Swift / Kotlin / Flutter / Javascript 등 언어 자체를 사용하지 못하면, 코드를 보고 당황하겠죠. 그리고 각 플랫폼마다 플랫폼이 가지는 특징 자체가 있을 겁니다. 앱의 경우, OS와 커뮤니케이션하는 영역이 있고, 혹은 UIKit 에서 주로 사용되는 생명주기 함수의 구성이라든가 이런 개념적인 것을 모르면, 그 코드가 당황스러울 겁니다.

class ViewController: UIViewController {

	override func viewDidLoad() {
		super.viewDidLoad()
	}
}

이렇게 생긴 클래스를 하나 봤는데, UIViewController 가 왜 필요한지 애초에 지식이 없으면, 이 클래스를 보고 당황할 겁니다.
나는 다른 개발에서는 이런식으로 컨트롤러를 안만들었는데 다르게 만들면안되나?? 와 같은 질문이 생길 수 있는거죠

필요한 정보가 없어서 혼란스럽다.

이어서 viewDidLoad 가 "View 가 메모리에 로드된 이후에 호출되는 생명주기함수" 라는 지식자체가 없어도 문제가 되죠. 이건 두 번째에 해당합니다. "Framework 혹은 Library 에 대한 이해" 가 없으면, 내장함수를 썼을 때, 어떤식으로 돌아갈지 예측이 안됩니다. 이게 혼란이죠

두뇌의 처리 용량이 부족하여 혼란스럽다.

이 이야기는 말 그대로, 한 번에 봐야하는 코드량이 너무 많은 경우입니다. 코드 리뷰를 하는데, 리뷰해야하는 코드량이 1000 줄씩 된다고 생각해보시면 됩니다. 이거 다 보는데, 옆에 메모도하고, UML 도 그리고 하게 되겠죠.

위 3 가지 문제를 인지과정으로 정리하면 다음과 같습니다.

  1. 언어(or 알고리즘, 업무영역에 대한 지식) 에 대한 지식이 없어서 혼란스럽다.
    • 나의 "장기 기억 공간(Long-Term Memory, LTM" 에 원하는 내용이 없다
  2. 필요한 정보가 없어서 혼란스럽다.
    • 나의 "단기 기억 공간(Short-Term Memory, STM)" 에 원하는 내용이 없다.
  3. 두뇌의 처리 용량이 부족하여 혼란스럽다.
    • 나의 "작업 기억 공간(Working Memory)" 에 원하는 내용이 없다.

코딩을 읽을 때 원리

순서는 다음과 같습니다.

  1. 정보가 눈을 통해서 들어옵니다.
  2. 해당 정보 중 받아들일 수 있는 정보만 눈에 들어옵니다.(필터)
  3. 그 정보 중에서 "이거 기억할 필요성이 있겠는걸?" 이라고 판단한 정보가 STM 에 저장됩니다.
  4. 그것을 작업 기억 공간에 저장합니다.
  5. 눈에서 작업 기억 공간까지 정보가 지나가는 과정에서 거의 동시에, LTM 에서 의미있는 정보 혹은 이전에 기억한 정보인지 확인하면서, 만약에 그러한 정보라면, 해당 해석을 작업 기억 공간 으로 이동하고 정보를 해석합니다.
  6. 작업 기억 공간에 모인 정보를 바탕으로 의사결정 합니다.(ex. 이건 인덱스 접근 에러야, 오프바이원 에러야 메모리 주소에 대한 잘못된 참조 버그야.)

그림으로 보면 다음과 같습니다.

정보에서 3 개의 줄이 있고 필터를 통해서 2개의 줄 STM에 들어온 정보가 가공되면서, 점선으로 바뀌어서 작업 기억 공간에 저장되고 의사결정을 합니다.

AF.request("https://서브도메인.메인도메인.상위도메인/Path...&Parameters...",
		   method: .get,
			parameters: ["title": "제목"]
			)  
			.validate(statusCode: 200..<300)  
			.responseDecodable { (response) in  
				switch response.result {  
					case .success(let responseData):  
						delegate?.updateUI(responseData)
					case .failure(let error):  
						// 에러 핸들링
			}  
}

Swift 를 사용해보셨고, 그 중에서 Alamofire 라는 HTTP 통신 라이브러리에 대한 경험이 있다면, 위 코드를 보고, 이 코드는 "네트워킹" 로직임을 알 수 있습니다.

만약, 다른 언어만 배우신 분이라면, Swift 문법이 1 차적으로 어색할 거지만, 해당 언어의 개념을 기반으로 어느정도 유추할 수 있겠죠. 보니까, 여기다가 URL 넣어서 HTTP Method 를 이런식으로 추가하는 구나. 그리고 결과 값을 받는 부분이 콜백함수인가 보구나. 값을 받게되면, 아래 케이스로 나눠서 분기처리하고있군!

만약 네트워킹에 대한 지식이 없다면, 아예 이해하기도 어려울 겁니다. 배경지식의 정도에 따라서 작업 기억 공간에 저장되는 정보량이 달라질겁니다.

Swift + Network 개념 + Alamofire 이 세가지를 모두 아시는 분(LTM 에 저장된 분) 들은, 아주 짧은 시간에 코드를 읽을 것이고, 의사결정을 빨리 할 수 있습니다.

만약 Swift와 Alamofire 를 모르시는 분은 그 부분만 혼란을 느끼지만, "코드의 목적" 은 알기 때문에 네트워크할 때는 이 코드를 써야한다고 판단하시겠죠.

마지막으로, 모두 모른다면, STM 에 저장해야할 정보가 너무 많을 겁니다. AF 는 뭐지? http와 https 는 무슨차이일까? get? 뭘 get 한다는거야. validate?? 아니 숫자는 왜 저렇게 쓰는거지? switch 한다음에 뭘 나누네 ? 왜나누지??

나에게 적용해보기

책 "프로그래머의 뇌" 첫 장을 읽으면서 "나를 디버깅 하는 방법" 에 대해서 배운다고 느껴졌습니다. 내가 무언가를 "모른다" 라고 이야기 하는 것에 대한 디버깅이랄까요? 위 이야기가 제 주관적인 경험에서는 충분히 이해됩니다. 프로그래밍을 처음 공부할 때는, 모든 지식을 모르기 때문에, 무언가 의사결정을 할 수 없습니다. 그러다가 문법에 대한 지식이 쌓이면서, 이런 생각을 했던 것 같습니다. "내가 문법을 안다고 코딩을 할 수 있는 건 아니구나"

이 생각을 하고, 공부했던 부분이 MVC 아키텍쳐 패턴입니다. 코드를 그냥 막 돌아가게 작성하는 것이 아니라, 역할을 나누고, 그 역할에 따라서 분류를 해줘야한다고 배웠죠. 그렇게 역할을 나눠서 코딩을 한참 하다가, 네트워킹을 만나게 되었습니다. Swift 기준으로 URLSession 을 사용했는데, 개발환경상 Alamofire 를 사용해야했습니다. 그 때, Alamofire 라이브러리에 구성된 코드 동작을 몰랐죠. 지금 돌이켜보면, 제 뇌의 LTM 에 Alamofire 에 대한 정보가 없어서 혼란스러웠습니다. 그래서 Alamofire 지식을 LTM 에 전달하는 과정(공부)를 겪었습니다.

정보가 있는 후에는 당연하게 Alamofire를 활용하고, 요구조건에 맞게 커스텀할 수 있게 되었죠. 그러다가 Flutter 에서 네트워킹을 구현하게 되었습니다. 거기서는 alamofire 가 없지만, 그 때 함께 저장되었던 네트워킹에 대한 지식을 기반으로 Library 에 대한 지식만 새롭게 LTM 에 넣어주면 되었습니다. 자연스럽게 시간이 짤바 집니다.

그리고 나서 이런 말을 하게되었습니다.

당장 구현하는게 중요한게 아니라, 그것이 돌아가는 원리(개념) 을 알게 되면 나머지는 코드는 찾아서 개념에 맞추기만 하면 된다.

제가 지난 일을 이 책에서 말하는 내용으로 적용해봤습니다.

이건 단순히 코딩에 한정된 과정은 아닌 것 같습니다. 제가 농구를 좋아해서, 농구 드리블 기술 중에서 "크로스 오버" 라는 기술이 있는데, 그것이랑 똑같은 목적을 달성하는 축구 기술이 "플립플랩" 이라는 기술이 있습니다. (당연히 완벽히 같을 순 없겠죠. 반박시, 그 말이 맞음)

처음 그 축구기술을 배웠다면, 어떤 부분이 포인트가 될지 모릅니다. 하지만 농구 기술을 배우고 배울 때는, 알게됩니다. "상대에게 나의 경로를 속여서 반박자 이상 빠르게 내가 먼저 앞으로 나가는 것" 이 기술의 포인트라고 생각하고 그 기술을 습득합니다. LTM 에 드리블은 상대보다 빨리 나가기 위함이라는 정보가 있고, STM 에 들어온 축구 기술을 해석해서 작업 기억 공간에 넣는 과정이라고 봅니다.

정리

내가 무언가 "모른다." 라고 생각할 때, 아래 3 가지 중 무엇인지 명확하게 정의하자.

  1. 문법 / 동작 원리 / 목적 을 몰라서 혼란스러운 경우
  2. 아직 확인하지 않아서 모르는 정보 라서 혼란스러운 경우 (은닉화 되어 있어서, 내부 로직을 못 본 경우, 내장함수와 같은 경우)
  3. 뇌에 과부하가 걸려서, 혼란스러운 경우

그리고 이 3 가지 혼란에 대한 해결책은 앞으로 챕터에서 다루게 될 겁니다. 계속 이어서 작성해둘 예정입니다.

감사합니다.

profile
iOS & Flutter

0개의 댓글