Home Blog Page 49

Top 5 câu hỏi phỏng vấn Software Architect hàng đầu

Top 5 câu hỏi phỏng vấn Software Architect hàng đầu

Software Architect, chức vụ chỉ nghe thôi đã thấy to, vậy phỏng vấn Software Architect có gì đặc biệt? Những câu hỏi và nội dung kiến thức nào thường được đề cập khi phỏng vấn Software Architect?

Phỏng vấn solution architect      Trách nhiệm của Solution Architect là làm sao đặt business logic vào không bể nha anh em.

Là một người chịu trách nhiệm lớn cho sự thành công hay thất bại của dự án phần mềm. SA là công việc stress. Nhưng trách nhiệm lớn đồng nghĩa với lương cao. Tất nhiên lượng kiến thức nằm trong đầu cũng thuộc dạng khủng khiếp. Thử lướt xem mấy câu hỏi phỏng vấn SA thì có gì nào?

Rồi, bắt đầu thôi anh em! Dạo qua vài ba câu định nghĩa chưa có gì khó. Phần sau sẽ là những câu hỏi khó hơn.

1. Software Architect là gì?

Câu hỏi đầu tiên phỏng vấn Software Architect chưa đi ngay vào các khái niệm kiến thức mà đi vào định nghĩa. Vậy Sofware Architect là gì?

A software architect is a software development professional who makes high-level design choices and oversees the overall software structure. A software architect is responsible for creating a software system that meets all the technical and operational requirements while also being easy to maintain and extend.

Sofware Architect là người phát triển phần mềm chuyên nghiệp, đưa ra quyết định lựa chọn high-level design và giám sát kiến trúc phần mềm tổng thể. Software Architect chịu trách nhiệm tạo ra một hệ thống phần mềm đáp ứng tất cả các yêu cầu kỹ thuật và vận hành đồng thời đảm bảo cho hệ thống dễ bảo trì và mở rộng.

Phỏng vấn solution architect Dự án lớn có yêu cầu cao mà không có SA thì xác định là toang.

Định nghĩa rất chi là dài dòng nhưng có thể tóm gọn lại như sau:

  • Là người phát triển phần mềm chuyên nghiệp
  • Đưa ra quyết định cho kiến trúc của phần mềm (tất nhiên phải đáp ứng yêu cầu)
  • Giám sát quá trình phát triển phần mềm (đảm bảo đúng như thiết kế)
  • Hệ thống thiết kế ra phải đảm bảo dễ bảo trì và mở rộng về sau

Hiểu được trách nhiệm và yêu cầu của vị trí Solution Architect giúp anh em hiểu rõ hơn những việc mình cần làm, những kiến thức cần show ra cho nhà tuyển dụng khi apply vị trí này. Anh em cũng có thể tham khảo thêm bài viết này.

Một số câu hỏi anh em có thể xem qua:

  • Trách nhiệm của Solution Architect?
  • Những skills nào cần có nếu bạn là Solution Architect?

Tiếp tới với câu hỏi số hai

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

2. Load Balancing là gì?

Câu hỏi số hai phỏng vấn Software Architect liên quan tới các khái niệm thường được sử dụng trong thiết kế kiến trúc phần mềm (high level design).

Load balancing is a simple way to spread work across multiple machines or groups of devices. In this type of load balancing, requests are split up and sent to different machines in a circle. This ensures that all machines get the same number of requests and that none are overloaded or underloaded. Cân bằng tải cách đơn giản để dàn trải công việc trên nhiều máy hoặc nhiều thiết bị. Khi có một lượng lớn yêu cầu gửi tới, load balancing sẽ chia đều tất cả cho các máy, đảm bảo không có máy thì load quá nhiều, máy thì load quá ít.

Phỏng vấn solution architect

Các câu hỏi liên quan tới khái niệm yêu cầu anh em cần trả lời chính xác ở mức tuyệt đối, bởi chỉ cần hiểu sai hoặc không chắc chắn mà đã đem vào cho anh em làm thì khả năng cao là bể. Vừa mất thời gian làm vừa gây stress cho team nếu không đáp ứng được yêu cầu về business.

Một số câu hỏi anh em có thể tham khảo:

  • CAP Theorem là gì?
  • Bốn loại system test là những loại nào?
  • Tại sao chúng ta cần sử dụng WebSocket?

  Trở thành Solution Architect có khó không?
  Đâu là điểm khác biệt giữa Solution Architect và Software Architect?

3. SOLID là gì?

Câu hỏi thứ ba phỏng vấn Software Architect vẫn là câu hỏi liên quan tới khái niệm, nhưng không còn là các khái niệm đơn lẻ như Load Balancing hay CAP Theorem. Câu hỏi này tập trung vào một trong những khái niệm quan trọng nhất khi thiết kế phần mềm.

SOLID là viết tắt của 5 nguyên tắc đóng vai trò cực quan trọng trong phát triển kiến trúc phần mềm.

  • Single responsibility: nguyên tắc này chỉ ra rằng mỗi class chỉ nên thực hiện một việc duy nhất. Một phần cụ thể trong ứng dụng.
  • Open/closed: nguyên tắc này chỉ ra rằng một module hoặc một class đóng cho việc sử đổi, nhưng lại mở cho việc kế thừa và mở rộng.
  • Liskov substitution: nguyên tắc này cho phép thay thế các đối tượng của lớp cha bằng các đối tượng của lớp con mà không gây ảnh hưởng cho ứng dụng.
  • Interface segregation: nguyên tắc này đảm bảo interface tốt nhất nên được chia nhỏ hết sức có thể
  • Dependency inversion: nguyên tắc này đảm bảo rằng một lớp ở cấp cao (high level class) không nên dựa vào một lớp cấp thấp (low level class), mặc dù cả hai lớp đều có thể phụ thuộc vào một lớp cấp cao khác.

Phỏng vấn solution architect

Một số khái niệm khác anh em có thể xem lại:

  • ACID là gì?
  • Nguyên tắc DRY (don’t repeat yourself – lặp lại ít thôi)
  • Nguyên tắc DIE (duplicate is evil – lặp lại thì toang)

Tới với câu số 4 thôi anh em

4. Sự khác biệt giữa vertical scaling và horizontal scaling

Câu hỏi thứ 4 phỏng vấn Software Architect tập trung vào khả năng mở rộng (scaling). Bản thân SA phải chịu trách nhiệm cho bảo trì và mở rộng hệ thống. Ý ở câu hỏi đầu tiên định nghĩa SA anh em còn nhớ không?

Vậy để mở rộng được thì anh em cần biết khái niệm của mở rộng.

Horizontal scaling means scaling by adding more machines to your pool of resources (also described as “scaling out”), whereas vertical scaling refers to scaling by adding more power (e.g. CPU, RAM) to an existing machine (also described as “scaling up”). Mở rộng theo chiều ngang là cách thêm máy móc vào tài nguyên xử lý (còn được hiểu là mở rộng quy mô), trong khi đó vertical scaling, mở rộng theo chiều dọc đề cập đến việc tăng RAM, tăng CPU vào 1 máy hiện tại.

Phỏng vấn solution architect

Chi tiết sâu hơn về cách thức anh em có thể tham khảo bài viết này. Các câu hỏi có thể đọc qua luôn:

  • Microserice Architecture
  • Fault tolerance là gì?

5. Database Sharing trong kiến trúc phần mềm

Câu hỏi cuối cùng trong bộ câu hỏi phỏng vấn Software Architect lần này liên quan tới Sharding, cụ thể hơn là khái niệm Database Sharding.

Sharding refers to the breaking up of our data into chunks (shards). The benefit of sharding is that it allows us to scale our database for large-scale systems. Sharding đề cập đến việc chia nhỏ dữ liệu thành các khối nhỏ (gọi là chunks). Lợi ích của sharding là cho phép mở ộng cơ sở dữ liệu cho những hệ thống lớn hoặc cực lớn.

Cụ thể hơn có thể hiểu Sharding sẽ tách các hàng của một bảng dữ liệu lớn thành nhiều hàng khác nhau, được gọi là các partitions (vùng). Dữ liệu ở trong mỗi vùng, mỗi chunks sẽ hoàn toàn độc lập với dữ liệu trong mỗi vùng hoặc các chunks khác.

Phỏng vấn solution architect

Phỏng vấn solution architect

Chi tiết hơn về Database Sharding anh em có thể tham khảo bài viết này.

6. Tham khảo thêm để chuẩn bị phỏng vấn Solution Architect

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

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

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

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

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

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 nhất trong quá trình phát triển một ứng dụng mà các lập trình viên phải đối đầu là sự thay đổi. Khi muốn thêm hoặc loại bỏ một tính năng của một đối tượng, điều đầu tiên chúng ta nghĩ đến là thừa kế (extends). Tuy nhiên, thừa kế không khả thi vì nó là static, chúng ta không thể thêm các lớp con mới vào một chương trình khi nó đã được biên dịch và thực thi. Để giải quyết vấn đề này, chúng ta có thể sử dụng Decorator Pattern được giới thiệu trong phần tiếp theo của bài viết này.

Decorator Pattern là gì?

Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.

Decorator pattern là một trong những Pattern thuộc nhóm cấu trúc (Structural Pattern). Nó cho phép người dùng thêm chức năng mới vào đối tượng hiện tại mà không muốn ảnh hưởng đến các đối tượng khác. Kiểu thiết kế này có cấu trúc hoạt động như một lớp bao bọc (wrap) cho lớp hiện có. Mỗi khi cần thêm tính năng mới, đối tượng hiện có được wrap trong một đối tượng mới (decorator class).

Decorator pattern sử dụng composition thay vì inheritance (thừa kế) để mở rộng đối tượng. Decorator pattern còn được gọi là Wrapper hay Smart Proxy.

Tìm Java job lương cao trên TopDev ngay!

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

Decorator pattern hoạt động dựa trên một đối tượng đặc biệt, được gọi là decorator (hay wrapper). Nó có cùng một interface như một đối tượng mà nó cần bao bọc (wrap), vì vậy phía client sẽ không nhận thấy khi bạn đưa cho nó một wrapper thay vì đối tượng gốc.

Tất cả các wrapper có một trường để lưu trữ một giá trị của một đối tượng gốc. Hầu hết các wrapper khởi tạo trường đó với một đối tượng được truyền vào constructor của chúng.

Vậy làm thế nào để có thể thay đổi hành vi của đối tượng? Như đã đề cập, wrapper có cùng interface với các đối tượng đích. Khi bạn gọi một phương thức decorator, nó thực hiện cùng một phương thức trong một đối tượng được wrap và sau đó thêm một cái gì đó (tính năng mới) vào kết quả, công việc này tùy thuộc vào logic nghiệp vụ.

Decorator Pattern

Các thành phần trong mẫu thiết kế Decorator:

  • Component: là một interface quy định các method chung cần phải có cho tất cả các thành phần tham gia vào mẫu này.
  • ConcreteComponent : là lớp hiện thực (implements) các phương thức của Component.
  • Decorator : là một abstract class dùng để duy trì một tham chiếu của đối tượng Component và đồng thời cài đặt các phương thức của Component  interface.
  • ConcreteDecorator : là lớp hiện thực (implements) các phương thức của Decorator, nó cài đặt thêm các tính năng mới cho Component.
  • Client : đối tượng sử dụng Component.

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

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

Ví dụ:

Để đơn giản hơn, chúng ta xem ví dụ về một hệ thống quản lý dự án, nơi nhân viên đang làm việc với các vai trò khác nhau, chẳng hạn như thành viên nhóm (team member), trưởng nhóm (team lead) và người quản lý (manager). Một thành viên trong nhóm chịu trách nhiệm thực hiện các nhiệm vụ được giao và phối hợp với các thành viên khác để hoàn thành nhiệm vụ nhóm. Mặt khác, một trưởng nhóm phải quản lý và cộng tác với các thành viên trong nhóm của mình và lập kế hoạch nhiệm vụ của họ. Tương tự như vậy, một người quản lý có thêm một số trách nhiệm đối với một trưởng nhóm như quản lý yêu cầu dự án, tiến độ, phân công công việc.

Sau đây là các thành phần tham gia vào hệ thống và hành vi của chúng:

  • Employee: thực hiện công việc (doTask), tham gia vào dự án (join), rời khỏi dự án (terminate).
  • Team member: báo cáo task được giao (report task), cộng tác với các thành viên khác (coordinate with others).
  • Team lead: lên kế hoạch (planning), hỗ trợ các thành viên phát triển (motivate), theo dõi chất lượng công việc và thời gian (monitor).
  • Manager: tạo các yêu cầu dự án (create requirement), giao nhiệm vụ cho thành viên (assign task), quản lý tiến độ dự án (progress management).

Với cách làm thông thường, chúng ta có sơ đồ như sau:

Decorator Pattern

Bất cứ khi nào một thành viên trong nhóm trở thành một Team Lead, chúng ta phải tạo một đối tượng mới của Team Lead và đối tượng trước đó tham chiếu vào nhân viên đó (Team Member trong nhóm) có thể bị hủy hoặc lưu trữ. Đó không phải là cách tiếp cận được khuyến nghị khi nhân viên vẫn là một phần của tổ chức của bạn. Tương tự như trường hợp với Manager, khi một nhân viên trở thành người quản lý từ một Team Lead / Team Member.

Một trường hợp khác là khi một nhân viên có thể thực hiện trách nhiệm của một Team Member trong nhóm cũng như trách nhiệm của Team Lead hoặc một Manager. Trong trường hợp đó, bạn cần tạo hai đối tượng cho cùng một nhân viên là hoàn toàn sai.

Trong các kịch bản này, một Team Member/ Team Lead có thể có thêm trách nhiệm trong lúc thực hiện (run-time). Và trách nhiệm của họ có thể được chỉ định / thu hồi trong lúc run-time.

Tham khảo việc làm Fresher Java mới nhất trên TopDev

Hãy xem sơ đồ bên dưới để thấy được cách chúng ta áp dụng Decorator Pattern như thế nào trong trường hợp này.

Decorator Pattern

Như bạn thấy, với Decorator hệ thống của chúng ta linh hoạt hơn rất nhiều. Chúng ta có thể dễ dàng gán một nhân viên sang vai trò TeamMember, TeamLeader, Manager.

EmployeeComponent.java

package com.gpcoder.patterns.structural.decorator;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public interface EmployeeComponent {

    String getName();

    void doTask();

    void join(Date joinDate);

    void terminate(Date terminateDate);

    default String formatDate(Date theDate) {
        DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        return sdf.format(theDate);
    }

    default void showBasicInformation() {
        System.out.println("-------");
        System.out.println("The basic information of " + getName());

        join(Calendar.getInstance().getTime());

        Calendar terminateDate = Calendar.getInstance();
        terminateDate.add(Calendar.MONTH, 6);
        terminate(terminateDate.getTime());
    }
}

EmployeeConcreteComponent.java

package com.gpcoder.patterns.structural.decorator;

import java.util.Date;

public class EmployeeConcreteComponent implements EmployeeComponent {

    private String name;

    public EmployeeConcreteComponent (String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void join(Date joinDate) {
        System.out.println(this.getName() + " joined on " + formatDate(joinDate));
    }

    @Override
    public void terminate(Date terminateDate) {
        System.out.println(this.getName() + " terminated on " + formatDate(terminateDate)); 
    }

    @Override
    public void doTask() {
        // Unassigned task
    }
}

EmployeeDecorator.java

package com.gpcoder.patterns.structural.decorator;

import java.util.Date;

public abstract class EmployeeDecorator implements EmployeeComponent {

    protected EmployeeComponent employee;

    protected EmployeeDecorator(EmployeeComponent employee) {
        this.employee = employee;
    }

    @Override
    public String getName() {
        return employee.getName();
    }

    @Override
    public void join(Date joinDate) {
        employee.join(joinDate);
    }

    @Override
    public void terminate(Date terminateDate) {
        employee.terminate(terminateDate);
    }
}

Manager.java

package com.gpcoder.patterns.structural.decorator;

public class Manager extends EmployeeDecorator {

    protected Manager(EmployeeComponent employee) {
        super(employee);
    }

    public void createRequirement() {
        System.out.println(this.employee.getName() + " is create requirements.");
    }

    public void assignTask() {
        System.out.println(this.employee.getName() + " is assigning tasks.");
    }

    public void manageProgress() {
        System.out.println(this.employee.getName() + " is managing the progress.");
    }

    @Override
    public void doTask() {
        employee.doTask();
        createRequirement();
        assignTask();
        manageProgress();
    }
}

TeamLeader.java

package com.gpcoder.patterns.structural.decorator;

public class TeamLeader extends EmployeeDecorator {

    protected TeamLeader(EmployeeComponent employee) {
        super(employee);
    }

    public void planing() {
        System.out.println(this.employee.getName() + " is planing.");
    }

    public void motivate() {
        System.out.println(this.employee.getName() + " is motivating his members.");
    }

    public void monitor() {
        System.out.println(this.employee.getName() + " is monitoring his members.");
    }

    @Override
    public void doTask() {
        employee.doTask();
        planing();
        motivate();
        monitor();
    }
}

TeamMember.java

package com.gpcoder.patterns.structural.decorator;

public class TeamMember extends EmployeeDecorator {

    protected TeamMember(EmployeeComponent employee) {
        super(employee);
    }

    public void reportTask() {
        System.out.println(this.employee.getName() + " is reporting his assigned tasks.");
    }

    public void coordinateWithOthers() {
        System.out.println(this.employee.getName() + " is coordinating with other members of his team.");
    }

    @Override
    public void doTask() {
        employee.doTask();
        reportTask();
        coordinateWithOthers();
    }
}

Client.java

package com.gpcoder.patterns.structural.decorator;

public class Client {

     public static void main(String[] args) {
         System.out.println("NORMAL EMPLOYEE: ");
         EmployeeComponent employee = new EmployeeConcreteComponent("GPCoder");
         employee.showBasicInformation();
         employee.doTask();
    
         System.out.println("\nTEAM LEADER: ");
         EmployeeComponent teamLeader = new TeamLeader(employee);
         teamLeader.showBasicInformation();
         teamLeader.doTask();

         System.out.println("\nMANAGER: ");
         EmployeeComponent manager = new Manager(employee);
         manager.showBasicInformation();
         manager.doTask();

         System.out.println("\nTEAM LEADER AND MANAGER: ");
         EmployeeComponent teamLeaderAndManager = new Manager(teamLeader);
         teamLeaderAndManager.showBasicInformation();
         teamLeaderAndManager.doTask();
    }
}

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

NORMAL EMPLOYEE: 
-------
The basic information of GPCoder
GPCoder joined on 04/11/2018
GPCoder terminated on 04/05/2019

TEAM LEADER: 
-------
The basic information of GPCoder
GPCoder joined on 04/11/2018
GPCoder terminated on 04/05/2019
GPCoder is planing.
GPCoder is motivating his members.
GPCoder is monitoring his members.

MANAGER: 
-------
The basic information of GPCoder
GPCoder joined on 04/11/2018
GPCoder terminated on 04/05/2019
GPCoder is create requirements.
GPCoder is assigning tasks.
GPCoder is managing the progress.

TEAM LEADER AND MANAGER: 
-------
The basic information of GPCoder
GPCoder joined on 04/11/2018
GPCoder terminated on 04/05/2019
GPCoder is planing.
GPCoder is motivating his members.
GPCoder is monitoring his members.
GPCoder is create requirements.
GPCoder is assigning tasks.
GPCoder is managing the progress.

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

  • Tăng cường khả năng mở rộng của đối tượng, bởi vì những thay đổi được thực hiện bằng cách implement trên các lớp mới.
  • Client sẽ không nhận thấy sự khác biệt khi bạn đưa cho nó một wrapper thay vì đối tượng gốc.
  • Một đối tượng có thể được bao bọc bởi nhiều wrapper cùng một lúc.
  • Cho phép thêm hoặc xóa tính năng của một đối tượng lúc thực thi (run-time).

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

  • Khi muốn thêm tính năng mới cho các đối tượng mà không ảnh hưởng đến các đối tượng này.
  • Khi không thể mở rộng một đối tượng bằng cách thừa kế (inheritance). Chẳng hạn, một class sử dụng từ khóa final, muốn mở rộng class này chỉ còn cách duy nhất là sử dụng decorator.
  • Trong một số nhiều trường hợp mà việc sử dụng kế thừa sẽ mất nhiều công sức trong việc viết code. Ví dụ trên là một trong những trường hợp như vậy.

So sánh Decorator và Adapter

Giống nhau:

Khác nhau:

  • Decorator cho phép thêm một tính năng mới vào một object nhưng không được phép sử dụng thừa kế. Nó cho phép thay đổi lúc thực thi (run-time). Adapter được sử dụng khi bạn có một interface, và bạn muốn ánh xạ interface đó đến một đối tượng khác có vai trò chức năng tương tự, nhưng là một interface khác.
  • Decorator có xu hướng hoạt động trên một đối tượng. Adapter có xu hướng hoạt động trên nhiều đối tượng (có thể wrap nhiều interface).

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

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

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

Hướng dẫn tạo extension chrome và đưa lên store chỉ trong 5 phút

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

Google chrome là một trong những trình duyệt được yêu thích nhất trên thế giới bởi… nó là sản phẩm của Google. Nói vui vậy thôi chứ mình thấy Google chrome thật sự là trình duyệt ngon nhất hiện nay bởi nó nhanh, đơn giản lại đồng bộ được nhiều dịch vụ có sẵn của Google. Nhưng điều mình thích nhất vẫn là nó có kho extension vô cùng phong phú.

I. Extension của google chrome là gì?

Chrome extension là các “phần mềm con” mà bạn có thể cài vào nhằm bổ sung thêm tính năng mới cho trình duyệt. Ví dụ như mình có 2 sản phẩm là URL QrCode và ICTU timetable đó chẳng hạn.

Phân tích dưới góc độ của developer, thì Chrome extension giống như một web app được tạo nên từ HTML, CSS, JS và tương tác với trình duyệt thông qua các JavaScript API mà chrome cung cấp. Cơ chế nhúng extension vào chrome cũng rất đơn giản, tương tự như việc bạn nhúng một cái iframe vào trang web vậy.

II. Tạo một extension chrome

Trong phần này, mình sẽ hướng dẫn các bạn cách tạo một extension có tính năng tương tự như extension URL QrCode của mình nhé.

2.1 Chuẩn bị một web app

Như mình đã nói ở phần trên thì chrome extension giống như một web app. Vậy chúng ta cần phải tạo ra một web app trước. Vì bài viết này không tập trung vào việc tạo web app như thế nào nên mình đã chuẩn bị sẵn cho bạn một cái ở github repo này rồi, bạn chỉ cần làm theo hướng dẫn để cài đặt thôi.

Trước khi cài đặt bạn hãy đảm bảo rằng máy tính của bạn đã được cài sẵn git và nodejs nhé.

  Giới thiệu một số extension trên Chrome cho web developer

  Hướng dẫn chi tiết xây dựng web app với Reactjs

Các bước cài đặt

Bước 1: Clone repo về máy

git clone https://github.com/phambinh217/qr-code-chrome-ext.git

Bước 2: Cài đặt các package cần thiết

cd qr-code-chrome-ext
npm install

Bước 3: Build ra sản phẩm cuối

npm run build

Sau khi build xong, toàn bộ các file mà bạn cần quan tâm sẽ nằm tại thư mục dist như hình

Tạo một extension chrome

Trong các file khoanh đỏ ở hình trên, bạn hãy để ý cho mình file manifest.json

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

2.2 Khai báo nội dung cho file manifest.json

Hãy mở file manifest.json mà mình lưu ý ở trên để xem nội dung bên trong là gì nhé

{
   "name": "URL QrCode",
   "description": "Generate QrCode from website URL",
   "version": "1.0",
   "browser_action": {
     "default_icon": "logo.png",
     "default_popup": "index.html"
   },
   "permissions": [
     "tabs"
   ],
   "manifest_version": 2
 }

Nhìn qua có thể thấy ngay manifest.json là file khai báo các thông tin cơ bản cho extension như tênmô tảphiên bản,…

Một vài thông tin mà mình thường hay khai báo là:

  • name: Tên của extension
  • description: Mô tả ngắn gọn cho extension
  • version: Phiên bản của extension. Mỗi khi có cập nhật cho extension, bạn nhất định phải thay đổi giá trị này thì extension của bạn mới có thể tự động cập nhật trên trình duyệt của người dùng
  • browser_action.default_icon: Đường dẫn tới file icon của extension
  • browser_action.default_popup: File đầu tiên được gọi đến khi người dùng mở extension của bạn
  • permissions: Các quyền mà extension muốn sử dụng. Như extension URL QrCode của mình cần truy cập vào URL hiện tại của tab, vì vậy mình cần khai báo permissions là tabs. Bạn có thể xem toàn bộ permissions tại đây.
  • manifest_version: Là phiên bản của file manifest.json do google quy định. Bạn có thể đọc thêm tại đây, nếu bạn không hiểu thì cứ để mặc định là 2 nhé.

Nếu bạn muốn tìm hiểu chi tiết về các thành phần nội dung trong file manifest.json, bạn có thể đọc thêm ở đây.

2.3 Cài đặt thử lên chrome

Extension đã có, giờ chúng ta sẽ thêm vào chrome để xem nó hoạt động như thế nào nhé. Để thêm vào chrome bạn lần lượt thực hiện theo các bước sau:

  • Bước 1: Truy cập vào Settings > More tools > Extensions (chrome://extensions) để mở trang quản lý các extension đã cài đặt.
  • Bước 2: Bật chế độ Developer mode để cài thẳng extension vào chrome mà không cần phải download từ store.
  • Bước 3: Nhấn nút Load unpacked, và chọn tới thư mục dist chứa extension mà chúng ta đã build ra ở mục 2.1.

Sau khi thực hiện 3 bước trên, nếu thành công thì bạn sẽ thấy extension của mình nằm trong danh sách các extension đã được cài đặt của chrome. Bạn có thể xem video dưới của mình để hiểu rõ hơn.

III. Đưa lên store

Về cơ bản, bạn đã tạo và cài đặt được một chrome extension. Giờ là lúc chúng ta đưa nó lên store để tiếp cận nhiều người sử dụng hơn.

Để có thể đưa lên store, bạn cần chuẩn bị trước một tài khoản dành cho Nhà phát triển. Phí đăng ký tài khoản này là $5 – thanh toán qua các thẻ Quốc tế như thẻ Visa.

Việc đưa lên store khá đơn giản

Bước 1: Đăng nhập tài khoản Nhà phát triển của bạn, sau đó truy cập vào Trang tổng quan dành cho nhà phát triển, nhấn vào nút Thêm mục mới.

Tạo một extension chrome

Bước 2: Nén zip các file nằm trong thư mục dist và tải lên. Bạn có thể xem video của mình để hiểu rõ hơn.

Bước 3: Sau khi tải lên thành công, bạn sẽ được chuyển hướng vào một trang mới. Tại đây bạn sẽ phải điền một số nội dung để mô tả về extension vừa tải lên như sau:

  • Ít nhất một ảnh chụp màn hình hoặc video youtube giới thiệu về extension của bạn. Nếu là hình ảnh thì phải có kích thước là 1280×800 hoặc 640×400.
  • Một bài mô tả ngắn ngọn về extension của bạn.
  • Một ảnh để làm avatar cho extension của bạn, có kích thước 128×128.

Trên là các thông tin mà mình nghĩ bạn nên chuẩn bị trước, ngoài ra còn một số thông tin khác nữa như chọn Danh mục cho extension, chọn Ngôn ngữ,… thì bạn chỉ cần làm theo hướng dẫn của Google là được. Sau cùng bạn nhấn vào nút Xuất bản các thay đổi để hoàn tất việc đưa extension lên store.

Tạo một extension chrome

Sau khi nhấn nút Xuất bản, Google sẽ kiểm duyệt extension của bạn trong vòng 5 – 10 phút gì đó. Thường thì các extension đều được duyệt, trừ khi bạn cố tình làm điều gì đấy ảnh hưởng tới quyền lợi của người sử dụng thì Google mới từ chối.

Quá trình đưa extension lên store chỉ đơn giản, vẻn vẹn trong 3 bước vậy thôi.

IV. Kết luận

Việc tạo extension không khó, về cơ bản extension chỉ giống như một cái web, vậy nếu bạn làm được web thì chắc chắn cũng làm được extension. Mình chỉ cảm rắc rối là khi đưa extension lên store thì phải có tài khoản Nhà phát triển – đăng ký mất $5 và thanh toán qua thẻ Quốc tế – cái mà nhiều bạn không có.

Bài viết được viết dựa trên kinh nghiệm cá nhân, có chỗ nào khó hiểu cần được giải thích thêm thì bạn cứ mạnh dạn nói với mình nhé.

Chào tạm biệt.

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

Xem thêm:

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

Tuyển tập câu hỏi phỏng vấn Data Engineer mới nhất

Tuyển tập câu hỏi phỏng vấn Data Engineer mới nhất

Thời kỳ công nghiệp 4.0 với sự phát triển của BigData, AI, Machine Learning,… tất cả các công nghệ mới hiện nay có một đặc điểm chung là cần phải xử lý dữ liệu ở một tổ chức và quy mô lớn. Cũng vì đó mà ngành kỹ sư dữ liệu trở nên hot hơn bao giờ hết. Data Engineer được rất nhiều công ty tuyển dụng với mức đãi ngộ cao cũng như định hướng tốt trong tương lai. Để chuẩn bị cho buổi phỏng vấn vị trí này, chúng ta cùng nhau tìm hiểu về những câu hỏi phỏng vấn Data Engineer thường gặp nhé.

Vai trò của một Data Engineer

Data Engineer / Kỹ sư dữ liệu là có nhiệm vụ chính là thu thập, chuẩn bị các dữ liệu và cùng những nhà khoa học, phân tích dữ liệu sử dụng. 3 vai trò của một Data Engineer bao gồm:

  • Generalist – Đảm nhận các công việc tổng quát: thu thập, tải lên, nhập, đồng thời xử lý dữ liệu đầu cuối. Đây là công việc cơ bản của một Data Engineer.
  • Pipeline-centric – Phụ trách mảng Data Pipeline: Data Pipeline hay đường ống dữ liệu là một chuỗi các bước thực hiện theo một trình tự cụ thể để xử lý dữ liệu và chuyển dữ liệu từ hệ thống này sang hệ thống khác. Vai trò này đòi hỏi các kỹ sư dữ liệu cần biết chuyên sâu về hệ thống khoa học máy tính và phân tán.
  • Database-centric – Chuyên về cơ sở dữ liệu: vai trò thiết lập, triển khai, đồng thời duy trì và đưa cơ sở dữ liệu đã phân tích vào hệ thống. Thông thường các hệ thống nơi dữ liệu được phân bố rộng tại nhiều kho Database thì vai trò này phải được đảm nhiệm bởi một kỹ sư, chuyên gia dữ liệu có kinh nghiệm.

Data Engineer
Kỹ năng của Data Engineer

Ngôn ngữ lập trình thường sử dụng để xử lý dữ liệu

Data Engineer làm việc với các loại dữ liệu khác nhau thu thập từ nhiều nguồn khác nhau. Điều kiện tiên quyết để trở thành một kỹ sư dữ liệu là biết cách làm việc, thao tác, truy vấn hay quản lý các hệ thống cơ sở dữ liệu. SQL hay ngôn ngữ truy vấn có cấu trúc (Structured Query Language) phục vụ cho công việc này.

Để phục vụ cho quá trình xử lý dữ liệu, cụ thể là viết các ETL scripts trích xuất, chuyển đổi và tải dữ liệu từ hệ thống này sang hệ thống khác, ngôn ngữ lập trình thường được sử dụng là Python. Ưu điểm của Python là khả năng tối ưu hóa các script hỗ trợ thao tác dữ liệu, vì thế rất được ưa chuộng trong ngành xử lý dữ liệu nói riêng và BigData, AI nói chung.

Một ngôn ngữ lập trình thường được sử dụng trong việc phân tích thống kê và trực quan hóa dữ liệu là R, ưu điểm của ngôn ngữ lập trình này là thư viện có sẵn các thuật toán học máy, hồi quy tuyến tính, chuỗi thời gian, suy luận thống kê,… giúp lập trình viên xử lý dữ liệu tối ưu hóa xử lý của mình. 

  Khám phá Quy trình tuyển dụng Data Engineer

  Một số lầm tưởng về big data của software engineer

So sánh SQL và NoSQL

SQL vs NoSQL

SQL và NoSQL là 2 loại hình cơ sở dữ liệu phổ biến nhất hiện nay. SQL (Structured Query Language) là ngôn ngữ truy vấn có cấu trúc. Nó được dùng để xử lý cơ sở dữ liệu quan hệ như MySQL, Oracle, MS SQL,… NoSQL (Non-Relational SQL) có mục đích sử dụng như SQL nhưng được dành cho các cơ sở dữ liệu không quan hệ, không yêu cầu một lược đồ cố định và có thể dễ dàng mở rộng. NoSQL thường được sử dụng cho các kho dữ liệu phân tán với nhu cầu lưu trữ dữ liệu khổng lồ vì vậy nó thích hợp với các ứng dụng Web thời gian thực hay BigData.

Về loại hình, SQL databases có cấu trúc dựa trên các bảng, các bảng có quan hệ với nhau. NoSQL thì dựa trên cặp tài liệu, cặp khóa giá trị hay cơ sở dữ liệu biểu đồ. NoSQL không có ngôn ngữ Query như cái tên của nó, NoSQL databases cũng dễ dàng mở rộng theo chiều ngang và phù hợp với những bài toán mà dữ liệu ban đầu chưa xác định rõ.

So sánh về hiệu suất thì NoSQL thường được cho là nhanh hơn SQL do không mất nhiều chi phí join hay các đoạn câu lệnh SQL phức tạp cần tối ưu. Ngược lại, SQL sẽ hỗ trợ ràng buộc tốt hơn cho những thao tác update nhiều records trong cùng một transaction, NoSQL có options tương tự nhưng bạn sẽ cần xử lý thủ công hơn trong khi viết code.

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

Sự khác biệt giữa DataLake và DataWarehouse?

DataLake và DataWarehouse đều là những kho lưu trữ dữ liệu dành cho các doanh nghiệp. Điểm khác nhau cơ bản giữa 2 loại kho dữ liệu trên là trong khi DataLake chủ yếu chứa các dữ liệu thô, nguyên gốc; còn dữ liệu trong DataWarehouse cần trải qua bước biến đổi và phân loại dữ liệu từ các nguồn khác nhau trước khi nhập vào kho lưu trữ.

Dữ liệu trong DataLake được giữ nguyên gốc đầu vào vì thế doanh nghiệp cũng tiết kiệm chi phí cho việc biến đổi, phân loại dữ liệu. Ngược lại dữ liệu trong DataWarehouse sẽ trải qua quy trình ETL: Extract – Transform – Load trước khi được nhập kho, sau đó những dữ liệu này được các Data Analyst, Business Analyst hoặc Data Scientist,… sử dụng trực tiếp để báo cáo, phân tích và khai thác dữ liệu; vì vậy doanh nghiệp sử dụng DataWarehouse sẽ cần tốn chi phí cho công việc trên.

Giải thích về kỹ thuật ETL / ELT trong xử lý dữ liệu

ETL viết tắt của Extract, Transform và Load, là một kỹ thuật trích xuất dữ liệu từ các hệ thống nguồn khác nhau sau đó chuyển đổi dữ liệu áp dụng các logic tính toán để tải chúng vào hệ thống kho dữ liệu DataWarehouse.

Flow của ETL có 3 bước:

  1. Extract – trích xuất: thu thập dữ liệu từ các nguồn
  2. Transform  – biến đổi: dựa vào các quy tắc, bảng tra cứu,… kết hợp các dữ liệu khác nhau để biểu dữ liệu thu được từ bước Extract về một dạng biểu mẫu phù hợp vơi cơ sở dữ liệu xây dựng sẵn
  3. Load – tải: quá trình ghi dữ liệu vào đích

ELT là một kỹ thuật khác về luồng xử lý so với ETL. Vẫn giữ 3 bước như trên nhưng bước Load sẽ được thực hiện ngay sau khi trích xuất dữ liệu. Dữ liệu sẽ được sao chép và chuyển đến đích ngay, xong sau đó mới thực hiện bước biến đổi (Transform). Để thực hiện việc này thì ETL chỉ phù hợp với các database NoSQL, với những dữ liệu lớn và việc lưu trữ không yêu cầu phải đúng theo template sẵn có.

Ưu điểm của ELT chính là việc không phụ thuộc tốc độ xử lý dữ liệu ở bước Transform (thường chiếm nhiều thời gian nhất trong phương thức ETL), dữ liệu sau khi được tải có thể được xử lý sau đó mà không lo việc mất mát hay bị ngừng lại trong quá trình biến đổi. Mặc dù vậy nhược điểm của nó chính là độ phức tạp đòi hỏi kiến thức chuyên sâu về các tools sử dụng cũng như kỹ năng chuyên môn.

Có những giai đoạn nào trong quá trình phân tích dữ liệu

4 giai đoạn chính trong quá trình phân tích dữ liệu
Nguồn: https://www.enablerspace.com/digitalmarketingtips/understanding-the-different-types-of-data-analysis/

Có 4 giai đoạn chính trong quá trình phân tích dữ liệu:

  • Phân tích mô tả (Descriptive Analytics)

Giai đoạn đầu tiên này giúp tìm hiểu thông tin về quá khứ, hiện tại và xu hướng của dữ liệu. Một số phương pháp phân tích áp dụng trong giai đoạn này gồm: Định lượng hóa dữ liệu, Phân tích biểu đồ và bảng biểu, Tóm tắt thống kê, Đồ thị thời gian và phân tích nhân tố.

  • Phân tích chẩn đoán (Diagnostic Analytics)

Giai đoạn này sử dụng các phương pháp phân tích để giải thích các nguyên nhân hoặc đặc điểm của các hiện tượng hoặc sự kiện trong dữ liệu. Phương pháp phân tích chẩn đoán bao gồm phân tích tương quan, phân tích đa biến, phân tích thành phần chính và phân tích nhân tố.

  • Phân tích tiên đoán (Predictive Analytics)

Phân tích tiên đoán là việc sử dụng các mô hình dữ liệu để dự đoán các sự kiện hoặc xu hướng trong tương lai. Phương pháp sử dụng bao gồm mô hình hồi quy, mô hình chuỗi thời gian, mạng nơ ron và máy học.

  • Phân tích chỉ đạo (Prescriptive Analytics)

Là giai đoạn cuối cùng của phân tích dữ liệu, sử dụng kết quả từ phân tích tiên đoán để đưa ra các quyết định chỉ đạo và lập kế hoạch. Phương pháp sử dụng là tối ưu hóa và mô phỏng.

Nêu một số công cụ biểu diễn trực quan hóa dữ liệu

Kỹ sư dữ liệu cần biết đến các công cụ phân tích và trực quan hóa dữ liệu Bussiness Intelligence nhằm phục vụ việc thiết lập kết nối giữa các DataWarehouse, DataLake cùng với các nguồn dữ liệu đầu vào hay đầu ra khác. Ngoài ra còn để phục vụ cho việc lập báo cáo, lên kế hoạch; một số công cụ biểu diễn trực quan hóa dữ liệu dành cho Data Engineer:

  • Microsoft Power BI
  • Microsoft Excel
  • SAP Business Objects
  • Datapine
  • Oracle BI
  • SAS Business Intelligence
  • MicroStrategy

Kết bài

Trên đây là list những câu hỏi mà bạn sẽ có thể gặp trong buổi phỏng vấn của mình ở vị trí kỹ sư dữ liệu Data Engineer. Hy vọng bài viết hữu ích dành cho các bạn đang muốn tìm một công việc tốt trong ngành này. Hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

Xem thêm Top Việc làm IT trên TopDev

Cài đặt môi trường lập trình web PHP

Cài đặt môi trường lập trình web PHP

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

Chào các bạn,

Trên blog của mình có những bài viết cao siêu về trick nọ trick kia, thế nhưng có một điều quan trọng mà các bạn mới bắt đầu thường quan tâm đó là cài đặt những phần mềm gì vào máy tính để có thể học được lập trình web PHP thì chưa có. Vậy trong bài viết này, mình sẽ hướng dẫn các bạn cách cài đặt môi trường để có thể học lập trình web PHP nhé.

I. Cài đặt code editor

Code editor là phần mềm để chúng ta có thể viết code. Hiện nay có rất nhiều các code editor hỗ trợ cho lập trình web PHP, nhưng mình khuyên các bạn nên sử dụng Sublime Text 3 – một editor nhẹ nhàng nhưng vẫn đầy đủ.

Sublime Text 3

Sublime Text 3 có mặt trên cả 3 hệ điều hành phổ biến là Windows, Mac, Ubuntu – thoải mái cho bạn lựa chọn. Sublime Texr 3 cũng có cách cài đặt đơn giản như những phần mềm bình thường khác nên bạn đừng lo lắng nhé.

II. Cài đặt trình duyệt

Đối với web developer, trình duyệt không chỉ đơng giản là phần mềm để lướt web, mà nó còn là công cụ để phát triển web, vì vậy mà máy bạn có trình duyệt hay chưa không quan trọng, quan trọng là bạn đang sử dụng trình duyệt nào. Ở đây, mình gợi ý các bạn nên sử dụng Google Chrome, bởi nó nhẹ nhàng, được tích hợp tool phát triển web, lại là trình duyệt được nhiều người dùng nhất.

Ở Việt Nam còn có một trình duyệt phổ biến nữa đó là trình duyệt Coccoc, bạn có thể sử dụng Coccoc để download video từ Youtube, tuy nhiên không nên sử dụng Coccoc làm trình duyệt để phát triển web. Tại sao thì có nhiều nguyên nhân mà trong phạm vi bài viết này mình sẽ không đề cập đến, bạn cứ nghe mình đi, nếu đang dùng Coccoc thì tải thêm cái Chrome nữa về để phát triển web sẽ tốt hơn.

  So sánh ASP.NET và PHP? Lập trình website nên học ngôn ngữ nào?

III. Cài đặt một web technology stack

Hiểu nhanh thì Web technology stack là một bộ các phần mềm liên quan để tạo nên môi trường phát triển web. Web technology stack thường bao gồm các thành phần: Hệ điều hành, Web server, CSDL, Ngôn ngữ lập trình (không bao gồm editor và trình duyệt).

Hiện nay có khá nhiều Web technology stack, nhưng chúng ta đang phát triển web PHP nên mình gợi ý các bạn nên sử dụng LAMP Stack.

LAMP là chữ viết tắt của:

  • Linux: Hệ điều hành lý tưởng nhất để phát triển PHP. (Bạn có thể sử dụng Windows cũng được).
  • Apache: Đóng vai trò là một web server.
  • MySQL: Đóng vai trò là CSDL.
  • PHP: Chính là PHP.

  Hướng dẫn kết nối PHP với SQL Server

Cài đặt LAMP Stack với XAMPP

Xampp là một phần mềm chứa tất cả các thành phần cần thiết cho LAMP Stack (không đúng lắm với các bạn sử dụng Windows). Nghĩa là sau khi bạn cài đặt xong XAMPP, bạn sẽ có luôn Apache, MySQL, PHP – những thành phần lẽ ra bạn phải cài đặt từng thứ một.

XAMPP

XAMPP có mặt trên 3 hệ điều hành phổ biến là Ubuntu, MacOS và Windows (32 bit, 64 bit). Về cách cài đặt XAMPP thì cũng cài đặt đơn giản như bao phần mềm khác, chứ không có gì đặc biệt cả.

Xem thêm tuyển dụng PHP lương cao trên TopDev

III. Một số công cụ khác

3.1 Composer

PHP là một ngôn ngữ lâu đời (ra đời năm 1995), nên nó được các developer đóng góp một lượng thư viện khổng lồ – cái mà bạn sẽ sử dụng rất nhiều khi làm việc với các PHP framework. Để tiện quản lý các thư viện PHP, thì bạn cần cài đặt Composer.

3.2 NodeJS – NPM

NodeJS là môi trường cần thiết cho nhiều công cụ phát triển web mà chắc chắn bạn sẽ sử dụng tới. Vì vậy mình khuyên bạn nên cài đặt luôn. Về cách cài đặt NodeJs thì bạn chỉ cần download về và cài đặt như một phần mềm bình thường.

3.3 Git

Git là một công cụ quản lý phiên bản, tuy nhiên với sự ra đời của Github thì Git còn giống như công cụ để chia sẻ project lẫn nhau của các developers. Trên Github có một lượng lớn các project đủ mọi thể loại, nếu bạn muốn lấy chúng về để tham khảo thì bạn nên cài đặt Git.

>> Đọc thêm: GIT là gì mà giúp bạn và cả team làm việc hiệu quả hơn

3.4 CLI

Command Line Interface (CLI) là công cụ mà lập trình viên nên sử dụng. Trên Ubuntu hoặc MacOS thì chính là Terminal, trên Windows thì chính là Cmd (Command Prompt). Tuy nhiên với các bạn sử dụng Windows thì nên dùng CLI là Git Bash – công cụ được tích hợp sẵn nếu bạn download Git ở mục 3.3.

Git Bash cung cấp một số command line giả lập Linux trên Windows. Hơn nữa là Git Bash có một chút màu mè, nhìn đẹp mắt và có vẻ ngầu hơn là bạn sử dụng Cmd của Windows.

3.5 Postman

Postman là công cụ hỗ trợ bạn phát triển các Web API tiện lợi hơn. Postman tồn tại dưới 2 dạng: một là extension của trình duyệt Chrome, hai là một phần mềm riêng biệt (hỗ trợ đủ hệ điều hành). Ở đây mình khuyên bạn nên sử dụng Postman như một phần mềm riêng biệt thì hơn.

IV. Kết luận

Tuy là khi làm thực tế, có thể bạn sẽ cần phải cài thêm một số thứ khác nữa, nhưng cơ bản như vậy là đủ – đủ để bạn bắt đầu học lập trình web PHP được rồi.

Hiện tại mình và nhiều web developer chuyên nghiệp khác cũng chỉ cài các công cụ như trên, thế nên bạn cứ yên tâm sử dụng nhé. Trong trường hợp bạn biết một công cụ nào mà bạn cho là tốt hơn, phù hợp với bạn hơn thì bạn cứ mạnh dạn sử dụng, không nhất thiết phải 100% theo gợi ý mình.

Bài viết được viết dựa trên kinh nghiệm cá nhân, rất mong nhận được góp ý từ các bạn.

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

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

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

[Update] 5 xu hướng tuyển dụng IT 2024 không thể bỏ qua

5 xu hướng tuyển dụng IT 2023 không thể bỏ qua

Vượt qua những khó khăn từ làn sóng Covid-19, giờ đây các doanh nghiệp CNTT tiếp tục bước vào cuộc đua tìm kiếm và giữ chân nhân tài. Vậy bức tranh tuyển dụng nhân sự IT năm 2024 sẽ như thế nào? Nhà tuyển dụng cần phải hành động gì để thu hút được nhân sự chất lượng? Bài viết này sẽ cho bạn góc nhìn tổng quát về xu hướng tuyển dụng IT 2024, từ đó giúp doanh nghiệp xây dựng các chiến lược tuyển dụng hiệu quả nhất.

­Hình thức làm việc từ xa tiếp tục dẫn đầu xu hướng trong tuyển dụng IT 2024

Với tác động của dịch bệnh kéo dài đã ảnh hưởng trực tiếp đến lực lượng lao động, mô hình công việc truyền thống giờ đây đã không còn phù hợp trong bối cảnh hiện tại. Theo Báo cáo thị trường IT Việt Nam – Tech Hiring 2022 của TopDev, Gần 75% các lập trình viên đang làm công việc toàn thời gian, thấp hơn con số trước đó năm 2021. Lý do không phải do thất nghiệp, mà bởi xu hướng làm việc từ xa (remote)/ tự do (freelance) gia tăng.

xu hướng tuyển dụng IT 2023

Nhiều công ty đã chính thức đưa mô hình hybrid (kết hợp giữa làm việc tại công ty và làm việc từ xa) vào quá trình vận hành, điều này đã tạo ra nhiều phản hồi tích cực từ phía nhân viên trong năm 2022. Với mô hình này, nhân viên có thể linh hoạt làm việc từ bất kỳ đâu, tăng tính hiệu quả và sự thoải mái trong công việc.

xu hướng tuyển dụng IT 2023

Nhưng mô hình hybrid này cũng đứng trước nhiều thách thức như sự gắn kết của các nhân viên, sự thiếu tin tưởng từ nhà quản lý về năng suất của nhân viên, an ninh mạng hay hệ thống & các quy trình làm việc mới. Do đó, các doanh nghiệp sẽ cần thích nghi và phục vụ cho các sở thích khác nhau trong khi hỗ trợ nhân viên. Họ phải suy nghĩ lại các chiến lược hiệu quả cho công việc hybrid trong tương lai gần. Vậy nên, việc mô hình hybrid có tiếp tục trở thành xu hướng trong những năm tới hay không còn phụ thuộc vào khả năng thích nghi và quản lý của các nhà lãnh đạo.

Mức lương không còn là ưu tiên hàng đầu của ứng viên

Theo kết quả khảo sát của TopDev, hơn 50% ứng viên mong muốn tìm thấy mục đích và hiểu rõ giá trị của mình trong công việc, thông qua các thách thức kỹ thuật và những vấn đề thú vị cần giải quyết. Điều đó cho thấy các ứng viên ngày càng tự tin và hầu như không cảm thấy quá lo lắng khi thay đổi công việc mới.

Cũng dễ hiểu, bởi có đến 72% lập trình viên cảm thấy rằng họ dễ dàng thay đổi một công việc mới, trong khi chỉ 6% lập trình viên cảm thấy thiếu tự tin khi thay đổi công việc.

xu hướng tuyển dụng IT 2023

Theo khảo sát, 3 yếu tố hàng đầu khiến lập trình viên từ chối Job Offer là offer không phù hợp (trách nhiệm & mức lương); chính sách phúc lợi & đãi ngộ công ty; thiếu cơ hội phát triển/đóng góp. Vậy nên, để thu hút và giữ chân nhân tài, các doanh nghiệp cần tích cực đưa ra những gói lợi ích, những chính sách phúc lợi và lộ trình thăng tiến rõ ràng cho nhân viên.

  Top 10 vị trí tuyển dụng IT hấp dẫn 2024

  [Update] 5 xu hướng dẫn dắt “làn sóng” công nghệ trong năm 2024

Tận dụng “bệ phóng” thương hiệu nhà tuyển dụng để thu hút nhân tài

Theo TopDev, có hơn 53% nhà tuyển dụng/nhân sự IT đầu tư cho việc xây dựng thương hiệu nhà tuyển dụng và danh tiếng công ty. Khi ứng viên càng hiểu nhiều về công ty, về sứ mệnh, văn hóa, mục tiêu phát triển thì việc gây được thiện cảm và thu hút được ứng viên phù hợp là điều không khó.

xu hướng tuyển dụng IT 2023

Vậy nên ngay từ bây giờ các doanh nghiệp nên chú ý hơn trong việc xây dựng thương hiệu, tận dụng cơ hội để đưa hình ảnh thương hiệu ra bên ngoài. Đồng thời, doanh nghiệp cần tiếp tục quan sát hành vi của ứng viên và các xu hướng mới, đánh giá tính bền vững của chúng để có thể xây dựng các kế hoạch tuyển dụng phù hợp với tương lai. Điều này rất quan trọng vì sẽ ảnh hưởng đến hiệu quả của chiến lược tuyển dụng trong tương lai.

Ứng dụng phương pháp/công cụ đánh giá năng lực kỹ thuật & tính cách

Để loại bỏ sự thiên vị trong ngành tuyển dụng CNTT, nhiều nhân viên đã bắt đầu tập trung hơn vào việc đánh giá ứng viên dựa trên kỹ năng và chắc chắn rằng lập trình viên sẽ được hưởng lợi từ điều này so với những phương pháp đánh giá chủ quan trước đây thông qua phỏng vấn truyền thống.

Các bài kiểm tra tính cách có thể tiết lộ những phẩm chất quan trọng của ứng viên tác động trực tiếp đến sự phù hợp với văn hóa, với các vị trí cụ thể và hiệu suất của nhóm như: động lực làm việc của họ là gì, quá trình suy nghĩ, cách giao tiếp và thái độ của họ. Việc ứng dụng công cụ vào quá trình tuyển dụng sẽ giúp doanh nghiệp tìm kiếm được ứng viên chất lượng và phù hợp với vị trí đang tuyển.

Tổng hợp các việc làm Back-end đang tuyển trên TopDev

Tăng tỉ lệ tuyển dụng thành công bằng việc cải thiện trải nghiệm ứng viên

Những đánh giá tiêu cực về quy trình tuyển dụng và trải nghiệm của ứng viên sẽ ảnh hưởng xấu đến thương hiệu nhà tuyển dụng. Theo LinkedIn, 65% ứng viên nói rằng trải nghiệm phỏng vấn tồi tệ khiến họ mất hứng thú với công việc. Trong khi đó, trải nghiệm ứng viên tích cực khiến ứng viên có khả năng chấp nhận lời mời làm việc cao hơn 38%.

xu hướng tuyển dụng IT 2023

Vậy nên, các doanh nghiệp cần chú trọng vào việc xây dựng hành trình trải nghiệm ứng viên tích cực với sự tham gia của tất cả các bộ phận liên quan. Hãy bắt đầu từ việc xây dựng mô tả công việc rõ ràng, làm cho quá trình ứng tuyển dễ dàng và dễ tiếp cận, đồng thời hãy đối xử với ứng viên một cách tôn trọng và dành sự quan tâm đầy đủ cho ứng viên trong cuộc phỏng vấn/cuộc gọi.

Việc đón đầu các xu hướng tuyển dụng nói trên sẽ góp phần giúp doanh nghiệp xây dựng các chiến lược “săn nhân tài” tốt hơn. Bạn có thể tìm hiểu toàn cảnh thị trường IT cũng như những chỉ số chi tiết về thị trường IT thông qua Báo cáo thị trường IT Việt Nam – Tech Hiring 2022 do TopDev phát hành.

Xem thêm:

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

Câu hỏi phỏng vấn NoSQL Developer cơ bản thường gặp nhất

Câu hỏi phỏng vấn NoSQL Developer cơ bản thường gặp nhất

Năm 2023 được dự báo là năm phát triển vượt bậc của NoSQL, chính vì vậy nhu cầu nhân lực cho vị trí NoSQL Developer cũng trở nên nhiều hơn bao giờ hết, bài viết này cung cấp cho anh em một số câu hỏi phỏng vấn NoSQL Developer hay. Tất nhiên là anh em SQL Developer có thể đọc thêm NoSQL để bổ sung kiến thức.

Phỏng vấn NoSQL

Phỏng vấn NoSQL
Theo như con số thống kê thì các hệ cơ sở dữ liệu NoSQL như mongodb, nosql đang tăng dần mức độ phổ biến.

Bài viết này chia sẻ với anh em 5 câu hỏi phỏng vấn liên quan tới NoSQL. Phần một này bao gồm các câu hỏi tổng quan, chi tiết và các câu hỏi khó hơn xin được viết ở phần 2.

Ok, gét gô thôi anh em!

Phỏng vấn NoSQL Không còn đường lui nữa rồi!

1. NoSQL là gì? Điểm mạnh của NoSQL

Tất nhiên là câu hỏi đầu tiên phỏng vấn NoSQL Developer là câu hỏi về khái niệm NoSQL. Câu hỏi này anh em cố gắng trả lời càng chi tiết càng tốt.

Một câu hỏi định nghĩa cần nêu bật khái niệm một cách chính xác. Đầu tiên.

A NoSQL database provides a mechanism for storage and retrieval of data that is modeled in means other than the tabular relations used in relational databases (like SQL, Oracle, etc.).

NoSQL database cung cấp cơ chế lưu trữ và truy xuất dữ liệu được mô hình hoá theo các cách thức khác với dạng bảng được sử dụng trong cơ sở dữ liệu dạng quan hệ (như SQL, Oracle).

Các loại cơ sở dữ liệu được sử dụng trong NoSQL bao gồm:

  • Document Oriented (Hướng tài liệu)
  • Key Value
  • Graph
  • Column Oriented (Hướng theo cột)

Về ưu điểm của NoSQL anh em có thể nêu ra một số ưu điểm làm cho NoSQL trở nên mạnh mẽ hơn so với SQL truyền thống. Một số ưu điểm có thể kể tới là:

  • NoSQL không có Schema
  • Hỗ trợ đọc ghi với tần suất rất cao
  • Hỗ trợ được big data (Terra Byte và Peta Byte)
  • Tốc độ Development nhanh hơn
  • Cho phép in memory cache giúp tối ưu performance cho queries

  NoSQL là gì? Điểm mạnh vượt trội của NoSQL
  Top 5 câu hỏi phỏng vấn SQL Developer - Phần 1

2. Lúc nào thì lựa chọn sử dụng NoSQL

Sau khi đã hiểu về NoSQL và một số ưu điểm của NoSQL thì câu hỏi phỏng vấn NoSQL Developer thứ hai liên quan tới khi nào thì anh em sử dụng nó.

Biết là có rất nhiều ưu điểm so với SQL truyền thống, nhưng không phải lúc nào cũng sử dụng. Tuỳ vào dự án, tuỳ vào business và yêu cầu data mà anh em sử dụng.

Hiểu được lúc nào sử dụng NoSQL cũng giúp anh em bớt cuồng, bớt thần thánh hoá. Một số trường hợp nêu dưới đây anh em nên sử dụng NoSQL.

  • Sử dụng với dữ liệu phi cấu trúc (không đem vào bảng, mỗi dòng đều phải có đủ từng đó column,…). Cũng không cần thiết phải quan tâm với schema.
  • Khách hàng cần xây dựng web, application có thể đáp ứng lượng truy cập cao hoặc cực cao.
  • Dữ liệu phi cấu trúc của anh em đôi khi không có ý nghĩa gì nếu sử dụng với SQL, hoặc ít nhất là không thể tổ chức được trong SQL. Hoặc những thông tin đó anh em cần JOIN quá trời JOIN để lấy ra cho được.

3. Giải thích Document-oriented và Key-Value trong NoSQL

Ở hai câu hỏi trước, ta đã hiểu và biết lúc nào sẽ sử dụng NoSQL. Câu hỏi thứ 3 phỏng vấn NoSQL Developer sẽ đi sâu vào các kiểu thường được sử dụng trong NoSQL.

Cụ thể ở câu hỏi này là Document Oriented và Key Value.

3.1 Key-value

Với Key-value thì cách thức tổ chức dữ liệu đúng như tên gọi. Một khoá là một định danh duy nhất. Có thể sử dụng khoá để truy xuất dữ liệu.

Phỏng vấn NoSQL

Anh em có thể nêu các ví dụ thực tế. Phần giá trị (value) được lưu trữ không đơn giản như Hashmap. Nó có thể đơn giản như là chuỗi, các số, hoặc cũng có thể phức tạp hơn như các giá trị lồng với nhau. Key ở đây ánh xạ trực tiếp với giá trị, hoặc vị trí lưu trữ giá trị (location of data being stored)

3.2 Column Oriented

Về Column Oriented thì đúng như cái tên, Oriented (hướng về).

Column-oriented NoSQL databases use a set of columns to store data. These column sets are known as column families, and users can directly query these column families without going through all the data records. Dữ liệu hướng column là tập hợp các column để lưu dữ liệu. Các column này được gọi là danh sách họ các cột (trong cùng gia đình), user có thể truy vấn trực tiếp dữ liệu từ các cột mà không cần phải đi qua tất cả các dòng dữ liệu

Phỏng vấn NoSQL

Loại hình này rõ ràng khác biệt với cơ chế lưu theo kiểu hàng ở SQL và các RDBMS khác. Khi cần truy xuất data ở cột, anh em không cần phải lấy dữ liệu ở cột thông qua việc đi hết một lượt tất cả các dòng.

Việc sử dụng và lưu trữ dạng cột cũng giúp tăng hiệu năng, riêng đối với việc đọc dữ liệu thì Column Oriented tỏ ra có hiệu năng cao hơn hẳn so với RDBMS thông thường. Tất nhiên vẫn có những điểm yếu như việc ghi sẽ tốn nhiều effort hơn để đảm bảo tính consistency (nhất quán) của dữ liệu.

Tham khảo SQL Developer Jobs hấp dẫn trên TopDev

4. Làm thể nào để ghi lịch sử thay đổi trong NoSQL

Câu hỏi phỏng vấn NoSQL Developer số 4 liên quan tới kinh nghiệm làm thực tế. Từ những kiến thức lý thuyết ở trên, anh em có thể giải quyết được bài toán thực tế.

Đối với câu hỏi tracking history này bên SQL và RDBMS bình thường thì không có vấn đề gì ha anh em. Cứ mỗi lần thay đổi có thể insert thêm 1 dòng, có created_at và updated_at

Phỏng vấn NoSQL

Cứ insert lúc nào thì lưu history, câu chuyện không có gì khi yêu cầu thực hiện việc tương tự bên NoSQL. Với NoSQL, thông trường sẽ có vài cách để track được lịch sử thay đổi.

  • Create a new version on each change (tạo version mỗi khi thay đổi)
  • Only store changes in a new version (chỉ lưu trữ thay đổi trong version mới)
  • Store changes within the document (lưu thay đổi kiểu document)

{
  _id: "4c6b9456f61f000000007ba6"
  title: [
    { version: 1, value: "Hello world" },
    { version: 6, value: "Foo" }
  ],
  body: [
    { version: 1, value: "Is this thing on?" },
    { version: 2, value: "What should I write?" },
    { version: 6, value: "This is the new body" }
  ],
  tags: [
    { version: 1, value: [ "test", "trivial" ] },
    { version: 6, value: [ "foo", "test" ] }
  ],
  comments: [
    {
      author: "joe", // Unversioned field
      body: [
        { version: 3, value: "Something cool" }
      ]
    },
    {
      author: "xxx",
      body: [
        { version: 4, value: "Spam" },
        { version: 5, deleted: true }
      ]
    },
    {
      author: "jim",
      body: [
        { version: 7, value: "Not bad" },
        { version: 8, value: "Not bad at all" }
      ]
    }
  ]
}

Ví dụ dưới đây lưu thay đổi của các field độc lập với nhau. title có 2 version, body cũng vậy.

5. Trường hợp muốn chuyển đổi từ SQL qua NoSQL. Cần làm những gì?

Câu hỏi cuối cùng trong bài viết chia sẻ các câu hỏi phỏng vấn NoSQL Developer lần này là việc migration từ SQL qua NoSQL. Tất nhiên là việc bưng nguyên 1 cục từ SQL qua NoSQL không phải dễ dàng.

Tuy nhiên theo từng bước vẫn có thể thực hiện được. Câu hỏi này đánh vào kiến thức của anh em về cả SQL và NoSQL. Các bước thực hiện:

  • Xác định các đối tượng dữ liệu ở SQL, mối liên hệ giữa các dữ liệu, đảm bảo cấu trúc và định dạng của dữ liệu đúng sau khi đem qua NoSQL
  • Sau khi đã có cấu trúc và lưu được dữ liệu, anh em cần thực hiện query để đảm bảo tất cả dữ liệu đều được lưu đúng và đầy đủ. Bước này quan trọng
  • Cuối cùng là kiểm tra lại hiệu năng, đảm bảo với NoSQL sẽ không có vấn đề gì về hiệu năng, nếu cần thì đánh index.

Ngoài cách thực hiện thủ công thì hiện tại cũng đã có nhiều tools hỗ trợ ở mức cơ bản. Giúp cho việc chuyển đổi nhanh chóng hơn

6. Kiến thức thêm chuẩn bị phỏng vấn NoSQL Developer

Kết thúc phần 1, ở phần 2 sẽ đi sâu hơn NoSQL cho anh em với một số câu hỏi:

  • NoSQL là norelation nhưng làm sao xác định được mỗi liên hệ giữa các record (record relations)
  • Transaction trong NoSQL
  • Thực hiện scalability và giải quyết các vấn đề performance trong NoSQL.

Ngoài ra anh em có thể tham khảo thêm:

Cảm ơn anh em đã đọc bài – Thank you 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 Developer hấp dẫn tại TopDev

Giới thiệu 11 nhóm ngành công nghệ thông tin mới nhất hiện nay

Tổng quan về các nhóm ngành công nghệ thông tin

Trong thời đại kỹ thuật số hiện nay, công nghệ thông tin đóng vai trò vô cùng quan trọng trong mọi lĩnh vực của cuộc sống, nó đã và đang thay đổi cách thức hoạt động của con người và xã hội. Chính vì vậy, ngành công nghệ thông tin chưa bao giờ “hạ nhiệt” bởi nhu cầu nhân lực luôn ở mức cao.

Tuy nhiên, nhiều bạn trẻ vẫn khá lúng túng khi chọn ngành học này bởi CNTT chia thành nhiều mảng, nhiều nhóm ngành khác nhau. Mỗi nhóm có những nét đặc trưng và yêu cầu công việc riêng biệt. Chính vì vậy, bài viết này TopDev sẽ giúp bạn hiểu rõ hơn về các nhóm ngành công nghệ thông tin cũng như những điểm thú vị của từng mảng. Bắt đầu thôi nào!

Tổng quan về ngành công nghệ thông tin

Các nhóm ngành công nghệ thông tin

Ngành công nghệ thông tin (IT – Information Technology) là ngành khoa học kỹ thuật xử dụng máy tính và các phần mềm máy tính để phân phối, xử lý dữ liệu cũng như lưu trữ, trao đổi và sử dụng thông tin. Các sản phẩm và dịch vụ của ngành này đã trở thành một phần không thể thiếu trong cuộc sống hiện đại, từ điện thoại thông minh, máy tính cá nhân cho đến các ứng dụng trực tuyến.

Trong thời đại số hóa, ngành công nghệ thông tin ngày càng phát triển mạnh mẽ và tạo ra nhiều cơ hội việc làm cho các lập trình viên. Các “ông lớn” công nghệ như Apple, Google, Amazon, Facebook và Microsoft cũng là những nhà tuyển dụng lớn trong ngành này. Tại Việt Nam, nhu cầu tuyển dụng lập trình viên CNTT luôn ở mức cao, điều này thúc đẩy nhiều bạn trẻ muốn học hỏi và làm việc trong ngành CNTT đầy tiềm năng này.

Có thể thấy, CNTT là một bức tranh tổng thể vô cùng to lớn, mỗi nhánh trong nó đều ẩn chứa nhiều điều thú vị, đòi hỏi bạn phải đào sâu nghiên cứu. Vậy nên, việc hiểu rõ các nhóm ngành công nghệ thông tin là bước đầu tiên giúp bạn không “lạc lối” trên con đường tìm kiếm và khám phá thế giới công nghệ phía trước.

Khoa học máy tính (Computer Science)

Computer Science

Khoa học máy tính (Computer Science) là chuyên ngành tập trung vào nghiên cứu các thuật toán, lý thuyết chuyên môn cũng như ứng dụng của tính toán vào hệ thống máy tính. Các chuyên gia Khoa học máy tính sử dụng ngôn ngữ lập trình và công cụ tính toán để thiết kế và phát triển các hệ thống thông tin, phân tích dữ liệu và xử lý thông tin.

Ngành khoa học máy tính là một lĩnh vực đang phát triển rất nhanh với nhiều cơ hội việc làm và tiềm năng phát triển cao trong tương lai. Sau khi tốt nghiệp ngành Khoa học Máy tính, sinh viên có thể làm việc ở nhiều vị trí khác nhau như lập trình viên, cán bộ kỹ thuật, quản lý hoặc điều hành trong lĩnh vực công nghệ thông tin, kiểm thử phần mềm, chuyên viên IT, quản trị và giám sát an ninh mạng, phát triển và vận hành mạng máy tính nội bộ. Sinh viên chọn chuyên ngành này có thể chọn học tiếp các chương trình thạc sĩ và tiến sĩ để nghiên cứu chuyên sâu về khoa học máy tính và trở thành giảng viên CNTT ở các trường đại học lớn.

Mức lương của kỹ sư Khoa học Máy tính tại Việt Nam khi mới ra trường vào khoảng 10-20 triệu tùy vào yêu cầu công việc của vị trí tuyển dụng.

Kỹ Thuật Phần Mềm (Software Engineering)

Kỹ Thuật Phần Mềm (Software Engineering) tập trung vào việc phát triển, thiết kế, triển khai và bảo trì phần mềm. Các chuyên gia công nghệ phần mềm thường là những nhà phát triển phần mềm chuyên nghiệp, được đào tạo để có khả năng tạo ra các giải pháp phần mềm đáp ứng nhu cầu của khách hàng và đáp ứng các tiêu chuẩn chất lượng.

Hai công việc phổ biến trong ngành kỹ thuật phần mềm là phát triển ứng dụng và phát triển hệ thống.

Các lĩnh vực con của Công nghệ phần mềm bao gồm: phát triển ứng dụng di động (App Developer), phát triển trò chơi (Game Developer), phát triển phần mềm nhúng, phát triển phần mềm mã nguồn mở và nhiều lĩnh vực khác. Có thể thấy, công nghệ phần mềm là một lĩnh vực đầy thách thức, đang phát triển rất nhanh với nhiều cơ hội việc làm và tiềm năng phát triển cao trong tương lai.

Nghề kỹ sư phần mềm có thể vừa thú vị vừa đầy thử thách với cơ hội làm việc trong hầu hết mọi ngành, bao gồm các doanh nghiệp lớn và nhỏ, cơ quan chính phủ, tổ chức phi lợi nhuận, cơ sở chăm sóc sức khỏe, v.v. Và khi công nghệ tiếp tục phát triển, nhu cầu về các nhà phát triển phần mềm cũng tiếp tục tăng. Nhiều công ty cũng đang chuyển sang tuyển dụng các kỹ sư phần mềm làm việc tại nhà, cho phép tăng tính linh hoạt và nhiều cơ hội hơn để bước vào lĩnh vực này.

Nhờ nhu cầu mạnh mẽ của ngành và chuyên môn kỹ thuật của riêng họ, các kỹ sư phần mềm lành nghề được trả lương xứng đáng với giá trị họ mang lại. Mức lương trung bình của người mới vào nghề đối với các nhà phát triển phần mềm khá cao từ 12 – 17 triệu đồng.

Mạng máy tính và truyền thông dữ liệu

Mạng máy tính và truyền thông dữ liệu

Ngành mạng máy tính và truyền thông dữ liệu (Communications and Computer Networks) được nhiều doanh nghiệp ăn đón bởi sự phát triển thần tốc của internet, cùng xu thế Internet of Things (IoT) kết nối mọi thứ với nhau bằng internet. Ngành này sẽ tập trung vào việc thiết kế, triển khai, vận hành và bảo trì các mạng máy tính, hệ thống truyền thông dữ liệu và các ứng dụng liên quan.

Một số môn học đặc trưng của ngành Mạng máy tính:

  • Giao thức mạng: TCP/IP, HTTP, FTP.
  • Thiết kế mạng: LAN, WAN, MAN.
  • Bảo mật mạng: Tường lửa, VPN, mã hóa.
  • Quản lý mạng: Cấu hình router, switch, quản trị hệ thống mạng.

Những công việc phổ biến trong lĩnh vực này bao gồm: chuyên viên quản trị mạng, kỹ thuật viên mạng, chuyên gia bảo mật mạng và nhiều công việc khác.

Kỹ thuật máy tính

Kỹ thuật máy tính (Computer Engineering) tập trung vào việc phát triển các hệ thống máy tính, thiết kế phần cứng máy tính dựa trên những nguyên lý cũng như phương pháp dùng trong thiết kế các hệ thống phần cứng đó. Đây là một sự lựa chọn cho bạn khi băn khoăn không biết nên chọn ngành nào trong các nhóm ngành công nghệ thông tin.

Ngành kỹ thuật máy tính là một lĩnh vực đầy thách thức và phát triển rất nhanh với nhiều cơ hội việc làm, tiềm năng phát triển cao trong tương lai. Các công việc phổ biến trong lĩnh vực này bao gồm: kỹ sư phần cứng máy tính; kỹ sư lập trình các loại chip cho máy tính, đồ điện tử, thiết bị công nghệ; kỹ sư vi điều khiển và nhiều công việc khác.

Tham khảo việc làm Security Engineer Developer HOT trên TopDev

An ninh mạng

Ngành An ninh mạng là một lĩnh vực quan trọng và ngày càng phát triển trong bối cảnh các mối đe dọa bảo mật và tấn công mạng ngày càng gia tăng. Đây là ngành học tập trung vào việc bảo vệ hệ thống thông tin và dữ liệu khỏi các cuộc tấn công, xâm nhập trái phép, và các nguy cơ khác. Sinh viên theo học ngành An ninh mạng sẽ được trang bị kiến thức và kỹ năng cần thiết để bảo vệ các hệ thống công nghệ thông tin, phát hiện và đối phó với các mối đe dọa bảo mật.

Để làm được ngành này bạn cần có kiến thức về quản trị mạng, an ninh mạng, dịch vụ mạng, lưu trữ cơ sở dữ liệu, hệ thống backup thông tin,…

Nội dung học của ngành này cơ bản bao gồm:

  1. Cơ Bản Về An Ninh Mạng: Hiểu về các loại tấn công mạng và cách phòng chống.
  2. Mã Hóa và Bảo Mật Thông Tin: Kỹ thuật mã hóa và giải mã dữ liệu.
  3. Hệ Thống và Mạng Máy Tính: Bảo mật mạng LAN, WAN, và mạng không dây.
  4. Phân Tích và Quản Lý Rủi Ro: Đánh giá và quản lý rủi ro bảo mật.
  5. Phát Hiện và Phản Ứng Với Tấn Công Mạng: Công nghệ phát hiện xâm nhập.
  6. Pháp Y Kỹ Thuật Số (Digital Forensics): Thu thập và phân tích bằng chứng số.

Với sự phát triển của các công nghệ mới như IoT (Internet of Things), Cloud Computing và AI (Artificial Intelligence), lĩnh vực kỹ thuật mạng đang ngày càng trở nên quan trọng hơn đối với các tổ chức và doanh nghiệp. Các chuyên gia kỹ thuật mạng sẽ tiếp tục đóng một vai trò quan trọng trong việc đảm bảo tính an toàn và hiệu quả của các hệ thống mạng.

Hệ thống quản lý thông tin

Hệ thống quản lý thông tin (MIS – Management Information Systems) là ngành kết hợp giữa phần cứng, phần mềm và mạng truyền thông để thu thập, tổng hợp, khai thác và phân phối dữ liệu thông tin trong các tổ chức, doanh nghiệp. Các chuyên gia trong lĩnh vực này cần có kiến thức về cơ sở dữ liệu, hệ quản trị cơ sở dữ liệu, hệ thống thông tin, phân tích dữ liệu và các kỹ thuật bảo mật thông tin.

Hệ thống quản lý thông tin là một lĩnh vực rất quan trọng trong các tổ chức hiện đại. Các chuyên gia trong lĩnh vực này có thể làm việc trong các công ty công nghệ, các tổ chức kinh doanh hoặc chính phủ. Những công việc phổ biến trong lĩnh vực này bao gồm: Nhân viên quản trị cơ sở dữ liệu, chuyên viên quản lý thông tin, chuyên viên phân tích dữ liệu và nhiều công việc khác.

Khoa học dữ liệu

Ngành Khoa học dữ liệu (Data Science) kết hợp các phương pháp, thuật toán và hệ thống để trích xuất tri thức từ dữ liệu. Đây là ngành liên ngành, bao gồm toán học, thống kê, khoa học máy tính và ứng dụng chuyên môn.

Sinh viên sẽ học về toán học và thống kê, khai phá dữ liệu, học máy (Machine Learning), xử lý dữ liệu lớn, trực quan hóa dữ liệu và phân tích dữ liệu. Các ngôn ngữ lập trình phổ biến như Python và R cùng với các công cụ phân tích như Jupyter Notebook và RStudio cũng sẽ được giảng dạy. Ứng dụng của khoa học dữ liệu bao gồm các lĩnh vực như y tế, tài chính, marketing và sản xuất.

Cơ hội nghề nghiệp bao gồm: Nhà khoa học dữ liệu (Data Scientist) phân tích và trích xuất thông tin từ dữ liệu lớn; Chuyên viên phân tích dữ liệu (Data Analyst) tạo báo cáo và trực quan hóa dữ liệu; Kỹ sư dữ liệu (Data Engineer) xây dựng và duy trì hệ thống dữ liệu; Chuyên gia học máy (Machine Learning Engineer) phát triển mô hình học máy; Chuyên viên trực quan hóa dữ liệu (Data Visualization Specialist) tạo biểu đồ và báo cáo; Chuyên viên BI (Business Intelligence Specialist) phân tích và xây dựng báo cáo kinh doanh.

Ngành Khoa học dữ liệu đang phát triển mạnh mẽ nhờ sự bùng nổ của dữ liệu, mở ra nhiều cơ hội nghề nghiệp hấp dẫn và đa dạng.

Big Data và Machine Learning

Big Data và Machine Learning

Big DataMachine Learning nằm trong các nhóm ngành công nghệ thông tin được quan tâm nhiều nhất hiện nay. Big Data giúp doanh nghiệp tiếp cận dữ liệu và khai thác dữ liệu dễ dàng, hiệu quả hơn. Bên cạnh đó, Machine Learning sẽ ứng dụng trí tuệ nhân tạo, học từ dữ liệu để giải quyết nhiều vấn đề khác nhau.

Big Data và Machine Learning là một ngành khá mới tại Việt Nam, do đó nhân lực ngành này khá khan hiếm và mức lương luôn nằm trên top đầu. Vì vậy, để có thể giỏi trong ngành này bạn cần phải có kiến thức về lý thuyết dữ liệu, lập trình, kỹ thuật trí tuệ nhân tạo và phân tích dữ liệu. Các công việc phổ biến trong lĩnh vực Big Data và Machine Learning bao gồm: kỹ sư dữ liệu; chuyên viên phát triển hệ thống tự động hóa và robot; chuyên viên trí tuệ nhân tạo; chuyên gia nghiên cứu AI chuyên sâu;…

  Hiểu sâu về trí tuệ nhân tạo & Machine Learning tại Apple

Trí tuệ nhân tạo (Artificial Intelligence)

Ngành trí tuệ nhân tạo (Artificial Intelligence – AI) là một lĩnh vực tập trung vào việc phát triển các hệ thống và chương trình máy tính có khả năng tự động học và thực hiện các nhiệm vụ mà trước đó chỉ có thể được thực hiện bởi con người. Mục tiêu của trí tuệ nhân tạo là tạo ra các máy tính có khả năng hiểu, học, tư duy và thực hiện các công việc thông minh một cách tự động.

Ngành trí tuệ nhân tạo đòi hỏi chuyên môn cao, bao gồm kiến thức đa dạng từ nhiều lĩnh vực khác nhau như tâm lý học, khoa học máy tính và kỹ thuật. Ngày nay, đã có nhiều ứng dụng phổ biến của trí tuệ nhân tạo, ví dụ như ô tô tự động lái, phần mềm dịch tự động, trợ lý ảo trên điện thoại và đối thủ ảo trong trò chơi điện thoại.

Ngành Điện Toán Đám Mây

Ngành Điện toán đám mây tập trung vào cung cấp các dịch vụ tính toán qua internet, bao gồm lưu trữ, xử lý và quản lý dữ liệu. Sinh viên sẽ học cách thiết kế, triển khai và quản lý các hệ thống đám mây.

Sinh viên sẽ học về các mô hình dịch vụ đám mây như IaaS, PaaS, SaaS, các mô hình triển khai Public Cloud, Private Cloud, Hybrid Cloud. Họ cũng sẽ tìm hiểu về quản lý dịch vụ đám mây trên AWS, Azure, Google Cloud, bảo mật đám mây, mã hóa dữ liệu và quản lý quyền truy cập. Ngoài ra, sinh viên sẽ học phát triển ứng dụng trên đám mây, di chuyển dữ liệu lên đám mây và tối ưu hóa hiệu suất hệ thống.

Cơ hội nghề nghiệp bao gồm: Kỹ sư đám mây (Cloud Engineer) triển khai và quản lý hệ thống đám mây; Kiến trúc sư đám mây (Cloud Architect) thiết kế kiến trúc đám mây; Quản trị viên đám mây (Cloud Administrator) quản lý tài nguyên đám mây; Chuyên gia bảo mật đám mây (Cloud Security Specialist) đánh giá và cải thiện bảo mật; Phát triển viên ứng dụng đám mây (Cloud Application Developer) phát triển ứng dụng trên đám mây.

Ngành Điện toán đám mây cung cấp nhiều cơ hội nghề nghiệp hấp dẫn, đáp ứng nhu cầu ngày càng tăng của các doanh nghiệp về dịch vụ đám mây để cải thiện hiệu quả hoạt động và tiết kiệm chi phí.

Internet Vạn Vật (IoT)

Ngành Internet Vạn Vật (IoT) là một ngành mới nhưng tiềm năng phát triển rất lớn, tập trung vào việc kết nối các thiết bị và hệ thống với internet, cho phép chúng thu thập và trao đổi dữ liệu. Sinh viên sẽ học cách thiết kế, phát triển và triển khai các giải pháp IoT để cải thiện hiệu suất và tiện ích trong nhiều lĩnh vực khác nhau.

Sinh viên sẽ học về các nguyên lý cơ bản của IoT, bao gồm kiến trúc hệ thống IoT, các giao thức truyền thông và tiêu chuẩn kết nối. Họ cũng sẽ tìm hiểu về cảm biến và thiết bị IoT, cách thu thập và xử lý dữ liệu từ các thiết bị này. Ngoài ra, sinh viên sẽ học về an ninh và bảo mật trong IoT, đảm bảo rằng các hệ thống kết nối được bảo vệ khỏi các mối đe dọa tiềm ẩn.

Kỹ năng lập trình và phát triển phần mềm cũng là một phần quan trọng của chương trình học, với các ngôn ngữ lập trình phổ biến như Python, C++ và Java được sử dụng để phát triển ứng dụng IoT. Sinh viên cũng sẽ học cách tích hợp các hệ thống IoT với các dịch vụ đám mây để lưu trữ và phân tích dữ liệu.

Triển vọng phát triển của ngành CNTT trong tương lai

Ngành công nghệ thông tin đang phát triển với tốc độ nhanh chóng và đóng vai trò quan trọng trong nhiều lĩnh vực khác nhau, bao gồm cả kinh tế, y tế, giáo dục và giải trí. Trong tương lai, ngành công nghệ thông tin sẽ tiếp tục phát triển và mở rộng với sự gia tăng của các ứng dụng của AI, IoT, Big Data và Cloud Computing. 

Tại Việt Nam, chính phủ đã ban hành nhiều chính sách, đặt ra mục tiêu đến năm 2030 nền kinh tế kỹ thuật số sẽ chiếm 30% GDP và tỷ lệ nền kinh tế kỹ thuật số trong mỗi ngành hoặc lĩnh vực sẽ đạt ít nhất 20% (theo chủ tịch Visana Nguyễn Văn Khoa). Điều này cho thấy tiềm năng phát triển của ngành CNTT trong tương lai là vô cùng lớn.

Tổng kết

Trên đây là tất cả những chia sẻ của TopDev về các nhóm ngành công nghệ thông tin và triển vọng của ngành trong tương lai. Tham khảo thêm báo cáo thị trường IT Việt Nam 2022 để nắm bắt được xu hướng phát triển ngành CNTT, từ đó giúp bạn đưa ra quyết định chọn học ngành nào tốt hơn. Hy vọng rằng, với những kiến thức trên các bạn sẽ có lựa chọn đúng đắn cho mình trong việc lựa chọn chuyên ngành. Chúc bạn thành công trên con đường sự nghiệp của mình!

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

Xem thêm Jobs IT for Developer hấp dẫn trên TopDev

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Bài viết được sự cho phép của tác giả Lê Hồng Kỳ

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate sẽ bao gồm 4 xử lý cơ bản đó là thêm (C), lấy dữ liệu (R), cập nhật dữ liệu (U) và xóa dữ liệu (D).

Trong những bài hướng dẫn trước, chúng tôi đã trình bày cách tạo một Web application với Spring MVC nhưng chưa có phần xử lý database. Và để xử lý database, chúng ta phải cần đến Hibernate.

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate – Các bước thực hiện

1/ Tạo một Maven Web Application Project

Các bạn có thể tạo mới một Project. Trong bài hướng dẫn này, chúng tôi sử dụng lại project của bài Hướng dẫn validation trong Spring MVC 5

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

2/ Mở file pom.xml và thêm dependency

<!-- Spring ORM -->
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.1.0.RELEASE</version>
</dependency>
<!-- Hibernate Core -->
<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.17.Final</version>
</dependency>
<!-- MySQL Server -->
<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
</dependency>
Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO). Bài viết này sẽ hướng dẫn bạn cách cài đặt và cách sử dụng Transfer Object. >>> https://topdev.vn/blog/huong-dan-java-design-pattern-transfer-object/?utm_source=facebook&utm_medium=post&utm_campaign=topdev&utm_term=luan&utm_content=b_huong-dan-java-design-pattern-transfer-object

  Hibernate Batch Processing là gì? Batch Processing trong Hibernate

  Các lưu ý về strategy của GeneratedValue khi sử dụng hibernate

3/ Tạo một file tên AppContext để cấu hình Spring và Hibernate sử dụng Java code

Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO). Bài viết này sẽ hướng dẫn bạn cách cài đặt và cách sử dụng Transfer Object. >>> https://topdev.vn/blog/huong-dan-java-design-pattern-transfer-object/?utm_source=facebook&utm_medium=post&utm_campaign=topdev&utm_term=luan&utm_content=b_huong-dan-java-design-pattern-transfer-object

Nhập code cho AppContext

package vn.giasutinhoc.spring5mvc.config;

import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.core.env.Environment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@PropertySource("classpath:database.properties")
@EnableTransactionManagement
@ComponentScan(basePackages = { "vn.giasutinhoc.spring5mvc" })
public class AppContext {

	@Autowired
	private Environment environment;

	@Bean
	public LocalSessionFactoryBean sessionFactory() {
		LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
		sessionFactory.setDataSource(dataSource());
		sessionFactory.setPackagesToScan(new String[] { "vn.giasutinhoc.spring5mvc.model" });
		sessionFactory.setHibernateProperties(hibernateProperties());
		return sessionFactory;
	}

	@Bean
	public DataSource dataSource() {
		DriverManagerDataSource dataSource = new DriverManagerDataSource();
		dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
		dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
		dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
		dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
		return dataSource;
	}

	private Properties hibernateProperties() {
		Properties properties = new Properties();
		properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
		properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
		properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
		properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto"));
		return properties;
	}

	@Bean
	public HibernateTransactionManager getTransactionManager() {
		HibernateTransactionManager transactionManager = new HibernateTransactionManager();
		transactionManager.setSessionFactory(sessionFactory().getObject());
		return transactionManager;
	}

}

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

4/ Tạo file database.properties bên trong thư mục resources để cấu hình kết nối đến database

Chọn File -> chọn New -> chọn File

Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO). Bài viết này sẽ hướng dẫn bạn cách cài đặt và cách sử dụng Transfer Object. >>> https://topdev.vn/blog/huong-dan-java-design-pattern-transfer-object/?utm_source=facebook&utm_medium=post&utm_campaign=topdev&utm_term=luan&utm_content=b_huong-dan-java-design-pattern-transfer-object

Nhập database.properties tại File name -> chọn Finish

Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO). Bài viết này sẽ hướng dẫn bạn cách cài đặt và cách sử dụng Transfer Object. >>> https://topdev.vn/blog/huong-dan-java-design-pattern-transfer-object/?utm_source=facebook&utm_medium=post&utm_campaign=topdev&utm_term=luan&utm_content=b_huong-dan-java-design-pattern-transfer-object

Nhập code cho database.properties

jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/demoDB?useSSL=false
jdbc.username = root
jdbc.password = root
hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.show_sql = true
hibernate.format_sql = true
hibernate.hbm2ddl.auto = update
Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO). Bài viết này sẽ hướng dẫn bạn cách cài đặt và cách sử dụng Transfer Object. >>> https://topdev.vn/blog/huong-dan-java-design-pattern-transfer-object/?utm_source=facebook&utm_medium=post&utm_campaign=topdev&utm_term=luan&utm_content=b_huong-dan-java-design-pattern-transfer-object

5/ Tạo một entity tên Customer

Mở Customer.java trong package vn.giasutinhoc.spring5mvc.model và thay đổi code

package vn.giasutinhoc.spring5mvc.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;

@Entity
@Table(name = "customer")
public class Customer {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private int id;

	@Column(name = "first_name")
	private String firstName;

	@Column(name = "last_name")
	@NotNull(message = "Không được bỏ trống")
	@Size(min = 1, message = "không được bỏ trống")
	private String lastName;

	@Column(name = "free_passes")
	@NotNull(message = "không được bỏ trống")
	@Min(value = 0, message = "phải lớn hơn hoặc bằng 0")
	@Max(value = 10, message = "phải nhỏ hơn hoặc bằng 10")
	private Integer freePasses;

	@Column(name = "postal_code")
	@Pattern(regexp = "^[a-zA-Z0-9]{5}", message = "5 ký tự hoặc số")
	private String postalCode;

	@Column(name = "email")
	@NotNull(message = "không được bỏ trống")
	@Email(message = "Không đúng định dạng email! Vui lòng nhập lại email")
	private String email;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public Integer getFreePasses() {
		return freePasses;
	}

	public void setFreePasses(Integer freePasses) {
		this.freePasses = freePasses;
	}

	public String getPostalCode() {
		return postalCode;
	}

	public void setPostalCode(String postalCode) {
		this.postalCode = postalCode;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}

Các bạn chú ý những chỗ chúng tôi tô màu vàng và đóng khung đỏ

Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO). Bài viết này sẽ hướng dẫn bạn cách cài đặt và cách sử dụng Transfer Object. >>> https://topdev.vn/blog/huong-dan-java-design-pattern-transfer-object/?utm_source=facebook&utm_medium=post&utm_campaign=topdev&utm_term=luan&utm_content=b_huong-dan-java-design-pattern-transfer-object

6/ Tạo một class tên CustomerDAO

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Nhập code cho CustomerService

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

7/ Tạo một class tên CustomerService

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Nhập code cho CustomerService

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

8/ Mở CustomerController.java và thêm code (phần chúng tôi đóng khung đỏ)

9/ Mở customer-form.jsp và thay đổi code (những chỗ chúng tôi tô màu vàng như trong hình)

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

10/ Tạo một view tên list-customers.jsp bên trong thư mục views

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Nhập code cho list-customers.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Danh sách khách hàng</title>
<link href="<c:url value="/resources/css/bootstrap.min.css" />"
	rel="stylesheet">
<script src="<c:url value="/resources/js/jquery-1.11.1.min.js" />"></script>
<script src="<c:url value="/resources/js/bootstrap.min.js" />"></script>
<%@ page isELIgnored="false"%>
</head>
<body>
	<div class="container">
		<div class="col-md-12">
			<h2>CRM - Customer Relationship Manager</h2>
			<hr />

			<input type="button" value="Thêm mới"
				onclick="window.location.href='showForm'; return false;"
				class="btn btn-primary" /> <br /> <br />
			<div class="panel panel-info">
				<div class="panel-heading">
					<div class="panel-title">Danh sách khách hàng</div>
				</div>
				<div class="panel-body">
					<div class="table-responsive">
						<table class="table table-striped table-bordered">
							<tr>
								<th>First Name</th>
								<th>Last Name</th>
								<th>Free Passes</th>
								<th>Postal Code</th>
								<th>Email</th>
								<th>Action</th>
							</tr>

							<!-- loop over and print our customers -->
							<c:forEach var="tempCustomer" items="${customers}">

								<!-- construct an "update" link with customer id -->
								<c:url var="updateLink" value="/customer/updateForm">
									<c:param name="customerId" value="${tempCustomer.id}" />
								</c:url>

								<!-- construct an "delete" link with customer id -->
								<c:url var="deleteLink" value="/customer/delete">
									<c:param name="customerId" value="${tempCustomer.id}" />
								</c:url>

								<tr>
									<td>${tempCustomer.firstName}</td>
									<td>${tempCustomer.lastName}</td>
									<td>${tempCustomer.freePasses}</td>
									<td>${tempCustomer.postalCode}</td>
									<td>${tempCustomer.email}</td>

									<td>
										<!-- display the update link --> <a href="${updateLink}">Cập
											nhật</a> | <a href="${deleteLink}"
										onclick="if (!(confirm('Bạn muốn xóa thông tin khách hàng này?'))) return false">Xóa</a>
									</td>

								</tr>

							</c:forEach>

						</table>
					</div>
				</div>
			</div>
		</div>

	</div>
</body>
</html>

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate – Build, Deploy và Run

1/ Tạo cơ sở dữ liệu tên demoDb

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Database sau khi tạo

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

2/ Về cách build, deploy và run các bạn tham khảo bài Hướng dẫn tạo project sử dụng Spring MVC 5 với eclipse

3/ Kết quả khi chạy http://localhost:8080/Spring5MVCProject/customer/list

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Chọn Thêm mới

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Nhập đầy đủ thông tin

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Chọn Đăng ký

Hướng dẫn xử lý database trong Spring MVC 5 với Hibernate

Học lập trình cần học các kiến thức cơ bản nào?

Mới học lập trình thì nên học những gì?

Lập trình viên cần học những gì? Làm thế nào để trở thành một lập trình viên giỏi? Đây là câu hỏi mà những người bắt đầu học lập trình rất quan tâm. Tuy nhiên, đưa ra câu trả lời cho những câu hỏi này lại không hề đơn giản. Lập trình là một lĩnh vực rộng lớn, luôn thay đổi và phát triển liên tục, điều này khiến cho nhiều người mới bắt đầu học lập trình rất mông lung khi bước chân vào thế giới của công nghệ thông tin. Nếu bạn đang gặp phải vấn đề này và chưa biết bắt đầu từ đâu, thì bài viết này sẽ giúp cho bạn.

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

học lập trình

Kiến thức về lập trình, chuyên môn kỹ thuật

Công nghệ thông tin là một lĩnh vực rất đa dạng và phức tạp, tuy nhiên, để trở thành một chuyên gia trong ngành này, bạn cần có kiến thức cơ bản về một số khái niệm và kỹ thuật lập trình quan trọng.

Do ngành lập trình rất lớn nên bạn chỉ cần chọn một mảng nhất định và nghiên cứu sâu về nó. Dưới đây là các mảng kiến thức lập trình cơ bản bạn có thể lựa chọn để học:

Mảng phát triển web

Mảng phát triển web là một trong những lĩnh vực được quan tâm và phát triển mạnh mẽ trong ngành công nghệ thông tin hiện nay. Nếu chọn làm web thì bạn khỏi lo thiếu việc làm vì công ty, doanh nghiệp nào cũng cần web. Khi học phát triển web bạn cần có kiến thức về các ngôn ngữ lập trình như JavaScript, Python, PHP, HTML, CSS,…

Thêm nữa, khi làm lập trình web bạn sẽ chọn theo 3 hướng: Frontend, Backend hoặc Fullstack; muốn có giao diện web đẹp và chuyên nghiệp thì bạn sẽ học thêm về tư duy thiết kế, WebPack. Ngoài ra, để trở thành một chuyên gia phát triển web, bạn cần nắm vững các xu hướng và thay đổi mới trong ngành, cập nhật liên tục về các công nghệ mới và các tiêu chuẩn quy định mới trong lĩnh vực phát triển web.

  Những cái “khó” khi mới học lập trình

Mảng Desktop App

Mảng Desktop App là lĩnh vực phát triển phần mềm trên máy tính để bàn, đây là một trong những lĩnh vực quan trọng của ngành công nghệ thông tin. Để phát triển Desktop App bạn cần nắm vững một số ngôn ngữ lập trình như C++, C#, Java, Python,… Bên cạnh đó, bạn cần có kiến thức về các hệ điều hành như Windows, MacOS, Linux.

Mảng Mobile

học lập trình

Mảng Mobile là lĩnh vực phát triển ứng dụng trên các thiết bị di động như smartphone, tablet, smartwatch. Mảng này gần đây khá hot vì số lượng các thiết bị di động ngày càng nhiều, nhu cầu người dùng gia tăng. Nếu theo Mobile bạn sẽ học các ngôn ngữ lập trình như Java, Kotlin, Swift hoặc Objective-C. Tương tự như mảng Desktop, bạn cần có kiến thức về các hệ điều hành như Android, iOS, watchOS để đảm bảo ứng dựng hoạt động hiệu quả trên các nền tảng.

Việc làm IT Fresher dành cho bạn

Mảng Embedded (Lập trình nhúng)

Mảng Embedded là một trong những lĩnh vực lập trình được sử dụng để phát triển các hệ thống nhúng, các hệ thống được tích hợp sẵn trong những thiết bị điện tử như điện thoại, máy tính bảng, xe hơi, đồ gia dụng thông minh, thiết bị y tế, và nhiều thiết bị khác.

Mảng này yêu cầu trình độ chuyên môn khá cao nhưng cũng rất thú vị. Bạn có thể học C/C++, Python hay Assembly để làm mảng này, ngoài ra bạn cũng phải hiểu về kiến trúc phần cứng như vi xử lý, các loại cảm biến, các thiết bị ngoại vi,…

Mảng Big Data

Big Data là một trong những mảng nổi bật và phát triển nhất hiện nay trong ngành Công nghệ thông tin. Với số lượng dữ liệu lớn và phức tạp ngày càng tăng, nhu cầu sử dụng và phân tích dữ liệu để đưa ra quyết định kinh doanh chính xác và nhanh chóng cũng ngày càng cao. Do đó, ngành Big Data đang là một trong những mảng có nhu cầu về nhân lực rất lớn.

Học lập trình mảng big data

Để trở thành một chuyên gia Big Data, bạn cần có kỹ năng phân tích dữ liệu và trực quan hoá dữ liệu để đưa ra những thông tin quan trọng từ dữ liệu và trình bày chúng một cách dễ hiểu cho người khác. Ngoài ra, kinh nghiệm làm việc với các công cụ và nền tảng Big Data cũng là yếu tố quan trọng để giúp bạn nhanh chóng hiểu và thích nghi với các dự án Big Data khác nhau.

Kỹ năng mềm

Ngoài các kỹ năng kỹ thuật, lập trình viên còn cần phải có các kỹ năng mềm để có thể thành công trong ngành công nghệ thông tin. Dưới đây là một số kỹ năng mềm cần thiết giúp hỗ trợ công việc bạn tốt hơn:

  • Kỹ năng giao tiếp: Lập trình viên cần phải có kỹ năng giao tiếp tốt để có thể làm việc cùng đồng nghiệp, giải thích các giải pháp kỹ thuật cho những người không phải là lập trình viên.
  • Kỹ năng giải quyết vấn đề: Viết code cũng chỉ là công cụ giúp giải quyết những vấn đề của khách hàng, vậy nên lập trình viên cần phải có khả năng xác định và phân tích các vấn đề, tìm kiếm các giải pháp và áp dụng chúng vào bài toán.
  • Kỹ năng tư duy logic: Kỹ năng này giúp lập trình viên xây dựng các thuật toán và giải pháp cho các vấn đề phức tạp. Nó giúp bạn có khả năng suy nghĩ logic và đưa ra quyết định đúng đắn.
  • Kỹ năng tự học: Với sự phát triển không ngừng của công nghệ, lập trình viên cần phải có khả năng tự học để cập nhật kiến thức mới và đáp ứng nhu cầu của khách hàng. Kỹ năng tự học giúp bạn có khả năng tìm kiếm thông tin, học hỏi từ các nguồn khác nhau và tự phát triển bản thân.
  • Kỹ năng tiếng Anh: Vì với sự phát triển của công nghệ, việc tiếp cận và áp dụng các công nghệ mới yêu cầu phải có khả năng đọc hiểu tiếng Anh. Việc biết tiếng Anh sẽ giúp bạn tra cứu thông tin, tài liệu nước ngoài dễ dàng, giải quyết các vấn đề nhanh chóng.

>> Lời khuyên từ người có kinh nghiệm: Học lập trình nên chủ động tự học là chính

Một vài kinh nghiệm cho người mới học lập trình

kinh nghiệm cho người mới học lập trình

Nếu bạn mới bắt đầu học lập trình, đây là một số kinh nghiệm hữu ích để giúp bạn bắt đầu và tiến bộ trong hành trình của mình:

  • Bắt đầu từ những kiến thức cơ bản: Hãy bắt đầu học những kiến thức cơ bản nhất của lập trình. Học về các khái niệm như biến, hàm, câu lệnh điều kiện và vòng lặp. Nắm chắc các kiến thức cơ bản sẽ giúp bạn dễ dàng tiếp cận với những khái niệm phức tạp hơn.
  • Học từ nhiều nguồn khác nhau: Không chỉ học từ một nguồn, hãy tìm kiếm và học từ nhiều nguồn khác nhau để có được cái nhìn tổng quan và tránh bị giới hạn bởi một quan điểm duy nhất.
  • Thực hành và làm bài tập: Không chỉ đọc lý thuyết mà còn cần thực hành để ứng dụng được kiến thức. Hãy tìm kiếm các bài tập và thực hành để cải thiện kỹ năng lập trình của bạn.
  • Học từ các dự án thực tế: Tham gia vào các dự án thực tế hoặc làm các bài tập thực tế để học cách áp dụng kiến thức của mình vào các dự án thực tế.
  • Xây dựng một mạng lưới liên kết: Kết nối với cộng đồng lập trình viên, hỏi đáp, chia sẻ và học hỏi từ các chuyên gia lập trình viên.
  • Không sợ thất bại: Hãy luôn đối mặt với những thất bại và học hỏi từ chúng. Không có ai là hoàn hảo, thất bại chỉ là bước đệm để tiến bộ hơn.
  • Kiên trì và kiên nhẫn: Lập trình là một quá trình dài và đòi hỏi sự kiên trì và kiên nhẫn. Hãy đặt mục tiêu, giữ tinh thần và tiếp tục học tập, cải thiện mỗi ngày để trở thành một lập trình viên giỏi.

>> Xem thêm: Phương pháp tự học lập trình hiệu quả bạn nên biết

Tổng kết lại, để trở thành một lập trình viên giỏi không chỉ đòi hỏi kiến thức chuyên môn mà còn cần phải có kỹ năng mềm. Bằng việc đầu tư vào những kỹ năng này, bạn sẽ có cơ hội tiến xa hơn trong sự nghiệp lập trình viên và đạt được thành công trong lĩnh vực công nghệ thông tin. 

Hy vọng rằng bài viết này đã giúp bạn tìm được đáp án cho câu hỏi lập trình viên cần học những gì? Hãy bắt đầu tìm hiểu, học hỏi và cải thiện những kỹ năng này để trở thành một lập trình viên chuyên nghiệp và thành công trong sự nghiệp của mình. Chúc bạn thành công!

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

Top 5 câu hỏi phỏng vấn C++ hay và khó

Top 5 câu hỏi phỏng vấn C++ hay và khó

Quay lại với chuỗi bài câu hỏi phỏng vấn, bài viết này liệt kê 5 câu hỏi phỏng vấn C++. Bài viết này liệt kê 5 câu câu hỏi đi từ dễ tới khó.

Do C++ cũng giống như các ngôn ngữ lập trình đối tượng khác, nên một số câu hỏi về OOP và nguyên lý chung của ngôn ngữ sẽ không đề cập trong bài viết này để tiết kiệm thời gian cho anh em nha. Những cái đó kiểu gì trước khi phỏng vấn anh em cũng phải xem lại, mà xem là xem chung chứ không phải chỉ xem cho C++ ha.

Ok, bắt đầu thôi. Gét gô

1. Con trỏ trong C++ là gì?

Câu hỏi đầu tiên phỏng vấn C++ không thể nào mà bỏ qua được con trỏ (pointer). Anh em dân tình ai code C++ hoặc giảng dạy về C++ lúc nói với đồng nghiệp hoặc học sinh là anh code C++. Đầu tiên là ngưỡng mộ, sau đó là câu hỏi “Ủa ông còn nhớ con trỏ trong C++ hả?”.

phỏng vấn c++Hết hồn chim én liền

Vậy con trỏ trong C++ là gì?. Tại sao mọi người thường nhớ về C++ là nhớ tới con trỏ?

Pointer is a variable that stores the memory address as its value. Con trỏ là biến chỉ tới giá địa chỉ bộ nhớ có giá trị của biến.

string category = "Phỏng vấn c++"; // Biến category có kiểu dữ liệu là string 

cout << category;  // Xuất ra giá trị của biến category (Phỏng vấn c++)
cout << &category; // Xuất ra địa chỉ bộ nhớ của biến category (0x6dfed4)

Vậy con trỏ trong C++ sử dụng làm gì?

They enable programs to simulate call-by-reference as well as to create and manipulate dynamic data structures. Iterating over elements in arrays or other data structures is one of the main use of pointers. Con trỏ cho phép chương trình gọi theo kiểu tham chiếu, cũng như các thao tác tạo, thao tác tới cấu trúc dữ liệu động. Lặp lại các phần tử trong mảng hoặc các cấu trúc dữ liệu khác. Đây là một trong các cách sử dụng chính của con trỏ.

#include <bits/stdc++.h>
using namespace std;
void geeks()
{
    int var = 20;
  
    // declare pointer variable
    int* ptr;
  
    // note that data type of ptr and var must be same
    ptr = &var;
  
    // assign the address of a variable to a pointer
    cout << "Value at ptr = " << ptr << "\n";
    cout << "Value at var = " << var << "\n";
    cout << "Value at *ptr = " << *ptr << "\n";
}
// Driver program
int main() 
{ 
  geeks(); 
  return 0;
}

Như ví dụ trên đây sẽ cho ra output

Value at ptr = 0x7ffe454c08cc // Địa chỉ của biến ptr 
Value at var = 20 // Giá trị của biến var
Value at *ptr = 20 // Giá trị của biến ptr

Anh em lưu ý là & sẽ trả về địa chỉ của biến đó. Còn * sẽ trả về giá trị của biến đó được lưu ở địa chỉ cố định (located at the address).

Một số câu hỏi anh em có thể ôn luyện thêm:

  • Copy constructor trong C++ là gì?
  • Tính module (modularity) trong C++
  • Sự khác biệt giữa method override và method overloading trong C++

  So sánh giữa C++ và Golang 
  Nạp chồng toán tử trong C++

2. Sự khác biệt giữa virtual function và pure virtual function

Câu hỏi phỏng vấn C++ thứ hai liên quan tới VF (virtual function) và PVF (pure virtual function). Vẫn là các câu hỏi liên quan tới khái niệm, nhưng nếu có thể anh em nên show ra ví dụ. Như vậy vừa dễ nhớ vừa thuyết phục hơn cho người phỏng vấn.

2.1 Virtual function

Virtual function is a member function that is declared within the base class and can be redefined by the derived class. Virtual function là một hàm thành viên được khai báo trong lớp cơ sở (base class) và có thể được định nghĩa lại ở lớp dẫn xuất (devired class)

Vừa là nhắc lại vừa để cho dễ hiểu hơn anh em có thể xem lại ví dụ này

#include <iostream>  
using namespace std;  
class base  
{  
    public:  
    void show()  
    {  
        std::cout << "Base class" << std::endl;  
    }  
};  
class derived1 : public base  
{  
    public:  
    void show()  
    {  
        std::cout << "Derived class 1" << std::endl;  
    }  
};  
class derived2 : public base  
{  
    public:  
    void show()  
    {  
        std::cout << "Derived class 2" << std::endl;  
    }  
};  
int main()  
{  
    base *b;  
    derived1 d1;  
    derived2 d2;  
    b=&d1;  
    b->show();  
    b=&d2;  
    b->show();  
    return 0;  
}

derived 1 và derived 2 đều kế thừa base class, kế thừa method show(). Hai class đó cũng được khai báo 2 biến d1 và d2. Mặc dù là b chứa địa chỉ của cả b1 và b2 nhưng khi b gọi show() nó sẽ luôn gọi method show của lớp base class. Không gọi show của derived 1 và derived 2

Giải pháp lúc này ta viết function show với keywords virtual.

virtual void show()  
{  
    std::cout << "Base class" << std::endl;  
}

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

2.2 Pure Virtual Function

Pure thì có thêm chữ pure thôi mà. Đúng như ý nghĩa của tên gọi (Pure – Nguyên bản). Nguyên bản anh em hiểu kiểu như vị mộc không có thêm phụ gia gì hết.

A pure virtual function is a “do nothing” function. Here “do nothing” means that it just provides the template, and derived class implements the function. Pure virtual function là “do nothing” function. Ở đây do nothing có nghĩa là nó chỉ cung cấp mẫu, còn cần làm gì thì derived class phải tự làm.

Có hai cách để khai báo các hàm này

// Thứ nhất là return 0, thứ hai là không return gì cả
virtual void display() = 0;  
virtual void display() {}

Anh em có thể tham khảo thêm ví dụ này để hiểu về pure function

#include <iostream>  
using namespace std;  
// Abstract class  
class Shape  
{  
    public:  
    virtual float calculateArea() = 0; // pure virtual function.  
};  
class Square : public Shape  
{  
    float a;  
    public:  
    Square(float l)  
    {  
        a = l;  
    }  
    float calculateArea()  
    {  
        return a*a;  
    }  
};  
class Circle : public Shape  
{  
    float r;  
    public:  
      
    Circle(float x)  
    {  
        r = x;  
    }  
    float calculateArea()  
    {  
        return 3.14*r*r ;  
    }  
};  
class Rectangle : public Shape  
{  
    float l;  
    float b;  
    public:  
    Rectangle(float x, float y)  
    {  
       l=x;  
       b=y;  
    }  
    float calculateArea()  
    {  
        return l*b;  
    }  
};  
int main()  
{  
      
    Shape *shape;  
    Square s(3.4);  
    Rectangle r(5,6);  
    Circle c(7.8);  
    shape =&s;  
    int a1 =shape->calculateArea();  
    shape = &r;  
    int a2 = shape->calculateArea();  
    shape = &c;  
    int a3 = shape->calculateArea();  
    std::cout << "Area of the square is " <<a1<< std::endl;  
    std::cout << "Area of the rectangle is " <<a2<< std::endl;  
    std::cout << "Area of the circle is " <<a3<< std::endl;  
    return 0;  
}

Một số câu hỏi xem thêm:

  • Run time polymorphism và polymorphism khác nhau như thế nào?
  • Copy constructor trong C++ là gì?

3. Câu hỏi từ code ví dụ

Câu hỏi thứ 3 phỏng vấn C++ là câu hỏi về code. Code đây không có nghĩa là ngồi code, mà cho đoạn code và hỏi anh em về giá trị output. Tất nhiên để có kết quả đúng thì một số khái niệm anh em cần nắm rõ.

Giá trị i và j sẽ bằng bao nhiêu sau khi thực hiện đoạn code này?. Tại sao?

int i = 5;
int j = i++;

Đáp án cho câu hỏi này là i thì bằng 6, nhưng j lại chỉ bằng 5. Anh em nào lau chau trả lời cả i và j đều bằng 6 là sai.

Để giải thích cho kết quả, anh em cần xem lại kiến thức về ++ increment và — decrement trong C++. Các toán tử này khi đứng trước một biến.

Những câu như thế này nói là hỏi mẹo cũng không đúng. Vì nó là kiến thức cơ bản trong ngôn ngữ lập trình. Có gì anh em nhớ xem lại. Nếu ++ đứng trước thì giá trị đó sẽ ngay lập tức được tăng và gán vào cho j. Còn như ví dụ trên kia, khi ++ nằm phía sau biến, giá trị ban đầu của i sẽ đem gán vào cho j trước. Sau khi có gọi j thì giá trị của j mới tăng theo i, chuyển thành 6.

Một số câu hỏi có thể xem thêm:

  • Sự khác biệt giữa struct và class trong C++
  • Các kiểu data type trong C++

4. Phân bổ và giải phóng bộ nhớ trong C++ như thế nào?

Sau khi đã lướt qua OOP, con trỏ, code ví dụ các kiểu thì câu hỏi thứ 4 phỏng vấn C++ liên quan tới bộ nhớ. Phần này thường hay được hỏi để đánh giá Senior. Người phải review code kĩ, code sao tránh tràn bộ nhớ.

Ngoài ra, C++ thường xuyên được sử dụng trong mạch, trong lập trình với dữ liệu, ram giới hạn.

Câu trả lời cho phần này cũng đơn giản. Để cấp phát bộ nhớ thì như các ngôn ngữ khác, chúng ta sử dụng từ khoá new. Còn từ khoá delete sử dụng để xoá bộ nhớ được cấp phát trước đó.

int value=new int;  		//allocates memory for storing 1 integer
delete value;          		// deallocates memory taken by value

int *arr=new int[10];    	//allocates memory for storing 10 int
delete []arr;              	// deallocates memory occupied by arr.

5. Sự khác biệt giữa C và C++

Câu hỏi thứ 5, cũng là câu hỏi phỏng vấn C++ cuối cùng trong bài viết này liên quan tới sự khác nhau giữa ngôn ngữ C và C++.

Tất nhiên một số anh em có thể thành thạo nhiều hơn một ngôn ngữ lập trình (Java, Golang, Python, Nodejs). Nên so sánh sự khác nhau giữa các ngôn ngữ luôn là một câu hỏi phỏng vấn hay. Ngoài hiểu biết ngôn ngữ khác, anh em còn có thể chức tỏ mức độ hiểu biết của mình về C++0.

Sự khác biệt giữa C và C++ có bao gồm một số ý sau đây:

  • C++ hỗ trợ tham chiếu (pass by reference), trong khi C không hỗ trợ
  • Một số tính năng như functions, function overloading, inheritance, templates, và virtual functions chỉ có ở C++
  • Trong C thì exception được xử lý theo kiểu if else
  • Cái quan trọng C là ngôn ngữ lập trình thủ tục procedural programming. Trong khi C++ hỗ trợ cả lập trình thủ tục và hướng đối tượng (object-oriented programming)

Trên đây chỉ là một số khác biệt cốt lõi, những khác biệt nho nhỏ khác anh em có thể tham khảo tại đây.

6. Kiến thức thêm chuẩn bị phỏng vấn C++

Trường hợp có bỏ sót nội dung nào anh em cứ comment, tui sẽ viết tiếp phần 2. Cứ mỗi phần là 5 câu nha anh em

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

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

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

Mô hình ngôn ngữ LaMDA – Công nghệ đứng sau chatbot AI Bard của Google

Mô hình ngôn ngữ LaMDA

Cuộc chiến chatbot AI của các ông lớn hiện đang nóng hơn bao giờ hết với sự tham gia của đầy đủ các bên từ Microsoft, Google hay Facebook. Đầu tháng 2 năm nay, Google ra mắt chatbot AI của hãng đặt tên là Bard và nhanh chóng trở thành đối thủ lớn nhất của ChatGPT. Đứng sau sự “thông minh” của Bard chính là mô hình ngôn ngữ LaMDA được Google phát triển từ những năm 2020. Bài viết hôm nay chúng ta cùng nhau tìm hiểu về công nghệ này để xem khả năng của nó mạnh mẽ đến đâu nhé.

Mô hình ngôn ngữ là gì?

Mô hình ngôn ngữ hay Language Model là tập hợp các kiến thức trước đó về một ngôn ngữ nhất định, các kiến thức này có thể là các kiến thức về từ vựng, về ngữ pháp, về tần suất xuất hiện của các cụm từ,… Một mô hình ngôn ngữ có thể được xây dựng theo hướng chuyên gia hoặc hướng dữ liệu.

Mô hình ngôn ngữ lớn (Large Language Model) là các hệ thống xử lý ngôn ngữ tự nhiên (NLP) – một nhánh của nghiên cứu AI – được huấn luyện dựa trên khối lượng văn bản khổng lồ và có khả năng trả lời các câu hỏi đọc hiểu hoặc tạo văn bản mới.

LLM chứa một thuật toán học sâu (Deep Learning) có thể nhận dạng, tóm tắt, dịch, dự đoán và tạo văn bản cũng như các nội dung khác dựa trên kiến thức thu được từ những bộ dữ liệu khổng lồ. Nói cách khác, LLM chính là thứ đứng sau những siêu ứng dụng AI trò chuyện (chatbot AI) hiện nay.

  Digital Twins – xu hướng công nghệ cho ngành IoT

LaMDA là gì?

LaMDA – Language Model for Dialogue Applications là một nhóm các mô hình ngôn ngữ đàm thoại lớn do Google phát triển. Tiền thân của LaMDA được Google phát triển và giới thiệu từ năm 2020 với tên là Meena; sau đó ở hội nghị Google I/O năm 2021, LaMDA thế hệ đầu tiên được chính thức công bố. Và mới nhất vào tháng 2 năm 2023, Google công bố Bard, một chatbot AI đàm thoại phát triển dựa trên LaMDA như là một bước cạnh tranh với sự phát triển ấn tượng của ChatGPT từ OpenAI.

LaMDA là gì

LaMDA dựa trên kiến trúc Transformer giống như các mô hình ngôn ngữ khác như BERT và GPT-3, tuy nhiên do được đào tạo nên LaMDA có thể hiểu các câu hỏi và hội thoại có sắc thái về một số chủ đề khác nhau. Các chatbot thông thường chỉ xử lý các câu hỏi và cuộc hội thoại trong cùng một chủ đề; mặc dù vậy trong giao tiếp của con người hàng ngày thì việc chuyển chủ đề hay chủ đề mở mang tính phổ biến hơn; điều kiện là một vấn đề khó khăn dành cho chatbot. Theo những thông báo đến từ Google thì LaMDA đã được xây dựng để khắc phục những vấn đề này.

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

Sức mạnh của LaMDA

Transformer Neural Network

Kiến trúc mạng nơ ron biến đổi là một mô hình học sâu (Deep Learning) được thiết kế để phục vụ giải quyết nhiều bài toán trong xử lý ngôn ngữ và tiếng nói, ví dụ như bài toán dịch tự động, nhận dạng tiếng nói, chuyển văn bản thành tiếng nói,…

Trước đây, các tác vụ xử lý ngôn ngữ tự nhiên đều sử dụng kiến trúc Recurrent Neural Networks (RNNs); câu đầu vào sẽ được xử lý một cách tuần tự khiến tốc độ xử lý trở nên chậm và gặp phải hạn chế trong việc biểu diễn sự phụ thuộc xa giữa các từ trong một câu. Transfomer không xử lý tuần tự hồi quy (Recurrent) như RNNs mà sử dụng self-attention để nhìn vào các từ khác trong lúc mã hóa hay giải mã để hiểu được sự liên quan giữa các từ trong một câu.

Transformer Neural Network

LaMDA được xây dựng dựa trên kiến trúc Transformer để hiểu ngôn ngữ, tạo ra một mô hình có thể được huấn luyện để đọc nhiều từ (một câu hay một đoạn văn), chú ý đến cách các từ đó liên quan đến nhau và sau đó dự đoán những từ nó nghĩ sẽ xuất hiện tiếp theo.

  [Update] Low Code là gì? Hướng đi nào cho Low Code 2024

Sở hữu tham số đào tạo “khủng”

Tiền thân của LaMDA là Meena được Google cung cấp dữ liệu training về 341GB văn bản được lọc từ các cuộc trò chuyện trên mạng xã hội công cộng. Với nguồn tài nguyên hội thoại vô tận đến từ Google thì Meena có thể học được sắc thái trong cuộc trò chuyện từ những ví dụ khó và chân thực nhất. Điều này mang đến cho chatbot này khả năng trả lời (hồi đáp) lại những câu có ý nghĩa, có cảm tính hoặc là hợp lý giống như con người nhất.

Đến thời điểm hiện tại, Meena có tới 2.6 tỷ tham số, nhưng không là gì so với LaMDA AI khi sở hữu tới 137 tỷ tham số cùng với trên 1.56 nghìn tỷ từ được đào tạo. Google còn tiết lộ một hệ thống lớn và phức tạp hơn mang tên là PaLM với 540 tỷ tham số hứa hẹn mang lại độ chính xác cao hơn vượt xa hiện nay.

Google LaMDA là tương lai của Google?

Với đặc thù của mình thì mô hình LaMDA còn rất nhiều thứ để có thể phát triển trong cả tương lai gần và xa hơn. Đào tạo các mô hình LaMDA trên các dữ liệu khác nhau bao gồm cả hình ảnh và video là một điều mà chúng ta có thể sẽ nhìn thấy trong những năm sắp tới. Giám đốc điều hành Sundar Pichai ủa Google tin rằng khả năng trò chuyện của LaMDA có tiềm năng làm cho thông tin và máy tính hoàn toàn dễ tiếp cận và dễ sử dụng hơn. Chúng ta cùng chờ xem LaMDA có trở thành tương lai của ông lớn Google này không nhé. Hy vọng bài viết này hữu ích dành cho bạn, cảm ơn các bạn đã đọc bài, hẹn gặp lại trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

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

Hướng dẫn Java Design Pattern – Transfer Object

Hướng dẫn Java Design Pattern – Transfer Object

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

Transfer Object Pattern là gì?

Transfer Object/ Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, giữa Client – Server. Data Transfer Object (DTO) còn được gọi là Value Object (VO).

Transfer Object đơn giản là một POJO (Plain Old Java Object), chỉ chứa các getter/ setter method và có thể có implement serialize để truyền tải dữ liệu thông qua network.

DTO hoàn toàn không chứa behavior/ logic, chỉ được sử dụng để truyền dữ liệu và map dữ liệu từ các Domain Model trước khi truyền tới Client. Trong các ứng dụng đơn giản, các Domain Model thường có thể được sử dụng lại trực tiếp dưới dạng DTO và được truyền trực tiếp đến lớp hiển thị, do đó chỉ có một Data Model thống nhất. Đối với các ứng dụng phức tạp hơn, chúng ta không muốn hiển thị toàn bộ Domain Model cho Client, do đó, việc ánh xạ từ các Domain Model sang DTO là cần thiết.

Tìm Java job lương cao trên TopDev ngay!

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

Transfer Object Pattern

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

  • Business Object : là một Business Service, tạo Transfer Object và trả nó về Client khi cần thiết. Nó cũng có thể nhận dữ liệu từ Client trong một Transfer Object và gửi đến Server để cập nhật vào database.
  • Transfer Object : là một POJO, chỉ chứa các getter/ setter method.
  • Client : người sử dụng ứng dụng.

  CQRS pattern là gì? Ví dụ dễ hiểu về CQRS Pattern

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

Ví dụ sử dụng Transfer Object Pattern

Lớp xử lý nghiệp vụ ở phía Server thường truy vấn dữ liệu từ database và gán các giá trị vào Transfer Object để gửi lại Client. Phía Client có thể tạo một Transfer Object và gán giá trị vào để gửi lại Server thực hiện update vào database.

Trong ví dụ bên dưới, chúng ta sẽ cùng tìm hiểu cách áp dụng DTO với DAO ở bài viết trước.

Transfer Object Pattern

UserModel.java

package com.gpcoder.patterns.other.dto;

import lombok.Data;

/**
 * Domain Model / Entity
 */
@Data
public class UserModel {

    private Integer id;
    private String userName;
    private String fullName;
    private String password;
    private String email;
    private String bankAccount;
}

Dao.java

package com.gpcoder.patterns.other.dto;

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

/**
 * Data Access Object
 */
public interface Dao<T> {

    List<T> getAll();

    Optional<T> get(Integer id);

    void save(T t);

    void update(T t);

    void delete(T t);
}

UserDao.java

package com.gpcoder.patterns.other.dto;

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

public class UserDao implements Dao<UserModel> {

    // Temporary database
    private List<UserModel> users = new ArrayList<>();

    public UserDao() {
        UserModel user = new UserModel();
        user.setId(1);
        user.setUserName("gpcoder");
        user.setEmail("gpcodervn@gmail.com");
        user.setFullName("GP Coder");
        user.setPassword("1234567");
        user.setBankAccount("9999-9999-9999");
        users.add(user);
    }

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

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

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

    @Override
    public void update(UserModel user) {
        int index = -1;
        for (UserModel u : users) {
            index++;
            if (user.getId().equals(u.getId())) {
                users.set(index, user);
                break;
            }
        }
    }

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

UserDTO.java

package com.gpcoder.patterns.other.dto;

import lombok.Data;

/**
 * Data Transfer Object
 */
@Data
public class UserDTO {

    private Integer id;
    private String userName;
    private String fullName;
    private String email;
}

UserService.java

package com.gpcoder.patterns.other.dto;

/**
 * Business Object / Logic
 */
public class UserService {

    private UserDao dao = new UserDao();

    public UserDTO getUser(Integer id) {
        UserModel model = dao.get(id).get();
        return convertToDTO(model);
    }

    public void saveUser(UserDTO dto) {
        UserModel model = convertToModel(dto);
        dao.save(model);
    }

    public void updateUser(UserDTO dto) {
        UserModel model = convertToModel(dto);
        dao.update(model);
    }

    private UserModel convertToModel(UserDTO dto) {
        UserModel model = new UserModel();
        model.setId(dto.getId());
        model.setFullName(dto.getFullName());
        model.setUserName(dto.getUserName());
        model.setEmail(dto.getEmail());
        return model;
    }

    private UserDTO convertToDTO(UserModel model) {
        UserDTO dto = new UserDTO();
        dto.setId(model.getId());
        dto.setFullName(model.getFullName());
        dto.setUserName(model.getUserName());
        dto.setEmail(model.getEmail());
        return dto;
    }
}

DataAccessObjectPatternExample.java

package com.gpcoder.patterns.other.dto;

/**
 * Client - Data Access Object Pattern Example
 */
public class DataAccessObjectPatternExample {

    public static void main(String[] args) {
        UserService service = new UserService();
        UserDTO dto = service.getUser(1);
        System.out.println("User: " + dto);

        dto.setFullName("gpcoder.com");
        service.updateUser(dto);
        System.out.println("User Updated: " + dto);
    }
}

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

User: UserDTO(id=1, userName=gpcoder, fullName=GP Coder, email=gpcodervn@gmail.com)
User Updated: UserDTO(id=1, userName=gpcoder, fullName=gpcoder.com, email=gpcodervn@gmail.com)

Tham khảo việc làm Fresher Java mới nhất trên TopDev

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

  • Tách biệt logic một cách rõ ràng : Transfer Object chỉ chứa data, còn logic được implement trong phần khác.
  • Cãi thiện hiệu suất ứng dụng : chi phí của mỗi request/ response là lớn, chúng ta nên cố gắng gửi nhiều nhất có thể. Để làm điều này, chúng ta có thể tạo một Transfer Object để gửi data từ Client lên Server hay từ Server đến Client một lần duy nhất, thay vì phải gửi từng phần riêng lẻ.
  • Giảm kết dính giữa các tầng trong ứng dụng: Client chỉ thao tác với Transfer Object, nên nó không bị ảnh hưởng khi Domain Model thay đổi.
  • Bao đóng các đối số : một phương thức có nhiều đối số, chúng ta có thể bao đóng chúng trong một Transfer Object. Giúp chúng ta dễ dàng mở rộng, thêm/ bớt đối số.
  • Nhận nhiều dữ liệu trả về : trong Java, một phương thức chỉ có thể trả về một giá trị, để có thể nhận được nhiều giá trị, chúng ta có thể bao đóng chúng trong một Transfer Object.
  • Tăng bảo mật ứng dụng : tùy vào người dùng khác nhau có thể xem được một số dữ liệu nhất định. Chúng ta có thể tạo nhiều Transfer Object khác nhau cho từng loại người dùng thay vì trả về một Domain Object một cách trực tiếp. Trường hợp rõ ràng nhất là User Model, domain object này chứa thông tin cả email, password, số tài khoản ngân hàng. Chúng ta có thể tạo một Transfer Object đơn giản chỉ chứa thông tin họ tên, ngày sinh. Không cần thiết phải trả tất cả dữ liệu Domain Model về Client.
  • Transfer Object thường được sử dụng với Data Access Object.

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

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

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

Hibernate Batch Processing là gì? Batch Processing trong Hibernate

Hibernate Batch Processing là gì? Batch Processing trong Hibernate

Bài viết được sự cho phép của tác giả Trần Hữu Cương

1. Hibernate Batch Processing là gì?

Ta có tình huống như sau: cần insert 10000 bản ghi vào database

  • Nếu insert lần lượt và đẩy từng đối tượng một thì thời gian sẽ rất lâu vì phải mở/đóng connection nhiều lần
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    session.flush();
    session.clear();
}
tx.commit();
session.close();
  • Nếu insert và đẩy đồng thời cùng 1 lúc 10000 bản ghi thì sẽ xảy ra lỗi OutOfMemoryException (Lý do là hibernate sẽ lưu tất cả 10000 bản ghi vào bộ nhớ cache nhưng bộ nhớ cache không đủ)
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
}
tx.commit();
session.close();

=> Giải pháp: Batch Processing

Vậy Batch Processing là gi? Batch Processing là xử lý theo lô, tức là ta sẽ insert và đẩy từng lô bản ghi vào database.

hibernate-batch-processing

Ví dụ ở đây ta sẽ insert và đẩy 50 bản ghi vào database cùng 1 lúc, như thế sẽ giảm số lượng connection tới database, đồng thời tránh được lỗi OutOfMemoryException

  Phân biệt save, persist, update, merge, saveOrUpdate trong hibernate

  Các lưu ý về strategy của GeneratedValue khi sử dụng hibernate

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 50 == 0 ) { //50, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

2. Batch Inserts

Khi bạn tạo mới đối tượng persistent, sử dụng các method flush() và clear() để điều khiển kích thương của bộ nhớ cache.

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
      //flush a batch of inserts and release memory:
      session.flush();
      session.clear();
    }
}

tx.commit();
session.close();

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

3. Batch Update

Cũng giống như lúc insert, khi truy xuất, cập nhật dữ liệu hãy dùng các method  flush() và clear() để điều khiển kích thương của bộ nhớ cache. Ngoài ra sử dụng method scroll() để tận dụng các con trỏ ở server cho các truy vấn trả về nhiều hàng dữ liệu.

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

ScrollableResults customers = session.getNamedQuery("GetCustomers")
    .setCacheMode(CacheMode.IGNORE)
    .scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while ( customers.next() ) {
    Customer customer = (Customer) customers.get(0);
    customer.updateStuff(...);
    if ( ++count % 20 == 0 ) {
        //flush a batch of updates and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

4. StatelessSession

Trái với Session, StatelessSession không có cache-level 1 hoặc giao tiếp với cache-level 2. Nó cũng không gắn với một Persistence Context nào.

StatelessSession session = factory.openStatelessSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.insert(customer);
}

tx.commit();
session.close();

Top 7 câu hỏi phỏng vấn Security Engineer thường gặp

Top 7 câu hỏi phỏng vấn Security Engineer thường gặp

Vấn đề bảo mật luôn là một thách thức lớn cho các công ty, tổ chức hiện nay; vì thế các công ty IT luôn ưu tiên tìm kiếm vị trí Security Engineer có kinh nghiệm với mức đãi ngộ cao. Bài viết hôm nay chúng ta cùng nhau tìm hiểu những câu hỏi phỏng vấn vị trí Security Engineer thường gặp nhé.

1. Công việc của một Security Engineer là gì?

Security Engineer

Security Engineer – kỹ sư bảo mật hay Security Specialist – chuyên gia bảo mật là một công việc giúp bảo vệ hệ thống máy tính khỏi các tấn công từ bên ngoài và đề phòng, hạn chế, khắc phục những lỗi xảy ra từ bên trong. Việc bảo mật trong một tổ chức bao gồm nhiều lĩnh vực như mạng (network), thông tin (information), hệ thống (system),… và nhiều vai trò công việc như khắc phục sự cố (Ttroubleshooting), quản trị (administration), phân tích (analyst), kiểm tra (testing),…

Công việc của một kỹ sư bảo mật thường bao gồm những đầu việc dưới đây:

  • Phát triển các giao thức bảo mật
  • Kiểm tra lỗ hổng hệ thống
  • Thực hiện và nâng cấp các biện pháp bảo mật
  • Duy trì hệ thống an ninh
  • Điều tra vi phạm an ninh

2. Lỗ hổng hệ thống (Vulnerability) là gì?

Lỗ hổng hệ thống (Vulnerability) là một điểm yếu của hệ thống mà thông qua đó, những kẻ xâm nhập hoặc các lỗi có thể lợi dụng tấn công hệ thống. Nếu việc kiểm thử an ninh hệ thống không được thực hiện một cách nghiêm ngặt, kĩ càng thì lỗ hổng ngày có nguy cơ càng ngày càng trầm trọng hơn. Vì vậy cần phát hiện sớm và có những bản vá lỗi kịp thời.

Ngoài lỗ hổng hệ thống thì còn 2 khái niệm khác là mối đe dọa (threat) và nguy cơ (risk). Threat nói đến một sự cố mới được phát hiện có khả năng gây hại cho hệ thống. Risk đề cập đến khả năng mất mát hoặc thiệt hại khi một mối đe dọa khai thác lỗ hổng bảo mật. Nói cách khác chúng ta có mối tương quan giữa 3 khái niệm này như sau: RISK = Threat + Vulnerability

  Ngành Bảo Mật Thông Tin Và Những Cơ Hội Việc Làm Đầy Hấp Dẫn

  Lộ trình từng bước trở thành Machine Learning Engineer

3. Thế nào là XSS hay Cross Site Scripting

Cross Site Scripting

XSS hay Cross Site Scripting là một loại lỗ hổng mà tin tặc có thể lợi dụng để tấn công các ứng dụng Web. Lợi dụng việc chèn các đoạn mã JavaScriptHTML vào trang Web để thực hiện việc đánh cắp những thông tin bảo mật từ dữ liệu của người dùng hay hệ thống. Có 2 loại tấn công XSS là XSS lưu trữ (stored) và XSS phản xạ (reflected). Stored XSS là những đoạn script được lưu trên một trang tĩnh hoặc lấy ra từ cơ sở dữ liệu và hiển thị trực tiếp lên cho người dùng. Reflected XSS là việc người dùng bị lừa gửi đi một request (được bên tấn công thiết kế) và đoạn script độc hại đó được gửi về từ trang Web.

Phương pháp chung cho việc xử lý các tấn công XSS là việc kiểm tra làm sạch đầu vào, chỉ thực thi những đoạn mã được kiểm soát và không gây hại cho hệ thống.

4. Nêu điểm khác nhau giữa encode, encrypt và hashing

Encode – mã hóa được thiết kế để bảo vệ tính toàn vẹn của dữ liệu khi truyền tải qua các hệ thống mạng, đường truyền,… đảm bảo thông điệp nhận được sẽ chính là thông điệp được gửi đi. Trong việc mã hóa, các vấn đề về bảo mật không phải vấn đề chính được quan tâm mà tính toàn vẹn dữ liệu mới là cốt lõi. Thông điệp mã hóa thường có thể dễ dàng được dịch ngược thành văn bản vì các hệ mã hóa thường được sử dụng rộng rãi.

Để đảm bảo tính an toàn và bí mật của thông tin, chúng ta sử dụng Encrypt – mật mã. Bản mã chỉ được dịch ngược thành văn bản thông tin nếu có key – chìa khóa.

Hashing – hàm băm là hàm một chiều, không để đảo ngược; đầu ra thường ngắn hơn đầu vào và có chiều dài cố định. 

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

5. Tấn công CSRF là gì?

CSRF – Cross-Site Request Forgery là một dạng tấn công có thể làm cho trình duyệt nạn nhân gửi đi các request cùng với các thông tin chứng thực. Bên thực hiện tấn công thường sử dụng các khiến nạn nhân (người dùng) click vào một link hoặc dùng các iframe nhúng website, đoạn mã tự động gửi request khiến người dùng thực hiện một hành động mà họ không chủ ý và không biết được kết quả xảy ra.

Để phòng chống tấn công CSRF, nhiều trang Web sử dụng tích hợp nonces vào các form hoặc URL. Nonces là một loại kỹ thuật sử dụng các token một lần dùng, các giá trị một lần dùng này được sinh ra khi người dùng truy cập vào trang Web và nó sẽ thay đổi liên tục. Khi người dùng nhấn vào một liên kết hay điền một form, token sẽ được gửi kèm theo truy vấn và được xác thực trên máy chủ. Chỉ khi token đúng (validation) thì truy vấn mới được xử lý.

6. Mục tiêu bảo mật thông tin trong một tổ chức là gì?

Đối với một tổ chức, để đảm bảo được mục tiêu bảo mật thông tin thì điều cơ bản nhất cần được thực hiện là kiểm soát tất cả các truy cập thông tin càng nhiều càng tốt. Việc kiểm soát sự truy cập là một điều không chỉ những kỹ sư bảo mật thực hiện mà còn là nhiệm vụ của bất kỳ nhân viên nào trong công ty, tổ chức. Vì thế việc nâng cao hiểu biết về an ninh, nhận thức được sự an toàn thông tin trong một tổ chức là điều mà bất cứ nhân viên nào cũng phải được đào tạo. Đối với bất kỳ công ty thương mại nào, mục tiêu bảo mật thông tin luôn là để giúp công ty thành công và đảm bảo được thành công trong tương lai.

Kỹ sư bảo mật luôn luôn phải đặt trọng tâm bảo mật dựa trên những mối quan tâm đến lỗ hổng bảo mật và những mối đe dọa có thể xảy ra. Khi có lỗ hổng xuất hiện, phải đảm bảo có biện pháp xử lý vá lỗi ngay, đấy như là việc chữa bệnh. Ngược lại, chú trọng thiết kế phòng thủ sâu dựa trên các mô hình mối đe dọa cũng giống như việc phòng bệnh. Đảm bảo thông tin trong tổ chức không bị “nhiễm bệnh” chính là mục tiêu của bảo mật thông tin.

7. Một số chứng chỉ bảo mật thông tin phổ biến

Trong lĩnh vực bảo mật thông tin thì các chứng chỉ của CompTIA – hiệp hội công nghiệp công nghệ máy tính hàng đầu của Hoa Kỳ được xem là tiêu chuẩn công nhận bạn có thể được công nhận là bước chân vào ngành này. Có 4 chứng chỉ bảo mật CompTIA:

  • CompTIA Security +
  • CompTIA PenTest +
  • Nhà phân tích an ninh mạng CompTIA (CySA +)
  • Học viên bảo mật nâng cao CompTIA (CASP +)

CompTIA Security

Ngoài 4 chứng chỉ trên thì còn các chứng chỉ có giá trị cao cho nghề bảo mật Security Engineer như dưới đây:

  • CISM: chứng chỉ được chứng nhận bởi ISACA dành cho chuyên gia đánh giá hệ thống thông tin và bảo mật.
  • CISSP: chứng chỉ bảo mật thông tin độc lập do Hiệp hội chứng nhận bảo mật hệ thống thông tin quốc tế cấp.
  • CEH: chứng nhận hacker đạo đức (hacker mũ trắng) giúp các tổ chức hệ thống phát hiện lỗ hổng, tìm cách sửa chữa và khắc phục.

Kết bài

Trên đây là danh sách những câu hỏi thường gặp dành cho kỹ sư bảo mật Security Engineer trong buổi phỏng vấn với nhà tuyển dụng. Đây là một lĩnh vực khó và đòi hỏi sự đam mê tìm tòi chuyên sâu của các kỹ sư công nghệ thông tin, vì vậy hãy trang bị thêm kiến thức thực tiễn mà bạn học được để sẵn sàng chinh phục nhà tuyển dụng nhé. Cảm ơn các bạn đã đọc bài và hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

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

Kiểm thử đơn vị với PHPUnit trên Netbeans

Kiểm thử đơn vị với PHPUnit trên Netbeans

Bài viết được sự cho phép của BBT Tạp chí lập trình

Khái niệm Kiểm thử đơn vị (Unit Testing) không còn xa lạ với những lập trình viên luôn hướng tới chất lượng của từng dòng code. Với bài viết này tôi mong muốn sẽ giúp các lập trình viên PHP biết cách triển khai Unit Testing với framework PHPUnit. Đây là một Framework nổi tiếng thế giới, nó cho phép bạn triển khai Unit Testing với nhiều IDE khác nhau, ở bài viết này tôi sẽ hướng dẫn bạn triển khai với Netbeans 7.2.

Netbeans là IDE được nhiều lập trình viên Java sử dụng, tuy vậy đây cũng là một trong những IDE hỗ trợ lập trình PHP và đặc biệt là hỗ trợ đắc lực cho việc triển khai kiểm thử tự động với PHPUnit.

Trước hết để có thể triển khai ứng dụng với PHP bạn cần có môi trường cho ngôn ngữ này đã. Bạn dễ dàng làm quen với PHP và chuẩn bị môi trường để phát triển ứng dụng (web) với ngôn ngữ này. Về mặt căn bản bạn chỉ cần cài XAMPP là đủ để phát triển ứng dụng web với PHP, nếu không cần đi quá sâu về môi trường phát triển PHP.

Có thể bạn đã có XAMPP, tuy nhiên PHPUnit cần phải có thêm sự hỗ trợ của PEAR. Hướng dẫn cài PEAR có khá nhiều trên Internet, ví dụ như trang web http://www.phpunit.de. Hoặc bạn có thể thực hiện các lệnh như tôi đã làm trên màn hình lệnh của Windows (cũng có thể bạn có cách khác đơn giản hơn? cho chúng tôi cùng biết với nhé). Lưu ý, nếu bạn dùng Windows với tài khoản thường thì cần phải chạy CMD (chương trình để chạy các lệnh) với quyền của Administrator (Run as Administrator), đặc biệt là trên Windows 8.

Kiểm thử đơn vị với PHPUnit trên Netbeans

Lưu ý lệnh cài đặt PHPUnit với PEAR (dòng lệnh thứ 2) chỉ thực hiện được thành công với những điều kiện sau:

  • Bạn đã sẵn có XAMPP và đang vào đúng thư mục php nằm trong thư mục cài đặt của nó (tôi đang có XAMPP ở tại C:xampp).
  • Máy tính của bạn phải được kết nối Internet vì lệnh cài đặt trên sẽ tải bộ cài từ repo trên mạng về trước khi cài vào máy tính của bạn.

  Phương pháp kiểm thử ứng dụng Web phổ biến

  NUnit – Kiểm thử Đơn vị trên Visual Studio

Bạn sẽ nhận được các thông báo dạng như sau:

Kiểm thử đơn vị với PHPUnit trên Netbeans

Nếu toàn thấy “OK” như trên thì chắc bạn đã thành công và PHPUnit đã sẵn sàng để bạn xài nó. Nếu báo lỗi bạn cần chạy lệnh sau:

pear config-set auto_discover 1

Sau đó chạy lại lệnh:

pear install pear.phpunit.de/PHPUnit

Nếu vẫn có lỗi thì hiện tại tôi chưa đoán biết được bạn đang gặp vấn đề gì cả :o)

Bây giờ là lúc bạn cần kiểm tra xem Netbeans bạn đang dùng đã hỗ trợ PHP chưa? Nếu chưa bạn có hai lựa chọn sau:

  1. Tải bản Netbeans hỗ trợ PHP và cài đặt nó: http://netbeans.org/downloads/index.html
  2. Sử dụng công cụ cài đặt plug-in của Netbeans để tìm các plug-in về PHP:

Kiểm thử đơn vị với PHPUnit trên Netbeans

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

Bạn cần cài đủ những plug-in sau:

  1. PHP
  2. Selenium Module for PHP
  3. PHP Documentor Tag Help
  4. PHP Documentor

Những plug-in trên ngoài việc hỗ trợ viết PHP nó còn giúp bạn triển khai Unit Testing ngay trên Netbeans với PHPUnit.

Việc tiếp theo là kiểm tra xem Netbeans đã nhận PHPUnit chưa theo các bước sau: Từ thanh trình đơn của Netbeans > Tools > Options > chọn tab PHP

Kiểm thử đơn vị với PHPUnit trên Netbeans

Mở tiếp sang tab Unit Testing:

Kiểm thử đơn vị với PHPUnit trên Netbeans

Bấm nút Search trong phần PHPUnit Script để Netbeans tự động xác định PHPUnit.

Kiểm thử đơn vị với PHPUnit trên Netbeans

Bấm nút Search trong phần Skeleton Generator Script để Netbeans tự động xác định công cụ sinh ra các mã dành cho Unit Testing.

Kiểm thử đơn vị với PHPUnit trên Netbeans

Sau khi 2 script này được xác định bạn đã sẵn sàng cho những Kiểm thử đơn vị đầu tiên rồi.

Vấn đề lúc này là: bạn đã biết căn bản về PHP chưa? Nếu câu trả lời là chưa! Xin mời bạn tìm hiểu trước về PHP ở loạt bài sau:

  1. Bắt đầu với PHP và CMS
  2. [PHP] Những dòng code đầu tiên
  3. [PHP] Các cấu trúc điều kiện
  4. [PHP]Các cấu trúc lặp
  5. [PHP]Quy ước đặt tên

Hoặc tự tìm hiểu ở những nguồn phong phú hơn như www.php.net hay w3schools.com. Tuy nhiên với những dòng code mà tôi sử dụng dưới đây, bạn không nên lo lắng về trình PHP của mình (chỉ cần bạn đã biết về OOP với JavaC++C#v.v..)

Nếu câu trả lời là OK, chúng ta cùng nhau đi tiếp từ đây.

Bước đầu tiên của công đoạn này, bạn cần tạo một project PHP trên Netbeans, VD project của tôi là DemoPHP:

Kiểm thử đơn vị với PHPUnit trên Netbeans

Kiểm thử đơn vị với PHPUnit trên Netbeans

Kiểm thử đơn vị với PHPUnit trên Netbeans

Kiểm thử đơn vị với PHPUnit trên Netbeans

Giờ ta cần xây dựng một lớp (class) như sau cho project của mình:

Kiểm thử đơn vị với PHPUnit trên Netbeans

Cụ thể trên Netbeans như sau:

Kiểm thử đơn vị với PHPUnit

Bạn nên đưa các class vào một thư mục để tiện quản lý, VD tôi đưa chúng vào thư mục classes:

Kiểm thử đơn vị với PHPUnit trên Netbeans

Đây là code tôi viết cho class này (thực tế phần lớn là do Netbeasn tự sinh ra )

[sourcecode language=”php”]
<?php
/*
** Description of Person
** @author KhoaNV
*/
class Person {
private $name;
private $gender;
private $age;

function __construct($name, $gender, $age) {
$this->name = $name;
$this->gender = $gender;
$this->age = $age;
}

public function getName() {
return $this->name;
}

public function setName($name) {
$this->name = $name;
}

public function getGender() {
return $this->gender;
}

public function setGender($gender) {
$this->gender = $gender;
}

public function getAge() {
return $this->age;
}

public function setAge($age) {
$this->age = $age;
}

public function sayHello($otherName){
throw new Exception("Error!");
}

public function sayGoodbye($otherName){
throw new Exception("Error!");
}
}
?>
[/sourcecode]

Bạn lưu ý là Netbeans hỗ trợ tự động sinh các code căn bản cho một class trong PHP (sử dụng tổ hợp phím Alt+Insert):

Kiểm thử đơn vị với PHPUnit

Tôi chưa vội hoàn chỉnh hàm sayHello và sayGoodbye, vì cái chúng ta đang cần là Unit Testing với PHPUnit và tôi thì thích triển khai nó theo TDD. Do đó, tôi sẽ tạo một test (kiểm thử) cho lớp Person, cụ thể là cho phương thức sayHello. Netbeans với những plug-in mà bạn cài đặt ở trên sẽ dễ dàng giúp bạn tạo ra cái test này. Bạn nên tạo một thư mục để chứa các test, VD tôi đặt thư mục này là tests (cùng thư mục cha với thư mục classes). Mời bạn quan sát hình ảnh sau:

Kiểm thử đơn vị với PHPUnit

Nếu không gặp lỗi gì, bạn sẽ có một lớp mới dùng để test cho lớp Person vừa tạo ở trên:

Kiểm thử đơn vị với PHPUnit

Để đỡ mất tập trung vào các hàm test khác (tự sinh ra bởi công cụ) bạn có thể xóa hết các hàm có trong lớp PersonTest này và chỉ để lại hàm test cho sayHello:

[sourcecode language=”php”]
<?php
/**
* Generated by PHPUnit_SkeletonGenerator 1.2.0 on 2013-03-23 at 15:45:45.
*/
require_once ‘../../classes/Person.php’;

class PersonTest extends PHPUnit_Framework_TestCase {

/**
* @covers Person::sayHello
* @todo Implement testSayHello().
*/
public function testSayHello() {
$this->markTestIncomplete(
‘This test has not been implemented yet.’
);
}

}
[/sourcecode]

Giờ ta cần hoàn chỉnh một test-case để kiểm tra tính đúng đắn của sayHello. Mời bạn xem đoạn code sau:

[sourcecode language=”php”]
<?php
/**
* Generated by PHPUnit_SkeletonGenerator 1.2.0 on 2013-03-23 at 15:45:45.
*/
require_once ‘../../classes/Person.php’;

class PersonTest extends PHPUnit_Framework_TestCase {

/**
* @covers Person::sayHello
* @todo Implement testSayHello().
*/
public function testSayHello() {
$expected = "Hello TapChiLapTrinh. I’m Khoa";
$person = new Person("Khoa", true, 18);

$this->assertEquals($expected, $person->sayHello(‘TapChiLapTrinh’));
}

}
[/sourcecode]

Lưu ý dòng code “require_once ‘../../classes/Person.php’;” dùng để xác định nơi chứa code của lớp mà bạn muốn test. Tôi không hiểu sao nó không được tự động chèn vào? Hiện tôi tự code dòng đó, nếu bạn biết cách nào đó mà không phải làm vậy, xin hãy khai sáng cho tôi.

Bạn hãy chạy thử test-case này để kiểm tra kết quả (nhấp chuột phải vào và chọn Run File hoặc nhấp chuột phải vào lớp Person và chọn Test). Chắc chắn nếu bạn chưa hoàn chỉnh code của hàm sayHello thì bạn sẽ nhận được thông báo như sau:

Kiểm thử đơn vị với PHPUnit

Nếu bạn nhận được thông báo như trên thì bạn đã có tín hiệu vui mừng đầu tiên trong TDD,  “Red: Create a test and make it fail”.

Nào, bây giờ thì chúng ta quay lại để hoàn tất code của hàm sayHello.

[sourcecode language=”php”]
public function sayHello($otherName){
$strTemp = trim($otherName);
if($strTemp!=”){
return "Hello " . $otherName . ". I’m " . $this->name;
}
throw new Exception("Error!");
}
[/sourcecode]

Vòng lại bước chạy test-case xem sao nào? Nếu bạn vẫn nhận được Red, chắc là bạn cần xem lại code của hàm sayHello. Còn với tôi kết quả là như sau:

Kiểm thử đơn vị với PHPUnit

Tôi có thể vui được rồi, vì mình đã hoàn tất khâu tiếp theo trong TDD đó là “Green: Make the test pass by any means necessary”.

Đến đây tôi xin tạm dừng bài viết của mình, tôi nghĩ rằng lúc này bạn đã có thể tự mình triển khai Unit Testing với PHPUnit được rồi :o)

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

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

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

Bật mí 10 câu hỏi phỏng vấn Magento Developer hay và khó

Bật mí 10 câu hỏi phỏng vấn Magento Developer hay và khó

Thương mại điện tử đang phát triển bùng nổ trong thời đại số hóa hiện nay, bạn dễ dàng có thể tìm kiếm bất kỳ sản phẩm nào trên Internet. Sự phổ biến đó phần lớn là nhờ sự phát triển mạnh mẽ của các nền tảng xây dựng website thương mại điện tử và Magento là một đại diện tiêu biểu trong đó. Lập trình website e-commerce dựa trên nền tảng Magento đang là một công việc hấp dẫn hiện nay với nhu cầu khá lớn, bài viết hôm nay chúng ta cùng nhau tìm hiểu top 10 câu hỏi phỏng vấn Magento Developer thường gặp nhé.

Câu 1: Website thương mại điện tử là gì?

Website thương mại điện tử là gì?

E-commerce (Electronic commerce) hay Thương mại điện tử chỉ việc các công ty, cá nhân thực hiện việc kinh doanh thông qua Internet. Thương mại điện tử chú trọng đến việc mua bán trực tuyến, cho phép các doanh nghiệp kết nối hệ thống dữ liệu bên trong và bên ngoài một cách hiệu quả và linh hoạt; hợp tác chặt chẽ hơn với các nhà cung cấp và đối tác, qua đó có thể thỏa mãn tốt hơn nhu cầu và sự mong đợi của khách hàng.

Website thương mại điện tử là trang thông tin điện tử được thiết lập để phục vụ một phần hoặc toàn bộ quy trình của hoạt động thương mại điện tử từ mua bán hàng hóa, cung ứng dịch vụ, giới thiệu sản phẩm, kết hợp thanh toán và các dịch vụ sau bán hàng khác. Chức năng của một website E-commerce bao gồm cả việc giúp người bán (cung cấp dịch vụ) dễ dàng quản lý nhiều thành phần của quy trình bán hàng trực tuyến, cung cấp trải nghiệm mua sắm tối ưu cho khách hàng.

Câu 2: Magento là gì?

Magento là một nền tảng thương mại điện tử mã nguồn mở được viết bằng ngôn ngữ lập trình PHP. Magento được viết dựa trên nền tảng Zend Framework, phát hành lần đầu từ năm 2008 và hiện đang là sở hữu của Adobe Inc.

Magento cung cấp cho người dùng 2 phiên bản gồm: 

  • Magento Open Source: bản miễn phí dành cho cộng đồng – trước đây gọi là Community Edition (CE) 
  • Magento Commerce: bản trả phí dành cho doanh nghiệp sử dụng với các tính năng nâng cấp và cải tiến – trước đây gọi là Enterprise Edition

Theo thống kê hiện nay có hơn 100.000 website thương mại điện tử được phát triển bằng nền tảng này với 2.5 triệu lượt tải về Magento từ người dùng. 

  Hướng dẫn viết code PHP chuẩn – PSR tiêu chuẩn khi lập trình PHP

  Chuẩn coding convention trong PHP với PSR

Câu 3: Những tính năng chính của Magento

Những tính năng chính của Magento

Những tính năng chính của Magento Open Source – phiên bản miễn phí của Magento bao gồm:

  • Tính năng quản lý toàn bộ website trong hệ thống thương mại điện tử Magento
  • Tính năng quản lý danh mục sản phẩm, sản phẩm, quản lý tồn kho
  • Tính năng quản lý khách hàng, các dịch vụ khách hàng liên quan
  • Tính năng quản lý bán hàng và hỗ trợ bán hàng như checkout, thanh toán, vận chuyển
  • Tính năng hỗ trợ tiếp thị, quảng cáo, cho phép tích hợp các dịch vụ bên thứ 3
  • Tính năng phân tích và báo cáo dựa trên số liệu hoạt động
  • Tính năng tối ưu hóa tìm kiếm trên các search engine (SEO)
  • Hỗ trợ đa ngôn ngữ, đa tiền tệ cùng các hỗ trợ về thuế

Ở bản trả phí, Magento còn cung cấp nhiều tính năng hỗ trợ chuyên biệt và hữu ích, ngoài ra chúng ta cũng có thể tìm kiếm các plugins hỗ trợ khác trên các marketplace của Magento.

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

Câu 4: Giải thích kiến trúc của Magento

Magento áp dụng các quy ước về lập trình hướng đối tượng và sử dụng kiến trúc MVC (Model-View-Controller) kết hợp mô hình EAV (Entity-Attribute-Value) trong việc lưu trữ dữ liệu.

Kiến trúc Magento bao gồm các thành phần:

  • User Request: tiếp nhận các yêu cầu được gửi đến máy chủ
  • View: là các lớp định nghĩa cách thức trình bày dữ liệu hay nói cách khác là giao diện người dùng
  • Controller: lớp điều khiển luồng ứng dụng
  • Model: lớp cung cấp dữ liệu và logic của dữ liệu
  • Database: cơ sở dữ liệu
  • WSDL: Web Services Description Language – ngôn ngữ mô tả dịch vụ Web để mô tả các dịch vụ và cách sử dụng

Câu 5: Trình bày cấu trúc module trong Magento

Một module trong Magento bao gồm các thành phần chính sau:

  • block: là nơi để load dữ liệu, điều chỉnh dữ liệu từ database trước khi hiển thị
  • controller: nhận yêu cầu từ người dùng qua http request sau đó chuyển yêu cầu tới các lớp xử lý
  • etc: chứa các files xml để config module
  • helper: hỗ trợ giải thích các chức năng trong hệ thống
  • sql: sử dụng để cập nhật, tạo bảng dữ liệu và đưa ra các điều chỉnh về dữ liệu
  • model: nơi viết các câu lệnh truy vấn đối với cơ sở dữ liệu

Câu 6: Nền tảng kỹ thuật của Magento gồm những gì?

Để lập trình Magento, lập trình viên sử dụng ngôn ngữ lập trình PHP version 5.4+ (trở lên). Magento được viết dựa trên Zend Framework. Từ phiên bản Magento version 2, chúng ta có thể sử dụng Require JS để module hóa source code viết bằng JavaScript cho việc chỉnh sửa, thiết kế giao diện người dùng và logic phía Frontend. Về phía server, Magento sử dụng cơ sở dữ liệu quan hệ MySQL hoặc MariaDB; phiên bản hỗ trợ MySQL là từ MySQL 5.1 trở lên. 

Magento yêu cầu chạy trên nền Web Service Apache 2.4 hoặc Nginx 1.x. Phiên bản Magento mới nhất sử dụng một số công nghệ Web phổ biến hiện nay như Redis, Varnish, Elasticsearch, RabbitMQ,…

Câu 7: Liệt kê các loại sản phẩm trong Magento

Magento cung cấp sẵn 6 loại sản phẩm bao gồm:

  • Simple Products: sản phẩm thường, là nền tảng cơ bản cho các loại sản phẩm khác.
  • Grouped Products: sản phẩm theo nhóm, chứa 1 vài sản phẩm thường.
  • Configurable Products: sản phẩm tùy biến, có thể tùy chỉnh được các giá trị thuộc tính.
  • Virtual Products: sản phẩm ảo, ví dụ như thẻ thành viên, gói bảo hành,… sẽ không có 1 vài thuộc tính mặc định của sản phẩm như cân nặng, tùy chọn giao hàng,…
  • Bundle Products: Set sản phẩm tùy chọn, xử lý các sản phẩm thành combo (các sản phẩm có thể được chọn chứ không cố định như grouped).
  • Downloadable Products: sản phẩm tải xuống được, có thể tải về dạng file, tệp như eBook, video, phần mềm,…

Câu 8: Vòng đời của một đơn hàng trong Magento

Đơn hàng (Orders) trong Magento có vòng đời giống với thực tế, cụ thể gồm những trạng thái dưới đây:

  • New Orders: đơn hàng mới – khách hàng đặt hàng trên một cửa hàng của Magento.
  • Pending: đơn hàng trạng thái chờ xử lý – một đơn hàng được khách hàng submit thì sẽ chuyển sang trạng thái này để chờ người bán thực hiện các hành động tiếp theo.
  • Pending PayPal: đơn hàng mới và chưa được thanh toán qua PayPal.
  • Processing: khi người bán thực hiện lập hóa đơn cho đơn hàng, đơn hàng sẽ chuyển sang trạng thai đang xử lý.
  • Cancelled: khi khách hàng có yêu cầu hủy đơn thì đơn hàng sẽ chuyển sang trạng thái này.
  • Order Shipped: Đơn hàng đã xử lý và đang được vận chuyển.
  • On Hold: đơn hàng tạm dừng do cần thêm thông tin từ khách hàng trước khi giao dịch mua được xử lý.
  • Complete: đơn hàng hoàn thành, đã lập hóa đơn, vận chuyển bàn giao xong đến người dùng.

Câu 9: Công việc của một Magento Developer là gì?

Giống như nhiều các platform khác, lập trình viên Magento thông thường chia thành 3 vị trí bao gồm:

  • Frontend – xây dựng UI: phát triển, tích hợp hoặc đưa ra các tùy biến về theme, giao diện.
  • Tùy biến chức năng: sử dụng ngôn ngữ lập trình PHP, kết hợp với kiến thức và kỹ thuật dành cho Magento để xử lý thay đổi phần core nhằm tùy biến chức năng phù hợp với mô hình kinh doanh trong thực tế của khách hàng. Ngoài ra chúng ta còn có thể tạo ra các extensions giải quyết một số bài toán nhỏ cụ thể, áp dụng cho hệ thống đồng thời phát hành lên các chợ chính thức của Magento.
  • Thiết lập, tối ưu hệ thống: khởi tạo, import (hoặc hỗ trợ việc import) các danh mục, sản phẩm, thông tin khách hàng,… Trong quá trình vận hành, nếu có sự cập nhật đến từ Magento thì hỗ trợ người dùng cập nhật bản mới, đồng thời điều chỉnh hiệu suất thực thi (performance tuning) cho hệ thống.

Câu 10: Kể tên một số extensions phổ biến cho Magento

  • Shipworks: hỗ trợ vận chuyển đơn hàng.
  • Zopim Live Chat: tính năng trò chuyện trực tiếp trên website.
  • Fontis SecurePay: giải pháp hỗ trợ bảo mật thanh toán.
  • Magic Zoom: hỗ trợ preview ảnh sản phẩm qua việc zoom, hover trên nhiều loại màn hình khác nhau.
  • SEO Hub: hỗ trợ SEO website qua việc cập nhật thông tin meta, chuẩn hóa URLs,…
  • Language Translator: hỗ trợ dịch tự động nội dung website sang các ngôn ngữ khác nhau.

Kết bài

Như vậy chúng ta đã cùng đi qua top 10 câu hỏi phỏng vấn vị trí tuyển dụng Magento Developer thường gặp, hy vọng bài viết này hữu ích dành cho những ai đang có nhu cầu tìm kiếm một vị trí trong ngành này. Hẹn gặp lại các bài trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

Xem thêm tuyển dụng các vị trí IT hấp dẫn trên TopDev

Tự do và khám phá: Adhoc testing vs Exploratory testing

Tự do và khám phá: Adhoc testing vs Exploratory testing

Bài viết được sự cho phép của tác giả Tô Thị Vân Anh

Vẫn là chủ đề lý thuyết nhàm cmn chán, nhưng mà vẫn phải học :v. Học rồi còn đi áp dụng, và trên thực tế là mình đã và đang sử dụng 2 loại này rồi nhé – không đùa tí nào :v. Bây giờ vấn đề là gõ lại cho nhớ và luyện khả năng diễn giải các ý cho dễ hiểu nữa. Về hai loại này theo mình có một vài điểm cần nhớ, chi tiết đọc tiếp nội dung phía dưới nha. Hi vọng bài viết sẽ giúp ích cho các bạn.

1. Adhoc testing

Adhoc testing là một loại kiểm thử không chính thức, với mục đích là tìm các “điểm chết” của hệ thống. Loại kiểm thử này thường không có kế hoạch thực hiện tức là bạn sẽ không cần tuân theo một kỹ thuật thiết kế test design nào để tạo test case cả.

Và thực tế là chúng ta cũng sẽ không tạo và làm theo test case nào hết! Do đó, loại kiểm thử này yêu cầu rất cao về mức độ hiểu hệ thống của người thực hiện kiểm thử. Và tester sẽ thực hiện kiểm thử ứng dụng một cách ngẫu nhiên các trường hợp mà không sử dụng một tài liệu test case hay mô tả nghiệp vụ nào.

Adhoc testing không yêu cầu các tài liệu, kế hoạch hay quy trình. Vì mục đích của loại kiểm thử này là tìm lỗi thông qua hướng tiếp cận ngẫu nhiên, vì không dựa theo bất kỳ tài liệu nào, nên các lỗi tìm thấy sẽ không được ánh xạ tới các test case tương ứng như bình thường. Vì thế mà đôi khi sẽ rất khó để tái hiện lại lỗi.

Khi nào thì sử dụng Adhoc testing?

Adhoc testing có thể được thực hiện khi có một thời gian giới hạn nào đó cho các kiểm thử phức tạp. Thông thường Adhoc testing được thực hiện sau khi đã hoàn thành việc thực thi kiểm thử theo đúng quy trình.

Nếu như có thời gian, thì có thể hoàn thành thực hiện Adhoc testing cho hệ thống. Adhoc testing sẽ hiệu quả hơn nếu người thực thi kiểm thử có kiến thức tốt về hệ thống đó.

  Unit Testing trong phát triển phần mềm hiện đại

  So Sánh Giữa Regression Testing Và Retesting

Thực hiện Adhoc testing hiệu quả:

* Nắm chắc nghiệp vụ

Yếu tố then chốt quyết định phần lớn hiệu quả trong Adhoc testing đó là việc người thực thi kiểm thử hiểu nghiệp vụ của hệ thống đến đâu. Do đó, khi quyết định thực hiện Adhoc testing thì cần phải chắc chắc được rằng bạn đã thông suốt về các ngõ ngách của hệ thống, ứng dụng. Điều này giúp bạn có thể dễ dàng thực hiện được những trường hợp thực tế nhất, và có thể đoán được các vùng có khả năng xảy ra lỗi nhiều nhất.

* Kiểm tra các module chính

Cần xác định các chức năng quan trọng chính của hệ thống là đối tượng tập trung của Adhoc testing. Vì sao lại thế, đơn giản thôi vì chức năng chính quan trọng chính là cái mà người dùng sẽ sử dụng và tương tác nhiều nhất, thế mà lại để lọt lỗi trên đó thì sẽ là điều khó mà chấp nhận được!

* Lưu lại các defect

Tất cả các lỗi tìm được từ Adhoc testing đều cần phải được lưu lại và gửi cho team dev để fix bug. Các lỗi hợp lệ cần được viết bổ sung và thêm vào trong bộ test case. Cái này thường là do viết test case thiếu, chưa bao phủ được các trường hợp.

Các defect tìm được này chính là những bài học kinh nghiệm, cần phải được xem xét và đánh giá nghiêm túc, rút kinh nghiệm cho các vòng test sau hay những trường hợp, sản phẩm có tính năng tương tự.

Xem thêm các vị trí tuyển Tester lương cao trên TopDev

2. Exploratory testing

Exploratory testing, bao gồm các hoạt động khám phá, tìm hiểu và học hỏi. Chủ yếu nhấn mạnh vào khả năng kiểm thử tự do, đi kèm với trách nhiệm của người kiểm thử.

Trong Exploratory testing, các test case cũng không được tạo ra khi tiến hành kiểm thử. Tuy nhiên là ta có thể ghi ra một vài ý tưởng chính sẽ được thực hiện trước khi bắt tay vào làm. Exploratory testing tập trung vào việc thăm dò khám phá ứng dụng hơn việc thực thi dựa trên các hoạt động như các loại kiểm thử khác.

* Ưu điểm

  • Loại kiểm thử này sẽ rất hữu ích trong trường hợp các tài liệu yêu cầu chưa được cung cấp đầy đủ hoặc có rất ít thông tin.
  • Liên quan đến quá trình tìm hiểu, giúp tìm ra được nhiều lỗi hơn so với các bước kiểm thử thông thường.
  • Tìm ra được các lỗi nhỏ mà có thể bị bỏ qua bởi các kỹ thuật kiểm thử khác
  • Mở rộng khả năng tưởng tượng các tình huống bằng cách thực hiện nhiều hơn các trường hợp kiểm thử.
  • Đi sâu vào các phần chức năng nhỏ nhất của ứng dụng và bao phủ được các yêu cầu chức năng
  • Loại kiểm thử này bao phủ được nhiều loại kiểm thử và nhiều loại các kịch bản và trường hợp kiểm thử khác nhau.
  • Khuyến khích sự sáng tạo và khả năng phán đoán
  • Có thể tạo ra các ý tưởng mới trong quá trình thực hiện kiểm thử.

* Nhược điểm

  • Loại kiểm thử này phụ thuộc rất nhiều vào kỹ năng của người thực hiện kiểm thử
  • Do đó, sẽ dễ bị hạn chế bởi vùng kiến thức của tester
  • Không phù hợp với dự án có nhiều thời gian cho việc thực thi kiểm thử.

Khi nào thì thực hiện Exploratory testing?

Có thể thực hiện Exploratory testing nếu như:

  • Nhóm kiểm thử có những tester nhiều kinh nghiệm
  • Early iteration is required (Dự án có yêu cầu lặp sớm)
  • Đây là một ứng dụng quan trọng
  • Hoặc có những tester mới tham gia vào nhóm.

3. So sánh nho nhỏ giữa Adhoc testing và Exploratory testing

Adhoc testing Exploratory testing
Bạn cần phải hiểu và nắm được ứng dụng trước khi thực hiện Adhoc testing. Với Exploratory testing thì bạn sẽ tìm hiểu ứng dụng trong khi thực hiện test.
Với Adhoc testing, tài liệu không phải là yếu tố quan trọng cần thiết, Adhoc testing được thực hiện bình thường mà không cần tài liệu đặc tả cụ thể nào. Ngược lại, với Exploratory testing, tài liệu là một yếu tố cần thiết để ghi lại chi tiết các thông tin trong khi thực hiện kiểm thử.
Adhoc được thực hiện để nâng cao mức độ hoàn thiện hướng tới sự hoàn hảo của việc kiểm thử ứng dụng. Exploratory testing thiên về hướng học hỏi, tìm hiểu ứng dụng hơn.
Người thực hiện Adhoc testing cần có kiến thức về quy trình thực hiện khi thực hiện kiểm thử. Với Exploratory testing thì từ đây sẽ giúp cho người thực thi có kiến thức về ứng dụng thông qua các kết quả test.

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

Xem thêm:

Xem thêm tuyển dụng việc làm IT hấp dẫn trên TopDev

Figma là gì? Top 8 tính năng tuyệt vời của Figma

Figma là gì? Khám phá những tính năng tuyệt vời của Figma

Trong thời đại kỹ thuật số, việc thiết kế UX/UI trở thành một phần không thể thiếu trong quá trình phát triển sản phẩm công nghệ. Với sự ra đời của các công cụ thiết kế việc tạo ra những giao diện đẹp mắt và dễ sử dụng đã trở nên dễ dàng hơn bao giờ hết.

Một trong những công cụ mà bạn không thể bỏ lỡ nếu muốn trở thành một UX/UI designer đó là Figma. Trong bài viết này, chúng ta sẽ tìm hiểu Figma là gì? – một trong những công cụ thiết kế giao diện đồ họa phổ biến nhất hiện nay. Chúng ta sẽ khám phá những tính năng và ưu điểm của Figma, cũng như so sánh nó với các công cụ thiết kế giao diện khác để giúp bạn chọn được công cụ phù hợp nhất cho dự án của mình. 

Figma là gì?

Figma là gì?

Figma là một công cụ thiết kế đồ họa vector có giao diện người dùng trực tuyến dựa trên nền tảng đám mây, cho phép người dùng thiết kế UX/UI, dựng prototypes, phát triển và chia sẻ các thiết kế của họ với các thành viên khác trong nhóm làm việc.

Điểm đặc biệt nhất của Figma chính là khả năng hoạt động trực tuyến, tương tự như Google Docs hay Sheet. Tại đây, nhiều người dùng có thể thao tác trực tiếp trong cùng một file ở cùng một thời điểm. Như vậy, người dùng có thể chỉnh sửa, theo dõi chỉnh sửa một cách dễ dàng và nhanh chóng, tiết kiệm thời gian gửi đi qua lại rườm rà.

Bên cạnh đó, Figma còn có tính năng tương tự như các công cụ thiết kế đồ họa khác, tương thích với cả Window và Mac OS đồng thời tích hợp nhiều chức năng cộng tác và quản lý dự án. Figma được đánh giá cao vì tính đơn giản, dễ sử dụng và khả năng làm việc nhóm hay xử lý công việc từ xa cực hiệu quả.

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

Lịch sử hình thành Figma

Figma được bắt đầu phát triển vào năm 2012 bởi Dylan Field và Evan Wallace. Ý tưởng ban đầu của họ là tạo ra một nền tảng dựa trên trình duyệt cho người dùng có thể thể hiện sự sáng tạo của họ trong nhiều cách khác nhau. Chương trình bắt đầu vào giai đoạn thử nghiệm vào cuối năm 2015 và được phát hành chính thức vào tháng 9 năm 2016. Kể từ đó, Figma đã phát hành nhiều cập nhật, đáng chú ý nhất là công cụ hợp tác và lập kế hoạch số Figjam.

Lịch sử hình thành và phát triển Figma
Lịch sử hình thành và phát triển Figma

Vào năm 2022, Figma đã hợp tác với Google for Education để đưa cả Figma và FigJam lên Chromebook trong lĩnh vực Giáo dục, cho thấy Figma có thể trở thành nền tảng mặc định cho những nhà thiết kế web trẻ đang phát triển.

Xem thêm video giới thiệu về Figma:

Khám phá những tính năng hấp dẫn của Figma

Figma được nhiều “ông lớn” trên thế giới sử dụng có thể kể đến như Twitter, Microsoft, Dropbox, GitHub,… bởi khả năng hỗ trợ công việc cực kỳ hiệu quả. Hãy cùng TopDev khám phá một số tính năng ưu việt của Figma nhé!

Đồng bộ trực tuyến, theo dõi công việc real-time

Figma cho phép người dùng thiết kế, phát triển và chia sẻ các thiết kế của họ trên nhiều thiết bị và định dạng khác nhau mà không cần phải cài đặt phần mềm đồ họa trên máy tính của mình. Mọi thay đổi trên file thiết kế sẽ được cập nhật ngay lập tức, bạn cũng có thể xem lại lịch sử chỉnh sửa một các dễ dàng.

Thêm nữa, khi có một người dùng truy cập vào phần mềm, Figma sẽ hiển thị avatar của người đó, chỉ cần bạn click vào thì lập tức sẽ chuyển đến vị trí người dùng đó đang làm việc. Tính năng này cực hữu ích giúp nhà quản lý nắm bắt được tiến độ công việc của các thành viên trong team.

theo dõi công việc real-time

Hỗ trợ lưu trữ đám mây (Cloud-based Storage)

Figma là một ứng dụng dựa trên đám mây, cho phép tất cả các dữ liệu thiết kế được lưu trữ an toàn trên internet. Điều này không chỉ giúp bảo vệ dữ liệu khỏi mất mát do sự cố phần cứng mà còn cho phép truy cập và chia sẻ dễ dàng từ bất kỳ địa điểm nào có kết nối internet. Người dùng có thể làm việc trên các dự án của mình mà không cần lo lắng về việc sao lưu dữ liệu thường xuyên hay hết dung lượng lưu trữ trên thiết bị cá nhân.

Khả năng tương thích cao

Figma hoạt động trực tiếp trên trình duyệt mà không cần cài đặt app, cho phép người dùng truy cập và làm việc từ bất kỳ đâu chỉ với kết nối internet. Điều này giúp tiết kiệm thời gian và không gian lưu trữ trên thiết bị.

Ngoài ra figma có cả bản thiết kế App cho Desktops có thể hoạt động hiệu quả trên mọi nền tảng từ Windows, MacOS cho đến Linux hay Chromebooks. Tất cả người dùng có thể thao tác, chỉnh sửa file Figma dễ dàng bằng bất cứ hệ điều hành nào. Bên cạnh đó, Figma còn cung cấp các phiên bản trên điện thoại, cho phép người dùng theo dõi các dự án của mình ở bất kỳ đâu.

Tham khảo việc làm UX/UI Design hấp dẫn trên TopDev

Thiết kế Responsive và Tích hợp Prototype

Với hỗ trợ thiết kế Responsive từ Figma, cho phép thiết kế của bạn tự động điều chỉnh phù hợp với các kích cỡ màn hình khác nhau. Ngoài ra, Figma còn cho phép thêm các yếu tố tương tác như cuộn trang, di chuột (hovering), và nhấp chuột, giúp thiết kế trở nên sống động và thực tế hơn.

Prototype là một bản mô phỏng cho sản phẩm thiết kế giúp người dùng hình dung ra được cách sản phẩm sẽ hoạt động khi hoàn thành. Thông thường, người ta sẽ thông qua một ứng dụng từ bên thứ ba để dựng Prototype, nhưng với Figma bạn hoàn toàn có thể thao tác trực tiếp trên đây cực tiện lợi và nhanh chóng.

Tích hợp Prototype

Feedback thuận tiện

Figma cho phép người dùng feedback trực tiếp trên file, các feedback này có thể theo dõi qua Email. Nhờ tính năng này bạn có thể thảo luận với team hoặc chỉnh sửa file trực tiếp khi đang họp, nhờ vậy bạn sẽ tiết kiệm được thời gian và làm việc nhóm hiệu quả hơn rất nhiều.

Kho Plugin và Template khổng lồ từ cộng đồng Figma

Cộng đồng thiết kế sử dụng Figma rất lớn và đang phát triển, với hàng loạt plugin, template và widget được tạo ra và chia sẻ bởi cộng đồng. Điều này giúp người dùng dễ dàng tìm thấy các tài nguyên và học hỏi từ các thiết kế của người khác.

Với kho tài nguyên khổng lồ này sẽ giúp người dùng xử lý các thiết kế nhanh chóng và quản lý màu sắc, hình ảnh dễ dàng hơn bao giờ hết.

Kho Plugin khổng lồ

Xuất file ảnh chất lượng cao ở nhiều định dạng

Figma cho phép xuất file ảnh ở nhiều định dạng khác nhau và vẫn đảm bảo chất lượng hình ảnh sắc nét. Thêm nữa, người dùng có thể lưu các file ảnh với định dạng PNG, SVG, JPG và thậm chí là PDF để phù hợp với các yêu cầu khác nhau của dự án.

Tính năng xuất mã (Code Exporting Features)

Figma cho phép xuất một số lượng mã (source code) từ các thiết kế, điều này giúp Developer tiết kiệm được rất nhiều thời gian, họ không phải bắt đầu với từng dòng code nữa mà giờ đây đã có sẵn mã nguồn một cách chính xác và nhanh chóng.

Figma dành cho ai?

Figma sở hữu những ưu điểm tuyệt vời và cực kỳ hữu ích cho các Designer, các nhà phát triển giao diện người dùng UX/UI. Bên cạnh đó, Figma cũng giúp việc kết nối giữa các Developer với Designer dễ dàng hơn. Figma hỗ trợ rất nhiều đối tượng khác nhau thông qua ba sản phẩm chính của mình, đáp ứng nhu cầu của nhiều người dùng trong lĩnh vực thiết kế và trình bày ý tưởng:

  1. Figma Design: Phù hợp với những người làm trong lĩnh vực thiết kế, quản lý sản phẩm, lập trình viên, và các nhà văn, giúp họ tạo, chia sẻ và kiểm thử các thiết kế cho website, ứng dụng di động và các sản phẩm kỹ thuật số khác. Nó cũng hỗ trợ bất kỳ ai liên quan đến quá trình thiết kế để đóng góp ý kiến, phản hồi và ra quyết định nhanh chóng hơn.
  2. Figma Slides: Dành cho các nhóm muốn tạo các bài thuyết trình đẹp mắt. Sản phẩm này cho phép người dùng chèn các thiết kế và nguyên mẫu từ Figma Design, hợp tác tạo và trình bày với đầy đủ công cụ. Nó cũng bao gồm các widget tương tác để thu thập phản hồi từ các bên liên quan trước khi kết thúc bài thuyết trình.
  3. FigJam: Là công cụ vẽ bảng trắng trực tuyến, cho phép mọi người tham gia vào các cuộc họp, não bộ, lập kế hoạch và nghiên cứu. FigJam rất phù hợp với việc sử dụng trong các buổi họp nhóm, lên ý tưởng, vẽ sơ đồ và lập kế hoạch.

Như vậy, Figma là một công cụ hiệu quả cho các nhóm làm việc cùng nhau trên cùng một dự án và muốn có một công cụ để trao đổi ý tưởng, phối hợp và quản lý tiến độ công việc.

Figma có miễn phí không?

Không giống như các công cụ thiết kế khác trong Adobe, Figma cho phép bạn bắt đầu sử dụng hoàn toàn miễn phí.

Tuy nhiên ở bản miễn phí, bạn chỉ được tạo 3 project có thể share public và cùng chỉnh sửa, nếu bạn muốn sử dụng thêm nhiều tính năng hơn Dev Mode đồng thời có thể chia sẻ không giới hạn collaborative design files thì có thể tham khảo pricing plan bên dưới:

Figma có miễn phí không?
Bảng giá Figma

Với tính năng miễn phí và chi phí thấp, Figma trở thành một trong những sân chơi phổ biến nhất để thiết kế giao diện và trang web.

Figma, Sketch và Adobe XD, nên chọn cái nào?

Dưới đây là bảng so sánh chi tiết giữa Figma, Sketch và Adobe XD giúp bạn lựa chọn được nền tảng phù hợp với nhu cầu sử dụng của mình:

Figma Sketch Adobe XD
Nền tảng Trình duyệt web Phần mềm Desktop và cả trình duyệt Phần mềm Desktop và App trên điện thoại
Hệ điều hành MacOS, Windows, Linux MacOS MacOS, Windows, Android, iOS
Cộng tác Thời gian thực Chỉ cộng tác thời gian thực khi người dùng mua bản quyền Sketch Chỉ cộng tác thời gian thực trên các dự án được đồng bộ hóa trên cloud
Khả năng làm việc offline Không thể
Tính năng tạo Prototype Ở mức cơ bản Ở mức cơ bản Tốt nhất trong cả 3
Giá cả Miễn phí cho gói Starter, từ $12/tháng cho phiên bản chuyên nghiệp $99/năm, cập nhật trong 1 năm

$8.25/tháng/người với gói team 

Miễn phí cho người mới bắt đầu

$24/tháng cho gói team

Cả ba công cụ đều là các phần mềm thiết kế giao diện người dùng và có những tính năng tương đồng nhau. Tuy nhiên, Figma được đánh giá cao hơn bởi tính linh hoạt với khả năng hoạt động trên nhiều nền tảng và cho phép truy cập qua trình duyệt web, cũng như khả năng cộng tác và chia sẻ một cách dễ dàng. Sketch thường được ưa chuộng bởi người dùng Mac và có các plugin hữu ích, trong khi Adobe XD cung cấp các tính năng tuyệt vời cho prototype và animation. Tùy vào nhu cầu và sở thích của người dùng, mỗi công cụ đều có điểm mạnh và yếu khác nhau.

Cách đăng kí và sử dụng Figma cho người mới

Bước 1: Truy cập trang web của Figma

Mở trình duyệt web của bạn và truy cập trang chủ của Figma tại https://www.figma.com.

Bước 2: Đăng ký tài khoản

  • Bấm vào nút “Sign up” hoặc “Get started” trên trang chủ.
  • Bạn có thể chọn đăng ký bằng email hoặc sử dụng tài khoản Google để đăng nhập nhanh.
  • Nếu bạn chọn đăng ký bằng email, bạn sẽ cần cung cấp tên của mình, địa chỉ email, và tạo một mật khẩu.

Đăng kí tài khoản Figma
Đăng kí tài khoản Figma

Bước 3: Xác nhận tài khoản

  • Sau khi đăng ký, Figma sẽ gửi một email xác nhận đến địa chỉ email mà bạn đã cung cấp.
  • Mở email và bấm vào liên kết xác nhận để hoàn tất quá trình đăng ký.

Bước 4: Đăng nhập và bắt đầu sử dụng

  • Sau khi xác nhận email, đăng nhập vào tài khoản Figma của bạn.
  • Bạn sẽ được đưa đến giao diện chính của Figma, nơi bạn có thể bắt đầu tạo dự án mới hoặc mở một dự án hiện có.

Bước 5: Tạo và quản lý dự án

  • Để tạo dự án mới, bấm vào “New Design File” từ giao diện chính.
  • Màn hình thiết kế sẽ hiện ra, từ đây bạn có thể thỏa thích thiết kế, ngoài ra Figma cũng cung cấp các mẫu sẵn có để bạn có thể bắt đầu một cách nhanh chóng.

Tóm lại

Figma – một trong những công cụ thiết kế giao diện đồ họa hàng đầu hiện nay đã giúp cho quá trình thiết kế giao diện trở nên dễ dàng và tiện lợi hơn bao giờ hết. Với những tính năng nổi bật như khả năng hoạt động trên nhiều nền tảng, tính năng tương tác trong thời gian thực và kho plugin khổng lồ, Figma đang trở thành công cụ thiết kế giao diện đồ họa được ưa chuộng và được sử dụng rộng rãi trên toàn thế giới.

TopDev hy vọng bài viết này đã giúp bạn hiểu rõ hơn về Figma cũng như so sánh với các công cụ thiết kế giao diện khác để giúp bạn có sự lựa chọn tốt nhất cho dự án của mình. Hãy bắt đầu sử dụng Figma và khám phá những tính năng tuyệt vời từ công cụ sáng tạo này nhé!

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

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

Có nên sử dụng thư viện bên thứ 3 trong dự án?

Có nên sử dụng thư viện bên thứ 3 trong dự án?

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

Chào các bạn,

Các dự án phần mềm ngày nay thường được tích hợp rất nhiều các thư viện bên thứ 3. Một phần vì chúng quá tốt, một phần vì các developer ngày càng… lười code. Mặc dù không phủ nhận được việc tích hợp thư viện bên thứ 3 giúp chúng ta tiết kiệm được một lượng lớn thời gian để code và debug, nhưng bên cạnh đó việc làm này cũng tiềm ẩn nhiều rủi ro cho dự án. Rủi ro thế nào thì mời các bạn cùng lắng nghe quan điểm của mình nhé.

I. Thư viện bên thứ 3 là gì?

Giải thích một chút.

Thư viện bên thứ 3 trong bài viết này là ý chỉ những thư viện được phát triển bởi một bên khác, nhưng bạn lại mang về sử dụng. Trong lập trình web php, một số thư viện bên thứ 3 nổi tiếng có thể kể đến như: PhpmailerPHPExcelDdoctrine,… chẳng hạn.

II. Nhược điểm của việc thường xuyên sử dụng thư viện bên thứ 3

2.1 Không có gì là mãi mãi

Không có gì đảm bảo thư viện thứ 3 mà bạn đang tích hợp sẽ được duy trì mãi mãi, nó có thể “chết” bất cứ lúc nào. Đồng ý rằng điều này rất khó xảy ra ở các thư viện được nhiều người sử dụng vì không có người này thì sẽ có người kia duy trì. Tuy nhiên lại xảy ra như cơm bữa đối với các thư viện ít người dùng.

Bản thân mình đã từng gặp trường hợp này 2 lần, chính tác giả của thư viện đó còn để lại một dòng nhắn nhủ “thư viện đã dừng hỗ trợ, vui lòng thử thư viện khác thay thế” – thật đáng buồn.

  Một số test automation framework thường gặp

2.2 Khó kiểm soát

Thông thường các công cụ quản lý gói như composer, npm sẽ thay chúng ta kiểm soát các thư viện. Tuy nhiên việc kiểm soát chỉ có hiệu quả khi tác giả của thư viện tuân theo đúng quy tắc và không bao giờ bị nhầm lẫn.

Ví dụ một thư viện chỉ chạy được trên phiên bản PHP 7.0, nhưng tác giả lại “lỡ tay” để cấu hình phiên bản PHP tối thiểu là 5.0. Điều này khiến các sản phẩm chạy trên php 5.0 có thể không hoạt động. Việc nhầm lẫn tưởng chừng như “đùa” này thực tế vẫn xảy ra, mình đã gặp 1 lần (có thể do số mình đen) và chứng kiến một số trường hợp trên khác qua các github issue.

Việc khó kiểm soát system requirements như ví dụ trên đã đủ làm dự án bị “chao đảo”. Đó là còn chưa kể tới việc chúng ta rất khó kiểm soát được bên trong thư viện đó viết gì, có gặp phải lỗi nghiêm trọng nào không, thuật toán xử lý có tối ưu không, có gắn code đào bitcoin hay không,…

  TOP 10 Web Framework tốt nhất, đáng dùng nhất – Phần 2

2.3 Cồng kềnh

Một thư viện được viết ra để giải quyết nhiều bài toán chứ không riêng gì bài toán của bạn, vì vậy nó thường hỗ trợ nhiều tính năng “thừa” mà có thể bạn chẳng bao giờ dùng tới. Điều này vô tình làm cho source code dự án của bạn càng ngày càng phình to.

Nếu như bạn cảm thấy việc source phình to không phải là vấn đề vì server của bạn unlimited dung lượng, vậy thì việc làm giảm hiệu năng của dự án có làm bạn lo lắng? Đúng vậy, vì một thư viện có thể giải quyết nhiều trường hợp nên “dữ liệu đầu vào” của bạn cũng sẽ phải đi qua nhiều logic hơn trước khi nó được “chế biến” thành kết quả mong muốn. Điều này chắc chắn sẽ ảnh hưởng tới hiệu năng của sản phẩm.

Bạn cần biết rằng có rất nhiều doanh nghiệp chi không ít tiền chỉ hệ thống của họ chạy nhanh hơn 0.1s.

2.4 Làm “teo não” của các developer

Việc thường xuyên tích hợp thư viện bên thứ 3 vô tình tạo nên thói quen lười suy nghĩ cho developer. Thậm chí mình từng nghe thấy có người nói rằng “Trước khi làm tính năng gì đó, hãy search thư viện trước, nếu có thì mang về dùng luôn cho tiện“.

Thói quen này khiến chúng ta trở nên thụ động, bị phụ thuộc vào người tạo ra thư viện và hạn chế khả năng tư duy của bản thân. Về lâu về dài, đây chính là nguyên sẽ giết chết bạn trên con đường sự nghiệp.

2.5 Tưởng chừng tiết kiệm thời gian mà lại chẳng phải

Lợi ích lớn nhất của việc sử dụng thư viện là để tiết kiệm thời gian, nhưng đôi khi lại ngược lại – càng dùng thư viện càng tốn thời gian. Tại sao lại vậy ưu? Bởi vì bạn sẽ phải tốn thời gian để đọc tài liệu sử dụng, tốn thời gian để xem cộng đồng nói gì về nó, tốn thời gian để nghiên cứu nó có thật sự giải quyết được vấn đề của bạn, hoặc tốn thời gian để debug chính cái thư viện đó… Bằng từng ấy thời gian nếu bạn tự code thì có khi đã xong lâu rồi.

III. Kết luận

Qua loạt phân tích trên, vậy thì Có nên sử dụng thư viện bên thứ 3 trong dự án? Câu trả lời của mình là nhưng phải chọn lọc. Bởi nếu không sử dụng thì chúng ta sẽ bỏ qua một nguồn tài nguyên to lớn, thậm chí nhiều ngôn ngữ lập trình, hay framework, opensouce thì nhiều thư viện còn là một lợi thế. Nhưng nếu cứ sử dụng tùy tiện, bừa bãi thì sẽ có ngày bạn nhận hậu quả.

Bạn sẽ thấm hơn nhiều nếu sản phẩm đang chạy trên production bị ngưng hoạt động chỉ vì bạn vừa update thư viện sáng nay.

Sau nhiều lần số đen, mình đã rút ra kinh nghiệm Cái gì mình control được, thì cứ control vẫn hơn là phụ thuộc vào một thằng khác.

Bài viết được viết dựa trên góc nhìn cá nhân, rất mong nhận được góp ý của các bạn.

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

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

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