Home Blog Page 43

Top 5 câu hỏi phỏng vấn Site Reliability Engineer và cách trả lời

Top 5 câu hỏi phỏng vấn Site Reliability Engineer và cách trả lời

Site reliability engineer (viết tắt là SRE), chức danh này thường lạ lẫm với đa số anh em làm việc bên ngành lập trình, bài viết này sẽ cung cấp cho anh em cái nhìn rõ ràng SRE và phỏng vấn Site reliability engineer như thế nào?

Công việc của SRE là đảm bảo hệ thống hoạt động ổn định. Chưa có uptime thì thôi làm gì có downtime bao giờ?

Viết tới đây chắc một số anh em vẫn còn chưa nắm rõ SRE cụ thể là gì? Xin anh em đừng vội, cùng bắt đầu với câu hỏi phỏng vấn Site reliability engineer nha.

1. Vị trí site reliability engineer (SRE) là gì?

Câu hỏi phỏng vấn Site reliability engineer đầu tiên lạị hỏi vị trí đó là gì thì hơi kì. Tuy nhiên đối với vị trí SRE thì câu hỏi này không có gì là lạ.

Vị trí SRE có đôi điểm khác biệt so với các vị trí khác. Dẫn tới việc hiểu rõ công việc mà mình sẽ làm, nếu apply vào vị trí này sẽ làm gì là điều rất quan trọng.

Đầu tiên chưa bàn tới định nghĩa thì anh em biết cho dù có sử dụng techstack là gì, sử dụng cloud service như thế nào thì hệ thống đôi khi sẽ có lúc down. Tính là downtime. Ngoài thời gian do trục trặc hệ thống và các bên cung cấp, một số lỗi (bugs) cũng ảnh hưởng tới thời gian hệ thống hoạt động ổn định. Vậy vị trí SRE sinh ra với mục đích gì?

The site reliability engineer is responsible for the stability and performance of websites, mobile applications, web services, and other online services. They’re in charge of monitoring the performance of websites and apps to check for issues and make sure they’re running smoothly.
Site reliability engineer (thường gọi là kỹ sư độ tin cậy). Họ là người chịu trách nhiệm về tính ổn định và hiệu suất của các trang web, ứng dụng di động, dịch vụ web và các dịch vụ trực tuyến khác. Họ chịu trách nhiệm giám sát hiệu suất của các trang web và ứng dụng để kiểm tra các vấn đề và đảm bảo rằng chúng đang chạy trơn tru.

  8 Bước Trong Lộ Trình Trở Thành DevOps Engineer
  Làm thế nào để tìm được những "nhân tài" DevOps phù hợp nhất?

2. SRE và Devops khác nhau như thế nào?

Câu hỏi phỏng vấn Site reliability engineer đầu tiên đã cho anh em biết nhiệm vụ chính của SRE. Nhưng khổ cái là trách nhiệm giám sát hiệu suất và đảm bảo các ứng dụng, web hoạt động trơn tru nghe như là trách nhiệm của Devops.

Kì thực thì 2 vị trí này có gì khác nhau? Nếu có thì khác nhau như thế nào? Đầu tiên ta đi tới 2 điểm giống nhau về công việc và việc làm của 2 vị trí Devops và SRE.

DevOps and Site Reliability Engineer are the two terms used to describe a person who specializes in improving applications and services while they are being used.
Devops và Site Reliability Engineer là hai thuật ngữ được sử dụng để mô tả một người chuyên cải tiến các ứng dụng và dịch vụ trong khi chúng đang được sử dụng.

Thứ hai:

DevOps and Site reliability engineering are both important roles in modern IT organizations. However, there is a big difference between them. Devops và Site reliability engineering đều có vai trò quan trọng trong các tổ chức CNTT hiện đại. Tuy nhiên, có một sự khác biệt lớn giữa chúng.

2.1 Khác biệt chính

Tuy có trách nhiệm chung nhưng vẫn tồn tại một số khác biệt như sau:

DevOps SRE
Devops liên quan đến việc phát triển phần mềm có thể được cập nhật và sửa đổi trong khi phần mềm đang chạy. SRE thì ngược lại tập trung vào việc duy trì và chạy một ứng dụng hoặc dịch vụ.
DevOps thường sử dụng các công cụ tự động hóa để cải thiện quy trình làm việc của họ. SRE làm việc với cả công cụ tự động hóa và con người để đảm bảo dịch vụ tiếp tục hoạt động trơn tru.
DevOps quyết định lúc nào và cách thức phần mềm được xây dựng. SRE tập trung vào những gì xảy ra sau khi nó được xây dựng

Tham khảo tin tuyển dụng DevOps hấp dẫn trên TopDev

3. DHCP là gì? Sử dụng DHCP như thế nào?

Câu hỏi thứ ba phỏng vấn Site reliability engineer liên quan tới protocols. Tuy nhiên anh em lưu ý câu hỏi chỉ là câu hỏi ví dụ.

Về các kiến thức khác liên quan tới kĩ thuật, anh em cố gắng cập nhật hoặc ôn lại chuẩn bị trước khi phỏng vấn.

Đầu tiên DHCP là viết tắt của Dynamic Host Configuration Protocol. Giao thức này cho phép phân bố các IP động trong mạng máy tính (networks). DHCP sử dụng để gán các địa chỉ IP address cho các thiết bị (PCs, các thiết bị mạng).

Về cơ bản khi một thiết bị kết nối vào mạng, nó sẽ cần IP để truy cập internet. Trong trường hợp này DHCP là bên quản lý và cấp phát các IP động tới từng thiết bị. Đảm bảo cho network hoạt động thông suốt

4. Bạn sẽ xử lý như thế nào trong trường hợp hệ thống có sự cố?

Câu hỏi thứ 4 phỏng vấn Site reliability engineer là kinh nghiệm thực tế trong quá trình làm việc.

Qua câu hỏi thứ nhất, anh em cũng đã hiểu trách nhiệm, công việc cần làm của SRE, vậy trường hợp có sự cố, SRE sẽ xử lý sự cố như thế nào?

Câu hỏi này tập trung vào kỹ năng ở các nhóm chính, cũng có thể nói là các nhóm công cụ chính sử dụng trong quá trình làm việc. Đơn cử có thể liệt kê theo các nhóm sau:

    • Metrics và Monitoring
    • Capacity và Planning
    • Change Management
    • Emergency Response

phỏng vấn Site reliability

Vậy trong trường hợp có sự cố, bằng việc sử dụng kết hợp các nhóm kể trên. SRE có thể dễ dàng nhanh chóng phát hiện sự cố. Trường hợp không thể xử lý sự cố một mình, SRE có thể yêu cầu trợ giúp từ dev team, devops team. Với các thông tin đánh giá sự cố đã có sẵn.

5. Horizontal và Vertical Scaling khác nhau như thế nào?

Câu hỏi thứ 5 và cũng là câu hỏi cuối cùng phỏng vấn Site reliability engineer liên quan tới scale hệ thống. Tất nhiên câu hỏi này đôi khi không phải là trách nhiệm chính của SRE.

Tuy nhiên, kiến thức về scale và các hệ thống lớn luôn là điểm cộng khi tham gia phỏng vấn SRE. Dữ liệu càng ngày càng nhiều.

Về cơ bản thì Vertical Scaling (scale theo chiều dọc) là quá trình mở rộng hệ thống bằng cách tăng tài nguyên của chính hệ thống đó. Việc tăng tài nguyên có thể được hiểu là RAM, CPU, Chip. Các thiết bị phần cứng khác có liên quan.

Ở chiều ngược lại, Horizontal Scaling (scale theo chiều ngang) nói tới việc thêm các virtual machine trong cùng 1 host. Tạo ra nhiều hơn các instance nằm ngang cùng cấp với nhau.

Cả hai loại hình scale đều có điểm yếu và điểm mạnh. Anh em có thể tìm hiểu thêm thông tin để biết trong trường hợp có xảy ra sự cố, sẽ cần xử lý như thế nào cho từng loại hệ thống lớn.

6. Tham khảo thêm câu hỏi phỏng vấn Site reliability engineer

Để chuẩn bị tốt cho buổi phỏng vấn Site reliability engineer. Anh em có thể tham khảo thêm các bài viết dưới đây:

Cảm ơn anh em đã đọc bài – Thank you so much for your time – Happy coding!

Tác giả: Kiên Nguyễn

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

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

Infrastructure as code (IaC)

Bài viết đến từ anh Bùi Nguyễn Huy Hoàng – Quản lý DevSecOps DevSecOp team @Techcombank

Techcombank

I. Tại sao lại sử dụng Infrastructure as Code?

Những công việc như ảo hóa, điện toán đám mây (Cloud), container, tự động hóa (CI/CD) giúp đơn giản hóa công việc vận hành hành công nghệ thông tin (IT Operations). Việc triển khai, cấu hình, cập nhật và vận hành dịch vụ sẽ tiêu tốn ít thời gian và công sức hơn. Vấn đề sẽ được phát hiện và giải quyết nhanh chóng, các hệ thống luôn được cấu hình và cập nhật một cách đồng nhất. Những kỹ sư IT sẽ tiết kiệm được thời gian trong công việc vận hành hàng ngày, để có thể nhanh chóng thay đổi, học hỏi và cải tiến bản thân đáp ứng nhu cầu thay đổi liên tục của thế giới công nghệ.

Tuy nhiên, ngay cả với những công cụ và nền tảng mới nhất, các nhóm vận hành công nghệ vẫn thấy họ không thể đáp ứng nổi khối lượng công việc hàng ngày của mình. Họ không có thời gian để sửa chữa các vấn đề đã tồn tại lâu đời trong hệ thống cũ, chưa thể tái cấu trúc và tận dụng tối đa các công cụ và công nghệ mới. Trên thực tế thì việc dễ dàng khởi tạo tài nguyên trên Cloud sẽ khiến tình hình trở nên tồi tệ hơn. Do việc triển khai hạ tầng mới quá dễ dàng dẫn đến việc danh mục hệ thống và tài nguyên cần vận hành ngày càng tăng lên, điều này khiến việc duy trì mọi thứ ổn định đòi hỏi một lượng thời gian ngày càng lớn. Việc quản lý thay đổi một cách nhất quán và đáng tin cậy là một thách thức nan giải và cần có những quy trình, công cụ, thói quen để có thể giải quyết được vấn đề đó.

Một số công ty công nghệ đã đối mặt với thách thức này bằng cách áp dụng lại các quy trình, cấu trúc quản trị mà họ đã từng sử dụng để quản lý hạ tầng và phần mềm trước khi dịch vụ Cloud được trở nên phổ biến. Nhưng hạn chế là các nguyên tắc và quy trình này thường mất từ vài ngày đến vài tuần để có thể được chấp thuận triển khai tài nguyên mới, trong khi chỉ mất vài phút hoặc vài giây để triển khai trên Cloud. Các quy trình quản lý tài nguyên này thường bị bỏ qua hoặc xin sự chấp thuận ngoại lệ để không phải tuân theo từ nhóm những người cần hoàn thành công việc. Các công ty áp dụng thành công hơn thì lại cảm thấy đang bị thụt lùi do bị các đối thủ linh hoạt về công nghệ vượt mặt.

Các phương pháp quản lý cũ đã không thể đáp ứng được với tốc độ thay đổi do điện toán đám mây và tự động hóa mang lại. Nhưng vẫn cần phải giải quyết vấn đề về kiểm soát sự thay đổi và phát triển liên tục mà điện toán đám mây mang lại. Đó là lúc Infrastructure as Code(IaC) xuất hiện.

II. Infrastructure as Code là gì?

Infrastructure as Code là một phương phát tự động hóa hạ tầng dựa trên những nguyên lý của quá trình phát triển phần mềm, sử dụng các đoạn mã để khởi tạo, cung cấp các tài nguyên trong những trung tâm dữ liệu vật lý và các nền tảng Cloud một cách tự động, thay vì cài đặt và cấu hình thủ công. Nó tập trung vào các quy trình có tính lặp đi lặp lại và nhất quán cho việc cung cấp và thay đổi tài nguyên trên Cloud và cấu hình của chúng. Những thay đổi được thực hiện sẽ đi qua quá trình kiểm thử và xác thực kỹ lưỡng trước khi được đưa vào áp dụng.

Tiền đề việc này là những công cụ mới có thể xử lý tài nguyên hạ tầng như xử lý phần mềm và dữ liệu. Điều này cho phép áp dụng các công cụ, quy trình phát triển phần mềm như các hệ thống kiểm soát phiên bản (Version Control System), kiểm thử tự động và điều phối việc triển khai hạ tầng. Nó cũng mở ra cơ hội cho việc áp dụng các quy chuẩn phát triển phần mềm vào việc triển khai hạ tầng như Test Driven Design (TDD), tự động hóa(CI/CD).

Infrastructure as Code đã chứng minh được sự hữu dụng của mình trong những nơi có những yêu cầu cao về môi trường phát triển/triển khai và phát triển nhanh về công nghệ. Đối với ngân hàng số như Techcombank, các hệ thống công nghệ thông tin không chỉ là Business Critical mà chính là Business. Việc gián đoạn dịch vụ là không thể chấp nhận vì hệ thống ngân hàng xử lý hàng triệu giao dịch mỗi ngày. Vì vậy không có gì ngạc nhiên khi Techcombank đang tiên phong trong việc áp dụng các công nghệ mới, giải pháp mới để tăng tính tin cậy cho hạ tầng công nghệ thông tin quy có mô lớn.

Mục tiêu của việc áp dụng Infrastructure as Code trong Techcombank:

  • Khuyến khích sự thay đổi của hệ thống công nghệ thông tin.
  • Các kỹ sư công nghệ có thể dành thời gian cho các công việc quan trọng và phát triển năng lực của bản thân thay vì tốn thời gian cho những công việc nhỏ lặp đi lặp lại.
  • Bản thân người có nhu cầu (thường là project team) có thể chủ động xác định, cung cấp, quản lý các tài nguyên họ cần mà không cần sự giúp đỡ từ các kỹ sư vận hành (IT Operation).
  • Hạ tầng có thể dễ dàng phục hồi nhanh chóng sau sự cố.
  • Các cải tiến, nâng cấp được áp dụng và thực hiện liên tục thay vì thông qua các dự án đắt đỏ và rủi ro.
  • Các giải pháp cho vấn đề hạ tầng có thể được chứng minh thông qua kiểm thử, triển khai, đo lường tự động thay vì thông qua các cuộc họp và tài liệu.

III. Lợi ích của Infrastructure as Code

1. Tự động hóa hạ tầng công nghệ thông tin

Infrastructure as Code giúp tự động hóa các hoạt động liên quan đến hạ tầng công nghệ thông tin, bao gồm việc khởi tạo, cài đặt, triển khai, quản lý và giám sát hạ tầng thông qua mã nguồn. Với Infrastructure as Code, các nhóm phát triển không cần thực hiện các thao tác này thủ công, giảm thiểu thời gian và chi phí trong việc triển khai và quản lý hạ tầng. Việc tự động hóa này giúp đẩy nhanh quá trình cung cấp hạ tầng cũng như giảm thiểu rủi ro, khi hạn chế được tối đa sự can thiệp thủ công, đảm bảo tính ổn định của hạ tầng.

2. Kiểm soát phiên bản

Infrastructure as Code cho phép quản lý phiên bản, giúp các kỹ sư vận hành liên tục phát triển và quản lý đảm bảo tính nhất quán, kiểm soát các thay đổi. Khi sử dụng mã nguồn để quản lý hạ tầng, các phiên bản của mã nguồn đóng vai trò rất quan trọng trong việc kiểm soát và quản lý các thay đổi. Các phiên bản được theo dõi và đảm bảo rằng người dùng (đội dự án) đang sử dụng phiên bản mới nhất và người quản lý hạ tầng (đội vận hành) có thể xác minh tính nhất quán của hạ tầng và mối liên kết, liên quan, thay đổi giữa các phiên bản hạ tầng khác nhau. Từ đó có thể kiểm tra, giải quyết những vấn đề phát sinh liên quan đến việc triển khai sản phẩm.

3. Sản xuất nhanh

Infrastructure as Code cho phép các nhóm phát triển triển khai sản phẩm/ứng dụng một cách nhanh chóng và hiệu quả hơn. Khi việc cài đặt, triển khai hạ tầng được tự động hóa, các nhóm phát triển có thể giảm thiểu thời gian sản xuất và đưa được sản phẩm đến với khách hàng một cách nhanh chóng hơn. Điều này là rất quan trọng để đáp ứng kịp thời nhu cầu của khách hàng và tạo ưu thế cạnh tranh trong thị trường công nghệ khốc liệt hiện tại.

4. Xác định sự thay đổi

Infrastructure as Code giúp các nhóm vận hành xác định và quản lý sự khác biệt giữa các phiên bản hạ tầng. Chỉ cần kiểm tra phiên bản mới nhất và so sánh với phiên bản trước đó, các nhóm phát triển có thể xác định sự khác nhau và đưa ra các điều chỉnh cần thiết để giảm thiểu rủi ro trong việc triển khai. Điều này giúp giảm thiểu rủi ro, đảm bảo tính nhất quán của việc cài đặt và triển khai hạ tầng.

5. Tăng tính linh hoạt

Infrastructure as Code cho phép các tổ chức có thể nhanh chóng thay đổi hạ tầng mà không cần lo ngại về tính linh hoạt. Các yêu cầu mới có thể được triển khai nhanh chóng và có tính nhất quán với các phiên bản trước đó. Do đó, Infrastructure as Code trở thành một giải pháp hiệu quả cho các tổ chức muốn mang lại tính linh hoạt trong kinh doanh.

6. Giảm thiểu rủi ro

Infrastructure as Code giúp các tổ chức có thể giảm thiểu rủi ro liên quan đến cài đặt hạ tầng, đảm bảo tính nhất quán trong việc triển khai. Infrastructure as Code cho phép các nhóm thực hiện kiểm tra tự động, đảm bảo rằng hạ tầng đang hoạt động chính xác và ổn định. Sự hỗ trợ của Infrastructure as Code giúp đảm bảo tính toàn vẹn và độ tin cậy cho hạ tầng công nghệ thông tin.


Thuộc dự án Inside GemTechnology do TopDev hợp tác cùng Techcombank triển khai, chuỗi nội dung thuần “Tech” độc quyền được chia sẻ bởi đội ngũ chuyên gia Công nghệ & Dữ liệu tại Techcombank sẽ được cập nhật liên tục tại chuyên mục Tech Blog | Techcombank Careers x TopDev. Cùng theo dõi & gặp gỡ các chuyên gia bạn nhé!

 

Các cơ hội việc làm tại Techcombank


Bài viết liên quan

Hơn cả một phương pháp, DevSecOps chính là “triết lý bảo mật” tại Techcombank

Là một thành viên mới tại Techcombank, anh Bùi Nguyễn Tuấn Minh hiện đang là Giám đốc DevSecOps, đây cũng là công việc đầu tiên của anh sau những năm tháng làm việc tại Singapore. Anh cũng là một trong những người góp phần mang lại những góc nhìn mới trong các phương pháp phát triển phần mềm của Techcombank. Được biết, Techcombank là một trong những đơn vị tiên phong ứng dụng phương pháp DevSecOps trong việc phát triển sản phẩm. Đây cũng được xem là một trong những định hướng giúp các ngân hàng số hóa và phát triển mạnh mẽ trong tương lai. Sau đây là những chia sẻ của anh Bùi Nguyễn Tuấn Minh về công việc DevSecOps tại Techcombank. Anh có thể chia sẻ một chút về môi trường làm việc tại Techcombank? Khi chuyển công tác từ Singapore về Việt Nam, mình nhận thấy môi trường và cách thức làm việc [...]

DevSecOps Philosophy (Triết lý DevSecOps)

Bài viết đến từ Ngô Doãn Thông - DevSecOps Engineer    DevSecOps team @Techcombank Giới thiệu Trong 20 năm qua, DevOps đã cùng với Agile, thay thế cho mô hình phát triển Waterfall. Microservices được coi là công nghệ tiên tiến nhất để triển khai kiến trúc dịch vụ. Thời gian phát triển sản phẩm đã được giảm đi, triển khai tự động được thực hiện hàng tuần hoặc hàng ngày và cloud thì cung cấp khả năng tính toán, cơ sở hạ tầng, lưu trữ và mạng rất mạnh mẽ. Triết lý DevOps thường được tóm tắt bằng khẩu hiệu "move fast and break things", điều này có nghĩa là triển khai mọi thứ nhanh hơn, mạnh dạn hơn và sẵn sàng, phá bỏ các cấu trúc silo, rào cản, chấp nhận rủi ro và khắc phục nhanh từ những rủi ro đó. Tuy nhiên, có một yếu tố quan trọng chưa được đề cập tới. Các tổ chức áp dụng DevOps vẫn cần đáp ứng tiêu chuẩn an [...]

Ngôn ngữ lập trình nào lương cao nhất năm 2023?

Ngôn ngữ lập trình nào lương cao nhất năm 2023?

Sự phát triển mạnh mẽ của ngành công nghệ thông tin và nhu cầu ngày càng cao về nguồn nhân lực đã mang lại nhiều cơ hội việc làm cùng với mức lương hấp dẫn cho lập trình viên. Tuy nhiên, với đa dạng ngôn ngữ lập trình như hiện nay, không phải ngôn ngữ nào cũng đem lại thu nhập cao cho lập trình viên. Điều này đặt ra câu hỏi quan trọng: Ngôn ngữ lập trình nào lương cao nhất?

Yếu tố nào ảnh hưởng đến lương lập trình viên?

MỨC LƯƠNG LẬP TRÌNH VIÊN @TRÌNH ĐỘ & LĨNH VỰC
Mức lương của lập trình viên theo trình độ & lĩnh vực (Báo cáo thị trường IT 2022 của TopDev)

Mức lương của lập trình viên được ảnh hưởng bởi nhiều yếu tố, bao gồm:

  • Nhu cầu thị trường: Các ngành như công nghệ thông tin, phát triển phần mềm, trí tuệ nhân tạo và khoa học dữ liệu đang trở thành những lĩnh vực có nhu cầu lớn về lập trình viên, dẫn đến cạnh tranh cao và mức lương hấp dẫn.
  • Phạm vi ứng dụng: Các ngôn ngữ lập trình có ứng dụng rộng rãi và đa dạng trong nhiều lĩnh vực như web development, mobile, game, trí tuệ nhân tạo, hệ thống nhúng và phân tích dữ liệu có thể đem lại thu nhập cao. Những ngôn ngữ phổ biến trong các lĩnh vực này thường được ưu tiên và trả lương cao hơn.
  • Độ phổ biến: Các ngôn ngữ được sử dụng rộng rãi và có cộng đồng lớn, hỗ trợ mạnh mẽ từ cộng đồng phát triển, thường có nhiều cơ hội việc làm và mức lương tương đối cao. Ngôn ngữ như Python, JavaScriptJava là những ngôn ngữ rất phổ biến và thường đi kèm với mức lương hấp dẫn.
  • Mức độ phức tạp: Các ngôn ngữ lập trình có mức độ phức tạp cao, đòi hỏi kiến thức chuyên sâu và kỹ năng đặc biệt, thường được đánh giá cao hơn và được trả lương tương xứng. Ví dụ, ngôn ngữ C++ được sử dụng phổ biến trong lĩnh vực nhúng và phát triển game, và các chuyên gia C++ thường nhận được mức lương cao.
  • Kinh nghiệm: Kinh nghiệm của lập trình viên cũng ảnh hưởng đến mức lương. Những lập trình viên có kinh nghiệm và thành tựu trong công việc thường nhận được mức lương cao hơn so với những người mới vào nghề.

  Người mới bắt đầu nên học ngôn ngữ lập trình nào?

Ngôn ngữ lập trình nào lương cao nhất?

Ngôn ngữ lập trình Scala

Ngôn ngữ lập trình Scala

Scala là một trong những ngôn ngữ lập trình có mức lương cao nhất hiện nay, trung bình mỗi năm một người có thể kiếm được $92,780 (Theo “Developer Survey 2022).

Đây là một ngôn ngữ lập trình đa mô hình (multi-paradigm) chạy trên nền tảng Java Virtual Machine (JVM). Nó kết hợp các tính năng của ngôn ngữ hướng đối tượng và lập trình hàm, mang lại khả năng viết mã linh hoạt và mạnh mẽ.

Scala đã thu hút sự quan tâm và sử dụng rộng rãi trong các dự án phát triển phần mềm lớn và hệ thống phân tán. Mức lương của lập trình viên Scala có thể cao nhờ vào các yếu tố sau:

  • Độ phổ biến: Mặc dù không phải là ngôn ngữ phổ biến như Python hoặc JavaScript, Scala vẫn có một cộng đồng người dùng đáng kể và được sử dụng trong các dự án lớn. Điều này tạo ra một cạnh tranh cân bằng giữa nguồn cung và nhu cầu, giúp tăng khả năng nhận mức lương cao.
  • Phạm vi ứng dụng: Scala thường được sử dụng trong các lĩnh vực như phân tích dữ liệu, xử lý dữ liệu lớn (big data), phát triển hệ thống phân tán và ứng dụng web. Với sự gia tăng của các công ty hoạt động trong các lĩnh vực này, lập trình viên Scala có thể tận dụng cơ hội việc làm và nhận mức lương cao.
  • Kỹ năng chuyên môn: Scala là một ngôn ngữ phức tạp và yêu cầu kiến thức chuyên sâu để sử dụng hiệu quả. Lập trình viên có kỹ năng chuyên môn vượt trội trong Scala, cùng với khả năng áp dụng nó vào các dự án thực tế, có thể đạt được mức lương cao hơn.

Ngôn ngữ lập trình Perl

Tiếp theo trong danh sách ngôn ngữ lập trình nào lương cao nhất chính là Perl. Ngôn ngữ lập trình này có mức lương trung bình khoảng $90,073/năm (Theo “Developer Survey 2023). 

Perl là một ngôn ngữ lập trình cấp cap, được phát triển vào những năm 1980. Với các tính năng như xử lý chuỗi và hỗ trợ mạnh mẽ cho các tác vụ hệ thống, Perl đã được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau.

Mức lương của lập trình viên Perl cũng phụ thuộc vào nhiều yếu tố, bao gồm:

  • Kỹ năng và kinh nghiệm: Lập trình viên Perl có kỹ năng chuyên sâu và kinh nghiệm phong phú trong việc sử dụng Perl có thể nhận được mức lương cao hơn. Sự am hiểu sâu về các tính năng và thư viện của Perl cùng với khả năng áp dụng hiệu quả vào các dự án thực tế có thể tạo ra giá trị cho nhà tuyển dụng.
  • Phạm vi ứng dụng: Dù Perl không còn được sử dụng rộng rãi như trước đây, nó vẫn được sử dụng trong một số lĩnh vực như quản lý hệ thống, xử lý văn bản và biểu đồ. Lập trình viên Perl có thể tìm cơ hội việc làm và nhận mức lương cao hơn trong các dự án và công ty tập trung vào những lĩnh vực này.

Tổng hợp các việc làm Back-end đang tuyển trên TopDev

Ngôn ngữ lập trình Golang

Ngôn ngữ lập trình Golang

Mức lương trung bình mà một lập trình viên thành thạo ngôn ngữ Golang có thể nhận được là $89,204/năm. Đây là một ngôn ngữ lập trình mã nguồn mở do Google phát triển. Go được thiết kế với mục tiêu đơn giản, hiệu quả và dễ sử dụng cho việc phát triển ứng dụng.

Golang đã thu hút sự quan tâm của cộng đồng lập trình và công ty công nghệ, và trở thành một ngôn ngữ phổ biến trong lĩnh vực phát triển phần mềm và hệ thống. Dưới đây là một số yếu tố ảnh hưởng đến mức lương của lập trình viên Golang:

  • Độ phổ biến và cộng đồng: Golang đã có sự phát triển đáng kể trong thời gian gần đây, với một cộng đồng người dùng ngày càng lớn. Sự phổ biến và tăng trưởng của Golang tạo ra cơ hội việc làm và cạnh tranh, ảnh hưởng đến mức lương của lập trình viên.
  • Phạm vi ứng dụng: Golang được thiết kế để tăng cường hiệu suất và xử lý đồng thời. Với khả năng đáp ứng tốt trong việc xây dựng hệ thống phân tán, dịch vụ web và ứng dụng đám mây, lập trình viên Golang có cơ hội nhận mức lương cao trong các dự án có liên quan.
  • Kỹ năng chuyên môn: Sự am hiểu sâu về ngôn ngữ Golang và khả năng áp dụng nó vào việc phát triển các dự án thực tế sẽ tạo ra giá trị cho nhà tuyển dụng. Lập trình viên có kỹ năng chuyên môn vượt trội trong Golang, bên cạnh kiến thức về các công nghệ liên quan, có thể có cơ hội nhận mức lương cao hơn.

Ngôn ngữ lập trình Rust

Ngôn ngữ lập trình Rust

Nếu bạn hỏi ngôn ngữ lập trình nào lương cao nhất thì chắc chắn không thể bỏ qua Rust. Mức lương trung bình một lập trình viên Rust có thể nhận được là $87,047/năm. Ngôn ngữ lập trình này được phát triển bởi Mozilla với mục tiêu bảo mật, hiệu năng cao và kiểm soát bộ nhớ an toàn. Rust đã thu hút sự quan tâm và sử dụng rộng rãi trong cộng đồng lập trình viên và công ty công nghệ.

Dưới đây là một số yếu tố ảnh hưởng đến mức lương của lập trình viên Rust:

  • Độ phổ biến và cộng đồng: Mặc dù Rust không phổ biến như các ngôn ngữ như Python hay JavaScript, nhưng nó đang dần trở nên phổ biến hơn. 
  • Tính bảo mật và hiệu năng: Rust được thiết kế để cung cấp bảo mật cao và hiệu năng tối ưu. Với khả năng tránh được các lỗi thông thường liên quan đến bộ nhớ và thread, Rust thường được sử dụng trong các dự án yêu cầu tính bảo mật cao và hiệu năng tốt. 
  • Kỹ năng chuyên môn: Rust là một ngôn ngữ phức tạp và yêu cầu kiến thức chuyên sâu để sử dụng hiệu quả. Lập trình viên có kỹ năng chuyên môn vượt trội trong Rust, cùng với khả năng áp dụng nó vào các dự án thực tế, có thể đạt được mức lương cao hơn.
  • Phạm vi ứng dụng: Rust thường được sử dụng trong các lĩnh vực như phát triển hệ thống nhúng, phát triển hệ thống phân tán và ứng dụng có yêu cầu bảo mật cao. Với sự gia tăng của các công ty hoạt động trong các lĩnh vực này, lập trình viên Rust có thể tận dụng cơ hội việc làm và nhận mức lương cao.

Ngôn ngữ lập trình Objective-C

Đứng cuối cùng trong danh sách các ngôn ngữ lập trình có mức lương cao nhất chính là Objective-C. Thu nhập của lập trình viên Objective-C rơi vào khoảng $83,165/năm (Theo “Developer Survey”).

Đây là một ngôn ngữ lập trình hướng đối tượng được sử dụng phổ biến trong việc phát triển ứng dụng cho các hệ điều hành của Apple, bao gồm macOS và iOS. Ngôn ngữ này đã trở thành một phần quan trọng trong việc xây dựng ứng dụng di động và các ứng dụng máy tính cá nhân của Apple.

Mức lương của lập trình viên Objective-C có thể phụ thuộc vào một số yếu tố sau:

  • Độ phổ biến: Objective-C đã được sử dụng rộng rãi trong nhiều năm đối với việc phát triển ứng dụng iOS và macOS. Tuy nhiên, trong những năm gần đây, ngôn ngữ Swift đã trở thành ngôn ngữ chính thức cho phát triển ứng dụng của Apple, và sự phổ biến của Objective-C đã giảm đi. Do đó, tìm kiếm việc làm với Objective-C có thể khó hơn và có thể ảnh hưởng đến mức lương.
  • Kinh nghiệm và kỹ năng chuyên môn: Lập trình viên Objective-C có kinh nghiệm và kỹ năng chuyên môn sâu về việc phát triển ứng dụng cho hệ điều hành Apple có thể nhận được mức lương cao hơn. 
  • Phạm vi ứng dụng: Objective-C thường được sử dụng trong việc phát triển ứng dụng di động và ứng dụng máy tính cá nhân cho hệ điều hành của Apple. Lập trình viên Objective-C có cơ hội nhận mức lương cao trong các dự án và công ty tập trung vào việc phát triển các ứng dụng cho các nền tảng này.

Bạn có thể tham khảo thêm về mức lương của lập trình viên theo công nghệ, theo trình độ & lĩnh vực và theo vị trí tại Báo cáo Thị trường IT 2022 của TopDev. hoặc tính lương Gross – Net thông qua công cụ tính lương miễn phí của TopDev:

Tính lương chuẩn với công cụ tính lương gross sang net từ TopDev

Kết luận

Bài viết đã cung cấp thông tin cho bạn về top các ngôn ngữ lập trình lương cao nhất. Tuy nhiên, để tìm được câu trả lời chính xác cho câu hỏi ngôn ngữ lập trình nào lương cao nhất còn phụ thuộc vào nhiều yếu tố. 

Để đạt mức lương cao, ngoài việc nắm vững một ngôn ngữ lập trình, quan trọng hơn là phát triển kỹ năng chuyên môn sâu trong lĩnh vực mà bạn quan tâm, có khả năng giải quyết các vấn đề phức tạp và đóng góp vào các dự án có giá trị cao. Chúc bạn sớm tìm được công việc lương cao và phù hợp với mình.

Tổng hợp bởi TopDev

Xem thêm:

Tìm kiếm việc làm IT mới nhất tại TopDev!

Mất bao lâu để trở thành lập trình viên quốc tế?

Mất bao lâu để trở thành lập trình viên quốc tế?

Bài viết được sự cho phép bởi tác giả Sơn Dương

Trong chúng ta chắc hẳn đã từng nghe về một “quy tắc” nói rằng để trở thành một chuyên gia trong một lĩnh vực nào đó bạn phải mất 10,000 giờ. Vậy để trở thành lập trình viên quốc tế, bạn cần bao lâu? Có đúng là phải cần tới 10000 giờ?

Nghe đến đây, chắc hẳn nhiều bạn giật mình và chán nản. Thế này thì chết đói trước khi kiếm được tiền từ nghề lập trình viên. Tuy nhiên, bạn cũng đừng quá lo lắng, quy tắc này cũng không thực sự hoàn toàn đúng đâu.

Trong bài viết này, mình sẽ giải thích tại sao bạn không cần phải mất 10,000 giờ mà vẫn là chuyên gia lập trình.

Bắt đầu thôi chứ nhỉ!

Trở lại năm 2011, Malcolm Gladwell cho xuất bản cuốn “Những kẻ xuất chúng“(Outliers). Cuốn sách chia sẻ về cách mà những người thành công nhất trên thế giới đạt được địa vị xuất chúng.

Trong cuốn sách, Gladwell đã tranh luận rằng có một “kim chỉ nam” ở những bậc thầy đẳng cấp thế giới trong các lĩnh vực khác nhau. Đó chính là học thuyết 10,000 giờ.

Quy tắc 10,000 giờ là gì?

Phần lớn chúng ta khá quen thuộc với quy tắc này. Ngắn gọn mà nói, nó cho rằng để trở thành bậc thầy đẳng cấp thế giới trong mọi lĩnh vực, chúng ta cần luyên tập đúng cách trong 10,000 giờ.

Oh, thử xem nhé, bạn sẽ phải luyện tập có chủ đích trong 40 giờ mỗi tuần. Cần khoảng 52 tuần một năm (không tính những năm nhuận). Vậy, nếu bạn có điều kiện để trở thành người xuất chúng, bạn cần luyện tập 40 giờ mỗi tuần và khoảng 5 năm để thành bậc thầy trong lĩnh vực của bạn.

Cũng dễ hiểu khi Gladwell đã đơn giản hóa ý tưởng của mình để bán được nhiều sách hơn. Mình không có vấn đề gì về điều đó.

Nhưng có nhiều vấn đề cần phải suy nghĩ ở quy tắc 10,000 giờ này.

  Nghề lập trình viên có những ưu nhược điểm gì?

Một vấn đề thực sự làm tổn thương những người đang học lập trình.

Một vài năm trở lại đây, phương tiện truyền thông đã thay đổi ý nghĩa thực sự của quy tắc 10,000 giờ này.

Tưởng chừng như một trò chơi trên điện thoại vậy. Họ biến nghĩa của nó từ  “mất 10,000 giờ để trở thành một chuyên gia trong một lĩnh vực tiên tiến” sang ” mất 10,000 giờ chỉ để làm tốt một thứ gì đó”.

Mất bao lâu để trở thành lập trình viên quốc tế?

Nếu bạn muốn thành chuyên gia lập trình viên quốc tế, nghe tới điều này có thể làm bạn thấy chán nản.

Bạn có thể nghĩ rằng “mình sẽ không bao giờ có đủ thời gian để học lập trình” và thay đổi ngay sang những công việc khác.

Việc làm IT Fresher dành cho bạn

Điều đó hoàn toàn sai lầm. Hãy cùng tìm hiểu tại sao nhé!

Chia sẻ chút xíu về mình nha. Trước khi bắt tay xây dựng trang web VNTALKING, mình đã từng làm lập trình viên tại nhiều công ty như Samsung, Panasonic…

Mình từng học ngành điện tử viễn thông tại đại học Bách Khoa Hà Nội. Hồi sinh viên, mình đã dành rất nhiều giờ để tìm hiểu kiến thức lập trình cơ bản như thuật toáncấu trúc dữ liệu

Việc hiểu các khái niệm nền tảng giúp mình được tuyển dụng vào các công ty. Đó cũng là lí do tại sao mình tập trung nhiều vào kiến thức nền tảng khi chia sẻ các kiến trên VNTALKING

  Top 6 nguyên lý thiết kế microservices cho lập trình viên có kinh nghiệm

Nhưng khi bước vào công việc lập trình thực sự, mình bắt đầu làm những việc mà chưa bao giờ được trải nghiệm thời sinh viên, có thể kể tới như:

  • Sử dụng Ruby, Rails hay Javascript để xây dựng các hệ thống phần mềm lớn.
  • Viết các kiểm thử tự động cho phần mềm.
  • Làm việc nhóm trên một codebase.

Vậy, tại sao các công ty đó lại tuyển mình khi mình không dành nhiều giờ (chắc chắn là không được 10,000 giờ) để học trước đó?

Họ thuê mình bởi công ty thuê những người lập trình như một sự đầu tư.

Tại sao lại vậy nhỉ?

Trong buổi phỏng vấn, nhà tuyển dụng sẽ không hỏi rằng bạn đã dành đủ 10,000 giờ để học lập trình hay chưa?

Đó là bởi vì họ không kì vọng bạn sẽ biết mọi thứ trong ngày đầu đâu.

Vậy, vào ngày đầu tiên đi làm, những điều mà các công ty mong đợi ở bạn là gì? Đó là:

Mất bao lâu để trở thành lập trình viên quốc tế?

Khi bạn dành nhiều thời gian hơn vào viết code, bạn sẽ nhận ra rằng: phần lớn các vấn đề đều có thể giải quyết được nếu bạn kiên trì tìm hiểu và nghiên cứu.

Một lập trình viên giỏi thường đặc biệt tốt 3 điều sau:

  • Tìm kiếm trên google.
  • Tự học những khái niệm mới rất nhanh.
  • Có khả năng tự sửa lỗi.

Tất nhiên, sẽ không hề tốn 10,000 giờ để giỏi những kĩ năng đó. Do đó, bạn sẽ không cần 10000 giờ để học lập trình cũng như trở thành một lập trình viên quốc tế.

Cách tốt nhất để đạt mục tiêu là không đếm giờ.

Vậy, nên tiếp tục việc học lập trình như thế nào? Một câu hỏi rất hay. Bài viết dưới đây, mình sẽ viết chi tiết làm thế nào để học code nhanh và hiệu quả nhất, các bạn đón đọc nhé.

Đam mê, kiên trì cùng sự trợ giúp của bạn bè và đồng nghiệp, bạn sẽ sớm có được thành công.

Nếu bạn có điều muốn chia sẻ, đừng ngần ngại để lại bình luận bên dưới nhé!

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

Xem thêm:

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev

Git Submodules và ứng dụng trong việc chia sẻ tài nguyên dùng chung

Git Submodules và ứng dụng trong việc chia sẻ tài nguyên dùng chung

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Trình quản lý gói (Package Manager) được tích hợp hay được tạo ra và sử dụng trong các ngôn ngữ lập trình là một cách hữu hiệu để chúng ta tái sử dụng mã được chia sẻ. Ví dụ như trong Javascript/Node.js có npm với hàng triệu packages được chia sẻ bởi rất nhiều lập trình viên trên thế giới. Mỗi khi cần gì, việc đầu tiên chúng ta thường làm là tìm xem có gói nào đáp ứng được nhu cầu để giảm thời gian phát triển phần mềm.

Việc chia sẻ các gói mà ai cũng có thể tìm kiếm và sử dụng đôi khi không phù hợp trong một số trường hợp, ví dụ chúng ta tạo ra các hàm tiện ích chỉ để sử dụng trong các dự án nội bộ của công ty hay cho riêng cá nhân mà không muốn chia sẻ với bất kì ai khác. Mặc dù nhiều trình quản lý gói cung cấp tính năng để “publish” các gói chia sẻ trong nội bộ, tuy nhiên điều đó vẫn có những hạn chế nhất định như chi phí, thời gian triển khai…

Trong git, có một tính năng gọi là submodule có thể giúp chúng ta giải quyết được trường hợp cần chia sẻ thư mục hoặc các tệp tin với nhau trong các repository, qua đó chúng ta không cần phải tốn nhiều công sức để chia sẻ những đoạn mã tiện ích giữa các dự án với nhau nữa. Chi tiết như thế nào thì hãy đọc tiếp bài viết dưới đây nhé.

Git submodule là gì?

Git Submodule là một tính năng mạnh mẽ trong Git cho phép thêm và quản lý các repository khác trong repository của bạn. Nó cung cấp một cách để tích hợp và theo dõi các phụ thuộc mã nguồn bên ngoài một cách dễ dàng.

Về cơ bản, một submodule là một kho lưu trữ Git được nhúng trong một kho lưu trữ Git khác. Nó hoạt động như một con trỏ chỉ đến một commit cụ thể trong một kho lưu trữ bên ngoài. Bằng cách sử dụng submodule, bạn có thể thêm và sử dụng thư viện mã nguồn bên ngoài, framework hoặc bất kỳ dự án nào khác như một thành phần của dự án.

Cách đơn giản nhất để hình dung submodule hoạt động là chia sẻ những đoạn mã dùng chung trong các dự án. Ví dụ, bạn tạo ra một repository chỉ chứa các tệp với các hàm tiện ích (utils), sau đó muốn sử dụng chúng trong một dự án khác thì chỉ cần tạo một thư mục liên kết đến repository tiện ích.

git submodules work

Việc tận dụng submodule mang lại cho chúng ta nhiều sự tiện lợi trong cộng tác và tái sử dụng mã, vì các submodule cũng là một kho lưu trữ git nên nó có thể được phát triển thêm tính năng, sửa lỗi, bảo trì… như các dự án thông thường khác. Khi muốn nhận thay đổi, chỉ cần một thao tác pull submodule về để lấy về mã mới nhất. Thậm chí chúng ta còn có thể tham gia phát triển submodule ngay trong dự án đang liên kết đến nó bằng cách truy cập vào thư mục chứa submodule và commit như bình thường.

  Biến Git và GitHub trở thành công cụ đắc lực cho Software Engineer

Ứng dụng trong việc chia sẻ tài nguyên dùng chung

Giả sử chúng ta đang ở thư mục dự án A và muốn thêm submodule là B có url: https://git-hub.com/2coffee/awesomelibrary

Thêm một submodule bằng lệnh add:

$ git submodule add https://git-hub.com/2coffee/awesomelibrary

Kiểm tra lệnh trên vừa làm gì:

$ git status

On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

 new file:   .gitmodules
 new file:   awesomelibrary

Git báo có 2 tệp mới được thêm vào, nó chứa chỉ dẫn cho submodule được liên kết.

  Git là gì mà lại giúp bạn và cả team làm việc tốt hơn?

Hãy thử mở file .gitmodules ra bạn sẽ thấy nội dung trông giống như là:

[submodule "awesomelibrary"]
 path = awesomelibrary
 url = https://git-hub.com/2coffee/awesomelibrary

Ngay bây giờ bạn có thể kiểm tra thư mục awesomelibrary và sử dụng các đoạn mã trong đó như nó thuộc về project.

Tham khảo Job FrontEnd HOT trên TopDev!

Tổng kết

Bên cạnh việc sao chép mã hay đóng gói mã thành thư viện để sử dụng trong một dự án nội bộ khác, chúng ta còn có thêm một cách nữa là sử dụng git submodule. Nó đơn giản là liên kết một dự án git khác vào một thư mục nào đó trong project hiện tại, qua đó có thể thoải mái nhận những thay đổi mới nhất từ nó mà không cần phải làm thêm nhiều bước.

Bài viết gốc được đăng tải tại 2coffee.dev

Xem thêm:

Tìm việc làm IT mới nhất trên TopDev

Shipit – Tự động deploy Javascript project

Shipit – Tự động deploy Javascript project

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

Để deploy 1 project Javascript đơn giản lên server (apache hoặc ngnix tuỳ sở thích các bạn) thì thường thường chúng ta phải làm các bước cơ bản như build local, zip file source, copy file zip lên server, unzip và chạy các câu lệnh cần thiết. Nếu lúc nào deploy chúng ta cũng tự làm mấy bước như thế này thì thật sự là khá mệt. Hôm nay tôi sẽ hướng dẫn các bạn cách deploy tự động 1 project Nodejs bằng Shipit. Thế Shipit là gì và sử dụng nó như thế nào,… tôi cũng sẽ giới thiệu luôn trong bài này luôn.

Shipit là gì?

Nói nôm na các bạn dễ hiểu, Shipit là công cụ tự động hoá các bước deploy dành cho các bạn Javascript developer. 1 dòng lệnh trong Shipit config ta coi như 1 task. Shipit sẽ thực hiện 1 flow tasks dựa trên package orchestrator, login và chạy các lệnh SSH trên server thông qua OpenSSH. Chúng ta có thể sử dụng Shipit để tự động hoá build và deploy cho hàng loạt các ứng dụng Nodejs.

Chuẩn bị:

Trong bài hướng dẫn này tôi sử dụng các tool như sau, các bạn có thể setup giống tôi hoặc thay thế bằng các tool, phần mềm tương tự cũng được:

  1. Server chạy Ubuntu hoặc Debian Linux và cài đặt rsync.
  2. Web server Apache.
  3. node và yarn được cài đặt trên môi trường development. Ở máy tôi đang cài Nodejs 14.19.0 và yarn 1.22.17 trên Ubuntu 21. Các bạn có thể tùy thích xài npm cũng được.
  4. Các bạn cũng cần cài rsync và git trên môi trường development.

  7 khái niệm Javascript cơ bản không thể bỏ qua

  Callback hell là gì? 6 cách “trị” callback hell trong javascript

Bước 1: Khởi tạo git repo

Cái này chắc ai cũng biết nên tôi sẽ không giới thiệu cách làm ở đây. Trong bài này tôi tạo 1 repo tên là Angular để cho các bạn dễ làm ví dụ, cũng như sau này các bài viết về Angular tôi cũng sẽ update vào đó để demo.

https://github.com/tungnt92/angular-demo.git

Bước 2: Cài đặt Shipit package

Việc đầu tiên cần làm chắc chắn là cài đặt Shipit vào project mà các bạn cần deploy. Ta thực hiện các bước như sau:

Tôi tạo 1 file package.json:

yarn init

Sau khi chạy command trên tôi được 1 file tên package.json như vầy, trong file này chứa các script như start application, build, clean up,… cũng như những thông tin cơ bản của application và các dependency cần thiết để chạy:

{
  "name": "angular-demo",
  "version": "1.0.0",
  "main": "index.js",
  "repository": "git@github.com:tungnt92/angular-demo.git",
  "author": "tungnt92 <nguyeentung@gmail.com>",
  "license": "MIT"
}

Sau đó tôi bắt đầu cài đặt Shipit, tôi chạy command sau:

yarn add --dev shipit-cli
yarn add --dev shipit-deploy

Các bạn lưu ý tôi sử dụng --dev để chỉ cho yarn thấy rằng tôi muốn cài package này ở development dependency. File package.json của tôi có nội dung cuối cùng như sau, các bạn có thể làm theo các bước trên hoặc đơn giản là copy file này cho nhanh.

{
  "name": "angular-demo",
  "version": "1.0.0",
  "main": "index.js",
  "repository": "git@github.com:tungnt92/angular-demo.git",
  "author": "tungnt92 <nguyeentung@gmail.com>",
  "license": "MIT",
  "devDependencies": {
    "shipit-cli": "^5.3.0",
    "shipit-deploy": "^5.3.0"
  }
}

Tham khảo việc làm JavaScript tại Hồ Chí Minh trên TopDev

Bước 3: Config shipit

Tôi đã viết sẵn 1 file shipit config với đầy đủ các chức năng mà tôi thấy cần thiết để deploy project javascipt nằm ở cuối bài viết. Các bạn có thể copy file này, sau đó sửa các config information cho phù hợp với project của mình.

Giờ tôi sẽ đi từng bước, đầu tiên tôi tạo file shipitfile.js ở root project với các init command sau:

module.exports = shipit => {
  require('shipit-deploy')(shipit)

  const stagingConfig = {
    deployUser: 'bitnami',
    key: 'doc/aws/server-staging.pem',
    deployTo: '/home/bitnami/htdocs/projects/',
  }

  // More default config goes here

  shipit.initConfig({
    staging: {
      ...stagingConfig,
      projectName: 'angular-demo',
      servers: ["bitnami@xxx.xxx.xxx.xxx"],
    },
  })
}

Chỗ này các bạn lưu ý các config sau:

  • stagingConfig: tôi gom các config nào giống nhau ở các môi trường lại, mục đích cho gọn gàng và dễ import và chỉnh sửa khi cần.
  • staging: alias của server mà tôi sẽ deploy project của mình lên. Các server alias thường sử dụng như production, development,…
  • projectName: định danh tên của project, chỗ này sẽ dùng để xác định thư mục deploy.
  • key: trong trường hợp này tôi tạo folder ./doc/aws/ để chứa các server key. Các bạn nhớ thêm vào git ignore của mình.

Sau đó tôi viết thêm task cần thiết cho việc deploy như build project, setup remote server,…

...
shipit.task("angular:deploy", async () => {
    let zipFileName = `${shipit.config.projectName}.zip`

    // Zip the dist folder into dist.zip package then remove the folder as we don't need it anymore
    await shipit.local(`cd dist && zip -r ../${zipFileName} ${shipit.config.projectName}`);

    // Create deployTo folder if it's not existed
    await shipit.remote(
      `sudo mkdir -p ${shipit.config.deployTo} && sudo chown -R ${shipit.config.deployUser}: ${shipit.config.deployTo}`
    );

    // // Copy dist.zip to servers
    await shipit.copyToRemote(zipFileName, shipit.config.deployTo);

    // // Remove the dist.zip
    await shipit.local(`rm ${zipFileName}`);

    // // remove old frontend files
    await shipit.remote(`rm -rf ${shipit.config.deployTo}/${shipit.config.projectName}/*`);

    // // On server, unzip the dist.zip file then remove the zip package
    await shipit.remote(
      `cd ${shipit.config.deployTo} && unzip -o ${zipFileName} && rm ${zipFileName}`
    );
  });

Các config mà bạn cần lưu ý:

  • angular:deploy: tôi đặt tên cho task mà tôi sẽ gọi lúc deploy.
  • Các task khác tôi đã để comment vào rồi, các bạn đọc trên đó.

Cuối cùng ta được file config như sau:

module.exports = function (shipit) {
  // Load shipit-deploy tasks
  require("shipit-deploy")(shipit);

  const stagingConfig = {
    deployUser: 'bitnami',
    key: 'doc/aws/server-staging.pem',
    deployTo: '/home/bitnami/htdocs/projects/',
  }

  shipit.initConfig({
    staging: {
      ...stagingConfig,
      projectName: 'angular-demo',
      servers: ["bitnami@xxx.xxx.xxx.xxx"],
    },
  })

  shipit.task("angular:deploy", async () => {
    let zipFileName = `${shipit.config.projectName}.zip`

    // Zip the dist folder into dist.zip package then remove the folder as we don't need it anymore
    await shipit.local(`cd dist && zip -r ../${zipFileName} ${shipit.config.projectName}`);

    // Create deployTo folder if it's not existed
    await shipit.remote(
      `sudo mkdir -p ${shipit.config.deployTo} && sudo chown -R ${shipit.config.deployUser}: ${shipit.config.deployTo}`
    );

    // // Copy dist.zip to servers
    await shipit.copyToRemote(zipFileName, shipit.config.deployTo);

    // // Remove the dist.zip
    await shipit.local(`rm ${zipFileName}`);

    // // remove old frontend files
    await shipit.remote(`rm -rf ${shipit.config.deployTo}/${shipit.config.projectName}/*`);

    // // On server, unzip the dist.zip file then remove the zip package
    await shipit.remote(
      `cd ${shipit.config.deployTo} && unzip -o ${zipFileName} && rm ${zipFileName}`
    );
  });
};

Đến đây về cơ bản tôi đã hoàn thành xong việc setup shipit. Tôi có thể deploy project lên môi trường staging bằng command sau:

./node_modules/.bin/shipit staging angular:deploy

Nhưng đặt trường hợp tôi muốn chạy thêm command gì đó ví dụ build application trước khi deploy, tôi phải chạy câu sau:

ng build angular --prod --aot && ./node_modules/.bin/shipit staging angular:deploy

Quá dài, việc ghi nhớ và gõ câu command dài như xe lửa như vậy với tôi là bất khả thi. Nên tôi làm thêm 1 bước là gom các command cần thiết vào cùng 1 file, sau này tôi chỉ cần execute file này khi muốn deploy, chỉnh sửa hay thêm bớt command cũng dễ dàng.

Tôi tạo folder sau ./deploy. Sau đó tạo file với tên theo cú pháp:

[project-name]-environment.sh

Ví dụ: angular-demo-staging.sh

Trong file đó tôi viết tất cả các command cần thiết vào:

#!/usr/bin/env bash
ng build angular --prod --aot && ./node_modules/.bin/shipit staging angular:deploy

Sau này bất cứ khi nào cần deploy staging tôi chỉ cần chạy command:

deploy/angular-demo-staging.sh

Chúc các bạn có thể có thêm chút kiến thức về auto deploy cho project javascript sử dụng shipit.

Happy Hacking

Bài viết gốc được đăng tải tại omatsuri.blog, biết thêm về tác giả tại LinkedIn

Xem thêm:

Đừng bỏ lỡ hàng loạt IT job tại TopDev

Data Modeling with DynamoDB: Single table design (Xây dựng mô hình dữ liệu với DynamoDB: Thiết kế bảng đơn lẻ)

Bài viết đến từ anh Vũ Tuấn Nghĩa – Quản lý cao cấp hoạch định dữ liệu Data Engineering team @Techcombank

DynamoDB là một dịch vụ cơ sở dữ liệu NoSQL cung cấp hiệu năng nhanh và nhất quán – có khả năng mở rộng và linh hoạt trong cách sử dụng. Khác với cơ sở dữ liệu quan hệ (RDMS), DynamoDB không sử dụng joins và các cấu trúc quan hệ khác để lưu trữ và truy vấn dữ liệu. Thay vào đó, bạn sẽ thiết kế table của mình theo Single design table – 1 table duy nhất phục vụ toàn bộ application hay service, việc này giúp hiệu suất đọc và ghi nhanh hơn ở scale lớn và giảm chi phí cloud.

Trong bài viết này, chúng mình sẽ khám phá các lợi ích và thách thức của việc sử dụng Single design table trong DynamoDB, cũng như cách Datalake ở Techcombank sử dụng để đáp ứng và tối ưu như cầu sử dụng.

Data Modeling with DynamoDB: Single table design

Single table design

Trong tài liệu trang chủ AWS có đề cập:

You should maintain as few tables as possible in a DynamoDB application. Having fewer tables keeps things more scalable, requires less permissions management, and reduces overhead for your DynamoDB application. It can also help keep backup costs lower overall.

Thật vậy, nhưng làm thế nào để hạn chế số lượng bảng hay thậm chí một bảng duy nhất cho toàn bộ application/service tuy nhiên vẫn đảm bảo được thiết kế đó phục vụ được tất cả nhu cầu?

Multi-table vs Single-table

Hãy nhìn vào ví dụ như sau:

Đây là cách làm thông thường khi thiết kế data ở các hệ thống RDMS, sử dụng các chuẩn Database Normalization(1NF, 2NF, 3NF,…).

Mindset khi thiết kế data dạng Multi-table là tư duy lưu trữ data đầu tiên, tối ưu trong việc lưu trữ và đáp ứng tất cả query patterns ở một hiệu năng (performance) trung bình.

Giờ hãy tiếp cận theo một hướng khác:

Know your query patterns first

Luôn tiếp cận bài toán với xu hướng dành nhiều thời gian để thu thập cách User sử dụng hệ thống của mình là như thế nào, các query patterns là gì.

…you shouldn’t start designing your schema for DynamoDB until you know the questions it will need to answer. Understanding the business problems and the application use cases up front is essential.

Giả dụ với bài toán bên trên, chúng ta có 2 query patterns là:

  1. Query thông tin Customer bằng email
  2. Query thông tin Order bằng Customer’s email

Khi đã có thông tin như trên, chúng ta đi vào kỹ thuật đầu tiên khi thiết kế Single-table:

Index overloading

Với Query pattern đầu tiên

  1. Composite primary key:

    a. pk – Partition key: email

    b. sk – Sort key: email

2. Attributes:

    a. name

    b. address

Cùng với table đó, để serving query pattern thứ 2 

  1. Composite primary key:

    a. pk – Partition key: email

    b. sk – Sort key: orderID

2. Attributes:

    a. order date

    b. order status

    c. order amount

Mỗi record sẽ có composite PK khác nhau để phục vụ cho từng query patterns. Nhờ indexes (partition key, sort key) giờ đây được sử dụng đa dạng, nhiều loại data giúp cho số lượng cần indexing giảm xuống, từ đó:

  • Tăng write performance: do ít index cần update lúc thực hiện write operation.
  • Giảm chi phí cloud: do ít index cần maintaining cho Database.

Comfort with De-normalized and Pre-join

Với đặc thù thiết kế của single-table, bạn phải làm quen với chuyện de-normalized trong lúc thiết kế schema, cũng như thực hiện pre-join data vào Attributes của 1 record nhiều nhất có thể – hạn chế round trip khi truy xuất data.

Single-table design at Datalake Techcombank

Agile vs Know your query pattern first

Hầu hết các dự án IT hiện nay đều theo đuổi mô hình Agile – chấp nhận sự thay đổi, vậy làm thế nào để thiết kế Single-table có thể thành hiện thực khi nó yêu cầu “Know your query pattern first”. Câu trả lời là nhờ có index overloading cộng với đặc thù flexible attributes của DynamoDB(NoSQL) chúng ta hoàn toàn có thể mở rộng thêm các query patterns. Có một số những tips trong quá trình sử dụng bọn mình có đúc kết được như sau:

  1. Prefix in PK and SK: như ví dụ bên trên với PK của customer email sẽ có prefix là “cemail#”, với SK của orderID sẽ có prefix là “orderid#”, việc này giúp việc về sau mở rộng indexes một cách dễ dàng và tránh bị trùng lặp do mình đã quy hoạch từ ban đầu.
  2. Update data trong Single-table sẽ phức tạp hơn, do data bị duplicate (attributes) ở các item với nhiều bộ Primary key khác nhau, do đó khi có 1 field data được update, bạn cần update tất cả các item ở các bộ Primary key chứa field đó.

Schema migration

Đây là một trong những bài toán phức tạp nhất trong quá trình vận hành DynamoDB (NoSQL) cùng với single-table design, việc schema upgrade thường xuyên xảy ra (thêm cột, thay đổi column type, thay đổi primary key,..) khiến như cầu schema migration một cách dễ dàng càng cần thiết:

  1. Schema migration cho attributes: do mang yếu tố flexible Attributes, mỗi Record là 1 object với schema độc lập, để có thể thêm cột ở tất cả các object, đòi hỏi phải scan tất cả các object để update. Nhược điểm là full scan để update sẽ tốn nhiều thời gian, và trong lúc đó table của mình sẽ ở trạng thái inconsistent, có những records đã được update, có records không.
  2. Schema migration cho việc thay đổi primary key: về bản chất việc thay đổi Partition key hay sort key thì DynamoDB sẽ tạo 1 record mới và xoá record cũ đi. Trong trường hợp này hãy cân nhắc sử dụng overloading-index nếu có thể, trong trường hợp bắt buộc phải chuyển sang Primary key mới làm tương tự như với schema migration.

Kết luận

Việc chọn sử dụng multi-table hay single-table phụ thuộc vào nhiều yếu tố, team đang muốn tối ưu điều gì, và hơn hết không có một giải pháp hoàn hảo nào giải quyết được tất cả các bài toán.

Ở Datalake của Techcombank, chúng tôi muốn tối ưu:

  • Thời gian của Engineers tập trung giải quyết các bài toán business, mà ít phải lo lắng đến việc vận hành servers.
  • Khả năng mở rộng, chi phí tối ưu sử dụng.
  • Mang đến trải nghiệm linh hoạt cho engineers.

Từ đó chúng tôi chọn DynamoDB cũng với Single-table design (một trong những storage stack của Datalake) để đáp ứng cũng như giải quyết các yêu cầu phát triển.


Thuộc dự án Inside GemTechnology do TopDev hợp tác cùng Techcombank triển khai, chuỗi nội dung thuần “Tech” độc quyền được chia sẻ bởi đội ngũ chuyên gia Công nghệ & Dữ liệu tại Techcombank sẽ được cập nhật liên tục tại chuyên mục Tech Blog | Techcombank Careers x TopDev. Cùng theo dõi & gặp gỡ các chuyên gia bạn nhé!

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

Các cơ hội việc làm tại Techcombank


Bài viết liên quan

Data is all about orchestration (Tầm quan trọng của việc điều phối khi làm việc với dữ liệu)

Bài viết đến từ anh Vũ Tuấn Nghĩa - Quản lý cao cấp hoạch định dữ liệu Data Engineering team @Techcombank Data orchestration là một khối xây dựng cốt lõi của các hệ thống ETL dữ liệu, và là một công cụ đã có từ lâu đời và được áp dụng trong nhiều hệ thống khác nhau. Khi xây dựng Data Lake tại Techcombank, chúng mình có cơ hội thiết kế nhiều component/system từ đầu, từ hệ thống Data sourcing đến Datalake, đến hệ thống data ETL pipeline trên các zones của Data Lake. Để đáp ứng các nhu cầu và thách thức thực tế, ta cần có một hệ thống Data orchestration để giải quyết các bài toán: Cơ chế trigger các downstream job một cách linh hoạt mà không gây khó khăn trong quá trình vận hành Rút ngắn thời gian phát triển, xây dựng và kiểm thử Hạn chế sự phụ thuộc lẫn nhau gây ra chain failure Hôm nay chúng ta sẽ tìm hiểu về Data orchestration và cách giả [...]

Data Lake - Nền tảng lý trí cho mọi quyết định tài chính

Anh Nguyễn Quang Huy từng có kinh nghiệm nhiều năm về Khoa học dữ liệu cũng như phát triển và quản lý Hệ thống Dữ liệu lớn (Big Data) khi công tác tại các tập đoàn đa quốc gia tại tại Sing và Mỹ. Được truyền cảm hứng từ những bài toán lớn trên hành trình số hóa mà Techcombank đang giải quyết cho thị trường ngân hàng, Anh Nguyễn Quang Huy đã quyết định quay trở về Việt Nam để đồng hành với đội ngũ Techcombank trong giai đoạn chuyển đổi số mạnh mẽ nhất từ trước đến nay. Ở thời điểm hiện tại, anh đang giữ vị trí Director, Data Engineer tại Techcombank. Công việc chính của anh là phụ trách xây dựng các hoạt động, dự án liên quan đến Data Lake (Hồ dữ liệu) tại Techcombank. Hãy cùng nghe câu chuyện về Data Lake sẽ giải quyết những bài toán lớn nào cho hàng triệu khách hàng của Techcombank. Theo anh đâu là tầm quan trọ [...]

Data is all about orchestration (Tầm quan trọng của việc điều phối khi làm việc với dữ liệu)

Bài viết đến từ anh Vũ Tuấn Nghĩa – Quản lý cao cấp hoạch định dữ liệu Data Engineering team @Techcombank

Data orchestration là một khối xây dựng cốt lõi của các hệ thống ETL dữ liệu, và là một công cụ đã có từ lâu đời và được áp dụng trong nhiều hệ thống khác nhau. Khi xây dựng Data Lake tại Techcombank, chúng mình có cơ hội thiết kế nhiều component/system từ đầu, từ hệ thống Data sourcing đến Datalake, đến hệ thống data ETL pipeline trên các zones của Data Lake. Để đáp ứng các nhu cầu và thách thức thực tế, ta cần có một hệ thống Data orchestration để giải quyết các bài toán:

  1. Cơ chế trigger các downstream job một cách linh hoạt mà không gây khó khăn trong quá trình vận hành
  2. Rút ngắn thời gian phát triển, xây dựng và kiểm thử
  3. Hạn chế sự phụ thuộc lẫn nhau gây ra chain failure

Hôm nay chúng ta sẽ tìm hiểu về Data orchestration và cách giải quyết bài toán ở Techcombank.

Data Orchestration là gì?

Data orchestration là nền tảng platform có nhiệm vụ quản lý và tự động hoá flow của data xuyên suốt giữa các hệ thống, application và các hệ thống lưu trữ.

Có thể hiểu đơn giản như như hình dưới như sau:

  1. Khi có 1 lệnh trigger
  2. Job 1 được execute
  3. Khi Job 1 done, Job 2 và Job 3 được execute
  4. Khi Job 2 và Job 3 cùng done, Job 4 được execute

Nhu cầu cần một Data Orchestration xuất hiện khi có dependency giữa các hệ thống. Khi có một job phụ thuộc vào job khác, thì sẽ cần 1 hệ thống ở giữa để không chỉ trigger mà còn đảm bảo với từng Job riêng biệt, chỉ được bắt đầu sau khi tất cả các phần phụ thuộc đã hoàn tất (ví dụ: Job 4).

Sự phát triển của Data Orchestration patterns

First Gen – Flight schedule

Phiên bản đầu tiên cũng như cổ điển nhất của Orchestration, được dùng khá phổ biến ở nhiều IT system (ví dụ: hệ thống giờ bay của máy bay).

Job được trigger dựa theo fixed time hoặc interval time và không phụ thuộc vào các job upstream có hoàn tất hay không. Để phòng trừ trường hợp các Job chạy tốn thời gian hơn kế hoạch, thường sẽ thêm các buffer giữa các job.

Điểm hạn chế của design này là cũng chính là task delay – buffer time

Lúc này Job 2 sẽ nhận stale input data khiến data output của Job 2 cũng sai, dẫn đến cả pipeline đang xử lý data bị sai lệch.

Current Gen – Train schedule

Phiên bản orchestration được sử dụng rộng rãi trong các software hiện đại ngày nay, nổi bật có Airflow, Dagster, Prefect, và dbt. Core concept sử dụng Directed Acyclic Graph (DAG) để định nghĩa sự phụ thuộc giữa các job và stateful application để quản lý trigger và start job.

Điểm hạn chế của design này là

  1. Mono-DAG

Việc sử dụng DAG để liên kết phụ thuộc giữa các job với nhau, dẫn đến trong quá trình phát triển

a. việc liên tục thêm những job vào dẫn đến “mạng nhện” DAG, khiến chi phí maintain bao gồm: compile, test càng ngày càng tăng cao khiến development cycle chậm dần theo thời gian.

b.

c. việc xác định owner of DAG cũng là vấn đề nhức đầu, nhất là khi có issue, việc ảnh hưởng đến nhiều job (nhiều team) khiến chi phí phối hợp rất tốn nhiều thời gian.

2. DAG of DAG
Một hướng giải quyết khác là thay vì sử dụng một mono-DAG, chúng ta sẽ tạo DAG of DAG. Tuy nhiên ta lại gặp phải vấn đề lớn là do giờ đây tầng phụ thuộc là DAG, sẽ giảm sự linh hoạt trong định nghĩa sự phụ thuộc của các job, nhất là trong trường hợp các data flow quan trọng, với SLA thấp.

Bài toán ở Techcombank

Hệ thống Datalake của Techcombank được chia làm 2 part:

  1. ETL Sourcing dữ liệu từ tất cả các hệ thống Data sources, tập kết data ở Raw zone, do đặc thù đơn giản về mặt nghiệp vụ, không có transformation, không dependency → Data orchestration sử dụng Airflow – out of the box solution.
  2. Với các ETL giữa các zone trên On-cloud Datalake, các ETL về mặt nghiệp vụ yêu cầu các dependency phức tạp, việc sử dụng các stateful Orchestration(current Gen) như Airflow hay AWS StepFunction gặp phải nhiều khó khăn trong quá tình development or operation (mono-DAG và DAG of DAG) → dẫn đến không đáp ứng được nhu cầu sử dụng của các team development.

Từ đó team mình có phát triển framework Orchestration để giải quyết bài toán gặp phải.

Event-driven Orchestration

Thay vì build 1 hệ thống centralized stateful orchestration thì team mình tiếp cận theo một mindset khác:

  1. Condition-based over state
  2. Events within queue over hardly dependency
  3. Configuration as code over code-first approach

Condition-based over state

Việc sử dụng Conditions để xác định xem khi nào job được trigger thay vì đơn giản dùng state của upstream job khiến việc config trigger rất linh hoạt trong quá trình sử dụng. Sau đây là một số ví dụ trong quá trình sử dụng:

Condition để trigger job khi cả 2 job_1, job_2 succeeded
{
  "trigger_events":[
     "job_1", "job_2"
  ],
  "conditions": [
    {
      "name": "all_jobs_succeeded",
      "params": {
        "job_ids": [
          "job_1",
          "job_2"
        ],
        "within": 86400
      }
    }
  ]
}
Condition để trigger job khi đến ngày 5 or 18 của tháng và lần chạy của job cuối cùng success
{
  "trigger_events": [
    {
      "schedule_expression": "cron(45 01 * * ? *)"
    }
  ],
  "conditions": [
    {
      "name": "is_date_of_month",
      "params": {
        "days": [
          5,
          18
        ]
      }
    },
    {
      "name": "last_run_succeeded"
    }
  ]
}

Những functions như “last_run_succeeded“, “all_jobs_succeeded” đều là những custom function, do đó khi có nhu cầu trigger theo một logic nào đó, các bạn engineer hoàn toàn có thể contribute vào core Orchestration framework.

Events within queue over hardly dependency

Thay vì dùng DAG để định nghĩa dependency giữa các Job một cách chặt chẽ, chúng ta sẽ dùng queue system(ở đây bọn mình dùng AWS SQS) để decoupling giữa producer và consumer từ đó giải quyết:

  1. Không còn Mono-DAG – mỗi Job được định nghĩa độc lập ở small unit DAG, mỗi khi job hoàn thành, sẽ bắn ra event với naming đã được định nghĩa trong config
    {"finish_events": [ { "name": "job_1_completed" } ] }
  2. Tăng tốc độ build và testing time – do mỗi DAG được định nghĩa độc lập và ở small unit nhất do đó tăng thời gian development và testing

Configuration as code over code-first approach

Hệ thống Datalake theo đuổi mindset “Configuration as Code“

để tách biệt Operation khỏi development từ đó tăng tốc khả năng release của các system, hầu hết các system của Datalake ở Techcombank đều có 2 repo:

  1. Repository chứa core code logic
  2. Repository chứa configuration

Sau đây là ví dụ một ví dụ 1 config:

Kết luận

Dù đã đáp ứng được hầu hết các nhu cầu sử dụng đồng thời khá hiệu quả trong quá trình development và operation, nhưng Data orchestration framework ở Techcombank vẫn còn nhiều điểm đang phát triển thêm:

  • Resource manager
  • Retry mechanism: back-off retry and dead letter queue

Thuộc dự án “Inside GemTechnology” do Techcombank x TopDev triển khai, chuỗi nội dung thuần Tech “độc quyền” được chia sẻ bởi đội ngũ Tech Leader đến từ Silicon Valley tại Techcombank sẽ được cập nhật liên tục tại chuyên mục Tech Blog Techcombank x TopDev. Cùng theo dõi & gặp gỡ các chuyên gia bạn nhé!

 

Các cơ hội việc làm tại Techcombank


Bài viết liên quan

Data Lake - Nền tảng lý trí cho mọi quyết định tài chính

Anh Nguyễn Quang Huy từng có kinh nghiệm nhiều năm về Khoa học dữ liệu cũng như phát triển và quản lý Hệ thống Dữ liệu lớn (Big Data) khi công tác tại các tập đoàn đa quốc gia tại tại Sing và Mỹ. Được truyền cảm hứng từ những bài toán lớn trên hành trình số hóa mà Techcombank đang giải quyết cho thị trường ngân hàng, Anh Nguyễn Quang Huy đã quyết định quay trở về Việt Nam để đồng hành với đội ngũ Techcombank trong giai đoạn chuyển đổi số mạnh mẽ nhất từ trước đến nay. Ở thời điểm hiện tại, anh đang giữ vị trí Director, Data Engineer tại Techcombank. Công việc chính của anh là phụ trách xây dựng các hoạt động, dự án liên quan đến Data Lake (Hồ dữ liệu) tại Techcombank. Hãy cùng nghe câu chuyện về Data Lake sẽ giải quyết những bài toán lớn nào cho hàng triệu khách hàng của Techcombank. Theo anh đâu là tầm quan trọ [...]

Data Modeling with DynamoDB: Single table design (Xây dựng mô hình dữ liệu với DynamoDB: Thiết kế bảng đơn lẻ)

Bài viết đến từ anh Vũ Tuấn Nghĩa - Quản lý cao cấp hoạch định dữ liệu Data Engineering team @Techcombank DynamoDB là một dịch vụ cơ sở dữ liệu NoSQL cung cấp hiệu năng nhanh và nhất quán - có khả năng mở rộng và linh hoạt trong cách sử dụng. Khác với cơ sở dữ liệu quan hệ (RDMS), DynamoDB không sử dụng joins và các cấu trúc quan hệ khác để lưu trữ và truy vấn dữ liệu. Thay vào đó, bạn sẽ thiết kế table của mình theo Single design table - 1 table duy nhất phục vụ toàn bộ application hay service, việc này giúp hiệu suất đọc và ghi nhanh hơn ở scale lớn và giảm chi phí cloud. Trong bài viết này, chúng mình sẽ khám phá các lợi ích và thách thức của việc sử dụng Single design table trong DynamoDB, cũng như cách Datalake ở Techcombank sử dụng để đáp ứng và tối ưu như cầu sử dụng. Single table design Trong tài liệu trang chủ AWS có đề cập: You should maintain as few tables as [...]

Khoa học dữ liệu – Đòn bẩy cho Ngân hàng 4.0 toàn diện

Khoa học dữ liệu là một trong những chiếc chìa khóa giúp nhiều doanh nghiệp cũng như các tổ chức tài chính lớn như ngân hàng đột phá trong kỷ nguyên 4.0. Càng ngày việc thu thập và hiểu dữ liệu dần trở thành một kim chỉ nam giúp các doanh nghiệp tạo ra tính đột phá trong tương lai. 

Anh Nguyễn Hoàng Huy hiện đang là Giám đốc khoa học dữ liệu, và đã được trao bằng tiến sĩ ngành Khoa học máy tính của Đại học tổng hợp Greifswald. Năm 2012, anh được giải thưởng bài báo xuất sắc nhất của Hội khoa học dữ liệu CHLB Đức. Sau đó anh trở về Việt Nam tham gia nhiều công ty được đầu tư bài bản vào dữ liệu lớn.

Ứng dụng Data Science: dữ liệu là nguồn nhiên liệu cho trí tuệ nhân tạo

Theo anh, dữ liệu quan trọng như thế nào với tương lai của Digital Banking?

“Thực ra dữ liệu quan trọng trong mọi lĩnh vực nói chung, khi chúng ta phải ra quyết định chứ không chỉ với Digital Banking “

Để đơn giản chúng ta hình dung thế này: trong sinh tồn, một con khỉ tinh mắt thấy được vài nải chuối đang treo trên cây nhưng cũng thấy một con sư tử đang gần đó. Khi đó con khỉ phải tính toán các xác suất chết đói nếu không ăn chuối so với xác suất bị sư tử vồ dựa trên rất nhiều dữ liệu ví dụ như: mình cách nải chuối bao xa? cách con sư tử bao xa? bản thân có thể chạy nhanh đến đâu? sư tử có thể chạy nhanh như nào? con sư tử thức hay ngủ, có vẻ đói hay no? nải chuối đó có bao nhiêu quả, quả lớn hay nhỏ, xanh hay chín? rồi thông tin về điều kiện bên trong cơ thể, bản thân đang đói không? có cần liều lĩnh ăn những quả chuối không?. Trong tất cả các lĩnh vực, đặc biệt trong các giao dịch kinh tế, tài chính, bên sở hữu nhiều kiến thức, thông tin, dữ liệu thực tế đều có nhiều lợi thế hơn so với bên còn lại.

Như chúng ta biết, hoạt động ngân hàng diễn ra mọi lúc mọi nơi trong cuộc sống hàng ngày của khách hàng, ví dụ như giao dịch mua bán, chuyển tiền, thanh toán dịch vụ v.v, những hoạt động này được thực hiện theo thời gian thực trong nhiều bối cảnh khác nhau, thông qua nhiều dịch vụ công nghệ khác nhau. Vì vậy nếu chúng ta có những dữ liệu giàu bối cảnh đó, AI có thể hỗ trợ chúng ta để gỡ bỏ những rào cản trong gắn kết, tiếp cận khách hàng, gợi ý sản phẩm phù hợp với bối cảnh cá nhân, chuyển các quy trình thẩm định cũng như phân phối sản phẩm lên môi trường số, theo thời gian thực, khi đó việc đi đầu và mở rộng thị trường không nằm ngoài tầm tay.

“Phiên bản ngân hàng số (digital banking) 4.0, mục tiêu mà tất cả các ngân hàng ở những nước tiên tiến hiện đang hướng đến, Việt Nam cũng không nằm ngoài câu chuyện này”

Phiên bản ngân hàng tương lai chủ yếu vận hành đa kênh số, không có yêu cầu về việc phân phối sản phẩm/dịch vụ qua kênh vật lý, hướng đến trải nghiệm khách hàng trong từng bối cảnh, cá nhân hóa trải nghiệm, loại bỏ ma sát ra khỏi trải nghiệm khách hàng. Ngân hàng này sẽ vận hành dựa trên nhiên liệu là dữ liệu, nhưng không chỉ loại dữ liệu giao dịch, hay dữ liệu tham chiếu tín dụng mà các ngân hàng đang sở hữu hiện nay mà phải xoay quanh các dữ liệu cung cấp theo bối cảnh. Từ đó, ngân hàng có thể cung cấp sản phẩm/dịch vụ dựa trên bối cảnh “Ở đâu, khi nào, vì sao và như thế nào?”, theo thời gian thực.

Cụ thể, dữ liệu và AI sẽ là phần cốt lõi trong sự dịch chuyển mô hình hoạt động tư vấn tài chính của ngân hàng. Lời tư vấn có khả năng biến thành trải nghiệm theo thời gian thực được thực hiện bằng AI thông qua hiểu rõ về hành vi, khẩu vị rủi ro của khách hàng, cũng như tìm ra được công cụ, sản phẩm tốt nhất giải quyết vấn đề của khách hàng. Công nghệ giọng nói sẽ dần dần giúp khách hàng tin tưởng vào trợ lý AI của mình trong việc đưa ra những gợi ý về giải pháp tài chính hàng ngày cho họ, thay vì họ phải tự đi tìm kiếm giải pháp. Ví dụ trợ lý AI có thể đưa ra tư vấn như: Bạn đang thanh toán qua thẻ tín dụng quá nhiều rồi đấy, tôi có những phương án khác giúp bạn có tiền mua sắm tiết kiệm được 1,2 triệu đồng mỗi tháng bằng cách tự động liên kết với ví Apple Pay của bạn, bạn muốn xem không?. Thậm chí ngân hàng Emirates NBD đề xuất sản phẩm tiết kiệm với lãi suất dựa trên số bước chân mà khách hàng đi hoặc chạy bộ mỗi ngày, để khích lệ họ tiếp tục lối sống lành mạnh hơn cả về thể chất lẫn tài chính. Bạn thậm chí không cần phải làm hồ sơ mở tài khoản tiết kiệm thì mới bắt đầu tiết kiệm được mà chỉ cần xin quyền truy cập vào ứng dụng của ngân hàng số như Moven.

Với nhiều ứng dụng ngân hàng số đột phá, tất yếu trong tương lai, nếu không có chiến lược dữ liệu áp dụng xuyên suốt toàn bộ tổ chức, bạn sẽ chỉ có 1 ốc đảo dữ liệu riêng rẽ và không biết khách hàng của mình là ai, nhu cầu, hoàn cảnh của họ để đưa ra những dịch vụ tốt nhất. Như chúng ta đã thấy gần đây, hiện tượng tư vấn up-sale, cross-sale các sản phẩm bảo hiểm, đầu tư một cách cứng nhắc, chạy theo KPI, gây một số điều tiếng tại các ngân hàng thương mại trong nước gần đây là do chúng ta thiếu dữ liệu bối cảnh, hành vi theo thời gian thực của khách hàng để đề xuất đúng sản phẩm theo kịp thời gian, nhu cầu của khách hàng dẫn đến giảm sự gắn kết, lòng trung thành của khách hàng.

Như trên chúng ta đã thấy xu hướng ngân hàng số, nhúng toàn diện, ngân hàng mở là tất yếu. Trong cuộc dịch chuyển về ngân hàng số trở nên hoàn thiện, thì những ngân hàng hàng đầu không phải là những ngân hàng sở hữu mạng lưới phân phối lớn, mà là những ngân hàng có năng lực dữ liệu quy mô lớn, mang lại những lợi thế cung cấp bối cảnh cho hoạt động ngân hàng hàng ngày.

Vì vậy, các ngân hàng phải có nền tảng công nghệ mở, xây dựng mối quan hệ hợp tác với đối tác bên ngoài lĩnh vực ngân hàng, đi đôi với khả năng tiếp cận, sở hữu và tận dụng dữ liệu có được. Từ đó mang đến sự khác biệt thực sự trong việc gợi ý sản phẩm/dịch vụ ngân hàng theo thời gian thực dựa trên dự đoán hành vi khách hàng. Ví dụ ngân hàng Emirates NBD hợp tác với mạng xã hội Twitter xây dựng ngân hàng xã hội, cải thiện trải nghiệm dịch vụ ngân hàng dựa trên phân tích nhu cầu khách hàng kịp thời từ dữ liệu mạng xã hội.

Ngày nay nếu muốn thu hút khách hàng sử dụng dịch vụ ngân hàng của mình, bạn phải tiếp cận họ xung quanh một giao dịch hoặc sự tương tác nào đó, khi họ cần tín dụng để hoàn tất một cuộc mua bán nào đó chẳng hạn. Ngoài ra, một khi người tiêu dùng đã sử dụng dịch vụ ngân hàng nhúng trong một nền tảng khác, các ngân hàng sẽ không còn biết khách hàng đang làm gì, cần gì, do ngân hàng hoàn toàn không có dữ liệu của khách hàng trên nền tảng đó. Ngân hàng sẽ hoàn toàn mất dấu, bối cảnh khách hàng, do đó ngân hàng cần chiến lược hợp tác tích hợp các sản phẩm, dữ liệu của các công ty Fintech, hoặc các công ty công nghệ nền tảng. 

Những thử thách của người làm dữ liệu “thực địa”

Có rất nhiều thách thức ở “thực địa” đối với các nhà khoa học dữ liệu. Đầu tiên là vấn đề chất lượng dữ liệu cho xây dựng các mô hình học máy, dự báo, sản phẩm trí tuệ nhân tạo. Đối với các tổ chức có lịch sử phát triển lâu dài, các quy trình nghiệp vụ phải tuân thủ các quy trình chặt chẽ, phức tạp, đặc biệt như các ngân hàng, dữ liệu thường silos. Dữ liệu quá khứ có thể đến từ nhiều nguồn, hệ thống cũ, bộ phận khác nhau không liên thông với nhau, mô hình dữ liệu không nhất quán, meta data thiếu hoặc không được định nghĩa đầy đủ. Điều này dẫn đến sự mất kết nối giữa nguồn dữ liệu với cách sử dụng dữ liệu sao cho đúng, mất manh mối với bối cảnh kinh doanh. Thậm chí mã chương trình, tài liệu của các luồng xử lý dữ liệu không đầy đủ, không được cập nhật. Những điều này gây ra rất nhiều những khó khăn cho việc tiền xử lý, khảo sát dữ liệu từ quá khứ, lên ý tưởng, xây dựng các đầu vào cho các mô hình dự báo. Tất nhiên còn nhiều khó khăn khác như phải xử lý, xây dựng các mô hình dự báo trên dữ liệu lớn, luôn cập nhật. Tuy nhiên với nền tảng công nghệ của mình, Techcombank đã giảm thiểu một cách tối đa những khó khăn này cho các nhà khoa học dữ liệu.

Thử thách lớn thứ hai là phải rút ngắn thời gian phát triển một vòng đời của một mô hình dự báo, đặc biệt rút ngắn thời gian xây dựng mô hình từ khi xác định được các yêu cầu, mục tiêu của bộ phận kinh doanh. Để làm được điều này, chúng ta phải có một nền tảng tính toán xử lý, lưu trữ các thuộc tính, đặc điểm (biến đầu vào của các mô hình dự báo) cơ bản, đầy đủ, toàn diện của khách hàng, cũng như các kỹ thuật xây dựng mô hình dự báo tương đối phổ quát cho đa dạng các sản phẩm, yêu cầu nhanh của các bên kinh doanh. Tất nhiên không thể có mô hình, hệ thống thuộc tính luôn tốt nhất, thậm chí phù hợp cho mọi bài toán, yêu cầu kinh doanh. Hơn nữa những kỹ thuật xây mô hình này còn phải đảm bảo tính khái quát hoá, giữ được hiệu năng trong sự thay đổi của dữ liệu thực tế, trong điều kiện chất lượng dữ liệu không cao, dữ liệu không được xử lý đồng bộ. Suy cho cùng, hiệu năng thực sự của mô hình dự báo chỉ được đánh giá trong tương lai. Nhưng có lẽ thách thức hơn cả, có những bài toán, yêu cầu khoa học dữ liệu thực tế của bên kinh doanh hóc búa ngay cả trong điều kiện lý tưởng, lý thuyết và rất khó đưa ra giải pháp thích hợp trong điều kiện thực tế.

Xuất phát nhu cầu am hiểu khách hàng, cung cấp sản phẩm/dịch vụ, cải thiện trải nghiệm khách hàng trong bối cảnh, vòng đời khách hàng, Techcombank tiên phong phát triển một nền tảng dữ liệu khách hàng tổng thể trên Cloud. Và để giảm thiểu khó khăn như trao đổi ở trên, cũng như đảm bảo sự tuân thủ, bảo mật khi khai thác dữ liệu, một bộ khung về quản trị dữ liệu với Collibra đã được tiên phong triển khai đồng bộ ở ngân hàng. Khi đó chất lượng, độ tin cậy, xác thực của dữ liệu được quản lý, tạo thuận lợi cho triển khai các dự án về khoa học dữ liệu. Đặc biệt một nền tảng về học máy trên Cloud với SageMaker đang được ngân hàng đầu tư và triển khai. Rồi sự chuẩn bị nền tảng dữ liệu mở, dữ liệu bối cảnh từ các đối tác, hệ sinh thái mới được bổ xung. Tất cả những điều này giúp ươm mầm những dự án khoa học dữ liệu lớn hơn, tạo nhiều ảnh hưởng tích cực đến ngân hàng, khách hàng.

Techcombank là một trong những ngân hàng đầu tiên trong nước đầu tư mạnh mẽ các tài năng dữ liệu nói chung hay khoa học dữ liệu nói riêng. Có lẽ Techcombank là một trong những ngân hàng có khối dữ liệu riêng đầu tiên với đông đảo hơn 200 nhân sự, chuyên gia tài năng nhiều kinh nghiệm. Khối có cấu trúc với năm phòng: 

  • Sản phẩm dữ liệu
  • Hoạch định dữ liệu
  • Phân tích và am hiểu dữ liệu kinh doanh
  • Phân tích nâng cao và sáng tạo (AAI)
  • Quản trị dữ liệu như những ngân hàng tiên tiến trên thế giới. 

Phòng phân tích nâng cao và sáng tạo với trách nhiệm xây dựng các công cụ, năng lực, mô hình phân tích nâng cao, dự báo, học máy, có nhiều chuyên gia quốc tế, như từ Google DeepMind đến làm việc. Quan trọng hơn cả Techcombank đang phát triển văn hoá dữ liệu từ tất cả các khối, phòng ngoài dữ liệu, từ đó có thể thúc đẩy nhiều hơn nữa những dự án khoa học dữ liệu sáng tạo, có sức ảnh hưởng lớn.   

Theo anh, đâu là những kỹ năng và kiến thức cần có dành cho những bạn muốn trở thành một Data Scientist trong tương lai?

Techcombank có nhiều bạn Intern, sinh viên mới ra trường đang theo đuổi trở thành nhà khoa học dữ liệu. Cũng như mọi ngành nghề khác chúng ta đều cần tư duy giải quyết vấn đề sáng tạo, tư duy thiết kế, phản biện. Đầu tiên nhà khoa học dữ liệu luôn phải thiết kế, chuyển đổi các yêu cầu, mục tiêu của các bài toán kinh doanh thành các bài toán học máy, trí tuệ nhân tạo. Cụ thể chúng ta cần một số kiến thức, kỹ năng như:

  • Kiến thức về Khoa học dữ liệu, Học máy, Tính toán, Thống kê
  • Kiến thức, kỹ năng về lập trình, tính toán phân tán cho dữ liệu lớn
  • Kiến thức, kỹ năng về cấu trúc, kiến trúc dữ liệu, tiền xử lý, trực quan hoá dữ liệu 
  • Kỹ năng nghiên cứu, thích khám phá, thử nghiệm, tập trung, tỉ mỉ
  • Kỹ năng giao tiếp, trình bày, do trong vòng đời phát triển mô hình học máy chúng ta luôn phải kết hợp, đánh giá hiệu quả mô hình, nhận phản hồi với/từ các đơn vị kinh doanh 
  • Kiến thức đại cương về các nguyên lý cơ bản trong kinh tế, tài chính, các sản phẩm trong ngân hàng

Cảm ơn anh về những chia sẻ rất bổ ích giúp đem lại nhiều góc nhìn tích cực cho những ai đang muốn tham gia vào lĩnh vực Khoa học dữ liệu tại ngân hàng, hy vọng team AAI của Techcombank sẽ gặt hái được nhiều thành công trong tương lai. 

Một ngày làm việc của một Data Scientist ở Techcombank

  • Cũng như những công việc trong ngành IT nói chung, chúng tôi cũng có buổi daily standup hàng sáng trao đổi về những công việc đang tập trung, những khó khăn đang gặp phải, rồi các buổi sprint retro, review hàng tuần.
  • Tuy nhiên có lẽ công việc yêu thích nhất mỗi ngày của một nhà khoa học dữ liệu là được đắm chìm vào trong các thử nghiệm, đánh giá các ý tưởng trên dữ liệu, phát hiện ra những mẫu hình, xu hướng, bản chất bên trong dữ liệu.
  • Rồi những buổi seminar chia sẻ kiến thức, giờ đào tạo thú vị hàng tuần, những buổi brainstorming để chuyển đổi yêu cầu kinh doanh thành bài toán học máy, tìm các hướng tiếp cận, thuật toán phù hợp, hiệu quả, đề xuất những ý tưởng biểu diễn, trực quan hoá những mẫu hình, bản chất tìm được, hay hơn là lựa chọn các giải pháp toàn diện, viễn kiến, thách thức lớn cần giải quyết trong tương lai. 

 


Thuộc dự án Inside GemTechnology do TopDev hợp tác cùng Techcombank triển khai, chuỗi nội dung thuần “Tech” độc quyền được chia sẻ bởi đội ngũ chuyên gia Công nghệ & Dữ liệu tại Techcombank sẽ được cập nhật liên tục tại chuyên mục Tech Blog | Techcombank Careers x TopDev. Cùng theo dõi & gặp gỡ các chuyên gia bạn nhé!

 

Các cơ hội việc làm tại Techcombank

Bài viết liên quan

Hơn cả một phương pháp, DevSecOps chính là “triết lý bảo mật” tại Techcombank

Là một thành viên mới tại Techcombank, anh Bùi Nguyễn Tuấn Minh hiện đang là Giám đốc DevSecOps, đây cũng là công việc đầu tiên của anh sau những năm tháng làm việc tại Singapore. Anh cũng là một trong những người góp phần mang lại những góc nhìn mới trong các phương pháp phát triển phần mềm của Techcombank. Được biết, Techcombank là một trong những đơn vị tiên phong ứng dụng phương pháp DevSecOps trong việc phát triển sản phẩm. Đây cũng được xem là một trong những định hướng giúp các ngân hàng số hóa và phát triển mạnh mẽ trong tương lai. Sau đây là những chia sẻ của anh Bùi Nguyễn Tuấn Minh về công việc DevSecOps tại Techcombank. Anh có thể chia sẻ một chút về môi trường làm việc tại Techcombank? Khi chuyển công tác từ Singapore về Việt Nam, mình nhận thấy môi trường và cách thức làm việc [...]

DevSecOps Philosophy (Triết lý DevSecOps)

Bài viết đến từ Ngô Doãn Thông - DevSecOps Engineer    DevSecOps team @Techcombank Giới thiệu Trong 20 năm qua, DevOps đã cùng với Agile, thay thế cho mô hình phát triển Waterfall. Microservices được coi là công nghệ tiên tiến nhất để triển khai kiến trúc dịch vụ. Thời gian phát triển sản phẩm đã được giảm đi, triển khai tự động được thực hiện hàng tuần hoặc hàng ngày và cloud thì cung cấp khả năng tính toán, cơ sở hạ tầng, lưu trữ và mạng rất mạnh mẽ. Triết lý DevOps thường được tóm tắt bằng khẩu hiệu "move fast and break things", điều này có nghĩa là triển khai mọi thứ nhanh hơn, mạnh dạn hơn và sẵn sàng, phá bỏ các cấu trúc silo, rào cản, chấp nhận rủi ro và khắc phục nhanh từ những rủi ro đó. Tuy nhiên, có một yếu tố quan trọng chưa được đề cập tới. Các tổ chức áp dụng DevOps vẫn cần đáp ứng tiêu chuẩn an [...]

Closure là gì? Tại sao tôi cần dùng closure?

Closure là gì? Tại sao tôi cần dùng closure?

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Closure là một kiến thức quan trọng trong lập trình, nhờ có nó mà bạn có thể triển khai những chức năng một cách dễ dàng hơn.

Closure cũng khá phổ biến trong giới lập trình Javascript, có những người chưa từng nghe đến closure nhưng có thể đã vô tình dùng hoặc cũng có những người nghe rồi nhưng lại chưa thực sự hiểu về closure bởi nó khá là trừu tượng. Vậy thì hãy tiếp tục đọc bài viết để khám phá thêm nhé.

Lexical scope

Trước tiên tôi xin giới thiệu một chút về Lexical scope (tức phạm vi biến Lexical): trong một nhóm các hàm lồng nhau, các hàm bên trong có quyền truy cập vào các biến và các tài nguyên khác trong phạm vi hàm cha của chúng. Lexical scope đôi khi còn được gọi là Static scope.
Ví dụ:

function foo() {
  const a = 1;
  function bar() {
    console.log(a);
  }

  bar(); // 1
}

Mặc dù biến a không nằm trong hàm bar nhưng bar nằm trong foo do đó bar cũng có thể truy cập vào biến a.

  7 khái niệm Javascript cơ bản không thể bỏ qua

  Callback hell là gì? 6 cách “trị” callback hell trong javascript

Closure

Tương tự, closure cũng theo nguyên tắc Lexical scope, nó có thể truy cập đến các biến của hàm khác ngoài các biến của nó và các biến toàn cục nhưng một điều quan trọng: các hàm closure vẫn có khả năng lưu giữ trạng thái của các biến bên trong nó, hay nói cách khác mỗi khi bạn trả về (return) một hàm hoặc gán một hàm cho một biến thì nó sẽ mang theo giá trị của tất cả các biến mà nó phụ thuộc.
Ví dụ:

function add(x) {
    return function addTo(y) {
        return x + y;
    }
}
const addFive = add(5);
const addToTen = addFive(10);
console.log(addToTen); // 15

Trong ví dụ trên hàm add nhận một tham số x sau đó trả về một hàm nhận vào tham số y rồi trả về tổng của xy.
Đầu tiên khi gọi hàm add(5) xong thì ta nghĩ các biến xy trong add sẽ không còn tồn tại nữa. Tuy nhiên sau khi gọi tiếp addFive(10) thì chúng ta vẫn nhận được kết quả là 15, điều này có nghĩa là trạng thái của hàm add vẫn được lưu lại ngay cả khi hàm đã được thực thi xong, nếu không lưu lại thì addFive(10) sẽ không biết giá trị của biến x ở lần gọi trước là 5.
Từ đó ta hiểu khi add trả về một hàm addTo thì addTo được gói lại trong một ngữ cảnh có cả xy tại thời điểm đó.

Việc làm JavaScript Hồ Chí Minh dành cho bạn!

Lý thuyết closure là vậy, thế thì closure có những tác dụng gì?
Thứ nhất quay lại với một ví dụ kinh điển như sau:

for(var i = 0; i < 5; i++) {
    setTimeout(() => {
        console.log(i);
    }, 0);
}

Chúng ta mong muốn kết quả sẽ là 0 1 2 3 4 nhưng rất tiếc kết quả của nó lại là 5 5 5 5 5. Bởi vì setTimeout chỉ được thực thi sau khi vòng lặp kết thúc việc lặp, khi đó giá trị tham chiếu của biến i trong các hàm console.log đã bằng 5.

Để giải quyết vấn đề này, tôi có thể thay var bằng let hoặc sử dụng closure bao bọc setTimeout để tạo ra một ngữ cảnh riêng cho hàm ngay lúc đó:

for(var i = 0; i < 5; i++) {
    (function(j) {
        setTimeout(() => {
            console.log(j);
        }, 0);
    })(i);
}

Ngoài ra closure còn được ứng dụng trong việc tạo ra phạm vi cho các thuộc tính trong object.

Xem xét ví dụ sau:

class Person {
  constructor(name) {
    this.name = name;
  }

  getName() {
    return this.name;
  }

  setName(name) {
    this.name = name;
  }
}

getName và setName được thêm vào để nổ lực ngăn chặn việc truy cập trực tiếp vào name, thế nhưng vì Class trong Javascript không hỗ trợ Access modifier nên nó vẫn bị dễ dàng chỉnh sửa như thường.

const p = new Person();
p.setName('estacks');
p.getName(); // estacks

p.name = 'edited';
p.name; // edited;

Để ngăn chặn điều trên, hãy thử với một hàm closure:

function Person() {
  let _name;
  const getName = () => {
    return _name;
  }

  const setName = (name) => {
    _name = name;
  }

  return {
    getName,
    setName,
  }
}

const p = Person();
p.setName('estacks');
p.getName(); // estacks

p._name; // undefined

Hàm Person trả về hai hàm closure mà chúng có thể truy cập được vào _name.

Các bạn thấy đấy, không thể truy cập vào biến _name trực tiếp được. Mọi thao tác với _name phải thông qua hai hàm set và get kia.

Còn một ứng dụng của closure đó là curry function, nhờ có closure mà việc tạo ra một hàm curry trở nên dễ dàng hơn bao giờ hết, còn tính ứng dụng thì lại còn rất cao nữa.

Tổng kết

Closure không phải là khái niệm chỉ dành riêng cho javascript mà rất nhiều ngôn ngữ cũng hỗ trợ. Closure là một hàm theo nguyên tắc Lexical scope và có khả năng lưu giữ trạng thái của các biến liên quan bên trong nó. Closure có nhiều ứng dụng quan trọng có thể kể đến như tạo Access modifier, curry function… Closure cũng là một kiến thức quan trọng trong phỏng vấn để đánh giá mức độ hiểu biết của bạn về ngôn ngữ Javascript nữa đấy.

Bài viết gốc được đăng tải tại 2coffee.dev

Xem thêm:

Tìm việc làm IT mới nhất trên TopDev

Bật mí top câu hỏi phỏng vấn Game Artist thường gặp nhất

Bật mí top câu hỏi phỏng vấn Game Artist thường gặp nhất

Sự phát triển bùng nổ của ngành công nghiệp Game khiến cho các tựa game hiện nay có hình ảnh, đồ họa, màu sắc không khác gì những bộ phim chiếu rạp. Để tạo ra được những tựa game lôi cuốn chất lượng cao như thế thì vai trò của Game Artist là không thể thiếu, thậm chí là quyết định đến 50% sự thành công của tựa game. Các công ty phát triển game hay phát hành game hiện nay cũng đều đang có nhu cầu tuyển dụng Họa sĩ vẽ Game chuyên nghiệp với mức đãi ngộ cao. Bài viết hôm nay chúng ta cùng nhau điểm qua những câu hỏi phỏng vấn cho vị trí Game Artist thường gặp nhé.

Game Artist là gì? Vai trò của một Game Artist

Game Artist

Game Artist hay Họa sĩ Game là những người tạo ra nhân vật, quần áo, xe cộ, phong cảnh, màu sắc, họa tiết,… cho game. Game Artist đóng vai trò quan trọng tạo ra những bản phác thảo sơ bộ về nhân vật trên đồ họa 2D hay 3D, kết hợp với xây dựng bối cảnh để tạo ra một thế giới trong game cũng như xây dựng cho game những câu chuyện riêng, game play thú vị.

Trong một đội ngũ phát triển game thì Game Artist thông thường chiếm số lượng phân nửa, nhất là trong những giai đoạn đầu khi lên tạo hình nhân vật và game play.

Game Artist được chia nhỏ vai trò chi tiết cụ thể như 3D Modeller, 2D Texture Artist, Environment Artist, Lighting hay Effect Artist,… 

Game Artist và Game Design khác nhau thế nào?

Đây là 2 khái niệm hay bị nhầm lẫn với những người không ở trong ngành phát triển Game. Nếu như Game Artist là họa sĩ vẽ ra tất cả những gì liên quan đến hình ảnh trong game thì Game Design là những biên kịch xây dựng câu chuyện, tình tiết trong một tựa game.

Sự đầu tư chỉn chu của các tựa game hiện nay giúp cho chúng ta có những game với cốt truyện được xây dựng chứa nhiều tình tiết cuốn hút, độ khó trong game cũng tăng dần qua từng màn chơi, hệ thống tính điểm, làm việc vụ logic và cuốn hút;… tất cả những thứ đó đều được Game Design xây dựng và team phát triển sẽ triển khai xây dựng lên.

Game Artist và Game Design có vai trò và công việc khác nhau, cũng là 2 bộ phận quan trọng bậc nhất trong một team phát triển game quyết định đến yếu tố thành công hay thất bại của một dự án game.

  Top 5 câu hỏi phỏng vấn Game Designer được hỏi nhiều nhất

  Lập trình game với Java cho người mới bắt đầu

Những yếu tố cần cân nhắc khi sắp xếp bố cục trong game

Bố cục trong game (Composition) là một khía cạnh quan trọng của game art vì nó ảnh hưởng đến mọi thứ trong game cũng như thao tác của người dùng. Một số yếu tố cân nhắc đến việc sắp xếp bố cục trong game như sau:

  • Giao diện tổng thể của trò chơi bao gồm phong cách nghệ thuật, bảng màu, không khí chung của trò chơi.
  • Cơ chế gameplay: ví dụ như game chiến đấu (combat) thì bố cục trong game tập trung tạo cảm giác căng thẳng và phấn khích.
  • Cốt truyện và bối cảnh của trò chơi.
  • Kinh nghiệm của người chơi, kinh nghiệm từ các tựa game khác tương tự cùng thể loại.

Xem tuyển dụng Game Developer tại các công ty hàng đầu trên TopDev

Perspective là gì? Có những loại Perspective nào

Game Artist

Perspective hay Phối cảnh là kỹ thuật giúp truyền tải thực tế 3 chiều của không gian, vật thể lên bề mặt hai chiều của màn hình. Nhờ có Perspective mà hình ảnh hiện thị lên người chơi mới tạo được cảm giác có chiều sâu, xác định vật thể đứng trước, đứng sau.

Các quy luật phối cảnh đều được xây dựng trên các quy tắc hình học chặt chẽ, có 3 loại Perspective thường được sử dụng:

  • Phối cảnh 1 điểm tụ: tất cả các đường thẳng theo chiều sâu sẽ được kết nối với 1 điểm tụ là điểm trung tâm của tầm nhìn.
  • Phối cảnh 2 điểm tụ: có 2 điểm tụ nằm trên đường tầm mắt ở 2 bên của màn hình game tạo thành hệ thống phối cảnh 2 điểm tụ.
  • Phối cảnh 3 điểm tụ: là loại phối cảnh ít được sử dụng trong game, chủ yếu sử dụng trong hội họa, ví dụ như trường hợp bạn đứng dưới chân 1 tòa nhà cao tầng nhìn lên.

VFX là gì? VFX được sử dụng thế nào trong Game

VFX là viết tắt của từ Visual Effect hay còn được gọi là hiệu ứng hình ảnh, nó được sử dụng để mang lại diện mạo chuyên nghiệp và trải nghiệm chơi game hấp dẫn giúp người chơi đắm chìm và kết nối với thế giới và trò chơi đó đang truyền tải.

Có 2 loại VFX chính thường được áp dụng trong game:

  • Gameplay Effects: hiệu ứng sử dụng trong lối chơi game, ví dụ như khi nhân vật bị tác động sát thương làm thay đổi thuộc tính điểm máu; hay lúc nhân vật được tăng sức mạnh chỉ số trong 1 thời gian ngắn (thường gọi là buffs sức mạnh)
  • Environmental Effects: hiệu ứng trong môi trường game, ví dụ như thời tiết (mưa, sương mù, tuyết,…) địa hình, thời gian tạo ra sự thay đổi về ánh sáng, hiệu ứng gió, cây cối,…

VFX trong game được chạy trong thời gian thực, nghĩa là sẽ thay đổi tùy theo nhân vật, thời gian, cách tác động của người chơi. Vì thế bài toán tối ưu một cách hiệu quả các effects cũng được cân nhắc quan tâm.

Animation là gì? Nguyên tắc để tạo ra animation

Game Artist

Animation là một phương pháp tạo ra những chuyển động của hình ảnh dựa vào các hình ảnh tĩnh và mang nội dung của câu chuyện hay một sự kiện với thông điệp nào đó cho người xem giúp tạo ra sự chân thực, sống động cho người xem.

Animation được tạo ra nhờ vào hiện tượng lưu ảnh ở mắt người kết hợp với sự thay đổi nội dung của các khung ảnh liên tiếp nhau trong đó có thể là thay đổi về kích thước, màu sắc, bối cảnh,… làm cho chúng ta thấy được sự chuyển động. Có 2 nguyên tắc chính tạo ra animation:

  • Frame by frame: tạo animation dựa trên sự thay đổi của các chuyển động theo giai đoạn trong từng khung; trong đó mỗi khung là một giai đoạn của chuyển động.
  • Tweened animation: tạo animation dựa vào sự hỗ trợ của công cụ flash. Các animator chỉ việc tạo ra khung ảnh đầu và hình ảnh kết thúc trong khung ảnh cuối, còn các giai đoạn chuyển động trung gian sẽ được công cụ flash tạo ra.

Hãy kể tên những công cụ thiết kế đồ họa 2D, 3D bạn thường sử dụng

Tùy thuộc vào mục đích của sản phẩm đầu ra mà chúng ta lựa chọn phần mềm, công cụ thiết kế khác nhau, dưới đây là một số công cụ phổ biến:

  • 2D Artist: Photoshop, Adobe Flash Professional
  • 3D Artist: 3ds Max, Zbrush, Maya
  • Animatior: 3ds Max, Maya
  • Effect/Partical Artist: After Effects

Kết bài

Trên đây là danh sách những câu hỏi dành cho vị trí Game Artist mà bạn sẽ có thể gặp trong buổi phỏng vấn của mình. Hy vọng bài viết này hữu ích dành cho những bạn đang chuẩn bị tìm một công việc họa sĩ game mới, hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Bài viết liên quan:

Đừng bỏ lỡ việc làm IT tại TopDev

5 VS Code Extensions hữu ích cho React developers

5 VS Code Extensions hữu ích cho React developers

Bài viết được sự cho phép bởi tác giả Sơn Dương

Không biết mọi người sử dụng Code Editor nào để viết ứng dụng React? Bản thân mình thì trung thành với Visual Code (mọi người hay viết tắt là vscode). Đây là trình code editor nhỏ gọn, nhưng lại nhiều tính năng, được hậu thuẫn bởi ông trùm Microsoft.

Điều mình thấy tâm đắc nhất ở vscode đó chính là kho extension hấp dẫn, cũng toàn miễn phí cả. Nếu bạn đang sử dụng VS Code thì mình khuyên nên thử các extension dưới đây, tăng hiệu suất công việc lên đáng kể đấy.

Trước khi mình giới thiệu các extension, mình sẽ nói qua cách cài đặt extension trong VS Code đã nhé.

Cài đặt extension trong VS Code

Visual code tích hợp extension market luôn trong ứng dụng, nên việc cài đặt extension rất đơn giản. Bạn chỉ vào biểu tượng extension, gõ tên extension muốn cài đặt -> chọn extension -> nhấn nút install.

extension trong VS Code

Thông thường thì sau khi cài xong là bạn có thể sử dụng được luôn. Tuy nhiên, cũng có một vài ngoại lệ, bạn cần khởi động lại VS Code thì extension mới có hiệu lực.

  Sync extensions của VSCode

5 vscode extensions hữu ích

ESLint

extension trong VS Code

Đây là tiện ích mà có lẽ hầu như ai cũng nên cài đặt. Nó giúp cho mã nguồn của bạn chất lượng hơn, hạn chế những lỗi tiềm tàng. Về cơ bản thì extension này đơn giản là tích hợp thư viện ESLint vào VS Code. Nếu bạn chưa biết ESLint là gì, mời bạn đọc tài liệu này.

Extension này sử dụng thư viện ESLint được cài đặt trong thư mục workspace mà bạn đang mở. Nếu mà thư mục này không có thì nó sẽ tìm thư viện ESLint trong máy tính.

Nếu bạn chưa cài đặt ESLint thì đơn giản gõ lệnh sau để cài:

npm install eslint --save-dev

Open native terminal

extension trong VS Code

Việc phải duyệt qua lại giữa các thư mục (sử dụng lệnh “cd <tên thư mục>”) trong terminal thật là mệt mỏi. Tiện ích nhỏ này giúp bạn mở terminal  và con trỏ đang ở thư mục gốc dự án luôn.

Bạn có thể mở terminal ở bất kỳ đâu, chỉ đơn giản là chuột phải và chọn ” Open in native terminal (current folder)” hoặc “Open in native terminal (root folder)“.

Tham khảo việc làm React hấp dẫn rên TopDev

React PropTypes Generate

Việc phải thêm các propTypes thủ công rất thời gian. Tiện ích này sẽ tự động tạo propTypes. Bạn chỉ việc chọn component và  nhấn tổ hợp phím ” ctrl + shift + alt + p”. Tiện ích này khá giống với ReactPropTypes trong Jetbrains’s Platform.

Reactjs code snippets

extension trong VS Code

Mỗi khi bạn tạo một file mới, thông thường bạn sẽ phải tự thêm các component skeleton, component có thể là một class, function, hooks, redux… Tiện ích này sẽ giúp bạn tạo tất cả các đoạn mã đó chỉ với một nhấp chuột.

Reactjs code snippet có sẵn các đoạn mã cho React dựa trên babel-sublime-snippets package. Reactjs code snippets có khoảng 50 đoạn mã khác nhau, hỗ trợ 4 ngôn ngữ (file extensions):

  • JavaScript (.js)
  • TypeScript (.ts)
  • JavaScript React (.jsx)
  • TypeScript React (.tsx)

  Những theme cho VS Code tốt nhất

VSCode React Refactor

Bất kể dự án nào, viết bởi ngôn ngữ gì thì đều nên viết code thật clean, tuân thủ các nguyên tắc viết code. Với dự án React cũng vậy. Nếu một ngày, bạn nghĩ mình cần phải refactoring lại mã nguồn dự án thì đây chính tiện ích dành cho bạn.

Một vài tính năng hữu ích của tiện ích này:

  • Hỗ trợ Extract JSX element thành một file hoặc function
  • Hỗ trợ cả TypeScript và TSX
  • Làm việc tốt với cả Class, function và arrow functions.
  • Xử lý key attribute và function bindings
  • Làm việc tốt với các Hooks API mới.

Như vậy là mình đã giới thiệu xong 5 vscode extensions hữu ích. Bạn có sử dụng các vscode extensions trên không? Ngoài ra, còn extension nào hay ho nữa không? Hãy để lại bình luận ở bên dưới nhé.

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

Xem thêm:

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

Top 10 quy tắc học lập trình mà ai cũng nên theo

Top 10 quy tắc học lập trình mà ai cũng nên theo

Bài viết được sự cho phép bởi tác giả Sơn Dương

Sau rất nhiều sai lầm khi theo đuổi con đường lập trình viên, mình đã tự đúc kết được 10 quy tắc học lập trình. Mà mình nghĩ bất cứ ai mới bắt đầu cũng nên theo.

Nó có thể giúp cho các bạn tự tin hơn khi bắt đầu hành trình trở thành một developer chân chính. Tất nhiên là không nên lặp lại những sai lầm mà mình đã gặp trước đó.

Mình đã bắt đầu học lập trình như thế nào?

Mình vẫn nhớ năm 2014, là ngày mình đăng ký một khóa học lập trình Android tại một trung tâm gần học viện An Ninh. Giờ nghĩ lại mới thấy đó thật sự là quyết định vô cùng đúng đắn.

Sau đó là 3 năm đi làm, mình đã có nhiều cơ hội để trải nghiệm với nhiều dự án thực tế hơn.

Điểm xuất phát của mình là một con số “0” tròn trĩnh. Mình học code không có ai hướng dẫn, cũng không có bất kì ai nói với mình rằng: Hãy làm như thế này này, thế kia mới là đúng…

Dĩ nhiên, sai lầm trong quá trình làm việc là không thể tránh khỏi. Đặc biệt, trong khoảng thời gian đầu, mình gần như mất rất nhiều thời gian. Thậm chí mất luôn cả phương hướng khi “tự bơi” trong thế giới lập trình.

Một năm rưỡi sau đó, mình may mắn được cộng tác với các đàn anh rất giỏi và dày dạn kinh nghiệm trong lĩnh vực phát triển Android. Ở thời điểm đó, mình được anh hướng dẫn tận tình. Anh chỉ cho mình những quy tắc học lập trình mà mình vẫn còn nhớ như in đến tận bây giờ.

Lưu ý: Mình sẽ chủ yếu tập trung vào công việc phát triển Android và một số khái niệm lập trình và phát triển phần mềm. Nên một số bạn “ngoài ngành” sẽ hơi khó tiếp cận. Tuy nhiên, mình sẽ giải thích các khái niệm ở cuối bài viết nếu cần.

#1. Đừng cố gắng làm lại những gì mà thế giới đã làm tốt

quy tắc học lập trình

Thuở mới vào nghề, mình không thích sử dụng thư viện mã nguồn mở (open-source code). Nếu cảm thấy cần thiết, mình sẽ tự tay tạo những mã code cho riêng mình. Và đó thật sự là một sai lầm.

Khi bạn gặp phải bất cứ vấn đề gì trong trình phát triển ứng dụng. Nếu nó đã có giải pháp khắc phục thì đừng ngần ngại tận dụng nó.

Hãy Google Search trước khi làm, không tội gì phải tự nghĩ giải pháp mới. Chắc chắn bạn sẽ tiết kiệm được rất nhiều thời gian trong quá trình làm việc đấy.

Hãy tập trung nhiều hơn vào việc giải quyết business của ứng dụng. Thay vì code lại những thứ đã có rồi. Giả sử ứng dụng của bạn cần kết nối mạng, bạn không cần phải code lại nguyên thư viện Retrofit đâu.

  30 tuổi có học lập trình được không?

  Những cái “khó” khi mới học lập trình

#2. Lựa chọn thư viện một cách khôn ngoan

Như mình đã nói ở trên, với mỗi vấn đề thì thường luôn có sẵn một giải pháp mà người đi trước đã làm. Mình cũng khuyên bạn nên tận dụng nó nhưng phải khôn ngoan.

Bạn có thể tìm vô số thư viện hỗ trợ bạn giải quyết công việc một cách nhanh chóng. Nhưng trước khi lựa chọn bất kì một thư viện nào, bạn hãy kiểm tra số lượng rating mà người dùng trước đó đánh giá. Cũng như thời gian gần nhất mà tác giả cập nhật thư viện.

Ngoài ra, bạn cũng nên tham khảo danh sách issues của thư viện để có thể đánh giá độ tin cậy và khả năng hỗ trợ lâu dài của thư viện.

Nếu bạn ”max rảnh” thì có thể nhảy hẳn vào mã nguồn để tận mắt kiểm tra xem nó có thực sự tốt không? Cấu trúc mã nguồn có rõ ràng và có khả năng bảo trì cao không? Source code có được viết cẩn thận, có comment rõ ràng hay không?

Chỉ có như vậy bạn mới thực sự kiểm soát được chất lượng của thư viện mà bạn đang tham khảo.

Nếu bỏ qua bước này, bạn sẽ có nguy cơ tích trữ “một đống rác” cho dự án của mình, làm chậm tiến độ của dự án. Đấy là còn chưa nói đến hàng tá bugs mà thư viện khuyến mãi cho bạn!

quy tắc học lập trình

#3. Ngồi xuống, nhâm nhi tách cà phê và đọc code nhiều hơn

Nếu bạn để ý, Khi đi làm thì thời gian chúng ta dành cho đọc code của người khác là vô cùng nhiều. Chủ yếu là bạn sẽ phải phân tích code của dự án, review code cho member… hơn là thời gian tự viết code.

Nếu bạn đang trong hoàn cảnh ngồi tự suy nghĩ và tự code tất cả thì hãy nhanh chóng thay đổi suy nghĩ đi thôi.

Bất kể đoạn code nào bạn viết ngày hôm nay, thực chất chỉ là những gì bạn đã đọc hoặc từng học được ở đâu đó mà thôi.

Tức là bạn không phải nhà phát minh gì đâu, chỉ là bạn “bắt chước” ở đâu đó và biến nó thành của mình một cách sáng tạo.

Thực tế đã chứng minh là bạn chỉ có thể phát triển và cải thiện khả năng code của mình bằng cách đọc và học hỏi từ người khác.

Android là một nền tảng mã nguồn mở. Bạn có thể đào sâu mã nguồn để tìm hiểu xem các chuyên gia lập trình ra framework như thế nào. (Xem thêm Flutter hay react native Framework)

Như mình đã nói ở phần trước, hiện đã có hàng nghìn thư viện open-source trên Github. Bạn chỉ cần chọn lọc và nghiên cứu xem họ đã phát triển chúng như thế nào. Rồi sau đó học hỏi và tự nâng cao trình độ của mình.

Một lập trình viên thành công luôn biết cách học hỏi một cách hữu ích.

Bonus:  Đây là hai danh sách thư viện open-source code dành cho Android mà bạn sẽ cần đến khi bắt đầu triển khai dự án của mình:

#4. Code theo một tiêu chuẩn nào đó

Nếu bạn so sánh việc coding với viết văn, thì các tiêu chuẩn của coding cũng giống như chữ viết tay của bạn vậy.

Cũng giống như việc bạn đọc rất nhiều code của người khác (có thể là đồng nghiệp, chuyên gia hoặc sếp của bạn) trong khi họ cũng có thể đang đọc code của bạn viết ra.

Chắc hẳn bạn không hề muốn nhìn thấy cảnh họ phải thốt lên: “Trời ơi, nó đang viết cái quái gì đây?” đúng không?

Sẽ không khó hiểu nếu bạn bị đồng nghiệp của mình “xa lánh” khi chẳng may họ vô tình đọc được code do chính bạn tạo ra.

Hãy viết code thật ngắn gọn, rõ ràng và dễ đọc (Bạn biết từ khóa này chứ: DRY? Nghĩa là: Don’t repeat yourself. Nếu chưa biết thì hãy search google nhé).

Đỉnh cao của lập trình viên chính là: “Hãy viết code như viết một câu chuyện!”. Mình khuyên bạn nên đọc bài viết về clean code này của mình: Cách để viết Clean Code Android

Việc làm IT Fresher dành cho bạn

#5. Với Android, nên sử dụng ProGuard

Proguard là công cụ tuyệt vời không chỉ làm giảm kích thước code. Nó còn đảm bảo code của bạn an toàn trước các tay “đạo chích” có ý định “chôm chỉa” code của bạn.

Nếu bạn đang có ý định đưa ứng dụng của mình lên Google Play, mình có lời khuyên chân thành rằng bạn nên sử dụng Proguard “liền, ngay và lập tức”.

Mình từng bắt gặp một số ứng dụng được phát hành trên Google Play nhưng lại không sử dụng Proguard. Và kết quả là các hacker chỉ mất vỏn vẹn 5 phút để “chôm chỉa”. Chỉ đơn giản bằng cách biên dịch ngược lại mã nguồn từ file apk.

Pro Tip: Nhưng nếu bạn muốn bảo vệ mã nguồn ở mức cao nhất, thì Proguard chỉ như “tấm giấy bìa mỏng manh”, DexGuard mới là “vệ sĩ đích thực” bảo vệ mã nguồn của bạn.

#6. Không quên tận dụng các “cấu trúc” (Architecture)

Có khi nào bạn thầm tự cảm ơn khi đã may mắn lựa chọn một “cấu trúc” (Architecture) hợp lý từ ngày đầu của dự án chưa?

Một Architecture hợp lý sẽ đảm bảo dự án của bạn dễ dàng duy trì cũng như mở rộng. Từ đó việc đọc mã nguồn cũng trở nên đơn giản hơn rất nhiều.

Ở thế giới lập trình web, MVC là một trong những architecture phổ biến nhất. Trong khi đó, với lập trình Android mọi người lại sử dụng MVP (Model-View-Presenter), MVVM, Clean Architecture… nhiều hơn.

Với MVP, bạn có thể phân chia source code thành 3 tầng riêng biệt. Mục đích là tách phần View của Android ra khỏi phần xử lý logic. Như vậy, tầng Model-Presenter sẽ chỉ có thuần code Java mà không có code UI Android.

Pro Tip: Đây là một ví dụ minh họa về MVP kiến trúc. Và có thể bắt đầu bằng một guide hướng dẫn chi tiết MVP

#7. “Giao diện người dùng” (User Interface) là cực kì quan trọng

quy tắc học lập trình

Bất kì ứng dụng nào, nếu ngay từ lần sử dụng đầu tiên đã phải nhờ đến một bài hướng dẫn cách sử dụng dài lê thê. Thì đó chính là “điềm báo” cho một ứng dụng thất bại.

Nếu bạn làm việc trong một công ty lớn thì có thể bạn sẽ không cần quan tâm đến vấn đề này. Vì công ty đã có hẳn team UI/UX riêng để lo.

Nhưng nếu bạn là một nhà phát triển app độc lập, làm việc một mình thì UI/UX là vấn đề bạn phải luôn ghi nhớ trong đầu.

Người xưa có câu: “Tốt gỗ hơn tốt nước sơn”. Nhưng ở thế giới mà nhiều khi “nước sơn” tốt vẫn thu hút được rất nhiều người hơn là “gỗ tốt”.

Đặc biệt trong ngành phần mềm, sự cạnh tranh vô cùng khắc nghiệt cộng với người dùng ngày càng lười biếng thì UI là cái đập vào mắt họ đầu tiên trước khi họ kịp trải nghiệm tính năng bên trong.

Theo số liệu thống kê từ VnTalking, một ứng dụng với thiết kế UI cực tệ và khó sử dụng thì khả năng thất bại của nó sẽ tăng gấp 4 lần.

Chính vì vậy, hãy đầu tư cho “nước sơn” thật tốt vào nhé!

Bonus: Nếu bạn không có khả năng thiết kế hoặc không thể tự học được thì có thể nghĩ đến chuyện đi thuê. Có rất nhiều website cung cấp dịch vụ thiết kế với giá cả rất hợp lý, mình gợi ý một nơi đó là: Fiverr.com (Chỉ 5$ cho một dự án thành công)

#8. Phân tích số liệu – “bạn đồng hành” lý tưởng

Nếu bạn muốn tạo ra một ứng dụng thật sự tốt, bạn cần phải dựa vào các công cụ phân tích (Analytics tool) để biết được hiệu năng (Performance) và tần suất sử dụng các chức năng trên ứng dụng đó.

Dù bạn có là nhà phát triển Android thiên tài đi chăng nữa, bạn cũng không thể nào viết một ứng dụng hoàn hảo 100%.

Tất cả đều chỉ mới dừng lại ở mức “trên lý thuyết” mà thôi. Thực tế, có nhiều trường hợp ứng dụng hoạt động không đúng, khác xa so với lúc test. Thậm chí là crash và không thể chạy được.

Lúc này, công cụ Crash Reporting sẽ là trợ lý đắc lực. Nó giúp bạn biết cần phải làm gì, sửa lỗi như thế nào dù sự cố crash ấy chỉ xảy ra có một lần.

Ngoài ra, xét về khía cạnh marketing, các công cụ Analytics sẽ giúp những tính năng mà bạn xây dựng trở nên thực tế hơn.

Sẽ thật hoang đường nếu nghĩ rằng nhà phát triển ứng dụng android chỉ cần ngồi nhìn lên trời và biết được ngoài kia người dùng đang cần gì và muốn gì.

Tất cả đều phải có số liệu. Chỉ có số liệu mới giúp suy nghĩ hoặc suy luận của bạn chính xác và có độ tin cậy hơn.

#9. Hãy là một Ninja Marketing

Nếu bạn là một nhà phát triển app độc lập, hãy tự mình thoát ra khỏi suy nghĩ: “Mình chỉ là một nhà phát triển”.

Viết Code chỉ là một phần rất nhỏ trong số những việc bạn cần phải làm để hoàn thành một app và đưa nó đến tay người dùng.

Đây chính là bài học xương máu mà bản thân mình đã tự đúc kết được từ không ít thất bại.

Ban đầu, mình từng nghĩ hãy cứ làm một ứng dụng thật chất lượng, UI/UX thật ngon… Thì nhiều người sẽ tải và mình sẽ nhanh chóng nổi tiếng.

Nhưng thật trớ trêu, những ứng dụng mình đầu tư rất nhiều công sức thì lại chẳng có ai dùng. Còn những ứng dụng mình viết “chơi chơi” thì lại được đánh giá khá cao.

Sau rất nhiều đêm suy nghĩ, mình nhận ra ứng dụng của mình thật sự chất lượng. Nhưng lại không đáp ứng được nhu cầu thị trường.

Bản thân mình cũng chưa biết cách tiếp cận với khách hàng. Lại càng không biết họ thật sự muốn gì, cần gì ở một ứng dụng.

Nếu bạn thực sự nghiêm túc với việc kiếm tiền từ công việc viết ứng dụng thì bạn phải đầu tư công sức và thời gian vào việc tiếp thị ứng dụng, nghiên cứu đối thủ cạnh tranh để tự nhận biết điểm mạnh và yếu của mình từ đó đưa ra chiến lược marketing app ngắn và dài hạn.

“Biết người biết ta, trăm trận trăm thắng”, thành ngữ đó chẳng sai chút nào cả!

#10. Luôn luôn tối ưu ứng dụng

Cuối cùng trong 10 quy tắc học lập trình, đó là luôn luôn tối ưu ứng dụng. Khi bạn mới học lập trình, bạn sẽ có ít kinh nghiệm nên việc tối ưu sẽ khó khăn hơn. Nhưng khi bạn đã thời gian đúc kết kinh nghiệm thì cần phải để ý chuyện này.

Việc tối ưu code, tối ưu hiệu năng… là điều mà rất nhiều bạn thường quên làm.

Có một sự khác biệt lớn giữa viết code chạy được và “code tối ưu”. Viết code chạy được thì nhanh nhưng viết code để tối ưu được Memory, CPU, sử dụng ít Device Storage… Thì lại là cả một vấn đề lớn.

Một ứng dụng không được tối ưu có thể chạy tốt ở điều kiện bình thường. Nhưng thực tế sử dụng lại “muôn hình vạn trạng”. Không có gì để bạn đảm bảo rằng ứng dụng của mình sẽ chạy tốt trong mọi trường hợp.

Vì vậy, hãy luôn kiểm tra Memory bị chiếm dụng bởi ứng dụng, đề phòng các lỗi Memory Leaks. Hãy nhớ rằng: “Một vết thủng nhỏ cũng đủ để nhấn chìm cả một con tàu lớn”.

Pro Tip: Hãy dùng thư viện Leak Canary để tự động nhận diện các “Memory Leaks”. Thư viện này có thể được tích hợp dễ dàng vào code. Bạn chỉ cần khởi tạo và sau đó cứ để như thế, nó tự chạy. Khi phát hiện leaks, nó sẽ hiện thông báo và log lên màn hình.

Tạm kết

Mình đã chia sẻ quy tắc học lập trình được đúc kết trong quá trình làm việc.

Hi vọng rằng, những quy tắc này sẽ giúp cho bạn có thêm thông tin và nhanh chóng gặt hái thành công.

Hãy chia sẻ bài viết nếu thấy hay hoặc comment bên dưới để góp ý cho bài viết nhé!

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

Xem thêm:

Đừng bỏ qua việc làm IT tất cả level có trên TopDev nhé!

DevSecOps Philosophy (Triết lý DevSecOps)

Bài viết đến từ Ngô Doãn Thông – DevSecOps Engineer

   DevSecOps team @Techcombank

Giới thiệu

Trong 20 năm qua, DevOps đã cùng với Agile, thay thế cho mô hình phát triển Waterfall. Microservices được coi là công nghệ tiên tiến nhất để triển khai kiến trúc dịch vụ. Thời gian phát triển sản phẩm đã được giảm đi, triển khai tự động được thực hiện hàng tuần hoặc hàng ngày và cloud thì cung cấp khả năng tính toán, cơ sở hạ tầng, lưu trữ và mạng rất mạnh mẽ.

Triết lý DevOps thường được tóm tắt bằng khẩu hiệu “move fast and break things”, điều này có nghĩa là triển khai mọi thứ nhanh hơn, mạnh dạn hơn và sẵn sàng, phá bỏ các cấu trúc silo, rào cản, chấp nhận rủi ro và khắc phục nhanh từ những rủi ro đó.

Tuy nhiên, có một yếu tố quan trọng chưa được đề cập tới. Các tổ chức áp dụng DevOps vẫn cần đáp ứng tiêu chuẩn an ninh thông tin và tuân thủ quy định. Sự linh hoạt, đa dạng và tính mở của chuỗi cung ứng phần mềm (software supply chain), đặc biệt là các phần mềm mã nguồn mở, buộc chúng ta phải đánh giá đến yếu tố security này.

Đó là giá trị cốt lõi của DevSecOps: Tưởng tượng ra các giải pháp an ninh mới để bảo vệ phần mềm cũng như quy trình phát triển phần mềm.

Tuy nhiên, đó là một con đường không hề dễ dàng. Cần có một sự hợp tác giữa các nhóm phát triển sản phẩm, đội an ninh thông tin và vận hành để làm cho “security” trở thành quá trình thông suốt. Software supply chain và các CI/CD pipeline là những thành phần vô cùng quan trọng cần được bảo vệ khi áp dụng DevSecOps.

Security: Bảo vệ thông tin cũng như tốc độ phát triển sản phẩm

Có một sự thật là việc áp dụng các tiêu chuẩn an ninh thông tin vào có thể là rào cản làm chậm quá trình phát triển phần mềm. Khi mà time-to-market là quan trọng, thì việc áp dụng tiêu chuẩn an ninh thông tin vào có thể trở thành “bottleneck”. Một số rào cản, vấn đề có thể đưa ra như sau:

  • Thiếu chuyên môn về security hoặc khả năng viết code an toàn trong suốt vòng đời phát triển sản phẩm. Developer thường được chấp nhận để triển khai nhanh hơn và khắc phục sau.
  • Security ownership: Ai chịu trách nhiệm về mặt security này? Nhà cung cấp dịch vụ cloud? Hay maintainer của các sản phẩm mã nguồn mở? Ta có thể thường mặc nhiên cho rằng các nhà cung cấp dịch vụ, phần mềm khác đã đảm bảo security cho ta khi ta sử dụng. Tuy nhiên đó là một giả định sai lầm.
  • Chuyên gia an ninh và kỹ sư phần mềm hoạt động độc lập với nhau, vì vậy an ninh bị đe dọa bởi sự thiếu giao tiếp, thiếu sự phối hợp từ đầu.

Những vấn đề này có thể gây ra những rủi ro tiềm ẩn về mặt security. Nhưng bản thân chúng cũng có thể giúp các tổ chức xây dựng một thái độ thận trọng hơn trước những rủi ro.

Khi mà hệ thống được mở rộng và trở nên phức tạp hơn, các tổ chức sẽ có xu hướng đánh giá nghiêm túc hơn về những rủi ro. Nỗi lo lắng về việc thiếu các tiêu chuẩn an ninh thông tin có thể ảnh hưởng lớn đến toàn bộ sản phẩm, quy trình phát triển tự động hóa, sẽ khiến các tổ chức chủ động tiếp cận đến với các giải pháp quản lý và ngăn ngừa rủi ro hơn.

Security: Sự bổ sung cho DevOps

Nắm bắt được những điểm yếu trong quá trình phát triển phần mềm

Hiện nay, các team DevOps hiện đại hiểu được tầm quan trọng của software supply chain trong chu trình phát triển sản phẩm. Supply chain là thuật ngữ rộng lớn bao gồm rất nhiều thứ khác nhau (công cụ mã nguồn mở hoặc đóng, dependency, platform…) để mô tả cách thức xây dựng phần mềm hiện đại. Software supply chain là một “con đường”, là một cấu trúc phân lớp bao gồm các phần cứng, Infrastructure-as-a-Service (IaaS), Platform-as-a-Service (PaaS), Software-as-a-Service (SaaS), và các công cụ khác, được kết hợp cùng với nhau để hỗ trợ cho phần mềm cũng như quá trình phát triển phần mềm đó.

DevSecOps philosophy

Hiếm khi ta thấy được một công ty làm phần mềm mà có 100% phần mềm, công cụ được sử dụng là do họ tự phát triển. Hầu hết các công ty phần mềm hiện đại đều sử dụng hàng trăm, nếu không phải là hàng ngàn các building block, các thư viện và công cụ mã nguồn mở, các hệ thống triển khai, cơ sở hạ tầng đám mây và dịch vụ SaaS. Mỗi block này lần lượt là sản phẩm cuối cùng từ một supply chain riêng của nó, mà khi sử dụng, ta không kiểm soát được cũng như không có khả năng nhìn thấy được supply chain trước đó của nó.

DevSecOps philosophy

CI/CD pipeline

CI/CD pipeline là xương sống, là trụ cột của DevOps. Nó dùng để kết nối developer tới các môi trường triển khai, dùng để tối ưu hóa 4 luồng sau đây:

  • Continuous integration: Tích hợp liên tục. Tự động hóa việc xây dựng các bản build ứng dụng từ source code và các library, dependency của chúng.
  • Continuous testing: Kiểm thử liên tục. Tự động hóa việc kiểm thử ứng dụng sau mỗi commit.
  • Continuous monitoring: Giám sát liên tục. Tự động hóa việc thu thập các dữ liệu về log, metric của ứng dụng cũng như hạ tầng trên từng môi trường triển khai.
  • Continuous delivery/deployment: Triển khai liên tục. “One-click” để triển khai toàn bộ ứng dụng lên bất cứ môi trường nào.

4 luồng này, được tích hợp trong các CI/CD pipeline, để nhắm tới mục tiêu tối thượng cuối cùng của DevOps, đó là: Continuous improvement – Cải tiến liên tục.

DevSecOps philosophy

Lợi thế mà những CI/CD pipeline này đem lại là rất lớn. Chúng giúp cho từng thay đổi nhỏ cũng có thể được triển khai (cũng như phục hồi, rollback) một cách nhanh chóng và chính xác.

Tuy nhiên, bản thân chúng cũng tồn tại những mối rủi ro. Mỗi stage trong một CI/CD pipeline là một “interface” có thể bị tấn công, khai thác. Điều đáng lo ngại hơn là mỗi stage có thể đại diện cho mục tiêu có giá trị cao đối với các kẻ tấn công: Không chỉ vì nó có thể lưu giữ các secret, credential, mà còn vì đây là nơi mà một kẻ tấn công có thể thay đổi mã nguồn, thay đổi cấu hình nào đó một cách lặng lẽ ngay giữa luồng build và deploy mà không ai có thể can thiệp được bởi luồng này đang vận hành tự động.

Kết quả là, supply chain cũng như CI/CD pipeline đang trở nên ngày càng dễ bị tấn công do tính mở và phức tạp của chúng. Chúng để lại rất nhiều vùng xám chưa rõ ràng trong các security framework truyền thống.

DevSecOps philosophy

Từ DevOps tới DevSecOps

DevSecOps là gì?

DevSecOps là kết hợp của việc tích hợp giữa những công cụ, tiêu chuẩn của Security và triết lý “Continuous improvement” của DevOps thành một phương pháp, quy trình phát triển, triển khai phần mềm nhất quán, tự động, hiệu quả và đảm bảo an toàn bảo mật.

DevSecOps sẽ giúp nhận diện các vấn đề an ninh sớm trong quá trình phát triển thay vì sau khi sản phẩm được release như trước kia.

DevSecOps có thể giảm chi phí liên quan đến việc khắc phục những lỗ hổng an ninh bằng cách tích hợp các công cụ security vào mỗi giai đoạn của quá trình phát triển, có thể ngay từ giai đoạn đưa ra yêu cầu, thiết kế trở đi.

Nguyên tắc bảo mật phải là một phần không thể thiếu trong văn hóa của bất kỳ công ty nào. An ninh thông tin phải là một phần của quá trình phát triển phần mềm. Nói ngắn gọn, DevSecOps sẽ giúp đưa những nguyên tắc, trách nhiệm đó đến với từng developer, đến từng bước trong quá trình phát triển phần mềm.

Giá trị cốt lõi của DevSecOps

Tăng tần suất triển khai ứng dụng an toàn

Khi security bao trùm lên toàn bộ CI/CD pipeline, chất tốc độ sẽ sản phẩm được cải thiện. Ta phải thực tế và chấp nhận rằng giai đoạn đầu của việc tích hợp có thể sẽ rất khó khăn. Khi việc phối hợp giữa các nhóm phát triển và security trở nên mượt mà hơn, những vấn đề này sẽ dần biến mất và chỉ còn lại kết quả tích cực.

Giảm thời gian khắc phục các lỗ hổng nguy hiểm

DevSecOps sẽ cải thiện đáng kể thời gian khắc phục trung bình nhờ việc rà quét sớm và tự động, có luồng feedback tốt hơn và mô hình chia sẻ trách nhiệm. Khi trách nhiệm về security được chia sẻ trên toàn bộ CI/CD pipeline cũng như trong quy trình phát triển phần mềm, thay vì tách biệt hoàn toàn về một nhóm security, các vấn đề an ninh được phát hiện sớm và nhanh hơn. Điều này cũng trực tiếp liên quan đến hiệu quả chi phí, vì nó sẽ tốn nhiều tiền hơn để khắc phục lỗi được tìm thấy trong quá trình vận hành hơn là sửa lỗi được xác định trong giai đoạn thiết kế phát triển.

Cải thiện tư duy về an ninh thông tin

Nói chung, việc phát triển phần mềm hiện nay tương đối là phức tạp. Đưa security vào như một “tính năng” từ đầu sẽ giúp tiết kiệm rất nhiều thời gian cho các nhóm security bằng cách loại bỏ các vấn đề vô hại hoặc false positive nhờ vào các quy trình tự động kiểm soát ở mỗi bước. Nó sẽ tạo ra một nền văn hóa mới, tư duy mới, nơi các phương pháp an ninh tốt nhất được chia sẻ và đem đến lợi ích cho tất cả – bắt đầu ngay từ bước thiết kế, phát triển cho tới quá trình triển khai, vận hành phần mềm ứng dụng.

Best practices

DevSecOps nhấn mạnh rằng security là trách nhiệm của tất cả thành viên trong một tổ chức, và mọi người đều phải tuân thủ và thực hiện đảm bảo an toàn bảo mật thông tin.

Chìa khoá để áp dụng thành công mô hình DevSecOps nằm ở ba yếu tố: Con người, quy trình và công nghệ.

Yếu tố con người

Không quan trọng bao nhiêu công nghệ được áp dụng, yếu điểm lớn nhất về mặt an ninh thông tin luôn là con người. Đây cũng là điểm khởi đầu cho bất cứ quá trình áp dụng DevSecOps nào.

Một trong những điều quan trọng nhất nhưng cũng là khía cạnh khó nhất của DevSecOps là thay đổi cách làm việc truyền thống của security team. Đa số cách tiếp cận rủi ro là loại bỏ khi nó đã xảy ra, thay vì chủ động phòng bị trước.

Security team cần chuyển từ việc hoạt động độc lập sang việc tham gia cùng trong luồng phát triển phần mềm. Điều này vừa giúp tăng nhận thức về an ninh thông tin tới tất cả thành viên trong đội dự án, vừa giúp nhận biết sớm các rủi ro tiềm tàng trong phần mềm, trong hệ thống.

Tại Techcombank, DevSecOps team sẽ nhắm tới việc phá bỏ rào cản này giữa security team và project team, đồng thời cung cấp những chính sách và công cụ hỗ trợ cho việc này. Việc tạo ảnh hưởng đến yếu tố con người này sẽ đặt nền móng vững chắc cho việc thay đổi hai yếu tố “Quy trình” và “Công nghệ” tiếp theo của DevSecOps.

Yếu tố quy trình

Các quy trình thông thường được quy phạm tới từng team và thường ít khi có sự chia sẻ giữa các team với nhau. Điều này có thể gây ra ảnh hưởng tới năng suất trong cả một tổ chức. DevSecOps hướng tới việc thiết lập các quy trình tiêu chuẩn chung, các tài liệu đảm bảo security cho tổ chức để tạo sự phối hợp giữa các team như là một khối thống nhất. Việc xây dựng ra một quy trình, tiêu chuẩn tự động hoá đảm bảo an toàn thông tin là trách nhiệm của team DevSecOps tại Techcombank.

Version control

Khi mọi thứ được tự động hoá, thứ quan trọng nhất cần được track đó là các thay đổi (changes). Mỗi hành động tạo ra changes phải được quản lý bởi version, cũng giống như version control khi code vậy. Việc versioning này sẽ giúp ta ghi lại được lịch sử thực hiện cũng như dễ dàng khi khôi phục lại. Để đáp ứng yếu tố này, DevSecOps team ở Techcombank đã xây dựng một hệ thống Gitlab private nhằm lưu trữ tất cả các mã nguồn được viết ra bởi developer.

Tích hợp

Security cần phải được đưa vào quá trình phát triển sản phẩm sớm nhất có thể, ngay từ bước thiết kế. Phương pháp này được gọi là “shift left” hay “shift security to the left”.

Techcombank áp dụng những công cụ rà soát an ninh thông tin tự động ngay từ giai đoạn đầu của việc phát triển ứng dụng. Điều này vừa giúp những vấn đề về an ninh được phát hiện và ngăn chặn sớm, đồng thời cũng giúp các developer có nhận thức tốt hơn về việc viết code an toàn.

Compliance

Tuân thủ compliance là điều bắt buộc. Nếu nền móng về yếu tố con người đã được thực hiện tốt trước đó, thì việc tuyên truyền về việc tuân thủ compliance sẽ trở nên rất đơn giản và hiệu quả. Bên cạnh đó, compliance có thể không chỉ là các văn bản quy phạm. Ta hoàn toàn có thể xây dựng các metadata biểu diễn cho các compliance requirement và đưa vào các security policy để thực hiện tự động hoá.

Xử lý sự cố

Phản ứng với các sự cố liên quan tới an ninh thông tin không nên là tạm bợ nhất thời. Thay vào đó, việc xây dựng workflow, action plan, runbook, playbook luôn cần được chuẩn bị sẵn sàng từ trước. Điều này sẽ đảm bảo việc phản ứng với các sự cố trở nên có tính chắc chắn, có khả năng đo đếm và nhanh chóng hơn. Theo quy trình và tiêu chuẩn DevSecOps tại Techcombank, các kịch bản khôi phục sự cố cần được thực hiện dưới dạng code và tự động thông qua CI/CD pipeline. Điều này sẽ giúp việc ứng phó sự cố hệ thống trên môi trường live được thực hiện nhanh chóng hơn và số lượng sự cố trong quá trình triển khai cũng sẽ giảm đi.

Yếu tố công nghệ

Công nghệ là thứ cho phép mọi người thực hiện được các quy trình DevSecOps. Đây cũng là yếu tố cuối cùng quyết định việc áp dụng DevSecOps của một tổ chức có đủ trưởng thành, có thành công hay không.

Tự động hóa việc quản lý cấu hình

Tổ chức quản lý và tự động hóa việc quản lý cấu hình dưới dạng code sẽ giúp việc audit, việc đảm bảo baseline, compliance trở nên dễ dàng hơn rất nhiều. Các template dưới dạng code được đưa ra giúp việc rà soát các thay đổi được kiểm soát qua version control, rollback, phục hồi cũng trở nên rất nhanh chóng.

Tại Techcombank, Puppet được sử dụng như là một công cụ kiểm soát cấu hình. Các cấu hình đạt tiêu chuẩn baseline sẽ được định nghĩa trước và quản trị thông qua Puppet. Mọi hành vi cố ý thay đổi ngoài baseline sẽ luôn được phục hồi lại nhanh chóng.

Host hardening

Trước khi bảo mật đến tầng ứng dụng, tầng OS cần phải được an toàn trước. Có vô số những sự cố an ninh bắt nguồn từ việc host, đặc biệt là các host bị expose ra internet, bị khai thác. Do đó, một hardening checklist là rất cần thiết trong việc xây dựng template cũng như trust model cho việc cấu hình host. Kết hợp với tự động hóa việc quản lý cấu hình, host sẽ luôn được đảm bảo ở trạng thái an toàn cao nhất. 

Audit và scan tại tầng ứng dụng

Việc thực hiện audit và scan liên tục là một phương diện thiết yếu của DevSecOps, giúp cho tổ chức hiểu được rõ ràng về các mối nguy. Các giải pháp hiện tại ở Techcombank gồm có:

  • Quét mã nguồn: Việc quét mã nguồn có thể được thực hiện bằng cách áp dụng các SAST tool (Static Application Security Testing). SAST tool phân tích mã nguồn của dự án để xác định ra các lỗi liên quan đến bảo mật trong code cũng như vấn đề của các dependency và library mà ứng dụng sử dụng. Các công cụ được DevSecOps team đưa vào tiêu chuẩn gồm có SonarQube và Synopsys Coverity.
  • Tích hợp vào IDE: Mọi developer đều cần sử dụng IDE trong việc code. Sử dụng một số plugin trong IDE sẽ giúp ngăn chặn một phần lỗi trong code ngay từ máy cá nhân của developer trước khi cả commit code lên repository. Hiện tại, việc ngăn chặn này đang được thực hiện bằng pre-commit và sắp tới là SonarLint
  • Binary scanning: Các package của ứng dụng sau khi được build ra cần phải được rà quét lại dưới dạng binary bằng Synopsys BlackDuck. Việc một lần nữa rà quét lại bản build này giúp đảm bảo chắc chắn rằng phần mềm kể cả đã đóng gói cũng đảm bảo an toàn thông tin.
  • Audit trước và sau triển khai: Thêm một bước audit trước và sau triển khai sẽ đảm bảo ứng dụng an toàn tại day-0 và cả day-1 khi triển khai.
Quản lý secret

Secret và credential là các dữ liệu nhạy cảm hoặc thậm chí là tối mật được sử dụng cho ứng dụng. Trong quá trình thực hiện CI/CD, việc sử dụng đến các secret hay credential là một việc thường xuyên xảy ra. Do vậy, sử dụng các công cụ mã hoá và lưu trữ các dạng dữ liệu này là tối quan trọng, đặc biệt trong CI/CD pipeline. Các công cụ, nền tảng hỗ trợ cho việc này đang được áp dụng tại Techcombank có thể kể đến như HashiCorp Vault, AWS Secrets Manager, GPG, Ansible Vault…

Tổng kết

DevSecOps chuyển dịch security từ phản ứng sang chủ động tham gia vào quy trình phát triển phần mềm. Những ưu điểm mà DevSecOps mang lại cho tổ chức là rất nhiều, bao gồm giảm thiểu chi phí, tăng tốc độ triển khai, tăng tốc độ phục hồi, kiểm soát và truy tìm các mối nguy. DevSecOps cũng phá bỏ đi rào cản giữa DevOps và Security, giúp tất cả cùng hoạt động hướng tới những mục tiêu chung của tổ chức.


Thuộc dự án Inside GemTechnology do TopDev hợp tác cùng Techcombank triển khai, chuỗi nội dung thuần “Tech” độc quyền được chia sẻ bởi đội ngũ chuyên gia Công nghệ & Dữ liệu tại Techcombank sẽ được cập nhật liên tục tại chuyên mục Tech Blog | Techcombank Careers x TopDev. Cùng theo dõi & gặp gỡ các chuyên gia bạn nhé!

 

Các cơ hội việc làm tại Techcombank

Bài viết liên quan

Hơn cả một phương pháp, DevSecOps chính là “triết lý bảo mật” tại Techcombank

Là một thành viên mới tại Techcombank, anh Bùi Nguyễn Tuấn Minh hiện đang là Giám đốc DevSecOps, đây cũng là công việc đầu tiên của anh sau những năm tháng làm việc tại Singapore. Anh cũng là một trong những người góp phần mang lại những góc nhìn mới trong các phương pháp phát triển phần mềm của Techcombank. Được biết, Techcombank là một trong những đơn vị tiên phong ứng dụng phương pháp DevSecOps trong việc phát triển sản phẩm. Đây cũng được xem là một trong những định hướng giúp các ngân hàng số hóa và phát triển mạnh mẽ trong tương lai. Sau đây là những chia sẻ của anh Bùi Nguyễn Tuấn Minh về công việc DevSecOps tại Techcombank. Anh có thể chia sẻ một chút về môi trường làm việc tại Techcombank? Khi chuyển công tác từ Singapore về Việt Nam, mình nhận thấy môi trường và cách thức làm việc [...]

Infrastructure as code (IaC)

Bài viết đến từ anh Bùi Nguyễn Huy Hoàng - Quản lý DevSecOps DevSecOp team @Techcombank I. Tại sao lại sử dụng Infrastructure as Code? Những công việc như ảo hóa, điện toán đám mây (Cloud), container, tự động hóa (CI/CD) giúp đơn giản hóa công việc vận hành hành công nghệ thông tin (IT Operations). Việc triển khai, cấu hình, cập nhật và vận hành dịch vụ sẽ tiêu tốn ít thời gian và công sức hơn. Vấn đề sẽ được phát hiện và giải quyết nhanh chóng, các hệ thống luôn được cấu hình và cập nhật một cách đồng nhất. Những kỹ sư IT sẽ tiết kiệm được thời gian trong công việc vận hành hàng ngày, để có thể nhanh chóng thay đổi, học hỏi và cải tiến bản thân đáp ứng nhu cầu thay đổi liên tục của thế giới công nghệ. Tuy nhiên, ngay cả với những công cụ và nền tảng mới nhất, các [...]

Top 5 câu hỏi phỏng vấn Game Designer được hỏi nhiều nhất

Top 5 câu hỏi phỏng vấn Game Designer được hỏi nhiều nhất

Game designer có phải là người thiết kế chính cho game? Vậy những kỹ năng nào cần có cho vị trí này, dưới đây là ví dụ 5 câu hỏi phỏng vấn Game Designer.

Phỏng vấn game designer

Tin tui đi bà con ơi, tui là game designer nè, thiết kế gì cũng chuẩn, game nào game nấy làm ra chỉ có chơi ghiền tới chết hông à!.

Đùa chút cho vui nhưng mong rằng qua bài viết này, anh em sẽ có các bước chuẩn bị thật tốt cho buổi phỏng vấn.

Bắt đầu ngay thôi nào!

1. Những kĩ năng nào là quan trọng nhất của Game Designer

Câu hỏi thứ nhất phỏng vấn Game Designer, tập trung vào những kĩ năng mà ứng viên cho rằng nó là quan trọng đối với vị trí mà mình đang ứng tuyển.

Việc xác định rõ những kĩ năng cần có hoặc quan trọng đối với bản thân giúp nhà tuyển dụng hiểu được ứng viên đang ở trình độ nào. Những kỹ năng mà ứng viên xem là quan trọng có phù hợp với công việc hiện tại hay không?

Phỏng vấn game designer

Ở vị trí Game designer, tất nhiên kỹ năng quan trọng nhất là thiết kế. Tuy nhiên một số kỹ năng khác ứng viên có thể nếu ra (tất nhiên tuỳ vào kinh nghiệm của từng ứng viên).

    • Kỹ năng giao tiếp
    • Kỹ năng giải quyết vấn đề
    • Kỹ năng trình bày giải pháp
    • Kỹ năng thương lượng với khách hàng

Trên đây chỉ là một số kĩ năng gợi ý, ứng viên có thể thoải mái nêu ra những kỹ năng mà mình cho là quan trọng. Hơn nữa các kỹ năng được cho là quan trọng ứng viên sẽ trau dồi kĩ năng đó như thế nào?

  Game Developer là gì? Lộ trình trở thành Game Developer
  Mẫu bảng mô tả công việc lập trình Game

2. Game ưa thích nào của bạn bạn nghĩ có thể làm nó tốt lên?

Câu hỏi phỏng vấn Game Designer này đánh giá góc nhìn của Game Designer. Bản thân đã là Game Designer, bạn sẽ có nhiều cơ hội tiếp xúc với đủ thể loại game.

Nhưng game nào bạn nghĩ nó sẽ có thể làm tốt hơn. Ở góc nhìn của designer bạn có thể trình bày về mặt UI/UX của game. Ví dụ như:

    • Về behavior thì nhân vận này có thể thêm animation này để tăng độ phấn khích của người chơi
    • Về bố trí thì có thể sửa đổi vị trí đồ vật này để phù hợp với vật lý hơn
    • Về độ khó có thể tăng lên giúp game kịch tính hơn

Phỏng vấn game designer

Tuy là câu hỏi dành cho vị trí Game Designer, bạn cũng có thể nêu ra một số lỗi hoặc cải thiện có thể có liên quan tới game nhưng không thuộc trách nhiệm designer như backend, một số lỗi khác có trong game.

Về top 5 game designer nổi tiếng anh em có thể tham khảo tại đây.

Xem tuyển dụng Game Developer tại các công ty hàng đầu trên TopDev

3. Trong quá trình thiết kế game, bạn có gặp phải những hạn chế nào từ tuổi tác không?

Câu hỏi thứ 3 phỏng vấn Game Designer liên quan trực tiếp tới kinh nghiệm. Nếu quá trình làm việc đủ lâu và trải qua nhiều dự án, anh em sẽ trải qua những dự án game liên quan tới:

    • Tuổi tác
    • Giới tính
    • Quốc gia
    • Tôn giáo

Với những chủ đề có tính chất đặc thù như trên, quá trình phát triển game sẽ đòi hỏi Game Designer phải biết chính xác đối tượng game mình phát triển.

Phỏng vấn game designer Biết mình làm game cho ai là hiểu biết quan trọng khi anh em bước vào design game cho mình

Trường hợp game phát triển cho trẻ em dưới 18 tuổi, game designer sẽ không được phép đem các hình ảnh hoặc video có nội dung bạo lực vào trong game. ESport thường không liên quan tới chính trị và tôn giáo, chính vì vậy tuyệt đối tránh các nội dung này khi thiết kế game.

4. Những thử thách nào khó nhằn nhất bạn gặp phải khi thiết kế game

Câu hỏi thứ 4 phỏng vấn Game Designer tập trung vào kinh nghiệm làm việc. Nếu đã trải qua từ 2 năm kinh nghiệm, chắc chắn bạn sẽ gặp phải một số khó khăn khi thiết kế game.

Câu hỏi này tạo điều kiện cho ứng viên trình bày về những khó khăn mà mình đã gặp phải, cách thức giải quyết vấn đề đó nếu có.

Trường hợp một game nào đó có các yêu cầu về hành động của nhân vật đặc biệt, không giống với những hành động thông thường? Bạn xử lý như thế nào. Một ví dụ khác là những game có nhiều đối tượng, tương tác với nhiều nhân vật (ví dụ như trong một trận chiến, hoặc game giết zombie, thông thường đòi hỏi sự xuất hiện của rất nhiều zombie).

Phỏng vấn game designer Game có hiệu ứng phức tạp hoặc yêu cầu cao về xử lý hành động thường là những game khó khăn cho Game designer

Với những câu hỏi này, nhà tuyển dụng mong muốn ứng viên có thể nhận ra những khó khăn gặp phải trong quá trình làm việc. Nếu có những khó khăn đó, phương án xử lý như thế nào. Anh em lưu ý phương án xử lý không nhất thiết phải do mình đề xuất. Nên không nhất thiết phải trình bày các vấn đề khó khăn mà giải pháp phải do chính mình đưa ra.

5. Làm thế nào để luôn phát triển kĩ năng ở vị trí Game Designer

Câu hỏi thứ 5 phỏng vấn Game Designer mong muốn ứng viên có thể trình bày về khả năng tự học và cập nhật kiến thức.

Giống như các mảng khác liên quan tới phần mềm. Xu hướng và các công nghệ sử dụng cho Game Designer luôn luôn cập nhật và thay đổi cực kì nhanh chóng. Với đà phát triển như vũ bão của Trí tuệ nhân tạo và học máy, hình ảnh và các hiệu ứng liên quan tới nhân vật có thể được tạo ra một cách dễ dàng.

Phỏng vấn game designer

Để không bị bỏ lại phía sau. Theo các lối mòn về game, ứng viên cần nêu các phương án học hỏi và cập nhật kiến thức. Ví dụ như các xu hướng làm game mới, xu hướng thiết kế thịnh hành cho dòng game hành động.

Việc học hỏi và cập nhật thường xuyên giúp ứng viên ghi điểm lớn trong mắt nhà tuyển dụng. Việc học hỏi không ngừng cũng giúp ứng viên nâng cao trình độ. Hướng tới phát triển và làm việc hiệu quả hơn

6. Tham khảo thêm phỏng vấn Game Designer

Cảm ơn anh em đã đọc bài – Thank you for your time – Happy coding!

Tác giả: Kiên Nguyễn

Bài viết liên quan:

Đừng bỏ lỡ việc làm IT mọi cấp độ tại TopDev

Giới thiệu cấu trúc dự án tạo bằng Vuejs CLI

Giới thiệu cấu trúc dự án tạo bằng Vuejs CLI

Bài viết được sự cho phép của tác giả Sơn Dương

Như bài viết trước, chúng ta đã hiểu cơ bản về vue jvs, biết cách cài đặt và tạo một ứng dụng bằng vuejs. Phần tiếp theo, mình muốn các bạn hiểu sâu hơn về cấu trúc dự án được tạo bằng Vuejs CLI sẽ như thế nào? Mô hình của vuejs là MVVM thì cấu trúc các folder trong dự án sẽ ra sao.

Để theo dõi bài viết này được suôn sẻ, bạn nhớ chuẩn bị sẵn những thứ bên dưới nhé:

Ngoài ra, ở bài viết trước, mình đã tạo sẵn bộ khung dự án, các bạn chỉ cần clone từ github về là xong. Ở bài này, mình sẽ hướng dẫn các bạn tự tạo dự án bằng câu lệnh Vuejs CLI.

Chúng ta bắt đầu nhé!

Vue CLI là gì?

Vue-CLI là một gói NPM được cài đặt trên toàn thế giới nhằm cung cấp vue trong terminal . Bằng cách sử dụng Vue Create, Vue serve nó sẽ hỗ trợ bạn xây dựng dự án dễ dàng và nhanh gọn.

#Cài đặt Vuejs CLI

Vues CLI, viết tắt của từ Command Line Interface, tức là công cụ cho phép bạn khởi tạo dự án một cách tự động. Để cài đặt Vuejs CLI, bạn sử dụng câu lệnh cài đặt bằng npm:

npm install -g vue-cli

Sau khi cài đặt thành công, mình sẽ chạy thử công cụ này để tạo một dự  án có mới và sử dụng bộ template Webpack. Webpack  là một module Official của Vue jvs, để generate các file static (html, css) tự động từ các module và dependencies của dự án.

Ok, tạo hiểu như vậy đã nhé. Giờ bạn vào một folder bất kỳ trên máy tính, rồi gõ lệnh sau:

vue init webpack AccountOwnerClient

Trong lúc tạo dự án, trình tạo sẽ hỏi bạn một số câu hỏi về thông tin dự án. Bạn cứ trả lời “thành thật” là được

Mình sẽ giải thích một số câu hỏi:

  • Project name: Bạn gõ account-owner-client là tên dự án thôi.
  • Project description: miêu tả ngắn gọn dự án. Bạn trả lời ví dụ như: Account Owner Client
  • Author: Tác giả dự án là gì, bạn gõ theo đúng format sau: Name Surname <email@domain.tld>
  • Tiếp theo, nó sẽ hỏi về Runtime + Compiler hay chỉ Runtime thôi. Bạn chọn Runtime + Compiler nhé. Bởi vì chúng ta có thể sẽ phải tạo vuejs component nên sẽ cần cả compiler nữa.
  • Bạn có muốn sử dụng vue-router không? Tất nhiên là có rồi. Module này giúp bạn điều hướng các trang (page) trong ứng dụng.

Giải thích thì nó dài dòng vậy thôi, chứ thực ra thì ngắn không à.

Vuejs CLI

Cuối cùng là chờ đợi npm hoàn thành nốt phần còn lại. Sau đó bạn mở dự án bằng bất kỳ trình code editor nào bạn có.

Với mình thì mình recommend các bạn sử dụng visual code. Sự kết hợp hoàn hảo giữa Visual code + Vue.js Extension Pack sẽ giúp bạn làm việc với vue jvs sướng mê li.

  Vuejs Design Pattern – Dăm ba pattern phổ biến

  Cách sử dụng các plugins jQuery trong VueJS

#Tổng quan cấu trúc một dự án Vuejs

Sau khi bạn mở thư mục dự án vừa tạo, bạn sẽ thấy cấu trúc thư mục như sau:

Vuejs CLI
Cấu trúc thư mục dự án tạo bởi vuejs cli

Mình sẽ giải thích ý nghĩa của từng thư mục:

  • src: đây là thư mục chưa mã nguồn dự án. Trong thư mục này lại phân chia tiếp.
    • assets: Module assets nơi mà bạn sẽ làm việc với Webpack
    • components: Tất cả UI components sẽ nằm ở đây.
    • router: đây là nơi bạn sẽ viết routes và kết nối chúng với UI components.
    • vue: Đây là entry point component. Là nơi sẽ khởi tạo tất cả các component khác. Hiểu nôm na là tệp chính của dự án.
    • js: Entry point file để mount App.vue.
  • assets: pure assets ( assets của riêng dự án), không liên quan tới webpack.
  • html: Bạn có nhớ là ứng dụng SPA (Single Page Application) thì có 1 trang duy nhất. Sau đó, nội dung của trang bị thay đổi mà không phải tải lại trang. Và đây chính là trang duy nhất đó.

Chúng ta sẽ xem qua nội dung của index.html

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width,initial-scale=1.0">
   <title>account-owner-client</title>
</head>
<body>
   <div id="app"></div>
   <!-- built files will be auto injected -->
</body>
</html>

Có một thẻ quan trọng trong tệp html này đó chính là thẻ div có id: app. Thẻ div này sẽ được replaced bởi app.vue sau này.

Sau đó, các nội dung khác sẽ được injected bên dưới thẻ div này.

Phần tiếp theo, chúng ta sẽ ngó qua tệp main.js. Đây là sẽ file mà chúng ta sẽ phải làm việc nhiều với nó.

import Vue from 'vue';
import App from './App';
import router from './router';

Vue.config.productionTip = false;

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
});

Ở đoạn code ví dụ này, chúng ta sử dụng các component như vue, app, router.

Xem thêm nhiều tuyển dụng VueJS hấp dẫn trên TopDev

Cấu trúc một component trong Vue

Các component về cơ bản thì cũng sẽ cấu trúc giống nhau. Để dễ hiểu, chúng ta cùng nhau xem qua têp app.vue.

<template>
<div id="app">
   <img src="./assets/logo.png">
   <router-view/>
</div>
</template>

<script>
export default {
name: 'App'
};
</script>

<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>

Như vậy, một vue component sẽ gồm 3 thành phần:

  • Một template: Là phần hiển thị của một component. Hiểu nôm na là UI của component
  • Một script: là nơi thực hiện logic cho component
  • Và một style: định dạng trang, mục đích để trang trí “sắc đẹp” cho component.

#Tạm kết

Như vậy là bạn đã biết cách tạo mới dự án bằng cách sử dụng Vuejs CLI. Đây mới chỉ là những bước khởi đầu để khám phá thế giới tuyệt vời của Vuejs mà thôi.

Qua bài viết này, bạn đã biết:

  • Cách tạo mới một dự án Vuejs
  • Hiểu sơ lược SPA là gì? Và cách vuejs hỗ trợ SPA
  • Cấu trúc và ý nghĩa các folder trong một dự án Vuejs

Phần tiếp theo của loạt bài viết về vuejs, mình sẽ hướng dẫn cách cài đặt thư viện third party, cách sử dụng router và điều hướng các màn hình trong ứng dụng vuejs.
Các bạn đón đọc nhé.

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

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

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

Bàn về hai phương pháp khóa dữ liệu phổ biến là Record Locking và Optimistic Locking

Bàn về phương pháp khóa dữ liệu: Record Locking và Optimistic Locking

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Khóa bản ghi trong khi đọc hoặc cập nhật dữ liệu là một việc xảy ra với tần suất tương đối phổ biến. Ví dụ kinh điển cho trường hợp này là bài toán chuyển tiền giữa A và B: Trong khi A đang chuyển cho B một số tiền là x, khi đó chúng ta cần kiểm tra số dư của A, nếu còn đủ tiền thì trừ đi x đồng trong tài khoản rồi cộng thêm x đồng vào tài khoản của B. Đảm bảo rằng tất cả quá trình cộng trừ đó phải thành công thì giao dịch mới hoàn tất, vì nếu một lỗi xảy ra trong khi trừ tiền của A mà chưa cộng vào B hoặc ngược lại thì sẽ gây ra một vấn đề nghiêm trọng về tính chính xác của chương trình.

Ví dụ thứ tự để thực hiện các câu truy vấn trong trường hợp này với PostgreSQL sẽ giống như là:

BEGIN TRANSACTION;

SELECT balance FROM accounts WHERE user = 'A';

// if a > x then...

UPDATE accounts SET balance = balance - x WHERE user = 'A';
UPDATE accounts SET balance = balance + x WHERE user = 'B';

COMMIT;

Hầu hết chúng ta biết được cách giải quyết bài toán này bằng transaction. Tức là khởi tạo một transaction và đảm bảo cả hai quá trình trừ tiền và cộng tiền thành công thì mới công nhận quá trình chuyển tiền thành công và lưu vào cơ sở dữ liệu. Nếu chẳng may 1 trong 2 bị lỗi thì giao dịch thất bại mà chẳng ai bị trừ tiền hay cộng tiền một cách vô lý nữa.

Nhưng trong trường hợp A có thể thực hiện nhiều lệnh chuyển tiền và “gần như cùng một lúc” thì có một vấn đề khác xảy ra. Đó là ở câu lệnh SELECT đầu tiên với mục đích kiểm tra số dư, vì khả năng cao một số lệnh SELECT ra được balance của A trước khi mà đến bước kiểm tra số dư, khi đó chúng đều thỏa mãn a > x và điều gì sẽ xảy ra nếu như tất cả chúng đều thực thi tiếp UPDATE sau đó?

Để giải quyết vấn đề này có nhiều cách. Một trong số đó là khóa bản ghi đang SELECT lại bằng truy vấn SELECT FOR UPDATE, nếu truy vấn sau gặp SELECT trên user A, nó sẽ phải xếp vào hàng đợi cho đến khi truy vấn đầu tiên hoàn thành. Kỹ thuật này gọi là Record Locking, ngoài ra chúng ta còn có thêm một cách khác nữa là Optimistic Locking. Bài viết ngày hôm nay, tôi sẽ nói về hai phương pháp khóa dữ liệu này để xem chúng hoạt động như thế nào, có ưu nhược điểm gì cũng như sử dụng trong trường hợp nào.

  Dùng Python viết hàm xử lý dữ liệu dưới tầng database cho PostgreSQL

  Cài đặt PostgreSQL server sử dụng Docker

Record locking (khóa bi quan)

Record Locking là một kỹ thuật quản lý đồng thời trong cơ sở dữ liệu, trong đó các bản ghi (record) được khóa để đảm bảo tính nhất quán và ngăn chặn các transaction truy cập vào cùng một bản ghi cùng lúc.

Khi một transaction muốn cập nhật hoặc đọc dữ liệu từ một bản ghi, nó sẽ yêu cầu cơ sở dữ liệu khóa bản ghi đó để ngăn chặn các transaction khác truy cập vào. Sau khi transaction thực hiện xong, nó sẽ mở khóa để các transaction khác có thể tiếp tục truy cập.

Ví dụ như trong PostgreSQL, SELECT FOR UPDATE là một cách để khóa những bản ghi mà nó đang truy vấn đến. Bằng cách thay thế:

SELECT balance FROM accounts WHERE user = 'A';

Thành:

SELECT balance FROM accounts WHERE user = 'A' FOR UPDATE;

Ngay lập tức transaction đầu tiên sẽ khóa bản ghi tại user = ‘A’ lại và các transaction sau không thể tiếp tục đọc mà phải đợi một lệnh COMMIT hoặc ROLLBACK được thực hiện thành công thì mới có thể tiếp tục.

Kỹ thuật Record Locking đảm bảo tính nhất quán dữ liệu, tuy nhiên nó có thể dẫn đến tình trạng deadlock. Do đó, việc sử dụng Record Locking cần được cân nhắc kỹ lưỡng để đảm bảo hiệu suất và tính nhất quán dữ liệu cho hệ thống cơ sở dữ liệu. Để hiểu rõ hơn về các loại khóa và deadlock, tôi khuyên bạn nên đọc thêm bài viết Tìm hiểu về các loại Khoá (Explicit Locking) trong PostgreSQL.

Tham khảo việc làm Oracle hấp dẫn trên TopDev

Optimistic Locking (khóa lạc quan)

Optimistic Locking là một phương pháp mà trong đó các transaction sẽ không khóa bất kỳ bản ghi nào mà cho phép nó thực hiện như bình thường. Giống với tên gọi lạc quan, tư tưởng của Optimistic Locking là giả định rằng các transaction đang truy cập vào cùng một bản ghi sẽ không cập nhật dữ liệu cùng lúc, và chỉ một trong số các transaction đó sẽ hoàn thành việc cập nhật dữ liệu.

Khi một transaction muốn cập nhật dữ liệu, nó sẽ không khóa bản ghi để ngăn chặn các transaction khác truy cập vào. Thay vào đó, nó sẽ kiểm tra trạng thái của bản ghi trước khi cập nhật. Nếu trạng thái của bản ghi không bị thay đổi bởi các transaction khác, nó sẽ thực hiện cập nhật bản ghi đó. Ngược lại, nếu phát hiện trạng thái của bản ghi đã bị thay đổi, nó sẽ phải hủy bỏ việc cập nhật.

Để triển khai Optimistic Locking, chúng ta cần thêm một trường để đánh dấu cập nhật, nó có thể là versionupdated_at… hay bất kỳ trường dữ liệu nào để mỗi khi cập nhật bản ghi thành công thì cũng sẽ cập nhật cả nó.

Ví dụ trong bảng accounts có thêm trường updated_at là thời gian bản ghi được cập nhật thành công. Chúng ta không cần SELECT FOR UPDATE nữa mà thay vào đó sẽ SELECT ra thêm updated_at.

SELECT balance, updated_at FROM accounts WHERE user = 'A';

Sau đó thực hiện cập nhật “có điều kiện” của updated_at:

UPDATE accounts SET balance = balance - x, updated_at = now() WHERE user = 'A' AND updated_at = updated_at;

Với updated_at là kết quả của truy vấn SELECT trong transaction.

Để giải thích nguyên lý rất đơn giản, vì UPDATE sẽ khóa bản ghi lại trong khi cập nhật dữ liệu cho nên cùng một lúc chỉ có một transaction được phép cập nhật. Các transaction sau đó khi cố gắng cập nhật dữ liệu ở updated_at cũ thì sẽ hoàn toàn không thấy bản ghi nào trùng khớp. Lúc đó chúng ta có thể xử lý tiếp trường hợp này như là một giao dịch thất bại.

Optimistic Locking đơn giản và hiệu quả trong các tình huống mà các transaction cập nhật dữ liệu không xảy ra quá thường xuyên. Tuy nhiên, nó không đảm bảo tính nhất quán dữ liệu hoặc nguy cơ gây ra lỗi nhiều hơn do nó thường được xử lý ở tầng ứng dụng bằng mã lập trình.

Áp dụng trong trường hợp nào?

Vẫn là câu cửa miệng, trước tiên phải nói việc lựa chọn sử dụng Record Locking hay Optimistic Locking phụ thuộc vào từng bài toán cụ thể, vì mỗi phương pháp đều có ưu nhược điểm và ngữ cảnh riêng. Tuy nhiên, bạn có thể dựa vào một số gợi ý dưới đây để tăng khả năng quyết định cho mình.

Sử dụng Record Locking trong trường hợp:

  • Tính nhất quán dữ liệu là ưu tiên hàng đầu.
  • Các transaction cập nhật dữ liệu thường xuyên hoặc có nhiều transaction cập nhật cùng một bản ghi cùng lúc.

Sử dụng Optimistic Locking trong trường hợp:

  • Tính nhất quán dữ liệu không phải là yêu cầu cần thiết và ứng dụng cần tăng hiệu suất và tốc độ thực thi các transaction.
  • Các transaction không cập nhật dữ liệu thường xuyên hoặc không có nhiều transaction cập nhật cùng một bản ghi cùng lúc.

Ngoài ra, trong một số trường hợp, có thể kết hợp cả hai kỹ thuật để đạt được một giải pháp tối ưu. Ví dụ: sử dụng Optimistic Locking cho các transaction đọc dữ liệu, và sử dụng Record Locking cho các transaction cập nhật dữ liệu. Điều này giúp tối ưu hóa hiệu suất và tính nhất quán dữ liệu cho hệ thống cơ sở dữ liệu.

Tổng kết

Trong hệ thống cơ sở dữ liệu, có hai phương pháp khóa dữ liệu phổ biến là Optimistic Locking và Record Locking. Trong khi Optimistic Locking giả định rằng các transaction đang truy cập vào cùng một bản ghi sẽ không cập nhật dữ liệu cùng lúc, thì Record Locking lại “nhanh trí” khóa các bản ghi lại để đảm bảo transaction đầu tiên mới có quyền truy cập và ngăn chặn các transaction khác truy cập vào. Mỗi phương pháp đều có những ưu nhược điểm riêng nên cần được áp dụng sao cho phù hợp trong từng bài toán cụ thể.

Bài viết gốc được đăng tải tại 2coffee.dev

Xem thêm:

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

Techcombank Careers x Topdev: Cái bắt tay lan tỏa giá trị đến cộng đồng Công nghệ & Dữ liệu tại Việt Nam

Hành trình số hóa ngân hàng đang tạo nên những chuyển biến tích cực cho thị trường Việt Nam, tác động trực tiếp đến hành vi người tiêu dùng và mở ra những cơ hội nghề nghiệp mới cho nhân sự Công nghệ và Dữ liệu. Ngày 9/5/2023 vừa qua, các kênh truyền thông của TopDev – Nền tảng tuyển dụng IT và đơn vị tuyển dụng của Techcombank – Techcombank Career đã chính thức công bố cái “bắt tay” hợp tác nhằm lan tỏa giá trị đến cộng đồng công nghệ qua dự án với chủ đề InsideGEM Technology.

Câu chuyện phía sau và mong muốn lan tỏa giá trị đến cộng đồng Công nghệ & Dữ liệu

Dự án Techcombank Careers X TopDev – InsideGEM Technology được lấy cảm hứng từ “Gemology” – Khám phá những giá trị đặc biệt làm nên những viên ngọc. Techcombank Careers và TopDev mong muốn thông qua việc chia sẻ những kiến thức, kinh nghiệm thực tiễn trên hành trình số hóa ngân hàng sẽ góp phần vào việc nâng cao năng lực của nhân sự Công nghệ và Dữ liệu tại Việt Nam. Đồng thời, thông quan dự án này, Techcombank Careers cũng hy vọng giới thiệu đến cộng đồng Công nghệ và Dữ liệu những góc nhìn mới cũng như tiềm năng phát triển cùng ngành ngân hàng, một trong những bệ phóng mạnh mẽ cho sự nghiệp của bạn trong tương lai.

Tự hào là Techcombank – Ngân hàng dẫn dắt hành trình số hóa, TopDev – Một trong những chuyên trang tuyển dụng IT hàng đầu tại Việt Nam, chúng tôi hy vọng thông qua sự kết hợp này có thể tạo nên những giá trị hữu ích dành cho cộng đồng Công nghệ và Dữ liệu, đặc biệt giúp nhân sự Việt Nam có thể bắt kịp xu hướng của các tổ chức công nghệ thế giới. Song song việc áp dụng công nghệ mới nhất, hiện tại sẽ là thời điểm thuận lợi để phát triển và hoàn thiện những kỹ năng, vị trí đặc biệt (như Scrum Master, Engineering Manager, Agile Coach,…) để nâng tầm nhân lực Việt Nam.

Ngày 9/5/2023 vừa qua, các kênh truyền thông của TopDev – Nền tảng tuyển dụng IT và đơn vị tuyển dụng của Techcombank – Techcombank Career đã chính thức bắt tay hợp tác. Dự án lần này hứa hẹn sẽ mang đến những giá trị thiết thực cho cộng đồng Công nghệ & Dữ liệu và góc nhìn đa chiều về hành trình số hóa ngân hàng.

  • Khám phá những bài toán kỹ thuật, kinh nghiệm thực tiễn được Techcombank áp dụng, lần đầu đầu được chia sẻ từ chính các Chuyên gia hàng đầu trong và ngoài nước.
  • Lắng nghe những câu chuyện thực chiến và cập nhật xu hướng công nghệ mới nhất trên thế giới.
  • Hơn 100 vị trí tuyển dụng về Công nghệ & Dữ liệu tại Techcombank, ngân hàng dẫn đầu hành trình số hóa tại Việt Nam.

Chuyên Trang Dự Án Techcombank Careers x TopDev – InsideGEM Technology

Thực hiện mong muốn lan tỏa nhiều hơn các giá trị như trên đến với cộng đồng Công nghệ & Dữ liệu tại Việt Nam, Techcombank Career và TopDev mang đến chuyên trang dự án với loạt nội dung hấp dẫn:

  • Bí quyết mấu chốt cho Chuyển đổi số thành công, Tầm quan trọng của việc thấu hiểu cảm xúc người dùng, cách thức ứng dụng DevSecOps hiệu quả,… Cùng nhiều nội dung hấp dẫn khác đang chờ bạn tại loạt bài TechBlog trên chuyên trang Techcombank.
  • 100+ vị trí Công nghệ & Dữ liệu đang tuyển với loạt OFFER hấp dẫn từ Techcombank: 100% lương tháng thử việc, lương thưởng hấp dẫn, gia nhập đội ngũ Ngân hàng dẫn đầu hành trình số hóa đang chờ bạn nắm bắt.
  • Cơ hội khám phá môi trường làm việc, văn hóa doanh nghiệp, các hoạt động phát triển kỹ năng, trau dồi kinh nghiệm, những câu chuyện nghề, … Tất cả được gói gọn lại trong Chuyên trang dự án Techcombank Careers x TopDev.

Techcombank và loạt câu chuyện chủ đề hấp dẫn sẽ đưa bạn đến với chuyến hành trình xây dựng những thay đổi cho cuộc sống tương lai nhờ quá trình Số hóa Ngân Hàng! 

Cùng khám phá những nội dung hữu ích tại Chuyên trang Techcombank: https://topdev.vn/group/techcombank

Đừng bỏ lỡ và nhanh chóng truy cập đường dẫn bên dưới để KHÁM PHÁ NGAY.

Chuyên trang Techcombank: https://topdev.vn/group/techcombank

Thuộc dự án InsideGEM Technology do TopDev hợp tác cùng Techcombank triển khai, chuỗi nội dung thuần “Tech” độc quyền được chia sẻ bởi đội ngũ chuyên gia Công nghệ & Dữ liệu tại Techcombank sẽ được cập nhật liên tục tại chuyên mục Tech Blog | Techcombank Careers x TopDev. Cùng theo dõi & gặp gỡ các chuyên gia bạn nhé!

 

Nguyên lý SOLID trong Node.js với TypeScript

Nguyên lý SOLID trong Node.js với TypeScript

Bài viết được sự cho phép của tác giả Sơn Dương

Với những bạn lập trình Java thì có lẽ biết rất rõ nguyên lý SOLID. Với Java thì SOLID gần như là quy tắc bất di bất dịch mà mọi lập trình viên phải nắm vững. Mình cũng đã có một bài viết về clean code với nguyên lý SOLID.  Các bạn có thể đọc lại nhé.

Tuy nhiên, với Node.js hay Javascript nói chúng thì lại rất dễ dãi. Bạn viết code kiểu gì cũng được, bạ đâu viết đấy cũng được và tùy thuộc style code của mỗi người. Chính vì điều này mà Node.js/Javascript cực dễ học.

Nhưng vì viết code thoải mái, không có quy tắc sẽ dẫn đến dự án khó maintain, code sẽ rất rối, khó debug… Chính vì vậy, nếu có thể áp dụng được nguyên tắc SOLID cho dự án Node.js thì thật tuyệt.

Bài viết này mình sẽ chia sẻ cách thực hiện nguyên lý SOLID trong Node.Js với sự hỗ trợ của TypeScript.

1. SOLID là gì? Nguyên lý SOLID trong Node.js

Trước khi chúng ta bắt tay vào code thì phải hiểu SOLID là gì đã. Cần phải nắm vững lý thuyết trước khi thực hành là quan điểm của mình.

Về cơ bản thì các nguyên lý thiết kế phần mềm hay kiến trúc phần mềm sinh ra là để ứng dụng dễ maintain, dễ mở rộng về sau. Muốn đạt được điều đó thì người ta thực hiện nguyên tắc “Chia để trị“.

Tức là người ta chia ứng dụng thành các khía cạnh khác nhau, càng độc lập với nhau càng tốt.

Mình lấy ví dụ: Ứng dụng “quản lý siêu thị” chẳng hạn. Logic của nghiệp vụ quản lý siêu thị: quản lý thu nhân như nào, quản lý hàng nhập kho ra sao… được coi là một khía cạnh. Giao diện của ứng dụng là một khía cạnh.

Việc lập trình giao diện và logic ứng dụng nên độc lập với nhau. Để sau này khi đổi giao diện không cần phải đổi cả business logic của ứng dụng.

Và nguyên lý SOLID cũng kiểu như vậy.

  7 lý do bạn không nên sử dụng TypeScript

  ReactJS và React Native: Những điểm giống và khác nhau cơ bản

Thực hiện nguyên lý SOLID trong Node.JS

SOLID là tên viết tắt của 5 nguyên tắc sau:

Nguyen ly SOLID trong nodejsNguyên lý SOLID trong Nodejs

Về định nghĩa cụ thể từng nguyên tắc của SOLID đã được mình trình bày ở bài viết trước. Bài này mình chỉ tập trung vào cách thực hiện nguyên lý SOLID trong Node.js như thế nào mà thôi.

Chờ chút: Trong Node.js thì việc xây dựng kiến trúc tốt sẽ giúp bạn hạn chế rất nhiều những lỗi kinh điển. Trong đó có lỗi Callback Hell. Mời bạn đọc thêm về cách xử lý khi mã nguồn dự án bị Callback Hell tại đây >> Callback hell là gì? Cách xử lý triệt để Callback hell.

 #Single responsibility principle

Được hiểu như sau:

Một class chịu trách một việc mà thôi

Ví dụ sau mình tạo một class Person bằng TypeScript. Trong đó mình định nghĩa các thuộc tính của một người như Tên, đệm, thông tin liên hệ( email), và các hành động chào hỏi – greet(), xác thực email – validateEmail().

class Person {
    public name : string;
    public surname : string;
    public email : string;
    constructor(name : string, surname : string, email : string){
        this.surname = surname;
        this.name = name;
        if(this.validateEmail(email)) {
          this.email = email;
        }
        else {
            throw new Error("Invalid email!");
        }
    }
    validateEmail(email : string) {
        var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
        return re.test(email);
    }
    greet() {
        alert("Hi!");
    }
}

Nhìn qua class trên bạn thấy ngay rằng có chi tiết thừa. Đó chính là hàm validateEmail(), vì hành động này không phải là hành vi của một người. Không nên đặt hàm này trong class Person.

Chúng ta có cải tiến đoạn code như sau:

class Email {
    public email : string;
    constructor(email : string){
        if(this.validateEmail(email)) {
          this.email = email;
        }
        else {
            throw new Error("Invalid email!");
        }
    }
    validateEmail(email : string) {
        var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
        return re.test(email);
    }
}

class Person {
    public name : string;
    public surname : string;
    public email : Email;
    constructor(name : string, surname : string, email : Email){
        this.email = email;
        this.name = name;
        this.surname = surname;
    }
    greet() {
        alert("Hi!");
    }
}

#Open/close principle

Có thể hiểu nguyên tắc này như sau:

Chỉ nên mở rộng một class bằng cách kế thừa. Tuyệt đối không mở rộng
class bằng cách sửa đổi nó.

Điểm mấu chốt của nguyên tắc này là: Chỉ được THÊM mà không được SỬA.

Đoạn code dưới đây là một ví dụ cho vi phạm nguyên tắc này:

class Rectangle {
    public width: number;
    public height: number;
}

class Circle {
    public radius: number;
}

function getArea(shapes: (Rectangle|Circle)[]) {
    return shapes.reduce(
        (previous, current) => {
            if (current instanceof Rectangle) {
               return current.width * current.height;
            } else if (current instanceof Circle) {
               return current.radius * current.radius * Math.PI;
            } else {
               throw new Error("Unknown shape!")
            }
        },
        0
    );
}

Đoạn code cho phép chúng ta tính diện tích của hình chữ nhật và hình tròn. Nếu giờ mình muốn mở rộng chương trình, muốn hỗ trợ thêm hình tam giác nữa. Vậy phải làm sao?

Mình sẽ phải SỬA code của hàm getArea(). Mà làm như vậy là vi phạm nguyên tắc rồi.

Để cải thiện, chúng ta sửa lại thành như sau:

interface Shape {
    area(): number;
}

class Rectangle implements Shape {

    public width: number;
    public height: number;

    public area() {
        return this.width * this.height;
    }
}

class Circle implements Shape {

    public radius: number;

    public area() {
        return this.radius * this.radius * Math.PI;
    }
}

function getArea(shapes: Shape[]) {
    return shapes.reduce(
        (previous, current) => previous + current.area(),
        0
    );
}

Với code mới này, để hỗ trợ thêm một hình dạng mới, bạn chỉ cần tạo THÊM một class và implement interface Shape là được, không cần phải sửa code đã có.

#Liskov substitution principle

Trong một chương trình, các object của class con có thể thay thế class cha 
mà không làm thay đổi tính đúng đắn của chương trình

Với nguyên tắc này khuyến khích chúng ta sử dụng tính đa hình trong lập trình hướng đối tượng.

Quay lại đoạn code của ví dụ trước:

function getArea(shapes: Shape[]) {
    return shapes.reduce(
        (previous, current) => previous + current.area(),
        0
    );
}

Chúng ta đã sử dụng interface Shape để đảm bảo chương trình có thể mở rộng mà không cần phải sửa code đã có.

Nguyên tắc thay thế Liskov cho chúng ta biết rằng chúng ta có thể chuyển bất cứ kiểu con nào của Shape( Ví dụ: Rectangle, Cyrcle…) sang hàm getArea() mà không làm thay đổi tính chính xác của chương trình.

Trong các ngôn ngữ kiểu như TypeScript/Java, thì trình biên dịch sẽ kiểm tra đã implement chính xác interface đó chưa( Nếu implement mà không override đủ method là bị lỗi biên dịch ngay). Nên bạn không phải làm thủ công để đảm bảo chương trình tuân thủ nguyên tắc Liskov.

# Interface segregation principle

Nên tách Interface thành nhiều interface nhỏ với những mục đích riêng biệt

Vẫn lấy đoạn code tính diện tích hình chữ nhật và hình tròn. Bây giờ có một vấn đề là: Nếu bạn sử dụng đoạn code cho nhiều mục đích khác nhau thì sao?

Nếu mình muốn tính diện tích xong rồi thì mã hóa thành JSON và trả về cho client. Nếu mình code như sau thì sẽ vi phạm nguyên tắc thứ 4 này.

interface Shape {
    area(): number;
    serialize(): string;
}

class Rectangle implements Shape {

    public width: number;
    public height: number;

    public area() {
        return this.width * this.height;
    }

    public serialize() {
        return JSON.stringify(this);
    }
}

class Circle implements Shape {

    public radius: number;

    public area() {
        return this.radius * this.radius * Math.PI;
    }

    public serialize() {
        return JSON.stringify(this);
    }

}

Vi phạm bởi vì: Có lúc mình dùng không cần phải mã hóa thành JSON để trả cho client, có lúc mình lại cần JSON. Đoạn code đã mix cả hai mục đích ấy vào cùng một interface.

Để tốt hơn thì nên tác interface ra.

interface RectangleInterface {
    width: number;
    height: number;
}

interface CircleInterface {
    radius: number;
}

interface Shape {
    area(): number;
}

interface Serializable {
    serialize(): string;
}

Khi không cần mã hóa JSON.

class Rectangle implements RectangleInterface, Shape {

    public width: number;
    public height: number;

    public area() {
        return this.width * this.height;
    }
}

class Circle implements CircleInterface, Shape {

    public radius: number;

    public area() {
        return this.radius * this.radius * Math.PI;
    }
}

function getArea(shapes: Shape[]) {
    return shapes.reduce(
        (previous, current) => previous + current.area(),
        0
    );
}

Và khi cần mã hóa thành JSON.

class RectangleDTO implements RectangleInterface, Serializable {

    public width: number;
    public height: number;

    public serialize() {
        return JSON.stringify(this);
    }
}

class CircleDTO implements CircleInterface, Serializable {

    public radius: number;

    public serialize() {
        return JSON.stringify(this);
    }
}

Các bạn thấy code “ngon” hơn chưa?

#Dependency inversion principle

Đây là nguyên tắc quan trọng nhất trong nguyên lý SOLID. Nhưng vì nó là chữ  D trong cụm từ SOLID nên luôn được giải thích sau cùng.

Nếu chúng ta xem lại các ví dụ ở các nguyên tắc trên, chúng ta thấy rằng interface là một yếu tố cơ bản nhất của mọi nguyên tắc. Và nguyên tắc dependency inversion chính là tổng hợp của 4 nguyên tắc trước.

Việc thực hiện nguyên lý SOLID trong các ngôn ngữ lập trình không hỗ trợ Interface như Javascript ES5, thậm chí ES6 thật là khiêm cưỡng. Nhưng với hỗ trợ của TypeScript thì lại thật tuyệt.

Mình định trình bày tiếp phần kiến trúc Onion (kiến trúc củ hành) kết hợp với nguyên lý SOLID trong Node.js để có được một mã nguồn clean “vô đối”. Nhưng do bài dài quá nên thôi, các bạn đợi bài viết sau nhé!

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

Xem thêm:

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

Top câu hỏi phỏng vấn vị trí Business Analyst mới nhất

Top câu hỏi phỏng vấn Business Analyst mới nhất

Business Analyst (BA) hay Chuyên viên phân tích nghiệp vụ là người có vai trò cầu nối giúp kết nối khách hàng với doanh nghiệp, team phát triển để tạo ra những sản phẩm đáp ứng được đúng nhu cầu, mong muốn của khách hàng. Với vai trò quan trọng này thì trong bất cứ tổ chức nào, vị trí BA luôn được đảm bảo với mức đãi ngộ hấp dẫn, cùng với đó các công ty cũng đòi hỏi yêu cầu cao với các ứng viên ứng tuyển vị trí này. Bài viết hôm nay chúng ta cùng nhau tìm hiểu về những câu hỏi phỏng vấn Business Analyst thường gặp nhé.

Vai trò và trách nhiệm cơ bản của một BA

Business Analyst

Vai trò cũng như công việc chính trong việc xác định và quản lý yêu cầu nghiệp vụ của một BA gồm:

  • Rút trích yêu cầu
  • Dự đoán và xác định yêu cầu
  • Giới hạn và đảm bảo tính tập trung của yêu cầu
  • Tổ chức yêu cầu của giải pháp
  • Chuyển đổi yêu cầu
  • Bảo đảm tính đúng đắn của yêu cầu nghiệp vụ
  • Đơn giản hóa yêu cầu sản phẩm
  • Kiểm tra và xác thực yêu cầu sản phẩm
  • Quản lý yêu cầu nghiệp vụ
  • Vận hành, theo dõi và đề xuất cải tiến

Phân biệt yêu cầu chức năng và yêu cầu phi chức năng

Yêu cầu chức năng (Functional Requirements) là sự mô tả của chức năng hoặc dịch vụ của phần mềm hay hệ thống, phổ biến như xác thực, phân quyền, các chức năng hành chính, giao diện, báo cáo,… Yêu cầu phi chức năng (Non-Functional) chỉ ra những quy định về tính chất và ràng buộc cho phần mềm hay hệ thống. Một vài yêu cầu phi chức năng phổ biến như về hiệu suất hệ thống (thời gian phản hồi, khả năng chịu tải,…), độ tin cậy, độ bảo mật,….

Trong thực tế, yêu cầu phi chức năng sẽ được đánh giá có phần quan trọng hơn, nhất là trong những hệ thống lớn, nếu không thỏa mãn được những yêu cầu liên quan đến đặc tính chất lượng này thì phần mềm hoặc hệ thống sẽ không thể đưa vào sử dụng.

  Công Việc Của Business Analyst Và Tất Tần Tật Các Thông Tin Cần Biết Về Nghề BA

  Business Analyst Cần Học Gì Để Trở Thành Chuyên Gia Trong Ngành?

Sự giống và khác nhau giữa User Story (US) và Use Case (UC)

User Story (US) là một mô tả yêu cầu từ người dùng với ngôn ngữ dễ đọc hiểu gần gũi với người dùng và thường được viết trên Card, giấy note hay các công cụ tài liệu như Words, Excels,… Use Case (UC) là những mô tả cách tương tác giữa người dùng và phần mềm về tất cả những trường hợp mà người sử dụng phần mềm sẽ gặp phải. 

User Story (US) và Use Case (UC)
Nguồn ảnh: https://www.justinmind.com/blog/user-stories-vs-use-cases/

Cả US và UC đều sử dụng ngôn ngữ tự nhiên mà người dùng có thể dễ dàng hiểu, mục đích để xác định người dùng hệ thống và mô tả mục tiêu của họ. Điểm khác nhau giữa 2 khái niệm này là trong khi một UC cụ thể hơn và xem xét trực tiếp cách thức hoạt động của hệ thống thì US là một kỹ thuật phát triển Agile tập trung vào kết quả của các hoạt động và lợi ích của quá trình được mô tả.

Xem thêm các việc làm Business Analyst lương cao trên TopDev

Acceptance Criteria (AC) là gì? Mục đích viết AC là gì?

Acceptance Criteria là những điều kiện mà phần mềm cần để đáp ứng nhu cầu của người dùng, thông thường AC sẽ được viết, mô tả trong mỗi User Story (một mô tả nhu cầu/ yêu cầu của người dùng). AC được viết ra với mục đích:

  • Xác định rõ ràng với các thành viên trong team cần thực hiện những phần nào trước, hay trong Sprint này sẽ cần làm những gì?
  • Đảm bảo tất cả mọi người trong team có chung một cái hiểu đúng về vấn đề.
  • Là điều kiện mà Tester dựa vào đó để có thể kiểm thử, kiểm tra User Story. 

So sánh Sketch, Wireframe, Mockup và Prototype

Sketch, Wireframe, Mockup và Prototype là các bước trong quá trình thiết kế giao diện giúp BA lấy yêu cầu, phác thảo nên ý tưởng, xây dựng bản demo để xác nhận với người dùng và chuyển giao cho bên team phát triển.

Sketch, Wireframe, Mockup và Prototype
Nguồn ảnh: https://www.alphalogicinc.com/blog/sketch-vs-wireframe-vs-mockup-vs-prototype/

  • Sketch – phác thảo: bản vẽ tự do, độ xác thực thấp với mục đích chủ yếu là lấy ý tưởng giúp mọi người dễ hình dung trong quá trình trao đổi. 
  • Wireframe: bản vẽ xây dựng bộ khung cơ bản của website hay ứng dụng. Trên Wireframe thể hiện được các chức năng chính, các chế độ xem và mối quan hệ giữa các tính năng. Điểm phân biệt Wireframe với các bước tiếp theo là thông thường Wireframe sẽ không bao gồm các yếu tố về màu sắc, đồ họa hay kiểu dáng.
  • Mockup: sau khi có Wireframe hoàn chỉnh thì sẽ đến bước vẽ mockup. Nếu trong team phát triển có designer chuyên UI/UX thì thông thường bước này được thực hiện bởi bộ phận này. Màu sắc, kiểu dáng, đồ họa, icon, logo,… được thêm vào giúp khách hàng và team DEV dễ dàng hình dung ra sản phẩm một cách chân thực.
  • Prototype: Nếu như Mockup chỉ là những hình ảnh, thành phần tĩnh thì Prototype được xem là bước gần sát nhất với sản phẩm khi mà người dùng có thể tương tác động với Prototype. Prototype giúp người dùng trải nghiệm UX sản phẩm một cách chân thực nhất.

Nêu một số công cụ (Tools) mà BA thường sử dụng trong công việc

  • Jira và Confluence: quản lý công việc, tài liệu dự án
  • Trello: quản lý công việc
  • Rational RequisitePro: hỗ trợ thu thập yêu cầu
  • Balsamiq: thiết kế wireframe
  • Pencil: Tạo prototype, mockups
  • Microsoft Visio: quản lý dự án
  • Google Docs: quản lý, chia sẻ tài liệu

Định hướng phát triển chuyên môn của một BA

Ở câu hỏi này, nhà tuyển dụng có thể muốn hỏi về định hướng của bản thân bạn, dưới đây là 3 chuyên môn chính mà một BA có thể định hướng để phát triển chuyên sâu:

  • Management Analyst (chuyên gia tư vấn quản lý): là người đề xuất các cách cải thiện hiệu quả của công ty hoặc tổ chức; tư vấn cho các nhà quản lý giúp vận hành công ty một cách tốt hơn.
  •  Systems Analyst (chuyên viên phân tích hệ thống): là người phân tích và thiết kế kỹ thuật để giải quyết vấn đề kinh doanh sử dụng technical; sau đó là bước đào tạo và chuyển giao cho người khác sử dụng hệ thống.
  • Data Analyst (chuyên viên dữ liệu): là người thu thập thông tin và kết quả, sau đó trình bày dưới dạng biểu đồ, bảng biểu, báo cáo,… để xác định xu hướng và mô hình dự đoán những gì có thể xảy ra.

Kết bài

Trên đây là danh sách những câu hỏi phỏng vấn dành cho vị trí Business Analyst – BA mà nhà tuyển dụng sẽ thường xuyên sử dụng. Để trở thành chuyên viên phân tích nghiệp vụ, bạn cần có những kiến thức chuyên môn về cả IT cũng như business, chính vì thế đây cũng là vị trí mà nhiều người lựa chọn cho con đường phát triển của mình. Hy vọng bài viết này hữu ích dành cho bạn, hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

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

Xem thêm các công việc IT hấp dẫn trên TopDev