좋은 엔지니어 되기

4 days ago 2

  • 많은 소프트웨어 엔지니어들이 소프트웨어에 대한 열정 없이 일함
    • 단순히 좋은 급여를 받기 위해 일하지만, 열정이 없으면 결국 성과가 저하
    • 오래된 기술과 잘못된 신념에 머물러 배우지 않으면 성장하지 못함
  • 좋은 엔지니어가 되기 위해 필요한 요소
    • 엔지니어링의 본질을 이해하고 깊이 있는 지식을 쌓아야 함
    • 새로운 기술을 지속적으로 배우고 비판적으로 접근해야 함
    • 실전에서 배운 지식을 적용하고 개선하는 습관이 필요함

# 무엇이 좋은 엔지니어를 만드는가

  • 엔지니어의 정의

    "과학적 원칙을 적용해 문제를 분석하고 설계, 코드 작성, 제작, 창조 등을 통해 문제를 해결하고 세상을 더 나은 곳으로 만드는 사람"

  • 소프트웨어 엔지니어에게 요구되는 역량
    • 컴퓨터가 어떻게 작동하는지 원리를 이해해야 함
    • 하드웨어와 소프트웨어가 상호작용하는 방식에 대한 깊은 이해 필요
    • 추상화된 언어나 기술에만 의존하지 않고 기초부터 학습해야 함

도메인에 대한 깊이 있는 이해

  • 기초 원리에 대한 강력한 이해가 필요함
    • 기계 엔지니어 → 재료의 특성과 응용 지식
    • 소프트웨어 엔지니어 → 메모리와 CPU의 작동 원리 이해
  • 기초 원리에서부터 학습해야 함
    • HTTP, 메모리 구조, 시스템 동작 등 기본 개념에 대한 깊은 이해 필수
    • 상위 레벨에서 시작하지 말고 기초부터 쌓아가야 함

지속적인 학습

  • 최신 기술 및 개발 동향을 계속 학습해야 함
  • 새로운 기술이 가진 장점과 단점을 비판적으로 분석해야 함
  • 학습 과정에서 발견한 새로운 주제에 대해 더 깊이 파고들기
    • 수학을 배울 때 세부 주제로 연결되는 것처럼 학습의 깊이를 확장해야 함

기술의 한계와 문제점 이해하기

  • 도구나 언어의 장단점을 명확히 이해해야 함
  • 특정 언어나 도구를 과도하게 신봉하는 태도를 경계해야 함
  • 프로젝트에 맞는 최적의 도구를 선택하는 것이 중요함

실전에서 지식 적용하기

  • 이론만 알고 있는 것은 의미 없음
    • 배운 지식을 실제 프로젝트에 적용해야 함
    • 문제를 해결하거나 개념을 증명하는 데 활용해야 함
  • 실전 적용의 예시
    • 소규모 프로토타입 구축
    • 일상에서 발생하는 문제 해결
    • 배운 내용을 다른 사람에게 설명하고 가르치기

# 더 나은 엔지니어가 되는 방법

비판적 사고 능력 키우기

  • 비판적 사고는 엔지니어링의 핵심 요소
    • 개념과 그 효과를 이해하고 도전하기 위해 필수적임
    • 비판적 사고가 부족하거나 이를 소홀히 하면 비효율성과 복잡성을 초래함
  • 비판적 사고 능력 강화하기
    • 새로운 개념을 접할 때 무조건 받아들이지 말고 효과성과 타당성을 검토해야 함
    • 특정 접근 방식의 장단점과 대안을 논리적으로 분석해야 함
  • 비판적 사고 학습 자료 : Critical Thinking 참고

더 많은 책 읽기

  • 독서는 지식을 습득하는 효과적인 방법
    • 소프트웨어 엔지니어링 관련 다양한 주제의 서적 존재
    • 단순히 책의 내용을 받아들이지 말고 비판적으로 접근해야 함
  • 비판적으로 읽기 위한 질문 예시
    • "이 접근 방식에 문제가 있는가?"
    • "더 나은 방법이 있는가?"
    • "내가 다르게 한다면 어떻게 할 것인가?"
    • "이 책에서 설명하는 내용이 실제로 옳은가?"
  • 노트 작성 습관 기르기
    • 배운 내용과 생각을 정리하고 기록
    • 모르는 주제가 언급되면 추가로 조사
    • 노트 작성 도구로 Obsidian 추천 (개인 선호에 따라 선택 가능)
  • 추천 읽기 목록

배운 지식을 프로젝트에 적용하기

  • 이론에서 실전으로 연결하기
    • 배운 내용을 실제 프로젝트에서 적용해야 진정한 학습이 이루어짐
    • 개념을 실제로 구현하면서 깊이 있는 이해 가능
    • 작은 프로젝트나 프로토타입이라도 직접 만들어 보는 것이 중요함
  • 실전 적용 과정에서 얻는 이점
    • 이론에서는 보이지 않던 실제 문제에 직면하게 됨
    • 문제 해결 과정에서 지식을 구체화하고 개선 가능
    • 문제 해결 능력과 논리적 사고력이 강화됨
  • 배운 내용을 적용하는 방법
  • 작은 프로토타입 구축
    • 새로운 프레임워크, 언어, 개념 학습 후 작은 프로젝트 시도
    • 예: 데이터베이스 인덱싱 학습 후 간단한 검색 시스템 구현 및 성능 비교
    • 실제 문제 해결
      • 일상이나 작업에서 발생하는 작은 문제를 해결해 보기
      • 예: 반복적인 수작업 자동화, 성능 저하 문제 개선 등
    • 배운 내용 가르치기
      • 배운 내용을 다른 사람에게 설명하면서 이해도 강화
      • 블로그 작성, 트위터 스레드 작성 또는 동료와 토론
      • 가르치는 과정에서 새로운 관점을 발견할 수 있음
  • 지속적으로 지식을 적용하면 이론적 이해가 실전 역량으로 전환되며, 더 유능한 엔지니어로 성장 가능

자기 코드 평가 및 개선

  • 자기 비판은 뛰어난 엔지니어의 핵심 습관
    • 많은 엔지니어들이 코드가 작동하면 "충분하다"고 생각하는 실수 범함
    • 그러나 진정한 엔지니어는 항상 개선의 여지가 있음을 인식함
  • 자기 평가의 목표
    • 스스로에게 과도하게 엄격해질 필요는 없음
    • 지속적인 개선의 기회를 찾는 것이 핵심
    • 코드를 작동시키는 데 만족하지 말고 성능, 유지보수성, 가독성 개선 방안 탐색
  • 지속적인 자기 평가의 효과
    • 코드 품질이 점진적으로 향상됨
    • 자기 비판을 통해 문제 해결 능력 강화
    • 자신의 지식과 역량에 대해 끊임없이 발전 가능

# 소프트웨어 엔지니어를 위한 추천 목록

추천 도서

  • Designing Data-Intensive Applications – 데이터 중심 애플리케이션 설계
  • Introduction to Algorithms – (한글판도 제목이 영어임)
  • Writing a C Compiler
  • Essential Maths for Data Science – 개발자를 위한 필수 수학
  • Elements of Information Theory

추천 프로젝트

  • 컴파일러 - 선택한 언어에 대한 컴파일러 작성해보기, LLVM 또는 JVM 참고
  • 에뮬레이터 - 간단한 CPU(예: 8086) 에뮬레이터 작성
  • 렌더 엔진 / 게임 엔진 - OpenGL 또는 Vulkan을 사용해 그래픽 프로그램 작성
  • 메모리 뷰어 및 편집기 작성 - 다른 프로그램의 메모리와 상호작용하는 프로그램 작성
  • HTTP 서버 작성 - 저수준 언어로 HTTP 서버 작성
  • 웹사이트나 단순한 프로젝트는 피할 것. 학습 효과가 낮을 수 있음. 위에 언급된 프로젝트에서 하나를 선택하고, 주제를 연구한 후 직접 구현해 보기

결론

  • 좋은 엔지니어가 된다는 것은 많은 프로그래밍 언어를 아는 것이 아님
  • 기본 원리의 깊은 이해 + 비판적 사고 + 실전 적용이 핵심
  • 배우고, 적용하고, 끊임없이 개선하는 태도가 필요함
  • 엔지니어링은 끝이 없는 여정이며, 성장하려는 자세가 중요함

결론

  • 좋은 엔지니어가 되는 것의 본질
    • 가장 많은 프로그래밍 언어를 아는 것, 최신 프레임워크를 마스터하는 것, 새로운 기술을 쫓는 것이 아님
    • 엔지니어링의 기본 원리에 대한 깊은 이해가 핵심
    • 배운 지식을 실제 프로젝트에 적용하고, 비판적으로 사고하며, 끊임없이 성장해야 함
  • 최고 엔지니어의 특징
    • 배움을 멈추지 않고 새로운 지식을 습득함
    • 자신의 가정을 끊임없이 의심하고 개선 방안을 찾음
    • 배운 지식을 실제 문제 해결에 적용하고, 동료와 협업하며 성장함
  • 엔지니어링은 평생의 여정
    • 호기심(curiosity), 규율(discipline), 성장에 대한 의지가 필요함
    • 이러한 원칙을 실천한다면 좋은 엔지니어를 넘어 위대한 엔지니어가 될 수 있을 것

Read Entire Article