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

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

  • 엔지니어의 정의

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

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

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

  • 기초 원리에 대한 강력한 이해가 필요함
    • 기계 엔지니어 → 재료의 특성과 응용 지식
    • 소프트웨어 엔지니어 → 메모리와 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), 성장에 대한 의지가 필요함
    • 이러한 원칙을 실천한다면 좋은 엔지니어를 넘어 위대한 엔지니어가 될 수 있을 것

리눅스 커널의 메모리 관리쪽도 컨트리뷰션을 해봤고, 저수준의 동작에 대해 어느정도 이해하고 있다고 생각하지만, 결국 원하지않게 개발과는 거리가 있는 일을 하고 있는걸 생각해보면, 이 글의 반대로 행동해야 잘 나가는 엔지니어가 되는게 아닌가 생각됩니다.

  • 새로운 기술을 빠르게 쫒을것
  • 개인적 호기심보다 시장을 생각할것
  • 자기 비판보다 자기 포장을 잘할것
  • 원라/성장보다 코딩테스트에 집중할것
    귀국해보니 한국은 시장이 너무 작고 경쟁이 심해서, 개발에 집중할 수 있는 회사나 포지션이 적고, 그 적은 자리를 서로 가지려고하니 결국 눈에 잘 띄는 것에 집중해야 자기가 하고 싶은 개발을 할 수 있어보입니다.

저도 공감합니다! 그리고 여기서 말하는 '좋은' 엔지니어가 어떤 엔지니어인지 사람마다 해석이 너무 다른 것 같아요. 극단적일 수 있지만, 기초지식의 중요성을 안다고 해도 시장에서 가치가 없는 엔지니어는 좋은 엔지니어인지 생각해보게 되네요

진짜 공감갑니다,,,
본질적인 걸 얼마나 제대로 파악하고 잘 다루냐의 게임이 아니라
특정 언어와 특정 기술 관련을 트렌드에 맞게 잘 쓰느냐의 게임이라 아쉽네요,,

한국에도 잘하는 엔지니어 많다고 생각하는데, 저도 시장 크기로 인해 아쉽게 느껴지는 부분이 많습니다.

FuriosaAI 같은 곳이 잘됐으면 좋았을텐데 하는 생각이 듭니다.

약간 공감이 되네요.. ㅋㅋ
한국 시장만 그런건지...

Hacker News 의견
  • 책 읽기에 대한 의견이 매우 마음에 듦. 많은 엔지니어들이 문서와 책보다 비디오와 얕은 게시물을 선호하면서 많은 것을 놓치는 것을 자주 봄

    • 또한, 사람들이 사소한 것에 대해 문서를 읽거나 최소한 구글링을 하기보다는 질문을 하는 경우가 얼마나 많은지 놀라움
    • 정보를 검색할 수 있는 능력이 매우 중요한 기술임
  • 이 글에서 언급된 많은 점에 동의함. 하지만 CPU, 메모리, HTTP 등의 깊은 기초를 아는 것이 어떻게 더 나은 엔지니어가 되는 데 도움이 되는지 확신이 서지 않음

    • 대부분의 엔지니어는 매우 높은 수준의 추상화에서 작업하며, 그 수준에서 사용되는 언어와 프레임워크는 메모리 등의 저수준 접근을 허용하지 않음
    • 이러한 기본적인 것들에 대해 무지해서는 안 되지만, 학문 외의 일상적인 응용에 대해서는 이해가 되지 않음

얼마전에 회사에서 Kotlin 언어 스터디를 위해 세미나를 한 번 한적이 있었는데, 부서에서 주로 쓰는 C++ 언어와 비교하는 방식으로 설명을 해보니까 반응이 좋았던 기억이 납니다. 정작 저는 C++을 거의 안쓰고, 부서원들은 Kotlin을 처음 접하는 상황이었는데 여러 모로 모두의 성장에 도움이 된 것 같았습니다.