Một ngôn ngữ mà mỗi lập trình viên đều nên trang bị
Có lẽ khi đưa ra chủ đề "Ngày nảy ngày nay - Ngôn ngữ này hay" ban tổ chức mong muốn chúng ta đề cập tới một ngôn ngữ lập trình hoặc một công nghệ mới đang được sử dụng nhiều gần đây. Hiện tại đã có hàng trăm ngôn ngữ lập trình khác nhau và hàng ngàn công nghệ mới được phát triển từng ngày.
Bản thân mình sử dụng Java là ngôn ngữ lập trình chính cùng với các công nghệ trong hệ sinh thái Spring (Spring Boot, Spring MVC, Spring Security, Spring Data...) cho các dự án hiện tại. Java ra đời cách đây 28 năm, vẫn là một trong những ngôn ngữ lập trình "hot" hiện nay, vẫn luôn tự đổi mới, nâng cấp để theo kịp thời đại.
Nhưng bài viết hôm nay mình không nói về Java hay bất cứ ngôn ngữ lập trình nào. Mình muốn cùng anh em nhìn vào một khía cạnh khác, bản chất hơn một chút thay vì đề cập tới một ngôn ngữ lập trình cụ thể. Thực ra đây là những tổng hợp của cá nhân mình, mình coi đó là một loại ngôn ngữ - ngôn ngữ để giao tiếp với các vấn đề - ngôn ngữ mang tên "TƯ DUY".
1. Tư duy chia để trị
Phổ thông mà nói thì đây là kỹ năng phân tích vấn đề nhưng đặt vào vị trí của lập trình viên (khía cạnh technical) thì đây là kỹ năng chia nhỏ đầu việc. Tức là sau khi phân tích và nắm được yêu cầu lập trình viên sẽ phải làm sao để hiện thực hóa chức năng bằng những dòng code. Đối với những chức năng nhỏ thì có thể code ngay được nhưng với những chức năng lớn buộc phải chia nhỏ vấn đề và giải quyết từng vấn đề một, đặc biệt là đối với các bạn mới.
Mình xin nhấn mạnh ở chỗ đặc biệt là đối với các bạn mới bởi vì nếu không biết chia nhỏ vấn đề các bạn sẽ rất dễ bị rối và nản khi được giao làm những task khó. Mà các bạn biết rồi đấy có làm task khó thì mới trưởng thành được. Chính mình đã bị rơi vào trường hợp này hồi còn là thực tập sinh. Mãi sau mình mới dần học hỏi được từ anh chị và các bạn khác rồi dần biết cách bóc tách vấn đề để giải quyết từng phần nhỏ trước.
2. Tư duy tổng quát
Mình vẫn nhớ anh sếp cũ từng hỏi mình:"Em biết coder với developer khác gì nhau không?". Mình bảo:"Coder kiểu chỉ biết code còn developer thì biết phân tích, trao đổi". Anh sếp bảo:"Ừ, dev nên có khả năng tư duy tổng quát nữa để có cái nhìn đa chiều, không phải tester hay BA nói gì cũng đúng, nhiều lúc mình cũng phải phân tích làm cái này có ảnh hưởng cái khác không, làm cái này có hợp lý hoặc khả thi không". Mình cười bảo:"Thế là PM (Project Manager) rồi chứ dev gì nữa nữa a". Anh sếp lại nói:"Trước anh cũng dev như em mà, cũng từ dev đi lên thôi"
Nghe đến đây mình hiểu ý của anh nên chỉ biết cười rồi gật đầu. Hiện tại tuy chưa đạt đến các vị như PM, PO hay technical leader nhưng mình vẫn luôn rèn luyện khả năng tổng quát vấn đề trong công việc. Và thực tế thì lối tư duy này đã giúp mình rất nhiều trong việc phát triển các tính năng mới, đặc biệt là ở các dự án đang maintain để không bị ảnh hưởng các chức năng cũ.
3. Tư duy hạt nhân nguyên tử
Bản chất của lối tư duy này mình muốn đề cập tới việc hãy tập trung vào những vấn đề quan trọng trước, đừng quá mất thời gian cho tiểu tiết như vậy sẽ giúp anh em mau chóng giải quyết được vấn đề hơn. Mình lấy ví dụ:
Hồi còn là sinh viên đi thực tập, có lần mình được giao chức năng làm một form đăng nhập (cả backend và frontend) cho hệ thống quản lý nội bộ của công ty. Leader cho mình tầm 2-3 ngày để hoàn thành rồi báo cáo. Nhưng mình lại giành đến hơn 1 ngày đầu để ngồi tìm kiếm form đăng nhập đẹp, ngồi CSS, thêm hiệu ứng đổi màu nút đăng nhập... Kết quả là hôm sau mình cứ loay chạy backend mà mãi không chạy được. Thấy vậy anh leader kêu người support mình và cho thêm một ngày thì cuối cùng cũng chạy được nhưng chỉ chạy được case cơ bản. Nhiều case vẫn lỗi và rồi anh leader bảo với mình như này: "Hệ thống nội bộ nên em không cần làm đẹp quá đâu, cứ chạy đúng cho anh là được"
4. Tư duy phản biện
Đối với mình tư duy phản biện chính là việc đặt câu hỏi "why". Tại sao làm chức năng này, tại sao làm thế này mà không làm thế khác. Ở góc độ nào đó thì tư duy phản biện đối với lập trình viên giống như việc làm rõ yêu cầu vậy. Không biết anh em đã bao giờ nghe về thuật ngữ gọi là XY problem chưa. XY problem nói về việc người hỏi muốn hỏi bạn về cách giải quyết vấn đề X nhưng họ lại nêu ra vấn đề Y là vấn đề họ gặp phải trong khi giải quyết vấn đề X dẫn đến bạn bị đánh lạc hướng tư duy.
Có thể các bạn không để ý nhưng chúng ta gặp trường hợp này rất nhiều. Mình lấy ví dụ để các bạn dễ hình dung, bạn được giao cài đặt Jenkins trên server và mặc định Jenkins chạy ở port 8080. Khi cài đặt xong rồi bạn mới phát hiện port 8080 đã được sử dụng. Bạn nảy ra ý tưởng tại sao mình không tắt port 8080 đi và thế là Jenkins sẽ chạy được. Nhưng giả sử bạn lại không biết làm sao tắt port 8080 và thế là bạn đi hỏi anh đồng nghiệp làm sao tắt port 8080 thay vì đi hỏi vấn đề gốc là làm sao đổi được port 8080 mặc định của Jenkins.
Đó lúc này nếu anh đồng nghiệp có tư duy phản biện và biết đặt câu hỏi:"Tắt port 8080 để làm gì và tại sao thay vì tắt port 8080 thì không thử đổi port mặc định của Jenkins sang port khác" là vấn đề được giải quyết.
5. Tư duy logic
Đúng rồi, nếu là lập trình viên thì tư duy logic là rất cần thiết để viết ra được những dòng code "xịn". Logic ở đây không đơn thuần là logic code mà còn là logic nghiệp vụ. Các dự án mình làm từng có những dự án có những function dài đến cả nghìn dòng. Mình không khen code dài là hay mà ngược lại nó còn rất tệ, đặc biệt là trong việc xử lý logic nghiệp vụ.
Vậy làm sao để cải thiện tư duy logic? Thứ nhất, về logic code các bạn nên nắm chắc từ những kiến thức cơ bản nhất ví dụ như if khác với if else như thế nào, cách kết hợp các toán tử logic như || hay && ra sao... Sau đó sâu hơn thì có thể nghiên cứu các design patterns để áp dụng. Còn về logic nghiệp vụ thì đầu tiên các bạn phải thật clear nghiệp vụ, hiểu rõ tại sao sinh ra chức năng đó, chức năng đó dùng làm gì, triển khai (code) chức năng đó ảnh hưởng thế nào đến các chức năng khác, khi code phải chia ra các step (luồng xử lý) theo nghiệp vụ. Có vậy thì dần dần tư duy logic của các bạn sẽ được cải thiện rất nhiều.
6. Tư duy sai phải nhớ sửa
Bố mình là một thợ mộc chuyên chế tác ra các sản phẩm gỗ mỹ nghệ. Bố kể trước khi làm được như bây giờ ngày trước bố cũng phải đi "học lỏm" của nhiều người khác, làm hỏng rất nhiều sản phẩm nhưng quan trọng là sau mỗi lần sai phải rút ra bài học và nhớ sửa để lần sau làm tốt hơn.
Là một lập trình viên cũng vậy, mình chia sẻ với các bạn một vài tips như này. Đôi khi các bạn nên chủ động nhờ leader hoặc bất cứ ai giỏi về kỹ thuật làm một việc gì đó. Trong lúc họ làm hãy kéo ghế ngồi cạnh trao đổi và xem cách họ làm rồi học hỏi.
Ví dụ trước đây mình chưa từng làm việc với Oracle database nhưng khi vào công ty mới thì dự án sử dụng database này. Tất nhiên mình cũng phải học nhưng thi thoảng mình hay nhờ anh leader xem lại và tối ưu câu SQL cho mình. Trong lúc anh ngồi review thì mình ngồi hóng bên cạnh và vỡ ra được nhiều kiến thức rất hay.
Hoặc có một lần mình sửa nhầm file cấu hình ở môi trường product dẫn đến hệ thống bị lỗi và khách hàng claim. Từ lần đó về sau bất cứ khi nào sửa các nội dung liên quan đến file cấu hình mình đều soát rất kỹ trước khi đẩy code lên server.
7. Tư duy I CAN DO IT và I CAN DO IT BETTER
Cuối cùng, mình muốn truyền tải đến anh em và các bạn thông điệp hãy luôn tin là mình có thể làm được và làm tốt hơn. Tất nhiên ở góc độ kỹ thuật hay nghiệp vụ còn rất nhiều yếu tố quyết định tính khả thi của một dự án hay nhỏ hơn là một chức năng. Nhưng ở yếu tố con người mình tin đây là lối tư duy sẽ giúp chúng ta hoàn thiện và trưởng thành hơn rất nhiều.
Cá nhân mình cũng từng nghĩ không phù hợp để làm một lập trình viên nhưng nghề chọn người anh em ạ. Bằng sự kiên trì và may mắn mình đã gặp được những con người, dự án giúp mình định hình lại tư duy và tiếp tục theo đuổi cái nghề được gọi là "vua của mọi nghề này". Anh em và các bạn có thể đọc về hành trình đó của mình tại đây - cũng là một bài viết thuộc khuôn khổ của cuộc thi.
Lời kết:
Hi vọng bài viết mang đến cho anh em cũng như các bạn những giá trị nhất định. Một lần nữa nếu như ngôn ngữ lập trình giúp lập trình viên giao tiếp với máy tính thì tư duy là ngôn ngữ giúp lập trình viên giao tiếp với các vấn đề. Trước hết là các vấn đề kỹ thuật rộng hơn là các vấn đề trong cuộc sống.
Cảm ơn anh em và các bạn đã theo dõi bài viết của mình!
Bản thân mình sử dụng Java là ngôn ngữ lập trình chính cùng với các công nghệ trong hệ sinh thái Spring (Spring Boot, Spring MVC, Spring Security, Spring Data...) cho các dự án hiện tại. Java ra đời cách đây 28 năm, vẫn là một trong những ngôn ngữ lập trình "hot" hiện nay, vẫn luôn tự đổi mới, nâng cấp để theo kịp thời đại.
Nhưng bài viết hôm nay mình không nói về Java hay bất cứ ngôn ngữ lập trình nào. Mình muốn cùng anh em nhìn vào một khía cạnh khác, bản chất hơn một chút thay vì đề cập tới một ngôn ngữ lập trình cụ thể. Thực ra đây là những tổng hợp của cá nhân mình, mình coi đó là một loại ngôn ngữ - ngôn ngữ để giao tiếp với các vấn đề - ngôn ngữ mang tên "TƯ DUY".
1. Tư duy chia để trị
Phổ thông mà nói thì đây là kỹ năng phân tích vấn đề nhưng đặt vào vị trí của lập trình viên (khía cạnh technical) thì đây là kỹ năng chia nhỏ đầu việc. Tức là sau khi phân tích và nắm được yêu cầu lập trình viên sẽ phải làm sao để hiện thực hóa chức năng bằng những dòng code. Đối với những chức năng nhỏ thì có thể code ngay được nhưng với những chức năng lớn buộc phải chia nhỏ vấn đề và giải quyết từng vấn đề một, đặc biệt là đối với các bạn mới.
Mình xin nhấn mạnh ở chỗ đặc biệt là đối với các bạn mới bởi vì nếu không biết chia nhỏ vấn đề các bạn sẽ rất dễ bị rối và nản khi được giao làm những task khó. Mà các bạn biết rồi đấy có làm task khó thì mới trưởng thành được. Chính mình đã bị rơi vào trường hợp này hồi còn là thực tập sinh. Mãi sau mình mới dần học hỏi được từ anh chị và các bạn khác rồi dần biết cách bóc tách vấn đề để giải quyết từng phần nhỏ trước.
Mình vẫn nhớ anh sếp cũ từng hỏi mình:"Em biết coder với developer khác gì nhau không?". Mình bảo:"Coder kiểu chỉ biết code còn developer thì biết phân tích, trao đổi". Anh sếp bảo:"Ừ, dev nên có khả năng tư duy tổng quát nữa để có cái nhìn đa chiều, không phải tester hay BA nói gì cũng đúng, nhiều lúc mình cũng phải phân tích làm cái này có ảnh hưởng cái khác không, làm cái này có hợp lý hoặc khả thi không". Mình cười bảo:"Thế là PM (Project Manager) rồi chứ dev gì nữa nữa a". Anh sếp lại nói:"Trước anh cũng dev như em mà, cũng từ dev đi lên thôi"
Nghe đến đây mình hiểu ý của anh nên chỉ biết cười rồi gật đầu. Hiện tại tuy chưa đạt đến các vị như PM, PO hay technical leader nhưng mình vẫn luôn rèn luyện khả năng tổng quát vấn đề trong công việc. Và thực tế thì lối tư duy này đã giúp mình rất nhiều trong việc phát triển các tính năng mới, đặc biệt là ở các dự án đang maintain để không bị ảnh hưởng các chức năng cũ.
3. Tư duy hạt nhân nguyên tử
Bản chất của lối tư duy này mình muốn đề cập tới việc hãy tập trung vào những vấn đề quan trọng trước, đừng quá mất thời gian cho tiểu tiết như vậy sẽ giúp anh em mau chóng giải quyết được vấn đề hơn. Mình lấy ví dụ:
Hồi còn là sinh viên đi thực tập, có lần mình được giao chức năng làm một form đăng nhập (cả backend và frontend) cho hệ thống quản lý nội bộ của công ty. Leader cho mình tầm 2-3 ngày để hoàn thành rồi báo cáo. Nhưng mình lại giành đến hơn 1 ngày đầu để ngồi tìm kiếm form đăng nhập đẹp, ngồi CSS, thêm hiệu ứng đổi màu nút đăng nhập... Kết quả là hôm sau mình cứ loay chạy backend mà mãi không chạy được. Thấy vậy anh leader kêu người support mình và cho thêm một ngày thì cuối cùng cũng chạy được nhưng chỉ chạy được case cơ bản. Nhiều case vẫn lỗi và rồi anh leader bảo với mình như này: "Hệ thống nội bộ nên em không cần làm đẹp quá đâu, cứ chạy đúng cho anh là được"
4. Tư duy phản biện
Đối với mình tư duy phản biện chính là việc đặt câu hỏi "why". Tại sao làm chức năng này, tại sao làm thế này mà không làm thế khác. Ở góc độ nào đó thì tư duy phản biện đối với lập trình viên giống như việc làm rõ yêu cầu vậy. Không biết anh em đã bao giờ nghe về thuật ngữ gọi là XY problem chưa. XY problem nói về việc người hỏi muốn hỏi bạn về cách giải quyết vấn đề X nhưng họ lại nêu ra vấn đề Y là vấn đề họ gặp phải trong khi giải quyết vấn đề X dẫn đến bạn bị đánh lạc hướng tư duy.
Có thể các bạn không để ý nhưng chúng ta gặp trường hợp này rất nhiều. Mình lấy ví dụ để các bạn dễ hình dung, bạn được giao cài đặt Jenkins trên server và mặc định Jenkins chạy ở port 8080. Khi cài đặt xong rồi bạn mới phát hiện port 8080 đã được sử dụng. Bạn nảy ra ý tưởng tại sao mình không tắt port 8080 đi và thế là Jenkins sẽ chạy được. Nhưng giả sử bạn lại không biết làm sao tắt port 8080 và thế là bạn đi hỏi anh đồng nghiệp làm sao tắt port 8080 thay vì đi hỏi vấn đề gốc là làm sao đổi được port 8080 mặc định của Jenkins.
Đó lúc này nếu anh đồng nghiệp có tư duy phản biện và biết đặt câu hỏi:"Tắt port 8080 để làm gì và tại sao thay vì tắt port 8080 thì không thử đổi port mặc định của Jenkins sang port khác" là vấn đề được giải quyết.
5. Tư duy logic
Đúng rồi, nếu là lập trình viên thì tư duy logic là rất cần thiết để viết ra được những dòng code "xịn". Logic ở đây không đơn thuần là logic code mà còn là logic nghiệp vụ. Các dự án mình làm từng có những dự án có những function dài đến cả nghìn dòng. Mình không khen code dài là hay mà ngược lại nó còn rất tệ, đặc biệt là trong việc xử lý logic nghiệp vụ.
Vậy làm sao để cải thiện tư duy logic? Thứ nhất, về logic code các bạn nên nắm chắc từ những kiến thức cơ bản nhất ví dụ như if khác với if else như thế nào, cách kết hợp các toán tử logic như || hay && ra sao... Sau đó sâu hơn thì có thể nghiên cứu các design patterns để áp dụng. Còn về logic nghiệp vụ thì đầu tiên các bạn phải thật clear nghiệp vụ, hiểu rõ tại sao sinh ra chức năng đó, chức năng đó dùng làm gì, triển khai (code) chức năng đó ảnh hưởng thế nào đến các chức năng khác, khi code phải chia ra các step (luồng xử lý) theo nghiệp vụ. Có vậy thì dần dần tư duy logic của các bạn sẽ được cải thiện rất nhiều.
Bố mình là một thợ mộc chuyên chế tác ra các sản phẩm gỗ mỹ nghệ. Bố kể trước khi làm được như bây giờ ngày trước bố cũng phải đi "học lỏm" của nhiều người khác, làm hỏng rất nhiều sản phẩm nhưng quan trọng là sau mỗi lần sai phải rút ra bài học và nhớ sửa để lần sau làm tốt hơn.
Là một lập trình viên cũng vậy, mình chia sẻ với các bạn một vài tips như này. Đôi khi các bạn nên chủ động nhờ leader hoặc bất cứ ai giỏi về kỹ thuật làm một việc gì đó. Trong lúc họ làm hãy kéo ghế ngồi cạnh trao đổi và xem cách họ làm rồi học hỏi.
Ví dụ trước đây mình chưa từng làm việc với Oracle database nhưng khi vào công ty mới thì dự án sử dụng database này. Tất nhiên mình cũng phải học nhưng thi thoảng mình hay nhờ anh leader xem lại và tối ưu câu SQL cho mình. Trong lúc anh ngồi review thì mình ngồi hóng bên cạnh và vỡ ra được nhiều kiến thức rất hay.
Hoặc có một lần mình sửa nhầm file cấu hình ở môi trường product dẫn đến hệ thống bị lỗi và khách hàng claim. Từ lần đó về sau bất cứ khi nào sửa các nội dung liên quan đến file cấu hình mình đều soát rất kỹ trước khi đẩy code lên server.
7. Tư duy I CAN DO IT và I CAN DO IT BETTER
Cuối cùng, mình muốn truyền tải đến anh em và các bạn thông điệp hãy luôn tin là mình có thể làm được và làm tốt hơn. Tất nhiên ở góc độ kỹ thuật hay nghiệp vụ còn rất nhiều yếu tố quyết định tính khả thi của một dự án hay nhỏ hơn là một chức năng. Nhưng ở yếu tố con người mình tin đây là lối tư duy sẽ giúp chúng ta hoàn thiện và trưởng thành hơn rất nhiều.
Cá nhân mình cũng từng nghĩ không phù hợp để làm một lập trình viên nhưng nghề chọn người anh em ạ. Bằng sự kiên trì và may mắn mình đã gặp được những con người, dự án giúp mình định hình lại tư duy và tiếp tục theo đuổi cái nghề được gọi là "vua của mọi nghề này". Anh em và các bạn có thể đọc về hành trình đó của mình tại đây - cũng là một bài viết thuộc khuôn khổ của cuộc thi.
Lời kết:
Hi vọng bài viết mang đến cho anh em cũng như các bạn những giá trị nhất định. Một lần nữa nếu như ngôn ngữ lập trình giúp lập trình viên giao tiếp với máy tính thì tư duy là ngôn ngữ giúp lập trình viên giao tiếp với các vấn đề. Trước hết là các vấn đề kỹ thuật rộng hơn là các vấn đề trong cuộc sống.
Cảm ơn anh em và các bạn đã theo dõi bài viết của mình!
Feedback