Home Blog Page 26

Ngăn xếp – Stack trong C++ là gì? Cài đặt và sử dụng Ngăn xếp

Cài đặt và sử dụng Ngăn xếp – Stack trong C++

Bài viết được tổng hợp bởi tác giả Sơn Dương và Khiêm Lê

Khi lập trình, chúng ta thường phải xử lý một lượng lớn dữ liệu thô và chưa được tổ chức. Điều này đỏi hỏi cần một cấu trúc dữ liệu để lưu dữ liệu và cho phép người dùng thao tác trên dữ liệu một cách hiệu quả. Bài viết hôm nay, chúng ta sẽ cùng nhau tìm hiểu một loại cấu trúc dữ liệu rất phổ biến, đó là ngăn xếp stack trong C++.

Ngăn xếp – Stack là gì?

Ngăn xếp Stack là một cấu trúc dữ liệu tuyến tính hoạt động theo nguyên tắc LIFO (Last IFirst Out), nghĩa là các phần tử được đưa vào ngăn xếp cuối cùng sẽ là phần tử đầu tiên được lấy ra khỏi ngăn xếp.

Bạn có thể hình dung ngăn xếp stack như một chồng sách đặt trong một cái hộp. Khi thêm một sách mới thì nó sẽ được đặt lên trên, cuốn sách cuối cùng được đặt ở trên đỉnh cũng sẽ là cuốn được lấy ra đầu tiên.

ngăn xếp Stack trong C++

Như bạn thấy ở hình trên, phần tử cuối cùng sẽ là phần tử đầu tiên được lấy ra khỏi ngăn xếp stack.

Stack là một loại container trong thư viện STL ( hiểu đơn giản là dạng thùng chứa dữ liệu).

>> Bài viết liên quan: Queue C++ là gì? Cách cài đặt và sử dụng hàng đợi trong C++

Cách thao tác với Stack C++

Với ngăn xếp stack, chúng ta chỉ có các thao tác xử lý dữ liệu sau:

  • push(): Thêm một phần tử mới vào ngăn xếp, số phần tử ngăn xếp tăng lên 1.
  • pop(): Xóa một phần tử khỏi stack.
  • top(): Trả về giá trị của phần tử trên đỉnh của stack. Số phần tử ngăn xếp không thay đổi.
  • size(): Trả về kích thước của ngăn xếp
  • isEmpty(): Kiểm tra ngăn xếp stack có rỗng hay không (trả về một giá trị bool true (rỗng) hoặc false (không rỗng).
  • isFull(): Kiểm tra trạng thái stack đã đầy hay chưa (trả về một giá trị bool true (đầy) hoặc false (chưa đầy).

Các phương thức trên sẽ đều có độ phức tạp O(1).

>> Xem thêm: Phân biệt ngăn xếp và hàng đợi (Stack vs Queue) trong C++

Cài đặt ngăn xếp Stack trong C/C++

Chúng ta sẽ cùng nhau tìm hiểu cơ chế hoạt động của hai thao tác phổ biến nhất trên stack là Push() và Pop().

Lưu ý: Chúng ta thiết lập một con trỏ gọi là “top” để lưu trữ vị trí của phần tử trên cùng của stack. Điều này sẽ giúp thao tác thêm mới, xóa được thực hiện hiệu quả hơn.

Cấu trúc một phần tử

Tương tự với danh sách liên kết, phần tử trong ngăn xếp cũng có thành phần dữ liệu và thành phần liên kết. Để đơn giản, mình sẽ sử dụng kiểu int cho phần dữ liệu. Phần tử thêm vào đầu sẽ liên kết với phần tử phía dưới của stack qua thành phần liên kết là một con trỏ.

struct Node
{
    int data;
    Node *next;
};

Vậy để tạo một phần tử, chúng ta cấp phát động một phần tử, gán thành phần dữ liệu của phần tử đó bằng đối số truyền vào, phần tử mới chưa trỏ vào node nào nên phần liên kết gán bằng NULL và trả về địa chỉ của phần tử đó.

Node *CreateNode(int init)
{
    Node *node = new Node;
    node->data = init;
    node->next = NULL;
    return node;
}

Cấu trúc một ngăn xếp

Các phần tử trong ngăn xếp được xếp vào trên cùng, lúc lấy ra phần tử trên cùng cũng sẽ được lấy ra trước. Do đó, chúng ta chỉ cần nắm được phần tử trên cùng của stack là được. Mình sẽ tạo một struct có thành phần head là một con trỏ lưu địa chỉ của phần tử trên cùng của stack (head).

struct Stack
{
    Node *head;
};

Một stack mới khởi tạo đương nhiên sẽ không có phần tử nào, chúng ta sẽ khởi gán giá trị NULL cho head của stack đó.

void CreateStack(Stack &s)
{
    s.head = NULL;
}

Kiểm tra ngăn xếp rỗng

Để kiểm tra ngăn xếp rỗng (IsEmpty), đơn giản ta chỉ cần kiểm tra xem có phần tử trên cùng của stack hay không, nếu không có thì stack đó chắc chắn rỗng.

int IsEmpty(Stack s)
{
    if (s.head == NULL)
        return 1;
    return 0;
}

PUSH (thêm một phần tử vào ngăn xếp)

  • Đầu tiên, kiểm tra stack đã đầy hay chưa. Tức kiểm tra điều kiện tràn
  • Trong trường hợp ngăn xếp stack đã đầy, thoát thao tác với thông báo: “Stack đã đầy”.
  • Ngược lại, ngăn xếp chưa đầy, con trỏ “top” tăng lên 1, sau đó dữ liệu được thêm vào stack.

Dưới đây là code minh họa cho stack push c++:

void stack_data::push (int a)
{
    if(top >= 5)
    {
        cout << "Overflow\n";
    }
    else
    {
        data[++top] = a; 
    }
}

Tham khảo việc làm C++ Developer hấp dẫn tại TopDev

POP (lấy phần tử trên cùng ra khỏi ngăn xếp)

  • Trước tiên, kiểm tra xem ngăn xếp có rỗng hay không.
  • Nếu ngăn xếp bị rỗng, thoát thao tác với thông báo: “Ngăn xếp rỗng”.
  • Ngược lại, hiển thị giá trị phần tử đang được trỏ bởi con trỏ “top”. Sau đó giảm con trỏ “top” đi 1.

Code minh họa cho thao tác pop

int stack_data::pop ()
{
    if(top < 0)
    {
        cout << "Underflow\n";
        return 0;
    }
    else
    {
        int pop = data[top--];
        return pop;
    }
}

TOP (lấy giá trị phần tử trên cùng ngăn xếp)

Để lấy giá trị phần tử nằm trên cùng ngăn xếp (Top), chúng ta chỉ cần làm tương tự như lấy phần tử trên cùng ra khỏi ngăn xếp, nhưng chúng ta không hủy node đó đi.

int Top(Stack s)
{
    if (IsEmpty(s))
        return 0;
    return s.head->data;
}

Lưu ý: cần phân biệt giữa Pop và Top. Pop là lấy phần tử trên cùng ra khỏi ngăn xếp tức là trả về giá trị phần tử đó và hủy đi. Top chỉ trả về giá trị phần tử trên cùng mà không hủy phần tử đó.

Cuối cùng là chương trình cài đặt stack hoàn thiện như sau:

# include<iostream>
using namespace std;

class stack_data
{
    public:
    int top;
    int data[5]; 
    stack_data()
    {
        top = -1;
    }

    void push (int a);
    int pop ();
    void isEmpty();
    void isFull();
    void display();
};

void stack_data::push (int a)
{
    if(top >= 5)
    {
        cout << "Overflow\n";
    }
    else
    {
        data[++top] = a; 
    }
}

int stack_data::pop ()
{
    if(top < 0)
    {
        cout << "Underflow\n";
        return 0;
    }
    else
    {
        int pop = data[top--];
        return pop;
    }
}

void stack_data::isEmpty()
{
    if(top < 0)
    {
        cout << "Stack Underflow\n";
    }
    else
    {
        cout << "Stack can occupy elements.\n";
    }
}


void stack_data::isFull()
{
    if(top >= 5)
    {
        cout << "Overflow\n";
    }
    else
    {
        cout << "Stack is not full.\n";
    }
}


void stack_data::display()
{
    for(int i=0;i<5;i++)
    {
        cout<<data[i]<<endl;
    }
}

int main() {

    stack_data obj;
    obj.isFull();
    obj.push (40);
    obj.push (99);
    obj.push (66);
    obj.push (40);
    obj.push (11);

    cout<<"Stack after insertion of elements:\n";
    obj.display();

    cout<<"Element popped from the stack:\n";
    cout<<obj.pop ()<<endl;

}

Kết quả khi chạy chương trình trên sẽ như dưới đây:

Stack is not full.
Stack after insertion of elements:
40
99
66
40
11
Element popped from the stack:
11

Ứng dụng của Stack

Tùy vào mỗi yêu cầu cụ thể mà bạn sẽ sử dụng stack để giải quyết. Dưới đây là một số ứng dụng phổ biến của ngăn xếp stack.

  • Stack hay được dùng để hoán đổi vị trí của các phần tử trong Array hoặc String.
  • Một Stack có thể cần thiết trong tình huống cần Backtracking trong một số thuật toán.
  • Trong các ứng dụng kiểu như Text editor, các tính năng undo, redo có thể sẽ cần tới stack.
  • Chuyển đổi Infix/Prefix/Postfix trong Binary Trees.

Ứng dụng Stack để xử lý xâu trong C++

Để giải quyết bài toán tính giá trị biểu thức từ một xâu (string) trong C++ sử dụng cấu trúc dữ liệu Stack.

Bài toán: Cho xâu S chỉ gồm các số nguyên dương và các dấu “+”, “-“, “*”, “/” trong S không có dấu khoảng trống. Tính giá trị của biểu thức được biểu diễn bởi S đó.

  1. Sử dụng hai stack:
  • Một stack để lưu các số (values).
  • Một stack để lưu các toán tử (operators).

2. Duyệt qua từng ký tự của xâu S:

  • Nếu gặp một số, ta đọc toàn bộ số đó (vì số có thể có nhiều chữ số) và đẩy vào stack values.
  • Nếu gặp một toán tử, ta thực hiện các bước sau:
    • Kiểm tra độ ưu tiên của toán tử hiện tại với toán tử ở đỉnh stack operators.
    • Nếu toán tử ở đỉnh stack operators có độ ưu tiên cao hơn hoặc bằng toán tử hiện tại, thì thực hiện phép tính với hai số từ stack values và toán tử từ stack operators.
    • Đẩy toán tử hiện tại vào stack operators.

3. Xử lý phép toán còn lại: Khi duyệt hết xâu S, ta sẽ thực hiện các phép toán còn lại trong stack operators với các số trong stack values.

Code mẫu

#include <iostream>
#include <stack>
#include <string>
#include <cctype>  // For isdigit()

using namespace std;

// Hàm để thực hiện một phép tính cơ bản
int applyOperator(char op, int b, int a) {
    switch (op) {
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': return a / b;
    }
    return 0;
}

// Hàm để xác định độ ưu tiên của toán tử
int precedence(char op) {
    if (op == '+' || op == '-')
        return 1;
    if (op == '*' || op == '/')
        return 2;
    return 0;
}

int evaluateExpression(const string &S) {
    stack<int> values;     // stack để lưu các số
    stack<char> operators; // stack để lưu các toán tử

    for (int i = 0; i < S.length(); i++) {
        if (isdigit(S[i])) {
            int val = 0;
            // Đọc toàn bộ số nguyên (có thể có nhiều chữ số)
            while (i < S.length() && isdigit(S[i])) {
                val = (val * 10) + (S[i] - '0');
                i++;
            }
            values.push(val);
            i--; // Lùi lại một bước vì vòng lặp for sẽ tăng i thêm 1
        } else {
            // Nếu gặp một toán tử, xử lý các phép toán trước đó
            while (!operators.empty() && precedence(operators.top()) >= precedence(S[i])) {
                int val2 = values.top();
                values.pop();

                int val1 = values.top();
                values.pop();

                char op = operators.top();
                operators.pop();

                values.push(applyOperator(op, val2, val1));
            }
            operators.push(S[i]);
        }
    }

    // Thực hiện các phép toán còn lại trong stack
    while (!operators.empty()) {
        int val2 = values.top();
        values.pop();

        int val1 = values.top();
        values.pop();

        char op = operators.top();
        operators.pop();

        values.push(applyOperator(op, val2, val1));
    }

    // Kết quả cuối cùng sẽ nằm trên đỉnh stack values
    return values.top();
}

int main() {
    string S = "3+5*2-8/4";  // Ví dụ: Kết quả là 10
    cout << "Kết quả của biểu thức " << S << " là: " << evaluateExpression(S) << endl;
    return 0;
}

Giải thích

  • applyOperator: Hàm này thực hiện phép tính dựa trên toán tử và hai toán hạng.
  • precedence: Xác định độ ưu tiên của các toán tử, giúp xử lý đúng thứ tự các phép toán (* / trước, + – sau).
  • evaluateExpression: Duyệt qua xâu S, xử lý các số và toán tử theo thứ tự ưu tiên, kết quả cuối cùng sẽ được trả về từ stack values.

Ví dụ: Với xâu S = "3+5*2-8/4", quá trình xử lý sẽ:

  • Đầu tiên, 5*2 được thực hiện (do * có độ ưu tiên cao hơn +), sau đó là 8/4, cuối cùng là 3+10-2.
  • Kết quả cuối cùng sẽ là 11.

Độ phức tạp của các thao tác trong Stack

Độ phức tạp của push() và pop() là như nhau, đều là: O(1)

Lý do là việc thêm mới và xóa phần tử trong stack đều thực hiện ở một đầu – đỉnh của stack.

Lời kết

Như vậy, trong bài viết này, chúng ta đã hiểu được ngăn xếp stack C++ là gì, cách thức hoạt động cũng như ứng dụng của nó trong lập trình. Mình hi vọng, những kiến thức này sẽ giúp ích cho bạn trong các dự án sắp tới.

Hẹn gặp lại ở bài viết sau nhé.

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

Đừng bỏ lỡ công việc IT được cập nhật mỗi ngày trên TopDev

Giải thích thuật toán Dijkstra – Tìm đường đi ngắn nhất

Giải thích thuật toán Dijkstra – Tìm đường đi ngắn nhất

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

Dijkstra là một trong những thuật toán rất nổi tiếng trong giới lập trình. Nghe tới những bài toán liên quan tới tìm đường đi ngắn nhất là nghĩ ngay tới thuật toán Dijkstra.

Thuật toán Dijkstra

Dijkstra là thuật toán được đặt tên theo nhà khoa học máy tính người Phần Lan, người đã phát minh ra nó. Thuật toán này nhằm mục đích tìm đường đi ngắn nhất trong đồ thị có cạnh với trọng số dương.

Tổng quan thuật toán Dijkstra

Trước khi đi vào chi tiết nội dung thuật toán, chúng ta cần phải hiểu những thuật ngữ sau:

  • Graph (đồ thị): Đồ thị là một cấu trúc dữ liệu phi tuyến tính được định nghĩa là G = (V, E), trong V là tập hợp hữu hạn các đỉnh (node), E là tập hợp hữu hạn các cạnh, cạnh là một đường nối giữa hai node với nhau.
  • Weighted graph (đồ thị có trọng số): Tương tự như đồ thị ở trên, chỉ khác là mỗi cạnh sẽ được gán thêm một trọng số. Kiểu như cùng một khoảng cách đi từ A đến B, nhưng đi đường đẹp thì nhanh hơn, đường làng nhiều ổ gà thì chậm hơn.
  • Connected graph (đồ thị liên thông): Một đồ thị được gọi là liên thông (connected) nếu có đường đi giữa mọi cặp đỉnh phân biệt của đồ thị. Ngược lại, đồ thị này được gọi là không liên thông.
  • Spanning tree (cây khung): một spanning tree của đồ thị G là cây con của đồ thị G, chứa tất cả các đỉnh của G. Nói cách khác, cây bao trùm của một đồ thị G là một đồ thị con của G, chứa tất cả các đỉnh của G, liên thông và không có chu trình. Cây bao trùm của đồ thị liên thông G cũng có thể định nghĩa như một đồ thị con không chu trình lớn nhất, hay một đồ thị con liên thông nhỏ nhất của G.

Thuật toán Dijkstra giải quyết bài toán gì?

Cho một đồ thị có trọng số (đặt tên là đồ thị G). Mục tiêu là tìm đường đi ngắn nhất từ một đỉnh cho trước đến các đỉnh còn lại của đồ thị G.

Thuật toán Dijkstra

Đồ thị G có các đặc điểm sau:

  • Gồm tập hợp các đỉnh (V)
  • Tập hợp các cạnh (E). Trong đó ký hiệu (q,r) là biểu diễn một cạnh nối giữa hai đỉnh q và r, cost(q,r) thì biểu thị trọng số của cạnh đó.

  Tìm hiểu về thuật toán đảo ngược chuỗi liên kết (Linked List)

  Thuật toán Brute Force và bài toán Trapping Rain Water

Ý tưởng thực hiện thuật toán Dijkstra

Thuật toán Dijkstra dựa trên nguyên tắc giảm bớt. Trong đó các giá trị chính xác hơn sẽ dần thay thế một giá trị gần đúng với khoảng cách chính xác cho đến khi đạt được khoảng cách ngắn nhất. Khoảng cách gần đúng tới mỗi định được ước tính lớn hơn nhiều khoảng cách thực và sẽ dần thay thế bằng giá trị nhỏ nhất của giá trị cũ bằng độ dài của một đường mới tìm được.

Thuật toán sử dụng hàng đợi ưu tiên kết hợp với thuật toán tham lam chọn đỉnh gần nhất chưa được xử lý và thực hiện quá trị giảm bớt này trên tất cả các cạnh mà nó duyệt qua.

Giả thuật các bước thực hiện:

Bước 1:  Đánh dấu tất các node dự kiến: Đặt khoảng cách từ nút nguồn tới nút 0 là nguồn, và đặt là vô hạn với các nút khác.

Bước 2: Tiến hành chạy lặp (loop):

  • Trích xuất nút N là nút có khoảng cách nhỏ nhất
  • Thêm liên kết tới nút N vào cây đường đi ngắn nhất
  • Sau đó tiến hành tối ưu các đường đi cạnh N bằng cách thử kéo dài cạnh

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

Mã nguồn c++ minh họa thuật toán tìm đường đi ngắn nhất

Thuật toán có thể được implement bởi bất kỳ ngôn ngữ nào: C++, Java, hay Python…

Dưới đây là code minh họa bằng C++

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;


// Data structure to store a graph edge
struct Edge {
int source, dest, weight;
};


// Data structure to store a heap node
struct Node {
    int vertex, weight;
};


// A class to represent a graph object
class Graph
{
public:
    // a vector of vectors of `Edge` to represent an adjacency list
    vector<vector<Edge>> adjList;


    // Graph Constructor
    Graph(vector<Edge> const &edges, int n)
    {
         // resize the vector to hold `n` elements of type vector<Edge>
         adjList.resize(n);


         // add edges to the directed graph
         for (Edge const &edge: edges)
         {
              // insert at the end
              adjList[edge.source].push_back(edge);
         }
     }
};


void printPath(vector<int> const &prev, int i, int source)
{
   if (i < 0) {
       return;
   }
   printPath(prev, prev[i], source);
   if (i != source) {
       cout << ", ";
   }
   cout << i;
}


// Comparison object to be used to order the heap
struct comp
{
   bool operator()(const Node &lhs, const Node &rhs) const {
       return lhs.weight > rhs.weight;
   }
};


// Run Dijkstra’s algorithm on the given graph
void findShortestPaths(Graph const &graph, int source, int n)
{
    // create a min-heap and push source node having distance 0
    priority_queue<Node, vector<Node>, comp> min_heap;
    min_heap.push({source, 0});


    // set initial distance from the source to `v` as infinity
    vector<int> dist(n, INT_MAX);


    // distance from the source to itself is zero
    dist[source] = 0;


    // boolean array to track vertices for which minimum
    // cost is already found
    vector<bool> done(n, false);
    done[source] = true;


    // stores predecessor of a vertex (to a print path)
    vector<int> prev(n, -1);


    // run till min-heap is empty
    while (!min_heap.empty())
    {
        // Remove and return the best vertex
        Node node = min_heap.top();
        min_heap.pop();


        // get the vertex number
        int u = node.vertex;


        // do for each neighbor `v` of `u`
        for (auto i: graph.adjList[u])
        {
            int v = i.dest;
            int weight = i.weight;


            // Relaxation step
            if (!done[v] && (dist[u] + weight) < dist[v])
            {
               dist[v] = dist[u] + weight;
               prev[v] = u;
               min_heap.push({v, dist[v]});
            }
         }


         // mark vertex `u` as done so it will not get picked up again
         done[u] = true;
    }


    for (int i = 0; i < n; i++)
    {
        if (i != source && dist[i] != INT_MAX)
        {
           cout << "Path (" << source << " —> " << i << "): Minimum cost = "
                << dist[i] << ", Route = [";
           printPath(prev, i, source);
           cout << "]" << endl;
        }
    }
}


int main()
{
    // initialize edges as per the above diagram
    // (u, v, w) represent edge from vertex `u` to vertex `v` having weight `w`
    vector<Edge> edges =
    {
        {0, 1, 10}, {0, 4, 3}, {1, 2, 2}, {1, 4, 4}, {2, 3, 9},
        {3, 2, 7}, {4, 1, 1}, {4, 2, 8}, {4, 3, 2}
    };


    // total number of nodes in the graph (labelled from 0 to 4)
    int n = 5;


    // construct graph
    Graph graph(edges, n);


    // run the Dijkstra’s algorithm from every node
    for (int source = 0; source < n; source++) {
        findShortestPaths(graph, source, n);
    }


    return 0;
}

Kết quả khi chạy chương trình:

Path (0 —> 1): Minimum cost = 4, Route = [0, 4, 1]
Path (0 —> 2): Minimum cost = 6, Route = [0, 4, 1, 2]
Path (0 —> 3): Minimum cost = 5, Route = [0, 4, 3]
Path (0 —> 4): Minimum cost = 3, Route = [0, 4]
Path (1 —> 2): Minimum cost = 2, Route = [1, 2]
Path (1 —> 3): Minimum cost = 6, Route = [1, 4, 3]
Path (1 —> 4): Minimum cost = 4, Route = [1, 4]
Path (2 —> 3): Minimum cost = 9, Route = [2, 3]
Path (3 —> 2): Minimum cost = 7, Route = [3, 2]
Path (4 —> 1): Minimum cost = 1, Route = [4, 1]
Path (4 —> 2): Minimum cost = 3, Route = [4, 1, 2]
Path (4 —> 3): Minimum cost = 2, Route = [4, 3]

Độ phức tạp của thuật toán: O(E.log(V))

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

Xem thêm:

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

Functor là gì? Tôi có cần biết đến functor?

Functor là gì và nó mang lại lợi ích gì trong lập trình?

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

Vấn đề

Khái niệm Functor là một bước đệm để từ đó giúp cho bạn khám phá ra những điều mới mẻ trong thế giới lập trình hàm. Vậy thì functor là gì và nó mang lại lợi ích gì trong lập trình?

Functor là gì?

Về bản chất, functor là một cấu trúc dữ liệu mà bạn có thể map qua chúng để áp dụng một hàm vào từng phần tử với mục đích sửa đổi dữ liệu. Nhưng một điều quan trọng là dữ liệu đó được chứa trong một “vùng chứa”, để có thể sửa được giá trị thì các hàm phải lấy ra, sửa đổi rồi đặt giá trị vào “vùng chứa”.

Functor hay còn được kí hiệu là fmap. Đây là định nghĩa chung của fmap:

fmap :: (A -> B) -> Wrapper(A) -> Wrapper(B)

Hàm fmap nhận một hàm (A -> B) biến đổi hàm Wrapper(A) thành Wrapper(B) sau khi đã thực hiện việc biến đổi các giá trị A thành B. Để hiểu rõ hơn bạn có thể xem hình dưới:

Wrapper

Chúng ta thấy giá trị 1 được lấy ra khỏi “vùng chứa” -> áp dụng hàm -> đặt lại vào “vùng chứa”.

Về cơ bản fmap sẽ trả về một bản sao mới của “vùng chứa” tại mỗi lần gọi nên nó có thể coi là bất biến.

Đó là lý thuyết, hãy để tôi lấy một ví dụ cụ thể: Biểu diễn phép tính 2 + 3 = 5 bằng functor.

  10 tip tối ưu code trên JavaScript mà web developer nào cũng nên biết

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

Đầu tiên tôi sẽ xây dựng một class Wrapper nhận vào một giá trị, class này có hai methods: fmap để biến đổi và indentity để lấy ra giá trị:

class Wrapper {
  constructor(value) {
    this.value = value;
  }

  fmap(fn) {
    return new Wrapper(fn(this.value));
  }

  identity() {
    return this.value;
  }

  map(fn) {
    return fn(this.value);
  }
}

fmap nhận vào một hàm, dùng hàm đó để biến đổi value và lại đặt vào Wrapperidentity chỉ đơn giản là trả về value.

Tôi sẽ sử dụng curry function để thực hiện phép cộng. Nếu chưa biết về curry bạn có thể đọc bài viết Curry function là gì? Một món “cà ri” ngon và làm sao để thưởng thức nó?.

const plus = a => b => a + b;
const plus3 = plus(3);

const two = new Wrapper(2);
const sum = two.fmap(plus3); // Wrapper(5)
sum.identity(); // 5

Đến đây thì các bạn có phát hiện ra điều gì thú vị không? Đúng rồi đó, sum vẫn có thể tiếp tục sử dụng được hàm fmap hay nói cách khác là khi kết quả xử lý trả về một đối tượng là Wrapper thì chúng ta sẽ không phải lo lắng về tính liên tục của dữ liệu sau xử lý. Tôi có thể tiếp tục cộng trừ nhân chi một cách liên tiếp:

const multi = a => b => a * b;
const multi5 = multi(5);
sum.fmap(multi5).identity(); // 25

Khi kết quả của hàm fmap trả về là một Wrapper thì nó đảm bảo được rằng kết quả vẫn mang những tính chất của Wrapper.

Xem thêm các việc làm tuyển dụng Javascript hấp dẫn tại TopDev

Thật thú vị phải không? Ý tưởng về chuỗi các hàm có làm bạn liên tưởng đến hàm map hay filter trong Javascript? Thật vậy đó chính xác là những triển khai của functor.

map :: (A -> B) -> Array(A) -> Array(B)
filter :: (A -> Boolean) -> Array(A) -> Array(A)

map và filter được coi là functor bởi chúng có những đặc điểm của functor:

  • Giống nhau
  • Duy trì cấu trúc
  • Loại giá trị

Functor cần phải đảm bảo được một số thuộc tính quan trọng:

Không gây ra side effect: có thể fmap qua một hàm identity để có được cùng một giá trị trong một ngữ cảnh. Điều này chứng minh được rằng chúng không gây ra side effect và vẫn bảo toàn cấu trúc của giá trị được bao bọc. Bạn có thể hiểu identity là một hàm chỉ đơn giản là trả về giá trị mà nó nhận được.

Wrapper('Get Functional').fmap(x => x); // Wrapper('Get Functional')

Thứ hai, chúng phải có thể kết hợp được. Tức là có thể fmap được liên tục. Để đảm bảo được điều này, các cấu trúc điều khiển ví dụ như fmap phải không được ném ra exception, thay đổi các phần tử trong danh sách hoặc thay đổi hành vi của một hàm. Mục đích là tạo ra một ngữ cảnh cho phép bạn thao tác vào các giá trị mà không làm thay đổi giá trị ban đầu. Điều này thể hiện rõ ràng trong việc hàm map biến đổi mảng này thành mảng khác mà không làm thay đổi mảng ban đầu.

Tuy nhiên trong lập trình không phải lúc nào ta cũng có dữ liệu hoàn hảo, mà chúng ta vẫn phải xử lý những exception, những giá trị như null, undefined… Lúc này việc áp dụng các functor sẽ không còn hoàn hảo nữa.

const div = a => b => b/a;
const subtr = a => b => a - b;
const plus = a => b => a + b;

const divided5 = div(5);
const subtr2 = subtr(2);
const plus3 = plus(3);

const two = Wrapper(2);
two.fmap(subtr2).fmap(divided5).fmap(plus3); // Wrapper(NaN)

Tổng kết

Functor là một cấu trúc dữ liệu lưu trữ dữ liệu ở trong một “vùng chứa”, nó cung cấp các phương thức để thao tác với dữ liệu ở trong “vùng chứa” đó. Sử dụng functor chúng ta sẽ đảm bảo được đầu ra của dữ liệu sẽ không bị thay đổi kiểu, nó giống với việc hàm map nhận vào một array và luôn luôn trả ra một array.

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

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

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

Bàn về Dev Việt Nam và Dev level thế giới

Bàn về Dev Việt Nam và Dev level thế giới

Bài viết được sự cho phép của tác giả Thanh Lê

Tại sao nên đọc bài này

  • Để vươn tầm ao làng, trở thành dev quốc tế

Dev Việt Nam

Mình cũng không rõ lý do tại sao mọi người có mong muốn nghe chủ đề này, theo mình thì chắc là mọi người đang làm trong môi trường VN và muốn vươn mình ra thế giới, bán mình cho tư bản.

Okey dù gì thì mình cũng có gần 2 năm bán mình cho tư bản lớn, cũng khoảng 2 năm bán mình cho khách tứ phương (chủ yếu là Mỹ và Châu Âu) nên cũng có ít nhiều góc nhìn về vấn đề này.

Có khá nhiều thứ mà mình học được và thấy sự khác biết trong cách làm việc của ae Việt Nam so với thế giới.

Kỹ năng “cứng”

Phần này thì phải nói là ae VN “Cứng” không kém gì so với cộng đồng quốc tế cả, mọi người có thể dễ dàng thấy Lead là người VN, CTO là người VN, nhân viên Google, Facebook là người Việt Nam. Trải nghiệm đi làm của mình cũng chứng mình điều đó, so với đồng nghiệp người nước ngoài thì về kĩ năng “Cứng” thì mình cũng chả thua gì cả, họ cũng không có gì “cứng” hơn mình về khoản này.

Đặc biệt là mọi người có xuất thân từ những trường dạy kĩ cơ bản như Back Khoa, Tự nhiên hay Công nghệ thông tin.

Vậy vì lý do gì mà anh em vẫn phải làm ở Ao làng VN?

Kỹ năng mềm

Phần này là phần cực kì khác nhau mà mình thấy được, và nói thực, nếu mình làm sếp và gặp những case như này thực sự mình cũng rất khó chịu.

Wait, mà tại sao phải quan tâm tới vấn đề này dưới góc nhìn của người làm sếp? Đọc bài sau nhé :)))

Thôi back về vấn đề chính, mình sẽ list ra những khoảng cách to lớn giữa “ao làng” và “biển lớn”.

Tiếng Anh

Cái này chắc mình không phải viết dài viết dai làm gì rồi. Công nghệ, Biz thay đổi hàng ngày, bạn không biết tiếng Anh nghĩa là mọi thông tin, kiến thức của mọi người bị delay 1-2 năm so với người ta rồi (mình không nói drama nhé, drama có khi ping mình còn tốt hơn ngta).
  1. Đầu tiên là đọc để có thể nắm được kiến thức, công nghệ mới nhất.
  1. Tiếp theo là viết, để code cho ngta hiểu được, để giao tiếp với “biển lớn”.
  1. Nữa là nói chuyện, cơ bản thì viết tốn thời gian lắm, team bạn phải siêu siêu giỏi và hiểu nhau thì mới không cần nói, còn lại thì đây là level giúp bạn ngang tầm với người ta. Có thể không cần nói lưu loát, phát âm chuẩn chỉ, nhưng cần tự tin, deliver được ý muốn truyền đạt, hỏi thì phản hồi được

  Cách để nâng cấp từ Dev Frontend Web2 sang Web3 hiệu quả

  Tản mạn về nghề đi code thuê

Tác phong chuyên nghiệp

Bạn đi đúng giờ bao nhiêu ngày một tuần, bạn tham gia buổi họp trước 5 phút, hay đúng giờ, hay là trễ 15 phút. Không chỉ là công việc, ngay cả cuộc hẹn trong cuộc sống.

Cái này mọi người có thể nói là do văn hóa, do xã hội châu á,… nhưng cái này là một điểm trừ cực kì lớn khi ae đi làm. Bạn trễ giờ nghĩa là bạn thiếu tôn trọng thời gian của người khác, bạn trễ giờ nghĩa là bạn thể hiện thái độ không hợp tác, bạn trễ giờ nghĩa là bạn không xem trọng công việc này.

Mình thấy mọi người có nhiều lý do nghe là “bất khả kháng” quá như là bị kẹt xe, gia đình có công việc xyz,… thường thì những lý do như vậy thì mình hầu hết mình thấy là do plan kém thôi. Một lần do đi trễ thì ok nhưng 3-4 lần trong một tháng đối với mình là do cá nhân.

Đọc thêm về phần Lý do mình viết trong bài này nhé https://thanhle.blog/blog/hanh-trinh-di-tim-ly-do

Thực tế là sẽ luôn có lý do bất khả kháng thật và cách xử lý là ae ping với đồng nghiệp về việc đi trễ này, hẹn lại trong khoảng thời gian khác, và đảm bảo là thời gian hẹn khác đừng có trễ nữa nhé!

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

Thợ lặn

Cái này chắc là thứ nguy hiểm nhất của ae. Thấy có cái gì khó quá hay là deadline tới mông rồi và không làm được thì “lặn” mất tăm. Không tin nhắn, không cuộc gọi nhỡ, sáng ra thì bốc hơi

Mình đã từng như thế rất nhiều lần, cơ bản thì hứa hẹn cố vô, OT các kiểu vẫn không xong, cũng quê khi phải đối diện với thực tại, đâm ra là mình thợ lặn. Nhưng thực tế, việc “lặn” như vậy mang lại hậu quả khủng khiếp lắm. Sếp chả biết tiến độ tới đâu, khách hàng thì dí tới diss rồi nhưng giờ chả có cách nào để trả lời khách cả, muốn gửi một bạn khác vô cứu mà cũng chả biết phải bắt đầu từ đâu.

Công việc của bạn, tệ thì bị trừ lương, chỉ trích, tệ hơn thì bị đuổi việc. Còn công việc của sếp, tệ thì bị đền hợp đồng, mà tệ hơn thì phá sản cả công ty.

Mình thấy “Biển lớn” handle những việc như này rất là chuyên nghiệp, họ thấy trước là năng lực không làm được, điều đầu tiên họ làm là thông báo cho sếp, tiếp theo mọi người sẽ cùng bàn phương án để vượt qua được khó khăn này. Và người “trễ” deadline cũng rất aggressive trong việc cầu cừ đồng nghiệp khác (hosting meeting, transfer,…).

Họ vẫn nói nhiều nhưng làm không nhiều, cũng ảo tưởng sức mạnh của bản thân, cũng thể hiện, nhưng tới cuối output của công việc luôn quan trọng hơn cái tôi của bản thân. Hèn chi tụi nó nó phương Tây thực dụng.

Feedback

Chà cái này cũng là khác biệt lớn nè. Thường mọi người sẽ thấy văn hóa feedback ở VN nó khá lạ, người cần nghe feedback thì không bao giờ được nghe :))) Yup, nó là kiểu nói sau lưng á!

Ở môi trường “biển lớn” thì nó khác, mọi người rất sẵn sàng trong việc give feedback, thường là ngay sau khi mình có một hoạt động gì đó. Và mọi feedback đều ra là đóng góp kiểu “Tao thấy m lên làm như này thì tốt hơn… tao thấy buổi present hôm nay của m tốt đó”,… Đôi khi nó cũng nặng lời hơn, nhưng chả ai để bụng cả.

Nên là khi đi làm mình cũng tránh vào những hội thoại feedback kiểu VN, và cố gắng tập feedback như người nước ngoài. Ngắn gọn, rõ ràng, mang tính xây dựng. Vì feedback để giúp cho ai nếu người nghe không hiểu được?

Data driven

Em thấy là… Em Nghĩ là … rồi back bằng một đống lý lẽ nhưng lại thiếu data.

Thực tế thì cách thuyết phục nhanh nhất, éo có nhưng là phải có data. Em optimize performance website này từ X lên Y (tăng Z%), đây là benchmark trước và sau khi em optimize. Đây là số bug trước và sau khi có em tham gia code,…

“Biển lớn” rất là crititcal thinking trong mọi việc và data driven là một thứ dễ nhất để phản biện và counter-phản biện. Thực tế vẫn có kiểu làm số để confirm cho một luận điểm gì đó, cái này sẽ khá nguy hiểm vì biến bạn thành kẻ mạnh trong việc bảo vệ một thứ sai.

Nên nếu muốn chứng minh hay propose làm việc gì, hãy chuẩn bị đầy đủ data, số liệu cho việc đó nhé!

Vì Goal chung

Mình đồng ý là ai đi làm cũng vì một mục tiêu cá nhân nào đó, dễ thấy nhất là có tiền lương về nuôi vợ con, báo hiếu cha mẹ, ăn chơi bay lack,…

Nhưng cái mục tiêu cá nhân mình hay thấy khá cao từ những ae ở VN, thường thì những tranh cãi cái này là lỗi của FE hay BE, đùn đẩy công việc cho nhau, delay decision đều xuất phát từ lý do sâu xa là tao không cần phải làm thêm việc nữa, tao không bị quê,… Hoặc là kiểu thôi cứ làm tròn vai, có tiền rồi sau này làm mình làm việc khác, mình làm ở chỗ khác,…

Với “biển lớn” thì tâm thế sẽ khác, okey, lỗi đó vậy làm cách nào để resolve nó, chỗ nào resolve là hiệu quả nhất. Sẽ vẫn có những người đi làm vì tiền, nhưng họ cũng tôn trong thành quá công việc lắm.

Một vài suy nghĩ

Những thứ ở trên mình không nghĩ là khó làm được, nhưng khó nhất là có một môi trường ở VN công nhận điều đó, khuyến khích điều đó. Với level ở sếp, hẳn là ai cũng muốn nhân viên của mình có được những điều trên, nhưng phần khó, là hầu hết động nghiệp của bạn là không vậy. Nên là đối với mình, việc làm khác đi so với số đông đã là một thứ gì đó rất dũng cảm rồi, và mình tin dũng cảm để bản thân tốt hơn, thì sẽ có một ngày bạn ngang hàng với những người tốt hơn và tạo được nhiều value hơn.

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

Vì sao lập trình viên BE cần phải biết Figma?

Vì sao lập trình viên BE cần phải biết Figma?

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

Vấn đề

Nếu là một Developer trong ngành phát triển sản phẩm thì chắc hẳn mọi người không còn xa lạ gì với những bản thiết kế tính năng sản phẩm trên công cụ Figma. Thông qua hình ảnh trực quan đó mà chúng ta có thể dễ dàng trao đổi và làm việc với nhau một cách hiệu quả hơn.

Để tạo ra được những bản thiết kế như vậy đòi hỏi người thiết kế phải biết nhiều kiến thức về đồ họa và kĩ năng về UI/UX. Xuất thân là một dân Dev phải nói thật Figma ban đầu khá khó để sử dụng đối với tôi. Nhưng vì phát hiện ra tiềm năng mà Figma mang lại buộc tôi phải tự thân vận động để học cách sử dụng nó.

Vậy thì một dân Dev như tôi thì cần gì đến Figma nhỉ? Bài viết hôm nay tôi xin chia sẻ góc nhìn của tôi về việc tại sao Dev nên biết dùng Figma nhé.

Tại sao cần dùng Figma?

Figma và những lợi ích đối với lập trình viên BE

Trước tiên, nếu bạn chưa biết Figma dùng để làm gì thì nó là một phần mềm biên tập đồ họa vector và dựng prototype. Figma tập trung hỗ trợ công việc thiết kế giao diện người dùng (User Interface) và trải nghiệm người dùng (User Experience), chú trọng khả năng cộng tác theo thời gian thực.

Chính khả năng thiết kế UI/UX là điều tôi cần để tạo ra giao diện tính năng mới cho trang blog của mình. Trước đây tôi từng thử nhiều cách như vẽ ra giấy, sử dụng các trang web tạo wireframe online… nhưng các phương pháp đó chỉ giải quyết được một phần nhu cầu của tôi, hơn nữa chúng cũng bộc lộ ra những khuyết điểm. Ví dụ như vẽ ra giấy thì nhanh nhưng khi chỉnh sửa lại khó, không đầy đủ và chi tiết như đồ họa máy tính được. Còn wireframe chỉ giúp tôi tạo ra bố cục còn về mặt đồ họa chi tiết thì không làm được.

Figma là công cụ giúp tôi khắc phục được những hạn chế trên. Tôi có thể dựng wireframe và thoải mái chỉnh sửa một cách nhanh chóng. Thậm chí tôi còn có thể tạo ra một bản thiết kế một màn hình hoàn chỉnh cho trang blog của mình. Sau khi đã ưng ý tôi gửi chúng cho một vài người nhờ họ nhận xét. Mọi thứ ổn thỏa thì tôi triển khai thiết kế thành mã HTML.

Figma và những lợi ích đối với lập trình viên BE

Hiện tại kĩ năng sử dụng figma của tôi chỉ ở mức cơ bản. Kiến thức tôi học được chủ yếu là đọc tài liệu trên trang của Figma và xem video hướng dẫn của họ trên Youtube.

Figma và những lợi ích đối với lập trình viên BE

  Bí kíp tự học thiết kế web hiệu quả dành cho người mới

  Top câu hỏi phỏng vấn Graphic Designer chinh phục nhà tuyển dụng

Tại sao nên biết cách dùng?

Có một số lợi ích mà tôi nhận được khi biết sử dụng công cụ Figma.

Tiếp xúc với Figma bạn cũng gián tiếp tiếp xúc với hàng ngàn mẫu thiết kế có sẵn trên nền tảng này. Đó là những mẫu thiết kế được mọi người dùng nền tảng này chia sẻ. Có những mẫu thiết kế chi tiết đến mức hoàn chỉnh, cũng có những mẫu thiết kế ở mức component để chúng ta tái sử dụng. Điều này giúp tiết kiệm thời gian & công sức khi tìm nguồn cảm hứng thiết kế mới, hơn nữa nếu không thành tạo thiết kế thì có thể sử dụng luôn các mẫu component sẵn có.

Hiện thực hóa suy nghĩ thành hình ảnh để nhanh chóng thấy được kết quả thông qua các bản thiết kế, đánh giá & sửa chữa chúng cho đến khi cảm thấy mọi thứ ổn thỏa. Thay vì ngồi tưởng tượng ra trong đầu thì giờ đây biến nó lên Figma. Bạn cũng có thể nhanh chóng nhìn thấy được kết quả của mình để từ đó tạo động lực phát triển hơn nữa.

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

Thông qua Figma, chúng ta dễ dàng chia sẻ thiết kế của mình với người khác cho họ xem hoặc nhờ họ đánh giá hay góp ý. Những bản thiết kế trông có vẻ “hoàn mỹ” trong mắt người sáng tạo nhưng đôi khi những người ngoài cuộc sẽ nhanh chóng phát hiện ra “tiểu tiết” mà chúng ta không ngờ tới. Hay đơn giản là đang bị quá tập trung vào một chi tiết khác mà không để ý đến. Nhờ đó giúp bạn nhanh chóng nhận ra và sửa đổi cho thiết kế hoàn thiện hơn.

Ngoài việc tạo ra những bản thiết kết web/mobile… Figma còn làm được những công việc khác như thiết kế logo, icon… Nếu học được cách thiết kế bạn có thể tự do sáng tạo ra những sản phẩm mang đậm phong cách bạn thích mà không phụ thuộc vào bất kì ai.

Dĩ nhiên sử dụng Figma đòi hỏi phải có kiến thức về UI/UX, còn nếu không biết thì Figma buộc bạn phải rèn luyện kĩ năng UI/UX, thẩm mỹ bằng cách liên tục thực hành và khám phá. Liên tục cập nhật những xu hướng thiết kế mới theo kịp với thời đại, kéo theo đó là nâng cao trải nghiệm người dùng trên các sản phẩm mà bạn tham gia phát triển.

Tổng kết

Bài viết trên đây tôi đã trình bày ra lý do vì sao một Developer như tôi lại chọn cách học cách dùng Figma. Đối với bạn hoặc người khác thì Figma có thể mang lại nhiều lợi ích hơn nữa. Hy vọng sau bài viết này những Developer đang trên đường chinh phục Figma hay những người thiết kế chuyên nghiệp có thể chia sẻ cho tôi cùng mọi người về kinh nghiệm học & sử dụng Figma của mình hơn nữa!

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

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

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

Ubuntu là gì? Lập trình viên nên sử dụng Ubuntu hay Windows?

Ubuntu là gì? Lập trình viên nên sử dụng Ubuntu hay Windows?

Khi nhắc đến hệ điều hành nhiều người thường nghĩ ngay đến Windows hay macOS. Tuy nhiên, có một hệ điều hành khác sở hữu lượng người dùng trung thành bởi những đặc trưng thú vị của nó, đó chính là hệ điều hành Ubuntu. Vậy Ubuntu là gì? Ubuntu khác gì với Windows? Cùng TopDev tìm hiểu qua bài viết dưới đây nhé!

Ubuntu là gì?

Ubuntu là một hệ điều hành máy tính mã nguồn mở dựa trên nền tảng Linux. Được phát triển và duy trì bởi Canonical Ltd. và cộng đồng người dùng toàn cầu, Ubuntu được thiết kế để cung cấp một trải nghiệm máy tính dễ sử dụng, ổn định và an toàn cho mọi người, từ người dùng cá nhân đến doanh nghiệp và tổ chức.

Ubuntu là gì?

Ubuntu đi kèm với các tính năng như giao diện người dùng đồ họa (GUI) thân thiện, hỗ trợ cho nhiều loại phần cứng và phần mềm, cũng như khả năng tùy chỉnh linh hoạt để phù hợp với nhu cầu cụ thể của người dùng. Đặc biệt, Ubuntu được cung cấp hoàn toàn miễn phí và đồng thời được hỗ trợ bởi một cộng đồng lớn các nhà phát triển và người dùng trên toàn thế giới.

Các phiên bản khác của Ubuntu:

  • Ubuntu LTS (Long Term Support) là phiên bản Ubuntu được hỗ trợ dài hạn. Cụ thể, các phiên bản LTS của Ubuntu nhận được bảo trì và cập nhật bảo mật trong khoảng thời gian kéo dài hàng năm (ví dụ: 5 năm cho phiên bản LTS phổ biến nhất). Điều này làm cho Ubuntu LTS trở thành lựa chọn ổn định và lâu dài cho các doanh nghiệp và người dùng muốn tránh việc nâng cấp thường xuyên.
  • Ubuntu Server là một phiên bản Ubuntu được tối ưu hóa để sử dụng làm hệ điều hành cho các máy chủ. Nó cung cấp các tính năng và công cụ cần thiết để triển khai, quản lý và vận hành các dịch vụ và ứng dụng máy chủ, bao gồm các dịch vụ như web server, email server, database server và nhiều hơn nữa.
  • Ubuntu MATE là một biến thể của Ubuntu được thiết kế với một giao diện người dùng truyền thống và dễ sử dụng. Giao diện của Ubuntu MATE nhắm đến sự đơn giản và sự dễ dàng sử dụng cho người dùng, đồng thời vẫn cung cấp đầy đủ các tính năng và công cụ của hệ điều hành Ubuntu.
  • Ubuntu Kylin là một phiên bản Ubuntu được tối ưu hóa cho người dùng ở Trung Quốc. Nó được phát triển bởi một tổ chức Trung Quốc với mục tiêu làm cho Ubuntu trở nên thân thiện và dễ sử dụng hơn đối với người dùng Trung Quốc thông qua việc cung cấp các tính năng và ứng dụng phù hợp với nhu cầu và thói quen của địa phương.

  Hướng dẫn cài đặt, lập trình Python trên Ubuntu (Linux)

  Sự khác biệt giữa Windows và Linux – Cuộc chiến khốc liệt

Những điểm nổi bật của hệ điều hành Ubuntu là gì?

điểm nổi bật của hệ điều hành Ubuntu

Hệ điều hành Ubuntu có nhiều điểm nổi bật mà người dùng thường đánh giá cao:

  • Miễn phí và mã nguồn mở: Ubuntu là hệ điều hành hoàn toàn miễn phí. Bạn có thể tải xuống, cài đặt và sử dụng mà không phải trả bất kỳ khoản phí nào.
  • Dễ sử dụng: Giao diện đồ họa trực quan, các ứng dụng được cài đặt sẵn và cộng đồng hỗ trợ nhiệt tình giúp cho việc sử dụng Ubuntu trở nên dễ dàng hơn bao giờ hết.
  • Ổn định và bảo mật: Ubuntu được coi là một trong những phiên bản Linux ổn định nhất, với việc cập nhật bảo mật thường xuyên để bảo vệ người dùng khỏi các lỗ hổng tiềm ẩn.
  • Tính tùy chỉnh: Ubuntu có thể tùy chỉnh cao. Người dùng có thể thay đổi giao diện, cài đặt thêm phần mềm và cấu hình hệ điều hành theo nhu cầu của mình.
  • Kho phần mềm phong phú: Bạn có thể tìm thấy hầu hết các ứng dụng phổ biến cho Ubuntu, bao gồm trình duyệt web, trình soạn thảo văn bản, bảng tính, trình phát đa phương tiện và nhiều loại ứng dụng khác.
  • Đa dạng phiên bản: Ubuntu cung cấp nhiều biến thể như Ubuntu Desktop, Ubuntu Server, Ubuntu MATE, Ubuntu Kylin, v.v., phù hợp với nhu cầu sử dụng khác nhau của người dùng.
  • Cộng đồng lớn mạnh: Ubuntu có một cộng đồng người dùng và nhà phát triển rộng lớn trên toàn thế giới, với sự hỗ trợ, chia sẻ kiến thức và giải đáp thắc mắc qua các diễn đàn, blog và trang web.

So sánh Ubuntu với Windows

So sánh Ubuntu với Windows

Dưới đây là một bảng so sánh giữa Ubuntu và Windows dựa trên một số tiêu chí phổ biến:

Tiêu chí Ubuntu Windows
Yêu cầu cấu hình Cấu hình máy không cần quá mạnh vẫn có thể chạy được. Yêu cấu hình máy khá cao.
Ổn định và bảo mật Ổn định và an toàn, với cập nhật bảo mật thường xuyên từ cộng đồng nguồn mở. Thích hợp cho máy chủ và môi trường phát triển. Ổn định và bảo mật, với cập nhật thường xuyên từ Microsoft. Thích hợp cho người dùng cá nhân và doanh nghiệp.
Tính linh hoạt và tùy chỉnh Có tính linh hoạt và tùy chỉnh cao, cho phép người dùng điều chỉnh hệ thống theo ý muốn. Tính linh hoạt và tùy chỉnh hạn chế hơn so với Ubuntu.
Phần mềm ứng dụng Kho ứng dụng phong phú từ nguồn mở, bao gồm các công cụ văn phòng, đồ họa và phát triển phần mềm. Có sẵn nhiều ứng dụng thương mại và miễn phí, nhưng không bằng phong phú như Ubuntu đối với các ứng dụng mã nguồn mở.
Hỗ trợ phần cứng Hỗ trợ tốt cho nhiều loại phần cứng, nhưng có thể gặp vấn đề với một số phần cứng cụ thể. Hỗ trợ tốt cho nhiều loại phần cứng, đặc biệt là trên các máy tính xách tay và máy tính cá nhân.
Giá cả Miễn phí, không cần mua bản quyền. Phải mua bản quyền hoặc sử dụng phiên bản miễn phí với các hạn chế.

Lập trình viên nên chọn Ubuntu hay Windows?

Quyết định giữa việc sử dụng Ubuntu hay Windows cho lập trình viên thường phụ thuộc vào nhiều yếu tố, bao gồm mục tiêu cụ thể, ưu tiên cá nhân và loại công việc mà lập trình viên đang làm hoặc định hướng sẽ làm trong tương lai. Dưới đây là một số yếu tố cần xem xét:

  • Ngôn ngữ lập trình và môi trường phát triển (IDE): Một số ngôn ngữ lập trình và IDE được phát triển chủ yếu cho một hệ điều hành cụ thể. Ví dụ, nếu bạn làm việc với công nghệ Microsoft như .NET, C#, hoặc muốn sử dụng Visual Studio, thì việc sử dụng Windows sẽ là lựa chọn phù hợp hơn. Trong khi đó, các lập trình viên web thường ưa chuộng Ubuntu với các công cụ như VS Code hoặc Sublime Text.
  • Tính linh hoạt và tùy chỉnh: Ubuntu thường cung cấp tính linh hoạt và tùy chỉnh cao hơn so với Windows. Nếu bạn muốn kiểm soát tối đa hệ thống của mình hoặc làm việc với mã nguồn mở, Ubuntu có thể là lựa chọn tốt.
  • Hiệu suất và bảo mật: Ubuntu thường được coi là ổn định và an toàn hơn so với Windows, đặc biệt là trong môi trường máy chủ. Nếu bạn làm việc với các dự án đòi hỏi tính ổn định cao hoặc đặc biệt quan trọng đối với bảo mật, Ubuntu có thể là lựa chọn tốt.
  • Tương thích phần cứng: Windows thường được hỗ trợ tốt hơn trên nhiều loại phần cứng, đặc biệt là trên các máy tính xách tay và máy tính cá nhân tiêu chuẩn. Tuy nhiên, Ubuntu cũng đã có sự tiến bộ đáng kể trong việc hỗ trợ phần cứng và hiện đã tương thích với nhiều thiết bị hơn.

Trên đây là tất cả những thông tin về hệ điều hành Ubuntu. Với những ưu điểm như mã nguồn mở, đa phiên bản, ổn định và tính bảo mật cao nên Ubuntu đã trở thành một hệ điều hành phổ biến trong cộng đồng người dùng Linux. Hy vọng bạn đã hiểu hơn về Ubuntu là gì cũng như những ưu điểm của nó khi so sánh với Windows. Theo dõi TopDev để cập nhật thêm các thông tin mới về công nghệ nhé!

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

Xem thêm các việc làm Developer hấp dẫn tại TopDev

Cách ứng dụng CLI để cải thiện hiệu suất công việc

Cách ứng dụng CLI để cải thiện hiệu suất công việc

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

Vấn đề

Là một lập trình viên, tôi tin chắc rằng ai cũng đã nghĩ đến việc tận dụng những dòng code để “sai khiến” nó làm một việc gì đó tự động. Lấy ví dụ như là một đoạn mã JavaScript được một lập trình viên nào đó viết ra, để tính tổng số tiền mà bạn đã “nướng” vào một sàn thương mại điện tử nào đó, thay vì phải ngồi cộng từng đơn hàng trong danh sách kéo mãi không biết bao giờ mới hết.

Việc tự động hóa mang lại nhiều lợi ích, dễ thấy nhất đó là tiết kiệm thời gian và giảm sai sót cho một tiến trình lặp đi lặp lại. Mặt khác, nếu thấy đoạn mã mà mình viết ra có thể chia sẻ được cho người khác thì đúng là một công đôi việc.

Tôi cũng hay tạo ra những dòng mã như vậy, nhưng thay vì đếm giá trị đơn hàng thì chúng lại tập trung giải quyết một vấn đề hay gặp phải trong công việc hơn. Lấy ví dụ như là một đoạn mã giúp đồng bộ hóa dữ liệu giữa hai máy chủ production với development của trang blog này. Bởi vì đôi khi cần thử nghiệm tính năng mới trên dữ liệu thật cho an toàn trước khi đưa nó vào môi trường “sản xuất”.

Tôi thường lưu trữ các mã này vào một nơi nào đó, ví dụ như trong ứng dụng ghi chú của hệ điều hành, để nó được đồng bộ đến tất cả nơi tôi làm việc, và sau này có gặp một vấn đề gì đó thì sẽ mở ra, “copy” lại và “paste” vào cho nó chạy. Thật sáng suốt!

Đấy chỉ là một ví dụ đơn giản cho cách tự động hóa công việc lặp đi lặp lại. Vài tuần trước, khi tôi đang tập trung tối ưu hóa hình ảnh cho blog thì vấn đề trở nên rắc rối hơn. Nếu cứ “copy” rồi “paste”, chỉnh sửa lại nội dung cho nó chạy, thì lại tốn nhiều thời gian hơn. Tôi chợt phát hiện những đoạn mã như thế lại chỉ phù hợp với những công việc có tần suất sử dụng thấp, dụ như 1 ngày chỉ sử dụng 1 lần thôi, hmm.. kiểu như thế.

Nói đến đây thì có lẽ bạn đọc cũng đang hình dung ra cách giải quyết vấn đề cho mình. Tôi biết là có nhiều cách để làm, riêng tôi thì chọn cách tạo ra một ứng dụng CLI làm tất cả công việc trên.

CLI là gì?

Giao diện dòng lệnh (CLI) là một cơ chế phần mềm bạn sử dụng để tương tác với hệ điều hành của mình thông qua bàn phím. Một cơ chế trái ngược với CLI là giao diện người dùng đồ họa (GUI).

Điểm mạnh của GUI là điều hướng một cách trực quan, như bấm vào các biểu tượng và hình ảnh để sử dụng phần mềm, ứng dụng đó. Tuy nhiên, GUI không hiệu quả đối với các tác vụ quản trị hệ thống, đặc biệt là với môi trường ảo hoặc từ xa.

Với CLI, bạn có thể nhập các lệnh văn bản để định cấu hình, điều hướng hoặc chạy các chương trình trên bất kỳ máy chủ hoặc hệ thống máy tính nào. Tóm lại là CLI tập trung vào tính năng và tốc độ sử dụng.

CLI khá là rộng lớn khi nhắc đến, nhưng trong phạm vi bài viết này, thì tôi chỉ muốn nói đến khả năng ứng dụng CLI trong các ứng dụng phần mềm. Hiểu đơn giản CLI là các ứng dụng bằng dòng lệnh mà chúng ta gõ gõ hàng ngày trong Terminal, khi đó cdlspwd… cũng có thể coi là các ứng dụng phần mềm để giúp chúng ta thực hiện một chức năng nào đó.

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

  Làm việc với Apache Kafka Topic sử dụng CLI

Khi nào cần tạo cho mình một CLI?

Quay trở lại với bài toán tối ưu hóa hình ảnh mà tôi có một bài viết Tối ưu hóa hiển thị hình ảnh bằng blur placeholder và lazyload. Có nhiều bước cần làm để tạo ra một hình ảnh sử dụng được trong bài viết của blog. Nhưng tựu chung lại thì có hai hành động chính:

Thứ nhất là định dạng lại hình ảnh về dạng webp, điều chỉnh chất lượng hình ảnh và cắt hình để cho ra kích thước mong muốn.

Thứ hai là tải tất cả hình ảnh vừa tạo ra lên R2, đồng thời lấy được tất cả liên kết đến chúng.

Nếu áp dụng phương pháp “copy paste” như ở đầu bài thì có phần rườm rà. Như vậy, để quản lý tập trung và tiết kiệm thời gian gõ phím, thì tạo ra một ứng dụng CLI trong trường hợp này là hết sức hợp lý.

Tưởng tượng, ứng dụng của tôi có tên là img, khi muốn tạo ra tất cả hình ảnh đã được tối ưu hóa, chỉ cần chạy:

$ img all path/to/file

Với path/to/file là đường dẫn đến ảnh gốc. Sau khi chạy xong, hình ảnh mới được tạo ra sẽ lưu vào path/to/new/file. Lúc này, tôi tạo thêm một lệnh upload nữa cho hành động tải ảnh lên R2:

$ img upload path/to/new/file

Hoàn hảo, mọi thứ hoạt động. Nhưng chưa hết, một điểm cộng của CLI đó là nó hỗ trợ tham số (args) và các cờ (flag), dựa vào flag, chúng ta còn có thể tạo ra nhiều trường hợp (options) xử lý phong phú hơn nữa.

Ví dụ, tôi muốn ngay sau khi tất cả hình ảnh được tạo ra thì tải lên R2 luôn thay vì tốn thêm một lệnh upload nữa thì viết thêm mã xử lý cho cờ --upload hoặc viết tắt là -u:

$ img all path/to/file --upload
# hoặc
$ img all path/to/file -u

Dĩ nhiên trên đây chỉ là giả thuyết, ứng dụng CLI có thể làm được nhiều hơn tùy vào cách của mỗi người. Vì thế bạn có thể thoải mái biến tấu các lệnh và các cờ theo sở thích của mình, nhưng với một lưu ý là nó phải rõ ràng và dễ nhớ, dễ sử dụng.

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

Cách tạo một CLI đơn giản

Ứng dụng CLI không giới hạn ở bất kỳ ngôn ngữ nào, nếu bạn đang làm Golang, hãy tìm kiếm thư viện hỗ trợ tạo CLI cho Go. Tương tự, tôi làm Node.js thì oclif giúp tôi làm điều này. Ngoài oclif ra thì còn nhiều thư viện giúp bạn tạo ra được ứng dụng CLI, hãy dành thời gian tham khảo chúng, nếu thấy cú pháp thân thiện, dễ sử dụng thì hãy chọn. Tham khảo thêm nhiều thư viện khác tại Command-line utilities | awesome-nodejs Public | Github.

oclif tương đối đơn giản để bắt đầu. Chỉ cần làm theo hướng dẫn Introduction | oclif docs là ngay lập tức chúng ta đã có một “lệnh” của riêng mình.

$ npx oclif generate mynewcli
? npm package name (mynewcli): mynewcli
$ cd mynewcli
$ ./bin/dev.js hello world
hello world! (./src/commands/hello/world.ts)

oclif hỗ trợ tạo tự động một lệnh mới (CLI Generator), Flag/Argument parsing, Testing, Autocomplete và nhiều tính năng khác. Bạn đọc tham khảo thêm tại Features | oclif docs.

Tổng kết

CLI là một cơ chế phần mềm bạn sử dụng để tương tác với hệ điều hành, phạm vi của CLI tương đối rộng nhưng trong phạm vi bài viết này, chúng ta tìm hiểu việc ứng dụng CLI để tạo ra một phần mềm cho riêng mình.

Nếu như trước đây, cách tôi thường làm là lưu lại các đoạn mã thường dùng để khi cần chỉ việc “copy paste” để chạy chúng thì việc tạo ra CLI sẽ đơn giản hóa quá trình này, đồng thời giúp tiết kiệm thời gian sử dụng.

oclif là một thư viện giúp tạo CLI đơn giản bằng Node.js. Ngoài ra nếu bạn đang sử dụng một ngôn ngữ nào khác thì hãy tìm kiếm một thư viện phù hợp cho mình nhé!

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

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

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

Thuật toán Brute Force và bài toán Trapping Rain Water

Thuật toán Brute Force và bài toán Trapping Rain Water

Thuật toán Brute Force hay còn được gọi là thuật toán vét cạn là một trong những giải thuật cơ bản trong lập trình mà mọi người thường xuyên sử dụng. Bài viết hôm nay chúng ta cùng nhau tìm hiểu về thuật toán này và áp dụng nó để giải quyết bài toán Trapping Rain Water nhé.

Thuật toán Brute Force

Thuật toán vét cạn (Brute Force) đúng như cái tên của nó sẽ thực hiện việc xét qua tất cả các trường hợp có thể xảy ra để tìm kiếm kết quả. Thuật toán này cho chúng ta một cách tiếp cận đơn giản, dễ hiểu, dễ nhận thấy nhất mặc dù nó không phải là cách tốt nhất.

Thuật toán Brute Force

Linear Search (tìm kiếm tuyến tính) là một bài toán tiêu biểu của thuật toán vét cạn, với việc duyệt qua lần lượt các phần tử trong mảng cho đến khi tìm ra được giá trị cần tìm. Rõ ràng với việc duyệt qua tất cả các trường hợp có thể xảy ra thì Brute Force không được đánh giá cao về hiệu năng và không phù hợp để giải quyết các bài toán có quy mô lớn. Điều kiện tiên quyết để áp dụng Brute Force là cần xem xét đến case xấu nhất có thể là gì và thời gian cho đủ cho phép để thực hiện case đó không.

Mặc dù vậy đây vẫn là một thuật toán kinh điển cơ bản và rất hữu ích khi bạn chưa nghĩ ra được phương án nào tối ưu. Ngoài ra việc triển khai thuật toán cũng đơn giản giúp ít mắc lỗi hơn trong quá trình lập trình.

  Tìm hiểu về thuật toán đảo ngược chuỗi liên kết (Linked List)

  Thuật toán tham lam (Greedy Algorithm) – Thực hành với C++

Bài toán Trapping Rain Water

Bài toán: Cho một dãy số nguyên không âm height với giá trị phần tử trong mảng là chiều cao của các khối trụ tường giữ nước với độ rộng đều bằng 1. Hãy tính tổng diện tích các trũng nước sau khi mưa

Bài toán Trapping Rain Water

  • Input: height = [0, 1, 0, 2, 1, 0, 3, 1, 0, 1, 2]
  • Output: 8

Như thể hiện trên hình vẽ, với các khối trụ tường (phần màu đen) được tạo ra theo giá trị mảng đầu vào thì sẽ chỉ có 3 vùng nước được giữ lại tương ứng với tổng khối nước là 1 + 3 + 4 = 8 (phần màu xanh tương ứng). 

Phân tích bài toán

Tại mỗi vị trí phần tử trong mảng, lượng nước có thể giữ được sẽ phụ thuộc vào chiều cao khối trụ tường của 2 bên trái phải của điểm đó. Ví dụ với phần tử thứ 6 trong hình trên (giá trị phần tử = 0); bức tường cao nhất ở phía bên trái của điểm đó có độ cao = 2 (phần tử thứ 4); và bức tường cao nhất ở phía bên phải của điểm đó có độ cao = 3 (phần tử thứ 7). Lượng nước giữ lại được tại node này sẽ chính là giá trị nhỏ hơn trong 2 giá trị trên trừ đi chiều cao của chính phần tử đó.

Với phân tích trên thì lời giải cho bài toán chính là việc duyệt qua từng vị trí của phần tử trong mảng, tại mỗi vị trí sẽ tính ra lượng nước giữ lại được; cuối cùng là tính tổng của tất cả giá trị trên sẽ cho ra lời giải của bài toán. Đây cũng chính là cách giải theo phương pháp vét cạn, tính toán hết các khả năng có thể xảy ra.

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

Triển khai thuật toán

  1. Khởi tạo giá trị trả về ans = 0
  2. Chạy vòng lặp mảng đầu vào từ trái sang phải và thực hiện:
    1. Khởi tạo giá trị max_left = 0max_right = 0
    2. Chạy vòng lặp từ phần tử hiện tại đến phần tử bắt đầu mảng và xác định max_left = max(max_left, height[j])
    3. Chạy vòng lặp từ phần tử hiện tại đến phần tử cuối của mảng và xác định max_right = max(max_right, height[j])
    4. Cộng thêm giá trị min(max_left, max_right) – height[i] vào ans

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

Đối với mỗi phần tử của mảng, chúng ta cần thực hiện vòng lặp phần bên trái và phần bên phải, tương đương với việc duyệt qua mảng thêm 1 lần. Vì vậy độ phức tạp của thuật toán về mặt thời gian sẽ là O(n^2). Về bộ nhớ sử dụng thì độ phức tạp của thuật toán này chỉ là O(1).

Triển khai thuật toán bằng ngôn ngữ JavaScript

export default function trappingRainWater(height) {
  let ans = 0;

  for (let index = 0; index < height.length; index += 1) {
    let max_left = 0;
    for (let leftIndex = index - 1; leftIndex >= 0; leftIndex -= 1) {
      max_left = Math.max(max_left, height[leftIndex]);
    }

    let max_right = 0;
    for (
      let rightIndex = index + 1;
      rightIndex < height.length;
      rightIndex += 1
    ) {
      max_right = Math.max(max_right, height[rightIndex]);
    }

    const max_height = Math.min(max_left, max_right);
    if (max_height > height[index]) {
      ans += max_height - height[index];
    }
  }

  return ans;
}

Kết bài

Giải thuật vét cạn thường không phải là giải thuật tối ưu nhất là trong các bài toán cần xử lý với giá trị đầu vào có kích thước lớn. Mặc dù vậy nó sẽ tỏ ra tối ưu khi giá trị đầu vào có kích thước nhỏ, không cần quá chú trọng vào thời gian xử lý; ngoài ra đây là một thuật toán dễ triển khai, giảm bớt lỗi có thể xảy ra. Ngoài bài toán Trapping Rain Water ở trên thì Brute Force có thể áp dụng và triển khai được trong rất nhiều bài toán khác nhau và được xem như một cách tiếp cận cơ bản nhất trong lập trình. Hy vọng bài viết hữu ích dành cho bạn và 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 ngay việc làm IT mọi cấp độ trên TopDev!

Cách để nâng cấp từ Dev Frontend Web2 sang Web3 hiệu quả

nâng cấp từ Dev Frontend Web2 lên Web3

Bài viết được sự cho phép của tác giả Thanh Lê

Tại sao nên đọc bài này?

  • Nâng cấp level của bản thân một cách ngắn gọn, hiệu quả
  • Người ta làm Web3 được chả lẽ mình làm không được?

Trở thành Web3 Frontend developer

Giờ tôi đang là Web2 developer, làm react, redux, nextjs mỗi ngày kiếm cơm, làm sao tôi trở thành Web3 developer được?

Đây là check-list

  • Blockchain là gì?
  • Cách mà wallet và block chain tương tác với frontend?
  • Code thử, tương tác với blockchain (Đơn giản như call API)
  • Kiếm việc trong Web3

Blockchain là gì?

Đâu tiên thì nên hiểu khái niệm xem tụi Blockchain hay Web3 là gì nhỉ?

Tham khảo bài viết: “Công nghệ Blockchain là gì? Tiềm năng & ứng dụng thực tế” và “Tiềm năng ứng dụng thực tế của blockchain & Web3” để hiểu hơn về công nghệ này.

Tương tác với Block-chain và Wallet

Về cơ bản khi code frontend, mọi chuyện không có gì thay đổi nhiều so với web2 cả. Thay vì call API để hiển thị data thì bạn call một bên khác để trả về data (Cụ thể là JSON RPC), nên cơ bản nó cũng chả khác gì call API lắm.

Tương tác với Block-chain và Wallet

Về cơ bản, web3 sẽ chia ra 2 loại request riêng biệt:

  • Mutable API – Những API sẽ làm thay đổi trạng thái của hệ thống. Vd như chuyển tiền, swap token, lending,…
  • Read-only API – Những API thể hiện trạng thái của hệ thống. Ai cũng có thể call và lấy data được. VD như đang có bao nhiêu tiền trong ví, đang lending ở đâu, swap với rate bao nhiêu

Đã có 2 loại request rồi, bây giờ mình sẽ gọi vào đâu?

  • Thường chúng ta sẽ phải gọi qua một server trung gian – blockchain node, con server kết nối vào Block Chain để:
  • Nhận Read-only API, lấy data từ blockchain, trả về cho user
  • Nhận Mutable API, broadcast lên blockchain cho tụi validator
  • Các Node Provider thường thấy
  • Node provider mặc định của network đó (thường bị rate limit và khá chậm nên ít người dùng)
  • Infura
  • QuickNode
  • Alchemy, Moralis

  Thông não về các khái niệm Web1, Web2, Web3

  Web3 techstack - Hành trang cho anh em developer

Vậy tụi Wallet làm gì ở đây?

Có nhớ hồi nãy mình có nhắc tới về Mutable API không? Wallet giúp ta chứng minh được ai là đứa thực hiện Request đó, và cũng đồng thời nhắc nhở bạn là người chịu trách nhiệm cho cái request vừa rồi.

Đương nhiên là bạn không thể call Mutable API với nội dung: Thằng A gửi cho tui 10BTC được đúng không? Wallet giúp xác định chắc chắn, nếu thằng A gửi tiền thì chỉ có mình thằng A có thể gửi, mà không phải là một thằng hacker nào khác.

Đó vậy khác biệt giữa Web2 và Web3 cho Frontend dev chỉ có nhiêu đây:

  • Thay vì tương tác với API thì tương tác với JSON RPC node
  • Thay vì gắn login, gắn auth token vào API thì bạn tương tác với Wallet để làm việc trên

Một số thư viện cho Frontend

Nói chung mình Highly recommend dùng Wagmi và ethers.js vì tụi này tiện và ok hơn mấy thằng còn lại. Mấy thằng khác nên học tùy tình huống kiểu như trong prj đang dùng sẵn thằng này cmnr.

Xem ngay các tin đăng tuyển dụng Front-end lương cao trên TopDev

Học thêm về web3

Đó frontend thì chỉ có vậy, nhưng mình nghĩ các bạn vẫn nên tìm hiểu thêm về phía backend, và một số thứ liên quan khác như:

  • Dùng explorer để inspect data
  • Hiểu sơ về code backend (Solidity, rust) để có thể biết được đâu rà Read function, đâu là Mutate function
  • Bảo mật

Một số khóa học về web3 phù hợp với frontend

Learn to Code Blockchain DApps by Building Simple Games

Khóa near học xong còn có tiền nữa, mình cũng quen một vài người build prj trong khóa học đó, sau đó được NEAR tại trợ để làm tiếp (khoảng hơn 5000$)

Một số khóa học về web3 phù hợp với frontend

Học xong nhớ thực hành nha, nghĩ ra problem gì phù hợp mà blockchain cần giải quyết rồi làm thử, như mình làm Morphling nè!

Morphling – dApp Tham gia Binance Launchpad

Nhân tiện, mình cũng rất muốn connect với các bạn đang làm trong Web3, mình cũng đang build product về Web3
Tham khảo các vị trí tuyển dụng Web developer cho bạn

Tìm việc web3

Thì có 2 cách, hoặc bạn xin vào làm trong một công ty về Web3, hoặc là bạn làm công việc freelance đến Web3

Công việc fulltime thì chỗ kiếm chắc khá nhiều, search Google đầy. Còn công việc freelance thì đây là một vài chỗ để tham khảo

Issue Explorer

Dework – The task manager for DAOs and deventralized work

Lời kết

So với backend, thì frontend tương tác với Blockchain khá đơn giản và dễ học. Tuy nhiên mình thấy benefit cho các bạn làm ở Web3 đang cao hơn hẳn nên cũng đáng để các bạn thử.

Mà dù Web2, Web3 hay Web4 thì hãy luôn nhớ trau dồi những thứ cơ bản nhất, đảm bảo không bị lỗi thời đâu.

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

Xem thêm:

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

Ưu và nhược điểm của các loại Database phổ biến hiện nay

Ưu và nhược điểm của các loại Database

Databasecơ sở dữ liệu là một tập hợp có tổ chức các thông tin có cấu trúc hoặc dữ liệu, thường được lưu trữ trong một hệ thống máy tính và được kiểm soát bởi hệ thống quản lý cơ sở dữ liệu (DBMS). Mỗi database sẽ được tạo ra theo những cách khác nhau, mỗi loại đều có những đặc điểm riêng và thích hợp với từng nhu cầu nghiệp vụ cụ thể. Vì thế việc lựa chọn loại cơ sở dữ liệu phù hợp với dự án ngay từ ban đầu là điều vô cùng quan trọng.

Để các bạn có thể đưa ra được lựa chọn đúng đắn cho quá trình phát triển sản phẩm sắp tới của mình, bài viết hôm nay chúng ta cùng nhau tìm hiểu ưu và nhược điểm của các loại Database phổ biến hiện nay nhé.

Khái niệm database

Trước tiên chúng ta cùng thống nhất với nhau về khái niệm database – cơ sở dữ liệu được nhắc đến trong bài viết này. 

Khái niệm database

Một database sẽ được kiểm soát bởi một hệ quản trị cơ sở dữ liệu (DBMS – Database Management System) và liên kết với các ứng dụng thông qua các lời gọi truy vấn. Một cấu trúc như trên được gọi là một hệ thống cơ sở dữ liệu. Việc phân loại Database cũng đồng nghĩa với việc phân loại một hệ thống cơ sở dữ liệu đi cùng, vì vậy trong khuôn khổ bài viết này chúng ta cùng hiểu với nhau về phạm vi rộng hơn khi nhắc đến database nhé.

1. Cơ sở dữ liệu quan hệ

Cơ sở dữ liệu quan hệ (RDBMS – Relational Database Management System) là một trong những mô hình dữ liệu được sử dụng rộng rãi nhất hiện nay. Dữ liệu được lưu dưới dạng bảng với dòng và cột tạo thành các ô lưu trữ từng giá trị cụ thể, dữ liệu giữa các bảng cũng có mỗi liên kết (quan hệ) với nhau theo các thiết lập có sẵn. Dữ liệu sẽ được quản lý thông qua ngôn ngữ truy vấn cấu trúc SQL được chuẩn hóa đảm bảo tính thống nhất và đáng tin cậy. Một số CSDL quan hệ nổi tiếng có thể kể đến như Oracle, MySQL, MS Server, PostgreSQL.

Cơ sở dữ liệu quan hệ

Ưu điểm của CSDL quan hệ

  • Có khả năng xử lý tốt với các dữ liệu được cấu trúc kỹ càng và hỗ trợ các thuộc tính ACID (tính nguyên tố, nhất quán, độc lập và bền vững).
  • Dữ liệu trong CSDL quan hệ được lưu trữ và truy xuất dễ dàng bằng SQL.
  • Khả năng mở rộng nhanh chóng, khả năng bổ sung dữ liệu mới không ảnh hưởng đến các dữ liệu có sẵn.
  • Các RDBMS có khả năng phân quyền truy xuất dễ dàng.

Nhược điểm:

  • Không xử lý tốt (hoặc không có khả năng xử lý) các dữ liệu phi cấu trúc.
  • Dữ liệu bị chia cắt dẫn đến việc đọc hiểu dữ liệu cần bước chuyển đổi sang dạng khác và sẽ tốn thời gian.
  • Việc thay đổi CSDL, nâng cấp, phân mảnh,… gặp thách thức lớn vì cần đảm bảo tính quy củ chặt chẽ của cấu trúc dữ liệu.
  • Các RDBMS tốn chi phí xây dựng và phát triển hơn so với các loại khác.

  Top 10 Hệ quản trị cơ sở dữ liệu (DBMS) phổ biến

  Lộ trình học MySQL từ A đến Z

2. Cơ sở dữ liệu hướng đối tượng

CSDL hướng đối tượng (OODB – Object Oriented Database) là CSDL dựa trên lập trình hướng đối tượng (OOP). Nó biểu diễn dữ liệu dưới dạng các đối tượng (object) và lớp (class), có thể quản trị nhiều kiểu dữ liệu phức hợp như âm thanh, hình ảnh,… Các đối tượng được phân cấp rất rõ ràng, mỗi cấp được gọi là một lớp dữ liệu. Những hệ quản trị CSDL loại này như ODBMS (Object Database Management System) hay ORDBMS (Object Relational Management System). 

Cơ sở dữ liệu hướng đối tượng

Ưu điểm của CSDL hướng đối tượng:

  • Có thể lưu trữ nhiều kiểu dữ liệu cùng với các thao tác và lớp trên chúng.
  • Cung cấp mô hình phát triển CSDL cho phân tích, xây dựng và phát triển ứng dụng.
  • Có thể dẫn về một CSDL quan hệ được chuẩn hóa.
  • Cấu trúc nhất quán giúp hỗ trợ lập trình nhanh chóng.

Nhược điểm:

  • Thiếu cơ sở lý thuyết và chuẩn hóa tạo ra các sản phẩm rất khác nhau.
  • Khó mở rộng logic, chưa có view CSDL như CSDL quan hệ.

Tham khảo việc làm MySQL Hồ Chí Minh hấp dẫn

3. Cơ sở dữ liệu hướng tài liệu

CSDL hướng tài liệu hay Document store thực hiện việc lưu trữ dữ liệu dưới dạng văn bản như JSON, BSON hay XML. CSDL này không đòi hỏi người dùng tạo bảng nhập liệu, tài liệu trong đó có thể chứa bất kỳ dữ liệu nào. Để quản trị dữ liệu, các hệ quản trị CSDL loại này sẽ tạo ra các cặp khóa – giá trị (key-value) cùng với việc đính kèm các metadata (thông tin đi kèm) để giúp cho việc truy vấn dữ liệu trở nên dễ dàng hơn. Những hệ quản trị CSDL hỗ trợ loại này như MongoDB hay Couchbase.

Cơ sở dữ liệu hướng tài liệu

Ưu điểm của CSDL hướng tài liệu:

  • Khả năng xử lý dữ liệu linh hoạt, hỗ trợ tốt dữ liệu bán cấu trúc và không cấu trúc.
  • Có thể thiết kế một cấu trúc cho một loại tài liệu cụ thể mà không ảnh hưởng đến các loại tài liệu khác.
  • Khả năng đọc hiểu dữ liệu, chia sẻ dữ liệu tốt hơn CSDL quan hệ.
  • Dễ dàng mở rộng theo chiều ngang.

Nhược điểm:

  • Để đổi lấy sự linh hoạt thì CSDL hướng tài liệu không đảm bảo các thuộc tính của dữ liệu.
  • Việc truy vấn thực hiện trên từng tài liệu, khó thao tác truy vấn trên nhiều tài liệu khác nhau.

4. CSDL dạng key-value

Key – value (khóa – giá trị) là kiểu lưu trữ đơn giản nhất trong các loại CSDL NoSQL, các hệ quản trị CSDL NoSQL sử dụng key (một chuỗi giá trị duy nhất) liên kết với giá trị (value) dưới dạng văn bản hoặc các tập dữ liệu phức tạp hơn. Các loại giá trị có thể được hỗ trợ như: JSON, XML, HTML, nhị phân, hình ảnh, video, … Một số hệ quản trị CSDL dạng này có thể nhắc đến là Redis hay Memcached.

CSDL dạng key-value

Ưu điểm của CSDL key-value:

  • Linh hoạt xử lý nhiều loại dữ liệu một cách nhanh chóng.
  • Khả năng truy xuất thẳng đến giá trị.
  • Dễ dàng mở rộng theo chiều ngang.
  • Chi phí vận hành thấp.

Nhược điểm:

  • Không phải objects nào cũng có thể cấu hình thành cặp key-value được.
  • Tính chính xác thấp vì dữ liệu được lưu trữ theo blob.
  • Khó khăn trong việc chỉnh sửa, cập nhật dữ liệu.

Kết bài

Như vậy chúng ta đã cùng nhau tìm hiểu qua một số loại cơ sở dữ liệu cũng như ưu và nhược điểm của chúng. Mỗi loại CSDL sẽ giải quyết cho từng trường hợp, bài toán hay dự án cụ thể; vì vậy hãy lựa chọn đúng để có thể tận dụng được ưu điểm của chúng cho dự án của bạn. Hy vọng bài viết hữu ích dành cho bạn và 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

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

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

Nên học Angular hay React? So sánh 2 framework

Nên học Angular hay React

AngularReact là hai công nghệ được nhiều anh em lập trình Frontend quan tâm, lựa chọn làm định hướng sự nghiệp. Mặc dù đều là những framework/thư viện JavaScript nhưng cách phát triển, xây dựng ứng dụng giữa 2 nền tảng này có sự khác nhau lớn; vì vậy việc lựa chọn theo một hướng ngay từ đầu là điều quan trọng đối với lập trình viên. Bài viết hôm nay chúng ta cùng nhau đi tìm hiểu về 2 công nghệ này để giúp bạn có thể trả lời câu hỏi rằng nên học Angular hay React nhé.

Tổng quan về 2 nền tảng

ReactJS là một thư viện JavaScript mã nguồn mở được Facebook giới thiệu từ 2013 dành cho việc xây dựng và phát triển giao diện người dùng. Angular là một framework JS được viết bằng TypeScript mà Google phát hành/ nâng cấp vào năm 2016 (phân biệt với bản AngularJS ra đời từ 2009). Angular là 1 phần của MEAN stack (ngăn xếp phần mềm viết bằng JS) với chức năng tạo ra các ứng dụng Web.

Angular-va-React-1

Angular là một Web framework đầy đủ, trong khi React chỉ là một thư viện vì nó luôn cần sử dụng cùng với một vài thư viện JS khác để cung cấp một kiến trúc hoàn chỉnh cho sản phẩm dựa trên React, ví dụ như Flux, MobX hay Redux. Cả Angular và React cùng sử dụng kiến trúc module để phát triển các function như routing hay các dependencies trong một ứng dụng đơn trang (Single Page Application).

Với việc được hậu thuẫn và phát triển bởi 2 ông lớn Facebook và Google thì các tính năng, cộng đồng hỗ trợ hay về cả hiệu năng, hiệu suất của cả Angular và React đều đủ tốt cho các ứng dụng Web hiện nay. Để hiểu sâu hơn về 2 nền tảng này chúng ta cùng đi so sánh xem điểm khác nhau giữa chúng cụ thể thế nào nhé.

So sánh giữa Angular và React

So sánh giữa Angular và React

1. Về ngôn ngữ lập trình

Angular sử dụng TypeScript làm ngôn ngữ lập trình, cùng với đó là việc bắt buộc lập trình viên phải tuân theo các quy ước ràng buộc cùng kiến trúc MVC. Cũng vì vậy mà việc bắt đầu học với Angular sẽ khó hơn, mất nhiều thời gian làm quen hơn và có thể cảm thấy không thoải mái khi sử dụng. Mặc dù vậy, nhờ việc có kiến trúc xây dựng ứng dụng cũng như sử dụng TypeScript (một siêu tập hợp các cú pháp nghiêm ngặt của JavaScript) khiến các ứng dụng viết bằng Angular được đánh giá cao về khả năng bảo trì, mở rộng, nâng cấp source code trong tương lai.

React có cách tiếp cận ngược lại khi sử dụng JSX – một cú pháp đặc biệt pha trộn giữa code HTML và JavaScript khiến việc tiếp cận, học và viết code trong React trở nên dễ dàng hơn. JS được biết đến là một ngôn ngữ khá thoải mái trong lập trình, vì vậy việc code React cũng dễ dàng tùy biến theo kiến trúc, mô hình mà dự án lựa chọn. Nhược điểm của điều này chính là việc nếu không có những kiến trúc rõ ràng ngay từ đầu thì dự án có thể rất khó để kiểm soát và mở rộng về lâu dài.

  Nên học ngôn ngữ lập trình nào để sau này dễ xin việc?

  So sánh Golang và NodeJS: Nên chọn nền tảng nào cho dự án của bạn?

2. Về ràng buộc dữ liệu

Data binding là kỹ thuật liên kết giữa các UI components trong layout với các nguồn dữ liệu trong ứng dụng, là yếu tố ảnh hưởng đến việc xác định khung phát triển phù hợp. React sử dụng liên kết dữ liệu 1 chiều trong đó các thành phần UI chỉ có thể được thay đổi sau khi thay đổi state model. Trong khi đó với Angular thì phương pháp ràng buộc 2 chiều được hỗ trợ giúp đảm bảo rằng state model thay đổi tự động khi có bất kỳ thay đổi nào trong thành phần UI được thực hiện và ngược lại.

Mặc dù việc hỗ trợ ràng buộc dữ liệu 2 chiều của Angular mang lại cách tiếp cận linh hoạt hơn nhưng ngược lại cũng sẽ dẫn đến việc khó kiểm soát dữ liệu khi ứng dụng mở rộng. Cách tiếp cận của React vẫn được cộng đồng lập trình viên đánh giá là hợp lý và cho một cái nhìn tổng quan về dữ liệu tốt hơn.

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

3. Về tốc độ phát triển

Angular cung cấp cho chúng ta đầy đủ một không gian làm việc, kiến trúc thiết kế ứng dụng một cách hoàn chỉnh nên giúp tốc độ phát triển của dự án nhanh và rõ ràng hơn. Việc phải tuân thủ theo những quy trình tích hợp sẵn có thể khiến mức độ linh hoạt và tự do trong Angular bị hạn chế, nhưng cũng chính là ưu điểm của nền tảng này so với React. React linh hoạt và tự do nhưng phụ thuộc khá nhiều vào sự tham gia của các thư viện bên thứ ba. Điều này khiến các lập trình viên React cần phải làm quen và xác định kiến trúc phù hợp với công cụ sử dụng.

4. Về DOM

Angular sử dụng real DOM trong đó toàn bộ cấu trúc dữ liệu cây được cập nhật ngay cả khi chỉ một phần của nó thay đổi. React tạo ra 1 khái niệm là Virtual DOM giúp theo dõi và cập nhật thay đổi trên các node mà không làm ảnh hưởng đến các thành phần khác của cây. Về mặt này React được cho là tốt hơn, nhanh và giúp cải thiện hiệu suất hơn so với Angular. Mặc dù vậy thì với các phiên bản cập nhật gần đây, Angular đã bổ sung các tính năng mới như Ivy, Shadow API để cạnh tranh với React. Vì vậy về mặt hiệu năng xử lý có thể xem có sự cạnh tranh tương đồng giữa 2 nền tảng này.

Nên lựa chọn học Angular hay React?

Nên lựa chọn học Angular hay React?

Về mức độ phổ biến thì React tỏ ra vượt trội hơn khá nhiều so với Angular. Angular được cộng đồng lập trình viên ưu chuộng nhờ cung cấp sẵn các giải pháp một cách hoàn chỉnh. Cả 2 nền tảng này đều đang phát triển, có cộng đồng hỗ trợ đông đảo và luôn đứng top trong sự lựa chọn Frontend framework những năm gần đây. Vì vậy đối với câu hỏi nên lựa chọn học Angular hay React thì câu trả lời là tùy thuộc vào định hướng phát triển sự nghiệp của bạn. Nhu cầu tuyển dụng của 2 nền tảng này đều lớn, mặc dù riêng ở thị trường Việt Nam hiện nay thì React tỏ ra có nhiều jobs hơn. 

Hãy lựa chọn React để học nếu như:

  • Bạn đã có những kỹ năng chuyên môn tốt về HTML, CSS và đặc biệt là JavaScript
  • Bạn thích một nền tảng với mức tùy biến cao
  • Bạn cần học nhanh, làm việc được ngay, dễ học dễ hiểu và dễ áp dụng

Và có thể lựa chọn Angular nếu như:

  • Bạn mong muốn học và làm việc với một nền tảng hoàn chỉnh, quy trình, kiến trúc rõ ràng, nghiêm ngặt
  • Có hiểu biết tương đối về kiến trúc MVC, sẽ là lợi thế nếu có hiểu biết về các ngôn ngữ như Java hay C# từ trước
  • Mong muốn nâng cao hiệu suất lập trình, hiểu rõ về mã nguồn và kiến trúc ứng dụng

Kết bài

Với các phân tích trong bài viết, hy vọng các bạn đã phần nào có câu trả lời cho câu hỏi nên học Angular hay React và có thể đưa ra định hướng sắp tới cho mình. Lựa chọn nào cũng sẽ là đúng đắn nếu bạn hiểu rõ về nền tảng đó và đào sâu trong quá trình học để nắm vững được công nghệ. Hy vọng bài viết hữu ích dành cho bạn và 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:

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

Tương lai của khoa học dữ liệu – Ngành học đầy hấp dẫn

Tương lai của khoa học dữ liệu

Theo Harvard, khoa học dữ liệu được xem là ngành học của thế kỷ 21, khi dữ liệu được xem là tài nguyên quý báu nhất của thời đại số. Chính vì thế, khoa học dữ liệu nổi lên như một ngành học “thời thượng”, không chỉ giúp chúng ta hiểu rõ hơn về thế giới xung quanh mà còn tạo ra nhiều cơ hội mới mẻ để khám phá những tiềm năng to lớn.

Vậy thật sự tương lai của ngành khoa học dữ liệu sẽ ra sao? Học khoa học dữ liệu ra làm gì? Bài viết này sẽ cung cấp những thông tin hữu ích về ngành học đầy tiềm năng này!

Khoa học dữ liệu là ngành gì?

Khoa học dữ liệu

Khoa học dữ liệu (Data Science) là lĩnh vực nghiên cứu và ứng dụng dữ liệu để giải quyết các vấn đề thực tế. Dữ liệu có thể là bất kỳ thông tin nào được thu thập và lưu trữ, bao gồm văn bản, hình ảnh, video, âm thanh, và dữ liệu số. Khoa học dữ liệu sử dụng các kỹ thuật thống kê, máy học, và trí tuệ nhân tạo để phân tích dữ liệu và rút ra những thông tin hữu ích.

Các chuyên gia trong lĩnh vực này được đào tạo để thu thập, quản lý và phân tích dữ liệu một cách chuyên nghiệp, và họ sử dụng các công cụ và phần mềm đặc biệt để tối ưu hóa quá trình này.

  Data Scientist là gì? Và hành trình để trở thành Data Scientist

  Top 10 thư viện Python tốt nhất cho Data Scientist nửa đầu năm 2024

Tương lai của khoa học dữ liệu

Tương lai của khoa học dữ liệu đầy triển vọng và hứa hẹn với tiềm năng phát triển to lớn. Ngành này đang phát triển nhanh chóng và được dự đoán sẽ tiếp tục tăng trưởng trong tương lai. Có nhiều yếu tố góp phần vào sự phát triển của ngành này, bao gồm:

  • Sự gia tăng của dữ liệu: Ngày nay, chúng ta đang tạo ra một lượng dữ liệu khổng lồ từ nhiều nguồn khác nhau. Dữ liệu này có thể được sử dụng để hiểu rõ hơn về thế giới xung quanh chúng ta, đưa ra các quyết định sáng suốt và tạo ra các sản phẩm và dịch vụ mới.
  • Sự phát triển của trí tuệ nhân tạo (AI): AI là một công nghệ quan trọng trong khoa học dữ liệu. AI giúp chúng ta tự động hóa các quy trình phân tích dữ liệu và tạo ra các mô hình dự đoán chính xác hơn.
  • Sự thay đổi nhu cầu của doanh nghiệp: Các doanh nghiệp đang ngày càng chuyển sang sử dụng dữ liệu để nâng cao hiệu quả hoạt động và đưa ra các quyết định chiến lược.
  • IoT và Big Data: Sự phát triển của Internet of Things (IoT) sẽ tạo ra một lượng lớn dữ liệu từ các thiết bị kết nối mạng, mở ra cánh cửa cho việc áp dụng khoa học dữ liệu trong nhiều lĩnh vực mới, từ quản lý thành phố thông minh đến chăm sóc sức khỏe.
  • Phân tích dữ liệu thời gian thực: Khả năng phân tích dữ liệu thời gian thực sẽ trở nên ngày càng quan trọng, đặc biệt trong các lĩnh vực như tài chính, giao thông, và quảng cáo trực tuyến. Điều này đòi hỏi sự phát triển của các công nghệ và công cụ phân tích dữ liệu nhanh chóng và chính xác.
  • Bảo mật dữ liệu và quyền riêng tư: Với sự gia tăng của dữ liệu và các vấn đề liên quan đến bảo mật và quyền riêng tư, việc phát triển các phương pháp và công nghệ để bảo vệ dữ liệu ngày càng trở nên cần thiết. Khoa học dữ liệu sẽ đóng vai trò quan trọng trong việc phát hiện và ngăn chặn các mối đe dọa bảo mật.

Tương lai của khoa học dữ liệu là một điều hứa hẹn của sự phát triển không ngừng. Với sức mạnh của dữ liệu và trí tuệ nhân tạo sẽ định hình một thế giới thông minh và hiệu quả hơn trong mọi lĩnh vực của cuộc sống.

Việc làm Data Analytics HOT tại TP. Hồ Chí Minh

Học khoa học dữ liệu ra làm gì?

Học khoa học dữ liệu ra làm gì?

Trong cuộc đua công nghệ số, việc tận dụng và phân tích dữ liệu đóng vai trò quan trọng trong các chiến lược kinh doanh của hầu hết các doanh nghiệp. Điều này tạo ra nhu cầu ngày càng tăng về nhân sự có kiến thức sâu về khoa học dữ liệu trong các tổ chức và doanh nghiệp. Do đó, sau khi hoàn thành chương trình học trong ngành Khoa học Dữ liệu, bạn sẽ có nhiều lựa chọn về việc làm như:

  • Làm việc tại các công ty và tập đoàn trong ngành viễn thông, phần mềm, đảm nhận các vị trí trong bộ phận IT, quản lý dữ liệu doanh nghiệp, chuyên viên phân tích dữ liệu kinh doanh, hoặc tại các cơ quan nhà nước và ngân hàng.
  • Tham gia vào vai trò kiến trúc sư dữ liệu hoặc kỹ sư phát triển phần mềm tại các công ty cung cấp giải pháp công nghệ thông tin, đảm nhận trách nhiệm trong việc phân tích và thống kê dữ liệu.
  • Nghiên cứu và giảng dạy trong lĩnh vực khoa học dữ liệu và các lĩnh vực liên quan, như công nghệ thông tin và hệ thống công nghiệp, tại các trường đại học và viện nghiên cứu.
  • Những cơ hội nghề nghiệp này chỉ là một phần nhỏ của những lĩnh vực mà người học khoa học dữ liệu có thể tham gia. Với sự phát triển không ngừng của dữ liệu và công nghệ, ngành này đang trở thành một trong những lĩnh vực có nhiều cơ hội và tiềm năng phát triển trong tương lai.

Dưới đây là một số ngành nghề mà người học Khoa học dữ liệu có thể lựa chọn: Nhà Khoa học dữ liệu (Data Scientist), Nhà phân tích dữ liệu (Data Analyst), Kỹ sư học máy (Machine Learning Engineer), Kỹ sư dữ liệu (Data Engineer), Nhà phát triển Business Intelligence (BI),…

Cơ hội nghề nghiệp và mức lương của ngành Khoa học dữ liệu

Cơ hội nghề nghiệp và mức lương trong ngành Khoa học Dữ liệu đang trở nên hấp dẫn hơn bao giờ hết, nhờ vào sự phát triển nhanh chóng của lĩnh vực này và nhu cầu ngày càng tăng về phân tích dữ liệu trong các doanh nghiệp và tổ chức. Ở Hoa Kỳ, ngành khoa học dữ liệu đứng đầu trong số 25 nghề tốt nhấtđứng thứ 16 về mức lương. Nó cũng là một trong 10 ngành nghề được tuyển dụng nhiều nhất hiện nay, điều này cho thấy tiềm năng mạnh mẽ cho những người làm việc trong lĩnh vực này.

mức lương của nhóm ngành Khoa học dữ liệu

Theo báo cáo thị trường IT Việt Nam 2023 của TopDev, mức lương trung bình của các chuyên gia Khoa học Dữ liệu có thể lên đến $2.365. Tuy nhiên, mức lương này có thể biến đổi tùy thuộc vào nhiều yếu tố như kinh nghiệm, kỹ năng, và vị trí công việc. Các chuyên gia có kỹ năng và kinh nghiệm phù hợp thường có khả năng thu nhập cao hơn.

Tóm lại

Trong bài viết này, chúng ta đã điểm qua một số đặc điểm và tương lai của ngành khoa học dữ liệu. Có thể thấy, với sự phát triển mạnh mẽ của ngành thì đây là một lĩnh vực đầy tiềm năng và cơ hội cho các bạn trẻ. Vì vậy, hãy tận dụng cơ hội học hỏi và phát triển trong lĩnh vực Data Science để từng bước tiến xa hơn trong sự nghiệp của mình bạn nhé!

Xem thêm:

Tạo ứng dụng Reactjs lấy dữ liệu từ Rest API

tạo ứng dụng ReactJS lấy dữ liệu từ Rest API

Bài viết được sự cho phép của tác giả Mai Đông Giang

Trong việc phát triển ứng dụng hiện đại thì tần suất làm việc với RestAPI rất thường xuyên. Hôm nay, mình xin chia sẻ với các bạn cách tạo 1 ứng dụng Reactjs demo làm việc với dữ liệu được lấy từ API.

Tạo 1 dự án Reactjs

Việc đầu tiên chúng ta tạo 1 dự án mới. Bạn nào đang thao tác với các dự án cũ thì có thể bỏ qua bước này.

Mình dùng lệnh tạo dự án npx create-react-app react-getapi. Bạn nào thấy lạ thì có thể xem qua bài viết giới thiệu về `npm` của mình tại đây để hiểu thêm nhé.

Di chuyển vào thư mục dự án vừa tạo cd react-getapi.

Cài đặt thư viện Bootstrap

Mình sẽ cài đặt gói thư viện này để trình bày giao diện cho đẹp và nhanh hơn. Bạn chạy lệnh sau yarn add bootstrap.

  Hướng dẫn sử dụng ReactJS Props và State

  Xây dựng REST API cơ bản trong Golang

Tới bước Code nào

Chúng ta chỉ code nhỏ gọn trong file `src/App.js` luôn nhé. Vì ứng dụng có 1 chức năng đơn giản nên mình không chia ra nhiều cho phức tạp.

Đầu tiên ta import các thư viện cần dùng

import React, { Component } from 'react';
import 'bootstrap/dist/css/bootstrap.min.css';

Tạo một `class App` cho code được đẹp hơn

class App extends Component {

}
export default App;

Khai báo 1 biến stage users cho App

constructor() {
  super();

  this.state = {
    users: []
  }
}

Tiếp đến là phần chính của bài hôm nay, chúng ta sẽ thực hiện việc get dữ liệu từ API ở function `componentDidMount`. Ở đây mình muốn sau khi App được load thì sẽ lấy dữ liệu để hiển thị ra danh sách.

Code như sau:

async componentDidMount() {
  await fetch('http://jsonplaceholder.typicode.com/users')
   .then(res => res.json())
   .then((data) => {
      this.setState({ users: data })
   })
   .catch(console.log)
}

`async` là gì? Vì chức năng sẽ được gọi đến server nên sẽ tốn 1 khoảng thời gian nhất định, chúng ta nên thực hiện chức năng này bất đồng độ để không ảnh hưởng đến toàn App. Đi đôi với `async` thì cần dùng `await` cho hàm `fetch`. Sau khi get dữ liệu thành công chúng ta sẽ set lại cho biến stage users.

Còn lại, phần dưới chỉ là hiển thị dữ liệu ra màn hình thôi nên mình nghĩ không cần giải thích gì hen. Nói nhiều quá lại loạn cả lên.hehe

Đây là toàn bộ nội dung file `src/App.js`

import React, { Component } from 'react';

import 'bootstrap/dist/css/bootstrap.min.css';

class App extends Component {

  constructor() {
      super();

      this.state = {
          users: []
      }
  }

  async componentDidMount() {
    await fetch('http://jsonplaceholder.typicode.com/users')
        .then(res => res.json())
        .then((data) => {
            this.setState({ users: data })
        })
        .catch(console.log)
  }

  renderUsers = () => {
      let users = this.state.users.map((data, index) =>
          <tr key={data.id}>
            <td>{data.id}</td>
            <td>{data.name}</td>
            <td>{data.email}</td>
            <td>{data.website}</td>
          </tr>
      );

      return users;
  }

  render() {
    return (
      <div className="App">
        <div className="container">
          <h1 className="text-center">Users List</h1>

          <table className="table">
            <thead>
              <tr>
                <th>#</th>
                <th>Name</th>
                <th>Email</th>
                <th>Website</th>
              </tr>
            </thead>
            <tbody>
              {this.renderUsers()}
            </tbody>
          </table>

        </div>
      </div>
    );
  }
}

export default App;

Test ứng dụng

Bây giờ chúng ta cùng chạy ứng dụng lên xem kết quả thế nào nhé.

Run yarn start

Kết quả của mình đây. Đừng quên chia sẻ kết quả của bạn và hỏi đáp mọi thắc mắc cho mình ở phần bình luận nhé.

Tóm lại

Trong bài chia sẻ này, mình đã hướng dẫn các bạn cách tạo 1 ứng dụng web bằng Reactjs với các chức năng lấy dữ liệu từ Rest API thông qua hàm `componentDidMount()`, cách đặt biến stage, parse data, hiển thị view. Hi vọng sẽ giúp ích các bạn trên con đường chinh phục Framework này dễ dàng hơn.

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

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

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

Thuật toán frontend: Tìm node chứa content chính

Thuật toán frontend: Tìm node chứa content chính

Bài viết được sự cho phép của tác giả Thanh Lê

Tại sao nên đọc bài này

  • Đập vào mặt những đứa nói làm Frontend thì không cần logic, thuật toán
  • Xem tui khoe công việc đang làm thôi

Vấn đề

Chuyện là mình đang build một feature cho https://getnimbus.io, trong đó có một tính năng gọi là Term explain, cơ bản khi bạn đang xem một trang web nào đó mà có một vài từ về web3 thì Nimbus sẽ giải thích từ đó là gì, một cách ngắn gọn nhất.

Đó cơ bản feature là vậy, tuy nhiên có một vấn đề nhỏ: Một trang web sẽ có rất nhiều content, và thường user khi đọc một article hay news thì thường sẽ chỉ focus vào content đó thôi. Nếu vậy sẽ cực kì khó chịu nếu mình show một đống term explain mà không năm trong main content.

Vậy câu hỏi tiếp theo, làm sao mình tự động detect được node nào trong cây DOM chứa main content, để từ đó lấy ra text rồi match trong đó xem có term nào cần explain không.

Thuật toán frontend

Rồi cái khó ở đây là làm sao xác định được cái div nào là main content nhỉ? Trước đây thì mình hard code, mà hôm nay thấy nhiều quá, làm không nổi. Vậy là suy nghĩ có cách nào để tìm được div chứa main content không.

Solution

Vậy là mình này ra một ý tưởng, thường cái div nào mà chứa nhiều text nhất sẽ là chứa content chính của trang. Tuy nhiên vì cấu trúc của một content cũng có thể có nhiều node bên trong đó, nếu vấy thì giải thuyết như này thì sao nhỉ

Ratio = (Node nào có text length / tổng sổ node bên trong) Node nào có cái ratio đó cao nhất thì khả năng cao là main content

Cùng test thử nhé

Một số thử basic
  • Bạn có thể lấy được text content của một node bằng node.innerText
  • Số lượng child node của div qua node.childElementCount hoặc lấy list children qua node.childNodes. (Note là node.childElementCount = node.childNodes.length nhé)

  Tổng hợp các thuật ngữ trong Frontend bạn nhất định phải biết!

  Giới thiệu về StoryBook cho dự án FrontEnd

Children count

Okey, lấy được số lượng text trong một node thì dễ rồi, đếm xem node đó có bao nhiêu node con (bao gồm cả cháu chắt chút chít,…) thì phải cần tí thuật toán rồi
const getTotalChildNode = (node, total = 0) => {
  if (!node.childElementCount) {
    return total;
  }

  return total + (node.childElementCount || 0) + Array.from(node.childNodes).map(child => getTotalChildNode(child)).reduce((a, b) => a + b, 0)
}

Vì cần tìm hết cháu chắt chút chít nên hãy suy nghĩ kiểu gì cùng phải dùng đệ qui (recursive) rồi nhé!

Công thức khi nào nên nghĩ tới đệ quy: – Khi input data có structure lặp lại và kết quả lại là tổng hợp của tất cả các lần lập lại đó.

Cụ thể ở đây là node.childNodes. Mình đang cần lấy cái childNodes để biết có bao nhiêu child đúng không, và từng thằng child trong đó mình cũng lại phải đếm childNodes của nó.

Cách viết đệ quy:

1. Điều kiện dừng

2. Tính kết quả và phân phối đệ quy.

Như ở trên là dk dừng là khi éo còn childElementCount nào nữa

Tính kết quả là total + (node.childElementCount || 0), phân phối là Array.from(node.childNodes).map(child => getTotalChildNode(child)).reduce((a, b) => a + b, 0)

Okey xong rồi á, mọi người có thể cầm lên Browser test thử
Thuật toán frontend
À quên nói, nãy giờ test thử ở trang này luôn nhé https://thanhle.blog/blog/thuat-ngu-trong-frontend-optimization

Ratio

const textNodeRatio = (node) => {
  const totalNodes = getTotalChildNode(node);
  if (!node.innerText || !totalNodes) {
    return 0;
  }

  const textLength = node.innerText.length;
  return textLength / getTotalChildNode(node);
}

const checkAllNodes = (node, result = []) => {
  result.push({node, ratio: textNodeRatio(node)});
  if (node.childElementCount) {
    Array.from(node.childNodes).forEach(child => {
      checkAllNodes(child, result);
    })
  }

  return result.sort((a, b) => b.ratio - a.ratio).slice(0, 10);
}

Như nãy đã giải thuyết, lấy số từ trong node rồi chia ra theo tổng số cháu chắt, thằng nào có ratio đó cao nhất nghĩa là main

Thuật toán frontend

A… đuồi ròi, list kết quả chỉ là cái div chứa content (Môt div chứa đoạn văn). Uhm đúng nhỉ, éo có childrent nào cả, toàn là text bên trong thì chả có ratio cao nhất rồi

DKM, cay, giả thuyết mình sai sao?

Xem ngay các tin đăng tuyển dụng Front-end lương cao trên TopDev

Context của bài toán

Pop lên trong đầu mình , nếu mình đi check các trang về tin tức, news đồ, chả lẽ cả trang tin thì dài có mấy trăm chữ?

Vậy mình nên filter bỏ ra mấy thằng div mà text ít quá nhỉ. Đơn giản.

const textNodeRatio = (node) => {
  const totalNodes = getTotalChildNode(node);
  if (!node.innerText || !totalNodes) {
    return 0;
  }

  const textLength = node.innerText.length;
  if (textLength < 1000) {
	// Thằng nào có text ít quá thì cho ra đê luôn 
    return 0;
  }

  return textLength / getTotalChildNode(node);
}

Test lại

Thuật toán frontend
Thuật toán frontend

Full script

const getTotalChildNode = (node, total = 0) => {
  if (!node.childElementCount) {
    return total;
  }

  return total + (node.childElementCount || 0) + Array.from(node.childNodes).map(child => getTotalChildNode(child)).reduce((a, b) => a + b, 0)
}

const textNodeRatio = (node) => {
  const totalNodes = getTotalChildNode(node);
  if (!node.innerText || !totalNodes) {
    return 0;
  }

  const textLength = node.innerText.length;
  if (textLength < 1000) {
    return 0;
  }

  return textLength / getTotalChildNode(node);
}

const checkAllNodes = (node, result = []) => {
  result.push({node, ratio: textNodeRatio(node)});
  if (node.childElementCount) {
    Array.from(node.childNodes).forEach(child => {
      checkAllNodes(child, result);
    })
  }

  return result.sort((a, b) => b.ratio - a.ratio).slice(0, 10);
}

Độ hoàn thiện

Nói chung là mình test một vài trang khá ok, một vài trang content rất dài nên dẫn tới cái điều kiện < 1000 có vẻ không ổn lắm.

So far so good, thôi tạm ổn để sài đã . Để suy nghĩ thêm xem có cách gì khiến nó stable hơn không đã. Bạn đọc có idea gì thì giúp mình với nhá.

Đánh giá performance

Nói chung đoạn này nên check thử xem cái thuật toán của mình có thực sự chạy được không, kiểu logic đúng mà 5p sau biến laptop của user thành cái chảo chiên trứng thì hơi… độc ác phải không nào.

Đánh giá performance
Tuy nhiên, khi test thử trên con Macbook Pro M1 16GB RAM 512GB SSD thì thấy nó khá nhanh, nên thôi đoạn này mình lười viết quá. Rảnh sẽ bổ sung thêm.

Một số idea khác

  • Tìm xem div nào chiếm nhiều viewport nhất
  • Div nào chứa nhiều thẻ p trong đó nhất

Tổng kết

Đó thấy đó, đôi khi giỏi thuật toán sẽ giúp bạn giải quyết những bài toán ảo ma canada, xuka yêu chai en vậy. Vì vậy đừng coi thường thuật toán nhé!

Thuật toán frontend
Nói đi thì cũng phải nói lại, thuật toán chỉ là công cụ để bạn giải quyết vấn đề, mình thấy quan trọng vẫn là cách bạn nghĩ về vấn đề và idea để solve nó. Vì vậy lâu lâu hãy thử luyện tập nhìn xem có vấn đề gì hay ho có thể giải quyết được không nhé!

Have a good weekend!

Cách ứng dụng Chat GPT hỗ trợ cho công việc hiệu quả

Cách ứng dụng Chat GPT hỗ trợ cho công việc hiệu quả

Bài viết được sự cho phép của tác giả Võ Xuân Phong

Chat GPT là gì?

Chat GPT là từ viết tắt của Chat Generative Pre-training Transformer, là sản phẩm của một công ty công nghệ có tên là OpenAI, vừa mới ra mắt vào tháng 11 năm 2022, nó đã tạo ra một sự bùng nổ trong giới công nghệ toàn cầu, Chat GPT là mô hình xử lý ngôn ngữ tự nhiên, tức là tập trung vào sự tương tác giữa người và máy thông qua ngôn ngữ tự nhiên của con người, việc xử lý ngôn ngữ tự nhiên là công việc rất khó, do phải giúp máy hiểu được ngôn ngữ và ngữ cảnh trong tình huống giao tiếp.

Dữ liệu mà Chat GPT thu thập để học hỏi, là từ nguồn dữ liệu khổng lồ từ internet, sách báo v.v. Đó là lý do tại sao nó có thể trên thông thiên văn, dưới tường địa lý như vậy.

Thật ra mô hình này đã được nghiên cứu, xây dựng và phát triển từ rất lâu, các bạn có thể thấy các sản phẩm gần giống vậy như trợ lý ảo Alexa của Amazon và Google Home của Google. Alexa và Google Home mục đích làm trợ lý để điều khiển các thiết bị thông minh trong nhà, dự báo thời tiết, đặt lịch, gọi điện v.v. Nhưng Google Home và Alexa sẽ không giúp bạn nhiều trong công việc với những câu hỏi dài và mang tính học thuật.

Chat GPT ra đời, nó khiến mỗi người trên toàn thế giới phải định hình lại chính mình, vì mối đe dọa đến tình hình việc làm của nhiều ngành nghề khác nhau. Để tránh bị sa thải trong tình hình AI ngày càng thông minh và sáng tạo, thì mỗi người chúng ta phải ngày càng cố gắng hơn.

Nếu nhìn về khía cạnh tích cực thì nó sẽ là một trợ thủ đắc lực cho bạn và tôi, nếu như bạn biết sử dụng đúng cách cho công việc của mình.

>>> Xem thêm: 7 cách ChatGPT giúp bạn lập trình tốt hơn và nhanh hơn

Chat GPT giúp tiết kiệm thời gian tìm kiếm và tìm hiểu vấn đề của tôi

Khi mình có thắc mắc gì về lĩnh vực đang tìm hiểu, Chat GPT luôn truy xuất thông tin nhanh và liệt kê, đúc kết ra các thông tin ngắn gọn, súc tích. Nếu mình tìm kiếm thông tin trên Google thì phải tốn thời gian đi qua từng trang web đọc và đúc kết thì mới hiểu được nội dung.

lập trình bằng chat GPT

  Tối ưu hóa CV bằng ChatGPT: Gây ấn tượng nhà tuyển dụng ngay từ lần đầu

  Dân IT có thể được ChatGPT hỗ trợ code tự động hóa như thế nào?

Tôi đã sử dụng Chat GPT trong công việc của mình như thế nào?

Mình hỏi Chat GPT làm sao để trở thành một nhà phát triển Web3. Thì nhận được phản hồi khá cụ thể từng chi tiết về những thứ mình sẽ phải tìm hiểu. Ngoài liệt kê thông tin, nó còn giải thích thêm các chi tiết cho mình hiểu, nếu sử dụng nó quen thì chắc chắn bạn sẽ hỏi nó thay vì ngồi search Google.

lập trình bằng chat GPT

Tiếp theo mình hỏi nó về convention trong dự án NodeJS. Nó liệt kê và giải thích khá cụ thể từng mục về folder structure, folder naming convention, coding convention. Những câu hỏi mình hỏi nó, nó đều trả lời rất đầy đủ. Ngày trước mình lên google đôi khi tìm nát google mới có được một bài viết hay và ý nghĩa, nhưng giờ thì mình chỉ cần hỏi nó và đã có kết quả như mình mong muốn.

lập trình bằng chat GPT

lập trình bằng chat GPT

lập trình bằng chat GPT

Ngoài ra mình còn nhờ nó thử viết Unit Tests cho một  React component cơ bản. Đúng là nó có thể giúp mình trong mọi việc, nhưng mình thiết nghĩ không nên lạm dụng điều này, vì sẽ dẫn đến tình trạng lười suy nghĩ, về lâu về dài mình sẽ bị phụ thuộc vào nó, mà cái gì phụ thuộc thì cũng ko tốt.

lập trình bằng chat GPT

lập trình bằng chat GPT

lập trình bằng chat GPT

Việc làm AI lương thưởng hấp dẫn, mới nhất dành cho bạn!

Có nên sử dụng Chat GPT để viết Blog và tạo nội dung?

Mình thử nhờ Chat GPT tạo ra được một bài viết về Chat GPT. Như các bạn đã thấy Chat GPT tạo ra được một bài viết khá gọn gàng và mạch lạc, trông rất chuyên nghiệp. Nhưng theo quan điểm cá nhân của mình, thì không nên làm như vậy, vì thông tin được chia sẻ không xuất phát từ sự hiểu biết của mình, mà nó xuất phát từ một con bot như vậy thì không có giá trị cho cộng đồng và cho chính bản thân mình.

lập trình bằng chat GPT

Chat GPT pha trò

Ở đây mình nhờ Chat GPT nói một câu nói hài hước về nhà phát minh vĩ đại Nikola Tesla. Ừ, đọc cũng trông hài hước nhỉ.

Chat GPT thử tạo bài nhạc cho rapper Đen Vâu

Mình đã nhờ Chat GPT tạo ra một bài rap về rapper Đen Vâu, nhưng bạn hãy nhìn xem, nó giống liệt kê thông tin mà nó biết hơn là một bài rap. Mình có nói nó là bài rap phải có vần nhưng nó vẫn chưa thể hiểu. Thì ra nó cũng chưa đủ thông minh và sáng tạo như con người. Vậy Đen Vâu sẽ còn rap cho chúng ta nghe tiếp, thay vì là Chat GPT.

lập trình bằng chat GPT

Thật ra thì Chat GPT không biết gieo vần và chơi chữ như các rapper.

lập trình bằng chat GPT

Chat GPT làm nhà tư vấn tình cảm

Đúng là quân sư của ta. Ngoài những công việc như pha trò và viết nhạc thì Chat GPT cũng có thể hóa thân thành nhà tư vấn tình cảm chuyên nghiệp. Mình thử hỏi nó một câu xem nó trả lời như thế nào nhé:

Đừng lạm dụng Chat GPT hãy sử dụng nó đúng cách

Cái gì cũng có 2 mặt của nó, mặt tốt và mặt xấu, Chat GPT cũng vậy, nó có thể làm được nhiều thứ và hỗ trợ chúng ta trong công việc rất tốt. Nhưng đừng vì thế mà lạm dụng nó, bởi vì khi chúng ta lạm dụng nó, chúng ta sẽ trở nên lười học hỏi và khó có thể phát triển trong tương lai. Hãy tận dụng nó một cách thông minh.

Chat GPT có làm lập trình viên như tôi bị mất việc không?

Tính đến thời điểm hiện tại nó sẽ là công cụ tốt để mình học hỏi và phát triển. Dữ liệu của Chat GPT có được là rất lớn nhưng không phải công việc nào của lập trình viên Chat GPT cũng có thể làm được. Chat GPT sẽ không nắm được business requirements, cấu trúc, code, và deploy một dự án thực tế v.v.. Phải cần thêm một thời gian khá lâu nữa thì Chat GPT sẽ làm được những công việc đó. Nhưng khi nào Chat GPT có thể làm được những công việc đó thì ở hiện tại mỗi chúng ta phải cố gắng không ngừng mỗi ngày.

Tổng kết

Chat GPT sẽ là một trợ thủ đắc lực, hãy tiếp nhận nó thay vì sợ hãi, sử dụng nó nhưng đừng lạm dụng nó, và còn một điều nữa là mỗi chúng ta phải không ngừng cố gắng học hỏi, và phát triển mỗi ngày để không bị bỏ lại phía sau, khi thế giới công nghệ đang phát triển không ngừng.

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

Xem thêm:

Xem thêm các việc làm CNTT hấp dẫn tại TopDev

Kong Gateway là gì? Cách thiết lập và sử dụng Kong Gateway

Kong Gateway là gì

Kong Gateway hiện đang là giải pháp API Gateway mã nguồn mở phổ biến nhất hiện nay. Nó giúp chúng ta có thể nhanh chóng, thuận tiện và bảo mật trong việc triển khai kiến trúc Microservices; cũng như cung cấp thêm các dịch vụ mở rộng khác. Bài viết hôm nay chúng ta cùng nhau tìm hiểu xem Kong Gateway là gì cùng một số hướng dẫn thiết lập để sử dụng API Gateway này nhé.

API Gateway là gì?

Trong một hệ thống Microservices, nếu như client giao tiếp trực tiếp với các services thì sẽ tạo ra một sơ đồ kết nối rất rối rắm và cực kỳ khó quản lý, cùng với đó thì các vấn đề sau có thể phát sinh:

  • Code phía client trở nên phức tạp vì phải tracking nhiều endpoint
  • Khó maintain phía client và refactor các service
  • Mỗi service phải handle nhiều vấn đề chung như Authentication, SSL, client rate limiting.

Giải pháp được đưa ra cho vấn đề trên là API Gateway – một cổng trung gian giữa client và hệ thống services đằng sau.

API Gateway là gì?

Nhiệm vụ của API Gateway là định tuyến các yêu cầu từ client gửi đến, kết hợp và chuyển đổi các giao thức. Tất cả các request từ client sẽ gửi tới API Gateway, sau đó nhờ nó định tuyến các yêu cầu đến với đúng service phù hợp. Lợi ích của việc sử dụng API Gateway:

  • Che dấu được cấu trúc của hệ thống Microservices với bên ngoài
  • Việc xử lý kết nối ở client sẽ trở nên đơn giản, gọn gàng hơn
  • Dễ dàng theo dõi lượt truy cập, traffic chung của toàn hệ thống
  • Có thể cài đặt các phương án bảo mật chung cho hệ thống trên API Gateway
  • Có thể sử dụng thay thế cho Authentication service 
  • Có khả năng caching các request và xử lý cân bằng tải trên API Gateway

Kong Gateway là gì?

Kong Gateway là một nền tảng (platform) mã nguồn mở, đóng vai trò là phần mềm trung gian (middleware) và có thể mở rộng bằng cách sử dụng plugins. Kong được viết bằng ngôn ngữ Lua và xây dựng trên NGINX. Kong thường được các nhà phát triển lựa chọn làm giải pháp triển khai API Gateway, quản lý và điều chỉnh để mở rộng quy mô.

Kong Gateway là gì?

Khi hoạt động, mọi request được gửi tới sẽ phải qua Kong trước tiên, sau đó nó sẽ được định tuyến và ủy quyền sang cho các service cụ thể trên server. Ở giữa các request và response, Kong sẽ thực thi các plugins được cài đặt. 

  SAGA Pattern trong Microservices

  Bỏ túi một số quy tắc thiết kế API hữu ích

Các thành phần trong Kong Gateway bao gồm:

  • Service: là id dùng để tham chiếu đến các API và microservice mà nó quản lý
  • Routes: điều hướng cách request gửi tới Services. 1 Service có thể có nhiều Routes
  • Consumers: đại diện cho end users của API làm nhiệm vụ control xem ai được access vào API
  • Plugins: các plugins được tích hợp vào Kong
  • Konga: công cụ quản lý GUI mã nguồn mở cho Kong.

Kong Gateway

Ưu điểm của Kong Gateway:

  • Scalable – Khả năng mở rộng dễ dàng
  • Hỗ trợ 1 trong 2 loại Databases: Postgres và Cassandra
  • Hiệu năng cao với khả năng xử lý một lượng request rất lớn
  • Hỗ trợ rất nhiều plugins tùy vào chức năng
  • Kong có 2 phiên bản Community và Enterprise. Với nhu cầu sử dụng bình thường thì bản Community hoàn toàn đầy đủ chức năng và miễn phí.

Xem thêm tuyển dụng Design Pattern hấp dẫn trên TopDev

Thiết lập và sử dụng Kong Gateway

Thiết lập và sử dụng Kong Gateway

1. Thêm một service

Để kết nối với server API thì chúng ta cần thêm một service trong Kong, lưu ý 1 số params như dưới đây:

  • name: tên service
  • protocol: http protocol
  • host: tên của upstream
  • port: port của server, mặc định là port 80
  • path: đường dẫn tới service trên upstream
  • retries: số lần thử khi Kong không gọi được tới upstream

2. Thêm route cho service

Routes là tập hợp các quy tắc để Kong match request tới đúng API trên services mà nó cần tới. Sau khi tạo service, chúng ta sẽ thêm các routes để điều hướng các request tới chính xác các API trong service này. Bạn có thể thêm tương ứng mỗi route cho một API hoặc config route match với đường dẫn của các API trong service. Lưu ý các params trong route:

  • name: tên của route
  • protocols: http protocol
  • paths: danh sách các path được match với route, có thể sử dụng regex trong field này
  • methods: danh sách http methods
  • strip_path: xóa phần prefix của paths khi tới upstream server

3. Cấu hình plugins

Kong cung cấp cho chúng ta một số các plugins có sẵn gồm cả miễn phí và trả phí. Plugins có thể áp dụng cho toàn bộ API hoặc có thể chỉ cho cụ thể từng API thông qua name hoặc id của chúng. Một số plugins nổi bật mà Kong cung cấp:

  • Authentication: xác thực dịch vụ
  • Traffic Control: quản lý lưu lượng request đầu vào và đầu ra
  • Analytics: hỗ trợ giám sát, thống kê
  • Transformations: chuyển đổi trực tiếp dữ liệu request và response
  • Logging: ghi nhật ký

Kết bài

Như vậy chúng ta đã cùng nhau tìm hiểu về Kong Gateway cũng như các thiết lập và sử dụng nó để triển khai một API Gateway dành cho hệ thống Microservices. Hy vọng bài viết giúp bạn hiểu được lý do cần phải triển khai một API Gateway và sẵn sàng thử triển khai Kong trên hệ thống server của bạn. Cảm ơn các bạn đã đọc bài và 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: 

Tin tuyển dụng IT mọi cấp độ trên TopDev đang chờ bạn ứng tuyển!

Big Data cần học gì? Bắt đầu từ đâu? Lộ trình chi tiết cho người mới

Big Data cần học gì? Bắt đầu đâu? Lộ trình chi tiết cho người mới

Bắt đầu hành trình học về Big Data đôi khi có thể là một thách thức đối với những người mới chập chững bước vào lĩnh vực này. Những câu hỏi như “Học Big Data bắt đầu từ đâu?” hay “Big Data cần học gì?” thường xuyên làm cho các newbie cảm thấy bối rối và không biết phải bắt đầu từ đâu. Nhưng đừng lo, bài viết này sẽ giúp bạn hiểu rõ hơn về Big Data và cung cấp lộ trình chi tiết để trở thành một chuyên gia Big Data giỏi. Bắt đầu thôi nào!

Big Data là gì? Vai trò Big Data đối với doanh nghiệp

Big Data là một tập dữ liệu cực lớn vượt qua khả năng quản trị và xử lý thông thường. Thay vào đó, big data cần một phương pháp, công cụ tinh vi hơn để khai thác dữ liệu, phân tích chuyên sâu và trích lọc ra các data hữu ích với doanh nghiệp. Dựa vào những data này mà doanh nghiệp sẽ đưa ra các quyết định hiệu quả hơn trong tương lai.

Big Data cần học gì

Big Data có tầm quan trọng ngày càng cao đối với doanh nghiệp, mang lại nhiều lợi ích như:

  • Nâng cao hiệu quả kinh doanh: Big Data có thể được sử dụng để phân tích dữ liệu khách hàng, dữ liệu bán hàng, dữ liệu sản xuất,… để giúp doanh nghiệp hiểu rõ hơn về khách hàng, thị trường, sản phẩm,…
  • Phát triển sản phẩm, dịch vụ mới: Big Data có thể được sử dụng để phân tích xu hướng thị trường, nhu cầu của khách hàng để giúp doanh nghiệp phát triển các sản phẩm, dịch vụ mới đáp ứng nhu cầu của thị trường.
  • Tăng cường trải nghiệm khách hàng: Big Data có thể được sử dụng để phân tích dữ liệu giao dịch, dữ liệu tương tác với khách hàng để giúp doanh nghiệp hiểu rõ hơn về nhu cầu của khách hàng.
  • Phát hiện gian lận: Big Data có thể được sử dụng để phân tích dữ liệu giao dịch để phát hiện các hoạt động gian lận.

Tại sao nên học Big Data ngay từ bây giờ?

1. Nhu cầu nhân lực Big Data ngày càng lớn

Big Data là một lĩnh vực đang phát triển nhanh chóng, với nhu cầu nhân lực lớn. Theo thống kê của LinkedIn, nhu cầu nhân lực Big Data trên toàn cầu sẽ tăng 29% trong vòng 5 năm tới. Tại Việt Nam, nhu cầu nhân lực Big Data cũng đang tăng lên nhanh chóng, với mức tăng trưởng hàng năm khoảng 20%.

2. Mức lương “khủng” và vẫn đang tăng hàng năm

Do nhu cầu nhân lực khan hiếm nên mức lương của những người làm trong lĩnh vực Big Data cũng rất cao. Cụ thể, theo báo cáo thị trường IT Việt Nam năm 2023 của TopDev, mức lương của các vị trí như Big Data Engineer là $1.700/tháng, Data Scientist là $2.365/tháng và ở vị trí Machine Learning /AI Engineer mức lương lên đến $2.381/tháng.

luong big data

3. Cơ hội làm việc rộng mở, không giới hạn lĩnh vực

Big Data không ràng buộc ở bất kì lĩnh vực hay ngành nghề nào. Từ kinh doanh, tài chính, sản xuất đến giáo dục, y tế, kiến trúc đều có thể ứng dụng big data. Đặc biệt, trong thời kì công nghệ 4.0, big data sẽ là chìa khóa giúp các doanh nghiệp đi xa hơn trong lĩnh vực kinh doanh của họ. Những điều này đã tạo nên lợi thế to lớn cho những ai theo đuổi ngày big data.

  5 công cụ phân tích dữ liệu Big data tốt nhất 2024

  26 công cụ và kỹ thuật trong Big Data có thể bạn chưa biết

Big Data cần học gì? Bắt đầu đâu?

Big Data là một lĩnh vực rộng lớn, bao gồm nhiều kiến thức và kỹ năng khác nhau. Vậy học Big Data bắt đầu từ đâu?

1. Bắt đầu tìm hiểu lý thuyết cơ bản về Big Data

  • Khám phá Big Data: Đọc sách, bài viết, và tài liệu trực tuyến để hiểu về khái niệm, lợi ích, và thách thức của Big Data trong thế giới ngày nay.
  • Hiểu về các cách phân tích dữ liệu lớn: Phân tích mô tả, phân tích chẩn đoán, phân tích dự đoán, phân tích quy luật,…
  • Các kiến thức tổng quát về dữ liệu: schema, database, relational, constraints,…

2. Học ngôn ngữ lập trình

ngôn ngữ lập trình big data

Ngôn ngữ lập trình là yếu tố bắt buộc phải có để bạn có thể giải quyết các bài toán liên quan đến Big Data. Bạn sẽ chọn học một vài ngôn ngữ lập trình phổ biến trong Big Data, chẳng hạn như Python, R, Java, Scala, Python, Go. Sau khi đã vững ngôn ngữ lập trình bạn sẽ tiếp tục học thêm kiến thức và kỹ năng ở các công nghệ lớn như Spark, Hadoop, NoSQL, Storm.

Xem thêm việc làm Big Data hấp dẫn trên TopDev

Một số chuyên ngành học liên quan đến Big Data

Big Data là một lĩnh vực rộng lớn, bao gồm nhiều chuyên ngành khác nhau. Dưới đây là một số chuyên ngành học liên quan đến Big Data:

  • Khoa học máy tính (Computer Science): Chuyên ngành này cung cấp nền tảng kiến thức vững chắc về các khía cạnh kỹ thuật của Big Data, bao gồm lập trình, hệ thống máy tính, mạng máy tính,…
  • Khoa học dữ liệu (Data Science): Chuyên ngành này kết hợp kiến thức từ khoa học máy tính, thống kê và các lĩnh vực khác để phân tích dữ liệu và đưa ra các kết luận có ý nghĩa.
  • Kiến trúc sư dữ liệu (Data Architect): Kiến trúc sư dữ liệu là người chịu trách nhiệm thiết kế và triển khai các giải pháp Big Data. Họ cần có kiến thức sâu về các công nghệ Big Data, cũng như các kiến thức về kinh doanh và quản trị.
  • Nhà phân tích dữ liệu (Data Analyst): Nhà phân tích dữ liệu là người chịu trách nhiệm phân tích dữ liệu để cung cấp thông tin cho các quyết định kinh doanh. Họ cần có kiến thức về thống kê, các kỹ thuật phân tích dữ liệu và các lĩnh vực liên quan.
  • Nhà quản trị dữ liệu (Data Administrator): Nhà quản trị dữ liệu là người chịu trách nhiệm quản lý các hệ thống dữ liệu. Họ cần có kiến thức về các hệ thống dữ liệu, các công nghệ Big Data và các quy định liên quan.

Ngoài ra, còn có một số công việc khác trong lĩnh vực Big Data, chẳng hạn như:

  • Kỹ sư bảo mật dữ liệu (Data Security Engineer)
  • Kỹ sư phát triển ứng dụng Big Data (Big Data Application Developer)
  • Kỹ sư học máy (Machine Learning Engineer)
  • Kỹ sư deep learning (Deep Learning Engineer)
  • Kỹ sư BI (Business Intelligence Engineer)

Tóm lại

Hy vọng bài viết trên đã giúp bạn trả lời được câu hỏi big data cần học gì và bắt đầu từ đâu. Lộ trình học Big Data mà bài viết đã đề cập chỉ mang tính chất tham khảo. Bạn có thể điều chỉnh lộ trình học phù hợp với nhu cầu và khả năng của bản thân. Đối với những người mới bắt đầu, việc học Big Data có thể là một thách thức, nhưng với một lộ trình học phù hợp, bạn có thể dễ dàng tiếp cận và hiểu sâu về lĩnh vực này. Chúc bạn thành công!

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

Xem thêm tuyển dụng IT hấp dẫn trên TopDev

Các khái niệm cơ bản về Docker cho người mới tìm hiểu

khái niệm cơ bản về Docker

Bài viết được sự cho phép của tác giả Mai Đông Giang

Docker là gì?

Docker là một nền tảng cho các developers để develop, deploy và khởi chạy ứng dụng của mình với container. Nó cho phép tạo các môi trường độc lập và tách biệt để khởi chạy và phát triển với mỗi dịch vụ trên một hoặc nhiều container khác nhau. Khi cần deploy lên bất kỳ server nào chỉ cần run container của Docker thì ứng dụng của bạn sẽ được khởi chạy ngay lập tức.

Nhờ đó chúng ta sẽ tiết kiệm được rất nhiều thời gian cho việc cài đặt môi trường. Đồng thời, các developers làm việc với nhau sẽ sử dụng thống nhất một môi trường và các hình liên quan, giúp việc teamwork trở nên đồng nhất. Docker đa phần được cài đặt và chạy trên các container nên việc gỡ các gói cài đặt hay thay đổi version,… sẽ không ảnh hưởng gì đến máy tính của bạn cả. Máy tính của bạn sẽ trở nên sạch sẽ hơn.

Vậy nên, hiện nay nhiều công ty tuyển dụng cũng chú trọng đến skill Docker như là một kỹ năng cần có cho một vị trí developer.

Sau đây là các khái niệm chính về Docker mà mình tổng hợp được. Nó sẽ giúp bạn có những hiểu biết về Docker hơn, nhất là các bạn mới bắt đầu làm quen với công cụ này.

  Share data giữa Docker Container bằng Docker Volume

  Hướng dẫn load docker image từ file tar (docker load)

Image

Là tên gói cài đặt từ Docker Hub. Khởi chạy từ Dockerfile

Container

Một vùng chứa Image đã được cài đặt. Có thể tưởng tượng nó như là một máy tính nhỏ vậy, chứa những gì mà chúng ta muốn lưu tại đó.

Network

Tạo ra một đường kết nối giữa các Container với nhau. Nếu như không được khai báo kết nối đến Network thì Container sẽ không thể giao tiếp với các Container khác trong cùng một mạng được. Tương tự như một mạng LAN giữa các máy tính với nhau.

Volumes

Nơi chứa data, mã nguồn. Có thể sync với thư mục bất kỳ nào tại máy tính chủ của chúng ta đang sử dụng.

Docker compose

Một công cụ giúp chạy build nhiều container một lần, dễ dàng và thuận tiện cho việc quản lý các Container trong một dự án.

Tham khảo việc làm Docker hấp dẫn tại TopDev

Dockerfile

Chứa các lệnh để build một docker. Các lệnh thường dùng trong Dockerfile là:

  1. FROM — chỉ định image gốc: php, unbutu, alpine…
  2. LABEL — cung cấp metadata cho image. Có thể sử dụng để add thông tin maintainer. Để xem các label của images, dùng lệnh docker inspect.
  3. ENV — thiết lập một biến môi trường.
  4. RUN — Có thể tạo một lệnh khi build image. Được sử dụng để cài đặt các package vào container.
  5. COPY — Sao chép các file và thư mục vào container.
  6. ADD — Sao chép các file và thư mục vào container.
  7. CMD — Cung cấp một lệnh và đối số cho container thực thi. Các tham số có thể được ghi đè và chỉ có một CMD.
  8. WORKDIR — Thiết lập thư mục đang làm việc cho các chỉ thị khác như: RUN, CMD, ENTRYPOINT, COPY, ADD,…
  9. ARG — Định nghĩa giá trị biến được dùng trong lúc build image.
  10. ENTRYPOINT — cung cấp lệnh và đối số cho một container thực thi.
  11. EXPOSE — khai báo port lắng nghe của image.
  12. VOLUME — tạo một điểm gắn thư mục để truy cập và lưu trữ data.

Một số lệnh sử dụng với Docker bạn cần biết:

List image/container:

$ docker image/container ls

Delete image/container:

$ docker image/container rm <tên image/container >

Delete all image hiện có:

$ docker image rm $(docker images –a –q)

List all container hiện có:

$ docker ps –a

Stop a container cụ thể:

$ docker stop <tên container>

Run container từ image và thay đổi tên container:

$ docker run –name <tên container> <tên image>

Stop all container:

$ docker stop $(docker ps –a –q)

Delete all container hiện có:

$ docker rm $(docker ps –a –q)

Show log a container:

$ docker logs <tên container>

Build một image từ container:

$ docker build -t <tên container> .

Tạo một container chạy ngầm:

$ docker run -d <tên image>
$ docker pull <tên image>

Start một container:

$ docker start <tên container>

Trên đây là những tổng hợp của mình về những khái niệm cơ bản trong Docker và những lệnh cần thiết.

Hi vọng sẽ giúp bạn hiểu hơn về Docker, có thể áp dụng cho việc lập trình của mình.

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

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

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

Tổng hợp các thuật ngữ trong Frontend bạn nhất định phải biết!

các thuật ngữ trong Frontend

Bài viết được sự cho phép của tác giả Thanh Lê

Tại sao nên đọc bài này?

  • Dành cho các bạn mới tiếp cận và thấy quá nhiều thuật ngữ mới
  • Dành cho các bạn có thể đã làm FE một thời gian rồi nhưng đôi khi vẫn không biết có một thứ như vậy tồn tại trên đời
  • Có vài keyword để tối ưu performance cho website

Các thuật ngữ phổ biến

Trong bài này mình sẽ nói về các thuật ngữ liên quan tới optimization nhé!

Code split

Hiểu một cách đơn giản thì bạn có một file code rất to, bạn chia file to đó ra thành nhiều file nhỏ thì gọi là code split.

Hoặc một ví dụ khác là bạn có một trang web build bằng React, trong đó bao gồm Header, body và Footer. Thì bạn có thể build thành một file bundle.js bao gồm cả 3 component trên hoặc cũng có thể chia cái bundle đó thành 3 file, mỗi file chứa một component.

Hãy nghĩ đơn giản code split như là bạn cắt một miếng bánh to thành nhiều miếng nhỏ.

Lazy load

Lazy load nghĩa là một cách để delay việc load một resource gì đó cho tới khi thật sự cần thiết.

Như trong Video ở trên, sẽ khá tốn resource nếu chúng ta load hình mà user chưa thực sự cần xem đúng không. Do đó, nó apply lazy load để khi nào ta gần scroll tới cái hình đó thì mới load hình về. Vừa đỡ tốn CPU cho máy user, cùng vừa đỡ tốn 3g cho người ta.

Resource ở đây bạn có thể define là mọi thứ như là

  • Một file code
  • Một cái thẻ img
  • Một thư viện
  • Một response từ API

Khi nghĩ về lazy load thì bạn cần suy nghĩ: Cái gì có thể lazy và cái gì không thể lazy. Việc chia ra những resource nào lazy load được, cái gì không thể lazy load giúp bạn có chiến thuật quản lý resource tốt hơn.

Back lại cái thuật ngữ bên trên Split code làm ví dụ nhé. Câu hỏi của bạn là cắt cái bundle bự thành nhiều bundle nhỏ để làm gì?

Câu trả lời thường là bạn cắt nó ra thành hai phần: Phần có thể lazy load được và phần không thể lazy load được.

Do đó bạn sẽ thấy khái niệm lazy load thường đi chung với split code vì lazy load cái resource code thì cần cắt nó thành nhiều chunk nhỏ hơn để hiện thực lazy load.

Về mặt lý thuyết, tất cả các resource liên quan tới interaction của user (Scroll, click, hover, press,…) đều có thể lazy load được.

  Virtualbox Headless Frontend là gì?

  Frontend cần học những gì để trở nên thật giỏi!

Prefetch/Preload

Prefetch nghĩa là bạn nói với Browser “Tao có một cái resource này nè, khi nào mày rảnh thì load trước giúp tao nhé”

Prefetch/Preload

Preload nghĩa là bạn nói với Browser “Load trước đống resource này cho tao nhé, rảnh hay không thì cũng load ”

Okey vậy khi nào thì nên dùng prefetch hay preload?

Prefetch hữu dụng khi bạn tin là user sẽ cần một số resource này trong tương lai. Mình ví dụ khi user hover vào một link nào đó, mình cũng không chắc là user sẽ thật sự click vào link này hay không, nhưng khả năng cao là có. Vì vậy nếu mình prefetch trước cái link này thì nếu user bấm thật thì nó đã được load sẵn cmnr, nên sẽ thấy trang này load nhanh vklllllllllll ⚡

Preload hữu dụng khi bạn cần những resource cực kì quan trọng cho bước render đầu tiên. Ví dụ dễ thấy nhất là Font, việc preload trước font giúp trang web của bạn render lần đầu tiên thì visual cũng ok luôn. Thay vì nếu render ra trang web mà font chưa có, sau đó load font rồi phải render lại một lần nữa. Việc thay font như vậy dễ khiến cho layout bị flick và với góc nhìn của user thì thấy nó cũng khá là bad

Tree Shaking

Bạn tưởng tượng đống code/module của bạn như một cái cây nha. Bây giờ bạn cầm cái cây đó rung mạnh thật mạnh, cái gì sẽ xảy ra? Những thành phần yếu ớt trên cái cây đó sẽ bị rơi ra như là già, cành khô, tổ chym,…

Tree Shaking

Tree shaking trong code cũng tương đương vậy, bạn loại bỏ những thứ không cần thiết trong code (dead code) một cách tự động.

Cái này giống như việc giảm “mỡ” cho bundle của các bạn, sẽ giúp load web nhanh hơn, không tốn thời gian cho những thứ không cần thiết.

Xem ngay các tin đăng tuyển dụng Front-end lương cao trên TopDev

SEO

Viết tắt của cụm từ Search Engine Optimization – Tối ưu hóa cho công cụ tìm kiếm. Hiểu đơn giản là có vô vàn website trên internet đúng không, và khi bạn search Google thì nó sẽ trả về cho bạn vào trăm hay vài triệu kết quả đó. Vậy làm sao để trang web của mình nằm ở vị trí cao hơn trong danh sách đó để nhiều user biết tới hơn?

seo

Vậy SEO là cách để tối ưu trang web giúp nó có thứ hạng cao hơn ở các công cụ tìm kiếm như Google, Bing.

Tụi Google sẽ có nhiều tiêu chí để quyết định trang web của bạn có phù hợp với user hay không như là Content, keyword, hình ảnh, tốc độ load trang, ngôn ngữ,… Do đó khi nói làm SEO nghĩa là bạn làm đủ kiểu để các tiêu chí đó tốt hơn, phù hợp với user hơn (đường nhiên là theo tiêu chí của tụi Google rồi)

Google Page Speed

Nó là cái trang này nè!

Google build ra một cài tool để đo lường tốc độ website của bạn và cho ra thang điểm từ 0 tới 100. Điểm càng cao thì chứng tỏ website của bạn “ra dẻ” load càng nhanh.

Thường cái này là một tiêu chí mà ai cũng dùng để xem coi website của bạn có đuỷnh hay không.

Mình thì thấy nó cũng tương đối tuy nhiên mọi người lại dựa vào nó quá nhiều để đánh giá một website

The fold

The fold

The fold hiểu là bạn cắt cái trang web theo chiều ngang, bên trên the fold là những gì đập vào mặt user ngay lập tức khi họ mở trang web của bạn. Những gì ở dưới thì người ta phải scroll xuống mới thấy được.

Và vì định nghĩa là những gì đập vào mặt user ngay lập tức nên khái niệm này khá là … tương đối. Vì users có thể dùng device khác nhau, to nhỏ khác nhau. Có thể đập vào mặt ở màn hình MateView 4k 27inch với màn hình Dell FullHD 24 inch nó khác nhau nên do đó the fold ở hai màn hình đó cũng khác nhau.

Tại sao cần phải phân biệt the fold? Nó giúp bạn tối ưu hơn cho user kiểu như

  • Ở trên the fold thì load càng nhanh càng tốt vì nó là thứ xuất hiện ngay lập tức khi user mở website
  • Ở dưới the fold thì có thể apply lazy load vì user phải scroll xuống mới thấy được phải không nào

CSS critical

Là một cách để trích xuất những CSS Above the fold ra riêng để tối ưu tốc độc load.

CSS critical

Nhớ vụ mình nói ở trên là optimize tối đa cho những thứ Above the fold không, thì cái này là một cách để tối ưu Above the fold. Tuy idea về việc chỉ inject CSS above the fold ra gắn vào khá là đỉnh nhưng thực tế rất rất khó làm cái này. Nên mình thấy nghe cho vui thì được :))

CSS in JS

Cái tên nó lên tất cả: Viết CSS ở JavaScript.

Mà tại sao lại không viết trong file css nhỉ?

Khi dùng CSS đồng thời kết hợp với các library, hay framework gần đầy thì nó sẽ gặp một vài vấn đề:

  • CSS là global, trong khi mình muốn component của là isolated và không bị, hoặc tạo những style lên các thành phần khác
  • Lỡ code JS hết rồi nên thôi code luôn JS hết

Vì nó viết bằng CSS nên sẽ dễ hơn khi bạn muốn làm một số thứ advance hơn với CSS như CSS extraction, critical,…

Service worker

Là một đoạn script chạy ở background, nó có thể intercept vào request và response giữa web của bạn và server, và làm một vài thứ hay ho khác (Notification, cache, sync data,…)

Service worker

Vì nó đứng ở giữa nên các bạn tưởng tượng nó như proxy cũng được, có thể thay đổi data gửi đi hay data nhận về luôn. Nên cách dùng của service worker cũng khá là sáng tạo, có thể là:

  • Mock proxy server
  • Cache lại response để biến web của các bạn trở thành offline web
  • Precache những resource cần thiết

Một key quan trọng khi nói tới Service worker là vì nó chạy dưới background nên bạn có thể làm vài thứ hay ho mà không khiến cho web của các bạn chậm đi.

Web worker

Web worker

Trước đây thì web chỉ có một luồng thực thi thôi, được gọi là Main thread. Và vì chỉ có một luồng thực thì nên nó đẻ ra một vấn đề: Khi bạn đang thực hiện một tác vụ (task) gì đó, thì các tương tác khác phải chờ cho task đó chạy xong mới chạy được.

Case thử tế là ví dụ bạn code một trang web tính lương cho nhân viên, khi có một task tính toán lương đang chạy ở dưới và nếu nó khá nặng thì lúc này user có click vào đâu thì trang web của các bạn cũng không phản hồi được (vì đang bận tính lương chết mọe rồi mà, còn bắt tao làm cái khác nữa hả????)

Do đó Web worker đẻ ra để giải quyết vấn đề trên. Nói đơn giản là cái gì tính toán nặng thì đẩy ra một thread khác, để cái thằng Main thread rảnh rỗi còn handle interaction từ user.

Hydration

Cái từ này hơi hiếm gặp nhưng khác là quan trọng và gặp phải ở hầu hết các lib support SSR.

Hydration là quá trình gắn các event listener và các node tương ứng đã được generate từ quá trình SSR.

List virtualization

List virtualization

Bạn tưởng tượng là cái web của mình là một cuộn giấy siêu dài và mình dang nhìn nò thông qua một cửa sổ nhỏ (Window). Nghĩa là mình đang nhìn một phần rất nhỏ trong cuộn giấy đó, và để nhìn hết thì các bạn phải scroll.

List virtualization là kĩ thuật chỉ render cái DOM node nằm trong cửa sổ (Window) của bạn, các thứ nằm ngoài thì bỏ nó ra khỏi DOM luôn để trình duyệt không tốn resource để take care những thứ không quan trọng.

Bạn sẽ thấy cái này rất quan trọng khi apply cho những trang web có list cực kì dài và phức tạp như là New feed của Facebook, Twitter,…

Tới đây thấy cũng khá dài rồi, kiều càng viết nó càng có thêm á , nên mình cũng không biết là còn thiếu gì quan trọng không.

Ngoài ra bạn còn muốn tìm hiểu về thuật ngữ ở mảng nào nữa (Layout, CSS, state management, …)? Comment bên dưới nhé!

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

Xem thêm:

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

Lột trần sự thật về sự phức tạp của Big Data?

Lột trần sự thật về Big Data

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

Đầu tiên phải hỏi là “Big Data là gì?“. Vậy thì hỏi tiếp “Bạn có nghe tới AI chưa?” (dễ gì mà chưa). Nếu mà có nghe nói thì bạn có biết là AI hoạt động thế nào không? Nó học được nhờ vào Big Data đó… Bạn có thể tưởng tượng nó như một mớ thông tin thiệt bự mà sẽ dươc sắp xếp như môn học Thống kê vậy, và với số mẫu thiệt lớn, AI (cũng như con người) có thể học được cách phân biệt giữa vật A với vật B.

Dông dài thì trong thời đại được thống trị bởi công nghệ, Big Data đã thầm lặng xuất hiện trong thế giới xung quanh chúng ta đã lâu rồi (nhưng mà ta không biết hoặc để ý thấy thôi). Mặc dù có vẻ như là một khái niệm phức tạp, Big Data từng ngày được dệt chặt vào cuộc sống của chúng ta, thúc đẩy những đổi mới, điều chỉnh và tối ưu lại những điều cũ.

Vậy thì trong bài đăng này, cùng mình bắt đầu hành trình để khám phá một số ứng dụng thực tế của Big Data trong những khía cạnh cuộc sống hàng ngày của chúng ta ha.

1. Trải nghiệm Mua sắm cá nhân:

Đặt Shopee chưa? Đặt TikTok Shop chưa? Đặt Lazada bao giờ chưa? Nếu có thì chắc bạn cũng thấy là “À hình như nó đang theo dõi mình hay sao ấy! Chứ làm sao mà nó lại biết mình đang mua những món đồ này?”

Nghĩ thì đáng sợ thiệt, nhưng thiệt là hong có đáng sợ hết. Tất cả đều là nhờ công của Big Data hết. Big Data đóng một vai trò quan trọng trong việc tùy chỉnh trải nghiệm mua sắm của bạn ấy. Qua việc phân tích các giao dịch mua sắm trước đây của bạn, sở thích và hành vi vào web, các sàn thương mại điện tử có thể gợi ý gần như chính xác các sản phẩm bạn đang / sẽ muốn mua. Xong rồi sau đó nó sẽ giảm giá và hoặc khuyến mãi hơn cho bạn, thì làm kiểu gì mà bạn không nhắm mắt chọn Bỏ vào giỏ hàng rồi Mua ngay (mình cũng có thế thôi haha).

vậy là nó có thật sự nghe lén mình không nhỉ

2. Định hình ngành Y Tế:

Big Data đang cách mạng hóa ngành y tế, đóng góp vào kết quả điều trị và chiến lược điều trị tốt hơn cho bệnh nhân. Sự ảnh hưởng sâu sắc của đại dịch COVID-19 đã thúc đẩy cho ứng dụng Big Data vào việc theo dõi và dự đoán khả năng lây nhiễm của virus. Ngoài ra thì nó cũng giống như việc Doctor Strange thấy trước 14 triệu mấy case trong tương lai vậy. Big Data sẽ cho mô phỏng cho mình một lượng lớn các trường hợp có thể xảy ra khi nghiên cứu và phát triển thuốc.

Về chủ đề này thì mình sẽ đào sâu vào các ví dụ cụ thể nhấn mạnh cách công nghệ này đang cứu sống và cải thiện chất lượng tổng thể của dịch vụ y tế trong 1 bài viết khác. Đón xem nhé.

3. Thư giãn từ Đầu ngón tay của bạn:

À đừng có nghĩ bậy nhen. Đầu ngón tay của bạn là chiếc điện thoại đó! Nghe “Netflix and Chill” chưa? Nếu bạn chưa biết cụm này có ý nghĩa gì thì mau mau hỏi bạn trai/bạn gái của bạn thử (rồi thử xem hehe).

Quay lại cái vụ Netflix! Thì thật ra nội dung trên Netflix đã thay đổi hành vi mà ta xem phim nữa. Đằng phía sau “back-end” ấy là các thuật toán Big Data phân tích lịch sử xem của bạn, sở thích và thậm chí là thời gian bạn dành cho những thể loại cụ thể để có thể gợi ý series hấp dẫn hơn nữa (làm bạn dán chặt vô màn hình tới 3h sáng còn chưa dứt). Bằng cách này, Netflix (hay Hulu hay những thằng làm dịch vụ truyền hình khác) đã làm giàu trải nghiệm của bạn lên gấp 2 gấp 3 lần (cũng có thể là x10 lận). Và kết quả cuối cùng là bạn sẽ sẵn sàng móc hầu bao ra trả cho các business đó để nó cho bạn lại trải nghiệm (cuối cùng vẫn là tiền)

4. Gỡ nút thắt trong vụ Kẹt xe

Một trong mấy cái ứng dụng của Big Data là việc tối ưu Giao thông. Cái này ở nước mình thì chưa triển khai mạnh. Nhưng mà ở nước ngoài thì họ đã dần áp dụng vào thực tế rồi.  Bằng cách sử dụng Big Data, hệ thống có thể dự đoán được tình trạng kẹt xe, giúp đưa ra những gợi ý tốt hơn về di chuyển. Từ đó mà giao thông cũng bớt kẹt hơn, parking cũng dễ dàng hơn. Điều này giúp cho các doanh nghiệp có thể tiết kiệm chi phí, thời gian và có thể allocate cho những chỗ cần hơn.

5. Social media lướt hoài không hết

Mặc dù là đặt sau cùng, nhưng bạn có thể thấy rất rõ ảnh hưởng của Big Data lên nội dung mà bạn thấy trên mấy trang mạng xã hội. Thử xem video, like video về con mèo đi, mình đảm bảo (và chắc chắn bạn đã thấy tương tự) là mấy chục cái video sau đó là toàn về con mèo. Đó là Big Data đó bạn! Bằng cách phân tích hành vi xem video cũng như cách mà những người có hành vi giống bạn tương tác, hệ thống có thể recommend ra những nội dung cực kỳ phù hợp, cực kỳ “bánh cuốn” với bạn.

Túm váy lại là:

Rõ ràng là Big Data không hẳn là một cái gì đó cao siêu mà chỉ dùng trong IT, hay CNTT nói chung, mà nó đã dần trở thành một phần không thể thiếu trong cuộc sống hằng ngày của chúng ta. Từ các gợi ý mua sắm cá nhân đến những đổi mới trong lĩnh vực y tế, quản lý giao thông hiệu quả và ở xa hơn, ảnh hưởng của Big Data là vô địch. Giờ thì mình ngồi đợi coi mai mốt Big Data nó sẽ tiến hóa thêm gì nữa, rồi coi có xài gì được để sếp tăng lương cho không (một nỗi buồn sâu thẳm).