Home Blog Page 63

SQL Server là gì? SQL Server giúp bạn làm việc dễ dàng hơn?

Bạn muốn tìm hiểu SQL Server là gì? Vì sao SQL Server lại giúp Developer làm việc dễ dàng hơn? Những phiên bản của SQL Server có cải tiến như thế nào và phù hợp với mục đích gì? Theo dõi bài viết bên dưới nhé.

SQL Server là gì?

SQL Server là gì? SQL Server hay Microsoft SQL Server là một hệ thống quản trị cơ sở dữ liệu quan hệ (Relational Database Management System – RDBMS) được phát triển bởi Microsoft vào năm 1988. Nó được sử dụng để tạo, duy trì, quản lý và triển khai hệ thống RDBMS. 

Được thiết kế để quản lý và lưu trữ dữ liệu, SQL Server cho phép người dùng truy vấn, thao tác và quản lý dữ liệu một cách hiệu quả và an toàn. SQL Server là một trong những hệ quản trị cơ sở dữ liệu phổ biến nhất trên thế giới và được sử dụng rộng rãi trong các doanh nghiệp.

Phần mềm SQL Server được sử dụng khá rộng rãi vì nó được tối ưu để có thể chạy trên môi trường cơ sở dữ liệu rất lớn lên đến Tera – Byte cùng lúc phục vụ cho hàng ngàn user. Bên cạnh đó, ứng dụng này cung cấp đa dạng kiểu lập trình SQL từ ANSI SQL (SQL truyền thống) đến SQL và cả T-SQL (Transaction-SQL) được sử dụng cho cơ sở dữ liệu quan hệ nâng cao.

T-SQL là một ngôn ngữ mở rộng của SQL với các tính năng bổ sung như biến, điều kiện, vòng lặp và xử lý ngoại lệ, giúp người dùng viết các đoạn mã SQL mạnh mẽ và linh hoạt hơn.

Tham khảo việc làm SQL Server lương cao trên TopDev

Cấu trúc của SQL Server

Sơ đồ dưới đây minh họa cấu trúc của SQL Server:

SQL Server Architecture

SQL Server là một hệ quản trị cơ sở dữ liệu phức tạp với nhiều thành phần cấu thành giúp nó hoạt động hiệu quả và đáng tin cậy. Trong đó, SQL Server gồm ba thành phần quan là Database Engine, External Protocols SQLOS.

Database Engine

Database Engine là thành phần chính của MS SQL Server, chịu trách nhiệm quản lý và xử lý dữ liệu. Nó bao gồm các thành phần con quan trọng sau:

Storage Engine

  • File Storage: Quản lý các tệp dữ liệu và tệp nhật ký giao dịch. Dữ liệu được lưu trữ trong các tệp dữ liệu (.mdf và .ndf), trong khi các giao dịch được ghi lại trong tệp nhật ký giao dịch (.ldf).
  • Buffer Manager: Quản lý bộ nhớ đệm (buffer pool), lưu trữ các trang dữ liệu được truy cập gần đây để tăng tốc độ truy vấn.
  • Transaction Log: Ghi lại mọi thay đổi dữ liệu để đảm bảo tính toàn vẹn và khả năng phục hồi của cơ sở dữ liệu.

Query Processor

  • Parser: Phân tích cú pháp các câu lệnh SQL và chuyển chúng thành các cây cú pháp (syntax tree) để xử lý tiếp theo.
  • Optimizer: Tối ưu hóa các kế hoạch thực hiện truy vấn để đảm bảo hiệu suất cao nhất. Nó chọn lựa các kế hoạch truy vấn tối ưu dựa trên thống kê và chi phí ước tính.
  • Executor: Thực hiện các kế hoạch truy vấn đã được tối ưu hóa, xử lý các câu lệnh SQL và trả về kết quả.

Relational Engine

  • Metadata Manager: Quản lý thông tin về cấu trúc cơ sở dữ liệu như bảng, chỉ mục, ràng buộc và các đối tượng khác.
  • Transaction Manager: Quản lý các giao dịch, đảm bảo tính nhất quán, cách ly và độ bền của các giao dịch thông qua các nguyên tắc ACID.
  • Concurrency Control: Điều khiển đồng thời, sử dụng các kỹ thuật như khóa (locking) và phiên bản (versioning) để quản lý các truy cập đồng thời đến dữ liệu.

SQLOS (SQL Server Operating System)

SQLOS là lớp trừu tượng phần cứng và hệ điều hành của SQL Server, cung cấp các dịch vụ cơ bản cho Database Engine. SQLOS chịu trách nhiệm quản lý tài nguyên hệ thống như bộ nhớ, CPU và I/O. Dưới đây là các thành phần chính của SQLOS:

Memory Management

  • Memory Allocation: Quản lý phân bổ và giải phóng bộ nhớ cho các hoạt động của SQL Server.
  • Buffer Pool: Điều khiển bộ nhớ đệm, lưu trữ các trang dữ liệu được truy cập gần đây để giảm thiểu truy cập đĩa.

Scheduler

  • Task Management: Quản lý các tác vụ và luồng, đảm bảo rằng các tác vụ được thực hiện hiệu quả và không có tác vụ nào bị bỏ lỡ.
  • Worker Threads: Quản lý các luồng công việc (worker threads), thực hiện các yêu cầu truy vấn và các hoạt động khác của SQL Server.

I/O Management

  • I/O Requests: Quản lý các yêu cầu I/O, bao gồm đọc và ghi dữ liệu từ đĩa.
  • Async I/O: Hỗ trợ I/O không đồng bộ để cải thiện hiệu suất bằng cách cho phép các yêu cầu I/O được xử lý đồng thời.

Synchronization

  • Lock Manager: Quản lý các khóa để điều khiển truy cập đồng thời đến dữ liệu, đảm bảo tính nhất quán và tránh xung đột.
  • Latches and Spinlocks: Sử dụng các cơ chế khóa nhẹ hơn như latches và spinlocks để bảo vệ các cấu trúc dữ liệu nội bộ của SQL Server.

External Protocol

External Protocol bao gồm các giao thức và công nghệ cho phép SQL Server tương tác với các hệ thống và ứng dụng bên ngoài. Các giao thức chính bao gồm:

  • TDS (Tabular Data Stream): Giao thức chính được sử dụng để trao đổi dữ liệu giữa SQL Server và các ứng dụng khách như SQL Server Management Studio (SSMS), ứng dụng web và các ứng dụng tùy chỉnh. TDS xử lý việc truyền dữ liệu truy vấn, kết quả và các thông báo giữa máy chủ và khách.
  • ODBC (Open Database Connectivity) và OLE DB: Các giao thức tiêu chuẩn cho phép các ứng dụng kết nối và tương tác với SQL Server. ODBC và OLE DB cung cấp các API để thực hiện các truy vấn, cập nhật và thao tác dữ liệu khác.
  • JDBC (Java Database Connectivity): Giao thức tiêu chuẩn cho phép các ứng dụng Java kết nối và tương tác với SQL Server. JDBC cung cấp các API để thực hiện các truy vấn và thao tác dữ liệu từ các ứng dụng Java.
  • HTTP/HTTPS: SQL Server hỗ trợ các giao thức HTTP/HTTPS để cung cấp các dịch vụ web, chẳng hạn như SQL Server Reporting Services (SSRS) và SQL Server Integration Services (SSIS). Điều này cho phép SQL Server cung cấp các dịch vụ dữ liệu qua web và tích hợp với các ứng dụng web.

SQL Server dùng để làm gì?

SQL Server là một hệ quản trị cơ sở dữ liệu mạnh mẽ và linh hoạt do Microsoft phát triển, được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau. Các chức năng chính của SQL Server bao gồm tạo và duy trì cơ sở dữ liệu, phân tích dữ liệu và tạo báo cáo. Dưới đây là các ứng dụng cụ thể của SQL Server:

Tạo và duy trì cơ sở dữ liệu

SQL Server được sử dụng để tạo và duy trì các cơ sở dữ liệu quan hệ, cung cấp nền tảng vững chắc cho việc lưu trữ và quản lý dữ liệu. Các chức năng chính bao gồm:

  • Quản lý dữ liệu: SQL Server cho phép người dùng tạo, sửa đổi và xóa các bảng dữ liệu, chỉ mục, và các mối quan hệ giữa các bảng. Hệ thống quản lý dữ liệu của SQL Server hỗ trợ các thao tác CRUD (Create, Read, Update, Delete), giúp quản lý dữ liệu một cách hiệu quả.
  • Bảo mật dữ liệu: SQL Server cung cấp các tính năng bảo mật mạnh mẽ như mã hóa dữ liệu, kiểm soát truy cập dựa trên vai trò và xác thực người dùng. Các biện pháp bảo mật này đảm bảo rằng dữ liệu được bảo vệ khỏi các mối đe dọa và truy cập trái phép.
  • Quản lý giao dịch: SQL Server hỗ trợ các tính năng quản lý giao dịch như Atomicity, Consistency, Isolation và Durability (ACID), đảm bảo rằng các thay đổi trong cơ sở dữ liệu được thực hiện một cách nhất quán và an toàn. Điều này rất quan trọng đối với các ứng dụng yêu cầu độ tin cậy cao như tài chính, ngân hàng và thương mại điện tử.
  • Sao lưu và phục hồi: SQL Server cung cấp các tính năng sao lưu và phục hồi dữ liệu, cho phép người dùng tạo các bản sao lưu toàn bộ, gia tăng và khác biệt. Các tính năng này giúp bảo vệ dữ liệu khỏi mất mát do lỗi phần cứng, phần mềm hoặc lỗi con người và đảm bảo rằng dữ liệu có thể được phục hồi nhanh chóng trong trường hợp xảy ra sự cố.

Phân tích dữ liệu và tạo báo cáo

SQL Server không chỉ là công cụ quản lý dữ liệu mà còn cung cấp các tính năng phân tích dữ liệu mạnh mẽ và tạo báo cáo chi tiết, giúp các tổ chức ra quyết định dựa trên dữ liệu một cách hiệu quả. Các chức năng chính bao gồm:

  • Phân tích dữ liệu: SQL Server tích hợp sẵn các công cụ phân tích dữ liệu như SQL Server Analysis Services (SSAS), cho phép người dùng xây dựng các mô hình dữ liệu phức tạp và thực hiện các phân tích sâu. Các công cụ này hỗ trợ việc tạo ra các báo cáo phân tích, biểu đồ và bảng điều khiển (dashboards) giúp người dùng hiểu rõ hơn về dữ liệu và xu hướng.
  • Tạo báo cáo: SQL Server Reporting Services (SSRS) là một công cụ mạnh mẽ cho phép người dùng tạo, quản lý và triển khai các báo cáo. SSRS hỗ trợ nhiều định dạng báo cáo khác nhau như PDF, Excel và HTML, giúp người dùng dễ dàng chia sẻ và trình bày thông tin. Các báo cáo có thể được tùy chỉnh để đáp ứng nhu cầu cụ thể của doanh nghiệp, từ báo cáo tài chính đến báo cáo hiệu suất kinh doanh.
  • Khai thác dữ liệu: SQL Server hỗ trợ các tính năng khai thác dữ liệu (data mining) giúp phát hiện các mẫu và xu hướng ẩn trong dữ liệu lớn. Các công cụ khai thác dữ liệu này giúp doanh nghiệp đưa ra các dự đoán và quyết định dựa trên dữ liệu, cải thiện hiệu suất và tăng cường khả năng cạnh tranh.
  • Tích hợp dữ liệu: SQL Server Integration Services (SSIS) là một công cụ mạnh mẽ cho phép người dùng tích hợp dữ liệu từ nhiều nguồn khác nhau vào một cơ sở dữ liệu duy nhất. SSIS hỗ trợ các hoạt động ETL (Extract, Transform, Load), giúp làm sạch, chuyển đổi và tải dữ liệu từ các hệ thống khác nhau vào SQL Server. Điều này giúp đảm bảo rằng dữ liệu luôn được cập nhật và nhất quán.

Các ấn bản SQL Server

Các ấn bản SQL Server

SQL Server có bốn phiên bản chính với những dịch vụ khác nhau:

  • Developer: sử dụng cho việc phát triển và thử nghiệm cơ sở dữ liệu.
  • Expression: dành cho lượng cơ sở dữ liệu nhỏ, dung lượng lưu trữ trên đĩa không quá 10GB.
  • Enterprise: sử dụng cho những ứng dụng lớn hơn và quan trọng hơn, phiên bản này bao gồm tất cả các tính năng của SQL Server.
  • Standard: ở ấn bản này chứa một phần tính năng của ấn bản Enterprise và giới hạn về cấu hình số lượng lõi bộ xử lý và bộ nhớ trên máy chủ.

SQL Server giúp bạn làm việc dễ dàng hơn như thế nào?

Xét qua những ưu điểm cũng như thuận lợi của SQL Server và ta có thể hiểu nó giúp cho công việc của Developer dễ dàng hơn như thế nào.

  • Giao diện SQL Server rất dễ dàng để các Backend Developer tập trung nhiều vào việc chăm sóc dữ liệu hơn là việc nó hoạt động như thế nào.
  • Tích hợp với giao diện người dùng: SQL Server được tích hợp với ứng dụng giao diện người dùng, thường là các ứng dụng web để cung cấp cơ chế thay đổi dữ liệu động. 
  • Vì là sản phẩm của Microsoft nên việc tích hợp framework .Net sẽ dễ dàng hơn do chúng có cùng một tổ chức.
  • So với các phương tiện lưu trữ dữ liệu khác như Excel, văn bản,… cơ sở dữ liệu luôn được ưa chuộng hơn chủ yếu do khả năng lưu trữ lớn, tính bảo mật cao và sức mạnh xử lý dữ liệu.

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

Các phiên bản SQL Server

Các phiên bản SQL Server

SQL Server 2012

SQL Server 2012 cung cấp thêm những tính năng mới như chỉ mục cột lưu trữ, có thể được sử dụng để lưu trữ dữ liệu theo định dạng cột cho các ứng dụng. Mặt khác, phiên bản này có tính khả dụng cao và được trang bị công nghệ khắc phục sau thảm họa.

SQL Server 2014

SQL Server 2014 đã thêm OLTP trong bộ nhớ, từ đó cho phép người dùng chạy các ứng dụng xử lý giao dịch trực tuyến. Một tính năng mới khác trong SQL 2014 đó là phần mở rộng vùng đệm bằng cách tích hợp bộ nhớ đệm và ổ đĩa – đây là cách thiết kế để tăng thông lượng I/O thông qua việc giảm dữ liệu từ các đĩa cứng thông thường.

SQL Server 2016

Trong bối cảnh chiến lược công nghệ “mobile first, cloud first”, SQL Server 2016 được phát triển như một phần trong chiến lược này với những tính năng mới như: điều chỉnh hiệu suất, phân tích hoạt động thời gian thực, trực quan hóa dữ liệu và báo cáo trên thiết bị di động và sự hỗ trợ của hybrid cloud. SQL Server 2016 còn tăng cường hỗ trợ cho việc phân tích dữ liệu lớn và các ứng dụng phân tích nâng cao.

SQL Server 2017

SQL Server 2017 hỗ trợ chạy trên Linux, điều này làm SQL Server chuyển từ nền tảng cơ sở dữ liệu sang một hệ điều hành mã nguồn mở thường thấy trong các doanh nghiệp. Thêm vào đó, ở phiên bản này còn hỗ trợ ngôn ngữ lập trình Python, một ngôn ngữ mã nguồn mở được sử dụng rộng rãi trong các ứng dụng phân tích.

SQL Server 2019

Ở bản 2019, SQL Server cho phép người dùng kết hợp các vùng chứa SQL Server, HDFS và Spark với nhau bằng cách sử dụng tính năng Big Data Cluster mới. Thêm vào đó, một tính năng mới khác là khả năng phục hồi dữ liệu được tăng tốc nhanh hơn.

SQL Server 2022

Phiên bản cập nhật mới nhất phát hành vào 16 tháng 11 năm 2022. Ở phiên bản này có tích hợp Azure Synapse Link, giúp đồng bộ hóa dữ liệu giữa SQL Server và Azure Synapse Analytics.Ngoài ra, cải tiến tính năng Query Store, Intelligent Query Processing (IQP), và nhiều tính năng tối ưu hiệu suất khác.

Cách tải và cài đặt SQL Server

Dưới đây là hướng dẫn chi tiết về cách tải và cài đặt SQL Server, kèm theo hình ảnh minh họa để bạn dễ dàng thực hiện. Các bước dưới đây sử dụng phiên bản SQL Server 2022 Express, một phiên bản miễn phí phù hợp cho học tập và phát triển.

Bước 1: Tải SQL Server

  1. Truy cập trang tải SQL Server: Truy cập trang web chính thức của Microsoft để tải SQL Server Express: SQL Server Express
  2. Chọn phiên bản SQL Server Express: Tại trang tải xuống, bạn sẽ thấy các tùy chọn tải về. Chọn phiên bản SQL Server 2019 Express và nhấn nút Download now.

Cách tải và cài đặt SQL Server

Bước 2: Cài đặt SQL Server

  1. Khởi chạy file cài đặt: Sau khi tải về, chạy file cài đặt SQL2022-SSEI-Expr.exe.
  2. Chọn kiểu cài đặt: Trong cửa sổ cài đặt, chọn Basic để thực hiện cài đặt cơ bản.
  3. Chấp nhận điều khoản: Đọc và chấp nhận các điều khoản sử dụng của Microsoft. Nhấn Accept để tiếp tục.
  4. Chọn thư mục cài đặt: Chọn thư mục để cài đặt SQL Server hoặc giữ mặc định. Nhấn Install để bắt đầu quá trình cài đặt.
  5. Chờ quá trình cài đặt hoàn tất: Quá trình cài đặt có thể mất vài phút. Đợi cho đến khi cài đặt hoàn tất.
  6. Hoàn thành cài đặt: Khi cài đặt hoàn tất, bạn sẽ thấy màn hình xác nhận. Nhấn Close để hoàn thành quá trình cài đặt SQL Server.

Bước 3: Cài đặt SQL Server Management Studio (SSMS)

SQL Server Management Studio (SSMS) là công cụ quản lý và phát triển SQL Server. Dưới đây là các bước để cài đặt SSMS:

  1. Truy cập trang tải SSMS: Truy cập trang web chính thức của Microsoft để tải SQL Server Management Studio: Download SSMS
  2. Tải SSMS: Nhấn vào liên kết tải xuống để tải file cài đặt SSMS.
  3. Khởi chạy file cài đặt: Sau khi tải về, chạy file cài đặt SSMS-Setup-ENU.exe.
  4. Chọn thư mục cài đặt: Chọn thư mục để cài đặt SSMS hoặc giữ mặc định. Nhấn Install để bắt đầu quá trình cài đặt.
  5. Chờ quá trình cài đặt hoàn tất: Quá trình cài đặt có thể mất vài phút. Đợi cho đến khi cài đặt hoàn tất.
  6. Hoàn thành cài đặt: Khi cài đặt hoàn tất, bạn sẽ thấy màn hình xác nhận. Nhấn Close để hoàn thành quá trình cài đặt SSMS.

Bước 4: Kết nối với SQL Server bằng SSMS

  • Khởi chạy SSMS: Mở SQL Server Management Studio từ menu Start hoặc tìm kiếm SSMS.
  • Kết nối với SQL Server: Trong cửa sổ Connect to Server, nhập thông tin kết nối:
    • Server type: Chọn Database Engine.
    • Server name: Nhập tên máy chủ của bạn (ví dụ: localhost cho cài đặt cục bộ).
    • Authentication: Chọn Windows Authentication hoặc SQL Server Authentication tùy thuộc vào cài đặt của bạn.
    • Nhấn Connect để kết nối.

Tóm lại, nói một cách ngắn gọn và dễ hiểu thì SQL Server là công cụ được sử dụng để thực hiện cơ chế của một hệ quản trị cơ sở dữ liệu quan hệ. Nó cho phép các Developer làm việc với dữ liệu để cung cấp trải nghiệm tốt cho người dùng. Trong các tổ chức, nó là phương tiện xử lý dữ liệu được ưa dùng vì khả năng xử lý lượng lớn dữ liệu.

Có thể nói SQL Server mang đến những cơ hội phát triển tốt và dự kiến nó sẽ tiếp tục phát triển theo sự gia tăng cấp số nhân của thương mại điện tử và phương tiện truyền thông xã hội.

Đến đây thì chắc hẳn bạn đã hiểu SQL Server là gì cũng như những điểm mạnh mà nó mang lại. Nếu bạn quan tâm đến việc phát triển sự nghiệp về Backend Development thì công nghệ máy chủ SQL Server đáng để bạn tìm hiểu sâu hơn.

Xem thêm những bài viết liên quan dưới đây:

Bạn muốn tìm việc làm IT mọi cấp độ? Tham khảo ngay tại đây!

Những cuốn sách mà Developer nên đọc – Phần 2

Những quyển sách cho Developer - phần 2

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

Phần trước mình đã điểm qua 1 số mặt sách dành cho các bạn developer mới vào nghề nhằm khuyến khích niềm đam mê và kỹ năng code sạch từ sớm. Phần này mình sẽ điểm qua các cuốn sách mà các bạn senior và tech lead nên đọc để nâng cao kỹ năng thiết kế và quản lý các team ở quy mô nhỏ.

REFACTORING: IMPROVING THE DESIGN OF EXISTING CODE

Các bạn senior, technical lead nên đọc, để có thể review code của các bạn junior và đưa ra lời khuyên. Làm sao để biến những đoạn code không theo pattern để sử dụng các pattern thích hợp. Khi đó bạn sẽ thấy chất lượng và cấu trúc mã nguồn sẽ trở nên dễ đoán và dễ bảo trì hơn.

Review sách Refactoring to Patterns

refactoring to patterns book
Refactoring to Patterns: Kerievsky, Joshua

WORKING EFFECTIVELY WITH LEGACY CODE

Code đẹp ngay từ đầu là một chuyện tốt, tuy nhiên đa số các bạn sẽ được tham gia vào dự án đã và đang chạy. Codebase có thể lên tới hàng chục năm tuổi với hằng hà technical debt. Working Effectively with Legacy Code cung cấp nhiều hướng dẫn để các bạn có thể cải thiện chất lượng của mã nguồn “legacy”.

Working Effectively with Legacy Code
Working Effectively with Legacy Code: Feathers, Michael

97 THINGS EVERY PROGRAMMER SHOULD KNOW

Tập hợp các lời khuyên hữu ích cho tất cả các bạn lập trình viên.

97 Things Every Programmer Should Know
97 Things Every Programmer Should Know: Collective Wisdom

TALKING WITH TECH LEADS: FROM NOVICES TO PRACTITIONERS

Một cuốn sách không thể không đọc để có thể trở thành 1 tech lead thực thụ. Ngoài công việc coding, các bạn tech lead sẽ bắt đầu được giao nhiệm vụ quản lý một nhóm nhỏ hoặc đưa ra các giải pháp thiết kế, đề xuất về mặt kỹ thuật nhiều hơn.

Review sách Talking with Tech Leads

Talking with Tech Leads: From Novices to Practitioners
Talking with Tech Leads: From Novices to Practitioners

DOMAIN-DRIVEN DESIGN: TACKLING COMPLEXITY IN THE HEART OF SOFTWARE

Một cuốn sách để giúp hình thành các suy nghĩ về cách thiết kế các hệ thống phức tạp. Có rất nhiều phương pháp thiết kế “driven” ví dụ như Event Driven, Domain Driven, Data Driven, nhưng mình thích cách tiếp cận từ Domain (nghiệp vụ), phân tách nghiệp vụ thành các sub-module, sub-system sẽ giúp bạn có một cái nhìn tổng thể nhất về các thành phần trong hệ thống mà mình đang xây dựng

Tản mạn về Domain Driven Design

Domain-Driven Design: Tackling Complexity in the Heart of Software
Domain-Driven Design: Tackling Complexity in the Heart of Software

SYSTEM DESIGN INTERVIEW – AN INSIDER’S GUIDE

Một bước tạo đà nữa để giúp các bạn làm quen với các thuật ngữ và kỹ thuật thường dùng trong thiết kế hệ thống, đặc biệt là các hệ thống large-scale, distributed với rất nhiều ví dụ từ các hệ thống thực tế (được đơn giản hóa)

Series về System Design

System Design Interview – An insider’s guide, Second Edition
System Design Interview – An insider’s guide, Second Edition

Bonus 3: https://github.com/donnemartin/system-design-primer Tác giả của page này cũng đã đưa ra được 1 mô hình kiến trúc điển hình cho các hệ thống mà chúng ta sẽ build.

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

Xem thêm:

Đừng bỏ lỡ tin tuyển dụng IT mọi cấp độ trên TopDev

So sánh giữa C++ và Golang 

So sánh Golang và C++

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh

Tóm tắt về Go và C ++

Go là một ngôn ngữ có mục đích chung đơn giản, gọn nhẹ và đa năng. C ++ là một ngôn ngữ đa năng, nhanh nhưng phức tạp. Cả Go và C ++ là ngôn ngữ biên dịch và có cộng đồng người dùng mạnh mẽ. C++ được sử dụng trong nhiều loại ứng dụng, trong khi Go được sử dụng nhiều nhất cho các phần mềm backend web.

C++ được sử dụng rộng rãi. Là một ngôn ngữ lập trình hệ thống, nó đóng vai trò là xương sống cho số lượng lớn các chương trình, tác vụ tính toán và các ngôn ngữ lập trình khác. Nó nằm dưới rất nhiều nền tảng và được sử dụng để phát triển mọi thứ từ trò chơi điện tử đến các chương trình điều khiển tàu thăm dò không gian. Nó đã được sử dụng trong một thời gian dài và nó đã trải qua nhiều giai đoạn.

Go (hay Golang) gần như hoàn toàn mới trong lĩnh vực lập trình. Được tạo ra bởi Google, nó được nhắm mục tiêu thay thế C++ làm ngôn ngữ lập trình hệ thống có mục đích chung, và nó được xây dựng đặc biệt để đảm nhận vị trí đó. Vì vậy, cái nào tốt hơn: Kẻ mới yếu hơn hay nhà vô địch gạo cội?

Lập trình Golang

Như các ngôn ngữ lập trình mới ra đời, Golang khá mới. Go được tạo ra bởi Rob Pike, Robert Griesemer và Ken Thompson dành riêng cho Google. Nó là một ngôn ngữ lập trình dạng statically-typed – được biên dịch và có mục đích đa năng, giống như C++. Trình biên dịch cho ngôn ngữ ban đầu được viết bằng C nhưng bây giờ đã có trình biên dịch riêng.

Go cũng như nhiều IDE và thư viện của nó, được phân phối theo giấy phép nguồn mở hấp dẫn. Go được tạo ra cho các bộ vi xử lý đa lõi hiện đại. Nó hỗ trợ lập trình đồng thời; nghĩa là nó có thể chạy nhiều tiến trình cùng lúc bằng các luồng khác nhau thay vì chỉ chạy một tác vụ tại một thời điểm. Nó cũng có tính năng thu thập rác thực hiện quản lý bộ nhớ để ngăn chặn rò rỉ bộ nhớ (memory leak).

Lập trình C++

C++ là một trong những ngôn ngữ lập trình được sử dụng rộng rãi nhất trên thế giới. Đó là ngôn ngữ lập trình hướng đối tượng, bậc trung, được biên dịch, được xây dựng chú trọng đến hiệu suất và hiệu quả. C++ được xây dựng cho mọi thứ. C++ nhanh nhưng khó sử dụng (và nó là anh em họ với C) , tạo thành xương sống của phần lớn thế giới máy tính.

C++ được tạo ra cách đây khá lâu, vào năm 1979, khi một nhà khoa học máy tính người Đan Mạch tên là Bjarne Stroustrup muốn tạo một phần mở rộng cho C để cho phép nó sử dụng các lớp(class). Bây giờ C++ được sử dụng ở khắp mọi nơi. Nó thậm chí còn được sử dụng để viết trình biên dịch và thông dịch cho các ngôn ngữ khác.

So sánh giữa Go và C++

Bây giờ chúng ta đã biết một chút về nguồn gốc của từng ngôn ngữ, hãy cùng nhau đặt chúng vào và xem chúng đứng vững như thế nào trong các danh mục sau:

Go vs C++: Tốc độ và khả năng tương thích

C++ đã được gọi là ngôn ngữ DIY, vì vậy mặc dù nó có thể không đi kèm nhiều tính năng, nhưng bạn có thể xây dựng bất kỳ tính năng nào bạn muốn nếu bạn biết ngôn ngữ này đủ tốt. Cũng cần lưu ý rằng, C++ được coi là ngôn ngữ cấp trung, vì vậy nó không đơn giản và trực quan như ngôn ngữ cấp cao, nhưng nó không thô như ngôn ngữ assembly.

Tuy nhiên, điều đó có nghĩa là viết mã bằng ngôn ngữ cấp cao hơn sẽ đơn giản hơn. Thứ gì đó có thể mất một vài dòng trong một ngôn ngữ như Python có thể mất hàng tá dòng trong C++.

Golang nhỏ gọn hơn. Nó được xây dựng dựa trên sự đơn giản và khả năng mở rộng. Nó loại bỏ các dấu ngoặc và ngoặc đơn không cần thiết, nhằm hạn chế ít lỗi hơn.

Nó cũng là ngôn ngữ biên dịch giống như C++, nghĩa là người lập trình phải khai báo mọi kiểu biến trước khi biên dịch. Tuy nhiên, Go dễ học và viết mã hơn C++ vì nó đơn giản và nhỏ gọn hơn. Nó cũng có một số tính năng tích hợp không cần phải viết cho mọi dự án (như thu gom rác) và những tính năng đó hoạt động tốt.

Một xem xét khác là thời gian biên dịch. C++ có thời gian biên dịch nổi tiếng là chậm. Mặc dù thời gian biên dịch phụ thuộc vào những gì bạn thực sự đang viết mã, nhưng Go nhanh hơn đáng kể so với C++.

Vì mã của bạn cần được biên dịch trước khi chạy và biên dịch lại sau mỗi lần thay đổi code do bạn thực hiện, nên thời gian biên dịch rất quan trọng đối với tốc độ lập trình. Ví dụ khi bạn cần chạy mã lặp đi lặp lại để tìm dấu chấm phẩy bị thiếu trong mã C++ của mình, thời gian biên dịch đó sẽ nhiều lên nhanh chóng.

programmer

Cũng cần đề cập đến cấu trúc dữ liệu. C++ thể hiện cấu trúc hướng đối tượng nổi tiếng và quen thuộc, trong khi Go là ngôn ngữ lập trình thủ tục và đồng thời. Không giống như C++, Go không có các lớp (class) với các hàm tạo và hàm hủy.

Tìm việc làm C++ nhanh chóng trên TopDev

C++ vs Golang: Hiệu suất

Go rất nhanh so với các ngôn ngữ lập trình bậc cao khác. Tính năng biên dịch, static types và bộ thu gom rác hiệu quả giúp việc này diễn ra cực kỳ nhanh chóng. Go cũng rất tốt trong việc quản lý bộ nhớ; nó có con trỏ thay thế tham chiếu. Golang có thể tự hào về tốc độ nhanh hơn gần bốn lần so với những ngôn ngữ kiểu động(dynamic type) – các ngôn ngữ thông dịch.

Điều đó nói rằng, Go kém C++ về hiệu năng (và ngôn ngữ C) khi nói đến tốc độ. Tất cả thời gian dành cho viết mã và biên dịch đều được đền đáp ở đây. Vì C++ là một ngôn ngữ khó viết mã, cấp trung, nên nó gần với mã máy hơn: và khi được biên dịch, nó sẽ phù hợp với mã máy và chạy nhanh hơn.

Nó cũng thiếu những tính năng giúp viết mã dễ dàng hơn nhưng đến lúc chạy, C++ nhẹ, gọn và nhanh hơn.

Go được trang bị tất cả các công cụ giúp cuộc sống của bạn dễ dàng hơn trong quá trình viết mã, vì vậy nó chạy chậm hơn. Một trong những phần lớn nhất là công cụ thu gom rác chậm, mặc dù nó tuyệt vời.

Go vs C++: Bảo mật

Một số lỗ hổng bảo mật tồi tệ nhất trong các chương trình ngôn ngữ C liên quan đến việc lợi dụng lỗi tràn bộ đệm. Đây là khi một bộ đệm được tải quá nhiều thông tin và thông tin đó sẽ được ghi vào bộ nhớ liền kề. Điều này có thể tạo ra một sự cố, hoặc như nhiều người đã phát hiện ra, một lỗ hổng để truy cập leo thang đặc quyền.

Go có những hạn chế được tích hợp để giúp ngăn chặn vấn đề này. Ví dụ, Go không cho phép pointer arithmetic – bạn không thể truy cập các mảng bằng cách sử dụng các giá trị con trỏ (bạn phải truy cập các phần tử này thông qua index). Điều này buộc lập trình viên phải sử dụng các phương pháp bao gồm kiểm tra giới hạn, điều này ngăn chặn sự tràn số.

security

Tuy nhiên, cần lưu ý rằng lỗi tràn bộ đệm không phải là một lỗ hổng cố hữu trong tất cả các chương trình C++. Phương pháp bắt buộc trong Go cũng có thể thực hiện được trong C++, điểm khác biệt duy nhất là C++ cho phép lập trình viên lười biếng tạo ra những lỗ hổng này.

C++ vs Go: Tính ứng dụng

Ứng dụng không giới hạn là một trong những lý do chính khiến C++ vẫn chống lại Go. C++ là một cuốn sách mở. Một lập trình viên và sau đó là một chương trình có thể truy cập vào mọi phần của chính mã nguồn và máy chạy nó.

Nó không có bất kỳ tính năng tích hợp nào để bật hoặc tắt, nó là một phương tiện gọn gàng để tạo các chương trình và hệ thống. Đó là lý do tại sao thậm chí có thể tạo một hệ điều hành bằng C++; bạn có quyền truy cập vào mọi thứ.

Trong khi đó, Go là một hệ thống kín hơn. Việc tiếp cận hoạt động bên trong của Go khó hơn nhiều. Ví dụ: lấy bộ thu gom rác của Go hoạt động rất tốt. Nếu một lập trình viên muốn sửa đổi cách thức hoạt động của bộ thu gom rác đó hoặc liệu bộ thu gom rác đó có ở đó hay không, họ sẽ vô cùng khó khăn khi làm như vậy.

Mặc dù Go là một ngôn ngữ xuất sắc, nhưng nó không được thiết kế để hoạt động ở mức “thấp” như C++ có thể. Do đó, Go không được sử dụng rộng rãi như C++ và hiện tại nơi phổ biến nhất hay dùng Go là backend cho web.

Go vs C++: Cộng đồng

C++ đã xuất hiện được một thời gian khá lâu. Nó có một cộng đồng lớn đằng sau nó và do đó sẽ có câu trả lời cho gần như bất kỳ câu hỏi nào bạn có thể có đối với C++. Nếu bạn cần tích hợp, có thể ai đó đã tạo ra nó, hoặc nhiều khả năng hơn, bất cứ thứ gì bạn đang tích hợp đều đã có các tính năng để tích hợp với mã bạn đang viết.

Tuy nhiên, cũng phải nói thêm. C++ đã cũ; rất nhiều thư viện, mô-đun và hướng dẫn của nó đã lỗi thời. Tùy thuộc vào việc tìm ra một giải pháp không chỉ áp dụng được mà còn phải hiện đại.

Go mới hơn, với trường hợp sử dụng ít hơn và ít người hiểu ngôn ngữ hơn. Cho đến gần đây, tài liệu rất khan hiếm nên nhiều lập trình viên không hề quan tâm đến ngôn ngữ này.

Tuy nhiên, trong khi thư viện của nó nhỏ hơn C++, Go là một ngôn ngữ mới hơn. C++ không có tất cả các bộ công cụ, câ trả lời và phương án tích hợp dành cho nhà phát triển cũ từ năm 1998 vẫn còn lẩn quẩn trên web. Mọi thứ bạn có thể tìm thấy cho Go sẽ mới và gần như cập nhật nhất. Tất cả các mã hiện có cho Go đều hoạt động và được viết để phù hợp với các tiêu chuẩn hiện đại để phát triển.

Cộng đồng Go cũng sống động hơn. Vì đây là một ngôn ngữ mới nên cộng đồng xung quanh vẫn hào hứng khám phá những gì nó có thể làm và tất cả nội dung hiện có mà C++ đã có là những gì hiện do các lập trình viên và nhà phát triển của Go tạo ra. Thật thú vị khi trở thành một phần của ngôn ngữ mới, nơi vẫn còn những góc cần khám phá và các tính năng cần được phát triển.

Nếu việc phát triển một trong hai ngôn ngữ nghe có vẻ thú vị với bạn, đừng ngần ngại chọn ngôn ngữ này hơn ngôn ngữ kia. Mặc dù Go có thể không sớm thay thế C++ nhưng nó vẫn được sử dụng thường xuyên và có nhu cầu cao.

Kết luận

Bạn đã nắm được sự khác nhau, mạnh yếu của 2 loại ngôn ngữ trên chưa? Nếu bạn thực sự thích 1 ngôn ngữ mạnh, nhanh và có thể code mà hạn chế được bug thông qua sự hiểu biết của bạn thân, hãy chọn C++.

Nếu bạn thích 1 ngôn ngữ hiện đại, tuy không nhanh và mạnh như C++ nhưng cũng đang rất mới mẻ, nhiều cơ hội nghề nghiệp thì đừng ngần ngại chọn Golang.

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

Xem thêm:

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

ITClOUDSEA mở tuyển Đại lý – Lợi nhuận 40%

Chính sách tuyển dụng đại lý của ITCloudSea

ITCloudsea đang cung cấp 5 dịch vụ công nghệ thông tin tại 4 quốc gia với 32 đối tác. Mục tiêu của chúng tôi là sẽ cung cấp 30 dịch vụ CNTT tại 6 quốc gia với 100 đại lý trong tương lai. Vì vậy, với tư cách là đối tác bán hàng tiềm năng của chúng tôi, bạn có thể mở rộng lĩnh vực kinh doanh, mở rộng thị trường và luôn sẵn có một network vững chắc.

Chúng tôi đang tuyển đại lý toàn quốc với cơ chế và giá cả cực kỳ ưu đãi:

– Lợi nhuận hấp dẫn lên tới 40%.

– Không chi phí ban đầu

– Miễn phí toàn bộ chi phí đào tạo và khởi tạo hệ thống.

– Cung cấp số tay hướng dẫn sử dụng.

– Đội ngũ tư vấn chuyên nghiệp, hỗ trợ miễn phí qua hotline và groupchat.

– Hỗ trợ đa ngôn ngữ: trong trường hợp phần mềm không có phiên bản ngôn ngữ của bạn, bạn có thể hợp tác hỗ trợ dịch sang ngôn ngữ đó trong vòng 1 năm. Đồng thời, bạn sẽ được cung cấp độc quyền dịch vụ trong thời gian khi đang thực hiện dịch thuật.

– Đa dạng loại hình dịch vụ công nghệ thông tin.

– Hỗ trợ thanh toán trả sau, không yêu cầu đặt cọc.

chính sách tuyển đại lý

Hiện nay, chuyển đổi số đang là mục tiêu quốc gia trong giai đoạn 2020-2030. Do đó, nhu cầu sử dụng các giải pháp công nghệ trong doanh nghiệp đang dần được tăng mạnh. Nếu bạn đang là:

– Doanh nghiệp cần sản phẩm để mở rộng kinh doanh

– Cá nhân đơn lẻ đang tìm kiếm một cơ hội để Kiếm tiền và sở hữu doanh nghiệp của chính bạn

Hãy liên hệ ngay với chúng tôi qua số hotline: 028.3520.2367 hoặc để lại thông tin tại: https://bit.ly/3NIooCM

Tập đoàn Daoukiwoom Group và thương hiệu ITCloudSea

ITCloudSea là một thương hiệu của công ty Daoukiwoom Innovation, là đơn vị 100% đầu tư từ tập đoàn Daoukiwoom Hàn Quốc. Lĩnh vực hoạt động của chúng tôi gồm có: dịch vụ IT, Tài chính – đầu tư, và R&D – Outsourcing. Hiện, Daoukiwoom Group sở hữu 33 công ty thành viên với 3900 nhân viên.

ITCloudSea tự hào là đơn vị cung cấp các giải pháp quản trị cho doanh nghiệp ở Châu Á. Trong đó Top E-office và Salesmemo là 2 giải pháp đang được mọi người quan tâm.

Top E-ofice là phần mềm văn phòng điện tử, được sử dụng bởi 62% doanh nghiệp Hàn Quốc. Đây là một giải pháp hỗ trợ, giúp doanh nghiệp chuyển đổi số, hướng đến một môi trường làm việc hiện đại và chuyên nghiệp. Nền tảng giúp doanh nghiệp: điều hành từ xa, quản lý công việc dự án, quản lý tài liệu, tăng tương tác nội bộ, tiết kiệm thời gian và chi phí, nâng cao năng lực nhân viên. Nền tảng đang có 200.000+ user tin dùng, đã có mặt ở 6 quốc gia và hỗ trợ 7 loại ngôn ngữ.

Salesmemo là phần mềm quản lý bán hàng với 3 nhóm phân cấp rõ ràng: Giám đốc kinh doanh, trưởng nhóm kinh doanh và nhân viên kinh doanh. Giải pháp này hỗ trợ người bán hàng quản lý việc kinh doanh trở nên đơn giản, hiệu quả và chính xác hơn nhằm tiết kiệm thời gian, chi phí, kiếm soát được khối lượng công việc cho nhân viên và tránh được sai sót trong quá trình bán hàng.

Hiện nay, với mong muốn mang sản phẩm gần hơn tới người tiêu dùng, chúng tôi đang mở chương trình tuyển dụng đại lý với các phần mềm đang cung cấp.

Các bước để bạn trở thành đối tác bán hàng

Tại ITCloudSea, chúng tôi sẵn lòng chào đón các đối tác có cùng mục tiêu kinh doanh. Bởi vậy, quy trình thẩm định đối tác bán hàng là điều cần thiết.

Cụ thể:

Bước 1: Đăng ký trở thành đại lý tại đây

Bước 2: Thẩm định đại lý.

Bước 3: Thiết lập ID/PW.

Bước 4: Lựa chọn phần mềm.

Bước 5. Ký kết hợp đồng.

Sau khi ký kết hợp đồng, bạn đã chính thức trở thành một trong những đại lý tiềm năng của ITCloudSea. Mỗi khách hàng của bạn đều sẽ nhận được sự hỗ trợ nhiệt tình từ đội ngũ CS của chúng tôi. Vì vậy, hãy đăng ký ngay, để cùng hành động và kỳ vọng vào tương lai của thị trường CNTT Châu Á.

Tìm việc làm IT mọi cấp độ trên TopDev

Record class trong Java

Record class trong Java

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

Trong Java, khái niệm immutable dùng để chỉ những class mà đối tượng của chúng không bị thay đổi thông tin sau khi được khởi tạo.

Bình thường, để khai báo một immutable class, chúng ta sẽ:

Khai báo class này là final để không class nào extend được từ nó.

  • Khai báo các fields của class đó là private và final,
  • Không có các phương thức Setter mà chỉ có các phương thức Getter,
  • Nếu một trong các fields của class đó là object thì khi lấy thông tin của field đó, chúng ta cần return copy của object đó.

Ví dụ, nếu mình cần implement class Student với 2 thuộc tính là tên và tuổi, là immutable class, mình sẽ khai báo như sau:

package com.huongdanjava.javaexample;

public final class Student {
  private final String name;
  private final int age;

  public Student(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public int getAge() {
    return age;
  }
}

Mình đã giới thiệu với các bạn về Project Lombok, về lợi ích của nó trong việc giảm thiểu việc viết code cho những phương thức Getter, hay constructor, … khi khai báo một class. Với immutable class Student ở trên, chúng ta có thể viết lại với Project Lombok như sau:

package com.huongdanjava.javaexample;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public final class Student {

  private final String name;
  private final int age;
}

Từ Java 14 trở đi, chúng ta có thể làm điều này nhanh hơn rất nhiều, đơn giản hơn rất nhiều, không cần sử dụng Project Lombok nữa, bằng cách sử dụng từ khoá record khi khai báo class. Giờ thì chúng ta chỉ cần 1 dòng code để implement immutable class Student ở trên, như sau:

package com.huongdanjava.javaexample;

public record Student(String name, int age) {}

Java compiler sẽ generate các private, final fields, public constructor với đầy đủ các fields (constructor này còn được gọi là canonical constructor), các phương thức Getter cho những field này, phương thức equals(), phương thức hashCode() và phương thức toString() khi chúng ta sử dụng record để khai báo một class. Đối tượng của những class này sẽ là các đối tượng immutable các bạn nhé!

Giờ thì các bạn có thể khởi tạo và lấy thông tin của một đối tượng Student như sau:

khởi tạo và lấy thông tin của một đối tượng Student

Chúng ta không thể extend class Student này:

final class

bởi vì class Student này là final class.

Các bạn có thể khai báo thêm các constructor khác cho class Student này theo nhu cầu của mình, ví dụ như default constructor hay constructor có 1 tham số, như sau:

package com.huongdanjava.javaexample;

public record Student(String name, int age) {

    public Student() {
        this("Khanh", 35);
    }

    public Student(String name) {
        this(name, 0);
    }
}

Chúng ta cũng có thể khai báo các static variable và static method bên trong một record class:

package com.huongdanjava.javaexample;

public record Student(String name, int age) {

  public static String NAME = "Huong Dan Java";

  public static void doSomething() {
    System.out.println("Hello");
  }
}

và gọi đến chúng, ví dụ như sau:

ví dụ

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

Bạn có thể quan tâm:

Xem tin tuyển dụng CNTT mới nhất trên TopDev

EPAM Việt Nam được vinh danh là “Nơi Làm việc Tốt nhất Việt Nam 2022”

epam vietnam

Mở văn phòng đại diện tại Việt Nam từ 2019, EPAM đã tăng trưởng gấp 5 lần trong 3 năm và đứng thứ hai trong top 10 công ty có nơi làm việc tốt nhất năm 2022, theo Great Place to Work.  

Những năm qua, Việt Nam đã phát triển nhanh chóng để trở thành IT hub trong khu vực, thu hút nhiều nhà cung cấp dịch vụ phát triển phần mềm trên khắp thế giới. Trong môi trường cạnh tranh cao này, những công ty đặt quyền lợi của nhân viên lên hàng đầu thu hút dụng được nhiều nhân tài và xây dựng thành công mối quan hệ lâu dài với nhân viên.  

Có thể nhắc tới EPAM Việt Nam- công ty chuyên cung cấp dịch vụ chuyển đổi số và phát triển sản phẩm – như một ví dụ. 

VNBWP event epam

Nhân viên EPAM tại Việt Nam được mô tả bằng 3 từ: “Nhiệt huyết”, “cởi mở” và “luôn trong trạng thái sẵn sàng”. Đặc trưng của văn hóa doanh nghiệp là tính cộng đồng và tinh thần đoàn kết – điều đã được minh chứng trong thời gian chịu nhiều hạn chế, thách thức bởi đại dịch Covid-19. Ngay cả khi công ty đưa ra phương thức làm việc kết hợp (hybrid working), nhiều nhân viên vẫn sắp xếp đến văn phòng vài ngày nhất định trong tuần để gặp gỡ đồng nghiệp.

EPAM Việt Nam đặt tham vọng tạo ra hơn 3000 việc làm trong 5 năm tiếp theo và trở thành trung tâm phát triển phần mềm lớn nhất nước. Hiện nay, các nhóm kỹ sư Java, Manual/Automated QA, Frontend/Backend Javascript, Cloud và Devops, phân tích kinh doanh (Business Analyst) cũng như quản lý dự án (Project Manager) đang cùng làm việc tại nhiều dự án cho khách hàng trong và ngoài nước trên các lĩnh vực dịch vụ tài chính, bán lẻ, sản xuất và tự động hóa,… 

EPAM cũng đã bắt đầu lên kế hoạch bằng cách hợp tác với các trường đại học, các cộng đồng công nghệ, tăng cường độ nhận diện thương hiệu cũng như xây dựng đội ngũ quản lý và kỹ sư cấp cao. Dù văn phòng chính đặt tại thành phố Hồ Chí Minh, EPAM vẫn không ngừng tuyển dụng nhiều vị trí việc làm từ xa và xây dựng  đội ngũ nhân viên trên khắp cả nước. Trong năm nay, công ty dự kiến nâng cao sự hiện diện tại Việt Nam với văn phòng thứ hai ở Hà Nội.  

group working epam

EPAM Vietnam được thành lập vào năm 2019 với sự sáp nhập của một công ty khởi nghiệp và đã đạt mục tiêu tăng trưởng từ 40 lên 200 người vào năm 2022. Sự tăng trưởng mạnh mẽ khiến quy trình hoạt động bắt buộc phải diễn ra nhanh chóng hơn. Như khi được làm việc với các khách hàng quốc tế, họ thường yêu cầu đội ngũ quản trị phải thiết lập các quy trình phát triển vững chắc, triển khai các phương pháp tự động hóa và học hỏi việc đối phó với sự tăng trưởng của các dự án. Để đạt được điều này, đội ngũ nhân viên EPAM Việt Nam được khuyến khích đảm nhận những nhiệm vụ đầy thử thách và học hỏi từ cả những thất bại. Tất cả những điều này đều không thực hiện nếu không có sự hỗ trợ của hơn 61,000 đồng nghiệp  từ hơn 45 quốc gia. Tại EPAM, mọi cá nhân đều hành động như công dân quốc tế và suy nghĩ xa hơn, vượt ra ngoài khuôn khổ địa phương.

EPAM Việt Nam là sự kết hợp của tính linh hoạt, khả năng ra quyết định nhanh chóng của một công ty khởi nghiệp với sự ổn định cùng các quy trình hoàn chỉnh. EPAM Việt Nam luôn xem mỗi một thử thách là một cơ hội, họ còn phát triển các cộng đồng mà ở đó, nhân viên có thể trau dồi kiến thức và rèn luyện kỹ năng một cách vui vẻ và hào hứng. Trong đó có thể kể đến “Cộng đồng nhà lãnh đạo tài năng – Emerging Leaders Community” được hình thành nhằm xây dựng môi trường cạnh tranh lành mạnh cho nhân viên, thử thách khả năng lãnh đạo với những ý tưởng sáng tạo đổi mới và thực hiện chúng. Đồng thời, nếu quan tâm đến các vấn đề kỹ thuật đều có thể tham gia Cộng đồng kỹ sư Việt Nam –  Vietnam Engineering Community nơi thúc đẩy việc chia sẻ kiến thức thông qua các sự kiện chia sẻ chuyên sâu nội bộ và bên ngoài.

EPAM Việt Nam không chỉ cung cấp nhiều cơ hội đào tạo và phát triển, định hướng nghề nghiệp rõ ràng cùng mức lương thưởng cao mà còn hơn thế nữa. NNhằm tạo môi trường làm việc lành mạnh, bên cạnh công việc hàng ngày, công ty đã tổ chức nhiều chương trình trải nghiệm thú vị cho nhân viên. Nhân viên có thể tham gia các chương trình hội thảo, thể thao hoặc sự kiện trách nhiệm xã hội doanh nghiệp – CSR như trồng cây, dọn rác bãi biển hay từ thiện.  Một trong những sáng kiến lớn nhất của công ty là tham gia nâng cao trình độ chuyên môn trên thị trường lao động thông qua chương trình “Học viện đào tạo kỹ sư tài năng – Emerging Engineers Academy”. Từ 2021, EPAMers đã tuyển dụng nhiều sinh viên mới ra trường cho các chương trình đào tạo này.

activities epam

Bên cạnh tinh thần tập thể, EPAM vẫn luôn tôn trọng thành tựu của từng cá nhân và đã có nhiều sáng kiến để khiến nhân viên cảm thấy được ghi nhận và trân trọng. Ví dụ, chương trình công nhận hàng quý khuyến khích nhân viên nhận biết những thành tích của đồng nghiệp bằng cách trao đổi các “huy hiệu anh hùng” (heroes badges). Trong đợt chịu ảnh hưởng nặng nề của COVID, EPAM đã gửi tặng tới từng nhân viên các gói chăm sóc sức khỏe và tinh thần đồng thời bổ sung thêm thuốc vào phạm vi bảo hiểm của công ty. Hơn thês nữa, ttrong thời gian xảy ra xung đột giữa Nga và U-crai-na, công ty đã dành nhiều sự quan tâm tới các cá nhân tham gia Chương trình chuyển vùng – Relocation Program tới Việt Nam.

Tham khảo ngay trang việc làm của họ để tìm hiểu các cơ hội việc làm hấp dẫn.

Cách sử dụng Transaction trong SQL hiệu quả

Transaction trong SQL

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

Transaction

Transaction là một khái niệm rất quen thuộc với các lập trình viên backend. Nhưng trong thực tế làm việc không ít các lập trình viên backend chỉ biết transaction dùng để thực hiện một chuỗi câu lệnh insert,update,… với sqlDatabase thực sự thay đổi khi tất cả các lệnh trên đều thực hiện thành công ngược lại thì sẽ không có bất cứ thay đổi nào trên database. Các loại SQL còn cung cấp cho chúng ta các loại Isolation để tùy chỉnh Transaction theo ý muốn của mình.

Khi thực hiện 1 Transaction các cơ sở dữ liệu quan hệ (SQL) cung cấp cho chúng ta rất 4 loại Isolation khác nhau với nhiều mục đích sử dụng khác nhau. Loại Isolation càng cao thì sẽ có mức độ toàn vẹn dữ liệu càng cao nhưng ngược lại sẽ có hiệu năng thấp hơn với các loại khác.

  • TRANSACTION_READ_UNCOMMITTED mức độ 1
  • TRANSACTION_READ_COMMITTED mức độ 2
  • TRANSACTION_REPEATABLE_READ mức độ 3
  • TRANSACTION_SERIALIZABLE mức độ 4

Trong bài này tôi sẽ trình bày về các loại Isolation cũng như các Anomaly về dữ liệu khi thực hiện đồng thời Transaction.

Phân biệt các loại Anomaly

Dirty Reads

Dirty Read là việc ransaction (T1) đọc được dữ liệu đang được thay đổi từ một transaction (T2) khác mặc dù transaction chưa được commit nghĩa là T2 đó có thể bị rollback và dữ liệu được đọc từ và dùng ở T1 đã bị sai.

Ví dụ :

Transaction T1 begins.
UPDATE post SET title = 'ACID'
WHERE id = '1'

Transaction T2 begins.
SELECT * FROM post where id = '1'

T2 sẽ nhìn thấy title = ‘ACID’ cái được update từ T1 mặc dù T1 chưa commit.

DirtyRead

Nonrepeatable Reads

Nonrepeatable Reads xảy ra khi trong cùng một transaction (T2) query trả lại các quả khác nhau.

Nonrepeatable Reads xảy ra khi một transaction(T1) đã sửa đổi dữ liệu cái mà được đọc từ transaction (T2)

Ví dụ :

Transaction T2 begins.
SELECT * FROM post
WHERE id = '1' 

Transaction T1 begins.
UPDATE post SET title = 'ACID'WHERE id = '1'

Transaction T1 thay đổi giá trị cảu title thành ACID cái mà đang được transaction T2 đọc ra nếu transaction T2 tiếp tục đọc lại giá trị này thì sẽ được kết quả khác với kết quả lần đầu tiên đọc ra.

nonereapeat.png

##Phantom Reads Phantom Reads xảy ra khi một transaction (T1) đọc ra một tập kết quả dữ liệu sau thỏa mãn điều kiện where của mình sau đó một transaction (T2) thực hiện thêm dữ liệu vào table. Transaction T1 chưa commit và thực hiện lại query 1 lần nữa thì được tập kết quả khác với tập đầu tiên đọc ra (nhiều bản ghi hơn).

Ví dụ

Transaction T1 begin
select * from post_comment where post_id =1;

Transaction T2 begin
insert into post_comment (id,post_id) Values(4,1)

Nếu Transaction T1 thực hiện lại câu query select * from post_comment where post_id =1; sẽ thu được số lượng kết quả lớn hơn so với ban đầu.

PhantomRead

Cách sử dụng isolation

Bên trên là các Anomaly có thể xảy ra trong trường hợp có 2 hay nhiều transaction chạy song song. Để tránh xảy ra các loại Anomaly này thì người dùng cần phải chọn các loại Isolation cho phù hợp.

Đối với oracle chúng ta tham khảo link sau: docs.oracle.com/javadb/10.8.3.0/devguide/cd..

Type Dirty Reads Nonrepeatable Reads Phantom Reads
TRANSACTION_READ_UNCOMMITTED no no no
TRANSACTION_READ_COMMITTED yes no no
TRANSACTION_REPEATABLE_READ yes yes no
TRANSACTION_SERIALIZABLE yes yes yes

 

Bảng với mode locking là Table Level

Type Dirty Reads Nonrepeatable Reads Phantom Reads
TRANSACTION_READ_UNCOMMITTED no no no
TRANSACTION_READ_COMMITTED yes no no
TRANSACTION_REPEATABLE_READ yes yes yes
TRANSACTION_SERIALIZABLE yes yes yes

Thực hành các loại isolation

Tại rất khó tìm được 1 bảng thống kê các loại Isolation với mysql nên chúng ta sẽ thực hành để biết loại Isolation sẽ chống lại loại Anomaly nào.

TRANSACTION_READ_UNCOMMITTED

Đây là dạng isolation cho chúng ta hiệu năng cao nhất. Để kiểm chứng lý thuyết thì ta sẽ thực hiện các câu lệnh java sau.

package tutorial.transaction;

import java.sql.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import static tutorial.transaction.Test.*;
import static tutorial.transaction.Test.PASS;

public class IsolationLevelTest {

    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(1);
        ExecutorService service = Executors.newFixedThreadPool(2);
        service.submit(() -> {
            try {
                Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
                conn.setAutoCommit(false);
                conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
                try {
                    int number = 100;

                    Statement statement = conn.createStatement();

                    ResultSet resultSet = statement.executeQuery("select * from dev.`users` where id = 1");

                    resultSet.next();

                    int amount1 = resultSet.getInt("amount");

                    System.out.println("Transaction1 get amount = " + amount1 );

                    String update1 = "UPDATE `dev`.`users` SET `amount` = " + (amount1 - number) + " WHERE (`id` = '1');";

                    statement.executeUpdate(update1);

                    countDownLatch.countDown();
                    Thread.sleep(5000);
                    conn.rollback();
                } catch (Exception e) {
                    conn.rollback();
                    System.out.println("1 rollback");
                    e.printStackTrace();
                }
                conn.close();
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
        });

        service.submit(() -> {
            try {
                Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);

                conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);

                conn.setAutoCommit(false);
                try {
                    Statement statement = conn.createStatement();
                    countDownLatch.await();
                    ResultSet resultSet = statement.executeQuery("select * from dev.`users` where id =1");
                    resultSet.next();

                    int amount2 = resultSet.getInt("amount");
                    System.out.println("Transaction2 get amount = " + amount2);

                    conn.commit();

                } catch (Exception e) {
                    conn.rollback();
                    System.out.println("2 rollback");
                    e.printStackTrace();
                }
                conn.close();
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
        });
        service.shutdown();
    }
}

Tại ví dụ trên ta tạo 2 transaction chạy đồng thời. Transaction T1 chạy trước và sửa đổi giá trị amount, Sau đó chúng ta chạy Transaction T2. Nếu để mode trên sẽ thu được TRANSACTION_READ_UNCOMMITTED kết quả sau.

Transaction1 get amount = 13004200
Transaction2 get amount = 13004100

Mặc dù T1 đã rollback nhưng T2 vẫn đọc ra kết quả được T1 thay đổi. Điều này chứng tỏ TRANSACTION_READ_UNCOMMITTED không thể chống được Dirty Read.

TRANSACTION_READ_COMMITTED

Vẫn xét ví dụ trên nhưng ta sẽ thay đổi IsolateLevel của Transaction T2 thành conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);

Kết quả ta thu được là :

Transaction1 get amount = 13004200
Transaction2 get amount = 13004200

Theo kết quả ta thấy được TRANSACTION_READ_COMMITTED chống được Dirty Read.

Ta sửa đổi class trên 1 chút thành dạng sau đây.

package tutorial.transaction;

import java.sql.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import static tutorial.transaction.Test.*;
import static tutorial.transaction.Test.PASS;

public class IsolationLevelTest {

    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(1);
        ExecutorService service = Executors.newFixedThreadPool(2);
        service.submit(() -> {
            try {
                Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
                conn.setAutoCommit(false);
                conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
                try {
                    int number = 100;

                    Statement statement = conn.createStatement();

                    ResultSet resultSet = statement.executeQuery("select * from dev.`users` where id = 1");

                    resultSet.next();

                    int amount1 = resultSet.getInt("amount");

                    System.out.println("Transaction1 get ammount = " + amount1 );

                    String update1 = "UPDATE `dev`.`users` SET `amount` = " + (amount1 - number) + " WHERE (`id` = '1');";

                    statement.executeUpdate(update1);

                    countDownLatch.countDown();
                    conn.commit();
                } catch (Exception e) {
                    conn.rollback();
                    System.out.println("1 rollback");
                    e.printStackTrace();
                }
                conn.close();
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
        });

        service.submit(() -> {
            try {
                Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);

                conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

                conn.setAutoCommit(false);
                try {
                    Statement statement = conn.createStatement();
                    countDownLatch.await();
                    ResultSet resultSet = statement.executeQuery("select * from dev.`users` where id =1");
                    resultSet.next();

                    int amount2 = resultSet.getInt("amount");
                    System.out.println("Transaction2 get amount = " + amount2);

                    Thread.sleep(1000);

                    resultSet = statement.executeQuery("select * from dev.`users` where id =1");
                    resultSet.next();

                    amount2 = resultSet.getInt("amount");
                    System.out.println("Transaction2 re read get amount = " + amount2);

                    conn.commit();

                } catch (Exception e) {
                    conn.rollback();
                    System.out.println("2 rollback");
                    e.printStackTrace();
                }
                conn.close();
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
        });
        service.shutdown();
    }
}

Tại đây ta thay đổi Transaction T2 đọc lại dữ liệu thêm 1 lần nữa. Nhưng lần này Transaction T1 đã commit thay đổi kết quả của mình. Kết quả sẽ là

Transaction1 get ammount = 13003900
Transaction2 get amount = 13003900
Transaction2 re read get amount = 13003800

Điều này thấy được TRANSACTION_READ_COMMITTED không chống lại được Nonrepeatable Reads

TRANSACTION_REPEATABLE_READ

Tiếp tục với ví dụ trên ta thay đổi IsolateLevel của Transaction T2 thành conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

Kết quả sẽ thay đổi thành.

Transaction1 get ammount = 13003800
Transaction2 get amount = 13003800
Transaction2 re read get amount = 13003800

Đây là mode IsolateLevel mặc định của Jdbc với Mysql nhưng sẽ đưa lại hiệu năng kém hơn 2 mẫu còn lại.

Hiện tại bảng dùng để test đang dùng innodb của Mysql. Chúng ta cùng test xem liệu rằng TRANSACTION_REPEATABLE_READ có chống được lại Phantom Reads được hay không. Cùng xét ví dụ sau

package tutorial.transaction;

import java.sql.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import static tutorial.transaction.Test.*;
import static tutorial.transaction.Test.PASS;

public class IsolationLevelTest {

    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(1);
        CountDownLatch countLatch = new CountDownLatch(1);
        ExecutorService service = Executors.newFixedThreadPool(2);
        service.submit(() -> {
            try {
                Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
                conn.setAutoCommit(false);
                conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
                try {
                    Statement statement = conn.createStatement();

                    String update1 = "INSERT INTO `dev`.`users` (`full_name`, `amount`) VALUES ('lol', '5000');;";

                    statement.executeUpdate(update1);

                    conn.commit();

                } catch (Exception e) {
                    conn.rollback();
                    System.out.println("1 rollback");
                    e.printStackTrace();
                }
                conn.close();
                System.out.println("1 done");
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
        });

        service.submit(() -> {
            try {
                Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);

                conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

                conn.setAutoCommit(false);
                try {
                    int count =0;
                    Statement statement = conn.createStatement();

                    ResultSet resultSet = statement.executeQuery("select * from dev.`users` where  amount > 2500");
                    while (resultSet.next()){
                        count++;
                    }
                    resultSet.close();
                    System.out.println(" first read = "+ count );

                    Thread.sleep(2000);
                    count =0;

                    ResultSet resultSet1 = statement.executeQuery("select * from dev.`users` where  amount > 2500");
                    while (resultSet1.next()){
                        count++;
                    }
                    System.out.println(" second read = "+ count );
                } catch (Exception e) {
                    conn.rollback();
                    System.out.println("2 rollback");
                    e.printStackTrace();
                }
                conn.close();
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
        });
        service.shutdown();
    }
}

Kết quả của lệnh in sẽ là :

 first read = 1
 second read = 1

Như vậy ta kết luận được TRANSACTION_REPEATABLE_READ của mysql sẽ chống lại Phantom Reads với innodb.

Chuyển sang dạng MyISAM và test lại code ta được kết quả sau:

 first read = 2
 second read = 3

Vậy với dạng MyISAM thì mysql sẽ không chống lại được Phantom Reads.

TRANSACTION_SERIALIZABLE

Cũng tương tự như TRANSACTION_READ_COMMITTED thì TRANSACTION_SERIALIZABLE cũng chống lại Phantom Reads với innodb.

Đến đây câu hỏi sẽ là vậy Mysql tạo ra thêm dạng Isolation này để làm gì? Hiệu năng của TRANSACTION_SERIALIZABLE mang lại là tệ nhất trong các loại Isolation.

Ta xét ví dụ chuyển tiền trong ngân hàng :

A -> B (100). A chuyển cho B 100 

A -> C (50). B chuyển cho C 50

Ta sẽ xét đoạn code sau của Java

package tutorial.transaction;

import java.sql.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import static tutorial.transaction.Test.*;
import static tutorial.transaction.Test.PASS;

public class IsolationLevelTest {

    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(2);
        service.submit(() -> {
            try {
                Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
                conn.setAutoCommit(false);
                conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
                try {
                    int number = 100;

                    Statement statement = conn.createStatement();

                    ResultSet resultSet = statement.executeQuery("select * from dev.`users` where id = 1");

                    resultSet.next();

                    int amount1 = resultSet.getInt("amount");

                    String update1 = "UPDATE `dev`.`users` SET `amount` = " + (amount1 - number) + " WHERE (`id` = '1');";

                    statement.executeUpdate(update1);

                    resultSet = statement.executeQuery("select * from dev.`users` where id = 2");
                    resultSet.next();

                    int amount2 = resultSet.getInt("amount");

                    String update2 = "UPDATE `dev`.`users` SET `amount` = " + (amount2 + number) + "  WHERE (`id` = '2');";

                    statement.executeUpdate(update2);

                    conn.commit();
                } catch (Exception e) {
                    conn.rollback();
                    System.out.println("1 rollback");
                    e.printStackTrace();
                }
                conn.close();
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
        });

        service.submit(() -> {
            try {
                Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);

                conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

                conn.setAutoCommit(false);
                try {
                    int number = 50;

                    Statement statement = conn.createStatement();

                    ResultSet resultSet = statement.executeQuery("select * from dev.`users` where id = 1");

                    resultSet.next();

                    int amount1 = resultSet.getInt("amount");

                    String update1 = "UPDATE `dev`.`users` SET `amount` = " + (amount1 - number) + " WHERE (`id` = '1');";

                    statement.executeUpdate(update1);

                    resultSet = statement.executeQuery("select * from dev.`users` where id = 3");
                    resultSet.next();

                    int amount2 = resultSet.getInt("amount");

                    String update2 = "UPDATE `dev`.`users` SET `amount` = " + (amount2 + number) + "  WHERE (`id` = '3');";

                    statement.executeUpdate(update2);

                    conn.commit();

                } catch (Exception e) {
                    conn.rollback();
                    System.out.println("2 rollback");
                    e.printStackTrace();
                }
                conn.close();
            } catch (Exception throwables) {
                throwables.printStackTrace();
            }
        });
        service.shutdown();
    }
}

Khi bạn chạy chương trình không có lỗi gì xảy ra. Bạn sẽ thông báo là đã chuyển đủ tiền từ A sang các tài khoản khác. Nhưng khi check db thì thấy kết quả đang bị sai. Nó chỉ đang ghi nhận cho 1 transaction. Thay vì Tài khoản của A bị giảm đi 150 thì tài khoản của A sẽ chỉ giảm 50 hoặc 100. Điều này dẫn đến lỗi sai nghiêm trọng.

Để giải quyết bài toán cần sự tuần tự trong transaction này chúng ta cần sử dụng mode TRANSACTION_SERIALIZABLE sau khi thay đổi conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); chúng ta chạy lại code sẽ được kết quả sau:

2 rollback
com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:123)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1340)
    at com.mysql.cj.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2089)
    at com.mysql.cj.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1251)
    at tutorial.transaction.IsolationLevelTest.lambda$main$1(IsolationLevelTest.java:75)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Đến đây thì 1 trong 2 transaction sẽ bị rollback và bắn ra exception. Điều này sẽ giúp bạn chống được lỗi trên.

Kết luận

Đến đây thì mọi người chắc cũng biết cách chọn loại transaction cho riêng mình rồi mình xin có 1 số ý kiến như sau:

  • Thông thường khi đọc kết quả từ 1 câu select chúng ta sẽ lưu lại nó trên RAM và rất ít khi thực hiện lại câu select tương tự vào SQL nên để đảm bảo performance thì hãy trọn mode TRANSACTION_READ_COMMITTED
  • Nếu hệ thống bạn cần phải thực hiện transaction tuần tự hóa thì hãy trọn TRANSACTION_SERIALIZABLE mặc dù hiệu năng nó rất tệ nhưng nó mang lại kết quả tốt.

Sử dụng TRANSACTION_SERIALIZABLE sẽ mang lại cho bạn 1 hệ thống Strong consistency nhưng hệ thống của bạn sẽ thật sự có hiệu năng rất tệ nếu có nhiều người sử dụng. Tất nhiên để chuyển tiền thì các bạn có thể sử dụng câu query khác mà không cần sử dụng đến TRANSACTION_SERIALIZABLE vẫn đảm bảo được yêu cầu nghiệp vụ của các bạn ở đây mình chỉ viết query để ví dụ cho loại TRANSACTION_SERIALIZABLE này.

Một kỹ thuật nữa là sử dụng eventual consistency một kỹ thuật tăng được hiệu năng nhưng cũng khá khó implement. Nếu có dịp mình sẽ xây 1 hệ thống chuyển tiền bằng kỹ thuật eventual consistency trên. Mình nghĩ kỹ thuật này đang được dùng tại nhiều hệ thống chuyển tiền để tăng trải nghiệm khách hàng.

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

Xem thêm:

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

Những cuốn sách mà Developer nên đọc – Phần 1

Những cuốn sách Developer nên đọc

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

Quay lại khoảng thời gian cách đây 8-10 năm, lúc đó thế giới công nghệ không có nhiều lựa chọn, loanh quanh thì cũng .NET và Java, PHP, … Không như bây giờ với hàng hàng sa số các công nghệ mới, framework, library mới ra đời khiến cho đa số các developer phải đổ xô để bắt kịp xu hướng.

Việc trau dồi kỹ năng của thế hệ developer trước đó cũng khác biệt. Họ có rất ít lưỡi dao trong tay nhưng lưỡi nào cũng sắc bén vô cùng, họ chăm chút từng dòng code, apply design principle, design pattern một cách kỹ lưỡng. Nhìn các developer hiện nay, theo những gì mình quan sát được từ các bạn developer trẻ ngày nay, họ quá ít quan tâm đến chất lượng code mà chỉ quan tâm đến việc đến số lượng công nghệ được apply, họ lại đi theo một xu hướng khác, đó là sắm cho mình những con dao của quân đội Thụy Sĩ, tuy số lượng thì nhiều nhưng thiếu đi độ bén.

Con dao của quân đội Thụy Sĩ
Con dao của quân đội Thụy Sĩ

Bạn thích 1 con dao thật bén, hay thích một bó dao?

Nếu bạn muốn theo đuổi nghề lập trình thì hãy xác định việc học là việc cả đời. Và quan trọng hơn cả là tự học.

Dưới đây là danh sách các cuốn sách hay mà mình khuyên các bạn developer nên đọc qua một lần, thứ tự sách được liệt kê sẽ được nâng dần cấp độ theo quá trình phát triển của bản thân.

Hãy bắt đầu với những cuốn sách cho các bạn mới vào nghề.

1. CLEAN CODE

Clean Code của tác giả Bob Martin là cuốn sách kinh điển mà tất cả các developer của mình cần đọc ĐẦU TIÊN để rèn luyện tay nghề, code cần phải sạch và đúng ngay từ thuở ban đầu, developer cần quan tâm đến từng dòng code mình viết ra thì mới tạo ra được niềm vui từ sự hoàn hảo. Nếu trong các năm đầu các bạn không thể viết ra các đoạn code “sạch sẽ” thì khả năng cao điều đó sẽ rất khó chỉnh về sau.

clean code book
Clean Code: A Handbook of Agile Software Craftsmanship

Các ví dụ trong sách được viết bằng Java, nhưng không khó để các bạn có thể tìm các phiên bản tương tự đâu đó trên Github.

https://github.com/ryanmcdermott/clean-code-javascript
https://github.com/labs42io/clean-code-typescript
https://github.com/labs42io/clean-code-typescript

2. DESIGN PATTERN

Có 1 điều dễ nhận thấy là ngày càng ít người quan tâm đến design pattern hay nói chính xác hơn là Object Oriented Design Pattern. Nếu bạn làm việc với các ngôn ngữ Object Oriented mà không biết Design Pattern thì hãy trang bị ngay. Hãy đọc cuốn Head First Design Patterns, bắt đầu với Strategy Pattern, bạn sẽ hiểu khi có design pattern, life is easier.

Tips: ngoài design pattern, các bạn cũng nên tìm đọc về các Design Principle ví dụ như SOLID, KISS, YANGI, …

head first design patterns book
Head First Design Patterns: A Brain-Friendly Guide

Còn với các ngôn ngữ khác? Trước khi bắt đầu học một framework, ngôn ngữ nào mới, mình thường tìm kiếm các design pattern của nó.

Ví dụ https://reactpatterns.com/ tập hợp rất nhiều coding pattern, practice giúp mình xử lý các vấn đề lúc coding một cách chuẩn chỉnh hơn.

3. REFACTORING TO PATTERNS

Lại một cuốn sách hay nữa, Refactoring to Patterns sẽ giúp mình “chỉnh lại tay nghề” bằng cách chuyển những đoạn code không theo pattern vào nề nếp

Refactoring to Patterns: Kerievsky, Joshua
Refactoring to Patterns: Kerievsky, Joshua

Bonus: https://github.com/sunnypatel165/31DaysOfRefactoringInJava

4. CODE SMELL

Những đoạn code xấu thường bốc mùi. Hãy nhận biết mùi của code xấu và tìm cách làm cho nó thơm tho hơn

Các bạn có thể đọc phiên bản online ở đây: https://refactoring.guru/refactoring/smells

Hoặc mua các tài liệu premium để tìm hiểu sâu hơn: https://refactoring.guru/store

5. LẬP TRÌNH VÀ CUỘC SỐNG

“Để lập trình hiệu quả, viết code thôi là chưa đủ. Con người mới là nhân tố quan trọng”. Đây là lời trích từ trang bìa của cuốn sách. Mài dũa ngón tay của bạn, và cũng phải mài dũa cả tâm trí của mình.

Cuốn sách này được anh Hồ Sỹ Hùng tuyển tập và dịch từ trang https://blog.codinghorror.com/

Lập Trình Và Cuộc Sống
Lập Trình Và Cuộc Sống

Hãy đọc để xem các lập trình viên khác họ nghĩ gì, và tìm kiếm lời khuyên cho chính mình.

Một số cuốn sách hay của tác giả Việt Nam:

  • Code dạo ký sự
  • Agile Y

6. CODE COMPLETE VÀ PRAGMATIC PROGRAMMER

Sách sẽ không dạy bạn lập trình, nhưng sẽ truyền đạt cảm hứng và dạy bạn một số kỹ năng mềm trong nghề lập trình. Tương tự như cuốn Lập trình và cuộc sống ở trên

Code Complete: A Practical Handbook of Software Construction
Code Complete: A Practical Handbook of Software Construction

 

Pragmatic Bookshelf: By Developers, For Developers
Pragmatic Bookshelf: By Developers, For Developers

Trên đây là những cuốn sách Developer nên đọc và nó giành cho cả những bạn mới bước vào nghề. Ở phần 2 sẽ là những sách dành cho các bạn senior và tech lead.

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

Xem thêm:

Tìm việc làm IT tất cả level trên TopDev

Lập trình Backend là gì? Backend Developer cần các kỹ năng nào?

Lộ trình trở thành Backend Developer

Bạn đang muốn phát triển trên con đường Backend Developer nhưng chưa thật sự hiểu rõ Backend là gì? Bài viết dưới đây sẽ cung cấp thật chi tiết thông tin về Backend, giúp bạn nắm được bức chân dung của ngành lập trình viên Backend.

Backend là gì?

Backend (còn được viết là Back-end hay Back end) là phần mà người dùng không thể nhìn thấy của một ứng dụng hoặc trang web nhưng đóng vai trò quan trọng trong việc đảm bảo hoạt động của ứng dụng diễn ra mượt mà.

Nói một cách đơn giản, backend là phía “máy chủ” của ứng dụng, chịu trách nhiệm xử lý dữ liệu, quản lý cơ sở dữ liệu, và đảm bảo mọi thứ hoạt động đúng cách để người dùng có thể tương tác với giao diện người dùng (frontend) một cách dễ dàng.

Một hình ảnh minh họa dễ hiểu, nếu frontend là phần nổi thì backend là phần chìm của tảng băng.

Backend là gì?
Backend là gì?

Các thành phần chính của backend bao gồm máy chủ, cơ sở dữ liệu, và các ứng dụng mà máy chủ sử dụng để giao tiếp với cơ sở dữ liệu và các dịch vụ khác.

Backend Developer là gì?

Backend Developer là người tạo ra những dòng code giúp trình duyệt giao tiếp với cơ sở dữ liệu để lưu trữ, đọc, cập nhật hoặc xóa thông tin từ cơ sở dữ liệu. Trách nhiệm chính của Backend Developer là xây dựng, duy trì và cải thiện phần mã nguồn hoạt động trong nền, đảm bảo rằng dữ liệu được xử lý một cách hiệu quả và chính xác.

Xem thêm: Front-end và Back-end khác nhau như thế nào?

Backend của một ứng dụng hoạt động như thế nào?

Backend quản lý các chức năng chính của ứng dụng. Khi người dùng tương tác với frontend, một yêu cầu HTTP được gửi đến backend.

Backend của một ứng dụng hoạt động như thế nào?

Dưới đây là cách backend hoạt động:

  1. Nhận Yêu Cầu: Backend nhận yêu cầu từ người dùng thông qua HTTP.
  2. Xác Thực và Xử Lý: Kiểm tra thông tin đăng nhập và quyền truy cập. Sau đó, truy vấn cơ sở dữ liệu để lấy hoặc cập nhật dữ liệu.
  3. Giao Tiếp Với Các Dịch Vụ: Tương tác với các vi dịch vụ và API bên thứ ba nếu cần.
  4. Xử Lý Logic: Thực hiện các phép toán và quy trình theo yêu cầu của ứng dụng.
  5. Tạo Phản Hồi: Tạo phản hồi dựa trên kết quả xử lý và gửi lại cho giao diện người dùng.
  6. Quản Lý Tải: Sử dụng kỹ thuật như phân bổ tải và bộ nhớ đệm để xử lý nhiều yêu cầu đồng thời và tối ưu hóa hiệu suất.

Ví Dụ Đăng Nhập: Khi người dùng đăng nhập, backend xác thực thông tin, truy xuất dữ liệu người dùng, và gửi phản hồi về trạng thái đăng nhập thành công hoặc lỗi.

Backend đảm bảo các yêu cầu từ người dùng được xử lý hiệu quả và chính xác, giúp ứng dụng hoạt động trơn tru.

Tìm việc Backend mới nhất lương thưởng hấp dẫn

Công việc chính của Backend Developer

Lập trình viên Backend đảm nhận nhiều nhiệm vụ quan trọng để đảm bảo hoạt động trơn tru của các ứng dụng và hệ thống phần mềm từ phía máy chủ. Dưới đây là những nhiệm vụ chính của lập trình viên Backend:

1. Thiết kế và Xây dựng Cơ sở Dữ liệu

Lập trình viên Backend chịu trách nhiệm thiết kế và triển khai cấu trúc cơ sở dữ liệu của ứng dụng. Công việc này bao gồm việc tạo ra các bảng dữ liệu, xác định các mối quan hệ giữa các bảng, và viết các truy vấn SQL để thực hiện các thao tác như thêm, sửa, xóa và truy vấn dữ liệu. Một thiết kế cơ sở dữ liệu tốt không chỉ giúp tổ chức dữ liệu một cách hiệu quả mà còn đảm bảo rằng ứng dụng có thể mở rộng và duy trì được lâu dài.

2. Phát Triển và Quản Lý API

Lập trình viên Backend phát triển các API (Application Programming Interface) để cho phép giao tiếp giữa frontend và backend, cũng như với các dịch vụ và hệ thống khác. Các API này đóng vai trò quan trọng trong việc truyền dữ liệu giữa các thành phần của ứng dụng. Lập trình viên cần phải đảm bảo rằng các API được thiết kế hiệu quả, an toàn, và dễ sử dụng, đồng thời xử lý các yêu cầu và phản hồi một cách chính xác.

3. Xử Lý và Tối Ưu Hiệu Suất Hệ Thống

Đảm bảo rằng hệ thống hoạt động mượt mà và hiệu quả là một phần quan trọng trong công việc của lập trình viên Backend. Họ cần phải tối ưu hóa hiệu suất của hệ thống bằng cách cải thiện tốc độ xử lý dữ liệu, giảm thiểu thời gian phản hồi của ứng dụng, và giải quyết các vấn đề liên quan đến hiệu suất. Việc theo dõi và phân tích hiệu suất của hệ thống thông qua các công cụ phân tích giúp lập trình viên phát hiện và khắc phục các vấn đề tiềm ẩn.

4. Tích Hợp Các Dịch Vụ và Ứng Dụng Bên Ngoài

Lập trình viên Backend thường phải tích hợp các dịch vụ và ứng dụng bên ngoài vào hệ thống của mình. Ví dụ, họ có thể tích hợp các dịch vụ thanh toán trực tuyến, hệ thống gửi email, hoặc các API của bên thứ ba để mở rộng chức năng của ứng dụng. Việc tích hợp phải được thực hiện một cách an toàn và hiệu quả, đảm bảo rằng các dịch vụ bên ngoài hoạt động hòa hợp với hệ thống hiện tại.

5. Quản Lý và Đảm Bảo An Ninh Dữ Liệu

Bảo mật dữ liệu là một yếu tố cực kỳ quan trọng trong phát triển phần mềm. Lập trình viên Backend phải đảm bảo rằng dữ liệu của người dùng được bảo vệ an toàn khỏi các mối đe dọa như tấn công SQL Injection, tấn công Cross-Site Scripting (XSS), và các lỗ hổng bảo mật khác. Điều này bao gồm việc áp dụng các biện pháp bảo mật như mã hóa dữ liệu, xác thực người dùng, và giám sát các hoạt động nghi ngờ.

6. Kiểm Tra và Sửa Lỗi

Lập trình viên Backend thực hiện kiểm tra và sửa lỗi mã nguồn để đảm bảo rằng hệ thống hoạt động đúng như mong đợi. Họ cần phải phát hiện và khắc phục các lỗi và sự cố trong mã nguồn, đồng thời thực hiện các bài kiểm tra đơn vị, kiểm tra tích hợp, và kiểm tra hệ thống để đảm bảo rằng tất cả các thành phần của ứng dụng hoạt động hài hòa với nhau.

7. Bảo Trì và Cập Nhật Hệ Thống

Sau khi hệ thống được triển khai, lập trình viên Backend tiếp tục thực hiện các nhiệm vụ bảo trì và cập nhật để duy trì hiệu suất và độ ổn định của ứng dụng. Điều này bao gồm việc cập nhật mã nguồn để sửa lỗi, cải thiện chức năng, và tích hợp các công nghệ mới. Họ cũng cần phải theo dõi các vấn đề liên quan đến hiệu suất và bảo mật và thực hiện các biện pháp khắc phục kịp thời.

Bài viết liên quan: Mô tả công việc – Vị trí lập trình Backend

Công cụ cần biết để trở thành Backend Developer

Các công cụ chính mà lập trình viên Backend cần biết bao gồm các ngôn ngữ lập trình phía máy chủ và các framework hỗ trợ phát triển

Công cụ cần biết để trở thành Backend Developer
Công cụ cần biết để trở thành Backend Developer

Ngôn Ngữ Lập Trình Phía Máy Chủ

Để máy chủ, ứng dụng và cơ sở dữ liệu có thể giao tiếp với nhau, Backend Devs sẽ sử dụng ngôn ngữ phía máy chủ (server-side languages) như PHP,  Ruby, Python, Java, và .Net để xây dựng ứng dụng.

  • Python: Python là một ngôn ngữ lập trình mạnh mẽ và dễ học, nổi tiếng với tính linh hoạt và hiệu quả trong phát triển ứng dụng backend. Python hỗ trợ nhiều thư viện và công cụ giúp lập trình viên phát triển các ứng dụng web, xử lý dữ liệu, và triển khai các mô hình machine learning.
  • Java: Java là một ngôn ngữ lập trình phổ biến trong các ứng dụng doanh nghiệp nhờ vào tính ổn định và khả năng mở rộng. Java thường được sử dụng trong các hệ thống lớn, ứng dụng web, và dịch vụ web với sự hỗ trợ từ các thư viện và công cụ phong phú.
  • PHP: PHP là ngôn ngữ lập trình phía máy chủ được thiết kế đặc biệt cho phát triển web. Nó thường được sử dụng để xây dựng các trang web động và các hệ thống quản lý nội dung (CMS). PHP có thể hoạt động tốt với các cơ sở dữ liệu như MySQL và PostgreSQL.
  • Ruby: Ruby, cùng với framework Ruby on Rails, nổi tiếng với khả năng phát triển nhanh chóng các ứng dụng web. Ruby cung cấp một cú pháp sạch sẽ và dễ đọc, giúp lập trình viên dễ dàng viết mã và duy trì ứng dụng.
  • Node.js: Node.js là một môi trường chạy JavaScript trên phía máy chủ, giúp lập trình viên sử dụng JavaScript để phát triển cả frontend và backend. Nó cho phép xây dựng các ứng dụng web nhanh chóng với hiệu suất cao nhờ vào mô hình sự kiện không đồng bộ.

Những công cụ như MySQL, Oracle, and SQL Server được sử dụng để tìm kiếm, lưu trữ, hoặc thay đổi dữ liệu và phân phát chúng trở lại với người dùng trong frontend code.

Framework phổ biến cho Backend

Trong những bài tuyển dụng Backend Developer cũng thường yêu cầu bạn có kinh nghiệm về frameworks. Framework là các bộ công cụ và thư viện cung cấp cấu trúc và các công cụ hỗ trợ lập trình viên trong việc phát triển ứng dụng backend. Chúng giúp tăng tốc quá trình phát triển bằng cách cung cấp các giải pháp đã được kiểm nghiệm cho các vấn đề phổ biến. Dưới đây là một số framework phổ biến cho lập trình viên Backend:

  • Django: Django là một framework web cao cấp cho Python, nổi bật với tính năng bảo mật và khả năng mở rộng. Nó cung cấp các công cụ tích hợp sẵn cho quản lý cơ sở dữ liệu, xử lý các yêu cầu HTTP, và phát triển các giao diện quản lý.
  • Spring: Spring là một framework mạnh mẽ cho Java, được thiết kế để xây dựng các ứng dụng doanh nghiệp quy mô lớn. Spring hỗ trợ các tính năng như quản lý giao dịch, bảo mật, và tích hợp các dịch vụ web.
  • Laravel: Laravel là một framework PHP nổi tiếng với cú pháp thân thiện và các công cụ hỗ trợ phát triển mạnh mẽ. Nó cung cấp các tính năng như ORM (Eloquent), hệ thống xác thực, và hỗ trợ tạo API.
  • Ruby on Rails: Ruby on Rails, hoặc Rails, là một framework web cho Ruby, nổi bật với sự phát triển nhanh chóng và tính tiện lợi. Rails theo triết lý “Convention over Configuration,” giúp lập trình viên phát triển ứng dụng với ít cấu hình hơn và tốc độ cao.
  • Express.js: Express.js là một framework tối giản cho Node.js, được sử dụng để xây dựng các ứng dụng web và API. Express.js cung cấp một nền tảng linh hoạt và mạnh mẽ cho việc xử lý các yêu cầu HTTP và quản lý các tuyến đường.

Ngoài ta lập trình viên backend còn phải biết sử dụng các hần mềm kiểm soát như SVN, CVS hoặc Git; và hệ thống triển khai Linux.

Mặt khác, nếu bạn định hướng xa hơn với mong muốn trở thành một Full Stack Developer thì kiến thức về web serviceAPI cũng rất quan trọng. Ví dụ như REST và SOAP.

Cuối cùng, bạn có thể cân nhắc luyện thêm thuật toán (Algorithms) và Data structures để tăng tính cạnh tranh trên thị trường tuyển dụng.

Trông có vẻ vị trí này cần quá nhiều kiến thức và kỹ năng nhỉ? Bạn đừng hoảng, những thứ mình liệt kê phía trên bạn chỉ cần chọn 1 thứ trong mỗi mục và sử dụng thành thạo nó.

Backend Developer cần những kỹ năng gì?

Kiến thức về lập trình

  • Ngôn Ngữ Lập Trình: Backend Developers cần nắm vững ít nhất một ngôn ngữ lập trình backend như Java, Python, Ruby, PHP, C#, hoặc JavaScript (Node.js).
  • Frameworks: Sử dụng các framework giúp tăng tốc phát triển và đảm bảo mã nguồn dễ bảo trì. Ví dụ: Spring Boot (Java), Django (Python), Ruby on Rails (Ruby), Laravel (PHP), Express.js (Node.js).
  • Hệ Quản Trị Cơ Sở Dữ Liệu: Hiểu biết sâu về các hệ quản trị cơ sở dữ liệu quan hệ như MySQL, PostgreSQL, và Microsoft SQL Server. Kỹ năng viết các câu lệnh SQL để truy xuất, cập nhật, và quản lý dữ liệu là rất quan trọng.
  • RESTful APIs: Kỹ năng thiết kế và phát triển các API RESTful để các ứng dụng có thể giao tiếp với nhau qua HTTP.
  • SOAP: Đối với các ứng dụng yêu cầu tính năng SOAP, hiểu biết về cách tạo và tiêu thụ các web services SOAP cũng là một lợi thế.
  • Kiến trúc Microservices: Hiểu biết về thiết kế và triển khai kiến trúc microservices, giúp xây dựng các ứng dụng phân tán và dễ mở rộng. Ngoài ra, các dịch vụ serverless như AWS Lambda có thể giúp giảm bớt công việc quản lý server và tối ưu hóa chi phí.
  • Containerization: Kỹ năng sử dụng Docker và Kubernetes để triển khai và quản lý các ứng dụng trong môi trường container, giúp đảm bảo tính nhất quán và dễ dàng mở rộng.
  • CI/CD: Hiểu biết về tích hợp liên tục (CI) và triển khai liên tục (CD) với các công cụ như Jenkins, GitLab CI/CD, hoặc CircleCI để tự động hóa quá trình xây dựng và triển khai ứng dụng.

Các kỹ năng mềm

  • Phân Tích và Giải Quyết Vấn Đề: Khả năng phân tích các vấn đề phức tạp trong hệ thống và tìm ra giải pháp hiệu quả. Điều này bao gồm khả năng xác định nguyên nhân gốc rễ của sự cố và đưa ra các phương án sửa chữa.
  • Tư duy phản biện: Kỹ năng phân tích vấn đề và đưa ra các quyết định dựa trên dữ liệu và thông tin cụ thể. Tư duy phản biện giúp lập trình viên backend đánh giá các tùy chọn khác nhau và chọn giải pháp tối ưu.
  • Kỹ năng giao tiếp Khả năng giao tiếp hiệu quả với các thành viên trong nhóm phát triển, cũng như với các bên liên quan như quản lý dự án, thiết kế và khách hàng. Kỹ năng này giúp truyền đạt ý tưởng, yêu cầu và giải pháp một cách rõ ràng và dễ hiểu.
  • Làm việc nhóm Khả năng làm việc tốt trong môi trường nhóm và hợp tác với các bộ phận khác, chẳng hạn như frontend developers và QA testers, để đạt được mục tiêu chung của dự án.
  • Quản Lý Dự Án: Kỹ năng quản lý thời gian và tổ chức công việc để hoàn thành các nhiệm vụ đúng hạn, đồng thời giữ cho dự án trên đúng lộ trình và đáp ứng các yêu cầu về chất lượng.

Những kỹ năng này giúp một Backend Developer thực hiện hiệu quả các nhiệm vụ từ thiết kế hệ thống, phát triển và duy trì các ứng dụng, đến giải quyết các vấn đề kỹ thuật phức tạp và làm việc hiệu quả trong môi trường nhóm.

Mức lương và cơ hội việc làm cho vị trí Backend Developer

Mức lương của một Backend Developer có thể dao động tùy thuộc vào vị trí địa lý, kinh nghiệm làm việc, và kỹ năng chuyên môn. Tại Việt Nam, mức lương trung bình của một Backend Developer dao động từ 15 triệu đến 40 triệu đồng mỗi tháng, tùy thuộc vào cấp bậc và kinh nghiệm.

Trên thế giới, mức lương của một Backend Developer cao hơn nhiều. Theo báo cáo của Glassdoor, mức lương trung bình của một Backend Developer tại Mỹ là khoảng 85.000 USD mỗi năm. Tại các quốc gia châu Âu, mức lương có thể dao động từ 50.000 đến 70.000 EUR mỗi năm, tùy thuộc vào quốc gia và thành phố. Các vị trí cao cấp hoặc chuyên gia trong lĩnh vực này có thể đạt mức lương lên tới 120.000 USD mỗi năm hoặc hơn.

Cơ hội việc làm cho Backend Developer vẫn rất rộng mở. Với sự gia tăng nhanh chóng của công nghệ và nhu cầu ngày càng cao về các giải pháp phần mềm hiệu quả, các doanh nghiệp và tổ chức đều cần những lập trình viên backend tài năng để phát triển và duy trì các hệ thống của họ. Ngành này dự kiến sẽ tiếp tục phát triển và tạo ra nhiều cơ hội việc làm trong tương lai, đặc biệt là trong các lĩnh vực như công nghệ tài chính, y tế, và thương mại điện tử.

Tham khảo cơ hội nghề nghiệp IT tại TopDev!

Làm việc tại một Global Corp như thế nào – góc nhìn từ LINE Technology Vietnam

workspace

Trước làn sóng các tập đoàn toàn cầu không chỉ trong lĩnh vực công nghệ mà còn nhiều lĩnh vực khác ngày càng mở rộng chi nhánh tại Việt Nam, giờ đây làm việc tại công ty Global đang dần trở thành mục tiêu, mơ ước của nhiều kỹ sư. Vậy công ty Global có gì khác biệt? Thông qua góc nhìn từ LINE Technology Việt Nam, bài viết sẽ mang tới bức tranh tổng quát nhất về trải nghiệm tại một Global Corp.

Là trung tâm phát triển của LINE Corporation, LINE Technology Vietnam được thành lập với sứ mệnh hợp tác chặt chẽ cùng đội ngũ kỹ sư lành nghề toàn cầu, xây dựng và tối ưu hóa các ứng dụng và dịch vụ đa dạng dựa trên nền tảng cốt lõi của tập đoàn. Với thế mạnh gây dựng thành công thương hiệu cùng hệ sinh thái công nghệ lâu năm tại nhiều quốc gia trước đó như Nhật Bản, Hàn Quốc, Thái Lan, Đài Loan, Malaysia,…. LINE Technology Việt Nam luôn nỗ lực giữ gìn và phát huy mạnh mẽ vai trò của mình cũng như thu hút nhân tài đa quốc gia.

Với sứ mệnh “Closing the distance” và tầm nhìn “Life on LINE”, sản phẩm công nghệ của LINE mang con người, thông tin và dịch vụ đến gần nhau hơn. Khởi nguồn từ một ứng dụng gọi và nhắn tin, giờ đây LINE đã xây dựng thành công dựng hệ sinh thái lớn mạnh với hàng trăm triệu người dùng trên toàn thế giới. Ngoài ra, LINE đang tận dụng Fintech và AI để làm mờ ranh giới giữa trực tuyến và ngoại tuyến, tạo ra trải nghiệm mới và mang tính cá nhân hóa cao cho người dùng.

mission

Một sản phẩm hoàn hảo chỉ có thể được tạo ra trong môi trường tốt nhất, đảm bảo về cả thể chất lẫn tinh thần cho những kỹ sư tạo ra nó. Vì thế, LINE Technology Vietnam luôn tạo cơ hội cho thành viên được làm việc trong môi trường chuyên nghiệp, minh bạch thông tin và được thể hiện cá tính, quan điểm riêng. LINE luôn đảm bảo 100% văn hoá tôn trọng sự khác biệt giữa nhân viên và cấp trên trong công ty. Hằng năm, công ty tổ chức chương trình giao lưu cho nhân viên giữa các nước nhằm thúc đẩy trao đổi văn hoá, học hỏi lẫn nhau.

team

Về quy trình công việc, LINE Technology Vietnam xây dựng các hệ thống nội bộ chuẩn chỉnh, cam kết bảo mật thông tin và phát triển bền vững. Điều này giúp cho việc giao tiếp giữa các phòng ban, chi nhánh toàn cầu hiệu quả hơn, tiết kiệm thời gian và nâng cao năng suất. Việc áp dụng quy trình Agile trong phát triển phần mềm theo xu thế cũng được triển khai nhằm đảm bảo release sản phẩm đúng hạn và hiệu quả hơn.

LINE Technology Vietnam vừa đón diện mạo mới cho văn phòng kể từ năm 2021 Thuộc tầng 20 và 21 của toà nhà Capital Place, văn phòng mới nằm giữa trung tâm quận Ba Đình. Tầng 20 là không gian tiếp đón khách và diễn ra mọi sự kiện lớn nhỏ hay sinh hoạt giao lưu của nhân viên trong công ty. Trang thiết bị đa dạng từ bàn bi lắc, bi-a, bóng bàn, PS5 đến thư viện sách, quầy mini bar,… giúp thành viên lấy lại năng lượng và kết nối sau những giờ căng thẳng. Tầng 21 là khu làm việc, được trang bị ghế công thái học, bàn nâng hạ thông minh, màn hình chống cận. Ngoài ra, nhân viên mới gia nhập đều có quyền lựa chọn loại hình, cấu hình máy mà bản thân quen thuộc nhất.

office

office2

relax

Nhằm đảm bảo đời sống nhân viên, đồng thời giữ chân và thu hút nhân tài, LINE Technology Vietnam luôn trăn trở để mang đến chế độ đãi ngộ tốt nhất, mọi hoạt động đều hướng đến con người. Ngay cả trong quá trình thử việc, thành viên vẫn được tham gia gói khám sức khoẻ cao cấp, các khoá đào tạo kĩ năng cứng và kĩ năng mềm, nhận các chi phí hỗ trợ như di chuyển, tiền điện nếu phải làm việc tại nhà. LINE khuyến khích mọi nhân viên giao tiếp và kết nối với nhau nhiều hơn. Chính vì vậy mỗi người sẽ được nhận trợ cấp “Communication fee” để gặp gỡ, liên hoan hằng tháng.

event

Với xu hướng toàn cầu hoá hiện nay, làm việc tại Global Corp đối với người Việt không còn là trở ngại về thủ tục hay khoảng cách địa lý, mà chỉ cần tìm thấy điểm phù hợp về văn hoá, phong cách, hay trau dồi kĩ năng chuyên nghiệp.

 Còn chần chừ gì mà không thử thách bản thân trong môi trường quốc tế. Nếu bạn có cùng quan điểm và phong cách giống LINE Technology Vietnam, hãy truy cập https://vietnamdevcenter.linecorp.com/en/careers/?region=HN để tìm hiểu thêm về các cơ hội nghề nghiệp nhé!

Connect with us:

Facebook: https://www.facebook.com/LINETechnologyVietnam

LinkedIn: https://www.linkedin.com/company/linetechnologyvietnam/

YouTube: https://www.youtube.com/c/LINETechnologyVietnam

Podcast: http://sptfy.com/LINETechnologyVietnam

Chi tiết câu hỏi, xin gửi về email: dl_ltv_tateam@linecorp.com

Design Pattern series: Giới thiệu Singleton

Singleton là gì? Singleton pattern

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

Singleton là gì? Singleton là 1 trong 5 design pattern của nhóm khởi tạo (Creational Design Pattern). Vậy cấu trúc của Singleton ra sao và cách triển khai như thế nào, cùng mình tìm hiểu nội dung dưới đây.

Định nghĩa

Singleton is a creational design pattern that lets you ensure that a class has only one instance, while providing a global access point to this instance.

Dịch: Singleton là 1 mẫu design pattern thuộc nhóm khởi tạo cho phép bạn đảm bảo rằng 1 lớp sẽ chỉ có duy nhất 1 instance và nó cung cấp 1 method cho instance này ở bất cứ đâu trong chương trình.

Singleton giải quyết bài toán nào?

Singleton Pattern giải quyết 2 vấn đề dưới đây cùng 1 lúc:

  • Đảm bảo rằng 1 lớp (class) sẽ chỉ có 1 instance duy nhất: Sẽ có 1 số trường hợp mà bạn cần kiểm soát việc truy cập đến các tài nguyên dùng chung ví dụ như database hay 1 file nào đó; lúc này bạn cần kiểm soát được số lượng instance mà 1 class đó có.

Cách nó hoạt động sẽ như sau: Thử tưởng tượng rằng bạn đã tạo 1 object rồi, tuy nhiên sau đó bạn lại quyết định tạo thêm 1 object mới. Lúc này thay vì việc nhận được 1 object mới thì bạn sẽ nhận về object mà bạn tạo ra lúc trước.

Lưu ý rằng hành vi này không thể thực hiện với 1 phương thức khởi tạo thông thường (như sử dụng new), vì nó sẽ luôn trả về 1 object mới.

Ở đây khách hàng có thể không nhận ra rằng họ đang làm việc với cùng 1 đối tượng
  • Cung cấp 1 điểm truy cập global đến instance đó: Biến global (toàn cục) thường được sử dụng để lưu trữ 1 số đối tượng thiết yếu. Mặc dù nó rất là tiện dụng, nhưng chúng cũng rất không an toàn vì bất cứ đoạn code nào trong chương trình cũng có thể ghi đè nội dung của những biến đó khiến cho ứng dụng của chúng ta bị crash. Singleton cũng giống như biến toàn cục, nó cho phép bạn truy cập đến 1 số object ở bất kỳ đâu trong chương trình, tuy nhiên nó cũng bảo vệ instance đó tránh khỏi việc bị ghi đè bởi code khác.

Có 1 cách nhìn khác cho vấn đề này: bạn không muốn phần code giải quyết vấn đề #1 ở trên bị phân tán khắp nơi trong chương trình, source code của mình. Sẽ tốt hơn khi chúng được viết hết trong 1 class đặc biệt là nếu các phần code khác đã phụ thuộc vào nó.

Cách triển khai Singleton

Tất cả các triển khai (implementations) của Singleton đều sẽ gồm 2 bước chung sau:

  • Đặt phương thức khởi tạo mặc định (default constructor) là private để ngăn việc các đối tượng khác sử dụng toán tử new cho lớp Singleton
  • Tạo 1 phương thức khởi tạo static hoạt động như 1 khởi tạo (constructor), trong đó phương thức này sẽ gọi private constructor để tạo ra 1 object và lưu nó vào trường static (static field). Tất cả các lệnh gọi sau đến phương thức này đều trả về đối tượng được lưu trong cached.

Nếu code của bạn truy cập đến lớp Singleton, nó có thể gọi đến phương thức static của Singleton, và sẽ luôn luôn được trả về chung 1 object.

Ví dụ thực tế

Singleton có nhiều ví dụ thực tế:

  • 1 đất nước có thể chỉ có 1 chính phủ chính thức. Bất kể ai, cá nhân nào làm việc cho chính phủ thì danh xưng “Chính phủ” vẫn là 1 khái niệm chỉ định chung dùng để chỉ nhóm những người phụ trách. Chính phủ ở đây được xem như 1 ví dụ về Singleton.
  • Khi bạn muốn tăng giảm âm lượng của 1 chiếc điện thoại. Bất kể có gọi từ phần mềm thứ 3, hay thao tác trực tiếp trên phần cứng; thì việc tăng giảm âm lượng cũng đều được thực hiện thông qua 1 phần điều khiển hệ thống. Ta cũng xem lớp điều khiển âm lượng này là 1 singleton
  • Máy in cũng có thể xem là 1 singleton khi nó nhận yêu cầu và xử lý từ mọi người trong hệ thống.

Cấu trúc, cách triển khai Singleton

Lớp Singleton khai báo phương thức static getInstance trả về cùng 1 instance của nó.

Phương thức khởi tạo Singleton nên được ẩn khỏi code client, cách duy nhất để lấy đối tượng Singleton là gọi phương thức getInstance.

Triển khai Singleton Pattern code với TypeScript

/**
 * The Singleton class defines the `getInstance` method that lets clients access
 * the unique singleton instance.
 */
class Singleton {
    private static instance: Singleton;

    /**
     * The Singleton's constructor should always be private to prevent direct
     * construction calls with the `new` operator.
     */
    private constructor() { }

    /**
     * The static method that controls the access to the singleton instance.
     *
     * This implementation let you subclass the Singleton class while keeping
     * just one instance of each subclass around.
     */
    public static getInstance(): Singleton {
        if (!Singleton.instance) {
            Singleton.instance = new Singleton();
        }

        return Singleton.instance;
    }

    /**
     * Finally, any singleton should define some business logic, which can be
     * executed on its instance.
     */
    public someBusinessLogic() {
        // ...
    }
}

/**
 * The client code.
 */
function clientCode() {
    const s1 = Singleton.getInstance();
    const s2 = Singleton.getInstance();

    if (s1 === s2) {
        console.log('Singleton works, both variables contain the same instance.');
    } else {
        console.log('Singleton failed, variables contain different instances.');
    }
}

clientCode();
Nội dung trên đã phần nào giải đáp được thắc mắc Singleton là gì cũng như những ứng dụng thực tế của Singleton. Nếu bạn muốn góp ý đừng ngần ngại phản hồi với TopDev nhé. Chúc bạn code mau lên trình.
Bài viết gốc được đăng tải tại anywayblogs.com
Related post:

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

Game Developer là gì? Lộ trình trở thành Game Developer

Game Developer là gì? Lộ trình trở thành Game Developer

Game Developer là gì? Có phải Game Developer là lập trình viên game? Phải xây dựng lộ trình trở thành Game Developer như thế nào là tốt? Bài viết dưới đây sẽ lần lượt giải đáp những thắc mắc này.

1. Game Developer là gì?

Khi được hỏi Game Developer là gì? nhiều bạn hiểu lầm rằng Game Developer là lập trình viên game. Thực tế, Game Developer là khái niệm chỉ chung cho tất cả những người tham gia vào việc thiết kế một trò chơi. Ví dụ: lập trình viên, nhà thiết kế đồ họa 2D/3D, người quản lý dự án,… Trong phạm vi bài này, mình sẽ nói về Game Developer dưới vai trò là một lập trình viên.

Game Developer được xem là nhà phát triển phần mềm chuyên tạo ra game trên nhiều nền tảng máy tính hoặc điện thoại thông minh. Họ đóng vai trò là người chuyển đổi ý tưởng của những nhà thiết kế Game (Game Designer) thành trò chơi thực tế bằng công việc chính là coding. 

Mô tả Game Developer

Bên cạnh đó, nhà phát triển game còn làm những việc như lập trình phần mềm (software-programming), tạo hiệu ứng âm thanh (sound effects), thiết lập kỹ thuật (engineering), kết xuất (rendering), kiểm tra (test) và một số quy trình khác để duy trì sự vận hành của trò chơi.

Một nhà phát triển game có thể tập trung vào một khía cạnh cụ thể như lập trình trí tuệ nhân tạo hoặc cảnh quan ảo của trò chơi. Với nghề Game Developer bạn cũng có thể làm việc với tư cách là một freelancer.

Ứng tuyển ngay các vị trí tuyển dụng lập trình Game lương cao trên TopDev

2. Nhà phát triển game cần những kỹ năng nào?

2.1. Kỹ năng lập trình

Xét theo phương diện Game Developer là một lập trình game thì kỹ năng đầu tiên cần có là kỹ năng lập trình. Khả năng coding giỏi sẽ giúp nhà phát triển game hệ thống tất cả khái niệm, bản phác thảo và cốt truyện thành hàng nghìn dòng mã hóa để hiện thực hóa trò chơi và tung ra thị trường.

2.2. Khả năng tự học, cập nhật kiến thức

Phần mềm game là một trong những ngành nghề liên tục thay đổi. Cùng với đó, xu hướng chơi game thay đổi dẫn đến sự thay đổi của những trò chơi điện tử. Để theo kịp thị trường, Game Developer cần có khả năng tự học hỏi, liên tục cập nhật kiến thức về game.

2.3. Khả năng ngoại ngữ

Nếu bạn muốn làm việc trong một công ty nước ngoài thì khả năng giao tiếp tiếng anh là một kỹ năng không thế thiếu. Bạn không nhất thiết phải nói chuyện như người bản xứ nhưng ít ra bạn phải biết cách sử dụng nó để mọi người hiểu mình đang nói gì.

Nếu nói bạn không có ý định làm việc trong công ty nước ngoài nên bạn không cần ngoại ngữ. Thực tế, ít nhất bạn cũng phải đọc được tiếng anh để tìm hiểu tài liệu chứ.

2.4. Kỹ năng làm việc nhóm

Một kỹ năng quen thuộc nhưng mình không thể không nhắc đến. Để xây dựng một game thành công và nhanh chóng đòi hỏi có sự phối hợp ăn ý giữa những vị trí với nhau. Kỹ năng làm việc nhóm thể hiện bạn là một người biết lắng nghe và  thuyết phục đồng đội về những vấn đề xảy ra trong quá trình phát triển game.

2.5. Thích chơi game

Đây không hẳn là một kỹ năng nhưng khi bạn thích và đam mê game thì bạn mới có thể phát triển lâu dài trên con đường Game Developer đầy thử thách.

  Game Designer là gì? Mô tả công việc của nhà Thiết kế Game

3. Ngành lập trình game ở Việt Nam

Theo đánh giá của nhiều “người trong nghề”, hoạt động làm Game ở Việt Nam chủ yếu tập trung vào mobile, ít người quan tâm đến PC. Mặt khác, Game trên PC yêu cầu kinh phí cao và khó tiếp cận người dùng nên hầu hết các nhà đầu từ đều ngại bỏ vốn. Có thể nói lập trình game ở Việt Nam chưa thật sự tốt và phát triển vượt bậc như những ngành lập trình khác. 

Tuy nhiên, trong những năm tới sự ưa chuộng điện thoại, máy tính, máy tính bảng cũng như nhu cầu giải trí sẽ gia tăng khiến nghề lập trình game sẽ phát triển hơn. Do đó, nếu muốn đón đầu xu hướng trên con đường Game Developer bạn nên tìm hiểu kỹ và thật kiên trì để phát triển cùng với thị trường này.

4. Lộ trình trở thành Game Developer

4.1. Bắt đầu từ đâu?

Học Đại học

Nếu bạn chưa biết bắt đầu như thế nào hãy khởi điểm bằng những môn học cơ bản ở Trường Đại học. Mặc dù không phải lúc nào cũng cần bằng cấp nhưng bằng cấp có thể giúp bạn xây dựng những kỹ năng và kỹ thuật cơ bản để trở thành Game Developer.

Lộ trình trở thành Game Developer

Nhiều công ty phát triển game luôn tìm kiếm những ứng viên có bằng cử nhân về những ngành liên quan đến lập trình Game. Vậy Game Developer học ngành gì? Dưới đây là một vài ngành chủ yếu bạn có thể tham khảo:

  • Khoa học máy tính
  • Công nghệ thông tin
  • Kỹ thuật phần mềm

Câu hỏi đặt ra là “Không học đại học thì có làm lập trình game được không?”. Chắc chắn câu trả lời là có. Bạn hoàn toàn có thể tự học hoặc đăng ký những khóa học như bạn muốn. Tuy nhiên, sẽ khó khăn hơn rất nhiều nếu bạn không có đủ kiến thức nền tảng ở trường đại học.

Tập làm game và học Code

Hai yêu cầu bạn thường gặp trên bảng mô tả công việc đó là kinh nghiệm với công cụ phát triển game và khả năng lập trình (thường là C++ hoặc C#).

  • Unity: là một công cụ trò chơi đa nền tảng cho phép bạn phát triển các trò chơi 2D và 3D. Unity phổ biến đối với indie games (trò chơi độc lập) và mobile games. Đặc biệt công cụ này miễn phí cho nhân viên vì vậy bạn có thể bắt đầu tạo trò chơi và tích lũy kinh nghiệm trước khi đi làm.
  • Unreal Engine: một phần mềm dùng để phát triển trò chơi điện tử trên nhiều nền tảng từ PC đến các hệ máy console như PS4, Xbox One và Nintendo Switch. Unreal hỗ trợ hai ngôn ngữ lập trình là C++ và Python. 
  • C#: ngôn ngữ lập trình thường được sử dụng để phát triển trò chơi và các ứng dụng di động, đặc biệt là với công cụ Unity.
  • C++: một ngôn ngữ lập trình đa năng thường được sử dụng để phát triển không chỉ trò chơi mà còn cả hệ điều hành và ứng dụng.
  Lập trình game là gì? Lộ trình tự học lập trình game cho người chưa biết gì

4.2. Mẹo giúp bạn cạnh tranh hơn trong thị trường tuyển dụng Game Developer

  • Bắt đầu với những game nhỏ: để phát triển kỹ năng bước đầu bạn có thể thử tạo một hành vi trong game hoặc cơ chế chuyển động của bàn phím trong C#.
  • Tạo portfolio xịn: bạn đã xây dựng những dự án nào, học ngôn ngữ lập trình nào, C++ hay C#, hãy suy nghĩ và thêm nó vào mục kinh nghiệm của bạn.
  • Bắt đầu với tư cách là một QA tester: QA là người kiểm tra trò chơi một cách có hệ thống để tìm bất kỳ sai sót hoặc lỗi nào. Đây cũng là một khởi đầu tốt để bạn tích lũy kinh nghiệm.
  • Tham gia những sự kiện về Game: đây là những nơi bạn có thể gặp gỡ những Game Developer thực thụ và cả những công ty phát triển game. Tham dự sự kiện là cơ hội tốt để bạn làm quen, xây dựng mối quan hoặc đơn giản là tìm việc.

Đến đây bài đã khá dài rồi. Mong rằng những thông tin trên có ích trên con đường trở thành Game Developer của bạn hoặc chí ít bạn có thể hiểu Game Developer là gì. Chúc bạn thành công.

Tin tuyển dụng IT mới nhất trên TopDev, tìm việc ngay!

Một số mẹo cho việc phát triển ứng dụng hệ thống nhúng

mẹo phát triển hệ thống nhúng

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

Trong quá trình phát triển ứng dụng cho hệ thống nhúng, do sự hạn chế của thiết bị, đôi khi có những việc lắt nhắt làm tốn mớ thời gian. Sau đây mình liệt kê một số mẹo để đi tắt, giúp tiết kiệm thời gian cho công việc. Các hướng dẫn này chỉ dành cho hệ điều hành Linux (như Ubuntu).

1. Chia sẻ Internet từ laptop cho máy tính nhúng

Đây là tình huống mà bạn đang phát triển ứng dụng cho máy tính mini (NUC, Raspberry Pi, Beagle Bone…) và chủ yếu dùng mạng dây (chưa setup wifi hoặc máy đó không có card wifi). Đôi lúc bạn cần phải xách nó đi đâu đó (để trình diễn demo, để cài đặt lại chẳng hạn) mà chỗ đó không có router để cấp mạng, bạn có thể chia sẻ Internet từ laptop (laptop đang kết nối Internet qua wifi) cho nó. Để cho ngắn gọn, mình sẽ gọi máy tính nhúng là RPi trong bài này.

Nguyên lý của việc này là biến laptop của bạn thành một thiết bị router mạng đơn sơ, tạo một mạng con với RPi, do laptop của bạn quản lý.

Với Ubuntu 20.04+ thì việc này rất đơn giản. Sau khi dùng dây LAN nối giữa RPi với laptop, bạn chỉ việc mở phần mềm tên là “Settings”, tìm đến mục “Network”, bấm vào nút “chỉnh sửa” (có hình bánh răng) cho mạng dây (Wired):

Network Settings

Ở màn hình kế tiếp, chọn tab “IPv4” rồi chọn “Shared to other computers”.

share network

Sau khi lưu lại cấu hình này, bấm vào tab “Details”, bạn sẽ thấy địa chỉ IP của laptop trong mạng con mới tạo này. Thông thường là 10.42.0.1. Tuy nhiên, đó chỉ là địa chỉ của laptop, còn địa chỉ của RPi là gì, làm sao truy cập đến nó? Có các cách sau đây:

a) Dùng mDNS

Cách này áp dụng khi cả laptop và RPi của bạn đều đã cài đặt phần mềm avahi-daemon và bạn nhớ tên hostname của RPi. Khi đó địa chỉ của RPi sẽ có dạng [hostname].local, ví dụ raspberrypi.local. Thử ping vào địa chỉ đó, bạn sẽ thấy RPi trả lời:

$ ping raspberrypi.local
PING raspberrypi.local (10.42.0.95) 56(84) bytes of data.
64 bytes from 10.42.0.95 (10.42.0.95): icmp_seq=1 ttl=64 time=1.05 ms
64 bytes from 10.42.0.95 (10.42.0.95): icmp_seq=2 ttl=64 time=0.844 ms
64 bytes from 10.42.0.95 (10.42.0.95): icmp_seq=3 ttl=64 time=1.21 ms

Với mDNS thì thật ra bạn không cần dùng đến địa IP nữa, có thể dùng địa chỉ “*.local” này để truy cập bằng bất cứ phương thức nào, như SSH, FTP, HTTP:

ssh

b) Dùng nmap để quét

Nếu lỡ quên cài avahi-daemon cho RPi thì ta dùng nmap để quét trong mạng con:

$ sudo nmap -sn 10.42.0.0/24
[sudo] password for quan: 
Starting Nmap 7.80 ( https://nmap.org ) at 2020-08-06 12:15 +07
Nmap scan report for 10.42.0.95
Host is up (0.0011s latency).
MAC Address: B8:27:EB:D1:AB:91 (Raspberry Pi Foundation)
Nmap scan report for Fossa (10.42.0.1)
Host is up.
Nmap done: 256 IP addresses (2 hosts up) scanned in 3.89 seconds

Địa chỉ của mạng con được xác định bằng cách thay số cuối của địa chỉ laptop bằng số 0 rồi gắn thêm /24 vào, ví dụ 10.42.0.1 -> 10.42.0.0/24.

nmap không được cài sẵn trong Ubuntu, bạn phải cài bằng cách:

sudo apt install nmap

c) Xem trong danh sách địa chỉ IP đã cấp

Tìm trong thư mục /var/lib/NetworkManager/ (cần quyền sudo), coi có file nào có tên dạng dnsmasq-[ifname].leases, ví dụ, vì card mạng của tôi có tên enp2s0 nên sẽ có file dnsmasq-enp2s0.leases. Mở nội dung file đó sẽ thấy địa chỉ nào được cấp cho RPi:

$ sudo cat /var/lib/NetworkManager/dnsmasq-enp2s0.leases
1596695111 b8:27:eb:d1:ab:91 10.42.0.95 raspberrypi 01:b8:27:eb:d1:ab:91

Giải thích thêm, NetworkManager là chương trình quản lý mạng phổ biến trên hệ điều hành Linux dành cho desktop (và smartphone) (còn có các chương trình khác dành cho bối cảnh sử dụng khác). Khi dùng nó để tạo mạng con, nó sẽ gọi thêm một chương trình tên là dnsmasq lên để đảm nhiệm chức năng DHCP server và DNS server cho mạng con đó.

Với một số phiên bản Ubuntu cũ hơn (khoảng 18.10 đến 19.10), bạn sẽ không thấy lựa chọn “Shared to other computers”. Đó chỉ là thiếu sót của giao diện “Settings”, bạn vẫn có thể cấu hình chia sẻ mạng trong một ứng dụng khác, tên là “Advanced Network Configuration”. Ứng dụng này có thể tìm thấy trong màn hình Dash (ấn phím Super/Windows để mở). Với Ubuntu 19.04 và 19.10 thì ứng dụng này bị giấu khỏi Dash, bạn phải mở bằng dòng lệnh:

nm-connection-editor

Sau khi mở “Advanced Network Configuration”, bạn có thể chọn để sửa một cấu hình mạng dây đang có, tương tự với chương trình “Settings” phía trên.

nm-connection-editor

Mẹo nhỏ:

Để đưa “Advanced Network Configuration” trở lại màn hình Dash thì sửa file /usr/share/applications/nm-connection-editor.desktop và xóa dòng “NotShowIn=GNOME;” đi.

[Desktop Entry]
Name=Advanced Network Configuration
Comment=Manage and change your network connection settings
Icon=preferences-system-network
Exec=nm-connection-editor
Terminal=false
StartupNotify=true
Type=Application
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=NetworkManager
X-GNOME-Bugzilla-Component=nm-connection-editor
Categories=GNOME;GTK;Settings;X-GNOME-NetworkSettings;X-GNOME-Utilities;
NotShowIn=GNOME;  # <~~ Xóa dòng này, hoặc comment lại.
X-Ubuntu-Gettext-Domain=nm-applet

Xem embedded tuyển dụng đãi ngộ tốt trên TopDev

2. Tạo cổng serial ảo

Tình huống này có liên quan đến bài Áp dụng quy trình hiện đại khi làm phần mềm cho hệ thống nhúng. Đó là khi mình cần cho phần mềm server giao tiếp với một thiết bị kết nối qua cổng serial (bên Windows gọi là cổng COM). Như đã kể, trong khi phát triển ứng dụng IoT thì mình luôn viết phần mềm mô phỏng để thay mặt thiết bị, khi thiết bị chưa được chế tạo xong, chưa được viết code nhúng. Cả phần mềm server lẫn phần mềm mô phỏng cùng chạy trên PC mà lại cần giao tiếp qua cổng serial thì phải làm sao? Đó là lúc cần phải tạo một cổng serial ảo để phần mềm server nắm một đầu, phần mềm mô phỏng nắm một đầu. Phần mềm này ghi dữ liệu vào đầu này thì tại đầu kia, phần mềm kia sẽ đọc được.

Để tạo cổng serial ảo thì mình dùng socat. Cách tạo như sau:

Mở một tab của Terminal, gõ lệnh:

socat -d -d PTY,link=writer PTY,link=reader

Khi đó, socat sẽ tạo ra hai file, writer và reader. Hai tên này thích đặt sao cũng được, không nhất thiết phải là writer và reader.

Trong lúc vẫn giữ socat chạy, mở một tab khác của Terminal lên, chạy phần mềm mô phỏng, truyền tên của một trong hai file kia vào, giống với cách bạn truyền tên cổng serial thật vào, ví dụ:

./device-emulator writer

Và ở một Terminal khác thì bạn cấu hình cho phần mềm server truy cập vào file còn lại, thay cho cổng serial thật.

Lưu ý là tên file đặt là gì không quan trọng, nên tại đầu “reader” bạn vẫn có thể ghi, để đầu “writer” đọc được.

Bạn cũng có thể bỏ tham số “link” khỏi socat, ví dụ:

socat -d -d PTY PTY

Nhìn vào thông báo của socat để lấy tên file tương ứng với cổng serial ảo, ví dụ:

2017/10/06 17:09:49 socat[6828] N PTY is /dev/pts/5
2017/10/06 17:09:49 socat[6828] N PTY is /dev/pts/6
2017/10/06 17:09:49 socat[6828] N starting data transfer loop with FDs [5,5] and [7,7]

Tuy nhiên, đây là cách rất không được khuyến khích, vì mỗi lần tắt socat mở lại, socat sẽ phải tạo file mới với con số mới (để tránh đụng với các file pseudo-terminal sinh ra mỗi khi bạn mở một tab Terminal mới), ứng dụng của bạn sẽ phải cấu hình lại, nếu không sẽ vô tình ghi vào file pts của một Terminal nào đó.

Sau đây là minh họa:

Với cổng serial ảo tạo bởi socat, bạn có thể truy cập, theo dõi bằng hầu hết các phần mềm giao tiếp serial, ngoại trừ các phần mềm viết bằng Qt như CuteCom. Cụ thể, nếu cần phần mềm có giao diện đồ họa thì nên dùng GtkTerm:

gtkterm

Nếu thấy thoải mái với dòng lệnh thì bạn nên dùng thư viện PySerial của Python, khởi chạy công cụ dòng lệnh của nó bằng cách:

$ python3 -m serial.tools.miniterm /tên/port

PySerial cũng là thư viện đảm nhiệm tính năng truy cập serial trong các bộ công cụ lập trình nhúng sau:

  • IDF của Espressif (tương tác với ESP32/8266)
  • PlatformIO (tương tác với tất cả các loại board mà PlatformIO hỗ trợ).

(và tất nhiên, cùng với các thư viện Python khác, đã đóng góp phần rất lớn trong các sản phẩm của AgriConnect).

Trên đây mình đã kể xong hai mẹo. Không biết có tầm thường không, nhưng với mình thì nó đã tiết kiệm rất nhiều thời gian làm việc, và từ đó cũng thấy Linux có nhiều đồ chơi hay thật.

Bài viết gốc được đăng tải tại quan.hoabinh.vn

Xem thêm:

Đừng bỏ lỡ tin tuyển dụng IT mới nhất trên TopDev

Hybrid Work là gì? Mô Hình Work-life Balance

hybrid work là gì

Hybrid Work hiện đang là xu hướng làm việc được phát triển mạnh mẽ hậu Covid-19. Bạn có đang làm trong môi trường Hybrid Work? Bạn đã hiểu rõ Hybrid Work là gì? Bạn nghĩ tương lai của mô hình làm việc này sẽ tiếp tục mở rộng hay đi vào quên lãng khi đại dịch đã qua đi. Cùng TopDev tìm hiểu về xu hướng làm việc này nhé!

1. Hybrid Work là gì?

Hiểu theo cách đơn giản Hybrid Work là mô hình làm việc linh hoạt cho phép nhân viên vừa “làm việc tại văn phòng” và “làm việc từ xa” (có thể ở nhà hoặc một nơi nào đó). Hoặc có thể hiểu, văn phòng hybrid là nơi nhân viên sẽ có nhiều không gian tự do, thoải mái và linh động hơn để làm việc.

Không có một mô hình Hybrid Work phù hợp với tất cả các doanh nghiệp mà sẽ tùy vào tính chất công việc, nhu cầu của nhân viên và chính sách công ty sẽ có những biến thể Hybrid Work khác nhau. Một vài mô hình Hybrid Work có thể kể đến như:

  • Hybrid at-will: nhân viên có thể chọn ngày đến văn phòng theo ý muốn.
  • Hybrid split-week: nhân sự sẽ chỉ định những ngày cụ thể làm việc tại văn phòng hoặc làm việc từ xa theo team hoặc phòng ban.
  • Hybrid manager-scheduling: người quản lý sẽ chọn những ngày mà team họ có thể đến văn phòng.
  • Hybrid mix: có thể hợp cả ba mô hình trên.

hybrid working là gì

2. Lợi ích của mô hình làm việc kết hợp

2.1. Lợi ích đối với cá nhân

Cân bằng cuộc sống và công việc

Nhân viên có thể tìm thấy được sự cân bằng giữa cuộc sống cá nhân và công việc bằng sự chủ động quản lý thời gian dễ dàng. Họ có thể dành nhiều thời gian hơn cho nhiều lĩnh vực khác trong cuộc sống cá nhân. 

Lấy ví dụ, thay vì mỗi sáng họ đều phải tất bật sửa soạn để đến công ty đúng giờ thì họ có thể dành thời gian đó cho việc tập thể dục hay nấu ăn sáng.

Tăng năng suất và hiệu quả công việc

Từ việc cân bằng cuộc sống và công việc, mô hình làm việc kết hợp Hybrid Working giúp nhân viên cảm thấy tinh thần thoải mái, không gò bó. Nhờ vậy năng suất công việc tăng cao, hiệu quả đạt mức cao nhất.

Đã có nghiên cứu cho rằng, với khối lượng công việc là như nhau, khi nhân viên được lựa chọn không gian và thời gian làm việc phù hợp với bản thân mình, mọi công việc sẽ được giải quyết hiệu quả hơn với năng suất vượt mức tưởng tượng.

Tiết kiệm chi phí

Trung bình mỗi tháng, một nhân viên phải chi từ 200.000-500.000 đồng cho xăng xe đi lại. Tính đến một năm, con số này sẽ tăng lên rất nhiều lần. Do đó, dưới mô hình làm việc kết hợp, nhân viên có thể tiết kiệm một khoản tiền khá lớn bằng việc giảm chi phí di chuyển đến văn phòng.

2.2 Lợi ích đối với doanh nghiệp

Tiết kiệm chi phí cơ sở hạ tầng

Doanh nghiệp có thể giảm 30% chi phí thuê cơ sở hạ tầng, mua thiết bị và các chi phí điện nước hàng tháng. Điều này cho phép công ty tái đầu tư, sử dụng thêm chi phí vào các mục đích khác.

Thu hút người tài

Với Hybrid Working, công ty có thể tuyển dụng nhân tài từ khắp nơi, mang đến cho công ty một đội ngũ vô cùng hùng mạnh để sáng tạo và tạo nên những kỳ tích.

Hỗ trợ tăng nhận diện thương hiệu

Với một môi trường làm việc thoải mái, luôn tạo điều kiện làm việc tốt nhất cho nhân viên thì độ nhận diện thương hiệu của doanh nghiệp qua các bài tuyển dụng cũng tăng tính thu hút hơn.

3. Hybrid Working – xu hướng tất yếu trong tương lai

Nếu làm việc trực tiếp tại văn phòng mang đến trạng thái căng thẳng, làm việc từ xa toàn thời gian làm tinh thần làm việc của nhân viên đi xuống và uể oải thì Hybrid Work là phương án giải quyết cho cả hai vấn đề này.

Các công ty luôn tích cực tìm kiếm giải pháp cho vấn đề chuyển đổi kỹ thuật số hoặc vĩ mô hơn là bảo vệ môi trường. Điều này thúc đẩy các sáng kiến sao cho giảm bớt các chi phí về năng lượng. Hybrid Working góp một phần lớn để họ đạt được mục tiêu của mình. Chính vì vậy, mô hình làm việc kết hợp này chắc chắn sẽ là một xu hướng tuy mới mẻ nhưng tất yếu trong tương lai.

4. Hybrid Working trong doanh nghiệp Việt Nam

Theo báo cáo mới nhất của Microsoft về xu hướng “Làm việc kết hợp – Hybrid Workplace” tại Việt Nam, có đến 81% người lao động muốn tiếp tục làm việc từ xa, đặc biệt là nhóm lao động trẻ Gen Z.

Để trung hòa nhu cầu làm việc từ xa của nhân viên mà vẫn duy trì văn hóa doanh nghiệp, ngày càng nhiều công ty tại Việt Nam áp dụng mô hình Hybrid Work trong đó có Vulcan Labs – một công ty công nghệ chuyên sản xuất mobile app.

vulcanlabs workspace

Vulcan Labs đã áp dụng mô hình Hybrid split-week, tức nhân sự sẽ sắp xếp thời gian làm việc luân phiên giữa các phòng ban.

Cụ thể, nhân viên tại Vulcan Labs sẽ có 2 ngày làm việc từ xa và 3 ngày làm việc tại văn phòng. Tuy nhiên, dựa theo tính chất công việc và nhu cầu cá nhân mà công ty có thể sắp xếp lịch trình phù hợp.

thời gian làm việc

Nếu bạn đang tìm kiếm một môi trường làm việc thoải mái, chủ động quản lý thời gian của bản thân, hãy thử tìm hiểu Vulcan Labs. Những vị trí như Performance Marketing (Growth Hacker), Android Developer, iOS Developer hoặc Senior UI/UX Designer với mức offer lên đến 2500$ có thể sẽ phù hợp với bạn.

việc làm hybrid work tại Vuncan Labs

Tìm hiểu Vulcan Labs thì vào đây nhé! Tất cả những gì mà Vulcan Labs muốn cho sinh nhật lần thứ 5 trong tháng Sáu này là chiếc CV của bạn đấy.

Đây là những thông tin mà mình muốn chia sẻ với các bạn. Hy vọng có thể giúp bạn hiểu đúng về Hybrid Work là gì và tìm được một công việc tốt trong một môi trường làm việc phù hợp.


Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

Xem thêm:

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

Hỏi đáp về việc tăng lương tối thiểu vùng

Hỏi đáp về việc tăng lương tối thiểu vùng 2022

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

Phó Thủ tướng Thường trực Phạm Bình Minh vừa ký Nghị định số 38/2022/NĐ-CP ngày 12/6/2022 quy định mức lương tối thiểu đối với người lao động làm việc theo hợp đồng lao động.

Hỏi đáp về việc tăng lương tối thiểu vùng 2022

Chào mừng các bạn đang đến với series Hỏi đáp Nghề Nhân sự cho người mới (newbie) hoàn toàn miễn phí. Tôi là Thành HR sẽ đồng hành cùng bạn trong khoá học này. Và chủ đề mà chúng ta cùng nhau tìm hiểu ngày hôm nay là Hỏi đáp về việc tăng lương tối thiểu vùng năm 2022.

Với những bạn đang học chuyên nghành Nhân sự, Quản trị nguồn nhân lực, hoặc các bạn đang mới tìm hiểu về công việc C&B có thể sẽ có những băn khoăn thế nào là mức lương tối thiểu vùng, cách áp dụng ra sao? Vậy thì bài học này sẽ giúp các bạn làm rõ thêm một số thông tin.

Thông tin tăng lương tối thiểu vùng từ 1/7/2022 đã chính thức chưa?

Phó Thủ tướng Thường trực Phạm Bình Minh vừa ký Nghị định số 38/2022/NĐ-CP ngày 12/6/2022 quy định mức lương tối thiểu đối với người lao động làm việc theo hợp đồng lao động.

Tức là tới thời điểm này, việc tăng lương tối thiểu vùng đã được thông qua và chính thức có hiệu lực từ ngày 1/7/2022.

Đối tượng áp dụng bao gồm những ai?

Mức lương tối thiểu vùng áp dụng đối với các đối tượng sau:

– Người lao động làm việc theo hợp đồng lao động theo quy định của Bộ luật Lao động;

– Người sử dụng lao động theo quy định của Bộ luật Lao động gồm: Doanh nghiệp theo quy định của Luật Doanh nghiệp; cơ quan, tổ chức, hợp tác xã, hộ gia đình, cá nhân có thuê mướn, sử dụng người lao động làm việc cho mình theo thỏa thuận.

– Các cơ quan, tổ chức, cá nhân khác có liên quan đến việc thực hiện mức lương tối thiểu quy định tại Nghị định này.

Mức tăng lương tối thiểu vùng từ 1/7/2022 là bao nhiêu?

Về mức lương tối thiểu tháng, Nghị định quy định các mức lương tối thiểu tháng theo 4 vùng:

– Vùng I tăng 260.000 đồng, từ 4.420.000 đồng/tháng lên 4.680.000 đồng/tháng.

– Vùng II tăng 240.000 đồng, từ 3.920.000 đồng/tháng lên 4.160.000 đồng/tháng.

– Vùng III tăng 210.000 đồng từ 3.430.000 đồng/tháng lên 3.640.000 đồng/tháng.

– Vùng IV tăng 180.000 đồng từ 3.070.000 đồng/tháng lên 3.250.000 đồng/tháng.

Vậy có thể thấy mức tăng nằm trong khoảng 180k đến 260k tuỳ theo vùng, khoảng 6%. Mức lương tối thiểu vùng gần nhất là vào tháng 1 năm 2020.

Mức tăng lương này chưa bao gồm +7% cho các đối tượng Người lao động đã qua đào tạo, mình sẽ làm rõ thêm vào một bài học khác.

Tính chính xác lương thực nhận với công cụ tính lương gross sang net của TopDev

Mức tăng lương tối thiểu vùng theo giờ là như thế nào?

Mức lương tối thiểu giờ là quy định mới dành cho nhóm lao động làm những công việc linh hoạt, bán thời gian…Ngoài lương tối thiểu vùng theo tháng, một điểm mới trong dự thảo này là lần đầu tiên đề xuất lương tối thiểu giờ theo 4 vùng:

– Vùng I là 22.500 đồng/giờ,

– Vùng II là 20.000 đồng/giờ

– Vùng III là 17.500 đồng/giờ

– Vùng IV  là 15.600 đồng/giờ.

Mức lương tối thiểu vùng theo giờ là một khái niệm mới, nên sẽ chờ thêm các nghị định hoặc thông tin hướng dẫn chi tiết, mình sẽ bổ sung thêm cho các bạn vào bài học sau này.

luong khoi diem

Về địa bàn phân vùng có thay đổi gì không?

Ngoài đề xuất thêm mức lương tối thiểu theo giờ, dự thảo còn đề xuất thay đổi địa bàn thuộc các vùng áp dụng mức lương tối thiểu vùng. (Thông tin chưa chính thức, sẽ update lại)

– Điều chỉnh từ vùng 2 lên vùng 1 đối với: Thành phố Hạ Long thuộc tỉnh Quảng Ninh, huyện Xuân Lộc thuộc tỉnh Đồng Nai.

– Điều chỉnh từ vùng 3 lên vùng 2 đối với: các thị xã Quảng Yên, Đông Triều thuộc tỉnh Quảng Ninh; thành phố Hoà Bình và huyện Lương Sơn thuộc tỉnh Hòa Bình; thành phố Vinh, thị xã Cửa Lò và các huyện Nghi Lộc, Hưng Nguyên thuộc tỉnh Nghệ An; thị xã Hòa Thành thuộc tỉnh Tây Ninh; thành phố Bạc Liêu thuộc tỉnh Bạc Liêu; thành phố Vĩnh Long, thị xã Bình Minh thuộc tỉnh Vĩnh Long.

– Điều chỉnh từ vùng 4 lên vùng 3 đối với: các huyện Vân Đồn, Hải Hà, Đầm Hà, Tiên Yên thuộc tỉnh Quảng Ninh; các huyện Quỳnh Lưu, Yên Thành, Diễn Châu, Đô Lương, Nam Đàn, Nghĩa Đàn và các thị xã Thái Hòa, Hoàng Mai thuộc tỉnh Nghệ An; huyện Hòa Bình thuộc tỉnh Bạc Liêu; huyện Mang Thít thuộc tỉnh Vĩnh Long.

=> Như vậy, những lao động ở các khu vực được điều chỉnh địa bàn phân vùng này sẽ được hưởng mức tăng lương cơ bản cao hơn vì vừa được tăng theo chính sách chung, vừa được tăng do thay đổi phân vùng.

  Tìm hiểu hệ thống lương 3P
  Tài liệu hay cho người làm đào tạo tại doanh nghiệp

Mức lương tối thiểu vùng là gì?

Mức lương tối thiểu là mức lương thấp nhất mà người sử dụng lao động phải trả cho người lao động làm công việc giản đơn nhất trong điều kiện lao động bình thường để đảm bảo nhu cầu sống tối thiểu của người lao động và gia đình họ.

Mức lương tối thiểu theo vùng được Chính phủ quy định dựa trên cơ sở khuyến nghị của Hội đồng tiền lương quốc gia. Mức lương tối thiểu theo vùng này được thay đổi hàng năm để phù hợp với nhu cầu sống tối thiểu của người lao động và gia đình họ.

Mức lương tối thiểu vùng theo tháng và theo giờ là như thế nào?

Nghị định cũng nêu rõ mức lương tối thiểu tháng: là mức lương thấp nhất làm cơ sở để thỏa thuận và trả lương đối với người lao động áp dụng hình thức trả lương theo tháng, bảo đảm mức lương theo công việc hoặc chức danh của người lao động làm việc đủ thời giờ làm việc bình thường trong tháng và hoàn thành định mức lao động hoặc công việc đã thỏa thuận không được thấp hơn mức lương tối thiểu tháng.

Mức lương tối thiểu giờ: là mức lương thấp nhất làm cơ sở để thỏa thuận và trả lương đối với người lao động áp dụng hình thức trả lương theo giờ, bảo đảm mức lương theo công việc hoặc chức danh của người lao động làm việc trong một giờ và hoàn thành định mức lao động hoặc công việc đã thỏa thuận không được thấp hơn mức lương tối thiểu giờ.

Đối với người lao động áp dụng hình thức trả lương theo tuần hoặc theo ngày hoặc theo sản phẩm hoặc lương khoán: thì mức lương của các hình thức trả lương này nếu quy đổi theo tháng hoặc theo giờ không được thấp hơn mức lương tối thiểu tháng hoặc mức lương tối thiểu giờ.

Nội dung bài học tiếp theo

Trong bài học tiếp theo, mình sẽ cùng nhau làm rõ sự khác nhau giữa lương tối thiểu vùng và mức lương cơ sở, lương cơ bản; Ai sẽ được tăng lương từ việc điều chỉnh lương tối thiểu vùng này, có phải tất cả mọi người đều được tăng lương; Công ty cần chuẩn bị gì cho việc thay đổi mức lương tối thiểu vùng này…Các bạn nhớ đón xem nhé!

Trên đây là một số nội dung chính liên quan đến Hỏi đáp về việc tăng lương tối thiểu vùng 2022. Mặc dù đã cố gắng kiểm tra kỹ nội dung cung cấp, tuy nhiên vẫn có thể có những sai sót nhỏ ngoài mong muốn, bạn có thể để lại phản hồi hoặc câu hỏi vào comment bên dưới để mình ghi nhận và giải đáp cho các bạn nhé! Trân trọng!

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

Bài viết liên quan:

Đừng bỏ lỡ việc làm IT hấp dẫn trên TopDev!

Public Cloud không còn chỗ đứng và sẽ dần biến mất?

Thời gian gần đây điện toán đám mây phát triển và mở rộng không ngừng, đáng chú ý nhất phải kể đến sự trỗi dậy của Hybrid Cloud đã khiến Public Cloud rơi vào thế “bí” và không còn được “cưng chiều” như trước. Phải chăng, Public Cloud đang đối mặt với nguy cơ phải nhường chỗ đứng cho các dịch vụ mới? 

Có thể thấy rõ từ năm 2020, đặc biệt là trong giai đoạn COVID bùng phát khắp mọi nơi, trải dài từ Á sang  Âu, Phi, Mỹ và Châu Đại Dương, điện toán đám mây được dịp phát triển chưa từng thấy trong lịch sử. Các doanh nghiệp buộc phải thay đổi để thích nghi với đại dịch bằng cách đẩy mạnh chuyển đổi số. Tức là áp dụng các công nghệ mới như dữ liệu lớn (Big Data), Internet cho vạn vật (IoT), điện toán đám mây (Cloud)… nhằm giảm chi phí vận hành, tiếp cận được nhiều khách hàng hơn, tối ưu hóa năng suất làm việc, thay đổi quy trình làm việc, xây dựng văn hóa công ty…. Trong đó, điện toán đám mây (Cloud Computing) được các chuyên gia đánh giá là đóng vai trò rất quan trọng trong việc đối phó với COVID-19.

Public Cloud dần dần mất vị thế trên thị trường? 

Cloud Computing là việc cung cấp tài nguyên phù hợp với nhu cầu người dùng thông qua Internet. Nguồn tài nguyên này bao gồm rất nhiều thứ có liên quan đến điện toán và máy tính như máy chủ, lưu trữ, phần cứng, phần mềm…. nằm tại các máy chủ ảo (đám mây) trên mạng.

Theo mục đích quản lý, người ta chia Cloud Computing ra làm 4 mô hình: Public Cloud (đám mây công cộng), Private Cloud (đám mây riêng – đám mây doanh nghiệp), Hybrid Cloud (mô hình kết hợp giữa Public Cloud + Private Cloud) và Community Cloud (đám mây cộng đồng). Còn chia theo mục đích sử dụng, Cloud Computing gồm Distributed Cloud, Serverless Computing, Multi-Cloud, Edge Computing….. 

MoTaCloudComputing

Điều đáng nói là gần đây vị thế của Public Cloud dường như đang bị đe dọa. Trong năm 2021, có tới 87% doanh nghiệp đã áp dụng Hybrid Cloud – đứa con lai giữa Public Cloud và Private Cloud bởi khả năng mở rộng cao &  triển khai nhanh chóng, tính an toàn bảo mật và chi phí tương đối phù hợp. 

sự bùng nổ của hybrid cloud
Bên cạnh Hybrid Cloud, năm 2021 cũng chứng kiến sự phát triển vượt bậc của giải pháp phân tán đám mây: Distributed Cloud, Serverless Computing, Platform as a Service và Multi-Cloud nhờ tính linh hoạt, hiệu suất hoạt động cao & khả năng khôi phục tốt hơn. Theo đó có đến 93% tổ chức áp dụng chiến lược Multi-Cloud, Serverless Computing bắt đầu được doanh nghiệp biết đến và dự kiến loại hình này sẽ tăng khoảng 25% trong năm 2025. 

Ngoài ra thì Trí tuệ nhân tạo AI, Edge Computing được dự báo sẽ là xu hướng của tương lai khi Edge Computing là nền tảng của công nghệ Internet vạn vật (IoT) được ứng dụng trong các thành phần nhận dạng khuôn mặt, chấm công thông minh, chuông cửa từ xa, công tắc đèn thông minh, hệ thống kiểm soát nhiệt độ….

Một số xu hướng nêu trên đã chứng tỏ Public Cloud đang có nguy cơ bị đe dọa từ chính những người anh em của mình. 

Nhưng liệu Public Cloud có dễ dàng bị “lép vế”? 

Mặc dù Hybrid Cloud đang vươn lên làm lu mờ Public Cloud nhưng chúng ta có thể chắc chắn một điều rằng đám mây công cộng không dễ dàng để đám mây riêng qua mặt. Hơn nữa, dựa vào những ưu điểm vượt trội cùng số lượng người dùng ổn định, Public Cloud một lần nữa chứng tỏ vị thế hàng đầu trên thị trường điện toán đám mây: 

– Doanh thu: Năm 2019, thị trường Public Cloud toàn cầu đạt doanh thu 258 tỷ đô (năm 2018 chỉ đạt 154 tỷ đô); năm 2020 vươn lên 257,5 tỷ USD; năm 2021 tăng mạnh mẽ tới con số 304,9 tỷ USD. 

– Tính đến hết 2020, 31% doanh nghiệp phụ thuộc vào Public Cloud trong khi đó Hybrid Cloud chiếm vị trí thứ hai với 28%. 

public cloud

 – Và những ưu điểm nổi bật không thể thay thế của Public Cloud: 

  • Triển khai nhanh chóng: Có thể triển khai ngay chỉ trong vòng vài giờ đồng hồ. Tùy từng dịch vụ, có loại chưa đến vài phút. 
  • Không cần bảo trì: Nhà cung cấp sẽ vận hành và duy trì dịch vụ nên người dùng không phải can thiệp. 
  • Khả năng mở rộng lớn và linh hoạt: Khả năng mở rộng gần như không giới hạn, nhà cung cấp dịch vụ sẽ tư vấn giải pháp phù hợp với nhu cầu kinh doanh của khách hàng.
  • Chi phí sử dụng thấp: Sử dụng Public Cloud giúp doanh nghiệp tối ưu chi phí đầu tư cho công nghệ thông tin. Điều này có nghĩa là doanh nghiệp không mất nhiều tiền để chi cho những thiết bị phần cứng, máy chủ được ảo hóa….. 

Ngoài ra nếu doanh nghiệp có thể tùy chọn các thông số hay cấu hình cần thiết và chỉ trả phí khi cho phần đã sử dụng. 

Qua đây chúng ta có thể thấy rõ một điều: So với Hybrid Cloud, Private Cloud, Community Cloud hay các giải pháp đám mây khác đang nỗ lực vươn lên thị trường thì Public Cloud cũng không dễ dàng bị “lép vế”. Trong quá khứ, hiện tại, tương lai, đám mây công cộng vẫn luôn TỒN TẠI và là lựa chọn tối ưu dành cho mọi loại hình doanh nghiệp và khách hàng cá nhân.  

KDATA – Nhà cung cấp Public Cloud hàng đầu tại Việt Nam 

Gắn bó với lĩnh vực điện toán đám mây công cộng Public Cloud đã hơn 10 năm có lẻ, KDATA hiện đang là một trong số các nhà cung cấp Hosting, Cloud Server, cho thuê máy chủ, chỗ đặt máy chủ, CDN, Object Storage… uy tín và chất lượng nhất tại thị trường Việt Nam. 

KDATA hiện đang sở hữu 3+ trung tâm dữ liệu, 600+ máy chủ, hỗ trợ 500+ khách hàng hoạt động liên tục nhằm mang tới chất lượng các dịch vụ với cấu hình mạnh mẽ, ổn định, an toàn, bảo mật, tiện lợi, dễ sử dụng…. 

Dịch vụ Cloud Server

cloud server

Cho phép khách hàng khởi tạo theo nhu cầu hàng loạt các tài nguyên máy chủ ảo bao gồm bộ vi xử lý trung tâm (CPU), bộ nhớ tạm thời (RAM), dung lượng lưu trữ (Storage) và hệ thống mạng (Networks) mà không cần phải đầu tư thiết bị phần cứng tại trung tâm dữ liệu (Data Center) với đặc điểm: 

+ Tính linh hoạt cao: Hoạt động trên 2 cơ chế tính tiền theo giờ và tính tiền theo chu kỳ dài trên cùng một tài khoản.

+ Hạ tầng mạnh mẽ: Hệ thống được đặt tại Data Center đạt chuẩn Tier 3 Quốc tế của Viettel, VNPT. Dịch vụ sử dụng riêng hệ thống kết nối cáp ổn định, băng thông cao lên tới 100Gbps, đảm bảo cam kết chất lượng (SLA) 99,99% uptime.

Dịch vụ Hosting:

Cung cấp 5 dịch vụ chính là Linux Hosting, Windows Hosting, SEO Hosting, WordPress Hosting và Hosting giá rẻ với mức chi phí phù hợp với nhiều đối tượng khách hàng từ cá nhân đến doanh nghiệp. 

Dịch vụ Hosting

Dịch vụ cho thuê máy chủ:

Dịch vụ cho thuê máy chủ vật lý riêng (Dedicated Server) theo cấu hình yêu cầu với hệ thống máy chủ hiện đại từ Dell, IBM, Supermicro… được đặt tại các Datacenter lớn như VNPT, Viettel, FPT.

Dịch vụ cho thuê chỗ đặt máy chủ:

Dịch vụ cho thuê chỗ đặt máy chủ mang đến cho khách hàng không gian chỗ đặt máy chủ (Co-Location) lý tưởng, mà trong đó bạn được toàn quyền sử dụng và quản lý với các công cụ quản lý thông minh nhất.

Dịch vụ cho thuê chỗ đặt máy chủ

Ngoài ra công ty còn cung cấp thêm các dịch vụ như VPS, Cloud VPS, VPS giá rẻ, CDN, Domain, Object Storage, Email doanh nghiệp… với mức giá rất cạnh tranh, đảm bảo chất lượng tuyệt đối. 

Không những cam kết về chất lượng, giá cả mà KDATA còn đặc biệt quan tâm đến dịch vụ chăm sóc và hỗ trợ người dùng. Đội ngũ nhân viên kỹ thuật trẻ, am hiểu kiến thức chuyên môn sẵn sàng support, tư vấn cho khách hàng liên tục 24/7 kể cả ngày nghỉ lễ nhằm giúp khách hàng có những trải nghiệm dịch vụ Public Cloud tốt nhất cùng KDATA. 

Chương trình khuyến mại tháng 6 của KDATA

Chương trình khuyến mại tháng 6 của KDATA 

Hân hạnh đồng hành cùng sự kiện công nghệ di động lớn Việt Nam “Vietnam Mobile Day” với tư cách là Nhà tài trợ Bạc, KDATA hi vọng cộng đồng sẽ nắm bắt những thông tin, xu hướng mới và trang bị cho mình đầy đủ kiến thức để có thể nâng cao sức cạnh tranh trong thị trường mobile.

Xem thêm thông tin về công ty KDATA: tại đây

Tìm việc làm dành riêng cho IT mới nhất tại TopDev

Bí Kíp Pass Phỏng Vấn Coding Amazon, Apple, Facebook, Microsoft Mà Không Cần Leet Code Quá Nhiều

phong van coding

Bài viết được sự cho phép của tác giả Trần Thiện Khiêm

Hôm nay mình sẽ chia sẻ cho các bạn cách vượt qua vòng phỏng vấn của Amazon, Apple, Facebook và Microsoft mà không cần leet code quá nhiều. (không có nghĩa là không leetcode tí nào nha). Cách giải quyết vấn đề này các bạn cũng có thể áp dụng trong công việc của mình.

GIỚI THIỆU

Trong một lần đi phỏng vấn dạo, Mình pass phỏng vấn Amazon vào năm 2019 tại Singapore. Đầu năm, mình cũng đi phỏng vấn dạo tiếp, và cuối cùng mình đã pass 3 công ty cùng 1 lúc: Microsoft, Facebook và Apple, cho vị trí senior developer. Mình không chuẩn bị gì nhiều vì nghĩ chỉ đi phỏng vấn để tìm hiểu thị trường, nhưng sau khi có offer thì mình đã nghỉ Amazon.

CẤU TRÚC BUỔI PHỎNG VẤN

Amazon, Microsoft, Facebook, Apple đều có cấu trúc phỏng vấn khá giống nhau, tuy lịch trình sẽ khác nhau một xíu và mình sẽ chia sẻ một dịp khác. Nhưng hầu hết đều tập trung vào 3 khía cạnh: Coding (tương tự các bài trên leet-code), Design (Product Design, OOP), và phỏng vấn hành vi (behavioral interview). Trong phạm vi bài này, mình chỉ chia sẻ về bí kíp thế nào để vượt qua vòng phỏng vấn coding.

Để dễ hình dung, mình sẽ lấy một ví dụ sau đây:

Cho một chuỗi kí tự, hãy đảo ngược các từ trong chuỗi kí tự đó (các từ cách nhau đúng 1 khoảng trống và không có khoảng trống dư thừa).

Ví dụ: “the sky is blue” ==> “blue is sky the”

Có thể xử lí ngay trên chuỗi mà không cần thêm bộ nhớ hay không.

BƯỚC 1: XÁC ĐỊNH RÕ YÊU CẦU

Nếu mình chưa xác định rõ yêu cầu, hãy hỏi lại thật kỹ. Hỏi thêm về các yêu cầu của bài toán, giới hạn của input/output nếu chưa được nêu rõ trong đề. Nếu mình có bất cứ điều gì mà mình giả định (assume), hãy hỏi lại để chắc chắn. Thời gian trong buổi phỏng vấn rất quý báu và mình sẽ không muốn đi sai hướng.

Trong suốt quá trình phỏng vấn, mình cứ đặt câu hỏi khi nào mình không rõ.

Ví dụ trong bài này, nếu bạn chọn ngôn ngữ là Java, thì String là kiểu immutable (không sửa được), nên bạn có thể hỏi lại sử dụng dãy kí tự char[] để thay thế được hay không, v.v…

BƯỚC 2: NẾU BẠN CÓ NGAY 1 LỜI GIẢI (CHƯA TỐI ƯU), HÃY TRÌNH BÀY

Nếu mình có ngay một lời giải ở trong đầu (kiểu brute-force), thử-sai,… và mình biết là nó chưa phải là tối ưu nhất, hãy trình bày ngay dù cho lời giải này sẽ không được chấp nhận.

Ví dụ bài này, mình có thể nói ngay: “nếu có thể dùng thêm bộ nhớ, thì mình có thể cắt chuỗi thành từng từ, sau đó ghép lại”.

Việc nghĩ ra một giải pháp tạm thời cũng là một điểm lợi thế trong buổi phỏng vấn coding. Giám khảo sẽ biết được mình có khả năng làm được bài này, dù không tối ưu.

Sau đó mình sẽ nói, “để mình nghĩ về phương án tối ưu hơn”.

BƯỚC 3: THỬ NHIỀU Ý TƯỞNG KHÁC NHAU

Đừng nên im lặng trong bất cứ thời điểm nào của cuộc phỏng vấn, hãy nói to những suy nghĩ của mình cho người phỏng vấn biết. Giải thích quá trình suy nghĩ của mình, từng bước một.

Ví dụ, với bài này mình có thể nói:

* Đối với bài này mình có thể lưu các từ trong một mảng tạm rồi đổi vị trí từ trái sang phải….

* Bởi vì bài toán yêu cầu không dùng thêm bộ nhớ, mình có thể bắt đầu bằng việc đảo các ký tự từ trái sang phải…

Tuỳ thuộc vào từng câu hỏi mà mình sẽ có những ý tưởng ban đầu, ví dụ dạng toán, cấu trúc dữ liệu cần sử dụng, có xài quy hoạch động không, có phải là dạng bài đồ thị không…. hãy nói tất cả những suy nghĩ và phán đoán của mình cho người phỏng vấn.

Điều này rất quan trọng, vì khi mình nói ra, người phỏng vấn có thể gợi ý, ví dụ: em đã bắt đầu đi đúng hướng rồi đó, hoặc, nếu em làm cách đó thì sẽ không thoả mãn trường hợp này, v.v… Nếu mình không nói gì, thì tới lúc mình nghĩ ra 1 ý tưởng sai và sẽ chẳng có ai “nhắc bài” cho mình. Người phỏng vấn cũng muốn biết cách thức mình suy nghĩ và gỉai quyết vấn đề, bước này quan trọng không kém gì bước thứ 4.

BƯỚC 4: NGHĨ RA Ý TƯỞNG VÀ GIẢI THÍCH

Nếu đi đúng hướng ở bước 3, tới một lúc bạn sẽ nghĩ ra ý tưởng. Trước khi viết bất kỳ dòng lệnh nào, hãy giải thích cho người phỏng vấn.

explain code

“NẾU MÌNH KHÔNG THỂ GIẢI THÍCH ĐƯỢC Ý TƯỞNG CỦA MÌNH, THÌ Ý TƯỞNG ĐÓ KHÔNG PHẢI LÀ Ý TƯỞNG CỦA MÌNH”

Ví dụ: với bài này, mình sẽ giải qua 2 bước:

Bước 1: đảo toàn bộ các kí tự trong dãy, “The sky is blue” sẽ trở thành “eulb si yks ehT”.

Bước 2: đảo ký tự của các từ trong dãy, ví dụ từ “eulb” sẽ trở thành “blue”

Đừng quên những trường hợp đặc biệt, ví dụ có thể hỏi người phỏng vấn rằng mình có thể giả sử chuỗi input không null được không?

Đánh giá độ phức tạp và trình bày xem độ phức tạp này có đáp ứng được yêu cầu đề ra hay không? Ví dụ: O(n) thời gian, và O(1) space.

BƯỚC 5: CODE

Đầu tiên, hãy viết code ở high level trước, như bước trước mình đã giải thích:

class Solution {
 void reverseWords(char inputString[]) {
  reverseTheWholeString(inputString);
  reverseEveryWord(inputString);
 }
}

Đoạn code rất dễ hiểu, vì đây là những gì mình đã giải thích cho ban giám khảo (2 bước sẽ trở thành 2 hàm). Và mình cũng rất dễ test (nếu giả sử 2 hàm của mình đúng thì với dữ liệu mẫu có chạy đúng hay không???).

Tiếp theo,  cài đặt từng hàm 1, ví dụ để đảo các ký tự trong chuỗi, mình sẽ đảo các ký tự nửa bên trái cho các kí tự nửa bên phải tương ứng.

class Solution {
 void reverseTheWholeString(char inputString[]) {
  int length = inputString.length;
  for (int i = 0; i < length / 2; i++) {
   swapCharacters(inputString, i, length - i - 1);
  }
 }
}

Sau đó giải thích tiếp hàm swapCharacters, để đổi vị trí 2 kí tự thì mình sẽ gán kí tự thứ nhất vào một kí tự tạm, gán kí tự thứ 2 vào kí tự thứ nhất, và gán kí tự tạm vào kí tự thứ 2.

class Solution {
 // swap characters first and second in string s
 void swapCharacters(char string[], int first, int second) {
  char temp = string[first];
  string[first] = string[second];
  string[second] = temp;
 }
}

Tiếp tục cài đặt các hàm, vừa giải thích vừa gõ code cho đến khi hoàn thành. Tại một thời điểm nào đó, bạn sẽ nói là mình có thể xài chung code cho hàm reverseTheWholeString và hàm reverseWord, hãy viết chung lại thành 1 hàm gọi là reverseSubstring để xài chung.

Bài tập cho các bạn: Làm tiếp bài trên này.

BƯỚC 6. BÌNH TĨNH VÀ DEBUG

Trong buổi phỏng vấn,  chuyện gặp sai sót là hoàn toàn bình thường, mình còn bị những lỗi ngu ngốc như là nhầm j++ thành i++ nữa kia, hãy bình tĩnh giải quyết. Bởi vì mình đã chia chương trình thành những hàm nhỏ nên rất dễ dàng tìm ra lỗi ở hàm nào mà ra.

Hãy giải thích quá trình debug cho người phỏng vấn.

BƯỚC 7. CHÚC MỪNG HOẶC HẾT GIỜ

Nếu bạn có thể làm xong trước khi hết giờ, hãy ăn mừng!

Còn nếu không, hoặc bạn làm sai 1 chút xíu nào đó, cũng đừng lo lắng, bạn đã thể hiện rất tốt cách giải quyết vấn đề cho người phỏng vấn.

Hy vọng những chia sẻ của mình giúp cho các bạn thành công trong buổi phỏng vấn coding tiếp theo.

Bài viết gốc được đăng tải tại fanpage Khiem Tran – Programmer

Xem thêm:

Đừng bỏ lỡ hàng loạt việc làm IT với đãi ngộ hấp dẫn có trên TopDev!

GIỚI THIỆU CÁC DIỄN GIẢ TẠI VIETNAM MOBILE DAY 2022 – WE CONNECT

dien gia tai vietam mobile day 2022

Sự kiện công nghệ lớn nhất Việt Nam – Vietnam Mobile Day 2022 – We Connect đã sẵn sàng mang đến cho bạn không gian công nghệ bùng nổ với sự góp mặt của 60+ Diễn giả chuyên gia trong lĩnh vực Công nghệ và Marketing & Business cùng loạt chủ đề hấp dẫn mà bạn chớ-nên-bỏ-qua!

Cùng khám phá những cái tên tiên phong xuất hiện tại sự kiện năm nay:

1. Anh Nguyễn Nhất Thanh | Senior Solutions Architect tại Amazon Web Services (AWS) 

Trở lại với Vietnam Mobile Day 2022, anh Nguyễn Nhất Thanh sẽ cùng chúng ta khám phá chủ đề: “[Web3] Building a NFT Marketplace DApp like OpenSea” với các kiến thức về NFT Marketplace, cách xây dựng FullStack Web3 Development trên Ethereum với Polygon, Solidity, The Graph,…

dien gia 1

Anh Nguyễn Nhất Thanh hiện là Senior Solutions Architect tại Amazon Web Service. Anh có hơn 20 năm kinh nghiệm về DevOps & Agile Digital Digital Transformation & Principal Software Engineering trên các thị trường Nhật Bản, Hoa Kỳ, Singapore, Thái Lan và Việt Nam. Anh am hiểu sâu sắc về công nghệ và có niềm đam mê mãnh liệt cùng tầm nhìn rộng đối với các công nghệ tiên tiến (IoT, AI & Chatbot, Blockchain, Cloud, Big Data).

2. Anh Tuấn Hà | President & Founder tại Vinalink Media – Vinalink Academy

Anh Tuấn Hà hiện đang đảm nhiệm chức vụ chủ tịch của: Vinalink Media, VMCC – cộng đồng Truyền thông tiếp thị Việt Nam, Thevuon D2 Giảng Võ, Bất động sản Viewest, Tổ chức giáo dục thiền Gosinga, Mentor Tourzy Media. Anh có kinh nghiệm nhiều năm về Tư vấn Chiến lược Marketing: Đào tạo Inhouse Marketing digital và Chuyển đổi số, Tư vấn giải pháp chuyển đổi số 4.0, Chiến lược Kinh doanh cho SME, Mentor về marketing cho các SME đổi lấy cổ phần,…

dien gia 2

Đến với sự kiện Vietnam Mobile Day 2022, anh sẽ có những chia sẻ về chủ đề “Inbound marketing for Mobile”, mang đến các khía cạnh giúp doanh nghiệp đưa ra chiến lược Marketing hiệu quả trên di động.

3. Chị Nguyễn Đặng Quỳnh Anh | COO tại SPAC3SHIP

Với hơn 20 năm kinh nghiệm trong lĩnh vực Adtech/Public Relations, đồng thời từng nắm giữ vai trò quan trọng tại Yeah1 Group, Viber, chị Nguyễn Đặng Quỳnh Anh – COO tại SPAC3SHIP sẽ mang đến sự kiện lần này lời giải đáp về ứng dụng Metaverse qua chủ đề “Xu hướng Marketing cho Brand bằng Metaverse” cùng những phân tích về ứng dụng trong tương lai của Metaverse.

dien gia 3

4. Anh Lại Tuấn Cường | CEO & Founder tại công ty Repu Digital

Anh Cường tốt nghiệp bằng Thạc sĩ Quản trị hệ thống thông tin MIS tại Đại học Shute Taiwan với nhiều năm kinh nghiệm tư vấn Chiến lược và triển khai các chiến dịch Digital Marketing, Martech Automation cho nhiều công ty và tập đoàn lớn tại Việt Nam. Hiện tại, anh đang đảm nhiệm vị trí CEO & Founder tại công ty Repu Digital. 

Ngoài ra, anh đã và đang giảng dạy về Digital Marketing, Martech, Automation và chuyển đổi số tại nhiều nơi: Học viện Sage, Trường đại học Quốc gia & đại học Nantes Pháp, Học viện Elite PR School,… 

dien gia 4

Anh Cường đồng thời là một trong những diễn giả quen thuộc của Vietnam Mobile Day các mùa trước. Trở lại với sự kiện năm nay, anh sẽ mang đến chủ đề: “Mobile Sales, CRM & Service: Công thức bí mật sau đại dịch cho đội ngũ Bán hàng & Dịch vụ” cùng “bí quyết” thúc đẩy sự phát triển của lĩnh vực bán hàng & dịch vụ, song hành với bước nhảy vọt của công nghệ Mobile.

5. Anh Lê Yên Thanh | Founder và CEO của Phenikaa MaaS

Là người được mệnh danh là chàng trai vàng với nhiều giải thưởng về Tin học trong nước và quốc tế, anh Lê Yên Thanh hiện là Founder của ứng dụng BusMap. Sau khi gọi vốn thành công 1.5 triệu USD từ tập đoàn Phenikaa cho sản phẩm ứng dụng này vào năm 2020, anh đã đổi tên thương hiệu thành Phenikaa MaaS – Startup cung cấp các giải pháp thông minh trong lĩnh vực giao thông.

dien gia 6

Trong 2 năm đóng vai trò là Founder và CEO của Phenikaa MaaS, anh Thanh đã có nhiều đóng góp và được tạp chí Forbes Việt Nam bình chọn vào danh sách Forbes Under 30.

Đến với ngày hội Vietnam Mobile Day 2022 với Topic: “AIoT: Understanding the Applications of a New-Gen Convergence”, anh Lê Yên Thanh sẽ cùng bạn khám phá về AIoT và những khả năng mà công nghệ này làm được trong giai đoạn sắp tới.

6. Anh Ông Xuân Hồng | Senior Data Scientist tại Hoa sen Việt Group

Anh Hồng tốt nghiệp thạc sĩ tại JAIST (Japan Advanced Institute of Science and technology) với nhiều năm kinh nghiệm trong lĩnh vực và sở hữu kiến thức sâu rộng về mảng Data cũng như các xu hướng công nghệ nổi trội hiện nay. Ở thời điểm hiện tại, anh đang giữ vai trò Senior Data Scientist tại Hoa sen Việt Group.

dien gia 6

Đồng hành cùng Vietnam Mobile Day năm thứ 12, anh Hồng sẽ mang đến cho chúng ta chủ đề “Data Products for Mobile Commerce in Real-time and Real-life” cùng những phân tích về hướng khắc phục “pain-point” của khách hàng khi Shopping Online bằng cách xây dựng Data products. 

Thời đại 4.0 với sự phát triển mạnh mẽ của công nghệ, đặc biệt là lĩnh vực thanh toán trực tuyến đã giúp cho quá trình mua – bán hàng hóa trở nên dễ dàng hơn bao giờ hết. Không nằm ngoài xu thế, các nhà bán hàng hiện nay đều mong muốn sở hữu giải pháp công nghệ tối ưu trong việc bán hàng, giúp đáp ứng nhu cầu nhanh chóng trong thanh toán của người mua.

7. Chị Nguyễn Thị Tịnh Tâm – Product Manager tại công ty Sapo Mobile

Gương mặt nữ Speaker đầu tiên được nhắc đến tại Vietnam Mobile Day 2022, chị Nguyễn Thị Tịnh Tâm | – Đại diện đến từ sẽ đồng hành cùng bạn tìm hiểu về chủ đề “Công nghệ thanh toán không dùng tiền mặt trong ứng dụng quản lý bán hàng”. Qua sự dẫn dắt từ chị, chúng ta sẽ có thêm những góc nhìn mới về xu thế thanh toán điện tử/ không tiền mặt trong thời đại mới hiện nay.

dien gia 7

Sở hữu hơn 5 năm kinh nghiệm trong đội ngũ phát triển sản phẩm Sapo ở vai trò là quản lý, lên chiến lược phát triển sản phẩm và quản lý đội ngũ phát triển (DEV, Tester, BA, UI/UX Design), chủ đề mà chị mang đến Vietnam Mobile Day 2022 hứa hẹn sẽ chứa đựng những thông tin hữu ích cho doanh nghiệp hoạt động trong lĩnh vực bán lẻ & E-Commerce.

8. Anh Phan Vũ Giáp | Founder & CEO tại Beehexa Corp

Anh Giáp sở hữu hơn 20 năm kinh nghiệm trong vai trò kỹ sư phần mềm, đã từng làm việc với nhiều phần mềm mã nguồn mở như Joomla, WordPress và Magento. Nhận thấy nhu cầu cao về việc kết nối các trang web thương mại điện tử với các ứng dụng bên thứ ba khác, anh đã thành công xây dựng một iPaaS (nền tảng tích hợp như một dịch vụ) cho phép kết nối tất cả các phần mềm để giúp các chủ doanh nghiệp tự động hóa quy trình kinh doanh của họ.

dien gia 8

Qua chủ đề: “Drive B2B Transformation with eCommerce and Integration Platform” anh Giáp sẽ mang đến ngày hội Vietnam Mobile Day năm nay những câu chuyện về số hóa thương mại B2B cùng những phân tích về Nền tảng tích hợp giúp doanh nghiệp nâng cao quy trình tự động hóa và tạo lợi thế cạnh tranh trên thị trường.

Và còn nhiều nội dung hấp dẫn khác đang chờ bạn tại ngày hội Vietnam Mobile Day 2022!

Đăng ký tham gia sự kiện tại đây: https://topdev.vn/vmd

Game Designer là gì? Mô tả công việc của nhà Thiết kế Game

Game Designer là gì? Mô tả công việc của nhà Thiết kế Game

Game Designer là gì hay Thiết kế game là gì đang là chủ đề được nhiều bạn trẻ quan tâm. Nhiều bạn thắc mắc “đam mê chơi game thì có thể trở thành một nhà thiết kế game được không?”. Cùng TopDev giải đáp bằng những thông tin dưới đây.

1. Game designer là gì?

Trước tiên, bạn nên hiểu Thiết kế game là gì (Game Design). Thiết kế game là việc thiết kế tất cả những yếu tố tạo nên một trò chơi như bối cảnh, level, cách chơi, nhân vật gì, thử thách ra sao, … 

Thiết kế game sẽ bao gồm hai mảng lớn nhất là Art (nghệ thuật) và Design (thiết kế). Hình dung đơn giản, phần Design đảm nhận nhiệm vụ tạo nên cốt lõi của câu chuyện (trò chơi) còn phần Art sẽ phác thảo thô những ý tưởng này trước khi nó chuyển sang giai đoạn hiện thực hóa bằng đồ họa 2D/3D. 

Vậy, Game Designer là gì?

Game Designer là người định hình trò chơi. Họ sáng tạo, đề xuất ý tưởng về đối tượng mục tiêu, cốt truyện, thể loại, nhân vật, ảnh hưởng của việc thắng và thua, giao diện người dùng, thiết kế cấp độ, thiết kế bản đồ, và ti tỉ thứ khác nữa. 

game designer la gi

Nhà thiết kế game có nhiệm vụ tạo ra bản mô tả trò chơi một cách dễ hiểu nhất ở cả góc độ nghệ thuật và kỹ thuật. Bản mô tả này được xem là “kim chỉ nam” cho toàn bộ quá trình xây dựng, phát triển và hoàn thiện một trò chơi điện tử. Do đó, vị trí Game Designer rất quan trọng và đòi hỏi chuyên môn cao.

Bởi sự thiếu hụt nhân tài nên nhiều doanh nghiệp sẵn sàng chi những mức lương cao để tuyển dụng Game Designer. Cụ thể, theo thống kê từ SalaryExpert, trung bình mỗi giờ một nhà thiết kế game kiếm được 207 nghìn đồng. 

Một fresher đáp ứng đủ nhu cầu cơ bản như biết lên ý tưởng, thiết kế chi tiết kịch bản theo từng cấp level… có thể bắt đầu với mức lương khoảng 27 triệu đồng/tháng. Đối với Senior có thể khoảng 44 triệu đồng/tháng, với các cấp bậc quản lý sẽ còn cao hơn nữa.

  Game Developer là gì? Lộ trình trở thành Game Developer

2. Mô tả công việc thiết kế game

Những công việc mà Game Designer đảm nhiệm có thể kể đến như:

  • Xác định yêu cầu đối với một trò chơi của khách hàng (nhà đầu tư) hoặc của chính nhà thiết kế game.
  • Nghiên cứu đối tượng mục tiêu, lên ý tưởng nội dung, concept cho trò chơi.
  • Phát triển cốt truyện, nhân vật, quy tắc, độ khó của trò chơi.
  • Phối hợp làm việc với các bộ phận phát triển Game, đồ họa Game để hoàn thiện một trò chơi.
  • Theo dõi game sau khi đã ra mắt và có người dùng, so sánh và đánh giá kết quả với mục tiêu ban đầu để tính toán cải tiến hoặc lược bỏ tính năng giúp thu hút và gắn kết người dùng hơn.

Chắc hẳn bạn đã hình dung được phần nào những công việc của một nhà thiết kế game. Để đáp ứng được những đầu việc này, một Game Designer cần những tố chất, kỹ năng gì? Ta cùng tìm hiểu nội dung bên dưới.

Ứng tuyển ngay các vị trí tuyển dụng lập trình Game lương cao trên TopDev

3. Những kỹ năng của một Game Designer

3.1. Sáng tạo, sáng tạo, sáng tạo

Điều quan trọng phải nói lại 3 lần. Để một trò chơi luôn tạo ra sự hứng thú, hấp dẫn và thách thức đối với người chơi thì nhà thiết kế game cần có khả năng sáng tạo tốt. Với thị trường game khó tính như hiện nay thì sáng tạo sẽ giúp Game Designer liên tục làm mới ý tưởng của mình để đáp ứng đủ nhu cầu của các game thủ.

3.2. Kỹ năng giao tiếp và thuyết trình

Làm thế nào để bạn có thể truyền tải ý tưởng trò chơi của mình để thuyết phục đồng đội, cấp trên hay các nhà đầu tư? Một kỹ năng giao tiếp và thuyết trình tốt sẽ giúp bạn làm tốt việc này.

3.3. Kỹ năng viết tài liệu kỹ thuật

Một tài liệu kỹ thuật được viết mạch lạc, rõ ràng sẽ giúp giải đáp những thắc mắc của mọi người. Điều này giúp quá trình phát triển game diễn ra thuận lợi và hiệu quả.

3.4. Làm việc nhóm

Không chỉ riêng Game Designer mà hầu hết các vị trí đều đòi hỏi bạn cần có kỹ năng làm việc nhóm. Vì sao? Đơn giản vì mỗi dự án, mỗi sản phẩm không thể được xây dựng chỉ với một cá nhân mà cần có sự phối hợp của nhiều bộ phận, nhiều thành viên với nhau. 

Game Designer teamwork tốt tức mỗi thành viên dễ dàng trao đổi ý tưởng và hỗ trợ lẫn nhau, từ đó đi đến một ý tưởng chung sáng tạo nhất.

  Lập trình game là gì? Lộ trình tự học lập trình game cho người chưa biết gì

4. Game Designer bắt đầu từ đâu?

4.1. Thiết kế game học ngành gì?

Tại thời điểm này, có thể ở Việt Nam chưa có trường đại học đào tạo chuyên môn ngành thiết kế game. Do đó, bạn có thể xem xét học những ngành gần với nghề này nhất và có thể tạo lợi thế cho bạn khi làm hoặc ít nhất là khi thực tập. Một số ngành liên quan đến Thiết kế game như:

học gì

Việc có sẵn kiến thức toàn diện và cái nhìn bao quát tạo điều kiện thuận lợi để bạn thăng tiến lên cấp quản lý hoặc mở công ty riêng.

4.2. Bắt đầu học từ đâu?

Bên cạnh chuyên tâm học tập những chuyên ngành nói trên bạn cần phải tự học hỏi, mày mò hoặc đi làm để có thêm các kiến thức về thiết kế game. Bạn có thể học miễn phí thông qua kênh youtube của các Game Designer, đọc thêm sách về thiết kế, đăng ký các khóa học online và cuối cùng là đi thực tập.

Dưới đây là một số kênh youtube, sách và khóa học mà mình tìm hiểu được, các bạn có thể tham khảo.

Kênh Youtube về Game Design

  • Michail Katkoff (deconstructoroffun.com)
  • Jesse Schell (The Art of Game Design: A Book of Lens)
  • Raph Koster (A Theory of Fun for Game Design)
  • Ernest Adams (Fundamentals of Game Design)
  Game blockchain là gì? Khám phá tiềm năng thị trường game blockchain

Sách thiết kế game

  • Cơ bản: The Art of Game Design, Fundamental of Game Design.
  • Nâng cao hơn: Game Mechanic (Advanced Game Design), Challenges for Game Design.
  • Tổng hợp các nguyên lý trong thiết kế nói chung: The Gamer’s Brain, 100 Things Every Designer Needs to Know about People.

Khóa học online

Cuối cùng, sau khi đã xác định Game Designer là gì, những công việc của nhà thiết kế game cũng như trang bị đủ lý thuyết bạn đã đủ tự tin để tìm kiếm cơ hội thực tập. Cố gắng thực hành càng sớm để học được những kinh nghiệm thực chiến nhé. Bạn có thể tham khảo những công ty game thường tuyển dụng thực tập sinh như: VNG, Amanotes, Gear Inc, Gameloft,…. Chúc bạn thành công!

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

Lưu đọng dữ liệu Iconify để dùng offline

Lưu đọng dữ liệu Iconify để dùng offline

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

Là một nhà phát triển web, bạn có thể đã biết đến Iconify, một kho dữ liệu icon dành cho web cực kỳ phong phú, tổng hợp từ nhiều bộ khác nhau (FontAwesome, Material Design v.v…) để đưa về một cách sử dụng chung. Tôi cũng không ngoại lệ, cũng sử dụng Iconnify trong nhiều dự án, vì ngoài việc tích hợp dễ dàng vào dự án, Iconify còn cho phép trộn lẫn nhiều bộ, vì nhiều khi hình ảnh mà tôi cần không tồn tại trong bộ này mà chỉ có ở bộ kia (bạn có thể lo ngại việc trộn lẫn khiến phong cách hình ảnh không thống nhất, đành chịu, vì với người không có khả năng thiết kế thì phải chấp nhận thôi).

Để có được ưu điểm kể trên, Iconify không bắt bạn phải đóng gói hết nội dung icon của các bộ cần dùng, mà dùng cơ chế gọi API để lấy về nội dung của icon khi cần (và nội dung này cũng được lưu trữ tạm để khỏi gọi API lại nhiều lần).

icon api

Với phần lớn trường hợp thì cách làm này là ổn, nhưng một số trường hợp thì nó lại gây băn khoăn. Ví dụ với một sản phẩm IoT, khi mà website đó chạy trong mạng nội bộ, để có thể tự hành khi rớt Internet, hoặc được truy cập ở vùng sâu vùng xa nơi điều kiện Internet không tốt, khi việc gọi API lấy nội dung icon có thể thất bại và ảnh hưởng xấu đến giao diện website. Với những trường hợp như thế thì tôi phải tìm cách thu thập nội dung icon và đính kèm theo website, để không phải gọi API nữa.

Control

Sau đây là cách làm với Vue 3. Cách này không được chỉ dẫn trong tài liệu của Iconify nên tôi phải tự mò.

Nội dung icon dành cho việc sử dụng offline được Iconify phân phối trên NPM Registry, nên bạn có thể kèm nó dưới dạng dependency của ứng dụng JavaScript.

Ví dụ icon sauri:shield-user-linecó tên ri:shield-user-line, thuộc bộ Remix Icon thì bạn cần thêm gói @iconify-icons/ri vào danh sách dependency:

$ yarn add @iconify-icons/ri

Tiếp đến, trong code Vue, trong component nào mà bạn dùng đến icon này, thêm vào các dòng sau:

import { addIcon } from '@iconify/vue'
import iShieldUser from '@iconify-icons/ri/shield-user-line'

addIcon('ri:shield-user-line', iShieldUser)

Trên phần <template></template>, bạn vẫn sử dụng icon như khi không cần offline:

<Icon icon='ri:shield-user-line' />

Khi gọi addIcon(), bạn có thể truyền chuỗi bất kì vào tham số thứ nhất, để đặt tên khác cho icon, miễn sao khi sử dụng trong <template/> thì bạn phải truyền tên tương ứng vào <Icon icon='' />. Tôi thì vẫn dùng tên cũ, để thuận tiện cho việc tra tìm cũng như không gây đứt gãy nếu sau này muốn bỏ việc đính kèm offline.

Như vậy là xong, khi bạn build bằng Vite, nội dung của icon ri:shield-user-line sẽ được kèm vào source website và không bị phụ thuộc vào API nữa. Ngoài ra, nhờ được Iconify tổ chức sao cho hỗ trợ tree-shaking nên chỉ có nội dung của icon kia được kèm thêm, thay vì cả trăm icon của bộ Remix Icon. Điều bất ngờ là trong tài liệu của Iconify, trang Icon bundles for Iconify for Vue lại hướng dẫn cách làm khác và hơi khó thực hiện (có lẽ tài liệu cũ không được cập nhật).

Bài viết gốc được đăng tải tại quan.hoabinh.vn

Tham khảo thêm:

Đừng bỏ lỡ nhiều việc làm Developer, Designer, UI/UX,… trên Topev nhé!