4 điểm bởi GN⁺ 2025-10-25 | 1 bình luận | Chia sẻ qua WhatsApp
  • Bài viết này đề xuất những môn khoa học máy tính mang tính thực tế và châm biếm mà các lập trình viên phần mềm nên học, dù chúng không thực sự tồn tại
  • Mỗi môn học phê phán và phơi bày các vấn đề của văn hóa phát triển hiện đại hoặc những lối tư duy thiên lệch
  • Ví dụ, bài viết đề cập đến sự sùng bái quá mức đối với mô hình hướng đối tượng, việc phớt lờ UX của công cụ dòng lệnh, hay những ngộ nhận về hiệu năng của ngôn ngữ chậm
  • Ngoài ra còn có các môn học bàn về những ám ảnh tâm lý và thói quen kém hiệu quả của lập trình viên
  • Nhìn chung, bài viết hài hước nêu ra giới hạn của giáo dục khoa học máy tính và nhu cầu tự phản tỉnh trong văn hóa phát triển

CSCI 2100: Quên lập trình hướng đối tượng đi

  • Môn học này là quá trình tìm hiểu khái niệm biến và hàm không thuộc một hệ phân cấp đối tượng nào
    • Thoát khỏi lối tư duy lấy hướng đối tượng làm trung tâm để khám phá sự linh hoạt và tính đơn giản của lập trình hàm
    • Giới thiệu “hàm (function)” như một khái niệm tổng quát và có thể tái sử dụng hơn so với “phương thức (method)”
  • Điều kiện tiên quyết là bất kỳ môn học nào từng dùng thuật ngữ “abstract base class”
  • Mục tiêu là tháo gỡ sự phụ thuộc quá mức vào mô hình hướng đối tượng và tái lập cách tư duy cốt lõi về lập trình

CSCI 3300: Nghiên cứu phần mềm cổ điển

  • Môn học phân tích và thảo luận các sản phẩm phần mềm có ý nghĩa quan trọng trong lịch sử
    • Các ví dụ được đề cập gồm VisiCalc, AppleWorks, Robot Odyssey, Zork, MacPaint
  • Trọng tâm đặt vào giao diện người dùng (UI)ảnh hưởng của các ràng buộc phần cứng đối với tính sáng tạo
  • Thông qua những đổi mới sinh ra trong các giới hạn của quá khứ, môn học soi lại những nguyên lý nền tảng của thiết kế phần mềm hiện đại

CSCI 4020: Viết mã nhanh bằng ngôn ngữ chậm

  • Môn học bàn về cách viết mã hiệu năng cao ngay cả với ngôn ngữ thông dịch (như Python)
    • Khám phá các chiến lược thực hiện phân tích hiệu năng (performance analysis) ở mức cao và đạt được mức hiệu quả tương đương C++
  • Đồng thời theo đuổi việc giảm độ mong manh của mãgiữ được niềm vui khi phát triển
  • Đây là môn học phá vỡ định kiến “ngôn ngữ chậm thì chậm” và cho thấy khả năng tối ưu hóa của thiết kế ngôn ngữ và môi trường thực thi

CSCI 2170: Trải nghiệm người dùng (UX) của công cụ dòng lệnh

  • Môn nhập môn về các nguyên tắc thiết kế trải nghiệm người dùng cho chương trình chạy trên dòng lệnh
    • Tính liên quan, khả năng đọc và sự tối giản của đầu ra là các chủ đề cốt lõi
  • Dùng lệnh UNIX ls làm ví dụ để phân tích vấn đề quá nhiều tùy chọn và giao diện phức tạp
  • Nhấn mạnh rằng công cụ dòng lệnh cũng cần thiết kế lấy người dùng làm trung tâm như UI đồ họa

PSYC 4410: Tâm lý học về sự ám ảnh của lập trình viên

  • Khám phá những ám ảnh kém hiệu quả và các kiểu tư duy cưỡng bức mà nhà phát triển phần mềm thường mắc phải
    • Ví dụ: định dạng mã, hệ thống phân loại (taxonomy), hệ thống kiểu, chia tách tệp quá mức
  • Phân tích dưới góc độ tâm lý học phản ứng chỉ trích tức thì theo bản năng (knee-jerk criticism) khi tiếp xúc với hệ thống xa lạ
  • Môn học giúp hiểu thiên kiến nhận thức và xu hướng cầu toàn của lập trình viên, đồng thời tìm kiếm sự cân bằng giữa hợp tác và sáng tạo

Bối cảnh tổng thể

  • Danh sách này không phải đề cương môn học có thật, mà là một lời phê bình châm biếm về giáo dục khoa học máy tính và văn hóa phát triển
  • Mỗi môn học phơi bày những điểm mù của lối tư duy lấy công nghệ làm trung tâm, đồng thời thúc đẩy lập trình viên tư duy linh hoạt hơn và tự phản tỉnh
  • Dù là bài đăng từ năm 2015, nội dung vẫn nêu ra những vấn đề còn nguyên giá trị cho đến hôm nay

1 bình luận

 
GN⁺ 2025-10-25
Ý kiến trên Hacker News
  • CSCI 3300: Classical Software Studies
    Điều Alan Kay đã nhấn mạnh suốt nhiều thập kỷ là chúng ta vẫn đang liên tục tái phát minh những khái niệm vốn đã được định hình từ cuối thập niên 70
    Tôi đồng cảm với sự thất vọng của ông rằng cũng như nghệ sĩ học lịch sử nghệ thuật, lập trình viên cũng nên học lịch sử khoa học máy tính

    • Khi tôi học ở RIT, có một môn tự chọn tên là ‘History of Computing’. Môn này đi từ bàn tính cho tới mainframe và mạng máy tính, và đến giờ vẫn còn ghi chú bài giảng
    • Lịch sử nghệ thuật hay triết học kéo dài hàng nghìn năm, còn lịch sử điện toán chỉ mới khoảng một thế hệ hoặc hai ba thế hệ
      Tôi nghĩ việc so sánh điện toán, vốn phụ thuộc vào hiệu năng phần cứng vật lý, với nghệ thuật là hơi khiên cưỡng
      Cho rằng cách giải quyết vấn đề năm 1970 vẫn áp dụng nguyên vẹn vào năm 2025 là bỏ qua thực tế
    • Tôi từng thấy trên GitHub câu hỏi “Cái này khác gì Ansible?” và câu trả lời là “Tôi còn chưa từng nghe tới Ansible”
      Thật thú vị khi mỗi thế hệ lại lặp lại chu kỳ tái khám phá và tưởng rằng mình là người đầu tiên tìm ra nó
    • Khi làm việc với các nhà sáng lập, tôi thường thấy họ đóng gói những khái niệm đã tồn tại từ lâu như thể mới được phát minh
      Học về các vấn đề và lời giải trong quá khứ chưa bao giờ là lãng phí thời gian
    • Hồi đại học tôi có bài tập ‘tiểu luận lịch sử hệ điều hành’, và tôi chọn OS X(Snow Leopard)
      Nhờ quá trình đó tôi hiểu sâu hơn về sự tiến hóa của Unix và phần mềm thương mại, và hoàn toàn đồng ý với Alan Kay
  • CSCI 3240: Ignoring Hype
    Đây là môn học về cách phớt lờ các trào lưu xoay quanh nền tảng hay thư viện mới nhất
    Tiếp theo là CSCI 3120: Novelty Driven Development, nơi dạy điều ngược lại: bám theo xu hướng để giữ hứng thú
    Không thể đăng ký hai môn này cùng lúc
    Các môn khác nữa có thể là kỹ năng họp hành (PSYC 4870), chấp nhận ma sát trong tổ chức (PSYC 5630),
    xoay quanh giao tiếp và tạo động lực thực tế nơi công sở

  • CSCI 4810: The Refusal Lab
    Đây là môn thực hành mô phỏng các yêu cầu sản phẩm phi đạo đức và áp lực deadline, nơi bạn chỉ qua môn nếu biết từ chối chúng theo chuẩn mực nghề nghiệp

    • CSCI 4812: The Career Lab thì nói về thực tế bạn phải xử lý đống việc còn lại sau khi đồng nghiệp chấp nhận yêu cầu phi đạo đức rồi rời đi
    • Trên thực tế, nhiều chương trình cấp bằng đã có môn học liên quan đến đạo đức
    • Nhưng rốt cuộc các trường đại học vẫn ưu tiên khả năng xin việc của sinh viên tốt nghiệp
  • Đề xuất môn học về debugging
    Sẽ rất hay nếu có một môn dạy cách tìm nguyên nhân gốc của bug và sử dụng nhiều công cụ khác nhau

    • Giống như thí nghiệm hóa học, có thể giao cho sinh viên một codebase legacy đầy lỗi và môn học chỉ kết thúc khi họ làm cho toàn bộ test pass
    • Cũng nên dạy cách đọc code của người khác, và không tùy tiện phá bỏ cấu trúc sẵn có (Chesterton’s fence)
    • Ngay cả nhiều kỹ sư senior vẫn còn debug bằng print
      Cần có thời gian để nói về vị cứu tinh mang tên debug tương tác
  • CSCI 0001: Functional programming and type theory
    Thuật ngữ khó nhằn và công thức trong học thuật từ lâu đã cản trở việc phổ biến lập trình hàm
    Giờ là lúc tự mình học xem vì sao monad là monoid trong category của endofunctor

    • Hàm thuần hoạt động rất tự nhiên ngay cả trong context window
  • CSCI 4020: Writing Fast Code in Slow Languages
    Đây là môn dùng các ngôn ngữ chậm (VB, Ruby, v.v.) để dạy độ phức tạp thuật toán, và cho thấy O(N) trong Ruby vẫn có thể thắng O(N²) trong C++

    • Trong một cuốn sách tôi đọc hồi nhỏ, người ta so sánh bubble sort viết bằng FORTRAN với quicksort viết bằng BASIC,
      và tôi còn nhớ mình đã ngạc nhiên khi BASIC lại cho kết quả nhanh hơn dự kiến
    • Tôi từng làm bài thực hành chuyển các vòng lặp Python sang phép toán vector của numpy và các phép toán tensorflow rồi đo chênh lệch tốc độ
      Nhờ đó có thể cảm nhận rõ vì sao Python hữu ích trong AI
    • Sẽ thật tuyệt nếu các kỹ sư dùng Python mỗi ngày hiểu được vì sao code của họ chậm
    • Nhiều khi khai thác phần cứng tạo ra khác biệt lớn hơn cả độ phức tạp thuật toán
      Code được vector hóa trên bộ nhớ tuyến tính nhanh hơn rất nhiều so với dữ liệu rải rác trên heap
    • Sách tham khảo: Visual Basic Algorithms Ready-to-Run
  • Tổng hợp các phần trước
    Loạt “Computer science courses that don't exist, but should” tiếp nối qua
    bản năm 2015 (247 bình luận),
    bản năm 2017,
    bản năm 2018

  • Tôi nhớ tới môn Software Archaeology mà mình từng học ở đại học
    Đó là lớp học yêu cầu triển khai lại các bài tập compiler từ thập niên 1970,
    lúc đó tôi thấy vô dụng nhưng về sau nó giúp tôi rất nhiều trong việc hiểu thiết kế hệ thống

    • Thực tế, công việc điều tra số là cực kỳ quan trọng trong các codebase lớn
      Khả năng lần theo bug cũ, wiki, lịch sử phiên bản và lịch sử đội ngũ là điều thiết yếu
  • Ngày nay nhiều chương trình khoa học máy tính thực chất đã biến thành trường dạy nghề lập trình
    Sinh viên biết dùng framework nhưng không hiểu triết lý thiết kế ngôn ngữ hay sự tiến hóa của hệ thống
    Không nên quên rằng điện toán không chỉ là triển khai mà còn là một ngành học về tư tưởng và ý tưởng

    • Tuy vậy, một số đại học công lập lớn vẫn giữ cấu trúc môn học cốt lõi giống hệt 25 năm trước
      Do các tiêu chuẩn kiểm định, chương trình đào tạo khó mà lệch đi quá nhiều
  • CSCI 3210: Modern text encoding and processing
    Môn này dạy về Unicode và UTF-8, và buộc người học từ bỏ quan niệm ‘1 ký tự = 1 byte’
    Không chỉ nói về encoding mà còn bao quát cả tìm kiếm, sắp xếp, render font và xử lý emoji
    Đây là kiến thức rất cơ bản nhưng hiếm ai thật sự hiểu đúng