Cowboy Coder

To code like a Cowboy!

Lợi và hại của việc tập trung đơn lẻ vào Lập trình thi đấu

Câu hỏi gốc trên Quora: Lợi thế và bất lợi của việc chỉ có kĩ năng Lập trình thi đấu là gì?

Nick Wu

Mấy cái lợi thế hả:

  • Code của bạn có ít bug hơn. Chả có cảm giác nào bằng được cảm giác viết một cái chương trình hoàn chỉnh, chạy thử thành công trên các bộ test nhỏ, và submit AC trong lần đầu tiên. Sau thời gian dài, tôi cũng bắt đầu nhận thấy mình có thể viết được những chương trình không bug trong lần đầu tiên nhiều hơn.
  • Bạn code nhanh hơn. Thực tế mà nói thì code nhanh không phải là yếu tố quan trọng đối với tôi, nhưng bạn bè của tôi hay trêu đùa rằng họ muốn cắt bỏ luôn tay của tôi đi để tôi có thể code ở một tốc độ bình thường hơn.
  • Kĩ năng debug của bạn trở nên đỉnh cao. Đây không chỉ là về việc tham gia lập trình thi đấu - Tôi đã debug cho rất nhiều các GUI hay ứng dụng OOP do dù chẳng hề có kinh nghiệm với cái đầu tiên.
  • Bạn không phải lo lắng về việc cài đặt chương trình. Tôi nhận ra điều này ở trong lớp học, khi bài tập về nhà của bọn tôi có thể được gọi ngắn gọn là bài “hãy chọn cấu trúc dữ liệu đúng”. Theo kiểu bạn nhìn vào đó và phán “Chúng ta nên đặt 1 cái priority queue ở đây”. Bạn sẽ luyện tập được trực cảm cho những thứ như vậy.
  • Bạn có thể được lên Youtube! Nếu như bạn thích fame và vinh quang. Hoặc đối với trường hợp của tôi thì là sự xấu hổ tới thiên thu.

Michal Danilák

Disadvantages

  • Bạn sinh ra nghiện ganh đua. Ở ngoài đời thật, bạn sẽ nhanh chóng mất đi động lực khi không có ai để ganh đua cùng cả.
  • Bạn sẽ quen với những cái mục tiêu và phần thưởng ngắn hạn. Trong cuộc thi, thắng thua được quyết định trong vài tiếng đồng hồ. Trong đời thực bạn có thể phải mất tới hàng tháng để dự án bạn làm sinh ra thành quả cho bạn. Vẫn là vấn đề mất đi động lực.
  • Bạn chưa từng bao giờ làm ra một cái gì có ích cả. Bạn không biết được cái cảm giác khi chương trình bạn tạo ra đang giúp ích cho ai đó và mọi người biết ơn điều đó.
  • Bạn chưa từng kiếm ra đồng nào cả, nếu như bạn không thuộc vào số ít đỉnh cao. Bạn cũng không biết tới cảm xúc khi có ai đó sẵn sàng trả tiền cho chương trình của bạn.
  • Bạn là một chuyên gia giải quyết vấn đề. Nhưng tìm ra vấn đề còn khó và quan trọng hơn nhiều. Dữ liệu đầu vào thực tế sẽ chẳng bao giờ kiểu “các số nguyên từ 1 tới 50, tính cả 2 đầu”.
  • Bạn biết ngôn ngữ lập trình, nhưng bạn không biết framework nào cả. Học framework thì thực dụng hơn, tốn thời gian hơn và chán nản hơn, và bạn phải làm việc đó suốt ngày!
  • Không có hệ thống nào có thể báo rằng solution của bạn đã hoàn chỉnh cả. Kể cả khi bạn sử dụng unittest, đôi lúc trong quá trình sản xuất, code của bạn vẫn có thể sai được. Rồi bạn sửa nó, và vài tháng sau nó lại sai. Và rồi tiếp nữa…
  • Có nhiều cách để solution của bạn sai. Trong thi đấu chúng ta có WA (Wrong Answer), TLE (Time Limit Exceeded) hoặc RuntimeError. Ở ngoài đời thực, chương trình của bạn là một phần của cả hệ thống lớn. Khi chạy một mình nó có thể đúng, nhưng nó vẫn có thể sai khi chạy cùng cả hệ thống. Và kể cả khi nó đã chạy đúng rồi, bạn cũng có thể phạm phải nhiều sai lầm trong thiết kế mà bạn sẽ phải trả giá trong tương lai.
  • Trong khi thi đấu, bạn là người chơi đơn lẻ. Kể cả khi tham gia các cuộc thi như ACM, mọi người thường hay chia bài tập dành cho từng người. Ở ngoài đời thật, bạn không chỉ phải giải quyết vấn đề cùng cả đội, bạn còn phải dùng chung codebase!
  • Bạn thường có thói quen lập trình xấu. Không xài OOP, không có hiểu biết gì về design pattern, thích cách giải quyết lươn lẹo hơn, vân vân…
  • Thuật toán Viterbi, bộ lọc Bloom, Machine Learning, Giải thuật di truyền, xử lý ảnh - bạn chẳng bao giờ phải dùng mấy thứ đó trong thi đấu, nhưng chúng lại là những thứ quan trọng nhất trong thực tế.

Advantages

  • Bạn có trực cảm cho các vấn đề yêu cầu tới thuật toán. Bạn có thể tự tin chỉ ra vấn đề nào có thể xử lý được hoặc cần phải được định nghĩa lại.
  • Bạn có thể vượt qua vòng phòng vấn vào các công ty IT trong cuộc ganh đua với tầm 30+ người. Những cuộc phỏng vấn này thường xoay quanh thuật toán, mà bạn đã luyện tập suốt về thuật toán rồi còn gì.
  • Được vị trí cao trong các cuộc thi giúp bạn có được sự kính nể (và nhiều áo T-shirt free nữa).

Bài học rút ra là gì?

undefined

Giống như mẹ của bạn thường hay nói “Mày học suốt là tù người đấy” (nếu mẹ bạn có nói như thế), cái gì cũng có lợi và hại của nó cả. Lập trình thi đấu là một công cụ hiệu quả để bạn có thể rèn luyện kĩ năng lập trình của mình, nhưng bạn cũng không nên tập trung thái quá vào nó - trừ khi bạn đang chuẩn bị cho một kì thi lập trình quan trọng. Tự tìm hiểu, mày mò về những ứng dụng thực tế của lập trình sẽ giúp bạn có được một nền tảng cân bằng hơn, thích nghi dễ dàng hơn với sự thay đổi của công nghệ. :))