Home Blog Page 121

Clean Architecture: Đứng trên vai những gã khổng lồ

clean architecture

Bài viết được sự cho phép của tác giả Edward Thien Hoang

Robert C. Martin (hay còn gọi là Uncle Bob) cho ra đời ý tưởng của mình về Clean Architecture vào năm 2012, trong một bài viết trên blog của mình, và giảng dạy về nó tại một vài hội nghị, và gần đây nhất là cuốn sách Clean Architecture: A Craftsman’s Guide to Software Structure and Design xuất bản năm 2017.

  Làm thế nào để sắp xếp Clean Architecture theo Modular Patterns trong 10 phút?
  Viết code sạch (Clean code) được gì? Phần 1

Clean Architecture dựa trên các khái niệm, quy tắc, và mô hình nổi tiếng, giải thích làm thế nào để kết hợp chúng với nhau, để đề xuất cách xây dựng các ứng dụng chuẩn.

Đứng trên vai những gã khổng lồ: EBI, Hexagonal and Onion Architectures

Các mục tiêu cốt lõi của Clean Architecture cũng giống với đối với Ports & Adapters (Hexagonal) và Onion Architectures:

  • Độc lập các công cụ;
  • Sự độc lập của các cơ chế phân phối;
  • Khả năng cô lập kiểm thử.

Trong bài viết về Clean Architecture đã được xuất bản, đây là sơ đồ được sử dụng để giải thích ý tưởng tổng quát:

Clean Architecture: Đứng trên vai những gã khổng lồ
Robert C. Martin 2012, The Clean Architecture

Như ông Bob nói trong bài của mình, sơ đồ trên là một nỗ lực để tích hợp các ý tưởng kiến trúc gần đây vào một ý tưởng có thể thực hiện được.

Hãy so sánh sơ đồ Clean Architecture với các sơ đồ được sử dụng để giải thích Hexagonal Architecture và Onion Architecture, và xem chúng trùng nhau ở đâu:

Clean Architecture: Đứng trên vai những gã khổng lồ

Clean Architecture: Đứng trên vai những gã khổng lồ

CÁC CÔNG CỤ BÊN NGOÀI VÀ CƠ CHẾ PHÂN PHỐI

(Externalisation of tools and delivery mechanisms)

Hexagonal Architecture tập trung vào việc mở rộng các công cụ và cơ chế phân phối từ ứng dụng, sử dụng interfaces (Port) và Adapter. Đây cũng là một trong những nền tảng cốt lõi của Onion Architecture, như chúng ta có thể thấy qua biểu đồ của nó, UI, cơ sở hạ tầng và các testing đều nằm trong layer ngoài cùng của sơ đồ. Clean Architecture cũng có đặc điểm giống như vậy, có giao diện người dùng, web, DB, v.v … ở layer ngoài cùng. Trong cùng là tất cả mã lõi ứng dụng độc lập với framework / libraries.

CHIỀU CỦA SỰ PHỤ THUỘC

(Dependencies direction)

Trong Hexagonal Architecture, chúng ta không có bất cứ điều gì rõ ràng cho chúng ta biết hướng của các phụ thuộc. Tuy nhiên, chúng ta có thể dễ dàng suy luận nó: Ứng dụng có một Port (interface) phải được implement hoặc sử dụng bởi Adapter. Vì vậy Adapter phụ thuộc vào giao diện, nó phụ thuộc vào ứng dụng nằm ở trung tâm. Bên ngoài phụ thuộc vào bên trong, hướng của các phụ thuộc là về phía trung tâm. Trong Onion Architecture, chúng ta cũng không có bất cứ điều gì rõ ràng cho chúng ta biết hướng phụ thuộc, tuy nhiên, trong bài thứ hai của mình, Jeffrey Palermo cho biết rõ ràng rằng tất cả các phụ thuộc đều hướng đến trung tâm. Clean Architecture, lần lượt, nó khá rõ ràng trong chỉ ra rằng sự phụ thuộc hướng là hướng về trung tâm. Tất cả đều đưa ra Nguyên tắc đảo ngược phụ thuộc (Dependency Inversion Principle) ở cấp kiến ​​trúc. Vòng tròn bên trong không hề biết gì về các vòng tròn bên ngoài. Hơn nữa, khi chúng ta truyền dữ liệu qua một ranh giới (Boundary), nó luôn ở dạng thuận tiện nhất cho vòng tròn phía trong.

CÁC LAYERS

Sơ đồ Kiến trúc Hexagonal Architecture chỉ hiển thị cho chúng ta hai layer: Bên trong ứng dụng và bên ngoài của ứng dụng. Mặt khác, Onion Architecture mang đến sự kết hợp các layer ứng dụng được xác định bởi DDD: Entities, Value Objects, Application Services chứa các use-case logic; Domain Services đóng gói domain logic không thuộc về các Entities hoặc Value Objects… Khi so sánh với Onion Architecture, Clean Architecture sẽ duy trì Application Services layer (Use Cases) và Entities layer nhưng dường như nó quên mất Domain Services layer. Tuy nhiên, đọc bài của Bác Bob chúng ta nhận ra rằng ông coi một thực thể không chỉ là và Entity theo ý nghĩa của DDD mà bất cứ Domain object nào: “Một entity có thể là một đối tượng với các phương thức, hoặc nó có thể là một tập hợp các cấu trúc dữ liệu và các hàm. “. Trong thực tế, ông đã sáp nhập hai layer bên trong để đơn giản hóa sơ đồ.

KHẢ NĂNG CÔ LẬP KIỂM THỬ

(Testability in isolation)

Trong cả ba kiểu Kiến trúc, chúng đều tuân theo các nguyên tắc phân tách domain logic với các thành phần bên ngoài. Điều này có nghĩa là trong mọi trường hợp chúng ta chỉ có thể mô phỏng các công cụ bên ngoài và các cơ chế phân phối và thực hiện kiểm thử ứng dụng mà không sử dụng bất kỳ DB hay HTTP request nào.

Như chúng ta có thể thấy, Clean Architecture sẽ kết hợp các quy tắc của Hexagonal Architecture và Onion Architecture. Cho đến nay, kiến trúc sạch sẽ không thêm bất cứ điều gì mới cho phương trình. Tuy nhiên, ở góc dưới cùng bên phải của Clean Architecture diagram, chúng ta có thể thấy thêm một biểu đồ nhỏ …

ĐỨNG TRÊN VAI NHỮNG GÃ KHỔNG LỒ: MVC VÀ EBI

Biểu đồ phụ nhỏ ở góc dưới cùng bên phải của Clean Architecture diagram sẽ giải thích về sơ đồ luồng tương tác (flow of control) giữa các component. Biểu đồ nhỏ này không cung cấp cho chúng ta nhiều thông tin, nhưng lời giải thích về bài đăng trên blog và các bài giảng của hội thảo được đưa ra bởi Robert C. Martin mở rộng về đề tài này.

Clean Architecture: Đứng trên vai những gã khổng lồ

Trong sơ đồ ở trên, ở phía bên trái, chúng ta có View và Controller của MVC. Mọi thứ bên trong / giữa các đường kẻ đôi màu đen đại diện cho Model trong MVC. Mô hình này cũng đại diện cho kiến trúc EBI (với “Boundary”, Interactor và the Entities”), “Application” trong Hexagonal Architecture, “Application Core” trong Onion Architecture, “Entities” và “Use Cases” layer trong Clean Architecture.

Theo biểu đồ luồng tương tác, chúng ta có một yêu cầu HTTP đến các Controller. Controller sau đó sẽ:

  1. Phân tích Request;
  2. Tạo một Request Model với các dữ liệu có liên quan;
  3. Execute một method trong Interactor (đã được đưa (inject) vào Controller bằng cách sử dụng interface của Interactor là Boundary), chuyển nó cho Request Model;
  4. Interactor sẽ:
    1. Sử dụng implementation của Entity Gateway (được đưa vào Interactor bằng cách sử dụng Entity Gateway Interface) để tìm các Entities liên quan;
    2. Phối hợp các tương tác giữa các Entities;
    3. Tạo Response Model với kết quả dữ liệu trả về;
    4. Tạo ra Presenter chứa Response Model;
    5. Trả lại Presenter cho Controller;
  5. Dùng Presenter để tạo ra một ViewModel;
  6. Bind ViewModel với View;
  7. Trả View về cho Client.

KẾT LUẬN

Tôi không nói rằng Clean Architecture là cuộc cách mạng bởi vì nó không thực sự mang lại một khái niệm hoặc mô hình đột phá mới. Tuy nhiên, tôi xin nói rằng đó là một công trình có tầm quan trọng lớn, bởi vì:

  • Nó khôi phục các khái niệm, quy tắc và khuôn mẫu bị quên lãng;
  • Nó làm rõ các khái niệm và quy tắc hữu ích và quan trọng;

Nó cho chúng ta biết tất cả các khái niệm, quy tắc và mẫu này phù hợp với nhau để cung cấp cho chúng ta một cách chuẩn hóa để xây dựng các ứng dụng phức tạp với sự bảo trì trong đầu.

Khi tôi nghĩ về Bác Bob làm việc với Clean Architecture, nó làm cho tôi nghĩ về Isaac Newton. Trọng lực luôn ở đó, mọi người đều biết rằng nếu chúng ta thả quả táo cách mặt đất một mét, nó sẽ di chuyển xuống mặt đất. “Điều duy nhất” mà Newton đã làm là xuất bản một bài báo đưa ra sự thật đó *. Đó là một điều “đơn giản” phải làm, nhưng nó cho phép mọi người lý giải về nó và sử dụng ý tưởng cụ thể làm nền tảng cho những ý tưởng khác.

Nói cách khác, tôi thấy Robert C. Martin là Isaac Newton trong phát triển phần mềm!

Đây là bài viết trong loạt bài viết về “Tổng quan về sự phát triển của kiến trúc phần mềm“. Đây là loạt bài viết chủ yếu giới thiệu về một số mô hình kiến trúc phần mềm hay nói đúng hơn là sự phát triển của chúng qua từng giai đoạn, qua đó giúp chúng ta có cái nhìn tổng quát, up-to-date và là roadmap để bắt đầu hành trình chinh phục (đào sâu) thế giới của những bản thiết kế với vai trò là những kỹ sư và kiến trúc sư phần mềm đam mê với nghề.

Bài viết gốc được đăng tải tại edwardthienhoang.wordpress.com

Có thể bạn quan tâm:

Xem thêm IT Jobs for Developer hấp dẫn trên TopDev

Độ ưu tiên, Độ nghiêm trọng trong quản lý bug

Độ ưu tiên, Độ nghiêm trọng trong quản lý bug

Bài viết được sự cho phép của vntesters.com

Trong kiểm thử phần mềm thì hai khái niệm Độ ưu tiên (Priority) và Độ nghiêm trọng (Severity) cũng không quá xa lạ, đặc biệt là trong quản lý bug. Hai khái niệm trên đã trở nên quá quen thuộc và phổ biến đến nỗi chúng ta hầu như không phân biệt được ý nghĩa cũng như sự khác nhau giữa hai khái niệm đó. Mặc dù hai yếu tố này không phải là yếu tố sống còn trong quản lý bug nhưng việc hiểu đúng sẽ giúp chúng ta tiết kiệm thời gian cũng như làm công việc hiệu quả hơn.

  Debug là gì?
  Cách viết một bug report tốt

Độ nghiêm trọng

Mức độ nghiêm trọng của một con bug thường chỉ mức độ tác động của con bug đó đến sản phẩm/ người dùng. Mỗi dự án hay sản phẩm có tiêu chí đánh giá độ nghiêm trọng khác nhau nhưng thông thường sẽ có 4-5 mức độ khác nhau từ nghiêm trọng nhất đến ít nghiêm trọng hơn:

  • Mức độ 1: Hệ thống sập, dữ liệu bị mất, ứng dụng không cài đặt được v.v.
  • Mức độ 2: Chức năng chính của sản phẩm không hoạt động
  • Mức độ 3: Chức năng phụ của sản phẩm không hoạt động
  • Mức độ 4: Bug nhỏ, không quan trọng
  • (Mức độ 5): Yêu cầu cải tiến sản phẩm, thêm chức năng

Cũng nên lưu ý việc định nghĩa mức độ nghiêm trọng phụ thuộc vào sản phẩm khác nhau, mang tính tham khảo và tương đối.

Việc xác định được độ nghiêm trọng của con bug giúp nhà quản lí dự án, chủ sản phẩm có cái nhìn tốt hơn và thuận lợi hơn về tình hình chất lượng của sản phẩm. Số lượng bug là chưa đủ để đánh giá tình hình. Việc đội kiểm thử tìm được 50 con bug trong 1 tháng cũng không nói lên nhiều về tình hình chất lượng của sản phẩm. Tuy nhiên, nếu biết được trong 50 con bug đó có đến hơn 1 nửa là bug với độ nghiêm trọng ở cấp độ 1 và 2 sẽ hữu ích hơn nhiều. Ngoài ra, với góc độ của kỹ sư kiểm thử, độ nghiêm trọng cũng giúp “quảng cáo” cho con bug của mình từ đó sẽ gây được sự chú ý của mọi người và tăng cơ hội con bug đó được sửa.

Có một thực tế không lấy gì vui vẻ là việc xác định độ nghiêm trọng của con bug không hẳn lúc nào cũng mang tính chất trắng-đen và tuyệt đối. Sẽ không có gì ngạc nhiên nếu chúng ta cho rằng vấn đề này là nghiêm trọng trong khi chủ sản phẩm, nhà quản lý dự án lại không nghĩ như vậy. Không hẳn là họ đang cố tình “dìm hàng” chúng ta mà cũng có thể cách chúng ta cung cấp thông tin không thể hiện được đầy đủ mức độ nghiêm trọng của vấn đề. Hãy phân tích và cung cấp thêm thông tin để cho thấy tác động nghiêm trọng của con bug đối với sản phẩm cũng như người dùng cuối như thế nào như xảy ra trên nhiều môi trường; lặp đi lặp lại; có khả năng ảnh hưởng đến các thành phần, chức năng khác; hình ảnh thương mại của công ty v.v. Và dĩ nhiên, nếu vấn đề không thực sự nghiêm trọng, chúng ta cũng không có lí do gì để làm cho lớn chuyện. Việc hiểu rõ sản phẩm, người dùng cùng khả năng phân tích, suy luận sẽ giúp chúng ta làm tốt khâu này.

Độ ưu tiên

Như chúng ta đã biết nếu đã là bug thì sẽ phải sửa. Tuy nhiên, có một thực tế là đội phát triển khó có thể sửa hết tất cả bug một lượt cũng như không đáng để sửa hết tất cả các bug. Do đó, đội phát triển sẽ phải cần đến độ ưu tiên của con bug để biết được bug nào cần được sửa trước bug nào sau. Độ ưu tiên của con bug cũng thường được chia thành 3-4 cấp độ:

  • Mức độ 1: Cao – Bug sẽ phải sửa ngay lập tức
  • Mức độ 2: Trung bình – Bug sẽ sửa trong bản cập nhật lần tới
  • Mức độ 3: Thấp – Bug không cần sửa trong bản cập nhật lần tới, có thể sửa nếu có thời gian

Tương tự mức độ nghiêm trọng, mức độ ưu tiên cũng như ý nghĩa của chúng có thể sẽ khác nhau ở những sản phẩm, dự án khác nhau.

Thế chúng ta sẽ dựa vào đâu để xác định độ ưu tiên? Bug nào sửa trước bug nào sửa sau (hoặc không sửa)? Quá dễ, dựa vào độ nghiêm trọng của bug. Bug nào nghiêm trọng nhất, tác động đến người dùng nhiều nhất thì sẽ được ưu tiên sửa trước. Bug nào ít nghiêm trọng hơn sẽ được sửa sau. Đúng…nhưng không phải lúc nào cũng đúng. Giả sử chúng ta tìm được một bug làm sập hệ thống. Quá tuyệt đúng không nào. Chúng ta đánh giá mức độ nghiêm trọng ở Mức độ 1 (rất là nghiêm trọng) và độ ưu tiên 1 (cần được sửa gấp). Nhưng hôm sau, độ ưu tiên của bug đó được điều chỉnh xuống thấp trong khi con bug bắt lỗi chính tả của thằng bạn lại được đánh giá có độ ưu tiên cao để sửa. Chúng ta buồn rầu, thất vọng, khó chịu và quyết phải hỏi cho ra lẽ và được giải thích rằng “Mặc dù bug đó làm sập hệ thống nhưng khả năng người dùng bị lỗi đó là rất thấp do để làm ra bug đó bạn phải trải qua vài chục bước hay bug đó chỉ xảy ra trên một môi trường cụ thể cũng như rất ít người dùng chạy sản phẩm trên môi trường đó”. Suy cho cùng đó là một quyết định liên quan đến kinh doanh và hầu như chúng ta không thể thay đổi được quyết định đó. Có một thực tế phải thừa nhận là kỹ sư kiểm thử chúng ta biết rất ít hay thậm chí không thể biết được khối lượng công việc của đội phát triển, chi phí của dự án cũng như những quyết định kinh doanh mang tính chiến lược của nhà đầu tư, quản lý dự án hay chủ sản phẩm. Điều đó cũng không có gì là quá tệ đối với một kỹ sư kiểm thử. Nó chỉ liên quan đến vai trò và trách nhiệm công việc của kỹ sư kiểm thử. Xác định độ ưu tiên được khuyến khích đối với kỹ sư kiểm thử nhưng không phải bắt buộc. Đó là lí do tại sao ở một số dự án thậm chí kỹ sư kiểm thử được yêu cầu không xác định độ ưu tiên cho con bug và độ ưu tiên chỉ được xác định sau buổi họp đánh giá bug. Điều này cũng không có gì là vô lí.

Lời kết

Trách nhiệm và vai trò của kỹ sư kiểm thử là cung cấp thông tin về chất lượng sản phẩm càng nhiều càng chi tiết càng tốt cho các nhà quản lí dự án, cho chủ sản phẩm những người sau đó sẽ đưa ra những quyết định kinh doanh cho sản phẩm dựa vào những thông tin đó. Độ ưu tiên và độ nghiêm trọng chỉ là hai trong số rất nhiều thông tin quan trọng khác chúng ta cần phải cung cấp như môi trường của con bug, mức độ lặp đi lặp lại, các bước mô tả con bug, phạm vi của con bug v.v. Tuy nhiên, việc hiểu đúng về mức độ nghiêm trọng, độ ưu tiên của sản phẩm cho thấy chúng ta thực sự hiểu rõ và quan tâm đến chất lượng sản phẩm cũng như thể hiện sự chuyên nghiệp của một kỹ sư kiểm thử.

Bài viết gốc được đăng tải tại vntesters.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Technical Debt và Legacy System

technical

Bài viết được sự cho phép của tác giả Edward Thiên Hoàng

Technical debt – tạm dịch là “Khoản nợ kỹ thuật” được dùng nhiều trong Software Engineering. Theo Henrik Kniberg, những khoản nợ kỹ thuật là bất cứ thứ gì trong việc viết mã khiến bạn chậm lại về lâu dài. Ví dụ như là mã khó đọc, thiếu (hoặc không có) kiểm thử tự động, mã trùng lặp, hoặc sự liên kết lằng nhằng giữa lớp, mô-đun… (Think of technical debt as anything about your code that slows you down over the long term. Hard-to-read code, lack of test automation, duplication, tangled dependencies, etc. Henrik Kniberg).

  10 bí kíp để startup và FinTech startup thành công đột phá
  Cách trở thành một MarTech Developer trong năm 2024

Technical Debt và Legacy System

Cũng giống như những khoản nợ về tài chính: có vay mới có nợ, có nợ ắt sẽ sinh lãi. Technical debt sinh ra vì nhiều lý do: áp lực kinh doanh, thiếu kỹ năng trong phân tích thiết kế cũng như kỹ năng lập trình, không có các bộ mã kiểm thử dẫn đến việc trì hoãn (hoặc không thể) tái cấu trúc lại mã nguồn… Nếu không được trả, theo thời gian, nợ sẽ đẻ lãi, dẫn đến việc chậm tiến độ, những đoạn mã mới được thêm vào sẽ mất nhiều thời gian và chi phí hơn, mà đa phần trong số đó là chi phí cho việc gỡ rối (debugging) và kiểm thử hồi quy (regression testing).

Technical Debt và Legacy System

Nếu bạn đang làm việc với 1 legacy system (có rất nhiều định nghĩa về legacy code, nhưng mình thích nhất định nghĩa của Robert C. Martin: legacy code = code without test) nghĩa là bạn đang mang trên mình món nợ về kỹ thuật. Một đoạn mã được viết cách đây 10 năm cũng gọi là legacy code, một đoạn mã được viết ngày hôm qua cũng gọi là legacy code nếu chúng đều không được “chống lưng” bằng mã kiểm thử. Và nếu bạn vẫn tiếp tục tạo ra những đoạn mã “without test”, cũng tức là bạn đang tự đẻ thêm nợ cho chính system của mình. Điều đó cũng giống như việc bạn thêm vào những đoạn mã khó đọc, mã trùng lặp, hoặc sự kiên kết lằng nhằng giữa lớp, mô-đun… (Có phải mình cũng vừa lặp lại những gì đã nói ở trên?).

Vậy bạn sẽ trả nợ bằng cách nào? Hay thõa hiệp trước món nợ + lãi đang ngày một tăng khi mã mới được thêm vào?
Có hàng tá lý do để biện minh cho việc thõa hiệp, có thể kể ra như: đừng phá vỡ những đoạn mã đã chạy ổn định, hệ thống chúng ta quá phức tạp, do đó cần thêm thời gian để (tìm hiểu) thêm mới hoặc sữa chữa một đoạn mã nào đó (và đảm bảo không phá vỡ những đoạn mã hiện tại). Có một câu ví von khá hay về vấn đề này. “The code may not be pretty, but damnit, it works!” dùng để nói về Duct Tap Programmer – người viết mã chỉ để “chạy được”.
Nếu chọn cách trả nợ, những việc bạn sẽ làm là đừng (hoặc hạn chế) để lại nợ nần cho những thế hệ (mã) phía sau. Và điều đầu tiên đó là Hãy ngừng việc tạo ra những đoạn mã xấu (Stop writing crappy code).

Technical Debt và Legacy System

TDD đã khó, TDD cho legacy system còn khó gấp bội. Bài viết dưới đây của Mark Levison bàn về việc những vấn đề gặp phải khi áp dụng TDD trong Legacy System, qua đó trích dẫn 1 số phương pháp của Keith Ray – XP Coach để làm việc với legacy code nhằm giảm (paying down) những khoản technical debt, dựa trên nền tảng cốt lõi là viết mã sạch, tái cấu trúc mã nguồn và bỏ túi SOLID principles.

Xin trích dẫn nguyên văn bài viết bởi Mark Levison từ http://www.infoq.com/news/2009/11/legacy-code

Allan Baljeu was trying to TDD with a legacy C++ code base, he was running into trouble because:

we end up with classes that don’t fully implement the functionality that’s eventually needed, and when others come around to use those classes, and eventually fuller implementations are required, then it turns out that the original design is not adequate, a new design is required, some expectations (tests) need to change and previous uses of the class need to be updated.

He wondered if Big Design Up Front would help solve the problem. George DinwiddieAgile Coach, suggested that Alan’s design was trying to tell him something. You have to pay attention to the fundamentals of clean code. You can look at basic coupling and cohesion (i.e. SOLID).

Mike “Geepaw” HillAgile Coach, says that in his years of coaching agile teams, one of the following has been at the root of these problems:

  • team is not yet up to speed on refactoring, so your classes aren’t really
    minimal
  • team is not yet skilled at simplicity, so ditto
  • team is not yet doing aggressive & rapid microtesting (aka unit testing), so changes break tests too often
  • team doesn’t know how to handle cross-team or company-to-public dependencies, e.g. shipping api’s
  • team neither pairing nor open workspacing, dramatically slowing team-wide understanding.
  • team likely has no jiggle-less build
  • team could be using tools from the ’40s

Keith RayXP Coach, suggests that with legacy code (i.e. systems with high technical debt) the cost of repaying technical debt dominates the cost of implementing a story. He goes on to offer an approach:

To make the code more well-factored (paying down the technical debt), whenever you need to integrate a new feature into it, you should pay close attention to code smells in both the new code and the old code and consider refactoring to deal with each smell as you recognize it.

You can do refactorings in small safe steps (even in C++) manually. Very closely follow the instructions in Fowler’s book on Refactoring until you learn them by heart. Eclipse with gcc has a few refactorings that actually work: Extract Method and Rename. Rename understands scope, so it is safer than search-and-replace. Extract Method and the other refactorings in Ecipse might be buggy, so be careful when you use them. For things like changing a function signature, “lean on the compiler” to show where changes have to be made.

You also need tests to make sure the refactorings are not damaging the existing features. Feather’s book on working with legacy code has lots of techniques for adding tests to legacy code. On a higher level, code smells are violations of good design principles. For example, the Single Responsibility Principle (SRP) says there should one purpose for every class / method / module. There are principles about coupling and cohesion and managing dependencies, etc. It’s often easier to detect a code smell than it is to apply these abstract principles. “Large Class” and “Large Method” are remedied by “Extract Class” and “Extract Method/Move Method”, though knowing SRP helps in deciding what parts of a class or method should be extracted.

Perhaps the most important design principle is “Tell, don’t ask”: keep functionality and data together…. bad code often has the functionality in one place, and gets the data it needs from other places, creating problems with dependencies and lack of locality — symptomized by “adding a new feature requires changing lots of code”. The code smells “Shotgun Surgery”, “Feature Envy”, “Long Parameter List” are applicable here.

Getting fast feedback will allow more refactoring, which will (eventually) allow faster development of new features. Try to get parallel builds happening (distributed compilation). Try to get smaller source files and smaller header files. Reduce the complexity of header files – use forward declarations, avoid inline code, try to keep only one class per header file / source file. Using the “pimpl” idiom widely can decrease compile time by 10%, but it can also disguise the “Large Class” and “Feature Envy” code smells.

The advantage of refactoring instead of rewriting, is that you always have working code. If your manual and automated tests are good, then you should be able to ship the code, even if it is a half-way state between a bad design and a good design.

Keith also wrote “Refactoring: Small Steps Guaranteed to Help You Clean Up Your Code” an article on refactoring C++ code in Better Software Magazine.

Previously on InfoQ: Dealing with Legacy CodeUncle Bob On The Applicability Of TDD andMaking TDD Stick: Problems and Solutions for Adopters

Bài viết gốc được đăng tải tại edwardthienhoang.wordpress.com
Có thể bạn quan tâm:
Xem thêm Việc làm System Engineer hấp dẫn trên TopDev

Stateless và Stateful là gì?

Stateless và Stateful là gì?

Bài viết được sự cho phép của tác giả Tino Phạm

Stateless là design không lưu dữ liệu của client trên server. Có nghĩa là sau khi client gửi dữ liệu lên server, server thực thi xong, trả kết quả thì “quan hệ” giữa client và server bị “cắt đứt” – server không lưu bất cứ dữ liệu gì của client.

  HTTP status code là gì? Danh sách đầy đủ HTTP status code
  Kiểm thử tĩnh vs kiểm thử động (Static vs Dynamic testing)

Stateful là một design ngược với stateless, server cần lưu dữ liệu của client, điều đó đồng nghĩa với việc ràng buộc giữa client và server vẫn được giữ sau mỗi request (yêu cầu) của client. Data được lưu lại phía server có thể làm đầu vào (input parameters) cho lần kế tiếp, hoặc là dữ kiện dùng trong quá trình xử lý hay phục vụ cho bất cứ nhu cầu nào phụ thuộc vào bussiness (nghiệp vụ) cài đặt.

Hai mô hình tương tác cơ bản của thiết kế client-server là cơ sở để hình thành nên các application protocol, framework, technology,… Ví dụ, HTTP là một Application Protocol (giao thức ứng dụng) dạng stateless, nghĩa là tương tác client-server theo HTTP thì phần server sẽ không lưu lại dữ liệu của client.
HTTP ban đầu được dùng cho web, đơn thuần chỉ là Web Site. Phần client gửi request (yêu cầu) truy vấn tới các Web Page (trang web – là các trang HTML), server nhận yêu cầu, đáp trả nội dung của Web Page và sau đó cắt đứt mọi liên hệ với client (không lưu data của client).

Khi sự đơn giản của Web Site hấp dẫn nhà phát triển phần mềm, người ta nảy sinh ý tưởng xây dựng phần mềm dưới dạng web. Nghĩa là HTML dùng vào làm User Interface (giao diện người dùng) cho một application (ứng dụng phần mềm) và phần mềm được thiết kế dưới dạng client-server, khi đó HTTP đóng vai trò protocol cho tương tác chủ – khách. Nhưng phần mềm viết ra để xử lý dữ liệu của người dùng, nghĩa là trong rất nhiều tương tác, server cần phải lưu data hoặc kết quả trả về làm đầu vào cho lần xử lý kế tiếp, đặc biệt những nghiệp vụ được đặt trong transaction. Như vậy, về căn bản HTTP không đáp ứng được sự phức tạp trong yêu cầu phát triển phần mềm.

Tuy nhiên, người ta có nhiều mánh khóe để khắc phục yếu điểm đó. Dù là một stateless design nhưng nếu kết hợp với HTML chúng ta vẫn có thể biến một Web Site làm được những gì tương tự như stateful. Có 4 cách lưu data của client khi xây dựng Web Application.

  1. Sử dụng URL Rewriter: HTML là ngôn ngữ định dạng tài liệu, nó không phải là ngôn ngữ lập trình nên không thể sử dụng các biến để lưu dữ liệu. Tuy nhiên, dữ liệu có thể được viết vào các link (liên kết) và như thế khi người dùng click vào link thì dữ liệu sẽ được gửi lên server. Phần lớn dữ liệu được viết vào phần query dưới các cặp parameters gồm key=value (cặp khóa/giá trị), một vài cài đặt có thể đưa dữ liệu vào phần path hay trong các biến của javascript,…
  2. Hidden Form: Thay vì lưu dữ liệu vào đường link, ta sẽ lưu dữ liệu vào các thành phần của form và type (kiểu) của các element này là hidden – ẩn. Như vậy, mọi action (hành xử) của người dùng sẽ gọi đến hành động post (gửi) form đó lên server và như thế dữ liệu cần lưu ở lần trước đó sẽ được gửi lại. HTTP method được dùng ở đây là Post chứ không phải Get trong URL Rewriter. Get là một dạng truy vấn cho phép đọc (read) trong khi Post là một truy vấn cho phép ghi (write). Khi đó dữ liệu của client gửi lên server sẽ nằm trong phần body của một HTTP Message chứ không phải trong phần Header như việc dùng link (liên kết) ở trên.
  3. Sử dụng Cookie: Trình duyệt cho phép mỗi Web Application lưu khoảng 4kb dữ liệu dưới dạng key/value. Như vậy, nếu ta lưu data của lần truy vấn trước đó vào cookie thì giá trị này sẽ được gửi lên server trong mỗi request. Cookie là 1 phần trong header của HTTP Message.
  4. Sử dụng HTTP Session: Ngược với cookie, các Web Server có thể cho phép mỗi client lưu một dung lượng nhỏ data trên đó. Dữ liệu được lưu dưới dạng key/value và sẽ bị expire nếu bị timeout (sau khoảng thời gian tính từ lúc client gửi truy vấn cuối cùng đến server nếu vượt quá giới hạn thì sẽ bị hủy).

Web Application là một ví dụ minh họa cho stateless design với vài kỹ thuật nhỏ khắc phục yếu điểm của nó trong xây dựng phần mềm. Ở tầng bussiness, ta cũng có thể thiết kế tương tác dạng client-server. Hệ thống phần mềm khi đó có architecture (kiến trúc) là distributed (phân tán). EJB là một ví dụ với việc session bean được thiết kế hỗ trợ cả stateless và stateful.

nguồn: internet

Bài viết gốc được đăng tải tại thangphampt.wordpress.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Big O Notation là gì?

Big O Notation là gì?

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Chúng ta thường nghe nói về các thuật toán nhanh và hiệu quả khi thực hiện một tác vụ nào đó, nhưng nhanh và hiệu quả ở đây được hiểu như thế nào? Có phải nó được đo bằng thời gian thực hiện xong tác vụ đó trong vài giây hay vài phút hay không? Câu trả lời là không các bạn ạ!

Chương trình trên máy tính của mình chạy chậm hơn trên máy tính của các bạn bởi vì mình đang sử dụng một máy tính cũ hoặc bởi vì trong lúc chạy chương trình này mình còn chạy rất nhiều chương trình khác nữa,… Vì thế, khi chương trình trên máy tính của mình chạy chậm hơn trên máy tính của bạn không có nghĩa là bạn đang sử dụng một thuật toán hiệu quả hơn của mình. Do đó, khi so sánh hai thuật toán bất kỳ thực hiện cho một tác vụ nào đó, chúng ta không thể dựa vào thời gian thực thi tác vụ đó.

Để giải quyết vấn đề này, khái niệm Big O Notation đã được đưa ra để định nghĩa, đo lường tính hiệu quả của một thuật toán. Nó dựa vào số bước cần thực hiện của một thuật toán cho một tác vụ nào đó để đo lường tính hiệu quả của thuật toán đó. Cụ thể nó như thế nào, chúng ta hãy cùng xem xét các ví dụ sau nhé:

Ví dụ thứ nhất:

private int getLastElement(int[] numbers) {
return numbers[numbers.length - 1];
}

Các bước thực hiện trong phương thức trên là:

  • Lấy thuộc tính length của mảng numbers (1)
  • Thực hiện phép tính numbers.length – 1 (2)
  • Sau khi có kết quả ở bước (2) thì lấy giá trị tại index này trong mảng numbers. (3)
  • Và cuối cùng là return lại kết quả. (4)

Như vậy, phương thức trên, thuật toán của chúng ta sẽ trải qua tất cả 4 bước cho dù số lượng dữ liệu trong mảng numbers có lớn như thế nào!

Nếu quy về dạng hàm số mà các bạn đã được học ở phổ thông thì chúng ta có thể biểu diễn thuật toán trên như sau:

f(n) = 4

với n là số lượng dữ liệu trong mảng của chúng ta.

Nào, hãy xem xét ví dụ thứ hai nhé các bạn:

public static int sum(int[] numbers) {
int sum = 0;
for (int i = 0; i < numbers.length; i++) {
sum = sum + numbers[i];
}
return sum;
}

Với ví dụ này, chúng ta có thể xác định số bước cần thực hiện của thuật toán này như sau:

  • Ở ngoài vòng lặp for, chúng ta có 3 bước bao gồm:
    • Khởi tạo biến sum với giá trị 0
    • Khởi tạo biến i với giá trị 0
    • Return lại giá trị của biến sum
  • Trong vòng lặp for, với mỗi phần tử trong mảng numbers thì chúng ta lại có các bước như sau:
    • Lấy thuộc tính length của mảng numbers (1)
    • So sánh kết quả của bước (1) với biến i (2)
    • Lấy giá trị của mảng numbers tại index i (3)
    • Cộng biến sum với giá trị tại bước (4)
    • Gán giá trị ở bước (4) vào lại biến sum (5)
    • Tăng giá trị của biến i lên 1 (6)
  Gửi các push notification giao dịch quan trọng bằng Pusher Beams
  Hướng dẫn Push Notifications cơ bản trong iOS

Như vậy, trong vòng lặp for, với mỗi phần tử trong mảng numbers, chúng ta có 6 bước cần thực hiện. n là số phần tử trong mảng numbers thì chúng ta có 6n bước cần thực hiện.

Tổng cộng, chúng ta có 6n + 3 bước cần thực hiện cho thuật toán trong phương thức này. Dưới dạng hàm số, chúng ta có thể biểu diễn như sau:

Như vậy, như các bạn thấy, với ví dụ thứ nhất, rõ ràng số bước cần thực hiện không phụ thuộc vào số lượng dữ liệu mà chúng ta đưa vào. Còn ở ví dụ thứ hai, dữ liệu đưa vào của chúng ta càng lớn thì số bước cần thực hiện của chúng ta lại tăng theo.

Và ở đây, các bạn sẽ thấy, chúng ta sẽ có một hàm g(n) khác sao cho kể từ một giá trị n >= n0, giá trị của hàm g(n) nhân với một hằng số nào đó c0 luôn luôn lớn hơn giá trị của hàm f(n). Khi đó, hàm g(n) gọi là cận trên của hàm f(n) và hàm f(n) gọi là Big O của hàm g(n), viết là f(n) = O(g(n)).

Trong ví dụ thứ hai, chúng ta có thể gọi hàm g(n) = n là Big O của hàm f(n) = 6n + 3. Bởi vì ở đây, khi giá trị của n0 >= 3, c0 = 7 thì:
f(n) = 21
c0 * g(n) = 21
giá trị của hàm f(n) luôn nhỏ hơn hoặc bằng giá trị của hàm g(n) nhân với một hằng số c0.

Chúng ta có thể định nghĩa của Big O Notation như sau:

Trong ví dụ thứ nhất, thì f(n) là một Big O của một hằng số, gọi là O(1).

Ở ví dụ thứ hai thì f(n) là một Big O của n, gọi là O(n).

Như vậy, Big O Notation là một khái niệm để xác định khả năng mở rộng của một thuật toán dựa vào số bước thực hiện của thuật toán đó. Chúng ta có thể dự đoán được thuật toán đó với dữ liệu ngày càng lớn thì sẽ như thế nào. Và cho phép chúng ta ước lượng được trường hợp xấu nhất dựa vào cận trên của thuật toán này.

Chrome: Giả lập mạng internet chậm lại trong testing

Chrome: Giả lập mạng internet chậm lại trong testing

Bài viết được sự cho phép của tác giả Nguyễn Trần Chung

Khi bạn viết xong website đưa lên môi trường production cho user truy cập vào. Ok thôi, bạn sẽ gõ domain trang web bạn trên browser và enter … 💨💨💨 vèo vèo vèo chưa đầy nửa giây web đã load xong. Nhưng thật không may, không phải ai cũng sở hữu một mạng network tốc độ bàn thờ như bạn, có người sử dụng 4G, 3G, 2G hay lưu lượng tốc độ cao đã hết và bị bóp băng thông mạng đến nghẹt thở.

  30 tiện ích Chrome (extensions) cho Designer và Developer
  Cách build một extension (tiện ích mở rộng) trên Chrome

Bạn ngay lập tức nhận được những lời phiền toái từ người dùng mà bạn chả hiểu vì sao (nếu trang web bạn có giá trị),  hoặc còn không thì họ sẽ không quay lại trang web nào nữa mà bạn sẽ không biết điều đó.

Bạn có biết?

  1. 47% khách hàng rời bỏ website vì tốc độ load trang quá chậm.
  2. Cứ 0.1s load web chậm, bạn sẽ mất 1% doanh thu

Vậy để giả lập tốc độ network của người dùng như thế nào, hãy cùng mình đi tiếp nhé 😉

Mô phỏng kết nối chậm bằng Chrome

Đầu tiên cần phải có trình duyệt Chrome rồi, bạn hãy cài đặt ngay nếu chưa nhé.

Mở tab mới và mở công cụ dành cho nhà phát triển bằng cách ấn phím F12 hoặc Ctrl + Shift + I hoặc có thể làm như ảnh dưới đây nhé

Chrome: Giả lập mạng internet chậm lại trong testing

Thông thường khi lần đầu bạn mở, docker side sẽ nằm bên phải, bạn có thể chỉnh để nó nằm ở dưới cuối để dễ thao tác nhé

Chrome: Giả lập mạng internet chậm lại trong testing

Bây giờ hãy tiếp tục và nhấp vào tab Network. Ở bên phải, bạn sẽ thấy một nhãn gọi là No Throttling.

Chrome: Giả lập mạng internet chậm lại trong testing

Nếu bạn nhấp vào đó, bạn sẽ nhận được danh sách các tốc độ được  cấu hình trước mà bạn có thể sử dụng để mô phỏng kết nối chậm.

Chrome: Giả lập mạng internet chậm lại trong testing

Từ trên xuống dưới tương ứng với tốc độ từ chậm đến nhanh, bạn có thể thử nhiều trường hợp để biết chính xác website mình nhanh cỡ nào nhé.

Mục custom ⇒ add cho phép bạn tùy chỉnh băng thông bao gồm: tốc độ upload, download và độ trễ

Chrome: Giả lập mạng internet chậm lại trong testing

Bài viết gốc được đăng tải tại chungnguyen.xyz

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Kiểm thử tĩnh vs kiểm thử động (Static vs Dynamic testing)

Kiểm thử tĩnh vs kiểm thử động (Static vs Dynamic testing)

Bài viết được sự cho phép của tác giả Vân Anh

Lại một năm nữa đã đi qua, và một năm mới lại đến, hôm nay đã là tuần thứ hai của năm mới rồi mà chưa có thời gian nhìn lại một năm đã qua. Nói là “không có thời gian” thì mọi người nghe thấy cũng hơi ngờ vực, nên mình cũng sẽ phải xem lại các kế hoạch và công việc của mình, tại sao mà không có lấy nổi ít nhất hai tiếng liền mạch để viết một bài, một chủ đề cho nghiêm túc?! Lý do thì ai cũng có lý do chính đáng của mình cả, cơ bản là mình có thực sự muốn dành thời gian cho nó hay không thôi!

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  7 lãng phí trong kiểm thử phần mềm

Hehe, trên lý thuyết là như thế, nhưng mà tất nhiên là mình muốn dành thời gian cho nó, vậy nên để khắc phục (có thể là tạm thời thôi, lâu dài thì chưa biết :)) ) mình tranh thủ thời gian đi làm (khá) sớm, lúc mà công ty còn chưa có mấy người đến và cộng với thời gian đứng chờ thang máy, mới nghĩ là khoảng thời gian này khá là phù hợp để suy nghĩ và viết về những kiến thức cơ bản. Trước đó thì thời gian đến sớm mình hay ngồi đọc sách (đọc khoảng nửa tiếng thì mọi người trong công ty bắt đầu đến nhiều, ồn ào hơn thì mình cất sách đi và chuẩn bị các thứ để bắt đầu làm việc, thế nhưng cũng có những hôm đọc được tầm nửa tiếng thì mình lại buồn ngủ, trong lúc ồn ào đó mình cũng tranh thủ được 10 -15 phút haha).

Thôi lan man quá, vào chủ đề thôi, thời gian tranh thủ này thì mình đọc và ôn lại các lý thuyết về kiểm thử phần mềm, dù có thể là nó không được sử dụng trực tiếp nhiều trong công việc hàng ngày mình vẫn làm, nhưng mình nghĩ ít nhiều nó cũng có ích cho sau này, thứ nhất là kiến thức không bị mai một, tiếp nữa là khi nào cần đến thì bỏ ra xem lại sẽ nhanh hơn, và nhất là có thể sẽ giúp ích cho ai đó đang cần tìm thì sao! 😀

Hôm nay chúng ta sẽ cùng thảo luận về Static testing và Dynamic testing (Kiểm thử tĩnh và kiểm thử động). Để cho dễ hiểu và dễ hình dung hơn, mình sẽ kết hợp lý thuyết với một ví dụ cụ thể, như phía dưới đây.

Ví dụ: Ta có một mô tả yêu cầu – khá là đơn giản như sau:

Cửa sổ sẽ thực hiện mở khi người dùng bấm vào nút Mở và sẽ thực hiện đóng lại khi ấn vào nút Đóng.

1. Static testing

1.1. Static testing – Được thực hiện mà không phải thực thi code

Từ yêu cầu phía bên trên, thì các coder của chúng ta sẽ phải viết code để làm sao đáp ứng được yêu cầu của người dùng là bấm vào nút mở thì cửa mở và bấm vào nút đóng thì cửa đóng, ví dụ một giả lập như sau:

buttonPressed(){
  if ( Button ==up)
     UpMovement
  else
     DownMovement
}

Static testing sẽ làm gì ở đây, thì đó chính là kiểm tra xem đoạn code mà các coder viết có đúng, có đáp ứng được yêu cầu đó hay không, hoặc có bao phủ được một số các trường hợp cơ bản cần phải có hay không… Static testing sẽ kiểm tra đến từng dòng code, kiểm tra tính logic cũng như việc thực thi được yêu cầu đặt ra. Ở ví dụ trên là ví dụ đơn giản và dòng code mô phỏng thì khá là dễ hình dung cũng như kiểm tra, còn đối với các bài toán thực tế thì nó sẽ rắc rối hơn, yêu cầu kết hợp rất nhiều các điều kiện và các cách xử lý khác nhau, có những hàm, function dài đến cả mấy chục dòng thì việc kiểm tra không phải là đơn giản như ví dụ trên nữa :))

1.2.  Static testing – Được thực hiện ở giai đoạn Verification (Giai đoạn xác minh)

Giả sử một quy trình sơ bộ để xây dựng sản phẩm như sau:

Từ User Requirement >> System requirement >> Global design >> Detail design >> Implementation

Ở giai đoạn đầu, khi mà ta mới chỉ có các tài liệu yêu cầu, thiết kế mà chưa tiến hành viết code hay thực thi thì việc kiểm thử động là chưa khả thi, vì vậy mà việc sử dụng Static testing trên các tài liệu yêu cầu, hay các bản thiết kế ở giai đoạn này sẽ là phương án phù hợp và hiệu quả.

1.3. Góp phần tiết kiệm chi phí cho sản phẩm

Nói Static testing góp phần tiết kiệm chi phí cho sản phẩm là như thế nào? Có nghĩa là những lỗi được tìm ra ở static testing sẽ mất ít chi phí và sửa chữa hơn. Ví dụ như ở trên, tại giai đoạn Verification, từ tài liệu mô tả yêu cầu người dùng, ta có tài liệu mô tả hệ thống, rồi đến các bản thiết kế tổng thể, chi tiết nếu thực hiện tốt static testing sẽ tìm ra được những vấn đề, lỗi (nếu có) được mô tả hoặc thiết kế chưa đúng với yêu cầu của người dùng thì việc sửa chữa cập nhật tài liệu ngay từ những bước đầu này sẽ mất ít chi phí hơn là việc mãi đến giai đoạn Validation mới tìm được ra vấn đề thì sẽ tốn nhiều chi phí không đáng có hơn. Do đó giúp tiết kiệm chi phí cho sản phẩm.

1.4. Static testing thực hiện trên các luồng nghiệp vụ, và hoạt động review code.

2. Dynamic tesing:

2.1. Được thực hiện khi thực thi code

Cũng đối với ví dụ trên, static testing ngắn gọn là sẽ soi vào code còn dynamic testing thì sẽ thực hiện dựng code đó lên rồi thực thi việc test trên môi trường và thiết bị tương tự như môi trường thực tế mà phần mềm/hệ thống sẽ được sử dụng. Ta sẽ thực hiện kiểm tra hoạt động của hệ thống đúng theo luồng hoạt động và mô tả của yêu cầu, đó là nhấn vào nút mở, kiểm tra xem có đúng là cửa sổ được mở hay không? Và nhấn lại vào nút đóng thì có đúng là nó được đóng hay không? Đảm bảo việc hoạt động của các nút và chức năng tương ứng đáp ứng được yêu cầu đưa ra là được, ta sẽ không quan tâm phía dưới nó được xây dựng và chạy như thế nào, hay coder code nó như thế nào….

2.2. Được thực hiện ở giai đoạn Validation

Validation được thực hiện sau khi hệ thống đã được code dựa trên các tài liệu yêu cầu, thiết kế, vì dynamic testing được thực hiện khi run code. Tức là lúc này phải có một bản build rồi thì mới thực hiện được.

2.3. Tốn nhiều chi phí để sửa chữa cập nhật hơn

Với dynamic testing, việc kiểm thử được thực hiện sau khi đã có code, và đã được build, với những lỗi phát sinh trong quá trình code thì nó là điều không tránh khỏi thì sẽ không nói đến ở đây. Tuy nhiên những vấn đề liên quan đến lỗi tài liệu mô tả, hay lỗi thiết kế từ giai đoạn trước đó để lọt, thì sẽ mất nhiều thời gian và chi phí để sửa chữa hơn. Đối với những chức năng đơn lẻ độc lập thì chi phí đôi khi có thể là chấp nhận được, rất là hiếm khi nhưng nếu vì sơ suất trong lúc phân tích yêu cầu, ở những phần chức năng có liên quan, phụ thuộc nhau (Ví dụ như: sửa cái này thì ảnh hưởng đến hoạt động của nhiều phần khác) thì chi phí lúc này có thể tăng lên rất nhiều lần.

2.4. Dynamic testing thực hiện kiểm thử chức năng và phi chức năng.

Tạm kết

Kiến thức cơ bản liên quan đến Static và Dynamic mình tạm dừng ở đây đã, tài liệu tiếng Việt cũng có khá nhiều rồi, chi tiết cụ thể của từng cái khi mà tìm cũng không hề ít, nên mình không nói thêm, nói lại nữa :))) Lẽ ra để cột so sánh thì sẽ trực quan hơn nhưng mà vì nội dung từng mục hơi dài, và phần hiển thị của theme wordpress này cũng nhỏ nên cứ viết tràn kiểu này vậy. Hi vọng bài viết đã cung cấp một lượng thông tin hữu ích cho các bạn. Nếu có chỗ nào còn thắc mắc hay chưa rõ ý, muốn trao đổi và góp ý các bạn thoải mái để lại bình luận phía dưới nhé!

Bài viết gốc được đăng tải tại vananhtooo.wordpress.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 1

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 1

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Nếu bạn là một lập trình viên web, đặc biệt là một lập trình viên front-end thì có lẽ bạn đã từng “ngộ độc” vì có quá nhiều web framework mới ra đời.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 1

Điều đó dẫn đến hai câu hỏi đó là: “Tại sao ngày càng có nhiều web framework như vậy?” và “Giữa muôn vàn web framework như vậy thì chúng ta nên học cái nào?”

Với câu hỏi đầu tiên thì mình sẽ trả lời cho các bạn là tại sao. Còn câu hỏi thứ hai mình sẽ không trả lời là nên chọn cái nào, mà chỉ gợi ý với bạn về một số lựa chọn, vì bản chất rất khó để lựa chọn một cái.

  10 Java Web Framework tốt nhất
  Cách xử lý dữ liệu trong quá trình làm việc với framework

I. Tại sao lại ngày càng có nhiều web framework như vậy?

Các bạn cứ tưởng tượng đơn giản như thế này, ngày trước khi lắp ráp một chiếc xe ô tô thì người ta làm thủ công từng giai đoạn.

Điều này có lợi gì? Nó giúp cho việc lắp ráp được can thiệp sâu hơn. Có nghĩa là bạn có thể đi sâu vào từng khâu, kiểm soát và hoàn thành một cách theo mong muốn. Dẫn đến sản phẩm làm ra thường sẽ rất đặc biệt, rất hoàn thiện.

Nhưng nhược điểm là bạn sẽ không thể làm như vậy với một số lượng lớn xe được. Thực ra thì vẫn có thể nhưng sẽ rất tốn công và tốn tiền.

Và thế là các dây chuyền sản xuất ra đời, chuyên môn hóa từng khâu bằng robot, tiết kiệm được nhân công và thời gian sản xuất hơn rất nhiều.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 1

Sự ra đời của các web framework cũng y như vậy. Chúng ta phải giải quyết một bài toán lặp đi lặp lại. Framework giúp chúng ta đơn giản nó bằng cách gọi hàm truyền tham số chẳng hạn.

Chúng ta gặp một dự án với cấu trúc tương tự các dự án trước, framework sẽ giúp chúng ta tận dụng mã nguồn…

Nói tóm lại, framework ra đời để giúp cho việc phát triển ứng dụng thuận lợi hơn, dễ dàng hơn, chuẩn hóa các khâu trong phát triển phần mềm, hỗ trợ giải quyết các bài toán lặp đi lặp lại.

II. Giữa muôn vàn web framework như vậy chúng ta nên học cái nào?

Như mình đã trình bày bên trên, bạn sẽ phải lựa chọn và linh động trong việc học các framework nên mình sẽ không thể recommend bất cứ một framework nào. Nó tùy thuộc vào dự án và vị trí của bạn (front-end dev hay back-end dev).

Sau đây là 10 web framework (cả font-end lẫn back-end) mà mình thấy bạn có thể xem xét học khi bắt đầu.

Bất cứ framework nào thì cũng base trên một ngôn ngữ lập trình. Vì vậy các bạn nên học thật chắc ngôn ngữ lập trình mà framework đó được xây dựng.

#1. ReactJS (front-end)

Chính xác thì ReactJS là một thư viện (Library) chứ không phải là một framework (framework khác gì Library thì mình sẽ chia sẻ trong một bài khác nha).

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 1

ReactJS được viết dựa trên JavaScript, được phát triển và duy trì bởi một trong những gã khổng lồ công nghệ đó là Facebook.

Được ra đời năm 2013 và tất nhiên là ReactJS cũng là open-source – tức là các bạn có thể sử dụng ReactJS miễn phí.

ReactJS sử dụng cấu trúc component-based – tức là mọi thứ trong ReactJS đều thuộc vào các component. Sau này nhiều framework cũng ra đời và có kiến trúc component.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 1

Để tìm hiểu về ReactJS bạn có thể tham khảo tài liệu trên trang của ReactJS: https://reactjs.org/

Ưu điểm:

  • ReactJS được áp dụng trong các single-page applications để tối ưu trải nghiệm người dùng, bằng cách chỉ tải các thành phần cần thiết (không load lại trang).
  • Các ứng dụng viết bằng ReactJS dễ mở rộng do ReactJS được viết theo kiến trúc Component.
  • Khi học ReactJS, bạn sẽ dễ dàng tiếp cận với ReactNative là một framework dùng để xây dựng ứng dụng di động đa nền tảng, cũng do Facebook phát triển và đang rất “hot”
  • ReactJS được nhiều công ty lơn sử dụng như: Netflix, Facebook, Airbnb, Reddit…

Nhược điểm:

  • Được viết bằng javascript nên nếu bạn nào nhảy vào học ReactJS luôn sẽ gặp khó khăn vì vốn dĩ JavaScript nó đã “dị” rồi.
  • Tài liệu về ReactJS theo như cộng đồng chia sẻ thì khó và ít tài liệu hay.

#2. Angular (front-end)

Là một front-end web framework được phát triển bởi Google và phát hành vào năm 2016 (hàng Google nghe thôi đã thấy “ngon” rồi).

Trước khi nhắc đến Angular thì chúng ta phải nhắc đến AngularJS. Đây chính là tiền thân của Angular (ra đời năm 2010). Nhưng do hiệu năng không tốt nên đã được cải tiến để trở thành các phiên bản Angular sau này.

Angular được viết dựa trên TypeScript (cũng kiểu như JavaScript nhưng chặt chẽ hơn, hướng đối tượng).

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 1

Tất nhiên là Angular cũng là một framework open-source nên bạn có thể sử dụng miễn phí framework này. Để tìm hiểu về framework này bạn có thể tham khảo tài liệu tại đây: https://angular.io/tutorial

Ưu điểm:

  • Angular phù hợp với các ứng dụng lớn, tức là nếu bạn có ý tưởng về việc phát triển ứng dụng trên nền tảng web và cả di động thì Angular là lựa chọn phù hợp.
  • Angular hỗ trợ binding dữ liệu hai chiều – có nghĩa rằng dữ liệu được đồng bộ hóa giữa tầng View và Model.

Nhược điểm:

  • Cộng đồng front-dev đều phải công nhận học Angular khá là khó. Nếu đem so sánh với ReactJS và VueJS thì Angular khó học hơn.
  • Với lại Angular không phù hợp với các ứng dụng nhỏ cần thời gian phát triển ngắn.

#3. VueJS

Nếu như vài năm trước cộng đồng web front-end có ReactJS và Angular xưng bá thì những năm trở lại đây có thêm VueJS chen chân vào cuộc đua này.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 1

VueJS được ra đời năm 2014 bởi một kỹ sư người Trung Quốc. Có thể nói VueJS kết hợp được những nét hay ho của của ReactJS và AngularJS.

Cách viết template của VueJS khá giống với AngularJS, nhưng cách tổ chức file lại khá giống với ReactJS.

VueJS cũng là một open-source framework, được cộng đồng Trung Quốc và open-source chống lưng phát triển. Các bạn có thể đọc thêm về VueJS tại đây: https://vuejs.org/

Ưu điểm:

  • Có thể nói VueJS là một trong những framework nhẹ nhất hiện nay (chỉ khoảng 20KB)
  • VueJS được đánh giá là dễ học, phù hợp cho cả người mới học nhưng cũng linh hoạt cho cả những người sử dụng nâng cao.

Nhược điểm:

  • Ở Việt Nam thì VueJS còn khá mới nên số lượng job không nhiều, các dự án lớn cũng không thích hợp với VueJS
  • Cộng đồng người dùng còn hạn chế so với ReactJS và Angular.

#4. ExpressJS (back-end)

Trước khi nói về Express thì chúng ta phải nói về NodeJS, vì đây chính là base của Express. Nói cách khác Express được viết bằng nodejs.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 1

Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine.

Chúng ta biết rằng JavaScript chỉ có thể chạy được ở phía client (trên trình duyệt người dùng), nhưng về sau nodejs ra đời đã giúp chúng ta có thể viết code javascript ở cả phía back-end.

Express chính là một framework được viết dựa trên nodejs. Nó cung cấp cho chúng ta rất nhiều tính năng mạnh mẽ trên nền tảng web cũng như trên các ứng dụng di động.

TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 1

Một số tính năng của ExpressJS có thể kể đến như:

  • Thiết lập các lớp trung gian để trả về các HTTP request
  • Định nghĩa router cho phép sử dụng với các hành động khác nhau dựa trên phương thức HTTP và URL
  • Cho phép trả về các trang HTML dựa vào các tham số.
  • Các bạn có thể đọc thêm về ExpressJs tại đây: http://expressjs.com/

Ở Việt Nam, nodejs nói chung và express nói riêng đang ngày càng được sử dụng nhiều, đặc biệt là trong các dự án không quá lớn. Học nodejs và Express là một lựa chọn khá là phù hợp tại thời điểm hiện tại.

III. Lời Kết

Vậy là trong phần 1 của bài viết này mình đã chia sẻ với các bạn 4 web framework của các ông lớn công nghệ để các bạn có thể tham khảo, học hỏi, cũng như tìm hiểu thêm rồi ha.

Tất cả đều được xây dựng một cách gián tiếp hoặc trực tiếp từ JavaScript. Vì vậy nếu mới học mình khuyên các bạn hãy bắt đầu từ việc học JavaScript thật chắc trước nha. Hẹn gặp các bạn trong phần 2 !

Bài viết gốc được đăng tải tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Phát triển phần mềm theo kiến trúc microservice

Phát triển phần mềm theo kiến trúc microservice

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Không có một định nghĩa chung nào cho mô hình microservice. Nhưng về cơ bản, microservice là cách thức phát triển phần mềm như một bộ các service có thể triển khai độc lập được [1].

  Fluent Design – Ngôn Ngữ Thiết Kế Mới Của Microsoft
  Cloud-Native Microservices Với TIBCO: Khám phá dịch vụ bằng cách sử dụng Consul

1. Mô hình kiến trúc Microservice

Phát triển phần mềm theo kiến trúc microservice

Sơ đồ trên là một thể hiện của mô hình microservice. Trên thực tế mô hình microservice được áp dụng vào các sản phẩm có rất nhiều biến thể, sẽ rất khó để có một mô hình phù hợp và chính xác cho từng bài toán.

Theo kiến trúc trên, một ứng dụng được chia thành một bộ các microservice, mỗi microservice thực chất là một service có thể được triển khai và chạy độc lập. Chúng tách biệt về mặt mã nguồn, về hoạt động và dữ liệu. Mỗi microservice có nơi chứa dữ liệu của riêng của nó và chỉ có nó có quyền truy cập vào vùng dữ liệu này. Do các microservice là độc lập, chúng không giao tiếp trực tiếp với nhau mà qua một thành phần trung gian được gọi là API gateway. Có thể thấy vai trò của API gateway rất quan trọng trong mô hình microservice. Nó là điểm đến và đi của mọi yêu cầu hay phản hồi.

2. Các đặc trưng của mô hình Microservice

1. Micro-service

Đặc trưng này được thể hiện ngay từ tên của kiến trúc. Nó là microservice chứ không phải là miniservice hay nanoservice. Trên thực tế không tồn tại mô hình kiến trúc cho miniservice hay nanoservice. Từ microservice được sử dụng để giúp người thiết kế có cách tiếp cận đúng đắn. Một ứng dụng lớn cần được chia nhỏ ra thành nhiều thành phần, các thành phần đó cần tách biệt về mặt dữ liệu (database) và phải đủ nhỏ cả về mặt kích cỡ và độ ảnh hưởng của nó trong hệ thống, khi thêm một microservice vào hệ thống cũng nên đảm bảo rằng nó đủ nhỏ để dễ dàng tháo gỡ, xóa bỏ khỏi hệ thống mà không ảnh hưởng nhiều tới các thành phần khác.

2. Tính độc lập

Các microservice hoạt động tách biệt nhau trong hệ thống, do vậy việc build một microservice cũng độc lập với việc build các microservice khác. Thông thường, để tiện cho việc phát triển và duy trì các microservice, người phát triển nên viết các built script khác nhau cho mỗi microservice.

Do tính tách biệt này mà mỗi microservice đều dễ dàng thay thế và mở rộng. Hơn thế nữa, nó còn giúp việc phát triển các microservice linh động hơn, các microservice có thể được phát triển bởi các team khác nhau, dùng các ngôn ngữ khác nhau và tiến độ phát triển dự án cũng nhanh hơn do không có sự phụ thuộc giữa các team, mỗi team có thể chủ động quản lý phần việc riêng của mình.

3. Tính chuyên biệt

Mỗi microservice là một dịch vụ chuyên biệt, có thể hoạt động độc lập, thông thường mỗi microservice đại diện cho một tính năng mà các công ty/ doanh nghiệp muốn cung cấp tới người dùng, do vậy người thiết kế hệ thống microservice cần hiểu rõ về hoạt động kinh doanh của công ty. Các đầu vào đầu ra và chức năng của mỗi microservice cần được định nghĩa rõ ràng.

4. Phòng chống lỗi

Kiến trúc microservice sinh ra là để dành cho các hệ thống từ lớn đến vô cùng lớn. Nó áp dụng phương pháp chia để trị, phương pháp này giúp việc áp dụng các công cụ, kỹ thuật cho việc giám sát,phòng chống lỗi phần mềm, lỗi hệ thống hiệu quả.

Khi một thành phần trong hệ thống bị lỗi, nó có thể được thay thế bằng các thành phần dự phòng một cách dễ dàng, trong quá trình thay thế thành phần bị lỗi, các thành phần khác vẫn hoạt động bình thường, do vậy hoạt động của toàn bộ hệ thống sẽ không hoặc ít bị gián đoạn.

3. Các ưu và nhược điểm của Microservice

Phát triển phần mềm theo kiến trúc microservice

 1. Kiến trúc ứng dụng nguyên khối (Monolithic application)

Các ứng dụng phần mềm được phát triển theo kiến trúc nguyên khối rất phổ biến.

Với kiến trúc nguyên khối toàn bộ ứng dụng là một khối lớn, trong khối lớn ấy có chia thành các mô đun nhỏ, mỗi mô đun thực hiện một nhiệm vụ riêng và các mô đun thường gọi nhau qua function call. Việc phát triển và triển khai ứng dụng với kiến trúc này khá đơn giản khi mà các IDE hỗ trợ rất tốt việc kiểm tra và chạy ứng dụng với chỉ một cú click chuột hay một phím tắt. Kiến trúc này cũng đặc biệt phù hợp với các công ty outsource, họ có thể tạo ra một mẫu ứng dụng(template) và khi nhận được dự án với khách hàng mới họ chỉ việc bê mẫu này ra và chỉnh sửa, thêm thắt một vài phần khác biệt mà khách hàng yêu cầu.

Kiến trúc nguyên khối có thể mở rộng bằng cách thêm một load balancer (thiết bị cân bằng tải) và triển khai thêm các khối ứng dụng nữa nếu cần.

Tuy nhiên khi ứng dụng trở lên ngày càng lớn thì mô hình kiến trúc này bộc lộ càng nhiều điểm yếu.

Trong ứng dụng nguyên khối, sự chặt chẽ là vừa là ưu điểm vừa là nhược điểm. Với một khối ứng dụng lớn, người ta phải định nghĩa ra các tiêu chuẩn và các mẫu thiết kế, các mẫu đầu vào, đầu ra để đảm bảo cho code có chất lượng cao và nhất quán. Sự chặt chẽ và nhất quán này đôi khi là rào cản cho một số lập trình viên khác, họ không quen hoặc họ thích dùng các chuẩn viết code khác hơn, những lập trình viên mới cũng phải mất một thời gian dài ban đầu để làm quen với điều này.

Khi ứng dụng nguyên khối ngày một lớn thì quá trình maintain (duy trì) và sửa lỗi ứng dụng cũng trở thành ác mộng vì thời gian build và khởi động lại ứng dụng rất lớn. Đôi khi chỉ sửa một dòng code mà phải khởi động lại cả một chương trình to mất tới cả nửa tiếng.

Khi một ứng dụng thành công, ngày càng nhiều người biết tới và sử dụng, việc mở rộng ứng dụng để đáp ứng được nhiều người dùng là điều cần làm.

Giả sử bạn xây dựng một trang mạng xã hội theo kiến trúc nguyên khối có các thành phần chính là upload ảnh để chia sẻ, gợi ý kết bạn, hiển thị quảng cáo và hộp tin nhắn. Lượng người dùng trên trang của bạn tăng lên rất nhiều lần nhưng lưu lượng chủ yếu lại đổ vào phần hộp tin nhắn. Lúc này để mở rộng năng lực của website bạn phải triển khai thêm toàn bộ khối ứng dụng trên các server khác bao gồm tất cả các thành phần: upload ảnh, gợi ý kết bạn, hiển thị quảng cáo và hộp tin nhắn. Rõ ràng việc này gây lãng phí tài nguyên vì các thành phần upload ảnh, gợi ý kết bạn, hiển thị quảng cáo cũng được triển khai và chiếm dụng tài nguyên dù rằng việc mở rộng chúng là điều không cần thiết. Hơn nữa việc nhiều thành phần khác nhau thực hiện các business logic khác nhau được triển khai trên cùng server có thể cũng gây ảnh hưởng và đụng độ lẫn nhau.

Như vậy khi ứng dụng lớn dần lên, đến một lúc nào đó, kiến trúc nguyên khối sẽ không còn thực sự phù hợp nữa. Sự gia đời của kiến trúc Microservice là để khắc phục điều này.

2. Kiến trúc Microservice

Ưu điểm Nhược điểm
– Cho phép lập trình viên linh động hơn trong việc lựa chọn ngôn ngữ, công cụ và nền tảng để phát triển và triển khai các microservice (tuy nhiên trong một hệ thống, việc lựa chọn các ngôn ngữ khác nhau để phát triển các microservice không được khuyến khích)
– Một microservice có thể được phát triển bởi một team nhỏ. Do vậy việc quản lý sẽ dễ dàng hơn.
– Dễ dàng thực hiện tự động tích hợp và tự động triển khai (CI-CD) bằng cách sử dụng một số công cụ như Jenkins, Hudson …
– Mỗi microservice có kích thước nhỏ, giúp cho các lập trình viên dễ tiếp cận, đọc hiểu source code. Do vậy các thành viên mới tham gia team sẽ hòa nhập và đóng góp cho team nhanh hơn.
– Các microservice khởi động nhanh giúp quá trình phát triển, kiểm thử cũng nhanh hơn.
– Dễ dàng mở rộng và tích hợp với các dịch vụ của bên thứ ba.
– Cô lập lỗi tốt hơn, khi một microservice bị lỗi và ngừng hoạt động thì các microservice khác vẫn có thể hoạt động bình thường. Với mô hình nguyên khối, một lỗi nhỏ có thể làm cả hệ thống ngừng hoạt động.
– Khi cần thay đổi một thành phần, thì chỉ cần sửa đổi, cập nhật và triển khai lại thành phần đó chứ không cần triển khai lại toàn bộ hệ thống.
– Nhược điểm của kiến trúc microservice đến từ bản chất của hệ thống phân tán.
– Việc triển khai hệ thống microservice phức tạp hơn nhiều so với việc triển khai hệ thống nguyên khối.
– Các lập trình viên phải tốn nhiều công sức hơn để thực hiện phần giao tiếp giữa các microservice, với kiến trúc nguyên khối có khi họ chỉ cần gọi hàm để thực hiện việc này.
– Các microservice thường (nên) được triển khai bên trong docker container và giao tiếp với nhau qua REST API. Việc này làm hiệu năng của toàn bộ chương trình ứng dụng giảm xuống đáng kể do giới hạn tốc độ truyền tải của các giao thức và tốc độ mạng. Hơn nữa việc giao tiếp giữa các microservice có thể bị lỗi khi các kết nối bị lỗi.
– Cần tính toán kích cỡ của một microservice. Nếu một microservice quá lớn, bản thân nó trở thành một ứng dụng theo kiến trúc nguyên khối. Nếu một microservice quá nhỏ thì độ phức tạp của hệ thống tăng lên rất nhiều, làm cho hệ thống trở lên khó hiểu, lúc này việc quản lý giám sát và triển khai hệ thống sẽ khó khăn hơn.
– Khi ứng dụng ngày càng lớn lên, số lượng microservice ngày càng nhiều, các lập trình viên thường có xu hướng sử dụng sự hỗ trợ từ các công cụ mã nguồn mở, hoặc của bên thứ 3, việc sử dụng, tích hợp các công cụ này làm cho hệ thống khó kiểm soát và có thể bị dính các mã độc làm cho hệ thống kém an toàn.

4. Thiết kế phần mềm theo kiến trúc Microservice

Tham khảo: What Is Microservices – Introduction To Microservice Architecture

1. Mỗi microservice nên có một database riêng biệt

Việc này đảm bảo cho microservice có tính đóng gói cao. Tuy vậy việc phân tách nơi chứa dữ liệu cho mỗi microservice không hề đơn giản, nó là phần khó nhất trong việc thiết kế ứng dụng phần mềm theo kiến trúc microservice. Do đó, rất nhiều người chọn lựa thiết kế sử dụng chung database cho nhiều microservice.

Phát triển phần mềm theo kiến trúc microservice

Cách này tồn tại một hạn chế là khi database schema cần thay đổi cho microservice1 thì nó sẽ làm ảnh hưởng và gây lỗi cho các microservice khác sử dụng chung database này. Để sửa lỗi, ta cần sửa đổi, cập nhật toàn bộ microservice còn lại để chúng có thể hoạt động với schema mới.

Có một cách tiếp cận khác, giúp tránh được hạn chế trên.

Phát triển phần mềm theo kiến trúc microservice

Sơ đồ trên, microservice2 không truy cập trực tiếp vào database, thay vào đó nó truy cập database thông qua microservice1. Do đó việc thay đổi schema của database sẽ không ảnh hưởng tới microservice2. Tuy nhiên với cách tiếp cận này thì microservice2 phụ thuộc vào microservice1, khi microservice1 có lỗi thì microservice2 cũng bị lỗi theo.

Việc chọn cách tiếp cận nào phụ thuộc rất nhiều vào tình hình thực tế của dự án. Cần cân nhắc thiệt hơn của mỗi phương án để đưa ra lựa chọn cuối cùng.

2. Giữ source code của microservice ở mức hợp lý

Như đã đề cập ở phần ưu và nhược điểm của microservice. Kích thước source code của một microservice không nên quá nhỏ hoặc quá lớn. Tuy nhiên cái khó ở đây là không có một con số định lượng cho kích thước của một microservice, nên thông thường việc quyết định kích thước của một microservice là do kinh nghiệm, cảm tính.

3. Tạo build script cho mỗi microservice

Build script có thể là một file bash hoặc Dockerfile để đóng gói microservice vào bên trong một docker image.

4. Triển khai mỗi microservice bên trong một app (docker container)

Việc triển khai mỗi microservice trong một docker container đem lại rất nhiều lợi ích cho việc triển khai và mở rộng ứng dụng cũng như việc phân chia tài nguyên phần cứng cho mỗi microservice. Hiện nay có rất nhiều công cụ hỗ trợ cho việc liên tục tích hợp, liên tục triển khai hệ thống microservice. Các công cụ này giúp tăng hiệu quả làm việc cho các lập trình viên, giảm thời gian phôi phối sản phẩm phần mềm, và các công cụ này đòi hỏi mỗi microservice được đóng gói trong một docker image và triển khai trên app.

5. Stateless server

Khi một yêu cầu được gửi đến server thì một phiên làm việc (session) được mở ra, kèm theo đó là các thông tin của phiên. Stateless server là server không lưu thông tin của phiên. Mà thông tin về phiên được lưu ở một nơi khác, như caching server chẳng hạn.

Việc này rất quan trọng, bởi vì mỗi microservice thường được đóng gói thành một docker image. Khi muốn cập nhật một microservice, ta cập nhật docker image của nó, và khi chạy docker image mới (xóa bỏ container cũ và tạo container mới dựa trên image mới) thì toàn bộ thông tin của các phiên hoạt động trên container cũ sẽ bị mất, thông tin phiên thường bao gồm thông tin mà client gửi tới server, mất thông tin này là một lỗi vô cùng nghiêm trọng. Nếu container là stateless thì nó không lưu thông tin của các phiên nên không có gì để mất cả.

Kết luận

Kiến trúc microservice không nhỏ như cái tên của nó. Mà nó là một kiến trúc dành cho các ứng dụng lớn. Nếu ứng dụng của bạn chưa đủ lớn và cũng không có ý định mở rộng trong tương lai thì hướng phát triển theo kiến trúc nguyên khối vẫn là một lựa chọn hợp lý.

Kiến trúc microservice giải quyết được rất nhiều vấn đề của kiến trúc nguyên khối, nó tỏ ra vượt trội kiến trúc nguyên khối ở nhiều khía cạnh. Tuy nhiên kiến trúc này cũng có không ít những hạn chế.

Nguồn tham Khảo

[1] https://smartbear.com/learn/api-design/what-are-microservices/

[2] https://www.edureka.co/blog/what-is-microservices/

[3] https://searchmicroservices.techtarget.com/definition/business-capability

[4] https://smartbear.com/learn/api-design/what-are-microservices/

[5] The What, Why, and How of a Microservices Architecture

[6] https://blog.newrelic.com/technology/microservices-what-they-are-why-to-use-them/

[7] https://whatis.techtarget.com/definition/business-logic

[8] https://www.quora.com/Should-each-microservice-have-its-own-database

[9] http://blog.christianposta.com/microservices/the-hardest-part-about-microservices-data/

[10] Best Practices for Building a Microservice Architecture

[11] https://blog.runscope.com/posts/5-reasons-not-to-use-microservices

Bài viết gốc được đăng tải tại lcdung.top

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Hãy lưu ý 5 điều sau để giảm nguy cơ bị tấn công mạng

Hãy lưu ý 5 điều sau để giảm nguy cơ bị tấn công mạng

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Tấn công mạng hiện đang rất phổ biến, nó không chỉ xảy ra với các tổ chức hay doanh nghiệp lớn, mà nó còn tập trung vào các cá nhân ít hiểu biết về công nghệ, về kiến thức sử dụng máy tính và có tính chủ quan trong phòng chống rò rỉ dữ liệu cá nhân, dẫn đến những hậu quả không đáng có.

  Cách mạng 0.4 của Neovim: Floating Window
  Cách Mạng Công Nghệ Lần 4: Các Ông Trùm Công Nghệ Đang Hướng Đến Thị Trường Di Động Việt Nam

Chính vì vậy mà trong bài viết này, mình sẽ chia sẻ một vài điều mà bạn cần lưu ý để có thể an toàn trước các nguy cơ tấn công mạng trên Internet.

Ngoài những cách bên dưới mình đề xuất ra, nếu bạn còn có thêm phương pháp nào hay và hiệu quả khác nữa thì đừng ngần ngại chia sẻ phía bên dưới phần comment nha.

#1. SỬ DỤNG PASSWORD KHÓ ĐOÁN

Khi bạn sử dụng các dịch vụ trên Internet, bạn phải sử dụng các mật khẩu mạnh đủ mạnh, bao gồm: các chữ cái viết thường, viết HOA, xen kẽ là các chữ số và các kí tự đặc biệt như @#$%&… thì mới tạo nên những mật khẩu mạnh được.

Bạn cũng nên tạo thói quen thay đổi mật khẩu sau một khoảng thời gian để nếu vì một sự cố nào đó mà mật khẩu cũ bị lộ ra thì tài khoản của bạn vẫn còn được an toàn.

cach-giam-nguy-co-bi-tan-cong-mang (1)

Đặc biệt, bạn không nên dùng một mật khẩu cho nhiều loại tài khoản khác nhau, nếu bạn hay quên mật khẩu của mình thì có thể sử dụng các dịch vụ bên thứ ba để quản lý mật khẩu như 1Password, Swifty, Dashlane, LastPass

Nhưng sẽ tốn một khoản phí hàng tháng đó, hoặc cách rẻ nhất mà bạn có thể làm là ghi vào giấy hoặc đâu đó rồi bảo quản nó thật tốt :))

#2. SỬ DỤNG BẢO MẬT HAI LỚP

Bảo mật hai lớp đúng như tên gọi của nó, là bạn phải vượt qua hai lớp mật khẩu thì mới truy cập được vào tài khoản được.

Một lớp là mật khẩu mà bạn đã thiết lập lúc mới tạo tài khoản, còn một lớp thì bạn phải nhập mã OTP (One Time Password) được gửi qua tin nhắn SMS hoặc qua các ứng dụng như Google Authenticator, Microsoft Authenticator,…

cach-giam-nguy-co-bi-tan-cong-mang (2)

Với cách này ngay cả khi hacker có đoán được mật khẩu của bạn rồi thì hắn cũng không thể đăng nhập vào tài khoản  ngay được, mà phải cần thêm mã OTP từ thiết bị của bạn nữa. Nên có ai đó yêu cầu bạn cung cấp mã OTP thì cũng đừng có dại mà đưa nhé, nhiều vụ bị lừa lắm rồi.

Hiện tại hầu hết các dịch vụ lớn trên Internet đều hỗ trợ bảo mật hai lớp như Gmail, Facebook, DropBox, OneDrive,… bạn có thể mở kích hoạt nó trong phần cài đặt của tài khoản ha.

Mã OTP cũng không quá phiền đâu, chỉ khi bạn đăng nhập trên một thiết bị mới thì nó mới yêu cầu nhập mã OTP, còn nếu bạn vẫn sử dụng trên một thiết bị thì bạn chỉ cần nhập mật khẩu thôi.

#3. THƯỜNG XUYÊN CẬP NHẬT HỆ ĐIỀU HÀNH VÀ CÁC PHẦN MỀM DIỆT VIRUS, ỨNG DỤNG..

Bạn không nên tắt các bản cập nhật của Windows vì nếu có các lỗ hổng nghiêm trọng thì Microsoft sẽ vá chúng qua các bản cập nhật, và nếu bạn tắt UPDATE Windows thì bạn sẽ không nhận được bản vá kịp thời được nữa.

Dù biết là các bản cập nhật Windows gần đây có khá là nhiều lỗi, nhưng đành phải sống chung với lũ thôi các bạn ạ (┬┬﹏┬┬)

cach-giam-nguy-co-bi-tan-cong-mang (3)

Bạn cũng nên thường xuyên cập nhật các phần mềm, đặc biệt là phần mềm diệt Virus, bình thường thì các phần mềm sẽ tự động update nên bạn không cần phải làm gì thêm đâu.

Nhưng nếu không an tâm thì bạn có thể tự kiểm tra trên trang chủ của các phần mềm đó.

#4. SAO LƯU TẤT CẢ DỮ LIỆU QUAN TRỌNG LÊN CLOUD

Các mối nguy hiểm không chỉ đến từ tấn công mạng, mà có khi nó nằm ngay chính cái ổ cứng “đến tháng” của bạn.

Bạn không thể đảm bảo được ổ cứng của bạn ngày mai có thể chạy bình thường hay không, nên việc sao lưu dữ liệu là cực kỳ quan trọng.

cach-giam-nguy-co-bi-tan-cong-mang (1)

Nếu chẳng may bị dính Virus mã hóa dữ liệu thì bạn chỉ cần cài lại Windows rồi tải dữ liệu trên cloud về và làm việc tiếp thôi.

Các dịch vụ cloud phổ biến hiện nay như Google Drive, OneDrive, Dropbox, iCloud,… cụ thể hơn thì bạn có thể tham khảo bài viết các dịch vụ lưu trữ đám mây tốt nhất hiện nay nhé !

Nếu bạn vẫn chưa thật sự an tâm với các dịch vụ lưu trữ này thì bạn cũng có thể mua thêm ổ cứng ngoài để lưu trữ cho an tâm hơn.

#5. SỬ DỤNG VPN KHI ĐANG DUYỆT WEB

Bạn nên đầu tư cho mình một VPN để khi duyệt web nó có thể bảo vệ các thông tin của bạn được an toàn hơn. VPN trên thị trường có rất nhiều loại từ miễn phí đến trả phí bạn có thể tự tìm hiểu nhé.

cach-giam-nguy-co-bi-tan-cong-mang (4)

Đặc biệt là khi sử dụng WiFi công cộng thì bạn nên dùng thêm VPN, vì bạn có thể để lộ rất nhiều thông tin nhạy cảm khi truy cập các trang web không sử dụng giao thức https.

Tốt nhất là bạn không nên đăng nhập vào tài khoản ngân hàng, hay các tài khoản quan trọng khác khi đang sử dụng wifi công cộng.

Nếu gấp quá thì bạn có thể đăng ký các gói Data của nhà mạng để sử dụng chứ không nên đánh liều để rồi mất tiền thì chẳng biết kêu ai nhé. (T_T)

#6. LỜI KẾT

Vâng, trên đây là những lưu ý mà bạn cần phải đặc biệt quan tâm trên môi trường Internet. Và cũng đừng quên đọc lại bài viết này của Admin để tránh bị hack, bị chiếm đoạt tài khoản…: 13 lưu ý bạn PHẢI BIẾT để luôn được AN TOÀN TRÊN INTERNET

Okay. Vậy là mình đã giới thiệu với bạn một vài thứ mà bạn cần phải lưu ý để có thể an toàn trước những hacker nguy hiểm ngoài kia, hãy chia sẻ để nhiều người cũng được an toàn như bạn nhé. Chúc bạn thành công !

Bài viết gốc được đăng tải tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Selenium là gì? Giới thiệu chi tiết về Selenium Automation Testing

Bài viết được sự cho phép của tác giả Vân Anh

Bắt đầu với chuỗi bài học liên quan đến Selenium, mình muốn ôn lại một chút về lý thuyết, định nghĩa và một số các ưu nhược điểm của Selenium. Mấy kiến thức này có thể có trong bài test vòng sơ tuyển của một số công ty muốn tuyển vị trí automation test (ahihi cái này là mình đoán thế nhé). Mà dù có hay không thì cũng đâu quan trọng, vì dù gì thì trước khi sử dụng cái gì đó thì mình cũng nên biết một ít về lai lịch của nó, coi như là làm quen bước đầu để dễ làm việc với nhau ấy mà. Giống như quảng cáo bao giờ chả có câu “đọc kỹ hướng dẫn sử dụng trước khi dùng” đó.

Không lan man mất thì giờ nữa, trong lĩnh vực phần mềm nói chung và riêng mảng test nói riêng, thì khi nhắc đến Selenium người ta thường nghĩ ngay đến nó như là một tool đi liền với automation. Vậy thì Selenium là gì?

Selenium là gì?

Selenium là một bộ công cụ kiểm thử tự động open source (open source test automation tool), dành cho các ứng dụng web, hỗ trợ hoạt động trên nhiều trình duyệt và nền tảng khác nhau như Windows, Mac, Linus… Với Selenium, bạn có thể viết các testscript bằng các ngôn ngữ lập trình khác nhau như Java, PHP, C#, Ruby hay Python hay thậm chí là Perl…

Selenium được sử dụng để automate các thao tác với trình duyệt, hay dễ hiểu hơn là nó giúp giả lập lại các tương tác trên trình duyệt như một người dùng thực sự. Ví dụ bạn có thể lập trình để tự động bật trình duyệt, open một link, input dữ liệu, hay get infor page, upload, download dữ liệu từ trên web page. Với selenium bạn có thể làm đc rất nhiều thứ. Hơn thế nữa, bạn có thể sử dụng, tùy biến để tận dụng tối đa sức mạnh của nó. Ngoài mục đích sử dụng trong kiểm thử, bạn có thể tự xây dựng một project để automate những công việc nhàm chán, lặp đi lặp lại của bạn.

Định nghĩa Selenium là gì khá dài, với Selenium ta có thể mô phỏng hầu hết những thao tác người dùng với trình duyệt (nhấp – click, cuộn – scroll, đóng tab, click check box, …)

Selenium được phát triển bởi ThoughtWorks từ năm 2004 với tên ban đầu là JavaScriptTestRunner. Đến năm 2007, tác giả Jason Huggins rời ThoughtWorks và gia nhập Selenium team, một phần của Google và phát triển thành Selenium như hiện nay.

  JavaScript Executor trong Selenium Webdriver

Selenium bao gồm những gì?

Selenium là một khái niệm chung về một bộ phần mềm được sử dụng trong automation, mỗi loại trong đó đáp ứng một yêu cầu testing khác nhau. Về cơ bản thì Selenium Suite có 4 thành phần:

Selenium Suite

  1. Selenium IDE: Selenium Integreted Development Environment (IDE), là một plug-in trên trình duyệt Fire-Fox, ta có thể sử dụng để record và play back lại các thao tác đó theo một quy trình hay một test case nào đó.
  2. Selenium RC: Selenium Remote Control (RC), Selenium server khởi chạy và tương tác với trình duyệt web.
  3. WebDriver: Selenium WebDriver gửi lệnh khởi chạy và tương tác trực tiếp tới các trình duyệt mà không cần thông qua một server như Selenium RC.
  4. Selenium Grid: Selenium Hub dùng để khởi chay nhiều các test thông qua các máy và các trình duyệt khác nhau tại cùng một thời điểm.

Năm 2008, Selenium team đã quyết định gộp Selenium RC và WebDriver để tạo ra Selenium 2 với nhiều tính năng mạnh mẽ hơn, mà hiện nay phần lớn các project Selenium đều sử dụng. Selenium 1 được gọi là Selenium RC.

Cùng tìm hiểu chi tiết một chút về các thành phần này:

Selenium IDE

Selenium IDE

Selenium Integrated Development Environment (IDE), là framework đơn giản nhất và dễ học nhất trong bộ Selenium. Nó là một plug-in chỉ dành cho trình duyệt FireFox – bạn chỉ có thể sử dụng Selenium IDE với trình duyệt FireFox mà thôi. Bạn có thể kết hợp Selenium IDE với các plug-in khác để tận dụng được nhiều tính năng hơn với IDE.

Tuy nhiên, vì nó đơn giản nên bạn cũng chỉ thực hiện được những case đơn giản mà thôi. Với những case phức tạp hơn, thì bạn phải sử dụng WebDriver.

Ưu điểm:

  1. Dễ dàng cài đặt và sử dụng
  2. Không yêu cầu người dùng phải có kỹ năng lập trình, chỉ cần bạn có hiểu biết một chút về HTML và DOM là đã có thể sử dụng được tool rồi.
  3. Có thể export các test đã tạo để sử dụng trong Webdriver hoặc Selenium RC
  4. Có cung cấp chức năng để bạn có thể report kết quả hoặc các hỗ trợ khi sử dụng
  5. Bạn có thể sử dụng tích hợp với các extension khác nữa.

Nhược điểm:

  1. Là 1 extension mà bạn chỉ có thể cài đặt trên trình duyệt Fire Fox
  2. Nó được thiết kể để tạo các test đơn giản hoặc prototype test
  3. Với IDE thì bạn không thể thực hiện được các tính toán, câu lệnh phức tạp, hay có điều kiện.
  4. Hiệu năng hoạt động thì chậm hơn nhiều so với Webdriver và Selenium RC

Selenium Webdriver

Selenium Webdriver

Selenium Webdriver được đánh giá là tốt hơn Selenium IDE và Selenium RC trên rất nhiều các khía cạnh. Selenium Webdriver thực hiện automate tương tác với trình duyệt với hướng tiếp cận hiện đại và ổn định hơn. Các tương tác với trình duyệt được gửi trực tiếp từ Selenium driver mà không thông qua Javascript như selenium RC.

Selenium Webdriver hỗ trợ nhiều các ngôn ngữ lập trình như: Java, C#, PHP, Python, Perl và Ruby.

Ưu điểm:

  1. Communicate trực tiếp với trình duyệt
  2. Tương tác với trình duyệt giống như thao tác của một người dùng thật
  3. Tốc độ nhanh hơn so với Selenium IDE
  4. Thao tác dễ dàng hơn với các phép tính toán logic hay các điều kiện phức tạp

Nhược điểm:

  1. Cài đặt phức tạp hơn so với Selenium IDE
  2. Đòi hỏi người dùng phải có kĩ năng lập trình

Selenium Grid

Về lý thuyết ta có thể hiểu đây là ta xây dựng một Selenium hub dùng để khởi chay nhiều các test thông qua các máy và các trình duyệt khác nhau tại cùng một thời điểm. Có thể hiểu đơn giản thông qua hình dưới đây:

Selenium Grid

Bằng cách chạy các kiểm thử song song, Grid giúp giảm đáng kể thời gian kiểm thử tổng thể.

>> Xem thêm: Thực thi kiểm thử tự động Selenium với Selenium-Grid

Các đặc điểm của Selenium

  • Mã nguồn mở: Phải nói điểm này là điểm mạnh nhất của Selenium khi so sánh với các test tool khác. Vì là mã nguồn mở nên chúng ta có thể sử dụng mà không phải lo lắng về phí bản quyền hay thời hạn sử dụng.
  • Cộng đồng hỗ trợ: Vì là mã nguồn mở nên Selenium có một cộng đồng hỗ trợ khá mạnh mẽ. Bên cạnh đó, Google là nơi phát triển Selenium nên chúng ta hoàn toàn có thể yên tâm về sự hổ trợ miễn phí khi có vấn đề về Selenium. Tuy nhiên, đây cũng là một điểm yếu của Selenium. Cơ bản vì là hàng miễn phí, cộng đồng lại đông nên một vấn đề có thể nhiều giải pháp, và có thể một số giải pháp là không hữu ích. Mặc khác, chúng ta không thể hối thúc hay ra deadline cho sự hỗ trợ.
  • Selenium hỗ trợ chạy trên nhiều OS khác nhau với mức độ chỉnh sửa script hầu như là không có. Thực sự thì điều này phụ thuộc phần lớn vào khả năng viết script của chúng ta.
  • Chạy test case ở backround: Khi chúng ta thực thi một test scrpit, chúng ta hoàn toàn có thể làm việc khác trên cùng một PC. Điều này hỗ trợ chúng ta không cần tốn quá nhiều tài nguyên máy móc khi chạy test script.
  • Không hỗ trợ Win app: Selenium thực sự chỉ hỗ trợ chúng ta tương tác với Browser mà không hỗ trợ chúng ta làm việc với các Win app, kể cả Win dialog như Download/Upload – ngoại trừ Browser Alarm. Vậy nên, để xử lý các trường hợp cần tương tác với hệ thống hay một app thứ ba, chúng ta cần một hay nhiều thư viện khác như AutoIt hay Coded UI.

Ưu điểm của Selenium

Hiện tại, danh sách Top 10 Automation Testing Tools đã bao gồm nhiều cái tên (mabl, randorex). Tuy nhiên, Selenium vẫn là một cái gì đó khó thay thế, vẫn nổi bật và có nhiều giá trị.

Hỗ trợ nhiều ngôn ngữ lập trình

Bản thân mình, trong quá trình làm việc cho công ty cũng được tiếp xúc với selenium một vài lần. Cụ thể là với Webdriver Java, Javascript và Python.

selenium hỗ trợ nhiều ngôn ngữ lập trình

Nguồn/ Source: selenium.dev

Hiện tại hỗ trợ tới 6 ngôn ngữ lập trình: Java, Python, C#, Ruby, JavaScript và Kotlin. So far, so good.

Miễn phí – free

Khỏi phải nói, ưu điểm này thật sự là đáng tiền nhất của Selenium, so với các đối thủ khác như Ranorex hoặc Mabl, Selenium hoàn toàn miễn phí. Chính vì vậy, nó thường được các doanh nghiệp IT Nhật Bản tin dùng.

Tất nhiên với Java, ta có ngay slogan quen thuộc: “Viết một lần – Chạy khắp nơi“, làm gì chả thích. “Run once time, run everywhere”.

Hỗ trợ đa trình duyệt với Webdriver

Selenium hỗ trợ test tự động trên nhiều browser. Hỗ trợ tốt khi khách hàng cần test trên nhiều phiên bản, nhiều loại browser khác nhau (thường thì chắc chắn sẽ yêu cầu như vậy).

Đối với môt số khách hàng từ Nhật hay cơ quan chính phủ, yêu cần website hoạt động tốt trên IE 9,10,11,. Việc viết test case một lần và chạy trên nhiều trình duyệt là vô cùng tiện lợi và nhanh chóng.

selenium hỗ trợ đa trình duyệt với Webdriver
Hỗ trợ Internet Explorer, tin vui cho mấy anh em phát triển phần mềm chính phủ

Dễ dàng take evidence khi chạy

Thực tế khi làm việc, khách hàng lúc nào cũng yêu cầu evidence khi thực hiện chạy testcase.

Khi một website đã hoàn thiện để chạy automation test, nếu có lỗi xảy ra, ngoài ghi log hoặc báo file, yêu cầu cần thiết nhất luôn là chụp evidence (bằng chứng) ngay lúc đó.

Selenium hỗ trợ rất tốt cho những trường hợp muốn chụp lại màn hình. Kể cả trong trường hợp page ở website là scroll. Xem thêm video hướng dẫn take screenshots trong Selenium:

Một số nhược điểm của Selenium

Mặc dù có nhiều ưu điểm không phải automation test tools nào cũng có. Selenium vẫn tồn tại một số yếu điểm dưới đây:

Muốn chạy ổn, hãy cố handle timeout

Một nhược điểm cố hữu có các Automation test tools (không ngoại trừ Selenium) là timeout. Trường hợp sử dụng để kiểm thử cho website, tốc độ mạng có thể khác nhau giữa những lần chạy testcase. Chắc chắn là không giống nhau giữa các lần chạy.

Việc chạy automation test vào lúc mạng chậm, traffic đang stuck có thể làm fail một số testcase. Trong những trường hợp như vậy, cần xử lí tốt các trường hợp timeout.

Thực tế, trong quá trình làm việc, mình thấy các Exception Timeout thường do:

  • Mình đang test ở page 1 -> nhấn button A -> di chuyển tới page 2 -> tìm kiếm button B. Các hàm tìm kiếm có thể là (getElementById(), getElementByTag(), …).
  • Nuột nà là thế, nhưng do mạng chậm, nên lúc tới page 2 vẫn không tìm được button B -> văng Exception.

Nếu không kiểm soát tốt, hết ram, chết đứng

Thông thường, mỗi testcase sẽ khởi chạy với một new instance của browser ta muốn chạy. Tuy nhiên, nếu có vấn đề, hoặc ta không thể handle các trường hợp cần đóng browser. Rất có thể có các trường hợp sau:

  • Không thể tìm đúng đối tượng trên browser do instance của browser cũ chưa tắt (close)
  • Quá tải ram do nhiều trình duyệt mở (nhất là chrome)
nhược điểm của selenium

Có rất nhiều nguyên nhân dẫn tới trường hợp này. Nếu trước đó đã có exception không được catch or throws, sẽ không thể close instance browser đã mở.

Như vậy, bài viết của TopDev đã cung cấp định nghĩa về Selenium là gì, các thành phần chính trong Selenium và ưu nhược điểm của công cụ này trong việc tự động hóa kiểm thử web, ứng dụng. Hy vọng những thông tin trên sẽ giúp bạn áp dụng Selenium hiệu quả vào công việc của mình.

Tổng hợp từ bài viết của vananhtooo.wordpress.comkieblog.vn

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Kiểm tra HTML5 validation message

Kiểm tra HTML5 validation message

Bài viết được sự cho phép của vntesters.com

Trước khi qua bước kiểm tra HTML5 message hãy điểm lại 1 số thông tin:

  5 bước tìm hiểu sơ lược thành phần một web HTML động
  Cách để tạo một Switch trên iPhone bằng HTML và CSS

HTML5 Form:

  • Một phần của trang web bạn đang test, cho phép người dùng tương tác với hệ thống, thu thập thông tin: form đăng nhập/ đăng kí/ mua hàng/ bình luận/..

Kiểm tra HTML5 validation message

  • Cách thức hoạt động:
    • User mở form nhập liệu
    • Điền thông tin vào form sau đó submit dữ liệu lên máy chủ – trong step này dữ liệu được nhập vào có thể được kiểm tra tại browser của người dùng thông qua các đoạn mã Javascript
    • Server sau khi nhận được thông tin sẽ xử lý thông qua các ngôn ngữ kịch bản máy chủ và thực hiện kiểm tra dữ liệu trong form, logic, ghi dữ liệu vào DB
    • Sau khi xử lý xong thông tin sẽ gửi lại hồi đáp thành công hay không về trình duyệt và kết thúc một chu trình khép kín xử lý form nhập liệu

Thuộc tính ‘required’ của thẻ <input>:

  • ‘required’ là thuộc tính mới trong HTML5 dành cho thẻ input. Tác dụng của required là buộc người dùng phải nhập dữ liệu thì mới gửi được (submit)
    • Giờ bạn không điền gì vào trường NAME > nhấn nút Submit> bạn sẽ nhận được thông báo kiểu như “Vui lòng điền vào trường này” = “Please fill out this field.”
<form action="verify">
<label>NAME:<input type="text" name="name" required></label>
<input type="submit" name="submit-btn" value="SUBMIT">
</form>

Kiểm tra HTML5 validation message

  • Thuộc tính required hỗ trợ hầu hết các trình duyệt thông dụng hiện tại

Kiểm tra HTML5 validation message

  • Những thẻ input type dùng required attribute: text, checkbox, radio, email, password, search, url, telephone, date time picker, number, file

Kiểm tra HTML5 validation message

  • Required là thuộc tính kiểu boolean, nghĩa là nó chỉ nhận 2 giá trị có hoặc không có. Nếu không có requried trong thẻ input nghĩa là không yêu cầu phải nhập đủ dữ liệu, ngược lại nếu có thì phải nhập đủ mới được Submit

Vậy có phải chỉ cần verify thuộc tính required có xuất hiện tại field cần check là đủ hay ko?

    • WebElement nameTextbox = driver.findElement(By.xpath(“//input[@id=’fname’ and @required]”));
      Assert.assertTrue(nameTextbox.isDisplayed);
    • Cách check trên (verify field name textbox có thuộc tính required) có thể đúng nhưng chưa đủ – nếu như field đó chỉ cần verify là field required, ko yêu cầu các message cụ thể cần hiển thị cho nhiều trường hợp. Nhưng 1 field có thể có nhiều validation message khác thì nên check cụ thể các message cho từng case:
      • Email invalid/incorrect:
        • Please enter an email address.
        • Please match the requested format.

Làm sao để verify HTML5 message khi Selenium ko support:

  • Selenium ko tương tác được với các html5 message, nếu để ý sẽ thấy các javascript message này được browser hiển thị chứ ko hề được tìm thấy trong DOM – vì thế ko nên sử dụng Inspector/ Firebug để find các message này
  • Giải pháp là dùng chính javascript để get các message này và verify với các case cụ thể
public String getHtml5ValidationMessage(WebElement element) {
JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
return (String) jsExecutor.executeScript("return arguments[0].validationMessage;", element);
}

Testcase sample:

  • Testscript_01 – Input email with empty data:

Kiểm tra HTML5 validation message

  • Testscript_02 – Input email with invalid data:
    • Step 1: Open url https://codepen.io/daominhdam/full/KRKBLr/
    • Step 2: Input invalid data to Email textbox: dam@gmail
    • Step 3: Verify message displayed: “Please match the requested format.“

Kiểm tra HTML5 validation message

  • Testscript_03 – Input email with incorrect data:
    • Step 1: Open url https://codepen.io/daominhdam/full/KRKBLr/
    • Step 2: Input invalid data to Email textbox: dam@gmail@email.com
    • Step 3: Verify message displayed: “Please enter an email address.“

Kiểm tra HTML5 validation message

Code demo:

public class Topic_14_VerifyHTML5Message {
WebDriver driver;

By resultIframe = By.xpath("//iframe[@id='result']");
By nameTextbox = By.xpath("//input[@id='fname']");
By passwordTextbox = By.xpath("//input[@id='pass']");
By emailTextbox = By.xpath("//input[@id='em']");
By submitButton = By.xpath("//input[@value='SUBMIT']");

@BeforeMethod
public void beforeMethod() {
driver = new FirefoxDriver();
driver.get("https://codepen.io/daominhdam/full/KRKBLr");
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.switchTo().frame(driver.findElement(resultIframe));
}

@Test
public void TC_01_Validate_Name_Empty() {
driver.findElement(nameTextbox).sendKeys("");
driver.findElement(submitButton).click();
String nameMessage = getHTML5ValidationMessage(driver.findElement(nameTextbox));
Assert.assertEquals("Please fill out this field.", nameMessage);
}

@Test
public void TC_02_Validate_Password_Empty() {
driver.findElement(nameTextbox).sendKeys("Dam Dao");
driver.findElement(passwordTextbox).sendKeys("");
driver.findElement(submitButton).click();
String passwordMessage = getHTML5ValidationMessage(driver.findElement(passwordTextbox));
Assert.assertEquals("Please fill out this field.", passwordMessage);
}

@Test
public void TC_03_Validate_Email_Empty() {
driver.findElement(nameTextbox).sendKeys("Dam Dao");
driver.findElement(passwordTextbox).sendKeys("123456");
driver.findElement(emailTextbox).sendKeys("");
driver.findElement(submitButton).click();
String emailMessage = getHTML5ValidationMessage(driver.findElement(emailTextbox));
Assert.assertEquals("Please fill out this field.", emailMessage);
}

@Test
public void TC_04_Validate_Email_Invalid() {
driver.findElement(nameTextbox).sendKeys("Dam Dao");
driver.findElement(passwordTextbox).sendKeys("123456");
driver.findElement(emailTextbox).sendKeys("dam@gmail");
driver.findElement(submitButton).click();
String emailInvalidMessage = getHTML5ValidationMessage(driver.findElement(emailTextbox));
Assert.assertEquals("Please match the requested format.", emailInvalidMessage);
}

@Test
public void TC_05_Validate_Email_Incorrect() {
driver.findElement(nameTextbox).sendKeys("Dam Dao");
driver.findElement(passwordTextbox).sendKeys("123456");
driver.findElement(emailTextbox).sendKeys("dam@gmail@email.com");
driver.findElement(submitButton).click();
String emailIncorrectMessage = getHTML5ValidationMessage(driver.findElement(emailTextbox));
Assert.assertEquals("Please enter an email address.", emailIncorrectMessage);
}

public String getHTML5ValidationMessage(WebElement element) {
JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
return (String) jsExecutor.executeScript("return arguments[0].validationMessage;", element);
}

@AfterMethod
public void afterMethod() {
driver.quit();
}
  • Kết quả:

Kiểm tra HTML5 validation message

Bài viết gốc được đăng tải tại vntesters.com

Có thể bạn quan tâm:

Xem thêm Jobs Developer hấp dẫn trên TopDev

Apache Kafka là gì?

Apache Kafka là gì?

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Apache Kafka® A DISTRIBUTED STREAMING PLATFORM

Hiểu đơn giản là nền tảng về đường truyền dữ liệu phân tán.

Apache Kafka là distributed event streaming platform có khả năng xử lý hàng nghìn tỷ sự kiện mỗi ngày. Ban đầu được hình thành như một hàng đợi nhắn tin, Kafka dựa trên sự trừu tượng của nhật ký cam kết phân tán. Kể từ khi được tạo và mở bởi LinkedIn vào năm 2011, Kafka đã nhanh chóng phát triển từ hàng đợi nhắn tin đến một nền tảng phát trực tuyến sự kiện đầy đủ.

Một stream platform sẽ có 3 khả năng chính:

  • Publish và subscribe vào các stream của các bản ghi, tương tự như một hàng chờ tin nhắn.
  • Các stream của các bản ghi được lưu trữ bằng phương pháp chịu lỗi cao cũng như khả năng chịu tải.
  • Xử lý các stream của các bản ghi mỗi khi có bản ghi mới.
  Capacity Planning - Dự toán công suất cho ứng dụng (Tập 1 )
  Maven Apache

Kafka thường được sử dụng cho 2 mục đích chính sau:

  • Xây dựng các pipeline stream dữ liệu theo thời gian thực để nhận dữ liệu giữa các hệ thống hoặc ứng dụng một cách đáng tin cậy.
  • Xây dựng các ứng dụng stream theo thời gian thực để biến đổi hoặc ánh xạ đến các stream của dữ liệu.

Để khái quát được các tính năng của kafka, bạn có thể xem ảnh dưới.

Tại sao Apache Kafka được sử dụng?

Kafka là dự án mã nguồn mở, đã được đóng gói hoàn chỉnh, khả năng chịu lỗi cao và là hệ thống nhắn tin nhanh. Vì tính đáng tin cậy của nó, kafka đang dần được thay thế cho hệ thống nhắn tin truyền thống. Nó được sử dụng cho các hệ thống nhắn tin thông thường trong các ngữ cảnh khác nhau. Đây là hệ quả khi khả năng mở rộng ngang và chuyển giao dữ liệu đáng tin cậy là những yêu cầu quan trọng nhất. Một vài use case cho kafka:

  • Website Activity Monitoring: theo dõi hoạt động của website
  • Stream Processing: xử lý stream
  • Log Aggregation: tổng hợp log
  • Metrics Collection: thu thập dữ liệu

Để rõ hơn về lợi ích của kafka, hãy tưởng tượng một hệ thống thương mại điện tử có nhiều máy chủ thực hiện các công việc khác nhau, tất cả các máy chủ này đều muốn giao tiếp với database server, vì vậy chúng ta sẽ có nhiều data pipeline kết nối các server khác đến database server này, hình ảnh minh họa như sau:

Apache Kafka

Nhưng trong thực tế, hệ thống thương mại điện tử sẽ còn phải kết nối đến một vài server khác nữa như là

Như bạn thấy ở ảnh trên, data pipeline đang trở nên phức tạp theo sự gia tăng của số lượng hệ thống. Để giải quyết vấn đề này thì kafka ra đời. Kafka tách rời các data pipeline giữa các hệ thống để làm cho việc communicate giữa các hệ thống trở nên đơn giản hơn và dễ quản lý hơn.

Cấu trúc của Apache Kafka

Một cấu trúc kafka đơn giản

Một mô hình cấu trúc kafka đơn giản

Một mô hình cấu trúc kafka chi tiết

Như bạn thấy ở 2 ảnh trên, cấu trúc của kafka bao gồm các thành phần chính sau:

  • Producer: Một producer có thể là bất kì ứng dụng nào có chức năng publish message vào một topic.
  • Messages: Messages đơn thuần là byte array và developer có thể sử dụng chúng để lưu bất kì object với bất kì format nào – thông thường là String, JSON và Avro
  • Topic: Một topic là một category hoặc feed name nơi mà record được publish.
  • Partitions: Các topic được chia nhỏ vào các đoạn khác nhau, các đoạn này được gọi là partition
  • Consumer: Một consumer có thể là bất kì ứng dụng nào có chức năng subscribe vào một topic và tiêu thụ các tin nhắn.
  • Broker: Kafka cluster là một set các server, mỗi một set này được gọi là 1 broker
  • Zookeeper: được dùng để quản lý và bố trí các broker.

Kết

Bài viết này chỉ giới thiệu về kafka chứ không đào sâu vào cách hoạt động hoặc cách implement kafka. Để sử dụng kafka, bạn đọc có thể tải kafka ở đây và làm theo hướng dẫn.

Bài viết gốc được đăng tải tại lcdung.top

Có thể bạn quan tâm:

Xem thêm IT Jobs for Developer hấp dẫn trên TopDev

Map Platform: Giải pháp phát triển sản phẩm trong tương lai

map platform
Map Platform: Giải pháp phát triển sản phẩm trong tương lai

Hiện nay trong nhiều ứng dụng, từ xe ôm công nghệ đến tài chính fintech, chúng ta đều dễ dàng bắt gặp hình ảnh UI UX về bản đồ. Bản đồ là một phần không thể thiếu trong những phần mềm có liên quan đến địa điểm. Tuy nhiên, khi nói đến Map Platform thì không chỉ đơn thuần là những bản đồ nền như vậy mà phía sau đó còn rất nhiều tính năng khác như tìm kiếm địa điểm, đưa ra những đường đi phù hợp tới điểm đến được tìm kiếm. Cùng tìm hiểu về thêm về Map Platform trong phần chia sẻ của anh Lê Yên Thanh trong bài viết dưới đây.

Về diễn giả

  • Anh Lê Yên Thanh là CEO đồng thời là nhà sáng lập của BusMap – nền tảng công nghệ về giao thông công cộng.
  • Anh là cựu sinh viên Đại học Khoa học Tự nhiên – Đại học Quốc gia TP. HCM và từng là thực tập sinh tại Google với mức lương 6.000 USD/tháng.
  • Busmap là sản phẩm được anh Yên Thanh viết từ năm thứ hai đại học, đến nay mỗi ngày nền tảng này có hơn 400.000 người dùng thường xuyên mỗi tháng và đã có hơn 2 triệu lượt người dùng tải app.
  Giải đáp UX: User Empathy Mapping là gì? User Story được form như thế nào?
  Roadmap Frontend Developer - "Con đường tắt" để trở thành cao thủ Frontend Developer
map platform
Map Platform: Giải pháp phát triển sản phẩm trong tương lai

Sơ lược về nền tảng BusMap

BusMap là một ứng dụng chuyên về tìm kiếm lộ trình xe bus và những công nghệ liên quan đến giao thông công cộng thành phố. Một trong những công nghệ lõi của BusMap là công nghệ về bản đồ và thuật toán tìm đường. Đây là công nghệ đã được anh Yên Thanh nghiên cứu từ cách đây khoảng 7 năm. Trong sự kiện Vietnam Web Summit 2020 lần này, anh Thanh sẽ chia sẻ thêm về công nghệ bản đồ và những ứng dụng, những nền tảng map mà lập trình viên hay những nhà phát triển ứng dụng nên tìm hiểu để có thêm kiến thức và phát triển các loại bản đồ phù hợp với sản phẩm của mình.

Map Platform có những nhân tố chính nào?

Hiện tại, Map Platform đang có 3 nhân tố chính là: Base map SDK, Geocoding API, Routing API.

  • Base map SDK: là những UI UX liên quan đến bản đồ nền. Chẳng hạn khi vào một ứng dụng, bạn sẽ nhìn thấy bản đồ và tương tác với nó (zoom in, zoom out, di chuyển, tra cứu tên đường hiển thị), đó chính là bản đồ nền. Khi làm việc với những phần mềm có liên quan đến bản đồ thì bản đồ nền là sản phẩm bạn sẽ sử dụng nhiều nhất.
  • Geocoding API: sẽ liên quan đến những ứng dụng mà khi truy cập vào đó, bản đồ sẽ yêu cầu chúng ta nhập địa chỉ nhà để biết được vị trí ngôi nhà đấy ở đâu. Hoặc khi lấy được GPS trên điện thoại, bản đồ cũng có thể suy ngược lại người dùng đó đang ở đâu.
  • Routing API: làm việc với những ứng dụng liên quan đến logistics như hướng dẫn cho người giao hàng cần phải đi những cung đường nào, chạy như thế nào cho phù hợp,… Những vấn đề này liên quan đến Routing API.
map platform
Map Platform hiện có 3 nhân tố chính

Đây chính là 3 nhân tố chính mà Map Platform cung cấp cho lập trình viên để build những ứng dụng liên quan đến nền tảng này. Ngoài ra còn có những tính năng nâng cao hơn mà map platform cung cấp như phân tích dữ liệu về AI, big data,…

Xem thêm Kỹ thuật làm app bản đồ, tìm đường và tính năng bắt Pokemon GO

Hiện đang có mấy loại base map?

Hiện nay base map được chia thành 2 loại là Vector Map và Raster Map. Đây cũng là 2 công nghệ bản đồ được sử dụng nhiều nhất ở thời điểm hiện tại.

Vector map là loại bản đồ được build dựa trên các dữ liệu liên quan đến vector, mỗi cung đường sẽ là những đoạn thẳng. Những cung đường về việc xe cộ di chuyển như thế nào, những vòng cung, vòng xoay, giao lộ, vị trí nhà người dân, building,… tất cả các dữ liệu  như thế này sẽ được lưu dưới dạng dữ liệu digital. Ví dụ như một đoạn đường sẽ được biểu diễn bằng một đoạn thẳng từ A đến B, cung đường sẽ là các vector cong.

Raster Map ngược lại sẽ chia bản đồ thành từng bức ảnh, vì Raster lưu bản đồ dưới dạng hình ảnh. Nên khi chúng ta zoom bản đồ sẽ càng thấy rõ hơn thì nó sẽ lưu theo từng mức độ zoom khác nhau. Thông thường Raster sẽ chia làm 18 cấp độ zoom, độ zoom nhỏ nhất là 1 và lớn nhất là 18. Với mức độ zoom 1, bạn có thể nhìn thấy toàn bộ hình ảnh trái đất, còn với độ zoom 18 có thể nhìn thấy chi tiết một con đường trông như thế nào.

Ưu và nhược điểm của Vector Map và Raster Map

Chúng ta có thể so sánh Vector Map và Raster Map như 2 file ảnh png và file ảnh svg. Bằng cách so sánh này bạn sẽ không chỉ phân biệt được 2 base map mà còn biết được nắm được cả tính chất của 2 loại map này.

Vector Map: dữ liệu của Vector Map rất đơn giản, dễ lưu và có thể dễ dàng tùy biến. Những hình ảnh được lưu dưới dạng những vector nên khi đưa lên ứng dụng, nó có thể vẽ những cung đường khác nhau và apply những kiểu cách phù hợp mà dev lựa chọn. Khi zoom một bản đồ vector thì dù zoom bao nhiêu hình ảnh cũng không bị vỡ vì nó chỉ load vector đó ra và render cho vector chi tiết hơn mà thôi. Việc load dữ liệu lên cũng tốn ít băng thông, người dùng dữ liệu có thể xem bản đồ cả thành phố cùng một lúc. Vector Map đa phần được dùng trên những ứng dụng mobile.

Raster Map: vì dữ liệu được lưu dưới dạng những ô vuông hình ảnh nên điểm yếu của nó là chỉ có thể zoom đến mức độ 18 mà thôi. Nếu zoom hơn nữa hình ảnh bản đồ sẽ rất mờ. Thêm vào đó, vì là ảnh nên raster map sẽ tốn rất nhiều băng thông. Do những lý do này nên Raster Map không được dùng phổ biến, nó được sử dụng chủ yếu trên những nền tảng web. Tuy nhiên, dù tốn băng thông nhưng raster map lại tốn rất ít resource của web browser và vẽ lên trang web cũng dễ dàng hơn. Trong một số trường hợp nhất định, lập trình viên bắt buộc phải dùng Raster Map như với những hình ảnh chụp vệ tinh chẳng hạn.

Ngoài ra, còn có những loại base map khác, được xem là hybrid của 2 loại này, như Google Map,…

  6 lý do khiến cho nền tảng kết nối (platform) thất bại - Dành cho các founder đang xây dựng platform

Một số Map Platform hiện nay và giá cả

Google Map

Google Map là nền tảng uy tín và được sử dụng nhiều nhất ở thời điểm hiện tại. Với Dynamic Maps, Google cho phép người dùng sử dụng miễn phí trên mobile hoặc tốn 7 USD cho website có trên 1000 request. Nếu tính trung bình 1 user có 1 request thì website có hơn 100.000 lượt truy cập mỗi tháng sẽ tốn khoảng 700 USD cho chi phí hiển thị map. Bên cạnh Dynamic Maps, sẽ còn có nhiều dạng thông tin khác nhau với nhiều mức giá nên các công ty sẽ phải tốn kha khá kinh phí cho việc sử dụng Map Platform của Google Map. Nhưng API liên quan đến Geocoding và Direction của Google Map được đánh giá là một trong những nguồn tốt nhất hiện nay, vì Google Map có nguồn dữ liệu lớn, user sẽ tìm được mọi điểm trên website công ty bạn như khi tìm trên Google Map. Nên đây vẫn là lựa chọn của nhiều công ty.

MapBox

MapBox cũng là một trong những nguồn mà người dùng có thể sử dụng thay thế hiện nay. Nền tảng này hỗ trợ Map SDK trên mobile và web, nó không hỗ trợ nhiều về Geocoding hay Routine. Chi phí khi sử dụng MapBox sẽ rẻ hơn Google Map với mức giá rơi vào khoảng 250 USD mỗi tháng. Đặc điểm nổi trội của MapBox là dev có thể tùy biến, customize về kiểu bản đồ tương ứng với định hướng của công ty mình.

OpenStreetMap

Đây là nền tảng mà mọi người đều có thể đóng góp dữ liệu, nhận được bản đồ thay thế hoàn toàn miễn phí và tốt hơn. Vì mọi thứ đều có trên OpenStreetMap và đều là open source nên bạn cần dành thời gian để xem xét kỹ hơn về những giải pháp mà mình có thể sử dụng để đảm bảo chất lượng tốt nhất.

Ngoài ra, hiện tại cũng có khá nhiều Map Platform khác trên thị trường như Apple Map, Here Map, Vietbando, Vietmap, bMap,… Trong đó bMap là công nghệ bản đồ đang được xây dựng trực tiếp bởi BusMap. bMap cũng dựa trên một phần dữ liệu từ OpenStreetMap và phát triển nó lên để có những platform ở giữa như customize dữ liệu để có thể tùy chỉnh hóa dữ liệu đó.

Làm gì để tiết kiệm chi phí khi triển khai Map Platform?

Cân nhắc Map Platform phù hợp với nguồn dữ liệu hiện có

Nếu hiện nay sản phẩm của công ty bạn đang ở giai đoạn test thì có thể đăng ký sử dụng dữ liệu của Google Map vì Google đang có chính sách miễn phí 200 USD mỗi tháng cho người dùng. Nên nếu bạn chưa sử dụng đến 200 USD một tháng thì sẽ được sử dụng những dữ liệu chất lượng của Google Map hoàn toàn miễn phí.

Còn cách tối ưu hóa chi phí tốt nhất vẫn là sử dụng OpenStreetMap. OpenStreetMap hỗ trợ xây dựng dữ liệu dựa trên cả 3 nhân tố chính là Base Map, GeoCoding API, Routing API. BusMap ban đầu cũng sử dụng OpenStreetMap là chủ yếu. Điểm mạnh của nó là mình có thể tiết kiệm được khá nhiều chi phí cho công ty. Bạn sẽ chỉ tốn chi phí về máy chủ, băng thông để host dữ liệu bản đồ. Tuy nhiên không có giải pháp nào thật sự hoàn hảo. Với OpenStreetMap, bạn sẽ phải tốn khá nhiều thời gian và công sức để có thể setup và customize nên một hệ thống hoàn chỉnh. Chẳng hạn với những địa chỉ liên quan đến chủ quyền đất nước, chúng ta phải customize rất chặt chẽ để không bị ảnh hưởng đến các yếu tố khác. Các ứng dụng của người Việt càng phải chú trọng đến chuyện này hơn.

Hiện nay, bMap ngoài được sử dụng hỗ trợ dữ liệu cho BusMap, cũng đã dần được triển khai nhiều hơn cho các giải pháp liên quan đến bản đồ của những đơn vị khác. bMap hỗ trợ Base Map với đầy đủ vector map và raster map, có SDK sử dụng trên điện thoại khá nhẹ nên hỗ trợ tốt cho những ứng dụng và thiết bị điện thoại yếu hơn. Ngoài ra, bMap cũng hỗ trợ cả chế độ offline mode, người dùng chỉ cần tải về là có thể sử dụng kể cả khi không có mạng.

map platform
Cần có giải pháp hợp lý để tiết kiệm chi phí cho Map Platform

So sánh chi phí và workload để tìm giải pháp phù hợp

Đây là hai yếu tố có vai trò quyết định đến việc lựa chọn Map Platform phù hợp và tối ưu chi phí nhất. Nếu bạn đang phát triển một ứng dụng mang tính demo, thử nghiệm thì có thể sử dụng những platform như Google Map hay MapBox. Nó giúp tiết kiệm khá nhiều thời gian, công sức. Nhưng khi scale lớn hơn bạn sẽ phải chi rất nhiều tiền.

Khi ứng dụng đã phát triển hơn, bạn có thể chọn những platform khác như OpenStreetMap để tự build hoặc có thể sử dụng bMap để đỡ tốn workload. Khi đã có một lượng người dùng lớn rồi thì Thanh vẫn khuyên các bạn nên tìm hiểu thêm nhiều công nghệ bản đồ khác để tiết kiệm kinh phí nhất.

Xem thêm Docker to Serverless (Google Cloud Platform)

Chẳng hạn như BusMap hiện nay có khoảng 400.000 monthly active user, nếu không sử dụng công nghệ bản đồ riêng của mình mà sử dụng hoàn toàn dữ liệu của Google Map thì BusMap sẽ phải trả khoảng 50.000 USD/tháng chỉ riêng cho chi phí về bản đồ.

Với sự phổ biến và quan trọng của bản đồ, việc sử dụng dữ liệu bản đồ trong các ứng dụng của công ty sẽ còn tiếp tục phát triển hơn trong thời gian tới. Nếu muốn tiết kiệm chi phí ở giai đoạn scale các công ty nên nghiên cứu nhiều hơn các công nghệ bản đồ để vừa giúp tiết kiệm chi phí cho platform vừa đưa ra những tính năng tùy biến hơn, có thể kiểm soát tốt hơn về mặt công nghệ bản đồ, dữ liệu cho người dùng.

Bài viết được trích dẫn từ phần trình bày của anh Lê Yên Thanh tại sự kiện Vietnam Web Summit 2020 LIVE do TopDev tổ chức

Có thể bạn quan tâm:

Xem thêm các việc làm Developer hấp dẫn tại TopDev

Run test với trình duyệt Chrome Headless

Run test với trình duyệt Chrome Headless

Bài viết được sự cho phép của vntesters.com

Headless Browser là gì?

  • Headless browser là trình duyệt web không có giao diện đồ họa người dùng (GUI). Tương tác với trang web trong môi trường giống như các trình duyệt web phổ biến khác, được thực hiện thông qua giao diện dòng lệnh
  • Hữu ích cho việc kiểm thử các trang web vì có thể render cấu trúc HTML (DOM) giống như các trình duyệt thông thường, bao gồm cả style như: layout/ font/ colour và có thể thực thi cả javascript/ ajax
  Biện hộ: Vì sao các Developer không test phần mềm của họ?
  Các công cụ hữu ích hỗ trợ bạn trong việc tạo testdata
  • Được sử dụng cho các mục đích:
    • Kiểm thử tự động các ứng dụng web (thường sử dụng với Nodejs application)
    • Chụp ảnh màn hình 1 web page
    • Tạo file pdf
    • Thu thập (Crawl) dữ liệu trên các website
    • Tấn công DDOS tới các website

  • Danh sách headless browser:
    • Google Chrome
      • Linux/ MacOS: version >= 59
      • Windows: version >=60
    • Mozilla Firefox
      • Linux: version >=55
      • Windows/ MacOS: 56
    • PhantomJS
    • HtmlUnit
    • Ghost
  • Ưu/ nhược điểm của headless browser trong automation testing:
    • Ưu điểm: Tốc độ nhanh, kết quả kiểm thử sẽ có sớm hơn so với sử dụng các non-headless browser
    • Nhược điểm: Độ ổn định và chính xác không cao/ nhiều trường hợp xảy ra bug trên headless browser nhưng ko tìm thấy trên non-headless browser

Run test với Chrome Headless

  • Để chạy được chrome headless thì trước khi khởi tạo browser, cần thêm 2 tham số vào ChromeOptions
    • headless: trình duyệt sẽ thực thi ở chế độ headless
    • window-size: cần set trình duyệt với 1 resolution cố định (nếu ko thì nó có thể hiển thị kích thước như phiên bản web mobile hoặc ở 1 độ phân giải ko cố định) – có thể sử dụng tính năng này để test responsive
ChromeOptions options = new ChromeOptions();
options.addArguments("headless");
options.addArguments("window-size=1366x768");
driver = new ChromeDriver(options);
  • So sánh tốc độ chạy của headless và non-headless, kịch bản như sau:
    • Step 1: Open url https://automationfc.com
    • Step 2: Wait for page loaded successfully
    • Step 3: Verify homepage url and title matching with requirement
    • Step 4: Close browser
  • Code demo:
@Test
public void TC_01_ChromeHeadless() {
System.setProperty("webdriver.chrome.driver", ".\\driver\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("headless");
options.addArguments("window-size=1366x768");
driver = new ChromeDriver(options);
System.out.println("Run with Chrome Headless");

driver.get("https://automationfc.com");
System.out.println("Step 01 - Open Automation FC site");

driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS);
System.out.println("Step 02 - Wait for page loaded successfully");

Assert.assertEquals("Automation FC", driver.getTitle());
Assert.assertEquals("https://automationfc.com/", driver.getCurrentUrl());
System.out.println("Step 03 - Verify HomePage url and title");
}

@Test
public void TC_02_ChromeGUI() {
System.setProperty("webdriver.chrome.driver", ".\\driver\\chromedriver.exe");
driver = new ChromeDriver();
System.out.println("Run with Chrome GUI");

driver.get("https://automationfc.com");
System.out.println("Step 01 - Open Automation FC site");

driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS);
System.out.println("Step 02 - Wait for page loaded successfully");

Assert.assertEquals("Automation FC", driver.getTitle());
Assert.assertEquals("https://automationfc.com/", driver.getCurrentUrl());
System.out.println("Step 03 - Verify HomePage url and title");
}
  • Kết quả:
    • Chrome headless: 3.554 s
    • Chrome non-headless: 5.168 s

  • Như hình trên thì tốc độ chạy nhanh hơn gần 2s (1 testcase) so với chạy chế độ non-headless, điều này cực kì hữu ích khi số lượng kịch bản test trong dự án lớn (vài trăm/ vài ngàn testcases), giảm thiểu thời gian run regression test và nhận được kết quả phản hồi sớm hơn
  • Hiện tại mình đang sử dụng chrome headless trong dự án cho việc kiểm thử tự động (unit test/ e2e testing)

Nguồn bài viết: https://automationfc.com/2017/11/16/java-webdriver-13-run-test-voi-trinh-duyet-chrome-headless/

Bài viết gốc được đăng tải tại vntesters.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Cách ẩn icon mũi tên xanh trên tập tin, thư mục Windows 10

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Microsoft đã thêm vào Windows 10 rất nhiều những biểu tượng, những icon để giúp người dùng có thể xác định được rất nhiều thứ hơn.

Ví dụ như mũi tên màu xanh trên biểu tượng ứng dụng cho bạn biết đó chỉ là một Shortcut, hay là cái khiên bên cạnh icon thì có nghĩa là ứng dụng đó yêu cầu quyền Administrator….

  10 điều bạn có thể làm với Linux mà bạn không thể làm với Windows
  40 phím tắt dành cho người dùng Windows

Và nếu bạn vừa làm theo bài hướng dẫn nén ổ đĩa trên Windows của mình thì trên các tập tin, thư mục đã nén sẽ có thêm biểu tượng 2 mũi tên bên cạnh biểu tượng ban đầu.

Vậy làm thế nào để có thể ẩn được biểu tượng mũi tên màu xanh trên Folder đi? Vâng, nếu bạn đang quan tâm thì hãy cùng mình tìm hiểu câu trả lời trong bài viết này nhé !

cach-an-icon-mui-ten-xanh-tren-tap-tin-thu-muc (1)

#1. Tại sao lại có icon mũi tên màu xanh ở cạnh Folder?

Biểu tượng 2 mũi tên xanh trên icon của thư mục như hình ảnh ở trên được Microsoft thêm vào nhằm thể hiện thư mục, tập tin đó đã được nén lại bằng cách sử dụng chức năng Compress this drive to save disk space của Windows.

Vì chỉ khi kích hoạt 2 mũi tên này thì nó mới xuất hiện, vậy nên cách đơn giản nhất để ẩn đi đó chính là tắt tính năng nén ổ cứng của Windows 10 đi là xong.

Nhưng tất nhiên là bạn không nên làm như vậy, và nếu đơn như vậy thì đã chẳng có bài viết này 🙂 Đây mới là cách mình muốn giới thiệu cho các bạn.

#2. Cách ẩn biểu tượng mũi tên màu xanh trên tập tin, thư mục trong Windows 10

Chúng ta sẽ sử dụng Registry Editor để thay thế 2 mũi tên màu xanh bằng một biểu tượng khác trong suốt, từ đó sẽ loại bỏ đi được 2 mũi tên kia khỏi biểu tượng của thư mục, tập tin..

+ Bước 1: Đầu tiên, bạn mở dùng tổ hợp Windows + R để mở hộp thoại Run lên, bạn nhập vào lệnh regedit => và ENTER để mở Registry Editor trên Windows.

cach-an-icon-mui-ten-xanh-tren-tap-tin-thu-muc (2)

+ Bước 2: Trong cửa sổ Registry Editor này, bạn copy đường dẫn mình để ở bên dưới và dán vào ô địa chỉ xong ENTER để truy cập nhanh vào thư thẻ Explorer trong Regedit.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer

cach-an-icon-mui-ten-xanh-tren-tap-tin-thu-muc (3)

+ Bước 3: Tiếp theo, bạn kích chuột phải lên khóa Explorer => chọn New => Key để tạo một khóa con mới trong thẻ Explorer.

Bạn hãy đặt tên cho nó là Shell Icons, nếu không đặt kịp lúc tạo thì có thể kích chuột phải lên New Folder, chọn Rename nhé !

cach-an-icon-mui-ten-xanh-tren-tap-tin-thu-muc (4)

+ Bước 4: Tạo xong bạn bấm vào Shell Icons, click chuột phải vào khoảng trống ở phía bên phải, chọn New => chọn String Value trong menu New vừa mới hiện ra, đặt tên cho khóa String Value mới tạo là 179.

cach-an-icon-mui-ten-xanh-tren-tap-tin-thu-muc (5)

+ Bước 5: Cuối cùng, bạn double-click lên giá trị 179, cửa sổ sửa giá trị hiện ra bạn nhập vào ô Value Data bằng địa chỉ mình để ở dưới đây => và bấm vào nút OK để hoàn tất việc sửa chữa.

Bây giờ hãy khởi động lại máy thôi, 2 mũi tên màu xanh kia sẽ biến mất. Để khôi phục 2 mũi tên về ban đầu thì chỉ cần quay lại đây và xóa khóa Shell Icons đi là xong.

Lưu ý : Nếu bạn muốn thay icon này bằng icon bạn muốn, hay tải nó về sau đó copy đường dẫn của icon đó rồi quay lại dán vào ô Value Data là xong.

Dán vào ô Value Data : C:\Windows\system32\BlankIcon.ico

cach-an-icon-mui-ten-xanh-tren-tap-tin-thu-muc (6)

#3. Lời kết

Trên đây là bài viết hướng dẫn chi tiết cách loại bỏ 2 mũi tên xanh cạnh biểu tượng của tệp tin, thư mục trong File Explorer trên Windows 10 rồi nhé.

Bạn cũng có thể thay nó thành bất cứ icon nào mà bạn thích, nhưng mình nghĩ cứ để mặc định là được rồi 🙂 Hy vọng bài viết này sẽ có ích cho các bạn. Chúc các bạn thành công !

Bài viết gốc được đăng tải tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Cách thiết lập JIT trong PHP 8

Cách thiết lập JIT trong PHP 8

Bài viết được sự cho phép của tác giả Lê Chí Dũng

PHP 8: Cách thiết lập JIT

PHP 8 bổ sung một trình biên dịch JIT vào lõi của PHP có khả năng tăng tốc hiệu suất đáng kể. Có một số chú thích được thực hiện về tác động thực tế đối với các ứng dụng web trong thực tế.

Tôi cũng muốn dành một bài đăng trên blog về cách thiết lập JIT, vì có một số điều cần chia sẽ.

  10 điều bạn cần biết về PHP7
  10 Frameworks tốt nhất hiện nay cho PHP

Thành thật mà nói, thiết lập JIT là một trong những cách cấu hình tiện ích mở rộng PHP khó hiểu nhất mà tôi từng thấy. May mắn thay, có một số phím tắt cấu hình có sẵn để dễ thiết lập hơn. Vẫn tốt để biết sâu về cấu hình JIT.

Trước hết, JIT sẽ chỉ hoạt động nếu opcache được bật, đây là mặc định cho hầu hết các cài đặt PHP, nhưng bạn nên đảm bảo rằng nó opcache.enableđược đặt thành 1 trong php.initệp của bạn . Việc kích hoạt bản thân JIT được thực hiện bằng cách chỉ định opcache.jit_buffer_sizetrong php.ini.

Việc kích hoạt bản thân JIT được thực hiện bằng cách chỉ định opcache.jit_buffer_sizetrong php.ini.

Lưu ý nếu bạn đang chạy PHP qua dòng lệnh, bạn cũng có thể chuyển các tùy chọn này qua cờ -d, thay vì thêm chúng vào php.ini:

php -dopcache.enable=1 -dopcache.jit_buffer_size=100M

Nếu chỉ thị này bị loại trừ, giá trị mặc định được đặt thành 0 và JIT sẽ không chạy. Nếu bạn đang thử nghiệm JIT trong tập lệnh CLI, bạn sẽ cần sử dụng opcache.enable_clithay thế để bật opcache:

php -dopcache.enable_cli=1 -dopcache.jit_buffer_size=100M

Sự khác biệt giữa opcache.enablevà opcache.enable_clilà cái đầu tiên nên được sử dụng nếu bạn đang chạy, chẳng hạn như máy chủ PHP tích hợp sẵn. Nếu bạn đang thực sự chạy một tập lệnh CLI, bạn sẽ cần opcache.enable_cli.

Xem thêm php tuyển dụng nhiều vị trí trên TopDev

Trước khi tiếp tục, hãy đảm bảo JIT thực sự hoạt động, tạo một tập lệnh PHP có thể truy cập thông qua trình duyệt hoặc CLI (tùy thuộc vào nơi bạn đang thử nghiệm JIT) và xem đầu ra của opcache_get_status():

var_dump(opcache_get_status()['jit']);

Đầu ra sẽ giống như sau:

array:7 [
  "enabled" => true
  "on" => true
  "kind" => 5
  "opt_level" => 4
  "opt_flags" => 6
  "buffer_size" => 4080
  "buffer_free" => 0
]

Nếu enabledvà onđúng, bạn nên đi!

Tiếp theo, có một số cách để định cấu hình JIT (và đây là nơi chúng ta sẽ đi vào mớ hỗn độn cấu hình). Bạn có thể cấu hình khi JIT nên chạy, bao nhiêu nó nên cố gắng tối ưu hóa, vv Tất cả các tùy chọn này được cấu hình sử dụng một mục cấu hình duy nhất (!): opcache.jit. Nó có thể trông giống như sau:

opcache.enable=1 
opcache.jit=1255

Bây giờ, con số đó có nghĩa là gì? Các RFC liệt kê các nghĩa của mỗi trong số họ. Xin lưu ý bạn: đây không phải là một mặt nạ bit, mỗi số chỉ đơn giản là đại diện cho một tùy chọn cấu hình khác. RFC liệt kê các tùy chọn sau:

#O – Mức độ tối ưu hóa

0 đừng JIT
1 JIT tối thiểu (gọi trình xử lý VM tiêu chuẩn)
2 nội tuyến trình xử lý VM chọn lọc
3 JIT được tối ưu hóa dựa trên suy luận kiểu tĩnh của chức năng riêng lẻ
4 JIT được tối ưu hóa dựa trên suy luận kiểu tĩnh và cây cuộc gọi
5 JIT được tối ưu hóa dựa trên suy luận kiểu tĩnh và phân tích quy trình bên trong

#T – kích hoạt JIT

0 JIT tất cả các chức năng khi tải tập lệnh đầu tiên
1 Hàm JIT trong lần thực thi đầu tiên
2 Hồ sơ theo yêu cầu đầu tiên và biên dịch các chức năng nóng theo yêu cầu thứ hai
3 Hồ sơ nhanh chóng và biên dịch các chức năng nóng
4 Biên dịch các hàm với thẻ @jit trong doc-comments
5 Truy tìm JIT

#R – phân bổ đăng ký

0 không thực hiện phân bổ đăng ký
1 sử dụng bộ cấp phát thanh ghi quét lớp lót cục bộ
2 sử dụng trình phân bổ thanh ghi quét lớp lót toàn cầu

#C – cờ tối ưu hóa CPU cụ thể

0 không ai
1 cho phép tạo lệnh AVX

Dù sao, nội bộ đề xuất 1255là mặc định tốt nhất, nó sẽ hoạt động tối đa, sử dụng JIT theo dõi, sử dụng bộ cấp phát thanh ghi quét lớp lót toàn cầu – bất kể điều gì có thể – và cho phép tạo lệnh AVX.

Vì vậy, cài đặt ini (hoặc cờ -d) của bạn phải có các giá trị sau:

opcache.enable=1 
opcache.jit_buffer_size=100M
opcache.jit=1255

Nhân tiện, hãy nhớ rằng đó opcache.jitlà tùy chọn. JIT sẽ sử dụng một giá trị mặc định nếu thuộc tính đó bị bỏ qua.

Bạn hỏi mặc định nào? Đó sẽ là opcache.jit=tracing.

Chờ đã, đó không phải là cấu trúc giống như bitmask kỳ lạ mà chúng ta đã thấy trước đó? Đúng vậy: sau khi RFC ban đầu được thông qua, nội bộ nhận ra rằng các tùy chọn giống như bitmask-like không phải là tất cả đều thân thiện với người dùng, vì vậy họ đã thêm hai bí danh được dịch thành bitmask-like. Có opcache.jit=tracingvà opcache.jit=function.

Sự khác biệt giữa hai chức năng này là Function JIT sẽ chỉ cố gắng tối ưu hóa mã trong phạm vi của một chức năng duy nhất, trong khi Tracing JIT có thể xem xét toàn bộ dấu vết ngăn xếp để xác định và tối ưu hóa mã nóng.

Internals khuyến nghị sử dụng Tracing JIT vì nó có thể hầu như luôn cho kết quả tốt nhất.

Vì vậy, tùy chọn duy nhất bạn thực sự cần đặt để kích hoạt JIT với cấu hình tối ưu của nó là opcache.jit_buffer_size, nhưng nếu bạn muốn rõ ràng, danh sách opcache.jitsẽ không phải là một ý tưởng tồi:

opcache.enable=1 
opcache.jit_buffer_size=100M
opcache.jit=tracing
Bài viết gốc được đăng tải tại lcdung.top
Có thể bạn quan tâm:
Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

Automation testing: Một số công cụ hữu ích cho tester

Automation testing: Một số công cụ hữu ích cho tester

Bài viết được sự cho phép của tác giả Vân Anh

Bạn là một tester, mỗi lần có một bản build mới, ngày qua ngày bạn vẫn cặm cụi test đi test lại những case mà hết round này đến round khác mà bạn đã check mỏi cả tay. Mặc dù bản build lần này chỉ là fix một vài lỗi, nhưng mà bạn cũng không thể tự tin chắc chắn là cái việc fix lỗi này của đám dev nó không làm ảnh hưởng đến mấy chức năng đã chạy ngon lành ở round trước, do đó mà bạn cứ phải tay – mắt check lại những case đó. Rất tốn thời gian.

Tuyển tester làm việc online

  04 Điều Cần Chú Ý Cho Người Mới Làm Automation Test
  Cách Engineer Nhật Bản thực hiện test như thế nào

regrestion_test


Hoặc là khi sản phẩm của mình cũng đến tầm giai đoạn mà release đến nơi rồi, bỗng dưng nhận được yêu cầu của khách hàng là thêm một ít chỗ này, hay bỏ một ít chỗ kia. Thế rồi khi xong công đoạn của Dev thì việc của bạn lại là test lại chỗ thêm,chỗ bớt đó có ảnh hưởng đến những cái đã ngon lành trước đó hay không, và rồi bạn lại cặm cụi test như những người nông dân chăm chỉ.

Test-Retest

Không làm thế thì làm thế nào được?

Tất nhiên là có cách rồi, nhiều cách là đằng khác. Người ta à thực ra là người tây họ cũng gặp phải vấn đề như bạn thôi, thế rồi họ nghĩ ra cái cách mà đỡ tốn công sức ‘manual’ cho họ, đó là tạo ra một công cụ tự động làm cho họ công việc ấy. Nhưng mà lưu ý rằng, automate không thay thế hoàn toàn 100% manual được, nhưng nó sẽ giúp tiết kiệm được rất rất nhiều chi phí cho việc retest và regression test.

Có rất nhiều tool hỗ trợ automate testing, được phần đông cộng đồng tester biết đến như là Selenium, HP QTP/UFT, TestComplete, IBM Rational Functional Tester, Ranorex, Jmetter, SoapUI, Appium, … rất nhiều, chỉ với từ khóa đơn giản là ‘automation testing tools’ thì google sẽ tìm ra cho bạn cả lô xích xông các link, bạn tha hồ tìm hiểu, vấn đề của bạn chỉ là làm thế nào để dùng được nó thôi.

Tuy nhiên, các tool đều là các tool thương mại cả, và vì là tool thương mại nên chi phí bạn bỏ ra để sử dụng tool đó khá là đắt đỏ, nhưng đổi lại thì bạn sẽ  được sử dụng một công cụ rất mạnh mẽ, thêm nữa là bạn sẽ luôn nhận được sự hỗ trợ nhiệt tình từ các supporter của nhà cung cấp.

Ngoài ra, nếu vấn đề ở mặt chi phí, thì yên tâm, hiện nay cũng có nhiều tool free để dùng, tính năng vẫn nhiều, cũng mạnh mẽ, cũng có các cộng đồng hỗ trợ rất đông đảo trên toàn cầu. Tiêu biểu như:

1. Selenium

Công cụ open source + free, ngoài việc bạn có thể lấy về để sử dụng thoải mái, thì bạn còn có thể đóng góp xây dựng để nó mạnh mẽ hơn nữa thông qua Official SeleniumHQ Github page . Selenium – công cụ hỗ trợ functional automation testing cho các ứng dụng web, bạn có thể execute script trên nhiều trình duyệt và các hệ điều hành khác nhau, Selenium tương thích với nhiều ngôn ngữ lập trình và các automation testing framework.

26594-QA-2-selenium-webdriver

Với selenium, bạn có thể tạo ra các script để thực hiện kiểm thử tự động trên các trình duyệt, và trên các môi trường test khác nhau.

Cùng với đó, bạn cũng có thể tạo ra các sript với selenium, giải pháp hỗ trợ tuyệt vời cho bạn trong việc tái hiện các bug, thực hiện kiểm thử hồi quy (regression testing), và exploratory testing.

2. Jmetter

apachejmeter_0

Jmetter là ứng dụng desktop được sử dụng nhiều trong kiểm thử hiệu năng ứng dụng web, đây cũng là một tool free cùng với sự hỗ trợ đông đảo từ cộng đồng người sử dụng. Về mặt giao diện người dùng, theo ý kiến chủ quan của mình thì nó thực sự có vẻ không được đẹp lắm nhưng lại khá là dễ sử dụng. Jmetter hỗ trợ nhiều loại ứng dụng, server và protocol như Web, SOAP, FTP, TCP, LDAP, SOAP, MOM, Mail Protocols, shell scripts, java objects, và cả database.

3. Appium

Mobile-App-Testing-1

Appium là một test automation framework, được sử dụng nhiều trong kiểm thử ứng dụng mobile. Tất nhiên là trong list này thì nó cũng là một tool free.

Appium hỗ trợ automation cho các ứng dụng native, hybrid và mobile web – những ứng dụng được build trên cả iOS và Android. Appium được đánh giá công cụ khá dễ dàng cài đặt cũng như sử dụng, và được cho là một trong những tool tốt nhất cho mobile automation testing.

4. SoapUI

SoapUI_0

Cuối cùng thì có SoapUI, đây cũng là một tool open source, được sử dụng trong API testing cho cả SOAP và REST APIs. SoapUI cung cấp OAP Web Services functional testing, REST API functional testing, WSDL coverage, message assertion testing và test refactoring.

Chúng ta đều biết rằng tool hỗ trợ thì rất nhiều, tuy nhiên việc quan trọng ở đây là làm sao lựa chọn được cái nào đó phù hợp với project, có thể áp dụng và mang lại giá trị nhất định cho project đó.

Bản thân mình đã có thời gian được – tự học về mấy tool trên này, và mình cũng áp dụng vào project của mình rồi, chỉ có điều chưa official, thế rồi cũng để ngỏ vì mình chuyển qua công ty khác. Tuy vậy thì mình vẫn muốn lại dành thời gian để tìm hiểu sâu hơn về mảng này. Viết được auto cho website book vé online của trang https://www.airasia.com hay là trang mua hàng nào đó, kiểu kiểu như vậy.

Vì thế tiếp theo bài này sẽ là những kiến thức basic để có thể bắt đầu với automation testing với Selenium, Jmetter, SoapUI, và Appium. Đầu tiên thì là để tổng hợp lại kiến thức đã học được, sau là để ôn lại những ngày tháng mình đã bắt đầu làm quen với automation. Hi vọng, những bài học mà mình đã đi qua, có thể là những bài học sau này mình lại có thể cần đến, hoặc có thể giúp ích được cho ai đó đang tự bắt đầu như mình.

Bài viết gốc được đăng tải tại vananhtooo.wordpress.com

Có thể bạn quan tâm:

Xem thêm Tuyển dụng automatic tester hấp dẫn trên TopDev

App User Centricity: Làm sao tăng tỷ lệ duy trì lên 66%?

mobile app
App User Centricity: Làm sao tăng tỷ lệ duy trì lên 66%?

Accesstrade là đơn vị chuyên về Performance Marketing. Công ty đã có 21 năm kinh nghiệm trong việc vận hành và triển khai các dịch vụ performance cho nhiều doanh nghiệp trong và ngoài nước. Theo thống kê gần đây của AppsFlyer – đơn vị chuyên về hệ thống tracking SDK số 1 trên thế giới, trong nửa năm 2020, Accesstrade là đơn vị đứng thứ 2 trong top những đơn vị non-game cung cấp các dịch vụ về traffic và user cho các doanh nghiệp muốn phát triển về mobile app.

  5 app dù bị đánh giá thấp nhưng không nên bỏ qua
  5 bài học từ việc phát triển app cho web

Tổng quan về nội dung chia sẻ

Ở sự kiện Vietnam Web Summit 2020 lần này, Accesstrade muốn đóng góp thêm về những giải pháp mà Accesstrade cung cấp giúp các doanh nghiệp giữ chân người dùng sau khi đã mang được người dùng đến với app của mình. Cũng như chia sẻ thêm về việc làm sao tăng tỉ lệ retention rate từ 10% – một tỉ lệ trung bình lên 50 – 60%. Hi vọng rằng qua bài chia sẻ này mọi người sẽ hiểu rõ hơn cũng như tìm ra giải pháp cho kênh mobile app của sản phẩm mình.

Sơ lược về tình hình thị trường Mobile App hiện tại

Hoạt động của doanh nghiệp

Thị trường Việt Nam hiện đang phát triển rất nhanh nhờ lượng dân số trẻ cao hơn, dẫn đến tỉ lệ người dùng thích nghi với công nghệ mới hay muốn trải nghiệm công nghệ mới cũng cao hơn. Độ trẻ hóa của user trong việc dùng mobile app cũng ngày càng trẻ hóa nên hầu như các doanh nghiệp đều đang build những sản phẩm dạng mobile app. Mobile app đang phát triển rất mạnh và được đầu tư nguồn lực rất lớn.

Hiện tại các nhà mạng đã bắt đầu triển khai mô hình 5G tại Việt Nam, 5G là công nghệ mới đầy hứa hẹn và Việt Nam là một trong những nước tiên phong triển khai công nghệ này. Sắp tới khi 5G được triển khai rộng khắp, lượng người dùng mobile cũng như cách họ trải nghiệm sản phẩm trên mobile sẽ khác hơn rất nhiều. Trước đây khi mọi người còn dùng mạng 3G hay những mạng yếu hơn thì việc xem livestream trên app, video YouTube và những content nặng trên mobile app gần như rất hạn chế. Nhưng khi 4G đã phổ biến, sắp tới là 5G, 6G thì những content trên mobile app sẽ ngày càng phát triển.

Vậy chúng ta phải đi trước đón đầu xu hướng này như thế nào? Các doanh nghiệp nên cân nhắc đến việc lên những phương án phát triển content và mobile app trong thời gian tới ra sao? Doanh nghiệp muốn thành công trong triển khai mobile app cần giải quyết được các vấn đề này.

mobile app
Nhạy bén với xu hướng giúp tăng cơ hội phát triển cho mobile app

Tình hình users

Theo báo cáo mới nhất của Appota năm 2020 thì người dùng Việt Nam đang ngày càng trẻ hóa. Họ rất thích những trend mới và thường chọn lựa trend. Nhưng việc này lại không có một quy chuẩn nhất định mà chỉ đơn thuần là người dùng thấy xu hướng nào đang hot, hấp dẫn thì tìm hiểu và sử dụng mà thôi. Tiktok là một case study điển hình cho trường hợp này. Sự tăng trưởng của Tiktok trong thời gian qua là minh chứng cho việc giới trẻ Việt Nam và thế giới đang thích nghi rất nhanh với xu thế.

Vậy nên để bắt kịp xu thế đó, có được sự chuẩn bị trước để điều hướng người dùng theo xu thế các công ty mong muốn để phát triển app của mình là bài toán mà các doanh nghiệp cần cân nhắc và giải quyết.

Doanh nghiệp đang đối diện với những thách thức nào?

Nắm bắt xu hướng khách hàng

Những khó khăn vướng mắc có thể gặp phải ở thời điểm hiện tại là về xu hướng của khách hàng. Dù khách hàng rất thích trend mới, họ dùng app rất nhiều, thời gian dành cho mobile app đang ngày càng nhiều hơn so với cùng content đó trên PC. Nhưng để đưa khách hàng đến với action cuối cùng là mua hàng trên mobile app vẫn còn rất thấp. Người dùng vẫn muốn thanh toán offline hoặc bằng những hình thức khác, tỉ lệ thanh toán trực tiếp trong app vẫn còn rất thấp. 46% người dùng vẫn thích hình thức thanh toán thông thường hơn.

Tỷ lệ trung thành của khách hàng (retention rate) thể hiện qua việc họ tiếp tục sử dụng app trong vòng 1 tháng hay 3 tháng tới sẽ giảm rất nhanh và tỷ lệ chung hiện tại đang nằm trong khoảng dưới 10%. Tỷ lệ retention rate thấp như vậy dẫn đến việc doanh nghiệp đầu tư rất nhiều budget cho việc lôi kéo khách hàng về, sau đó đổ khách hàng “vào phễu” và cứ thế trôi đi. Không có gì đọng lại, không chuyển đổi và họ cũng không trở thành khách hàng trung thành. Điều này khiến chi phí đầu tư bị lãng phí và tỉ lệ return on investment của các doanh nghiệp sẽ ngày càng thấp.

Xem thêm 5 tips cải tiến chất lượng phát triển Mobile App

Xây dựng core value cho doanh nghiệp

Một khó khăn nữa là khi các doanh nghiệp cân nhắc đến việc phát triển app, tất cả các giá trị đều dựa trên core value. Với doanh nghiệp vận chuyển thì công ty phải phát triển app dành cho việc vận chuyển hay trong lĩnh vực tài chính cũng tương tự. Việc phát triển app dù ở bất kỳ lĩnh vực nào cũng đều tập trung vào việc làm thế nào để khách hàng sử dụng dịch vụ của họ một cách dễ dàng và thuận tiện nhất.

Đấy là suy nghĩ hoàn toàn đúng, tuy nhiên chính điều này cũng dẫn đến việc khi khách hàng sử dụng xong dịch vụ, core value mà họ mong muốn rồi thì app không còn giá trị hay mục tiêu gì tiếp tục lôi cuốn họ sử dụng nữa. Với những mô hình super app đang được build như Grab chẳng hạn thì có thể thấy, Grab đang có đội partnership riêng, họ đang kết nối với rất nhiều đơn vị ở ngoài thị trường để cung cấp những giải pháp, promotion, sản phẩm đáp ứng nhu cầu của tệp khách hàng công ty họ. Đội partnership phải làm việc với từng khách hàng để lấy promotion về. Phải tốn khá nhiều chi phí, nguồn lực để mang những promotion này về. Và không phải doanh nghiệp nào cũng triển khai mô hình này được. Đây là vấn đề mà các doanh nghiệp khi muốn build hệ sinh thái mở rộng nhiều hơn sẽ gặp phải.

mobile app
Xác định đúng nhu cầu khách hàng là yếu tố quan trọng

Cũng như khi chúng ta muốn mở rộng thị trường, muốn phát triển những mảng dịch vụ mới trong khi các bạn không có những con người đủ hiểu về sản phẩm đó để build được quy trình vận hành đủ tốt. Dẫn đến việc dù mình có đủ nguồn lực, tài nguyên, tài chính để làm nhưng trải nghiệm của khách hàng với dịch vụ đó không thật sự tốt, khiến khách hàng không muốn sử dụng app nữa.

Những yếu tố này khiến cho việc phát triển app, kể cả với những người đã biết cách làm hay chưa rất khó khăn vì không có key chủ chốt để giữ chân khách hàng lại. Với kinh nghiệm của mình, Accesstrade đã build một mô hình giúp khách hàng giải quyết những công việc này một cách dễ dàng hơn.

Giải pháp tăng tỷ lệ người dùng trung thành

Triển khai các mô hình content mới

Cần tạo ra những content mới, những mục đích sử dụng mới cho khách hàng để khi khách hàng vào trải nghiệm, sử dụng sản phẩm, họ có thể thấy được thông điệp mà công ty muốn gửi đến với người dùng. Để thực hiện điều này chúng ta phải customize theo chân dung khách hàng, nắm bắt được hành vi của họ, khách hàng hay vào app lúc nào, sử dụng dịch vụ gì, với chân dung khách hàng A nên cung cấp những notification gì, chân dung khách hàng B khác gì với khách hàng A.

Phải customize theo từng chân dung khách hàng như vậy thì tỉ lệ chuyển đổi từ notification của app mới cao hơn được. Nếu với bất cứ khách hàng nào mình cũng gửi chung một thông điệp, offer một dịch vụ thì chắc chắn tỉ lệ chuyển đổi sẽ rất thấp vì không chắc là họ có nhu cầu với dịch vụ đó hay không. Và khi thông điệp đó xuất hiện quá nhiều lần sẽ khiến khách hàng cảm thấy rất phiền và không thích app đó nữa. Việc đẩy thông điệp nếu làm không khéo nhiều khi còn khiến mình bị mất khách hàng. Đó là những vấn đề mà khi build app chúng ta cần lưu ý.

mobile app
Streaming và Gamification là hai mô hình phát triển ở thời điểm hiện tại

Tận dụng xu hướng streaming để quảng cáo sản phẩm

Ngoài ra thì với trend của người dùng hiện tại, mô hình streaming, KOLs, influencers livestream giới thiệu về sản phẩm, dịch vụ đang ngày càng nhiều, rất nhiều mô hình đang thêm streamer vào mô hình của họ như Shopee, Lazada, Tiki,… Đây cũng là cách tốt để quảng bá những thông điệp, sản phẩm mình đang có cũng như tạo ra cách tiếp cận về content theo một hướng mới, sinh động hơn, đa dạng hơn, hấp dẫn hơn.

Để khi khách hàng xem những thông điệp này, họ dễ hình dung về sản phẩm hơn và dễ đưa ra các quyết định thực hiện hành vi mua hàng hơn. Liên tục có những content mới sẽ giúp giữ chân khách hàng vì họ có được những trải nghiệm mới mẻ hơn và quay lại sử dụng sản phẩm của bạn nhiều hơn.

Phát triển gamification

Gamification cung cấp các tính năng về game. Người dùng, nhất là người dùng trẻ ở Việt Nam rất thích chơi game, thích trải nghiệm, thích những thứ hơi mang tính may rủi một chút. Hiện tại đã có khá nhiều các app lớn đang build mô hình gamification. Như vào app Shopee mỗi ngày luôn có những nhiệm vụ thu thập xu hay vòng quay may mắn. Những gamification này sẽ tạo ra động lực, sức hút để khách hàng liên tục quay lại và trải nghiệm app mỗi ngày. Đó là những cách giúp bạn build một content hấp dẫn, liên tục thay đổi và mới mẻ để thu hút khách trải nghiệm và quay lại mỗi ngày.

Những mô hình được cung cấp bởi ACCESSTRADE

Còn đối với những công ty như Grab đang triển khai mô hình về partnership lấy các promotion, các deal về thì sao? Thực tế thì các doanh nghiệp vừa và nhỏ sẽ khó làm được điều này vì nó tốn khá nhiều chi phí cũng như cần có đội ngũ để triển khai mô hình này. Bên cạnh đó, nếu brand công ty chưa đủ lớn thì việc gặp gỡ đối tác có cùng sản phẩm mà khách hàng của bạn mong muốn để lấy deal hay promotion đó về thật sự không phải là vấn đề dễ dàng.

Accesstrade sẽ cung cấp một nền tảng sinh thái, cho phép thêm toàn bộ các dịch vụ liên quan vào app của công ty bạn hoàn toàn miễn phí. Ngay lập tức app sẽ có tầm 73.000.000 SKUs và mỗi ngày Accesstrade có 1000 vouchers liên tục update từ những đối tác lớn trên thị trường như ecommerce, travel, dịch vụ,… Khách hàng khi vào app sẽ kiểm tra xem hôm nay có những mã giảm giá gì, có những deal gì hấp dẫn.

Ngoài ra nếu như khách hàng đã vào app rồi nhưng vẫn đang cân nhắc về giá hay chất lượng sản phẩm,… thì Accesstrade cung cấp thêm một giải pháp nữa đó là Service Cashback. Cashback có thể hiểu là khi bạn mua một sản phẩm dịch vụ thì sẽ được hoàn tiền. Đây là một service rất hấp dẫn có thể thúc đẩy mong muốn mua hàng của khách hàng thành hành động ngay lập tức. Như service mà Accesstrade đang thực hiện với một đối tác là ngân hàng lớn hiện nay, mỗi tháng trên app phát sinh 30000 đơn hàng.

Những giải pháp này sẽ cho bạn thấy giá trị mà mobile app có thể mang lại. Không chỉ là  retend khách hàng, tăng lượng khách hàng trung thành mà còn bán được hàng, bán được rất nhiều đơn hàng chứ không chỉ là một vài đơn. Đấy là lợi thế khi mình thêm hệ sinh thái vào. Đó là giải pháp giúp doanh nghiệp tăng trưởng bền vững, vừa tăng khách hàng vừa tăng sale.

  7 Tip tăng tương tác hiệu quả trên mobile

Ngoài ra, Accesstrade cũng cung cấp các dịch vụ để bạn verify thông tin khách hàng, social trusting, performance tracking, quản lý hoàn toàn các thông tin như đang có bao nhiêu publisher, bao nhiêu đối tác promote cho sản phẩm, dịch vụ của mình. Và một số tính năng như sau khi đã có những khách hàng trung thành rồi thì cũng có thể ngay lập tức trở thành các đại sứ thương hiệu cho sản phẩm cho dịch vụ của công ty. Chính những đại sứ thương hiệu này sẽ mang thông tin sản phẩm đi chia sẻ trong network quan hệ của họ để các khách hàng tiềm năng trải nghiệm. Khi đã đổ thêm được lượng traffic vào trong cái phễu rồi thì họ sẽ trải nghiệm từ core service của bạn, trải nghiệm hệ sinh thái của Accesstrade, tính năng cashback và lại tiếp tục trở thành những đại sứ thương hiệu mới. Đó là cách giúp growth hack rất nhanh thông qua việc đẩy khách hàng vào kênh mobile app của mình.

Sử dụng nền tảng hỗ trợ

Như đã chia sẻ, các bạn KOLs, influencers livestream trên nền tảng của app thì Accesstrade cũng cung cấp giải pháp KOC performance, tức là các bạn KOLs hay influencers của Accesstrade khi các bạn promote cho các doanh nghiệp thì không chỉ họ đang branding mà còn bán được các sản phẩm, bán được service, tăng list khách hàng cho doanh nghiệp. Đây là mô hình khá mới trên thị trường và đang hoạt động rất hiệu quả.

Accesstrade hiện cũng sở hữu đội ngũ chuyên customize để cùng các công ty vận hành campaign xem có những vấn đề gì không hay trở thành cầu nối, giúp cho việc tối ưu performance của campaign một cách tốt nhất. Bên cạnh đó, Accesstrade cũng có những dịch vụ về customer support, bất cứ khi nào bạn có những câu hỏi, vướng mắc hay những vấn đề gì cần giải quyết thì team support sẵn sàng hỗ trợ bạn trong quá trình triển khai dịch vụ.

Bài viết được trích dẫn từ phần trình bày của anh Dũng Bùi tại sự kiện Vietnam Web Summit 2020 LIVE do TopDev tổ chức

Có thể bạn quan tâm:

Xem thêm các việc làm Developer hấp dẫn tại TopDev

Hãy theo đuổi đam mê thành công sẽ theo đuổi bạn

Bài viết được sự cho phép của tác giả Kien Dang Chung

Đã rất lâu rồi không có một bài viết nào mới trên Allaravel, do thời gian không cho phép. Hôm nay có chút thời gian kiểm tra lại đứa con cưng ngày nào thấy kết quả thật tuyệt vời.

  10 tips để trở thành Java Developer xịn hơn
  20 trường hợp sử dụng lệnh Docker cho developer
Hãy theo đuổi đam mê thành công sẽ theo đuổi bạn

Allaravel sau hơn 3 năm hoạt động đã có một thứ hạng kha khá 361k trên toàn cầu. Với gần 500 bài viết, 2 khóa học hoàn chỉnh: Khóa học Laravel từ A đến Z và Khóa học Vue.js thần thánh. Với tôn chỉ chia sẻ để tiến bộ, Allaravel đã định hình lại toàn bộ kiến thức về lập trình web là nơi giao lưu của nhiều thành viên. Cũng nhờ đó, mình biết thêm về rất nhiều công nghệ mới giúp ích rất trong công việc quản trị CNTT hiện tại.

Nhìn cái thành quả 361k Alexa, mình muốn chia sẻ với các bạn trẻ, đặc biệt các bạn trong lĩnh vực CNTT – Hãy cứ cháy hết mình, bạn sẽ thấy cuộc sống thật tươi đẹp.

Hãy theo đuổi đam mê thành công sẽ theo đuổi bạn

Cách đây tròn chục năm, được một người bạn giới thiệu bộ phim 3 Idiots (Ba chàng ngốc), một bộ phim của Ấn Độ – thể loại mà mình không thật sự khoái lắm nhưng sau khi xem 15 phút đầu mình đã xem bộ phim dài gần 3 giờ trong đêm với nhiều cảm xúc.

“Hãy theo đuổi đam mê, thành công sẽ theo đuổi bạn”. Câu nói rất đơn giản của chàng Rancho – nhân vật chính trong phim – nhưng nó lại là chìa khóa cho những ai đang đi tìm kiếm sự thành công thật sự trong cuộc sống.

Mình là Kiên ĐC, đây là facebook của mình https://www.facebook.com/kien.dangchung rất mong được kết bạn, giao lưu, học hỏi chia sẻ kiến thức với tất cả mọi người. Cảm ơn anh em đã cổ vũ động viên tinh thần qua những comment để lại, cảm ơn sự ủng hộ của mọi người.

Bài viết gốc được đăng tải tại allaravel.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev