2024
July
Goodbye Clean Code

πŸ”— Goodbye, Clean Code (opens in a new tab)

πŸ—“οΈ λ²ˆμ—­ λ‚ μ§œ: 2024.07.08

🧚 λ²ˆμ—­ν•œ 크루: μ†Œν•˜(μ΅œμ†Œμ—°)


μž˜κ°€, Clean Code

λŠ¦μ€ μ €λ…μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

λ™λ£Œκ°€ 일주일 λ‚΄λ‚΄ μž‘μ„±ν•˜λ˜ μ½”λ“œλ₯Ό 막 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” κ·Έλž˜ν”½ νŽΈμ§‘κΈ° μΊ”λ²„μŠ€λ₯Ό μž‘μ—…ν•˜κ³  μžˆμ—ˆκ³ , λ™λ£ŒλŠ” μ‚¬κ°ν˜•κ³Ό 타원 같은 λ„ν˜•μ˜ 크기λ₯Ό κ°€μž₯자리의 μž‘μ€ 핸듀을 λ“œλž˜κ·Έν•˜μ—¬ μ‘°μ •ν•  수 μžˆλŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œλŠ” μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ λ°˜λ³΅μ μ΄μ—ˆμŠ΅λ‹ˆλ‹€. 각 λ„ν˜•(예: μ‚¬κ°ν˜• λ˜λŠ” 타원)μ—λŠ” λ‹€λ₯Έ ν•Έλ“€ μ„ΈνŠΈκ°€ μžˆμ—ˆκ³ , 각 핸듀을 λ‹€λ₯Έ λ°©ν–₯으둜 λ“œλž˜κ·Έν•˜λ©΄ λ„ν˜•μ˜ μœ„μΉ˜μ™€ 크기가 λ‹€λ₯΄κ²Œ 영ν–₯을 λ°›μ•˜μŠ΅λ‹ˆλ‹€. μ‚¬μš©μžκ°€ Shift ν‚€λ₯Ό λˆ„λ₯΄κ³  있으면 λΉ„μœ¨μ„ μœ μ§€ν•˜λ©΄μ„œ 크기λ₯Ό μ‘°μ •ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. λ§Žμ€ μˆ˜ν•™μ΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œλŠ” λ‹€μŒκ³Ό 같이 μƒκ²ΌμŠ΅λ‹ˆλ‹€:

let Rectangle = {
	resizeTopLeft(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
	resizeTopRight(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
	resizeBottomLeft(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
	resizeBottomRight(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
};
 
let Oval = {
	resizeLeft(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
	resizeRight(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
	resizeTop(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
	resizeBottom(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
};
 
let Header = {
	resizeLeft(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
	resizeRight(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
};
 
let TextBlock = {
	resizeTopLeft(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
	resizeTopRight(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
	resizeBottomLeft(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
	resizeBottomRight(position, size, preserveAspect, dx, dy) {
		// 10 repetitive lines of math
	},
};

λ°˜λ³΅λ˜λŠ” μˆ˜ν•™μ΄ 정말 μ‹ κ²½ μ“°μ˜€μŠ΅λ‹ˆλ‹€.

κΉ¨λ—ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

λŒ€λΆ€λΆ„μ˜ λ°˜λ³΅μ€ μœ μ‚¬ν•œ λ°©ν–₯ μ‚¬μ΄μ—μ„œ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Oval.resizeLeft()λŠ” Header.resizeLeft()와 μœ μ‚¬ν•œ 점이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λ‘˜ λ‹€ μ™Όμͺ½ κ°€μž₯자리의 핸듀을 λ“œλž˜κ·Έν•˜λŠ” 것을 닀루기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

또 λ‹€λ₯Έ μœ μ‚¬μ μ€ 같은 λ„ν˜•μ— λŒ€ν•œ λ©”μ„œλ“œ 사이에 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Oval.resizeLeft()λŠ” λ‹€λ₯Έ Oval λ©”μ„œλ“œμ™€ μœ μ‚¬ν•œ 점이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λͺ¨λ‘ 타원을 닀루기 λ•Œλ¬Έμž…λ‹ˆλ‹€. ν…μŠ€νŠΈ 블둝이 μ‚¬κ°ν˜•μ΄μ—ˆκΈ° λ•Œλ¬Έμ— Rectangle, Header, TextBlock 사이에도 쀑볡이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

아이디어가 λ– μ˜¬λžμŠ΅λ‹ˆλ‹€.

λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό κ·Έλ£Ήν™”ν•˜λ©΄ λͺ¨λ“  쀑볡을 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

let Directions = {
  top(...) {
    // 5 unique lines of math
  },
  left(...) {
    // 5 unique lines of math
  },
  bottom(...) {
    // 5 unique lines of math
  },
  right(...) {
    // 5 unique lines of math
  },
};
 
let Shapes = {
  Oval(...) {
    // 5 unique lines of math
  },
  Rectangle(...) {
    // 5 unique lines of math
  },
}

그리고 λ‚˜μ„œ λ™μž‘μ„ κ΅¬μ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

let { top, bottom, left, right } = Directions;
 
function createHandle(directions) {
	// 20 lines of code
}
 
let fourCorners = [
	createHandle([top, left]),
	createHandle([top, right]),
	createHandle([bottom, left]),
	createHandle([bottom, right]),
];
let fourSides = [createHandle([top]), createHandle([left]), createHandle([right]), createHandle([bottom])];
let twoSides = [createHandle([left]), createHandle([right])];
 
function createBox(shape, handles) {
	// 20 lines of code
}
 
let Rectangle = createBox(Shapes.Rectangle, fourCorners);
let Oval = createBox(Shapes.Oval, fourSides);
let Header = createBox(Shapes.Rectangle, twoSides);
let TextBox = createBox(Shapes.Rectangle, fourCorners);

μ½”λ“œμ˜ ν¬κΈ°λŠ” 절반으둜 μ€„μ—ˆκ³ , 쀑볡은 μ™„μ „νžˆ μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€! 정말 κΉ”λ”ν•˜λ„€μš”. νŠΉμ • λ°©ν–₯μ΄λ‚˜ λ„ν˜•μ˜ λ™μž‘μ„ λ³€κ²½ν•˜λ €λ©΄ μ—¬κΈ°μ €κΈ°μ„œ λ©”μ„œλ“œλ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” λŒ€μ‹  ν•œ κ³³μ—μ„œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이미 밀이 λŠ¦μ—ˆμ—ˆμŠ΅λ‹ˆλ‹€ (μ €λŠ” ν‘Ή λΉ μ Έ μžˆμ—ˆμ£ ). λ¦¬νŒ©ν„°λ§ν•œ λ‚΄μš©μ„ master에 ν™•μΈν•˜κ³  μž μžλ¦¬μ— λ“€μ—ˆμŠ΅λ‹ˆλ‹€. λ™λ£Œμ˜ μ§€μ €λΆ„ν•œ μ½”λ“œλ₯Ό κΉ”λ”ν•˜κ²Œ μ •λ¦¬ν•œ 것이 μžλž‘μŠ€λŸ¬μ›Œ ν•˜λ©΄μ„œμš”.

λ‹€μŒλ‚  μ•„μΉ¨

... μ˜ˆμƒλŒ€λ‘œ λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

상사가 μ €λ₯Ό μΌλŒ€μΌλ‘œ 뢈러 μ œκ°€ λ³€κ²½ν•œ λ‚΄μš©μ„ 되돌리라고 μ •μ€‘ν•˜κ²Œ μš”μ²­ν–ˆμŠ΅λ‹ˆλ‹€. μ €λŠ” 좩격을 λ°›μ•˜μŠ΅λ‹ˆλ‹€. κΈ°μ‘΄ μ½”λ“œλŠ” μ—‰λ§μ΄μ—ˆκ³  μ œκ°€ μˆ˜μ •ν•œ 것은 κΉ”λ”ν–ˆλŠ”λ° 말이죠!

λ§ˆμ§€λͺ»ν•΄ λ”°λžμ§€λ§Œ, 상사가 μ˜³μ•˜λ‹€λŠ” 것을 κΉ¨λ‹«λŠ” 데 μˆ˜λ…„μ΄ κ±Έλ ΈμŠ΅λ‹ˆλ‹€.

이것은 ν•œ λ‹¨κ³„μž…λ‹ˆλ‹€.

"κΉ¨λ—ν•œ μ½”λ“œ"에 μ§‘μ°©ν•˜κ³  쀑볡을 μ œκ±°ν•˜λŠ” 것은 우리 쀑 λ§Žμ€ μ‚¬λžŒλ“€μ΄ κ²ͺλŠ” λ‹¨κ³„μž…λ‹ˆλ‹€. μ½”λ“œμ— μžμ‹ κ°μ΄ 없을 λ•Œ, μΈ‘μ • κ°€λŠ₯ν•œ 무언가에 μžμ•„ κ°€μΉ˜μ™€ 전문적인 μžλΆ€μ‹¬μ„ λΆ€μ—¬ν•˜λŠ” 것이 μœ ν˜Ήμ μž…λ‹ˆλ‹€. μ—„κ²©ν•œ lint κ·œμΉ™, λͺ…λͺ… μŠ€ν‚€λ§ˆ, 파일 ꡬ쑰, 쀑볡 μ—†μŒ 등이 κ·Έ μ˜ˆμž…λ‹ˆλ‹€.

쀑볡 μ œκ±°λŠ” μžλ™ν™”ν•  수 μ—†μ§€λ§Œ, μ—°μŠ΅μ„ 톡해 더 μ‰¬μ›Œμ§‘λ‹ˆλ‹€. 맀번 λ³€κ²½ ν›„ 쀑볡이 μ κ±°λ‚˜ λ§Žμ€μ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έ κ²°κ³Ό 쀑볡 μ œκ±°λŠ” μ½”λ“œμ— λŒ€ν•œ 객관적인 λ©”νŠΈλ¦­μ„ κ°œμ„ ν•˜λŠ” κ²ƒμ²˜λŸΌ λŠκ»΄μ§‘λ‹ˆλ‹€. 더 λ‚˜μœ 것은 μ‚¬λžŒλ“€μ˜ 정체성을 ν˜Όλž€μŠ€λŸ½κ²Œ λ§Œλ“ λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€: "λ‚˜λŠ” κΉ¨λ—ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” μ‚¬λžŒμž…λ‹ˆλ‹€". 이것은 μΌμ’…μ˜ 자기기만만큼 κ°•λ ₯ν•©λ‹ˆλ‹€.

일단 좔상화λ₯Ό λ§Œλ“œλŠ” 방법을 배우면, κ·Έ λŠ₯λ ₯에 λ„μ·¨λ˜μ–΄ λ°˜λ³΅λ˜λŠ” μ½”λ“œλ₯Ό λ³Ό λ•Œλ§ˆλ‹€ 좔상화λ₯Ό ν—ˆκ³΅μ—μ„œ λ½‘μ•„λ‚΄λŠ” 것이 μœ ν˜Ήμ μž…λ‹ˆλ‹€. λͺ‡ λ…„ λ™μ•ˆ 코딩을 ν•˜λ‹€ 보면 μ–΄λ””μ—μ„œλ‚˜ λ°˜λ³΅μ„ 보게 되고, μΆ”μƒν™”λŠ” 우리의 μƒˆλ‘œμš΄ 초λŠ₯λ ₯이 λ©λ‹ˆλ‹€. λˆ„κ΅°κ°€ 좔상화가 미덕이라고 λ§ν•˜λ©΄, μš°λ¦¬λŠ” 그것을 받아듀일 κ²ƒμž…λ‹ˆλ‹€. 그리고 "깨끗함"을 μˆ­λ°°ν•˜μ§€ μ•ŠλŠ” λ‹€λ₯Έ μ‚¬λžŒλ“€μ„ νŒλ‹¨ν•˜κΈ° μ‹œμž‘ν•  κ²ƒμž…λ‹ˆλ‹€.

이제 μ €λŠ” 제 "λ¦¬νŒ©ν„°λ§"이 두 가지 μΈ‘λ©΄μ—μ„œ μž¬μ•™μ΄μ—ˆλ‹€λŠ” 것을 κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€.

  • 첫째, μ €λŠ” 그것을 μž‘μ„±ν•œ μ‚¬λžŒκ³Ό μ΄μ•ΌκΈ°ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μ½”λ“œλ₯Ό λ‹€μ‹œ μž‘μ„±ν•˜κ³  κ·Έλ“€μ˜ μ˜κ²¬μ„ 듣지 μ•Šκ³  μ²΄ν¬μΈν–ˆμŠ΅λ‹ˆλ‹€. κ°œμ„ λœ κ²ƒμ΄μ—ˆλ‹€ ν•˜λ”λΌλ„(μ΄μ œλŠ” 더 이상 κ·Έλ ‡κ²Œ 믿지 μ•Šμ§€λ§Œ), μ΄λŠ” 그것을 μ²˜λ¦¬ν•˜λŠ” λ”μ°ν•œ λ°©λ²•μž…λ‹ˆλ‹€. κ±΄κ°•ν•œ μ—”μ§€λ‹ˆμ–΄λ§ νŒ€μ€ λŠμž„μ—†μ΄ μ‹ λ’°λ₯Ό μŒ“μ•„κ°‘λ‹ˆλ‹€. νŒ€μ›κ³Ό μƒμ˜ 없이 μ½”λ“œλ₯Ό λ‹€μ‹œ μž‘μ„±ν•˜λŠ” 것은 μ½”λ“œλ² μ΄μŠ€λ₯Ό 효과적으둜 ν•¨κ»˜ ν˜‘μ—…ν•˜λŠ” λŠ₯λ ₯에 큰 타격을 μ€λ‹ˆλ‹€.

  • λ‘˜μ§Έ, κ³΅μ§œλŠ” μ—†μŠ΅λ‹ˆλ‹€. 제 μ½”λ“œλŠ” μš”κ΅¬ 사항을 λ³€κ²½ν•  수 μžˆλŠ” λŠ₯λ ₯을 쀑볡 κ°μ†Œμ™€ κ΅ν™˜ν–ˆμ§€λ§Œ, μ΄λŠ” 쒋은 κ±°λž˜κ°€ μ•„λ‹ˆμ—ˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‚˜μ€‘μ— λ‹€μ–‘ν•œ λ„ν˜•μ˜ λ‹€μ–‘ν•œ 핸듀에 λŒ€ν•œ λ§Žμ€ 특수 μΌ€μ΄μŠ€μ™€ λ™μž‘μ΄ ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€. 제 μΆ”μƒν™”λŠ” κ·ΈλŸ¬ν•œ 변경을 μš©μ΄ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ λͺ‡ λ°° 더 λ³΅μž‘ν•΄μ Έμ•Ό ν–ˆμ„ κ²ƒμž…λ‹ˆλ‹€. λ°˜λ©΄μ— μ›λž˜μ˜ "μ§€μ €λΆ„ν•œ" λ²„μ „μ—μ„œλŠ” κ·ΈλŸ¬ν•œ 변경이 μΌ€μ΄ν¬μ²˜λŸΌ μ‰½κ²Œ μœ μ§€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ œκ°€ "λ”λŸ¬μš΄" μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€κ³  λ§ν•˜κ³  μžˆλŠ” κ±ΈκΉŒμš”? μ•„λ‹™λ‹ˆλ‹€. "깨끗함" λ˜λŠ” "λ”λŸ¬μ›€"이라고 말할 λ•Œ μ˜λ―Έν•˜λŠ” λ°”λ₯Ό 깊이 생각해 보라고 μ œμ•ˆν•©λ‹ˆλ‹€. λ°˜ν•­μ‹¬, μ •μ˜κ°, 아름닀움, μš°μ•„ν•¨μ„ λŠλΌμ‹œλ‚˜μš”? κ·ΈλŸ¬ν•œ ν’ˆμ§ˆμ— ν•΄λ‹Ήν•˜λŠ” ꡬ체적인 μ—”μ§€λ‹ˆμ–΄λ§ κ²°κ³Όλ₯Ό 이름 지을 수 μžˆλ‹€κ³  μ–Όλ§ˆλ‚˜ ν™•μ‹ ν•˜μ‹œλ‚˜μš”? 그것듀이 μ½”λ“œ μž‘μ„± 및 μˆ˜μ • 방식에 μ •ν™•νžˆ μ–΄λ–€ 영ν–₯을 λ―ΈμΉ˜λ‚˜μš”?

μ €λŠ” μ΄λŸ¬ν•œ 것듀에 λŒ€ν•΄ 깊이 μƒκ°ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μ½”λ“œκ°€ μ–΄λ–»κ²Œ μƒκ²ΌλŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” 많이 μƒκ°ν–ˆμ§€λ§Œ, λ§λž‘λ§λž‘ν•œ 인간 νŒ€κ³Ό ν•¨κ»˜ μ–΄λ–»κ²Œ λ°œμ „ν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” μƒκ°ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

코딩은 μ—¬μ •μž…λ‹ˆλ‹€. 첫 번째 μ½”λ“œ ν•œ 쀄뢀터 μ§€κΈˆκΉŒμ§€ μ–Όλ§ˆλ‚˜ 멀리 μ™”λŠ”μ§€ 생각해 λ³΄μ„Έμš”. ν•¨μˆ˜λ₯Ό μΆ”μΆœν•˜κ±°λ‚˜ 클래슀λ₯Ό λ¦¬νŒ©ν„°λ§ν•˜μ—¬ λ³΅μž‘ν•œ μ½”λ“œλ₯Ό κ°„λ‹¨ν•˜κ²Œ λ§Œλ“€ 수 μžˆλŠ” 방법을 처음 λ³΄μ•˜μ„ λ•Œ 기쁨을 λŠκΌˆμ„ κ²ƒμž…λ‹ˆλ‹€. κΈ°μˆ μ— μžλΆ€μ‹¬μ„ λŠλ‚€λ‹€λ©΄, μ½”λ“œμ˜ 깔끔함을 μΆ”κ΅¬ν•˜λŠ” 것이 유혹적일 κ²ƒμž…λ‹ˆλ‹€. ν•œλ™μ•ˆ κ·Έλ ‡κ²Œ ν•΄λ³΄μ„Έμš”.

ν•˜μ§€λ§Œ κ±°κΈ°μ„œ λ©ˆμΆ”μ§€ λ§ˆμ„Έμš”. κΉ¨λ—ν•œ μ½”λ“œ 광신도가 λ˜μ§€ λ§ˆμ„Έμš”. κΉ¨λ—ν•œ μ½”λ“œλŠ” λͺ©ν‘œκ°€ μ•„λ‹™λ‹ˆλ‹€. μš°λ¦¬κ°€ λ‹€λ£¨λŠ” μ‹œμŠ€ν…œμ˜ λ§‰λŒ€ν•œ λ³΅μž‘μ„±μ—μ„œ μ•½κ°„μ˜ 의미λ₯Ό μ°ΎμœΌλ €λŠ” μ‹œλ„μž…λ‹ˆλ‹€. 변경이 μ½”λ“œλ² μ΄μŠ€μ— μ–΄λ–€ 영ν–₯을 미칠지 아직 ν™•μ‹ ν•˜μ§€ λͺ»ν•˜μ§€λ§Œ λ―Έμ§€μ˜ λ°”λ‹€μ—μ„œ μ•ˆλ‚΄κ°€ ν•„μš”ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λ°©μ–΄ λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€.

κΉ¨λ—ν•œ μ½”λ“œκ°€ μ—¬λŸ¬λΆ„μ„ μΈλ„ν•˜κ²Œ ν•˜μ„Έμš”. 그리고 λ†“μ•„μ£Όμ„Έμš”.