Ăn “bề bề” và cách phát triển phần mềm theo nguyên lý 80/20

706

I. Ă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.

Con bề bề trong như thế nà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 rồi, có vẻ như mình đã “cắt bỏ” quá nhiều thì phải, bạn có thấy thế không? Hết cắt đầu, cắt đuôi rồi lại cắt hai bên sườn. Vậy sau cùng thì chỉ còn có một mẩu ở giữa thôi à?

Đú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.

II. 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ố.

III. 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é.

VI. 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.