Home Blog Page 64

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é!

[Thuật toán] Độ Phức Tạp Không Hề Phức Tạp

Độ phức tạp của thuật toán

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

Trong loạt bài này mình sẽ giới thiệu về thuật toán và một số thuật toán cơ bản hay được sử dụng + giải thích cho các bạn.

THUẬT TOÁN LÀ GÌ?

Nhưng đầu tiên hết hãy tìm hiểu xem thuật toán là gì? Nói đơn giản thuật toán là:

“Tập hợp các bước để xử lí một vấn đề (loại vấn đề) nào đó.”

Ví dụ, để tính tổng các số tự nhiên từ 1 – N, thì chúng ta làm các bước sau (1)

– Gán tổng = 0

– Cộng tổng với 1

– Cộng tổng với 2

– Cộng tổng với n

– Ta được kết quả tổng là kết quả.

Hay nói một cách khác (2)

– Gán Tổng = 0

– Lần lượt với tất cả giá trị i trong đoạn 1 tới N, cộng i vào tổng

Hoặc có 1 cách khác (3)

– Tính tổng = N * (N + 1) / 2.

Như vậy các bước giải vấn đề, người ta gọi là thuật toán. Vậy bất cứ khi nào các bạn viết code, thì đó chính là thuật toán. Nên nếu có ai đó nói với bạn rằng, học thuật toán làm gì sau này đi làm không có dùng thuật toán, thế thì hãy hỏi lại: “không xài thuật toán thì bạn code cái gì vậy?”. Không có vụ không có thuật toán mà có code nhé, chỉ có thuật toán ngon hay dở thôi.

Tất nhiên đối với một vấn đề, có thể có nhiều cách giải quyết khác nhau, có cách giải quyết nhanh chóng, có cách giải chậm, có cách giải đơn giản, có cách giải phức tạp, đó là lý do học thuật toán. Đó là lí do tại sao người ta có senior dev, có junior. Đó cũng là lí do tại sao mấy công ty lớn người ta lại hỏi về thuật toán. Học thuật toán, chúng ta học gì:

– Học tư duy thuật toán để khi có một vấn đề mới chúng ta biết cách tiếp cận, biết cách đánh giá lời giải chúng ta đưa ra.

– Học các thuật toán phổ biến để khi gặp trường hợp tương tự chúng ta biết cách sử dụng mà không phải tốn thời gian nghĩ ra các lời giải khác. Thường thường các thuật toán này đã đươc viết lại dạng thư viện, nên chúng ta có thể dựa vào đó để tìm ra thư viện tương ứng để xài, vừa đạt hiệu quả cao nhất, mà không phải tốn công giải lại (nói nôm na là copy và paste ở 1 đẳng cấp khác).

ĐÁNH GIÁ THUẬT TOÁN

Thường chúng ta có thể dùng phương pháp đo thời gian chạy (benchmark) để đánh giá xem thuật toán đưa ra có hiệu quả không. Đây là cách chính xác nhất. Tuy nhiên, cách này có một nhược điểm là chúng ta phải code xong thuật toán đó, và nó hoàn toàn phụ thuộc vào kích thước mẫu của dữ liệu đưa vào. Cách này có thể các bạn sẽ thấy khi các bạn submit bài leetcode, nếu timeout thì chắn tỏ thuật toán của toán của bạn quá cùi

Có 1 cách đánh giá khác đơn giản hơn trước khi bạn code đó là đánh giá dựa vào độ phức tạp thời gian (time complexity). Chúng ta có thể đánh giá ngay thuật toán trước khi code, để xem thuật toán có khả thi hay không.

độ phức tạp thời gian

VẬY ĐỘ PHỨC TẠP THỜI GIAN LÀ GÌ?

Nôm na độ phức tạp thời gian của thuật toán là ước lượng thời gian thực thi của thuật toán đó theo kích thước dữ liệu đầu vào. Chính vì có sự phụ thuộc này nên độ phức tạp thuật toán được biểu diễn dưới dạng hàm số O(1), O(N), O(N2), nghe thật đau đầu và khó hiểu…

Vậy mình xin có 1 số ví dụ như sau:

Với bài toán nêu trên, tính tổng của các số tự nhiên từ 1 .. N, chúng ta có 3 cách, tuy nhiên cách đầu tiên khó mà tổng quát hoá được, nên chúng ta sẽ tập trung vào cách (2), và cách (3).

Với cách số (2), chúng ta phải tính N phép tính cộng, giả sử một phép tính tốn 1ms (giả sử máy tính cùi bắp nha), thì ta có kết quả sau:

N = 1, thời gian là 1ms.

N = 2, thời tian là 2ms,

N = 10, thời gian là 10ms. (vì phải cộng 10 lần)

Ta thấy thời gian tỉ lệ thuận với N, do đó ta gọi thuật toán này có độ phức tạp tuyến tính (linear complexity) hay O(N), nếu N tăng lên 10 lần, thì thời gian của thuật toán sẽ tăng thêm 10 lần, nếu N tăng lên 1000 lần, thời gian sẽ tăng lên 1000 lần.

Đối với cách (3), cho dù với N bằng bao nhiêu đi nữa, thì chúng ta chỉ cần 1 phép tính toán như nhau để tìm ra kết quả. Vậy thời gian không hề phụ thuộc vào dữ liệu đầu vào. Người ta gọi đây là độ phức tạp hằng số (constant time), hay O(1). Ví dụ, nếu thời gian để thực hiện công thức tên tốn 3ms, thì với bất cứ N nào, cũng sẽ tốn 3ms (với lí tưởng là thời gian thực thi của máy tính như nhau).

MỘT SỐ VÍ DỤ KHÁC

Thuật toán tìm kiếm tuần tự:

Giả sử chúng ta cần tìm một phần tử trong danh sách cho sẵn, thì chúng ta phải lần lượt kiểm tra từng phần tử cho đến khi tìm thấy phần tử cần tìm, đây gọi là thuật toán tìm kiếm tuần tự.

Ứng dụng:

String.indexOf(), Collection.indexOf(): xác định vị trí 1 ký tự trong chuỗi hoặc một phần tử trong Collection. Những thứ các bạn xài hằng ngày.

SELECT id FROM TABLE WHERE AGE=30; tìm một thành phần trong một bảng cơ sở dữ liệu mà cột chưa được đánh index.

Độ phức tạp: tuyến tính hay O(N).

Các bạn sẽ thắc mắc, là chúng ta có cần phải chạy hết N phần tử đâu, vì sao vẫn gọi là O(N), nếu phần tử cần tìm của mình nằm ở vị trí số 1, hoặc số 2, thì mình sẽ tìm ra ngay, và rõ ràng không cần chạy hết N bước.

Giải thích: giả sử phân bố của tất cả các phần tử là như nhau, thì với N phần tử, số bước tính trung bình của thuật toán này là xấp xỉ N/2 bước. Bây giờ, mình tăng N lên 10 lần, thì số bước trung bình của thuật toán này là xấp xỉ 10N/2. (10N/2) / (N/2) thì vẫn là tăng lên 10 lần, đảm bảo định nghĩa của O(N).

Rõ ràng, với độ phức tạp như thế này, các bạn sẽ cần phải cân nhắc sử dụng các thuật toán tìm kiếm tốt hơn nếu bộ dữ liệu của mình đủ lớn, hoặc nếu thuật toán này được gọi trong một vòng lặp khác. Vậy có những thuật toán tìm kiếm nào khác…

Nếu không biết thì xem độ phức tạp này ở đâu?

Trường hợp của các hàm có sẵn trong thư viện, chúng ta có thể tra document của ngôn ngữ đó để tìm ra độ phức tạp, hoặc google…

Với SQL chúng ta có thể sử dụng câu lệnh EXPLAIN

Nếu còn không tìm ra thì lo học đi ạ…

(còn tiếp…)

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

Hiểu thêm về thuật toán, nếu bạn muốn:

Đừng bỏ lỡ việc làm IT lương cao trên TopDev nhé!

VIETNAM MOBILE DAY 2022: CÂU CHUYỆN VỀ CÔNG NGHỆ MOBILE ĐƯỢC HÉ LỘ

dien gia tai vietam mobile day 2022

Sáng hôm nay, ngày 3/6/2022, sự kiện công nghệ được mong chờ nhất năm – Vietnam Mobile Day 2022 – We Connect đã chính thức “nổ ra” tại điểm cầu đầu tiên – Tp. Hồ Chí Minh.

Giới thiệu Vietnam Mobile Day 2022 – We Connect

Sự kiện diễn ra trong không khí sôi động và thực sự bùng nổ với sự tham gia của:

  • Gần 50 Diễn giả & Chuyên gia hàng đầu về Marketing, Business và Technical với hàng loạt Topic hấp dẫn liên quan đến các xu hướng mới nhất hiện nay: Web3, M-Commerce, SocialFi, GameFi, Metaverse,…
  • Hơn 10+ Nhà tài trợ mang đến các khu vực gian hàng đầy thú vị là các thương hiệu nổi bật như AppsFlyer, Positive Thinking Company, NetCore, VietGuys, Appota,…
  • Hàng ngàn lượt tham gia & quan tâm từ cộng đồng Công nghệ, Marketer, Business trên toàn quốc.

Những điểm nóng về Mobile Tech – Câu chuyện và những con số quan trọng

Khai mạc Vietnam Mobile Day 2022, ông Park JongHo – CEO tại TopDev – Đơn vị tổ chức sự kiện đã có đôi lời chia sẻ và giới thiệu về những chủ đề & nội dung chính trong sự kiện.

Hàng loạt nội dung về xu hướng tiếp thị, bí quyết phát triển doanh nghiệp, câu chuyện và cả những kinh nghiệm thực chiến đã được hé lộ tại sự kiện năm thứ 12 của Vietnam Mobile Day.

Công nghệ 5G, Inbound Marketing, vũ trụ Metaverse, Mobile CRM,… là những chủ đề thu hút người tham gia với rất nhiều những khái niệm thuật ngữ mới cùng nhiều tính năng ấn tượng được giới thiệu bởi các Diễn giả.

diễn giả
Đội ngũ diễn giả chất lượng, sở hữu chuyên môn và kinh nghiệm thực chiến cao

Sức hút đến từ những tên tuổi Diễn giả & Chuyên gia

Những chủ đề Marketing đã được đem đến cho người tham dự qua những chia sẻ thú vị từ các anh/ chị sở hữu kinh nghiệm dày dặn trong ngành: chị Jennie Thanh (Head Of Community tại Umbala Metaverse), chị Nguyễn Đặng Quỳnh Anh (COO tại SPAC3SHIP), ông Carsten Ley (Founder & Consultant tại Asia PMO), chị Hạnh Lê (Co-founder & COO của PMAX Vietnam), chị Nana Phan (Senior Account Executive tại AppsFlyer) & anh Tuấn Nguyễn (Account Manager tại AppsFlyer)…

Sự góp mặt của các chuyên gia về Công nghệ: anh Philip Hùng Cao (Cyber & Zero Trust Evangelist), anh Vũ Duy Tiếp (CPO tại Topebox), anh Nguyễn Đức Hoàng (CTO tại Online Music Education JSC), anh Giáp Văn Đại (Founder & CEO tại Nami Foundation),… đã mang đến sự kiện Vietnam Mobile Day 2022 những khái niệm mới về xu hướng công nghệ như GameFi, NFT, công nghệ Blockchain, Metaverse,…

Những câu chuyện kinh doanh đến từ chị Đinh Mộng Kha (CEO tại VietGuys), chị Tammy Phan (Country Head of Marketing for Vietnam tại Google Asia Pacific), anh Nguyễn Mạnh Tưởng (Co-Founder tại CrmViet), anh Lại Tuấn Cường (CEO & Founder tại Repu Digital), anh Trần Quốc Kỳ (CEO & Co Founder tại GIGAN JSC), … cũng là điểm nhấn giúp tăng thêm phần sinh động cho sự kiện diễn ra hôm 3/6/2022 tại điểm cầu Hồ Chí Minh vừa qua.

Sự sôi động đến từ các gian hàng tại sự kiện

Hàng trăm phần quà hấp dẫn với các trò chơi thú vị đến từ các đơn vị Tài trợ, start up cũng góp phần thu hút sự chú ý từ người tham gia. Với nhiều mini game và hoạt động thú vị, mỗi đơn vị có thể quảng bá thương hiệu mình, đưa ra những sản phẩm Demo và thu hút được sự quan tâm từ người tham gia sự kiện.

Nhiều gian hàng hấp dẫn, thu hút sự chú ý của nhiều người tham dự
Nhiều gian hàng hấp dẫn, thu hút sự chú ý của nhiều người tham dự

Sức nóng từ sự kiện Vietnam Mobile Day 2022 tại điểm cầu Hồ Chí Minh sẽ tiếp tục lan rộng đến địa điểm thứ hai diễn ra tại Hà Nội vào 10/6/2022 sắp tới!

Cùng đếm ngược đến thời điểm diễn ra sự kiện và sẵn sàng hoà vào không khí sôi động của Ngày hội tại thành phố Thủ Đô ngay thôi!

Vietnam Mobile Day 2022 | VMD2022

Ứng dụng thuật toán và cấu trúc dữ liệu lúc đi làm

ứng dụng thuật toán và cấu trúc dữ liệu khi đi làm

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

Nhiều bạn thắc mắc sau này ra trường có ứng dụng thuật toán và cấu trúc dữ liệu không? Tại sao có nhiều công ty tuyển dụng lại hỏi cái này?

Vì sao phải hiểu rõ thuật toán và cấu trúc dữ liệu

Nhiều bạn cho rằng, đi làm sau này các bạn sẽ không cần dùng tới thuật toán hay cấu trúc dữ liệu gì đặc biệt cả. Nhưng nếu bạn không học sâu về thuật toán và cấu trúc dữ liệu, thì các bạn sẽ không biết những điều căn bản sau đây, ví dụ:

Std::map trong C++ là 1 cái map được cài đặt bằng 1 cây nhị phân tìm kiếm tự cân bằng, trong khi đó HashMap (implement lớp Map) trong Java, lại sử dụng 1 bảng băm ở bên dưới, trong khi lớp tương ứng lại phải là TreeMap (implement SortedMap). Và std::unordered_map trong C++ mới là lớp sử dụng bảng hash như Hash Map.

Điều này có nghĩa là gì? Std::map sẽ có các key được sắp xếp, trong khi các lớp implement lớp Map trong java, không có yêu cầu này. Về độ phức tạp của hàm lấy ra 1 phần tử của std::map sẽ là O (logN) trong khi nếu sử dụng HashMap, thì sẽ là O (1).

Những người học kỹ cấu trúc dữ liệu và thuật toán sẽ hoàn toàn nắm vững điều này, khi sử dụng bất cứ API nào, họ sẽ tìm hiểu cài đặt bên dưới, độ phức tạp thuật toán là nhiêu, có phù hợp với việc họ đang làm hay không?

Mấy thông tin này hoàn toàn có thể đọc từ tài liệu của C++, hoặc Java.

Ví dụ, tài liệu lớp std::map của C++ ở đây, hàm at, https://www.cplusplus.com/reference/map/map/at/ sẽ có phần Complexity giải thích là “Logarithmic in size.” (tức là O (logN)).

Tương tự, tài liệu của TreeMap bên java trong phần overview sẽ ghi là “This implementation provides guaranteed log(n) time cost for the containsKey, get, put and remove operations”. Xem ở đây: https://docs.oracle.com/…/docs/api/java/util/TreeMap.html

Cho dù là ngôn ngữ, framework nào đi nữa, thì những thứ căn bản sẽ rất giống nhau. Mình đưa ra 1 ví dụ đơn giản để các bạn thấy rõ thuật toán nó nằm ở ngay bên dưới cái hàm các bạn đang xài, nên hãy tập cho mình thói quen tìm hiểu cái sâu, cái bản chất, thay vì cái hời hợt bên trên.

hình mô tả

Vì sao phải quan trọng những điều này?

Thứ nhất, khi nhận yêu cầu, mình hoàn toàn phán đoán được có khả năng giải quyết được vấn đề trong yêu cầu hay không.

Thứ hai, trước khi mình viết code, mình sẽ luôn cố gắng tìm ra giải pháp tối ưu.

Thứ ba, trong khi viết code, mình có thể đánh giá được năng suất của đoạn code của mình ở trên production.

Thứ tư, khi có vấn đề về hiệu năng xảy ra, mình sẽ phán đoán được vấn đề nằm ở đâu để xử lí.

VÌ SAO LẠI PHẢI QUAN TRỌNG NHƯ VẬY?

Mình lấy ví dụ công ty cũ của mình đi:

Ở Amazon, khi bạn đưa 1 chức năng lên trên trang www. amazon. com, bạn phải đảm bảo chức năng của bạn không được tăng thời gian thực thi của 1 request lên 3 mili-giây. Sẽ có công cụ để quét và bắt bạn phải gỡ chức năng của mình xuống nếu vi phạm quy định này, và thậm chí bạn còn phải viết “kiểm điểm”

Ở VISA, mình từng optimize hệ thống xử lý email của công ty từ việc xử lý 5 triệu email trong vòng 24 tiếng còn 5 phút.

Công ty bạn không cần tối ưu?

Việc optimize hệ thống nó có ý nghĩa rất lớn: tiết kiệm chi phí, tăng trải nghiệm người dùng, ngoài ra còn giúp bạn tiến xa trong công việc. Công ty bạn có thể không cần thuật toán tối ưu, nhưng bạn chắc chắn cần, nếu bạn muốn tiến xa hơn.

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

Xem thêm:

Hàng loạt việc làm IT lương cao trên TopDev đang chờ bạn, ứng tuyển ngay!

Hướng Dẫn Tùy Biến Scrollbar Cực Đẹp Dành Cho Người Mới

Hướng dẫn tùy biến scrollbar cực đẹp dành cho người mới

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

Ở bài viết này mình sẽ hướng dẫn cho các bạn cách tùy biến scrollbar cực đẹp cho trang web giống như trang web của mình mà các bạn đang lướt vậy với chỉ một vài dòng CSS cực đơn giản là các bạn có thể làm được rồi. Bắt đầu luôn thôi nào

Scrollbar nó chia ra làm 3 thành phần đó chính là scrollbarscrollbar thumb và scrollbar track.

Scrollbar

Đây là phần chính, thường phần này người ta sẽ tùy biến độ rộng của nó, ví dụ width: 10px chẳng hạn

body::-webkit-scrollbar{   width: 10px;
}

Scrollbar track

Đây là phần bên dưới của scrollbar, là phần hiển thị bên trong scrollbar và chứa scrollbar thumb, ở đây mình có thể cho nó background-color: #fafafa để nó trắng mờ như sau

Scrollbar track
body::-webkit-scrollbar-track{ background-color: #fafafa; }

Scrollbar thumb

Đây là phần chính, đấy chính là cái mà các bạn thường nhấn chuột vào để kéo đó, các bạn có thể tùy biến nó với màu nền hoặc bo góc cũng được, chơi cả gradient như blog mình cũng được như thế này

Scrollbar thumb
body::-webkit-scrollbar-thumb{ background-image: linear-gradient(-45deg, #6a5af9, #d66efd); border-radius: 50px; }

Như vậy là mình đã chỉ xong cho các bạn cách tùy biến scrollbar cho trang web rồi nhé, tuy nhiên cái này không hỗ trợ trên trình duyệt Firefox. Vì thế khi chúng ta áp dụng những đoạn code CSS này vào thì trình duyệt Firefox nó vẫn là mặc định thôi. Nếu các bạn bị buộc phải làm thì có thể tìm hiểu các thư viện tùy biến scrollbar thử nhé. Good luck!

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

Xem thêm:

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

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

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

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

Có một bận, tôi ôm trong tay một bộ CSDL của website nọ, với nhiều thông tin danh tính người thật. Để tránh cho dữ liệu danh tính bị lộ, hưởng ứng tinh thần của Luật An Ninh Mạng, tôi quyết định phải làm xáo trộn dữ liệu đó để nó không còn phản ánh danh tính thật nữa. Cụ thể là tôi sẽ ghi thêm vài kí tự bừa bãi vào cột email, cho nó thành email “xạo” hết.

Nói tới nhu cầu này thì cách dễ nhất là viết đoạn code cho nó chạy một vòng lặp, lặp qua các dòng của bảng dữ liệu, tại mỗi dòng lấy ra cột email, ghi nội dung mới vào rồi lưu lại. Cách đó dễ, nhưng hơi cơ bắp, không tinh tế, sẽ chậm khi bảng dữ liệu hơi lớn. Tôi quyết định thử phương án tạo hàm tùy thêm cho hệ CSDL đó, để có thể sửa tất cả trong một câu truy vấn (query) duy nhất, ví dụ:

UPDATE web_users SET email = my_func(email)

Dùng qua cơ sở dữ liệu, các bạn chắc cũng biết trong câu truy vấn, thỉnh thoảng ta bắt gặp lời gọi hàm. Ví dụ phổ biến nhất là hàm COUNT, ví dụ:

SELECT COUNT(*) FROM student WHERE country = 'VN'

Ngoài những hàm có sẵn như thế, các hệ CSDL vẫn cho phép ta định nghĩa thêm hàm tùy ý, và viết theo cú pháp phương ngữ SQL của hệ CSDL đó, ví dụ trong MySQL:

DELIMITER $$

CREATE FUNCTION CustomerLevel(
	credit DECIMAL(10,2)
) 
RETURNS VARCHAR(20)
DETERMINISTIC
BEGIN
    DECLARE customerLevel VARCHAR(20);

    IF credit > 50000 THEN
		SET customerLevel = 'PLATINUM';
    ELSEIF (credit >= 50000 AND 
			credit <= 10000) THEN
        SET customerLevel = 'GOLD';
    ELSEIF credit < 10000 THEN
        SET customerLevel = 'SILVER';
    END IF;
	-- return the customer level
	RETURN (customerLevel);
END$$
DELIMITER ;

Hơi dài dòng và khó đọc, đúng không, nếu thế thì “tinh tế” qué gì? Thực ra, muốn tinh tế thì nên dùng PostgreSQL, vì PostgreSQL cho phép bạn định nghĩa hàm tùy tạo bằng ngôn ngữ Python luôn (thông qua tính năng PL/Python). Không chỉ là Python ở mặt cú pháp mà còn được import các thư viện Python hẳn hoi! Chúng ta cùng bắt đầu nhé.

Đụng vào tầng database là một việc hơi nguy hiểm, nên ta cần cẩn thận. Trước tiên, hãy cứ viết ra như một đoạn code Python thuần (file *.py), test tiếc cho cẩn thận rồi hãy chuyển vào trong PostgreSQL. Về ý tưởng xáo trộn email thì thuật toán như sau:

  • Đầu tiên, tách địa chỉ email làm hai phần, trước và sau dấu “@”. Ví dụ “ng.hong.quan@gmail.com” thì tách thành “ng.hong.quan” và “gmail.com”.
  • Phần tên miền không cần đụng đến. Tôi sẽ thêm kí tự ngẫu nhiên vào phần tên đăng nhập (username). Thêm một kí tự vào đằng trước, một kí tự vào cuối và một kí tự chen vào giữa, vị trí ngẫu nhiên. Ví dụ, thêm “z” vào trước, “x” vào sau, thành “zng.hong.quanz”, rồi thêm “y” vào giữa, thành “zng.hyong.quanx”.

Bây giờ viết ra thành file tools.py:

import string
import random


def scramble_email(email: str) -> str:
    # No need to handle the case that "@" is missing, because
    # email address was validated before.
    head, tail = email.split('@')
    # No need to handle the case that email is empty.

    # Pick 3 random letters
    c1, c2, c3 = random.sample(string.ascii_lowercase + string.digits, 3)
    # Choose a random middle position
    i = random.randint(1, max(1, len(head) - 2))

    # Put together
    return f'{c1}{head[:i]}{c2}{head[i:]}{c3}@{tail}'

Trong bộ dữ liệu của tôi, cột email là bắt buộc, và dữ liệu được kiểm tra tính hợp lệ trước khi ghi vào, nên hàm scramble_email không cần kiểm tra những trường hợp lắt léo như thiếu dấu “@”, chuỗi rỗng.

Đôi lời giải thích nếu bạn đọc là người non kinh nghiệm về Python:

  • email.split('@') sẽ ngắt thành hai chuỗi con, ví dụ 'quan' và 'agriconnect.vn'. Ta gán hai chuỗi con này cho hai biến head và tail.
  • string.ascii_lowercase + string.digits cho ra một chuỗi gồm từ 'a' đến 'z' và từ '0' đến '9'.
  • random.sample(string.ascii_lowercase + string.digits, 3) là từ chuỗi trên, bốc ra ba kí tự ngẫu nhiên. Sau khi bốc ra, ta gán cho ba biến c1c2c3.
  • Khi lấy vị trí giữa ngẫu nhiên, ta chỉ lấy vị trí từ thứ hai (chỉ số 1) đến kế cuối (chỉ số len(head) - 2). Ta phải lường tình huống chuỗi chỉ có một kí tự, khi đó sẽ lấy vị trí cuối luôn. Đó là lí do có thêm max(1, ...) vào để “thòng”.
  • Sau khi có vị trí ngăn giữa i rồi thì ta dùng cú pháp “slice” để cắt head ra thành hai khúc: head[:i] và head[i:]

Mở console của Python lên, import và cho chạy thử với vài dữ liệu:

test_pure_function

Trông ổn rồi, giờ thì ta mở database lên, cho phép nó sử dụng ngôn ngữ Python:

activate

Lưu ý rằng, mặc dù extension plpython là extension gốc, được hỗ trợ chính thức từ PostgreSQL nhưng trong các bản phân phối Linux (Ubuntu, Fedora), người bảo trì lại tách nó ra gói riêng. Ta cần cài gói đó trước, ví dụ trong Ubuntu là:

sudo apt install postgresql-plpython3-12

Sau đó cấu hình cho PostgreSQL luôn nạp nó lên, bằng cách sửa file /etc/postgresql/12/main/postgresql.conf, tìm dòng “shared_preload_libraries” và thêm “plpython3” vào, ví dụ:

shared_preload_libraries = 'plpython3' 

Nhớ khởi động lại PostgreSQL sau khi sửa cấu hình:

sudo systemctl restart postgresql

Quay lại bước vừa nãy, sau khi chạy câu “CREATE EXTENSION…” thì ta bắt đầu định nghĩa hàm, chép code Python vừa nãy vào:

CREATE FUNCTION scramble_email(email text) 
  RETURNS text 
  AS $$ 
   
  import string 
  import random 
   
  head, tail = email.split('@') 
  c1, c2, c3 = random.sample(string.ascii_lowercase + string.digits, 3) 
  # Choose a random middle position 
  i = random.randint(1, max(1, len(head) - 2)) 
  return f'{c1}{head[:i]}{c2}{head[i:]}{c3}@{tail}' 
  
$$ LANGUAGE plpython3u; 

define_function

Áp dụng nó vào câu query UPDATE, thi triển võ công “đấm một phát chết luôn”:

query_update

Vậy là nhiệm vụ đã hoàn thành. Ta thấy PostgreSQL và Python quả là đôi bạn thân, hỗ trợ nhau rất tốt (ngay cả các hệ CSDL “đại gia” như MS SQL, Oracle còn không có tính năng này). Các tấm hình trên còn cho thấy ngay cả code Python trong PostgreSQL (PL/Python) cũng được tô màu theo đúng cú pháp. Thực ra việc tô màu có được là nhờ một công cụ trong hệ sinh thái Python: pgcli. Tuy nhiên, có một lưu ý nhỏ: Khi sử dụng PL/Python, chỉ superuser mới có quyền tạo hàm. Đây là giới hạn PostgreSQL đặt ra vì Python không có cơ chế tự giới hạn quyền, khiến code PL/Python có thể làm những trò quá mạnh bạo, nguy cơ trở thành “phá hoại” nếu rơi vào tay “gà mờ”.

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

Xem thêm:

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

CÔNG BỐ AGENDA SỰ KIỆN VIETNAM MOBILE DAY 2022- KHU VỰC HỒ CHÍ MINH

agenda

Sau bao ngày chờ mong, BTC sự kiện Vietnam Mobile Day 2022 xin được công bố AGENDA (dự kiến) cho ngày hội tại khu vực Hồ Chí Minh (03/06/2022)!

Vietnam Mobile Day 2022 – We Connect – Sân chơi quen thuộc của cộng đồng yêu Công Nghệ tại Việt Nam, nay đã trở lại dưới hình thức Offline. Trong lần tái xuất này, sự kiện hứa hẹn mang đến cho mỗi cá nhân, nhà phát triển và các doanh nghiệp một không gian công nghệ thực sự bùng nổ – Nơi hội tụ của những sáng kiến công nghệ Mobile đột phá cùng các xu hướng mới nhất trên thị trường IT Việt Nam & khu vực.

Sự kiện năm nay sẽ là cơ hội để bạn “kết nối” cùng các diễn giả đầy nhiệt huyết và lắng nghe chia sẻ từ họ về các từ khóa HOT hiện nay như #Web3, #5G, #MCommerce, #Blockchain,… qua hơn 80+ chủ đề chất lượng về xu hướng & công nghệ Mobile trong năm 2022. Hãy cùng khám phá AGENDA Vietnam Mobile Day 2022 và “note” lại những Topic “hợp gu” để không bỏ lỡ những nội dung hấp dẫn tại ngày hội năm nay!

STAGE 1:

agenda1

> Topic: The Hidden Value of Apps

Diễn giả: Tammy Phan – Country Head of Marketing for Vietnam | Google Asia Pacific 

> Topic: Giới thiệu về TikTok Shop – Nơi giải trí kết hợp cùng mua sắm

Diễn giả: Nguyễn Khoa Bằng – Quản lý ngành hàng, TikTok Shop Việt Nam

> Topic: Building Sustainable Security for 5G with Zero Trust

Diễn giả: Philip Hùng Cao – Cyber & Zero Trust Evangelist 

> Topic: Bí quyết vận dụng Data Analytics (Phân Tích Dữ Liệu) để tối đa hóa hiệu suất marketing cho Apps (Ứng Dụng Công Nghệ)

Diễn giả: Hạnh Lê – Co-founder & COO | PMAX Vietnam

> Topic: Automation Marketing

Diễn giả: Phùng Tấn Cường – CSM Vietnam | Netcore

> Topic: The Next Genaration Of Mobile Measurement

Diễn giả: Nana Phan – Senior Account Executive | AppsFlyer 

Diễn giả: Tuấn Nguyễn – Account Manager | AppsFlyer

> Topic: Maximize Customers Engagement with Facebook N-Time notification on Mobile – Tối đa tương tác khách hàng với hệ thống thông báo định kỳ trên Facebook

Diễn giả: Nguyễn Mạnh Tấn – Head of Marketing | Haravan

> Topic: Làn sóng NFT và các mô hình ứng dụng trong SocialFi thế hệ mới

Diễn giả: Nguyễn Trung Thành – CEO & Founder | TrustKeys Network

> Topic: Go-to-market in Web3 Jennie Thanh Head Of Community | Umbala Metaverse Inbound marketing for Mobile

Diễn giả: Tuấn Hà – Founder, President | Vinalink Media and Vinalink Academy

> Topic: Xu hướng Marketing cho brand bằng Metaverse

Diễn giả: Nguyễn Đặng Quỳnh Anh – COO | SPAC3SHIP

> Topic: Mobile CRM yếu tố sống còn cho sale man sau Covid 19

Diễn giả: Nguyễn Mạnh Tưởng – Co-Founder | CrmViet

> Topic: Câu chuyện thực tế tăng trưởng 200% doanh số nhờ Chuyển đổi số từ Offline lên Online

Diễn giả: Đinh Mộng Kha – Chief Executive Officer | Vietguys

> Topic: 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ụ

Diễn giả: Lại Tuấn Cường – CEO & Founder | Repu Digital

> Topic: Unlock the full potential of Metaverse!

Diễn giả: Đỗ Phạm Kim Thư  – Head of Partnership | RROVE

STAGE 2:

agenda2

> Topic: [Updating]

Diễn giả: Ruby Nguyễn – Founder & CEO – Curieous 

> Topic: Mobile First trong lĩnh vực Blockchain – Crypto

Diễn giả: Giáp Văn Đại – Founder & CEO | Nami Foundation

> Topic: Why Mobile Commerce has Become Critical for Retailers

Diễn giả: Trần Nguyễn Phi Long – Head of Retail Marketing | PNJ

> Topic: Ứng dụng giải pháp Social Marketing tăng trưởng trong Mobile Commerce

Diễn giả: Phạm Thị Thanh Thanh – COO Trung tâm Social Marketing | ACCESSTRADE Vietnam

> Topic: Customer preferences in mobile first strategy

Diễn giả: Carsten Ley – Founder & Consultant Asia PMO

> Topic: API ngân hàng Việt Nam: Làm sao để truy cập?

Diễn giả: Nguyễn Hồng Điệp -Founder & CEO | Casso

> Topic: How to utilize Data in Pharmacy Retail industry

Diễn giả: Nguyễn Thanh Sơn – Head of Data Science | Pharmacity

> Topic: Data Products for Mobile Commerce in Real-time and Real-life

Diễn giả: Ông Xuân Hồng – Senior Data Scientist | Hoa Sen Viet Group

> Topic: From Mobile Banking to Digital Banking, a great evolution

Diễn giả: Trần Trí Nhân (Executive MBA) – Product Manager | GFT Viet Nam & CEO – Founder | One Magic School

> Topic: Người Việt, năng lực Việt, ngồi ở Việt Nam nhưng vươn tầm Thế giới

Diễn giả: Vũ Duy Tiếp – CPO | Topebox

> Topic:Open UI Components trong xu thế kết nối dòng chảy tài chính

Diễn giả: Hà Quang Thịnh – Lead of Mobile Development | Techcom Securities – Công ty Cổ phần Chứng khoán Kỹ Thương

> Topic: AIoT: Understanding the Applications of a New-Gen Convergence

Diễn giả: Lê Yên Thanh – Founder, CEO | Phenikaa MaaS

> Topic: Mobile: Chiến lược thực thi Super App cho mảng IoT, và SaaS

Diễn giả: Phan Thanh Tùng – General Director | Tech Visionary, iLotusLand, Simplamo, TungTung

> Topic:: Đặc trưng về kỹ thuật trong việc phát triển ứng dụng mobile so với ứng dụng web.

Diễn giả: Nguyễn Đức Hoàng – CTO | Online Music Education JSC

STAGE 3:

agenda3

> Topic: [Updating] 

Diễn giả: Andy Le – Software Engineering Manager | ZaloPay

> Topic: Mobile App Development – What you don’t know

Diễn giả: Nguyễn Hiển – CEO | zen8labs

> Topic: Fast Mobile App Development

Diễn giả: Nghi Nguyễn – Head of Technology | Amanotes

> Topic: Mobile First Approach & Strategy

Diễn giả: Positive Thinking Company Speaker of Positive Thinking Company

> Topic:Ứng dụng mobile trong kết nối các nguồn lực trong và ngoài doanh nghiệp

Diễn giả: Cao Minh Việt – Trưởng chi nhánh TPHCM | BAP Co.,JSC & Former COO | Vingroup Nhật Bản

> Topic: How to start auditing digital marketing data to grow your business on mobile

Diễn giả: Hoàng Minh Dương – CEO | AppROI

> Topic:Mobile App – Lối Đi Nào Cho Doanh Nghiệp?

Diễn giả: Trần Quốc Kỳ – CEO & Co Founder | GIGAN JSC

> Topic: User Experience for Logistics Mobile End-Users

Diễn giả: Phạm Nam Long – CEO | Abivin

> Topic: Drive B2B Transformation with eCommerce and Integration Platform

Diễn giả: Phan Vũ Giáp – Founder & CEO | Beehexa

> Topic: [updating]

Diễn giả: Andy Dang – Regional Director | Omega Martech

> Topic: [Web3] Building a NFT Marketplace DApp like OpenSea

Diễn giả: Nguyễn Nhất Thanh – Senior Solutions Architect | Amazon Web Services (AWS)

> Topic: Xây dựng nền tảng trên di động cho ngành TMĐT: xây gì và vì sao?

Diễn giả: Trần Vũ Tất Bình – Engineering Director | One Mount Consumer

> Topic: Rule-Based Bots or AI Bots. Which is best for a chatbot project?

Diễn giả: Ruby Nguyễn – Founder, CEO & CTO | Momby

Cùng đếm ngược thời gian và chuẩn bị tâm thế để cùng bùng nổ trong không khí sôi động của ngày hội Vietnam Mobile Day 2022 bạn nhé!

Để đăng ký tham dự chương trình Vietnam Mobile Day 2022 vui lòng để lại thông tin tại đây

THỜI GIAN & ĐỊA ĐIỂM DIỄN RA SỰ KIỆN

  • TP. Hồ Chí Minh: 03/06/2022 tại Melisa Center, 83 Thoại Ngọc Hầu, Hòa Thanh, Q. Tân Phú, Tp.HCM
  • TP. Hà Nội: 10/06/2022 tại CTM Palace, 131 Nguyễn Phong Sắc, Dịch Vọng Hậu, Cầu Giấy, Hà Nội

Cách Giao Tiếp Giữa Các Service Trong Hệ Thống Có Tải Cao

hệ thống có tải cao

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

Tại sao không nên dùng Http1.1 để giao tiếp giữa các service trong hệ thống có tải cao

Để thiết kế một hệ thống tin cậy có thể chịu được tải cao thì chúng ta cần quan tâm rất nhiều yếu tố :

  • database : nosql, sql, in-mem database, index, partition,…
  • caching
  • design service
  • load balance

Thời điểm hiện nay chúng ta sẽ dễ dàng tìm được các bài báo cũng như các bài hướng dẫn, so sánh về các mục bên trên. Thời điểm hiện tại đa số các hệ thống sẽ được xây dựng trên mô hình microservice nhưng khi sử dụng mô hình trên thì còn một điều khá quan trọng chúng ta cần phải quan tâm đó là cách giao tiếp giữa các service với nhau (service communicate). Khi mới bắt đầu vào lập trình hầu hết các bài báo cũng như hướng dẫn tôi được đọc thì họ đều sử dụng http1 để lấy làm ví dụ cho hệ thống của họ. Nhưng trong quá trình trải nghiệm trong thực tế tôi thấy việc sử dụng http1 có rất nhiều hạn chế khi hệ thống gặp tải cao. Tại bài viết này với kinh nghiệm cá nhân của mình thì mình sẽ chia sẻ cho mọi người biết các hệ thống có tải cao của mình từng làm sẽ dùng cách thức nào để giao tiếp với nhau.

Giới thiệu một chút các hệ thống tải cao và yêu cầu độ trễ thấp mình từng làm là :

  • Hệ thống Antispam của Viettel
  • Sàn Trading của công ty Nextop.asia

1. TCP Socket

Vì tất cả hệ thống của mình đều sử dụng TCP nên mình sẽ chỉ chia sẻ về TCP tại đây. TCP là một giao thức truyền tin qua mạng có đảm bảo dữ liệu được truyền tải thành công điểu này mọi người đều đã biết. Hầu hết các giao thức khác đều dựa trên TCP và UDP nên việc biết về 2 mô hình socket này trước là điều cần thiết.

1.1. Client

Chúng ta có một ví dụ đơn giản về một TCP client đơn giản bằng ngôn ngữ Java. Đây là một ví dụ trên mạng

import java.net.*;  
import java.io.*;  
class MyClient{  
public static void main(String args[])throws Exception{  
Socket s=new Socket("localhost",3333);  
DataInputStream din=new DataInputStream(s.getInputStream());  
DataOutputStream dout=new DataOutputStream(s.getOutputStream());  
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));  

String str="",str2="";  
while(!str.equals("stop")){  
str=br.readLine();  
dout.writeUTF(str);  
dout.flush();  
str2=din.readUTF();  
System.out.println("Server says: "+str2);  
}  

dout.close();  
s.close();  
}}

Để tạo ra một kết nối TCP thì chương trình sẽ phải tốn những tài nguyên sau :

  • file descriptor (mỗi TCP connection đều cần 1 file descriptor) khoảng 4KB.
  • Buffer size của kết nối TCP.
  • Chi phí mạng.
  • Một Thread đọc dữ liệu từ server trả lại.

Chi phí này là khá lớn và nếu quá nhiều kết nối TCP cùng tồn tại thì sẽ gây quá tải cho hệ thống của bạn.

1.2. Server

Với server lượng chi phí của chúng ta cũng sẽ mất tương tự như phía client nếu sử dụng mô hình Blocking IO (một số server nổi tiếng đang sử dụng mô hình này). Nhưng nếu sử dụng mô hình Non Blocking IO thì chi phí sẽ thấp hơn vì không nhất thiết phải tạo luồng mới để đọc dữ liệu của client gửi lên. Mọi người nếu chưa biết về 2 mô hình socket này thì nên tham khảo trên mạng.

Nhưng có một điều lưu ý là số lượng TCP connection của một server sẽ có giới hạn. Theo lý thuyết thì một TCP connection sẽ bao gồm (source IP, source port, dest IP, dest port) vậy số lượng connection tối đa một server có thể có sẽ là 2^48. Vì số connection chỉ phụ thuộc vào :

  • số lượng source IP 2^32 và
  • source port 2^16 connection có thể xảy ra. Nhưng thực tế sẽ dựa vào nhiều yếu tố khác:
  • OS: số lượng file descriptor tối đa của hệ điều hành có thể mở ra (mỗi TCP connection đều cần 1 file descriptor). Trên linux kiểm tra bằng lệnh ulimit -a
  • RAM : không tính đến buffer của mỗi socket thì mỗi file descriptor sẽ có dung lượng khoảng 4KB.

Vậy nếu điều kiện nào đến trước thì đó sẽ là giới hạn của server của hệ thống.

2. Http1.1

http1.1.png

Mọi người không ai còn xa lạ với giao thức này nữa. Tại giao thức này đã cho phép chúng ta khả năng pipeline request nhưng khi dùng pipeline thì các request và response phải được gửi và nhận lần lượt. Nếu điều này bị vi phạm sẽ dẫn đến client không thể biết response này là của client nào. Tiếp đến nếu một request không may bị thất lạc thì khiến các request khác trong pipeline sẽ không được gửi lên server điều này sảy ra tình huống HOL gây giảm hiện năng. Vì những lý do trên nên hiện tại mình chưa từng dùng được một thư viện nào hỗ trợ mình chức năng pipeline của Http1.1.

Điểm yếu của Http1.1

Như phần trên chúng ta có thể nhận ra điểm yếu của Http1.1 đó chính là chúng ta sẽ không thể tái sử dụng một Http connection để gửi request nếu nó chưa nhận được response của server. Trong khi hệ thống cao tải thì chúng ta cần gửi rất nhiều request cùng một lúc đến các service khác nhau điều này bắt buộc chúng ta phải tạo ra rất nhiều Http connection và như đã biết việc tạo ra nhiều Http connection bên trên sẽ gây quá tải cho hệ thống của các bạn.

Tất nhiên các thư viện viết Http1.1 client đều cho phép bạn tạo connection pool nhưng khi hết connection trong pool một số thư viện sẽ tạo mới (tốn kém tài nguyên ), một số sẽ cố gắng đợi connection được trả lại trong pool điều này sẽ khiến các request mới sẽ không được gửi gây giảm hiệu năng hệ thống của bạn xuống.

Vậy nên hệ thống bạn mà giao tiếp dựa trên http1.1 thì sẽ là hệ thống synchronous, hệ thống này sẽ không thể đáp ứng được những ứng dụng có tải cao và yêu cầu độ trễ thấp.

Các bạn sẽ có thể bị bối rối việc các thư viện http1.1 cho phép sử dụng các asynchronous api? Các thư viện đó thực chất sẽ sử dụng các Thread khác để thực hiện request của bạn chứ không sử dụng chỉ Thread của bạn nên tốc độ của khi gửi request sẽ tốt hơn. Nhưng đứng dưới góc độ của Http connection nó vẫn sẽ là synchronous.

3. Cách thay thế Http1.1

3.1. Http2

Câu trả lời của hầu hết mọi người là Http2 vì nó quá nổi tiếng mà.

Tất nhiên việc nâng cấp lên Http2 cũng không hề dễ dàng như mọi người nghĩ. Mình đã từng làm một bài về Http2 in real project mình cảm thấy các thư viện Http2 client hiện tại vẫn chưa hỗ trợ hết tính năng của Http2 nếu cần thì bạn hơn thì bạn cần viết một client dành cho riêng mình. Với mình thì là tự viết client để giao tiếp với APNS của Apple.

Mình cũng đã thử config Http2 server trên spring-boot với tomcat và cũng cảm thấy khi config server này bằng spring-boot hiện tại cũng chưa hỗ trợ hết tính năng của Http2.

Nếu bạn chưa biết thì Http2 sẽ cho cung cấp cho chúng ta giải pháp ghép kênh (multiplexing) nghĩa là cho phép chúng ta sử dụng một http2 connection gửi nhiều request và response nhận về vẫn có thể biết được đó là của request nào. Còn việc gửi nhiều thì bản thân TCP socket đã giúp bạn gửi nhiều request rồi. Gửi nhiều request trên cùng một connection không phải là tính năng mới trên Http2. Tính năng mới trên Http2 là gửi nhiều request và response nhận về vẫn có thể biết được đó là của request nào ( Điều quan trọng phải nhắc lại 2 lần :)) ).

Vậy tại sao Http2 có thể làm được điều đó. Nó làm được điều đó vì mỗi request sẽ được đánh ID và được biết với tên Stream IDServer và Client gửi request và response phải gửi kèm theo Stream ID này để có thể phân biệt với nhau.

Vì bài này không chia sẻ về Http2 và Http2 còn rất nhiều thông tin thú vị khác các bạn xem thêm tại bài viết : httpwg.org/specs/rfc7540.html#top

3.2. Đánh ID cho từng request

Trước khi Http2 ra đời, các công ty công nghệ lớn như AppleGoogle đã sử dụng phương pháp đánh ID cho từng request để giúp phân biệt response thuộc về request nào. Cũng có thể đây là động lực cho sự ra đời của Http2. Cách này giúp chúng ta tái sử dụng được các connection được tạo ra mà không cần đợi response

Cụ thể hơn là mình đã được làm việc với service gửi thông báo về các thiết bị Android và IOS của 2 thanh niên công nghệ trên. Và 2 thanh niên này thì có tải cực kỳ lớn và do đó họ đều không sử dụng Http1.1 là công cụ giao tiếp chính cho client.

Cụ thể như sau :

  • Apple : Gần đây APNS đã dịch chuyển từ TCP Socket sang Http2 giúp cho khách hàng có thể sử dụng một connection gửi nhiều thông báo với các máy IOS. Vậy trước đây khi sử dụng APNS tại project cũ bọn mình cần phải tạo ra kết nối TCP Socket đến Apple và mỗi khi push notify đến thiết bị IOS thì request mình gửi lên Apple sẽ phải đính kèm một unique id trên một connection. Và Apple sẽ trả lại kết quả qua Tcp Connection trên và sẽ đính kèm theo ID của request để mình còn map lại được request với response
  • Google : Google thì cung cấp Firebase API dưới dạng Http1.1 và dạng XMPP. Dạng Http1.1 thì đơn giản dễ hiểu với mọi người nên nếu không có quá nhiều khách hàng sử dụng dịch vụ và không gửi nhiều request để notify thì hầu hết mọi người sẽ chọn giao thức này. Chúng ta sẽ không thể nghi ngờ khả năng của Google được nên khi chúng ta cần gửi nhiều thông báo khác nhau cho nhiều thiết bị khác nhau và sử dụng Http1.1 mà bị chậm thì chúng ta cần phải xem lại project của mình. Trong trường hợp này thì mọi người nên chuyển sang giao thức XMPP vì giống với Apple tại đây Google sẽ bắt client của mình tạo ra các ID khác nhau cho từng request gửi lên. Nhưng có một điều là giao thức XMPP không hỗ trợ dạng Batch nên nếu bạn cần gửi cho nhiều thiết bị và nội dung giống nhau 100% thì nên quay lại dùng Http1.1nhé.

4. Mình đã sử dụng phương pháp nào tại các sản phẩm đã làm.

Phương pháp hiện tại mình đang sử dụng cách đánh ID cho từng request sau đó gửi sang các Service thông qua :

  • Non Blocking Socket (Sử dụng Netty) nếu share API cho bên ngoài. Sắp tới nếu có bên nào cần thì bên mình chắc sẽ viết dưới dạng Http2 server cho hợp thời đại.
  • message queue đối với giao tiếp nội bộ của hệ thống.

Sau đó response sẽ đính kèm ID cũng gửi theo các đường này về client .

Hệ thống của mình giao tiếp giữa các service là dạng asynchronous điều đó khiến khi cao tải thì hệ thống cũng không tạo thêm các TCP connection để giao tiếp. Điểu đó cũng giúp giảm tài nguyên của hệ thống xuống khá nhiều.

Kết bài tại đây mình muốn khuyên cho mọi người khi xây dựng hệ thống nếu yêu cầu có tải lớn và độ trễ thấp thì nên di chuyển giao tiếp từ Http1.1 sang các dạng khác theo các công ty lớn như AppleGoogle. Mặc dù cách này sẽ tốn rất nhiều thời gian gian đoạn đầu nhưng giai đoạn sau khi có nhiều khách hàng mọi thứ sẽ hoạt động trơn tru và không phải chịu cảnh hệ thống quá tải vì giao tiếp. Các bạn sẽ ít nhất không phải trải qua cảnh gateway của mình chỉ làm nhiệm vụ forward cũng sẽ tốn rất nhiều tài nguyên ( RAM, CPU).

Mình biết các thư viện và mô hình micro service có sẵn trên mạng có thể vẫn dùng chủ yếu là Http1.1 nên việc thay đổi mô hình không phải là điều dễ dàng.

Tại các công ty mình đã làm việc thì việc chọn giao tiếp dưới dạng REST API dưới dạng Http1.1 là điều thường xuyên xảy ra và cũng đã trải qua những đắng cay vì Http1.1 khi tải cao và số lượng connection nó tạo ra là quá lớn.

Tất nhiên việc tạo ra một hệ thống chạy tốt cần phải có nhiều yếu tố khác nhau nữa nhưng việc giao tiếp với các service là một điều cần quan tâm.

Bài này hoàn toàn là kinh nghiệm cá nhân trong quá trình làm việc rất mong có sự góp ý của mọi người để giúp mình và mọi người nâng cao khả năng lập trình.

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

Đọc thêm:

Hàng loạt việc làm IT hấp dẫn trên TopDev đang chờ bạn ứng tuyển..

SQL Developer là gì? Làm thế nào để trở thành một SQL Developer?

SQL Developer là gì đang là chủ đề mà nhiều bạn trẻ thắc mắc trong bối cảnh các công việc thuộc lĩnh vực công nghệ thông tin đang ngày càng phát triển. Để trả lời câu hỏi này, mời bạn theo dõi những thông tin bên dưới và có thể hiểu thêm về những công việc của một SQL Developer.

SQL developer là gì?

SQL Developer là người làm việc trong lĩnh vực công nghệ thông tin. Họ là người thiết kế, tạo và duy trì hệ thống cơ sở dữ liệu hoặc trang web bằng Structured Query Language – SQL. Không chỉ vậy, SQL developers còn quen thuộc với những ngôn ngữ truy vấn có cấu trúc như Oracle, SQL Server, MySQL, SQLite và PostgreSQL. 

Lập trình viên SQL là một trong những chuyên môn có nhu cầu tuyển dụng cao trên thị trường. Hầu hết các công ty phát triển dựa trên dữ liệu và chuyển đổi kỹ thuật số. Do đó hàng loạt SQL Developer Jobs ra đời mang đến nhiều cơ hội việc làm cho các bạn trẻ. Nếu bạn muốn bắt đầu sự nghiệp với vị trí này, hãy tìm hiểu kỹ SQL Developer là gì, công việc như thế nào và yêu cầu ra sao.

sql developer là gì

Công việc của lập trình viên SQL là gì?

Nhiệm vụ chính của một SQL Developer có thể được mô tả ngắn gọn bằng từ “CRUD”, viết tắt của ‘Create, Read, Update, and Delete”, tức là “Tạo, Đọc, Cập nhật và Xóa”  trong các hoạt động cơ sở dữ liệu. Cụ thể, các công việc chính của lập trình viên SQL bao gồm:

  • Thu thập các yêu cầu của người dùng
  • Định dạng ngôn ngữ truy vấn
  • Viết truy vấn SQL để tích hợp tối ưu với những ứng dụng khác
  • Thiết kế cấu trúc cơ sở dữ liệu dùng để lưu trữ và truy cập thông tin liên quan đến kinh doanh
  • Tạo trình kích hoạt cơ sở dữ liệu để sử dụng trong tự động hóa
  • Đánh giá cơ sở hạ tầng mạng, chạy thử nghiệm chẩn đoán và cập nhật hệ thống bảo mật thông tin để có hiệu suất tối ưu và điều hướng hiệu quả.
  • Ghi lại code, báo cáo tiến độ, thực hiện đánh giá và phản hồi

SQL Developers thường sẽ làm việc với thời gian 40 tiếng một tuần. Tất nhiên, nếu khối lượng công việc quá lớn hoặc chuyên môn chưa vững thì làm việc ngoài giờ là một điều tất nhiên để phát triển. Họ có thể làm việc trực tiếp tại văn phòng hoặc làm việc từ xa, hoặc có những người lựa chọn làm chuyên viên cố vấn cho nhiều công ty cùng một lúc.

Làm thế nào để trở thành SQL Developer

Bằng cử nhân

Bạn hãy cố gắng hoàn thành chương trình đại học/cao đẳng về khoa học máy tính hoặc một chuyên ngành liên quan như hệ thống thông tin máy tính. Những chương trình này giúp bạn hiểu về lập trình và mạng máy tính. 

Bên cạnh đó, trong chương trình cử nhân, bạn sẽ học được các kỹ năng như quản lý cơ sở dữ liệu, điều mà các nhà tuyển dụng thường yêu cầu ở một ứng viên SQL Developer. Bạn có thể tập trung vào các kiến thức như:

  • Thuật toán máy tính
  • Đại số và giải tích
  • Tổ chức máy tính
  • Thiết kế thuật toán
  • Các kiểu dữ liệu trừu tượng

Thực tập

Tham gia vào các chương trình thực tập ở các công ty/tổ chức công nghệ (lớn nhỏ đều được) cho phép bạn ứng dụng những điều đã học được và tích lũy những làm việc kinh nghiệm thực tế. Mặt khác, kinh nghiệm này có thể giúp bạn có những cơ hội việc làm trong tương lai.

Nâng cao kiến thức về cơ sở dữ liệu

Cố gắng nâng cao kiến thức cơ sở dữ liệu của bạn bằng cách đăng ký các khóa học, bạn vẫn có thể tìm thấy một số khóa học online miễn phí có sẵn trên mạng. Kiến thức về cơ sở dữ liệu là một kỹ năng cần thiết để gia tăng tỷ lệ cạnh tranh trong thị trường nhân lực. Bạn có thể xem xét những chủ đề gồm:

  • Dịch vụ đám mây như Microsoft Azure hay Amazon Web Services
  • Vòng đời phát triển phần mềm – The Software Development Life Cycle (SDLC), đặc biệt là Agile và Scrum.
  • Hệ thống cơ sở dữ liệu NoSQL như CouchDB hoặc MongoDB
  • Server Reporting Services (SSRS) và SAP Crystal Reports
  • Các công cụ báo cáo và kinh doanh thông minh như Microsoft SQL

teamwork

Bắt đầu làm việc thực tế

Khi bạn tốt nghiệp (hoặc có thể chưa), tìm kiếm một entry-level job với tư cách là một nhà phát triển, lập trình viên hay quản trị viên cơ sở dữ liệu để tích lũy kinh nghiệm làm việc:

  • Tạo cơ sở dữ liệu
  • Hiểu được các vấn đề liên quan đến hiệu suất mạng và bảo mật
  • Biết cách để duy trì các tiêu chuẩn cao về chất lượng và tính toàn vẹn của dữ liệu

Mặt khác, kinh nghiệm sử dụng lập trình như C, Java và C# giúp bạn làm việc tốt với các team khác. Làm quen với Unix, NET framework, Windows batch scripts hoặc Bash giúp bạn tạo sự khác biệt hóa so với các đối thủ.

Bổ sung chứng chỉ

Mặc dù chứng chỉ là không bắt buộc, tuy nhiên nhiều nhà tuyển dụng mong muốn ứng viên của họ có chứng chỉ chuyên môn cụ thể. Một số chứng chỉ chuyên môn bạn có thể tham khảo như:

  • Microsoft Certified Systems Engineer: Data Management and Analytics
  • Oracle PL/SQL Developer Certified Associate
  • Microsoft Certified Professional Developer (MCPD)

Trao dồi kỹ năng mềm

SQL Developer cần phải làm việc cùng với những chuyên gia, kỹ sư công nghệ thông tin khác để thiết lập quá trình chuyển đổi kỹ thuật số của công ty. Do đó, hai kỹ năng quan trọng chính được đánh giá cao là kỹ năng giao tiếp và kỹ năng làm việc nhóm.

Kỹ năng giao tiếp

Để cải thiện kỹ năng này, bạn nên duy trì giao tiếp cơ thể một cách cởi mở (body language) trong lúc trao đổi thông tin với các thành viên trong nhóm để họ cảm thấy bạn đang chú ý vào những yêu cầu mà họ đề ra. Khi viết ghi chú hoặc báo cáo, bạn hãy viết thật cụ thể và ngắn gọn.

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

Cải thiện kỹ năng làm việc nhóm bằng cách đặt mục tiêu cho dự án và liệt kê những công việc mà bạn phải làm. Nắm rõ deadline công việc được giao và hoàn thành đúng thời hạn để tạo sự tin tưởng. Cuối cùng là hãy tích cực lắng nghe đồng nghiệp của bạn khi họ giải thích nhu cầu của cơ sở dữ liệu để bạn tránh hiểu lầm và đưa ra một chương trình phù hợp.

Trong tương lai, nhu cầu của thị trường tuyển dụng cho vị trí SQL Developer sẽ càng cao. Trên đây, mình đã mang đến thông tin về SQL Developer là gì cũng như kiến thức và kỹ năng cần trau dồi để trở thành SQL Developer. Hi vọng bài viết phần nào giúp bạn xác định hướng sự nghiệp cho bản thân.

Đọc thêm:

Bạn cũng đừng bỏ lỡ Top IT Job có trên TopDev nhé!

HTTP2 in real project

HTTP2 in real project

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

Note for http2

Http2 là một giao thức truyền thông tin qua mạng một cách hiệu quả và tiết kiệm tài nguyên. Mặc dù đã được giới thiệu từ lâu nhưng không ít lập trình viên backend còn cảm thấy mới với loại protocol này. Sau khi tìm hiểu và áp dụng vào dự án thực tế mình muốn chia sẻ những kiến thức của mình về giao thức này với mọi người hy vọng giúp ích được cho mọi người trong dự án của mọi người.

Dự án gần đây mình làm là viết client giao tiếp với notify server của apple. Apple đã dịch chuyển từ giao tiếp thông qua từ socket sang Http2 server. Trong khi làm việc mình cũng tìm được một số thư viện đã được viết sẵn để giao tiếp với service mới này của apple như :

Tuy nhiên để sử dụng thêm 1 thư viện mới vào product đang được chạy cũng có khá nhiều rủi ro vì cũng chưa có đủ thời gian để làm quen với chúng xem điểm mạnh, điểm yếu của thư viện. Tiếp đến việc ghép vào các interface có sẵn của project cũng khá khó. Nên mình tiếp tục tìm hiểu được một số thư viện có thể Http2 client viết sẵn trong java như :

  • okhttp3
  • netty

Trong bài này mình sẽ chia sẻ rõ hơn về 2 thư viện netty và okhttp3 này

Ứng dụng nổi tiếng nhất áp dụng Http2 mà mình từng biết là Grpc. Với Java thì Grpc sử dụng netty để xây dụng tầng transport của mình. Điều này khiến mình có thêm tài liệu là code của Grpc để tham khảo xây dụng http2 client để thao tác với Apple.

Bài blog này sẽ có code demo của các phần sau:

  • Simple http2 server
  • okhttp3 client
  • Simple netty http2 client

Simple http2 server

Demo về tốc độ của http2 server so với http1.1 trên mạng là rất nhiều :

  • http2demo.io
  • http2.akamai.com/demo

Khi các bạn vào trình 2 web site trên sẽ thấy được tốc độ load tài nguyên thực sự là chênh lệch rất nhiều nếu sử dụng http2.

Vì tò mò nên tôi cũng tự xây dựng cho mình 1 http2 server để test tốc độ cũng như để làm server test cho client của mình. Tôi sử dụng Spring-boot để tự viết Http2 server vì với Spring boot bạn sẽ làm được điều này rất nhanh chỉ cần thay đổi trong file config là bạn đã có 1 Http2 server sử dụng spring boot rồi. Code demo tại package http2.server. Sẽ được đính kèm ở cuối bài viết này.

Tại code demo này tôi sẽ cho trình duyệt load 180 cái ảnh để so sánh tốc độ. Trước khi load ảnh mình sẽ cho luồng đó dừng lại 100 ms

    @GetMapping(value = "/gophertiles_files/{name}", produces = MediaType.IMAGE_JPEG_VALUE)
    public ResponseEntity<ByteArrayResource> getImage(@PathVariable String name) throws IOException, InterruptedException {
        Thread.sleep(100);
        final ByteArrayResource inputStream = new ByteArrayResource(Files.readAllBytes(Paths.get(
                "image/" + name
        )));
        return ResponseEntity
                .status(HttpStatus.OK)
                .contentLength(inputStream.contentLength())
                .body(inputStream);

    }

Kết quả của http2

http2-load.PNG

Kết quả của http1.1

http1-load.PNG

Trình duyệt của bạn sẽ chỉ dùng 1 connection duy nhất để load dữ liệu từ http2 server thay vì 6 connection chạy song song với http1.1 server. Bạn có thể check được điều này bằng tab network trong ảnh. Đây là kỹ thuật ghép kênh quan trọng đưa tốc độ load dữ liệu của http2 nhanh hơn nhiều so với http1.1. Mở ít kết nối hơn cũng đồng nghĩa với việc tiết được nhiều tài nguyên hơn cho cả phía client và server.

Http2 client

Sau khi có một server http2 thì việc tiếp theo là xây dụng các client để giao tiếp với http2 server trên.

Netty Http2 client

Tại code example của netty cũng có demo về việc xây dựng một http2 client đơn giản với netty. Tại demo này của mình cũng sẽ sử dụng code đó và thay đổi 1 chút để giải thích một số config khá quan trọng để xây dựng http2 client.

Tài liệu chi tiết về http2 các bạn tham khảo tại link sau : httpwg.org/specs/rfc7540.html#top

Tại link đó sẽ mô tả chi tiết cho chúng ta về : StreamFrameErrorconfig, … Nếu các bạn muốn tự mình xây dựng 1 client mà không dựa vào netty thì có thể tham khảo nhé. Mình chỉ đọc để biết code với netty như thế nào thôi. Code demo tại package http2.client.netty;.

Tại đây mình sẽ giải thích 1 số thứ quan trong khi sử dụng netty làm client ứng với tài liệu viết tại link https://httpwg.org/specs/rfc7540.html#top

  • Stream Theo tài liệu của HTTP2 thì một connection sẽ sử dụng Stream để giao tiếp giữa client-server. Điều này giúp Http2 thực hiện ghép kênh trên cùng 1 kết nối TCP nhưng lại gửi được nhiều request. Mỗi Stream được định nghĩa bởi 1 ID vì vậy muốn biết được response này là của request nào thì mình cần phải biết được là Stream ID khi gửi request là gì và lưu lại. Theo tài liệu thì nếu là Client stream Id là một số lẻ bắt đầu từ 1,3,5,7,… Và nếu là Server thì sẽ bắt đầu từ 0,2,4,6,8,…

Khi bắt đầu thực hiện kết nối giữa client với server thì Client và Server phải gửi setting của mình cho nhau sau đó mới bắt đầu gửi request được. Điều đó giải thích cho việc trong code client demo của netty cũng như demo của mình để bắt đầu với Stream ID là 3. Tại class Http2ClientInitializer

    private int streamId =3;

    public int getCurrentStreamId(){
        int current =streamId;
        streamId +=2;
        return current;

    }
  • Frame Http2 sẽ gửi nhận dữ liệu thông qua các FrameHeader Frame và Data Frame, Netty cũng cung cấp cho chúng ta api đọc dữ liệu của các Frame này. Tại bản demo này để đơn giản mình không đọc dữ liệu thông qua Frame mà nhờ netty làm giúp điều này. Nếu được ủng hộ mình sẽ có bài viết implement theo Frame này.
  • SETTINGS_MAX_CONCURRENT_STREAMS Như đã trình bày ở trên thì khi thực hiện kết nối client, server sẽ gửi setting của mình cho nhau. 1 Trong những config quan trọng nhất cần quan tâm khi mình là client là SETTINGS_MAX_CONCURRENT_STREAMSSETTINGS_MAX_CONCURRENT_STREAMS số này có ý nghĩa là server sẽ chấp nhận số lượng Stream đồng thời tối đa là bằng SETTINGS_MAX_CONCURRENT_STREAMS, client không được gửi quá lượng lượng Stream lên server không thì server sẽ đóng lại Stream và Client sẽ không nhận được kết quả. Với server demo sử dụng spring boot của mình số SETTINGS_MAX_CONCURRENT_STREAMS sẽ là 100 và được gửi trong HEADER của HTTP2Setting. Với server của Apple con số này sẽ là 1000. Nếu bạn có như cầu gửi hơn 1000 request đến Apple 1 lúc thì hãy tạo thêm 1 connection mới nhé.
  • Với code demo trên thì bạn cũng nhận được kết quả là gọi 180 lần lên server với 1 connection thì kết quả sẽ là hơn 1 giây. Tất nhiên đây là 1 demo đơn giản nên nó sẽ chậm hơn trình duyệt 1 chút.

OKHttp3 client

Tiếp theo chúng ta sẽ sử dụng okhttp3 làm client. Vì code này ngắn nên bạn có thể xem Code demo bên dưới

package http2.client.okhttp;

import okhttp3.*;
import org.jetbrains.annotations.NotNull;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class OkhttpClient {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = getUnsafeOkHttpClient();
        client.dispatcher().setMaxRequestsPerHost(1);
        Request request = new Request.Builder()
                .url("https://localhost:8082/test")
                .build();

        Response r1 = client.newCall(request).execute();
        System.out.println(r1.protocol());
        client.dispatcher().setMaxRequestsPerHost(100);
        CountDownLatch countDownLatch = new CountDownLatch(180);
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 180; i++) {
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                    response.close();
                    countDownLatch.countDown();
                }

                @Override
                public void onFailure(@NotNull Call call, @NotNull IOException e) {

                }
            });
        }
        countDownLatch.await();
        long time = System.currentTimeMillis() - startTime;
        System.out.println("time run " + time);
    }

    private static OkHttpClient getUnsafeOkHttpClient() {
        try {
            ConnectionPool connectionPool = new ConnectionPool(1, 3000, TimeUnit.SECONDS);

            // Install the all-trusting trust manager
            SSLContext sslContext = SSLContext.getInstance("SSL");
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

            X509TrustManager manager = new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                }

                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            };

            TrustManager[] managers = new TrustManager[1];
            managers[0] = manager;

            sslContext.init(null, managers, null);


            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .followRedirects(false)
                    .sslSocketFactory(sslContext.getSocketFactory(), manager)
                    .protocols(Arrays.asList(Protocol.HTTP_2, Protocol.HTTP_1_1))
                    .retryOnConnectionFailure(true)
                    .connectionPool(connectionPool)
                    .build();

            return okHttpClient;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

OkHttpClient có một nhược điểm là sẽ mở rất nhiều connection dựa theo số MaxRequestsPerHost .Nếu các bạn không set giá trị MaxRequestsPerHost thì mặc định sẽ là 6 giống như trên trình duyệt. Sau khi gửi request đến server và biết được server lòa http2 server thì OkhttpClient sẽ đóng hết tất cả kết nối lại và chỉ sử dụng 1 kết nối dành cho mục đích truyền tải dữ liệu với server. Đó là lý do tại sao mình lại phải gửi 1 request trước mục đích để khởi động hệ thống sau đó mới thiết lập lại số MaxRequestsPerHost. Tiếp theo nữa là MaxRequestsPerHost cũng tương ứng với số luồng được mở ra trong java để gửi nhận dữ liệu điều này cũng khá tốn thời gian. Và tại sao mình lại config số MaxRequestsPerHost là 100 thì đã được giải thích tại mục netty.

Khi sử dụng OkHttpClient mình hoàn toàn không lấy được setting của server để setting lại số MaxRequestsPerHost sao cho tối ưu nhất. Tiếp đến việc mở quá nhiều kết nối TCP tại thời điểm đầu tiên cũng là một nhược điểm của OKHttpClient. Việc sử dụng OKHttpClient sẽ làm code ngắn gọn hơn rất nhiều nhưng không mang lại hiệu quả tối ưu nhất khi sử dụng với product của mình. Việc disconnect và connect lại của OKHttpClent khiến mình không làm chủ được việc thiết lập config setMaxRequestsPerHost cho tối ưu.

Khi làm và tìm hiểu về OkHttpClient mình có đọc được 1 issue khá hot của nó tại link : github.com/square/okhttp/issues/3442

Tại issue này mọi người có nói đến việc MaxRequestsPerHost này. Trong có có người bình luận là I am sending warm up request and setting setMaxRequestsPerHost to 50. then when tried downloading images, Http/2 seems to be much slower than Http1.1 và chưa thấy ai giải thích việc này.

Mình xin giải thích việc này như sau để nếu như các bạn sử dụng OkHttpClient thì sẽ có thể tham khảo. Khi mình đọc code của OkHttpClient mình phát hiện ra số MaxRequestsPerHost này nếu bạn sử dụng HTTP1.1 thì sẽ tương ứng với mở 50 connection khác nhau đến server điều này hiển nhiên khiến bạn có thể tải được 50 ảnh cùng 1 lúc. Nhưng sao bạn set số MaxRequestsPerHost là 50 với Http2 lại có tốc độ thấp hơn khi so với Http1.1 vì theo lý thuyết nó sẽ gửi 50 request lên server 1 lúc. Điểu này lại ứng với server bạn gọi lên, mỗi server sẽ có các cách implement khác nhau để xử lý số lượng Stream bạn gửi lên. Mặc dù server trả lại cho bạn là có thể nhận > 100 (SETTINGS_MAX_CONCURRENT_STREAMS thường lớn hơn 100) request 1 lúc nhưng tại bản thân của nó sẽ chỉ xử lý 1 lượng Stream nhỏ hơn số này. Ví dụ với Http2 server demo vì mình dùng tomcat thì nó chỉ xử lý cùng 1 lúc là 20 Stream mặc dù nhận được 100 Stream. Config đó là maxConcurrentStreamExecution tham khảo tại tài liệu của tomcat mặc định số này là 20. Vậy tại đây có thể tạm hiểu là 1 connection của Http2 có thể bằng 20 connection của Http1.1

Vì các lý do trên bạn sẽ thấy tốc độ của HTTP1.1 khi MaxRequestsPerHost là 50 nhanh hơn Http2 nếu sử dụng Okhttp3Client. Nhưng trên thực tế sử dụng bạn không bao giở mở nhiều connection như thế vì nó tốn tài nguyên và cũng có thể bị server từ chối mở kết nối.

Khi nào nên sử dụng HTTP2

Với sự hỗ trợ mạnh mẽ của các server hiện nay thì mình nghĩ việc chuyển đổi từ HTTP1.1 sang HTTP2 là việc cần thiết và nên làm để tăng trải nghiệm khách hàng của bạn. Như bạn biết trình duyệt của bạn chỉ mở 6 connection vậy nên tốc độ không thể nào so sánh được với HTTP2 nên việc trải nghiệm dịch vụ của bạn sẽ bị tốt hơn nhiều khi sử dụng HTTP2.

Nếu bạn muốn truyền tải thông tin giữa các server nếu không cần cấu hình quá đặc biệt thì hãy thử sử dụng Grpc nó sẽ tiết kiệm rất nhiều tài nguyên và thời gian cho bạn. Mặc dù bạn có sử dụng Grpc thì cũng nên tự xây cho mình 1 Http2 server để học và tìm hiểu nó sâu hơn và cũng giúp bạn config Grpc một cách tối ưu nhất. Tất nhiên không phải cách tự xây dụng là sử dụng Tomcat hay Jetty nhé vì nó xây hết rồi lấy gì mà học hỏi nữa.

Nếu bài toán của bạn là xây dụng client giao tiếp với Apple thì mình khuyên bạn nên tự xây dụng dụa trên netty hoặc sử dụng pussy thay vì dùng okhttp3 mặc dù dùng okhttp3 là rất dễ nhưng nó sẽ không mang lại cho bạn 1 kết quả tốt nhất được.

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

Xem thêm:

Top IT Jobs cho các Developers có trên TopDev

Google Của Hàn Quốc – NAVER Khai Trương Trung Tâm Lập Trình Tại TP Hồ Chí Minh

Với mục tiêu xây dựng trung tâm mạnh nhất khu vực Đông Nam Á về nghiên cứu Trí tuệ nhân tạo (AI), cuối tháng 2 vừa qua, Tập đoàn công nghệ Naver (Hàn Quốc) chính thức khai trương Trung tâm Lập trình (Dev Center) đầu tiên tại TP. Hồ chí Minh, Việt Nam.

Đại diện Naver Việt Nam (công ty con có tư cách pháp nhân tại Việt Nam của tập đoàn Naver HQ) – ông Park Dong Jin chia sẻ: Trung tâm sẽ nghiên cứu, phát triển các tính năng mới và vận hành các tính năng cho các dịch vụ sẵn có và sắp có của Naver. Trong đó, các team lập trình đang tập trung chủ yếu vào nghiên cứu, phát triển cho các dịch vụ như WORKS (công cụ làm việc tích hợp các chức năng như mail, calendar (lịch trình), drive (lưu trữ) và contact (danh bạ) với trọng tâm là kết nối nội bộ doanh nghiệp.); MUSIC (với nền tảng âm nhạc VIBE); BBOOM (Nền tảng cộng đồng, giúp mọi người chia sẻ suy nghĩ, kinh nghiệm bản thân); FANSHIP (phát triển từ Ứng dụng truyền hình trực tiếp VLive – nơi kết nối nghệ sĩ kpop và người hâm mộ) … Bên cạnh đó, các lập trình viên của Dev Center cũng sẽ lên ý tưởng và thiết kế các sản phẩm mới cho Naver Clova AI Lab.

Trung tâm Lập trình (Dev Center) đầu tiên tại TP. Hồ chí Minh, Việt Nam

Trung tâm Lập trình (Dev Center) đầu tiên tại TP. Hồ chí Minh, Việt Nam

Các dịch vụ đang được Naver cung cấp

Các dịch vụ đang được Naver cung cấp

Được biết, Trung tâm cũng thuộc dự án Global AI R&D Belt (mạng lưới hợp tác nghiên cứu và phát triển AI mạnh mẽ từ Hàn Quốc đến Nhật Bản, Châu Âu, Châu Mỹ và Đông Nam Á do Naver triển khai từ năm 2018) và sẽ là nơi hội tụ, kết nối các Phòng nghiên cứu Trí tuệ nhân tạo hợp tác với các trường đại học ở Việt Nam.

Chia sẻ về tầm quan trọng của Dev Center, Ông Park Dong Jin cho biết, bốn thành phần chính của dự án Global AI R&D Belt là Chuyên gia, Dữ liệu, Cơ sở hạ tầng và Thị trường kinh doanh. Bằng cách xây dựng Trung tâm Lập trình làm trụ sở nghiên cứu chính, kết nối các phòng lab hợp tác với trường đại học, Naver có thể thu hút được nhiều tài năng AI xuất sắc tại Việt Nam. Ngoài ra, thông qua trung tâm, tập đoàn có thể xây dựng dữ liệu địa phương và toàn cầu với quy mô lớn, để đào tạo các mô hình AI cạnh tranh. Bên cạnh đó, việc đi sâu tìm hiểu các nền văn hóa và thị trường địa phương sẽ giúp hoạt động kinh doanh AI của Naver thành công trên toàn cầu. Hơn nữa, các đối tác hợp tác nghiên cứu cũng sẽ có thêm nhiều kinh nghiệm giải quyết các bài toán AI thực tế, đa dạng và đầy thách thức trong thế giới thực.

Vành đai Global AI R&D

Vành đai Global AI R&D đang được phát triển và mở rộng từ Hàn Quốc đến Nhật Bản, Pháp, Việt Nam, Mỹ, Canada, Đức, …

Dù Việt Nam có thể chưa được coi là một trong những quốc gia dẫn đầu thế giới về KH&CN, song Việt Nam vô cùng nổi trội trong lĩnh vực khoa học máy tính (computer science), đồng thời sở hữu nguồn nhân lực IT trẻ đầy tiềm năng. Tiêu biểu phải kể đến các kết quả nghiên cứu và các hoạt động hợp tác giữa Naver và hai trường đại học tiêu biểu của Việt Nam là ĐH Bách Khoa Hà Nội (HUST) và Học viện Công nghệ Bưu chính Viễn thông Hà Nội đã vượt qua sự mong đợi của các bên. Trong đó, công trình nghiên cứu về trích xuất các cụm từ đồng nghĩa/gần nghĩa (synonym extraction) trong môi trường văn bản mà Naver tiến hành triển khai với HUST đã mang về thành công vang dội khi được công bố tại EMNLP 2021 – Hội nghị lớn nhất thế giới về lĩnh vực xử lý ngôn ngữ tự nhiên. Ngoài ra, 2 hội thảo AI NOW tổ chức vào cuối năm 2021 đã thu hút hàng trăm nghìn lượt theo dõi trực tuyến; Cuộc thi Hackathon (BKAI x Naver) diễn ra từ đầu tháng 4/2022 cũng gây tiếng vang khi có gần 200 đội dự thi; … Chính vì vậy, để đánh dấu bước đầu hợp tác thành công, đầu tháng 5 vừa qua, Naver và HUST, PTIT đã chính thức quyết định nội dung hợp tác năm thứ 2, dự kiến sẽ triển khai nhiều hoạt động ý nghĩa tại Việt Nam hơn nữa.

Hiện tại, Naver cũng đang tập trung vào tuyển dụng nhân tài cho Trung tâm Lập trình. Theo tiến trình, đến năm 2023, Dev Center sẽ có khoảng 300 nhân sự Dev. Các vị trí đang tuyển dụng gồm: Backend Engineer (Java), Frontend Engineer (ReactJS/VueJS), macOS Engineer (Objective-C/Swift), Windows Engineer (C/C++), Windows Engineer (C# .net), iOS Engineer (Swift), Android Engineer (Java/Kotlin), Frontend Engineer (HTML/CSS),….

Một góc của Trung tâm Lập trình Naver Dev Center tại TP Hồ Chí Minh

Một góc của Trung tâm Lập trình Naver Dev Center tại TP Hồ Chí Minh

NAVER VIETNAM DEVELOPMENT CENTER

📍 Địa chỉ: Lầu 4, Tháp B, Toà Nhà Viettel, 285 CMT8, phường 12, quận 10, TP.HCM

🌐  Careers Site: https://lnkd.in/gyAWvw5i

🌐  Linkedin Fanpage: NAVER VIETNAM

🌐  Official Website: https://www.navercorp.vn/

Hướng Dẫn Assembly 64bit (Tái Bản)

hướng dẫn assembly 64bit

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

Nhiều bạn hỏi mình lập trình viên nên học ngôn ngữ gì, hôm nay mình xin giới thiệu một ngôn ngữ khá quen thuộc..

LỜI NÓI ĐẦU

Suốt hàng ngàn năm, con người đã sử dụng các ngôn ngữ lập trình để bắt máy tính phải “hiểu” mình và làm theo mệnh lệnh của mình. Các bạn đừng bị thị trường lừa dối, bởi vì máy tính vốn chỉ hiểu một ngôn ngữ duy nhất, đó là ngôn ngữ máy (machine code). Và trong khi các bạn diễn giải ý định của mình bằng java hay c# thì máy tính hoàn toàn không hiểu được. Và phải qua các bước biên dịch phức tạp thì máy mới hiểu được bạn muốn nói gì. Nhưng mà “tam sao thất bản”, chắc chắn máy tính sẽ không hiểu đúng 100% bạn ý định nói gì đâu. Mà coi như là máy tính hiểu bạn rồi, thì khi nào bạn sẽ hiểu máy tính?

Nếu bạn là người yêu máy tính, thích lập trình thì hãy nhanh chân học ngôn ngữ mà máy cũng hiểu và bạn cũng hiểu. Mình sẽ không bắt các bạn phải học mã máy, nhưng chí ít bạn nên học Assemb-Ly vì với máy tính, như thế là tuyệt lắm rồi. Assembly – Machine code nó tương đương 1-1 nên nếu biết assembly thì cũng tạm chấp nhận.

Đối với các bạn học bách khoa thì quả thật là may mắn vì các bạn đã được học assembly. Nhưng mà chắc là đã quên hết rồi nên trong bài này mình sẽ hướng dẫn lại căn bản cho các bạn.

Trong bài viết sử dụng MacOS và Xcode để lập trình nên bạn nào không có thì sử dụng trí tưởng tượng phong phú của mình.

CĂN BẢN ASSEMBLY

Data size: Các khái niệm cơ bản về kích thước của dữ liệu khi làm việc: byte (8 bit) -> word (16 bit) -> double words (32 bit) -> quad words 64 bit). Mình chỉ làm việc với 2 toán tử có kích thước tương đương.

Thanh ghi: Là các thanh nhớ đặc biệt dùng để tính toán. Khi tính toán thì chỉ thao tác với giá trị trên thanh ghi. (các thanh ghi general các bạn từng học như ax <=> al: (8 bit); ax: (16 bit); eax (32 bit); rax (64 bit))

Lưu trữ dữ liệu: Ngoài thanh ghi, có 2 vùng nhớ là stack và heap.

Lệnh: có các nhóm lệnh: đọc ghi dữ liệu / tính toán / điều khiển (lệnh nhảy – gọi hàm).

Nhãn (label): Mình có thể đánh dấu các câu lệnh, vùng nhớ bằng nhãn để có thể tham chiếu sau này.

Cú pháp: [<nhãn>:] <mã lệnh> nguồn[, đích]

Ví dụ:

movl $1, %eax; // gán eax = 1

move $1 to %eax (l nghĩa là kiểu long (4 bytes), b = bytes, w = word (2 bytes), q = quad words (8 bytes))

assembly 64bit

HELLO WORLD

Để bắt đầu, các bạn mở Xcode và tạo 1 dự án Command Line Tool, chọn ngôn ngữ là C. Bước tiếp theo, đổi tên main.c thành main.s và xoá hết code C trong main.s. .s là file chứa mã nguồn assembly.

Lúc biên dịch, bạn sẽ nhận được một thông báo lỗi như sau:

Undefined symbols for architecture x86_64:

 “_main”, referenced from:

    implicit entry/start for main executable

Thông báo lỗi này do chưa viết hàm main.

Chương trình assembly được chia thành nhiều đoạn (segment), cấu trúc căn bản như sau:

.section __DATA, __data // section data chứa data sử dụng trong chương trình

.section __TEXT, __text // section text chứa code trong chương trình

Chương trình muốn chạy được thì phải có symbol _main, do đó ta thêm symbol _main vào trong chương trình.

.section __DATA, __data // section that stores data

.section __TEXT, __text // section that stores executable code

.global _main

_main:

Chỉ thị global _main đăng kí với trình biên dịch symbol _main sẽ được public trong giai đoạn liên kết.

Bây giờ chúng ta đã biên dịch thành công, tuy nhiên lúc chạy chương trình sẽ gặp lỗi sau:

Thread 1: EXC_BAD_ACCESS

Hàm main chưa có gì thì làm sao mà chạy? làm sao mà chạy?

Lý do là hàm main hiện tại chúng ta chưa viết gì cả. Vậy hàm main sẽ làm gì? Chúng ta sẽ thử ra chỉ thị kết thúc chương trình.

_main:

movl $0x2000001, %eax

syscall

Nếu như trong MS DOS các bạn quen với interrupt (ngắt hệ thống) thì ở hệ thống 64 bit đó là syscall, các chương trình con của hệ thống. $0x2000001 là system exit(). Các bạn có thể tham khảo các chương trình con này ở

http://opensource.apple.com//source/xnu/xnu-1228.5.20/bsd/sys/syscall.h.

– Định nghĩa + tham số tương đương ở đây: http://opensource.apple.com//source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master

Như vậy chương trình của chúng ta đã chạy. Nhưng nó kết thúc ngay lập tức chưa kịp làm gì cả. Vậy làm sao để in ra chữ HelloWorld?

Nhìn trong file mình vưà gửi thì syscall 4 sẽ in viết một thông điệp ra dòng xuất chuẩn. Có 3 tham số : 1 là kí hiệu của dòng xuất (output stream) và 2 là thông điệp, 3 là kích thước của thông điệp

Ta chỉnh sửa lại chương trình như sau:

.section __DATA, __data

 helloMessage: .asciz "Hello World\n"

.section __TEXT, __text

.global _main

_main:

 movl $0x2000004, %eax // the print syscall function

 movl $1, %edi // standard output = 1

 movq helloMessage@GOTPCREL(%rip), %rsi // address to message

 movq $100, %rdx // size of the message

 syscall 

 movl $0x2000001, %eax // the exit syscall function

 movl $0, %ebx // exit code == 0

 syscall

Ta vừa thêm dữ liệu chứa dòng helloMessage vào segment data với nội dung là “Hello World\n”. Lúc biên dịch, nội dung này cũng sẽ được copy vào file thực thi, và lúc chạy sẽ hiện được tải vào data segment.

Để lấy địa chỉ của helloMessage, ta sử dụng cú pháp helloMessage@GOTPCREL(%rip), tương tự với toán tử lấy địa chỉ trong C: &helloMessage, sau đó ta gán vào tham số thứ 2, thanh ghi %rsi. Tham số thứ 3 là kích thước của thông điệp, ghi đại 0x100.

Sau khi gọi chương trình con số 4 của syscall, màn hình sẽ in ra dòng “Hello World”. Sau đó ta gọi chương trình con số 1 của syscall để kết thúc chương trình. Vậy là ta đã có chương trình “Hello World” đầu tiên. Xin chúc mừng!

!!!. Bây giờ bạn có thể yên tâm lên LinkedIn và cập nhật CV master Assembly.

Hẹn các bạn trong những bài viết tiếp theo về Assembly.

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

Xem thêm:

Đừng bỏ lỡ việc làm IT hàng đầu dành cho Top Devlopers tại TopDev!