Công-Kỹ: Kiếm tông & Khí tông trong lập trình

Luận đến phái Hoa Sơn trong “Tiếu ngạo giang hồ”, võ học Hoa Sơn chia làm hai phái: Kiếm tông và Khí tông. Kiếm tông lấy ngoại công làm chủ, luyện kiếm đến mức thành thục thì nội công tăng tiến. Trong 1 thời gian ngắn có thể đạt thành tựu, khuynh đảo giang hồ. Ngược lại, Khí tông lấy khí làm gốc, luyện nội công trước rồi mới luyện kiếm. Sự tiến bộ của đệ tử Khí tông chậm hơn phái Kiếm tông. Nhưng về lâu dài, do ảnh hưởng tuổi tác, phản xạ cơ thể chậm chạp nên ngoại công Kiếm tông cũng giảm sút, ngược lại nội công Khí tông theo thời gian càng tăng tiến nên về lâu dài phái Khí tông mạnh hơn.

Công-Kỹ: Kiếm tông & Khí tông trong lập trình

Ngẫm lại, trong Lập trình chúng ta cũng có khái niệm tương tự. Tại hạ tạm gọi 2 phái này là CÔNG và KỸ.

CÔNG là công nghệ, công cụ. Gần như khi bắt đầu học Lập trình, chúng ta đều học CÔNG trước tiên. Tại hạ không thể học lập trình mà không biết một ngôn ngữ lập trình nào, tại hạ có thể không cần 1 IDE tầm cỡ Visual Studio nhưng chí ít cũng phải có 1 compiler để biên dịch mã nguồn thành mã máy. Ví dụ là một lập trình viên iOS thì tại hạ cần học Objective-C, Swift, XCode và những công cụ đi kèm. Trong bài blog này, tại hạ gọi tắt những gì liên quan đến Công cụ, Công nghệ là CÔNG.

Vậy còn KỸ. Nếu xem CÔNG như Võ Khí thì KỸ chính là Võ Thuật. Nếu CÔNG là thanh trường kiếm thì KỸ là Tịch t… nhầm, là Độc Cô Cửu Kiếm. Trong lập trình, KỸ là kỹ xảo, kỹ năng, kỹ thuật viết code ít bug, dễ đọc hiểu, dễ test, dễ mở rộng khi cần.

Cụ thể, chiếu theo định nghĩa của tại hạ thì:

Học để biết về Framework là CÔNG. Học về Design Pattern là KỸ.
Học về công cụ chạy Unit Test là CÔNG. Học để tạo ra các testable code là KỸ.
Học về cách sử dụng công cụ Debug là CÔNG. Học cách lập trình ít bug là KỸ.
Học về ngôn ngữ lập trình Java, Swift là CÔNG. Học các viết code dễ đọc hiểu, dễ bảo trì là KỸ.
Để start up 1 dự án bạn cần CÔNG hơn KỸ.
Để maintain dự án về lâu dài, bạn cần KỸ hơn CÔNG.

Vì sao mọi người thích CÔNG hơn KỸ

Ở nước ta có 1 thực tế là mọi người đặt nặng CÔNG hơn KỸ. Từ khi bước ra giang hồ, người người đều ráng học thêm nhiều CÔNG, mỗi cái 1 ít đặng list cho đầy cái CV. Tại hạ thiên tư kém cỏi mà cũng ráng list được gần chục ngôn ngữ trong cái CV đầu đời.

Đây là nguyên nhân đầu tiên tạo tiền đề cho lối mòn trong suy nghĩ: “Developer giỏi là phải am tường nhiều công nghệ, biết xài nhiều công cụ”. CV bằng hữu nào list được nhiều công nghệ nhất thì được liệt vô hàng võ lâm cao thủ. Có bận, không hiếm các ứng cử viên kê vô CV: Notepad++, Atom, SublimeText, XML, JSON,…

Học CÔNG thú vị hơn học KỸ

Cũng như Kiếm tông và Khí tông. Học Kiếm tông nhanh có thành tựu hơn Khí tông. CÔNG và KỸ cũng vậy.

Xuất sơn từ trường ĐH Sư Phạm Kỹ Thuật. Nhập môn được 2 năm thì các sư phụ truyền cho môn C++, kiếm phổ tại hạ thích nhất là của Phạm Văn Ất tiên sinh (cuốn đó tên gì quên mất rầu). Tại hạ luyện hết cuốn đó xong tìm thêm kiếm phổ Java, Javascript học tiếp. Càng học càng hăng vì học đến đâu là ứng dụng được ngay.

Đến năm thứ 3, các thầy dạy về Design Pattern, quy trình sản xuất phần mềm, phương pháp kiểm thử. Tại hạ học trong 1 sự mơ hồ “Răng phải xài mô hình Factory? răng không tạo trực tiếp cho nhanh?”, “Quy trình mần chi nhiều rứa?” Kết quả, sau các môn đó, tại hạ không nghiên cứu thêm Design Pattern nữa mà học thêm C#, PHP. Nhưng đó là khi còn chưa xuống núi, ra giang hồ chừng vài năm, ăn gió nằm sương mấy mùa, thất bại chừng vài dự án tự biết phải phải học thêm Design Pattern, đọc thêm vài cuốn sách phương pháp code để bổ sung chỗ khuyết.

Lựa chọn trường phái

Lựa chọn ở đây không phải là chỉ biết CÔNG mà không biết KỸ hay ngược lại. Lựa chọn là học cả 2 nhưng theo 1 tỉ lệ. Ví dụ, tại hạ dành 70% thời gian nghiên cứu KỸ, 30% tìm hiểu những công nghệ mới. Vì đặc thù dự án của tại hạ là 1 project dài hơi (gần 10 năm) liên tục có người đến và đi, bọn tại hạ cần 1 phương pháp code để người mới dễ tiếp cận và dễ maintain. Dự án cũng mở rộng liên tục nên cần 1 kiến trúc linh động cho sự thay đổi. Đồng thời, cũng vì là 1 dự án dài hơi, yêu cầu khách hàng cung cấp tài liệu kỹ thuật cho toàn dự án thì rất khó. Tài liệu duy nhất bọn tại hạ có là source code. Muốn biết luồng xử lý hiện tại!? Mổ xẻ source code ra mà tìm hiểu. Do đó, source code dễ đọc hiểu là tối quan trọng.

Nhưng nếu các hạ muốn dễ nhảy việc để có mức lương cao hơn. Học theo trường phái CÔNG. Các công ty start up sẵn sàng chi lương khủng cho các công nghệ mới như Ruby, Node.js, React Native,… kèm theo đó là các open source library giúp xây dựng ứng dụng nhanh hơn bao giờ hết. Các ông lớn như Apple, Google, Facebook thì đua nhau xây dựng IDE, framework hỗ trợ tối đa cho developer về thời gian và chất xám để viết app cho họ. Kết quả của cuộc chạy đua này là các kiến thức về CÔNG rất mau hết hạn. 8 năm trước, tại hạ cũng mãi mê với ActionScript vì Adobe Flash thời ấy chiếm thế thượng phong trên các trình duyệt, vì 1 phút cả tin Microsoft đã quay sang học Silverlight, để cuối cùng 2 ông này đều bị HTML5 đè bẹp.

Tạm kết

CÔNG & KỸ cũng giống Kiếm tông và Khí tông. Kiếm tông học nhanh có thành tựu nhưng càng về già thì càng đuối. Công nghệ cũng vậy, có mấy ai chạy theo công nghệ được cả đời. Nếu chỉ biết có CÔNG, khi công nghệ thay đổi thì cũng chẳng hơn gì sinh viên mới ra trường.

Khí công khô khan, khó học, nhưng càng học lâu càng ngấm. Design Pattern cũng thế, phương pháp code cũng vậy. Khi chưa ra trường, tại hạ cũng chẳng hiểu vì sao phải viết code rườm rà như rứa, sau vài năm nữa cũng chẳng khá hơn. Đến khi đã ăn đủ hành rồi thì mới ngộ ra được chân lý (xin phép trình bày cái chân lý ấy ở những bài blog sau). Trái với công nghệ, kỹ năng lập trình rất lâu hết hạn. Luyện code 10 năm chắc chắn khác hẳn với chỉ mới luyện 3 năm.

Nếu tại hạ chỉ có CÔNG mà không có KỸ, tại hạ sẽ bị đào thải khi công nghệ thay đổi mà tuổi tác đã cao. Nếu tại hạ chỉ có KỸ mà không có CÔNG, tại hạ cũng bị đào thải vì không chịu update công nghệ :( không biết xài library, công cụ để đẩy nhanh tiến độ dự án.

Theo ngu ý của tại hạ, tại hạ sẽ dành thời gian 70/30, 30% thời gian học CÔNG để tìm hiểu những công cụ, công nghệ ứng dụng được cho dự án hiện tại, đồng thời thả thính xem tình hình giang hồ chuyển biến thế nào, có công nghệ nào có thể nương tựa trong 10 năm tiếp theo không. 70% thời gian tập trung nghiên cứu design pattern, kiến trúc phần mềm để ứng dụng cho dự án hiện tại.

Xin được thỉnh giáo ý kiến các hạ…