4P by GN⁺ 9일전 | ★ favorite | 댓글 1개
  • 이 글은 실제로 존재하지 않지만, 소프트웨어 개발자들이 배워야 할 현실적이고 풍자적인 컴퓨터 과학 강의들을 제안
  • 각 강의는 현대 개발 문화의 문제점이나 편향된 사고방식을 비판적으로 드러냄
  • 예를 들어, 객체지향 패러다임에 대한 맹신, 명령줄 도구의 UX 무시, 느린 언어의 성능 오해 등을 다룸
  • 또한 개발자들의 심리적 집착과 비생산적 습관을 다루는 과목도 포함
  • 전체적으로 컴퓨터 과학 교육의 한계와 개발 문화의 자기반성 필요성을 유머러스하게 제시

CSCI 2100: 객체지향 프로그래밍을 잊기

  • 이 과목은 객체 계층 구조에 속하지 않은 변수와 함수의 개념을 배우는 과정
    • 객체지향 중심 사고에서 벗어나, 함수형 프로그래밍의 유연성과 단순함을 탐구
    • “함수(function)”를 “메서드(method)”보다 더 일반적이고 재사용 가능한 개념으로 소개
  • 선수 과목은 “추상 기본 클래스(abstract base class)”라는 용어를 사용한 어떤 수업이든 해당
  • 객체지향 패러다임의 과도한 의존을 해체하고, 프로그래밍의 본질적 사고를 재정립하는 목적

CSCI 3300: 고전 소프트웨어 연구

  • 역사적으로 중요한 소프트웨어 제품을 분석하고 토론하는 수업
    • 다루는 예시로 VisiCalc, AppleWorks, Robot Odyssey, Zork, MacPaint 등이 포함
  • 초점은 사용자 인터페이스(UI)하드웨어 제약이 창의성에 미친 영향에 맞춰짐
  • 과거의 제약 속에서 탄생한 혁신을 통해, 현대 소프트웨어 디자인의 근본 원리를 재조명

CSCI 4020: 느린 언어로 빠른 코드 작성하기

  • 인터프리터 언어(Python 등) 로도 고성능 코드를 작성하는 방법을 다룸
    • 고수준에서 성능 분석(performance analysis) 을 수행하고, C++ 수준의 효율성을 달성하는 전략을 탐구
  • 코드의 취약성 감소와 개발의 즐거움 유지를 동시에 추구
  • “느린 언어는 느리다”는 통념을 깨고, 언어 설계와 실행 환경의 최적화 가능성을 보여주는 강의

CSCI 2170: 명령줄 도구의 사용자 경험(UX)

  • 명령줄 기반 프로그램의 사용자 경험 설계 원칙을 다루는 입문 과목
    • 출력의 관련성, 가독성, 최소화를 핵심 주제로 함
  • UNIX의 ‘ls’ 명령어를 사례로, 과도한 옵션과 복잡한 인터페이스 문제를 분석
  • 명령줄 도구도 그래픽 UI처럼 사용자 중심 설계가 필요함을 강조

PSYC 4410: 프로그래머의 집착 심리

  • 소프트웨어 개발자가 흔히 빠지는 비생산적 집착과 강박적 사고 패턴을 탐구
    • 예: 코드 포매팅, 분류 체계(taxonomy), 타입 시스템, 과도한 파일 분할 등
  • 낯선 시스템을 접했을 때 나타나는 즉각적 비판 반응(knee-jerk criticism) 을 심리학적으로 분석
  • 개발자의 인지적 편향과 완벽주의 성향을 이해하고, 협업과 창의성의 균형을 모색하는 수업

전체 맥락

  • 이 목록은 실제 강의 계획이 아니라, 컴퓨터 과학 교육과 개발 문화의 풍자적 비판으로 구성
  • 각 과목은 기술 중심 사고의 맹점을 드러내며, 개발자에게 사고의 유연성과 자기 성찰을 촉구
  • 2015년 게시물이지만, 오늘날에도 여전히 유효한 문제의식을 담고 있음
Hacker News 의견
  • CSCI 3300: Classical Software Studies
    Alan Kay가 수십 년간 강조해온 것은 우리가 이미 70년대 후반에 정립된 개념들을 계속 재발명하고 있다는 점임
    예술가가 예술사를 배우듯, 프로그래머도 컴퓨터 과학의 역사를 배워야 한다는 그의 실망감에 공감함

    • 내가 RIT에 다닐 때 ‘History of Computing’이라는 선택 과목이 있었음. 주판에서 시작해 메인프레임과 네트워킹까지 다뤘고, 지금도 강의 노트가 남아 있음
    • 예술이나 철학의 역사는 수천 년에 걸쳐 있지만, 컴퓨팅의 역사는 한 세대 혹은 두세 세대 정도에 불과함
      물리적 하드웨어 성능에 의존하는 컴퓨팅을 예술과 비교하는 건 무리라는 생각임
      1970년의 문제 해결 방식이 2025년에 그대로 적용된다고 보는 건 현실을 놓치는 것임
    • GitHub에서 “이건 Ansible이랑 뭐가 달라요?”라는 질문에 “Ansible이 뭔지 처음 들어요”라는 답변을 본 적 있음
      세대마다 자신이 처음 발견했다고 착각하는 재발견의 반복이 흥미로움
    • 창업자들과 일하다 보면 이미 존재하는 개념을 새로 만든 것처럼 포장하는 경우가 많음
      과거의 문제와 해법을 배우는 건 결코 시간 낭비가 아님
    • 대학 시절 ‘운영체제 역사 에세이’ 과제가 있었는데, 나는 OS X(Snow Leopard)를 선택했음
      그 과정을 통해 Unix와 상용 소프트웨어의 진화를 깊이 이해하게 되었고 Alan Kay의 말에 완전히 공감함
  • CSCI 3240: Ignoring Hype
    최신 플랫폼이나 라이브러리의 유행을 무시하는 법을 배우는 과목임
    이어서 CSCI 3120: Novelty Driven Development에서는 반대로 유행을 따라잡으며 흥미를 유지하는 법을 다룸
    두 과목은 동시에 수강할 수 없음
    또 다른 과목으로는 회의 기술(PSYC 4870), 조직 마찰 수용(PSYC 5630) 등이 있으며,
    현실적인 직장 내 커뮤니케이션과 동기부여를 다룸

  • CSCI 4810: The Refusal Lab
    비윤리적인 제품 요청과 마감 압박을 시뮬레이션하고, 이를 전문적 기준으로 거절해야 통과할 수 있는 실험실 과목임

    • CSCI 4812: The Career Lab에서는 동료들이 비윤리적 요구를 수락하고 떠난 뒤 남은 일을 처리하는 현실을 다룸
    • 실제로 많은 학위 과정에 윤리 관련 수업이 포함되어 있음
    • 하지만 대학은 결국 졸업생의 취업 가능성을 우선시함
  • 디버깅 과목 제안
    버그의 근본 원인을 찾고 다양한 도구를 활용하는 법을 배우는 과목이 있었으면 좋겠음

    • 화학 실험처럼, 학생에게 버그투성이의 레거시 코드베이스를 주고 모든 테스트를 통과시키면 수업이 끝나는 형태면 좋겠음
    • 다른 사람의 코드를 읽고, 기존 구조(Chesterton’s fence)를 함부로 허물지 않는 법도 함께 배워야 함
    • 많은 시니어 엔지니어조차 여전히 print로 디버깅함
      인터랙티브 디버깅의 구세주에 대해 이야기할 시간이 필요함
  • CSCI 0001: Functional programming and type theory
    학계의 난해한 용어와 수식이 함수형 프로그래밍의 대중화를 막아왔음
    이제 모나드가 왜 endofunctor의 카테고리에서 모노이드인지 직접 배워볼 차례임

    • 순수 함수는 context window 안에서도 매우 자연스럽게 작동함
  • CSCI 4020: Writing Fast Code in Slow Languages
    느린 언어(VB, Ruby 등)로 알고리즘 복잡도를 가르치며, Ruby의 O(N)이 C++의 O(N²)을 이길 수 있음을 보여주는 과목임

    • 어릴 적 읽은 책에서 FORTRAN의 bubble sort와 BASIC의 quicksort를 비교했는데,
      BASIC이 의외로 빠른 결과를 보여 놀랐던 기억이 있음
    • Python 루프를 numpy 벡터 연산, tensorflow 연산으로 변환하며 속도 차이를 측정하는 실습을 했었음
      Python이 AI에서 유용한 이유를 체감할 수 있었음
    • 매일 Python을 쓰는 엔지니어들이 왜 코드가 느린지 이해하게 된다면 정말 좋을 것 같음
    • 알고리즘 복잡도보다 하드웨어 활용이 더 큰 차이를 만드는 경우가 많음
      선형 메모리에서 벡터화된 코드가 힙에 흩어진 데이터보다 훨씬 빠름
    • 참고 도서: Visual Basic Algorithms Ready-to-Run
  • 이전 시리즈 모음
    “Computer science courses that don't exist, but should” 시리즈는
    2015년판 (247 comments),
    2017년판,
    2018년판 등으로 이어져 있음

  • 대학 시절 들었던 Software Archaeology 과목이 떠오름
    1970년대의 컴파일러 연습문제를 다시 구현하는 수업이었는데,
    당시엔 쓸모없다고 느꼈지만 나중에 시스템 설계 이해에 큰 도움이 되었음

    • 실제로 디지털 탐정 작업은 대규모 코드베이스에서 매우 중요함
      오래된 버그, 위키, 버전 기록, 팀 이력 등을 추적하는 능력이 필수임
  • 오늘날 많은 컴퓨터 과학 프로그램이 사실상 코딩 직업학교처럼 변했음
    학생들은 프레임워크는 쓸 줄 알지만 언어 설계 철학이나 시스템 진화를 이해하지 못함
    컴퓨팅은 구현뿐 아니라 사상과 아이디어의 학문임을 잊지 말아야 함

    • 하지만 일부 대형 주립대는 여전히 25년 전과 같은 핵심 과목 구성을 유지하고 있음
      인증 기준 때문에 커리큘럼이 크게 벗어나긴 어려움
  • CSCI 3210: Modern text encoding and processing
    Unicode와 UTF-8을 배우고, ‘1문자 = 1바이트’라는 개념을 버리는 수업임
    인코딩뿐 아니라 검색, 정렬, 폰트 렌더링, 이모지 처리까지 다룸
    기본적이지만 제대로 이해하는 사람이 드묾