Code Refactoring (Tái cấu trúc mã nguồn) là những kỹ thuật sắp xếp lại mã nguồn để chúng trở nên tốt hơn mà không làm ảnh hưởng tới hành vi của hệ thống đối với bên ngoài. Có rất nhiều kỹ thuật refactoring khác nhau, mỗi kỹ thuật đôi khi chỉ làm thay đổi một chút nho nhỏ mã nguồn, nhưng những thay đổi nhỏ đó được tích luỹ dần theo thời gian thì tạo nên một ảnh hưởng rất lớn, giúp cho hệ thống của chúng ta trở nên tốt hơn.
“Tốt” hơn nghĩa là thế nào? Nghĩa là chúng sẽ “clean” hơn và “SOLID” hơn.
Refactoring là một trong các nhóm kỹ thuật có liên quan đến nhau và ảnh hưởng đến nhau, bao gồm kiểm thử tự động, TDD, clean code, design pattern… và đều tuân thủ các nguyên lý quan trọng về thiết kế phần mềm.
Chủ đề Live Stream lần này về Code Refactoring sẽ đề cập đến ý nghĩa của refactoring, các kỹ thuật refactoring thông dụng và ứng dụng của chúng trong thực tế. Phiên demo sẽ có các hướng dẫn về việc sử dụng các công cụ để thực hiện các kỹ thuật refactoring và giải thích cụ thể lợi ích của chúng. Nếu bạn đã nghe về Clean Code, SOLID, Design Pattern thì phiên Live Stream lần này là một dịp không thể bỏ qua để hoàn thiện hơn nhóm các kỹ thuật quan trọng này.
Lập trình viên hiện đại, không chỉ cần biết viết mã, mà còn phải làm chủ rất nhiều các kỹ năng khác, chẳng hạn như phân tích, thiết kế, giao tiếp, vận hành… và kể cả kiểm thử. Tại sao lại như thế? LiveStream lần này sẽ đề cập đến một chuyên môn có vẻ là mới mẻ đối với những người mới học lập trình, nhưng thực ra nó đã và đang trở thành một kỹ năng “cứng” đối với các lập trình viên hiện đại.
Cũng giống như trước đây, sử dụng được tiếng Anh là có thể kiếm cơm bằng một nghề nào đó liên quan đến kỹ năng này, còn bây giờ thì sử dụng được tiếng Anh là một trong những kỹ năng bắt buộc đối với phần lớn nhân viên văn phòng, và kể cả với Lập trình viên. Kỹ năng kiểm thử cũng như thế, để làm việc được trong các dự án tốt ngày nay, Lập trình viên chắc chắn phải làm chủ được kỹ năng quan trọng liên quan đến kiểm thử, đặc biệt là kiểm thử tự động và TDD.
Tất nhiên, Lập trình viên sẽ không thay thế Kiểm thử viên, hay nói cách khác, Kiểm thử viên sẽ không thất nghiệp. Vậy với tư cách là một lập trình viên, chúng ta sẽ làm những công việc gì, để đạt được những mục đích gì liên quan đến kiểm thử và chất lượng phần mềm? Hẹn gặp mọi người trong phiên LiveStream: Automation Testing & TDD.
Design Pattern - Những công thức vàng trong thiết kếNhật Nguyễn Khắc
Link video: https://www.youtube.com/watch?v=VbOJrq71lVA
Chúng ta đã bàn về Clean Code và SOLID, đã biết về các lợi ích của chúng. Câu hỏi quan trọng còn lại là:
Làm thế nào để có Clean Code và SOLID?
Câu trả lời sẽ liên quan đến nhiều yếu tố khác nhau, bao gồm cả văn hoá, thói quen, trình độ năng lực, các kỹ thuật và công cụ..., và trong đó một yếu tốt rất quan trọng là chúng ta cần sử dụng tốt Design Pattern.
Design Pattern là các giải pháp tổng quát có thể tái sử dụng cho các trường hợp thường gặp khi thiết kế kiến trúc phần mềm.
Một số lợi ích của Design Pattern có thể kể đến như:
- Đẩy nhanh tốc độ thiết kế và phát triển phần mềm
- Chất lượng của giải pháp đã được minh chứng
- Ngăn ngừa các vấn đề phát sinh nếu thiết kế không tốt
- Có thể áp dụng cho rất nhiều tình huống khác nhau
- Dễ dàng cộng tác, chia sẻ thiết kế và mã nguồn giữa các bên.
Trong phiên Livestream về chủ đề Design Pattern, chúng ta sẽ bàn kỹ hơn về khái niệm quan trọng này, các ý nghĩa của nó, điểm qua các Design Pattern được sử dụng phổ biến và đồng thời xem xét một số ứng dụng của Design Pattern trong các tình huống thực tế.
Đối với bất cứ việc gì, nếu có cách làm tốt thì hiệu quả sẽ cao, ngược lại thì sẽ rất vất vả. Việc học nói chung, và việc học lập trình nói riêng cũng vậy. Nếu không biết cách học, chúng ta sẽ rất vất vả, lâu đạt được thành quả, mất động lực, không hạnh phúc, không tự tin, hoang mang, nản lòng và thậm chí là bỏ cuộc.
Kỹ năng học là một kỹ năng cực kỳ quan trọng, rất tiếc, rất nhiều học sinh và sinh viên hiện tại không biết cách học. Học lập trình thì còn đòi hỏi thêm nhiều kỹ năng đặc thù khác nữa, nhưng hiện tại lại có rất ít sách vở hoặc các kênh khác đề cập đến chủ đề này một cách bài bản.
Live Stream lần này sẽ đề cập đến nhiều nội dung liên quan đến nguyên lí, phương pháp và hướng dẫn để các bạn đang học lập trình có thể áp dụng ngay và nâng cao hiệu quả học tập nhằm có được sự tiến bộ nhanh chóng. Một số nội dung bao gồm: Học kiến thức, Rèn luyện kỹ năng, Rèn luyện thái độ, Rèn luyện thói quen, và một số các cách làm hay để duy trì động lực học tập. Live Stream cũng sẽ dành một khoảng thời gian để các thành viên có thể trao đổi, chia sẻ và nhận được các lời khuyên hữu ích về cách xử lý các tình huống trong quá trình học tập, và đồng thời có các định hướng học tập và nghề nghiệp đối với các bạn trẻ đang chưa định hình được rõ ràng lộ trình của mình.
Tại sao chúng ta lại cần Lập trình Hướng Đối tượng? Mô hình Hướng Đối tượng thì giải quyết những vấn đề gì? Thế nào là một thiết kế Hướng Đối tượng tốt? Chúng ta cần phải làm gì để có một thiết kế tốt? Tất cả những câu hỏi này sẽ được đề cập trong Live Stream “SOLID – Những nguyên lí sống còn”.
SOLID là bộ 5 nguyên lí thiết yếu mà bậc thầy lập trình Robert C. Martin khuyến nghị và cổ suý. SOLID vừa là chuẩn mực, vừa là mục đích mà các lập trình viên hướng đến. Hiểu được các nguyên lí này đã không phải là chuyện dễ, hiện thực được chúng trong các hệ thống lại càng khó hơn. Trong Live Stream này, chúng ta cũng sẽ bàn đến mối quan hệ giữa các khái niệm và kỹ thuật như: SOLID, Design Pattern, Refactoring, Clean Code, Automation Test... tất cả những khái niệm này, tưởng chừng như rời rạc, nhưng thực ra lại có mối quan hệ gắn bó rất mật thiết. Mỗi khái niệm, kỹ thuật đều có mục đích và nhiệm vụ riêng của nó, đóng góp chung vào chất lượng của sản phẩm.
Học lập trình là học gì? Đây là câu hỏi mà gần như ai quan tâm đến ngành nghề này đều đã từng đặt ra và cố công tìm kiếm câu trả lời ở đâu đó.
Nhưng không dễ để có được một câu trả lời đầy đủ và dễ hiểu nếu không có được góc nhìn từ nhiều khía cạnh, nhất là từ khía cạnh kỹ thuật, học thuật và học tập. Đối với những người mới bắt đầu tìm hiểu thì lại càng "loạn" hơn nữa, bởi vì bạn tiếp nhận quá nhiều luồng thông tin và ý kiến khác nhau, chẳng hạn như:
* Học lập trình thì cần phải giỏi toán
* Phải rành về máy tính thì mới học được
* Phải đam mê công nghệ thì mới học được
* Phải học thật nhiều thuật toán
* Phải học tư duy lập trình
* Phải lựa chọn ngôn ngữ lập trình hot mà học
* Phải lựa chọn framework hot để mà học
* Phải học kỹ năng mềm thì mới đi làm được
* v.v...
Phiên livestream này được tổ chức dành riêng cho những người mới bắt đầu học lập trình hoặc đang tìm hiểu về ngành nghề lập trình để giúp mọi người dễ nắm bắt nhất những thứ mà một người cần phải học và rèn luyện để trở thành một lập trình viên.
Nội dung trao đổi trong phiên livestream bao gồm:
* Bộ năng lực của lập trình viên từ góc nhìn của doanh nghiệp (học gì để làm được việc)
* Bộ năng lực của lập trình viên từ góc nhìn của cá nhân người học (học gì để có thể phát triển bền vững lâu dài)
* Bộ năng lực của lập trình viên từ góc nhìn của những người làm đào tạo (học gì cho hiệu quả tốt nhất)
* Lộ trình học tập cho người mới bắt đầu
* Các khó khăn mà người mới bắt đầu có thể gặp phải
* Các lời khuyên dành cho người mới bắt đầu
* Hỏi & Đáp giữa những người tham gia và diễn giả
Code Refactoring (Tái cấu trúc mã nguồn) là những kỹ thuật sắp xếp lại mã nguồn để chúng trở nên tốt hơn mà không làm ảnh hưởng tới hành vi của hệ thống đối với bên ngoài. Có rất nhiều kỹ thuật refactoring khác nhau, mỗi kỹ thuật đôi khi chỉ làm thay đổi một chút nho nhỏ mã nguồn, nhưng những thay đổi nhỏ đó được tích luỹ dần theo thời gian thì tạo nên một ảnh hưởng rất lớn, giúp cho hệ thống của chúng ta trở nên tốt hơn.
“Tốt” hơn nghĩa là thế nào? Nghĩa là chúng sẽ “clean” hơn và “SOLID” hơn.
Refactoring là một trong các nhóm kỹ thuật có liên quan đến nhau và ảnh hưởng đến nhau, bao gồm kiểm thử tự động, TDD, clean code, design pattern… và đều tuân thủ các nguyên lý quan trọng về thiết kế phần mềm.
Chủ đề Live Stream lần này về Code Refactoring sẽ đề cập đến ý nghĩa của refactoring, các kỹ thuật refactoring thông dụng và ứng dụng của chúng trong thực tế. Phiên demo sẽ có các hướng dẫn về việc sử dụng các công cụ để thực hiện các kỹ thuật refactoring và giải thích cụ thể lợi ích của chúng. Nếu bạn đã nghe về Clean Code, SOLID, Design Pattern thì phiên Live Stream lần này là một dịp không thể bỏ qua để hoàn thiện hơn nhóm các kỹ thuật quan trọng này.
Lập trình viên hiện đại, không chỉ cần biết viết mã, mà còn phải làm chủ rất nhiều các kỹ năng khác, chẳng hạn như phân tích, thiết kế, giao tiếp, vận hành… và kể cả kiểm thử. Tại sao lại như thế? LiveStream lần này sẽ đề cập đến một chuyên môn có vẻ là mới mẻ đối với những người mới học lập trình, nhưng thực ra nó đã và đang trở thành một kỹ năng “cứng” đối với các lập trình viên hiện đại.
Cũng giống như trước đây, sử dụng được tiếng Anh là có thể kiếm cơm bằng một nghề nào đó liên quan đến kỹ năng này, còn bây giờ thì sử dụng được tiếng Anh là một trong những kỹ năng bắt buộc đối với phần lớn nhân viên văn phòng, và kể cả với Lập trình viên. Kỹ năng kiểm thử cũng như thế, để làm việc được trong các dự án tốt ngày nay, Lập trình viên chắc chắn phải làm chủ được kỹ năng quan trọng liên quan đến kiểm thử, đặc biệt là kiểm thử tự động và TDD.
Tất nhiên, Lập trình viên sẽ không thay thế Kiểm thử viên, hay nói cách khác, Kiểm thử viên sẽ không thất nghiệp. Vậy với tư cách là một lập trình viên, chúng ta sẽ làm những công việc gì, để đạt được những mục đích gì liên quan đến kiểm thử và chất lượng phần mềm? Hẹn gặp mọi người trong phiên LiveStream: Automation Testing & TDD.
Design Pattern - Những công thức vàng trong thiết kếNhật Nguyễn Khắc
Link video: https://www.youtube.com/watch?v=VbOJrq71lVA
Chúng ta đã bàn về Clean Code và SOLID, đã biết về các lợi ích của chúng. Câu hỏi quan trọng còn lại là:
Làm thế nào để có Clean Code và SOLID?
Câu trả lời sẽ liên quan đến nhiều yếu tố khác nhau, bao gồm cả văn hoá, thói quen, trình độ năng lực, các kỹ thuật và công cụ..., và trong đó một yếu tốt rất quan trọng là chúng ta cần sử dụng tốt Design Pattern.
Design Pattern là các giải pháp tổng quát có thể tái sử dụng cho các trường hợp thường gặp khi thiết kế kiến trúc phần mềm.
Một số lợi ích của Design Pattern có thể kể đến như:
- Đẩy nhanh tốc độ thiết kế và phát triển phần mềm
- Chất lượng của giải pháp đã được minh chứng
- Ngăn ngừa các vấn đề phát sinh nếu thiết kế không tốt
- Có thể áp dụng cho rất nhiều tình huống khác nhau
- Dễ dàng cộng tác, chia sẻ thiết kế và mã nguồn giữa các bên.
Trong phiên Livestream về chủ đề Design Pattern, chúng ta sẽ bàn kỹ hơn về khái niệm quan trọng này, các ý nghĩa của nó, điểm qua các Design Pattern được sử dụng phổ biến và đồng thời xem xét một số ứng dụng của Design Pattern trong các tình huống thực tế.
Đối với bất cứ việc gì, nếu có cách làm tốt thì hiệu quả sẽ cao, ngược lại thì sẽ rất vất vả. Việc học nói chung, và việc học lập trình nói riêng cũng vậy. Nếu không biết cách học, chúng ta sẽ rất vất vả, lâu đạt được thành quả, mất động lực, không hạnh phúc, không tự tin, hoang mang, nản lòng và thậm chí là bỏ cuộc.
Kỹ năng học là một kỹ năng cực kỳ quan trọng, rất tiếc, rất nhiều học sinh và sinh viên hiện tại không biết cách học. Học lập trình thì còn đòi hỏi thêm nhiều kỹ năng đặc thù khác nữa, nhưng hiện tại lại có rất ít sách vở hoặc các kênh khác đề cập đến chủ đề này một cách bài bản.
Live Stream lần này sẽ đề cập đến nhiều nội dung liên quan đến nguyên lí, phương pháp và hướng dẫn để các bạn đang học lập trình có thể áp dụng ngay và nâng cao hiệu quả học tập nhằm có được sự tiến bộ nhanh chóng. Một số nội dung bao gồm: Học kiến thức, Rèn luyện kỹ năng, Rèn luyện thái độ, Rèn luyện thói quen, và một số các cách làm hay để duy trì động lực học tập. Live Stream cũng sẽ dành một khoảng thời gian để các thành viên có thể trao đổi, chia sẻ và nhận được các lời khuyên hữu ích về cách xử lý các tình huống trong quá trình học tập, và đồng thời có các định hướng học tập và nghề nghiệp đối với các bạn trẻ đang chưa định hình được rõ ràng lộ trình của mình.
Tại sao chúng ta lại cần Lập trình Hướng Đối tượng? Mô hình Hướng Đối tượng thì giải quyết những vấn đề gì? Thế nào là một thiết kế Hướng Đối tượng tốt? Chúng ta cần phải làm gì để có một thiết kế tốt? Tất cả những câu hỏi này sẽ được đề cập trong Live Stream “SOLID – Những nguyên lí sống còn”.
SOLID là bộ 5 nguyên lí thiết yếu mà bậc thầy lập trình Robert C. Martin khuyến nghị và cổ suý. SOLID vừa là chuẩn mực, vừa là mục đích mà các lập trình viên hướng đến. Hiểu được các nguyên lí này đã không phải là chuyện dễ, hiện thực được chúng trong các hệ thống lại càng khó hơn. Trong Live Stream này, chúng ta cũng sẽ bàn đến mối quan hệ giữa các khái niệm và kỹ thuật như: SOLID, Design Pattern, Refactoring, Clean Code, Automation Test... tất cả những khái niệm này, tưởng chừng như rời rạc, nhưng thực ra lại có mối quan hệ gắn bó rất mật thiết. Mỗi khái niệm, kỹ thuật đều có mục đích và nhiệm vụ riêng của nó, đóng góp chung vào chất lượng của sản phẩm.
Học lập trình là học gì? Đây là câu hỏi mà gần như ai quan tâm đến ngành nghề này đều đã từng đặt ra và cố công tìm kiếm câu trả lời ở đâu đó.
Nhưng không dễ để có được một câu trả lời đầy đủ và dễ hiểu nếu không có được góc nhìn từ nhiều khía cạnh, nhất là từ khía cạnh kỹ thuật, học thuật và học tập. Đối với những người mới bắt đầu tìm hiểu thì lại càng "loạn" hơn nữa, bởi vì bạn tiếp nhận quá nhiều luồng thông tin và ý kiến khác nhau, chẳng hạn như:
* Học lập trình thì cần phải giỏi toán
* Phải rành về máy tính thì mới học được
* Phải đam mê công nghệ thì mới học được
* Phải học thật nhiều thuật toán
* Phải học tư duy lập trình
* Phải lựa chọn ngôn ngữ lập trình hot mà học
* Phải lựa chọn framework hot để mà học
* Phải học kỹ năng mềm thì mới đi làm được
* v.v...
Phiên livestream này được tổ chức dành riêng cho những người mới bắt đầu học lập trình hoặc đang tìm hiểu về ngành nghề lập trình để giúp mọi người dễ nắm bắt nhất những thứ mà một người cần phải học và rèn luyện để trở thành một lập trình viên.
Nội dung trao đổi trong phiên livestream bao gồm:
* Bộ năng lực của lập trình viên từ góc nhìn của doanh nghiệp (học gì để làm được việc)
* Bộ năng lực của lập trình viên từ góc nhìn của cá nhân người học (học gì để có thể phát triển bền vững lâu dài)
* Bộ năng lực của lập trình viên từ góc nhìn của những người làm đào tạo (học gì cho hiệu quả tốt nhất)
* Lộ trình học tập cho người mới bắt đầu
* Các khó khăn mà người mới bắt đầu có thể gặp phải
* Các lời khuyên dành cho người mới bắt đầu
* Hỏi & Đáp giữa những người tham gia và diễn giả
69 câu hỏi phỏng vấn kỹ sư Công nghệ Thông tinVu Hung Nguyen
Bộ 69 câu hỏi phỏng vấn giành cho kỹ sư công nghệ thông tin.
Đối tượng hưởng lợi:
- Người đi phỏng vấn: Biết được những câu hay bị hỏi
- Người phỏng vấn: Có một bộ câu hỏi phỏng vấn cơ bản làm cơ sở
Vietnamese version translated from this famous slide
http://www.slideshare.net/nbykmatsui/ss-55961899?utm_content=buffer50ae1&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer
69 câu hỏi phỏng vấn kỹ sư Công nghệ Thông tinVu Hung Nguyen
Bộ 69 câu hỏi phỏng vấn giành cho kỹ sư công nghệ thông tin.
Đối tượng hưởng lợi:
- Người đi phỏng vấn: Biết được những câu hay bị hỏi
- Người phỏng vấn: Có một bộ câu hỏi phỏng vấn cơ bản làm cơ sở
Vietnamese version translated from this famous slide
http://www.slideshare.net/nbykmatsui/ss-55961899?utm_content=buffer50ae1&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer
Khóa học lập trình Zend Framework của ZendVN là một khóa học về PHP framework nâng cao và chuyên sâu. Sau khi hoàn tất khóa học này các bạn sẽ có một nền tảng vững chắc về lập trình hướng đối tượng PHP, hiểu được cấu trúc mô hình MVC trong các PHP framework hiện nay, hiểu rõ về các thư viện trong Zend Framework và có thể tự nghiên cứu các thư viện PHP framework bất kỳ dựa trên nền tảng của khóa học Zend Framework.
2. Mục đích
● Do lúc review code, cảm thấy người kế tiếp khó phát triển tiếp nên đọc sách này để tìm ý tưởng
● Đây là phần tóm tắt lại sách “Clean Code: A Handbook of Agile Software Craftmanship”
○ Bạn dễ dàng đọc lại code do chính mình viết sau một quãng thời gian
○ Mọi người dễ nắm công việc của bạn
○ Sản phẩm dễ dàng thêm chức năng mới, chỉnh sửa theo yêu cầu và bảo trì
○ Trông rất ngầu!
4. Nguyên tắc 5S
● Phương pháp được phát triển bởi Nhật Bản
● Nội dung:
○ Seiri (Sort – Sàng lọc): Xác định và phân loại
○ Seiton (Systemmatize – Sắp xếp): Sắp xếp, bố trí lại để dễ dàng tìm kiếm
○ Seiso (Shine – Sạch sẽ): Giữ cho nơi làm việc gọn gàng
○ Seiketsu (Standardization): Duy trì tiêu chuẩn về sạch sẽ và ngăn nắp
○ Shutsuke (Self-discipline): Hình thành thói quen và thực hành
5. Nguyên tắc 5S dành cho Developer
● Nguyên tắc này do Robert C. Martin (Uncle Bob) trong “Clean Code” đề xuất:
○ Seiri (Sort – Sàng lọc): Đặt tên biến, class, hàm rõ ràng, dễ hiểu
○ Seiton (Systemmatize – Sắp xếp): Cấu trúc rõ ràng, để dễ dàng tra lại đoạn code cần tìm
○ Seiso (Shine – Sạch sẽ): Không xả rác trong code, nhất là những đoạn code không dùng
○ Seiketsu (Standardization): Luôn chuẩn hoá code theo coding convention
○ Shutsuke (Self-discipline): Luôn có ý thức thực hành nghiêm túc, sẵn sàng đối mặt với sự thay đổi
7. Cách đặt tên biến
● Đặt tên rõ ràng, không dùng ký tự viết tắt
○ elapsedTimeInDays, source, destination | d, a1,
● Sử dụng từ rõ nghĩa
○ accounts, accountGroup | list
● Phát âm dễ dàng
○ marker | modymdhms, genymdhms
● Dễ tìm kiếm (thường áp dụng với các biến hằng số)
○ for (index = 0; index < NUMBER_OF_TASKS; index++) | for (index = 0; index < 69; index++)
● Hạn chế có tiền tố (có một trường phái khuyên dùng tiền tố - prefix)
○ description | str_description
● Quy tắc đặt tên tuỳ vào ngữ cảnh, đặc thù dự án, không nên quá cứng
8. Hàm/Phương thức
● Chỉ làm một nhiệm vụ
● Đặt tên bắt đầu bằng động từ
○ makeSomeNoise | testableHtml
● Tối đa 3 tham số, trừ một số hàm đặc biệt (nên hạn chế)
● Khi cần nhiều hơn 3 tham số, nên chuyển tham số về dạng Object
○ Circle makeCircle(Point center, double radius) | Circle makeCircle(double x, double y, double radius)
● Nên có cơ chế xử lý Exception và trả về mã lỗi (Error Code)
● Nên tham khảo “Refactoring: Improving the Design of Existing Code” để cấu trúc được rõ ràng hơn
9. Comment
● Đừng viết comment cho đoạn code “rởm” . Hãy viết lại nó [1]
● Nội dung phải ngắn gọn, súc tích
● Nên viết khi:
○ Khai báo bản quyền của đoạn mã
○ Giải thích ý nghĩa một hàm/phương thức
○ Giải thích ý nghĩa tham số
○ Cảnh báo về một đoạn code nào đó
○ Đánh dấu việc cần làm
● Không nên:
○ Nhồi nhét quá nhiều thông tin
○ Chỗ nào quá rõ ràng, không cần thiết phải viết comment
10. Định dạng
● Cấu trúc rõ ràng, dễ dàng chỉnh sửa theo yêu cầu
● Mỗi ngôn ngữ lập trình đều có phong cách riêng, không nên gượng ép
● Theo chiều dọc:
○ Một file không nên quá 500 dòng
○ Mỗi concept nên ngăn cách bởi một dấu xuống dòng (blank line)
○ Nếu một hàm gọi một hàm khác, hàm gọi nên nằm phía trên hàm được gọi
○ Nhóm hàm cùng tên khác tham số hoặc cùng nhóm chức năng nên được sắp xếp gần nhau
● Theo chiều ngang:
○ Số ký tự trên một dòng vào khoảng 100 ~ 120 ký tự
○ Nên dùng khoảng trắng phân tách giữa các từ
○ Tránh Deep Nesting (callback/statement lồng nhau quá nhiều)
11. Cấu trúc dữ liệu
● Cố gắng tổng quát hoá kiểu dữ liệu
● Tuỳ chiến lược phát triển mà chọn hướng lập trình thủ tục hoặc hướng đối tượng
○ Lập trình hướng thủ tục dễ dàng thêm chức năng mà không cần thay đổi cấu trúc dữ liệu. Tương đương, khó mở rộng
cấu trúc dữ liệu mới do phải thay đổi tất cả các chức năng liên quan.
○ Lập trình hướng đối tượng dễ dàng mở rộng đối tượng mà không cần thay đổi các hàm hiện có. Tương đương, khó mở
rộng chức năng do phải thay đổi tất cả các lớp liên quan.
● Hãy tuân theo nguyên tắc Demeter [1] để tránh sự phụ thuộc lẫn nhau
○ “Chỉ chơi với thân bằng quyến thuộc” hoặc “Đừng chơi với người lạ mặt”
○ user.lastest_post | user.posts.order(“created_at DESC”).first
12. Xử lý lỗi
● Dùng Exception thay vì trả về mã lỗi và dùng try-catch
● Nên ghi log khi throw Exception
● Lợi ích của việc xử lý lỗi:
○ Dễ bảo trì: Dễ tìm ra lỗi cấu trúc lỗi theo kịch bản có sẵn, không cần phải ngắt luồng xử lý
○ Dễ đọc: Trong lúc viết code, dễ nắm bắt được các lỗi có thể xảy ra với chức năng đó
● Hàm không được trả về NULL, thay vào đó hãy trả về Special Case [1] để tránh xử lý NullPointerException
○ return Collection.emptyList() | return NULL
● Nếu hàm trả về NULL là điều xấu thì input của hàm chấp nhận tham số NULL là một tội ác
13. Tầm kiểm soát
● Thỉnh thoảng dự án cần dùng 3rd-party hoặc mã nguồn mở. Do đó sẽ dẫn đến phụ thuộc vào nhóm phát triển.
● Để kiểm soát 3rd-party, cần dành thời gian kiểm tra kỹ lưỡng trước khi tích hợp vào hệ thống
● Nên tổng quát hoá mã nguồn để tránh cho 3rd-party can thiệp sâu vào hệ thống, giảm được công sức bảo trì khi
3rd-party thay đổi. Có thể dùng Adapter Pattern [1] cho trường hợp này.
14. Kiểm thử đơn vị
● Việc viết unit test là một bước trong Test-Driven Development (TDD) để đảm bảo chất lượng mã nguồn
● Unit Test mục đích không phải để tìm lỗi, mà để kiểm tra tính hiệu quả của cách thiết kế mã nguồn
● Mỗi Test Case chỉ với một concept
● Quy tắc của TDD
○ Luôn viết Unit Test trước khi viết code
○ Không viết thêm Test Case tiếp theo khi Test Case trước còn sai
○ Không viết thêm code vào khi Test Case vẫn còn đang sai
● Lợi ích đem lại
○ Dễ dàng phát hiện lỗi
○ Khi nhìn lại các Unit Test, bản thân nó đã là tài liệu hướng dẫn sử dụng, bản thiết kế hệ thống
15. Class
● Kích thước một class không quá lớn
○ Áp dụng Single Responsibility Principle [1], phần xử lý chuyên biệt nên tách sang một lớp chuyên biệt khác.
■ VD: ProductController.getAll gọi ProductRepository.getAll
○ Số lượng các biến và phương thức không quá nhiều
● Việc thay đổi là chuyện thường xuyên, cố gắng tổng quát quá.
○ Áp dụng Dependency Inversion Principle [2]
■ Các module cấp cao không nên phụ thuộc vào các modules cấp thấp. Cả 2 nên phụ thuộc vào abstraction.
■ Interface (abstraction) không nên phụ thuộc vào chi tiết, mà ngược lại. (Các class giao tiếp với nhau thông qua
interface, không phải thông qua implementation.)
16. Đã xong phần Cơ Bản
Một năm sau hãy đọc lại quyển sách này để hiểu thêm vấn đề
(Bạn đã được xem qua 10/17 chương, thiếu 3 phần phụ lục)
Lưu ý: Sau khi ngộ xong phần Cơ Bản, hãy đọc tiếp các chương còn lại
18. Tham khảo
● Robert C. Martin, “Clean Code: A Handbook of Agile Software Craftmanship”; Pretice Hall, 2009
● https://en.wikipedia.org/wiki/5S_(methodology)
● https://code.tutsplus.com/tutorials/top-15-best-practices-for-writing-super-readable-code--net-8118
● https://kipalog.com/posts/Nguyen-tac-Demeter-trong-huong-doi-tuong
● https://www.linkedin.com/pulse/clean-code-art-exception-handling-niharika-gupta/
● http://programmer.97things.oreilly.com/wiki/index.php/The_Three_Laws_of_Test-Driven_Development
● http://blog.stevensanderson.com/2009/08/24/writing-great-unit-tests-best-and-worst-practises
● https://techmaster.vn/posts/33702/nguyen-tac-phat-trien-phan-mem-tot
● https://toidicodedao.com/2016/06/14/series-solid-cho-thanh-nien-code-cung-dependency-inversion-principle
Editor's Notes
Hình ảnh diễn viên điện ảnh Ấn Độ - Aamir Khan trong bộ phim PK. Anh là người mang đến nhiều cảm hứng cho giới trẻ thông qua bộ phim nổi tiếng “3 Idiots”.
Xem thêm tại https://en.wikipedia.org/wiki/Aamir_Khan
Trong tiếng Phạn, guru có nghĩa là một bậc thầy, người hướng dẫn kiến thức nào đó.
Xem thêm tại https://en.wikipedia.org/wiki/Guru
Xem thêm tại
https://en.wikipedia.org/wiki/5S_(methodology)
Trong quyển “Judge this” của Chip Kidd, tác giả sử dụng thang đo này để minh hoạ cho mức độ hiểu biết ý nghĩa về ấn tượng ban đầu với một đối tượng bất kỳ.
Ở mức 1 (gần về !) là rõ ràng. Mức 10 (gần về ?) là mơ hồ, ẩn ý.
Trong nghệ thuật viết code cũng vậy, chúng ta phải nhận xét đoạn mã có thể hiểu chức năng ngay lần đầu tiếp xúc hoặc nhìn lại sau một thời gian.
Ta có thể dùng thang đo này để nhận xét mức độ rõ ràng.
Do từ “comment” trong lập trình không có từ nào trong tiếng Việt mang rõ nghĩa, xin phép dùng từ gốc tiếng Anh.
# Chú giải
1. ^ Brian W. Kernighan vàP. J. Plaugher. “Don’t comment bad code – rewrite it”
Thật lòng mà nói, có một số Đấng thích viết code sát rạt, đọc muốn nổ mắt :angry:
```
for (var i=0;i<23;i++) { console.log(‘Aluha Ubakaka!’);}```Có thể tham khảo thêm tại https://code.tutsplus.com/tutorials/top-15-best-practices-for-writing-super-readable-code--net-8118
Nên tham khảo một số trường hợp liên quan đến vi phạm nguyên tắc Demeter
https://hocchoi.com/code-smells-la-gi# Chú thích
^ https://kipalog.com/posts/Nguyen-tac-Demeter-trong-huong-doi-tuong
Trong phần Error Handling của Clean Code, họ có nhắc đến Test-Driven Development (TDD), Open/Close Principle.
Nội dung slide này dựa theo link dưới đây
https://www.linkedin.com/pulse/clean-code-art-exception-handling-niharika-gupta/
Xem thêm ở đây để biết thêm một số sai lầm khi thực thành TDD
https://kipalog.com/posts/Mot-so-sai-lam-khi-thuc-hanh-TDD
Xem thêm về Open/Close Principle
https://kipalog.com/posts/SOLID-la-gi---Ap-dung-cac-nguyen-ly-SOLID-de-tro-thanh-lap-trinh-vien-code--cung
https://viblo.asia/p/open-closed-principle-7eEREJJrMgNj
# Chú thích
1. ^ Special Case: tuỳ vào ngữ cảnh sẽ trả về đối tượng rỗng. VD: nếu bạn lấy về danh sách nhân viên, nếu không có nhân viên nào thì trả về một mảng rỗng.
Phần này thiên về rủi ro do việc không kiếm soát được 3rd-party
# Chú thích
1. ^ https://en.wikipedia.org/wiki/Adapter_pattern
Tên tiếng Việt hơi chuối, có thể tìm hiểu thêm với từ khoá tiếng Anh “Unit Testing”
Ngoài ra, để viết Test Case rõ ràng, ta nên tuân thủ nguyên tắc F.I.R.S.T
Fast: Test Case phải chạy nhanh, do tần suất chạy rất cao. Chạy càng sớm, càng tìm ra lỗi sớm. Nếu chạy chậm có thể dẫn đến developer chán nản, bỏ qua việc viết Unit Test.
Independent: Mỗi test nên độc lập từ các test khác. Người phát triển nên có thể thực thi bất kỳ phương thức test nào đó, hoặc một tập các test độc lập. Nếu có sự phụ thuộc từ các test thì chúng dễ bị ảnh hưởng khi viết các test mới.
Repeatable: Dễ dàng tái tạo trên nhiều môi trường khác nhau như máy của developer, máy của tester, CI, môi trường dev, môi trường production
Self-Validating: Test nên trả về kiểu boolean để khi chạy xong xuất ra log. Mục đích để khi nhìn vào có thể tự đánh giá được kết quả thay vì phải làm thủ công. Hiện nay, các xUnit đã hỗ trợ việc này.
Timely: Mục đích của việc viết test trước khi viết code là do sau khi viết code sẽ rất khó viết test.
# Tham khảo
^ http://labs.septeni-technology.jp/none/best-practice-can-thiet-khi-viet-tdd/
^ http://programmer.97things.oreilly.com/wiki/index.php/The_Three_Laws_of_Test-Driven_Development
^ http://blog.cleancoder.com/uncle-bob/2014/12/17/TheCyclesOfTDD.html
^ http://blog.stevensanderson.com/2009/08/24/writing-great-unit-tests-best-and-worst-practises/
Class trong lập trình hướng đối tượng
# Chú thích
^ https://techmaster.vn/posts/33702/nguyen-tac-phat-trien-phan-mem-tot
^ https://toidicodedao.com/2016/06/14/series-solid-cho-thanh-nien-code-cung-dependency-inversion-principle/