Home Blog Page 193

Xác thực và phân quyền trong Microservices

Tác giả: Hòa Nguyễn

Xác thực (authentication, trả lời câu hỏi bạn là ai) và phân quyền (authorization, trả lời câu hỏi bạn có thể làm được gì) microservices luôn là thành phần không thể thiếu của mọi hệ thống, nhưng mức độ áp dụng thì lại tùy thuộc vào từng giai đoạn.

Nếu bạn làm mọi thứ chặt chẽ ngay từ đầu, nó có thể làm tăng độ phức tạp và làm chậm sự phát triển của công ty. Nhưng nếu bạn làm nó quá muộn, thì có thể bạn sẽ hứng chịu nguy cơ bị tấn công và rủi ro từ đó. Với 1 công ty e-commerce như Tiki, rủi ro đó rất hiện hữu với các hệ thống liên quan tới thanh toán, tiền ảo (Tiki Xu), mã khuyến mại (coupon), phiếu quà tặng (giftcard) và nhiều hệ thống nhạy cảm khác…

Bắt đầu từ Monolithic

Tiki xuất phát là 1 hệ thống monolithic, thông thường ở hệ thống như vậy sẽ có 1 module chung quản lý việc xác thực và phân quyền, mỗi user sau khi đăng nhập sẽ được cấp cho 1 Session ID duy nhất để định danh.

Phía client có thể lưu Session ID lại dưới dạng cookie và gửi kèm nó trong mọi request. Hệ thống sau đó sẽ dùng Session ID được gửi đi để xác định danh tính của user truy cập, để người dùng không cần phải nhập lại thông tin đăng nhập lần sau

Khi Session ID được gửi lên, server sẽ xác định được danh tính của người dùng gắn với Session ID đó, đồng thời sẽ kiểm tra quyền của user xem có được truy cập tác vụ đó hay không.

Giải pháp session và cookie vẫn có thể sử dụng, tuy nhiên ngày nay chúng ta có nhiều yêu cầu hơn, chẳng hạn như các ứng dụng Hybrid hoặc SPA (Single Page Application) có thể cần truy cập tới nhiều hệ thống backend khác nhau, vì vậy session và cookie lấy từ 1 server có thể không sử dụng được ở server khác.

Bài toán khó Microservices

Trong kiến trúc microservices, hệ thống được chia nhỏ thành nhiều hệ thống con, đảm nhận các nghiệp vụ và chức năng khác nhau. Mỗi hệ thống con đó cũng cần được xác thực và phân quyền, nếu xử lý theo cách của kiến trúc Monolithic ở trên chúng ta sẽ gặp các vấn đề sau:

  • Mỗi service có nhu cầu cần phải tự thực hiện việc xác thực và phân quyền ở service của mình. Mặc dù chúng ta có thể sử dụng các thư viện giống nhau ở mỗi service để làm việc đó tuy nhiên chi phí để bảo trì thư viện chung đó với nhiều nền tảng ngôn ngữ khác nhau là quá lớn.
  • Mỗi service nên tập trung vào xây dựng các nghiệp vụ của mình, việc xây dựng thêm logic về phân quyền làm giảm tốc độ phát triển và tăng độ phức tạp của các service.
  • Các service thông thường sẽ cung cấp các interface dưới dạng RESTful API, sử dụng protocol HTTP. Các HTTP request sẽ được đi qua nhiều thành phần của hệ thống. Cách truyền thống sử dụng session ở server (stateful) sẽ gây khó khăn cho việc mở rộng hệ thống theo chiều ngang.
  • Service sẽ được truy cập từ nhiều ứng dụng và đối tượng sử dụng khác nhau, có thể là người dùng, 1 thiết bị phần cứng, 3rd-party, crontab hay 1 service khác. Việc xác định định danh (identity) và phân quyền (authorization) ở nhiều ngữ cảnh (context) khác nhau như vậy là vô cùng phức tạp

Dưới đây là một số giải pháp, kỹ thuật và hướng tiếp cận mà Tiki đã áp dụng cho bài toán này.

Định danh

Sử dụng JWT

JWT (Json Web Token) là 1 loại token sử dụng chuẩn mở dùng để trao đổi thông tin kèm theo các HTTP request. Thông tin này được xác thực và đánh dấu 1 cách tin cậy dựa vào chữ ký. JWT có rất nhiều ưu điểm so với session.

  • Stateless, thông tin không được lưu trữ trên server.
  • Dễ dạng phát triển, mở rộng.
  • Performance tốt hơn do server đọc thông tin ngay trong request (nếu session thì cần đọc ở storage hoặc database)

Mã hóa RSA cho JWT

Phần chữ ký sẽ được mã hóa lại bằng HMAC hoặc RSA.

  • HMAC: đối tượng khởi tạo JWT (token issuer) và đầu nhận JWT (token verifier) sử dụng chung 1 mã bí mật để mã hóa và kiểm tra.
  • RSA: sử dụng 1 cặp key, đối tượng khởi tạo JWT sử dụng Private Key để mã hóa, đầu nhận JWT sử dụng Public Key để kiểm tra.

Như vậy với HMAC, cả 2 phía đều phải chia sẻ mã bí mật cho nhau, và đầu nhận JWT hoàn toàn có thể khởi tạo 1 mã JWT khác hợp lệ dựa trên mã bí mật đó. Còn với RSA, đầu nhận sử dụng Public Key để kiểm tra nhưng không thể khởi tạo được 1 JWT mới dựa trên key đó. Vì vậy mã hóa sử dụng RSA giúp cho việc bảo mật chữ ký tốt hơn khi cần chia sẻ JWT với nhiều đối tượng khác nhau.

Sử dụng Opaque Token khi muốn để kiểm soát phiên làm việc tốt hơn

Opaque Token (còn được gọi là stateful token) là dạng token không chứa thông tin trong nó, thông thường là 1 chuỗi ngẫu nhiên và yêu cầu 1 service trung gian để kiểm tra và lấy thông tin. Ví dụ:

{
"access_token": "c2hr8Jgp5jBn-TY7E14HRuO37hEK1o_IOfDzbnZEO-o.zwh2f8SPiLKbcMbrD_DSgOTd3FIfQ8ch2bYSFi8NwbY",
"expires_in": 3599,
"token_type": "bearer"
}

Transparent Token (còn được gọi là stateless token) thông thường chính là dạng JWT, token này bản thân chứa thông tin và không cần 1 service trung gian để kiểm tra. Hãy cùng so sánh 2 loại token này

Như vậy ta có thể thấy Transparent Token mang lại tốc độ tốt hơn, đơn giản dễ sử dụng với cả 2 phía, không phù thuộc vào 1 server trung tâm để kiểm tra. Còn Opaque Token kiểm soát tốt hơn các phiên làm việc của đối tượng, chẳng hạn khi bạn muốn thoát tất cả các thiết bị đang đăng nhập.

OAuth 2

Các token sẽ được khởi tạo thông qua OAuth 2, là phương thức chức thực phổ biến nhất hiện nay, mà qua đó một service, hay một ứng dụng bên thứ 3 có thể đại điện (delegation) cho người dùng truy cập vào 1 tài nguyên của người dùng nằm trên 1 dịch vụ nào đó.

OAuth 2 là chuẩn mở, có đầy đủ tài liệu, thư viện ở tất cả các ngôn ngữ khác nhau giúp cho việc tích hợp, phát triển dựa trên nó trở nên dễ dàng và nhanh chóng.

Kiến trúc cho xác thực và phân quyền

Sau khi đã có định danh và giao thức dùng để giao tiếp, câu hỏi tiếp theo là cần trả lời câu hỏi đối tượng với định danh đó có quyền thực hiện 1 hành động, truy cập 1 tài nguyên nào đó hay không. Ở Tiki, bên cạnh các service được xây dựng mới, vẫn còn tồn tại các hệ thống cũ (legacy) chạy song song, thế nên hiện nay Tiki có 2 cách thức tổ chức phân quyền như dưới đây.

Xác thực, phân quyền tại lớp rìa

Theo mô hình tất cả mọi request sẽ được xác thực khi đi qua API Gateway hoặc BFF (Backend For Frontend). BFF chính là lớp service ở rìa (Edge Service) được thiết kế riêng cho từng ứng dụng (ví dụ IOS, Android, Management UI). Chúng ta sẽ đặt xác thực và phân quyền ở lớp rìa này

  • API Gateway sẽ bắt buộc tất cả request sẽ cần gửi kèm token để định danh
  • Nếu token này là JWT (đối với OpenID Connect), Gateway có thể kiểm tra tính hợp lệ của token thông qua chữ ký (signature), thông tin (claim) hoặc đối tượng khởi tạo (issuer)
  • Nết token này là Opaque Token, Gateway có thể phân tích (introspect) token, đổi (exchange) lấy JWT và truyền tiếp vào trong cho các services.
  • API Gateway hoặc BFF kiểm tra các policy xem có hợp lệ hay không thông qua Authorization Server trung tâm.
  • Các microservices không thực hiện lớp xác thực và phân quyền nào, có thể tự do truy cập bên trong vùng nội bộ (internal network).

Mô hình này có điểm tương đồng với kiến trúc Monolithic khi đặt xác thực phân quyền tại 1 số service nhất định, việc xây dựng và bảo trì sẽ tốn chi phí nhỏ hơn, tuy nhiên sẽ để lộ 1 khoảng trống bảo mật rất lớn ở lớp trong do các service có thể tự do truy cập lẫn nhau.

Chúng ta có thể đặt 1 số rule ở góc độ network đối với các service bên trong này tuy nhiên các rule này sẽ tương đối đơn giản và không thể đáp ứng được các nghiệp vụ truy cập dữ liệu lẫn nhau giữa các team/service (mở rộng ra là các công ty nội bộ) độc lập nhau

Xác thực, phân quyền tại các service

Ở mô hình này, mỗi service (trừ 1 số ngoại lệ) khi được thiết kế và xây dựng các giao tiếp APIs (API Interface) mở rộng được và có thể phục vụ cho thế giới bên ngoài. Một service hôm nay được xây dựng cho các nghiệp vụ bên trong nội bộ công ty, nhưng ngày mai có thể sẵn sàng để mở ra cho các đối tác, các lập trình vên ngoài.

Điều này sẽ giúp cho các service/team chủ động được hoàn toàn về các tài nguyên hiện có, tài nguyên đó được cấp cho những đối tượng nào, được truy cập từng phần hay toàn phần…

Để làm được việc này, vai trò rất lớn sẽ nằm ở service IAM (Identity Access Management), IAM nắm giữ các định danh của toàn bộ các đối tượng (user, service, command…) cùng với các bộ luật phân quyền chi tiết cho từng loại tài nguyên.

Việc mỗi service phải tự thực hiện việc xác thực, phân quyền sẽ làm tăng chi phí khi xây dựng các service, bên ngoài các nghiệp vụ chính thì cần thêm lớp middleware để giao tiếp với IAM.

Tuy nhiên các service sẽ có được sự tự chủ hoàn toàn, chủ động về việc cung cấp tài nguyên cho các đối tượng, và tăng tốc phát triển hơn vì nhiều trường hợp client có thể truy cập thẳng tới các service mà không cần phát triển thêm lớp BFF ở giữa.

Access Control

Xây dựng hệ thống luật (rule) hiệu quả không bao giờ là dễ dàng, khi yêu cầu về nghiệp vụ tăng cao kéo theo yêu cầu về phân quyền càng phức tạp. Hãy lấy 1 ví dụ cụ thể để làm rõ, mỗi ứng dùng thông thường sẽ gán quyền cho 1 thành viên cụ thể (ví dụ John được quyền tạo sản phẩm). Mở rộng ra trong 1 hệ thống microservices, đối tượng ở đây có thể là người dùng, service, crontab…

Có 1 vài cách tiếp cận cho việc phân quyền như trên, hãy thử đi qua các cách khác nhau để có nhiều góc nhìn khác nhau.

Access Control List (ACL)

Trong ví dụ trên các bạn có thể thấy 1 ma trận của đối tượng và quyền, nó gần tương đương với cách quản lý file trên Linux (chmod) và phù hợp với những ứng dụng có ít đối tượng. Khi hệ thống lớn lên mô hình này sẽ không thể quản lý nổi bởi ma trận được tạo ra quá lớn và phức tạp. Do vậy và mô hình này không còn phổ biến hiện tại.

Role-Based Access Control (RBAC)

RBAC liên kết đối tượng tới các vai trò (role), và từ vai trò tới các quyền. Chẳng hạn vai trò Administratorcó thể thừa hưởng mọi quyền mà vai trò Manager có, điều này giúp làm giảm độ phức tạp của ma trận quyền, thay vì gán toàn bộ quyền cho Administrator thì chỉ cần cho Administrator thừa hưởng các quyền của Manager.

RBAC rất phổ biến và bạn có thể thấy ở mọi nơi, so với ACL thì RBAC giúp giảm thiểu độ phức tạp khi số lượng đối tượng + quyền tăng cao. Tuy nhiên RBAC chưa thỏa mãn được 1 số trường hợp, ví dụ khi cấp quyền 1 sản phẩm chỉ được sửa bởi người tạo, người dùng nằm trong 1 phòng ban xác định hoặc quyền phân biệt với các người dùng từ nhiều hệ thống (tenant) khác nhau.

Policy-Based Access Control (PBAC)

PBAC được xây dựng dựa trên Attribute Based Access Control (ABAC), qua đó định nghĩa các quyền để diễn đạt một yêu cầu được cho phép hay từ chối. ABAC sử dụng các thuộc tính (attribute) để mô tả cho đối tượng cần được kiểm tra, mỗi thuộc tính là 1 cặp key-value ví dụ Department Marketing. Nhờ đó ABAC có thể giúp phân quyền mịn hơn, phù hợp với nhiều ngữ cảnh (context) và nghiệp vụ (business rules) khác nhau.

PABC được định nghĩa thông qua các policy được viết dưới dạng 1 ngôn ngữ chung XACML (eXtensible Access Control Markup Language). Một policy định nghĩa 4 đối tượng subject, effect, action và resource. Ví dụ john (subject) được allowed(effect) để mà delete(action) product với ID john-leman(resource). Nhìn qua thì nó gần giống với cách định nghĩa 1 ACL.

{
"subjects": ["user:john"],
"effect": "allow",
"actions": ["catalog:delete"]
"resources": ["product:john-leman"],
}

Chúng ta có thể bổ sung subject, action cũng như resource thêm vào policy nếu muốn.

{
"subjects": ["user:john", "user:katy", "user:perry"],
"effect": "allow",
"actions": ["catalog:delete", "catalog:update", "catalog:publish"]
"resources": ["product:john-leman", "product:john-doe"]
}

Bạn có thể thắc mắc thế thì PBAC khác gì ACL, và đây là sự khác biệt

Luật ưu tiên

  • Mặc định nếu không có policy phù hợp, yêu cầu sẽ bị từ chối
  • Nếu không có policy nào deny, có ít nhất một policy allow thì yêu cầu được cho phép
  • Nếu có 1 policy là deny, thì yêu cầu luôn bị từ chối

Regular Expression

Các policy cho phép khai báo sử dụng regular expression, như ở ví dụ này cho phép tất cả người dùng được xem thông tin product.

{
"subjects": ["user:<.*>"],
"effect": "allow",
"actions": ["catalog:read],
"resources": ["product:<.*>"]
}

Điều kiện

Các policy có thể bổ sung các điều kiện để thu hẹp phạm vi của quyền, ví dụ như chỉ áp dụng cho 1 dải IP nhất định, hoặc chỉ cho phép người tạo sản phẩm được sửa sản phẩm đó.

{
"subjects": ["user:ken"],
"actions" : ["catalog:delete", "catalog:create", "catalog:update"],
"effect": "allow",
"resources": ["products:<.*>"],
"conditions": {
"IpAddress": {
"addresses": [
"192.168.0.0/16"
]
}
}
}

Tổng kết

Việc liên tục mở rộng nghiệp vụ và hệ thống đòi hỏi các service phải tự xác thực, qua đó không phân biệt service đó là bên trong (internal) hay bên ngoài (external), giúp các team dễ dàng mở rộng tích hợp với nhau. Việc này đòi hỏi mô hình xác thực chung phải hoạt động ổn định, tối ưu và đáp ứng được hiệu năng cao.

Tham khảo thêm các vị trí tuyển dụng ngành cntt hấp dẫn tại đây

Có thể bạn muốn xem:

  Giao tiếp hiệu quả giữa các Microservice
  Microservices là gì? Speed up Microservices 1: Tác dụng phụ và một số chiến lược cơ bản

Bài viết gốc được đăng tải tại Tiki Engineering

Phân tích 80+ email từ chối ứng tuyển vào vị trí lập trình viên Python và kết quả không ai ngờ đến!

Không lúc này thì lúc khác, mỗi người chúng ta sẽ nhận được vài cái mail từ chối xin việc thôi. Bạn biết đấy, những mail như vậy thường bắt đầu với câu “Cảm ơn bạn đã quan tâm” và kết thúc với những giấc mơ tan vỡ, dập tắt mọi hy vọng đẹp đẽ vốn có. Xin lỗi, có vẻ tôi hơi cực đoan một chút. Tuy nhiên, việc nhận được mail từ chối là một trải nghiệm không dễ dàng gì.

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

  Giao tiếp hiệu quả giữa các Microservice
  Cloud-Native Microservices Với TIBCO: Khám phá dịch vụ bằng cách sử dụng Consul

Tìm việc làm python nhiều vị trí

Tin tôi đi, tôi hiểu rõ lắm! Vì sao ư? Vì tôi đã nhận được hơn 80 email từ chối công việc trong năm qua khi đăng ký làm thực tập sinh. Những con số sau sẽ cho bạn rõ tình trạng của tôi trước khi chúng ta vào vấn đề chính nhé!

Số công ty nộp đơn 234
Hồi âm 93
Từ chối 90
Offer 3

Điều đáng chú ý là, ít nhất là cho chương trình thực tập sinh, việc không nhận được phản hồi thường rất ít gặp. Trên thực tế, hơn 60% công ty mà tôi ứng tuyển đều không thấy phản ứng gì. Theo tôi, điều này đáng lo ngại hơn nhiều so với việc nhận được câu trả lời “không” rõ ràng. Ít nhất trong trường hợp đó, chúng ta sẽ tiếp tục tìm kiếm công ty khác thay vì tiếp tục hy vọng trong vô vọng.

Nhưng thử tưởng tượng xem, sau khi nghe từ “không” đến tận 80 lần, theo tự nhiên, bạn sẽ sinh ra một cảm giác “đối kháng”. Chính sự đối kháng ấy cùng với một chút tò mò là điều khiến tôi nảy ra dự án này. Tóm lại, tôi muốn điều tra xem nguyên nhân gì khiến nhà tuyển dụng gửi những mail từ chối tự động như vậy và chúng khác nhau như thế nào giữa các công ty. Nếu bạn muốn xem thêm về dự án của tôi, vui lòng truy cập vào GitHub repo.

Về phần còn lại của bài viết này, tôi sẽ chia sẻ cách tôi phân tích các email từ chối ra sao.

Bước 1: Thu thập dữ liệu

Trước tiên, hãy lấy dữ liệu! Khi truy vấn hộp thư đến Gmail của tôi, tôi đã tìm thấy hơn 1.000 email chứa các từ khóa “thực tập” và “ứng dụng”. Điều này khiến mọi việc trở nên khó khăn một chút từ góc nhìn tự động hóa.

Tôi đã ngồi phân loại các mail từ chối của mỗi công ty. Thậm chí tôi còn tạo một nhãn trong Gmail có tên “Job Rejection”. Xong xuôi, đã đến lúc tận dụng sức mạnh của Python. Tôi đã đăng nhập bằng imaplib và xóa bỏ các phần nổi của email. Để phân tích nội dung, tôi đã mã hóa văn bản bằng nltk  và xóa bất kỳ dấu câu và stop words nào có trong mail.

Xem thêm các vị trí lập trình viên python

Bước 2: Những cụm từ phổ biến

Bạn có bao giờ thắc mắc rằng tại sao các mail từ chối đều sử dụng một ngôn ngữ chung không? Tôi thường gặp rất nhiều cụm từ giống nhau, dường như được sử dụng từ công ty này đến công ty khác. Một số công ty có cách dùng từ ngữ rất linh hoạt và sáng tạo, nhưng rất hiếm khi gặp những trường hợp như vậy.

Hãy xem các từ và cụm từ phổ biến nhất được sử dụng cho những email này.

Như bạn có thể thấy ở trên, các nhà tuyển dụng lựa chọn từ “application” và “your” nhiều hơn hẳn những từ khác. Không cần phải bỏ ra nhiều công sức, bạn đã có thể lọc ra các mail có chủ đề như vậy:

  • Thank you for your interest.
  • Update on your [Insert role] application.

Những từ này thường là điềm báo cho những tin xấu đấy!

Video: Nhận dạng âm thanh: phân biệt giọng nam, nữ và vùng miền (Bắc Trung Nam)

 

Bước 3: Khung thời gian

Hãy tiến hành thêm một bước nữa là tổng hợp thời gian các email từ chối được gửi đi. Điều này khiến tôi nhớ đến một lời khuyên lâu đời: đừng nên sa thải nhân viên vào thứ Sáu, vì chúng ta không biết cuối tuần họ sẽ làm gì. Mặc dù chuyện này không quan trọng bằng chuyện sa thải nhân viên, nhưng vẫn rất thú vị khi thử nghĩ xem nhà tuyển dụng chọn thời gian nào để gửi “hung tin” đến ứng viên.

Sau đây là phân tích của tôi dựa trên các ngày trong tuần:

Có vẻ “Hump Day” (thứ Tư theo tư duy của người Mỹ) ngày thứ tư đen tối. Thứ năm ở vị trí nhì bảng, các ngày còn lại có số lượng khá nhất quán. Cuối tuần là khoảng thời gian nghỉ ngơi, tuy nhiên vẫn có một số nhà tuyển dụng gửi mail vào thứ Bảy?! Xấu hổ…

Đối với giờ trong ngày, độ phân bố nhìn khá đều theo như dự đoán của chúng ta. Có vẻ như số lần từ chối dao động vào lúc 9 giờ sáng đến giữa trưa. Thông thường đây là giờ bắt đầu làm việc của các công ty theo múi giờ EST và PST. Chỉ có một lần từ chối duy nhất là sau 5 giờ chiều. Và công ty đó không ai khác ngoài P&G.

Đến đây, phần phân tích dữ liệu của thôi đã hoàn tất.

Tổng kết

Dư án phân tích email từ chối nhận việc đối với tôi khá thú vị. Hơn thế nữa, nó cho tôi kinh nghiệm thực tiễn trong quá trình tìm viêc sau này cũng như cách ứng xử khi nhận được email từ chối. Không nhiều người có đủ coi trọng kỹ năng đối diện với thất bại đâu.

“Tôi đã thất bại nhiều và nhiều lần trong cuộc sống của tôi … và đó là lý do tại sao tôi thành công” – Michael Jordan

Sau hơn 80 email từ chối, rõ ràng, bạn sẽ quen với khái niệm thất bại. Tôi thấy mình ngày càng ít do dự khi nộp đơn vào các vị trí tại các công ty uy tín. Điều này cho phép tôi có được cơ hội mà ban đầu tôi không nghĩ nó nằm trong tầm tay của mình.

Nếu bạn đang đọc bài này, hãy tận dụng những cơ hội đó, tiếp cận nhà tuyển dụng thêm một chút, và hãy tự tin đối diện với thất bại. Rồi lại đứng lên. Lại cố gắng. Chỉ qua quá trình dài cố gắng, chúng ta mới có được thành công. Và khi bạn đã chạm đến đỉnh vinh quang, đừng quên nhìn lại những thất bại đã qua và tự nói với lòng mình rằng:

Thank you for your interest.

TopDev via Medium

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev ngay!

ADVN và cơ hội onsite Singapore dành cho “chiến binh” Ruby on Rails

ADVN và cơ hội onsite Singapore

Với vị thế hiện tại, ADVN đang dần chiếm ưu thế trong mối quan hệ hợp tác với các thương hiệu công nghệ hàng đầu. Nhằm mục đích tiến xa hơn trong lĩnh vực phát triển các dự án outsource, ADVN vẫn đang không ngừng chiêu mộ các tài năng IT với mức lương vô cùng hấp dẫn.

Sự tín nhiệm bởi các doanh nghiệp hàng đầu về công nghệ dành cho ADVN!

Từ năm 2016, ADVN trở thành nhà phân phối chính thức các thiết bị tin học mang thương hiệu tầm cỡ thế giới tại Việt Nam. ADVN đang ngày càng khẳng định vị thế của mình bởi sự tín nhiệm từ các thương hiệu công nghệ hàng đầu như MSI, Sony, Hitachi, InFocus, Prolink… Đây được xem là bước đà phát triển cho ADVN trong mối quan hệ hợp tác với các doanh nghiệp công nghệ ở thị trường quốc tế.

Hiện nay, ADVN đang tập trung sang các dự án outsource, thương mại điện tử và quảng cáo. Với mong muốn mang đến những sản phẩm, dịch vụ chất lượng kết hợp công nghệ tiên tiến nhất, ADVN đang ra sức săn đón các tài năng IT để cùng đồng hành phát triển.

Đội ngũ IT tại ADVN hiện đang tìm kiếm một mảnh ghép mới với vai trò là một Ruby on Rails Developer, là người thích phát triển phần mềm web, thương mại điện tử với việc tích hợp vào các ứng dụng mobile. Tại đây, ứng viên sẽ được phát triển năng lực của mình, phối hợp làm việc cùng với các lập trình viên khác, Project Manager và đội ngũ Infrastructure.

ADVN và con số offer đến $1,500 dành cho Ruby on Rails Developer

Nếu bạn muốn hợp tác cùng đội ngũ ADVN để nâng tầm giá trị kinh nghiệm và chuyên môn của mình, hãy gửi CV ứng tuyển ngay hôm nay. ADVN sẵn sàng tạo cho bạn một điều kiện không gian làm việc tốt nhất, đi kèm với mức lương thưởng và đãi ngộ xứng đáng:

  • Mức lương hấp dẫn $800 – $1,500;
  • Review lương hàng năm, nâng cao chất lượng sống;
  • Được đảm bảo mọi quyền lợi các chế độ (ngày phép năm, gói bảo hiểm) đầy đủ theo luật Việt Nam;
  • Cơ hội công tác tại Singapore tích lũy kinh nghiệm từ bạn bè quốc tế, nâng trình giao tiếp tiếng Anh;
  • Được thử sức mình với các dự án đầy tính thử thách, cải thiện và trau dồi kỹ năng làm việc theo nhóm;
  • Cơ hội phát triển mạnh mẽ với sự hướng dẫn tận tình, giúp đỡ trong suốt quá trình làm việc.

Nắm tay nhau cùng tiến – Nâng khả năng tác chiến

Tham khảo tuyển dụng ruby on rails lương cao trên TopDev

Mô tả công việc:

– Phát triển trang CMS website, e-commerce và ứng dụng mobile;
– Phân tích các yêu cầu của khách hàng để phát triển các yêu cầu phần mềm kỹ thuật và tính năng (outsourcing);
– Phối hợp chặt chẽ với Project Manager để đưa ra ý tưởng và giải pháp phát triển các tính năng mới;
– Đảm bảo tiến độ công việc được giao;
– Tham gia vào các dự án sản phẩm của ADVN.

Yêu cầu:

– Bằng cấp / Văn bằng Khoa học Máy tính, Công nghệ thông tin hoặc các ngành liên quan;
– Có ít nhất 2 năm kinh nghiệm vị trí Ruby on Rails Developer;
– Có kiến thức về web Front-end như HTML, CSS, JavaScript & jQuery, API RESTful;
– Có kiến thức về Angular JS, React JS, máy chủ Linux / CentOS là một điểm cộng;
– Kinh nghiệm với hệ thống cơ sở dữ liệu MySQL;
– Khả năng giám sát và cố vấn cho các junior engineers;
– Khả năng đọc và nói tiếng Anh;
– Khả năng tư duy logic;
– Tinh thần làm việc nhóm tốt.

Nhiều tin tuyển dụng IT lương cao trên TopDev, đăng ký ngay!

5 công nghệ huyền thoại sẽ không bao giờ lỗi thời!

5 công nghệ huyền thoại sẽ không bao giờ lỗi thời

Công nghệ đang thay đổi với mức độ chóng mặt mỗi ngày. Những ngôn ngữ mới liên tục được ra đời như Ruby, Hadoop hay những công nghệ mới nhất cloud đang ngày càng phổ biến hơn. Tuy nhiên, những ngôn ngữ và kỹ năng cơ bản vẫn đóng vai trò như những bộ khung sườn vững chắc giúp mọi thứ vận hành suôn sẻ. Sau đây là 5 loại công nghệ vẫn đóng vai trò lớn cho đến tận thời điểm này.

COBOL

123

“Rất nhiều người dùng cuối hiện vẫn đang tương tác với các hệ thống được xây dựng bằng COBOL.” – Ed Airey, Product Marketing Director cho COBOL solution tại MicroFocus cho biết.

Các dịch vụ như Ngân hàng, bảo hiểm, tàu lửa hay hàng không là những dịch vụ mà khách hàng tương tác với COBOL nhiều nhất, vì ngôn ngữ này vượt trội ở khả năng tính toán và quản lý lưu lượng thông tin dữ liệu lớn.

“COBOL vượt trội hơn các ngôn ngữ khác ở khoảng xử lý các khối lượng dữ liệu rất lớn, tính năng này được gọi là batch processing,” Airey cho biết. Các hệ thống ngân hàng, công ty tín dụng, và các công ty IRS đều sử dụng hệ thống được lập trình bởi COBOL để xử lý một lượng lớn các giao dịch trong cùng một thời điểm. COBOL còn được sử dụng ở các hệ thống kiểm tra lý lịch di trú và nhập cảnh. Quá trình này còn giúp khoanh vùng các đối tượng cần được theo dõi.

TOP các vị trí tuyển dụng lập trình Cobol

Mainframes

mainframe

“Hầu hết các hệ thống máy tính quy mô lớn đã được phát triển trong những năm 1960. Với kết cấu đồ sộ, chúng vẫn được phát triển tiếp tục đến tận bây giờ. Sự ổn định của nó cho phép mainframes (hay big iron)  có thể chạy ổn định mà không bị gián đoạn trong suốt nhiều thập kỷ. Những ngành như Ngân Hàng, bán lẻ, dịch vụ tài chính, logistics, và sản xuất phụ thuộc khá nhiều vào công nghệ mainframe.” – Craig O’Malley, CEO của mainframe solutions Compuware cho biết.

“Công nghệ Mainframe chắc chắn vẫn sẽ đóng vai trò chủ chốt cho rất nhiều hệ thống back-end. Đây là giải pháp công nghệ tốt nhất, nhanh nhất và kinh tế nhất so với những gì mà nó làm được. Nó không chỉ được dùng cho batch processing, hay tăng tốc độ xử lý dữ liệu, mà nó chính là một giải pháp tối ưu để xử lý lưu lượng data cực lớn.”

Ngôn ngữ C

124

C được phát triển bởi Dennis Ritchie ở Bell Labs vào khoảng những năm 1969 và 1973. C được ví như một trong những ngôn ngữ lập trình được sử dụng nhiều nhất. Trên thực tế, rất nhiều ngôn ngữ “hậu bối” như C++, Python, Perl, Java và PHP đã mượn rất nhiều tính năng cơ bản từ C.

Ngôn ngữ này được dùng rất rộng rãi ở các hệ thống lập trình kể cả hệ điều hành hoặc các hệ thống nhúng, chưa kể đến các hệ thông siêu máy tính lớn cũng đang dựa vào ngôn ngữ này. Và đương nhiên C còn là nền tảng của khá nhiều hệ điều hành trong đó bao gồm cả Unix.

Video IoT and AI Thinking Linking Things Age of VUI

Fortran

125

Là ngôn ngữ được biết đến với tên gọi Formula Translation, là một ngôn ngữ được dùng cho các hệ thống máy tính lớn (mainframe) của IBM từ những năm 1950s. Nó được ví như “tiếng mẹ đẻ của khoa học máy tính”. FORTRAN được phát triển bởi Big Blue để đẩy nhanh tốc độ xử lý thông tin khoa học kỹ thuật trên các siêu máy tính.

Hiện nay, nó được dùng nhiều ở những lĩnh vực như dự báo thời tiết, động lực học, vật lý máy tính và những lĩnh vực đòi hỏi tốc độ xử lý cao.

Java

126

Về mặt kỹ thuật mà nói, Java không phải là một công nghệ siêu việt, nhưng nó sẽ chính thức ăn mừng sinh nhật thứ 20 của mình vào năm nay. Java được phát triển bởi James Gosling tại Sun Microsystem vào năm 1995. Nó được thiết kế với một mục đính giúp cho các nhà phát triển có thể “viết code ở một nơi, và chạy được ở nhiều nơi” (write once, run anywhere), mà không phải dịch lại thông qua một nền tảng nào khác.

Dù là một ngôn ngữ “trẻ tuổi” nhưng Java vẫn hiện đang nằm thuộc top những ngôn ngữ được cộng đồng sử dụng nhiều nhất, được đánh giá bởi cộng đồng Tiobe Software’s Programming Community Index. Với khoảng 9 triệu nhà phát triển, Java nằm vào top những ngôn ngữ được nhiều người dùng nhất, đa phần được dùng để xây dựng ứng dụng client-server Web.

TOp các việc làm cho lập trình Java

TopDev

Tôi không phải là lập trình viên thực sự?

Tôi không phải là lập trình viên thực sự

Hiện tại mình là một system engineer, nhưng mà ban đầu mình không apply vào vị trí này: Bốn năm trước mình bắt đầu bước vào công ty với vị trí là lập trình viên support chính thức đầu tiên.

Dù đã làm ở vị trí khác nhưng mình vẫn thích gần gũi với team support. Có cậu em làm support engineer trong team hiện tại thường thích gửi cho mình những code snippet mà cậu ấy viết để trao đổi về nó hoặc khoe về mấy điều hay ho cậu ấy học được. Và một ngày nọ cậu ấy gửi cho mình cái này:

“Một lập trình viên thực sự là [….]?, bữa giờ làm việc em thấy mình không phải là lập trình viên đúng nghĩa cho lắm”

Image result for exhausted meme gif

 

Công việc của mình thật ra khá bận rộn và mình cũng không phải là người trả lời tin nhắn ngay lập tức. Thế nên mình đã quay lại sau bữa trưa và trả lời như sau:

“Đừng bao giờ nói rằng mình không phải là lập trình viên

vì mày là lập trình viên mà”

cậu ấy đáp lại rằng “anh biết ý em là gì mà. em chỉ toàn “ráp” mọi thứ lại với nhau”

Đương nhiên là mình biết ý cậu ấy là gì. Mình luôn muốn trở thành một lập trình viên – Ngay từ khi còn nhỏ mình đã thích vọc mấy cái máy tính cũ của ông già, script trên những máy tính vẽ đồ thị trên trường, đòi cuốn dạy code C++ mua ở nhà sách cũ. Mình cũng khá thân với các giáo viên dạy trên trường, thậm chí tôi còn xin một một job code web dạo bán thời gian. Sau khi tốt nghiệp, mình tiếp tục học tiếp lên đại học. Nghe có vẻ tương lai rộng mở đúng không?

Có thể bạn muốn xem:

  Tự học một cách chủ động từ dự án và đồng nghiệp
  6 điều tôi vỡ lẻ khi tự học code (P1)

Tuy nhiên, mình cũng gãy gánh bỏ học đại học giữa chừng và mất hơn 10 năm liên tục cố gắng rồi thất bại rồi lại tiếp tục cố gắng để trở thành một lập trình viên / developer chuyên nghiệp. Khi cơ hội việc làm ở công ty A tới (Giấu tên để sếp khỏi biết), mình đã chuyển từ support sang software QA, và nghĩ rằng mình đang ngày càng tới gần “công việc mơ ước” của mình. Khi làm việc tại A (sau đó là Risk I/O) – một startup với những con người thú vị, thông minh và tuyệt vời, mình thật sự quá ngán và không muốn quay lại vị trí support nữa. Mình vẫn muốn trở thành một lập trình viên thật sự, và mình đã dành nhiều năm làm việc bên cạnh các lập trình viên thực sự mà không thể làm chính xác như những gì họ làm.

Công ty A là một công ty rất khác biệt. Mình được truy cập vào GitHub. Mình có cả dev instance của riêng mình. Mình được dạy cách create và merge các PR và xem code của mình được triển khai để sản xuất. Đúng là Mình đang ở vị trí support, và mình vẫn phải thực hiện các cuộc gọi để hỗ trợ kỹ thuật, nhưng cảm ơn trời, cuối cùng mình cũng được học và viết Ruby. Thậm chí sau này có một engineer mới vô nói với mình rằng “A nh không biết chú là support đó, Anh nghĩ chú cũng rất có khiếu code giống mấy anh em ở đây đó nha”.

Sau đó mình có ít thời gian để vọc code hơn và ngập đầu trong công việc support bởi vì client của chúng mình phát triển quy mô và độ phức tạp. Rồi thì công ty cũng bắt đầu phát triển đội ngũ support và thuê thêm một số support engineer, những người sẽ thực hiện công việc đó tốt hơn mình. Đây cũng là một cơ hội để mình chuyển sang những platform/system/operation side của công ty.

Rồi mình đổi sang công ty B (lại giấu tên), mình được làm công việc backend, infrastructure. Mình làm việc khá hợp với Red Hat, Ubuntu và những thứ khác trong nhiều năm, nhưng mình vẫn chưa làm tốt trong việc quản trị hệ thống Linux. Sếp của mình cũng khá nice VÀ đã cho mình thêm cơ hội, và hy vọng Mình sẽ phát triển đến trình độ system engineer mà họ cần.

Đó là một vài năm trước, còn bây giờ mình cảm thấy mình đã làm tốt công việc của một system engineer – nhưng mình có phải là một lập trình viên thực sự không?

Khi cậu em support engineer kia nói: “Em không phải là một lập trình viên thực sự,  em chỉ gắn mọi thứ lại với nhau”. Mình đã trả lời lại rằng:

“Đó chính xác là việc của anh em mình”

“Chú quá biết rồi còn gì”

Đó không phải chính xác những gì một lập trình viên làm ư? Năm ngoái có một bài viết tuyệt vời nói rằng “Phần lớn Software Engineering trong năm 2018 là như một hệ thống cấp nước” và nó đúng ở quy mô lớn như khi đơn giản là lấy các string từ các log file.

Mình biết rất nhiều người trong ngành công nghệ bị Hội chứng tạm gọi là Kẻ mạo danh (Imposter Syndrome), và thật sẽ rất khó cho những support engineer – những người không có chữ “developer” hay “programmer” trong tên nghề nghiệp. Mình dành hầu như cả sự nghiệp của mình với những con chip, nhưng nhờ những con người tuyệt vời xung quanh mà mình đã may mắn rũ bỏ được tâm lý đó.

Các bạn nếu có cảm thấy giống mình, thì hãy tự tin lên nha, vì lập trình viên cũng có nhiều hình thái. Mình tin tất cả chúng ta đều là lập trình viên thực thụ.

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev ngay!

Thuật toán là gì? 11 thuật toán hàng đầu dành cho lập trình viên

10-thuat-toan-hang-dau-danh-cho-lap-trinh-vien

Xã hội hiện tại đang chứng kiến một cuộc cách mạng to lớn trong lĩnh vực công nghệ. Những phát minh mới liên tục được cập nhật. Thường thì nguồn gốc của những phát minh này là từ những chương trình gạo cội có khả năng chi phối và thao túng các xu hướng công nghệ đang diễn ra. Trong số đó không thể không nói đến mã hóa và thuật toán, được sử dụng để phát triển các chương trình cạnh tranh như vậy.

Vì thế, đối với một chương trình thành công và có tầm ảnh hưởng, việc khai thác một thuật toán tốt nhất đúng và chính xác là điều tất yếu. Sau đây cùng tìm hiểu thuật toán là gì và 11 thuật toán hàng đầu được sử dụng rộng rãi trong lập trình và phát triển web.

Thuật toán là gì?

Thuật toán là gì? Thuật toán (Algorithm) hay còn được gọi là giải thuật là một tập hợp các bước được xác định rõ ràng, có thể thực hiện được bằng máy tính để giải quyết một vấn đề hoặc thực hiện một phép tính.

thuật toán luôn tường minh và thực hiện các hành động cụ thể từng bước một để mang lại kết quả tối ưu nhất.

Dễ hiểu hơn, thuật toán là cách giải một bài toán bằng chương trình máy tính.

Thuật toán được sử dụng rộng rãi trong nhiều lĩnh vực của công nghệ thông tin (IT). Trong toán học, lập trình máy tính và khoa học máy tính, thuật toán thường đề cập đến một quy trình nhỏ giải quyết một vấn đề lặp đi lặp lại. Thuật toán cũng được sử dụng như các đặc tả kỹ thuật để thực hiện xử lý dữ liệu và đóng vai trò quan trọng trong các hệ thống tự động.

Ví dụ, khi muốn sắp xếp một tập hợp các số nguyên theo thứ tự tăng dần. Có rất nhiều cách để giải bài toán này, nhưng nếu số lượng phần tử quá lớn thì sẽ mất nhiều thời gian để thực hiện và có thể xảy ra sai sót. Lúc này thuật toán chính là chìa khóa “giải thuật” tối ưu nhất, giúp trả về kết quả chính xác mà không tốn nhiều công sức. Muốn biết thuật toán để giải bài toán sắp xếp trên là gì, cùng theo dõi tiếp trong những phần tiếp theo của bài viết bạn nhé!

Sau đây là các thuật toán cơ bản lập trình viên cần biết làm nền tảng cho các giải thuật phức tạp hơn. Cùng TopDev tìm hiểu ngay dưới đây!

Thuật toán Hashing

Hashing algorithms

Hashing là thuật toán được sử dụng để tham gia vào việc phát hiện và xác định dữ liệu thích hợp bằng key và ID. Với vai trò mở rộng việc phát hiện lỗi, quản lý bộ nhớ cache, mật mã và tra cứu, hàm Hashing tích hợp các khóa phù hợp và cho các giá trị chính xác. Hàm này cũng có thể được sử dụng như một định danh duy nhất cho các tập dữ liệu nhất định và các phép tính toán cho phép người dùng tạo ra các giá trị dữ liệu không trùng lắp. Thông thường nó được áp dụng trong các bộ định tuyến để lưu trữ địa chỉ IP.

Search Algorithms

Search Algorithms

Thuật toán tìm kiếm thường được áp dụng cho dãy cấu trúc dữ liệu tuyến tính hoặc cấu trúc dữ liệu đồ họa. Thuật toán tìm kiếm tuyến tính còn được gọi là tìm kiếm nhị phân, giúp nhà phát triển tiến hành tìm kiếm hiệu quả trên các tập dữ liệu được sắp xếp với hàm phức tạp thời gian của O (log N). Cơ chế của tìm kiếm nhị phân là chia danh sách thành hai nửa cho đến khi nó tìm thấy mục được yêu cầu và thường được sử dụng để gỡ những lỗi liên quan đến git bisection.

Các thuật toán này còn được biết đến với chức năng là Chiều sâu/Chiều rộng Tìm kiếm Đầu tiên, nó cho ta cấu trúc dữ liệu là một biểu đồ tròn hoặc hình cây đã bật chức năng tìm kiếm, xác định các tập dữ liệu cần thiết trong mô hình cây ngang. BFS rất phổ biến trong các công cụ tìm kiếm, cũng được sử dụng để xây dựng các bot trong AI hay định vị các con đường ngắn nhất giữa hai thành phố.

>> Đọc thêm: Thuật toán tìm kiếm trong C++

Thuật toán sắp xếp (Sort Algorithms)

Thuật toán sắp xếp (Sort Algorithms)

Các thuật toán sắp xếp thường được các nhà phát triển dùng để đặt dữ liệu theo cách có tổ chức. Trong thuật toán QuickSort, các thành phần dữ liệu được so sánh với nhau để xác định thứ tự tương ứng của chúng. Nó có độ phức tạp thời gian của O(nLogn) để thực hiện so sánh. Tuy nhiên, Radix Sort là một kỹ thuật nhanh hơn QuickSort vì nó sắp xếp các phần tử trong một mô hình tuyến tính với độ phức tạp thời gian O(n). Tính đơn giản của thuật toán này làm cho nó được ưa chuộng. Các thuật toán sắp xếp khác bao gồm Sắp xếp hợp nhất, Sắp xếp nhóm và Sắp xếp đếm.

Thuật toán lập trình động (Dynamic Programming Algorithms)

Thuật toán lập trình động

Lập trình động thường là một hàm giải quyết vấn đề phức tạp liên quan đến trí tuệ bằng cách tách các vấn đề thành các bài toán con nhỏ hơn, giải quyết chúng sau đó xây dựng trở lại thành vấn đề phức tạp với bộ nhớ của các kết quả nhỏ hơn để đưa ra câu trả lời cho vấn đề phức tạp ban đầu. Lập trình động có khả năng tích hợp để ghi nhớ, cho phép lưu trữ các ký ức về các vấn đề đã giải quyết trước đó. Nếu lần tiếp theo vấn đề ấy lại xuất hiện thì nó sẽ được giải quyết nhanh hơn nhiều.

Phân tích liên kết (Link Analysis)

Thường được sử dụng trong lĩnh vực mạng, phân tích liên kết cung cấp khả năng tương quan giữa các thực thể khác nhau trong một miền quan trọng đối với các công cụ tìm kiếm. Thuật toán sử dụng một biểu diễn đồ họa và ma trận phức tạp, liên kết các căn cứ tương tự trong các miền hiện tại. Phân tích liên kết phổ biến trong các công cụ tìm kiếm như Google, trong các trang truyền thông xã hội như Facebook, Twitter, nơi việc tìm kiếm mở rộng được chú trọng.

Phép toán Mô-đun (Modulo Arithmetic Algorithms)

Nhiều thuật toán mã hóa phức tạp nhưng nếu được phân tích trên nền số học mô-đun thì trở nên đơn giản vô cùng. Trong số học mô-đun, các số chúng ta đang xử lý chỉ là các số nguyên và các phép toán được sử dụng là cộng, trừ, nhân và chia. Sự khác biệt duy nhất giữa số học mô-đun và số học trên sách vở là trong số học mô-đun, tất cả các hoạt động được thực hiện liên quan đến số nguyên dương, tức là mô đun.

Ví dụ:

  1. Thuật toán Euclide cơ bản và mở rộng
  2. Phương trình hoàn hảo của Euler
  3. Lũy thừa mô đun
  4. Tính nghịch đảo theo mô đun
  5. Định lý số dư của Trung Quốc
  6. Định lý số dư của Trung Quốc và thực thi tính nghịch đảo của mô đun

Thuật toán xâu ký tự và phân tích cú pháp (String Matching and Parsing Algorithms)

Quy trình tạo xâu tương ứng luôn quan trọng đặc biệt đối với miền và phần tử mạng. Thuật toán xâu ký tự này sẽ phát huy khả năng tối đa trong các tình huống mà các xâu phải khớp trong một chuỗi dài hoặc khi xác nhận chuỗi bằng cách phân tích cú pháp qua giới hạn được xác định trước. Các thuật toán này thường được sử dụng trong phát triển web cho URL.

Thuật toán biến đổi Fourier (Fourier Transform Algorithms)

Biến đổi Fourier hay Biến đổi Fourire nhanh là những thuật toán đơn giản nhưng rất mạnh. Chúng được sử dụng để chuyển đổi tín hiệu từ miền thời gian sang miền tần số và ngược lại. Toàn bộ các mạng kỹ thuật số như Internet, WiFi, điện thoại, máy tính, bộ định tuyến, vệ tinh, sử dụng thuật toán này theo để vận hành. Đây là những thuật toán bắt buộc phải biết nếu bạn chuyên sâu về mảng điện tử, điện toán hoặc viễn thông.

Thuật toán các tập không giao nhau (Disjoint Sets)

Thuật toán các tập không giao nhau là cấu trúc dữ liệu đóng vai trò như các cấu trúc trợ giúp trong một thuật toán để biểu diễn nhiều tập hợp trong mảng riêng lẻ, với mỗi mục là một phần tử của một trong nhiều tập hợp. Do đó, các bộ tách rời đại diện cho các phần tử được kết nối trong các thuật toán đồ thị hay phân đoạn một hình ảnh.

Hệ số tích phân (Integer Factorization)

Thuật toán lũy thừa số nguyên là một thuật toán toán cung cấp hướng dẫn từng bước về cách lấy các thừa số nguyên tố của một số tổng hợp. Thuật toán này giải quyết các vấn đề phức tạp trong các nền tảng mã hóa yêu cầu bạn phải giải quyết các số nguyên phức hợp lớn.

Thuật toán Dijkstra

Thuật toán Dijkstra là một thuật toán được sử dụng để tìm đường đi ngắn nhất từ một điểm (được gọi là nguồn) đến tất cả các điểm khác trong một đồ thị có trọng số, nghĩa là đồ thị mà mỗi cạnh của nó có một giá trị nhất định (trọng số). Thuật toán này được nhà khoa học máy tính người Hà Lan Edsger Dijkstra phát minh vào năm 1956 và được sử dụng rộng rãi trong nhiều ứng dụng, từ tìm đường trên bản đồ đến tối ưu hóa mạng lưới.

Thuật toán Dijkstra hoạt động dựa trên nguyên tắc tham lam (greedy), nghĩa là nó luôn chọn đường đi tốt nhất ở mỗi bước dựa trên thông tin hiện có mà không cần quan tâm đến các bước tiếp theo.

Trên đây là bài viết chia sẻ về thuật toán và 11 thuật toán cơ bản quan trọng nhất mà lập trình viên nào cũng nên biết. Việc nắm khái niệm và cách sử dụng thuật toán sẽ giúp bạn dễ dàng hơn trong việc lập trình của mình.

Theo dõi TopDev để cập nhật các vị trí tuyển dụng việc làm ngành IT mới nhất!

Nguồn tại Technotification

9 hiểu lầm “ngớ ngẩn” về machine learning

Những hiểu lầm và quan niệm lệch lạc về machine learning xuất hiện ngày càng nhiều do nó ngày càng bị cường điệu hoá. Bài viết này sẽ cho bạn một cái nhìn tổng quát về những gì machine learning có thể và không thể làm.

Machine learning được tin rằng hữu ích đến nỗi nó có thể giải quyết mọi vấn đề và áp dụng trong mọi tình huống. Giống như các công cụ khác, machine learning rất hữu ích trong một số lĩnh vực cụ thể, đặc biệt đối với các vấn đề mà bạn thường xuyên gặp phải nhưng bạn biết rõ rằng bạn sẽ không bao giờ có thể thuê đủ người để giải quyết, hoặc đối với các vấn đề có mục tiêu nhưng không có phương pháp rõ ràng để đạt được nó.

Tuy nhiên, mỗi tổ chức thường áp dụng machine learning theo những cách khác nhau, như 42% những nhà điều hành cấp cao gần đây nói với Accenture rằng họ mong đợi AI sẽ đứng sau tất cả những đổi mới vào năm 2021. Nhưng bạn sẽ khai thác nó tốt hơn nếu bạn không bị ảnh hưởng bởi những luồng ý kiến cường điệu hoá và không quá tin vào những định kiến bằng cách hiểu những gì machine learning có thể và không thể thực hiện.

Tuyển dụng Machine Learning lương cao hấp dẫn cho bạn

1. Machine learning cơ bản là AI

Machine learning và AI thường được cho là hai từ đồng nghĩa, nhưng trong khi machine learning là kỹ thuật được sử dụng rất nhiều trong các phòng thí nghiệm, AI là một mảng lớn bao gồm các lĩnh vực như tầm nhìn máy tính, robot và xử lý ngôn ngữ tự nhiên, cũng như những cách tiếp cận khác như giảm sự hài lòng mà không bao gồm machine learning. Hãy suy nghĩ nó như những thứ làm cho máy móc trở nên thông minh hơn. Không phải lúc nào máy móc cũng sử dụng trí tuệ nhân tạo, thứ mà mọi người nghĩ có thể sẽ chiến đấu hoặc thậm chí tấn công loài người.

Hãy chú ý đến các thuật ngữ và sử dụng chúng thật chính xác. Machine learning là về học các mô hình và dự đoán các kết quả từ các tập dữ liệu lớn; các kết quả trông có vẻ ” thông minh” nhưng thật sự nó đang sử dụng các số liệu thống kê với tốc độ và quy mô chưa từng có.

2. Tất cả các dữ liệu đều hữu ích

Bạn cần data cho machine learning, nhưng không phải tất cả dữ liệu đều hữu ích cho machine learning. Để đào tạo hệ thống của bạn, bạn cần những dữ liệu đại diện bao gồm các patterns và kết quả mà hệ thống machine learning của bạn cần phải xử lý. Bạn cần dữ liệu không có các patterns liên quan (chẳng hạn như các ảnh cho thấy tất cả những người đàn ông đứng lên và tất cả phụ nữ ngồi xuống, hoặc tất cả những chiếc xe đang ở trong ga-ra và tất cả những chiếc xe đạp đang ở trong một bãi lầy) bởi vì mô hình machine learning sẽ phản ánh những patterns cụ thể và tìm chúng trong dữ liệu bạn có. Tất cả những dữ liệu bạn sử dụng cho việc đào tạo nó cần phải được phân loại tốt, và dán nhãn các tính năng bạn hỏi machine learning, điều đó tốn rất nhiều công sức.

Đừng nghĩ rằng dữ liệu bạn có luôn tốt, có thể đại diện cho phần đông hoặc có thể dễ dàng gắn nhãn.

3. Bạn luôn cần nhiều data

Những cải tiến lớn đã được thực hiện gần đây về khả năng nhận diện hình ảnh, đọc hiểu của máy, dịch thuật và các lĩnh vực khác đã ra mắt nhờ có sự xuất hiện của các công cụ tốt hơn, computing hardware như GPUs có thể xử lý một số lượng lớn dữ liệu và những tập dữ liệu lớn đã được gắn nhãn, bao gồm ImageNet và tập dữ liệu Stanford Question Answering. Nhưng nhờ vào một mẹo gọi là transfer learning, bạn không phải lúc nào cũng cần một tập dữ liệu lớn để đạt được kết quả tốt trong một lĩnh vực cụ thể; thay vào đó, bạn có thể dạy hệ thống machine learning học cách sử dụng tập dữ liệu để nó dần có thể tự học với những tập dữ liệu nhỏ hơn. Đó là cách custom vision APIs từ Salesforce và Microsoft Azure hoạt động: Bạn chỉ cần 30-50 hình ảnh để chứng minh rằng bạn có thể phân loại nhằm có kết quả tốt hơn.

Transfer learning cho phép bạn tùy chỉnh một hệ thống đã được đào tạo từ trước để giải quyết các vấn đề với lượng dữ liệu tương đối nhỏ.

4. Bất kì ai cũng có thể xây dựng một hệ thống machine learning

Có rất nhiều công cụ mã nguồn mở và framework dành riêng cho machine learning và có vô số các khóa học chỉ bạn cách sử dụng nó. Nhưng machine learning vẫn là một kĩ thuật chuyên ngành; bạn cần biết cách chuẩn bị dữ liệu và phân vùng cho việc đào tạo và testing, bạn cần biết cách chọn thuật toán tốt nhất và biết heuristics để sử dụng với nó, cách biến nó thành một hệ thống đáng tin cậy để sản xuất. Bạn cũng cần phải theo dõi hệ thống để đảm bảo rằng các kết quả được đồng bộ theo thời gian; cho dù thị trường có thay đổi hay hệ thống machine learning của bạn đủ tốt để phân loại các nhóm khách hàng khác nhau hay không, bạn cần tiếp tục kiểm tra để xem mô hình ấy vẫn còn phù hợp với vấn đề của bạn hay không.

Việc tìm hiểu machine learning tốn rất nhiều thời gian; nếu bạn mới bắt đầu, hãy nghĩ đến APIs và các mô hình đã được đào tạo từ trước mà code của bạn có thể có trong khi bạn có hoặc thuê data science và chuyên gia machine learning để xây dựng các hệ thống tùy chỉnh.

5. Tất cả các patterns trong data đều hữu ích

Người mắc bệnh suyễn, người bị đau ngực hoặc bệnh tim và bất kỳ ai trên 100 tuổi đều có tỉ lệ sống sót cao hơn những người bệnh bị viêm phổi. Trên thực tế, một hệ thống machine learning đơn giản được thiết kế để tự động nhập hồ sơ bệnh án có thể gửi chúng về tận nhà của bạn ( một hệ thống được huấn luyện trên cùng một dữ liệu với mạng lưới nơ-ron sẽ thực hiện những việc y chang nhau ). Lí do họ có tỉ lệ sống sót cao như thế là do họ luôn được ưu tiên nhập viện vì bệnh viêm phổi rất nguy hiểm.

Hệ thống đang tìm kiếm một pattern hợp lý trong dữ liệu; nó không phải là một pattern hữu ích để lựa chọn bệnh nhân vào viện  ( mặc dù nó giúp công ty bảo hiểm dự đoán chi phí điều trị khá hiệu quả ). Thậm chí nguy hiểm hơn, bạn sẽ không biết rằng những patterns không hiệu quả ấy có trong tập dữ liệu của bạn trừ khi bạn đã biết về chúng.

Trong các trường hợp khác, một hệ thống có thể học một pattern hợp lý ( như hệ thống nhận dạng khuôn mặt đang gây tranh cãi vì dự đoán chính xác xu hướng tình dục từ selfies) , nhưng nó không thực sự hiệu quả vì không có lời giải thích rõ ràng ( trong trường hợp các bức ảnh hiển thị các tín hiệu xã hội như pose chứ không phải hình tự nhiên).

Các mô hình ” Black box ” rất hiệu quả nhưng chúng không làm rõ được chúng đã học được pattern nào. Các thuật toán thông minh như Generalized Additive Models có thể làm rõ được model đã học đươc gì để bạn quyết định xem nó có hữu ích để triển khai hay không.

6. Reinforcement learning luôn sẵn sàng để sử dụng

Hầu như tất cả các hệ thống machine learning đang được sử dụng ngày nay đều sử dụng supervised learning; Trong nhiều trường hợp, chúng được đào tạo dựa trên các tập dữ liệu được gắn nhãn rõ ràng mà nhiều người đã cùng chuẩn bị. Quản lí các tập dữ liệu ấy mất rất nhiều thời gian và công sức, vì vậy các loại unsupervised learning được yêu thích hơn, đặc biệt là reinforcement learning (RL) – cách một agent học thông qua việc thử và sai, bằng cách tương tác với môi trường xung quanh và nhận thưởng khi có hành vi đúng. Hệ thống AlphaGo của DeepMind đã sử dụng RL bên cạnh supervised learning để đánh bại những người chơi Go hàng đầu, và Libratus, một hệ thống được xây dựng dựa trên một team ở Carnegie Mellon, đã sử dụng RL cùng hai kĩ thuật AI khác để đánh bại những người chơi poker hàng đầu trên thế giới tại Texas Hold’Em ( với chiến lược cá cược dài và phức tạp ). Các nhà nghiên cứu đang thử nghiệm RL với mọi thứ từ robot đến testing security software.

Tuy nhiên, RL chỉ phổ biến trong các trường hợp nghiên cứu. Google sử dụng DeepMind để tiết kiệm năng lượng trong các trung tâm dữ liệu của họ bằng việc làm mát chúng hiệu quả hơn; Microsoft sử dụng một phiên bản hạn chế của RL gọi là “ contextual bandits “ để cá nhân hoá các tiêu đề đối với các người dùng mới truy cập vào MSN.com. Vấn đề là chỉ có ít môi trường thực tế có phần thưởng và phản hồi tức thì, và đặc biệt là lừa gạt phần thưởng khi agent thực hiện nhiều hành động trước khi xảy ra bất cứ điều gì.

7. Machine learning không thiên vị

Vì machine learning học từ dữ liệu, nó sẽ sao chép bất kỳ sai lệch ​​nào trong tập dữ liệu. Tìm kiếm hình ảnh của CEO thường sẽ ra hình ảnh của nam CEO da trắng vì có nhiều CEO là người da trắng và là nam hơn những người còn lại. Nhưng machine learning làm các thiên hướng đã sai trở nên … càng sai hơn.

Tập dữ liệu COCO thường được sử dụng để huấn luyện hệ thống nhận dạng hình ảnh của cả nam và nữ; nhưng nhiều hình ảnh của phụ nữ sẽ được hiển thị bên cạnh thiết bị nhà bếp hơn và nhiều hình ảnh của đàn ông sẽ được hiển thị bên cạnh bàn phím máy tính và chuột hoặc vợt tennis và ván trượt tuyết. Đào tạo hệ thống trên COCO và gán đàn ông với phần cứng máy tính mạnh hơn các số liệu thống kê trong bức ảnh gốc.

Một hệ thống machine learning cũng có thể tạo thêm thiên hướng sai lệch cho thông tin. Đào tạo một hệ thống machine learning với các frameworks phổ biến để làm đại diện cho các từ như vectơ thể hiện mối quan hệ giữa frameworks và hệ thống sẽ học hỏi những định kiến như ” đàn ông gắn với lập trình máy tính, phụ nữ gắn với nội trợ”, bác sĩ và y tá hoặc ông chủ để tiếp tân. Nếu bạn sử dụng hệ thống đó với một hệ thống dịch giữa các ngôn ngữ có các đại từ như “ he, she “, như trong tiếng Anh, với những đại từ chỉ giới tính trung lập, như trong tiếng Phần Lan hoặc tiếng Thổ Nhĩ Kỳ, ” Họ là bác sĩ ” trở thành ” Anh ấy là bác sĩ ” và ” Họ là y tá ” trở thành ” Cô ấy là y tá “.

Machine learning có thể đưa ra những gợi ý tương tự trên các trang mua sắm khá tốt, nhưng một số vấn đề về thông tin nhạy cảm và feeback liên hồi có thể xảy ra; nếu bạn tham gia vào một nhóm Facebook không tán thành với việc tiêm ngừa, công cụ gợi ý của Facebook sẽ đưa ra gợi ý những nhóm khác liên quan đến lý thuyết conspiracy hoặc những nhóm tin rằng hình dạng của Trái đất là một mặt phẳng.

Bạn cần hiểu rõ những sai sót của machine learning. Nếu bạn không thể loại bỏ được chúng trong tập dữ liệu, hãy sử dụng các kĩ thuật như bình thường hoá các liên kết giới tính với các cặp từ để giảm sai sót hoặc bổ sung các mục không liên quan đến gợi ý để tránh “ filter bubble “.

8. Machine learning chỉ sử dụng cho những mục đích tốt

Machine learning cũng được dùng trong các tools chống virus, theo dõi nhất cử nhất động của những vụ tấn công mới để có thể phát hiện ra chúng nhanh nhất có thể khi vừa bùng phát. Tuy nhiên, các hacker đang sử dụng machine learning để nghiên cứu các công cụ phòng chống virus và phòng chống các cuộc tấn công lừa đảo với quy mô lớn bằng cách phân tích một lượng lớn public data hoặc phân tích các vụ lừa đảo thành công trước đó.

Tham khảo Tuyển dụng Machine Learning lương cao hấp dẫn cho bạn

9. Machine learning sẽ dần thay thế con người

Khá nhiều người lo sợ rằng AI sẽ chiếm dần nhiều công việc và chắc chắn nó sẽ thay thế dẫn những công việc do con người làm và cả cách thực hiện; hệ thống machine learning giúp cải thiện hiệu quả, quá trình diễn ra mượt mà và giảm chi phí. Về lâu về dài, nó sẽ tạo ra những ra những công việc mới cũng như làm một số công việc hiện tại trở nên lỗi thời.

Tuy nhiên, không phải công việc nào machine learning cũng có thể thực hiện được, vì độ phức tạp hoặc quy mô của công việc; Ví dụ, bạn không thể thuê đủ người để kiểm tra mọi bức hình được đăng trên social media để xem chúng có liên quan đến thương hiệu của bạn hay không.

Việc machine learning đã bắt đầu tham gia vào là tạo ra những cơ hội kinh doanh mới, chẳng hạn như cải thiện trải nghiệm của khách hàng bằng predictive maintenance, và đưa ra những đề xuất và hỗ trợ cho các nhà lãnh đạo của doanh nghiệp. Giống như các thế hệ tự động hóa trước đó, machine learning có thể giúp nhân viên phát huy tối đa chuyên môn và sự sáng tạo của họ.

TopDev Via CIO

Có thể bạn muốn xem:

  Top những thuật toán machine learning mà bất cứ Data Scientist nào cũng cần phải biết (Phần 1)
  Top 10 thuật toán machine learning dành cho newbie

Top những thuật toán machine learning mà bất cứ Data Scientist nào cũng cần phải biết (Phần 2)

Top những thuật toán machine learning

Có nhiều cách khác nhau mà thuật toán có thể mô hình hóa một vấn đề vì nó liên quan đến sự tương tác với trải nghiệm. Nói cách khác, bạn sẽ cần phải xác định được phong cách học tập của một thuật toán. Thật may là chỉ có một vài kiểu học tập chính mà thuật toán Machine Learning có thể có. Do đó mà bạn phải suy nghĩ kĩ về vai trò của dữ liệu input và quá trình chuẩn bị môi trường cho thuật toán học tập để có được kết quả tốt nhất.

Thuật toán ML thường được chia nhóm tùy theo sự giống nhau về chức năng của chúng. Ví dụ, phương pháp cây quyết định (decision tree) và phương pháp lấy cảm hứng từ mạng thần kinh. Tôi nghĩ đây là cách hữu ích nhất để phân chia nhóm các thuật toán machine learning và đó cũng là cách tiếp cận chúng ta sẽ sử dụng ở đây.

Thuật toán Bayesian – Bayesian Algorithms

Những phương pháp áp dụng Định lý Bayes để giải quyết các vấn đề được đưa ra. Chẳng hạn như phân loại và hồi quy. Một số những thuật toán Bayes phổ biến nhất bao gồm:

  • Naive Bayes
  • Gaussian Naive Bayes
  • Multinomial Naive Bayes
  • Averaged One-Dependence Estimators (AODE)
  • Bayesian Belief Network (BBN)
  • Bayesian Network (BN)

Thuật toán phân cụm – Clustering Algorithms

Clustering, giống như hồi quy, mô tả class của vấn đề và class của các phương thức. Các thuật toán Clustering được tổ chức theo các phương thức mô hình hóa như dựa trên centroid và phân cấp. Mặt khác, tất cả các thuật toán này đều chú trọng đến việc sử dụng cấu trúc inherent trong dữ liệu. Các thuật toán phân cụm phổ biến nhất là:

  • k-Means
  • k-Medians
  • Expectation Maximisation (EM)
  • Hierarchical Clustering

Qui tắc trong thuật toán machine learning – Association Rule Learning Algorithms

Phương pháp này trích xuất các quy tắc. Những quy tắc này có thể khám phá các mối quan hệ hữu ích và quan trọng trong các tập dữ liệu đa chiều lớn. Nhờ đó có thể được khai thác và phân tích bởi một tổ chức. Các thuật toán phổ biến nhất là:

  • Thuật toán Apriori
  • Thuật toán Eclat

Tham khảo thêm: TOP vị trí tuyển machine learning job in vietnam lương cao

Thuật toán mạng nơron nhân tạo – Artificial Neural Network Algorithms

Đây là những mô hình được lấy cảm hứng từ cấu trúc của mạng nơron thần kinh của con người. Có thể gọi chúng là một class các mẫu hợp nhau được sử dụng cho các vấn đề hồi quy và phân loại. Tuy vậy, nó cũng có một subfield vô cùng lớn đến từ sự kết hợp hàng trăm thuật toán và biến thể. Những thuật toán mạng nơron nhân tạo phổ biến nhất bao gồm:

  • Perceptron
  • Back-Propagation
  • Hopfield Network
  • Radial Basis Function Network (RBFN)

Thuật toán Deep Learning – Deep Learning Algorithms

Deep learning có thể xem là phiên bản cập nhật hiện đại cho Artificial Neural Network với hướng tập trung khai thác vào các thuật toán tính toán đơn giản và dồi dào. Nhờ đó mà có thể xây dựng được những mạng thần kinh lớn và phức tạp hơn nhiều. Các thuật toán Deep Learning phổ biến nhất bao gồm:

  • Deep Boltzmann Machine (DBM)
  • Deep Belief Networks (DBN)
  • Convolutional Neural Network (CNN)
  • Stacked Auto-Encoders

Thuật toán giảm kích thước – Dimensionality Reduction Algorithms

Giống như các phương pháp phân cụm, việc giảm kích thước tìm kiếm một cấu trúc inherent trong dữ liệu. Mặc dù, trong trường hợp này, là để rút gọn lại.

Nói chung, nó có thể hữu ích để hình dung dữ liệu đa chiều. Ngoài ra, chúng ta có thể sử dụng nó trong một phương pháp học được giám sát (supervised learning). Một số thuật toán tiêu biểu mà bạn có thể áp dụng để sử dụng trong phân loại và hồi quy.

  • Principal Component Analysis (PCA)
  • Principal Component Regression (PCR)
  • Partial Least Squares Regression (PLSR)
  • Sammon Mapping
  • Multidimensional Scaling (MDS)
  • Projection Pursuit
  • Linear Discriminant Analysis (LDA)
  • Mixture Discriminant Analysis (MDA)
  • Quadratic Discriminant Analysis (QDA)
  • Flexible Discriminant Analysis (FDA)

Thuật toán Ensemble – Ensemble Algorithms

Về cơ bản, các thuật toán này là các mô hình bao gồm các mô hình yếu hơn. Ngoài ra, khi chúng được đào tạo thì sẽ kết hợp lại theo một cách nào đó để đưa ra dự đoán. Do đó, đây là một class kỹ thuật rất mạnh và phổ biến.

  • Boosting
  • Bootstrapped Aggregation (Bagging)
  • AdaBoost
  • Stacked Generalization (blending)
  • Gradient Boosting Machines (GBM)
  • Gradient Boosted Regression Trees (GBRT)
  • Random Forest

Danh sách các thuật toán machine learning phổ biến

Phương thức phân loại thuật toán machine learning của Naïve Bayes

Nói chung, sẽ rất khó và gần như là không thể để phân loại trang web, tài liệu, email hay các ghi chú văn bản dài khác theo cách thủ công. Vì vậy, chúng ta sẽ cần tới thuật toán Naïve Bayes Classifier Machine Learning.

Ngoài ra, trình phân loại là hàm phân bổ giá trị phần tử của một tập hợp. Ví dụ, Spam Filtering là một ứng dụng phổ biến của thuật toán Naïve Bayes. Do đó, bộ lọc spam ở đây là một trình phân loại và gán nhãn “Spam” hoặc “Not Spam” cho tất cả các email. Về cơ bản, nó là một trong những phương pháp machine learning phổ biến nhất được nhóm lại theo những điểm giống nhau và hoạt động dựa trên định lý Bayes về Xác suất.

Thuật toán machine learning K Means Clustering

Nói chung, K-means là một thuật toán machine learning không giám sát để phân tích cụm. Ngoài ra, K-Means là một phương pháp không xác định và lặp lại. Bên cạnh đó, thuật toán hoạt động trên một tập dữ liệu đã cho thông qua một số cụm được xác định trước, k. Do đó, đầu ra của thuật toán K Means là cụm k với dữ liệu đầu vào được phân tách giữa các cụm.

Thuật toán machine learning Support Vector

Về cơ bản, nó là một thuật toán machine learning được giám sát để phân loại hoặc giải quyết các vấn đề hồi quy. Nói cách khác, SVM có thể phân loại bất kỳ dữ liệu mới nào. Ngoài ra, nó hoạt động bằng cách phân loại dữ liệu vào các class khác nhau vì vậy mà còn được sử dụng để tách các dataset thành class. Hơn nữa, SVM còn cố gắng tối đa hóa khoảng cách giữa các class khác nhau. SVM được phân thành hai loại:

  • SVM tuyến tính – Về cơ bản, trong dữ liệu đào tạo phải được phân loại riêng bằng hyperplane.
  • SVM phi tuyến tính- Về cơ bản, bạn sẽ không thể tách dữ liệu đào tạo bằng hyperplane

Thuật toán Machine Learning Apriori

Về cơ bản, nó là một thuật toán machine learning không giám sát được sử dụng để tạo ra các quy tắc kết hợp từ một tập dữ liệu đã cho. Ngoài ra, quy tắc kết hợp ngụ ý rằng nếu một mục A xảy ra, thì mục B cũng xảy ra với một xác suất nhất định.

Hơn nữa, hầu hết các quy tắc kết hợp được tạo ra đều ở định dạng IF_THEN.

Ví dụ: NẾU mọi người mua một iPad THÌ họ cũng mua một chiếc iPad Case để bảo vệ nó.

Cách thức mà thuật toán machine learning Apriori hoạt động: Nếu một tập hợp mục (item set) xảy ra thường xuyên thì tất cả các tập hợp con của tập hợp mục (item set) đó cũng xuất hiện thường xuyên và ngược lại.

Tham khảo thêm: Tuyển dụng Machine Learning lương cao

Thuật toán machine learning hồi quy tuyến tính (Linear Regression Machine Learning Algorithm)

Nó cho thấy mối quan hệ giữa 2 biến. Ngoài ra, cho thấy sự thay đổi trong một biến sẽ có tác động như thế nào đến biến khác. Về cơ bản, thuật toán cho thấy những tác động lên biến bị phụ thuộc vào biến độc lập. Do đó, các biến độc lập có thể được xem như là các biến giải thích vì chúng cho biết các yếu tố tác động đến biến bị phụ thuộc.

Thuật toán machine learning cây quyết định (Decision Tree Machine Learning Algorithm)

Về cơ bản, thuật toán sử dụng phương pháp phân nhánh để minh họa tất cả các kết quả có thể có của một quyết định. Với phần thân chính là đại diện cho một test lên các thuộc tính, cành là kết quả và lá chính là một class label.

Thuật toán Machine Learning rừng ngẫu nhiên (Random Forest Machine Learning Algorithm)

Đây là thuật toán sử dụng phương pháp đóng gói để tạo ra một loạt các cây quyết định với một subset dữ liệu ngẫu nhiên. Vì vậy nên chúng ta phải đào tạo một mô hình nhiều lần trên mẫu ngẫu nhiên của tập dữ liệu. Tuy nhiên, bạn sẽ cần đạt được hiệu suất dự báo tốt từ thuật toán rừng ngẫu nhiên. Ngoài ra, trong phương pháp học tập toàn bộ này, chúng ta phải kết hợp đầu ra của tất cả các cây quyết định để đưa ra dự đoán cuối cùng.

Thuật toán học tập hồi quy logistic (Logistic Regression Machine Learning Algorithm)

Nói chung, tên của thuật toán này có thể hơi dễ nhầm lẫn vì nó chỉ tập trung vào nhiệm vụ phân loại và các vấn đề không phải là hồi quy. Hơn nữa, thuật toán này áp dụng một hàm hậu cần (logistic function) cho một sự kết hợp các tính năng tuyến tính với khả năng cần phải phân loại được một biến bị phụ thuộc.

TopDev via dzone

Có thể bạn muốn xem:

  Machine Learning thật thú vị: Dự đoán giá nhà đất

Top những thuật toán machine learning mà bất cứ Data Scientist nào cũng cần phải biết (Phần 1)

Top những thuật toán machine learning

Giới thiệu về thuật toán Machine Learning

Có hai cách để phân loại các thuật toán Machine Learning mà bạn có thể gặp qua.

  1. Các thuật toán được phân loại theo phong cách học tập.
  2. Các thuật toán được phân loại dựa trên sự giống nhau về hình thức hoặc chức năng

Nói chung, cả hai cách này đều hữu ích. Tuy nhiên, trong bài viết này, tôi sẽ tập trung vào việc phân loại các nhóm thuật toán theo sự giống nhau và phân tích sâu hơn vào từng loại

Phân loại thuật toán Machine Learning dựa vào cách chúng học tập

Có nhiều cách khác nhau mà thuật toán có thể mô hình hóa một vấn đề vì nó liên quan đến sự tương tác với trải nghiệm. Nói cách khác, bạn sẽ cần phải xác định được phong cách học tập của một thuật toán. Thật may là chỉ có một vài kiểu học tập chính mà thuật toán Machine Learning có thể có. Do đó mà bạn phải suy nghĩ kĩ về vai trò của dữ liệu input và quá trình chuẩn bị môi trường cho thuật toán học tập để có được kết quả tốt nhất.

Sau đây, chúng ta hãy xem xét ba phong cách học tập khác nhau trong thuật toán Machine Learning:

Học tập có giám sát (Supervised Learning)

Về cơ bản, trong thuật toán machine Learning có giám sát này, input data được gọi là dữ liệu huấn luyện với kết quả đã biết tại một thời điểm. Trong đó, một mô hình được chuẩn bị thông qua một quá trình đào tạo để yêu cầu các thuật toán này đưa ra dự đoán. Những dự đoán sai sẽ ngay lập tức được thông báo để chỉnh sửa. Như vậy, quá trình đào tạo sẽ tiếp tục cho đến khi mô hình đạt được mức hoàn thiện mong muốn.

  • Các ví dụ về vấn đề thường gặp là phân loại và hồi quy (classification và regression).
  • Các ví dụ về thuật toán bao gồm hồi quy logistic và mạng thần kinh (logistic regression và back propagation Neural Network.).

Học tập không giám sát (Unsupervised Learning)

Trong thuật toán machine learning không giám sát này, input data đều không được dán nhãn và không có kết quả rõ ràng. Vì vậy, chúng ta phải chuẩn bị mô hình bằng cách suy đoán các cấu trúc có trong input data. Điều này có thể là trích xuất các quy tắc chung. Nó có thể là thông qua một quá trình toán học để giảm sự sai lệch và lỗi.

  • Các ví dụ về vấn đề là phân cụm (cluster), giảm kích thước, và các kết hợp quy tắc trong học tập.
  • Các ví dụ về thuật toán bao gồm thuật toán Apriori và k-Means.

Học bán giám sát (Semi-Supervised Learning)

Input data là một hỗn hợp của các dữ liệu được gắn nhãn và không gắn nhãn. Trong đó chúng ta có đặt ra một kết quả và mục tiêu theo mong muốn. Nhưng mô hình thuật toán cần phải học các cấu trúc để tổ chức dữ liệu cũng như đưa ra các dự đoán.

  • Các ví dụ về vấn đề là phân loại và hồi quy (classification và regression).
  • Các ví dụ về thuật toán là các phần mở rộng cho các phương thức học tập linh hoạt khác.

Phân loại thuật toán Machine Learning dựa vào đặc điểm

Thuật toán ML thường được chia nhóm tùy theo sự giống nhau về chức năng của chúng. Ví dụ, phương pháp cây quyết định (decision tree) và phương pháp lấy cảm hứng từ mạng thần kinh. Tôi nghĩ đây là cách hữu ích nhất để phân chia nhóm các thuật toán machine learning và đó cũng là cách tiếp cận chúng ta sẽ sử dụng ở đây.

  Top 10 thuật toán machine learning dành cho newbie
  Áp dụng Machine learning, xây dựng ứng dụng chatbot của riêng bạn

Thuật toán hồi quy (Regression Algorithms)

Thuật toán hồi quy có liên quan mật thiết với việc mô hình hóa mối quan hệ giữa các biến, mà ta có thể tinh chỉnh bằng cách sử dụng một thước đo tần suất các lỗi xuất hiện trong dự đoán được thực hiện bởi thuật toán machine learning.

Những phương pháp này là có liên quan mật thiết tới thống kê và statistical machine learning. Điều này có thể gây nhầm lẫn bởi vì chúng ta có thể sử dụng hồi quy để tham khảo class của bài toán và class của thuật toán. Thuật toán hồi quy phổ biến nhất là:

  • Ordinary Least Squares Regression (OLSR)
  • Linear Regression
  • Logistic Regression
  • Stepwise Regression
  • Multivariate Adaptive Regression Splines (MARS)
  • Locally Estimated Scatterplot Smoothing (LOESS)

Mô hình này sử dụng dữ liệu đào tạo cá thể để giải quyết vấn đề và đưa ra quyết định được coi là quan trọng hoặc cần thiết. Phương pháp này sẽ cho ra một database để nó có thể so sánh dữ liệu mới.

Vì lý do này, bạn có thể xem phương thức chọn tất cả những kẻ chiến chiến thắng và học tập dựa trên thông tin từ bộ nhớ. Các thuật toán dựa trên cá thể phổ biến nhất là:

  • k-Nearest Neighbor (kNN)
  • Learning Vector Quantization (LVQ)
  • Self-Organizing Map (SOM)
  • Locally Weighted Learning (LWL)

Tham khảo thêm: Tuyển dụng lập trình Machine Learning lương cao

Thuật toán chuẩn hóa (Regularization Algorithms)

Một phần mở rộng được thực hiện cho một phương pháp khác. Chỉ thích hợp với các mô hình đơn giản. Tôi nhắc tới các thuật toán chuẩn hóa ở đây vì chúng rất phổ biến, mạnh mẽ và thường là những sửa đổi đơn giản được thực hiện cho các phương pháp khác. Các thuật toán phổ biến nhất là:

  • Ridge Regression
  • Least Absolute Shrinkage và Selection Operator (LASSO)
  • Elastic Net
  • Least-Angle Regression (LARS)

Thuật toán cây quyết định (Decision Tree Algorithms)

Như cái tên, đây là phương pháp xây dựng một mô hình đưa ra quyết định. Điều đó được thực hiện dựa trên những giá trị của các thuộc tính trong dữ liệu. Phương pháp cây quyết định được đào tạo về dữ liệu của các vấn đề phân loại và hồi quy. Đây là phương pháp rất nhanh chóng và chính xác nên nhận được rất nhiều quan tâm trong cộng đồng machine learning. Một số thuật toán cây quyết định phổ biến nhất bao gồm:

  • Classification và Regression Tree (CART)
  • Iterative Dichotomiser 3 (ID3)
  • C4.5 và C5.0
  • Chi-squared Automatic Interaction Detection (CHAID)
  • Decision Stump
  • M5
  • Conditional Decision Trees

(Hết phần 1)

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

BI là gì? Vì sao có nhiều doanh nghiệp đầu tư vào BI?

Bạn có thể nói Business Intelligence là:

▪️ BI là công cụ biến dữ liệu thô thành những kết quả có nghĩa, dùng được và hỗ trợ ra quyết định.
▪️ BI là các ứng dụng dùng công nghệ để doanh nghiệp hành động dựa trên những kết quả phân tích bài bản.
▪️ BI hỗ trợ tạo ra quy trình quản lý doanh nghiệp thông minh
▪️ BI là một tiến bộ công nghệ chưa bao giờ ngừng phát triển và lan rộng trong thế giới kinh doanh.

Nói một cách khác hơn, BI sẽ mang lại insights cho bạn dựa trên những số liệu đã có để trở thành một nền tảng vững chắc cho các quyết định sắp xảy ra, chính vì thế BI lại là công cụ vẽ ra một bức tranh tổng thể hơn là gợi ý cho bạn đến những trend trong tương lai.

  Artificial Intelligence (AI) đã thay đổi cuộc chơi Marketing

Các thành phần chính của 1 hệ thống Business Intelligence:

– Data sources: dữ liệu thô từ các nguồn khác nhau như HRM, CRM, website TMĐT,..

– Data warehousing: là nơi lưu trữ dữ liệu lâu dài của tổ chức

– Integrating Server: chịu trách nhiệm trung gian vận hành công cụ ETL để chuyển đổi dữ liệu từ Data Sources vào Data Warehouse.

– Analysis Server: nơi nhận dữ liệu đầu vào để trả về kết quả dựa trên tri thức nghiệp vụ được định nghĩa sẵn.

– Reporting Server: thực thi các report với output nhận được từ Analysis Server.

– Data Mining: là quá trình trích xuất thông tin dữ liệu đã qua xử lý, khâu này khá quan trọng!

– Data Presentation: các báo cáo, biểu đồ từ quá trình data mining được tạo ra từ đây.

~

Theo Gartner, “Đến năm 2020, các doanh nghiệp có khả năng cấp quyền cho người dùng truy cập vào danh mục dữ liệu đã qua chọn lọc, cả nội bộ và bên ngoài, sẽ tạo ra gấp đôi giá trị kinh doanh từ các khoản đầu tư phân tích.” Do đó, khả năng kết nối giữa các nền tảng và hệ thống sẽ có giá trị cao trong tương lai. Nền tảng phân tích dữ liệu và BI cấp tiến với việc triển khai trên đám mây ngày càng phổ biến.

Có thể nói BI hội tụ những yếu tố mà một người làm kinh doanh điển hình đang tìm kiếm, nó đến từ việc kết hợp và trích xuất dữ liệu để từ đó chuyển hóa thành thông tin hữu ích phục vụ cho các quyết định kinh doanh hàng ngày.

VÌ SAO NGÀY CÀNG CÓ NHIỀU DOANH NGHIỆP ĐẦU TƯ VÀO BI? TẦM QUAN TRỌNG CỦA MỘT HỆ THỐNG BI?

Thị trường BI càng ngày có nhiều ông lớn tham gia như Microft là Power BI, Oracle BI, Qlikview, Tableau và IBM hoặc dễ hình dung nhất như Grab dùng BI từ Tableau để “siêu bản địa hóa” ứng dụng đặt xe,…

Các quyết định “thần tốc”, đúng thời điểm, đúng đối tượng không hoàn toàn dựa trên cảm đoán mà là doanh nghiệp đó nhận định được tầm quan trọng của dữ liệu họ sở hữu, chính BI đã chứng minh điều đó, vì đây là cách tiếp cận dữ liệu một cách nhanh gọn và minh bạch nhất.

Không dừng ở đó khi kỷ nguyên công nghệ đã đến, quan hệ Human – Computer là xử lý ngôn ngữ tự nhiên (NLP) trở thành công cụ không thể thiếu. Việc kết hợp giữa AI, Machine learning và ngôn ngữ học sẽ biến BI của doanh nghiệp thành chatbox, “hiểu” được thắc mắc đồng thời điều phối khách hàng đến với mục đích của doanh nghiệp. Mục đích của một nền tảng phân tích Business Intelligence tích hợp sẽ khai thác sâu hơn các câu hỏi vì sao, ở đâu, cái gì và như thế nào về khách hàng, sản phẩm và công ty. Điều này sẽ giúp các quyết định được đưa ra một cách hiệu quả và nâng cao hiệu suất hoạt động.

🔥 Đây chỉ là một phần về Business Intelligence, để hiểu rõ và có một cái nhìn trực quan hơn, sự kiện “Digital Transformation & Business Intelligence tăng sức cạnh tranh của doanh nghiệp” sẽ là nơi bạn nắm bắt ngay cho mình những tuyệt chiêu từ các chuyên gia quản lý doanh nghiệp thông minh!

business intelligence là gì

Độc giả Techtalk.vn có thể tham gia sự kiện theo thông tin bên dưới:

  • Link đăng ký: https://meetup.vn/e/mLY 
  • Thời gian & Địa điểm: 18:00 ngày 06/03/2019 – SIHUB 273 Điện Biên Phủ, P7, Q3, HCM

 

AJAX là gì? Chi tiết về Asynchronous Javascript and XML

AJAX là gì? Chi tiết về Asynchronous Javascript and XML

AJAX là một kỹ thuật phát triển web mạnh mẽ được sử dụng để giúp các trang web nhanh và mượt mà hơn như đang dùng app desktop. Trong bài viết này, cùng TopDev khám phá cách AJAX hoạt động, lợi ích mà nó mang lại và cách bạn có thể áp dụng nó vào các dự án web của mình.

AJAX là gì?

AJAX là từ viết tắt của Asynchronous Javascript and XML (JavaScript và XML không đồng bộ). AJAX là phương thức trao đổi dữ liệu với máy chủ cho phép cập nhật một hay nhiều phần của trang web, hoàn toàn không reload lại toàn bộ trang.

Ajax được viết bằng Javascript chạy trên client, tức là mỗi browser sẽ chạy độc lập hoàn toàn không ảnh hưởng lẫn nhau. Về mặt kỹ thuật, nó đề cập đến việc sử dụng các đối tượng XmlHttpRequest để tương tác với một máy chủ web thông qua Javascript.

XMLHttpRequest (XHR) là một API cho phép gửi các yêu cầu HTTP tới máy chủ và nhận các phản hồi một cách đồng bộ hoặc không đồng bộ.

>> Đọc thêm: XML là gì?

Tại sao lại sử dụng AJAX?

Tại sao lại sử dụng AJAX?

AJAX là một trong những công cụ giúp chúng ta đem lại cho người dùng trải nghiệm tốt hơn. Khi cần một thay đổi nhỏ thì sẽ không cần load lại cả trang web, làm trang web phải tải lại nhiều thứ không cần thiết.

Những lợi ích mà AJAX mang lại:
  • AJAX được sử dụng để thực hiện một callback. Được dùng để thực hiện việc truy xuất dữ liệu hoặc lưu trữ dữ liệu mà không cần phải reload lại toàn bộ trang web. Với những server nhỏ thì việc này cũng tiết kiệm được băng thông cho chúng ta hơn.
  • Cần gì thì chỉ gửi dữ liệu phần đó, load lại 1 phần nhỏ để cập nhật thông tin chứ không load cả trang. Bằng cách này thì có thể giảm thiểu được tốc độ tải trang giúp người dùng có trải nghiệm tốt hơn.
  • Trang web bạn tạo ra cũng sẽ đa dạng và động hơn.

>>> Xem thêm: Search cha con trong wordpress sử dụng ajax

Cách thức hoạt động Ajax

Cách thức hoạt động Ajax

AJAX hoạt động dựa trên việc gửi các yêu cầu HTTP từ phía client đến server ở chế độ nền, sau đó cập nhật từng phần của trang web mà không cần tải lại toàn bộ trang. Đây là quy trình tổng quát:

  • Tạo yêu cầu XMLHttpRequest: Khi một sự kiện được kích hoạt (ví dụ: người dùng nhấn nút hoặc nhập dữ liệu vào biểu mẫu), một đối tượng XMLHttpRequest (XHR) được tạo ra trong JavaScript.
  • Gửi yêu cầu đến server: Đối tượng XHR được cấu hình để gửi một yêu cầu HTTP (GET hoặc POST) đến server chứa các tham số và dữ liệu cần thiết.
  • Nhận phản hồi từ server: Server xử lý yêu cầu và gửi lại dữ liệu cần thiết dưới dạng XML, JSON, hoặc HTML.
  • Cập nhật trang web: Dữ liệu nhận được từ server được sử dụng để cập nhật nội dung trang web một cách linh hoạt mà không cần tải lại toàn bộ trang. Điều này có thể thực hiện bằng cách thay đổi nội dung của các phần tử DOM hoặc chèn dữ liệu mới vào trang.

Ví dụ thực tế: Khi bạn tìm kiếm trên Google và nhập từ khóa, AJAX sẽ gửi từng ký tự bạn nhập đến server và nhận lại các gợi ý tìm kiếm ngay lập tức, tất cả đều diễn ra mà không cần tải lại trang.

>>> Xem thêm: Instant AJAX Search với Laravel và Vuejs

Ví dụ một ứng dụng đơn giản sử dụng ajax bằng jQuery

Jquery cung cấp một số method để thực hiện ajax. Chúng ta có thể yêu cầu các dữ liệu, HTML, XML và JSON từ server sử dụng giao thức HTTP là GET và POST.

Xem thêm: AJAX trong jQuery

load()

Phương thức load() lấy dữ liệu từ server và trả dữ liệu cho phần tử được chọn.

Cú pháp:

$(selector).load(URL,data,callback);
  • URL: mà bạn muốn lấy dữ liệu.
  • Data: cặp key/value gửi đi cùng với yêu cầu.
  • Callback: tên của hàm sẽ được thực thi sau khi phương thức load hoàn thành.

Ví dụ : Ta có file demo.html

<h2>TopDev is Awesome!</h2> 

<p id="p1">This is some text in a paragraph.</p>

Load nội dung của file “demo.html” vào trong một div với id = div-1

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.14.4/jquery.min.js"></script>
<script>
$(document).ready(function(){
    $("button").click(function(){
        $("#div-1").load("demo.html");
    });
});
</script>
</head>
<body>

<div id="div-1"><h2>Let jQuery AJAX Change This Text</h2></div>

<button>Get External Content</button>

</body>
</html>

Post trong JQuery

Có tác dụng lấy dữ liệu từ server bằng phương thức HTTP POST REQUEST

Cú pháp:

$(selector).post(URL,data,function(data,status,xhr),dataType)
  • url: required , đường dẫn đến file cần lấy thông tin
  • data: không bắt buộc ,là một đối tượng object gồm các key : value sẽ gửi lên server
  • function(data, status , xhr): là function sẽ xử lý khi thực hiện thành công với các parameters:
    • data : bao gồm các dữ liệu trả về từ request
    • status : gồm trạng thái request (“success” , “notmodified” , “error” , “timeout” , or “parsererror”)
    • xhr : gồm các đối tượng XMLHttpRequest
  • dataType: là dạng dữ liệu trả về. (text, json, script, xml,html,jsonp )

Get trong Jquery

Là phương pháp lấy dữ liệu từ server bằng phương thức HTTP GET

Tương tự như phương thức Post , phương thức get có cú pháp là :

$.get(URL,data,function(data,status,xhr),dataType)

Ứng dụng phổ biến của AJAX

Email Web Clients (Gmail): AJAX giúp Gmail cập nhật hộp thư đến theo thời gian thực mà không cần làm mới trang. Khi bạn xóa email, nó biến mất ngay lập tức. Khi bạn mở một email, nội dung hiển thị ngay lập tức. Viết email mới? Cửa sổ đó mở lên không có độ trễ nào. Trải nghiệm này giúp quản lý hộp thư nhanh chóng và tiện lợi.

Tìm kiếm theo thời gian thực (Google Search): Khi bạn gõ vào thanh tìm kiếm, AJAX gửi từng ký tự đến máy chủ và nhận về các gợi ý liên quan ngay tức thì. Tính năng này, được gọi là autocomplete, dự đoán những gì bạn có thể tìm kiếm và cung cấp cho bạn một danh sách các tùy chọn.

Mạng xã hội (Facebook, Twitter): Trên các nền tảng như Facebook và Twitter, AJAX giúp cập nhật liên tục nguồn cấp dữ liệu. Khi bạn cuộn, thích bài viết, bình luận hoặc nhận thông báo mới, tất cả những hành động này được cập nhật một cách linh hoạt mà không cần tải lại trang. Điều này giữ cho bạn tương tác liên tục và mượt mà.

Ứng dụng bản đồ (Google Maps): Google Maps sử dụng AJAX để cập nhật dữ liệu bản đồ khi bạn điều hướng. Khi bạn kéo hoặc thu phóng bản đồ, nó tải các ô bản đồ mới và chèn chúng mà không cần làm mới toàn bộ trang. Điều này mang lại trải nghiệm điều hướng mượt mà và tương tác.

Forms and Live Validation (Nhiều trang web): AJAX thường được sử dụng để xác thực dữ liệu biểu mẫu trong thời gian thực. Ví dụ, khi đăng ký dịch vụ, AJAX có thể kiểm tra xem tên người dùng bạn chọn đã được sử dụng hay chưa hoặc định dạng email của bạn có đúng không trước khi bạn nhấn gửi. Phản hồi ngay lập tức này cải thiện trải nghiệm người dùng và giúp tránh lỗi.

Dynamic Content Loading (Trang tin tức, thương mại điện tử): Trên các trang tin tức và cửa hàng trực tuyến, AJAX có thể tải các bài báo hoặc sản phẩm mới một cách linh hoạt khi bạn cuộn. Tính năng cuộn vô tận này đảm bảo bạn luôn nhận được nội dung mới mà không cần làm mới trang, giữ bạn tương tác lâu hơn.

Trên đây là những kiến thức cơ bản về khái niệm, ưu điểm cũng như ứng dụng của AJAX. Thông qua ví dụ, hi vọng TopDev đã giúp các bạn hiểu AJAX là gì, theo dõi TopDev để cập nhật nhiều hơn kiến thức về công nghệ bạn nhé!

Truy cập ngay các công việc IT đãi ngộ tốt trên TopDev

Bách khoa toàn thư giải quyết mọi vấn đề của lập trình viên mới học code!

Bách khoa toàn thư giải quyết mọi vấn đề của lập trình viên mới học code

Tiếp nối series Q&A cho các bạn trẻ mới gia nhập làng code học lập trình, dưới đây tôi sẽ trả lời cho các bạn những thắc mắc và băn khoăn nóng hổi nhất về ngành lập trình đang được đông đảo các bạn quan tâm.

Đâu là thời điểm thích hợp để tôi bắt đầu nhúng tay vào các project ?

Hãy thực hiện dự án của mình càng sớm càng tốt! Khi bạn đã nắm được các nguyên tắc cơ bản của một ngôn ngữ lập trình, hãy kết hợp chúng lại để thử build nên một cái gì đó. . Nếu bạn có một ý tưởng trong đầu, điều này sẽ giúp bạn có thể học được nhiều thứ hơn nữa. Chỉ cần biết rõ các nguyên tắc cơ bản của ngôn ngữ, bạn đã có thể tạo ra rất nhiều command line game. Thậm chí còn xây dựng những thứ tuyệt vời hơn với các nguyên tắc cơ bản của phát triển web!

Đối với một dev kỹ năng quan trọng nhất là gì?

Nếu chỉ được chọn một thứ, tôi sẽ lựa chọn kỹ năng tự học – tự trau dồi bản thân những điều mới một cách hiệu quả. Nếu là một developer, bạn sẽ không ngừng phát triển bản thân và tạo ra các công nghệ mới. Việc tự trau dồi bản thân còn quan trọng hơn bất cứ công cụ hay công nghệ nào.

Làm sao để các Javascript arguments hoạt động?

Trước khi tôi bắt đầu chúng ta cùng phân tích nhanh từng thuật ngữ:

Arguments (đối số): Đây là đại diện cho giá trị truyền cho parameter khi chúng ta thực hiện lời gọi hàm.

Parameters (các tham số): Đây là những gì chúng ta gọi khi định nghĩa một hàm.

Trong function myFunction(x, y , x và y là các parameter . Khi chúng ta thực hiện hàm đó bằng cách chạy myFunction(1, 3), 1 và 3 là các argument.

Để có thể phù hợp với hai tuýp người có 2 lối suy nghĩ khác nhau, tôi thường dạy các chức năng theo hai cách. Cách đầu tiên là một đoạn code có thể tái sử dụng bằng cách gắn các giá trị vào để giúp cho code của bạn trở nên linh hoạt và ít lặp lại hơn. Trong trường hợp này, các argument là các mẫu thông tin “động” được gắn vào đoạn code cho nên khi bạn gọi hàm giá trị có thể thay đổi. Có khá là nhiều biến khác nhau mỗi khi bạn chạy hàm.

Một cách giải thích khác đó là các chức năng như một loạt các input and output – giống như một chiếc máy nhỏ. Khi bạn đặt vào đó một cái gì đó thì sẽ xuất hiện một cái khác dựa trên nó. Các argument là những thứ bạn đang cho vào máy và giá trị trả về là những gì được xuất ra. Điều này hoàn toàn trùng khớp với định nghĩa đại số của các hàm chặt chẽ hơn – nếu bạn nhớ f(x) = 2x + 1 từ toán học đó là các hàm chỉ được viết trên giấy thay vì viết theo chương trình.

Trong JavaScript, thứ tự của các argument được gắn vào hàm tương ứng với thứ tự của các parameter trong khai báo hàm. Vì vậy, nếu khi báo hàm của tôi giống như  function add(x, y)và sau đó tôi gọi hàm với add(1, 2)trong hàm 1 sẽ là x và 2 sẽ là y.Thay vào đó, nếu tôi chạy add(100, 50), x sẽ là 100 và y sẽ là 50. Vì x là parameter đầu tiên của tôi, nên argument đầu tiên của tôi gắn vào hàm se là x và vì y là thứ 2, giá trị thứ hai I vượt qua sẽ là y. Thỉnh thoảng nó sẽ hữu ích để thiết lập sơ đồ này.

function subtract(x, y) {
 return x - y
}

add(5, 2) // 3, 5 is x, 2 is y
add(200, 50) // 150, 200 is x, 50 is y
add(20, 70) // -50, 20 is x, 70 is y

x y subtract(x, y)
5 2 3
200 50 150
20 70 -50

Theo bạn thì ngôn ngữ nào thì nên có kiến thức và hiểu biết về nó để làm việc hiệu quả ?

Tôi nghĩ đây là một câu hỏi rất xem nặng về skillset (bộ kĩ năng). Tôi có thể chia sẻ rất nhiều  về khoa học dữ liệu và phát triển web vì đây chính là điểm bắt đầu sự nghiệp của mình. Khi đề cập đến khoa học dữ liệu, tôi sẽ nói về Python – trụ cột ở thời điểm hiện tại. Tôi muốn mình biết được ít nhất một trong số chúng. Còn về lập trình web HTML/ CSS/ JavaScript chính là điều bạn cần. Hiện tại với  JavaScript bạn có thể xây dựng mọi thứ, đó là một ngôn ngữ vô cùng linh hoạt.

  Những nguyên tắc, định luật của lập trình mà chúng ta nên có sẵn trong đầu

Làm thế nào để vững lòng bước tiếp khi những người trong ngành công nghệ liên tục bảo không nên?

Đây chính là điều mà thỉnh thoảng tôi vẫn thường phải đối mặt và tôi vẫn chưa tìm ra được câu trả lời hoàn hảo cho vấn đề này. Tôi thực sự đã từng từ bỏ coding khi còn ngồi ở ghế trường đại học vì luôn nghĩ mình không đủ giỏi và phải đối mặt với những lời thô lỗ từ những người xung quanh khiến tôi thường xuyên nghĩ đến việc chuyển sang ngành khác.

Nhưng tôi đã tiếp tục đấu tranh và suy nghĩ đến những điều giúp tôi tiếp tục ở trong ngành công nghệ như sự phát triển ngày càng linh hoạt, những người tuyệt vời mà tôi đã gặp, những điều tuyệt vời mà tôi đã tạo ra.

Những thứ khiến nó trở nên xứng đáng cho dù có bao nhiêu khó khăn đi nữa. Thật đáng thương cho những người luôn gây tổn thương cho người khác khi cảm thấy bị đe dọa. Cả hai đều cảm thấy thiếu tự tin và điều đó chỉ khiến mọi việc tệ đi.

Tôi cũng lưu lại những tài liệu để lưu giữ những “chiến thắng” của mình: những thứ tuyệt vời mà mình đã xây dựng, những phản hồi tích cực từ khách hàng, những thành tựu mà tôi đã đạt được. Vào những ngày cảm thấy khó khăn, tôi thường trở về và xem lại những gì đã qua và nhắc nhở mình về những điều tuyệt vời mà tôi đã làm.

Làm thế nào cải thiện khả năng lập trình logic và giải quyết vấn đề?

Đây là chủ đề mà tôi vô cùng yêu thích và tôi có thể nói liên tục về điều này. Tôi đang thực hiện hiện một khóa học về chủ đề này. Hãy theo dõi và tìm hiểu thêm ở đó nhé.  Tôi rất tiếc vì không thể mang đến một câu trả lời ngắn gọn hơn. Nhưng chủ yếu là về việc suy nghĩ trừu tượng và chia nhỏ từng vấn đề để giải quyết một vấn đề lớn.

Làm cách nào để học code miễn phí?

Tham khảo ngay từ những nguồn yêu thích của tôi: https://topdemy.vn có nhiều khóa miễn phí học theo roadmap.

Tôi nên học ngôn ngữ lập trình nào đầu tiên?

Theo ý kiến cá nhân của tôi thì bạn nên bắt đầu với JavaScript hay Python. Python là một ngôn ngữ linh hoạt với cú pháp phù hợp dành cho những lập trình viên mới vào nghề. Còn JavaScript là một công cụ cần thiết để có thể xây dựng một trang web và bạn có thể xây dựng những thứ khác với nó nhanh hơn các ngôn ngữ khác.

Làm sao để có thể nhớ được hết các công cụ/ thao tác?

Tôi chưa bao giờ thử ghi nhớ những thứ cụ thể theo ngôn ngữ hay cú pháp. Chúng ta có thể tra cứu mỗi khi cần sử dụng và chương trình soạn thảo văn bản sẽ giúp tôi trong vấn đề này. Đối với những khái niệm quan trọng tôi thường tập trung vào việc hiểu về nó hơn là cố gắng học thuộc lòng!

Nên bắt đầu từ Project nào để build?

Tôi luôn nghĩ rằng mạo hiểm một chút sẽ luôn mang đến cho chúng ta cảm giác tươi mới. Hãy chọn một project có sẵn, chỉnh sửa nó từ nhỏ đến lớn, sau đó khi nắm rõ được project thì hãy build theo chức năng mình mong muốn.

Hi vọng cẩm nang này đủ bao quát và hữu ích để giúp bạn vượt qua chặng đường coding sắp tới!

TopDev

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev ngay!

Data scientist vs data analyst: những khác biệt mà bạn cần biết

Data (data scientist vs data analyst) đang ngày càng trở nên quan trọng hơn bao giờ hết đối với các doanh nghiệp và tổ chức trên toàn thế giới. Song song đó, các ông lớn đang tìm cách khai thác tiềm năng của dữ liệu để tăng doanh thu và lợi nhuận, cải thiện năng suất hoạt động và nâng cao sự hài lòng của khách hàng.

Có thể bạn quan tâm: Tuyển dụng data analyst up to 20M

  Top 10 thư viện Python tốt nhất cho Data Scientist nửa đầu năm 2024
  Top các khóa học miễn phí Computer Science, Programming, Data Science cần học ngay!

Vậy, ai sẽ làm tất cả những điều này? Tất nhiên là các nhà Data scientists và analysts. Trong bài viết này, tôi sẽ cung cấp cho bạn một cái nhìn tổng quan ngắn gọn về sự khác biệt của hai vai trò này và một số điều bạn cần biết cho công việc.

Data scientist

Trước khi trả lời câu hỏi data scientist là gì? Trước hết hãy trả lời data science là gì?

Data science là một quá trình phân tích dữ liệu bằng cách sử dụng các cách sáng tạo (như data inference) và sử dụng công nghệ phát triển thuật toán để tìm giải pháp cho các vấn đề phức tạp.

Chúng liên quan đến việc tách rời và tập hợp các tập dữ liệu để tìm ra các thông tin như thói quen và sở thích của người tiêu dùng. Nó cũng có thể chỉ đơn giản là tìm ra xu hướng bán hàng của một dòng sản phẩm cụ thể.

Ví dụ, Amazon khai thác các mẫu dữ liệu người dùng để xác định các sản phẩm được đề xuất cho từng người dùng. Việc làm này đòi hỏi sự kết hợp giữa chuyên môn thống kê, lập trình và kiến ​​thức kinh doanh.

Thống kê chính là trái tim của data science. Do đó mà lĩnh vực này yêu cầu một người có khả năng tìm ra các xu hướng phức tạp trong một tập dữ liệu có thể bao gồm hơn 1 triệu hàng.

Kỹ năng lập trình, mặt khác, cần phải liên quan tới số liệu thống kê. Để phân tích thống kê xảy ra, bạn cần một người thông thạo ngôn ngữ lập trình (như Java, SQL và Python) để chia nhỏ tập dữ liệu ở các định dạng dễ đọc hơn.

Cuối cùng, kiến ​​thức kinh doanh cũng cần thiết để đảm bảo rằng bạn đang giải quyết các vấn đề phù hợp với mục tiêu của tổ chức.

Cuối cùng, bạn sẽ có khả năng để tạo ra một “data product” như hệ thống đề xuất của Amazon.

Video: Cách thiết kế Database đáp ứng khả năng mở rộng và lượng truy xuất cao

Data analyst

Vai trò của một nhà data analyst tương tự như một nhà data scientist theo nhiều phương diện. Họ cũng phân tích dữ liệu và thu được những hiểu biết từ chúng. Điểm khác biệt chính là các nhà data scientist tỏa sáng khi khối lượng dữ liệu của tổ chức vượt quá một quy mô nhất định, dẫn đến nhu cầu tạo ra các sản phẩm dữ liệu để giúp phân tích nó.

Vì vậy, trong khi điều này có nghĩa rằng các nhà data analysts cũng làm công việc của data science nhưng họ không bắt buộc phải biết nhiều về lập trình. Nhưng các data analyst vẫn phải có kiến ​​thức về thống kê và hoạt động kinh doanh.

Mặt khác, một nhà data analyst cần phải có khả năng đưa ra kết quả của mình dưới dạng báo cáo hoặc một bài thuyết trình.

So sánh

Dưới đây là những khác biệt lớn giữa các nhà data scientist và data analyst:

Data scientist Data analyst
Yêu cầu tạo ra prototype và phát triển “data product” để đưa ra các quyết định thông minh thúc đẩy hướng đi của doanh nghiệp.

Yêu cầu phải biết một số lượng lớn các ngôn ngữ lập trình

Chỉ có trong các tổ chức yêu cần giải quyết những tập dữ liệu lớn (big data)

Có thể hoặc không bắt buộc phải phát triển “data product”.

Có thể không bắt buộc phải biết một số lượng lớn các ngôn ngữ lập trình. Trên thực tế, nhiều tổ chức chỉ dựa vào các bảng tính excel để chạy các hoạt động phân tích dữ liệu của họ.

Tồn tại trong hầu hết các tổ chức,

Yêu cầu công việc

Như đã đề cập ở trên, để trở thành nhà data scientist hoặc data analyst, bạn sẽ cần phải có kỹ năng thống kê, lập trình và sự nhạy bén trong kinh doanh. Như vậy, bắt đầu với các điểm dưới đây sẽ là một khởi đầu tốt:

  1. Thống kê và áp dụng toán học

Có một nền tảng vững chắc trong thống kê và toán học là điều bắt buộc. Là một phần của việc xây dựng nền tảng này, bạn chắc chắn sẽ cần phải là một chuyên gia về tính toán và đại số tuyến tính.

  1. Làm quen với cơ sở dữ liệu và các công cụ dữ liệu lớn

Hầu hết các tổ chức đều sử dụng phần mềm quản lý dữ liệu như MySQL hoặc Cassandra do đó sẽ thuận lợi hơn khi bạn làm quen với chúng. Kiến thức về các công cụ dữ liệu lớn như Hadoop cũng sẽ cung cấp cho bạn một lợi thế.

  1. Phát triển khả năng viết code

Kiến thức về các ngôn ngữ lập trình thống kê như Python, R và SAS là rất cần thiết và được mong đợi từ tất cả các nhà data scientist và ở một mức độ thấp hơn với các nhà data analyst.

  1. Có được kinh nghiệm kinh doanh và trình bày dữ liệu chính

Bạn cần phải tham gia vào các dự án kinh doanh cũng như tiếp cận với cách thức hoạt động của doanh nghiệp và hiểu điều gì làm cho tổ chức của bạn trở nên nổi bật.

TopDev via Techinasia

Flutter Vs. React Native – Nên chọn framework nào?

Flutter Vs. React Native - Nên chọn framework nào?

Flutter và React Native là hai framework được rất nhiều người quan tâm ở thời điểm hiện tại. Điểm chung của cả 2 đều là Cross Platform Mobile, build native cho cả Android và iOS. Cả 2 có thể giao tiếp với native để viết các module base on native (gần như bắt buộc). Hãy cùng so sánh Flutter vs React Native xem chúng có những ưu và nhược điểm nào trong bài viết của TopDev.

Cơ bản về Flutter

Flutter là một là SDK (Software Development Kit) nguồn mở của Google dùng để tạo các ứng dụng chất lượng cao cho Android và iOS cách sử dụng một codebase duy nhất. Nó cho phép các nhà phát triển xây dựng các ứng dụng di động chất lượng cao bằng cách sử dụng ngôn ngữ lập trình Dart. Flutter nổi bật với khả năng cung cấp các giao diện người dùng mượt mà, đẹp mắt và hiệu suất gần như native nhờ vào việc sử dụng các thành phần giao diện tùy chỉnh.

Project Google Hummingbird (ra mắt 04/12/2018) cho phép các developer chỉ cần build một ứng dụng một lần và sau đó có thể chạy nó ở bất kỳ nơi nào.

Ứng dụng sử dụng framework Flutter

Ứng dụng sử dụng framework Flutter

  1. Google Ads
  2. Alibaba
  3. Hamilton Musical
  4. Reflectly
  5. Tencent
  6. eBay Motors
  7. Philips Hue
  8. BMW
  9. Abbey Road Studios
  10. The New York Times
  11. Realtor.com
  12. Groupon

Ưu điểm của Flutter

Như đã được đề cập ở trên, SDK nguồn mở và miễn phí này được hỗ trợ bởi Google và được dùng để phát triển các ứng dụng cho Android và iOS. Các feature chính của platform này là:

  • SDK cho platform chính xác và chi tiết
  • Các widget được thiết kế chi tiết, chính xác
  • Môi trường hoàn toàn tùy chỉnh
  • API hỗ trợ các hiệu ứng, animation và gesture 2D
  • Giao tiếp gần như trực tiếp với native
  • Feature Stateful Hot Reload để phát triển app nhanh hơn
  • Static language nhưng với syntax hiện đại, compiler linh động giữa AOT (for archive, build prod) và JIT (for development, hot reload)
  • Có thể dùng để build các bundle/framework gắn và app native để tăng performance.
  • Có thể chạy được giả lập mobile ngay trên web, tiện cho development. Các metric measure performance được hỗ trợ sẵn giúp developer kiểm soát tốt performance của app.

Tháng 05/2017, Google giới thiệu Flutter tới cộng đồng, sau đó vào ngày 04/12/2018, phiên bản ổn định hơn của Flutter được phát hành. Bên cạnh đó, Flutter có thể được sử dụng để tạo các ứng dụng cho Google Fuchsia, một hệ điều hành dựa trên khả năng của Google.

Xem việc làm Flutter lương cao tại TopDev

Nhược điểm của Flutter

  • Bộ render UI được team author gần như viết lại, không liên quan tới UI có sẵn của Framework native, dẫn đến memory sử dụng khá nhiều.
  • Phải học thêm ngôn ngữ DART, bloc pattern, DART Streaming
  • Khó khăn trong việc styling cho các component
  • Quản lý vòng đời phức tạp hơn so với React Native
  • Dù đã release 1.0 chính thức, tuy nhiên còn khá mới. Một số plugin rất quan trọng như Google Map vẫn còn đang phát triển, chưa stable.

Cơ bản về React Native

React Native là một framework mã nguồn mở được phát triển bởi Facebook, sử dụng ngôn ngữ lập trình JavaScript và React để phát triển ứng dụng di động. React Native sử dụng các thành phần giao diện người dùng native, điều này giúp nó cung cấp trải nghiệm gần như native cho người dùng.

  React Native là gì? Kiến thức tổng quan về React Native

Ứng dụng sử dụng framework React Native

Ứng dụng sử dụng framework React Native

  1. Facebook
  2. Instagram
  3. Airbnb
  4. Tesla
  5. Walmart
  6. Bloomberg
  7. Pinterest
  8. Uber Eats
  9. Skype
  10. SoundCloud Pulse
  11. Discord
  12. Salesforce

>> Bài viết liên quan: 9 ứng dụng tuyệt vời viết bằng React Native

Ưu điểm của React Native

  • Thiên về development/hotfix nhanh (hot reload, bundle injection), cho phép xem ngay các thay đổi trong mã nguồn mà không cần phải biên dịch lại toàn bộ ứng dụng, giúp tăng tốc độ phát triển.
  • Sử dụng JS (quen thuộc với nhiều developer) và có thể share business logic codebase với frontend (js).
  • Back bởi Facebook, họ dùng cho product của họ hàng ngày nên developer hưởng lợi khá nhiều từ đây.
  • Hiện tại đã rất nhiều thư viện, gần như đã rất đầy đủ cho các nhu cầu app thông dụng.

Tham khảo tuyển dụng React Native lương cao hấp dẫn

Nhược điểm của React Native

  • Giao tiếp với native thông qua các bridge, dễ bị bottleneck nếu không được kiểm soát tốt.
  • Dùng JS nên mang theo các đặc điểm của JS: rất dễ làm nhưng cũng dễ sai, dẫn tới khó maintain về sau.
  • Hiệu năng animation là điểm yếu của RN, muốn làm tốt phải làm từ native, tầng js chỉ call vào, setup views. Tuy nhiên với các interactive animation thì rất đau khổ.
  • Không thích hợp cho các app cần năng lực tính toán cao (hash, crypto, etc).

Điểm tương đồng giữa Flutter và React Native

Cả hai đều được thiết kế để phát triển cross-platform app

React Native và Flutter đều cung cấp hiệu suất ứng dụng vượt trội, nhanh chóng và chất lượng cao trên nhiều platform bao gồm Android, iOS và UWP.

(Lưu ý: Flutter hỗ trợ platform Android và iOS)

Cả hai framework được hỗ trợ bởi các cộng đồng công nghệ khổng lồ

React Native được cung cấp bởi Facebook còn Flutter là SDK nguồn mở của Google để phát triển mobile app. Cả hai đều có cộng đồng các developer mạnh mẽ

Nguồn mở, miễn phí và nhanh chóng

React Native và Flutter là các SDK nguồn mở và miễn phí cho phép các developer tạo ra các app tuyệt vời một cách nhanh chóng dựa vào native performance của chúng.

Documentation chi tiết và luôn được cập nhật

Các cộng đồng của cả hai framework này luôn nỗ lực hết sức để liên tục cập nhập documentation mới nhất với các tài liệu tham khảo API và tài nguyên toàn diện.

Hỗ trợ UI và Native Experience tuyệt vời

React Native sử dụng các yếu tố xây dựng UI cơ bản trong Android / iOS để mang lại native experience. Flutter cũng sử dụng các widget để cung cấp native experience đáng chú ý trên platform Android và iOS.

Hot reloading và sửa đổi nhanh

React Native hỗ trợ “Hot reloading” cho phép đồng thời chạy code mới và giữ trạng thái ứng dụng, thay vì phải recompile. Tính năng này làm cho sự phát triển nhanh hơn, tức thì và hiệu quả.

Flutter cũng không hề kém cạnh. “Stateful Hot Reloading” của nó hỗ trợ phản ánh các thay đổi ngay lập tức mà không cần restart hoặc trong trường hợp mất trạng thái ứng dụng.

Chúng ta đã điểm qua sự giống nhau của React Native và Flutter, bây giờ hãy cùng xem qua những khác biệt của chúng trong process, flow, và feature.

React Native vs Flutter

React Native vs Flutter

Dưới đây là bảng so sánh giữa React NativeFlutter:

Tiêu chí React Native Flutter
Ngôn ngữ và công cụ Không cần học ngôn ngữ mới nếu bạn đã biết JavaScript hoặc TypeScript. Tuy nhiên, việc làm quen với các công cụ và thư viện của React Native có thể phức tạp và tốn thời gian. Dart là ngôn ngữ mới, nhưng rất dễ học và thân thiện với nhà phát triển, đặc biệt nếu bạn đã quen với TypeScript, C#, hoặc Kotlin. Quá trình thiết lập và sử dụng công cụ của Flutter đơn giản hơn.
Tính năng React Native yêu cầu sử dụng nhiều thư viện cộng đồng để bổ sung các tính năng như UI, quản lý trạng thái, và localization. Môi trường và công cụ phức tạp hơn, nhưng cộng đồng hỗ trợ lớn. Flutter cung cấp rất nhiều tính năng từ đầu, bao gồm Material Design, Cupertino components, và các công cụ phát triển tiên tiến. Có thể phát triển ứng dụng mà không cần đến thư viện bên thứ ba.
Giao diện người dùng Sử dụng các thành phần UI native của từng nền tảng, điều này có thể dẫn đến sự không nhất quán giữa các nền tảng khác nhau. Giao diện người dùng tùy biến mạnh mẽ nhờ sử dụng CSS. Sử dụng engine đồ họa riêng để vẽ UI, giúp giảm thiểu sự khác biệt giữa các nền tảng. Styling khác biệt với CSS nhưng cung cấp nhiều tùy chọn tùy chỉnh và dễ sử dụng sau khi làm quen.
Hiệu suất Hiệu suất tốt nhưng có thể bị ảnh hưởng khi xử lý các tác vụ phức tạp do phải thông qua JavaScript Bridge. Không thích hợp cho các ứng dụng yêu cầu đồ họa cao. Hiệu suất vượt trội hơn nhờ vào engine riêng, cung cấp trải nghiệm người dùng mượt mà và hỗ trợ tốt cho các animation phức tạp. Tuy nhiên, tiêu thụ bộ nhớ có thể cao hơn so với ứng dụng native.
Công cụ phát triển và trải nghiệm Expo cung cấp nhiều công cụ phát triển mạnh mẽ và tiện lợi như Expo Go để test app trực tiếp mà không cần sideloading. Cộng đồng và hệ sinh thái phong phú với nhiều thư viện hỗ trợ. Tích hợp chặt chẽ với VS Code và có công cụ hot reload mạnh mẽ. Tuy không có dịch vụ tương đương Expo, Flutter vẫn cung cấp các công cụ phát triển tốt và dễ sử dụng.
Trải nghiệm phát triển Có thể gây khó chịu do cần sử dụng nhiều thư viện bên thứ ba và các vấn đề không đồng bộ giữa các nền tảng. Tuy nhiên, cộng đồng lớn giúp giải quyết vấn đề nhanh chóng. Trải nghiệm phát triển mượt mà, ít gặp phải các vấn đề phát sinh. Các công cụ và tính năng sẵn có giúp giảm thiểu thời gian và công sức phát triển.
Document Tài liệu tổng quát, dựa nhiều vào các bộ dev kit bên ngoài. Tài liệu không trực quan bằng Flutter. Tài liệu dễ đọc, chi tiết, có cấu trúc rõ ràng và trực quan hơn.
Mức độ phổ biến Được sử dụng rộng rãi hơn và phổ biến hơn so với Flutter. Nhiều nhà phát triển sử dụng do quen thuộc với JavaScript. Flutter là một framework mới hơn và ít được sử dụng hơn, nhưng đang dần thu hút sự quan tâm của cộng đồng.
Cộng đồng và hỗ trợ Ra mắt dưới dạng mã nguồn mở trên GitHub vào năm 2015, có cộng đồng lớn và nhiều câu hỏi trên Stack Overflow. Flutter là framework mới, cộng đồng nhỏ hơn nhưng đang phát triển nhanh chóng.
Cơ hội nghề nghiệp Sử dụng phổ biến nên cơ hội việc làm nhiều. Cơ hội việc làm hiện tại ít hơn, nhưng có thể tăng trong tương lai.

Bảng trên cung cấp cái nhìn tổng quan về sự khác biệt giữa React Native và Flutter, giúp bạn lựa chọn framework phù hợp dựa trên các tiêu chí như ngôn ngữ lập trình, hiệu suất, cộng đồng hỗ trợ, và cơ hội nghề nghiệp.

Vậy nên chọn React Native hay Flutter cho Mobile App?

Flutter phù hợp với các dự án focus về animation, các layout phức tạp, với thế mạnh sử dụng bộ render tự làm, giao tiếp trực tiếp với GPU và một SDK để viết anim dễ dàng. Cực kỳ phù hợp với các team native (đang có nhu cầu làm thêm các UX có hiệu năng cao vào app native có sẵn). Flutter Developer hiện tại chưa nhiều, sẽ khó tìm người hơn.

React Native phù hợp với các team dùng JS as main language, không có quá nhiều animation phức tạp. RN hiện tại tuyển người khá/rất dễ so với Flutter.

Những điểm tương đồng này cho thấy cả React Native và Flutter đều là những lựa chọn mạnh mẽ và linh hoạt trong việc phát triển ứng dụng di động đa nền tảng. Việc lựa chọn giữa hai framework sẽ phụ thuộc vào nhu cầu cụ thể của dự án và kỹ năng của đội ngũ phát triển.

Không chỉ React Native với Flutter, ngay cả Xamarin chen chân vào cuộc chiến cũng khiến các dev cân nhắc lựa chọn. Vậy dùng Flutter, React Native hay Xamarin phù hợp với dự án, với công ty hay với con đường sự nghiệp của bạn? Không có tốt nhất, chỉ có sự phù hợp nhất mới đem lại hiệu quả.

Xem thêm việc làm IT tại TopDev!

(Nguồn tham khảo: Việt Trần)

Bài viết liên quan:

Bài học về kỹ năng giải quyết vấn đề – Hãy tư duy như một Lập trình viên!

bai-hoc-ve-ky-nang-giai-quyet-van-de-hay-tu-duy-nhu-mot-lap-trinh-vien

Nếu bạn là một người yêu thích lập trình thì không thể không biết đến câu nói sau về kỹ năng mềm lập trình viên:

Mọi người đều nên học lập trình, bởi nó không chỉ dạy bạn code – nó dạy bạn cách tư duy – Steve Jobs”

Có bao giờ bạn tự hỏi rằng làm sao để có thể suy nghĩ như một lập trình viên?  Bất ngờ là, tất cả chỉ xoay quanh câu hỏi: Đâu là hướng giải quyết vấn đề hiệu quả hơn?

Mục đích của tôi khi thực hiện bài viết này là bật mí cho bạn các bí quyết để có thể suy nghĩ và giải quyết vấn đề một cách tốt hơn.

  Những nguyên tắc, định luật của lập trình mà chúng ta nên có sẵn trong đầu
  6 điều tôi vỡ lẻ khi tự học code (P1)

Vì sao điều này lại quan trọng?

Giải quyết vấn đề là một kỹ năng quan trọng.

Tất cả chúng ta đều có vấn đề, từ lớn cho đến nhỏ. Đôi khi cách mà chúng ta giải quyết vấn đề của chính mình khá là … ngẫu nhiên.

Trừ khi bạn đã có một hệ thống rõ ràng hơn thì có lẽ là cách mà bạn “giải quyết” một vấn đề (đây cũng là lộ trình tôi làm theo khi mới bắt đầu viết code ):

  1. Thử một giải pháp nào đó.
  2. Thử một cách khác nếu nó không hiệu quả.
  3. Nếu vẫn không hiệu quả, lặp lại bước 2 cho đến khi may mắn mỉm cười với bạn.

Đôi khi may mắn sẽ đến nhưng thực tế đây  là một cách tồi tệ nhất khi giải quyết một vấn đề, nó khiến bạn lãng phí thời gian của mình.

Theo ý kiến cá nhân của mình, cách tốt nhất để giải quyết vấn đề chính là:

  1. Có một phương pháp cụ thể
  2. Thực hành nó thật nhuần nhuyễn liên tục

Báo cáo Hacker Rank’s 2018 Developer Skill có chỉ ra :

“Kỹ năng giải quyết vấn đề ở ứng viên gần như là một tiêu chuẩn không thể thiếu mà các nhà tuyển dụng tìm kiếm… Nó còn được săn đón hơn cả việc thông thạo các ngôn ngữ lập trình, khả năng fix bug hay thiết kế hệ thống.

Điều này cũng có nghĩa là những kỹ năng mềm như giải quyết vấn đề cũng quan trọng không kém các kỹ năng kỹ thuật cơ bản cho công việc.

Có một khuôn khổ rõ ràng

Để có thể tìm được một khuôn phù hợp với bản thân, tôi đã tham khảo và làm theo lời khuyên từ quyển sách The 4-Hour Chef của Tim Ferriss.

Tôi thật may mắn khi có cơ hội được trò chuyện cùng với hai con người vô cùng đáng ngưỡng mộ  đó là C. Jordan Ball (xếp thứ nhất hoặc thứ hai trong số 65.000 người dùng trên Coderbyte) và V. Anton Spraul (tác giả của Think Like a Programmer: An Introduction to Creative Problem Solving).

Tôi đã l đặt cho cả hai các câu hỏi giống nhau, bạn thử đoán xem câu trả lời là gì? Surprise! Câu trả lời của họ đều khá giống nhau.

“Sai lầm lớn nhất mà tôi thấy ở các lập trình viên là chỉ biết tập trung vào việc học cú pháp (syntax) thay vì học cách giải quyết vấn đề  V. Anton Spraul

Vì thế nếu bạn gặp phải một vấn đề cần giải quyết ở lần tới hãy áp dụng các bước sau nhé:

1/ Hiểu rõ bản chất của sự việc

Bạn cần phải biết chính xác những việc mình đang gặp phải hay những gì được hỏi. Các vấn đề trở nên khó khăn là do bạn không hiểu rõ về chúng.

Vậy làm sao để biết rằng mình đã hiểu rõ một vấn đề? Chính là khi mà bạn có thể giải thích nó một cách đơn giản nhất.

Đa số các lập trình viên đều hiểu  cảm giác khi bản thân bắt đầu giải thích một thứ và ngay lập tức nhìn ra được các lỗ hổng trong logic mà mình chưa bắt gặp trước đây. Đó là lý do tại sao bạn nên viết ra vấn đề của mình, vẽ một sơ đồ, hoặc nói với ai đó về nó ( thậm chí là với một con vịt đồ chơi cũng được).

Richard Feynman từng nói, “Nếu bạn không thể giải thích điều gì đó một cách đơn giản thì có nghĩa là bạn không hiểu nó.”

2/ Lên kế hoạch rõ ràng

Đừng đâm đầu vào giải quyết một vấn đề nào nó một cách may rủi mà không có kế hoạch. Sẽ không ai có thể giúp bạn nếu bạn không lập kế hoạch rõ ràng cho các giải pháp và viết ra chính xác từng bước cần thực hiện.

Trong lập trình, điều có nghĩa là họ dành thời gian để não bộ phân tích vấn đề và xử lý thông tin thay vì bắt đầu hack ngay lập tức.

Để có một kế hoạch hoàn hảo hãy trả lời câu hỏi sau:

“Cho đầu vào X, các bước cần thiết để trả về Y đầu ra là gì?”

3/ Phân chia

Đây là bước quan trọng nhất hãy chú ý thật kỹ nhé!

Đừng cố giải quyết 1 vấn đề to bự! Bạn sẽ vã ra mất.

Bạn sẽ “khóc thét” khi cố gắng giải quyết một vấn đề lớn đấy. Thay vào đó hãy chia nhỏ nó ra thành các vấn đề phụ để có thể giải quyết một các dễ dàng hơn.

Sau đó hãy giải quyết từng vấn đề theo thứ tự ưu tiên từ đơn giản cho đến phức tạp. Đơn giản có nghĩa là bạn có thể giải quyết vấn đề này một mình mà không cần sự trợ giúp hay phụ thuộc vào những người khác.

Khi đã giải quyết các vấn đề phụ hãy kết nối chúng lại với nhau. Congratulations, bạn đã tìm ra cách giải quyết cho vấn đề ban đầu rồi đấy.

Hãy nhớ thật kỹ vì kỹ thuật này chính là nền tảng của quá trình giải quyết vấn đề (Có thể đọc bước này một lần nữa nếu cần thiết).

Theo V. Anton Spraul:

“Nếu tôi có thể dạy cho lập trình viên một  kỹ năng giải quyết vấn đề, thì đó sẽ là làm giảm tính phức tạp của vấn đề”. Ví dụ như bạn là một lập trình viên nhận được yêu cầu viết một chương trình đọc 10 số và tìm ra đâu là con số lớn thứ ba. Đây là một nhiệm vụ khó khăn dành cho một lập trình viên mới vào nghề cho dù nó chỉ yêu cầu cú pháp lập trình cơ bản.

Nếu bạn gặp khó khăn hãy giải quyết vấn đề ở mức độ đơn giản hơn.  Thay vì số thứ ba cao nhất, hãy tìm số cao nhất? Vẫn còn quá khó khăn? vậy kiếm số lớn nhất trong 3 số thì sao? Hãy giảm vấn đề xuống mức mà bạn biết có thể giải quyết. Sau đó, mở rộng vấn đề một chút và viết lại giải pháp cho phù hợp. Tiếp tục cho đến khi bạn quay lại nơi bạn đã bắt đầu.”

Video: Google Update 2019 – Youtube Update 2019

4/ Khi bế tắc nên giải quyết như thế nào?

Đến giờ nếu bạn đang có suy nghĩ  “Hey Richard, nghe có vẻ cool đấy, nhưng nếu tôi vẫn bị bí và thậm chí còn không thể giải quyết được những vấn đề phụ đã chia thì sao ?”

Trước tiên hãy hít một hơi thật sâu. Thứ hai, đây là điều vô cùng bình thường mà ai cũng sẽ mắc phải nên đừng lo lắng nhé!

Điều làm nên khác biệt giữa người lập trình viên và người giải quyết vấn đề giỏi nằm ở việc họ sẽ cảm thấy thắc mắc hơn về lỗi chứ không bị nản chí.

Thực tế, đây là 3 điều bạn cần phải thử qua:

  • Gỡ lỗi: Kiểm tra lại lần lượt các giải pháp của bạn để tìm ra nơi mình đã đi sai hướng. Các lập trình viên gọi đó là debug

“Nghệ thuật debug chính là tìm ra những gì bạn đã nói với chương trình của mình để hơn là những gì bạn đã nói nó làm” – Andrew Singer

  • Tiếp cận lại vấn đề: Nhìn vào vấn đề từ một khía cạnh khác. Bạn có thể tiếp cận điều gì một cách tổng quát hơn không? Một cách đánh giá lại khác là bắt đầu lại. Hãy xóa mọi thứ và bắt đầu lại ở khía cạnh mới. Tôi nghiêm túc đấy! Bạn sẽ bất ngờ khi thấy được mức độ hiệu quả của việc này.

“Đôi khi chúng ta chỉ tập trung vào các chi tiết của một vấn đề mà quên đi các nguyên tắc chung có thể giải quyết chúng ở cấp độ tổng quát hơn.

Một ví dụ cơ bản cho vấn đề này chính là tập hợp các số nguyên liên tiếp, 1 + 2 + 3 + … +n, mà Gauss từ rất trẻ đã nhận ra từ rất sớm đó chỉ đơn giản là n (n + 1) / 2, tránh được việc phải nỗ lực làm thêm.” C. Jordan Ball

  • Nghiên cứu: Đây chính là lúc tỏa sáng của Google. Dù bạn có vấn đề gì đi nữa, ai đó có thể đã giải quyết nó, vì vậy hãy tìm người / giải pháp đó. Thực tế, hãy làm điều này ngay cả khi bạn đã giải quyết được vấn đề bởi vì bạn có thể học được rất nhiều từ các giải pháp của người khác.

Đừng tìm giải pháp cho một vấn đề lớn hãy tìm kiếm giải pháp cho những vấn đề phụ. Vì sao nên làm như vậy? Bởi vì bạn sẽ gặp phải khó khăn mà không học được gì. Nếu bạn không học được gì, thì bạn đang lãng phí thời gian của mình.

Thực hành

Bạn đừng hy vọng rằng mọi thứ sẽ trở nên tuyệt vời chỉ sau một tuần. Nếu bạn muốn trở thành một “bậc thầy” trong việc giải quyết tốt các vấn đề hãy thực hành giải quyết nhiều vấn đề. Sẽ chỉ còn là vấn đề thời gian đến khi bạn gặp phải một vấn đề và tự động nghĩ rằng “cái này chỉ cần giải quyết bằng cách <cách thức>.

Làm sao để thực hành? Cờ vua, các vấn đề toán học, sudoku, trò chơi điện tử, cryptokitties… có rất nhiều sự lựa chọn dành cho bạn.

Đơn giản là bạn chỉ việc ngồi chơi trò chơi điện tử? Dĩ nhiên là không. Những gì bạn nên làm là tìm một lối thoát để thực hành giải quyết nhiều vấn đề vi mô, lý tưởng nhất là những hoạt động mà bạn thích. Giống như tôi thích những thử thách code, mỗi ngày tôi cố gắng giải quyết ít nhất một thử thách (thường là trên Coderbyte).

Kết luận

Giờ đây, bạn đã biết rõ hơn ý nghĩa của việc “suy nghĩ và giải quyết vấn đề như một Lập Trình Viên.” Bạn cũng biết rằng giải quyết vấn đề là một kỹ năng đáng kinh ngạc cần được trau dồi. Và điều tuyệt vời hơn nữa đó là bạn cũng biết phải làm gì để thực hành kỹ năng giải quyết vấn đề của mình rồi.

“Ngay khi bạn nghĩ rằng bạn đã thành công vượt qua một chướng ngại vật, thì một điều khác lại xuất hiện. Nhưng điều đó lại mang đến điều thú vị cho cuộc sống.

Cuộc sống là một quá trình liên tục vượt khó vượt qua những trở ngại này – một loạt hàng rào kiên cố mà chúng ta phải vượt qua.

Mỗi lần, bạn sẽ học được điều gì đó.

Mỗi lần, bạn sẽ phát triển sức mạnh, trí tuệ và quan điểm.

Mỗi lần, một chút nữa của cuộc thi sẽ biến mất. Cho đến khi tất cả những gì còn lại là bạn: phiên bản tốt nhất của bạn.” – Ryan Holiday (The Obstacle is the Way)

Bây giờ hãy đi giải quyết vấn đề của mình đi nào!

Và chúc bạn may mắn.

TopDev via Medium

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev ngay!

TOPICA – vị thế hàng đầu, nơi dừng chân đáng mơ ước của các chuyên gia IT

Tổ hợp Công nghệ Giáo dục TOPICA là đơn vị đào tạo trực tuyến hàng đầu Đông Nam Á, là tổ chức Việt Nam đầu tiên xuất khẩu công nghệ giáo dục ra nước ngoài. Với những lợi thế trong công nghệ giáo dục hiện đại và dẫn đầu xu thế phát triển nguồn nhân lực, TOPICA luôn đi đầu trong việc đào tạo và là sân chơi đầy tiềm năng – nơi tài năng được khai sáng, phá vỡ mọi giới hạn dành cho dân IT.

TOPICA – những con số biết nói, khẳng định vị thế hàng đầu

Mang sứ mệnh chiếm lĩnh thị trường công nghệ giáo dục trực tuyến tại Đông Nam Á, TOPICA không ngừng nỗ lực và chinh phục nhiều thị trường trong khu vực:

  • Với hơn 1400+ nhân viên toàn thời gian, 1000+ cộng tác viên và 1000+ giảng viên bán thời gian ở các văn phòng Manila, Singapore, Bangkok, Hà Nội, TP. HCM và Đà Nẵng;
  • TOPICA UNI là một sản phẩm của Tổ hợp công nghệ giáo dục TOPICA, cung cấp hạ tầng công nghệ và dịch vụ cho 16 trường Đại học ở Việt Nam, Mỹ và Philippines;
  • TOPICA Native triển khai chương trình luyện nói tiếng Anh trực tuyến cho học viên tại Thái Lan, Indonesia và Việt Nam, và là đơn vị đầu tiên trên thế giới phát triển ứng dụng luyện nói qua Google Glass;
  • TOPICA Founder Institute là vườn ươm khởi nghiệp duy nhất tại Việt Nam đã có các startup nhận đầu tư tổng cộng gần 10 triệu USD.

Tuy nhiên các con số này vẫn chưa là tất cả, TOPICA vẫn đang tiếp tục khẳng định vị thế và mở rộng đội ngũ nhân sự, đặc biệt là chiêu mộ các nhân tài trong lĩnh vực công nghệ thông tin – đội ngũ nắm giữ vai trò quan trọng trong bộ máy vận hành của TOPICA.

TOPICA và hành trình nuôi dưỡng tài năng từ giấc mơ công nghệ 

Bắt đầu hành trình từ con số 0 cho đến sự vươn mình lớn mạnh khắp Đông Nam Á – TOPICA chứng minh công nghệ làm nên mọi thứ và sẵn sàng tạo mọi điều kiện để ươm mầm các tài năng IT. Các ứng viên đến với TOPICA không phải đơn thuần chỉ là để tìm thấy một sự nghiệp ổn định, mà đó còn là việc khẳng định bản thân, được công nhận và làm chủ các sản phẩm do chính mình “đẻ” ra. Các thách thức tại TOPICA luôn đặt ra không ngừng, nhưng đây lại là nền tảng để mọi ứng viên được vượt qua chính mình, dám lên tiếng và chinh phục những đam mê, hoài bão. Khi giới hạn bị phá vỡ, đó cũng chính là lúc Developer tỏa sáng thành ngôi sao của mỗi dự án.

25 Master Code hiện đang là chương trình tuyển dụng chuyên gia IT cao cấp của Tổ hợp Công nghệ Giáo dục Topica. Với cơ hội được dùng công nghệ mới nhất của thế giới để phục vụ mục tiêu “Triệu người nâng trí tuệ”, TOPICA trở thành “vùng đất lành” để nuôi dưỡng các tài năng trẻ trở thành chuyên gia IT. Chưa dừng lại ở đó, TOPICA còn mang đến những phúc lợi mà bất cứ Developer nào cũng khao khát. Quan trọng hơn nữa là tại TOPICA không cần làm sếp, vẫn thu nhập cao!

Từ ngay ngày đầu, ứng viên đã có thể lựa chọn tham gia ngay các dự án trọng điểm cấp tổ hợp như dự án Ecosystem xây dựng hệ sinh thái giáo dục trên nền tảng công nghệ mà core value là AI, machine learning – ứng dụng công nghệ 4.0 tiên tiến nhất cùng nhiều platform con để xoáy dữ liệu người dùng. Bên cạnh đó, ứng viên còn được thỏa sức chinh phục các dự án tập trung những chuyên gia, quản lý hàng đầu Tổ hợp cũng như lựa chọn core team với nhiều chuyên gia, quản lý IT khủng để đầu quân.

Đãi ngộ cực đỉnh từ chương trình tuyển dụng Master Code

Trong chương trình tuyển dụng Master Code của TOPICA, các ứng viên sẽ được trải nghiệm nhiều thách thức thú vị, bao gồm các hoạt động:

  • Tham gia phát triển hệ thống phần mềm lớn, trọng điểm cùng các software architect của tổ hợp;
  • Phát triển sản phẩm/module mới hoạt động ổn định;
  • Chịu trách nhiệm về chất lượng sản phẩm và chất lượng code;
  • Tuân thủ quy trình phát triển sản phẩm theo mô hình Agile, Scrum;
  • Đào tạo, hướng dẫn hoặc là techleader các thành viên khác trong team.

Và đi kèm mức lương hấp dẫn cùng với nhiều phúc lợi:

  • Vươn lên vị trí Senior, thu nhập như mơ lên đến $2,000 mỗi tháng;
  • Cơ chế thưởng hoành tráng, lên “vèo vèo” 2 chức trong 6 tháng liền;
  • Tự động tăng lương 2 lần trong năm, thoải mái chi tiêu, được nhiều hơn mất;
  • Được quyền lựa chọn làm các công nghệ Java, .NET, PHP, Ruby, Python… và các công nghệ trending (AI, Bigdata, ML, IOT, Blockchain…);
  • Cân bằng cuộc sống và công việc với kì nghỉ “xả láng” 6~10 ngày sau mỗi 3 tháng làm việc;
  • “Đồng nghiệp mình là một gia đình” với teambuilding, dã ngoại, thể thao, tiệc tùng linh đình hằng tháng.

E-Learning đang được xem là xu thế giáo dục tương lai của thế giới, và đây cũng chính là thị trường “màu mỡ” để TOPICA tiếp tục khai thác với nhiều giấc mơ lớn lao hơn. Và để đáp ứng được tốc độ phát triển thần tốc, TOPICA luôn mong muốn tìm kiếm và bồi dưỡng nguồn nhân lực trẻ, đam mê công nghệ, có tố chất để đảm đương các vị trí software architect hoặc CTO trong tương lai.

Nếu bạn ngại sự thay đổi, lo sợ thách thức quá lớn khiến bạn không chinh phục nổi thì TOPICA chưa phải là nơi dành cho bạn. Nhưng nếu bạn tự tin với bản lĩnh mình có, TOPICA chính là nơi để bạn viết nên câu chuyện thành công của riêng mình tại thị trường quốc tế.


  • Thông tin về chương trình tuyển dụng Master Code: https://topdev.vn/s/wPvOOYRS
  • Khám phá thêm các vị trí hấp dẫn khác tại TOPICA

Triển khai CI/CD với Gitlab

CI/CD

Cũng hơn một tháng kể từ bài viết gần nhất, nay mới có thời gian ngồi viết lách tiếp. Dạo gần đây thường release các dự án outsource nên cũng hay làm documentation cũng như  mở các dự án mới nên việc setup CI/CD thường xuyên hơn và chân tay hơn.

Thấy các kiến thức này hay nên hôm nay mình sẽ chia sẻ mọi người quy trình CI/CD bên mình áp dụng cho “đại dự án” Teamcrop cũng như các dự án outsourcing mà Moout thực hiện.

CI/CD là gì?

CI/CD là một bộ đôi công việc, bao gồm CI (Continuous Integration)CD (Continuous Delivery), ý nói là quá trình tích hợp (integration) thường xuyên, nhanh chóng hơn khi code cũng như thường xuyên cập nhật phiên bản mới (delivery).

Tại sao phải quan tâm đến CI/CD?

Ngày nay, với xu hướng agile/lean dẫn đến việc phát triển tính năng là điều bình thường, quan trọng phải là thần thái, ý lộn, quan trọng là phải nhanh. Nếu một tính năng mà mất 2, 3 tháng mới release thì dẫn đến nhiều hệ lụy như làm không phù hợp nhu cầu khách hàng, hoặc đối thủ đã ra mắt trước đó, mất đi cái lợi thế dẫn đầu.

Do đó, việc làm ra một sản phẩm, tính năng đòi hỏi thần tốc là ưu tiên số một hiện nay.

Bên cạnh đó, để nhanh chóng ra mắt một tính năng, phiên bản mới nếu theo cách cổ điển sẽ mất nhiều thời gian bởi công việc chân tay khá nhiều và mỗi lần release cũng huy động một cơ số người không nhỏ để cập nhật một thay đổi dù là nhỏ nhất.

Bởi vậy, xu hướng CI/CD giúp cung cấp các framework, workflow giúp tiết kiệm thời gian, nguồn lực của quá trình release (delivery).

tuyển it

  Một vài câu hỏi thông dụng về Git thường gặp

Quy trình CI/CD tham khảo

Có rất nhiều quy trình, công cụ khác nhau để ứng dụng CI/CD vào dự án. Nội dung của bài viết này dựa trên kinh nghiệm cho các dự án của mình triển khai cũng như đặc thù là các hệ thống web, và viết bằng PHP (PHP hoặc Python hoặc abc…không quá quan trọng trong ngữ cảnh chia sẻ về CI/CD).

Dưới đây là các bước thông thường của quá trình release tính năng trong một dự án thuộc hệ thống Teamcrop.

– Bước 1: [Manual] Khởi tạo repository và có branch default là master và dev. Cài đặt trên Gitlab 9.
– Bước 2: [Manual] Trừ owner ra, thì các coder sẽ push code tính năng lên branch dev
– Bước 3: [Auto] Hệ thống tự động thực hiện test source code, nếu PASS thì sẽ deploy tự động (rsync) code lên server beta.
– Bước 4: [Manual] Tester/QA sẽ vào hệ thống beta để làm UAT (User Acceptance Testing) và confirm là mọi thứ OK.
– Bước 5: [Manual] Coder hoặc owner sẽ vào tạo Merge Request, và merge từ branch dev sang branch master.
– Bước 6: [Manual] Owner sẽ accept merge request.
– Bước 7: [Auto] Hệ thống sẽ tự động thực hiện test source code, nếu PASS sẽ enable tính năng cho phép deploy lên production server.
– Bước 8: [Manual] Owner review là merge request OK, test OK. Tiến hành nhấn nút để deploy các thay đổi lên môi trường production.
– Bước 9: [Manual] Tester/QA sẽ vào hệ thống production để làm UAT và confirm mọi thứ OK. Nếu không OK, Owner có thể nhấn nút Deploy phiên bản master trước đó để rollback hệ thống về trạng thái stable trước đó.
– Bước 10: [Manual] Thắp nhang và hy vọng khách hàng không chửi rủa hoặc email complain.

Áp dụng CI/CD với Gitlab 9

Trong khuôn khổ bài viết này, mình sẽ hướng dẫn mọi người cài đặt Gitlab 9 để quản lý source code, và trên công nghệ Git. Đòi hỏi của tất cả setup này là trên server đã cài Docker, nếu các bạn chưa có docker trên server thì có thể tham khảo các bài viết về docker trên bloghoctap cũng như tìm kiếm thêm trên google.

Tại sao phải là Gitlab 9?

Đây là câu hỏi hay, bởi vì trước đó bên mình sử dụng Gitlab 8, tuy nhiên, do các hạn chế về UI/UX cũng như không tích hợp ngon lành vụ CI/CD nên khi bản 9 ra mắt, mình đã thử sử dụng và thấy bản 9 phù hợp hơn cho workflow nên quyết định dọn dẹp sang Gitlab 9.

Cài đặt Gitlab 9 với docker

Bạn chạy câu lệnh sau để tạo một container chứa Gitlab 9.

docker run --detach \
--hostname code.teamcrop.com \
--publish 8080:80 --publish 2222:22 \
--name gitlab9 \
--restart=always \
--volume /gitlab9/config:/etc/gitlab \
--volume /gitlab9/logs:/var/log/gitlab \
--volume /gitlab9/data:/var/opt/gitlab \
gitlab/gitlab-ce:9.0.3-ce.0

Nếu ai từng dùng docker sẽ hiểu ý nghĩa câu lệnh trên. Đơn giản là mình sử dụng image gitlab/gitlab-ce:9.0.3-ce.0. Có mount ra 3 thư mục bên ngoài máy ở thục mục /gitlab9 để lỡ có chuyện gì chỉ cần stop, remove container, khi chạy docker run lại thì không bị mất dữ liệu, source code.

Câu lệnh trên có map 2 port là 8080 và 2222 tương ứng tới 2 port 80 và 22 trong container. Mình mapping port vậy bởi vì trên server dev này có rất nhiều service khác và đã chiếm port 80 và 22 (ssh ^^!).

Sau khi bạn start container thì có thể truy cập vào từ ip hoặc domain (mà bạn đã trỏ DNS), ví dụ: http://code.teamcrop.com:8080 là có thể vào gitlab 9, tài khoản mặc định là `root`.

Không có gì cao siêu ở cài đặt này, có thể tham khảo thêm ở trang chủ của Gitlab.com nhé.

Quản lý sourcecode bằng Gitlab

Về phần này thì mình không cần nói dài dòng, cũng như một hệ thống git thông thường (như github..), bạn có thể tìm hiểu thêm về git và Gitlab để team có thể cùng làm việc và quản lý sourcecode trên Gitlab.

CI/CD với Gitlab CI

Thông thường, các hệ thống quản lý sourcecode không kèm theo cơ chế CI/CD. Nếu bạn muốn triển khai thì buộc phải liên kết đến repository, phân quyền đủ kiểu để hệ thống đó có thể lấy source code từ respository. Trước đây bên mình sử dụng Jenkins cho việc này.

Tuy nhiên, từ khi Gitlab ra mắt tính năng Gitlab CI, kèm theo sự chậm chạp, rắc rối và rề rề của Jenkins thì mình quyết định chia tay với Jenkins và đến với Gitlab CI luôn, và quả là một bộ đôi hoàn hảo. Code để ở Gitlab, rồi trong đó có cho cài đặt CI/CD để test và deploy code tự động.

Cũng như một số bạn mới lần đầu tiếp xúc với Gitlab CI, mình đã từng thấy nó khó hiểu và cao siêu vì setup tùm lum. Rồi setup xong lại không biết nó chạy thế nào, cơ chế deploy source code ra sao.

Tuy nhiên, sau một vài “va chạm” đầy mồ hôi và nước mắt thì cũng nắm và hiểu được cách Gitlab CI vận hành, và nay chia sẻ cho mọi người để vận dụng cho workflow của mình.

Để dùng được Gitlab CI thì bạn cần có 2 thành phần sau: file `.gitlab-ci.yml` nằm ở thư mục gốc của dự án và Gitlab Runner.

File .gitlab-ci.yml là gì?

Mặc định Gitlab không có cơ chế nào về CI cho dự án của bạn, chỉ khi nào dự án của bạn có file .gitlab-ci.yml nằm ở thư mục gốc thì Gitlab mới nhận dạng được dự án của bạn muốn áp dụng Gitlab CI.

File này có định dạng và cần hợp lệ thì mới có thể hoạt động được, không thì khi bạn push code lên thì Gitlab sẽ báo lỗi file định dạng nội dung của file cấu hình không hợp lệ. Tham khảo cú pháp của cấu hình này tại https://docs.gitlab.com/ce/ci/yaml/

Trong file này có gì? File này có một số section để khai báo như trước khi chạy test thì làm gì, khi test thì thực hiện lệnh gì (vd chạy linter check cú pháp, chạy PHPUnit test…), test xong rồi thì thực hiện deploy đi đâu (beta, production..) với câu lệnh gì (vd: rsync..). Tùy đặc thù ngôn ngữ lập trình, cách đóng gói của dự án mà sẽ có các lệnh tương ứng thực hiện.

Tới đây các bạn sẽ có câu hỏi là vậy cái gì sẽ chạy, thực thi các câu lệnh, chỉ dẫn trong file config trên? Hay là Gitlab Server sẽ chạy. Nếu là Gitlab server chạy thì nếu dự án mình thực hiện những lệnh không có thì sao, vì gitlab server thì cũng chỉ chứa gitlab và các program cho nó chứ đâu thể cài sẵn các program?

Bên cạnh đó, mỗi lần chạy thì các thông tin liên quan đến file tạm có bị reset lại hay không?

Nếu bạn đi đến đây thì bạn đã đoán được là thực ra “cái thứ” thực thi các chỉ dẫn, câu lệnh trong file .gitlab-ci.yml không phải là Gitlab Server (là cái container đang chạy gitlab 9 mình start ở trên), mà đó chính là Gitlab Runner. Wow! Welcome to matrix!

Gitlab Runner là gì?

Gitlab Runner là thành phần cực kỳ quan trọng trong workflow Gitlab CI. Nếu không có Runner thì sẽ không có lệnh test, deploy nào được thực thi. Runner có nhiều loại, phân biệt dựa vào cái gọi là executor.

Khi khởi tạo runner, bạn sẽ phải chọn nó là loại executor nào, và nó sẽ quyết định môi trường thực thi các câu lệnh trong file config ở trên. Bạn có thể tham khảo link https://docs.gitlab.com/runner/executors/ để biết sự khác nhau của các executor cũng như cách cài đặt, cấu hình chúng.

Do đặc thù hệ thống đã có docker, nên bên mình chỉ sử dụng executor loại Docker mà thôi. Và bên dưới là câu lệnh docker để start một Gitlab Runner.

docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest

Ở đây bạn sẽ thấy container này mount thư mục config ra ngoài, bởi vì mình muốn các cấu hình của runner không bị mất khi stop/remove container. Chỉ cần start lại là giữ được cấu hình.

Ngoài ra, nó còn mount docker.sock vào bên trong container, đây là cách để executor loại docker có thể tận dụng lệnh docker bên ngoài host để thực hiện lệnh tạo container phụ trong quá trình runner chạy (test, deploy).

Start container lên chỉ là bước đầu, bởi vì lưu ý là tới thời điểm này, Runner này không có liên quan gì đến Gitlab server của chúng ta. Cần một bước link lại (gọi là register) runner này vào trong Gitlab server để mình có thể cho phép các dự án dùng runner trong quá trình CI/CD.

Xem link này https://docs.gitlab.com/runner/register/index.html để biết cách register runner này vào Gitlab Server.

Dưới đây là hình ảnh tham khảo bạn có thể dùng trong quá trình register 1 runner. Có 2 thông tin quan trọng là 1 cái URL và một random token. Và cái URL đặc biệt lưu ý là thường thêm /ci sau domain. Ví dụ ở trường hợp của mình setup là http://code.teamcrop.com/ci

lập trình web

Sau khi Runner đã được gán vào Gitlab Server, bạn có thể enable runner này cho một hoặc nhiều dự án trong Gitlab. Hình bên dưới minh họa việc gán Runner vào dự án trong phần cài đặt Pipeline của Gitlab 9.

tuyển it

Đến đây hầu như đã cấu hình xong. Dự án đã kích hoạt 1 runner, và dự án đã có file .gitlab-ci.yml. Từ bây giờ, mỗi lần code được đưa lên thì runner sẽ thực thi test cũng như deploy dựa trên các câu lệnh được khai báo trong file cấu hình.

Khai báo biến để dùng trong các câu lệnh

Trong một số trường hợp, bạn có thể khai báo biến để có thể dùng trong các lệnh của runner. Có 3 nơi có thể cấu hình biến:
1. Cấu hình ngay bên trong file .gitlab-ci.yml
2. Cấu hình trong dự án. Vào Settings // CI/CD Pipelines, phần Secret variables (xem hình)

CI/CD

3. Cấu hình bên trong file config của runner. Bạn có nhớ lúc mình khởi tạo runner, có chỉ định một thư mục chứa config không, đây chính là nơi cấu hình chung cho runner này. Trong thư mục này sẽ có file là config.toml.

Và bạn có thể gán biến trong cấu hình của từng runner. Cấu hình ở đây có một lợi thế là cứ runner này chạy sẽ nhận được biến đã cấu hình. Bạn không cần phải cấu hình nhiều lần ở từng dự án.

CI/CD

Ví dụ về một file .gitlab-ci.yml

Bên dưới là file cấu hình của một dự án trong hệ thống Microservices thuộc Teamcrop:

before_script:

- export "PATH=$PATH:/vendor/bin"
# Install ssh-agent if not already installed, it is required by Docker.
# (change apt-get to yum if you use a CentOS-based image)
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'

# Run ssh-agent (inside the build environment)
- eval $(ssh-agent -s)

# For Docker builds disable host key checking. Be aware that by adding that
# you are suspectible to man-in-the-middle attacks.
# WARNING: Use this only with the Docker executor, if you use it with shell
# you will overwrite your user's SSH config.
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

variables:

# Change this base on project name
DEPLOYMENT_FOLDER_NAME: "tc-file"

test:

image: voduytuan/gitlab-php-ci
script:
- bash ./ci/phplint.sh ./src/
- phpcs --config-set ignore_errors_on_exit 1
- phpcs --config-set ignore_warnings_on_exit 1
- phpcs --standard=PSR2 --ignore=./src/index.php --error-severity=1 --warning-severity=8 -w --colors ./src/
- phpunit --configuration ci/phpunit.xml

dev:

image: voduytuan/gitlab-php-ci
stage: deploy
script:
- ssh-add <(echo "$DEPLOYER_BETA_KEY")
- echo "Deploy to $DEPLOYMENT_FOLDER_NAME"
- rsync -avuz -e "ssh -p 22" --exclude-from="ci/deploy_exclude.txt" $CI_PROJECT_DIR/src/ $DEPLOYER_BETA_USER@$DEPLOYER_BETA_IP:/teamcrop/services/$DEPLOYMENT_FOLDER_NAME/src
only:
- dev

production:

image: voduytuan/gitlab-php-ci
stage: deploy
script:
- ssh-add <(echo "$DEPLOYER_PRODUCTION_KEY")
- echo "Deploy to $DEPLOYMENT_FOLDER_NAME"
- rsync -avuz -e "ssh -p 22" --exclude-from="ci/deploy_exclude.txt" $CI_PROJECT_DIR/src/ $DEPLOYER_PRODUCTION_USER@$DEPLOYER_PRODUCTION_IP:/teamcrop/services/$DEPLOYMENT_FOLDER_NAME/src
only:
- master
when: manual

Trong ví dụ trên, phần test bên mình làm 3 việc:
– Chạy linter để đảm bảo sourcecode không bị lỗi cú pháp (phplint)
– Kiểm tra source code có theo chuẩn PSR2 hay không.
– Chạy PHPUnit

Còn về phần deploy thì có cấu hình 2 task là deploy dev và production. Ở task dev thì auto và lấy code từ branch dev. CÒn task production deploy từ branch master, tuy nhiên, có chế độ deploy manual, tức là nhấn thì mới deploy.

CI/CD

Về phần deploy source code thì sử dụng rsync để đẩy code từ repo sang server. Bạn sẽ thấy cú pháp giống nhau, chỉ khác là cấu hình đẩy đi đâu, với user nào và private key nào.

Do đặc thù của commandline nên sử dụng privatekey để đồng bộ code thông qua rsync. Do đó, trong project mình có cấu hình privatekey của user. Và bên server nhận (beta, production) mình đã đưa public key vào file authorized_keys.

Bạn có thể tìm hiểu thêm về setup và generate cặp public/private key cho user deploy để hỗ trợ quá trình này tại link https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys–2.

Hay ngắn gọn là thực hiện câu lệnh “ssh-keygen -t rsa -C “youremail@gmail.com” -b 4096″, nhập vài thông tin là bạn đã có public key (id_rsa.pub) để đem bỏ lên server (beta, production) và private key (id_rsa) đem bỏ vào setting biến môi trường.

Dựa trên những kinh nghiệm CI/CD cho hệ thống Teamcrop.com theo mô hình microservice với hơn 40 repository lớn nhỏ, hy vọng bài viết này sẽ giúp được cho quá trình setup CI/CD cho hệ thống của bạn, cũng như tăng tốc quá trình phát triển dự án. Nếu thấy bài viết hay và hữu ích, hãy chia sẻ cho các anh em khác để cùng trao đổi và giao lưu.

TopDev via Võ Duy Tuấn

Có thể bạn muốn xem thêm:

Xem thêm Top Việc làm Developer trên TopDev

CSS Framework có thật sự cần thiết như chúng ta nghĩ?

Tác giả: Sarthak Sharma

Đã có một thời gian khi ai đó hỏi “Bootstrap là gì?” Chúng ta đều sẽ trả lời rằng đó là “một điều kỳ diệu”. Thời điểm đó đã qua, giờ đây chúng ta đã quá hiểu và biết quá rõ những khả năng cũng như giới hạn của Bootstrap, cùng với việc sử dụng các CSS Framework trở nên thông dụng trong toàn ngành vì chúng tiết kiệm rất nhiều thời gian. Nhưng có một câu hỏi được đặt ra đó chính là “Liệu chúng ta có có thật sự cần CSS Framework?”. Bài viết này sẽ nếu ra những lý do bạn không cần CSS Framework.

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

  5 điều phiền toái nhất của CSS
  CSS trong JavaScript: Công cụ không thể thiếu cho component-based styling

Chưa tận dụng hết CSS

Có khoảng thời gian mà tất cả những gì chúng ta cần làm đó là thêm  bootstrap.min.css và BOOM – phiên bản production của ứng dụng đã sẵn sàng… hoặc chúng ta nghĩ rằng nó đã sẵn sàng. Vì thật ra thì nó không đơn giản như vậy.

CSS Framework có thật sự cần thiết như chúng ta nghĩ?

Cùng xem qua ví dụ từ trang web này nhé. Họ đang sử dụng Bootstrap cho landing page của mình. Có thể thấy nó đang được tối ưu hoá dung lượng nhưng điểm đặc biệt ở đây chính là có hơn 90% CSS Framework không được sử dụng tới. Chỉ cần sử dụng công cụ coverage ở Chrome là bạn có thể kiểm tra bất kỳ trang web nào bằng cách bấm cmd + shift + p và gõ “coverage”.
Đương nhiên Bootstrap có các công cụ như Customize and Download cho phép bạn lựa chọn các thành phần và giảm kích thước của tệp đã tải xuống. Tuy nhiên vẫn còn rất nhiều code không thể sử dụng được. Bạn có thể xem buổi nói chuyện tuyệt vời của Addy Osmani về chủ đề này:

Small Projects với Big Projects

Điều gì khiến cho Bootstrap trở nên phổ biến:

  • Giúp cho các thiết kế thân thiện với điện thoại di động.
  • Giảm thời gian phát triển một dự án lớn.

Vì vậy đừng lo lắng khi bạn đang làm việc trong một big project mà không có kỹ năng của lập trình viên Front-end, CSS Framework sẽ giúp bạn. Nhưng bạn có thực sự cần CSS Framework cho các project nhỏ? Tôi nghĩ là không đâu. Khi tôi tạo ra Dev10, tôi đã không sử dụng bất kỳ framework bên ngoài nào và cho thấy sự khác biệt.

CSS Framework có thật sự cần thiết như chúng ta nghĩ?

Điểm quan trọng ở đây chính là bạn phải đánh giá phạm vi của dự án một cách khôn ngoan. Nếu bạn không có quá nhiều thành phần và trang UI trong ứng dụng của mình thì bạn không cần đến framework.

Tối Ưu Front-end Để Web Của Bạn Load Dưới 5 Giây

Cách nào giúp thay thế các framework trong các project nhỏ?

Việc sử dụng CSS vanila để tạo nên các thiết kế thân thiện với các thiết bị di động không chỉ khả thi, mà nó còn dễ hơn nhiều so với việc sử dụng các framework. Đây là hai thuộc tính CSS rất mạnh và hữu ích.

1/ Flex

Kiểm tra pen này. Chỉ cần sử dụng vào dòng code bạn đã có thể tạo ra các trang responsive tuyệt vời giống như thế.

CSS Framework có thật sự cần thiết như chúng ta nghĩ?

Vì thế hãy dành thời gian để tìm hiểu về nó. Đây là một số nguồn có thể giúp bạn:

2/ Grid

Điều bạn cần học hỏi chính là hãy mang phần CSS grid đơn giản từ các framework mà bạn hay dùng và để vào các steroid. Nếu bạn là một người từng chỉ sử dụng Bootstrap từ grid system, hãy sử dụng grid  và tạo ra bố cục tùy chỉnh của chính mình.

3/ Sử dung các đoạn code cho các UI component

Bạn chỉ cần truy cập Codepen nếu như đang băn khoăn và cần thêm cảm hứng cho các yếu tố UI giống như các button và navbar. Đây là một cộng đồng tuyệt vời giúp bạn có thể tìm thấy hằng trăm pen để trợ giúp bạn. Đây là một số nguồn vô cùng hữu ích:

Nếu vẫn cảm thấy khó khăn trong việc tìm CSS cho một số thành phần UI hãy sử dụng các thành phần Inspect cũ của mình.

4/ Sử dụng đoạn code Animation

Thông tin thú vị: Tôi đã ngừng viết bài này vào ngày 21/01 vì bài viết này đã mang đến cho tôi những ý tưởng và cảm hứng để làm việc trên Animatopy. Nếu bạn vẫn còn nhớ công cụ tuyệt vời animate.css nhưng mặt hạn chế duy nhất của nó là khi muốn sử dụng một vài hình ảnh động bạn vẫn phải bao gồm CSS hoàn chỉnh.

Điều này hoàn toàn không cần thiết và khiến tôi khó chịu, vì thế tôi đã tạo nên Animatopy. Bạn chỉ cần sao chép đoạn code mà không cần thiết phải download Animate.css.

CSS Framework có thật sự cần thiết như chúng ta nghĩ?

Kết luận/ Tl; dr

Đây chính là “quy tắc vàng” nếu đó là một project nhỏ hãy giữ nó và đừng sử dụng các framework. Các tệp với kích thước lớn duy nhất là hình ảnh và bạn cần tối ưu hóa nó chứ không phải CSS

Vậy còn các Big Project thì sao?

Điều này sẽ vô cùng dễ dàng nếu bạn chỉ mới bắt đầu với một project mới. Nhưng nếu project lớn của bạn có sẵn và đang chạy, quá trình chuyển đổi này chỉ thành công khi nó được lên kế hoạch một cách hoàn hảo và thảo luận kỹ với các thành viên trong team của mình. Dưới đây là một vài mẹo để tối ưu hóa các project lớn.

1/ Loại bỏ CSS không sử dụng khỏi dự án

Nhờ vào cộng đồng Javascript tuyệt vời mà chúng ta có các công cụ vô cùng hữu ích để tối ưu hóa CSS. Purifycss là một công cụ tuyệt vời mà bạn có thể sử dụng cho project lớn của mình. Nó có sẵn trong:

2/ Sử dụng tất cả Minify/Uglify

Có vô số cách để giảm thiểu kích thước CSS, một cách rõ ràng nhất đó là minify chúng. Đã có rất nhiều bài viết nói về điều này nhưng bài viết dưới đây là một bài tuyệt vời để tiết kiệm thời gian của bạn

3/ Tạo CSS wiki hay  Documentation (nếu bỏ các framework)

Nếu bạn đã quyết tâm “chia tay” các framework hoàn toàn thì hãy tận dụng những điều tốt nhất từ framework, các documentation được viết tốt. Bằng cách này, lập trình viên có thể dễ dàng sao chép và dán các đoạn code để tiết kiệm thời gian. Đây chính là cách giúp bạn và đồng đội của mình tiết kiệm được thời gian và tránh được các lỗi từ các lập trình viên khác. Tất nhiên nơi tốt nhất để bắt đầu là các documentation từ các framework này.

Kết luận:

Việc sử dụng các framework hay không hoàn toàn phụ thuộc vào quyết định của bạn. Yếu tố quan trọng nhất chính là tận dụng tối đa những gì tốt nhất của chúng một cách thiết thực và kiểm tra các thuộc tính mới để thay thế các thuộc tính cũ.

Bài viết này chỉ mang tính chất chủ quan để giúp bạn suy nghĩ nhiều hơn về vấn đề này. Đừng ngại chia sẻ những bí quyết cũng như các mẹo hay đề nghị của bạn ở phía bên dưới nhé!

Bài viết gốc được đăng tải tại via Devto

Streaming Media với Nginx và nginx-rtmp module

Streaming Media với Nginx và nginx-rtmp module

Lộ trình khá chi tiết Streaming server Media với Nginx và nginx-rtmp module.

1. Về nginx-rtmp module

Nginx-rtmp là module mở rộng, mà kết hợp với Nginx để cho phép xây dựng máy chủ streaming media.

Một số tính năng mà nginx-rtmp hỗ trợ:

  • RTMP/HLS/MPEG-DASH live streaming
  • RTMP Video on demand FLV/MP4, phát từ local file hoặc qua HTTP
  • Stream relay support for distributed streaming: push & pull models
  • Ghi streams vào nhiều tệp FLV
  • Hỗ trợ H264/AAC
  • Transcode trực tuyến với FFmpeg
  • HTTP callbacks (publish/play/record/update etc)
  • Module điều khiển HTTP để recording audio/video and dropping clients
  • Kỹ thuật buffer tiên tiến để giữ cho bộ nhớ được cấp ở mức thấp nhất mà streaming vẫn nhanh.
  • Kết hợp được với các ứng dụng như Wirecast, FMS, Wowza, JWPlayer, FlowPlayer, StrobeMediaPlayback, ffmpeg, avconv, rtmpdump, flvstreamer, ..
  • Thống kê stream với định dạng XML/XSL
  • Linux/FreeBSD/MacOS/Windows

Có thể bạn muốn xem thêm:

  Triển khai dịch vụ High Available với Keepalived + HAproxy trên server Ubuntu
  Cách cài đặt cấu hình máy tính cá nhân thành một public server trên Internet

2. Cài đặt Nginx với module nginx-rtmp

Step1: Download & unpack latest stable nginx & nginx-rtmp version

cd /opt
sudo git clone git://github.com/arut/nginx-rtmp-module.git
sudo wget http://nginx.org/download/nginx-1.14.1.tar.gz
sudo tar xzf nginx-1.14.1.tar.gz
mv nginx-1.14.1 nginx

Step2: Build nginx với nginx-rtmp

sudo ./configure --prefix=/etc/nginx \
--pid-path=/var/run/nginx.pid \
--conf-path=/etc/nginx/nginx.conf \
--sbin-path=/usr/sbin/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-http_ssl_module \
--add-module=nginx-rtmp-module
sudo make
sudo make install

Step3: Run Nginx với systemd

  • Create tệp /lib/systemd/system/nginx.service với nội dung sau:
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID

[Install]
WantedBy=multi-user.target
  • Start Nginx service
systemctl enable nginx.service
systemctl start nginx.service

3. VOD qua RTMP

Chúng ta sẽ cấu hình để cho phép các video player xem video qua giao thức RTMP.

3.1 Cấu hình Nginx

Step1: Tạo tệp tin cấu hình nginx với nội dung sau:

user  nginx;
worker_processes  1;
pid        /run/nginx.pid;
user nginx;

events {
    worker_connections  1024;
}
rtmp {
    server {
        listen 1935;
        chunk_size 4000;
        # video on demand for mp4 files
        application vod {
            play /var/mp4s;
        }
    }
}

http {
    access_log /var/log/nginx/access-streaming.log;
    error_log /var/log/nginx/error-streaming.log;
    server {
        listen      80;
        root /var/www/html;
        # RTMP statistics in XML
        location /stat {
            # Copy stat.xsl put to root directory
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
    }
}

Thông tin cấu hình tệp cấu như sau:

Khối rtmp { }

  • listen port với 1935 (port default)
  • application với đường dẫn ảo là vod
  • Đường dẫn thư mục chứa các tệp video để phát là “/var/mp4s”.

Khi đó muốn sử dụng chúng ta truy cập kiểu như “rtmp://192.168.10.113:1935/vod/video-name.mp4”

Step2: Tạo thư mục chứa và copy tệp tin video

mkdir /var/mp4s
cd /var/mp4s

Chúng ta download hoặc copy một tin video vào thư mục /var/mp4s

3.2. Sử dụng Video Player để chạy video

Chúng ta có thể sử dụng một trình phát video có hỗ trợ giao thức rtmp để phát.

Ở đây, chúng ta có thể sử dụng VLC player

Mở player VLC → Nhấn Media → Chọn “Open Network Stream ..”. Sau đó vào thông tin đường dẫn tệp video vod với rtmp://192.168.10.113:1935/vod/vod.mp4

Streaming Media với Nginx và nginx-rtmp module

Cuối cùng nhấn Play để phát video.

4. VOD qua HLS

Chúng ta sẽ cấu hình để cho phép video player phát video qua giao thức HLS (Apple HTTP Live Streaming).

4.1 Cài đặt Ffmpeg

Sử dụng script Installing FFmpeg on Linux

Nếu chỉ sử dụng một thư viện có sẵn thì cài đặt đơn giản như sau trên CentOS

yum install ffmpeg ffmpeg-devel ffmpeg-libpostproc

Trong phần Giới thiệu FFmpeg, cũng đã giới thiệu và cách sử dụng cơ bản FFmpeg.

4.2 Convert tệp vod.mp4 sang HLS

Trước khi convert, chúng ta thực hiện copy/download tệp tin video lên server (ví dụ tệp tin là vod.mp4)

Sử dụng lệnh ffmpeg để convert vod.mp4 sang định dạng HLS (Apache HTTP Live Stream)

ffmpeg -i video.mp4 -profile:v baseline -level 3.0 -s 720x400 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls /tmp/index.m3u8

Trong đó:

  • vod.mp4 là tệp video đầu vào cần convert
  • index.m3u8 là tệp tin master đầu ra của HLS playlist
  • và một số tham số tùy chọn cho độ phân giải, thời gian phân đoạn, …

4.3 Cấu hình nginx

Ở đây, Chúng ta sẽ cấu hình nginx làm web server, đồng thời cấu hình làm media server.

user nginx;
worker_processes  1;
error_log  logs/rtmp_error.log debug;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    #serve the player for HLS
    server {
        listen       80;
        root /var/www/html;
        server_name  localhost;
        location /hls {
            # CORS setup
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Expose-Headers' 'Content-Length';
            # Allow CORS preflight requests
            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Max-Age' 1728000;
                add_header 'Content-Type' 'text/plain charset=UTF-8';
                add_header 'Content-Length' 0;
                return 204;
            }
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            add_header Cache-Control no-cache;
            alias /tmp;
        }
    }
}
  • Listen với port default 80
  • URL của web server sẽ là http://192.168.10.113/; với root directory là /var/www/html
  • URL của stream server sẽ là http://192.168.10.113/hls
  • Playlist của stream là tệp tin m3u8, với các segment là tệp ts
  • Đường dẫn thư mục chứa các playlist là /tmp

4.4 Phát video trên web browser với videojs

Chúng ta có thể phát video trên web browser, mà sử dụng flash player như Flowplayer hay Jwplayer. Trong trường hợp này, tôi sẽ giới thiệu sử dụng videojs player cho phát video trên web browser.

Link về videojs: https://github.com/videojs/http-streaming

Trên Nginx web server, chúng ta sẽ tạo tệp tin index.html với nội dung sau vào root directory:

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Videojs-HLS embed</title>
  
  <!--

  Uses the latest versions of video.js and videojs-http-streaming.

  To use specific versions, please change the URLs to the form:

  <link href="https://unpkg.com/video.js@6.7.1/dist/video-js.css" rel="stylesheet">
  <script src="https://unpkg.com/video.js@6.7.1/dist/video.js"></script>
  <script src="https://unpkg.com/@videojs/http-streaming@0.9.0/dist/videojs-http-streaming.js"></script>

  -->

  <link href="https://unpkg.com/video.js/dist/video-js.css" rel="stylesheet">
<style>
.center {
    margin-left: auto;
    margin-right: auto;
    display: block
}
</style>
</head>
<body>
<!--  <h1>Video.js Example Embed</h1> -->

  <video-js id="my_video_1" class="vjs-default-skin center" controls preload="auto" width="720" height="400" poster="../images/bbb-poster.jpg">
    <source src="http://192.168.10.113/hls/index.m3u8" type="application/x-mpegURL">
  </video-js>

  <script src="https://unpkg.com/video.js/dist/video.js"></script>
  <script src="https://unpkg.com/@videojs/http-streaming/dist/videojs-http-streaming.js"></script>

  <script>
    var player = videojs('my_video_1');
  </script>

</body>
</html>

Trong tệp index.html chúng ta sẽ vào đường dẫn chứa tệp tin playlist mà đã convert ở Step2. Khi đó vào thông tin đường dẫn URL ở đây là: http://192.168.10.113/hls/index.m3u8

Cuối cùng duyệt http://192.168.10.113/index.html và xem kết quả

Streaming Media với Nginx và nginx-rtmp module

Chúng ta thấy videojs cho khung nhìn tuyệt đẹp.

5. Cấu hình Live Streaming

Live Streaming là tính năng chính của nginx-rtmp module, và quá trình thực hiện live streaming sẽ qua giao thức RTMP.

Các bước cho thực hiện quá trình Live Streaming như sau:

5.1 Cấu hình Nginx để làm live streaming server

Step1: Tạo tệp tin nginx.conf với nội dung sau

user nginx;
pid /var/run/nginx.pid;
events {
    worker_connections 1024;
}
#RTMP configuration
rtmp {
    server {
        listen 1935;
 
        application live {
            live on;
            # Push the stream to the local HLS application
            push rtmp://localhost:1935/hls;
        }
 	
        application hls {
            live on;
 
            # Only accept publishing from localhost.
            allow publish 127.0.0.1;
            deny publish all;
            
            # Streams as HLS
            hls on;
            hls_path /tmp/hls;
            hls_fragment 3s;
            hls_nested on;
            hls_fragment_naming system;
        }
    }
}

#HTTP Configuration
http {
    sendfile off;
    tcp_nopush on;
    aio on;
    directio 512;
    default_type application/octet-stream;

    server {
        listen 80;
        root /var/www/html;
        server_name localhost;
        location /hls {
            # Disable cache
            add_header 'Cache-Control' 'no-cache';

            # CORS setup
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Expose-Headers' 'Content-Length';

            # allow CORS preflight requests
            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Max-Age' 1728000;
                add_header 'Content-Type' 'text/plain charset=UTF-8';
                add_header 'Content-Length' 0;
                return 204;
            }
            # MIME type for HLS
            types {
                application/dash+xml mpd;
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }

            alias /tmp/hls;
        }
        # RTMP statistics in XML
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
    }
}

Ở đây, chúng ta sẽ cấu hình nginx làm nhiệm vụ là web server và live streaming server.

  • Block http { } : Dựng nginx làm web server với mục đích thống kê số liệu, cho phép người dùng xem live streaming. Nếu không cần dùng các chức năng này, chúng ta có thể qua bỏ block này. Quá trình tạo server cho xem live streaming có thể thực hiện ở server khác.
  • Block rtmp { } : Dựng nginx làm live streaming server, để thực hiện quá trình thu phát live streaming từ client và publish luồng

Diễn giải một số directive cho cấu hình nginx trên như sau:

  • live on: Bật tính năng live stream.
  • push rtmp://localhost:1935/hls : Thực hiện push streaming vào /hls
  • allow publish 127.0.0.1; Khai báo server từ xa được phép push stream đến hệ thống. Ở đây chúng ta sẽ khai báo localhost được phép push stream đến hệ thống localhost. Kết hợp với deny publish all, nhằm hạn chế remote server nào đó push stream vào hệ thống của mình.
  • deny publish all;
  • hls on: Bật chế độ HLS, cho phép client có thể sử dụng chế độ này
  • hls_path /tmp/hls: Thiết lập đường dẫn thư mục chứa playlist và fragments của HLS. Nếu không chỉ định thì nó tự động tạo.
  • hls_fragment 3s: Thực hiện tạo mỗi fragment với 03 second (fragment *.ts). Thường thì mỗi tệp ts được sinh ra gồm 3s + time decode)
  • hls_nested on; Bật chế độ lồng. Dùng để tạo ra một subdirectory của “hls_path” cho mỗi stream. Playlist và fragments sẽ được tạo ra cùng thư mục đó. Ví dụ /tmp/hls/ stream-name. Mặc định chế độ này là off, vì vậy stream sẽ tạo ra playlist và fragments ở thư mục của của đường dẫn hls_path, với kiểu tên là stream-name-..ts và stream-name.m3u8
  • hls_fragment_naming system: Tên của fragment, có thể định dạng với các kiểu “system, sequential, timestamp”

Step2: Tạo thư mục và copy tệp statistics dạng xml

mkdir /tmp/hls
chown -R nginx:nginx
copy /opt/nginx/nginx-rtmp-module/stat.xsl /var/www/html
systemctl restart nginx

Step3: Tạo tệp tin index.html

Chúng ta thực hiện tạo tệp tin tĩnh index.html để tạo web player cho xem live streaming qua web browser

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Videojs-HLS embed</title>
  
  <!--

  Uses the latest versions of video.js and videojs-http-streaming.

  To use specific versions, please change the URLs to the form:

  <link href="https://unpkg.com/video.js@6.7.1/dist/video-js.css" rel="stylesheet">
  <script src="https://unpkg.com/video.js@6.7.1/dist/video.js"></script>
  <script src="https://unpkg.com/@videojs/http-streaming@0.9.0/dist/videojs-http-streaming.js"></script>

  -->

  <link href="https://unpkg.com/video.js/dist/video-js.css" rel="stylesheet">
<style>
.center {
    margin-left: auto;
    margin-right: auto;
    display: block
}
</style>
</head>
<body>
<!--  <h1>Video.js Example Embed</h1> -->

  <video-js id="my_video_1" class="vjs-default-skin center" controls preload="auto" width="720" height="400" poster="../images/bbb-poster.jpg">
    <source src="http://192.168.10.113/hls/stream/index.m3u8" type="application/x-mpegURL">
  </video-js>

  <script src="https://unpkg.com/video.js/dist/video.js"></script>
  <script src="https://unpkg.com/@videojs/http-streaming/dist/videojs-http-streaming.js"></script>

  <script>
    var player = videojs('my_video_1');
  </script>

</body>
</html>

Note: Thay đường dẫn http://192.168.10.113/hls/stream/index.m3u8 với đường dẫn chứa thông tin tệp stream phù hợp.

5.2 Thực hiện live streaming từ mobile

Sử dụng một phần mềm live streaming bất kỳ, hỗ trợ giao thức RTMP. Ở đây, tôi sử dụng android nên cài đặt soft Larix Broadcaster

  • Mở Larix Broadcaster → Nhấn biểu tượng Setting → Connections → Sau đó vào các thông tin kết nối đến Live Streaming server.

rtmp://192.168.10.113:1935/live/stream

(Với tên “stream” là tên bất kỳ do mình đặt. Tên này sau khi lên live server, tương ứng với biến $name)

  • Cuối cùng nhấn vào biểu tượng quay phát để live streaming thôi

5.3 Kiểm tra quá trình Live Streaming

Step1: Xem thông tin tệp streaming trên server

Dùng lệnh để list xem quá trình sinh ra luồng stream với tệp playlist và fragments

Streaming Media với Nginx và nginx-rtmp module

Step2: Thực hiện xem live stream qua web browser

Mở web browser và truy cập http://192.168.10.113/ để xem live streaming

Streaming Media với Nginx và nginx-rtmp module

Step3: Xem thống kê số liệu streaming

Truy cập http://192.168.10.113/stat

Streaming Media với Nginx và nginx-rtmp module

TopDev via Github

Product Manager được sinh ra để làm gì?

Chỉ mới 8 giờ sáng ngày 23 tháng 2 tại Gala Center, đã có hơn 250 khán giả có mặt từ sớm để tham gia chương trình Inside The Mind Of A Product Manager Experimentation – Driven Product Development do VNGTopDev đồng tổ chức vào ngày 23/2. Đây là sự kiện thứ hai trong chuỗi sự kiện về Product được diễn ra thường xuyên trong cộng đồng tech tại Việt Nam. Chương trình không chỉ cung cấp những kiến thức về Product mà còn là một diễn đàn giúp kết nối cộng đồng công nghệ và startup lại một gần hơn, cùng nhau nhìn lại những case study để rút ra kinh nghiệm quý báu nhất cho chính doanh nghiệp của mình.

Sự kiện hôm nay có sự góp mặt của 4 chuyên gia hàng đầu trong lĩnh vực công nghệ, Anh VŨ MINH TRÍ hiện là Vice President của VNG & CEO của VINADATA, anh LÊ THIẾT BẢO của Omni Channel Senior Director của Nguyen Kim Trading JSC, Anh LÊ ANH QUANG (Quang Phowr) Head of UX/UI của Be Group, và Anh TRỊNH XUÂN TUÂN Founder & CEO của NextSmarty. Những chuyên gia đã chia sẻ rất sâu những góc nhìn cực kỳ giá trị mà chúng ta khó có thể tìm kiếm được cho khán giả trong buổi hội thảo ngày hôm nay.

Product manager được sinh ra để làm gì?

Anh VŨ MINH TRÍ hiện là Vice President của VNG & CEO của VINADATA chia sẻ, một product manager cần phải xác định rõ hai câu hỏi, Product Manager được sinh ra để làm gì? Giải pháp của bạn giải quyết được vấn đề gì? Những sản phẩm thành công là giải quyết được vấn đề cho nhiều người. Có thể thấy, đằng sau thành công của 10 công ty toàn cầu như Apple, Google, Microsoft, nằm chính ở việc giải quyết được vấn đề cho hằng tỷ người dùng. Phải xác định rõ được các Feature Function. Nếu không thấy đươc điều này Product Manager sẽ rất dễ dàng bị mất lửa.

Một ví dụ dễ thấy nhất chính là iCloud, được xem một trong những platform tăng trưởng nhanh nhất trong những năm vừa qua. Việc họ tự đưa ra problem rồi tạo ra giải pháp cũng là một cách trong việc phát triển Product. Apple tự tạo ra vấn đề người dùng không đủ dung lượng để chứa dữ liệu của mình, sau đó dùng iCloud phục vụ giải quyết nhu cầu cho người dùng bằng việc cung cấp giải pháp kết nối chiếc điện thoại với tất cả những nội dung của mình.

Hiểu DATA! Chiếc chìa khóa thành công của mọi sản phẩm

Ngoài bức tranh tổng quan về của thế giới Product Manager mà anh Vũ Minh Trí trình bày, những diễn giả khác cũng chia sẻ nhiều về các phương thức sử dụng dữ liệu cho các cuộc thử nghiệm nhằm (experimentation) cải thiện và tối ưu trải nghiệm người dùng một cách tốt nhất. Anh LÊ ANH QUANG Head of UX/UI của Be Group cũng chia sẻ nhiều về việc tìm hiểu từng người dùng một để từ đó có dữ liệu và tối ưu từ những thứ nhỏ nhất trên ứng dụng, chẳng như cải tiến font chữ chi tiết và cách thức hiện triển khai đến những người dùng cuối (end-user).

Anh TRỊNH XUÂN TUÂN Founder & CEO của NextSmarty chia sẻ vấn đề mà nhiều doanh nghiệp E-commerce đang gặp phải chính là việc conversion rate đang giảm, và bounce rate lại ngày càng tăng. Anh giải thích, lý do chính là vì nhiều bên vẫn chưa quan tâm đến hành vi người dùng, chưa đầu tư vào việc hiểu Data, thay vào đó họ lại chi tiền quá nhiều cho việc digital marketing nhưng chưa thật sự tối ưu được hiệu quả và chi phí.

Tiếp đến, anh LÊ THIẾT BẢO hiện là Omni Channel Senior Director của Nguyen Kim Trading JSC nói nhiều về những case study thực tế từ Nguyễn Kim trong việc ứng dụng Big Data dùng để trải nghiệm sản phẩm. Anh chia sẻ, ngày trước Nguyễn Kim từng có rất nhiều data nhưng không biết làm gì với nó và cũng có rất nhiều bên bán lẻ cũng gặp tình trạng tương tự. Đa phần họ chỉ đơn thuần dựa vào kinh nghiệm cá nhân rồi từ đó mua traffic vô tội vạ trong các chiến dịch đẩy doanh số, dẫn tới việc chi nhiều nhưng lại không thật sự hiệu quả. Anh cũng trình bày nhiều về việc tạo ra một hệ thống customer data input để phân biệt rõ hành vi người dùng cũng như lưu lại những lịch sử tương tác của khách hàng mà Nguyễn Kim đang ứng dụng, từ đó mới có thể tạo ra được những phương pháp tiếp cận khách hàng hiệu quả hơn, cá nhân hóa hơn.

Kết thúc chương trình, tất cả các diễn giả đã cùng ngồi lại qua một Panel Discussion cực kỳ hấp dẫn để giải đáp các câu hỏi của toàn bộ các khán giả tại sự kiện. Chương trình cũng khép lại với nhiều kiến thức và kinh nghiệm cực kỳ quý giá cho người tham dự chương trình. Chắc rằng, với sự trở lại sắp tới chuỗi sự kiện “Inside The Mind Of A Product Manager” sẽ còn làm khán giả bất ngờ với nhiều nội dung bất ngờ hơn nữa.

Tham khảo thêm các vị trí tuyển dụng product manager lương cao cho bạn.