Home Blog Page 58

Hướng dẫn cắt PSD toàn tập với Leospa design phần mở đầu

Hướng dẫn cắt PSD

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

Mùa đông gần đến rồi, chắc ai cũng cảm nhận được hơi lạnh của nó rồi nhỉ. Mỗi người ai cũng có cách của riêng mình để tận hưởng hơi lạnh này như đi chơi với gấu hay ở nhà đắp mền mà ngủ. Riêng với mình thì mình sẽ chia sẻ cho các bạn cách tận hưởng thời tiết mùa đông này bằng việc hướng dẫn cắt một PSD toàn tập để giúp các bạn làm ấm áp người nhé.

Không để các bạn chờ lâu, chúng ta sẽ đi nhanh vào phần khởi động. Như tiêu đề các bạn đã thấy chúng ta sẽ cắt một giao diện có tên là LeoSpa một LandingPage về Spa. Các bạn có thể xem qua hình ảnh của nó ở đây hoặc tải PSD ở đây.

# Phân tích thiết kế

Bước đầu tiên như những lần mình chia sẻ trước đó đó chính là phân tích thiết kế mà chúng ta được giao. Và mình cũng đã hướng dẫn các checklist cho các bạn luôn rồi, các bạn có thể nhấn vào đây để xem lại bài đó hoặc xem luôn ngay tại đây:

  • Màu sắc: Chúng ta có màu chủ đạo là màu san hô với mã màu là #ff817e, màu xám tối là #263a41 và màu xám sáng là #888, ngoài ra còn có màu nền trong các block là #fff9f8. Để lấy màu sắc thì các bạn chỉ cần mở thiết kế bằng Photoshop hoặc công cụ nào đó hỗ trợ việc lấy mã màu rồi lấy thôi.
  • Font chữ: Trong thiết kế này dùng 2 fonts chữ đó chính là Roboto và Rufina. Hai fonts này đều có sẵn ở Google Font nên việc dùng chúng rất là đơn giản. Chỉ việc vào Google Font chọn rồi sau đó chèn vào thẻ head của file index.html như sau
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400|Rufina:700&display=swap" rel="stylesheet">
  • Icons: Chúng ta sẽ dùng FontAwesome bằng việc Google “fontawesome cdnjs” là ra trang của Cloudflare rồi vào để lấy link sau đó cũng chèn vào thẻ head như sau
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css"/>
  • Hình ảnh: Cắt ra bằng Photoshop hoặc các công cụ hỗ trợ khác.
  • Kích thước: Design này rộng 1920px và container của nó là 1140px với Grid được chia thành 12 cột bằng nhau và grid-gap giữa các cột là 30px

Hướng dẫn cắt PSD

Về kích thước thì mình mở thiết kế lên bằng Photoshop và đo mới có kết quả như ở trên là 1920px và container là nội dung nằm ở giữa 1140px được chia thành 12 cột bằng nhau với khoảng cách giữa các cột( chỗ mũi tên màu đỏ ) là 30px. Từ đây chúng ta có thể dùng CSS Grid để chia cột, kết hợp với CSS Flexbox để dàn layout.

Container tuy là 1140px nhưng khi bắt đầu thiết lập code CSS cơ bản thì mình sẽ cho nó thêm 15px mỗi bên trái phải để nó có khoảng trống khi co lại dưới giao diện mobile, nghĩa là lúc này nó sẽ là 1170px = 1140 + 15 + 15. Chỗ 15px các bạn cho bao nhiêu tuỳ các bạn nhé, ở đây mình cho 15px là hiển thị đẹp rồi.

Mình sẽ hướng dẫn chi tiết hơn cho các bạn khi chúng ta bắt đầu vào code phần Header ở bài sau.

  Thành thạo kỹ năng CSS của bạn với bộ code cực chất

  Một vài best practice khi sử dụng Bootstrap CSS

# Các thiết lập cơ bản

Mình dùng phần mềm Visual Studio Code với Shade of Purple Theme kết hợp với font chữ Operator Mono. Các bạn dùng gì thì tuỳ các bạn nhé.

Shade of Purple

Cấu trúc thư mục đơn giản gồm có file index.html, thư mục css để chứa các file css như reset.csssetting.css và main.css .Thư mục js có file main.js để code Javascript (nếu có) và thư mục images để chứa các hình ảnh.

Thư mục js có file main.js

Xem thêm việc làm CSS lương cao trên TopDev

File reset.css để reset css ở các trình duyệt các bạn có thể Google để hiểu thêm về nó nha, file setting.css để thiết lập các đoạn code cần phải có ban đầu như dùng biến trong CSS để lưu các mã màu, font chữ, kích thước, dùng đơn vị rem và cuối cùng là file main.css để chúng ta bắt đầu code CSS trong đó. Dưới đây là đoạn code trong file setting.css

:root {
 --primary-color: #ff817e;
 --gray-dark: #263a41;
 --gray-light: #888;
 --white: white;
 --black: black;
 --bg-block: #fff9f8;
 --primary-font: "Roboto";
 --secondary-font: "Rufina";
 --wrapper: 192rem;
 --container: 117rem;
}
*,
*:before,
*:after {
 box-sizing: border-box;
}
html {
 font-size: 62.5%;
}
body {
 font-family: var(--primary-font);
 font-weight: 300;
 color: var(--gray-dark);
 background-color: var(--white);
}
img {
 display: block;
 max-width: 100%;
}
a {
 display: block;
 text-decoration: none;
}
 .wrapper {
 max-width: var(--wrapper);
 margin-left: auto;
 margin-right: auto;
}
.container {
 max-width: var(--container);
 padding-left: 1.5rem;
 padding-right: 1.5rem;
 margin-left: auto;
 margin-right: auto;
}

Mình lưu các biến lại trong :root để tiện sử dụng nhé. Nếu bạn nào chưa biết thì đọc lại bài cách dùng biến trong CSS, cũng như là đơn vị REM. Để hiểu lý do vì sao mình để font-size: 62.5% ở thẻ html.

# Tạm kết

Như vầy là xong phần khởi động đơn giản. Mình đã list ra những tài nguyên, công cụ cũng như các thiết lập đơn giản ban đầu mà chúng ta cần có để có thể code ra giao diện hoàn chỉnh ở các bài sau. Mình có đính kèm code setup cơ bản như bài hướng dẫn, các bạn có thể nhấn vào đây để tải về nhé. Hẹn gặp lại các bạn ở bài sau.

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

Xem thêm:

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

Bí mật của Virtual Method và Override

Virtual Method và Override

Bài viết được cho phép bởi tác giả Nguyễn Thái Dương

Những ai từng học lập trình hướng đối tượng OOP chắc chắn đều biết đến khái niệm nạp chồng (Override). Nhưng thông thường, ít bạn quan tâm đến việc compiler đã xử lý nó như thế nào. Phía sau hậu trường hệ thống đã làm gì để tạo nên điều kì diệu? Bài viết này hi vọng sẽ giúp các bạn có câu trả lời xác đáng nhất.

Để dễ dàng trong việc hiển thị các giá trị trong vùng bộ nhớ, tôi chọn C++. Đối với Java hay các ngôn ngữ lập trình khác, tôi tin rằng các bạn cũng có thể dễ dàng luận ra được dựa trên cơ chế của C++

Trước hết,  chúng ta cần tìm hiểu về hàm virtual. Hãy xét 1 class đơn giản sau (Giả sử ta compile cho hệ vi xử lý 64 bit). Bạn có thể copy paste vào http://cpp.sh để chạy thử:

#include <iostream> 
#include <string>

class Sample1 {
public:
    virtual void vMethod1() {
        printf("This is virtual method 1\n");
    }
    virtual void vMethod2() {
        printf("This is virtual method 2\n");    
    }
    void method2() {
        printf("This is NONVIRTUAL method 2\n");    
    }
public:
    int     member1;
    int     member2;
};

//Define method type
typedef void (*MyFunc)();

int main(int argc, const char * argv[]) {
    Sample1 *a = new Sample1();
    
    printf("size of Sample1: %d\n", sizeof(Sample1));
    
    MyFunc *virtualMethodTable = (MyFunc*)(*(MyFunc*)a);    
    virtualMethodTable[0](); //call method1
    virtualMethodTable[1](); //call method2
    
    return 0;
}

Kết quả sẽ như sau:

size of Sample1: 16
This is virtual method 1
This is virtual method 2

Yeah!!. Đến đây bạn thấy không? Chúng ta có thể call được class method mà không cần gọi thông qua instance của nó. Ta hãy thử đi phân tích cấu trúc dữ liệu 16 byte của class Sample1:

# vị trí (byte) size (bytes) field
1 0 8 con trỏ trỏ tới virtual method table (VMT)
2 8 4 member1
3 12 4 member2

Chỗ này có 1 khái niệm mới là Virtual Method Table (VMT). Vậy nó là cái gì? Virtual Method Table thực chất là một mảng các con trỏ hàm chứa địa chỉ của các hàm virtual trong class. Trong ví dụ trên sẽ là:

# Vị trí (byte) Size (bytes) Field
1 0 8 địa chỉ của vMethod1
2 8 8 địa chỉ của vMethod2

  Lỗi Could not create the Java Virtual Machine khi chạy Minecraft

  Hướng dẫn cài đặt VirtualBox trên Ubuntu chi tiết nhất

OK, có 1 điều hơi lấn cấn ở đây khi bạn sử dụng member1 trong vMethod1:

#include <iostream> 
#include <string>

class Sample1 {
public:
    virtual void vMethod1() {
        printf("This is virtual method 1\n");
        printf("member1 = %d\n", member1);
    }
    virtual void vMethod2() {
        printf("This is virtual method 2\n");    
    }
    void method2() {
        printf("This is NONVIRTUAL method 2\n");    
    }
public:
    int     member1;
    int     member2;
};

//Define method type
typedef void (*MyFunc)();

int main(int argc, const char * argv[]) {
    Sample1 *a = new Sample1();
    
    a->member1 = 1000;
    printf("size of Sample1: %d\n", sizeof(Sample1));
    
    MyFunc *virtualMethodTable = (MyFunc*)(*(MyFunc*)a);    
    virtualMethodTable[0](); //call method1
    virtualMethodTable[1](); //call method2
    
    return 0;
}

Kết quả sẽ có dạng như sau:

size of Sample1: 16
This is virtual method 1
member1 = 1268843168
This is virtual method 2

giá trị member1 là 1 giá trị không phải là 1000 như mình đã gán ở trên mà là 1 giá trị rác. Nguyên nhân là do lời gọi virtualMethodTable[0](); chỉ đơn thuần là gọi 1 đoạn code của hàm mà chưa truyền con trỏ this vào trong hàm đó (vMethod1).

Thông thường, lời gọi đúng phải là: a->vMethod1();

Giờ chúng ta sẽ tìm cách truyền con trỏ a vào cho lời gọi virtualMethodTable[0]();. Giờ ta sửa lại 1 chút:

#include <iostream> 
#include <string>

class Sample1 {
public:
    virtual void vMethod1() {
        printf("This is virtual method 1\n");
        printf("member1 = %d\n", member1);
    }
    virtual void vMethod2() {
        printf("This is virtual method 2\n");    
    }
    void method2() {
        printf("This is NONVIRTUAL method 2\n");    
    }
public:
    int     member1;
    int     member2;
};

//Define method type
//Thêm tham số thisPtr ở đây
typedef void (*MyFunc)(Sample1 *thisPtr);

int main(int argc, const char * argv[]) {
    Sample1 *a = new Sample1();
    
    a->member1 = 1000;
    printf("size of Sample1: %d\n", sizeof(Sample1));
    
    MyFunc *virtualMethodTable = (MyFunc*)(*(MyFunc*)a);    
    //Lệnh trên tương đương với:
    //    memcpy(&virtualMethodTable2, b, 8);

    virtualMethodTable[0](a); //call method1
    virtualMethodTable[1](a); //call method2
    
    return 0;
}

Giờ chạy thử nhé:

size of Sample1: 16
This is virtual method 1
member1 = 1000
This is virtual method 2

Yeah. Giờ member1 đã là 1000. Đúng với giá trị chúng ta truyền vào. Giờ chúng ta thử fake lại cách 1 instance được tạo ra từ 1 class theo cách không dùng class nhé:

#include <iostream>
#include <string>

class Sample1 {
public:
    virtual void vMethod1() {
        printf("This is virtual method 1\n");
        printf("member1 = %d\n", member1);
    }
    virtual void vMethod2() {
        printf("This is virtual method 2\n");    
    }
    void method2() {
        printf("This is NONVIRTUAL method 2\n");    
    }
public:
    int     member1;
    int     member2;
};

//Define method type
//Thêm tham số thisPtr ở đây
typedef void (*MyFunc)(Sample1 *thisPtr);

struct ClassDesc {
    MyFunc* vmt;
    int     member1;
    int     member2;
};

void fakeVMethod1(ClassDesc* thisPtr) {
    printf("fake virtual method1 - member1: %d\n", thisPtr->member1);
    
}

void fakeVMethod2(ClassDesc* thisPtr) {
    printf("fake virtual method2 - member2: %d\n", thisPtr->member2);
    
}

void constructor(ClassDesc* desc) {
    //Init virtual method table
    desc->vmt = new MyFunc[2];
    desc->vmt[0] = (MyFunc)&fakeVMethod1;
    desc->vmt[1] = (MyFunc)&fakeVMethod2;
}

void destructor(ClassDesc* desc) {
    //delete virtual method table
    delete []desc->vmt;
}

int main(int argc, const char * argv[]) {
    Sample1 *a = new Sample1();
    
    a->member1 = 1000;
    printf("size of Sample1: %d\n", sizeof(Sample1));
    
    MyFunc *virtualMethodTable = (MyFunc*)(*(MyFunc*)a);    
    
    virtualMethodTable[0](a); //call method1
    virtualMethodTable[1](a); //call method2
    
    printf("\n--------------FAKE CLASS----------------\n\n");
    
    
    ClassDesc* clsDesc = new ClassDesc(); //   |
    constructor(clsDesc);                 //   | <=>  a = new Sample1();
    
    clsDesc->member1 = 2000;
    clsDesc->member2 = 3000;
    
    Sample1* b = reinterpret_cast<Sample1*>(clsDesc); // cast Class Description struct to Sample1*
        
    b->vMethod1();
    b->vMethod2();
        
    destructor(clsDesc);        //
    delete clsDesc;             //  <=> delete b;
    
    return 0;
}

Kết quả:

size of Sample1: 16
This is virtual method 1
member1 = 1000
This is virtual method 2 ————–FAKE CLASS—————-
fake virtual method1 – member1: 2000
fake virtual method2 – member2: 3000

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

Đến đây chúng ta ít nhiều đã hình dung ra được cách C++ tổ chức dữ liệu trong một class như thế nào. Giờ chúng ta sẽ cùng tìm hiểu xem cách mà C++ override một method trong Class như thế nào:

#include < iostream >
#include < string >
#include < cstring >
class Sample1 {
public:
    virtual void vMethod1() {
        printf("This is virtual method 1\n");
        printf("Sample1: member1 = %d\n", member1);
    }
    virtual void vMethod2() {
        printf("Sample1: This is virtual method 2\n");    
    }
    void method2() {
        printf("This is NONVIRTUAL method 2\n");    
    }
public:
    int     member1;
    int     member2;
};

class  Sample2: public Sample1 {
public:

    //override vMethod1()
    virtual void vMethod1() {
        printf("Sample2: This is virtual method 1\n");
    }
    virtual void vMethod3() {
        printf("Sample2: This is virtual method 3\n");
    }
};


//Define method type
//Thêm tham số thisPtr ở đây
typedef void (*MyFunc)(Sample1 *thisPtr);

int main(int argc, const char * argv[]) {
    Sample1 *a = new Sample1();
        
    MyFunc *virtualMethodTable = (MyFunc*)(*(MyFunc*)a);    
    Sample2 *b = new Sample2();    
    
    MyFunc* virtualMethodTable2;
    memcpy(&virtualMethodTable2, b, 8);
    
        
    printf("\n\n");
    printf("Sample1 - vMethod1 Addr: %p\n", virtualMethodTable[0]);
    printf("Sample1 - vMethod2 Addr: %p\n", virtualMethodTable[1]);
    
    printf("--------------------------------\n");
    printf("Sample2 - vMethod1 Addr: %p\n", virtualMethodTable2[0]);
    printf("Sample2 - vMethod2 Addr: %p\n", virtualMethodTable2[1]);
        
    return 0;
}

Kết quả:

Sample1 – vMethod1 Addr: 0x400980
Sample1 – vMethod2 Addr: 0x400950 ——————————–
Sample2 – vMethod1 Addr: 0x400970
Sample2 – vMethod2 Addr: 0x400950

Chúng ta thấy ngay, Class B được override method1 nên địa chỉ của vMethod1 trong VMT của b khác với của a, trong khi vMethod2 thì giống hết nhau vì không bị override.

Ta có thể fake lại việc override một cách đơn giản như sau:

#include <iostream>
#include <string>

class Sample1 {
public:
    virtual void vMethod1() {
        printf("This is virtual method 1\n");
        printf("member1 = %d\n", member1);
    }
    virtual void vMethod2() {
        printf("This is virtual method 2\n");    
    }
    void method2() {
        printf("This is NONVIRTUAL method 2\n");    
    }
public:
    int     member1;
    int     member2;
};

//Define method type
//Thêm tham số thisPtr ở đây
typedef void (*MyFunc)(Sample1 *thisPtr);

struct ClassDesc {
    MyFunc* vmt;
    int     member1;
    int     member2;
};

void fakeVMethod1(ClassDesc* thisPtr) {
    printf("fake virtual method1 - member1: %d\n", thisPtr->member1);
    
}

void fakeVMethod2(ClassDesc* thisPtr) {
    printf("fake virtual method2 - member2: %d\n", thisPtr->member2);
    
}

void constructor(ClassDesc* desc) {
    //Init virtual method table
    desc->vmt = new MyFunc[2];
    desc->vmt[0] = (MyFunc)&fakeVMethod1;
    desc->vmt[1] = (MyFunc)&fakeVMethod2;
}

void destructor(ClassDesc* desc) {
    //delete virtual method table
    delete []desc->vmt;
}


void override_fakeVMethod1(ClassDesc* thisPtr) {
    printf("override fake virtual method1 - member1: %d\n", thisPtr->member1);
    
}

void constructor_Extend(ClassDesc* desc) {
    constructor(desc);
    desc->vmt[0] = (MyFunc)&override_fakeVMethod1;
}

int main(int argc, const char * argv[]) {
    Sample1 *a = new Sample1();
    
    a->member1 = 1000;
    printf("size of Sample1: %d\n", sizeof(Sample1));
    
    MyFunc *virtualMethodTable = (MyFunc*)(*(MyFunc*)a);    
    
    virtualMethodTable[0](a); //call method1
    virtualMethodTable[1](a); //call method2
    
    printf("\n--------------FAKE CLASS----------------\n\n");
    
    
    ClassDesc* clsDesc = new ClassDesc(); //   |
    constructor(clsDesc);                 //   | <=>  a = new Sample1();
    
    clsDesc->member1 = 2000;
    clsDesc->member2 = 3000;
    
    Sample1* b = reinterpret_cast<Sample1*>(clsDesc); // cast Class Description struct to Sample1*
        
    b->vMethod1();
    b->vMethod2();
        
    destructor(clsDesc);        //
    delete clsDesc;             //  <=> delete b;
    
    
    printf("\n--------------FAKE INHERITANCE CLASS----------------\n\n");
    
    ClassDesc* clsDesc2 = new ClassDesc(); //   |
    constructor_Extend(clsDesc2);                 //   | <=>  a = new Sample1();
    
    clsDesc2->member1 = 2000;
    clsDesc2->member2 = 3000;
    
    b = reinterpret_cast<Sample1*>(clsDesc2); // cast Class Description struct to Sample1*
        
    b->vMethod1();
    b->vMethod2();
        
    destructor(clsDesc2);        //
    delete clsDesc2;             //  <=> delete b;
    
    return 0;
}

Kết quả:

size of Sample1: 16
This is virtual method 1 member1 = 1000
This is virtual method 2

————–FAKE CLASS—————-

fake virtual method1 – member1: 2000
fake virtual method2 – member2: 3000

————–FAKE INHERITANCE CLASS—————-

override fake virtual method1 – member1: 2000
fake virtual method2 – member2: 3000

Yeah. Ta thấy ngay khi gọi b->vMethod1() thì hàm override_fakeVMethod1 được gọi. Vậy là chúng ta đã thực hiện thành công việc override hàm method.

Bài viết này hi vọng mang đến cho các bạn 1 cái nhìn rõ hơn về khía cạnh cài đặt của virtual method và override – cái mà trình biên dịch đã che dấu khỏi developer. Chúng ta sẽ cùng nhau tìm hiểu những điều thú vị khác nằm sâu bên trong chương trình để hiểu rõ hơn cách thức mà máy tính hoạt động đằng sau những dòng code của bạn.

Xin cảm ơn và hẹn gặp lại!

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

5 xu hướng của ngành kiểm thử tự động trong năm 2024

kiểm thử tự động
5 xu hướng của ngành kiểm thử tự động trong 2021

Các nội dung được chia sẻ sẽ mang đến cho người đọc một cái nhìn tổng quan hơn về bối cảnh cũng như xu hướng của ngành kiểm thử tự động trong giai đoạn hiện tại và tương lai.

Về diễn giả

  • Anh Thanh Lê hiện đang là Delivery Manager tại LogiGear.
  • Anh đã có 9 năm làm việc trong ngành kiểm thử phần mềm.
  • Công việc hiện tại khá đa dạng các nhiệm vụ khác nhau như xây dựng mối quan hệ với khách hàng, quản lý chất lượng dự án và quản lý con người, tham gia đào tạo nguồn nhân lực cho công ty thông qua các lớp kiểm thử tự động, tham gia viết các bài báo chia sẻ kinh nghiệm sử dụng công cụ kiểm thử tự động.

Tất cả các kinh nghiệm được chia sẻ hôm nay đều dựa trên kinh nghiệm làm việc và ý kiến khách quan của mình. Bên cạnh đó, mình đã tham khảo nhiều nghiên cứu về lĩnh vực kiểm thử phần mềm tại LogiGear để đi tới một số kết luận này.

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án

Digital Transformation – Chuyển đổi số

Có thể bạn đã nghe qua nhiều cụm từ như “chính phủ điện tử”, “thành phố thông minh”, “ngân hàng điện tử”, “chatbot”, “ứng dụng dịch vụ đám mây”… Tất cả những thuật ngữ này đều là bước đi của những quốc gia, công ty nhằm mục đích chuyển đổi số.

Vậy chuyển đổi số là gì?

Nói một cách dễ hiểu, chuyển đổi số là quá trình mà thông qua việc sử dụng những công cụ, ứng dụng khoa học kỹ thuật để thay thế hoặc cải thiện những công việc chưa được ứng dụng khoa học kỹ thuật hoặc những công việc đòi hỏi nhiều công sức của con người. Covid-19 là một nhân tố thúc đẩy sự phát triển mạnh mẽ của chuyển đổi số trong 2 năm gần đây.

Một điều chắc chắn là kinh tế thế giới bị ảnh hưởng rất rõ rệt trong suốt đại dịch này nên việc cắt giảm chi phí hoạt động, ngân sách, nguồn nhân lực là việc không thể tránh khỏi ở rất nhiều công ty. Tuy nhiên, chất lượng dịch vụ là thứ không thể cắt giảm, vậy làm thế nào để sống sót được qua đại dịch và cạnh tranh với thị trường?

Câu trả lời chính là chuyển đổi số.

Thực hiện việc tự động hóa nhiều hơn, chúng ta có thể viết nên những chương trình, những ứng dụng mà qua đó máy móc sẽ làm việc để giảm bớt chi phí và nhân lực mà công ty cần có để hoạt động. Chuyển đổi số phụ thuộc rất nhiều vào khoa học kỹ thuật, nhiều ứng dụng ra đời với mục đích chuyển đổi số. Là một tester, một dev, công việc của mình sẽ nhiều hơn, có nhiều cơ hội việc làm hơn trong thời đại chuyển đổi số này.

DevOps, Continuous Testing, CI/CD

DevOps

Điều đầu tiên khi nhắc đến DevOps được nhiều người nghĩ chính là rất nhiều các công nghệ và công cụ cần phải đào sâu nghiên cứu, điều này đúng nhưng chưa đủ. DevOps giống như Agile mà không phải là một công cụ hay một process, nó là một văn hóa làm việc.

Văn hóa này đề cao sự gắn kết giữa team phát triển phần mềm và team vận hành sản phẩm khi đưa ra thị trường. QA hiện nay vẫn đóng vai trò rất quan trọng trong việc phát triển phần mềm cho dù các công ty, các dự án đang apply những dự án như thế nào.

QA sẽ góp phần đưa ra những quyết định như việc sản phẩm này có được đưa ra thị trường hay không. Khi làm việc trong team thuần về Devops, QA có thể vô tình trở thành điểm nghẽn cho sự phát triển và đưa sản phẩm ra thị trường. Làm sao để có thể hoàn thành công việc một cách liên tục, không gây ảnh hưởng đến team phát triển phần mềm cũng như ngăn cản việc phải chờ đợi feedback từ QA mới có thể cho sản phẩm ra thị trường?

Tham khảo các vị trí tuyển dụng DevOps lương cao tại Topdev

Continuous Testing

Phương thức kiểm thử mới Continuous testing bắt buộc bạn phải tìm ra một cách nào đó để kiểm thử sớm hơn trước khi sản phẩm được đưa ra thị trường cũng như có thể kiểm thử thường xuyên hơn. Để áp dụng continuous testing vào trong quá trình kiểm, yêu cầu chúng ta phải tự động hóa luôn quá trình kiểm thử.

Chẳng hạn như khi sắp có một bản phát hành mới thì đội ngũ tester cần tham gia kiểm thử sản phẩm đó để đưa ra feedback cho đội ngũ phát triển phần mềm. Nếu team dev release sản phẩm vào lúc khuya chẳng hạn, thì việc QA có thể thức để chờ có sản phẩm và test sẽ khá khó khăn. Công việc này đòi hỏi yếu tố quan trọng là tự động hóa – tự động hóa những công việc mà tester cần phải làm khi muốn đưa ra phản hồi về chất lượng sản phẩm.

Nói một cách dễ hiểu là bạn phải dùng những chương trình để tự động hóa việc mô phỏng lại những thao tác mà tester sẽ làm khi kiểm thử một ứng dụng nào đó.

CI/CD

Thông qua đó, chúng ta sẽ để cho những hệ thống CI/CD vận hành và tự động chạy những automatic test mỗi khi có một sản phẩm mới cần đưa ra thị trường. Việc này hoàn toàn không gây nên gánh nặng gì cho testing mà còn giải phóng testing khỏi những công việc lặp đi lặp lại.

Nhờ vậy đội ngũ testing sẽ có nhiều thời gian hơn để tập trung vào những loại hình kiểm thử cần kinh nghiệm và khả năng sáng tạo của con người mà máy không thể nào thay thế được.

Có một số tools bạn có thể sẽ gặp khi sử dụng DevOps hay Continuous Testing bên dưới mà bạn có thể tìm hiểu:

kiểm thử tự động

Robotic Process Automation (RPA) – Tự động hóa quy trình bằng robot

Đây là xu hướng vẫn còn khá mới mẻ với cộng đồng công nghệ thông tin tại Việt Nam. RPA là một cơ hội mới trong mảng Công nghệ thông tin.

RPA thực chất là tập hợp những chương trình được lập trình sẵn và thông qua đó mô phỏng lại những thao tác mà người dùng thường xuyên thực hiện trên một ứng dụng.

Thông qua những chương trình được lập trình sẵn như vậy, RPA giúp nâng cao năng suất hoạt động của nhân viên, giảm thiểu các rủi ro và sai sót trong quá trình làm việc.

Kiểm thử tự động là quá trình mô phỏng lại những thao tác của testers và đưa ra các phản hồi về chất lượng sản phẩm. Trong khi đó, RPA cũng tương tự vậy, nó cũng mô phỏng lại những thao tác mà người dùng sẽ làm trên các ứng dụng như trích xuất dữ liệu từ một file PDF và nhập vào một chương trình hay lấy thông tin từ một website và tạo ra báo cáo chẳng hạn.

Bước khởi đầu của cả hai khá giống nhau nhưng mục đích của RPA là để thay thế con người làm những công việc mang tính chất có quy tắc, lặp đi lặp lại, phải xử lý nhiều dữ liệu thì RPA là lĩnh vực mới sẽ phát triển tại Việt Nam trong thời gian tới.

Ngoài việc giống với automation testing, rất nhiều cơ quan tổ chức đang chuyển mình trong thời đại chuyển đổi số này và thông qua đó họ muốn nâng cao năng lực hoạt động của công ty. Do đó có thể thấy automation chắc chắn là một yếu tố rất quan trọng trong hiện tại và cả tương lai. RPA sẽ trở thành nhân tố chính ảnh hưởng đến sự thành bại của các bước đi trong suốt quá trình chuyển đổi số.

kiểm thử

Theo dự đoán của Gartner, trong năm 2022, doanh thu từ việc sản xuất ra các công cụ RPA trên toàn cầu có thể lên tới khoảng 2 tỉ USD. Đây là một con số khá lớn cho thấy “mảnh đất” này thật sự màu mỡ và rất đáng để chúng ta thử sức. Vì vẫn còn khá mới nên nếu muốn thử sức với RPA thì sẽ phải bắt đầu từ đâu?

May mắn là những công ty phát triển các công cụ RPA đã biết được điều đó và đưa ra các chương trình về đào tạo, sử dụng tools cũng như các chương trình giúp hiểu hơn về RPA cũng như cách tổ chức một dự án RPA sẽ như thế nào.

More IoT và AI testing

Các thiết bị IoT ngày nay xuất hiện ở khắp mọi nơi và nhiều lĩnh vực khác nhau. Theo báo cáo của Gartner vào năm 2020, trên thế giới sẽ có khoảng 30 tỷ thiết bị IoT. Điều này đồng nghĩa với việc những ứng dụng được tạo ra nhằm quản lý và sử dụng các thiết bị IoT sẽ rất nhiều. Dẫn đến kết quả tất yếu là công việc trong ngành này cũng sẽ ngày càng nhiều hơn cả về mặt chất lượng và số lượng.

Nhưng có một thử thách lớn đó là việc kiểm thử hệ thống IoT hoặc các hệ thống kiểm thử có tích hợp IoT thì không hề đơn giản. Nó đòi hỏi chúng ta phải nghiên cứu để tìm ra những hướng đi mới, cách đi mới để có thể test một cách toàn diện hệ thống mới này.

Theo tìm hiểu của mình, để test một hệ thống tích hợp AI sẽ cần có 4 điểm chính. Trong đó, data và giải thuật là 2 yếu tố đầu tiên quyết định chất lượng của ứng dụng AI, chất lượng của sản phẩm sẽ phụ thuộc vào chất lượng dữ liệu mà chúng ta dùng để train và kiểm thử hệ thống AI. Trong giải thuật sẽ có rất nhiều libraries được đưa ra trên internet đã tích hợp sẵn giải thuật trước đó.

Các hệ thống AI có sự kết hợp của rất nhiều libraries, nhiều giải thuật khác nhau để tạo ra một hệ thống AI hoàn chỉnh. Vì thế chúng ta không thể xem nhẹ việc test giải thuật của ứng dụng AI. Sau khi chương trình đã chạy được rồi, bạn sẽ còn cần phải quan tâm đến hiệu suất và tính bảo mật của chương trình.

số liệu

Yếu tố cuối cùng, khi một hệ thống IoT hoặc một thiết bị AI được tạo ra chắc chắn sẽ không chỉ sử dụng với một chương trình cụ thể nào hết mà có thể được tích hợp, liên kết với rất nhiều chương trình, thiết bị khác mà một người tester phải xem xét và kiểm thử những hệ sinh thái xung quanh chương trình mà chúng ta đang phát triển.

TOP các việc làm lập trình AI hấp dẫn

Sự phát triển của các công cụ kiểm thử tự động

Flaky test là một trong những khó khăn với bất cứ ai làm trong ngành kiểm thử tự động. Đó là test của những chương trình đã viết rồi nhưng đôi lúc lại gặp thất bại một cách khá đột ngột và không thể lường trước được. Đó có thể là những lỗi sai xảy ra do sự thay đổi nhỏ trên giao diện ứng dụng chẳng hạn.

Khi nhập môn kiểm thử tự động, các tester sẽ biết được cách định vị những controls, locate elements và sử dụng các công cụ, các chương trình để tương tác với controls đó. Chẳng hạn như khi làm việc với Selenium thì sẽ có rất nhiều các kỹ thuật khác nhau để locate elements như sử dụng ID, name, CSS, xpath,…

Nhưng đa số trong các dự án mình đã tham gia mọi người đều chọn xpath vì nó rất hiệu quả trong việc giúp định vị những controls không có các attribute cụ thể nào cả.

Selenium

Điều đó dẫn đến các xpath đã được generate ra sẽ trở nên khá khó để có ai khác sau này, khi họ tiếp tục dự án có thể đọc và hiểu được. Vì lí do đó nên 4 versions đang được phát triển của Selenium đã đưa ra một feature mới là Relative Locators.

Relative Locators cho phép tìm kiếm và locate những elements thông qua các phương hướng. Rõ ràng Selenium là tool đang được sử dụng rộng rãi và hi vọng rằng trong version 4 của Selenium Webdriver sẽ có nhiều features hỗ trợ giảm thiểu việc tốn quá nhiều thời gian để tạo automation script.

Cypress

Bên cạnh đó cũng có những thương hiệu gần đây được biết đến khá nhiều như Cypress – một automation tool có cách hoạt động trái ngược hoàn toàn với Selenium Webdriver. Thay vì tương tác trực tiếp với browser thì nó sẽ chạy bên trong trình duyệt, có thể nắm bắt tất cả các traffic đi ra và đi vào trong ứng dụng.

Protractor cũng là một tool khác dựa trên Selenium Webdriver, hỗ trợ giảm bớt công việc khi build các dự án để kiểm thử tự động những ứng dụng được build bằng Angular.

Puppeteer

Puppeteer chú trọng đến việc cho phép test trên các headless browser. Một điều dễ dàng nhận ra trong các dự án kiểm thử phần mềm là trong một team không phải ai cũng biết code và code tốt, nhưng khi đã chuyển dự án qua kiểm thử tự động thì bắt buộc bạn phải dành thời gian để học thêm về lập trình và cách sử dụng những tools mình sẽ dùng để mô phỏng các thao tác của một tester.

Trên thị trường hiện nay đã có nhiều tools ra đời với mục đích giảm thiểu thời gian coding, tạm gọi là những feature record and playback. Các công cụ này sẽ ghi nhớ lại các thao tác đã làm trên ứng dụng và tự động generate ra những đoạn script mà bạn có thể sử dụng để chạy lại. Selenium IDE là công cụ khá quen thuộc cho phép bạn làm chuyện này. Ngoài ra còn có TestArchitectGondola.

Một vấn đề khác khá thú vị trong việc phát triển các tools kiểm thử tự động đó là tích hợp hệ thống trí thông minh nhân tạo vào quá trình kiểm thử phần mềm. Có một viễn cảnh tươi sáng được vạch ra, đó là khi đưa một ứng dụng đang phát triển cho một chương trình kiểm thử tự động tích hợp AI thì nó sẽ tự động test tất cả mọi thứ và trả về feedback.

Có những công ty tiên phong trong việc tích hợp AI vào công cụ kiểm thử tự động ví dụ như Applitools – là một phần mềm tích hợp AI giúp tester test các giao diện của web application một cách đơn giản và hiệu quả nhất. Applitools sẽ tự động dùng AI định vị những vấn đề mà ứng dụng cần cải thiện hoặc những bugs có thể xảy ra trong suốt quá trình. Testim là một tool khác đang tập trung phát triển hệ thống AI phục vụ cho functional testing, test các features ứng dụng nhiều hơn test về giao diện.

Đây là 2 công cụ đang rất phát triển và có tiềm năng phát triển trong các dự án. Chẳng hạn như có thể kết hợp Applitools vào Selenium framework để kết hợp giữa kiểm thử tự động với những chức năng của ứng dụng cũng như kiểm thử tự động các bug về giao diện có thể có trong ứng dụng.

Top 5 tips and tricks hot nhất của JavaScript năm 2024

tip cho javascript
Top 5 tips and tricks hot nhất của JavaScript năm 2021

Tác giả Filip

Mở đầu

Dưới đây tôi sẽ chia sẻ với các bạn top 5 tip cho JavaScript tốt nhất, hữu ích nhất khi làm việc mà tôi rút ra được sau quá trình làm việc với vai trò là một Software Engineering.

1. Lọc ra những value duy nhất trong cùng một array

Tip cho JavaScript đầu tiên bạn cần thiết lập một array và tạo cho nó những value khác nhau, phụ thuộc vào mục đích coding của bạn. Sau đó hãy bắt đầu khai thác các value duy nhất từ array này bằng cách sử dụng lệnh Const filtered array để cho tất cả các value còn lại vào trong một tập hợp array mới.

Tiếp theo sử dụng lệnh console.log(filteredArray)màn hình kết quả sẽ xuất hiện một terminal và chạy node tricks.js sẽ lọc được các value phức tạp. Bằng cách này, bạn không chỉ áp dụng lọc value duy nhất cho một array mà có thể áp dụng với mọi objects, array đang thực hiện.

2. Short – circuit evaluation

Đây là mẹo làm việc được tôi áp dụng bất cứ khi nào coding bằng ngôn ngữ JavaScript, if – else statement. Đây không phải là kỹ thuật mới lạ với các dev đang làm việc bằng ngôn ngữ lập trình JavaScript, nhưng làm sao để nó trông thật sự ngắn gọn và chỉ nằm trong một dòng mà thôi thì phải áp dụng đến kỹ thuật short – circuit evaluation.

Chẳng hạn ta viết code để tìm ra số có giá trị bé hơn 5 như sau constant number = 5, xuất hiện 2 trường hợp if number < 5 ? console.log(‘Hello :)’) : console.log(‘Bye :(‘);
Khi cho lệnh này chạy nó sự sẽ xuất hiện kết quả như bạn đã code mà dòng code không hề dài dòng chút nào.

tips for javascript
Các tips cho javascript developer

3. Chuyển đổi floats thành số nguyên

Với tip này, bạn có thể áp dụng với cả số dương và số âm đều không quá khó khăn. Ví dụ console.log(24.6), yêu cầu là cần chuyển đổi float này thành một số nguyên, bạn chỉ cần vẽ một đường thẳng đứng là số 0 và nó sẽ tự động chuyển đổi sang số nguyên.

Nếu giá trị cung cấp là số âm kết quả sẽ được làm tròn số lên còn số dương sẽ ngược lại.

Tuyển dụng Javascript nhiều công ty HOT

Do đó có thể hiểu một cách đơn giản là với bất kỳ float nào bạn cung cấp nó sẽ chỉ xóa đi những giá trị phía sau vị trí thập phân và để lại một số nguyên. Do đó đây được xem là một cách khá hữu ích để làm việc cho những trường hợp đặc biệt mà bạn chỉ cần số nguyên.

4. Lấy value cuối cùng của một array

Tôi đã làm việc với array rất nhiều lần kể từ khi bắt đầu công việc của mình, từ việc cố gắng tìm ra value cuối cùng, tính toán cũng như làm rất nhiều thứ phức tạp khác gắn liền với JavaScript. Đầu tiên bạn cần khai báo một constant array, cho nó một array số nguyên, dùng console.log(array) để thực hiện. Bạn slice the array (-1), sau đó print value cuối cùng, tương tự như thế bạn có thể thực hiện với bất kỳ số nào.

  10 tip tối ưu code trên JavaScript mà web developer nào cũng nên biết
  10 trình quản lý file hàng đầu trong JavaScript

5. Thiết lập biến có điều kiện

Giả sử tình huống khách hàng cần đăng ký họ tên cho dịch vụ và họ có cả nickname, điều đặc biệt là họ thích nickname của họ hơn tên chính của mình nên họ không (hoặc không muốn) cung cấp tên thật. Trong trường hợp này bạn sẽ tiến hành coding const user nếu muốn chỉ định tên đăng nhập là name user hoặc const nickname để sử dụng nickname làm tên đăng nhập. Sau đó sử dụng console.log(loginName) kết quả hiển thị tên thật của user.

Trong trường hợp khách hàng không cung cấp tên chính thì lúc này nickname có thể được sử dụng luôn.

Hi vọng các thông tin về tip cho JavScript sẽ cung cấp thêm cho bạn một số mẹo làm việc hữu ích với JavaScript. Giúp các dev tối ưu thời gian và hiệu quả làm việc.

Thông tin gốc được đăng tải tại đây

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

Xem thêm việc làm lập trình viên đãi ngộ tốt trên TopDev

2024 tới rồi – Dưới đây là 5 startup tech trend sẽ phát triển

startup tech trend

Kết thúc năm 2023 đầy biến động của thị trường công nghệ, dưới đây là 5 startup tech trend được dự báo sẽ phát triển bùng nổ năm 2024.

Riêng đối với thị trường trong nước, khi mà Bất động sản thì kéo đáy, Chứng khoán thì đỏ sàn. Dòng tiền nhàn rỗi dự báo sẽ tiếp tục được đầu tư mạnh vào phần mềm và số hoá. Trong bài viết này, tất nhiên scope không chỉ trong nước, tech trend này được dự báo là xu hướng và sẽ phát triển mạnh vào năm 2024. Năm nay đánh dấu là năm toàn thế giới bước ra khỏi đại dịch covid, là một năm hi vọng các hoạt động kinh doanh sẽ quay trở lại, nhộn nhịp như thường lệ.

Không thể phủ nhận nền kinh tế nói chung và ngành công nghệ nói riêng vẫn là một năm khó khăn. Năm vừa qua, ngành IT có vô vàn sự biến đổi mạnh mẽ, năm mà các big four đua nhau sa thải hoặc cắt giảm nhân viên. Thị trường công nghệ liên quan tới IT (bao gồm cả phần mềm và phần cứng) vẫn đua nhau phát triển, nhu cầu tuyển dụng lập trình viên IT vẫn ở mức cao.

Mặc cho đống khó khăn chất đống và dồn dập, vẫn có nhiều startup tech trend được dự báo là sẽ nhảy vọt, cơ hội cũng từ đó mà mở ra.

Lan man rồi, giờ mời anh em bà con cùng điểm qua 5 startup tech trend.

1. Superapps

Dành cho anh em chưa có khái niệm gì về super app.

A superapp is defined as an application that provides users with multiple features with independently created mini-apps all piled into one.

Superapp được định nghĩa là ứng dụng cung cấp cho người dùng nhiều các tính năng mà trong đó mỗi tính năng là một ứng dụng độc lập, tất cả được gộp lại trong một

Riêng anh em đọc bài này tui xin mạnh dạn hỏi cách đây mấy ngày, mấy giờ, mấy phút anh em vừa lướt qua shopee, tiki hoặc lazada. Tất cả những app liệt kê phía trên mà anh em vừa lướt đều là super app. Nơi mà anh em có thể đặt đồ ăn, mua vé máy bay, thanh toán tiền điện, vân vân và mây mây.

super app

Xu hướng về superapp dự kiến sẽ tiếp tục phát triển mạnh hơn nữa trong năm 2024, giải thích tại sao superapps lại nghiễm nhiên nằm vị trí đầu tiên trong danh sách top 5 startup tech trend.

  Mobile native là gì? Vì sao nên phát triển mobile app bằng Native

  Công nghệ nào đã làm thay đổi cả thế giới? Phần #1

1.1 Điều tất yếu

Việc xây dựng super app là điều bắt buộc khi mà xu hướng người dùng hiện nay muốn tất cả được xử lý chỉ trong một ứng dụng mà họ cài đặt. Xu hướng người dùng là một chuyện, bài toán dành cho các doanh nghiệp là hiện nay có rất nhiều ứng dụng chạy độc lập.

Trong khi việc gom lại tất cả trong một thường là lựa chọn tối ưu. Điển hình như ông thần Uber. Ứng dụng Uber là để đặt xe, tất nhiên anh em biết, nhưng ngoài Uber còn có Uber Eats. Ông eats này tương tự như shopee foods bên mình, nhưng chưa được hợp nhất.

startup tech trend

Đối thủ cạnh tranh với Uber ở khu vực Đông Nam Á là Grab, grab hợp nhất trong một super apps. Bao gồm các app nhỏ sau:

  • Đặt xe
  • Giao đồ ăn
  • Bác sĩ
  • Bảo hiểm

Danh sách này chưa phải là đủ. Nhưng nó cho thấy super apps chắc chắn là một hướng đi tốt. Nhu cầu của người dùng thì càng ngày càng nhiều, nhưng không gian cài app thì có giới hạn.

2. Thực tế ảo Metaverse

Dù cho muôn vàn khó khăn ập tới vơi Facebook nhưng ông Mark nhà chúng ta có vẻ là không bỏ cuộc. Mà cái nhìn nhận của ông về vũ trụ thực tế ảo cũng không phải là không có lý.

startup tech trendQuảng cáo thì thôi, đẹp khỏi bàn.

Cho dù là ý tưởng xa vời nhưng chắc chắn vẫn còn nhiều slot cho các công ty muốn tham gia vào thực tế ảo. Sớm muộn gì thì con người cũng sẽ được trải nghiệm thực tế ảo. Năm 2024 dự đoán là năm sẽ có những bước tiến nhảy vọt về thực tế ảo.

Phiên bản ông Mác Zu Cơ Bước tạo ra có thể không phải xuất sắc. Nhận được mưa lời chê nhưng thực tế ảo đang cho thấy tiềm năng phát triển rộng mở.

startup tech trend

Chính vì vậy, metaverse được ưu tiên nằm thứ hai trong danh sách top 5 startup tech trend.

Tham khảo việc làm Back-end HOT nhất trên TopDev

3. Cyber security — API security + Work-From-Home

Rồi nội cái tiêu đề không là 2 chữ security rồi. Năm 2022 là một năm cảnh tỉnh chúng ta về an ninh mạng. Rất rất nhiều sự cố, vấn đề bị rò rỉ do bảo mật.

3.1 Work from home

Ngoài phát triển phần mềm cơ bản, năm 2022 còn đánh dấu sự phát triển vượt bậc của IoT, trí tuệ nhân tạo. Các thiết bị ngày nay đòi hỏi bảo mật cần ở cấp độ cao hơn, an toàn hơn.

Một trong các yếu tố ảnh hưởng tới security nữa là Work From Home. Từ khi dịch covid bùng phát, WFH trở thành một xu hướng tất yếu. Tuy nhiên làm việc ở nhà đồng nghĩa với việc các cá nhân phải tự chịu trách nhiệm về vấn đề bảo mật.

Nếu ý thức, kiến thức đầy đủ thì không sao. Ngược lại, nếu không có kiến thức, việc làm ở nhà rất dễ dần tới rủi ro về bảo mật. 2023 vẫn là năm mà WFH sẽ vô cùng phát triển khi mà mọi người đã quen với việc làm ở nhà. Các startup 100% remote không còn là điều quá xa lạ.

3.2 API Security

Ngoài WFH, API security cũng là yếu tố cần được nhắc tới. Rủi ro từ việc không bảo mật API thực sự là nỗi ám ảnh năm 2022. Ví dụ như sự kiện hack hệ thống bệnh viện Medibank ở Australia. Tất cả thông tin về hồ sơ bệnh án, thông tin của bệnh nhân đã bị lộ.

API Security

Nguyên nhân của việc mất mát thông tin này là do một API đã không được bảo mật đúng cách. Chính ví vậy, năm nay sẽ là năm mà API security sẽ được ưu tiên, cải tiến nhiều hơn để đảm bảo yếu tố an toàn.

  Generate API contract sử dụng OpenAPI Generator Maven plugin

4. IOV (Internet of Vehicle)

Là một thành phần trong hệ thống thành phố thông minh (smart city). IOV là modules nhỏ trong IOT (Internet of Thing). Năm 2022 là một năm bùng nổ về ngành công nghiệp xe điện.

Tesla, Toyota, BMW, Mercedes hay Porsche đều là những ông lớn trong ngành xe hơn đã và đang tham gia cuộc đua thị trường xe điện. Thành công gặt về cũng không ít nha anh em, như mới đây mình xem BMW i7, i7 xDrive60 có thể chạy được 800km cho mỗi lần sạc.

IOV (Internet of Vehicle)

Cuộc đua phát triển xe điện dự báo sẽ còn nóng hơn trong năm 2024. Người dùng cũng đã sẵn sàng cho việc thay đổi xe điện.

Mà nhiều xe, nhiều người sử dụng tất nhiên sẽ có nhu cầu cao trong việc sử dụng, vận hành hệ thống sạc điện. Các ứng dụng giúp tìm điểm sạc cho xe đã và sẽ ra mắt sớm. IOV rõ ràng được vinh dự góp mặt trong top 5 startup tech trend năm nay.

5. Công nghệ bền vững (Sustainable Technology)

Ở góc độ cá nhân, việc phát triển bền vững có thể là mảng rất rất được quan tâm trong năm nay. Công nghệ phát triển, các thiết bị phát thải nhiều hơn vào môi trường.

Mà yếu tố môi trường đang là yếu tố được quan tâm. Về phía người dùng, nhận thức của họ về bảo vệ môi trường càng ngày càng lớn. Đơn cử như xe xăng chuyển qua xe điện để giảm bớt phát thải vào môi trường. Mức tiêu thụ năng lượng lớn cũng là yếu tố thúc đẩy phát triển công nghệ bền vững.

Sustainable Technology

Trí tuệ nhân tạo được kì vọng có thể góp phần tối ưu mức độ tiêu hao nhiên liệu. Giảm phát thải vào môi trường, sử dụng tối ưu nguồn năng lượng hiện có.

Chính vì xu hướng tất yếu là phát triển xanh, phát triển bền vững nên Sustainable Technology tự hào góp mặt ở vị trí thứ 5 trong top 5 startup tech trend.

Tới tận 5 cái mà chả thấy blockchain đâu, anh em đừng buồn. Cho dù thị trường tiền mã hoá down quá down nhưng nếu những ứng dụng blockchain vào cuộc sống được hiện thực. Năm 2024 vẫn có thể là một năm có đất diễn cho những anh em có kinh nghiệm về blockchain.

6. Tham khảo thêm về startup tech trend

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

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

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

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

12 Thư viện JavaScript trực quan hoá dữ liệu hot nhất năm 2024

Tác giả: Jonathan Saring

Chúng ta đang sống trong thời đại bùng nổ dữ liệu, khi gần như mọi ứng dụng chúng tôi phát triển sử dụng hoặc tận dụng dữ liệu hoặc các thư viện JavaScript để cải thiện trải nghiệm được phân phối cho người dùng.

Đôi khi, tính năng tốt nhất mà chúng tôi có thể cung cấp cho người dùng chính là dữ liệu. Tuy nhiên, biểu đồ bảng và số thường gây khó khăn để đọc và khó để có được những hiểu hết những thông tin chi tiết và hữu ích từ các bảng dữ liệu lớn.

Thay vào đó, chúng ta có thể sử dụng các phương pháp trực quan hóa dữ liệu gọn gàng nhằm tận dụng khả năng nhận biết và xử lý dữ liệu của bộ não theo cách trực quan. Để giúp bạn bắt đầu và dễ dàng trực quan hóa dữ liệu của ứng dụng yêu thích của bạn một cách sống động và bắt mắt, dưới đây là một số thư viện trực quan hóa dữ liệu Javascript tốt nhất trong năm 2024 (chưa được đánh giá).

1. D3js

Với 80k sao, D3.js có lẽ là thư viện trực quan hóa dữ liệu JavaScript phổ biến và rộng rãi nhất hiện có. D3 được xây dựng để thao tác các tài liệu dựa trên dữ liệu và hiển thị dữ liệu bằng cách sử dụng HTML, SVG và CSS.

Điểm chú ý của D3 về các tiêu chuẩn web là cung cấp cho bạn khả năng của các trình duyệt hiện đại mà không cần sử dụng chung với một framework độc quyền nào, kết hợp các thành phần trực quan hóa và cách tiếp cận hướng dữ liệu đến thao tác DOM. Nó cho phép bạn liên kết dữ liệu tùy ý với một Document Object Model (DOM), và sau đó áp dụng các biến đổi theo hướng dữ liệu cho tài liệu. Đây là một thư viện mẫu tuyệt vời.

Lưu ý: một số người nói D3 không phải là thư viện trực quan hóa dữ liệu … 🙂

2. ChartJS

Một thư viện cực kì phổ biến (40k sao) của các dự án mã nguồn mở HMTL5 về biểu đồ cho các ứng dụng web responsive sử dụng canvas element. V.2 cung cấp các loại biểu đồ hỗn hợp, loại trục biểu đồ mới và hoạt ảnh đẹp. Thiết kế đơn giản và thanh lịch với 8 loại biểu đồ cơ bản và bạn có thể kết hợp thư viện với moment.js cho trục thời gian. Bạn cũng có thể xem thư viện trên cdnjs.

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

3. ThreeJS

Thư viện cực kỳ phổ biến này (45K sao; 1K đóng góp) được xây dựng để tạo hoạt ảnh 3D bằng WebGL. Bản chất linh hoạt và trừu tượng của dự án có nghĩa là nó cũng hữu ích cho việc hiển thị dữ liệu trong 2 hoặc 3 chiều.

Ví dụ: Bạn cũng có thể sử dụng mô-đun được chỉ định này để hiển thị đồ thị 3D bằng WebGL hoặc thử online playground này. Một lựa chọn thú vị để xem xét.

4. Echarts & Highcharts

Dự án Echarts của Baidu (30k sao) là một thư viện biểu đồ và trực quan tương tác cho trình duyệt. Nó được viết bằng JavaScript thuần túy và dựa trên thư viện canvas zrender. Nó hỗ trợ xây dựng các biểu đồ dưới dạng Canvas, SVG (4.0+) và VML ngoài PC và trình duyệt di động, ECharts cũng có thể được sử dụng với nút-canvas trên nút để hiển thị phía máy chủ hiệu quả (SSR). Đây là một liên kết đến thư viện mẫu đầy đủ, trong đó mỗi ví dụ có thể được sử dụng với (và theo chủ đề) trong một interactive playground.

Highcharts JS với 8K sao là thư viện biểu đồ JavaScript phổ biến rộng rãi dựa trên SVG, với phương án dự phòng cho VML và canvas với các trình duyệt cũ. Nó tuyên bố đã được sử dụng bởi 72 trong số 100 công ty lớn nhất thế giới, khiến cho nó (có thể) là API biểu đồ JS phổ biến nhất trên thế giới (Facebook, Twitter).

Có thể bạn muốn xem: Việc làm lập trình Javascript

5. Metric-Graphics

MetricsGraphics.js (7k sao) là một thư viện được tối ưu hóa để hiển thị và xuất dữ liệu chuỗi thời gian. Nó tương đối nhỏ (80kb minified), và cung cấp một lựa chọn hạn chế nhưng thanh lịch cho các biểu đồ đường, điểm phân tán, histograms, biểu đồ thanh và data tables, cũng như các tính năng như rug plots và hồi quy tuyến tính cơ bản. Đây là liên kết đến thư viện mẫu tương tác.

6. Recharts

Recharts là một thư viện biểu đồ được xây dựng với React và D3 cho phép bạn triển khai như khai báo các React component. Thư viện cung cấp hỗ trợ SVG gốc, cây phụ thuộc nhẹ (các mô đun phụ D3) có thể tùy biến cao thông qua các component props.

Bạn có thể tìm thấy các ví dụ trực tiếp trên trang web tài liệu.

7. Raphael

10k sao cho một thư viện vector JavaScript để làm việc với đồ họa vector trong web. Thư viện sử dụng SVG W3C Recommendation và VML làm cơ sở để tạo đồ họa, vì vậy mọi đối tượng đồ họa cũng là đối tượng DOM và bạn có thể đính kèm trình xử lý sự kiện JavaScript. Raphaël hiện hỗ trợ Firefox 3.0+, Safari 3.0+, Chrome 5.0+, Opera 9.5+ và Internet Explorer 6.0+.

8. C3js

Với 8k sao, C3 là một thư viện biểu đồ tái sử dụng dựa trên D3 cho các ứng dụng web. Thư viện cung cấp các lớp cho mọi phần tử để bạn có thể định nghĩa một kiểu tùy chỉnh theo lớp và mở rộng cấu trúc trực tiếp bằng D3. Nó cũng cung cấp một loạt các API và gọi lại để truy cập trạng thái của biểu đồ. Bằng cách sử dụng chúng, bạn có thể cập nhật biểu đồ ngay cả khi biểu đồ được hiển thị. Hãy xem những ví dụ này.

9. React Virtualized + React Vis + Victory

React-vis (4k sao) là tập hợp các component React của Uber để hiển thị dữ liệu một cách nhất quán, bao gồm biểu đồ đường / khu vực / thanh, bản đồ nhiệt, ô tán xạ, ô đường viền, bản đồ hình lục giác và nhiều hơn nữa. Thư viện không yêu cầu bất kỳ kiến ​​thức nào trước đây với D3 hoặc bất kỳ thư viện dữ liệu nào khác, và cung cấp các thành phần khối xây dựng mô-đun cấp thấp như trục X / Y. Một sự kết hợp tuyệt vời để làm việc với Bit và một thư viện rất hữu ích để xem xét.

React virtualized (12k sao) là một tập hợp các React component để hiển thị một cách hiệu quả các danh sách lớn và dữ liệu dạng bảng. Các bản dựng ES6, CommonJS và UMD có sẵn với mỗi bản phân phối và dự án hỗ trợ luồng công việc Webpack 4. Lưu ý rằng react, react-dom phải được xác định là phụ thuộc ngang hàng để tránh xung đột phiên bản. Hãy thử một lần.

Victory là bộ sưu tập các React composable React components để xây dựng trực quan dữ liệu tương tác, được xây dựng bởi Formidable Labs và với hơn 6k sao. Victory sử dụng cùng một API cho web và ứng dụng React Native để dễ dàng lập biểu đồ đa nền tảng. Một cách thanh lịch và linh hoạt để tận dụng các thành phần React có lợi cho việc trực quan hóa dữ liệu thực tế.

Các thư viện này là sự kết hợp gọn gàng với Bit khi sử dụng các thành phần riêng lẻ, để chia sẻ và đồng bộ hóa chúng giữa các ứng dụng.

10. CartoDB

Với 2k sao, Carto là công cụ trực quan hóa thông minh vị trí & dữ liệu để khám phá thông tin chi tiết bên dưới dữ liệu vị trí. Bạn có thể tải lên dữ liệu không gian địa lý (Shapefiles, GeoJSON, v.v.) bằng cách sử dụng biểu mẫu web và trực quan hóa nó trong tập dữ liệu hoặc trên bản đồ, tìm kiếm nó bằng SQL và áp dụng kiểu bản đồ bằng CartoCSS. Dưới đây là một loạt các bản demo video để giúp bạn có được ý tưởng và bắt đầu.

11. Các biểu đồ raw 

Trên 5k sao, Raw là liên kết kết nối giữa bảng tính và trực quan hóa dữ liệu được xây dựng để tạo các hình ảnh dựa trên vector tùy chỉnh ở phía trên thư viện d3.js. Nó hoạt động với dữ liệu dạng bảng (bảng tính và các giá trị được phân tách bằng dấu phẩy) cũng như các văn bản được sao chép và dán từ các ứng dụng khác. Dựa trên định dạng SVG, các hình ảnh trực quan có thể được chỉnh sửa bằng các ứng dụng đồ họa vector để tinh chỉnh thêm, hoặc nhúng trực tiếp vào các trang web. Đây là một thư viện mẫu để khám phá trước khi tìm hiểu sâu.

12. Metabase

Với hơn 11k sao, Metabase rất nhanh chóng và đơn giản để tạo ra các bảng dữ liệu mà không biết SQL (nhưng với chế độ SQL cho các nhà phân tích và các chuyên gia dữ liệu). Bạn có thể tạo phân đoạn và chỉ số chuẩn, gửi dữ liệu tới Slack (và xem dữ liệu trong Slack với MetaBot) và hơn thế nữa. Có lẽ là một công cụ tuyệt vời để trực quan hóa dữ liệu nội bộ cho nhóm của bạn, mặc dù một số bảo trì có thể được yêu cầu.

Trên đây là những thông tin được TopDev Blog tổng hợp. Hy vọng sẽ có những kiến thức hữu ích cho các độc giả, nếu các bạn có góp ý các thông tin gì mới hơn, inbox hoặc note lại giúp ad để được cập nhật thông tin tốt nhất đến các anh chị developer nhé!

Tham khảo các vị trí tuyển dụng ngành cntt tại đây

Lựa chọn Vue hay React dành cho FE Developer

Vue hay React

Vue.js React.js hiện đang là 2 nền tảng thư viện, framework dành cho Frontend của JavaScript phổ biến nhất hiện nay. Cả 2 thư viện này đều cung cấp cho các lập trình viên 1 cách tiếp cận hiệu quả để xây dựng các ứng dụng Web khác nhau, tuy nhiên cũng có nhiều sự khác biệt về cách sử dụng và đặc thù với từng bài toán mà chúng ta nên lựa chọn framework hay thư viện nào để sử dụng. Bài viết này chúng ta cùng đi trả lời cho câu hỏi: Nên lựa chọn Vue hay React dành cho FE Developer nhé.

Vue và React là gì?

Vue và React

Vue.js là 1 framework được thiết kế bởi Evan You (1 kỹ sư phần mềm từng làm việc ở Google); trong khi đó React là 1 thư viện (library) được phát triển bởi Facebook; cả 2 đều được viết bằng JavaScript giúp tạo ra các ứng dụng đơn trang (Single Page Application) cho công việc xây dựng giao diện người dùng.

  Flutter cơ bản - Framework di động được yêu thích nhất hiện nay?

Hiện nay trên Github, số lượt star cho project của Vue đang đứng thứ 2 trong số các JavaScript project, và đứng đầu chính là React. Tại sao 2 nền tảng này là phổ biến đến như vậy, có 1 số điểm sau giúp chúng ta trả lời câu hỏi này:

  • Dễ học và dễ tiếp cận: cả 2 đều được viết bằng JS, vốn đã là 1 ngôn ngữ khá dễ học, nhiều tài liệu hướng dẫn cùng cộng đồng support lớn. Hướng thiết kế của cả Vue và React đều là mã nguồn mở, xây dựng để làm việc với các thư viện gốc; vì thế chỉ cần có kiến thức cơ bản về HTMLCSS là bạn có thể tự tin bắt tay vào học Vue hay React được ngay
  • Cấu trúc dựa trên thành phần (Component): cách cấu trúc dựa trên thành phần (Component-Based) giúp khả năng tái sử dụng code cao, tăng tính đồng bộ trong giao diện thiết kế của dự án
  • Mô hình Virtual DOM: cả Vue và React đều có Virtual DOM giúp các lập trình viên dễ tương tác và thao tác với các đối tượng, phần tử HTML trên trang mà không quá lo lắng về việc tối ưu hiển thị.
  • Cộng đồng hỗ trợ rất lớn: Như đã nhắc ở trên, nhờ mức độ phổ biến cùng sự cam kết nâng cấp lâu dài từ Facebook (cho React) và team Vue.js giúp có nhiều sự lựa chọn dành cho Developer cho việc phát triển ứng dụng.

Tham khảo việc làm JavaScrip HOT trên TopDev!

Sự khác nhau giữa Vue và React

Điểm khác biệt lớn cơ bản giữa Vue và React là cách xây dựng view layer. Mặc định thì Vue sử dụng các HTML templates, có tùy chọn viết bằng JSX; trong khi đó React chỉ có JSX. Vue tách code của chúng ta thành các phần khá riêng biệt HTML, CSS và JS giống như 1 web truyền thống; điều đó phần nào giúp các lập trình viên bắt đầu học Frontend dễ đọc và dễ hiểu hơn.

Code Vue.js

Code Vue.js

Code React.js

Code React.js

Về mặt tốc độ và hiệu suất, cả Vue và React đều cho chúng ta những khả năng tuyệt vời khi xây dựng ứng dụng web. Đối với React, khi có sự thay đổi component thì việc re-render sẽ được kích hoạt cho các component con mà không làm ảnh hưởng đến các component anh chị. Còn đối với Vue, các component có liên quan đến nhau sẽ được tracking trong suốt quá trình render, hệ thống sẽ tự xác định component nào yêu cầu re-rendering sau khi state thay đổi. Điểm khác nhau 1 chút ở đây là Vue được đánh giá tốt hơn về khả năng phân bổ bộ nhớ và thời gian khởi động trong khi React sẽ nhanh hơn 1 chút trong thời gian chạy.

Về khả năng mở rộng, Vue được thiết kế dành cho việc tạo ra các ứng dụng nhanh, thời gian phát triển được rút ngắn tối đa; ngược lại React với kinh nghiệm của đội ngũ Facebook phù hợp hơn cho việc mở rộng dự án. React được tạo ra cho các dự án Web quy mô lớn, kiến trúc của React giúp các bạn có lợi về lâu dài khi lượng code của dự án trở nên đồ sộ. Vue sẽ là 1 giải pháp tiết kiệm chi phí cho các ứng dụng vừa và nhỏ, tất nhiên nó vẫn hoàn toàn có thể sử dụng cho các ứng dụng Web lớn nhưng về mặt này React được đánh giá cao hơn.

  Cách cài đặt .NET Framework 3.5 trên Windows thành công 100%

Vậy nên lựa chọn học Vue hay React?

Phải khẳng định ngay là nếu bắt đầu học thì Vue sẽ dễ hơn cho các bạn. Khi đã biết HTML, CSS và JS thì hãy tự tin viết ứng dụng Vue đầu tiên của mình với không quá nhiều thứ mới cần phải học. Vue nhẹ, dễ học và dễ viết; cú pháp và cách sử dụng quen thuộc; việc tích hợp hoặc di chuyển các dự án cũ (viết thuần bằng HTML, CSS, JS) sang Vue sẽ dễ hơn, nhanh hơn và mượt hơn.

Nếu bạn là 1 lập trình viên có kinh nghiệm với các ngôn ngữ khác, muốn học 1 framework mới cho công việc Frontend, React là lựa chọn hợp lý hơn. React cho bạn một công cụ để xây dựng các ứng dụng SPA, đưa ra 1 giải pháp phức hợp cấp doanh nghiệp để xây dựng 1 hệ sinh thái trong tương lai, mở rộng liên tục. Ngoài ra với React, bạn còn có thể viết các ứng dụng trên di động bằng React Native.

Hay nói 1 cách dễ hiểu hơn, hãy lựa chọn Vue nếu bạn thích HTML hơn; ngược lại hãy chọn React nếu bạn thích JS hơn.

Có 1 điểm bạn cũng nên lưu ý, Vue được 1 kỹ sư Google tạo ra trong quá trình làm việc với Angular, cũng là 1 framework JS nổi tiếng. Nếu bạn có thể học Vue.js, việc học Angular cũng không quá khó khăn với bạn.

angular vs react vs vue

Kết bài

Hiện nay, nhu cầu tuyển dụng lập trình viên làm Vue và React là rất lớn, vì thế việc học 1 trong 2 framework, thư viện này sẽ có thể giúp ích các bạn rất nhiều trong quá trình tìm việc làm. Nếu có thể, hãy chọn học 1 trong 2 và sau đó tìm hiểu thư viện còn lại. Trong nhiều project, việc lựa chọn thư viện nào cũng sẽ ảnh hưởng lớn đến tương lai phát triển sau này của ứng dụng đó. Hy vọng bài viết đã mang lại được những thông tin hữu ích dành cho bạn, hẹn gặp lại các bạn trong các bài viết sau của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

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

6 Xu hướng quản trị nhân sự năm 2024

Trong những năm gần đây, ngành Quản trị Nhân sự đã có những chuyển mình đầy ấn tượng trong công tác xây dựng và phát triển chiến lược. Với việc tập trung vào tiêu dùng hóa và công nghệ số, những xu hướng mới được tạo ra góp phần quan trọng trong việc định hình quản trị nhân sự trong thập kỷ mới.

1. Quan tâm đến việc phát triển những trải nghiệm hấp dẫn nhân viên

Nghiên cứu của The Future Workplace and Beyond.com chỉ ra rằng, 83% lãnh đạo quản trị nhân sự nhận định, sự trải nghiệm nhân viên hoặc quan trọng, hoặc rất quan trọng đối với sự thành công của tổ chức và họ đang đầu tư nhiều hơn trong việc đào tạo (56%), cải thiện không gian làm việc (51%) và trao nhiều phần thưởng tạo động lực, khuyến khích nhân viên hơn (47%).

Động lực lớn giúp các công ty tập trung phát triển những trải nghiệm hấp dẫn nhân viên là khi “cuộc chiến” thu hút nhân tài đang ngày càng quyết liệt. Theo Mercer, thì 90% chủ doanh nghiệp sẽ trở nên cạnh tranh hơn trong công việc tìm người tài. Vì vậy, việc tạo ra trải nghiệm giúp công ty ghi dấu ấn mạnh mẽ đối với các nhân viên (hiện tại và tiềm năng) về văn hóa và giá trị doanh nghiệp, đồng thời dùng nó trong việc khai thác người tài tuyển dụng

Kết quả hình ảnh cho hr

Những người làm công tác quản trị nhân sự đang từng bước thực hiện chiến lược này bằng cách đa chức năng hóa công việc quản trị nhân sự. Có thể kể đến việc hợp tác với các lĩnh vực đa ngành như bất động sản, công nghệ, marketing, truyền thông nội bộ và quan hệ toàn cầu nhằm tạo ra sự kết hợp giữa trải nghiệm nhân viên với khách hàng.

2. Tuyển dụng và phát triển nguồn nhân lực phức hợp thông qua việc ứng dụng dụng mô hình Agile 

Mô hình Agile tạo mọi điều kiện để phát triển phần mềm. Agile được định hướng giúp các doanh nghiệp đạt được sự linh hoạt (Agility), từ đó xây dựng nền tảng vững chắc trước khi chuyển đến việc nâng cao sức cạnh tranh và thực hiện các mục tiêu phát triển bền vững.

  Agile và văn hóa Việt Nam
  Agile là gì? Scrum là gì? Các công cụ quản lý dự án theo Agile mà bạn nên biết

Ứng dụng Agile đã tạo ra sự thay đổi đầy nổi bật trong chính cục diện phát triển phần mềm. Agile tự hào vì là mô hình góp phần tạo ra những giá trị chất lượng trong các lĩnh vực ứng dụng như Marketing (Agile Marketing), giáo dục (EduScrum, Lean Edu,…), thiết kế (Design Thinking), khởi nghiệp (Lean Startup).Cô Amber Grewwal, hiện là Phó chủ tịch bộ phận tuyển dụng nhân tài của IBM đồng thời cũng là người đầu tiên ứng dụng mô hình Agile trong tuyển dụng. Một thực tế cho thấy Agile giúp tìm ra những ứng viên thật sự có tài năng, làm hài lòng khách hàng chỉ từ 2 đến 6 tuần. Dù có những đóng góp tích cực, mô hình Agile vẫn đang hoàn thiện và phát triển nhiều hơn, hứa hẹn sẽ còn tạo ra nhiều bất ngờ.

3. Hợp tác với các nhà phát triển bất động sản để tạo nên không gian thúc đẩy văn hóa 

Môi trường tuyển dụng nhân tài trở nên kịch tính hơn khi có sự cộng hưởng về tính cách giữa người hướng nội và người hướng ngoại. Chính họ cũng mong muốn mình được đáp ứng một cách phù hợp về môi trường, không gian làm việc để có thể phát triển bản thân tốt hơn.

Theo International Facilities Management Association, đa phần các nhân viên Mỹ đều ưa chuộng không gian làm việc mở, tuy nhiên, hiện tại, các công ty bắt đầu nhận thức được rằng đó không phải luôn là nơi thích hợp nhất để hoàn thành công việc.

Cũng theo đó, nghiên cứu từ Steelcase lấy ý kiến từ 12.480 nhân viên tại 17 quốc gia trên toàn cầu cho thấy, việc có lựa chọn một không gian làm việc mở hay không thật sự quan trọng. Điều quan trọng chính là chúng ta làm cách nào để trao quyền cho nhân viên lựa chọn nơi mình sẽ công tác và theo đuổi mục tiêu. 

Hãy nhớ rằng, đối với bộ phận quản trị nhân sự: nơi làm việc không chỉ là một tòa nhà, nó còn là một phần của cuộc hành trình tìm hiểu và chinh phục những ước mơ. Việc hợp tác với các nhà phát triển bất động sản để tạo ra nơi làm việc thân thiện giúp thúc đẩy quá trình tiếp cận và phát triển văn hóa công ty, đồng thời tạo sự gắn kết với nhân viên.

4. Ứng dụng phương pháp tiếp thị đến người tiêu dùng

Ngày nay, với sự phát triển của công nghệ, các ứng viên và nhân viên có “đặc quyền” tạo ra sự ảnh hưởng truyền thông xã hội đối với một tổ chức, doanh nghiệp nào đó thông qua các đánh giá, sự xếp hạng riêng của họ. 

Trong bối cảnh đó, bộ phận quản trị nhân sự thực hiện việc áp dụng nhiều công cụ Marketing như thiết kế suy nghĩ, hackathon (sự kiện mà các lập trình viên, cùng những người liên quan trong ngành phát triển phần mềm sẽ hợp tác với nhau trong thời gian ngắn để hoàn thành một dự án) và phân tích tâm lý để tạo nên những trải nghiệm thu hút nhân tài. 

Việc chuyển hướng từ trọng tâm khách hàng sang các nhân viên là một quyết định đúng đắn của những chuyên gia. Trọng tâm thay đổi, đối tượng được định hướng một cách rõ ràng hơn. Từ đó, ta thấy những công cụ có thể phân tích tâm lý (Social Pulse) giúp khám phá những suy nghĩ của nhân viên về vấn đề quản trị. Hay ứng dụng Ask Alex – một phần mềm giọng nói cho phép người dùng có được các thông tin về quản trị nhân sự một các nhanh chóng như chính sách nghỉ ngơi, chi phí hỗ trợ và các câu hỏi liên quan tới vấn đề bảo hiểm. 

5. Trải nghiệm chatbots trong quản trị nhân sự

Có thể hiểu đơn giản chatbots là một hình thức chưa hoàn thiện của phần mềm trí tuệ nhân tạo, có thể giao tiếp với con người để tạo ra sự tương tác với chúng ta. Đừng nghĩ rằng chatbots chưa hoàn thiện mà đánh giá thấp nó, bạn sẽ bất ngờ vì chatbots  có nhiều chức năng hơn bạn nghĩ đấy. 

Gideon Mann, Giám đốc khoa học số liệu của Bloomberg LP, “trong vòng 5 năm tới, tự động hóa sẽ thâm nhập ngày càng sâu vào công việc và cuộc sống cá nhân của chúng ta.” Và đây cũng là lời dẫn có cơ sở khi việc ứng dụng chatbots ra đời.

Điểm ứng dụng đặc biệt ở chatbots là tạo ra những người bạn đồng hành kỹ thuật số. Điều này tức là chúng ta sẽ phát triển mô hình tự động hóa với sự góp mặt của các “công sự” khác hơn. Vấn đề đặt ra là liệu việc tự động hóa có khiến con người khó khăn hơn trong tìm việc? 

Đối với vấn đề này, sẽ không quá khó khăn để có cách giải quyết. Điểm mấu chốt là đội ngũ quản trị nhân sự cần phải hiểu được nội dung, bối cảnh của tự động hóa và những ảnh hưởng của chúng đến tương lai. Bước đầu đi tiên phong trong việc sử dụng chatbots, những người quản trị nhân sự có thể từng bước theo dõi và xem xét người đồng nghiệp kỹ thuật số này có thể đưa ra các lời khuyên và cải thiện công tác quản trị nhân sự hay không.

Tham khảo thêm các nhà tuyển dụng IT HOT:

6. Tập trung vào phát triển sức mạnh tập thể, không chỉ đối với cá nhân

Một xu hướng khác trong việc quản trị nhân sự chính là phát huy trí thông minh tập thể. 

Ashley Goodall, Phó chủ tịch cấp cao của Cisco cho biết: “Một trong những sai lầm lớn nhất trong công tác quản trị nhân sự của chúng tôi là chúng tôi gần như chỉ tập trung sự chú ý vào sự phát triển và màn biểu diễn của các cá nhân. Tại Cisco, chúng tôi nhận ra, các thành quả lớn thường có được nhờ một đội ngũ, không phải là cá nhân hoạt động đơn độc”. Do đó, mục tiêu lâu dài giúp gắn kết đó chính là đặt động lực của cả nhóm vào toàn bộ quá trình quản trị nhân sự.

Từ 2018, lĩnh vực quản trị nhân sự đã được “thay áo” một một tiêu chuẩn mới. Đó là sự hội tụ giữa các giải pháp marketing hiệu quả với những thông số kỹ thuật. Đặc biệt hơn với sự trợ giúp của trí thông minh nhân tạo, công tác quản trị nhân sự đã có những hiệu quả vượt trội hơn. 

Tuy nhiên, chúng ta nên nhớ rằng dù cho công nghệ phát triển vượt bậc và tạo ra hàng loạt các công trình ứng dụng: thiết bị di động với công nghệ đám mây, trí thông minh nhân tạo,.. thì đó vẫn là sản phẩm trí tuệ thuộc về sáng kiến sáng tạo của con người. Con người vẫn là hạt nhân quan trọng và việc tập trung vào phát triển sức mạnh tập thể rất quan trọng. 

Tự động hóa về trí thông minh nhân tạo giúp bộc lộ sự phát triển nhưng sức mạnh tập thể mới là thứ giúp thúc đẩy sự phát triển đó thật lâu dài.

7. Sử dụng phương pháp quản trị mục tiêu OKRs

OKRs là phương pháp quản trị mục tiêu có lịch sử phát triển lâu đời và đã được áp dụng tại các công ty, tập đoàn hàng đầu thế giới như Google, Amazon, Intel, Facebook, LinkedIn,… Trong bối cảnh kinh tế nhiều biến động, OKRs nhanh chóng trở thành xu hướng quản trị nhân sự nổi bật với những lợi ích to lớn cho doanh nghiệp.

Hiện nay, nhiều doanh nghiệp đang phải đối mặt với tình trạng chi phí cho hoạt động kinh doanh tăng cao, nhưng hiệu quả làm việc của nhân viên lại không đạt như kỳ vọng. Do đó, thiết lập một hệ thống quản trị mục tiêu là điều mà chủ doanh nghiệp và nhà quản trị nhân sự cần ưu tiên để thích nghi với các biến động từ môi trường bên ngoài và các bất ổn đến từ nội bộ.

Phương pháp quản trị mục tiêu OKR giúp các nhà lãnh đạo, quản trị nhân sự và nhân viên trong tổ chức đo lường, theo dõi tiến độ, tạo sự liên kết giữa các mục tiêu quan trọng. Khi được áp dụng đúng cách, OKRs mang lại sự tăng trưởng trong hiệu suất, hiệu quả làm việc của nhân viên, tạo một lộ trình rõ ràng giúp chuyển đổi và thúc đẩy sự phát triển của doanh nghiệp.


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

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

Xem thêm Top vị trí tuyển dụng it HOT trên TopDev

Sách hay nhất dành cho lập trình viên (2024)

Sách hay nhất dành cho lập trình viên (2020)

Bài viết được sự cho phép của tác giả Phạm Văn Nguyên

Vậy bạn đã quyết định học Lập trình?

Tôi biết điều đầu tiên bạn có thể làm là vào Google và tìm kiếm những cuốn sách lập trình tốt nhất .

Tôi sẽ làm như vậy.

Nhưng có một vấn đề.

Có rất nhiều sách lập trình ngoài kia, bao gồm các chủ đề khác nhau và các ngôn ngữ lập trình khác nhau.

Với tất cả các tùy chọn, thật dễ bị nhầm lẫn và không bao giờ bắt đầu.

Trong bài viết này, tôi sẽ chia sẻ với bạn những cuốn sách yêu thích của tôi trong nỗ lực giúp bạn đưa ra quyết định phù hợp nhất với bạn.

Triết lý của tôi rất đơn giản

Đầu tiên, tất cả những cuốn sách tôi giới thiệu ở đây là những cuốn sách mà tôi đã tự đọc và chúng được cộng đồng đánh giá cao .

Thứ hai, tôi sẽ giữ danh sách này nhỏ nhất có thể mà không ảnh hưởng đến tính tổng quát.

Nhưng trước khi chúng tôi bắt đầu, tôi muốn đề cập rằng những cuốn sách này chỉ liên quan đến chủ đề Lập trình .

Lập trình chỉ là một chủ đề trong số nhiều lĩnh vực của Khoa học Máy tính..

Bắt đầu nào.

Đầu tiên: Ngôn ngữ lập trình

Trong phần này, tôi sẽ đề cập đến những cuốn sách có liên quan đến các khái niệm lập trình cơ bản và ngôn ngữ lập trình cụ thể.

1. Khái niệm lập trình

Sách hay nhất dành cho lập trình viên (2020)

Cấu trúc và giải thích các chương trình máy tính (còn được gọi là SICP ) là một cuốn sách cổ điển dạy cho bạn những nguyên tắc cơ bản của lập trình.

Sách giáo khoa này đã được dạy như một khóa học giới thiệu về Lập trình tại MIT.

Và mặc dù cuốn sách này sử dụng Scheme làm ngôn ngữ lập trình được lựa chọn để minh họa các khái niệm lập trình, nó không phải là một cuốn sách về ngôn ngữ lập trình Scheme.

Bạn nên nghĩ về cuốn sách này như một cuốn sách lập trình chung tình cờ sử dụng Scheme để minh họa một số khái niệm lập trình.

Có suy nghĩ này là rất quan trọng nếu bạn muốn tận dụng tốt nhất cuốn sách này.

Như đã nói, bạn có nên bắt đầu hành trình học lập trình với cuốn sách này không?

Cá nhân tôi thích bạn không bắt đầu với SICP , tôi khuyên bạn nên học một hoặc hai ngôn ngữ lập trình cụ thể trước khi bạn nhảy vào cuốn sách này.

Nhưng đừng hiểu sai ý tôi, cuốn sách này là một cuốn sách phải đọc.

Một điều nữa trước khi tôi quên, tất cả các bài giảng video của MIT (từ năm 1986) đều có sẵn trực tuyến , miễn phí, bởi chính các tác giả của cuốn sách!

Sách hay nhất dành cho lập trình viên (2020)

Tôi đã trải qua hầu hết trong số họ khi tôi đang học SICP và họ hoàn toàn tuyệt vời.

  32 cuốn sách học lập trình bạn nhất định phải đọc
  Bạn đã sẵn sàng dấn thân thêm hàng trăm “version" của bản thân để thành công?

2. Python

Python là ngôn ngữ lập trình được sử dụng rộng rãi và tôi không thấy nó chậm lại bất cứ lúc nào.

Nếu bất cứ điều gì, nó sẽ phát triển lớn hơn nữa.

Python cũng là một trong những ngôn ngữ dễ bắt đầu nhất.

Dựa trên cấp độ của bạn, đây là danh sách các sách Python mà tôi đề xuất.

Khóa học Python Crash

Sách hay nhất dành cho lập trình viên (2020)

Nếu bạn là người mới bắt đầu tuyệt đối, tôi khuyên bạn nên thử Python Crash Course .

Lý do tại sao tôi giới thiệu cuốn sách này là vì nó dựa trên dự án.

Nói cách khác, nó không nhàm chán :). Đối với người mới bắt đầu tuyệt đối, điều cuối cùng bạn muốn bắt đầu là một cuốn sách khô khan không đủ thú vị để bạn tiếp tục.

Nhược điểm của cuốn sách này là nó không toàn diện. Bạn sẽ thức dậy và chạy nhanh, nhưng nó sẽ không dạy cho bạn mọi thứ về Python mà bạn cần học.

Học Python

Sách hay nhất dành cho lập trình viên (2020)
Không giống như Python Crash Course , Learning Python là một cuốn sách rất toàn diện, đi sâu vào chi tiết hơn nhiều về ngôn ngữ lập trình Python.

Nó không áp dụng cách tiếp cận dựa trên dự án mà Python Crash Course thực hiện khi áp dụng cách dạy ngôn ngữ truyền thống hơn.

Nếu bạn là người mới bắt đầu, bạn sẽ không sai khi lấy cả hai cuốn sách và trải qua cả hai cuốn sách.

Fluent Python

Sách hay nhất dành cho lập trình viên (2020)

Fluent Python : cái này chắc chắn không dành cho những người yếu tim.

Sau khi bạn trở nên rất thoải mái trong các kỹ năng lập trình Python của mình và bạn muốn đẩy mạnh trò chơi của mình và đưa các kỹ năng của bạn lên một tầm cao mới, cuốn sách này là cuốn sách cuối cùng dành cho các lập trình viên Python nâng cao .

Tham khảo thêm các vị trí tuyển dụng python lương cao cho bạn.

3. Java

Java là một ngôn ngữ khác được sử dụng nhiều trong ngành công nghiệp.

Trường hợp điển hình: Hadoop , Spark , Kafka và ElasticSearch đều là các hệ thống phân tán được sử dụng rộng rãi được viết hoàn toàn bằng Java.

Cá nhân tôi đã học Java từ loạt Core nổi tiếng.

Core Java

Sách hay nhất dành cho lập trình viên (2020)

Core Java là một cuốn sách tuyệt vời về các nguyên tắc cơ bản của Java.

Nó dạy cho bạn những điều cơ bản của Ngôn ngữ lập trình Java với rất nhiều ví dụ minh họa và mẫu mã.

Core Java nâng cao

Sách hay nhất dành cho lập trình viên (2020)

Core Java Advanced là một cuốn sách miễn phí cho cuốn trước.

Nó bao gồm một số chủ đề nâng cao không được đề cập trong Core Java .

Effective Java

Sách hay nhất dành cho lập trình viên (2020)

Effective Java là một cuốn sách bắt buộc phải có cho mọi lập trình viên Java.

Cuốn sách này không phải là về nội dung của ngôn ngữ mà là về các thực tiễn tốt nhất để viết mã chất lượng cao chuyên nghiệp.

Cuốn sách cung cấp khoảng 80 thực tiễn tốt nhất để làm theo để làm cho mã của bạn sạch hơn, dễ đọc hơn và thành ngữ hơn.

4. C ++

Sách hay nhất dành cho lập trình viên (2020)

Tôi yêu C ++

Chủ yếu là vì đây là ngôn ngữ lập trình đầu tiên tôi học được ở trường đại học

Tuy nhiên, ngày nay rất hiếm khi sinh viên đại học bắt đầu lập trình với C ++.

Lý do cho điều đó là C ++ là một ngôn ngữ lập trình tương đối khó học hơn so với Python hoặc Java.

Và trên thực tế, tôi đồng ý rằng đó là một chiến lược tốt hơn nhiều để bắt đầu với Python hoặc Java.

Tuy nhiên, C ++ vẫn được sử dụng rộng rãi và rất quan trọng, đặc biệt nếu bạn quan tâm đến lập trình kernel cấp thấp hoặc lập trình các hệ thống nhúng.

Trường hợp điển hình: Windows, Mac OS, Linux đều được viết bằng C ++ (và C)

Đối với cuốn sách yêu thích của tôi, tôi thực sự thích C ++ Primer . Nó được viết tốt và khá toàn diện.

Tham khảo thêm các vị trí tuyển dụng lập trình C++ lương cao tại Topdev.

5. Go

Sách hay nhất dành cho lập trình viên (2020)

Ngôn ngữ được Google thiết kế hoàn toàn và đang phát triển với tốc độ rất nhanh.

Nó đã được sử dụng trong các dự án nguồn mở phổ biến.

Trường hợp điển hình: Kubernetes, Docker và Consul đều được viết bằng Go.

Không có nhiều sách về việc này, nhưng cuốn sách tôi sở hữu và giới thiệu là The Go Programming Language của Donavan và Kernighan.


Thứ hai: Craft Engineering Craft

Những cuốn sách được liệt kê trong phần này là hơi khác nhau.

Họ không phải là về việc học một ngôn ngữ lập trình cụ thể .

Họ thực sự hướng nhiều hơn đến việc dạy thủ công và nghệ thuật công nghệ phần mềm.

Nói cách khác, những cuốn sách này bao gồm các chủ đề mà bạn sẽ chỉ bắt gặp thông qua kinh nghiệm chuyên môn và công nghiệp của bạn.

Vì vậy, các chủ đề được đề cập ở đây thường không được dạy ở trường và có thể giúp bạn tiết kiệm được nhiều năm học thông qua thử và sai.

Chúng ta hãy lần lượt xem danh sách những cuốn sách yêu thích của tôi và xem những chủ đề chúng bao gồm và lý do tại sao chúng quan trọng.

1. Code Complete

Sách hay nhất dành cho lập trình viên (2020)

Code Complete không phải là thứ bạn đọc trong một lần.

Cuốn sách này là một hướng dẫn toàn diện mà bạn sẽ tiếp tục quay trở lại.

Theo tôi, thời gian tốt nhất để đọc cuốn sách này là trước khi bạn bắt đầu thực tập hoặc công việc đầu tiên.

Ví dụ, cuốn sách bao gồm mọi thứ, từ việc đặt nền tảng cho phát triển phần mềm, tạo và cải thiện phần mềm chất lượng cao, đến các vấn đề tiềm ẩn có thể phát sinh trong quá trình phát triển phần mềm và cách tránh chúng.

2. The Pragmatic Programmer

Sách hay nhất dành cho lập trình viên (2020)

The Pragmatic Programmer là một trong những cuốn sách thiêng liêng cho các lập trình viên.

Mặc dù cuốn sách tập trung vào rất nhiều khái niệm, nó đào sâu vào các thực tiễn phát triển phần mềm vượt thời gian mà hầu hết các lập trình viên (nên) sử dụng.

Một tác phẩm không vô nghĩa thu hút ý thức chung của mọi người, nó ấn tượng ở những giải pháp và lời khuyên có thể cảm thấy tội lỗi tinh tế.

Trước khi bạn biết điều đó, bạn sẽ là một tín đồ được chuyển đổi và là một lập trình viên thực dụng.

3. Clean Code

Sách hay nhất dành cho lập trình viên (2020)

Clean Code cung cấp một cái nhìn sâu sắc dễ hiểu về phát triển phần mềm và làm sạch mã.

Cuốn sách này cung cấp thông tin có giá trị và giải thích từng bước về cách viết, làm sạch và tái cấu trúc mã.

Nó không chỉ giải thích tại sao viết mã sạch là quan trọng, mà còn đưa ra rất nhiều ví dụ thực tế.

Lẩn tránh lý thuyết, làm sạch mã chỉ cho bạn cách giải quyết các vấn đề thực sự mà nhiều lập trình viên đã vấp phải trước bạn.

Vì vậy, hãy tiết kiệm cho mình nhiều năm thử và sai, và học hỏi từ những sai lầm của các lập trình viên khác.


Thứ ba: Cấu trúc dữ liệu và thuật toán

Một người đàn ông khôn ngoan đã từng nói:

Để trở thành một lập trình viên giỏi, bạn cần phải:

  • Mã chuyên nghiệp trong 10 năm
  • Mã chuyên nghiệp trong 2 năm và học thuật toán

Thành thật tôi rất khó nhớ ai đã nói chính xác câu nói này vì vậy nếu bạn biết, xin vui lòng để lại một bình luận bên dưới với tên của người đó để tôi có thể ghi nhận anh ấy

Những lời này là rất đúng mặc dù. Hiểu các cấu trúc dữ liệu và thuật toán ở mức sâu hơn là những gì phân biệt các lập trình viên rắn với các lập trình viên joe trung bình.

1. Introduction to Algorithms (CLRS)

Sách hay nhất dành cho lập trình viên (2020)

Khi nói đến các thuật toán và cấu trúc dữ liệu, thực sự không có nhiều tranh luận về cuốn sách hay nhất bao gồm chủ đề này.

Đó là giới thiệu một cách dứt khoát về các thuật toán .

Nếu bạn muốn âm thanh tuyệt vời và sử dụng biệt ngữ của nghề thủ công, bạn có thể gọi nó là CLRS .

Chữ viết tắt này thường được sử dụng và nó đề cập đến các tác giả của cuốn sách (Cormen, Leiserson, Rivest và Stein).

2.Data structure and Algorithms in Java

Sách hay nhất dành cho lập trình viên (2020)

CLRS được viết theo cách trung lập ngôn ngữ. Hầu hết các mã trong cuốn sách chủ yếu là mã giả.

Nếu bạn muốn tìm hiểu các cấu trúc dữ liệu và thuật toán trong Java, thì tôi khuyên bạn cũng nên lấy Data structure and Algorithms in Java .

Mặc dù ngày nay tôi không thực sự làm được nhiều Java, tôi có cuốn sách này và thật vui khi đọc và hiểu.

Tôi vẫn nói cuốn sách này là một người bạn đồng hành tốt với CLRS nhưng nó không có nghĩa là một sự thay thế.

Tham khảo từ nguồn: https://www.afternerd.com

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

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

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

Xu hướng tuyển dụng IT năm 2024 mà mọi HR Manager cũng như IT Manager cần biết!

Xu hướng tuyển dụng IT 2023 mà mọi HR và IT Manager cần biết

Thiếu hụt nhân sự luôn là một bài toán tuyển dụng IT nan giải, dù xu hướng lương và phúc lợi đang tăng mạnh cho ngành này, nhưng nhiều chuyên gia dự báo dự đoán từ năm 2023 – 2025, Việt Nam vẫn sẽ thiếu hụt từ 150.000 đến 200.000 lập trình viên/kỹ sư hàng năm. Thị trường xin việc IT trở thành một “đại dương đỏ” với sự cạnh tranh khốc liệt, việc tìm kiếm và tuyển dụng được các ứng viên đạt đủ yêu cầu trở nên cực kỳ khó khăn, tốn kém và mất nhiều thời gian.

Trước sự phát triển nhanh chóng của nhiều xu hướng công nghệ mới trong năm 2022 – 2023 mở ra nhiều cơ hội tốt hơn cho các lập trình viên tại Việt Nam, đây có thể sẽ gây không ít trở ngại cho nhà tuyển dụng nếu không biết tuyển dụng đúng cách. Liệu các nhà tuyển dụng và doanh nghiệp có đang đi đúng hướng?

TopDev đã cho ra “cẩm nang” Danh sách 10 xu hướng tuyển dụng IT nổi bật trong năm 2024 này sẽ là kim chỉ nam để cải thiện chiến lược tuyển dụng IT cho cho các nhà tuyển dụng ngành CNTT và các doanh nghiệp trên đà ứng dụng công nghệ mới. 

tuyển dụng it

  IT Manager Là Gì? Những Điều Bạn Cần Biết Về IT Manager

Qua bộ cẩm nang Tuyển dụng thế hệ mới này, những người làm Tuyển dụng IT sẽ hiểu hơn về những trở ngại và thách thức mới của ngành cũng như tìm ra 10 lối đi mới cho con đường Tuyển dụng Lập trình thật sự hiệu quả:

  1. Tuyển dụng mà không đơn thuần chỉ Tuyển mộ nhân tài  mà thực ra có rất nhiều điểm tương đồng với hoạt động Marketing. Vì thế nhà tuyển dụng từ đây cần phải bắt đầu tư duy như các marketer thì mới có thể thu hút được nhân tài và tìm kiếm được những nhân tố phù hợp về cho doanh nghiệp.
  2. Tuyển dụng thông minh phải biết làm thương hiệu – Hoạt động EB của các công IT bắt đầu nhen nhóm và đã có một số doanh nghiệp sau thời gian dài đầu tư đã bắt đầu cho quả ngọt với việc cứ đăng tin tuyển dụng là hồ sơ về ào ạt. Vậy Employer Branding là gì và làm thế nào cho đúng?
  3. Inbound Recruiting – chính là chìa khóa cho những cơ hội như thế này. Bằng cách tiến hành Inbound Recruiting kết hợp với chiến lược marketing hợp lý, nhà tuyển dụng sẽ xây dựng được mối quan hệ tích cực với các ứng viên tiềm năng.
  4. Candidate Experience Trải nghiệm ứng viên là toàn bộ những cảm xúc, hành vi và thái độ mà ứng viên trải qua trong quá trình ứng tuyển tại một doanh nghiệp. Quá trình tuyển dụng đó được tính từ khi tiếp nhận thông tin qua các kênh tuyển dụng tới sàng lọc, phỏng vấn, nhận offer và cuối cùng là quy trình onboarding nhân viên mới .
  5. Talent Pool – là khái niệm chỉ một cơ sở dữ liệu nơi nhà tuyển dụng lưu trữ tất cả thông tin của ứng viên mà nhà Tuyển dụng cần phải chú ý.Xu hướng tuyển dụng IT năm 2019
  6. Giống như trong hoạt động Sales-Marketing cần có hệ thống CRM (Customer Relationship Management) để quản lý quan hệ khách hàng, thì nhu cầu quản lý quan hệ ứng viên cũng phát sinh trước những thay đổi của thị trường lao động.
  7. Nếu như các công cụ Marketing Automation đã trở thành một phần không thể tách rời Marketing những năm gần đây thì Recruitment Automation cũng đang và sẽ ngày càng phổ biến hơn trong doanh nghiệp.
  8. Social Recruiting là cách thức tuyển dụng sử dụng các mạng truyền thông xã hội (như Facebook, Twitter, LinkedIn,…) và các trang web (blog, diễn đàn,…) để tìm kiếm, thu hút và chọn lựa nhân tài.
  9. Tương tự như hoạt động Marketing đang chuyển đổi mạnh mẽ sang hướng số hóa dữ liệu, hoạt động tuyển dụng nói riêng và nhân sự nói chung sẽ phụ thuộc ngày càng nhiều vào các dữ liệu – Data-driven Recruiting và HR Analytics.
  10. Đã có rất nhiều số liệu chứng minh hiệu quả vượt trội của việc tuyển dụng nhân viên thông qua giới thiệu từ nội bộ – Họ cho biết họ phương thức Giới thiệu nội bộ (Referral) rất phổ biến và được HR áp dụng cho tất cả các vị trí, đặc biệt là các vị trí IT.
  Program Manager là gì? Học gì để trở thành Program Manager

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

Digital Transformation – xu hướng trong năm 2024 và hơn thế nữa

Trước đây, làm cho sản phẩm hoặc dịch vụ của bạn ngày càng tốt và rẻ hơn là một công thức “chắc chắn thành công” trong kinh doanh. Nhưng thời đó đã qua từ lâu lắm rồi… Tự động hóa thông minh (Intelligent Automation – IA) đã sẵn sàng cho sự phát triển bùng nổ. Trước đây, IA bị giới hạn trong việc hỗ trợ các quy trình rất phức tạp như xử lý tài chính trong ngân hàng và cung cấp dịch vụ trên các mạng viễn thông khổng lồ.

Nhưng nền kinh tế đã thay đổi với sự bùng nổ của điện toán đám mây, và với sự phát triển đáng kinh ngạc của trí tuệ nhân tạo (Artificial Intelligence – AI), lợi thế cạnh tranh có thể tan biến trong nháy mắt. Theo Credit Suisse, tuổi trung bình của một công ty trong lĩnh vực S&P 500 đã giảm từ 60 tuổi trong những năm 1950 xuống dưới 20 năm hiện nay. Gần một nửa số công ty trên Fortune 500 đã biến mất trong 20 năm qua. Và 40% trong danh sách hôm nay sẽ biến mất trong vòng 10 năm tới. Câu hỏi là, làm thế nào để bạn vượt qua mối đe dọa không ngừng nghỉ của sự gián đoạn?

Các tổ chức thành công nhất nhìn thấy sự gián đoạn sắp tới. Do đó, họ xoay vòng để biến nó thành cơ hội cho sự đổi mới và tăng trưởng. Vì vậy, chúng tôi đã tham khảo quan điểm của những chuyên gia để có được thông tin về các xu hướng kỹ thuật số hot nhất cho năm 2023 và hơn thế nữa. Dưới đây là bản tóm tắt với các thông số về những xu hướng đó:

  • Vào năm 2020, 30% doanh nghiệp lớn sẽ bắt đầu tạo doanh thu dưới dạng dữ liệu khi có sự giúp sức từ AI
  • Vào năm 2020, hơn 40% các sáng kiến chuyển đổi kỹ thuật số sẽ sử dụng các dịch vụ AI
  • Đến năm 2021, 75% ứng dụng doanh nghiệp thương mại sẽ được tích hợp AI và hơn 50% người tiêu dùng sẽ tương tác với AI
  • Đến năm 2022, các trợ lý kỹ thuật số và bot cá nhân sẽ ảnh hưởng đến 10% tổng doanh số.

Trong khi đó, các chuyên gia nói rằng tương lai sẽ xuất hiện nhiều AI và thuật toán giúp đỡ chúng ta nhiều việc hơn là chỉ lấy thông tin ở hiện tại. Và thật sự thì AI đã đóng một vai trò lớn hơn trong cuộc sống hàng ngày của chúng ta. Ví dụ, các hệ thống thông minh đang đưa ra hàng tỷ quyết định mỗi ngày ảnh hưởng đến nhiều khía cạnh trong cuộc sống của chúng ta và có thể nói, AI xác định được tất cả mọi thứ.

“Các dự án chuyển đổi kỹ thuật số sẽ tiếp tục phá vỡ các giới hạn trải nghiệm của khách hàng vào năm 2023”

Chuyên gia trải nghiệm khách hàng, Aspect Software, đưa ra dự đoán về các thay đổi đối với trung tâm liên lạc và bối cảnh dịch vụ khách hàng trong năm 2023.

Đó là lý do tại sao các chuyên gia về AI như Joanna Bryson nói rằng điều đó rất cần thiết để chúng ta hiểu cách AI đưa ra quyết định, cách nó quyết định những gì chúng ta thấy và những gì chúng ta không thể, và vấn đề trách nhiệm của ai.

Joanna Bryson

“Chúng tôi sẽ chứng minh rằng chúng tôi đứng đằng sau những phần mềm này và phải chịu trách nhiệm về những gì chúng tôi đã làm” – Bryson, một nhà khoa học máy tính tại Đại học Bath ở Vương quốc Anh nói.

AI rất quan trọng và nó hiện diện xung quanh chúng ta. Và có lẽ những thách thức lớn nhất mà chúng tôi sẽ phải đối mặt trong tương lai là ảnh hưởng của chính trị, kinh tế và xã hội của việc không tối ưu đồng bộ hóa AI hiện nay.

Byson chia sẻ “Chúng tôi đã thực hiện bước nhảy vọt lớn về AI từ năm 2007 đến 2017, vì chúng tôi có nhiều dữ liệu hơn và chúng tôi đã cải tiến Machine Learning rất nhiều. Về lâu dài, tôi nghĩ rằng điều này sẽ đẩy nhanh tốc độ phát triển của chúng tôi. Vì vậy, bây giờ là thời điểm tốt nhất để tìm ra cách tích hợp AI vào cuộc sống của chúng ta”

Tham khảo thêm các vị trí tuyển dụng Machine Learning lương cao cho IT

AI

Morgan Frank – Nhà nghiên cứu ở MIT Media Lab và đồng tác giả của “Small Cities Face Greater Impact from Automation.” (Thành phố nhỏ đối mặt với tác động lớn từ từ động hóa) đã nhận định rằng “Sẽ ngày càng khó nhận ra bạn đang làm việc với công nghệ, bởi vì nó ở quanh ta và sẽ có nhiều tiện ích mà chúng ta mong đợi xuất hiện, ví dụ như Amazon Echo”.

IA ngày càng rẻ hơn và dễ làm hơn. Điều đó có nghĩa là các công ty sẽ sử dụng nó để thực hiện một loạt các công việc trên toàn bộ tổ chức. Ví dụ, nhiều người đang tận dụng IA để cung cấp dịch vụ khách hàng tốt hơn, nhanh hơn. Những người khác đang áp dụng IA để có được khả năng hiển thị nhiều hơn vào các kênh bán hàng, mô hình hoạt động và hoạt động hàng ngày của họ.

VMD2019
Vietnam Mobile Day năm thứ 9 với nhiều chủ đề hấp dẫn về Mobile Transformation

Nói cách khác, nếu bạn đang chờ đợi chu kỳ cường điệu IA lắng xuống. Hoặc, nếu bạn có kế hoạch đi chậm để mở rộng quy mô thí điểm IA đó tại một trong các đơn vị kinh doanh của bạn. Hãy suy nghĩ lại, bởi vì các doanh nghiệp không tự động nắm lấy cơ hội này (IA) sẽ “tự động” tan biến khỏi thị trường đầy tính khắc nghiệt và đào thải.

Đây là lý do tại sao nhiều CXO đang xoay vòng khỏi khoản tiết kiệm chi phí 10% của quá khứ để bù đắp vào khoản tiết kiệm chi phí từ 20 đến 40% cho lao động kỹ thuật số. Và xu hướng này sẽ tiếp tục trong năm 2023, theo kết quả của Khảo sát công việc trong tương lai của Appian, do IDG thực hiện:

  • 54% đã có hoặc đang có kế hoạch triển khai Machine Learning
  • 75% đã triển khai hoặc có kế hoạch triển khai IA trong năm tới
  • 41% kế hoạch thực hiện IA vào năm 20122

Sự phát triển nhanh chóng của điện toán đám mây, robot, trí tuệ nhân tạo và học máy đã đưa chúng ta vào đỉnh cao của sự tăng trưởng theo cấp số nhân trong tự động hóa thông minh trong ô tô, dầu khí, tiện ích, ngân hàng, dịch vụ tài chính và bán lẻ.  Vì vậy, nếu bạn là một trong số 40% các tổ chức lớn đang khám phá IA. Hoặc, nếu bạn trong số 38% chờ đợi để tự động hóa hoạt động của bạn ở nơi đầu tiên, đây có lẽ là thời điểm tốt để nhân đôi nỗ lực tự động hóa thông minh của bạn.

Tham khảo các vị trí tìm việc cho kỹ sư AI lương cao tại Topdev

Techtalk via information-age.com

Mẫu CV IT Administrator chuẩn nhất 2024

cv it administrator
cv it administrator

Liệu CV dân it sẽ được viết ra sao? Có gì khác so với các đặc trưng lĩnh vực khác hay không? Đặc biệt, viết CV IT Administrator như thế nào đủ tạo ấn tượng? Bài viết sau đây của TopDev sẽ mách cho bạn cách viết và những lưu ý khi viết CV IT Administrator.

Mẫu CV IT Administrator chuẩn

Thông tin liên hệ

Hãy cung cấp các thông tin về: 

  • Số điện thoại 
  • Email
  • Kênh liên hệ cá nhân (nếu có)

Mục tiêu nghề nghiệp

Mục tiêu này, bạn nên đưa ra các mục tiêu rõ ràng, tránh mơ hồ.

Ví dụ: Tôi nộp đơn vì mục đích: Có cơ hội trải nghiệm và phát triển nghề nghiệp tốt hơn. Tôi muốn làm việc tại … với vị trí IT Administrator và định hướng sắp tới, tôi hy vọng mình sẽ gặp gỡ các đối tác tiềm năng. Đồng thời, mục tiêu lâu dài tôi mong muốn trở thành một Administrator Manager. 

Nếu có thể, bạn hãy khéo kéo đưa vào một số thế mạnh: Một vài điểm nổi trội về bản thân

+ Kinh nghiệm làm việc (đề cập đến số năm kinh nghiệm)

+ Chứng chỉ chuyên ngành/kỹ năng mềm (nên có thông tin xác nhận) 

+ Các kỹ năng liên qua trực tiếp đến vị trí IT Administrator, các nền tảng kiến thức quan trọng từ các chương trình nghiên cứu

Trình độ học vấn

Liệt kê trường đại học hoặc các khoa học gần đây của bạn. Lưu ý, hãy đề cập đến các khóa học liên quan vị trí ứng tuyển. Điều này sẽ giúp CV IT của bạn thu hút hơn. Dù là CV IT tiếng anh hay tiếng việt, bạn cũng đang tạo ra lợi thế cho mình.

Các khóa học liên quan về:

  • Quản trị mạng
  • Quản lý bảo mật
  • Thiết kế web
  • Hỗ trợ ứng dụng và hệ thống email

Kinh nghiệm làm việc

Trình bày những kinh nghiệm làm việc tại các công ty trước đó (ghi cụ thể thời gian). Vị trí/chức vụ đảm nhận và các task – nhiệm vụ) cụ thể bạn thực hiện. 

Một số vị trí liên quan nền tảng: System Engineer, IT Excutive, IT Helpdesk,…

Bạn ghi rõ nhiệm vụ nhưng cần đảm bảo không quá dài dòng. Thông qua từng trải nghiệm công việc, nhà tuyển dụng sẽ hiểu rõ hơn về sự định hướng sự nghiệp sắp tới của bạn. Freelancer IT cũng đánh giá kinh nghiệm quan trọng cuộc đua nghề nghiệp của bạn.

  5 mẹo và mẫu CV IT để gây ấn tượng với nhà tuyển dụng!

Kỹ năng

Liệt kê các kỹ năng bạn có và đánh dấu mức độ thể hiện ở từng kỹ năng. Đây là một số kỹ năng cần có trong CV IT Administrator. Tuy nhiên, bạn vẫn phải đảm đảm độ chân thật với năng lực thực tế.

  • Giao tiếp
  • Kỹ năng tư duy hệ thống/quản lý
  • Teamwork
  • Tin học văn phòng
  • Ngoại ngữ
  • Kỹ năng hỗ trợ dịch vụ

Chứng chỉ, hoạt động, giải thưởng và các sở thích

Đây là phần nội dung bạn sẽ tự linh động về chúng có xuất hiện trong CV IT Administrator của mình hay không? Nếu có các chứng chỉ hoặc các thành tích cá nhân, bạn có thể bổ sung vào CV. Bạn nên cân nhắc và lựa chọn các thông tin có liên quan trước khi đưa chúng vào “tấm vé” tuyển dụng của mình.

Tạo CV online nhanh chóng, đẹp dành cho dân IT

Các mẫu CV IT Administrator trên TopDev

Bạn có thể tham khảo nội dung để hoàn thiện CV IT của mình.

cv system administrator
M1 – CV đa nhiệm

cv system administrator
M2 – CV đa nhiệm

cv system administrator
M3 – CV đa nhiệm

cv system administrator
Mẫu CV cổ điển

cv system administrator
Mẫu CV cổ điển

cv system administrator
M1 – CV Pro

cv it system administrator1 2 1
M2 – CV Pro

cv it system administrator
M3 – CV Pro


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

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

Xem thêm Xin việc công nghệ thông tin không yêu cầu KN tại TopDev

Tránh lỗi ConcurrentModificationException trong Java như thế nào?

Tránh lỗi ConcurrentModificationException trong Java như thế nào

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

Một trong những vấn đề phổ biến trong khi loại bỏ các phần tử từ một ArrayList trong Java là ConcurrentModificationException.

Nếu bạn sử dụng vòng lặp foreach và cố gắng thêm/ xóa phần tử khỏi ArrayList bằng phương thức remove(), bạn sẽ nhận được ConcurrentModificationException.

Tuy nhiên, nếu bạn sử dụng phương thức xóa của Iterator hoặc ListIterator bằng phương thức remove(), bạn sẽ không gặp lỗi này và có thể xóa phần tử đó.

Trong bài viết này, tôi sẽ giải thích, đưa ra một vài ví dụ cho bạn thấy được trường hợp xảy ra lỗi ConcurrentModificationException và cách có thể tránh lỗi này trong khi sửa đổi một ArrayList trong Java.

  Phân biệt ArrayList và LinkedList

  Code ví dụ Callable, Future, Executors trong Java

Ví dụ xảy ra lỗi ConcurrentModificationException

Thêm/ xóa phần tử khi sử dụng ArrayList.remove() khi duyệt qua for-each

package com.gpcoder.collection.list.ConcurrentModificationException;

import java.util.ArrayList;
import java.util.List;

public class ConcurrentModificationException1 {

    public static void main(String[] args) {
        List<String> languages = new ArrayList<>();
        languages.add("Java");
        languages.add("C#");
        languages.add("PHP");
        languages.add("C++");
        languages.add("Ruby");

        // Using forEach loop to iterate and add/ removing element during iteration will
        // throw ConcurrentModificationException in Java
        for (String language : languages) {
            if (language.equals("C#")) {
                languages.remove(language);
            }
        }
    }
}

Output của chương trình:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at com.gpcoder.collection.list.ConcurrentModificationException.ConcurrentModificationException1.main(ConcurrentModificationException1.java:18)

Ứng tuyển các vị trí việc làm Java lương cao trên TopDev

Thêm/ xóa phần tử sử dụng ArrayList.remove() khi duyệt qua Iterator

Iterator<String> iterator = languages.iterator();
while (iterator.hasNext()) {
    String language = iterator.next();
    if (language.equals("C#")) {
        languages.remove(language);
    }
}

Output của chương trình:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at com.gpcoder.collection.list.ConcurrentModificationException.ConcurrentModificationException2.main(ConcurrentModificationException2.java:19)

Tránh lỗi ConcurrentModificationException

Sử dụng vòng lặp for-index

for (int i = 0; i < languages.size(); i++) {
    String language = languages.get(i);
    if (language.equals("C#")) {
        languages.remove(language);
    }
}

Lưu ý: với cách này các bạn nên cẩn thận khi get phần tử theo index, có thể sẽ gặp lỗi IndexOutOfBoundsException.

Ví dụ:

for (int i = 0; i < languages.size(); i++) {
    String language = languages.get(i);
    if (language.equals("Ruby")) {
        languages.remove(language);
    }
    System.out.println(languages.get(i)); // IndexOutOfBoundsException
}

Output của chương trình:

Java
C#
PHP
C++
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at com.gpcoder.collection.list.ConcurrentModificationException.ForIndexExample.main(ForIndexExample.java:21)

Sử dụng phương thức remove() được hỗ trợ bởi Iterator

Iterator<String> iterator = languages.iterator();
while (iterator.hasNext()) {
    String language = iterator.next();
    if (language.equals("C#")) {
        // languages.remove(language); // Don't use ArrayList.remove()
        iterator.remove();
    }
}

Không remove trong khi duyệt các phần tử

Nếu chúng ta muốn giữ vòng lặp for-each, thì chúng ta cần đợi cho đến khi kết thúc trước khi chúng ta xóa các phần tử.

List<String> toRemove = new ArrayList<>();
for (String language : languages) {
    if (language.equals("C#") || language.equals("Ruby")) {
        toRemove.add(language);
    }
}
languages.removeAll(toRemove); // [Java, PHP, C++]

Sử dụng phương thức removeIf() trong Java 8

languages.removeIf(language -> language.equals("C#") || language.equals("Ruby"));

Sử dụng Stream filter() trong Java 8

List<String> removedList = languages.stream()
    .filter(language -> language.equals("C#") || language.equals("Ruby"))
    .collect(Collectors.toList());

Trong bài viết này, tôi đã trình bày cho bạn thấy một số trường hợp có thể gặp phải nếu bạn thêm/ xóa một phần tử khi đang duyệt và cũng đã cung cấp một số giải pháp để giải quyết lỗi ConcurrentModificationException. Hy vọng bài viết giúp ích cho các bạn, hẹn gặp lại ở các bài viết tiếp theo.

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

Hiểu sâu về mobile app deep link

Hiểu sâu về mobile app deep link

Mobile app linking (bao gồm cả mobile app deep link) là công nghệ cho phép run app và mở một trang hoặc một screen cụ thể ở trong app khi người dùng nhập hoặc nhấn vào URL ở trên trang web hoặc ứng dụng khác.

URL thì anh em cũng biết rồi, từ đông chí tây, từ mail tới app, share qua mess, vân vân mây mây. Nói chung rất chi là nhiều URL được chia sẻ nếu ứng dụng của anh em có phiên bản web.

mobile app deep link

Việc triển khai mobile app deep link giúp tăng trải nghiệm người dùng (ấn đâu thì ấn, đi đâu thì đi nhưng cuối cùng vẫn về app của em). Ngoài ra nó còn tăng tỷ lệ chuyển đổi (từ nguồn social, marketing dẫn về app của anh em).

Bài viết này tui sẽ liệt kê cụ thể những gì cần có ở deep linking. Mobile app deep link cho cả AndroidiOS như thế nào. Bắt đầu thôi anh em ui.

1. Tại sao chúng ta cần deep linking?

Ví dụ anh em code rần rần cho ra được 1 app cả android và iOS (flutter đi ha). Mọi thứ ok anh em submit review app lên store, duyệt. Ngon lành cành đào app lên store xong.

Mà app âm nhạc thì phải có bài hát, không hát không hò thì còn gì là app âm nhạc. Rồi nhạc thì phải có bìa album cho nó bắt cmn mắt. Không bắt mắt thì khó làm marketing.

Sau khi đã có album ngầu lòi, nhạc bá cháy bọ chét thì sau đó anh em bán luôn con xe đổ tiền vào chiến dịch marketing, trong chiến dịch đó thì hình album chắc chắn show ra. Nhưng để khuyến khích người dùng vào nghe tại app thì mỗi hình album là chưa đủ.

Tại sao chúng ta cần deep linking?

Vậy expect là khi người dùng bấm vào link album trên web -> link người dùng tới app và mở một đoạn sample âm nhạc. Bùm chíu bùm chang bùm bùm bùm.

Ví dụ trên đây cho thấy sự cần thiết như thế nào khi dùng deep linking, deep linking giúp những ý tưởng kết nối giữa web và app trở nên khả thi hơn bao giờ hết. Nó giúp cho end user có trải nghiệm liền mạch, tăng đáng kể tỷ lệ chuyển đổi của người dùng. Chi tiết thêm anh em có thể đọc bài viết này

  3 trang web giúp kết hợp nhiều link thành một link rút gọn duy nhất

2. Trọng tâm của mobile app deep link

Như anh em đã biết ở phần một, deep linking giúp người dùng di chuyển từ web qua app, từ app qua web một cách liền mạch, không có trở ngại. Việc đem lại sử trải nghiệm liền mạch giữa web và app giúp tăng chuyển đổi.

Nếu anh em muốn chạy quảng cáo chiến dịch bán hàng dịp năm mới, một loạt sản phẩm sẽ được giảm giá. Tất nhiên người dùng sẽ không ấn vào để đặt hàng trên web, cái họ cần và mình cần là đặt trên app. Khi ấn vào URL chạy quảng bá, nếu người dùng đã cài app thì sẽ mở thẳng app lên. Mở app lên thì danh sách sản phẩm giảm giá cũng sẽ hiện lên.

Rõ ràng thay vì phải vào web, ấn vào link tải app, deep linking mang lại trải nghiệm tốt hơn. Kích thích mua hàng hơn. Giữ chân người dùng cũng là trọng tâm của deep linking, qua app là cả một bầu trời tính năng mở ra. Thoải mái lướt web nhưng vẫn quay về mua hàng của anh em.

Nếu có cả một hệ sinh thái từ website cho tới app với các dịch vụ khác nhau, deep linking cho phép người dùng trải nghiệm thông suốt trong hệ sinh thái.

Rồi ha, xong trọng tâm, ưu điểm và ví dụ sắc nét về deep linking. Giờ là lúc bay vào 2 loại deep linking chính đang có.

Tham khảo việc làm lập trình viên Mobie hấp dẫn

3. Hai loại deep links

Trên thị trường hiện đang bày bán 2 loại deep links, một là Default (mặc định) và Deferred (hoãn lại). Mời anh em tham khảo từng loại.

3.1 Default deep links

Loại cơ bản và mặc định của deep link chỉ chuyển hướng người dùng đến app khi và chỉ khi app đã được cài đặt trên mobile của anh em. Nếu app chưa được cài thì khi anh em ấn vào url, lỗi sẽ xuất hiện.

Chính vì default deep links chỉ hỗ trợ link tới app khi mà người dùng đã tải app và sử dụng trước đó. Nên thường loại deep links này hỗ trợ quảng cáo lại nhóm khách hàng thân quen. Anh em chỉ sử dụng link này quảng bá tới enduser mà chắc chắn là đã cài app.

Cái này có thể là tư vấn qua web cho khách hàng đã có tài khoản, hoặc khi khách hàng có vấn đề trên web link tới app để xem hướng dẫn mobile app deep link.

  Mobile native là gì? Vì sao nên phát triển mobile app bằng Native

3.2 Deferred deep links

Loại thứ hai nâng cao hơn, như hàng ngoài chợ có rẻ có đắt. Cả hai đều tốt nhưng Deferred deep links lại phức tạp hơn Default deep links. Loại deep links có thể hướng người dùng tới app store để cài đặt app nếu ứng dụng chưa được cài. Khá là tiện lợi.

Ngoài ra deep links kiểu này còn cho phép người dùng ghé qua trang web để lấy thông tin, sau khi đã tải và cài đặt app.

Ví dụ anh em đặt một đôi giày, nếu Shopee hay Lazada chưa cài đặt thì sau khi cài đặt xau, anh em sẽ bay thẳng tới cái đôi giày đó, tất cả những gì cần làm là bấm đặt hàng.

Hướng dẫn về loại deep links này anh em có thể tham khảo thêm ở đây cho Android và đây cho iOS.

https://www.youtube.com/watch?v=XJgPIeolJu8

4. Contextual deep linking?

Contextual ở đây là ngữ cảnh, loại liên kết theo ngữ cảnh này cho phép bổ sung thêm một số thông tin ở deep links phục vụ theo từng ngữ cảnh riêng biệt.

Việc sử dụng ở từng ngữ cảnh sẽ cần thêm các parameters khác nhau. Mobile app deep link hữu dụng hơn với parameters.

5. Tạo deep links như thế nào?

Cái đầu tiên của tạo deep links là generate (tạo ra deep links thủ công). Việc này có 2 bất cập rõ ràng có thể nhận ra:

  • Thứ nhất là rất mất thời gian để tạo ra deep links theo cách thủ công. Những trường hợp có nhiều deep links sẽ tiêu tốn một lượng thời gian khổng lồ.
  • Thứ hai là bất cứ việc làm gì nếu đã là thủ công do con người làm đều có thể dẫn ra lỗi (human mistake). Lỗi đánh máy thì kể cả có là kỹ sư hay người nhập liệu giỏi nhất đôi khi cũng mắc lỗi

Chính vì vậy, việc generate tự động backlink là công cụ hữu hiệu, giúp loại bỏ sai sót, tiết kiệm thời gian. Thời gian và công sức dành cho chiến dịch cũng là điều phải cân nhắc tới.

Về công cụ tạo deep links thì anh em có thể tham khảo qua Adjust’s Deeplink Generator. Tools này cho phép anh em tạo ra deeps link đầy đủ. Hoạt động được cho cả Android và iOS. Giảm bớt thời gian và công sức.

Anh em chú ý là scheme-based của mobile app deep linking cho Android và iOSiOS 9+ Universal Link đều có tài liệu cụ thể. Anh em có thể tham khảo. Có demo đầy đủ xem hoạt động như nào luôn.

6. Implement deep link cho Android

Trước khi bắt tay vào implement deep linking cho Android, giả sử anh em có linking url là yourapp://path/, và app bundle ID là com.yourapp.example

Đầu tiên là sử dụng Javascript.

6.1 Javascript solutions

Cách cũ và được sử dụng nhiều từ xưa tới nay là dùng iframe để load deep link URL và set delay để chuyển hướng tới store. Bằng cách sử dụng Javascript thì khi input URL vào, việc đầu tiên browser cần làm là load yourapp://path/ trước

  • Nếu app đã cài đặt, app sẽ mở lên, đoạn code JS sẽ không thực thi.
  • Nếu app chưa được cài đặt, không có gì trả về khi anh em load yourapp://path/. Sau đó 2 giây, đoạn code Javascript sẽ chạy, chuyển hướng anh em tới App Store hoặc Play Store. Anh em tiến hành cài app trên đó

Cách dùng JS có một vấn đề nhỏ là sau khi code đã thực thi, anh em đã tới store cài xong. Ấn back lại web, lúc này JS lại được thực thi -> enduser lại tiếp tục bay tới store

6.3 Intent solutions

Kể từ Chrome cho Android phiên bản 25 trở lên, code JS không còn được support để chuyển hướng người dùng tới Store. Thay vào đó Google cung cấp Intent URL như một giải pháp tốt hơn. Khi người dùng ấn vào đường dẫn intent://path/#Intent;scheme=yourapp;package=com.yourapp.example;

  • Nếu app đã được cài đặt, app sẽ được mở bở Chrome
  • Nếu app chưa được cài đặt, Chrome sẽ mở Play Store

7. Loại deep link nào anh em nên sử dụng

Sau khi đã nắm sơ 2 giải pháp xài deep links thì có vẻ như Intent là giải pháp khuyếnh khích anh em sử dụng. Tuy nhiên là không phải lúc nào và ai ai cũng xài bản Android từ 25 trở lên.

Thành ra tiện thì rất là tiện nhưng không phải lúc nào Intent URL cũng hoạt động

mobile app deep link

8. Implement deep links cho iOS

8.1 Giải pháp Javascript

Tương tự như Android, cũng có vài trick iOS nếu muốn xử cái deeplink thông qua iOS

html <script>

window.location.replace("yourapp://path/"); setTimeout(function () {

window.location.replace("https://itunes.apple.com/app/id12345678"); }, 2000);

</script>

  • Nếu app đã cài. dòng đầu tiên sẽ chạy, mở app lên và cái đoạn code mở store itunes sẽ không chạy nữa
  • Nếu app chưa cài, dòng đầu chạy nhưng không có cái gì, dẫn tới cái timeout chạy, sau 2 giây sẽ mở app trên app store cho anh em xài.

Cách này thì work cho iOS 8 trở về sau trên Safari nhưng các version khác thì không phải lúc nào cũng work. Anh em tham khảo bảng dưới đây.

mobile app deep link

8.2 Giải pháp universal link

Bắt đầu từ iOS 9, Apple release universal link, hoạt động tương tự như Android intent nhưng yêu cầu cài đặt nhiều hơn. Từ bản 9.2 thì Apple không còn hỗ trợ giải pháp sử dụng Javascript (do cái promp window không modal nữa)

Để bật được universal link, anh em cần một URL có SSL (ví dụ như https://yourdomain.com/), cái domain này phải liên kết tới ứng dụng của anh em và phải được deploy ở https://yourdomain.com/apple-app-site-association.

{
  "applinks": {
      "details": [
           {
             "appIDs": [ "ABCDE12345.com.example.app", "ABCDE12345.com.example.app2" ],
             "components": [
               {
                  "#": "no_universal_links",
                  "exclude": true,
                  "comment": "Matches any URL with a fragment that equals no_universal_links and instructs the system not to open it as a universal link."
               },
               {
                  "/": "/buy/*",
                  "comment": "Matches any URL with a path that starts with /buy/."
               },
               {
                  "/": "/help/website/*",
                  "exclude": true,
                  "comment": "Matches any URL with a path that starts with /help/website/ and instructs the system not to open it as a universal link."
               },
               {
                  "/": "/help/*",
                  "?": { "articleNumber": "????" },
                  "comment": "Matches any URL with a path that starts with /help/ and that has a query item with name 'articleNumber' and a value of exactly four characters."
               }
             ]
           }
       ]
   },
   "webcredentials": {
      "apps": [ "ABCDE12345.com.example.app" ]
   },


    "appclips": {
        "apps": ["ABCED12345.com.example.MyApp.Clip"]
    }
}

File này cho anh em biết đường dẫn nào sẽ link tới app nào. Trong XCode anh em chỉ cần nhâp app links com.apple.developer.associated-domains entitlement là xong. Một domain sẽ được link tới nhiều ứng dụng và ngược lại một ứng dụng cũng có thể link tới nhiều domain.

Ví dụ như anh em truy cập và link https://yourdomain.com/dress/  với thiết lập “paths”:[ “/dress/”]  trong JSON file. Khi user nhập https://yourdomain.com/dress/1  trong Safari

  • Nếu app đã được cài đặt, app sẽ được mở lên khi người dùng truy cập đường dẫn ở trên Safari. Ta có thể handle View nào cần được mở
  • Nếu app chưa được cài đặt thì đường link https://yourdomain.com/dress/1 vẫn được mở trên Safari và bạn vẫn có thể hiển thị sản phẩm trên web hoặc chuyển hướng tới App Store.

Universal link xem ra là giải pháp hoàn hảo cho iOS. Nhưng một lần nữa, bản thân universal link cũng có một vài nhược điểm.

  • Đầu tiên là Universal link chỉ work trên Safari hoặc Chrome
  • Khi một site chuyển hướng với universal links. Nó chỉ hoạt động nếu người dùng ấn vào universal links, nếu link ấn trên email là https://anotherDomain.com/  chuyển hướng tới universal link là https://yourDomain.com/dress/1 thì universal link sẽ không work. Nhưng nếu mở link https://yourDomain.com từ safari thì lại work
  • Universal links sẽ không work nếu paste thẳng trên address bar
  • Univeral links sẽ không work nếu redirect thực hiện bằng JS.
  • Universal links sẽ không work nếu gọi bằng openURL ở trong app.

Phù, cuối cùng cũng hết. Phê con tê tê với deep links

9. Tham khảo

Cảm ơn anh em đã đón đọc – Thank you for your time, have a good day with deep links – Happy coding!

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

Xem thêm:

Cập nhật it jobs Developer lương cao mới nhất TopDev

Lưu ý cho Lock trong Java

Lưu ý cho Lock trong Java

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

Khi lập trình đa luồng việc đảm bảo tính threadsafevisiable,… là rất quan trọng. Để đạt được mục đích này, Java cung cấp rất nhiều phương pháp trong package java.util.concurrent

Bài viết này sẽ cung cấp cho các bạn đầy đủ những kiến thức về lớp này để có thể áp dụng vào các project của mình.

Khi lập trình hoặc các tài liệu về concurrent thường sẽ đề cập đến khái niệm ReentrantReentrant Lock. Vậy cụ thể tính Reentrant là gì? Xét ví dụ sau:

public class ReentrantTest {

    private final Object object = new Object();

    public void setA() {
        synchronized (object) {
            System.out.println("setA");
            setB();
        }
    }

    public void setB() {
        synchronized (object) {
            System.out.println("setB");
        }
    }

    public static void main(String[] args) {
        ReentrantTest t = new ReentrantTest();
        t.setA();
    }
}

Nếu Lock được sử dụng trong hàm main() bên trên không phải dạng Reentrant thì sẽ gây ra deadlock và không thể kết thúc được chương trình.

Trong Java có các loại reentrant lock sau :

  • synchronized
  • Các lock kế thừa từ class ReentrantLock.java. Trong quá trình làm việc của mình thì chỉ có một Lock không Reentrant đó là StampedLock

  Class trong Java là gì? Object trong Java là gì?

  Record class trong Java

Xét ví dụ khai báo ReentrantLock : var lock = new ReentrantLock();. Click vào trong lớp ReentrantLock.java ta thấy được hàm khởi tạo sau ta sẽ thấy FairSync và NonfairSync

    /**
 * Creates an instance of {@code ReentrantLock}.
 * This is equivalent to using {@code ReentrantLock(false)}.
 */
public ReentrantLock(){
        sync=new NonfairSync();
        }

/**
 * Creates an instance of {@code ReentrantLock} with the
 * given fairness policy.
 *
 * @param fair {@code true} if this lock should use a fair ordering policy
 */
public ReentrantLock(boolean fair){
        sync=fair?new FairSync():new NonfairSync();
        }

Giả sử ta có 3 threadT1,T2,T3 cùng muốn truy cập một tài nguyên R. Theo thứ tự thời gian thì T1 đến trước sau đó lần lượt là T2 và T3T2T3 đến sau nên phải đợi T1 release Lock mới có thể truy cập tài nguyên của R.

Vậy bài toán ở đây là sau khi T1 release Lock thì T1 hay T2 sẽ là luồng tiếp theo lấy được Lock.

Để giải quyết bài toán này Java có 2 chiến thuật :

  • FairSync: đảm bảo được thứ tự luồng nào chờ lâu nhất thì sẽ lấy được lock. Trong ví dụ trên là T2.
  • NonfairSync: không đảm bảo thứ tự, bất cứ luồng nào đang chờ đều có thể lấy được lock.

Tham khảo thêm về công việc của Java Developer tại đây

Dựa vào hàm khởi tạo mặc định Lock của Java thì chúng ta có thể đoán được NonfairSync sẽ mang lại hiệu năng tốt hơn.

NonfairSync mang lại hiệu năng cao hơn vì 2 lý do sau :

  • Nó không cần quan tâm đến thứ tự các thread nên sẽ không phải duy trì thêm một cấu trúc dữ liệu để phục vụ cho điều này vì vậy code phần này sẽ đơn giản hơn nhiều. Ngược lại FairSync cần phải sử dụng thêm cấu trúc dữ liệu AbstractQueuedSynchronizer để xác định được thứ tự sử dụng lock
  • Khi đánh thức tất cả các thread thì sẽ có thread dậy nhanh, thread dậy chậm. Vì vậy thread dậy trước sẽ lấy lock và thực hiện logic trước và sau đó nó sẽ trả lại lock cho các thread sau. Vì vậy sẽ tăng được hiệu năng sử dụng.

Giả sử ta có theo thời gian ta có thread T1, T2, T3T2, T3 đang chờ lock được trả lại của T1

  • Thời gian cần để thức dậy của T3 là w3 = 1ms
  • Thời gian thực hiện loigc của T3 là l3 = 1ms
  • Thời gian cần để thức dậy của T2 là w2 = 3ms
  • Thời gian thực hiện loigc của T2 là l2 = 2ms

Tổng thời gian để thực hiện xong logic của T2,T3 là:

  • FairSync : w2 + l2 + w3 + l3 = 3 + 2 + 1 +1 = 7 ms
  • NonfairSync: w3 +l3+ (w2 – w3 + l3) + l2 = 1 + 1+ (3 -1 -1 )+ 2 = 5 ms

Mặc định của các loại lock của Java sẽ sử dụng cách thức NonfairSync , vì nó mạng lại hiệu năng cao hơn với phương pháp FairSyncsynchronized sẽ sử dụng NonfairSync. Sẽ có benchmark bên dưới.

synchronized là một loại lock của Java, khi một thread gọi phương thức trong synchronized block thì nó sẽ tự động acquires một intrinsic lock.

synchronized là một dạng reentrant vì vậy trong ví dụ đầu tiên sẽ không bị deadlocksynchronized chỉ hỗ trợ NonfairSync.

Các dữ liệu được thay đổi trong synchronized block sẽ được tất cả các luồng nhìn thấy.

ReentrantLock chắc chắn sẽ là reentrant, nó hỗ trợ cả 2 loại NonfairSync và FairSync. Mặc định sẽ sử dụng chiến thuật NonfairSync.

Các dữ liệu được thay đổi trong ReentrantLock hoặc bất cứ loại lock nào đều được các luồng nhìn thấy khi thực hiện acquires lock

ReentrantLock implement interface Lock vì vậy nó cũng cấp thêm một số API mà synchronized không có như :

  • Hỗ trợ timeout khi acquires lock
  • tryLock() sẽ không block lại thread mà trả lại kết quả luôn là có acquires lock hay không

Sử dụng Lock interface thì lưu ý luôn luôn phải unlock tốt nhất nên dùng finally để tránh trường hợp deadlock.

  Java Serializable là gì? Serialization và Deserialization trong Java

  Java Developer là gì? Lộ trình để trở thành Java Developer

Các ảnh benchmark bên dưới được đo bởi phiên bản Java 11, theo throughput, Code đo hiệu năng tại Link.

benchmark

Một luồng đọc và luồng ghi

benchmark

Một luồng đọc và 19 luồng ghi

benchmark

19 luồng đọc và một luồng ghi.

Vì chưa tìm ra được chế độ để upload gallery trên github nên mọi người xem đầy đủ các hình ảnh benchmark tại benchmark-result

Đây không phải một Lock của Java, đây chỉ là một chiến thuật sử dụng Lock hiệu quả. Thiết kế này chia tài nguyên cần khóa thành các segment và một segment sẽ được kiểm soát độc lập với nhau.

Cách thiết kế này được sử dụng trong ConcurrentHashMap của JavaConcurrentHashMap có hàm khởi tạo sau:

public ConcurrentHashMap(int initialCapacity,float loadFactor,int concurrencyLevel);

Từ Java version < 1.8 giả sử concurrencyLevel=16 ở đây nghĩa sẽ có tối đa 16 thread có thể thay đổi dữ liệu trong ConcurrentHashMap thay vì chỉ 1 thread có quyền ghi vào Map.

Implement ConcurrentHashMap Java 1.7 ConcurrentHashMap java 1.7

Từ Java version >=1.8 concurrentLevel không còn ý nghĩa để giới hạn luồng ghi nữa, ConcurrentHashMap của phiên bản này đã chuyển sang implement bằng Unsafe và ít Lock hơn rất nhiều, cụ thể như sau:

  • Nếu hashslot hiện tại còn trống thì sẽ sử dụng lệnh U.compareAndSetObject(tab, ((long)i << ASHIFT) + ABASE, c, v); để thêm object vào hashTable, hàm này không block
  • Nếu hashslot đã có Object ghi vào thì sử dụng synchronized cho duy nhất hashslot đó để thực hiện ghi. Vì vậy số thread tối đa được có quyền thay đổi ConcurrentHashMap sẽ là số lượng hashslot

Chi tiết Implement ConcurrentHashMap Java 11 tại ConcurrentHashMap java 11

    final V putVal(K key,V value,boolean onlyIfAbsent){
        if(key==null||value==null)throw new NullPointerException();
        int hash=spread(key.hashCode());
        int binCount=0;
        for(Node<K, V>[]tab=table;;){
        Node<K, V> f;int n,i,fh;K fk;V fv;
        if(tab==null||(n=tab.length)==0)
        tab=initTable();
        else if((f=tabAt(tab,i=(n-1)&hash))==null){
        if(casTabAt(tab,i,null,new Node<K, V>(hash,key,value)))
        break;  // no lock when adding to empty bin
        }
        else if((fh=f.hash)==MOVED)
        tab=helpTransfer(tab,f);
        else if(onlyIfAbsent // check first node without acquiring lock
        &&fh==hash
        &&((fk=f.key)==key||(fk!=null&&key.equals(fk)))
        &&(fv=f.val)!=null)
        return fv;
        else{
        V oldVal=null;
synchronized (f){ // lock here
        if(tabAt(tab,i)==f){
        if(fh>=0){
        //............................
        }
        }

synchronized và ReentrantLock là các khóa độc quyền (Exclusive lock), nghĩa là trong một thời điểm chỉ có duy nhất một thread có quyền truy cập và giao tiếp với tài nguyên dùng chung.

Nhưng sẽ có rất nhiều chương trình có yêu cầu đọc nhiều hơn rất nhiều so với yêu cầu ghi. Sử dụng Exclusive lock sẽ làm giảm hiệu năng sử dụng trong trường hợp này.

Để nâng cao hiệu năng thì cần sử dụng một shared lock để các thread có thể cùng lúc có thể đọc dữ liệu dùng chung.

ReentrantReadWriteLock là một giải pháp cho các chương trình trên, nó cung cấp 2 loại Lock:

  • readlock : Dùng để read. Nhiều luồng có thể đọc dữ liệu cùng một lúc nếu không có luồng update dữ liệu
  • writelock : Dùng để write. Chỉ có 1 luồng được update dữ liệu tại một thời điểm.

Hiểu sâu hơn về ReentrantReadWriteLock cần phải trả lời được một số câu hỏi sau :

  • Có quá nhiều ReadLock đang chờ acquire() thì writelock sẽ phải chờ cho đến khi nào nữa thì mới có thể accquire được lock.
  • Khi một thread release writelock, thời điểm đó có yêu cầu accquire() của nhiều readlock() và writelock() thì readlock() hay writelock() sẽ được acquire(). Nếu readlock() được acquire thì sẽ tăng tính concurrent nhưng sẽ lại làm đói writelock

Tại phiên bản Java 11 thì ReentrantReadWriteLock đang được implement để thiên vị hơn cho writelock.

Tạo điều kiện tối đa cho writelock có thể acquire được Lock. Cụ thể khi đọc mã nguồn của ReentrantReadWriteLock khi thực hiện acquire() :

  • readlock : Một thread muốn acquire readlock() phải kiểm tra trong AbstractQueuedSynchronizer có writeLock() chờ được acquire hay không.
  • writelock :
    • Nếu lock có thể acquire (hiện tại không có readlock/writelock) thì thực hiện acquire và đánh dấu writelock đang giữ lock.
    • Nếu lock không thể acquire thì thực hiện ghi writeLock vào đầu AbstractQueuedSynchronizer, để được ưu tiên acquire

StampedLock là một loại lock mới cung cấp 3 loại lock: ReadLockWriteLock và Optimistic Read.

StampedLock không có tính chất Reentrant.

Optimistic Read sẽ mang lại 2 ưu điểm sau :

  • Optimistic Read không phải là một Lock thế nên tốc độ của nó sẽ nhanh hơn readLock
  • Write Thread sẽ không bị block khi có rất nhiều thread thực hiện Optimistic Read.

Pattern hay sử dụng với Optimistic Read như sau, tham khảo java doc StampedLock Java Doc

Theo benchmark thì StampedLock sẽ có tốc độ hơn rất nhiều so với ReentrantReadWriteLock khi có rất nhiều luồng đọc và ít luồng ghi.

Trong lập trình đơn luồng chúng ta sử dụng if-else để kiểm tra điều kiện sau đó thực hiện logic.

Trong lập trình đa luồng việc dùng if-else sẽ không khả thi bởi vì điều kiện sẽ được một thread khác thay đổi vậy nên sử dụng if-else sẽ không kết luận được gì cả.

Vì vậy chúng ta cần có một cơ chế để thực hiện giao tiếp giữa các Thread với nhau, để phục vụ điều đó chúng ta có interface Condition.

Nếu không sử dụng Condition, trong bài toán consumer-producer, các Thread giao tiếp thông qua một threadsafe queue có thể phải implement consumer như sau:

    public V take()throws InterruptedException{
        while(true){
            synchronized (this){
                if(!isEmpty())
                     return doTake();
                }
            Thread.sleep(100);
        }
    }

Thread sẽ phải sleep() một khoảng thời gian nhất định rồi kiểm tra lại xem đã có dữ liệu với trong queue chưa, điều này hiển nhiên là lãng phí.

Khi sử dụng Condition thì sẽ tiết kiệm hơn rất nhiều. Ví dụ method take() của ArrayBlockingQueue

public E take()throws InterruptedException{
        final ReentrantLock lock=this.lock;
        lock.lockInterruptibly();
        try{
            while(count==0)
                notEmpty.await();
            return dequeue();
        }finally{
            lock.unlock();
        }
    }

notEmpty ở đây sẽ là một Condition dùng để giao tiếp giữa các luồng consumer và producer. khi notEmpty.await() thì thread sẽ release lock,sau khi được thread khác đánh thức thì thread đang chờ bắt buộc phải acquire được lock trước khi thực hiện tiếp logic

Pattern khi sử dụng Condition thông thường sẽ là :

        acquire lock on object state 
        while(precondition does not hold){
            release lock
            wait until precondition might hold
            reacquire lock
        }
        perform action
        release lock
        (Java concurrent in practive)

Một số lưu ý khi sử dụng object.wait() hay Condition :

  • Nên sử dụng notifyAll()
  • Thread gọi notifyAll(), await(), wait() ,… nên là Thread acquired lock.
  • Nên để điều kiện check trong vòng lặp while() thay vì if-else. Bởi vì chúng ta cần thiết phải check lại điều kiện trước khi gọi await() và sau khi được trả về từ await() vì trong môi trường multiThread có thể điều kiện đã bị một Thread khác thay đổi.
  20 câu hỏi phỏng vấn Javascript dành cho Intern/Fresher

Trong ảnh benchmark bên trên chúng ta thấy một class khá mới là LongAdder. Lớp này có hiệu năng cực kỳ cao khi có nhiều luồng cùng thực hiện ghi vào. Lý do là lớp này đã sử dụng cơ chế segment khi có tương tranh khi ghi ( >= 2 luồng cùng thực hiện ghi vào LongAdder) và nguyên tắc padding dữ liệu cho các segment này.

padding là cơ chế chống lại false-sharing tại tầng Cache L1,L2,L3 của CPU. Bài viết về kỹ thuật này đã được giới thiệu qua tại Mechanical-sympathy, tương lai sẽ có bài riêng nói rõ hơn về cơ chế happen-before và padding.

Cụ thể ta xét code của LongAdder.

public class LongAdder extends Striped64 implements Serializable {
    transient volatile Cell[] cells;
    transient volatile long base;

    public void add(long x) {
        Cell[] cs;
        long b, v;
        int m;
        Cell c;
        if ((cs = cells) != null || !casBase(b = base, b + x)) {
            boolean uncontended = true;
            if (cs == null || (m = cs.length - 1) < 0 ||
                    (c = cs[getProbe() & m]) == null ||
                    !(uncontended = c.cas(v = c.value, v + x)))
                longAccumulate(x, null, uncontended);
        }
    }

    public long sum() {
        Cell[] cs = cells;
        long sum = base;
        if (cs != null) {
            for (Cell c : cs)
                if (c != null)
                    sum += c.value;
        }
        return sum;
    }
}

@jdk.internal.vm.annotation.Contended
static final class Cell {
    volatile long value;

    Cell(long x) {
        value = x;
    }

    final boolean cas(long cmp, long val) {
        return VALUE.compareAndSet(this, cmp, val);
    }

    final void reset() {
        VALUE.setVolatile(this, 0L);
    }

    final void reset(long identity) {
        VALUE.setVolatile(this, identity);
    }

    final long getAndSet(long val) {
        return (long) VALUE.getAndSet(this, val);
    }

    // VarHandle mechanics
    private static final VarHandle VALUE;

    static {
        try {
            MethodHandles.Lookup l = MethodHandles.lookup();
            VALUE = l.findVarHandle(Cell.class, "value", long.class);
        } catch (ReflectiveOperationException e) {
            throw new ExceptionInInitializerError(e);
        }
    }
}

Tại hàm add(long x) cũng tương tự như các lớp AtomicLongAdder cũng dùng cơ chế CAS để thực hiện thay đổi biến volatile long base.

Nhưng có chút khác biệt là khi thực hiện CAS bị false hoặc trước đó đã có lần bị false thì ngay lập tức tìm Cell tương ứng với luồng thực hiện hàm add(). Sau đó thực hiện CAS trên lớp Cell này.

Lớp Cell được đánh dấu là Contended thì JVM sẽ thực hiện padding các dữ liệu trong lớp này để tránh trường hợp false sharing.

False Sharing có thể sảy ra tại lớp LongAdder vì các thread không bị block khi thực hiện CAS trên lớp Cell. Và lớp LongAdder này lại lưu một mảng Cell, vậy rất có thể xảy ra trường hợp một thread thay đổi giá trị của Cell sẽ có thể khiến các thread đang thay đổi cell khác bị invalid cache.

Trên đây là các khái niệm cơ bản mình nghĩ các bạn cần phải nắm rõ để quá trình làm việc dễ dàng hơn, kèm theo đó cũng là một số kiến thực mình tự tìm hiểu và tổng hợp được trong quá trình làm việc. Nó sẽ phát huy khá nhiều trong quá trình phỏng vấn của các bạn đó.

Bài này khá dài rồi nên phần visiable mình sẽ viết tại bài blog của tháng sau. Hy vọng bài này cung cấp cho các bạn một chút kiến thức để trong quá trình làm việc hiệu quả hơn.

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

Xem thêm:

Tuyển dụng IT lương cao, đãi ngộ hấp dẫn. Ứng tuyển ngay!

Giới thiệu về JAMstack – kiến trúc phát triển web hiện đại

Giới thiệu về JAMstack

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

JAMstack là gì?

JAMstack là một kiến trúc phát triển web hiện đại. Nó không phải là ngôn ngữ lập trình hay bất kỳ hình thức công cụ nào. Đây là một cách thức phát triển web nhằm mục đích thực thi hiệu suất tốt hơn, bảo mật cao hơn, giảm chi phí mở rộng và giúp cho trải nghiệm của nhà phát triển trở nên tốt hơn.

Bạn có thể đã gặp các thuật ngữ cụ thể như MEANstackMERNstack. Đây chỉ là những thuật ngữ được sử dụng để phân loại hoặc nhóm một số công nghệ nhất định với mục đích đạt được một mục tiêu cụ thể. JAMstack cũng vậy, JAMstack ở đây là viết tắt của:

  • JavaScript
  • API
  • Markup
  • Stack nói chung chỉ là sự kết hợp của một số công nghệ được sử dụng để tạo ra một trang web hoặc ứng dụng di động. Vì vậy, JAMstack là sự kết hợp của JavaScript, API và Markup.
JAMstack

JAMstack là một kiến trúc phát triển web hiện đại dựa trên JavaScript phía client, các API có thể sử dụng lại và Markup dựng sẵn. Khi chúng ta nói về chủ đề Stack, chúng ta không còn nói về hệ điều hành, máy chủ web cụ thể, ngôn ngữ backend hoặc cơ sở dữ liệu. JAMstack không phải về công nghệ cụ thể. Nó là một cách mới để xây dựng các trang web và ứng dụng mang lại hiệu suất tốt hơn, bảo mật cao hơn, chi phí mở rộng thấp hơn và trải nghiệm nhà phát triển tốt hơn.

THEO TÀI LIỆU CHÍNH THỨC CỦA JAMSTACK

  IoV (Internet of vehicle) là gì? Kiến trúc IoV

  Phát triển web nhờ các nguồn thông tin miễn phí sao cho hiệu quả?

Tại sao là JAMstack ?

JAMstack

Các trang web truyền thống hoặc các trang web CMS (ví dụ: WordPress, Drupal, v.v.) phụ thuộc nhiều vào máy chủ, plugin và cơ sở dữ liệu. Nhưng JAMstack có thể tải một số JavaScript nhận dữ liệu từ API, phục vụ các tệp từ CDN và đánh dấu được tạo bằng trình tạo trang tĩnh trong thời gian triển khai.

  • JAMstack nhanh

Khi nói đến việc giảm thiểu thời gian tải, không gì có thể đánh bại các tệp được tạo sẵn được phân phối qua CDN. Các trang web JAMstack siêu nhanh vì HTML đã được tạo trong thời gian triển khai và chỉ được phân phối qua CDN mà không có bất kỳ sự can thiệp hoặc chậm trễ phụ trợ nào.

  • JAMstack được bảo mật cao

Mọi thứ hoạt động thông qua API và do đó không vi phạm cơ sở dữ liệu hoặc bảo mật. Với các quy trình phía máy chủ được trừu tượng hóa thành các API dịch vụ vi mô, các khu vực bề mặt cho các cuộc tấn công được giảm và do đó trang web của bạn trở nên được bảo mật cao.

  • JAMstack rẻ hơn và dễ mở rộng hơn

Các trang web JAMstack chỉ chứa một số tệp với kích thước tối thiểu có thể được phân phát ở mọi nơi. Chia tỷ lệ là vấn đề phân phát các tệp đó ở một nơi khác hoặc thông qua CDN.

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

Quy trình làm việc của website tĩnh và website động

Quy trình làm việc của website tĩnh và website động

Đối với các website truyền thống với LAMP stack, lập trình viên viết chương trình và lưu trữ trên máy chủ. Khi người dùng gửi yêu cầu từ phía máy khách, trình duyệt sẽ truy vấn về máy chủ và trả lại kết quả tại máy khách.
Trong khi đó, quy trình làm việc của website tĩnh diễn ra như sau: lập trình viên viết các mã code và lưu trữ dữ liệu trên CDN. Khi người dùng truy cập vào website, các dữ liệu được tải ngay từ lần đầu vào trang giúp tốc độ truy cập website dễ dàng và nhanh chóng hơn.
Nói tóm lại, quy trình làm việc của JAMstack giảm đáng kể nhờ kiến trúc website nhỏ gọn, giúp giảm thời gian tải trang và tối ưu các technical SEO khác.

Vậy website JAMstack có thực sự “tĩnh” không?
Mặc dù sản phẩm cuối cùng của các trang web được tạo bởi JAMstack là các tệp tĩnh, nhưng các tệp đó vẫn có các chức năng động như biểu mẫu, nhận xét, cổng thanh toán,… thường được xử lý bởi API của bên thứ ba (giao diện lập trình ứng dụng).
Trong trường hợp của JAMstack, tĩnh không có nghĩa là cố định, mà là việc các dữ liệu được tải một lần duy nhất. Chúng ta có thể gọi chúng là một dạng website tĩnh mới với rất nhiều lợi ích kinh doanh.

Các phương pháp hay nhất với JAMstack

  • Sử dụng CDN để phân phối tệp của bạn thay vì máy chủ
  • Việc cài đặt và đóng góp vào dự án của bạn phải dễ dàng và ít phức tạp hơn. Sử dụng các công cụ như npm và Git để đảm bảo thiết lập chuẩn và nhanh hơn.
  • Sử dụng các công cụ xây dựng và làm cho dự án của bạn tương thích với tất cả các trình duyệt (ví dụ: Babel, Browserify, Webpack, v.v.)
  • Đảm bảo dự án của bạn đạt tiêu chuẩn web và khả năng truy cập cao
  • Đảm bảo quá trình xây dựng của bạn được tự động hóa để giảm bớt căng thẳng.
  • Làm cho quá trình triển khai của bạn tự động, bạn có thể sử dụng các nền tảng như Netlify để thực hiện việc này

Làm cách nào để bắt đầu với JAMstack?

Bạn có thể sử dụng một số công nghệ đã được xây dựng để tạo các ứng dụng JAMstack trong vài phút, ví dụ như:

  • Gatsby: Gatsby là một khung mã nguồn mở và miễn phí dựa trên React giúp các nhà phát triển xây dựng các trang web và ứng dụng nhanh chóng mặt
  • NuxtJS: NuxtJS là Framework Vue.js dành cho các ứng dụng Universal, các ứng dụng được tạo tĩnh, ứng dụng trang đơn, ứng dụng web tiến bộ và ứng dụng dành cho máy tính để bàn
  • Hugo: Hugo là khuôn khổ xây dựng trang web nhanh nhất thế giới. Nó là một trong những trình tạo trang tĩnh mã nguồn mở phổ biến nhất. Với tốc độ và tính linh hoạt đáng kinh ngạc, Hugo khiến việc xây dựng trang web trở nên thú vị trở lại.
  • Netlify CMS: Netlify CMS là một quản lý nội dung mã nguồn mở cho quy trình làm việc Git của bạn, có thể được sử dụng với bất kỳ trình tạo trang tĩnh nào để có dự án web nhanh hơn và linh hoạt hơn
  • Contentful: Contentful là một hệ thống quản lý nội dung thông minh hơn và liền mạch, cung cấp cho các biên tập viên và nhà phát triển một nội dung thống nhất, do đó tăng cường sự hợp tác và đảm bảo các sản phẩm kỹ thuật số được đưa ra thị trường nhanh hơn.
  • Svelte: Svelte là một cách tiếp cận mới triệt để để xây dựng giao diện người dùng. Trong khi các framework truyền thống như React và Vue thực hiện phần lớn công việc của chúng trong trình duyệt, thì Svelte chuyển hoạt động sang bước biên dịch xảy ra khi bạn xây dựng ứng dụng của mình.

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

Xem thêm:

Cập nhật it jobs Developer lương cao mới nhất TopDev

Hướng dẫn Java Design Pattern – DAO

Hướng dẫn Java Design Pattern – DAO

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

Một trong những khía cạnh quan trọng của lớp nghiệp vụ (business layer) là lớp truy cập dữ liệu (data access layer) để kết nối các dịch vụ (service) với cơ sở dữ liệu (database). Việc truy cập dữ liệu tùy thuộc vào nguồn dữ liệu, loại lưu trữ như database, text file, xml file, json file, …Thậm chí nó khác với cách triển khai của nó, ví dụ: cú pháp truy vấn SQL khác nhau giữa MySQL, SQL Server, Oracle, … Với mong muốn sẽ không có gì khác biệt khi truy cập cơ sở dữ liệu quan hệ, phân tích xml file hay bất kỳ nguồn dữ liệu nào khác, chúng ta có thể áp dụng mẫu thiết kế đối tượng truy cập dữ liệu (Data Access Object Pattern– DAO Pattern).

DAO Pattern là gì?

Data Access Object (DAO) Pattern là một trong những Pattern thuộc nhóm cấu trúc (Structural Pattern).  Mẫu thiết kế DAO được sử dụng để phân tách logic lưu trữ dữ liệu trong một lớp riêng biệt. Theo cách này, các service được che dấu về cách các hoạt động cấp thấp để truy cập cơ sở dữ liệu được thực hiện. Nó còn được gọi là nguyên tắc Tách logic (Separation of Logic).

Ý tưởng là thay vì có logic giao tiếp trực tiếp với cơ sở dữ liệu, hệ thống file, dịch vụ web hoặc bất kỳ cơ chế lưu trữ nào mà ứng dụng cần sử dụng, chúng ta sẽ để logic này sẽ giao tiếp với lớp trung gian DAO. Lớp DAO này sau đó giao tiếp với hệ thống lưu trữ, hệ quản trị CSDL như thực hiện các công việc liên quan đến lưu trữ và truy vấn dữ liệu (tìm kiếm, thêm, xóa, sửa,…).

DAO Pattern dựa trên các nguyên tắc thiết kế abstraction và encapsulation. Nó bảo vệ phần còn lại của ứng dụng khỏi mọi thay đổi trong lớp lưu trữ, ví dụ: thay đổi database từ Oracle sang MySQL, thay đổi công nghệ lưu trữ từ file sang database.

Trong Java, DAO được triển khai theo nhiều cách khác nhau như Java Persistence API,  Enterprise Java Bean (EJP), Object-relational mapping (ORM) với các implement cụ thể như HibernateiBATISSpring JPA, … Chi tiết về các phần này chúng ta sẽ cùng thảo luận ở một bài viết khác.

  Hướng dẫn Java Design Pattern – DAO

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

Cài đặt DAO Pattern như thế nào?

Các thành phần tham gia mẫu Data Access Object (DAO) Pattern:

  • BusinessObject : đại diện cho Client, yêu cầu truy cập vào nguồn dữ liệu để lấy và lưu trữ dữ liệu.
  • DataAccessObject (DAO): là một interface định nghĩa các phương thức trừu tượng việc triển khai truy cập dữ liệu cơ bản cho BusinessObject để cho phép truy cập vào nguồn dữ liệu (DataSource).
  • DataAccessObjectConcrete : cài đặt các phương thức được định nghĩa trong DAO, lớp này sẽ thao tác trực tiếp với nguồn dữ liệu (DataSource).
  • DataSource : là nơi chứa dữ liệu, nó có thể là database, xml, json, text file, webservice, …
  • TransferObject : là một POJO (Plain old Java object) object, chứa các phương thức get/set được sử dụng để lưu trữ dữ liệu và được sử dụng trong DAO class.

Tham khảo việc làm Java HOT trên TopDev

Ví dụ sử dụng DAO Pattern

Ví dụ bên dưới cho chúng ta thấy cách áp dụng DAO Pattern trong việc cung cấp interface chung để thao tác với cơ sở dữ liệu (CRUD). Các thao tác này bao gồm: Create/ Save, Read/ Get, Update, Delete.

User.java

package com.gpcoder.patterns.structural.dao;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class User {

    private int id;

    private String name;

    private String email;
}

Dao.java

package com.gpcoder.patterns.structural.dao;

import java.util.List;
import java.util.Optional;

public interface Dao<T> {

    List<T> getAll();

    Optional<T> get(int id);

    void save(T t);

    void update(T t);

    void delete(T t);
}

UserDao.java

package com.gpcoder.patterns.structural.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class UserDao implements Dao<User> {

    private List<User> users = new ArrayList<>();

    public UserDao() {
        users.add(new User(1, "GP Coder", "contact@gpcoder.com"));
        users.add(new User(2, "Giang Phan", "gpcodervn@gmail.com"));
    } 

    @Override
    public List<User> getAll() {
        return users;
    }

    @Override
    public Optional<User> get(int id) {
        return users.stream().filter(u -> u.getId() == id).findFirst();
    }

    @Override
    public void save(User user) {
        users.add(user);
    }

    @Override
    public void update(User user) {
        get(user.getId()).ifPresent(existUser -> {
            existUser.setName(user.getName());
            existUser.setEmail(user.getEmail());
        });
     }

     @Override
     public void delete(User user) {
         get(user.getId()).ifPresent(existUser -> users.remove(existUser));
     }
}

DaoPatternExample.java

package com.gpcoder.patterns.structural.dao;

public class DaoPatternExample {

    private static Dao<User> userDao;

    public static void main(String[] args) {
        userDao = new UserDao();

        User user1 = userDao.get(1).get();
        System.out.println("user1: " + user1);

        user1.setName("updated." + user1.getName());
        userDao.update(user1);

        System.out.println("All users: ");
        userDao.getAll().forEach(user -> System.out.println(user));
    }
}

User.java

user1: User(id=1, name=GP Coder, email=contact@gpcoder.com)
All users: 
User(id=1, name=updated.GP Coder, email=contact@gpcoder.com)
User(id=2, name=Giang Phan, email=gpcodervn@gmail.com)

Lợi ích của DAO Pattern là gì?

  • Giảm sự kết nối (loose coupling) giữa logic nghiệp vụ (Business) và logic lưu trữ (Persistence).
  • Mẫu DAO cho phép đóng gói code để thực hiện thao tác CRUD, ngăn chặn việc implement riêng lẻ trong từng phần khác nhau của ứng dụng.
  • Dễ mở rộng, bảo trì: tất cả các chi tiết lưu trữ được ẩn khỏi phần còn lại của ứng dụng. Do đó, những thay đổi có thể được thực hiện bằng cách chỉ sửa đổi một implement của DAO trong khi phần còn lại của ứng dụng không bị ảnh hưởng. DAO hoạt động như một trung gian giữa ứng dụng và cơ sở dữ liệu.
  • Dễ hiểu: mọi người đều theo một quy chuẩn đã được định sẵn, nên dễ hiểu hơn, tiết kiệm được nhiều thời gian hơn.
  • Trong một dự án lớn hơn, các nhóm khác nhau làm việc trên các phần khác nhau của ứng dụng, mẫu DAO cho phép phân tách rõ ràng các thành phần này.

Sử dụng DAO Pattern khi nào?

  • Khi muốn thay đổi nguồn dữ liệu sau này, như chuyển từ cơ dữ liệu MySQL sang Oracle, SQL Server, …
  • Khi muốn phân tách rõ ràng các thành phần của ứng dụng.
Bài viết gốc được đăng tải tại gpcoder.com

Java Talk: Java – Ngôi sao hết thời?

Talkshow Java

Java “hết thời” hay “chết dần” luôn là quan điểm nhận về nhiều ý kiến trái chiều trong cộng đồng Kỹ sư phần mềm những năm gần đây. Liệu đó có phải là sự thật hay chỉ là lời đồn đại trong thế giới “tech-biz”?

*Nội dung bài viết tham khảo từ sự kiện Java Talk: Java – Ngôi sao hết thời? do CMC Global tổ chức, với sự đồng hành của Viblo Platform và Trung tâm Đổi mới Sáng tạo Quốc gia (NIC). Sự kiện được dẫn dắt bởi anh Phan Tích Hoàng – Solution Architect và anh Nguyễn Thế Hưng – Technical Leader đến từ CMC Global.

Talkshow Java

Sự thất thế của Java

Java là ngôn ngữ lập trình hướng đối tượng được phát triển bởi Sun Microsystems, phát hành lần đầu tiên năm 1995 và được Tập đoàn Oracle mua lại năm 2010. Tính đến nay, Java đã qua nhiều lần cải tiến với tổng cộng 19 phiên bản được phát hành.

Tuy nhiên, Java đang không tránh khỏi sự cạnh tranh gay gắt của những ngôn ngữ lập trình hiện đại với những điểm ưu việt riêng, mang lại tính cạnh tranh và phần nào “thắng thế” Java. 

Anh Phan Tích Hoàng (Solution Architect, CMC Global), diễn giả trong sự kiện chia sẻ “Lần đầu làm quen với Java từ những năm 1997, mình bị thu hút bởi những triết lý mới của ngôn ngữ này. Ưu điểm lớn nhất của Java là tính ổn định. Nhưng nếu làm cùng một công việc, Java phải đòi hỏi nhiều dòng code hơn. Điều này chính là bất lợi của Java so với các ngôn ngữ khác.”

Đồng quan điểm, anh Nguyễn Thế Hưng (Technical Leader, CMC Global) cũng cho rằng đứng trước sự ra đời của nhiều công nghệ và ngôn ngữ lập trình mới, Java đang dần đánh mất vị trí dẫn đầu! Những ngôn ngữ mới xuất hiện được cải tiến tối ưu hơn như Golang, Rust… dần thay thế và “soán ngôi vương” của “anh cả” Java. 

Thời kỳ cực thịnh, Java từng được sử dụng ở hầu hết các dự án phát triển phần mềm, nhưng đến nay đang bị đào thải dần ở nhiều mảng không phù hợp.

Vậy Java liệu có đang chết dần?

Câu trả lời là Không! Ngôn ngữ lập trình mới xuất hiện có phần nào “thắng thế” Java, tuy nhiên thực tế cho thấy vẫn rất nhiều sản phẩm công nghệ hiện tại đang và sẽ sử dụng Java.  

Những dự án vốn đã phát triển bằng Java từ thưở “khai sinh lập địa” rất khó để chuyển hoàn toàn sang một ngôn ngữ mới, một công nghệ mới. Còn với những dự án bắt đầu xây dựng, lý do nào khiến đội ngũ phát triển vẫn quyết định chọn Java làm ngôn ngữ chính?

Thứ nhất, Java vẫn đang thực hiện tốt “sứ mệnh” đáp ứng phù hợp bài toán doanh nghiệp đưa ra. Thứ hai, đội ngũ lập trình viên Java (Java Developer) rất đông đảo trên thị trường nhân sự. Nhiều SA hay CTO có kinh nghiệm lâu năm “gắn bó” với Java, họ sẽ tiếp tục lựa chọn ngôn ngữ này thay vì mạo hiểm chọn những công nghệ mới chưa có nhiều kinh nghiệm. 

Đồng thời, với mức phổ biến của Java, các sản phẩm viết bằng Java luôn có sẵn với chi phí tối ưu, giúp cho việc phát triển phần mềm nhanh hơn. Có thể kể tới các sản phẩm của Atlassian, Spring, Oracle…

Các lập trình viên cũng chia sẻ Java là một trong số ít ngôn ngữ lập trình dễ tiếp cận, dễ học đối với người mới bắt đầu. Java là ngôn ngữ phổ thông được giảng dạy phổ biến tại nhiều trường đại học, trung tâm đào tạo công nghệ. Học liệu, tài nguyên học Java vô cùng đa dạng trên cả nền tảng miễn phí và trả phí. Từ đó giúp các bạn có nhu cầu tìm hiểu dễ dàng học hỏi và tiếp cận kiến thức mới dễ dàng hơn. 

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

Sự chuyển mình của Java với Reactive Programming và Spring Webflux

Đứng trước sự cạnh tranh, Java cũng buộc phải được thay đổi, cải tiến qua từng phiên bản. Trước kia nếu Sun mất ba năm release một phiên bản thì nay Oracle rất nhạy bén với xu hướng release sản phẩm nhanh (một năm hai phiên bản và ba năm một phiên bản LTS). 

Xét về diện rộng, cộng đồng Java, libs, tool đang có nhiều cải tiến tối ưu hơn. Spring boot loại bỏ những thứ rườm rà của Spring MVC (khai báo manifest quá nhiều), hay Webflux hỗ trợ cách viết reactive programming (giúp làm async tốt hơn, dữ liệu được stream liên tục và liền mạch). 

Xét về diện hẹp, Java 8 ra đời với cải biến hỗ trợ Stream API (Functional programming), Async/Await. Java 9 dự kiến ra mắt cuối tháng 9 hứa hẹn nhiều tính năng hấp dẫn. 

Cụ thể về Spring Webflux, đây là một trong những công cụ phát triển web mới được ra đời từ Spring 5, hỗ trợ việc xây dựng ứng dụng web theo chuẩn mới – Reactive. Spring Webflux không yêu cầu tạo nhiều thread pool. Thông thường với 1,000 request mình cần 1,000 thread để đáp ứng, còn công nghệ Reactive chỉ cần 10 thread, sau đó tiếp nhận request và tiếp tục forward sang đội lập trình xử lý. Đây chính là mô hình event driven, non-blocking trong công nghệ thông tin. 

Cách viết code và tư duy của Spring Webflux cũng mạch lạc và dễ viết hơn so với những phiên bản trước. Tùy từng bài toán cụ thể khi lựa chọn Firmware, công nghệ Webflux hay Spring boot, reactive hay thông thường… sẽ có ưu điểm và nhược điểm riêng khi áp dụng. 

Anh Phan Tích Hoàng (Solution Architect, CMC Global): “Học cái mới, đồng thời nắm chắc kiến thức cơ bản giúp bạn có “tầm nhìn” của một software engineer hiện đại”.

Talkshow Java CMC Global
Anh Phan Tích Hoàng (Solution Architect, CMC Global): “Học cái mới, đồng thời nắm chắc kiến thức cơ bản giúp bạn có “tầm nhìn” của một software engineer hiện đại”

Cơ hội phát triển nào với nghề Java Developer?

Anh Nguyễn Thế Hưng cho rằng “Nói về tương lai thì mình không dám chắc điều gì, nhưng hiện tại Java vẫn có nhiều “đất dụng võ” trong thị trường sản xuất phần mềm. Bản thân mình đã từng suy nghĩ về tương lai khi làm Java Developer: Nên đi theo hướng nào? Cơ hội phát triển con đường sự nghiệp ra sao?”

Thay vì mất thời gian vào việc suy nghĩ tương lai, hãy bắt tay vào việc trau dồi kiến thức, nâng cao kỹ năng để tạo ra tương lai cho chính bản thân mình. Bạn hãy luôn đặt tư tưởng mình là một kỹ sư phần mềm, không chỉ đơn thuần là một Java Developer hay tự thu hẹp, hạn chế mình trong một ngôn ngữ lập trình nào. 

“Nắm chắc những kiến thức nền tảng như ngoại ngữ, tư duy logic… cộng thêm niềm đam mê và sự cầu thị trong công việc, mình tin chắc rằng khi gặp những công việc phụ thuộc vào ngôn ngữ lập trình hay công nghệ mới, các bạn đều có thể tiếp cận hòa nhập và hoàn thành tốt.” Anh Hưng chia sẻ

>> Tìm hiểu vị trí Java Developer từ CMC Global tại:  https://s2k.cmcglobal.com.vn/javashow2022

————————–

Đừng bỏ lỡ số tiếp theo của Java Talk với chủ đề: TDD/BDD in Software Developmemt – What, Why & How?  – Sự kiện đánh dấu sự trở lại bùng nổ của Java Show, khởi đầu chuỗi hoạt động chuyên môn từ CMC Global dành riêng cho Java Developer và cộng đồng CNTT trong năm 2023.

Java Talk CMC Global

Hàng loạt quà tặng CÔNG NGHỆ cực “hot” với tổng trị giá lên đến 10,000,000 VND sẽ được trao cho những người tham gia trực tiếp trong sự kiện. 

Chi tiết sự kiện & đăng ký tại: https://s2k.cmcglobal.com.vn/event

Xem thêm việc làm IT hấp dẫn tại TopDev.vn

Hướng dẫn Java Design Pattern – State

Hướng dẫn Java Design Pattern – State

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

Trong các ứng dụng, một số đối tượng có thông tin về trạng thái. Hành vi của đối tượng phụ thuộc vào trạng thái của nó tại thời điểm thực thi (run-time) và các phương thức xử lý nghiệp vụ có thể thay đổi trạng thái buộc đối tượng có hành vi xử lý khác đi. Trong trường hợp như vậy, chúng ta có thể sử dụng State Pattern.

State Pattern là gì?

Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.

State Pattern là một trong những Pattern thuộc nhóm hành vi (Behavior Pattern). Nó cho phép một đối tượng thay đổi hành vi của nó khi trạng thái nội bộ của nó thay đổi. Đối tượng sẽ xuất hiện để thay đổi lớp của nó.

  Thông não Java Design Pattern – Dependency Injection

  Tìm hiểu Java Design Pattern – Service Locator

Cài đặt State Pattern như thế nào?

Các thành phần tham gia State Pattern

Các thành phần tham gia State Pattern:

  • Context : được sử dụng bởi Client. Client không truy cập trực tiếp đến State của đối tượng. Lớp Context này chứa thông tin của ConcreteState object, cho hành vi nào tương ứng với trạng thái nào hiện đang được thực hiện.
  • State : là một interface hoặc abstract class xác định các đặc tính cơ bản của tất cả các đối tượng ConcreteState. Chúng sẽ được sử dụng bởi đối tượng Context để truy cập chức năng có thể thay đổi.
  • ConcreteState : cài đặt các phương thức của State. Mỗi ConcreteState có thể thực hiện logic và hành vi của riêng nó tùy thuộc vào Context.

Một vài điểm cần ghi nhớ khi áp dụng pattern này:

  • Một đối tượng nên thay đổi hành vi của nó khi trạng thái bên trong của nó thay đổi.
  • Mỗi State nên được xác định độc lập.
  • Thêm các trạng thái mới sẽ không làm ảnh hưởng đến các trạng thái hoặc chức năng khác.

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

Ví dụ State Pattern

Giả sử chúng ta cần xây dựng một ứng dụng quản lý Document. Một Document có thể bao gồm các trạng thái: tạo mới (New), trình phê duyệt (Submitted), phê duyệt (Approved) và từ chối (Rejected).

Với yêu cầu trên, chương trình của chúng ta như sau:

package com.gpcoder.patterns.behavioral.state.document.bad;

enum DocumentState {
NEW, SUBMITTED, APPROVED, REJECTED
}

class DocumentService {
    private DocumentState state;

    public void setState(DocumentState state) {
        this.state = state;
    }

public void handleRequest() {
    switch (state) {
    case NEW:
        System.out.println("Create a new document");
        break;
    case SUBMITTED:
        System.out.println("Submitted");
        break;
    case APPROVED:
        System.out.println("Approved");
        break;
    case REJECTED:
        System.out.println("Rejected");
        break;

    default:
        break;
    }
  }
}

public class DocumentApp {

    public static void main(String[] args) {
        DocumentService service = new DocumentService();

        service.setState(DocumentState.NEW);
        service.handleRequest();

        service.setState(DocumentState.SUBMITTED);
        service.handleRequest();

        service.setState(DocumentState.APPROVED);
        service.handleRequest();
    }
}

Output của chương trình:

Create a new document
Submitted
Approved

Như bạn thấy chương trình trên chạy ok, không vấn đề gì. Nhưng bây giờ chúng ta muốn thêm một trạng thái mới như lưu nháp (Save Draft). Đơn giản chúng ta chỉ cần thêm vào enum một giá trị mới và thêm điều kiện xử lý trong switch-case. Tuy nhiên, nếu làm như vậy thì chúng ta đã vi phạm nguyên tắc Open/Close. Mỗi khi có thêm một trạng thái mới chúng ta phải sửa nhiều nơi, code trong phương thức handleRequest() ngày càng nhiều và cần phải test lại toàn bộ app.

Bây giờ chúng ta hãy áp dụng State Pattern cho chương trình trên:

design-patterns-state-example

  • Đầu tiên chúng ta sẽ tạo 1 base inteface để nhận yêu cầu xử lý. Lớp này gọi là State.
  • Tiếp theo, ứng với mỗi giá trị trong enum, chúng ta sẽ tạo một class mới và implement các phương thức của State.
  • Cuối cùng, chúng ta tạo một class Context. Class này chứa thông tin State hiện tại và nhận yêu cầu xử lý trực tiếp từ Client.

State.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public interface State {

    void handleRequest();
}

NewState.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public class NewState implements State {

    @Override
    public void handleRequest() {
        System.out.println("Create a new document");
    }
}

SubmittedState.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public class SubmittedState implements State {

    @Override
    public void handleRequest() {
        System.out.println("Submitted");
    }
}

ApprovedState.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public class ApprovedState implements State {

    @Override
    public void handleRequest() {
        System.out.println("Approved");
    }
}

RejectedState.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public class RejectedState implements State {

    @Override
    public void handleRequest() {
        System.out.println("Rejected");
    }
}

DocumentContext.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public class DocumentContext {

    private State state;

    public void setState(State state) {
        this.state = state;
    }

    public void applyState() {
        this.state.handleRequest();
    }
}

StatePatternExample.java

package com.gpcoder.patterns.behavioral.state.document.improve;

public class StatePatternExample {

    public static void main(String[] args) {
        DocumentContext context = new DocumentContext();

        context.setState(new NewState());
        context.applyState();

        context.setState(new SubmittedState());
        context.applyState();

        context.setState(new ApprovedState());
        context.applyState();
    }
}

Output của chương trình:

Create a new document
Submitted
Approved

Như bạn thấy, kết quả cũng không đổi. Tuy nhiên, chúng ta rất dễ dàng mở rộng. Nếu muốn thêm một trạng thái mới như lưu tạm (Save Draft), đơn giản tạo một class mới implements từ State mà không làm ảnh hưởng đến các State khác và Context.

Lợi ích của State Pattern là gì?

Lợi ích:

  • Đảm bảo nguyên tắc Single responsibility principle (SRP) : tách biệt mỗi State tương ứng với 1 class riêng biệt.
  • Đảm bảo nguyên tắc Open/Closed Principle (OCP) : chúng ta có thể thêm một State mới mà không ảnh hưởng đến State khác hay Context hiện có.
  • Giữ hành vi cụ thể tương ứng với trạng thái.
  • Giúp chuyển trạng thái một cách rõ ràng.

Sử dụng State Pattern khi nào?

  • Khi hành vi của đối tượng phụ thuộc vào trạng thái của nó và nó phải có khả năng thay đổi hành vi của nó lúc run-time theo trạng thái mới.
  • Khi nhiều điều kiện phức tạp buộc đối tượng phụ thuộc vào trạng thái của nó.

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

Messege Queue – Bộ phận không thể thiếu trong các hệ thống lớn và Microservice Architecture

Messege Queue

Bài viết được cho phép bởi tác giả Phạm Huy Hoàng

Hôm nay, chúng ta cùng tìm hiểu về Message Queue. Đây là một thành phần cực kì quan trọng, không thể thiếu trong các hệ thống lớn (mình cá là Facebook, Google lẫn LinkedIn đều có nó trong hệ thống), trong kiến trúc microservice.

Tuy vậy, nếu không gặp các dự án lớn hoặc dự án đặc thù, các bạn sẽ không hề biết tới thứ này. Vậy Message Queue là gì, nó có gì hay ho mà được sử dụng nhiều như vậy?

Đọc xong bài này bạn sẽ biết ngay nhé!

Messege Queue là cái chi chi?

Nói một cách huề vốn, Message Queue tức là một cái Queue (hàng đợi), chứa nhiều Message.

message-queue-small
Message Queue tức là một queue (hàng đợi), chứa các Message

Đùa thế thôi, các bạn có thể hiểu message queue là một hộp thư, cho phép các thành phần/service trong một hệ thống (hoặc nhiều hệ thống), gửi thông tin cho nhau.

Sở dĩ gọi nó là queue (hàng đợi) vì nó thực hiện việc lấy message theo cơ chế FIFO – First In First Out, tức đút vào trước thì rút ra trước.

  Message Queue VS Message Bus

  Kafka là gì? Ứng dụng Kafka cơ bản cho hệ thống message

Một hệ thống sử dụng Message Queue thường có những thành phần sau đây:

  • Message: Thông tin được gửi đi (có thể là text, binary hoặc JSON)
  • Message Queue: Nơi chứa những message này, cho phép producer và consumer có thể trao đổi với nhau
  • Producer: Chương trình/service tạo ra thông tin, đưa thông tin vào message queue
  • Consumer: Chương trình/service nhận message từ message queue và xử lý
  • Một chương trình/service có thể vừa là producer, vừa là consumer 

sqs_seo_queue

Message Queue được sử dụng ra sao trong thực tế?

Trong các hệ thống dùng kiến trúc microservice, ta sử dụng message queue để giúp các service liên hệ với nhau một cách bất đồng bộService A làm xong việc có thể gửi message queue để service B biết mà xử lý, không cần phải chờ service B làm xong.

Giả sử, mình có một trang web cho phép người dùng tải link từ mu*vl, nhầm, từ Youtube, mình sẽ có các bộ phận sau:

  • Web service: Là 1 producer. Nhận thông tin (url Youtube) từ phía người dùng, đưa thông tin này vào message queue
  • Processing Service: Vừa là consumer vừa là producer. Service này đọc url Youtube từ message queue, bắt đầu tải file về và encode lại, lưu vào server. Sau khi encode xong, nó đưa url của file đã encode vào message queue
  • Uploading Service:  Khi nhận được message từ processing server, nó sẽ upload các video đó lên Google Drive v…v

rabbitmq-beginners-updated
Các service gửi/nhận thông tin thông qua message queue

Trong thực tế, message queue giải quyết được khá nhiều vấn đề hóc búa trong hệ thống:

  • Đảm bảo duration/recovery: Do message đã được lưu trong queue, khi 1 service đang xử lý nhưng bị crash hoặc lỗi, ta không lo bị mất dữ liệu; vì có thể lấy message từ trong queue ra và chạy lại. Trong 1 hệ thống có nhiều consumer, nếu 1, 2 consume bị crash cũng không làm sụp toàn hệ thống
  • Phân tách hệ thống: Giúp phân tách hệ thống thành nhiều service nhỏ hơn, mỗi service chỉ xử lý 1 chức năng nhất định (Ưu nhược điểm thì các bạn xem lại bài về microservice nhé)
  • Hộ trợ rate limit, batching: Trong nhiều trường hợp, năng lực xử lý hệ thống có hạn (chỉ có thể xử lý 300 đơn hàng/s). Với message queue, ta có thể dần dần lấy đơn hàng trong queue ra xử lý, không sợ thất lại. Hoặc thay vì mỗi lần gửi email mất thời gian lâu, ta có thể đợi message queue có yêu cầu gửi 200 email rồi gửi luôn 1 lượt.
  • Dễ scaling hệ thống: Vào giờ cao điểm, nhiều truy vấn, ta có thể tăng số lượng consumer lên để xử lý được nhiều messege hơn. Khi không cần ta có thể giảm lại.

Messege-Queue
Khi cần, ta có thể dễ dàng scale bằng cách tăng số lượng consumer/receiver lên

 

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

Một số điểm cần lưu ý

Tất nhiên, không có công nghệ nào là vạn năng. Khi sử dụng bất cứ công nghệ nào, ta cũng cần biết những điều cần lưu ý:

  • Khó xử lý đồng bộ: Không phải hệ thống nào cũng cần tới message queue. Nếu như service A gọi service B, theo cơ chế đồng bộ, cần kết quả xử lý ngay, ta nên dùng Rest hoặc gRPC sẽ tốt hơn.
  • Làm hệ thống phức tạp hơn: Thêm message queue sẽ tăng tính phức tạp của hệ thống.  Ta cần phải biết rõ message nào gửi vào queue nào, ai gửi ai nhận. Lúc debug ở local cũng sẽ khó khăn hơn
  • Cần đảm bảo message format: Để gửi/nhận, 2 phía producer và consumer phải thống nhất format với nhau. Nếu không cẩn thận lỡ 1 bên thay đổi sẽ làm bên kia không đọc được dữ liệu.
  • Cần Monitoring Queue: Cần có các biện phát theo dõi (monitor), để đảm bảo lượng message queue không quá nhiều, làm đầy queue. Queue tốt nhất là queue luôn rỗng, hoặc số lượng message trong queue không tăng lên (message gửi vào queue đều bị consume hết)

Một số message queue hay được dùng hiện này bao gồm:

  • RabbitMQ
  • Kafka (Kafka còn làm được lắm trò hay ho hơn message queue nữa cơ)
  • Amazon SQS
  • MSMQ (Microsoft Message Queuing)
  • RocketMQ
  • ZeroMQ

RabbitMQ và Apache Kafka
RabbitMQ và Apache Kafka là 2 message queue khá phổ biến hiện tại

 

Tạm kết

Đấy, trong bài này mình đã chia sẻ về message queue, một bộ phận không thể thiếu trong các hệ thống lớn, các hệ thống sử dụng kiến trúc microservice.

Khi các bạn ở tầm senior, tầm software architect, trong quá trình làm việc/phỏng vấn chắc chắn sẽ đụng phải thứ này đấy! Nếu bạn có kinh nghiệm gì muốn chia sẻ thêm thì cứ đăng trong phần comment nhé!

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

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

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