Lập trình thử nghiệm (Lập trình cạnh tranh) là gì? Lập trình thi đấu (Competitive Programming) là gì?
Bởi: 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 Cấu trúc dữ liệu & Giải thuật tại EngineerPro
Lập trình này là gì?
Lập trình thi đấu (lập trình cạnh tranh, hay CP) là một công thức thi đấu mà các thí sinh hoặc các 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 được yêu cầu 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 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 toán thuật 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 yêu thắng như mình. Sau đó mọi thứ sẽ đến rất tự nhiên. Theo sự hướng dẫn 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 sâu nhiều hơn. Mỗi ngày đều một buổi đến lớp, một buổi ngồi code. Kể cả TopCoder, Codeforces, hay CodeChef, trang nào cũng có dấu chân của mình. Và tất nhiên, cô 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
Dù đã gần 8 năm kể từ lần cuối cùng mình tham gia CP một cách nguy hiểm, nhưng những trải nghiệm từ cuộc thi thì vẫn không thể quên được.
Đáng nhớ nhất là những người đang luyện tập cùng nhóm để chuẩn bị cho ACM ICPC. Có những buổi luyện tập ngoài một buổi đi học bình thường, một buổi luyện tập code một mình, thì buổi tối luyện tập cùng đội. Có một năm, thầy phụ trách được 1 phòng sinh hoạt chung ở 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 lá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 ngủ dưới đất, Hà Nội bắt đầu vào đông, anh em chỉ biết ôm nhau mà ngủ 🙂. Lúc đầu không có gì khác ngoài DP, đồ thị, cây cối,…; mặc dù mệt mỏi 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 từ CP là được tiếp xúc với rất nhiều “siêu nhân”. Ngày xưa đồng đội mình toàn các bạn học sinh giỏi quốc gia, lọt vào Chung kết Thế giới ICPC, thậm chí có cả huy chương vàng IMO — người học mã nửa năm đã bá đạo cả trường rồi. Bây giờ thì các bạn sẽ là CEO, người thì PhD, hoặc đang làm việc ở 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ó thể là đội của trường Đại học Tokyo ở Malaysia năm 2014, với huyền thoại thế giới rng58, đội sau đó đã giành được huy chương vàng ở WF. Năm đó đội này ngồi cạnh đội mình, khiến đội mình hoàn toàn hỗn 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 đã đạt giải nhất thi học sinh giỏi thành phố Hà Nội. Lúc đó, tôi đã nghĩ đến việc sắp xếp thi học sinh giỏi quốc gia, mà chủ nhà ở vòng 2 tuyển chọn đội tuyển Hà Nội, và đã không được chọn để đi thi quốc gia. Năm 2014, mình cùng đội với 2 anh đã từng lọt vào Chung kết Thế giới năm trước. Năm đó tại Malaysia, đội mình thua vì thời gian và đội đứng ngay trên mình (NTU, Singapore) đã vào Chung kết Thế giới. Năm 2015, đội mình lại thua ngay đội NUS ở Phuket và để họ giành được mất vé đi WF. Thực sự thì quá trình CP của mình sẽ được xem xét hơn dù ít nhất một lần được vào 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 công 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 phải luôn tin tưởng vào đồng đội của mình vì đơn giản là không ai có thể là người gánh cả đội. Ngay cả trong những cuộc thi cá nhân, bạn có việc làm 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ỗ chưa 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 cùng 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 điều ư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 chiến này, 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ễ dàng để bỏ qua, nhưng nếu vượt qua được thì cảm giác giác sẽ sung sướng không có gì nổi nổi.
Cuối cùng, CP đã chọn một nền tảng vững chắc về cấu trúc dữ liệu và giải pháp. 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 hiện nay có một làn sóng mọi người cùng luyện tập Leetcode để chuẩn bị cho cuộc phỏng vấn. Mình cảm thấy rất may mắn vì đã có nền tảng chắc chắn được tích cực qua nhiều năm làm CP nên không phải xay 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 sử dụng kiến trú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. Dù còn nhiều thứ nữa, mình vẫn nghĩ về nó với những kỷ niệm đẹp (như một mối tình dang 🙂) 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 nhưng nếu được quay lại thì 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 tài nguyên để 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.
All rights reserved