Bài viết được sự cho phép của tác giả Phạm Bình
1. Ăn bề bề
Chào các bạn,
Bữa trước mình có đi ăn búp phê với người yêu, trong thực đơn có món “bề bề hấp”. Mình quê ở Quảng Ninh, vốn gần biển nên món này chẳng có gì lạ lẫm cả, nhưng người yêu quê lại ở Thái Nguyên, ít được ăn đồ biển nên khá thích món này. Biết thế nên mình lấy mấy con rồi mang vào bàn ăn. Cái giống bề bề này tuy ngon, nhưng bóc lại cực kỳ khó và mất thời gian, do vỏ với thịt của nó gắn khá chặt với nhau. Nói không đùa, chứ bóc vỏ bề bề là cả một nghệ thuật đấy.


Oh vậy việc ăn bề bề thì có gì liên quan tới làm phần mềm ở đây?
Trước khi trả lời câu hỏi trên, thì dưới đây là cách bóc bề bề vừa nhanh, vừa dễ mà mình đã đúc kết ra được sau gần 20 năm sống ở Quảng Ninh:
- Bước 1: Cắt bỏ phần đầu.
- Bước 2: Cắt bỏ phần đuôi.
- Bước 3: Cắt bỏ hai bên sườn, khi cắt thì cắt sâu một chút.
- Bước 4: Lột vỏ trên lưng và dưới bụng.
Thực hiện 4 bước trên, bạn sẽ có một miếng bề bề ngon lành, công đoạn tiếp theo chỉ là cho vào miệng và thưởng thức thôi.
Nhưng khoan đã, hình như có điều gì không ổn trong 4 bước trên
Đúng vậy, nếu thực hiện 4 bước trên, bạn sẽ chỉ còn phần thịt ở giữa, nhưng đó là phần nhiều thịt nhất và cũng là phần có thịt ngon nhất. Nói thẳng ra, có một sự đánh đổi ở đây, để bóc bề bề nhanh và dễ, mình đã phải hi sinh phần thịt ở đầu, đuôi và hai bên sườn. Nhưng đây là một cuộc đánh đổi hợp lý và có lợi cho mình:
- Nếu bỏ đi các phần có ít thịt (đầu đuôi và hai bên sườn), mình chỉ mất 30 giây để bóc, đổi lại mình vẫn giữ được phần thịt ở phần thân ngon lành.
- Nếu mình chọn cách bóc cẩn thận, tỷ mỉ để lấy được thịt cả ở phần đầu và đuôi, mình sẽ mất tới 2 phút (gấp 4 lần cách trên) hoặc thậm chí hơn, nhưng số lượng thịt lấy được không đáng so với thời gian mình bỏ ra.
2. Nguyên lý 80/20
Với cách phân tích như trên, khiến mình nhớ tới một nguyên lý trong cuộc sống, đó là nguyên lý 80/20, hay còn được gọi là nguyên lý Pareto.
Nguyên lý 80/20: 80% các vấn đề là do 20% nguyên nhân gây ra.
Để ý trong cuộc sống bạn sẽ thấy nguyên lý này rất đúng:
- 80% lợi nhuận của công ty đến từ 20% khách hàng trả tiền.
- Bạn giành 80% thời gian cho 20% các mối quan hệ mà bạn có.
- 80% tài sản trên thế giới được nắm giữ bởi 20% dân số.
- 80% số thịt trên con bề bề có thể được bóc với 20% công sức.
- Để hiểu được 80% nội dung của bài viết này, bạn chỉ cần đọc 20% số từ.
Con số 80/20 có thể du di, không nhất thiết phải chính xác tỷ lệ là 80/20. 80 ở đây ám chỉ phần đa số, còn 20 ám chỉ phần thiểu số.
Tham khảo Job FrontEnd HOT trên TopDev!
3. Nguyên lý 80/20 trong phát triển phần mềm
Nguyên lý 80/20 được áp dụng trong cả lĩnh vực phát triển phần mềm, nó giúp các nhà phát triển đưa sản phẩm của họ đến với khách hàng sớm hơn, cũng như tối ưu được các tính năng cần thiết khi tới tay người dùng. Cụ thể quy tắc này được áp dụng như thế nào, mình sẽ trình bày trong phần dưới đây.
3.1 80% tính năng của sản phẩm có thể được hoàn thiện với 20% thời gian
Viết đầy đủ luận điểm trên phải là: 80% tính năng của sản phẩm có thể được hoàn thiện với 20% thời gian, nhưng để hoàn thiện nốt 20% tính năng còn lại, bạn cần bỏ ra 80% thời gian.
Lấy ví dụ với dự án website thương mại điện tử cho gần gũi, thì để tạo ra nơi cho phép “người bán có thể bán hàng và người mua có thể mua hàng” thì thời gian code khá nhanh. Bạn chỉ cần code sao để sản phẩm hiển thị được lên website, khách hàng vào đặt hàng, và thông tin đơn hàng được gửi tới người bán là chấm hết. Code sẽ chỉ mất thời gian khi chúng ta làm thêm các tính năng phụ, giúp việc mua, bán, quản lý sản phẩm diễn ra dễ dàng hơn, hoặc để tối ưu trải nghiệm người dùng như:
- Website có giao diện responsive.
- Tính năng chat giữa người mua và người bán.
- Có thông báo thời gian thực tới người bán khi có đơn hàng.
- Có hiệu ứng animation khi tải trang web.
- Thuật toán tìm kiếm tối ưu và nhanh chóng.
- Lưu lại lịch sử mua hàng của khách hàng.
- Gợi ý sản phẩm phù hợp với khách hàng.
Mặc dù có thể thấy rằng các tính năng trên đều rất điển hình với một dự án thương mại điển tử hiện nay, nhưng suy cho cùng chúng đều là các tính năng phụ. Bởi cho dù có hay không, thì quy trình mua và bán trên hệ thống vẫn có thể diễn ra bình thường. Nếu không nhất thiết phải làm, bạn có thể bỏ qua cho nhẹ đầu, hoặc làm trong các phiên bản tiếp theo.
Việc lược bỏ các tính năng không cần thiết, hoặc chưa cần thiết trong giai đoạn hiện tại giúp bạn tiết kiệm được rất nhiều thứ, đặc biệt là thời gian.
Kể thêm một trường hợp mà chính mình từng trải qua. Hồi đó mới đi làm, mình nhận task làm tính năng quản lý user trên thống, yêu cầu task như sau:
- Hiển thị danh sách user có phân trang với 20 user mỗi trang.
- Có bộ lọc user.
- Có tính năng ban/unban user.
Thật sự task này chẳng có gì khó, nếu chọn phương án làm đơn giản chắc mình chỉ mất 2 giờ, thế nhưng mình đã mất tới … 8 giờ vì cách làm quá “cồng kềnh”:
- Danh sách user mình load từ một enpoint, sau đó dùng vuejs để xử lý thay vì dùng dữ liệu trực tiếp từ controller, kết hợp nhanh với một vài vòng lặp để tạo danh sách.
- Bộ lọc user thông minh, tất cả bộ lọc chỉ có một ô tìm kiếm, khi nhập email, nó sẽ tự tìm kiếm user theo email, khi nhập số điện thoại, nó sẽ tự tìm kiếm user theo số điện thoại. Trong khi đó mình có thể làm cách đơn giản và tiết kiệm thời gian hơn là tạo 2 ô tìm kiếm, 1 ô tìm theo email và 1 ô tìm theo số điện thoại, khi muốn tìm theo tiêu chí nào thì điền vào ô tương tứng.
- Trước khi ban/unban user mình hiển thị alert bằng thư viện sweetalert nhìn “ngầu lòi” thay vì dùng hàm alert() mặc định của javascript. Mình cũng mạnh dạn code thêm tính năng ban/unban nhiều user cùng lúc trong khi task không yêu cầu tính năng này.
Cuối cùng mình nhận ra rằng bản thân đã tốn quá nhiều thời gian cho một task đơn giản, mà nguyên nhân gây mất thời gian chính là quá tập trung vào các tiểu tiết trong khi giá trị nó đem lại là không cao. Giống như việc cố gắng bóc vỏ ở phần đầu và đuôi của con bề bề chỉ để lấy một chút thịt.
3.2 80% user chỉ sử dụng 20% tính năng sản phẩm.
Có bao nhiêu người mua một chiếc Iphone X và sử dụng hết các tính năng của nó, hay mọi người chỉ dùng mấy tính năng cơ bản như chụp hình, nghe – gọi, nhắn tin, lướt facebook, xem youtube, call facetime? Hay chính bạn đấy, bạn cài bao nhiêu app trên smartphone của mình, và trong số đó có bao nhiêu app được bạn sử dụng thường xuyên.
Đây là một sự thật khá “phũ phàng” với những người làm phần mềm như chúng ta. Vì có nhiều tính năng mà bạn tâm huyết, tốn nhiều ngày để code, rồi lại nhiều đêm đóng vai dũng sĩ diệt bug, vất vả lắm mới kịp deadline nhưng kết quả lại … chẳng có ai sử dụng. Thật đáng buồn phải không?
Lại tiếp tục kể một câu chuyện, ngày trước mình có làm một sản phẩm quản lý học viên cho một trung tâm Tiếng Anh. Các tính năng chia làm 2 giai đoạn, giai đoạn 1 làm các tính năng cơ bản như quản lý lớp học, quản lý học sinh trong lớp, sắp xếp thời khóa biểu,… Giai đoạn 2 làm các tính năng như xin nghỉ học, điểm danh học viên, thu chi,… Giai đoạn 1 làm trong 2 tháng thì xong, giai đoạn 2 làm trong 1 tháng tiếp theo. Nhưng kết quả là các tính năng ở giai đoạn 2 chẳng mấy ai sử dụng cả. Xin nghỉ thì học viên toàn nhắn tin trực tiếp cho giáo viên chứ chẳng thèm lên hệ thống tạo đơn; Học viên mỗi lớp quá ít để diểm danh, giáo viên chỉ cần nhìn là nhận biết được ai đi học, ai nghỉ học; Có tính năng thu chi thì lúc dùng, lúc không dùng, nói chung cũng không cần thiết. Vậy rõ ràng, chỉ với các tính năng ở giai đoạn 1 là sản phẩm đã có thể đáp ứng được các nhu cầu của người dùng mà không cần tới các tính năng ở giai đoạn 2.
80% user chỉ sử dụng 20% tính năng sản phẩm – luận điểm này giúp chúng ta hạn chế việc “vẽ hươu vẽ vượn” các tính năng trên phần mềm. Vì chỉ có 20% tính năng được sử dụng bởi phần lớn khách hàng. Thế nên bạn đừng có “tự đẻ” thêm các tính năng nếu không có căn cứ rõ ràng nhé.
4. Lời kết
Làm phần mềm cũng giống như cách bóc bề bề, nhiều khi bạn phải loại bỏ các tính năng ít giá trị để đối lấy thời gian phát triển nhanh. Và điều này được áp dụng rất nhiều trong các startup công nghệ hiện nay.
Hồi mới vào làm ở công ty, mình thấy mấy tool nội bộ của công ty cùi vãi, cứ thắc sao không áp dụng công nghệ A B C tiên tiến này, sao không làm hiệu ứng loading đẹp chút này, không tối ưu trải nghiệm này,… Cứ nghĩ mấy ông dev trước không biết gì nên mới làm thế, nhưng hóa ra là họ “không thèm làm” vì nó không cần thiết. Và đó cũng là dịp mình được nghe giải thích về nguyên lý 80/20 này, thật sự mình cảm thấy rất tâm đắc. Hôm nay được dịp chia sẻ lại với các bạn, hy vọng giúp các bạn có cái nhìn khách quan về công việc phát triển sản phẩm.
Xin chào, hẹn gặp lại trong các bài viết tiếp theo.
Bài viết gốc được đăng tải tại phambinh.net
Những bài viết liên quan:
- QA QC là gì? Nhiệm vụ và Chức năng của QA QC
- Các chứng chỉ Tester nên có để theo đuổi sự nghiệp
- Áp dụng quy trình hiện đại khi làm phần mềm cho hệ thống nhúng
Xem thêm Việc làm IT hấp dẫn trên TopDev












































































Doc Comment Và Javadoc Trong Java
Bài viết được sự cho phép của tác giả Nhựt Danh
Nhắc Lại Kiểu Documentation Comment
Từ bây giờ chúng ta hãy gọi chức năng này bằng một tên chuẩn tiếng Anh cho thống nhất, hãy gọi chức năng này là Documentation Comment, hay gọi tắt là Doc Comment cũng được. Chúng ta đều hiểu nó là cách comment code theo kiểu document vậy.
Tất cả các kiểu comment đều có một điểm giống nhau là khi build, trình biên dịch sẽ bỏ qua chúng, không build comment vào file build cuối cùng. Nhưng, khác với anh em trong họ comment, Doc Comment không đơn thuần chỉ là để comment, chúng được dùng trong một chuyện khác. Công dụng cụ thể của Doc Comment là gì thì mời bạn xem qua mục sau. Dưới đây là một ví dụ sử dụng comment theo kiểu Doc Comment.
Công Dụng Của Doc Comment
Về phía kinh nghiệm code bao lâu nay của mình, mình vẫn rất thích kiểu Doc Comment này hơn các kiểu comment khác, là vì có các lợi ích sau đây.
Thứ nhất, về mặt giải thích cho các dòng code bạn đang làm, thì Doc Comment sẽ luôn rõ ràng hơn do chúng có được sự hỗ trợ về mặt định dạng nổi bật hơn cho các tham số.
Thứ hai, là lợi ích về mặt sử dụng các dòng code có comment theo kiểu Doc Comment này. Thì khi sử dụng các thành phần được comment “chuẩn”, bạn sẽ thấy comment, hay document sẽ xuất hiện ở thanh ngữ cảnh của Eclipse hay InteiJ (bạn dễ dàng nhìn thấy các document này khi đưa chuột vào lớp hay hàm có Doc Comment).
Thứ ba, về mặt xuất xưởng các thư viện. Doc Comment sẽ được một công cụ có tên Javadoc build ra một trang mô tả theo kiểu HTML. Nó là một trang Web được xây dựng hoàn chỉnh và bạn có thể dùng để publish hay nhúng vào trang Web khác. Rất thích hợp để bạn tạo ra các thư viện Java và gửi đến người dùng thư viện của bạn với đầy đủ các hướng dẫn sử dụng các Java code mà bạn xây dựng. Với lợi ích thứ ba này thì mình mời các bạn đến với mục tiếp theo để trải nghiệm nhé.
Thử Tạo Một HTML Document
Bước này chúng ta hãy cũng trải nghiệm việc sử dụng công cụ Javadoc để tạo ra một HTML document xịn xò.
Thật may là Eclipse hay InteliJ đều hỗ trợ các tương tác đến công cụ Javadoc một cách dễ dàng. Bạn hãy chọn một trong hai công cụ này để thực hành theo các chỉ dẫn sau.
Tạo HTML Document trên Eclipse
Với Eclipse. Với project đang mở. Và dĩ nhiên phải có một vài Doc Comment đã được bạn định nghĩa trong source code. Bạn hãy chọn theo menu Project > Generate Javadoc….
Một cửa sổ xuất hiện, bạn hãy để nguyên như mặc định. Chúng là các thiết lập đường dẫn đến file thực thi Javadoc, project cần tạo Javadoc, cũng như nơi mà thành phẩm HTML document được trích xuất ra (đó chính là thư mục /doc bên trong project của bạn).
Hãy đảm bảo các chọn lựa của bạn giống như hình trên. Sau đó nhấn Next. Một cửa sổ chọn lựa khác xuất hiện như sau.
Ở bước trên, bạn hãy nhập vào tiêu đề cho document (mục Document title). Khi này bạn có thể nhấn Finish vì thực chất bước sau nữa cũng không có gì đáng chú ý cả.
Sau một lúc, bạn sẽ thấy xuất hiện thêm một thư mục /doc bên trong project của bạn ở của sổ Package Explorer. Hãy xổ thư mục này ra và tìm đến file index.html và click đúp vào đó, bạn sẽ thấy nội dung document đã được tạo ra tự động y như một trang Web thực thụ vậy. Và đây là những gì chúng ta đã comment vào source code theo dạng Doc Comment.
Bạn hãy thử trải nghiệm bằng cách click chuột đi tới đi lui trong trang Web này để xem Javadoc giúp tạo các hướng dẫn cho code của chúng ta như thế nào.
Ở mục sau chúng ta sẽ tìm hiểu sâu hơn việc tạo document một cách chỉn chu hơn, đầy đủ và chuyên nghiệp hơn như thế nào nhé.
Tham khảo việc làm Java hấp dẫn trên TopDev
Tạo HTML Document Trên InteliJ
Với InteliJ. Với project đang mở. Và dĩ nhiên phải có một vài Doc Comment đã được bạn định nghĩa trong source code. Bạn hãy chọn theo menu Tools > Generate JavaDoc….
Một cửa sổ xuất hiện, bạn hãy để nguyên như mặc định. Chúng là các thiết lập phạm vi áp dụng để tạo HTML document (scope), cấp độ chia sẻ private/package/protected/public. Và thiết lập nơi mà thành phẩm HTML document được trích xuất ra, bạn có thể chỉ định xuất vào thư mục /doc bên trong project của bạn như dưới đây.
Sau khi nhấn OK ở cửa sổ trên, bạn sẽ thấy ngay lập tức Web Browser mặc định trên máy bạn được mở ra với nội dung chính là giới thiệu về project của bạn kèm với các Doc Comment trong đó.
Bạn hãy thử trải nghiệm bằng cách click chuột đi tới đi lui trong trang Web này để xem Javadoc giúp tạo các hướng dẫn cho code của chúng ta như thế nào.
Ở mục sau chúng ta sẽ tìm hiểu sâu hơn việc tạo document một cách chỉn chu hơn, đầy đủ và chuyên nghiệp hơn như thế nào nhé.
Định Dạng Java Doc Thông Qua Sử Dụng Tag
Ở các ví dụ trên đây, bạn đã nhìn thấy một số Tag được dùng trong Javadoc như @author, @version, @since, @param. Và bạn đã hiểu các Tag này giống như các tham số giúp cho Javadoc có thể tạo ra các HTML và truyền các định nghĩa của từng Tag vào HTML như thế nào rồi đúng không nào. Các Tag trong Javadoc thường không ràng buộc một công thức nào kèm theo cả, bạn chỉ cần vận dụng Tag ở những nơi bạn cần HTML làm nổi bật thông tin đó lên thôi, vì dù sao Doc Comment cũng chỉ là một kiểu comment, nên bạn cứ thoải mái sử dụng đi nhé.
Mình sẽ không giải thích dài dòng về Tag nữa mà vào cụ thể việc sử dụng Tag trong Javadoc như thế nào luôn.
@author, @version, @since
Mời bạn xem ví dụ sử dụng Tag và kết quả xuất ra dưới dạng HTML document.
{@code}, @param
Chi tiết về cách sử dụng 2 Tag này được thể hiện qua ví dụ dưới đây.
@deprecated, {@link}
“Hiệu ứng” của các Tag này được minh họa bằng các ví dụ dưới.
@exception, @throws
Hai Tag này có công dụng như nhau. Giúp thêm một thông tin Throws trong document báo hiệu phương thức này sẽ tung ra một exception.
@return, @see
{@value}
Giúp hiển thị giá trị của các static field.
Tham Khảo Thêm Các Định Dạng Khác
Trên đây mình có trình bày qua các định dạng Tag phổ biến trong Javadoc. Tuy nhiên vẫn còn một số định dạng khác, chẳng hạn như vận dụng thêm các thẻ HTML vào Doc Comment, thì bạn có thể làm quen thông qua việc tìm hiểu chính source code của “chính chủ” Oracle, hoặc bạn hãy để ý các Doc Comment từ các source code của các thư viện khác. Đảm bảo bạn sẽ thấy thích và ngộ ra được nhiều phong cách Doc Comment từ các nguồn này, bạn sẽ nhanh “lên tay” hơn cho việc comment cho source code của chính bạn thôi.
Để xem source code của JDK, đơn giản, khi Eclipse hoặc InteliJ đang mở, hãy nhấn giữ phím Ctrl (Windows) hoặc Command (Mac) và click vào lớp được xây dựng sẵn từ JDK. Như ví dụ dưới đây mình mở ra lớp String, bạn sẽ nhanh chóng nhìn thấy source code của lớp này trên chính IDE của bạn.
Hoặc bạn có thể xem ở một số link online cũng được. Như một vài link mình liệt kê sau.
Kết Luận
Chúng ta vừa xem qua các cách sử dụng Doc Comment trong lập trình Java như thế nào. Hi vọng thông qua bài viết này, các bạn sẽ nâng cao hơn tính “thẩm mỹ” và tính dễ đọc đối với các source code của các bạn thông qua việc nâng cao kỹ năng comment. Cũng như hiểu rõ các document được tạo ra như thế nào ở các thư viện mà các bạn đang dùng.
Bài viết gốc được đăng tải tại yellowcodebooks.com
Xem thêm:
Tìm việc làm IT mọi cấp độ tại TopDev