Một cuộc thảo luận sôi nổi đã nổ ra trong cộng đồng kỹ thuật phần mềm về việc liệu các developer có nên ưu tiên học các phương pháp testing hơn là kiến thức sâu về cấu trúc dữ liệu và thuật toán ( DSA ). Cuộc tranh luận tập trung vào những kỹ năng thực sự quan trọng nhất cho công việc lập trình hàng ngày và sự phát triển nghề nghiệp.
Sự Phân Chia Lớn: Phát Triển Hạ Tầng vs Ứng Dụng
Cộng đồng cho thấy sự chia rẽ rõ ràng dựa trên loại phần mềm mà các kỹ sư làm việc. Những người xây dựng hệ thống hạ tầng quy mô lớn cho rằng kiến thức DSA sâu là thiết yếu và phải được cảm nhận thấu đáo. Trong khi đó, các developer làm việc trên ứng dụng doanh nghiệp và dịch vụ web thấy kỹ năng testing có giá trị hơn nhiều trong công việc hàng ngày của họ.
Một người bình luận đã làm nổi bật sự phân chia này một cách hoàn hảo, lưu ý rằng công việc phân tích genome từng liên quan đến việc một sinh viên chạy code trong hơn một tuần vì dữ liệu không được sắp xếp trước - một vấn đề mà kiến thức thuật toán phù hợp có thể đã ngăn chặn trong vài phút. Tuy nhiên, những người khác phản bác rằng những tình huống như vậy xảy ra ít hơn khoảng 100 lần so với việc cần kỹ năng testing phù hợp.
Cuộc thảo luận cho thấy rằng kinh nghiệm định hình quan điểm một cách đáng kể. Các kỹ sư đã làm việc trên công cụ cơ sở dữ liệu, compiler, hoặc công cụ tính toán khoa học coi DSA là nền tảng. Những người xây dựng ứng dụng hướng đến khách hàng, trang web thương mại điện tử, hoặc phần mềm doanh nghiệp thấy phương pháp testing thực tế hơn.
Tác động nghề nghiệp theo loại phát triển:
- Hạ tầng/Hệ thống: Kiến thức DSA sâu rộng rất quan trọng, testing quan trọng nhưng ở mức thứ yếu
- Ứng dụng Web: Kỹ năng testing là chính, hiểu biết DSA cơ bản là đủ
- Tính toán khoa học: Cả DSA và testing đều quan trọng như nhau
- Phần mềm doanh nghiệp: Phương pháp testing có giá trị nhất, tối ưu hóa hiệu suất thỉnh thoảng
- Phát triển Game: Kiến thức DSA tập trung vào hiệu suất là thiết yếu
Testing Như Thực Tế Hàng Ngày vs DSA Như Nhu Cầu Thỉnh Thoảng
Những người ủng hộ testing đưa ra lập luận thuyết phục về tần suất sử dụng. Trong khi việc chọn cấu trúc dữ liệu phù hợp có thể tiết kiệm thời gian và tài nguyên đáng kể thỉnh thoảng, việc viết code có thể bảo trì và đáng tin cậy thông qua testing phù hợp diễn ra mỗi ngày. Testing cung cấp sự tự tin để refactor code, phát hiện regression, và đảm bảo chất lượng phần mềm ở mọi quy mô.
Các thực hành phát triển hiện đại cũng đã thay đổi bối cảnh. Hầu hết các ngôn ngữ lập trình hiện nay đều bao gồm thư viện chuẩn mạnh mẽ với các cấu trúc dữ liệu được tối ưu hóa. Nhu cầu implement hash table hoặc thuật toán sắp xếp từ đầu đã phần lớn biến mất đối với hầu hết các developer.
Testing không chỉ mang lại cho bạn nhiều tự tin hơn trong code của mình, nó còn giúp bạn viết code tốt hơn ngay từ đầu.
Tuy nhiên, những người chỉ trích lập luận rằng việc tập trung vào testing mà không hiểu về tác động hiệu suất có thể dẫn đến code được test tốt nhưng không hiệu quả. Họ chỉ ra rằng không có lượng testing nào có thể khắc phục các vấn đề thuật toán cơ bản gây ra việc ứng dụng chậm lại khi dữ liệu tăng lên.
Các Kỹ Năng Testing Quan Trọng Cho Phát Triển Sự Nghiệp:
- Unit testing và phát triển hướng test ( TDD )
- Integration và end-to-end testing
- Phân tích độ bao phủ code và các chỉ số test có ý nghĩa
- Các mẫu thiết kế testing và thực hành tốt nhất
- Phương pháp debugging và khắc phục sự cố
- Kỹ thuật property-based và fuzz testing
Sự Không Khớp Trong Tuyển Dụng Và Giáo Dục
Một phần quan trọng của cuộc tranh luận tập trung vào sự ngắt kết nối giữa những gì các công ty kiểm tra trong phỏng vấn so với những gì các developer thực sự làm trong công việc. Nhiều vị trí entry-level vẫn yêu cầu ứng viên giải quyết các câu đố thuật toán và implement cấu trúc dữ liệu từ trí nhớ, mặc dù những kỹ năng này hiếm khi được sử dụng trong công việc thực tế.
Điều này tạo ra một chu kỳ bực bội nơi các developer mới dành hàng tháng để luyện tập trên các trang web thử thách coding thay vì học các kỹ năng thực tế như phát triển hướng test, kỹ thuật debug, hoặc nguyên tắc thiết kế hệ thống sẽ phục vụ họ tốt hơn trong sự nghiệp.
Hệ thống giáo dục đối mặt với những thách thức tương tự. Chương trình giảng dạy khoa học máy tính vẫn nhấn mạnh mạnh mẽ kiến thức thuật toán lý thuyết trong khi thường coi testing như một kỹ năng thứ yếu, mặc dù phản hồi từ ngành công nghiệp cho thấy ưu tiên ngược lại sẽ chuẩn bị tốt hơn cho sinh viên tốt nghiệp.
Kiến thức DSA cần thiết cho hầu hết các Developer:
- Các cấu trúc dữ liệu cơ bản: mảng, bảng băm, danh sách liên kết, cây
- Hiểu về độ phức tạp thời gian (ký hiệu Big O)
- Sự đánh đổi giữa các cấu trúc dữ liệu khác nhau
- Khi nào nên sử dụng implementation có sẵn so với tự viết
- Tác động về hiệu suất của các lựa chọn thuật toán
Tìm Kiếm Sự Cân Bằng Phù Hợp
Thay vì coi đây là lựa chọn này hay kia, nhiều developer có kinh nghiệm gợi ý rằng câu trả lời nằm ở việc hiểu mức độ kiến thức nào phù hợp cho các vai trò khác nhau. Mọi người đều cần hiểu các đánh đổi cơ bản của cấu trúc dữ liệu và đặc điểm hiệu suất, nhưng không phải ai cũng cần implement B-tree từ đầu.
Tương tự, trong khi kỹ năng testing có giá trị phổ quát, độ sâu yêu cầu khác nhau tùy theo vai trò và ngành. Phát triển phần mềm quan trọng về an toàn yêu cầu các phương pháp testing khác so với ứng dụng web thông thường.
Cuộc tranh luận cuối cùng phản ánh bản chất đa dạng của kỹ thuật phần mềm. Khi lĩnh vực tiếp tục phát triển và chuyên môn hóa, những kỹ năng quan trọng nhất có thể sẽ tiếp tục khác nhau đáng kể dựa trên lĩnh vực cụ thể và loại vấn đề được giải quyết.
Tham khảo: Testing is better than DSA