Home Blog Page 61

Lập trình C++ cơ bản – Tất tần tật kiến thức về C++

lập trình c++ cơ bản

Lập trình C++, chà, ngôn ngữ thì lâu đời rồi nhưng giờ vẫn còn nhiều anh em học. Thật lòng mà nói thì bắt đầu với C++ lúc làm quen với lập trình không phải không tốt. Cùng TopDev tìm hiểu các kiến thức cơ bản về ngôn ngữ C++ cũng như điểm qua các ứng dụng có thể viết bằng C++ cũng như cơ hội việc làm hiện nay.

c++ là gì
C++ là gì? Tổng hợp kiến thức lập trình C++

C++ là gì?

C++ (còn được viết là C plus plus hay CPP) là một ngôn ngữ lập trình hướng đối tượng (OOP) được nhiều người xem là ngôn ngữ tốt nhất để tạo các ứng dụng quy mô lớn. C++ là một phần mở rộng của ngôn ngữ C.

C++ là một loại ngôn ngữ lập trình bậc trung (middle-level), mang cả tính chất của ngôn ngữ lập trình bật thấp như pascal hay C và ngôn ngữ lập trình bậc cao (C#, Java, Python…)

C++ cho phép các nhà phát triển phần mềm định nghĩa các kiểu dữ liệu của riêng họ và thao tác chúng bằng các hàm và phương thức. Nó cũng cho phép lập trình cấp thấp và cung cấp quyền truy cập vào bộ nhớ, giúp thực thi mã nhanh chóng và hiệu quả. Nó cũng hỗ trợ lập trình tổng quát bằng cách sử dụng các mẫu, cho phép mã được viết dưới dạng tổng quát và tái sử dụng cho các kiểu dữ liệu khác nhau.

C++ được sử dụng trong các lĩnh vực như phần mềm hệ thống, phát triển game, hệ thống nhúng, tính toán khoa học và các ứng dụng hiệu suất cao. Thư viện chuẩn của C++ cung cấp một loạt các tiện ích và hàm mã hóa, giúp phát triển các hệ thống phần mềm phức tạp dễ dàng hơn. C++ có thể chạy trên nhiều nền tảng, bao gồm Linux, Mac và Windows.

Lịch sử hình thành của lập trình C++

C++ được phát triển bởi nhà khoa học máy tính Đan Mạch Bjarne Stroustrup vào năm 1983 tại Bell Labs như một phần mở rộng của ngôn ngữ lập trình C. Stroustrup muốn kết hợp các tính năng của lập trình hướng đối tượng từ ngôn ngữ Simula với hiệu suất và tính linh hoạt của C.

Phiên bản đầu tiên của C++ được phát hành vào năm 1985. C++ được chuẩn hóa lần đầu tiên vào năm 1998 bởi Tổ chức Tiêu chuẩn hóa Quốc tế (ISO) dưới tên ISO/IEC 14882:1998. Các phiên bản tiếp theo bao gồm C++03, C++11, C++14, C++17 và gần đây nhất là C++20 được phát hành vào tháng 12 năm 2020. C++ đã trở thành ngôn ngữ lập trình mạnh mẽ và linh hoạt, được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau.

Ứng dụng của lập trình C++

Ứng dụng của ngôn ngữ C++
Ứng dụng của ngôn ngữ C++

C++ được sử dụng theo nhiều cách khác nhau để tận dụng tính linh hoạt và hiệu suất của nó. Một số ứng dụng chính của C++ bao gồm:

  • Hệ điều hành (OS): Khả năng cấp thấp của C++ cho phép quản lý bộ nhớ hiệu quả và kiểm soát tài nguyên hệ thống, phù hợp cho phát triển các hệ điều hành.
  • Trò chơi và đồ họa: Hiệu suất cao của C++ và khả năng tương tác với phần cứng làm cho nó là lựa chọn tốt cho các engine game như Unreal Engine của Epic Games và Unity của Unity Technologies, cũng như các tác vụ lập trình đồ họa như render thời gian thực, xử lý hình ảnh và mô phỏng vật lý.
  • Hệ thống nhúng: C++ thường được sử dụng trong phát triển các hệ thống nhúng, như thiết bị y tế, hệ thống ô tô và các thiết bị Internet of Things.
  • Thư viện phần mềm: C++ là nền tảng cho nhiều thư viện cấp cao, như Boost và Thư viện Mẫu Chuẩn (STL), cung cấp các cấu trúc dữ liệu và thuật toán tổng quát.
  • Tính toán hiệu suất cao (HPC): C++ phù hợp cho các ứng dụng HPC đòi hỏi hiệu suất tính toán tối đa và xử lý song song, thường được sử dụng trong mô phỏng khoa học, phân tích số và mô hình toán học.
  • Phát triển web: Mặc dù C++ không thường được sử dụng cho phát triển web, nó đóng vai trò quan trọng trong backend của các ứng dụng web, như máy chủ web và các giao thức mạng.
  • Lập trình hệ thống: C++ thường được sử dụng cho các tác vụ lập trình hệ thống, như driver thiết bị, giao thức mạng và tiện ích hệ thống.

Ưu điểm và nhược điểm của C++

Ưu điểm

Học lập trình C++ vẫn rất quan trọng và hữu ích trong thời điểm hiện tại vì các lý do sau:

  1. Hiệu suất cao: C++ cung cấp khả năng thao tác bộ nhớ cấp thấp và kiểm soát tối ưu tài nguyên hệ thống, phù hợp cho các ứng dụng yêu cầu hiệu suất cao như game, hệ thống nhúng và phần mềm hệ thống.
  2. Tính linh hoạt: Hỗ trợ lập trình hướng đối tượng, tổng quát và hàm, giúp giải quyết nhiều loại vấn đề khác nhau.
  3. Nền tảng vững chắc: Là nền tảng cho nhiều thư viện và framework, hỗ trợ phát triển phần mềm phức tạp.
  4. Ứng dụng rộng rãi: Sử dụng trong nhiều lĩnh vực như hệ điều hành, trình biên dịch, phần mềm mô phỏng khoa học, tài chính, và nhiều lĩnh vực khác.
  5. Tiêu chuẩn hóa và cộng đồng: C++ được tiêu chuẩn hóa bởi ISO và có một cộng đồng lập trình viên lớn hỗ trợ.

Nhược điểm

  1. Độ phức tạp và khó học: C++ có nhiều tính năng và cú pháp phức tạp, làm cho việc học và sử dụng trở nên khó khăn, đặc biệt đối với người mới bắt đầu.
  2. Quản lý bộ nhớ thủ công: C++ yêu cầu lập trình viên phải tự quản lý bộ nhớ, dễ dẫn đến rò rỉ bộ nhớ và các vấn đề khác nếu không được xử lý đúng cách.
  3. Rủi ro bảo mật: Truy cập trực tiếp vào bộ nhớ có thể gây ra các lỗi bảo mật nếu không được kiểm soát cẩn thận.
  4. Không có thu gom rác: Thiếu cơ chế tự động giải phóng bộ nhớ, lập trình viên phải tự tay giải phóng bộ nhớ không cần thiết.
  5. Cú pháp phức tạp: Cú pháp của C++ phức tạp hơn nhiều so với các ngôn ngữ lập trình khác, làm cho việc đọc và viết mã tốn nhiều thời gian hơn.
  6. Thời gian biên dịch lâu: C++ thường có thời gian biên dịch lâu hơn so với các ngôn ngữ có kiểu động hoặc biên dịch ngay lập tức.

Lương và Cơ Hội Việc Làm Lập Trình C++ tại Việt Nam

Mức Lương Lập Trình Viên C++

Mức lương của lập trình viên C++ tại Việt Nam phụ thuộc vào nhiều yếu tố như kinh nghiệm, vị trí làm việc và quy mô công ty. Dưới đây là một số mức lương phổ biến:

  • Mức lương trung bình: Lập trình viên C++ trung bình nhận khoảng 20-30 triệu VND/tháng.
  • Mức lương cao: Đối với các vị trí cao cấp hoặc ở các công ty lớn, mức lương có thể lên đến 50-60 triệu VND/tháng hoặc cao hơn.
  • Fresher: Mức lương cho lập trình viên mới ra trường (fresher) thường dao động từ 10-15 triệu VND/tháng.

Các công ty như NAKIVO, Pentalog Việt Nam, LG Electronics Development Vietnam và FOIS VIỆT NAM là những đơn vị trả lương cao nhất cho lập trình viên C++ với mức lương có thể lên tới 64 triệu VND/tháng​ (theo Tổng quan mức thu nhập lập trình viên – TopDev 2023)​.

Cơ Hội Việc Làm

Lập trình viên C++ có nhiều cơ hội việc làm trong các lĩnh vực khác nhau:

  • Phát triển phần mềm hệ thống: C++ được sử dụng rộng rãi trong phát triển hệ điều hành và phần mềm nhúng.
  • Game Development: Các công ty game lớn như VNG và Gameloft thường xuyên tuyển dụng lập trình viên C++ cho việc phát triển các trò chơi.
  • Tài chính và ngân hàng: Các hệ thống tài chính yêu cầu hiệu suất cao và độ tin cậy lớn thường sử dụng C++.
  • Công nghệ ô tô: C++ được sử dụng trong phát triển phần mềm cho xe tự lái và các hệ thống hỗ trợ lái xe.

Cú pháp và chương trình đầu tiên bằng lập trình C++

Bắt đầu với toàn lý thuyết khi muốn lập trình C++ cũng không phải là ý hay, tiếp theo là  cú pháp và biên dịch lập trình C++.

  • Viết chương trình mã code trong editor, anh em có thể dùng notepad hoặc bất cứ thứ gì nha. Lưu lại nó với format là .CPP, .C, .CP. Chỉ vậy là đủ
  • Cho anh em beginner thì không cần phức tạp, cứ up lên với online IDE nha (cái này là trình biên dịch online) dùng để chạy code của anh em. Link IDE đây nha anh em
  • Hiểu các thuật ngữ cơ bản

// Chương trình C++ in ra dòng chữ "Xin chao"
#include <iostream>
using namespace std;
  
// Main() function: nơi chương trình được thực thi
int main()
{
    // prints "Xin chao
    cout << "Xin chao";
  
    return 0;
}

Cứ code ở notepad chứ chưa cần cài IDE gì nha

Lập trình C++

Chương trình hello world (xin chào) là chương trình đầu tiên thường được viết khi học ngôn ngữ lập trình mới. Sau khi chạy và thấy kết quả output rồi.

Giờ tới lúc giải thích chi tiết cho anh em từng dòng code nha. Đừng hoang mang, mọi sự đều có lý do.

2. Giải thích từng dòng code

2.1 Dòng đầu tiên – comment

// Chương trình C++ in ra dòng chữ “Xin chao”: Dòng này là dòng comment (bình luận). Bình luận là cách mà anh em thêm nội dung bổ trợ để giải nghĩa cho code của mình. Dòng comment khi biên dịch chương trình sẽ không được để tâm tới. Nói chung là trình biên dịch sẽ bỏ qua nó, không quan tâm tới dòng này. Về khú pháp vì với lập trình C++, dòng comment luôn bắt đầu với ‘//’, không có ‘ nha anh em, hoặc có một cách khác là /*…*/, cái này là comment một khối.

// Chương trình C++ in ra dòng chữ "Xin chao"

Kiểu blog

/* Chương trình C++ in ra dòng chữ "Xin chao" */

2.2 Cần gì order giúp

#include: Trong ngôn ngữ lập trình C++ tất cả những dòng bắt đầu bằng dầu # sẽ được gọi bởi bộ tiền xử lý (gọi là biên dịch), thứ đọc code của anh em. Dòng #include này nói với trình biên dịch là cần iostream #include<iostream>. Trình biên dịch lúc nà hiểu lệnh này là, lúc mà biên dịch chương trình này á, làm ơn biên dịch giúp t luôn cả iostream. Về preprocessors anh em có thể tham khảo thêm More on Preprocessors.

#include <iostream>

À, vậy là với # thì cần gì mình cứ order với trình biên dịch, về sau anh em còn work nhiều với cái khác cần compile ha.

Tuyển dụng Fresher IT tại đây!

2.3 Viết nhiều không anh gì ơi?

Sau khi đã chuẩn bị nhiều thứ để sẵn sàng viết code, anh em vẫn thấy cái dòng số 3. Dòng này mới nhìn thì vô cùng khó hiểu.

using namespace std;

Bình tĩnh tui nói anh em nghe, trong Lập trình C++ á, namespace được dùng để khai báo sử dụng một tên không gian nào đó. Vẫn khó hiểu, ok

// file1.h
class LapTrinhCCongCong
{
};

// file1.h
class LapTrinhCCongCong
{
};

Phía trên đây ta thấy có 2 lớp có chung tên là LapTrinhCCongCong, trình biên dịch của C++ không thể hiểu được cái nào mới là đúng, lúc này namespace là thứ ta cần sử dụng tới.

#include <iostream>
using namespace std;
 
// Namespace n1
namespace LapTrinhCCongCong {
  void fun()
  {
      cout << "Xin Chao"
           << endl;
  }
}
 
// Sử dụng những thứ đã có ở namespace LapTrinhCCongCong
using namespace LapTrinhCCongCong;
 
// Driver Code
int main()
{
    // Gọi hàm fun đã khai báo sẵn trong namespace LapTrinhCCongCong
    fun();
    return 0;
}

Nhiều vị trí tuyển dụng C++ đãi ngộ tốt trên TopDev

2.4 Zô Zô, code thôi chứ khai báo đăng ký nhiều quá rồi

int main(): Dòng này khia báo một hàm có tên là main, chữ int đầu tiên có nghĩa là kiểu trả về và int này là integer (số). Hàm này bao gồm một loạt câu lệnh đằng sau nó. Anh em chú ý là tất cả các chương trình C++ đều phải bằng đầu với hàm main(), không quan trọng là hàm này nằm đâu, nhưng bắt buộc phải có hàm này.

int main()

2.5 Mở đóng, mở đóng mở

{ và }

Mở ngoặc là bắt đầu cho những gì sắp code ‘{‘ và dấu đóng ngoặc ‘}’ là kết thúc của hàm, ở đây là hàm main. Tất những gì anh em viết bên trong đóng và mở ngoặc đều là những câu lệnh sẽ được thực thi trong hàm main()

Tham khảo việc làm lập trình C trên TopDev

2.6 In xin chào đi thôi, lâu quá rồi

Bình tĩnh, giải thích từng dòng thì nó lâu, nhưng mà đã hiểu là hiểu sâu, hiểu rõ.

std::cout<<“Xin chao”;:  Dòng này nó nói với compiler là in ra đi, in giúp tao cái dòng “Xin chao” ở màn hình đi. Trong lập trình C++ thì xong này là một câu lệnh. Anh em nhớ tất cả câu lệnh trong C++ đều kết thúc bằng dấu chấm phẩy. Dấu chấm phẩy này sử dụng để trình compiler biết là nó kết thúc một câu lệnh. Dòng std::cout sử dụng để in ra những nội dung trong màn hình, nội dung này nằm trong hai dấu hai chấm.

Còn dấu bé?. Ok cái dấu bé này cho biết “<<” tất cả những gì sau nó sẽ hiển thị ra ngoài màn hình.

cout << "Xin chao";

2.7 Trả về gì đây? Trả về gì đây?

return 0; : Dòng này cũng là một câu lệnh nha anh em. Dòng này trả về giá trị cho hàm đã định nghĩa, ở đây là hàm name. Cứ thấy return, trả về là anh em hiểu là kết thúc một hàm. Có viết code vào đây thì cũng không chạy nữa. Câu lệnh này thường được sử dụng khi kết thúc một hàm

return 0;

Cuối cùng cũng xong, compile thành công nha anh em

Lập trình C++

3. Lưu ý

Bằng giải thích từng dòng code phía trên cho anh em mới bắt đầu bằng lập trình C++, có một số điểm anh em cần lưu ý .

  • Luôn luôn sử dụng include ở đầu file để thực thi các hàm dễ hàng hơn. Trong ví dụ này là <iostream>, nếu không có nó, câu lệnh trong hàm main như std::cinstd::cout sẽ không thể được gọi. Trình biên dịch sẽ báo lỗi
  • Thực thi của code luôn bắt đầu trong hàm main, bất kể là import thứ gì, không có hàm main() thì code sẽ không đươc thực thi.
  • It is a good practice to use Indentation and comments in programs for easy understanding.
  • cout is used to print statements and cin is used to take inputs.

Qua bài viết trên, bạn chắc hẳn cũng đã tích lũy được các kiến thức căn bản về lập trình C++. Cảm ơn anh em đã đọc bài – Thank you for your time. Happy coding!

TopDev tổng hợp và chỉnh sửa từ bài viết của tác giả Kiên Nguyễn

Xem thêm:

Tham khảo ngay việc làm IT mọi cấp độ trên TopDev!

 

Phép thử Turing – Bài kiểm tra trình độ AI dành cho máy tính

AI hay trí tuệ nhân tạo là 1 khái niệm không còn xa lạ ở thời đại hiện nay. Trong khoa học máy tính, AI được định nghĩa là trí thông minh mà được thể hiện bằng máy móc. Với AI, máy móc hiện nay có thể làm được rất nhiều thứ như con người, thậm chí nếu chỉ thông qua giao tiếp thông thường, bạn khó có thể xác định đối tượng bạn đang giao tiếp là người thật hay chỉ là 1 chiếc máy tính.

Vậy khi nào 1 máy tính được công nhận là sở hữu trí tuệ nhân tạo AI? Phép thử Turing (Turing Test) ra đời để trả lời cho vấn đề trên. Đây một phương pháp tìm hiểu về trí tuệ nhân tạo (AI) của máy tính, mục đích của nó là để xác định xem liệu một máy tính có khả năng suy nghĩ như con người không, hay nói cách khác Phép thử Turing là 1 bài kiểm tra trình độ AI dành cho máy tính. Trong bài viết này chúng ta cùng đi tìm hiểu về bài test này nhé.

Phép thử Turing là gì?

Phép thử Turing được đặt theo tên của nhà khoa học người Anh Alan Turing – người đã sáng lập ra phép thử này vào những năm 1950. Ông được 999xem như là cha đẻ của ngành khoa học máy tính và AI, nếu bạn muốn tìm hiểu thêm về ông thì có thể xem thêm phim “The Imitation Game” (Người giải mã) – một bộ phim kể về cuộc đời của ông và việc giải mã hệ thống điện báo của Đức Quốc xã trong chiến tranh thế giới thứ 2.

phép thử turingNguồn: Wikipedia

Mô hình chuẩn của phép thử Turing yêu cầu 3 thiết bị đầu cuối, mỗi thiết bị được tách biệt về mặt vật lý so với 2 thiết bị còn lại: trong đó 1 thiết bị được vận hành bởi máy tính, trong khi 2 thiết bị còn lại được vận hành bởi con người.

Như hình bên thì B và C sẽ con người, A là máy tính. C sẽ là “kẻ thẩm vấn” bằng cách thực hiện một cuộc thảo luận bằng ngôn ngữ tự nhiên với 2 “kẻ bị thẩm vấn” A và B, cả 2 đều cố gắng tỏ ra mình là con người. Nếu “kẻ thẩm vấn” C không thể nhận ra (hay phán đoán sai) A hay B là máy tính thì lúc đó máy tính A được xem là đã vượt qua phép thử về trí tuệ nhân tạo của nó. Điều này cũng đồng nghĩa với việc máy tính A được trang bị AI đã dần trở thành giống con người vì nó đã đánh lừa được con người thực sự.

Trong 1 khoảng thời gian dài sau đó, phép thử Turing trở thành động lực cơ bản trong lý thuyết và phát triển trí tuệ nhân tạo AI. Tiêu chuẩn đặt ra cho AI vào thời điểm đó là khả năng mô phỏng nhận thức và ra quyết định của con người. 

Khả năng kiểm tra trình độ AI của phép thử Turing

Vào thời điểm khi máy tính bắt đầu thể hiện được khả năng về “tư duy” và “trí tuệ” của mình thì việc định nghĩa trí tuệ nhân tạo gặp khó khăn và những câu hỏi liên quan đến việc đo lường khả năng tư duy của máy tính là điều bất khả thi. Phép thử Turing đã đưa ra cho chúng ta 1 cách thức để trả lời vấn đề trên cũng như 1 bài test để xác định xem máy tính có thực sự có trang bị AI hay không. AI – Trí tuệ nhân tạo ở trong phép thử Turing được hiểu 1 cách khá cơ bản: đấy là khả năng mô phỏng, bắt chước con người. Cũng chính vì sự đơn giản của mình mà phép thử Turing cũng mang khá nhiều nhược điểm và dần cho thấy sự lỗi thời của nó.

  • Yếu tố đầu tiên trong phép thử Turing là việc phản hồi lại những câu hỏi của người “thẩm vấn” một cách “con người nhất” khiến những câu hỏi trong phép thử Turing cần được hạn chế lại. Nói cách khác, máy tính muốn đạt được điểm cao trong bài test Turing thì cần có bộ câu hỏi trước có liên quan đến một lĩnh vực kiến thức hẹp nhất định, và nghiên cứu cho thấy bài test thích hợp sẽ chỉ bao gồm những câu hỏi có dạng Đúng hay sai (Yes/No questions).
  • Trong thực tế thì kết quả của thử nghiệm bị chi phối lớn do khả năng và thái độ của người hỏi. Có rất nhiều người với khả năng phán đoán của mình có thể dễ dàng nhận ra mình đang trò chuyện với 1 cái máy tính; nhưng ngược lại thì cũng có nhiều người rất khó để nhận ra sự khác biệt giữa 2 kẻ “bị thẩm vấn” ở đây.
  • Và điều quan trọng nhất mà khiến phép thử Turing không nhận được sự đồng tình cao trong quá trình phát triển của AI về sau này là tính hữu dụng của nó. Sự “thông minh” được đo lường qua phép thử Turing thể hiện bằng việc so sánh hành vi của máy tính và con người. Trong khi đó hiện nay như chúng ta đều biết, trọng tâm thực sự trong việc phát triển AI là làm thế nào để máy tính và con người tương tác với nhau hiệu quả, đem lại giá trị sử dụng tốt nhất cho con người. Nói đúng hơn thì máy tính không cần giống con người, miễn sao với trí tuệ của chúng có thể giúp đỡ con người 1 cách tốt nhất là được. 

Ứng dụng phép thử Turing hiện nay

Với những nhược điểm của mình thì hiện nay việc một máy tính có thể vượt qua được phép thử Turing hay không đã trở nên không mấy liên quan trong lĩnh vực AI. Tuy nhiên chúng ta cũng có thể bắt gặp nhiều phiên bản hay ứng dụng của nó đang được sử dụng rộng rãi hiện nay

  • CAPTCHA / reCAPTCHA

recaptcha

Nguồn: pvm.com.vn

Captcha hay reCaptcha là 1 hệ thống giúp phân biệt được truy cập từ người dùng hay từ những con bot. Có nhiều phương pháp được sử dụng như: nhập text, nhập kí tự trong hình ảnh, lựa chọn hình ảnh có nội dung, … Đây được xem là 1 ứng dụng của phép thử Turing, chỉ khác là lúc này người “thẩm vấn” lại chính là 1 hệ thống máy tính.

  • Chatbot

ứng dung turing trong chatbot

Nguồn: doopage.com

Chatbot cũng có thể được xem là 1 ứng dụng của phép thử Turing. Trong lĩnh vực tư vấn bán hàng, những người tạo ra chatbot mong muốn sự giống con người nhất, đem lại trải nghiệm tốt nhất dành cho khách hàng của mình. Và rõ ràng nếu chúng ta chat với chatbot mà vẫn cứ nghĩ có ai đó đang online ngày đêm trả lời, tận tình tư vấn sản phẩm cho mình thì con chatbot đó hẳn cũng đã vượt qua bài test Turing 1 cách xuất sắc.

Kết bài

Ngày nay khi mà AI đã tạo ra cho con người rất nhiều khái niệm mới, nhiều điều mà con người còn không nghĩ đến thì việc đánh giá trình độ AI bằng con người như phép thử Turing là một điều không có quá nhiều ý nghĩa. Tuy nhiên không thể phủ nhận được sự đóng góp của nó trong ngành khoa học máy tính trong việc đưa ra khái niệm và đo lường về trí tuệ nhân tạo. Cũng đã có nhiều phiên bản cập nhật của phép thử Turing được đưa ra nhưng điều đó thực sự không quá quan trọng, ý nghĩa lớn nhất của bài test này chính là việc nó đã mở ra nhiều cách cửa cho sự đổi mới trong lĩnh vực AI nói riêng cũng như công nghệ nói chung.

Hy vọng bài viết này mang lại được những kiến thức bổ ích cho các bạn, hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

IT job hot cho Top Developer, xem thêm tại TopDev!

Web3 techstack – Hành trang cho anh em developer

Web3 techstack

Ở bài viết trước, mình đã giới thiệu cho anh em về Web3 tại bài viết này (Anh em nào chưa có khái niệm hay cái nhìn đầu tiên về web3 có thể tham khảo nha), tiếp sau đây sẽ là Web3 techstack, hiểu khái niệm rồi giờ muốn bay vô làm luôn thì sao?

Muốn làm luôn thì trước tiên phải biết về Web3 techstack, ít nhất là biết nó sử dụng những gì, chức năng mỗi thằng ra sao chứ đúng không?

Bắt đầu luôn cho nóng,

1. À khoan, nhắc lại chút xíu

Về Web3 techstack chưa cần đi vội vàng chi cho vấp té, đầu tiên nhắc lại cho anh em là web3 xây dựng dựa trên hai thứ:

  • Đầu tiên là hệ sinh thái phi tập trung (Intdecentralized Internet Ecosystem).
  • Thứ hai là nền tảng blockchain.

Bắt đầu trên nền tảng là hai cái này, Web3 tuy phát triển nhanh nhưng cũng đã kịp xây dựng và củng cố dần cho mình cái khối block đằng sau nó.

Web3 techstack Nhắc tới web3 là nhắc tới blockchain và phi tập trung (decentralized)

Để hiểu rõ về Web3 techstack và về từng layer trong đó, anh em xem qua hình ảnh dưới đây

Web3 techstack layer

2. Web3 tech stack có gì?

Rồi, mỗi layer sẽ thực hiện một nhiệm vụ. Bắt đầu trước với Network layer

2.1 Web3 Network Layer

Rõ ràng là ứng dụng Web3 nào cũng cần xây dựng Network layer của riêng nó.

Web2 applications rely on centralized databases, Web3 applications are built on top of blockchain architectures for trustless and permissionless access. Những ứng dụng Web2 dựa trên những hệ cơ sở dữ liệu tập trung, ứng dụng Web3 thì lại xây dựng dựa trên kiến trúc blockchain để đảm bảo tính trustless và permission less

Chính vì base trên nền blockchain nên khi cần buid một ứng dụng phi tập trung – decentralized applications (dApps), anh em dev thường có hai lựa chọn:

  • Thứ nhất là Ethereum Virtual Machine (EVM), máy ảo Ethereum, loại này thì là blockchain tương thích
  • Thứ hai là không tương thích non EVM compatible blockchains

Web3 techstack

Nguồn ảnh: moralis.io

2.1.1 EVM – Ethereum Virtual Machine

Một số anh em tìm hiểu blockchain có lẽ không còn xa lạ với EVM, máy ảo EVM cho từng node sẽ là nơi lưu trữ thông tin quan trọng như tài khoản (accounts) hoặc số dư (balances).

Máy ảo của Ethereum cũng lưu trữ trạng thái máy, có thể thay đổi theo từng khối mới theo một bộ quy tắc được xác định trước do EVM đưa ra. Quan trọng nhất đối với các anh em dev là EVM cung cấp một khuôn khổ để lưu trữ và thực thi các hợp đồng thông minh (smart contracts), cho phép anh em lập trình tẹt ga các logic trên chuỗi.

Anh em start với EVM thì techstack có thể cân nhắc bao gồm:

  • Ethereum – EVM nguyên bản kèm với smart contract
  • Polygon – Ethereum sidechain
  • Arbitron – Layer 2 blockchain sử dụng Optimistic rollups và multi-round fraud proofs
  • Optimism – Layer 2 blockchain sử dụng Optimistic rollups và single-round fraud proofs
  • Hermez – ZK rollup Ethereum Layer 2 network quản lý bởi Polygon
  • ZKSync – ZK rollup Ethereum Layer 2 network sử dụng SNARKs
  • Starknet – ZK rollup Ethereum Layer 2 network sử dụng STARKs
  • Avalanche – EVM-compatible Layer 1
  • Cronos – EVM-compatible Layer 1

Web3 techstack Polygon trong gói giải pháp scaling có nhiều thứ hay ho như PoS, Supernets và Avail

Tham khảo các vị trí tuyển dụng Web developer cho bạn

2.1.2 Non EVM – Không tương thích

Có khuôn có khổ thì vẫn có ông đạp đổ cả khuôn. Gần đây có một số framework đã được xây dựng vượt ra sự bó buộc của EVM, cũng không tương thích với EVM.

Mấy ông này thì cho rằng chuỗi EVM quá bị ràng buộc bởi khuôn khổ Ethereum và thay vào đó mấy ổng chọn cách đổi mới bằng cách thiết kế các cấu trúc mới. Nói chung, các blockchains không phải EVM được thiết kế với dữ liệu và khả năng mở rộng giao dịch ngay từ đầu. Ngoài ra NonEVM còn cho phép giao dịch cao mỗi giây (TPS).

Một số Non EVM phổ biến hiện tại anh em có thể tham khảo nếu không muốn base trên nền của EVM. Việc lựa chọn EVM hay non EVM cho Web3 techstack đôi khi còn phụ thuộc vào tính năng ứng dụng anh em muốn build.

  • Flow – Layer 1 sử dụng Cadence, luồng là luồng hướng đối tượng resource-oriented programming language
  • NEAR – Layer 1 sử dụng Rust hoặc Assembly script cho cái smart contracts
  • Solana – Layer 1 sử dụng Rust C, C++ cho smart contracts
  • Terra – Layer 1 sử dụng Rust cho smart contracts

Luồng thanh toán của flow hỗ trợ nhiều cái tên đình đám như Coinbase và Binance. Nguồn ảnh: flow.com

2.2 Blockchain Interaction Layer

Sau khi đã có Network layer làm nền tảng cho blockchain thì lựa chọn thứ hai anh em cần ra quyết định là Interaction Layer.

Nghe cái tên thôi cũng đoán sơ sơ ra là nó để làm gì ha, Interaction là tương tác, có base blockchain sẵn có nếu sử dụng EVM rồi, giờ anh em cần read, write (đọc, ghi data) vào block chain thôi.

Mé sợ anh em không hiểu, đặc biệt là mấy anh em chưa biết về blockchain đành nhắc lại xíu.

  • Blockchain được xây dựng dựa trên các khối dữ liệu
  • Mỗi khối blocks này được phân tán trên các nodes và chúng độc lập với nhau.
  • Mỗi cái node này trong mạng blockchain lại cho phép ta đọc, ghi các khối dữ liệu
  • Quan trọng nhất là bất kỳ khối nào được thêm vào blockchain phải được truyền qua tất cả các nút trên mạng để được đồng bộ.

Với Interaction Layer, Web3 techstack mà anh em có thể chọn đầu tiên là Alchemy. Về cơ bản thì ông Alchemy này public một bộ API cho anh em giao tiếp đa lớp.

  • Layer 1s bao gồm Ethereum network
  • Layer 2s bao gồm Arbitrum và Optimism
  • Sidechains bao gồm Polygon, và non-EVM-compatible L1s như kiểu Flow.

Web3 techstack Alchemy – Platform cung cấp bộ Blockchain API thoải mái cho anh em sử dụng.

Ngoài ra, ông Alchemy này cho phép blockchain developer truy cập có thể mở rộng tới tất cả các lớp (Layer) trong Web3.

2.3 Web3 Presentation Layer

Thơm thơm, tới trình bày (Presentation) rồi nè

Theo nhiều cách, lớp trình bày Web3 phản ánh nhiều khía cạnh của sự phát triển Web2. Nói vậy là sao, ví dụ để tạo và phát triển các thành phần giao diện (UI) cho người dùng đi ha, nhiều frontend đã chuyển qua sử dụng Reactjs.

Với một số lượng lớn các nhà phát triển và một cộng đồng Web3 theo sau, đó là tiêu chuẩn thực tế cho phát triển UI của Web3. Đông đâu đó quyết định.

Tuy nhiên tầng presentation của Web3 có khác tí khi chọn techstack là nó cần tương tác với dữ liệu blockchain (nền là blockchain) mà.

Để tương tác với data, thay vì như ở web2 ta dùng Axios hay Fetch thì ở Web3 thường chọn đi với Ether.js hoặc Web3.js. Đặc biệt là cả Ether.js và Web3.js đều hỗ trợ remote procedure calls (RPC)

Ethers.js thì nhẹ hơn, thân thiện với mấy ông dev thì tài liệu nhiều. Có cái là mấy ông cộm cán phát triển Ether.js thì hình như nắm té cái quyền phát triển, do không là cộng đồng nên lực phát triển tiếp có hơi hạn chế.

Web3.js thì commit nhiều và là thư viện javascript Ethereum được sử dụng nhiều nhất. Mặc dù nó cũng được sử dụng rộng rãi, nhưng ông này nói thẳng là thiếu chiều rộng và chiều sâu. Đọc cực kỳ khó hiểu.

Web3 techstack Web3js nằm giữa, các user interface có thể đụng tới smart contract thông qua web3.js

Ngoài ra còn có thằng Alchemy Web3.js là Alchemy Web3, một bản fork với các phương thức API bổ sung, có hỗ trợ cả websocket và cho cộng đồng đóng góp.

Web3 techstack Web3js nay còn có cả Sturdier WebSockets. Nguồn ảnh: GeeksforGeeks

2.4 Web3 Application Layer

Phù, cuối cùng cũng tới Application Layer ha, lớp ứng dụng. Sau bao vất cả xây dựng và đống kiến thức khó nhai, khó hiểu của Web3 thì giờ Application Layer có thể dễ thở hơn cho việc anh em lựa chọn Web3 techstack.

Vậy tầng này làm gì?

Lớp ứng dụng (Application Layer) là thứ chủ yếu cho phép người tiêu dùng công cộng (nhiều ông trong số đó không cần phải hiểu hết sự phức tạp của phát triển Web3) dễ dàng tương tác với giao diện người dùng trực quan. Mà với cái trực quan này cơ, tức là bao gồm giao diện người dùng thân thiện thì con đem tới sức mạnh cho người dùng.

Nói chung web3 có dùng dễ hay không ăn thua ở lớp này.

Lớp này thì bao gồm nhiều thứ lắm. Đơn cử anh em biết tới DeFi, NFTs. Ngoài ra còn các mục khác như Identity & Authentication, Data & Analytics.

Đống này thì được phát triển bởi bộ ba công ty Web3 lớn và có tên tuổi như là:

  • OpenSea
  • Uniswap
  • Aave

Đối với anh em blockchain developer thì phần này có vẻ là hứng thú nhất. Ở đây thoải mái kết hợp vài ba cái ứng dụng phi tập trung (decentralized application) với nhau.

Web3 techstack Build lên như OpenSea sàn giao dịch NFT như này thì tầng Application Layer quyến rũ quá rồi.

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

Xem thêm:

Xem tin tuyển dụng việc làm IT lương cao, đãi ngộ hấp dẫn tại đây!

Ứng dụng của phép toán Bitwise

ứng dụng của phép toán Bitwise

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

Trong chương trình giảng dạy IT của các trường đại học, cao đẳng hay trung tâm dạy nghề chúng ta đều được học các phép tính toán sau :

  • Số học (+,-*,/,%)
  • Logic (&&,|| )
  • Bitwise (&,|,~,^,>>,<<)

Trong khi phép toán Số học và Logic được ưng dụng rộng rãi trên hầu hết các hệ thống phần mềm cũng như bài tập trên trường lớp. Phép toán Bitwise có vẻ được ít các bạn lập trình viên quan tâm và rất ít người áp dụng được phép toán này trong các hệ thống phần mềm.

Bitwise là một phép toán cực quan trọng nếu nắm bắt được nó bạn có thể hiểu được một số tư tưởng của một số thuật toán tạo ID cũng như các opensource sử dụng nó. Áp dụng Bitwise vào trong hệ thống phần mêm của bạn sẽ giúp phần mềm của bạn trở lên tốt hơn cũng như giải quyết được nhiều bài toán khó.

Bài toán tạo ID

Ứng dụng hay được sử dụng nhất và cũng là ứng dụng nổi bật nhất của phép tính toán Bitwise là tạo một ID chứa nhiều thông tin bên trong.

Thông thường mọi người sẽ lưu ID dưới dạng số tăng dần vào các RDMS như : mysql, oracle , mariadb, postgresql ,… Sử dụng cơ chế auto increment hay sequence của các loại DB này để thực hiện tạo ID. Cách này sẽ làm tăng tải cho DB khi thực hiện insert dữ liệu. Kèm theo cách này thì thông tin của ID cung cấp cho chúng ta là không nhiều chỉ là đã tạo được bao nhiêu bản ghi nhưng nếu chúng ta xóa 1 row đi thì thông tin của ID mang lại hầu như không sử dụng được.

Trên thực tế với các phầm mềm mình đã làm và được nhận lại từ các chuyên gia thì họ thường sẽ không tạo ID kiểu vậy và sẽ sử dụng phép tính toán Bitwise để lưu thông tin.

Trong bài blog này mình sẽ lấy ví dụ và giải thích chi tiết thuật toán snowflake để các bạn có thể hiểu được tầm quan trọng của phép toán bitwise cũng như mình sẽ cung cấp một số common function để làm việc với bitwise. Hy vọng sau bài này các bạn sẽ luyện tập và tạo được ID theo ý và chứa nhiều thông tin hơn một số tự tăng.

Tạo ID theo thuật toán snowflake

Đối với các hệ thống phân tán ( distributed system ) việc tạo ID sao cho unique giữa các service cũng như ID chứa nhiều thông tin là một thách thức rất lớn nếu chúng ta không sử dụng phép Bitwise.

Thuật toán nổi tiếng nhất để tạo ID cho hệ thống này là snowflake. Bạn có thể tìm thấy rất nhiều implement trên mạng và tại blog này tôi cũng có 1 implement tại class IdGenerator trong project common cụ thể như sau:

package blog.common.id;

import java.time.Instant;
import java.util.Date;

public class IdGenerator {

    private static final int NODE_ID_BITS = 10;
    private static final int SEQUENCE_BITS = 12;

    private static final int maxSequence = (int) (Math.pow(2, SEQUENCE_BITS) - 1);

    private static final long CUSTOM_EPOCH = 1420070400000L;

    private long lastTimestamp = -1L;
    private long sequence = 0L;

    public static IdGenerator instance = new IdGenerator();

    public synchronized long nextId() {
        long id = nextId(188);
        return id;
    }


    private synchronized long nextId(int nodeId) {
        long currentTimestamp = timestamp();

        if (currentTimestamp < lastTimestamp) {
            throw new IllegalStateException("Invalid System Clock!");
        }

        if (currentTimestamp == lastTimestamp) {
            sequence = (sequence + 1) & maxSequence;
            if (sequence == 0) {
                // Sequence Exhausted, wait till next millisecond.
                currentTimestamp = waitNextMillis(currentTimestamp);
            }
        } else {
            // reset sequence to start with zero for the next millisecond
            sequence = 0;
        }

        lastTimestamp = currentTimestamp;

        long id = currentTimestamp << (NODE_ID_BITS + SEQUENCE_BITS);

        id |= (nodeId << SEQUENCE_BITS);
        id |= sequence;
        return id;
    }


    private static long timestamp() {
        return Instant.now().toEpochMilli() - CUSTOM_EPOCH;
    }

    private long waitNextMillis(long currentTimestamp) {
        while (currentTimestamp == lastTimestamp) {
            currentTimestamp = timestamp();
        }
        return currentTimestamp;
    }

    public short getNodeIdById(long id) {
        return (short) ((id >> SEQUENCE_BITS) & 0x2ff);
    }

    public long getTimestampById(long id) {
        return (id >> 22) + CUSTOM_EPOCH;
    }
}

Nếu bạn không hiểu nhiều về phép bitwise thì bạn có thể không hiểu lý do tại sao cách tạo ID theo thuật toán snowflake sẽ cho chúng ta các ID khác nhau trên một hệ thống phân tán. Và các thông tin chứa trong ID đó là gì. Chúng ta sẽ phân tích snowflake bằng cách implement trong bài blog này.

Khi tạo ID theo implement thì trong ID sẽ chứa các thông tin sau:

  • Thời gian ID đó được tạo ra
  • Node nào tạo ra ID đó theo NodeID
  • sequence: thứ tự ID được tạo trong một milliseconds nếu có nhiều ID được tạo trong cùng thời gian. Thông tin này không quá quan trọng với logic sau này.

Cách kết hợp 3 thông tin trong cùng ID

Như chúng ta biêt số long trong java sẽ la 8 bytes và là 64 bits. Việc cần làm ở đây là quy định các thông tin chứa trong ID sẽ chiếm bao nhiêu bits và sẽ nàm ở vị trí nào trong 64 bits này, vì bit đầu là bit dấu nên chúng ta chỉ dùng được 63 bits. Với cách implement trên thì chúng ta sắp xếp như sau:

  • Thời gian tạo ID : 41 bits đầu tiên Với 41 bits này thì chúng ta có thể tạo ID trong khoảng 69 năm tính từ thời điểm CUSTOM_EPOCH. Bởi vì nếu vượt qua 69 năm thì Instant.now().toEpochMilli() - CUSTOM_EPOCH; sẽ vượt qua 41 bits khiến cho ID tạo ra không còn đảm bảo đúng được nữa.
  • Định danh service tạo ID (nodeId) : 10 bits. Có thể chứa tới 1024 định danh của các service khác nhau. Mình chưa bao giờ thấy service nào có nhiều instance đến thế.
  • Số tăng dần sequence : 12 bit . sẽ tạo ra 4096 ID khác nhau trong một millisecond. Nếu thời gian gọi tạo ID của service là trùng nhau ở mức millisecond thì sequence sẽ có tác dụng tạo ra các ID tăng dần khác nhau.

Ví dụ

Lý thuyết là thế sau đây mình sẽ làm một ví dụ cho các bạn hiểu thêm về cách hoạt động của snowflake.

Thời điểm mình tạo ID tính theo millisecond sẽ là 1649991105180L sau khi trừ đi CUSTOM_EPOCH sẽ được số 229920705180. Đổi số này thành dạng nhị phân dưới dạng long ta sẽ được số 00000000 00000000 00000000 00110101 10001000 01010111 10001010 10011100

Sau khi dịch sang trái 22 bit thì ta sẽ được số dạng nhị phân sau: 00001101 01100010 00010101 11100010 10100111 00000000 00000000 00000000

Mình đang hard code NodeID là : 18, đổi số này sang sạng binary long sẽ được số sau : 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00010010

Dịch sang trái 10 bit ta được số sau : 00000000 00000000 00000000 00000000 00000000 00000000 01001000 00000000

Sequence đang là “0” ta sẽ được số sau : 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

ta thực hiện phép toán | để gộp 3 số sau thành 1 số long mới ta được

 00001101 01100010 00010101 11100010 10100111 00000000 00000000 00000000
|
 00000000 00000000 00000000 00000000 00000000 00000000 01001000 00000000
|
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
-----------------------------------
 00001101 01100010 00010101 11100010 10100111 00000000 01001000 00000000

Đổi ra số dạng decimal được : 964357333419313152

Tìm việc làm Java mọi cấp độ tại đây!

Lấy các thông tin được lưu trong ID ra

Ta chỉ cần làm các động tác ép kiểu và bitwise ngược lại thì sẽ lấy ra được thông tin như thời gian tạo IDservice nào tạo ID. Trong code Demo bên trên mình đã code sẵn các hàm giúp các bạn lấy ra thông tin này.

    public short getNodeIdById(long id) {
        return (short) ((id >> SEQUENCE_BITS) & 0x2ff);
    }

    public long getTimestampById(long id) {
        return (id >> 22) + CUSTOM_EPOCH;
    }

Phần giải thích tại sao lại lấy ra thông tin bằng các hàm này mình sẽ nhường các bạn để hiểu hơn về cách hoạt động của bitwise sau này có thể tùy chỉnh thuật toán snowflake theo ý.

Việc lấy ra các thông tin này cung cấp cho chúng ta khả năng thực hiện các validate dữ liệu mà không cần phải vào Database lấy các thông tin này ra. Trên thực tế nếu tạo ID kiểu này mình thường lấy thời gian ra để thực hiện một số nghiệp vụ validate timeout,…

Tự tạo thuật toán sinh ID

Việc nắm rõ cách hoạt động của một số bitwise cơ bản như (<<,>>,|,&) sẽ giúp các bạn không chỉ tạo ID theo thuật toán snowflake mà giúp các bạn tạo ra các loại ID có nhiều thông tin theo ý muốn của bạn. Ví dụ bạn muốn tạo một customerID chứa thông tin của quốc gia của customer đó thì bạn có thể tạo một customerID dạng integer với 9 bits đầu để lưu mã quốc gia (vì một bit đầu tiên là bit dấu mà có hơn 200 quốc gia trên toàn thể giới) và 23 bit sau thì lưu sequence.

    public static int generateCustomerId(short nationalId, int sequence) {
        int id = ((int) (nationalId & 0x1ff)) << 23;
        id |= sequence & 0x007FFFFF;
        return id;
    }

    public static short getNationalId(int customerId) {
        short id = (short) ((short) (customerId >> 23) & 0x1ff);
        return id;
    }

Một số ứng dụng khác khi dùng bitwise

Các ứng dụng này sẽ là các cải thiện về hiệu năng của chương trình khi chạy nhưng nó chỉ cải thiện rất nhỏ vì các cách khác cũng đủ nhanh rồi.

Số chắn số lẻ

// Returns true if n is even, else odd
static boolean isEven(int n)
{
    // n&1 is 1, then odd, else even
    return ((n & 1)!=1);
}

   // Returns true if n is even, else odd
    static boolean isEven1(int n)
    {

        // n^1 is n+1, then even, else odd
        if ((n ^ 1) == n + 1)
            return true;
        else
            return false;
    }

Binary serialize Một ứng dụng tuyệt vời khác của bitwise là dùng để serialize dữ liệu thành array byte sau đó được ghi vào các file nhị phân (các loại database đều dùng binary file), hoặc truyền các array byte này thông qua mạng đến các service. Vì đọc file nhị phân hay deserialize array byte sẽ nhanh hơn và tiết kiệm tài nguyên hơn rất nhiều so với json nên nó nâng cao tốc độ của service của bạn.

Các thư viện giúp bạn làm điều này như : proto, thrift, kryo,… Hoặc các bạn cũng có thể tự tạo cho mình một cách serialize dữ liệu bằng cách sử dụng bitwise và nên tuân theo cách big-endian (BE) or little-endian (LE). Mình cũng đã từng chia sẻ sơ qua về cách này tại blog How to serialize data in java like protobuf. Nếu các bạn quan tâm thì vào đọc ủng hộ giúp mình nhé.

Đây là cách mình dùng bitwise để serialize một số int thành 1-5 bytes thay vì 4 bytes.

default void writeIntOptimise(int value) {
        if ((value < 0)) throw new IllegalArgumentException("pack int: " + value);
        int x;
        while (true) {
            x = value & 0x7F;
            value >>>= 7;
            if (value != 0) {
                this.writeByte((byte) (x | 0x80));
            } else {
                this.writeByte((byte) x);
                break;
            }
        }
    }

Chi tiết các bạn tham khảo code phần serilize này tại link github

Bitwise number common fuction

Tại hệ thống mình làm khi giao tiếp với phần mềm bên thứ 3 họ chỉ chấp nhận số lớn nhất là int nhưng ID của hệ thống mình là một số long vậy nên bọn mình đã sử dụng bitwise để tách 1 số long thành 2 số int và khi nhận về 2 số int sẽ ghép thành 1 số long để 2 hệ thống kết hợp với nhau tốt hơn. Do đó mình xin chia sẻ cho anh em các hàm common chuyên sử dụng để tách các số như vậy.

package blog.common.id;

public class Numbers {

    // phan tach so long thanh int va nguoc lai
    public static final long toLong(final int v1, final int v2) {
        return (((long)v1 << 32) & 0xFFFFFFFF00000000L) | ((long)v2 & 0x00000000FFFFFFFFL);
    }

    public static int lowInt(long value) {
        return (int)(value & 0xFFFFFFFFL);
    }

    public static int highInt(final long value) {
        return (int)((value >>> 32) & 0xFFFFFFFFL);
    }


    // phan tach so int thanh short va nguoc lai
    public static final int toInt( short v1, short v2 ) {
        return ((v1 << 16) & 0xFFFF0000) | (v2 & 0x0000FFFF);
    }

    public static short lowShort(int value) {
        return (short)(value & 0xFFFF);
    }

    public static short highShort(final int value) {
        return (short)((value >>> 16) & 0xFFFF);
    }


    // phan tach so short thanh byte va nguoc lai
    public static final short toShort(byte v1, byte v2) {
        return (short)(((v1 << 8) & 0xFF00) | (v2 & 0x00FF));
    }

    public static byte lowByte(short value) {
        return (byte)(value & 0xFF);
    }

    public static byte highByte(short value) {
        return (byte)((value >>> 8) & 0xFF);
    }
}

Tổng kết

Nắm vững kỹ thuật bitwise này sẽ giúp ứng dụng của bạn trở lên thông minh hơn. ID sẽ trở lên có ý nghĩa hơn. Trong bài mình sử dụng java để thực hiện viết demo thuật toán cũng như common nhưng bitwise sẽ sử dụng trong tất cả các ngôn ngữ lập trình. Hiện tại mình đang học và lập trình ngôn ngữ C++ và vẫn áp dụng phép tính toán này bình thường. Hy vọng sau khi làm quen với C++ thì mình sẽ có một số bài blog chia sẻ về ngôn ngữ này.

Nếu bài viết này hay thì mình xin một sao github cho có động lực update thêm bài tiếp theo nhé.

Link GitHub xin sao: github.com/trandem/blog/blob/main/common/bi..

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

Xem thêm:

Tham khảo hàng loạt tin tuyển dụng IT hấp dẫn tại TopDev

Giới thiệu về Enterprise Service Bus

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

Enterprise Service Bus (ESB) là thành phần trọng tâm trong một hệ thống phân tán, giúp kết nối các thành phần, các ứng dụng khác nhau lại với nhau. Vậy cụ thể nó là gì, trong bài viết này chúng ta hãy cùng tìm hiểu nhé các bạn!

Tại sao lại cần phải có ESB?

Hãy tưởng tượng các bạn đang làm việc trong một hệ thống có nhiều ứng dụng và các ứng dụng đó cần được liên kết, trao đổi thông tin với nhau: ứng dụng A cần gửi một message tới ứng dụng B thông qua JMS, ứng dụng C cần gọi tới ứng dụng D để lấy thông tin cần thiết thông qua giao thức HTTP, … Tất cả các nhu cầu này được thực hiện dưới nhiều hình thức khác nhau, không cùng chung một định dạng các kiểu dữ liệu hay cùng một chuẩn giao tiếp chung.

Lập trình viên cho các ứng dụng này cũng đối mặt với nhiều khó khăn về mặt:

  • Giao thức: các ứng dụng này phải làm việc với các dữ liệu đầu vào từ các tập tin hệ thống cho tới các API RESTful web service.
  • Định dạng dữ liệu: các ứng dụng có thể sử dụng bất kỳ định dạng dữ liệu nào để trao đổi với nhau.
  • Cách trao đổi dữ liệu: các ứng dụng có thể gọi đến ứng dụng khác theo kiểu đồng bộ, bất đồng bộ, messaging, … rất nhiều cách trao đổi dữ liệu khác nhau.
  • Vòng đời của một ứng dụng: các ứng dụng khác nhau sẽ cần phải phát triển, bảo trì và quản lý theo những cách khác nhau.
  • Xử lý lỗi: đây là vấn đề cốt lõi của các ứng dụng, mỗi ứng dụng khác nhau sẽ có cách xử lý lỗi khác nhau.
  • Giám sát: việc giám sát việc tích hợp giữa các ứng dụng cũng gây nhiều khó khăn cho các lập trình viên.

Một vấn đề nữa là các ứng dụng phải kết nối trực tiếp với nhau theo kiểu một-một, gây khó khăn cho việc mở rộng sau này khi số lượng kết nối ngày một tăng lên.

Enterprise Service Bus (ESB) là gì?

Để giải quyết vấn đề này, một hệ thống Enterprise Service Bus đã được giới thiệu. Chúng ta sẽ tìm hiểu kỹ hơn về nó trong phần tiếp theo nhé các bạn!

Tìm việc làm Java lương cao, đãi ngộ hấp dẫn tại đây!

Enterprise Service Bus là gì?

ESB là một giải pháp cho vấn đề kết nối một-một trong một hệ thống có nhiều ứng dụng kết nối với nhau. Nó định nghĩa một nơi để các ứng dụng có thể thông qua nơi này tương tác với các ứng dụng khác, gọi là bus. Tất cả các ứng dụng của hệ thống bây giờ sẽ chỉ nói chuyện với nhau thông qua bus.

Hãy xem hình vẽ sau để hình dung rõ hơn ý nghĩa của ESB nhé các bạn:

Enterprise Service Bus (ESB) là gì?

Để làm được điều này, hệ thống bus của chúng ta phải có thể giao tiếp thông qua nhiều giao thức khác nhau như HTTP, FTP, … và nó phải sử dụng một chuẩn định dạng dữ liệu chung cho tất cả các message như Java object hay XML.

ESB cho phép chúng ta gom tất cả các vấn đề về bảo mật, chuyển hướng và chuyển đổi dữ liệu về một chỗ. Việc chuyển đổi từ service này sang service khác cũng diễn ra suôn sẻ mà không cần phải thay đổi gì ở các ứng dụng kết nối.

Xem thêm https://en.wikipedia.org/wiki/Enterprise_service_bus

Các framework hiện thực Enterprise Service Bus

  • Mule Enterprise Service Bus
  • Apache ServiceMix
Bài viết gốc được đăng tải tại huongdanjava.com
Xem thêm:

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

Tạo Input AutoComplete đơn giản với CSS trong React

tạo Input AutoComplete với CSS trong React

AutoComplete là một tính năng giúp bạn có thể đưa ra các gợi ý thông qua các kí tự mà người dùng nhập vào trong ô input. Nó thừa được sử dụng với form để giảm bớt thời gian nhập liệu cũng như tăng trải nghiệm người dùng khi sử dụng website của bạn. Hầu hết các thư viện UI Components hiện nay đều cung cấp sẵn cho bạn Input AutoComplete component; trong bài viết này mình sẽ hướng dẫn các bạn tạo 1 component đơn giản như thế chỉ với code React và sử dụng CSS.

Autocomplete Field

Nguồn ảnh: queryscript.net

Phân tích yêu cầu

Như hình trên, chúng ta có thể thấy Autocomplete Field bao gồm 2 phần: Input nhập giá trị và List danh sách các gợi ý hiển thị lên. Các yêu cầu đáp ứng như sau:

  • Khi người dùng bấm vào ô input (focus) thì sẽ hiển thị ra danh sách dropdown list gợi ý
  • Khi người dùng bắt đầu gõ vào ô input giá trị, chúng ta sẽ get lấy giá trị nhập vào, sau đó thực hiện tìm kiếm trong danh sách gợi ý những giá trị có chứa kí tự nhập vào đó. Khi lọc xong gợi ý sẽ hiện thị lên lại cho người dùng lựa chọn
  • Khi người dùng bấm 1 lựa chọn trong danh sách gợi ý sẽ thực hiện ẩn danh sách gợi ý đi, set lại giá trị ô input là giá trị mà người dùng vừa chọn

Đã làm rõ được yêu cầu, chúng ta cùng thực hiện code component này nhé. 

Bước đầu tiên chúng ta sẽ tạo ra 2 biến state là value và show

  • Biến value dạng string sẽ lưu giá trị mà người dùng nhập vào ô input để thực hiện search  
  • Biến show dạng bool sẽ làm nhiệm vụ set trạng thái ẩn hiện của dropdown danh sách các gợi ý lựa chọn
const [value, setValue] = React.useState("");
const [show, setShow] = React.useState(false);

Tạo ô Input text cho người dùng tương tác tìm kiếm

Chúng ta sử dụng thẻ input có sẵn, value được lấy giá trị state tạo ở bước trên. Khi người dùng focus vào ô input thì sẽ hiển thị dropdown list những gợi ý. Để làm được điều này chúng ta sử dụng thuộc tính onFocus, trong đó sẽ set giá trị biến state show thành true.

<input
     onFocus={() => setShow(true)}
     onBlur={() =>
       setTimeout(() => {
         setShow(false);
          }, 150)
       }
     value={value}
     onChange={onInputChange}>
</input>

Hàm onChange được gọi đến mỗi lần người dùng thay đổi giá trị của ô input, lúc đó chúng ta sẽ xử lý set lại giá trị cho biến state value

const onInputChange = (event) => {
    const value = event.currentTarget.value;
    setValue(() => value);
  };

Hàm onBlur được gọi đến khi người dùng chọn 1 lựa chọn trên dropdown list, lúc đó chúng ta sẽ xử lý ẩn dropdown list gợi ý đi. 

Tiếp theo chúng ta tạo 1 component list để hiển thị những lựa chọn gợi ý

Mỗi line được tạo bởi button để có thể tương tác bấm chọn. Logic xử lý ở đây như sau: Khi người dùng nhập giá trị vào ô input text

const ItemList = (() => {
    if (!show) return [];
    return list
      .filter((v) => v.toLowerCase().includes(value.toLowerCase()))
      .map((v) => (
        <button
          onClick={() => {
            setValue(() => v);
            setShow(false);
          }}
          key={v}
        >
          {v}
        </button>
      ));
  })();

CSS lại cho component của mình

  • Style dành cho ô input 
.container > div input {
  width: 100%;
  height: 40px;
  border: 1px solid #ccc;
  border-radius: 5px;
  font-size: 16px;
}
.container > div input:focus {
  outline: 1px solid rgb(83, 172, 255);
}
  • Style cho dropdown list gợi ý
.list {
  display: flex;
  flex-direction: column;
  max-height: 220px;
  width: inherit;
  overflow: auto;
  overflow-x: hidden;
  box-shadow: rgba(0, 0, 0, 0.12) 0px 1px 3px, rgba(0, 0, 0, 0.24) 0px 1px 2px;
}
 .list button {
  background: none;
  border: none;
  width: 100%;
  height: 100%;
  max-height: 3em;
  padding: 10px;
  text-align: left;
  cursor: pointer;
  border-bottom: 1px solid #ccc;
}
 .list button:hover {
  background: #f8f8f8;
}
 .list button:last-child {
  border-bottom: none;
}

Thành quả cho component AutoComplete của chúng ta

Input AutoComplete component

Các bạn có thể tham khảo full source code của component ở link dưới đây:

https://codepen.io/phm-minh-khoa/pen/dymQvMm

Trong ví dụ này mình sử dụng input autocomplete cho việc đưa ra gợi ý lựa chọn tỉnh thành phố Việt Nam. Khi người dùng nhập từ “hà”, component sẽ hiển thị ra dropdown list gợi ý bao gồm 4 lựa tỉnh và thành phố: “Hà Nội, Hà Giag, Hà Nam, Hà Tĩnh“ tương ứng.

Kết bài

Như vậy chỉ bằng JS và CSS đơn giản chúng ta đã tạo ra được 1 component Input AutoComplete để sử dụng trong React (hay bất cứ thư viện nào viết bằng JS). Trong React, các bạn có thể tạo thành 1 Input AutoComplete component chung để có thể tái sử dụng một cách dễ dàng, ngoài ra có thể sử dụng thêm các props khác truyền từ component cha vào để có thể tương tác với component và sử dụng nó trong form 1 cách hiệu quả hơn. Các components khác tương tự các bạn cũng hoàn toàn có thể tạo ra tương tự mà không cần sử dụng 1 thư viện UI Components ngoài nào khác.

Cảm ơn các bạn đã theo dõi và đọc bài, hy vọng bài viết hữu ích dành cho bạn, hẹn gặp lại trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

Tham khảo việc làm IT mọi cấp độ tên TopDev

One Mount mở “sàn đấu Hackathon” cho hàng nghìn Kỹ sư lập trình

one mount mở cuộc thi hackathon

Tập đoàn One Mount mở sân chơi lập trình <One Mount Hack2Hire> quy mô toàn quốc, giúp Lập trình viên không chỉ được “bão não” với các bài toán công nghệ, mà còn được “bổ não” qua phiên chia sẻ chuyên sâu và tạo các kết nối mới với cộng đồng kỹ sư chung đam mê. 

Hackathon

One Mount Hack2Hire là cuộc thi Hackathon dành cho kỹ sư đam mê lập trình – những người không ngừng tìm kiếm cơ hội để định vị năng lực và sẵn sàng kết nối để phát triển bản thân tốt hơn mỗi ngày. 

Hiện thực hóa ý tưởng thay đổi cách tiếp cận và phương pháp đánh giá tiềm năng ứng viên công nghệ qua phỏng vấn Hỏi – Đáp truyền thống; Tập đoàn One Mount đầu tư xây dựng sân chơi “thực chiến” nhằm đánh giá toàn diện tư duy phát triển phần mềm, sức sáng tạo trong công nghệ và khả năng giải quyết vấn đề của các kỹ sư trong ngành IT.

“One Mount không muốn giới hạn ứng viên trong phạm vi phỏng vấn hay bài thi truyền thống. Thay vào đó, chúng tôi đưa ra các đầu bài mở, có tính thực tế cao để các bạn thể hiện năng lực theo suy nghĩ và phương pháp của bản thân tại một sân chơi thực sự “geek”, thực sự công nghệ.” – Anh Đinh Việt Hưng – Giám đốc Công nghệ và Dữ liệu Tập đoàn One Mount chia sẻ. 

Anh Đinh Việt Hưng - Giám đốc Công nghệ và Dữ liệu Tập đoàn One Mount

Anh Đinh Việt Hưng – Giám đốc Công nghệ và Dữ liệu Tập đoàn One Mount

Cuộc thi <One Mount Hack2Hire> mở “sàn đấu” cho nhóm Sinh viên công nghệ năm 4 và Kỹ sư dưới 5 năm kinh nghiệm với tổng giải thưởng lên tới 500.000.000 VND, cùng nhiều quà tặng công nghệ như Ipad, đồng hồ thông minh,…từ các đối tác đồng hành lớn như Google Cloud, Confluent, New Relic, CloudFlare, Kong…Người tham gia được lựa chọn công nghệ sở trường như Back-End (Java/Golang), Front-end (ReactJS, AngularJS), Mobile (iOS, Android và Flutter). 

hackathon gift

“Đặc thù “dân tech” thường hướng nội, khó thể hiện hết khả năng trong quá trình phỏng vấn. Được lựa chọn công nghệ sở trường yêu thích để thi đấu sẽ giúp các bạn thực sự tỏa sáng và thể thể hiện tối đa năng lực bản thân.” CIO One Mount, Anh Đinh Việt Hưng cho biết. 

Vòng chung kết – Offline Hacking Day dự kiến được tổ chức vào ngày 10/09 tại Hà Nội – là sự kiện đáng mong chờ nhất với kỹ sư mê lập trình sau 2 năm vắng bóng các cuộc tranh tài. Tại vòng chung kết, người tham gia không chỉ được “bão não” với các bài toán công nghệ, mà còn được “bổ não” qua phiên chia sẻ chuyên sâu và tạo các kết nối mới với cộng đồng Kỹ sư chung đam mê. 

kỹ sư tham gia hackathon

Cuộc thi <One Mount Hack2Hire> là sự kiện đầu tiên tại Việt Nam kết hợp giữa hoạt động Hackathon và Tuyển dụng nhân sự. Bên cạnh tạo cơ hội để kỹ sư định vị năng lực trong ngành IT, One Mount đặt mục tiêu tuyển dụng 20 nhân sự có tư duy phát triển sản phẩm nổi bật tham gia xây dựng các sản phẩm phục vụ hàng triệu người dùng tại Việt Nam. 

Là nơi quy tụ gần 2.000 nhân sự với chế độ đãi ngộ hấp dẫn và cơ hội bứt tốc sự nghiệp nhanh chóng, One Mount được vinh danh là Môi trường làm việc hấp dẫn Châu Á và là nơi nhiều nhân tài trẻ ưu tiên lựa chọn gắn bó, phát triển bản thân.

Tìm hiểu chi tiết Cuộc thi <One Mount Hack2Hire> tại: hack2hire.onemount.com

Tìm việc làm IT mọi cấp độ tại TopDev

Khi nào nên sử dụng useMemo và useCallback trong React?

Khi nào nên sử dụng useMemo và useCallback trong React?

Tác giả: Phạm Minh Khoa

React cung cấp cho chúng ta 2 hooks là useMemo và useCallback, chúng rất hữu ích khi bạn xử lý với những hoạt động phức tạp, tốn nhiều thời gian và tài nguyên của ứng dụng.

Nếu trong React component của bạn có chứa những hoạt động tốn tài nguyên (expensive operation), mỗi lần component được renders lại thì những tasks đó cũng sẽ được chạy lại khiến cho ứng dụng của bạn trở nên chậm chạp hơn. 2 hooks trên sẽ giúp tối ưu (optimize) ứng dụng của bạn bằng cách chạy những hoạt động tốn tài nguyên đó và lưu trữ kết quả (store result) của chúng lại trong cache. Khi component render lại trong lần tiếp theo thì chúng sẽ được chạy lại các hoạt động đó mà thay vào đó sẽ trả về luôn kết quả từ trong cache.

useMemo hoạt động thế nào?

Giả sử rằng chúng ta có 1 đoạn code xử lý hoạt động tốn thời gian và tài nguyên trong React component như sau:

function uselessExpensiveOperation(input) {
    const someBigArray = [];
    for (let i = 0; i < 5_000_000; i++) {
        someBigArray.push(input * i);
    }
    return someBigArray;
}

function SomeReactComponent() {
    const expensiveOperationResult = uselessExpensiveOperation(3);
    const output = expensiveOperationResult
        .slice(0, 5)
        .map(number => <li key={ number }>{ number }</li>);

    return <ul>{ output }</ul>;
}

function này sẽ chạy mất khoảng vài giây, nó sẽ trả về 1 mảng 5 triệu giá trị số phụ thuộc vào tham số đầu vào. Nếu bạn sử dụng hàm uselessExpensiveOperation trực tiếp trong 1 component React thì mỗi lần gọi xử lý render, nó sẽ gọi và chạy lại.

Trường hợp này chúng ta dùng useMemo để lưu trữ giá trị trả về trong cache như sau:

function SomeReactComponent() {
    const expensiveOperationResult = useMemo(
        function() {
            return uselessExpensiveOperation(3);
        },
        []
    );
    const output = expensiveOperationResult
        .slice(0, 5)
        .map(number => <li key={ number }>{ number }</li>);

    return <ul>{ output }</ul>;
}

useMemo nhận tham số đầu tiên là 1 function chứa hoạt động xử lý tốn tài nguyên (expensive operation), biến số thứ 2 là 1 mảng các phụ thuộc (dependencies). Nếu có sự thay đổi giá trị của bất cứ phụ thuộc nào thì React sẽ thực hiện việc xóa cache và chạy lại task tốn tài nguyên trên.

  useMemo là gì? Hướng dẫn sử dụng React useMemo Hook
  React hook là gì và lợi ích mà React hook đem lại

Ý tưởng của mảng các phụ thuộc là những gì mà bạn cần thêm vào như các biến mà hoạt động tốn tài nguyên ấy cần để xử lý. Như trong ví dụ trên thì hoạt động tốn tài nguyên của chúng ta không cần bất cứ phụ thuộc nào nên mảng truyền vào để rỗng (empty array).

useCallback hook sử dụng như thế nào?

useCallback khá giống với useMemo nên khiến các bạn có thể dễ nhầm lẫn; điều khác biệt là nó lưu trữ các functions (hàm) trong cache thay vì lưu trữ kết quả (results).

function SomeReactComponent() {
    const cachedFunction = useCallback(
        function originalFunction() {
            return "some value";
        },
        []
    );

    return <div>{ cachedFunction() }</div>
}

useMemo cũng làm được như useCallback nhờ việc React cung cấp 1 function đặc biệt là React.memo, nó hoạt động giống như useMemo nhưng nó lưu trữ React components vào trong cache để tránh việc render lại không cần thiết. Nó hoạt động như sau:

const cachedComponent = React.memo(
    function SomeReactComponent(props) {
        return <div>Hello, { props.firstName }!</div>
    }
);

Component SomeReactComponent sẽ được lưu trữ trong cache cho đến khi 1 trong những props thay đổi, lúc đó nó sẽ được render lại và lưu trữ vào cache 1 lần nữa.

Tuy nhiên có 1 vấn đề ở đây mà bạn cần lưu ý: Nếu trong props có chứa 1 function mà nó được tạo ra trong component cha (parent components), lúc đó mỗi khi component cha render lại thì function đó (inner function) cũng sẽ được tạo lại, điều đó khiến cho nó được xem là 1 function khác trong khi code không hề thay đổi. Dẫn đến việc nó sẽ khiến components đã cached sẽ bị render lại không cần thiết.

Lúc này nếu bạn sử dụng hook useCallback thì vấn đề trên sẽ có thể được giải quyết. useCallback sẽ chỉ tạo function trong lần đầu tiên component được render. Khi component được render lại thì nó sẽ lấy function đó từ trong cache, và trả về đúng function cũ, điều đó giúp cho props sẽ không bị thay đổi và phải render lại không cần thiết.

Đừng tối ưu quá mức (Over Optimize)

Có nhiều bạn dev sử dụng 2 hooks trên (hoặc 1 vài kĩ thuật optimize khác) ngay cả khi chúng không cần thiết. Các bạn lưu ý mục đích của 2 hooks này sinh ra, bài toán nó giải quyết, trường hợp nó nên được sử dụng. Nó có thể khiến cho code của bạn trở lên phức tạp hơn, khó maintain hơn và trong 1 vài trường hợp thậm chí nó còn hoạt động tồi hơn.

Bạn hãy nên áp dụng những kĩ thuật tối ưu hiệu năng sau khi phát hiện ra vấn đề, khi 1 thứ gì đó không chạy nhanh như bạn mong muốn thì hãy tìm hiểu xem nút thắt cổ chai (bottleneck) nằm ở đâu và tối ưu hóa phần đó.

Cảm ơn các bạn đã đọc.

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

Xem thêm:

Tham khảo ngay Top IT job hot có tại TopDev!

Lập trình Swift: Lười là thông minh!

Lập trình Swift: Lười là thông minh!

Tác giả: Lê Xuân Quỳnh

Nghe hơi vô lý nhưng rõ ràng Apple đã tạo điều kiện để Developer lười theo cách thông minh của họ.

Chúng ta sẽ tìm hiểu vì sao nói lười là thông minh? Nghe hư cấu nhỉ? 🤣

Nào cùng bắt đầu tìm hiểu về lười = lazy!

Mảng lười

Mở bài hơi sốc 1 xíu thôi, cùng theo dõi đoạn code sau nhé:

var numbers: [Int] = [1, 2, 3, 6, 9]
let modifiedNumbers = numbers
.filter { number in
print("Even number filter")
return number % 2 == 0
}.map { number -> Int in
print("Doubling the number")
return number * 2
}
print(modifiedNumbers)

/*
kết quả:
Even number filter
Even number filter
Even number filter
Even number filter
Even number filter
Doubling the number
Doubling the number
[4, 12]
*/

Như các bạn thấy, đầu tiên chúng ta tạo 1 mảng số nguyên. Sau đó dùng hàm filter để tìm ra các số chẵn(chúng ta có 2, 6). Tiếp theo chúng ta dùng hàm map để nhân đôi các số sau khi filter.

Kết quả chúng ta có 4, 12.

Bây giờ chúng ta sẽ dùng lazy như nào? Hãy theo dõi đoạn code sau:

let modifiedLazyNumbers = numbers.lazy
.filter { number in
print("Lazy Even number filter")
return number % 2 == 0
}.map { number -> Int in
print("Lazy Doubling the number")
return number * 2
}
print(modifiedLazyNumbers)
// Prints:
// LazyMapSequence>, Int>(_base: Swift.LazyFilterSequence>(_base: [1, 2, 3, 6, 9], _predicate: (Function)), _transform: (Function))

bằng việc dùng thêm từ khóa lazy để chỉ định rằng mảng “lười” là mảng mà chúng ta cần thao tác. Khi đã xác định bản chất nó như vậy, thì nó lười đi trông thấy: không 1 dòng print nào của filter và map được hiển thị.

Rõ ràng nó làm biếng. Thêm dòng code tiếp vào sau đoạn trên:

print(modifiedLazyNumbers.first!)
/*
Prints:
Lazy Even number filter
Lazy Even number filter
Lazy Doubling the number
4
*/

Vậy là bây giờ đã thấy xuất hiện 2 dòng print và 1 dòng double và kết quả là 4 sau khi nhân đôi số đầu tiên lên.

Tại sao lại vậy? Do yêu cầu chúng ta là chỉ lấy phần tử đầu tiên, cho nên mảng lười chỉ thao tác cho đến khi phần tử đầu tiên xuất hiện. Do vậy chúng ta hạn chế được những động tác thừa không cần thiết.

Rõ ràng trường hợp này là 1 sự lười = thông minh phải không nào 😆

Một trường hợp hay áp dụng trong thực tế:

lập trình swiftTìm kiếm trong ứng dụng

Trong trường hợp như hình, khi chúng ta tìm chữ nào đó thì ứng dụng sẽ bắt đầu hiển thị các places liên quan tới và đồng thời load image cho place đó.

Ví dụ chúng ta muốn tìm các địa điểm bắt đầu bằng chữ “h”.

Khi không dùng lazy, theo dõi đoạn code sau:

let places = ["Ho Chi Minh", "Ha Noi", "Hue", "Da Nang", "Vung Tau", "Nha Trang"]
places
.filter { place in
print("filtered name")
return place.lowercased().first == "h"
}.forEach { place in
print("Fetch image for \(place)")
}

/*
Ket qua:
filtered name
filtered name
filtered name
filtered name
filtered name
filtered name
Fetch image for Ho Chi Minh
Fetch image for Ha Noi
Fetch image for Hue
*/

Như kết quả, chúng ta sẽ duyệt toàn bộ những địa điểm và lấy các địa điểm có tên bắt đầu bằng chữ “h”, sau đó rồi mới fetch ảnh về.

Trường hợp dùng lazy, theo dõi đoạn code sau:

 let places = ["Ho Chi Minh", "Ha Noi", "Hue", "Da Nang", "Vung Tau", "Nha Trang"]
places.lazy
.filter { place in
print("filtered name")
return place.lowercased().first == "h"
}.forEach { place in
print("Fetch image for \(place)")
}
/*
Ket qua:
filtered name
Fetch image for Ho Chi Minh
filtered name
Fetch image for Ha Noi
filtered name
Fetch image for Hue
filtered name
filtered name
*/

Chúng ta tìm ra Ho Chi Minh, sau đó ảnh của địa điểm này sẽ được load luôn. Sau đó tìm ra Ha Noi, va Hue cũng làm tương tự. Rõ ràng nếu không có lazy, thì mảng sẽ phải duyệt qua toàn bộ, sau đó mới fetch ảnh về. Còn với lazy, chúng ta duyệt – tìm ra – fetch về luôn. Theo bạn phương án lười này có thông minh không? Rõ ràng nó được 💯 điểm thông minh cho trường hợp này.

Tuyển dụng lập trình IOS lương cao hấp dẫn tại đây.

Lazy không lưu cache

Lười thì cũng thông minh đấy, nhưng 1 số trường hợp lại không thực sự như vậy. OK, nói đi thì phải nói lại, dù sao thì chúng ta phải quyết định nó sẽ dùng như nào, nên phải hiểu bản chất của nó trước.

Quay lại ví dụ đầu tiên, chúng ta theo dõi đoạn code sau:

let modifiedLazyNumbers = numbers.lazy
.filter { number in
print("Lazy Even number filter")
return number % 2 == 0
}.map { number -> Int in
print("Lazy Doubling the number")
return number * 2
}
print(modifiedLazyNumbers.first!)
print(modifiedLazyNumbers.first!)
/*
Prints:
Lazy Even number filter
Lazy Even number filter
Lazy Doubling the number
4
Lazy Even number filter
Lazy Even number filter
Lazy Doubling the number
4
*/

Chúng ta yêu cầu lấy phần tử đầu tiên 2 lần qua 2 lệnh print, và để ý đoạn log mà chương trình trả về, nó hiển thị rất nhiều!. Với các mảng bình thường, theo dõi đoạn code sau:

let modifiedNumbers = numbers
.filter { number in
print("Lazy Even number filter")
return number % 2 == 0
}.map { number -> Int in
print("Lazy Doubling the number")
return number * 2
}
print(modifiedNumbers.first!)
print(modifiedNumbers.first!)
/*
Prints:
Lazy Even number filter
Lazy Even number filter
Lazy Even number filter
Lazy Even number filter
Lazy Even number filter
Lazy Doubling the number
Lazy Doubling the number
4
4
*/

Nó duyệt qua 1 lần, và lưu vào 1 mảng, sau đó chúng ta dù có gọi nhiều lần phần tử đầu tiên, nó chỉ hiển thị kết quả cuối cùng.

Vậy trong trường hợp này, các bạn sẽ rút ra 2 kết luận:

  • lazy thì không lưu vào cache. Nó sẽ thực hiện lại toàn bộ quy trình từ đầu.
  • lazy trong trường hợp này là ngu ngốc!

OK, vậy để đặt lại cái tiêu đề bài viết cho đỡ chửi thì có lẽ là dùng lazy như nào cho thông minh phải không? Nhưng thôi tôi xin phép để tiêu đề vậy để nhận thêm gạch đá.

Luôn tận dụng API của apple

Với ví dụ trên, chúng ta có thể thay đổi bằng cách dùng API có sẵn của apple và nhận được kết quả tương tự.

Xem xét ví dụ sau:

let collectionOfNumbers = (1…1000000)
let lazyFirst = collectionOfNumbers.lazy
.filter {
print("filter")
return $0 % 2 == 0
}.first
print(lazyFirst) // Prints: 2

Với mảng nhiều phần tử như trên, lazy chỉ thực hiện đúng 2 lần cho ngữ cảnh trên. Và Apple cũng có 1 API để làm điều đó:

let firstWhere = collectionOfNumbers.first(where: { $0 % 2 == 0 })
print(firstWhere) // Prints: 2

Tội gì không dùng hàng Apple anh em nhỉ?

Những trường hợp khác để tối ưu hiệu năng cho ứng dụng

Apple có nhiều API lắm, kết quả thì giống nhau và đây là 1 vài sự so sánh giữa chúng.

Nên dùng contains thay vì first(where:) != nil

Hai API này cùng xác định 1 mảng có chứa 1 phần tử nào đó hay không, nhưng hiệu năng contains sẽ tốt hơn là first(where:) != nil.

Phương án tốt:

let numbers = [0, 1, 2, 3] 
numbers.contains(1)

Phương án tệ:

let numbers = [0, 1, 2, 3] 
numbers.filter { number in number == 1 }.isEmpty == false 
numbers.first(where: { number in number == 1 }) != nil

Dùng isEmpty thay vì count == 0

Khi để kiểm tra 1 mảng có rỗng hay không thì dùng property isEmpty. Còn nếu bạn dùng count, nếu 1 mảng không tuân theo RandomAccessCollection protocol, việc tính count sẽ duyệt qua toàn bộ phần tử của mảng.

Best practice:

let numbers = [] 
numbers.isEmpty

Bad practice:

let numbers = [] 
numbers.count == 0

Tương tự với string – được coi là tập hợp của các ký tự thì dùng isEmpty vẫn là tốt hơn dùng so sánh count với 0.

Lọc phần tử đầu tiên trong tập hợp với điều kiện

Có 2 cách để thực hiện điều đó: dùng filter và sau đó dùng first. Hoặc dùng first where.

Cách 1, chúng ta sẽ duyệt toàn bộ tập hợp, sau đó lấy phần tử đầu tiên. Cách 2 chúng duyệt cho đến khi nào tìm thấy phần tử đầu tiên thì dùng. Rõ ràng là tốt hơn.

Best practice:

let numbers = [3, 7, 4, -2, 9, -6, 10, 1] 
let firstNegative = numbers.first(where: { $0 < 0 })

Bad practice:

let numbers = [3, 7, 4, -2, 9, -6, 10, 1] 
let firstNegative = numbers.filter { $0 < 0 }.first

Điều này cũng đúng với các trường hợp last where.

Tìm phần tử lớn nhất, nhỏ nhất của tập hợp

Có 2 cách để tìm phần tử lớn nhất, nhỏ nhất của mảng:

  • dùng toán tử có sẵn min hoặc max.
  • Dùng toán tử sort sau đó lấy first để tìm min hoặc last để tìm max

Best practice:

let numbers = [0, 4, 2, 8] 
let minNumber = numbers.min() 
let maxNumber = numbers.max()

Bad practice:

let numbers = [0, 4, 2, 8] 
let minNumber = numbers.sorted().first 
let maxNumber = numbers.sorted().last

Xác định toàn bộ mảng phù hợp với điều kiện nào đó

Ví dụ chúng ta muốn mảng chứa toàn bộ là số chẵn. Có 2 phương án để dùng.

Best practice:

let numbers = [0, 2, 4, 6] 
let allEven = numbers.allSatisfy { $0 % 2 == 0 }

Toán tử allSatisfy(_:) được giới thiệu ở swift 4.2 và bạn có thể tham khảo thêm tại đây: SE-0207

Bad practice:

let numbers = [0, 2, 4, 6] 
let allEven = numbers.filter { $0 % 2 != 0 }.isEmpty

Kết luận

Chúng ta có nhiều cách để tiếp cận 1 vấn đề, nhưng sẽ có phương án tốt hơn phương án kia. Việc sử dụng hoàn toàn phụ thuộc vào trình độ của bạn. Do vậy đôi khi giả sử tôi kém, tôi không hiểu, thì bạn có thể dùng tool để check: Swiftlint ở đây. Tool này sẽ cảnh báo những cái mà bạn đang dùng hơi ngáo ngổ, và suggest cho bạn phương án tốt hơn. OK, đó là tất cả.

Toàn bộ bài viết được lấy từ nguồn ở đây và có sửa đổi 1 chút:

Performance, functional programming and collections in Swift

Bài viết gốc được đăng tải tại codetoanbug.com
Xem thêm:

Việc làm IT mọi cấp độ được TopDev cập nhật mỗi ngày, tham khảo ngay!

Xu hướng phát triển của IoT hiện nay

xu hướng phát triển của IoT

IoT là thuật ngữ được nhắc đến rất nhiều trên các diễn đàn công nghệ trong các năm trở lại đây, đặc biệt sau đại dịch Covid-19. Khi sự tương tác giữa con người và con người ngày càng hạn chế thì IoT mang đến cho chúng ta 1 giải pháp tuyệt vời để giao tiếp với các đồ vật, thiết bị và tận hưởng sự phục vụ mà chúng mang lại cho cuộc sống hiện đại.

Hãy thử tưởng tượng đến cuộc sống mà: Ô tô có thể tự lái, bóng đèn tự bật tắt, cây cối được tự tưới nước, … và quan trọng hơn là chúng ta có thể theo dõi (là theo dõi chứ không phải điều khiển nhé) tất cả thiết bị đó qua 1 màn hình điện thoại; IoT là xu hướng tất yếu cho quá trình đổi mới, cái gọi là cách mạng công nghiệp 4.0 hiện nay.

Trong bài viết này, mình cùng các bạn sẽ đi tìm hiểu về Xu hướng phát triển của IoT hiện nay cũng như cơ hội dành cho lập trình viên trong lĩnh vực này nhé.

IoT mang lại lợi ích gì cho người sử dụng?

“Mọi đồ vật sẽ trở nên thông minh hơn” – đấy là lợi ích mà IoT mang lại. Chúng ta đã quá quen với smartphone, smart tivi, hay gần hơn là smarthome, smartkey, …, thì giờ với IoT chúng ta có mọi thứ xung quanh đều thông minh: đèn thông tin – biết lúc nào cần bật khi có người và tắt để tiết kiệm điện, máy giặt thông minh – tự điều chỉnh lượng nước phù hợp với số lượng quần áo, hay ngay đến rèm cửa cũng thông minh – chủ động đóng mở theo ánh sáng mặt trời.

xu hướng phát triển của IoT

Nguồn ảnh: circleid.com

IoT hiện nay

IoT (Internet of Things) là một bức tranh khi mà mỗi đồ vật, con người được cung cấp khả năng truyền tải và trao đổi thông tin qua một mạng duy nhất mà không cần đến sự tương tác trực tiếp giữa người với người hay máy tính. Việc kết nối có thể được thực hiện qua Wifi, 4G hay 5G, Bluetooth, …

Khái niệm IoT được ra đời từ năm 1999, tuy nhiên phải trải qua gần 20 năm, nhờ sự phát triển đầy đủ về phần cứng, các phương thức kết nối thì nó mới phát huy được hết tiềm năng, những ứng dụng của nó vào các hoạt động thực tiễn và kinh doanh.

Theo Gartner, đến năm 2020 thế giới có khoảng 20 tỷ thiết bị đã sử dụng IoT và con số này dự kiến sẽ lên tới 41,6 tỷ thiết bị IoT được kết nối. Rõ ràng thị trường IoT thực sự rất lớn và tiềm năng:

IoT là gì

Nguồn: cioandleader.com

IoT và cách mạng công nghiệp 4.0

Cách mạng công nghiệp 4.0 là sự tự động hóa và trao đổi dữ liệu trong công nghệ sản xuất bao gồm các hệ thống mạng vật lý, mạng Internet kết nối vạn vật và điện toán đám mây. Trong đó, con người có thể giao tiếp và giám sát thiết bị thay vì phải trực tiếp vận hành chúng. Chính vì thế IoT đóng vai trò quan trọng trong nền CN 4.0, nhiệm vụ của nó chính là kết nối mọi thứ với nhau, thu thập mọi dữ liệu từ các cảm biến để con người có thể giám sát được chúng.

Chúng  ta có thể hình dung trong nền công nghiệp 4.0; AIBig Data là bộ xử lý dữ liệu, nhận về 1 lượng lớn dữ liệu , xử lý và đưa ra kết luận đúng đắn; Robotic thay thế sức lao động của con người bằng khả năng vận hành không mệt mỏi của máy móc; thì IoT chính là mạng lưới kết nối 2 thứ trên, chúng giúp thu thập dữ liệu và đưa các phản ứng.

IoT và cách mạng công nghiệp 4.0

Nguồn: westerndigital.com

IoT bị tác động thế nào bởi đại dịch Covid-19

Với sự tác động của đại dịch Covid-19, các yêu cầu về khoảng cách xã hội đã thúc đẩy công việc từ xa, nhu cầu về các tài nguyên máy tính phân tán nằm gần thiết bị và người dùng, cách xa các vị trí tập trung như văn phòng. Khi các nhân viên đều làm việc ở nhà , mọi thứ đều cần sự tự động hóa và được theo dõi từ xa một cách cần thiết hơn – và IoT ở đây để giúp chúng ta làm những việc đó.

Nhìn một cách tích cực thì đại dịch Covid-19 giúp IoT ngày càng có vai trò quan trọng trong mọi lĩnh vực: học tập thi cử từ xa – cần các thiết bị theo dõi, giám sát; khám chữa bệnh từ xa – cần những nguồn lực y tế kỹ thuật số.

IoT bị tác động thế nào bởi đại dịch Covid-19

Nguồn: health.gov.vn

Cơ hội tuyệt vời dành cho các lập trình viên

Hiện nay các doanh nghiệp, công ty trong mọi lĩnh vực đều đang cố gắng đưa IoT vào sử dụng trong kinh doanh của mình một cách hiệu quả; vì thế số lượng dự án, việc làm về các mảng công nghệ liên quan đến IoT đang tăng lên rất nhanh, kèm theo đó mức lương khởi điểm cũng là cao hơn so với các lĩnh vực công nghệ khác.

Lập trình viên IoT tại các tổ chức đóng vai trò nghiên cứu, phát triển nền tảng, thiết bị thông minh, đưa ra các giải pháp mới; cùng với đó là việc thiết kế lắp đặt vận hành, bảo trì giám sát các sản phẩm IoT. Sự đa dạng thiết bị IoT từ phần cứng đến phần mềm cũng tạo ra cho lập trình viên sự đa dạng trong công việc và kèm theo đó là những thử thách mới trong từng dự án mà bạn tham gia. 

Để theo đuổi lập trình IoT, các bạn lập trình viên với đam mê của bản thân hãy bắt đầu ngay từ bây giờ, nắm bắt được xu hướng phát triển của IoT hiện nay để bước vào ngành. Điều thú vị nhất của lập trình IoT là các bạn sẽ được làm việc với các thiết bị phần cứng rất đa dạng và thú vị, hơn hết là khả năng ứng dụng ngay vào được trong đời sống hàng ngày. Chúc các bạn thành công với sự lựa chọn của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

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

Tuple Python là gì? Tìm hiểu về tuple python

Tuple trong lập trình Python. Những điều cần biết

Với anh em nào chưa biết xài Tuple, bài viết này giúp đỡ được, với anh em nào đã xài Tuple và quên té cái giống và khác với List, đọc bài này cũng ổn.

Nói chung là bài viết Tuple Python này dành cho mọi người, mọi trình độ. Đọc vui anh em nhớ ủng hộ nha!. Viết khá cụ thể, giống, khác, ví dụ ví dại rõ ràng đầy đủ.

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

1. Tuple là gì?

Bắt đầu với đặc sản là lướt qua định nghĩa.

A Tuple is also a sequence data type that can contain elements of different data types, but these are immutable in nature. In other words, a tuple is a collection of Python objects separated by commas. The tuple is faster than the list because of static in nature. Tuple là kiểu dữ liệu chuỗi bao gồm nhiều các thành phần có kiểu dữ liệu khác nhau, nhưng nó là không thể thay đổi được. Nói một các khác, tuple là một object Collection phân cách nhau bằng dấu phẩy. Tuple nhanh hơn List cũng ở chỗ này, do tĩnh (static) không thể thay đổi được.

  Biến toàn cục (global), biến cục bộ (local), biến nonlocal trong Python
  Biến và kiểu dữ liệu cơ bản trong Python

Sau định nghĩa thì là syntax, làm gì thì làm vẫn phải lướt qua syntax nha.

Ví dụ này bao gồm nhiều loại tuples lun ha.

# Nhiều loại tuple 

# Empty tuple
tuple_rong = ()
print(tuple_rong)

# Tuple bao gồm toàn số
tuple_toan_so = (1, 2, 3)
print(tuple_toan_so)

# Tuple nhiều loại dữ liệu
tuple_nhieu_loai_du_lieu = (true, "Kieu Chuoi", 5.2)
print(tuple_nhieu_loai_du_lieu)

# Tuple kết hợp nhiều loại
tuple_hon_hop = ("hon hop", [true, false, 6], (9, 2, 3))
print(tuple_hon_hop)

Chỗ nhanh chậm này mình sẽ phân tích kỹ ở mục khác nhau cho anh em. Nhưng mà biết được tuple là immutable rồi thì cái nào không đổi nhớ dùng tuple nha. Không chơi lầy chày cối List nha.

2. Sử dụng Tuple

2.1 Sử dụng

2.1.1 Phương thức hỗ trợ

Tuple cũng hỗ trợ 2 phương thức chính là count và index. Do tính chất immutable nên chắc chắn không thể có các method add và remove nha.

tuple_phuong_thuc = ('t', 'u', 'p', 'l', 'e', 'e', )

print(tuple_phuong_thuc.count('e'))  # Output: 2
print(tuple_phuong_thuc.index('l'))  # Output: 3

2.1.2 Xóa tuple

Xóa một phần tử trong tuple

# Xóa tuple như thế nào
xoa_tuple = ('x', 'o', 'a', 't', 'a', 't', 'c', 'a')

# Tuple không hỗ trợ xóa phần tử do là immutable
del xoa_tuple[3]

# Nhưng có thể xóa toàn bộ tuple
del xoa_tuple

# Lỗi, xoa_tuple không được định nghĩa
print(xoa_tuple)

2.1.3 Negative index (index âm)

Truy cập với index âm, tuple cho phép access với index âm nha anh em.

# Index âm thì tuple sẽ index từ sau ra trước
tuple_index_am = ('t', 'o', 'p', 'd', 'e', 'v')

# Output: 'v'
print(tuple_index_am[-1])

# Output: 't'
print(tuple_index_am[-6])

2.1.4 Slicing

Tuple cũng hỗ trợ cắt các giá trị trong tuple, lưu ý là lấy giá trị để sử dụng chứ về mặt bản chất là không thay đổi được tuple đã định nghĩa ban đầu nha.

# Truy cập tuple với slicing
my_tuple = ('t','r','u','y','c','a','p','i','z')

# Phần tử 1 cho tới 4, có tổng 3
# Output: ('r', 'u', 'y')
print(my_tuple[1:4])

  Tuple Python là gì? Tìm hiểu về tuple python
”]

2.2 Một số lưu ý

Trường hợp chưa muốn định nghĩa giá trị, có thể định nghĩa một Tuple empty như sau:

# Nếu chưa có sẵn các giá trị nhưng vẫn muốn sử dụng tuple, ta có thể thoải mái định nghĩa tuple empty
tuple_empty = ()

Có điều empty thì dễ, nhưng có 1 thì nhớ thêm dấu phẩy (comma) vào nha anh em. Mỗi dấu phẩy thôi nhưng mà quan trọng nha. Không add thì python không hiểu là Tuple đâu á.

# Nếu chưa có sẵn các giá trị nhưng vẫn muốn sử dụng tuple, ta có thể thoải mái định nghĩa tuple empty
tuple_empty = ("kien dep trai",)

Rồi, biết ông đẹp trai rồi, nói hoài. Bài nào cũng ví dụ. Khổ ghê =))). Ví dụ phía trên toàn là cùng kiểu dữ liệu như string hay integers. Lỡ mà tui cần mix nhiều data types (kiểu dữ liệu) với nhau thì được không?.

Được chớ sao không?

You can create a tuple or a list that contains just a sequence of strings, just a sequence of integers, or just a sequence of Boolean values, with each item in the sequence separated by a comma. Bạn có thể tạo tuple hoặc list bao gồm danh sách các chuỗi, hoặc số, hoặc các giá trị boolean. Chỉ cần các nhau các item bởi dấu phẩy là được

# Với tuple mixed thoải mái nha anh em
my_information = tuple("Kien",27,True,"xau",7,"trai",False)

Rồi đó, vừa lòng chưa =))). Phía trên quên ví dụ quên cái dấu phẩy, nếu thiếu sẽ báo lỗi nha anh em

# Nhớ dấu phẩy (comma) nha anh em
>>>tuple_loi = ("Kie" 50,True,"Blog",50)
File "<stdin>", line 1
    >>>tuple_loi = ("Kie" 50,True,"Blog",50)
    ^
SyntaxError: invalid syntax

Tuyển dụng Python mọi cấp độ tại đây!

3. Giống ghê, giữa tuple và list

Theo như cái định nghĩa cụ thể rõ ràng của Tuple ở phía trên, thì rõ ràng cả hai ông thần Tuple trong python và List trong python đều có thể lưu nhiều giá trị vào duy nhất một biến.

Rõ là thế, điểm giống đầu tiên:

3.1 Cú pháp (syntax)

# List lưu nhiều giá trị trong một biến duy nhất
tuple_1 = ["Hoc", "Python", "Khong", "Khó"]. 

# Tuple cũng lưu nhiều giá trị trong duy nhất 1 biến tuple_2
tuple_2 = ("Hoc", "Python", "Khong", "Khó")

Phía trên là ví dụ về sự giống nhau giữa Tuple và List. Đáng ra sẽ nói vào mục khác nhau, nhưng thôi do khác rành rành ra nên nói luôn ở đây.

The only difference is in the syntax: you create tuples by surrounding the items inside them with opening and closing round brackets, (), whereas lists are denoted and defined by the presence of opening and closing square brackets,[]. Điểm khác biệt rõ ràng dễ nhận ra nhất là cú pháp: với tuple thì ta tạo ra danh sách các phần tử và đóng gói lại trong dấu ngoặc (), trong khi đó list thì định nghĩa các item và sau đó đóng mở trong dấu ngoặc vuông []

  Python là gì? Tổng hợp kiến thức cho người mới bắt đầu

3.2 Truy cập (access)

Cả tuple và list đều là ordered collection nha anh em (có thứ tự). Thứ tự này thì không thể thay đổi được ngay sau khi đã tạo ra. Cái này cũng được gọi là định danh duy nhất (unique identifier – index). Cả list và tuple đều bắt đầu với index là 0 cho phần tử đầu tiên, 1 cho phần tử thứ hai.

# Cả List và Tuple đều access bằng index
>>>ten = ("Nguyen","Le","Trung","Kien")

>>>ten[2]
'Le'

>>>ngon_ngu_lap_trinh = ["Python","JavaScript","Java","C"]

>>>ngon_ngu_lap_trinh[0]
'Python'

3.3 Unpacking (bẻ ra – dịch tạm thế nha)

Cả list và tuple sau khi khai báo, anh em có thể phân tích từng item trong đó ra và gán cho các biến khác. Có ví dụ thì dễ phân tích hơn.

# Khai báo tuple trước (không đẹp xấu gì nữa), tên bỏ đi 1 chữ lót, tính Le là chữ lót nha
>>>ten_toi = ("Nguyen","Le","Kien")

# Giờ muốn lấy họ, tên lót và tên ra thành các biến, 3 biến phía dưới nha
>>>ho,ten_lot,ten = ten_toi

>>>ho
'Nguyen'

>>>ten_lot
'Le'

>>>ten
'Kien'

Bóc tách từng giá trị trong tuple và list ra và gán cho các biến khác độc lập thì gọi là unpacking. Cả list và tuple trong Python đều hỗ trợ nha.

4. Ơ thế tuple và list khác nhau gì không?

Xin thưa là có, từ nhỏ bé xinh xinh cho tới lớn lớn cũng xinh xinh. Cái này mình cũng nói ở trên rồi ha. Nho nhỏ nhưng nhớ được thì tốt.

4.1 Mutable và immutabe (thay đổi và không thay đổi)

Đầu tiên cũng là các khác biệt rõ ràng nhất. List thì có thể thay đổi được, nhưng tuple thì không. Một khi đã khai báo tuple thì không thể thay đổi giá trị trong đó.

# List có thể thay đổi được phần tử
list_co_the_doi = [4, 2, 3]
list_co_the_doi[1] = 9

print(list_co_the_doi) = [9, 2, 3]

# Tuple thì cần nha, không cần Python không hiểu
tuple_khong_doi = (4, 2, 3, [6, 5])

# Lỗi, không thể gán giá trị cho tuple
# tuple_khong_doi[1] = 9

4.2 Tốc độ

Do tuple là immutable (không thể thay đổi), nên tốc độ duyệt hoặc lấy theo index của tuple rất nhanh, hơn List.

List chậm hơn so với tuple về cả mặt thời gian và bộ nhớ (memory).
Nguồn ảnh / Source: afshin.io
List Tuple
List có thể thay đổi được Tuple không thể thay đổi được
List tốt hơn về mặt performance ở một số thao tác như insert hoặc delete Tuple chỉ thích hợp để truy vấn các phần tử trong tuple
List tiêu tốn nhiều bộ nhớ hơn Khi so sánh với list, tuple tiêu tốn ít bộ nhớ hơn
Bản thân list có một số phương thức được tích hợp sẵn Tuple không có nhiều phương thức định sẵn

5. Tham khảo thêm về tuple trong python

À anh em xài tuple nhớ đặt tên mục đích nha, như list. Chứ không là phải nhìn value từng item trong đó để mà hiểu á. Code clean, please follow the rule!.

tuple-trong-lap-trinh-python

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

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

Top IT Jobs hot dành riêng cho Top Developers tại TopDev!

Câu chuyện sử dụng VPN

câu chuyện sử dụng vpn

Tác giả: Nguyễn Hồng Quân

Tôi thỉnh thoảng có nhu cầu sử dụng mạng VPN. Trong khi nhiều bạn dùng VPN để vượt qua bức tường chặn các trang web mà chính phủ không mong muốn thì mục đích dùng VPN của tôi lại nhằm phục vụ cho IoT, tạo đường truy cập các máy tính nhúng (BeagleBone, Raspberry Pi) từ xa qua Internet, phục vụ cho công việc.

Các máy tính nhúng của tôi hay được đặt trong một mạng LAN mà router của nó tôi không được can thiệp, nên không thể cấu hình port forward để truy cập trực tiếp từ ngoài Internet được.

No-VPN

Bằng cách thiết lập VPN, tôi sẽ có một mạng LAN ảo giữa laptop của tôi đang ở một quán nước dọc đường và máy tính nhúng đang đặt ở một căn phòng nào đó.

With-VPN

Mặc dù trên thị trường đã có nhiều giải pháp VPN, nhưng những giải pháp VPN “hay nghe tên” như OpenVPN, PPTP, IPSec thì có quá trình cài đặt, kết nối phức tạp. Sự phức tạp này đến từ việc chúng đòi hỏi sử dụng các chứng chỉ số (X.509 certificate).

Mà đụng đến chứng chỉ số là đụng đến việc có nhiều file để cấu hình, phải có bước kí chữ kí số, chứng chỉ số của mình phải được kí bởi một nhà cung cấp chứng thực số (Certificate Authority) có uy tín, không thì kết nối vào mạng VPN sẽ bị từ chối. Chưa kể, các giải pháp này hay bị ca thán vì tốc độ chậm chạp. Các dịch vụ VPN ở dạng cloud service thì không có phần mềm client dành cho máy tính nhúng nên tôi chưa có điều kiện thử.

Hai năm trước, nhu cầu sử dụng VPN của tôi đến từ việc nhóm AgriConnect chúng tôi xây dựng phòng thí nghiệm trồng nấm ứng dụng IoT. Phần mềm điều khiển trung tâm được cho chạy trên một board BeagleBone Black đặt ngay tại nhà trồng nấm. Chúng tôi thì cần truy cập vào BeagleBone để xem thông số môi trường của nhà trồng nấm, đồng thời đặt lịch điều khiển các thiết bị.

Thời gian đầu chưa được sử dụng đường mạng riêng nên chúng tôi phải tìm đến phương án VPN để có thể truy cập từ xa. Giải pháp VPN đầu tiên mà chúng tôi dùng là LogMeIn Hamachi. Dùng được một thời gian thì phát hiện phần mềm client dành cho Windows của Hamachi kém ổn định quá, thế là nghiên cứu tìm giải pháp VPN khác. Giải pháp sau đó tôi tìm được là SoftEther VPN. Đây là một phần mềm VPN còn khá mới, mã nguồn mở, và cho phép đăng nhập bằng password chứ không nhất thiết phải dùng certificate. Trớ trêu là phần mềm này chủ yếu nhắm đến cung cấp cho những người chống chính quyền cộng sản TQ có phương tiện vượt tường lửa Internet của TQ. Cũng phải mất kha khá thời gian để biết cách setup trên server, vì tài liệu được tổ chức, đặt tựa đề theo kiểu rất khó tra cứu. Đã vậy tài liệu chỉ hướng dẫn chi tiết về phần mềm có giao diện chạy trên Windows, trong khi bản dành cho Linux, chỉ có giao diện dòng lệnh thì hướng dẫn rất sơ sài, chỉ có liệt kê, giải thích từng tên gọi trong cấu hình, chứ không hướng dẫn làm gì trước, làm gi sau.

Tuyển dụng kỹ sư lập trình nhúng mới nhất tại đây

Trong quá trình mò mẫm cài đặt SoftEther VPN, tôi thậm chí còn đóng góp sửa lỗi cho dự án. Như vậy hóa ra mình đã góp một phần giúp những người chống Cộng.

Sau khi thử nghiệm SoftEther VPN thành công thì nhà nấm của chúng tôi được di dời đến địa điểm mới, có mạng riêng, nên nhu cầu VPN không còn nữa. Tôi đã định viết thành tài liệu hướng dẫn cách setup SoftEther VPN này, công bố rộng rãi, để giới thiệu SoftEther VPN đến nhiều người hơn, nhưng chưa có thời gian. Bản hướng dẫn sơ lược thì cũng đã có, dưới dạng tài liệu nội bộ của AgriConnect (bản này viết ngắn gọn, không có giải thích, không có dẫn dắt nên không hợp với đại chúng để mà tung ra).

Bẵng đi một thời gian thì nhu cầu sử dụng VPN lại quay lại. Gần đây tôi tham gia vào dự án SUSI.AI Smart Speaker, tạo dựng phần mềm trợ lý ảo (virtual assistant) mã nguồn mở, chạy trên máy tính nhúng Raspberry Pi. Nó sẽ giống Google Home, nhưng là mã nguồn mở nên ai cũng có quyền lấy về, tự làm mạch, tự cài phần mềm lên mà xài. Một trong những việc cần làm là viết một script để tạo ra file ảnh hệ điều hành, trong đó có cài sẵn phần mềm SUSI.AI, để người dùng tải về cấy vào thẻ nhớ và sử dụng với board Raspberry Pi của họ.

Vì script này chạy rất lâu, mà tôi thường hay di chuyển, nên tôi cần chạy script này trên một server, để tôi có thể truy cập từ xa, theo dõi quá trình chạy của script. Ban đầu tôi thuê server của Scaleway để chạy, nhưng server của họ bị một số bug, script không chạy được, nên trong lúc vừa debug, tôi vừa phải xoay qua phương án cho chạy trên Raspberry Pi của tôi, nghĩa là phải thiết lập VPN cho nó để tôi có thể truy cập từ xa.

Lần này thì tôi không muốn dùng SoftEther nữa. Trong lúc thử nghiệm SoftEther, tôi vẫn còn sự bứt rứt không hài lòng. Vốn là người sử dụng Linux lâu năm nên tôi rất ưng ý SSH và cặp khóa SSH. Phương thức xác minh bằng SSH key như thế này vừa đỡ công sức gõ mật khẩu, tránh lộ mật khẩu, mà lại không vướng mắc chuyện CA, chữ kí số như phương thức dùng chứng chỉ số (X509 certificate). Thế nhưng phương thức đăng nhập của SoftEther lại hoặc dùng mật khẩu, hoặc dùng chứng chỉ số, chứ không có cặp khóa như SSH. Tôi vẫn ước ao có một giải pháp VPN cho dùng cặp key như SSH. Cho đến một ngày, tôi phát hiện ra WireGuard.

WireGuard là giải pháp VPN mã nguồn mở, rất mới, và dùng phương thức xác minh y chang SSH, với cặp khóa công khai-riêng, chẳng phải đụng đến mớ chứng chỉ số phiền phức. Chưa hết, WireGuard được cấu trúc theo kiểu mà phần lớn code của nó chạy trong kernel space của Linux, giúp nó có được tốc độ, hiệu năng cao so với các giải pháp VPN khác. Cách cấu hình của nó cũng rất gọn nhẹ, chỉ cần 1 file theo format .ini với 8 dòng (cho client). So với WireGuard thì SoftEther rất rườm rà, phải tạo nhiều lớp: Virtual NIC, Virtual Hub, User, Group, Password . File cấu hình của SoftEther thì không theo format phổ biến (ini, JSON hay YAML, TOML…) mà tự chế format riêng nên không ai dám tự viết file, sợ mắc lỗi. Đây là ví dụ file cấu hình của WireGuard:

[Interface]
PrivateKey = qIN2P8eUhWm2jzu8KIJ4hBb+rt3LT8mJxCuxOcc+l1s=
Address = 192.168.4.2/24
ListenPort = 51820

[Peer]
PublicKey = ZSvxiPwxxvWBeJqzWDWHInDpCY0sTpADcb2A4jom13o=
Endpoint = my_public_server:51820
AllowedIPs = 192.168.4.0/24

Mặc dù đơn giản, nhưng WireGuard vẫn còn bị hụt ở chuyện tài liệu. Tôi cũng phải tìm tài liệu ở nhiều nơi, so sánh qua lại mới mò ra được cấu hình phù hợp cho mô hình mình mong muốn. Thế nên, trong bài sau, tôi sẽ viết một hướng dẫn ngắn về WireGuard.

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

Xem thêm:

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

Front-end developer lên trình như thế nào? Bạn đã thực sự hiểu về Front-End?

Front-end developer lên trình như thế nào? Bạn đã thực sự hiểu về Front-End?

Front-end developer chịu trách nhiệm về những công việc tiếp xúc trực tiếp với tương tác của người dùng, trong khi back-end developer lại làm việc với data và những công nghệ đằng sau. Vậy, con đường sự nghiệp của một Front-end developer sẽ diễn ra như thế nào? Và nên tích lũy những gì, ở đâu để lên trình nhanh nhất?

Hãy cùng TopDev trò chuyện cùng chuyên gia đến từ Chợ Tốt và tìm kiếm câu trả lời cho riêng mình nhé!

Đôi nét về khách mời Trần Trọng Thanh

  • Bắt đầu bằng công việc Flash Developer, công việc về những giao diện và trải nghiệm dành cho người dùng tại công ty Pyramid Consulting
  • Công tác 3 năm tại Singapore, vị trí UI Developer và Front-end
  • Về Việt Nam khởi nghiệp với Nâu Studio
  • Hiện tại đang là Principal Web Engineer tại Chợ Tốt

Tại sao anh lại chọn Frontend mà không phải những hướng khác như Backend hay Fullstack?

Mình bắt đầu từ Flash, sau đó tới UI và đến bây giờ là Front-end: tất cả những thứ đó đều xoay quanh một cái giao diện để tương tác trực tiếp với người dùng, điều đó tạo cho mình sự hứng thú rất lớn so với việc làm Backend hay những công việc phải tương tác nhiều với data.

Thử tưởng tượng mình làm ra một cái sản phẩm, 1 front-end website được xuất lên Internet, nó sẽ tiếp xúc được với rất nhiều người dùng trên đó, mình sẽ rất tự hào với sản phẩm, thành quả mà mình đem lại.

Những khái niệm cơ bản về Front-end

Cách hoạt động và một số khái niệm cơ bản cần nắm?

Front-end developer lên trình như thế nào?

Một lập trình viên Front-end – Front-end Developer sẽ làm ra các thành phần cho một website được chạy trực tiếp trên trình duyệt, những gu lập trình đó là HTML, CSS và JavaScript. Tuy nhiên với xu hướng mới bây giờ cùng những kỹ năng sẵn có của các bạn Frontend thì có thể mở rộng hoạt động cho mình như viết ứng dụng cho mobile theo mô hình hybrid, thậm chí là có thể viết những ứng dụng chạy trên desktop về sử dụng nền tảng web để có thể chạy được trên nhiều hệ điều hành khác nhau. Đó chính là một cái nhìn tổng quát về Front-end.

Ngoài ra theo mình các bạn cần có một số kỹ năng khác thiên về giao diện và trải nghiệm người dùng hơn, ví dụ như bạn phải có khả năng quan sát và chú ý đến chi tiết, nó sẽ giúp ích rất nhiều cho quá trình làm việc.

Vì làm với giao diện, bạn phải có sự nhạy cảm với màu sắc về hình khối và bố cục, như phải chú ý đến canh lề, canh hàng giữa các khối trên giao diện của mình hoặc những icon khi đặt vào nó có ngay giữa hay chưa. Đôi khi nếu mình không có những cảm quan đó thì mình sẽ không để ý và bỏ qua.

Và điều cuối cùng anh nghĩ là một bạn frontend giỏi cần có khả năng tưởng tượng, vì khi làm frontend các bạn rất hay sử dụng các animation hoặc những chuyển động trên trang, bằng khả năng tưởng tượng mình sẽ hình dung được trước những cái đó sẽ xảy ra như thế nào rồi từ đó mới thực hiện lại trong code của mình, như thế chắc chắn nó sẽ chuẩn xác hơn.

Sự khác nhau trong công việc hàng ngày của một Fresher Frontend Dev cho đến cấp bậc Junior, Senior là gì?

Công việc của Fresher chủ yếu là các bạn sẽ làm theo những mẫu có sẵn mà các anh chị đi trước đưa ra. Tiếp theo là Junior thì ở trình độ này các bạn đã có thể làm việc được rồi nhưng vẫn phải tiếp tục học vì những kiến thức chuyên sâu như CSS, JavaScript ở trường không có dạy nên các bạn phải vừa học vừa làm. Đây cũng là khoảng thời gian để các bạn thu nhặt kinh nghiệm cho mình và làm sao để cho công việc trở nên thành thục hơn.

Ngoài ra có một vị trí cũng hay được đưa ra mà anh muốn nói đến là Middle. Với Middle hầu như các công việc cơ bản các bạn đã thành thục rồi, nhưng ở vị trí này các bạn bắt đầu tìm hiểu sâu hơn về những công nghệ mới của Frontend ví dụ như là frameworks và có thể giúp đỡ các bạn ở vị trí thấp hơn giải quyết các vấn đề liên quan.

Đối với Senior thì cái mà vị trí này cần quan tâm nhiều nhất chính là user experience. Khi anh càng lên các vị trí cao hơn thì anh thấy các vị trí này càng đòi hỏi phải tập trung hơn và phải có khả năng hỗ trợ hơn ở một góc độ mới là developer experience. Tại sao lại nói như vậy? Vì khi các bạn đã lên đến vị trí Senior rồi thì các bạn phải làm sao hỗ trợ cho team của mình hoạt động hiệu quả hơn, với kinh nghiệm của mình phải đưa ra được những giải pháp cũng như các framework, các thiết kế để làm sao team mình có thể tạo ra những trải nghiệm tốt nhất cho user.

Ứng tuyển ngay các vị trí tuyển dụng Frontend trên TopDev

Nếu muốn theo đuổi con đường Frontend chuyên nghiệp thì cần chuẩn bị những gì, học những nguồn nào theo kinh nghiệm của anh?

Theo anh nghĩ thì trước tiên mình cần trau dồi thêm khả năng đọc tiếng Anh vì những nguồn thông tin cập nhật mới nhất nó không được viết bằng tiếng Việt, nên nếu em có khả năng đọc tốt, khả năng research tốt thì việc học của mình sẽ đạt hiệu quả cao hơn.

Còn về các nguồn học thì anh thấy gần đây có nổi lên một số nguồn platform nổi bật các bạn lập trình viên hay vào để viết bài là Viblo.asia, là trang để các bạn lập trình viên chia sẻ kinh nghiệm của mình. Cũng như các bạn frontend mới học thì các bạn viết rất nhiều bài JavaScript và frontend, đó là những topic mà các bạn rất quan tâm, mình thấy đó cũng là một cái hay. Còn khi các bạn học đại học, để tra cứu thì anh thấy có website Mozilla Developer Network, các bạn có thể search bất cứ chủ đề nào về JavaScript hoặc frontend với các từ khóa thì sẽ cho ra ngay kết quả mà mình tìm. Đây là những nguồn tra cứu công nghệ frontend trội nhất. Còn để thực hành các bạn cũng có thể vào trang “”w3school””, trên đây có khá nhiều các bài tập để mình có thể thực hành.

Nhưng khi mà các bạn lên cao hơn ở tầm vươn ra với thế giới rồi thì anh thấy kênh hữu hiệu nhất để mình cập nhật những kiến thức mới đó chính là thông qua nền tảng Twitter. Vì không giống như Việt Nam, các lập trình viên ở nước ngoài đa số họ sử dụng Twitter nên mình cũng hay lên đó. Đầu tiên các bạn có thể tìm và follow những tác giả của những thư viện vùng mở rồi sau đó từ những người mà bạn follow nó sẽ có các đề xuất để mình tiếp tục follow các topic và các nhân vật KOLs, họ rất hay chia sẻ và giúp mình có thêm những cập nhật mới. Còn nếu các bạn muốn có một nơi để mình tìm những thông tin cập nhật mới bằng tiếng Việt qua facebook thì các bạn có thể tham gia nhóm mà anh đang là admin: Sài Gòn Frontend Developer, anh cũng chỉ join mỗi group đó và hay post lên group đó thôi. Có những cập nhật gì mới hay những cái gì hay ho anh sẽ post lên đó để những bạn có cùng sở thích với mình tiện theo dõi.

Front-end developer lên trình như thế nào?

Công việc của vị trí Principal Engineer là gì?

Anh sẽ nói qua về Chợ Tốt cho những bạn chưa biết, hiện tại đây là nền tảng rao vặt miễn phí lớn nhất ở Việt Nam. Nơi để người dùng vào trang này hiện tại chia làm 2 nền tảng chính là web và mobile app. Nhiệm vụ chính của anh ở vị trí này là xây dựng một đội ngũ Frontend Engineer mạnh ở Chợ Tốt, từ đó anh sẽ giúp công ty và team đưa ra web app cũng như sản phẩm về web có chất lượng cho nền tảng Chợ Tốt của công ty.

Nói sơ qua về cấu trúc của Chợ Tốt, một team gọi là product và test, các bạn sẽ được phân vào nhiều working group theo những nhóm chức năng của nền tảng, như làm về seller và buyer hoặc liên quan đến molitization. Các bạn frontend trong Chợ Tốt sẽ được phân rải rác vào trong những working group này để làm việc cho những chức năng đó. Các frontend developer đó sẽ họp lại với nhau thành một nhóm gọi là Web Charter, anh sẽ như là thư ký của Web Charter này. Những thử thách ở vị trí này có thể kể đến là mình sẽ hỗ trợ các bạn frontend những vấn đề khó hoặc hóc búa, đôi khi những frontend ở trình độ thấp hơn mà họ không thể giải quyết được như xử lý các vấn đề về performances hay mức độ tải trang cho một số app mà Chợ Tốt đang làm.

Ngoài ra anh sẽ giúp thiết kế những framework sử dụng chung giữa các team với nhau. Thêm nữa anh sẽ giúp chuẩn hóa quy trình để làm sao khi các bạn deliver qua app của mình sao cho nó đạt chất lượng cao thông qua các hoạt động như code review hay là những công cụ kiểm tra social code của bạn. Anh cũng tham gia phỏng vấn tuyển dụng các bạn Frontend và Fullstack Dev vào công ty, giúp cho đầu vào đảm bảo và training đào tạo các bạn sau này.

Lời khuyên và bài học thực tế

Thách thức cụ thể của một Tech Lead và một Principal Software Engineer phải đối mặt, cụ thể ở Chợ Tốt là gì?

Anh nghĩ nhìn chung về vị trí này thì những thách thức hay gặp là giúp cải thiện performance cho web app của mình và làm sao để đưa ra được 1 framework chuẩn và bộ thư viện chuẩn cho toàn bộ team. Bây giờ khi mình đã deliver được rất nhiều website và web app rồi thì team size của mình bắt đầu lớn lên, số lượng nhân sự trong team sẽ nhiều lên thì xu hướng bây giờ là làm sao để các bạn front-end tạo ra được những trang web mới hoặc những chức năng mới cho sản phẩm trên web của mình.

Và một thử thách nữa là mình phải tạo ra một cái design system – một nơi để hệ thống hóa lại những component hoặc các mẫu, chuẩn hóa tất cả lại vào một design system giúp cho các bạn front-end tạo thành một module tùy theo yêu cầu của doanh nghiệp.

Một thử thách khác là làm sao để giúp các bạn Dev Engineer làm việc với nhau tốt nhất theo tiêu chuẩn mà mình đưa ra cũng như với các phòng ban khác trong cùng 1 working group.

Rất nhiều thử thách đặt ra vậy thì, liệu có thách thức nào khiến anh nhớ mãi đến tận bây giờ không?

Anh nghĩ trải nghiệm đáng nhớ nhất của mình ở Chợ Tốt là khi anh vào Chợ Tốt cũng được khoảng 3 tháng, lúc đó anh tham gia một dự án đã gần hoàn thành và sắp release. Yêu cầu lúc đó là đánh giá performance, tốc độ tải trang của app đó trước khi đưa lên production. Kết quả đánh giá khá thấp, đó cũng là challenge đầu tiên của anh, nhiệm vụ của anh cùng với các bạn trong team lúc đó là làm sao để cải thiện điểm này lên.

Bọn anh cùng chung tay đánh giá và xem xét các điểm, các nút thắt cổ chai hoặc những vấn đề đối với bộ đóng gói, kích thước size của nó khá lớn, có một số vấn đề như vậy. Cũng mất một khoảng thời gian cùng làm việc với các bạn trong team sau đó đã cải thiện được rất nhiều. Lúc đó theo anh nhớ thì tool lighthouse của front-end điểm này đã được cải thiện ít nhất cũng gấp 2, gấp 3, tất nhiên là điểm tuyệt đối thì nó cũng không cao lắm so với mong đợi, nhưng so với trước khi anh tiếp nhận và kết quả cuối cùng thì nó đã cải thiện rất nhiều. Nhờ đó anh cũng rút ra được khá nhiều các bài học để đưa ra hướng dẫn và lưu ý để các bạn Junior sau này làm việc có thể cải thiện được những nút thắt cổ chai đó.

Cách anh phân bổ tasks và quản lý team như thế nào?

Vị trí của anh thì đóng vai trò như người điều phối là chính và thư ký cho một nhóm các bạn Front-end Engineer. Các bạn sẽ làm việc cùng với một Fullstack team cùng với những bạn khác như backend, dev, mobile dev và product order, tester. Working group đó chạy theo mô hình scrum như mọi người cũng hay biết. Ở vị trí web charter anh sẽ cố gắng đưa ra một số hoạt động như là họp định kỳ để khi đó mình nắm được tình hình và cách làm việc của các bạn trong working group như thế nào, các bạn có khó khăn gì thì trong buổi họp định kỳ đó mình sẽ đưa ra để mọi người cùng nhau giải quyết. Đó cũng là cách để mình hiểu các bạn hơn, nắm được bạn đang làm gì trong công việc của bạn đó.

Đa số là hoạt động online, mình sử dụng Zira và có các dự án trên đó, mình sẽ đưa ra các ý kiến như về chuẩn hóa, conversion hay những quy chuẩn của team, tùy theo mỗi quy trình mà mình sẽ đưa ra những task cụ thể. Trong các buổi họp chung mình sẽ hướng dẫn cho các bạn, từ đó các bạn sẽ triển khai trong công buổi họp để các bạn liên quan thảo luận với nhau.

Mất bao lâu để trở thành một Senior Front-end Dev? Lời khuyên cho các bạn hiện đang là Junior “trong thời gian dài”.

Front-end developer lên trình như thế nào?

Theo quan sát và đánh giá của anh về khối lượng công việc cũng như trình độ mà các bạn cần đạt được thì anh nghĩ ít nhất cần 3 năm để đạt được vị trí Senior.

Trong 3 năm đó thứ nhất là để các bạn tích lũy kinh nghiệm làm việc thực tế trong các dự án và để học các kiến thức liên quan. Nên anh nghĩ là sẽ không có shortcut – lối tắt để chỉ sau 1 – 2 năm đã trở thành Senior được. Và khi các bạn Junior vào thì các bạn cũng phải học rất nhiều để nắm vững những framework đó. Để đạt được vị trí Senior thì anh nghĩ mình phải luôn đặt ra những mục tiêu học là những nền tảng của Front-end, về những cái cản bản nhất của JavaScript, CSS.

Như anh đề cập có một số bạn vẫn ở vị trí Junior dù đã đi làm một thời gian khá là lâu anh nghĩ là do các bạn chưa có tinh thần học hỏi, các bạn chỉ đến công ty và làm các task được giao mà thôi. Ở công ty thì các bạn sẽ làm trực tiếp các tính năng và các phần được giao, công việc này phần nào đó sẽ lặp đi lặp lại cho nên để mình có thể tiến xa hơn, hiểu sâu hơn thì bắt buộc các bạn nên tự học thêm về nó.

Có một tip anh rút ra được là dù mình làm ở những cấp độ cao – highlevel nhưng mình vẫn phải luôn đặt ra câu hỏi cách hoạt động của nó như thế nào, research để tìm hiểu cách hoạt động bên dưới của nó. Khi có cái mình thấy hay, thấy tò mò về cách hoạt động thì phải luôn luôn đi tìm hiểu nó và đó cũng là cách để mình có những kiến thức nền tảng cho mình. Qua thời gian mình sẽ có đủ kiến thức và khả năng đạt được vị trí Senior.

Rất cảm ơn những chia sẻ hết sức thiết thực của anh Trần Trọng Thanh. Hy vọng qua bài phỏng vấn lần này, các bạn độc giả sẽ có được những lựa chọn phù hợp cho bản thân. Chúc các bạn đạt nhiều thành công trong cuộc sống.

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

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

Automatic Batching – Cải tiến đáng giá trên React 18

Automatic Batching – Cải tiến đáng giá trên React 18

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

Vừa qua, team React đã giới thiệu React 18 RC (Release Candidate) với 1 số các tính năng mới cập nhật đáng giá. Trong số đó, đáng chú ý là feature mới: Automatic Batching giúp tối ưu hóa cho việc render. Bài viết hôm nay chúng ta cùng đi tìm hiểu về nó để thấy được team phát triển React đã và đang thực sự quan tâm đến việc cải thiện performance của thư viện này thế nào.

Batching là gì?

Như chúng ta đã biết, mặc định mỗi lần gọi setState() thì React sẽ bắt đầu 1 quá trình render mới, một cách đồng bộ và trả về. Khi chúng ta gọi setState 2 lần liên tiếp nhau thì app của chúng ta cũng sẽ render 2 lần. Để tối ưu việc render này thì React cung cấp 1 khái niệm gọi là “render batching”; để thay vì gọi setState nhiều lần thì React sẽ tự batch các lần gọi liên tiếp nhau vào để chỉ phải chạy re-render 1 lần duy nhất.

https://reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous

Trên docs của React có đề cập tới đoạn: state updates may be asyncronous – nguyên nhân là do việc React tự động batch các state updates xảy ra trong các React event handlers (xử lý các sự kiện trong React).

Lưu ý ở đây là với các phiên bản React trước (từ 17 trở xuống) thì việc batching chỉ được thực hiện trong các React event handlers. Điều đấy cũng có nghĩa là những updates xảy ra trong các promises, setTimeout, native event handlers hoặc các event khác sẽ không được batched.

Và đây cũng chính là update mới trong React 18:

Automatic Batching

https://reactjs.org/blog/2022/03/29/react-v18.html

Chúng ta cùng xem đoạn code dưới đây:

Và đây là cách React 18 xử lý so với React 17.

Thực sự thì đây là 1 cải tiến đáng giá của team React trong việc tối ưu performance. Việc các ứng dụng React của chúng ta ngày càng phình to, xử lý rất nhiều các actions bất đồng bộ thì đoạn re-render khiến app bị ảnh hưởng rất lớn đến performance. Nếu xử lý skip được 1 cơ số lần render thừa như vậy thì app của chúng ta sẽ mượt mà hơn rất nhiều.

Tuyển dụng lập trình viên React với đãi ngộ hấp dẫn tại đây!

Sâu hơn chút

Chúng ta cùng đi sâu hơn 1 chút, React đã làm thế nào để xử lý render batching?

Có 1 internal function được sinh ra để wrap các lần setState lại có tên là unstable_batchedUpdates. React theo dõi tất các các state updates được gọi khi unstable_batchedUpdates đang chạy và sau đó áp dụng chúng trong 1 lần render duy nhất.

Bạn có thể hình dung những gì React đang hoạt động như đoạn code dưới đây:

function internalHandleEvent(e) {
  const userProvidedEventHandler = findEventHandler(e);
  
  let batchedUpdates = [];
  
  unstable_batchedUpdates(() => {
    // mọi state updates được gọi tại đây sẽ được push vào batchedUpdates
    userProvidedEventHandler(e);
  });
  
  renderWithQueuedStateUpdates(batchedUpdates);
}

Thực hành

OK, đến đây thì các bạn đã hiểu hơn về render batching cũng như feature mới Automatic Batching trên React 18 rồi đúng không. Hãy thử 1 ví dụ cuối bài lần nữa nhé.

Với bạn code dưới đây, theo bạn thì component sẽ được thực render bao nhiêu lần đối với React-17 và React-18?

const [counter, setCounter] = useState(0);

const onClick = async () => {
  setCounter(0);
  setCounter(1);
  
  const data = await fetchSomeData();
  
  setCounter(2);
  setCounter(3);
}

Cảm ơn các bạn đã đọc bài! Hy vọng bài viết hữu ích cho mọi người.

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

Xem thêm:

Việc làm IT mọi cấp độ tại đây!

CV IT Developer là gì? Viết CV IT Developer như thế nào là chuẩn?

tạo cv it developer
CV IT Developer

CV IT Developer được xem là tấm vé vàng giúp ứng viên ngành lập trình ghi điểm với nhà tuyển dụng. Vậy, làm sao để CV của bạn dễ dàng qua khỏi bước sàng lọc? CV như thế nào mới hấp dẫn được nhà tuyển dụng? Thông qua bài viết này, TopDev sẽ hướng dẫn cách tạo CV cho Developer đảm bảo đúng nội dung, chuẩn format.

CV IT Developer là gì?

Là loại văn bản ngắn dưới hình thức 1 trang A4, CV IT Developer thể hiện rõ các thông tin về cá nhân, học vấn – trình độ năng lực, kinh nghiệm, mục tiêu phát triển nghề nghiệp,.. của một ứng viên ngành IT.

CV IT Developer
CV IT Developer là gì?

Không phải chỉ khi cần việc làm bạn mới viết CV. Định kỳ sau một khoảng thời gian nhất định, bạn hãy đúc kết kinh nghiệm, kỹ năng từ những dự án, công việc mà mình đã làm, sau đó update vào CV. Việc viết CV như vậy giúp bạn định hình được bản thân và có những trải nghiệm tốt hơn. 

Tạo CV IT miễn phí trên TopDev ngay

Nên viết CV IT Developer như thế nào?

Không có một quy chuẩn nào là tuyệt đối dành cho CV IT Developer. Ở đây, mình sẽ đưa ra những thông tin tổng hợp từ CV của các Developer, Engineer ứng tuyển vào những “ông lớn” như Google, Amazon, Intel,… Từ trên xuống, CV sẽ bao gồm:

  • Thông tin cá nhân
  • Giới thiệu bản thân
  • Kinh nghiệm làm việc
  • Kỹ năng lập trình (tech stack)
  • Dự án
  • Trình độ học vấn

Bên cạnh đó còn có những mục như chứng chỉ, hoạt động, ngôn ngữ sử dụng,… bạn có thể linh hoạt thêm vào CV của mình sao cho tất cả nội dung cùng thống nhất là được. Ở đây mình sẽ hướng dẫn những mục “hầu như đều có” như sau:

Thông tin cá nhân – Personal information

Đây là phần đầu tiên của CV, ở phần này nên bao gồm họ tên và chuyên môn công việc của bạn. Chẳng hạn: Trần Cao Minh – Senior Frontend Developer.

Giới thiệu bản thân – Summary

Trả lời những câu hỏi dưới đây chỉ với 1 câu, đó sẽ là nội dung chính cho phần “sale bản thân”:

  • Bạn là ai? – 
  • Bạn đã làm gì?
  • Kinh nghiệm trong lĩnh vực liên quan đến vị trí ứng tuyển?
  • Mục tiêu trong 1-2 và 3-5 năm tới của bạn là gì?

Kinh nghiệm làm việc – Experience

Đây là phần dành cho bạn thể hiện những kinh nghiệm làm việc mà bạn đã tích góp được trong quá trình đi làm hoặc tham gia hoạt động. Bạn không nhất thiết phải liệt kê chi tiết hết tất cả vị trí bạn từng đảm nhiệm. Hãy đưa ra những việc liên quan, ngắn gọn và quan trọng nhất với vị trí mà bạn dự định ứng tuyển. Thứ tự đưa thông tin nên từ thời gian gần đến xa.

Một lưu ý nhỏ là trừ khi công ty cũ của bạn là một tập đoàn lớn và danh tiếng, còn lại bạn nên để vị trí công việc lên trước tên công ty. Nhà tuyển dụng họ thường quan tâm đến những việc bạn làm hơn là công ty cũ của bạn. Việc ưu tiên để vị trí lên trên sẽ giúp nhà tuyển dụng tập trung vào năng lực của bạn hơn.

  Kinh nghiệm làm việc được tính như thế nào?

Kỹ năng lập trình – Technical Skills

Tóm gọn trong vài gạch đầu dòng về công nghệ, framework, tech stacks bạn sử dụng là gì? Đó là tất cả những gì bạn cần làm cho phần này. Chẳng hạn:

  • Data Science: R, Python with NumPy and Pandas, Spark (prior experience)
  • Programming Technologies: SQL, MATLAB, Ruby, Ruby on Rails, Java, JavaScript, HTML/CSS

kỹ năng lập trình

Dự án – Projects

Mục này thường dành cho những bạn đã có kinh nghiệm, hãy kể ra những dự án, sản phẩm mà bạn đã làm hoặc góp phần tạo nên nó. Một cách tốt hơn nữa, bạn kèm theo kết quả của những dự án này.

Không phải nói như vậy thì những bạn fresher sẽ không thêm mục này vào CV của mình. Hãy cho những dự án liên quan vào, kể cả đó là những dự án trong quá trình học tập của bạn. 

Học vấn – Education

Dĩ nhiên, phần này sẽ bao gồm thông tin về trường học/nơi đào tạo và các chứng chỉ có liên quan mà bạn đạt được. Tùy thuộc vào các vị trí, bạn nên có sự linh động trong việc bổ sung thêm các yếu tố như: khóa học chuyên ngành, dự án học thuật/thực tế,…

Tương tự như kinh nghiệm làm việc, bạn hãy đặt chuyên ngành / nội dung mình học trước, phía dưới mới đề cập nơi đào tạo nhé!

Lời khuyên cho sinh viên mới ra trường

Đối với sinh viên mới tốt nghiệp hoặc những bạn định hướng làm việc trái ngành, đây là phần bạn nên chú ý.

Danh tiếng là một yếu tố quan trọng. Danh tiếng trường đại học của bạn hay thương hiệu nơi bạn đã thực tập là một yếu tố giúp bạn có được đánh giá cao hơn trong mắt nhà tuyển dụng.

Bạn có thể đề cập đến kinh nghiệm làm việc tại một cửa hàng tiện lợi tuy nhiên hãy liên kết nó với một thứ gì đó liên quan đến vị trí bạn ứng tuyển. Bởi vì, công việc tại cửa hàng tiện lợi khác với công ty công nghệ. Nếu nó không có gì liên quan, hãy loại bỏ khỏi CV của bạn.

Đừng quá thất vọng, kinh nghiệm làm việc không phải là điều duy nhất quyết định bạn có đủ điều kiện hay không. Sở thích của bạn cũng là một tín hiệu tốt để truyền tải nó đến nhà tuyển dụng. Bạn thích chơi game, tò mò về những điều thường trên internet. “Người này có thể phù hợp với vị trí lập trình game hoặc lập trình web”, sở thích của bạn là lý do cho suy nghĩ này.

Sau khi bạn đã qua được vòng loại CV và bước chân vào vòng phỏng vấn rồi thì hãy tận dụng cơ hội để đạt được ước mơ. Chuẩn bị thật tốt cho phỏng vấn và thành thật về khả năng của mình nhé!

Một vài lời khuyên nữa cho bạn

Format CV cần đúng chuẩn

Đâu là những lỗi được đánh giá về format?

  • Rườm rà nội dung, hình thức chưa trọn vẹn hoặc các yếu tố khác như: lỗi chính tả, email không chuyên nghiệp, viết dông dài không đúng trọng tâm,…
  • Nội dung CV bị thiếu nhiều nội dung cần thiết.
  • Dù cho bạn muốn viết CV cho sinh viên IT mới ra trường hay CV xin việc CNTT chuyên nghiệp, bạn vẫn phải đảm bảo CV Developer IT đúng chuẩn format

CV cần ngắn gọn, đúng trọng tâm

Một nhà tuyển dụng không đủ kiên nhẫn để đọc hết CV “ngắn” của bạn. 3s- 5s đầu là thời gian bạn cần giữ ánh nhìn của nhà tuyển dụng. Thực tế cho thấy, có rất nhiều ứng viên viết CV dài dòng. Điều này vô tình khiến nhà tuyển dụng đánh giá không chính xác về năng lực của bạn. 

Do vậy, hãy lưu ý viết cô đọng và đầy đủ nội dung. Đảm bảo cấu trúc CV. Hãy thể hiện mình là một trong những ứng viên sáng giá. Dù cho bạn là freelancer IT hay các vị trí khác, thì CV phải đảm bảo tính ngắn gọn, súc tích.  

CV IT Developer đính kèm các cứ liệu thực tiễn

Dù viết CV tiếng Việt hay CV IT tiếng anh (CV IT English), bạn nên quan tâm việc đưa các số liệu phân tích để chứng minh cho hiệu suất công việc của mình. Đặc biệt, nếu ứng tuyển vào các vị trí QA, QC, Tester, Data Analyst, Project Manager,… minh chứng từ thực tế qua các thông số có vai trò rất quan trọng. Vì thế, hãy chia sẻ về chúng thay vì chỉ dừng lại ở việc liệt kê kết quả.

Đến đây, nếu bạn đang hoang mang với quá nhiều thông tin, hãy sử dụng công cụ tạo CV IT online do TopDev cung cấp. Mở một tab tạo CV, vừa đọc bài vừa áp dụng ngay vào CV để hiệu quả hơn bạn nhé!

Format CV IT này được phát triển theo logic sàng lọc thông tin ứng viên của nhà tuyển dụng. Điều đặc biệt là bạn không chỉ tạo CV trên máy tính ở website TopDev mà còn có thể tạo nhanh chóng qua điện thoại tại app TopDev. Thử ngay!

Hi vọng những thông tin trên sẽ giúp các bạn thiết kế cho bản thân một chiếc CV đủ ấn tượng với nhà tuyển dụng. Tất nhiên, mọi thông tin mình chia sẻ đều nằm ở một góc độ nhất định, hãy tham khảo và ứng dụng những gì bạn cho là đúng nhé. Happy coding!

Tạo CV IT Online tại đây

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

Xem thêm Tìm việc IT hàng đầu tại TopDev

Web3 tất cả những điều cần biết

web3

Web3 hay còn gọi là Web3.0 được Gavin Hood đặt ra vào năm 2014, là đời sau của Web2.0. Ở bài viết này mình sẽ ngược dòng lịch sử, cung cấp cho các bạn cái nhìn tổng quan và đầy đủ về Web3.

Ngược dòng lịch sử ngay thôi nào anh em!

1. Ngược dòng lịch sử trước khi bắt đầu với Web3

Sau khi anh em đã xác định là Web3 không phải là www (viết tắt của world wide web). Ngược dòng lịch sử, từ những năm 90.

Tất nhiên là đừng vội vài hiểu lầm web3 là www nha anh em.

web3 là gì

2. Chúng ta đã có bao nhiêu Web version?

Như anh em đã biết Web2, hầu hết những trang web mà anh em mình sử dụng hằng ngày. Tất nhiên là vẫn ổn với Web2, nhưng Web2 rõ ràng đang được thống trị bởi 5 ông lớn trong nghành là Alphabet, Amazon, Apple, Meta, và Microsoft.

1.1 Web 1.0

Để khỏi mất gốc khi tìm hiểu về web 3.0 thì anh em mình cùng ngược dòng lịch sử, tìm hiểu lại về Web 1.0. Kiểu, không có gì phải vội vàng ở đây cả.

Web 1.0 thường được gọi là thời kỳ khủng long của kỉ nguyên world wide web. Bắt đầu từ những năm 1980 đến những năm 2000. Ra đời năm 1973 bởi U.S. Defense Advanced Research Projects Agency (DARPA) – Cơ quan nghiên cứu tiên tiến Hoa Kỳ.

Kết quả của web 1.0 cho ra đời nhiều giao thức vẫn còn sử dụng tới tận ngày nay như SMTP (email), HTTP (web), FTP (file transfer). Rất rất nhiều anh em vẫn còn sử dụng đến ngày nay.

web1.0 structure Kiến trúc của Web1.0

Về cơ bản, Web 1.0 chỉ là giao tiếp cơ bản giữa client (browser) và server, các nội dung trả về thường là HTML tĩnh. Giao tiếp cũng là một chiều, nội dung người dùng chủ yếu nhận được là chữ, khó để giao tiếp bằng hình ảnh, bình luận.

Website được tạo ra ở thời kỳ 1.0 cũng còn được gọi là website chỉ đọc. Vì nó chỉ cung cấp thông tin cho người đọc, không tương tác, không trải nghiệm.

ví dụ web1.0 Web 1.0 – thời tiền sử của kỷ nguyên World Wide Web

Sau khi đã hiểu tất cả, chốt hạ anh em mình có công thức cho Web 1.0

Web1 = the internet of information; i.e., The HTML CSS websites you cannot interact with.

Web1 = kỷ nguyên internet của không tin. Bao gồm HTML CSS và không thể tương tác.

Gòi xong, không tương tác là thấy dở rồi, nhu cầu con người càng ngày càng nhiều. Không tương tác chỉ một chiều thì còn gì là hứng thú nữa. Web 2.0 ra đời là tất yếu.

Tuy nhiên, đừng quên là cũng có tới 100,000 websites sử dụng và tới 50 triệu người sử dụng.

users of web1.0

Tuyển dụng lập trình web với đãi ngộ hấp dẫn tại đây!

1.2 Nhu cầu và sự ra đời tất yếu của Web 2.0

Gần 20 năm qua, chúng ta tương tác chủ yếu với Web 2.0. Vậy web 2.0 có gì đặc biệt?. Web 2 chú trọng tương tác, tức là chiều từ người dùng tới web application, điều mà Web 1.0 chưa thể làm được.

Nói đơn giản thì với web1.0 nếu bạn là người muốn mua hàng, bạn có thể lên website xem danh sách các mặt hàng và tới tận cửa hàng để mua nó. Nhưng với web 2.0, bạn có thể comment, nhấn like facebook, bình luận về sản phẩm.

Web2.0 là version mới tăng tính tương tác của user với web application.

web2.0 structure

Kiến trúc của web2 bổ sung thêm các script service, kết nối nhiều hơn tới database. Tổng kết cho web 2.0 ta có:

Web2 = the internet of interactions; i.e., Modern platforms like Facebook, Twitter, etc., that allow you to be connected end to end with others.

Web2 = kỷ nguyên của internet tương tác, những platform như Facebook, Twitter, cho phép chúng ta kết nối với người khác

Ồ, tới đây một số bạn sẽ bảo web2.0 đã đủ tốt, như hiện tại là đã ok, vậy ta có cần Web3.0 nữa không?. Câu trả lời là phát triển không ngừng.

Web2.0 hiện tại cũng đang bị chi phối bởi những ông lớn của làng công nghệ, họ chi phối gần như mọi thứ ta có ở Web 2.0. Khi bạn mua hàng, thông thường bạn sẽ tìm kiếm thông qua google. Để tìm một món đồ, thường người ta sử dụng Amazon, ở mình là Tiki.

ứng dụng web2.0

1.3 Sự ra đời của web3.0

À quên chốt cho Web2.0, vì tập trung vào tương tác nên thành tựu của Web2.0 cũng tương đối khủng khiếp. Hơn 100 triệu website và hơn 1 tỷ người dùng

users of web2.0

Rồi, quay lại với guồng quay công nghệ luôn phát triển.

Như đã biết ở trên về sự thống trị của các ông lớn đối với Web 2.0. Sự thống trị này đối với một số nhân viên cộm cán ở tập đoàn lớn đôi khi là quá lâu. Họ cần tìm một hướng đi mới cho world wide web. Chính vì vậy, rất nhiều người ủng hộ web3 và sẵn sàng rời bỏ công việc hiện tại với mức lương hấp dẫn để chuyển qua web3. Các ông này thì hơi ngán với sự chuyên quyền của các ông lớn.

Bắt đầu với Web3 luôn thôi nào!

3. Web3 là gì?

Rồi, sau khi đã biết và hiểu về Web 1.0 và Web 2.0, giờ dễ hàng hơn để ta cùng tìm hiểu về Web3. Lướt qua một tí về định nghĩa khó hiểu về Web3 nha.

Web3 is centered on an ecosystem of technology products that are decentralized, trustless, permissionless, and interoperable

Web3 tập trung vào một hệ sinh thái các sản phẩm công nghệ phi tập trung, không tin cậy, không cần sự cho phép và có thể tương tác

Ồ, phi tập trung và trustless, nghe phi tập trung thì có vẻ gì đó là mới mới, hay hay. Nhưng mà trustless thì nghe hơi oải, giờ tấn công mạng đã đầy rẫy ra, trustless nữa thì toang.

3.1 Trustless trong Web3

Để mà hiểu được trustless và decentralized, ta cần quay lại chút xíu về blockchain. Như anh em cũng đã biết, blockchain với sổ cái là tập trung, tức là tất cả đều được ghi vào sổ cái.

Dữ liệu trước đây, thay vì lưu trữ tập trung ở một máy chủ, với blockchain, những dữ liệu này có thể được phân tán ra trên toàn thế giới (mỗi cái này còn được gọi là một nodes).

Những nodes này thì có thể là bất cứ thứ gì, nó có thể là một máy tính cá nhân, cũng có thể là một server lớn.

Cộng với yếu tố cơ bản từ blockchain, tất cả có thể thoải mái giao tiếp với nhau mà không cần một bên thứ 3 đứng ra trung gian kiểm soát hay đảm bảo (ví dụ như giao dịch). Bạn nào chưa hiểu tại sao blockchain có thể trust nhau giữa các nodes mà không cần bên thứ ba thì tham khảo bài viết này.

Chính nhờ sự trust này, Web3 đạt được yếu tố Trustless.

Với web3 dựa trên blockchain và sổ cái rõ ràng, Web3 đạt được yếu tố Trustless

Còn phi tập trung (decentralized) thì từ đâu mà có?. À mà phi tập trung nếu nghe khó hiểu thì anh em dùng từ phần tán cũng được.

3.2 Decentralized trong Web3

Với Web 2.0, có phải anh em mình đâu còn cách nào khác là giao dữ liệu của mình cho các ông lớn. Dữ liệu search giao cho Google (search hằng ngày). Tìm cái gì trên tiki thì bùm phát quay qua google lại thấy tiếp.

Khoan bàn về tính riêng tư, nhưng những gì các ông lớn khai thác ở người dùng thiệt sự khủng khiếp. Còn nhớ tới scandal Cambridge Analytica của Facebook, đôi khi dữ liệu của chúng ta được sử dụng để chống lại chính chúng ta. Chính sự bức xúc này, Web3 ra đời nhằm triệt tiêu vài trò của các ông lớn.

Dữ liệu bây giờ không còn tập trung về tay các ông thần đó nữa. Mỗi nodes bây giờ là độc lập, không còn được kiểm soát bởi bất cứ tập đoàn lớn nào. Chính điều này đã đạt được tính phi tập trung cho Web3.

3.3 Vậy còn permissionless?

À, tí quên permissionless. Blockchain anh em cũng đã nghe qua các ví như MetaMask (đối với ETH) hoặc Phantom (với Solana). Ví này trong blockchain có thể hiểu như ví tiền ngay sau mông anh em mình.

Bao gồm căn cước, số điện thoại vợ khi xỉn còn gọi ra đón, … vân vân. Rồi, ví đóng vai trò để định danh và lưu dữ liệu cá nhân trên mạng lưới blockchain. Với web3, ta có thể lựa chọn ứng dụng phi tập trung nào có thể tương tác với ví của mình. Tất cả những nodes hay ứng dụng khác không thể truy cập được.

Chính vì không cần bên thứ 3 cho phép hoặc duyệt, web3 đạt được permissionless.

3. Điều gì làm cho Web3 trở nên thú vị?

Sau khi đã đọc hết phần nội dung giới thiệu về Web3, ắt hẳn anh em cũng có chút khái niệm và hình dung sơ về Web3. Nhưng điều gì đã làm cho Web3 trở nên thú vị. Tương lai web3 sẽ như thế nào?.

Rõ ràng mà nói, với các yếu tố chính ở trên Web3, sẽ còn nhiều các câu hỏi mở về con đường mà Web 3 sẽ phát triển.

Đầu tiên, bản quyền sẽ không còn là điều lo ngại.

3.1 Bản quyền

Với NFT, rõ ràng một số nghệ sĩ có thể kiếm được nhiều tiền hơn từ tài sản trí tuệ mà mình bỏ công làm ra. Không còn cảnh nghệ sỹ chết đói, vấn đề bản quyền sẽ được xử lý tốt hơn ở Web3, đó là điều chắc chắn có thể ta trông cậy được.

3.2 Khó sử dụng

Như anh em đã biết ở phía trên, Web3 không còn chú trọng tới UX, một số Website base trên nền web3 cực kỳ khó sử dụng. Nhưng cũng khó trách, đôi khi do Web3 còn quá mới.

3.2 Đạo đức và pháp luật

Web3 không phải là thiên đường, đôi khi mình hình dung nó như là miền tây hoang dã, dữ liệu cá nhân của bạn bạn phải tự kiểm soát. Một số nền tảng web3 mới vẫn tồn tại những lỗ hổng.

Việc mất dữ liệu vào tay kẻ xấu thì thôi, khỏi bàn. Nhưng đôi khi việc tìm kiếm, xác định kẻ đã gây ra lỗi lầm cũng không hề dễ. Thật sự là còn nhiều hoài nghi và câu hỏi cho thế hệ mới này của World Wide Web.

Bonus anh em tấm hình so sánh Web1, Web2 và Web3 khỏi quên nha.

so sánh web1.0, web2.0 và web3.0

Nguồn ảnh: weforum.org

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

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

Xem thêm:

Tìm kiếm việc làm CNTT phù hợp với bạn trên TopDev!

Cập nhật công nghệ hiện tại và xu hướng mới trong tương lai

12 công nghệ mới hiện nay và xu hướng công nghệ tương lai

Công nghệ ngày càng trở nên quan trọng đối với con người, hiện diện trong mọi lĩnh vực của cuộc sống. Đặc biệt, những năm bùng phát Covid 19, công nghệ càng thể hiện vai trò chiến lược của mình, giúp con người, doanh nghiệp thích ứng nhanh chóng và bứt phá trong đại dịch. Vậy đó là những công nghệ nào? Hãy cùng TopDev khám phá những công nghệ đang hot hiện tại và các xu hướng công nghệ tương lai mới nhất hiện nay!  

Những công nghệ mới nhất hiện nay

AI và Machine Learning

AI là từ viết tắt của từ Artificial Intelligence, còn được sử dụng với tên gọi Trí tuệ nhân tạo. Đây là công nghệ mô phỏng các quá trình suy nghĩ và học tập của con người cho máy móc, đặc biệt là các hệ thống máy tính.

Khác với việc lập trình Logic trong các ngôn ngữ lập trình, Trí thông minh nhân tạo AI gần giống với trí tuệ của con người hơn nhiều. Cụ thể, chúng có thể suy nghĩ, lập luận để đưa ra quyết định, đồng thời có khả năng tư duy, giao tiếp và tự học.

Xu hướng công nghệ mới AI

Xem thêm các việc làm AI tại TopDev

Thuật ngữ AI không còn xa lạ đối với chúng ta, tuy nhiên ứng dụng từ công nghệ ngày vẫn tạo nên không ít bất ngờ trong những năm qua. AI được ứng dụng trong các công nghệ nhận dạng hình ảnh, giọng nói, các ứng dụng điều hướng, trợ lý cá nhân trên smartphone,…

Machine Learning (Máy học) là một lĩnh vực của Trí tuệ nhân tạo, cho phép máy tính cải thiện chính bản thân chúng dựa trên dữ liệu mẫu (Training data) hoặc dựa vào kinh nghiệm (những gì đã được học). Machine learning thường được sử dụng trong các bài toán về dự đoán (dự đoán giá nhà, giá xe,…) và bài toán phân loại (nhận diện chữ viết tay, nhận diện đồ vật,…).

Công nghệ hiện nay - AI

AI, Machine Learning cùng sự kết hợp với các công nghệ mới như IoT, Blockchain,… sẽ còn tạo ra những đột phá mới. Chúng len lỏi vào từng ngóc ngách của đời sống và phục vụ cho nhu cầu của con người. Trong những năm kế tiếp, thế giới có thể được chứng kiến sự tiến bộ vượt bậc của công nghệ robot, nhà thông minh, xe tự lái,… được ứng dụng từ những công nghệ này. 

Cloud (Điện toán đám mây)

Công nghệ Đám mây (Cloud) đang ngày càng trở nên phổ biến và được ứng dụng trong nhiều ngành nghề, lĩnh vực. Thuật ngữ Cloud ẩn ý nói về mạng Internet, có thể hiểu Cloud là nơi chứa tất cả những thứ bạn tiếp cận từ xa qua Internet, bao gồm các phần mềm và cơ sở dữ liệu của bạn. Các dữ liệu này tồn tại trên Cloud đồng nghĩa với việc chúng đã được lưu trữ trên các máy chủ ảo trên Internet và sẽ không làm tốn bộ nhớ ổ cứng của máy tính hay các thiết bị di động của bạn.

Công nghệ Cloud (Điện toán đám mây)

Xem thêm các việc làm Cloud tại TopDev

Một số dịch vụ Cloud phổ biến có thể kể đến: Dropbox, Google Drive, Microsoft OneDrive, Amazon Cloud Drive,… Với các lợi ích như: tiết kiệm chi phí đầu tư phần cứng, phần mềm…, khả năng truy cập mọi lúc mọi nơi, nhất quán trong lưu trữ dữ liệu,…, các dịch vụ dựa trên đám mây chính là sự lựa chọn của nhiều doanh nghiệp, tạo nên một cuộc cách mạng trong thế giới Internet hiện nay.

Internet Vạn Vật (IoT) và Thành Phố Thông Minh

IoT tiếp tục là một xu hướng lớn, với ngày càng nhiều thiết bị kết nối internet và giao tiếp với nhau. Năm 2024, IoT sẽ mở rộng ra ngoài việc kết nối các thiết bị gia dụng thông minh để phát triển mạnh mẽ trong các ngành công nghiệp như chăm sóc sức khỏe, nông nghiệp, và logistics.

Thành phố thông minh cũng đang trở thành hiện thực, với việc ứng dụng IoT vào quản lý hạ tầng, điều khiển giao thông, và tiết kiệm năng lượng. Các cảm biến và hệ thống tự động trong thành phố thông minh sẽ giúp tối ưu hóa các dịch vụ công cộng, cải thiện chất lượng cuộc sống của người dân.

Xem thêm các việc làm IoT tại TopDev

Những mục tiêu trong tương lai như mô hình nhà thông minh, thành phố thông minh, hệ thống chăm sóc sức khỏe thông minh, hệ thống theo dõi, giám sát tự động, nông nghiệp thông minh … đều là những ví dụ về ứng dụng của IoT trong đời sống. Với sự tiến bộ không ngừng của AI, Machine learning, mạng Internet, nền tảng Điện toán đám mây, công nghệ IoT được dự đoán sẽ còn mang đến những điều to lớn hơn thế trong tương lai. 

Phát Triển Blockchain và Tiền Điện Tử

Mặc dù tiền điện tử như Bitcoin đã gặp phải một số biến động, nhưng công nghệ blockchain đang tiếp tục phát triển mạnh mẽ và được ứng dụng vào nhiều lĩnh vực. DeFi (tài chính phi tập trung) và NFT (token không thể thay thế) đã mở ra những cơ hội mới cho việc giao dịch và sở hữu tài sản số. Blockchain cũng được ứng dụng trong quản lý chuỗi cung ứng, y tế, và cả chính phủ, nhờ vào tính bảo mật và minh bạch của nó.

Năm 2024, các giải pháp blockchain sẽ tiếp tục cải thiện về mặt hiệu quả, bảo mật và khả năng mở rộng, giúp nó trở thành một công nghệ trụ cột trong nền kinh tế số.

AR và VR

Công nghệ AR (Augmented Reality)VR (Virtual Reality) đang phát triển nhanh chóng, đặc biệt là trong lĩnh vực giải trí, giáo dục và thương mại điện tử. Năm 2024, chúng ta có thể mong đợi sự gia tăng trong việc áp dụng AR và VR để tạo ra các trải nghiệm tương tác phong phú hơn cho người dùng, từ việc chơi game thực tế ảo đến mua sắm trực tuyến với các thử nghiệm thực tế tăng cường.

AR cũng sẽ trở nên phổ biến hơn trong các ngành công nghiệp như sản xuất và y tế, giúp cải thiện quy trình làm việc và cung cấp thông tin theo thời gian thực.

Công Nghệ 5G và Tiến Đến 6G

Năm 2024 sẽ là thời điểm bùng nổ của mạng 5G trên toàn thế giới, với tốc độ truyền tải nhanh hơn, độ trễ thấp hơn, và khả năng kết nối nhiều thiết bị hơn. 5G sẽ hỗ trợ mạnh mẽ cho các công nghệ khác như IoT, AI, và xe tự lái, tạo điều kiện thuận lợi cho việc phát triển các ứng dụng thời gian thực đòi hỏi tốc độ truyền tải cao.

Bên cạnh đó, nghiên cứu về mạng 6G đã bắt đầu và trong tương lai, 6G hứa hẹn sẽ mang đến tốc độ kết nối gấp nhiều lần 5G, cùng với việc kết hợp các công nghệ tiên tiến như AI và IoT một cách mạnh mẽ hơn.

Web3.0 – Kỷ nguyên mới của Internet

Web3.0 – Thế hệ thứ 3 của mạng Internet lần đầu được phát triển năm 2006. Chúng được xây dựng dựa trên công nghệ Machine Learning, Trí tuệ nhân tạo (AI) và Blockchain. Điểm đột phá của Web3 so với các thế hệ Web1 và Web2 trước đó chính là cách thức lưu trữ dữ liệu phi tập trung, thay vì được lưu trữ tập trung dữ liệu thông qua một nền tảng trung gian khác (ví dụ như Facebook, Google,…).

Xu hướng công nghệ tương lai

Ý tưởng về Web3.0 là sự phát triển của “Semantic Web” (web ngữ nghĩa) với khả năng hiểu được kiến ​​thức và dữ liệu, giúp con người tìm kiếm và tiếp cận thông tin hiệu quả hơn. Với công nghệ chuỗi khối (Blockchain), thế hệ web thứ 3 mở ra các xu hướng mới về Token, Coin, Metaverse,…

Tuy nhiên, Web3 cũng gặp nhiều thách thức lớn khi phải đối mặt với khối lượng dữ liệu khổng lồ, thông tin không nhất quán hay các cạm bẫy tiềm ẩn từ công nghệ này.

Dù vậy, Web3.0 vẫn được biết đến với tầm nhìn vượt trội và mục tiêu tạo ra một Internet thông minh và cởi mở hơn. 

Xu Hướng Công Nghệ Tương Lai

Trí Tuệ Nhân Tạo Tổng Quát (Artificial General Intelligence – AGI)

Trong tương lai, Trí tuệ nhân tạo tổng quát (AGI) sẽ là một bước tiến quan trọng vượt ra ngoài khả năng của các hệ thống AI hiện tại. Trong khi AI hiện nay có khả năng thực hiện các nhiệm vụ cụ thể như nhận diện hình ảnh, dịch ngôn ngữ, hoặc lái xe tự động, AGI sẽ có khả năng suy nghĩ, học hỏi và thích nghi với bất kỳ loại vấn đề nào, tương tự như con người. AGI hứa hẹn sẽ tạo ra các hệ thống thông minh có thể hoạt động linh hoạt trong nhiều lĩnh vực khác nhau mà không cần phải đào tạo riêng biệt cho từng nhiệm vụ.

Tuy nhiên, để đạt được AGI, các nhà khoa học sẽ phải đối mặt với nhiều thách thức lớn trong việc hiểu sâu hơn về nhận thức và trí tuệ của con người. Dù vậy, một khi AGI được phát triển, nó sẽ có khả năng cách mạng hóa toàn bộ các ngành công nghiệp từ y học, tài chính, đến sáng tạo và giáo dục.

Điện Toán Lượng Tử (Quantum Computing)

Điện toán lượng tử đang trong giai đoạn phát triển và dự kiến sẽ trở thành công nghệ quan trọng trong tương lai gần. Khác với máy tính truyền thống sử dụng bit để xử lý dữ liệu, máy tính lượng tử sử dụng các qubit, cho phép xử lý đồng thời nhiều khả năng trạng thái. Điều này giúp điện toán lượng tử có thể giải quyết các bài toán phức tạp với tốc độ nhanh hơn hàng triệu lần so với máy tính hiện tại.

Ứng dụng của điện toán lượng tử trong tương lai sẽ bao gồm mật mã học, phát triển thuốc, mô phỏng vật lý, và tối ưu hóa các quy trình trong công nghiệp. Các công ty công nghệ lớn như IBM, Google, và Microsoft đều đang đầu tư mạnh mẽ vào nghiên cứu điện toán lượng tử, và trong vòng một vài thập kỷ tới, chúng ta có thể thấy sự ra đời của các máy tính lượng tử có thể áp dụng trong đời sống thực tế.

Công Nghệ Sinh Học và Y Tế Cá Nhân Hóa

Trong tương lai, công nghệ sinh học sẽ tiếp tục phát triển mạnh mẽ, đặc biệt là trong việc chỉnh sửa gen, y tế cá nhân hóa và điều trị bệnh bằng phương pháp mới. CRISPR và các công nghệ chỉnh sửa gen khác có thể mở ra khả năng điều trị các bệnh di truyền. Đồng thời, y tế cá nhân hóa dựa trên dữ liệu lớn và AI sẽ giúp tạo ra các phương pháp điều trị và dự đoán bệnh chính xác hơn.

Metaverse – Không Gian Ảo Mở Rộng

Metaverse là một xu hướng quan trọng sẽ định hình tương lai của cuộc sống số. Metaverse là một thế giới ảo liên kết, nơi con người có thể tương tác thông qua các avatar và tham gia vào các hoạt động như làm việc, học tập, mua sắm, giải trí và thậm chí là giao tiếp xã hội. Các công nghệ nền tảng như thực tế ảo (VR), thực tế tăng cường (AR), và Internet vạn vật (IoT) sẽ đóng vai trò quan trọng trong việc xây dựng metaverse.

Metaverse không chỉ là một không gian ảo, mà còn mở ra các cơ hội kinh doanh mới trong các lĩnh vực như bán lẻ, giáo dục, và giải trí. Trong tương lai, các doanh nghiệp có thể phát triển các sản phẩm và dịch vụ chỉ dành riêng cho metaverse, và metaverse cũng có thể trở thành một phần quan trọng trong nền kinh tế số.

Trí Tuệ Nhân Tạo Tăng Cường (Augmented AI)

Trong tương lai, ngoài AGI, trí tuệ nhân tạo tăng cường (Augmented AI) sẽ trở thành một xu hướng quan trọng. Augmented AI không thay thế con người, mà hỗ trợ con người thực hiện các nhiệm vụ phức tạp hơn bằng cách cung cấp thông tin, phân tích dữ liệu và đề xuất giải pháp thông minh. Các lĩnh vực như tài chính, y tế, giáo dục và sản xuất sẽ hưởng lợi lớn từ sự phát triển của Augmented AI, giúp tăng hiệu suất và giảm thiểu rủi ro.

Kết lại

Những ý tưởng sáng tạo cùng khả năng bất tận của con người trong việc cải tiến công nghệ mới Web3, Internet vạn vật, Trí tuệ nhân tạo,… sẽ còn mang đến nhiều bất ngờ cho cuộc sống chúng ta. Hi vọng qua bài viết, bạn có thể tiếp hiểu thêm về các xu hướng công nghệ mới nhất hiện nay cũng như khám phá những xu hướng của tương lai đang được chú ý. Hẹn gặp lại bạn trong những bài viết sau về các xu hướng công nghệ mới hiện nay.

TopDev tổng hợp. 

Xem thêm:

Tìm việc làm IT phù hợp tại TopDev

Áp dụng quy trình hiện đại khi làm phần mềm cho hệ thống nhúng

Áp dụng quy trình hiện đại khi làm phần mềm cho hệ thống nhúng

Tác giả: Nguyễn Hồng Quân

Đi qua đi lại một vài đơn vị làm phần mềm nhúng, IoT Việt Nam, mình thấy không hài lòng lắm về cách làm việc hơi cũ. Mình thấy nhiều bạn làm điện tử có thể lập trình được, những vẫn còn một khoảng trống dài về phương pháp làm việc giữa những người này và những người thuần về phần mềm. Thế nên mình viết bài này, hi vọng kéo những người làm phần mềm nhúng tiến lên vài bước cho gần với chuẩn.

Lưu ý: Những cách làm sau đây, ban đầu sẽ gây thiệt thòi vì vẽ ra quá nhiều chuyện để làm, nhưng về lâu dài thì có lợi cho việc tiếp tục phát triển sản phẩm.

Chia nhỏ phần mềm thành những gói gần như độc lập

Lấy ví dụ về một hoạt động kiểm nghiệm ý tưởng thiết kế phần mềm tại AgriConnect.

Một số sản phẩm điện tử tại AgriConnect là kết quả của sự hợp tác, trong đó đối tác làm một module, AgriConnect làm một module và ghép với nhau. Trước khi bắt tay vào việc thì mình sẽ đề xuất API để 2 module trao đổi lệnh, dữ liệu với nhau, thường là phía đối tác sẽ lập trình ARM, bên mình thì lập trình ESP8266/ESP32.

Dù là lập trình cho thiết bị nhúng nhưng AgriConnect vẫn tổ chức một cách bài bản: tối đa module hóa các chức năng của phần mềm, cắt phần mềm ra những thư viện độc lập để có thể tái sử dụng.

Ví dụ ở phần phân tích dữ liệu trao đổi với module ARM thực ra là xử lý chuỗi, không phụ thuộc vào phần cứng (vi điều khiển) cụ thể nên sẽ được tách ra thành thư viện. Việc tách ra thành thư viện trung tính này có một cái lợi nữa là, trong khi đối tác chưa làm xong thiết bị để có thể test thì phần code thư viện đó được viết và test thẳng trên PC.

A Rust code

Trong hình là lúc mình đang viết những dòng code đầu tiên để kiểm nghiệm ý tưởng thiết kế API có tốt không, và mình chọn Rust để viết! Viết bằng Rust có cái lợi là, vì là một ngôn ngữ hiện đại, công cụ đi kèm hiện đại nên có một số cấu trúc viết nhanh gọn hơn C, hỗ trợ unittest built-in luôn. Với C thì phải chọn lựa thư viện ngoài để viết unittest, rồi thêm việc setup rườm rà cho unittest (trong khi với Rust thì chỉ cần lệnh cargo test là đủ).

Tuy nhiên một điều đáng buồn là sau khi kiểm nghiệm ý tưởng xong thì mình vẫn phải chuyển qua C để viết code thật, vì lý do trình biên dịch của Rust chưa hỗ trợ biên dịch cho ESP8266, ESP32. Có điều vì tư tưởng “thư viện trung tính” nên code C đó vẫn dùng để chạy, test, debug trên PC được, trước khi ráp vào code dành cho ESP8266/ESP32.

Hình dưới đây là mình biên dịch thư viện trên PC (x86) và chạy unit test:

test-on-pc

(Về hệ thống build, thay vì dùng make, mình đang dùng Meson và Ninja, hiện đại hơn).

Còn hình dưới đây là code thư viện được ứng dụng vào code cho ESP32:

lib in C

Viết phần mềm giả lập / mô phỏng thiết bị

Trong quá trình làm sản phẩm kiểu 2 thiết bị giao tiếp với nhau thì luôn gặp trường hợp là không có sẵn thiết bị để test giao thức, vì nó vẫn còn đang được chế tạo, thế nên mình hay viết phần mềm mô phỏng để thay mặt thiết bị còn thiếu.

Các thiết bị bên mình thường giao tiếp qua UART (serial), MQTT hoặc WebSocket. Phần mềm mô phỏng chạy trên PC và nắm một đầu serial, còn đầu kia của serial cắm vô board đang được lập trình. Việc viết ra phần mềm mô phỏng này thường là nhanh, vì mình dùng Python, với một kho thư viện khá khủng, hầu như mục đích gì cũng có.

Thỉnh thoảng, thói quen thứ nhất kể phía trên cũng có lợi luôn cho cả thói quen thứ hai. Đó là câu chuyện khi mình viết server để điều khiển thang máy trong một dự án nọ. Thang máy có một giao thức riêng để gửi yêu cầu gọi thang vào đó. Nhiệm vụ của mình trong dự án là viết ra phần mềm server, cung cấp nhiều API để cho phép các app, các thiết bị quẹt thẻ được gọi thang. Phần xử lý giao thức trò chuyện với thiết bị được mình tách ra một thư viện riêng. Do thang máy không có trong tay, nó đang phục vụ cho một tòa nhà tận ngoài Hà Nội, không đem về test được nên mình cũng phải viết ra một phần mềm mô phỏng luôn.

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

Ngoài phần mềm mô phỏng, mình cũng còn viết một công cụ test, phân tích gói tin có giao diện người dùng. Do trong lúc làm server và viết ra thư viện kia, không có phần cứng thật, mà tài liệu mô tả thì không thể trông cậy hoàn toàn (tài liệu có thể viết sai, viết thiếu, hoặc thậm chí mình hiểu sai tài liệu), mình không thể biết chắc mình đang viết đúng hay sai, nên công cụ debug gói tin này sẽ dùng để đem ra tận nơi lắp đặt, test trước để kiểm chứng tài liệu. Nhờ việc tách ra thư viện con nên mình tái sử dụng được vào cả 3 phần mềm, tiết kiệm được khá nhiều công sức. Một điều thuận lợi nữa là thư viện của Python giúp kết quả debug rất dễ nhìn.

Trong mục này, không có hình ảnh minh họa vì thiết bị đã đem đi lắp cho khách hàng, không còn cái nào để cho tương tác với phần mềm mô phỏng, còn dự án thang máy kia thì giao thức kia là nội dung bí mật.

Cập nhật: Có một hình ảnh minh họa về một trường hợp khác có sử dụng phần mềm giả lập thiết bị, trong bài Một số mẹo cho việc phát triển ứng dụng hệ thống nhúng.

Sử dụng Git

Sử dụng Git (hoặc các phần mềm tương tự) là kĩ năng cực kỳ quan trọng nhưng mình kể ra sau vì dù sao thì nó cũng đã được chấp nhận nhiều nơi rồi. Trước đây mình từng phỏng vấn một anh trạc tuổi, có thâm niên làm hệ thống nhúng. Với chừng ấy năm làm sản phẩm, lại gánh team cho một startup thì hẳn kinh nghiệm về điện tử là dày dạn rồi. Thế nhưng mình không tuyển được vì anh này viết code và lưu trữ trên Google Drive, chưa từng đụng đến Git. Dù đã có nhiều công ty áp dụng Git, nhưng mình vẫn nhắc ở đây một lời: Tập dùng Git bằng dòng lệnh đi! Chắc 99% những bạn mà mình đã phỏng vấn, kể cả mảng làm app di động, app backend, đều chỉ dùng Git thông qua phần mềm có giao diện đồ họa (GUI). Ưu thế của Git dòng lệnh là tất cả tính năng nâng cao của Git đều chỉ nằm ở đó.

Một câu hỏi phỏng vấn về Git mà mình đưa ra khiến tất cả ứng viên thất bại là:

  • Giả sử bạn vừa tạo xong một commit thì phát hiện ra mình nhầm. Giả sử đội của bạn quy ước một commit chỉ gồm một file, nhưng bạn lỡ gom ba file trong một lần commit. Vậy bạn sửa lại làm sao?

Hoặc một phiên bản khác:

  • Giả sử bạn vừa commit một file. Trong file đó có năm chỗ thay đổi nhưng thật ra chỉ có ba chỗ thay đổi là liên quan đến tính năng bạn đang làm, còn hai chỗ thay đổi kia đáng lẽ nằm ở commit khác. Nhưng bạn lỡ commit xong rồi mới phát hiện ra mình nhầm, vậy bạn sửa lại làm sao?

Trong những năm đi làm phần mềm của mình thì tình huống sắp xếp, chia lại commit như vầy xảy ra cũng nhiều lần, thậm chí mình còn gặp những tính huống oái oăm hơn (nhưng ít gặp hơn). Tất cả những tình huống từ cấp độ này trở lên đều chỉ giải quyết được bằng Git dòng lệnh.

Một câu chuyện khác về lợi ích của Git là khi bạn cần sửa lại thư viện của người khác, chẳng hạn các thư viện được quản lý trên kho của PlatformIO. Những thư viện này thường đã được quản lý bằng Git. Cách làm của mình là fork thư viện này ra một repo khác, tạo một nhánh mới và sửa đổi code trên nhánh đó. Khi thư viện được tác giả nâng cấp thì chỉ cần “merge” code từ repo gốc vào là sẽ nhận được cập nhật. Nếu không được quản lý bằng Git thì khi bộ code gốc của tác giả được cập nhật, muốn copy phần cập nhật qua bản sửa đổi là không biết copy từ đoạn nào, vào đoạn nào.

Trên đây là mình kể sơ một vài bước thực hành tốt để nâng cao độ chuyên nghiệp và chất lượng sản phẩm cho các anh em lập trình nhúng. Để kết bài, mình còn một lời khuyên nhỏ khác: Tập sử dụng Linux và các phần mềm mã nguồn mở, cố gắng đưa việc lập trình lên làm trên Linux. Một lý do thực tế là Git và những quy trình xoay quanh nó được ra đời từ Linux. Một dự án quy mô cỡ Linux, bộ source code được viết bởi 15.600 người, đến từ 1.400 công ty rải rác khắp nơi trên thế giới, thì bài toán quản lý, đảm bảo chất lượng là bài toán lớn khủng khiếp.

Ngoài ra, việc tham gia dự án mã nguồn mở khó tính như OpenSC đã tạo cơ hội cho mình rèn luyện, va chạm với những tình huống oái oăm và khai thác tính năng nâng cao của Git. Cộng đồng Python thì giúp mình chú trọng đến việc viết tài liệu một cách chỉn chu. Chắc ít người để ý, rất nhiều dự án, cho dù không phải Python, đều đăng tài liệu trên https://readthedocs.org/. Website này ra đời từ cộng đồng Python, sử dụng những công cụ nền được sáng tạo từ hệ sinh thái của Python.

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

Xem thêm:

Tham khảo việc làm IT lương cao tại TopDev

Lập trình viên mobile cần học những gì?

Lập trình viên mobile là thuật ngữ dùng để chỉ các bạn chuyên về phát triển các ứng dụng dành cho di động (smartphone) bằng cách sử dụng các ngôn ngữ lập trình như Java, Kotlin, Objective-C, Swift, JavaScript, … Các ứng dụng phổ biến hiện nay được phát triển và phát hành thông qua các cửa hàng ứng dụng như Google Play cho Android và App Store dành cho iOS.

Với tốc độ phát triển chóng mặt hiện nay của thị trường Smartphone, ngành lập trình mobile cũng trở nên rất hot với nhiều cơ hội việc làm với mức đãi ngộ tốt. Vậy lập trình viên mobile cần học những gì để có thể đáp ứng được nhu cầu của các nhà tuyển dụng, cũng như có thể tự mình tạo ra các ứng dụng tốt thu hút được nhiều lượt tải và sử dụng. Trong bài viết này, mình cũng các bạn sẽ cùng đi trả lời câu hỏi đó nhé.

Đặc thù của lập trình mobile

thiết kế app

Nguồn ảnh: http://softsupplier.com

Thứ nhất, làm ứng dụng mobile là phát triển ứng dụng trên các thiết bị di động, vì thế bạn sẽ được thường xuyên làm việc với các thiết bị smartphone: từ iPhone đến iPad, từ Z Fold đến Z Flip, hay nhẹ nhàng hơn là dòng Google Pixel thuần Google; tất nhiên đôi khi đó là các thiết bị máy ảo (Simulator hay Emulator). 

Thứ hai, giao diện của các ứng dụng bạn viết ra sẽ được gói gọn trong không gian màn hình khoảng 5-7 inch, hạn chế hơn rất nhiều so với việc làm ứng dụng desktop hay web; điều đó khiến bạn phải có những kĩ năng thiết kế, hiểu biết về UI/UX nhất định để tối ưu được giao diện và trải nghiệm người dùng. 

Thứ ba, làm việc với các cảm biến, các thiết bị ngoại vi và kết nối: mặc dù nhỏ gọn nhưng smartphone được trang bị đầy đủ từ camera, loa, cảm biến vân tay, nhận diện khuôn mặt, … Ngoài ra smartphone hiện nay còn làm được gần như tất cả mọi thứ: từ thanh toán, mua sắm, định vị, kết nối máy in,… quá nhiều thứ mà lập trình viên cũng phải tìm hiểu để làm việc với chúng.

Cuối cùng, các ứng dụng mobile để đến được với người sử dụng cần được phát hành thông qua các nền tảng chợ như Google Play hay App Store, vì thế bạn cũng sẽ được thường xuyên làm quen với việc triển khai, deploy ứng dụng lên các store đó. Các hệ điều hành mới được cập nhật thường xuyên, mỗi năm đều có 1 lần hệ điều hành được nâng phiên bản với sự thay đổi tương đối lớn về các tính năng cũng như thiết kế, cũng chính vì đó mà các ứng dụng của bạn cũng cần phải được cập nhật 1 cách thường xuyên.

Vậy các kỹ năng bạn cần trang bị để trở thành lập trình viên Mobile là gì?

Trang bị kiến thức và kỹ năng về lập trình

Trước tiên để trở thành 1 lập trình viên mobile thì bạn cũng cần có những kiến thức và ngành, về nghề lập trình cũng như các kỹ năng để làm việc team và làm việc độc lập như:

  • Kỹ năng giao tiếp
  • Khả năng ngoại ngữ
  • Kỹ năng giải quyết vấn đề
  • Tinh thần trách nhiệm với công việc

Hiện nay nhu cầu việc làm trong ngành lập trình nói chung cũng như lập trình mobile nói riêng là rất lớn, để làm việc được trong các công ty, tổ chức với quy mô dự án lớn, đội ngũ team phát triển đông đảo và có thể đa quốc gia, đa ngôn ngữ; rõ ràng những kỹ năng trên là vô cùng cần thiết mà bạn cần trang bị. 

teamwork

Nguồn ảnh: https://www.devteam.space

Lựa chọn ngôn ngữ lập trình

Để bắt đầu với lập trình di động, hãy bắt đầu với việc xác định ngôn ngữ lập trình, nền tảng ứng dụng bạn theo đuổi ngay từ đầu. Hiện nay có khá nhiều sự lựa chọn dành cho bạn để viết ứng dụng cho di động: mobile native, web-based app hay cross-platform.

Native Vs Cross Platform Vs Hybrid App Development

Nguồn ảnh: https://www.techtic.com

  • Mobile native: sử dụng ngôn ngữ lập trình được tạo ra bởi các nhà sáng lập hệ điều hành: Google Android trang bị cho lập trình viên bộ Android Studio, có thể viết bằng Java hoặc Kotlin; Apple iOS thì cung cấp bộ IDE Xcode, có thể viết bằng Objective-C hoặc Swift. Nếu bạn mới bắt đầu lập trình, việc lựa chọn 1 ngôn ngữ và đi theo hướng native sẽ giúp bạn có thể tiến xa trong ngành này.
  • Cross-Platform và Hybrid (Web-based là 1 loại Hybrid): sử dụng các ngôn ngữ lập trình khác như JS, HTML5, Dart, C# với các framework được trang bị như React, Flutter, Xamarin giúp phát triển các ứng  dụng có thể chạy đồng thời trên nhiều nền tảng khác nhau. Cách tiếp cận này phù hợp hơn dành cho các bạn muốn thử sức với lập trình mobile khi đã có nền tảng với các ngôn ngữ khác. Ví dụ 1 bạn đã có kinh nghiệm làm ReactJS hoàn toàn có thể dùng React Native để phát triển ứng dụng di động của mình.

Trang bị kiến thức về thiết kế UI/UX

Các ứng dụng mobile luôn có sự hạn chế về không gian hiển thị tuy nhiên lại có sự đa dạng lớn về các loại màn hình và thiết bị, vì thế đòi hỏi sự thống nhất trong cách bố cục UI và định hướng UX cho người dùng.

Lập trình viên cần nắm được quy tắc thiết kế ứng dụng để từ đó có thể sáng tạo ra ứng dụng với nét riêng có điểm nhấn nhưng vẫn giữ được sự thuận lợi cho người dùng.

Các yếu tố về thiết kế cần nắm được về thiết kế của ứng dụng mobile:

  • Điều hướng, sự dịch chuyển các khối, giữa các màn hình
  • Cảm ứng, nút bấm, vùng hiển thị
  • Font chữ, màu sắc, tính nhất quán giữa các màn hình
  • Các form nhập liệu thu thập thông tin

Lập trình viên mobile cần học những gì?

Nguồn ảnh: https://images.viblo.asia

Tự viết test chạy tự động

Bất cứ ứng dụng nào được tạo ra cũng cần phải được kiểm thử trước khi đưa ra phát hành. Khi viết ứng dụng mobile cũng vậy, viết được auto test thực sự ý nghĩa nếu bạn muốn ứng dụng của bạn trở nên hoàn thiện khi đến tay người dùng. Một vài tool bạn có thể tham khảo sử dụng để viết auto testing như:

  • Selendroid
  • Appnium
  • Espressco

tematical

Nguồn ảnh: https://www.deviqa.com

Tìm hiểu cách phát hành ứng dụng lên store

Như đã nói từ đầu bài, việc phát hành ứng dụng lên các store (App Store hay Google Play) là điều cần thiết để ứng dụng của bạn được nhiều người biết tới.

Mỗi store sẽ có những chính sách, những quy trình deploy ứng dụng lên chợ của mình khác nhau. Bạn hãy dành thời gian tìm hiểu chúng, nắm được cách build ứng dụng, upload lên store, setup các nội dung giới thiệu ứng dụng của bạn đến cho người dùng.

Có thể các bạn sẽ cần tìm hiểu trước các khái niệm sau:

  • Với Google Play: Google Play Console, keystore, APK, App Bundle, …
  • Với App Store: Certificate, Provisioning, AppConnect, Apple Developer, …

statistics apps in app stores

Nguồn ảnh: https://techtalk.vn

Kết bài

Cơ hội việc làm hiện nay đối với ngành lập trình là vô cùng lớn, đối với riêng lập trình mobile thì nhu cầu lại càng cao. Sự thay đổi và cập nhật liên tục của smartphone, nhu cầu sử dụng và ra đời các ứng dụng càng ngày càng cao. Lập trình viên mobile cần học những gì, cần phát triển những gì để có thể đáp ứng với guồng quay nhu cầu của thị trường và các công ty. Hy vọng bài viết này đã đem lại cho các bạn 1 phần câu trả lời cho câu hỏi đó. Hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

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

NFQ Asia phát động chương trình Gây Quỹ Cộng Đồng “Đối Ứng 10,000 USD” hỗ trợ sinh viên IT có hoàn cảnh khó khăn.

NFQ Asia cùng tổ chức phi chính phủ Passerelles numériques Vietnam (PNV) phát động chư đối ứng lên đến 10,000USD thông qua chiến dịch “Gateway for life – Cánh cổng công nghệ dẫn lối tương lai”, nhằm tiếp nối ước mơ cho nhân tài trẻ tại Việt Nam.

chương trình Gây Quỹ Cộng Đồng “Đối Ứng 10,000 USD” hỗ trợ sinh viên IT

Dù có sự tăng trưởng đáng kể về kinh tế, phần lớn nhiều nơi tại Việt Nam vẫn đối mặt với nhiều khó khăn và không có nhiều cơ hội tiếp cận với nền giáo dục tiên tiến, bao gồm cả chuyên ngành Công nghệ Thông tin (CNTT). 

Nhận thấy được vấn đề và hiện thực hóa mong muốn trao điều kiện cho các thanh niên có hoàn cảnh khó khăn vươn lên trong trình học tập và tìm được việc làm trong ngành CNTT, NFQ Asia đã quyết định phối hợp cùng tổ chức PNV phát động “Quỹ Đối Ứng 10,000 USD – Gateway for life”. 

Xây dựng hệ sinh thái nhân tài bằng Quỹ Đối Ứng lên đến 10,000USD

Passerelles numériques Vietnam (PNV) được biết đến là tổ chức phi chính phủ của Pháp thành lập từ 2010, hoạt động với sứ mệnh khai phá tiềm năng của các thanh thiếu niên có hoàn cảnh khó khăn tại Việt Nam thông qua chương trình đào tạo CNTT miễn phí trong vòng 3 năm. 

Chương trình “Quỹ Đối Ứng 10,000 USD” của NFQ Asia nằm trong chiến dịch gây quỹ từ thiện cộng đồng “Gateway For Life” của PNV diễn ra từ ngày 11.06.2022 đến ngày 11.07.2022. 

Chương trình được phát động theo hình thức đối ứng 1:1 giữa người tham gia và đơn vị tài trợ. Nếu bạn ủng hộ 100.000 VNĐ vào quỹ từ thiện “Gateway For Life” của PNV, đồng nghĩa rằng NFQ Asia cũng sẽ đóng góp 100.000 VNĐ tương tự. Cơ hội nhân đôi sức ảnh hưởng này được áp dụng với 10.000 USD đầu tiên từ cộng đồng tiếp sức cho chiến dịch. 

Ông Rich Pham, CEO công ty NFQ Asia, cho biết: “Tại NFQ, chúng tôi luôn cố gắng lưu tâm đến môi trường và cộng đồng nơi chúng tôi hoạt động kinh doanh và sinh sống. NFQ là công ty công nghệ phần mềm duy nhất không có carbon trung tính trong suốt 3 năm vừa qua theo chứng nhận từ ClimatePartner. Đối với việc đóng góp cho cộng đồng, chúng tôi tin rằng giáo dục sẽ luôn bước đệm chủ chốt cho sự phát triển bền vững. Đó là lý do tại sao chúng tôi chọn đồng hành cùng PNV phát động Quỹ Đối Ứng “Gateway for life” để giúp cho các bạn trẻ có hoàn cảnh khó khăn, có được cơ hội học tập và phát triển trong ngành CNTT, thay đổi cuộc đời chạm đến cánh cửa thành công.”

sinh viên IT khó khăn

Mục tiêu của chiến dịch gây quỹ để hỗ trợ chi phí cho 130 sinh viên IT có hoàn cảnh khó khăn đang theo học tại tổ chức PNV trong vòng 1 năm, bao gồm: 

  • 4,000 giờ học công nghệ thông tin miễn phí
  • 50 lớp lập trình, tiếng Anh chuyên sâu và các kỹ năng phát triển bản thân
  • 18 phòng ký túc xá 
  • 27,000 bữa ăn chất lượng

Tìm hiểu cách đóng góp cho dự án “Gateway for life – Cánh cổng công nghệ dẫn lối tương lai” của PNV tại website chương trình: https://gatewayforlife.org.

Thông qua chiến dịch này, hy vọng thế hệ trẻ tiềm năng với hoàn cảnh khó khăn sẽ được tiếp thêm ngọn lửa đam mê với ngành Công nghệ Thông tin. Hãy cùng NFQ Asia và PNV thực hiện sứ mệnh này, mang đến nhiều cơ hội học tập và mở thêm nhiều cánh cổng công nghệ dẫn lối tương lai cho thế hệ trẻ tại Việt Nam.

Về NFQ Asia

NFQ TECHNOLOGIESASIA

NFQ Asia là một phần thuộc tập đoàn công nghệ đa quốc gia NFQ với hơn 20 năm hoạt động. Mục tiêu của NFQ nói chung và NFQ Asia nói riêng là trở thành tập đoàn công nghệ uy tín, nổi tiếng hàng đầu, không chỉ ở chất lượng dịch vụ, sản phẩm mà còn ở môi trường làm việc. 

Với hơn 350 nhân sự tại 4 văn phòng trên các thành phố lớn Hồ Chí Minh, Đà Nẵng, Cần Thơ, Hà Nội, NFQ Asia được chứng nhận là một trong những công ty công nghệ có môi trường làm việc tốt nhất tại Việt Nam trong suốt 04 năm qua.
Một số dự án với quy mô lớn được triển khai bởi đội ngũ lập trình viên tại NFQ bao gồm KAYAK.COM, GetYourGuide, HomeTogo,…

Tìm hiểu thêm về công ty tại website www.nfq-asia.com