Lập trình thi đấu (Competitive Programming) là gì?
By: Trần Khánh Hiệp
Huy Chương Bạc ICPC Châu Á - Thái Bình Dương 2015
Giảng viên Data Structures & Algorithms tại EngineerPro
Lập trình thi đấu là gì?
Lập trình thi đấu (competitive programming, hay CP) là một hình thức thi đấu mà các thí sinh hoặc các đội cạnh tranh với nhau để giải quyết các bài toán lập trình trong thời gian giới hạn. Những bài toán này thường đòi hỏi người tham gia phải sử dụng kiến thức về cấu trúc dữ liệu và giải thuật để tìm ra lời giải.
Mình đã đến với CP như thế nào?
Mình bắt đầu tập tành làm các bài thuật toán từ khi học lớp 10, sau khi may mắn thi đỗ vào lớp chuyên Tin. Lúc đầu nó chỉ như một môn học bình thường, nhưng càng học càng cuốn. Vì CP mang tính chất cạnh tranh, nó cực hợp với một người hiếu thắng như mình. Sau đó thì mọi thứ đến rất tự nhiên. Theo sự dẫn dắt của thầy cô và bạn bè, mình bắt đầu làm những bài tập trên mạng ở những trang như SPOJ, VNOI, và tham gia những cuộc thi cho học sinh như thi học sinh giỏi, Tin học trẻ. Đến khi vào đại học, mình càng cày nhiều hơn. Mỗi ngày đều một buổi đến lớp, một buổi ngồi code. Bất kể là TopCoder, Codeforces, hay CodeChef, trang nào cũng có dấu chân của mình. Và tất nhiên, mình cũng tham gia những cuộc thi dành cho sinh viên như ACM ICPC và Olympic Tin học Sinh viên.
Những trải nghiệm từ CP
Mặc dù đã gần 8 năm kể từ lần cuối mình tham gia CP một cách nghiêm túc, nhưng những trải nghiệm từ các cuộc thi thì vẫn không thể quên được.
Có lẽ đáng nhớ nhất là những lúc luyện tập cùng team để chuẩn bị cho ACM ICPC. Có những đợt mình ngoài một buổi đi học bình thường, một buổi luyện code một mình, thì buổi tối lại luyện cùng team. Có một năm, thầy phụ trách mượn được 1 phòng sinh hoạt chung trong ký túc xá cho tất cả hội ACM. Team mình lên đó ở cả đêm, làm 1 đề ICPC từ 7 giờ đến 12 giờ, nghỉ một chút rồi lại làm tiếp Codeforces từ 1 giờ sáng hay gì đó. Phòng đó lại không có giường nên phải nằm ngủ dưới đất, Hà Nội bắt đầu vào đông, anh em chỉ còn biết ôm nhau mà ngủ 🙂. Trong đầu lúc đó không có gì khác ngoài DP, đồ thị, cây cối,…; mặc dù mệt nhưng vẫn vui vì mọi người cùng hướng đến một mục tiêu.
Trải nghiệm đáng nhớ thứ hai mình có được từ CP là được tiếp xúc với rất nhiều “siêu nhân”. Ngày xưa teammate mình toàn các bạn học sinh giỏi quốc gia, đi ICPC World Final, thậm chí có cả huy chương vàng IMO — người học code nửa năm đã bá đạo cả trường rồi. Bây giờ thì các bạn người thì CEO, người thì PhD, hoặc là làm ở Google, Amazon,…, nhìn chỉ biết ước 🙂. Ngoài ra thì đối thủ ở những trường khác cũng toàn siêu nhân, mà đỉnh cao nhất có lẽ là team của trường University of Tokyo ở Malaysia năm 2014, với huyền thoại thế giới rng58, đội sau đó đã giành huy chương vàng ở WF. Năm đó team này ngồi cạnh team mình, khiến team mình khá hoảng loạn khi họ đã ngồi chơi khi còn gần nửa thời gian thi.
Một điều đáng nhớ nữa ở CP là những lần “suýt” của mình. Năm lớp 12, mình được giải nhất thi học sinh giỏi thành phố Hà Nội. Lúc đó trong đầu mình đã nghĩ đến việc sắp được thi học sinh giỏi quốc gia, mà chủ quan ở kỳ thi Vòng 2 chọn đội tuyển của Hà Nội, và đã không được chọn để đi thi quốc gia. Năm 2014, mình cùng team với 2 anh đã từng được đi World Final năm trước. Năm đó ở Malaysia, team mình thua vì thời gian và team đứng ngay trên mình (NTU, Singapore) đã được đi World Final. Năm 2015, team mình lại thua ngay sát team của NUS ở Phuket và để họ giành mất vé đi WF. Thực sự thì hành trình CP của mình sẽ trọn vẹn hơn nếu ít nhất một lần được đến WF, nhưng mình vẫn rất tự hào vì những gì mình đã đạt được.
Những bài học từ CP
Tham gia CP đã cho mình rất nhiều bài học, mà đến tận bây giờ vẫn vô cùng hữu ích.
Đầu tiên, đó là sức mạnh của việc làm việc nhóm. Trong một cuộc thi đồng đội như ACM ICPC, các thành viên trong đội phải cực kỳ hiểu điểm mạnh, điểm yếu của nhau để phân chia các bài một cách phù hợp. Hơn nữa, bạn luôn phải tin tưởng vào đồng đội của mình vì đơn giản là không ai có thể một mình gánh được cả đội. Ngay cả trong những cuộc thi cá nhân, việc có bạn bè cùng ôn luyện cũng cực kỳ quan trọng. Có bạn bè để chỉ cho nhau những cách giải mới, để giải thích cho nhau những chỗ không hiểu, có lúc bạn bè động viên nhau vượt qua khó khăn, cũng có lúc ganh đua với bạn bè tạo động lực giúp mình tiến lên. Vì thế, bây giờ nghĩ lại vì sao mình không còn tham gia CP nữa, một phần vì mình có những ưu tiên khác, nhưng một phần cũng vì bạn bè cũng không còn mấy ai làm CP nữa.
Thứ hai, cũng giống như tất cả các cuộc thi khác, lúc nào cũng có người thắng và người thua. Điều quan trọng là mình đã chiến đấu hết mình. Đôi lúc mọi thứ rất dễ để từ bỏ, nhưng nếu vượt qua được thì cảm giác sẽ sung sướng không gì tả nổi.
Cuối cùng, CP đã cho mình một nền tảng vững chắc về cấu trúc dữ liệu và giải thuật. Nhiều Big Tech trong khoảng 10 năm nay dùng thuật toán như một trong những tiêu chí quan trọng để tuyển người. Vì thế nên bây giờ có một làn sóng mọi người cùng luyện tập Leetcode để chuẩn bị cho phỏng vấn. Mình cảm thấy rất may mắn vì đã có nền tảng vững chắc được tích luỹ qua nhiều năm làm CP nên không phải grind Leetcode nhiều như những bạn chưa từng làm CP bao giờ. Trong công việc, mặc dù không trực tiếp dùng kiến thức thuật toán nhiều, nhưng nó vẫn giúp mình trong cách tư duy, suy nghĩ về những vấn đề gặp phải trong công việc.
Kết luận
Mình đến với CP như một cái duyên. Mặc dù còn nhiều thứ chưa trọn vẹn, mình vẫn nghĩ về nó với những kỉ niệm đẹp (như một mối tình dang dở 🙂) và nó đã làm thay đổi cuộc sống của mình theo hướng tốt hơn. Mặc dù không còn làm CP nữa, nếu được quay lại, mình vẫn sẽ tiếp tục cày CP. Với các bạn học sinh, sinh viên IT, mình nghĩ ai cũng nên thử một lần. Có rất nhiều resources để các bạn có thể bắt đầu: VNOI, Codeforces, Leetcode, CodeChef, AtCoder, cp-algorithms,…, chỉ chờ các bạn bắt tay vào làm.