코드 간의 의존성을 고민하자.

합의된 규칙으로 일관성있게 작성하자.

적절하게 확장 가능하도록 설계하자.

// 확장이 어려운 코드

const Input = styled.input`
  // styling
`;
const Input = ({
  type,
  value,
  onChange,
}) => {
  return (
    <Input type={type} value={value} onChange={onChange}> 
  )
}

// props 가 고정 되어있다
// 확장하기 쉬운 코드

const Input = styled.input<{ isValid?: boolean }>`
  // styling
  // error styling
`;

interface Props extends HTMLAttributes<HTMLInputElement> {
	// 타입도 input 기본 속성을 확장 시켜서 확장 가능성을 높임
  isValid?: boolean;
}

const Input = ({ isValid, ...props }: Props) => {
  return (
    <Input {...props} isValid={isValid}>
  )
}

어쩔 수 없는 코드는 주석과 함께 격리하자.

당연하게 읽히는 코드가 좋은 코드

단계적 추상화를 마스터한 경험자와 초보의 가장 큰 차이는 논리의 흐름을 What 과 How로 설명하는 차이

안좋은 프로그래머는 코드에 대해 걱정한다. 좋은 프로그래머는 데이터 구조와 관계에 대해 걱정한다” – 리누스 토발즈

코드 수정률에 따라서도 분리하자

좋은 소프트웨어는 유연한 소프트웨어