개발자의 사고력
개발자의 사고력을 크게 4가지로 분류했다.
- 1.논리적 사고와 분석적 사고 : 로직 알고리즘, 문제 정의, 비판
- 2.추상화 능력 : 추상화 모델링, 인터페이스
- 3.문제 해결 능력 : 현재의 정의된 문제에 대해서 기존의 최적의 해결방안을 잘 끌어오는 것
- 4.시스템적 사고 : 복잡한 비즈니스 컴포넌트의 큰 그림을 이해하고 상호작용을 이해하는 능력
1. 연역적 추론과 검증 (논리적 사고와 분석적 사고)
📌 개념 잡기 A -> B 라는 큰 전제가 있다.
- 첫번째 능력은 하위 요인을 분석하는 능력이다.
 - A ->( a -> b -> c -> d )-> B 처럼, A와 B사이의 숨은 인과관계를 찾는것.
 
- 두번째는 하위 요인의 인과관계의 참을 검증하거나 거짓을 검증하는 능력
 - 하위 요인이 거짓이면 다시 인과 관계를 만들어야 한다.
 
📌 예) 예를들어 내 서비스의 슬로우 쿼리 이슈가 발생해서 관련된 쿼리 최적화를 진행했는데, 얼마 지나지 않아 또 문제가 발생하는 것이다.
- A -> B : 내 서비스에 슬로우 쿼리로 -> 장애 발생 , 여기서 A를 고쳤다.
- C -> B : 내 서비스의 슬로우 쿼리를 고친 후에도 여전히 슬로우 쿼리로 -> 장애 발생 - C를 뜯어보니 (내 서비스의 이름을 차용해서 배치 서비스 누군가 만듦 -> 배치서비스의 슬로우 쿼리 ) -> 장애 발생 으로 구체화 가능 했다.
- *검증도 아래 처럼 진행하여 인과성을 증명   - 1.내 서비스 이름을 가져감
- 2.그 서비스의 코드와 슬로우 쿼리의 코드가 동일함.
 
 
📌 추가 설명
- 논리적·분석적 사고는 개발의 가장 기초가 되는 능력입니다. 이는 문제를 작은 단위로 명확하게 분해하고, 각 요소의 인과 관계를 파악하여 합리적인 결론을 도출하는 과정입니다.
- 로직과 알고리즘: 개발자는 '만약 A라면 B를 실행하고, 그렇지 않으면 C를 실행하라'와 같은 조건문과 반복문을 통해 컴퓨터가 이해할 수 있는 논리적인 절차, 즉 알고리즘을 설계합니다. 이 과정에서 논리적 오류가 발생하면 프로그램은 예상치 못하게 동작하거나 멈추게 됩니다.
 
- 문제 정의와 비판적 사고: 주어진 요구사항이 불명확할 때, 개발자는 분석적 사고를 통해 숨겨진 제약 조건이나 예외 상황을 파악하고 문제를 명확하게 재정의합니다. 또한, 자신의 코드나 다른 사람의 코드에 대해 '더 효율적인 방법은 없을까?', '이 로직에 문제는 없는가?'와 같이 비판적으로 검토하며 품질을 향상시킵니다.
 
- 결국 이 능력은 버그의 원인을 체계적으로 추적하고, 복잡한 요구사항을 명료하게 정리하여 개발의 첫 단추를 꿰는 데 결정적인 역할을 합니다.
📌 연습 방법
- 인과 그래프 그려보기
2. 추상화 능력
📌 개념
 
   
- 모든 코드가 중요하지 않다. 가장 잘 표현하고 싶은 개념을 의도적으로 비중있게 표현하기
📌 연습 방법
- 개념 그래프 만들기 - (개념과 격벽) - Link
- 데이터 베이스 개념적 모델링 설계
- API, 컴포넌트, 클래스 인터페이스 설계
📌 추가 설명
- 추상화는 복잡한 현실 세계의 문제를 컴퓨터가 이해할 수 있는 단순한 모델로 만드는 핵심적인 기술입니다.
- 이는 불필요한 세부 사항은 숨기고, 문제의 본질적인 부분에만 집중하여 코드의 재사용성과 유지보수성을 높입니다.
- 추상화 모델링: 예를 들어, '사용자'라는 개념을 다룰 때, 우리는 그들의 나이, 이름, 주소 등 수많은 정보 중 현재 시스템에 필요한 '아이디'와 '비밀번호'만을 추출하여 'User'라는 객체로 모델링할 수 있습니다. 이것이 바로 추상화입니다.
 
- 인터페이스: 추상화는 기능의 '무엇'과 '어떻게'를 분리합니다. 예를 들어, 우리는 자동차의 액셀을 밟으면 차가 나아간다는 사실(인터페이스)만 알면 운전할 수 있지, 내부 엔진이 어떻게 동작하는지(구현) 알 필요는 없습니다. 이처럼 잘 설계된 인터페이스는 다른 개발자가 내부 코드를 몰라도 해당 기능을 쉽게 가져다 쓸 수 있게 하여 협업을 원활하게 만듭니다.
 
- 추상화 능력이 뛰어난 개발자는 복잡한 시스템을 이해하기 쉬운 여러 개의 부품으로 나누고, 이 부품들이 서로 잘 맞물려 돌아가도록 설계할 수 있습니다.
3. 문제 해결 능력
개념
- 추론능력이 좋은 사람이여도 기술적 컨셉, 기본기가 없으면 적절한 도구를 떠올리지 못한다.
- Trade Off를 고려해서 적저란 도구를 고르는게 필요함.
📌 연습 방법
- Trade Off, 장단점 분석 및 스코어링
📌 추가 설명
- 문제 해결 능력은 눈앞에 닥친 명확한 문제에 대해 가장 효율적이고 안정적인 해결책을 찾아 적용하는 능력입니다.
- 🚀 이는 단순히 새로운 것을 만들어내는 창의력과는 조금 다릅니다. 이미 검증된 지식과 경험을 바탕으로 최적의 솔루션을 선택하는 실용적인 지혜에 가깝습니다.
예를 들어, '느린 데이터 조회 속도'라는 문제가 발생했을 때, 문제 해결 능력이 뛰어난 개발자는 무작정 코드를 수정하기보다 다음과 같은 과정을 거칩니다.
- 원인 분석: 데이터베이스 쿼리의 문제인지, 네트워크 지연인지, 혹은 애플리케이션 로직의 비효율성 때문인지 원인을 먼저 진단합니다.
- 해결 방안 탐색: 인덱싱, 쿼리 튜닝, 캐싱 도입, 데이터 구조 변경 등 기존에 알려진 다양한 해결책들을 떠올립니다.
- 최적의 선택: 현재 시스템의 상황과 자원, 그리고 예상되는 부작용을 고려하여 가장 적합한 해결책(예: '캐싱 도입')을 선택하고 적용합니다.
이 능력은 방대한 개발 지식과 경험이 쌓일수록 더욱 빛을 발하며, 빠르고 정확하게 문제를 해결하여 서비스의 안정성을 높이는 데 기여합니다.
4. 시스템적 사고
개념
- 비즈니스 - 개발 - 운영 등 전체 시스템의 큰 그림을 이해.  - FR(Functional Requirements) : 비즈니스 요구사항
- NFR(Non-FR) : 성능(가용성, 처리량), 시스템 제약(라이브러리 버전, AWS 등), 리소스 제약, 보안, 법률
 
📌 연습 방법
- 아키텍처 설계 및 패턴
- 시스템의 트레이드 오프 분석
📌 추가 설명 시스템적 사고는 개별적인 코드나 기능을 넘어, 전체 시스템의 상호작용과 큰 그림을 이해하는 능력입니다.
- 숲을 보지 못하고 나무만 보는 개발에서 벗어나, 내가 작성한 코드가 시스템 전체에 어떤 영향을 미칠지 예측하고 설계하는 것입니다.
- 상호작용 이해: 예를 들어, 새로운 기능을 추가할 때 단순히 그 기능의 동작 여부만 보는 것이 아니라, 이로 인해 기존 데이터베이스에 부하가 얼마나 증가할지, 다른 서비스의 응답 시간에 영향을 주지는 않을지 등을 종합적으로 고려합니다.
 
- 성능, 확장성, 안정성 고려: 시스템적 사고를 하는 개발자는 "지금 당장은 문제없지만, 사용자가 100배 늘어나도 괜찮을까?"(확장성), "이 기능에 문제가 생기면 전체 서비스가 마비되는 것은 아닐까?"(안정성)와 같은 질문을 스스로에게 던집니다.
 
- 이 능력은 특히 시스템의 규모가 커지고 복잡해질수록 중요해집니다. 장기적인 관점에서 유지보수하기 쉽고, 변화에 유연하게 대처할 수 있는 견고한 시스템을 만드는 개발자의 핵심 역량이라고 할 수 있습니다.