Home Blog Page 50

Functional Interface là gì? Functional Interface API trong Java 8

Functional Interface là gì? Functional Interface API trong Java 8

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

1.  Functional Interface là gì?

Functional Interface là interface có duy nhất 1 method trừu tượng (có thể có thêm các method không trừu tượng bằng từ khóa default trong Java 8)
Ví dụ: Comparable  là 1 Functional Interface với method trừu tượng duy nhấtcompareToRunnable là 1 Functional Interface với method trừu tượng duy nhất run

Về annotation @FunctionalInterface: nó được dùng ở trước mỗi interface để khai báo đây là 1 functional interface.

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

Việc dùng annotation @FunctionalInterface là không bắt buộc nhưng nó giúp đảm bảo cho quá trình compile. Ví dụ bạn khai báo @FunctionalInterface nhưng trong interface lại có nhiều hơn 2 method trừu tượng thì nó sẽ báo lỗi.

  Giới thiệu về GraphQL. Cách giải quyết những hạn chế của RESTful API

  Refactoring Design Pattern với tính năng mới trong Java 8

2. Functional Interface API trong Java 8

Java 8 xây dựng sẵn một số functional interface và nó được dùng nhiều trong các biểu thức lambda:

2.1. java.util.function.Consumer

package java.util.function;

import java.util.Objects;

@FunctionalInterface
public interface Consumer<T> {

    // Phương thức chấp nhận một tham số đầu vào
    // và không trả về gì cả.
    void accept(T t);

}

consumer thường được dùng với list, stream để xử lý với các phần tử bên trong.

Ví dụ: đoạn code dưới đây in ra tất cả các giá trị của 1 list

List<String> list = Arrays.asList("stack", "java", "stackjava.com");

// Sử dụng List.forEach(Consumer) để in ra giá trị của các phần tử trong list
list.forEach(new Consumer<String>() {
  @Override
  public void accept(String t) {
    System.out.println(t);
  }
});
System.out.println("----------------");

// Sử dụng List.forEach(Consumer) với cú pháp lambda expression:
list.forEach(t -> System.out.println(t));

Kết quả:

stack
java
stackjava.com
----------------
stack
java
stackjava.com

Xem thêm nhiều việc làm Java lương cao trên TopDev

2.2. java.util.function.Predicate

package java.util.function;

import java.util.Objects;

@FunctionalInterface
public interface Predicate<T> {

    // Kiểm tra một tham số đầu vào và trả về true hoặc false.
    boolean test(T t);

}

predicate thường được dùng với list, stream để kiểm tra từng phần tử lúc xóa, lọc…

Ví dụ: đoạn code dưới đây xóa bỏ tất cả các số âm khỏi 1 ArrayList<Integer>

List<Integer> list = new ArrayList<>();
list.add(-1);
list.add(1);
list.add(0);
list.add(-2);
list.add(3);

// lệnh removeIf sẽ thực hiện duyệt từng phần tử,
// nếu method test của Predicate trả về true thì sẽ remove phần tử đó khỏi list
list.removeIf(new Predicate<Integer>() {
  @Override
  public boolean test(Integer t) {
    return t < 0;
  }
});
list.forEach(t -> System.out.println(t));
System.out.println("-----------------------------");

// Sử dụng Predicate với cú pháp Lambda Expression
// loại bỏ các phần tử lớn hơn 1
list.removeIf(t -> t > 1);
list.forEach(t -> System.out.println(t));
Kết quả:
1
0
3
-----------------------------
1
0

2.3. java.util.function.Function

package java.util.function;

import java.util.Objects;


@FunctionalInterface
public interface Function<T, R> {

    // Method này nhận đầu vào là 1 tham số và trả về một giá trị.
    R apply(T t);

}

Function thường dùng với Stream khi muốn thay đổi giá trị cho từng phần tử trong stream.

Ví dụ: đoạn code dưới đây thực hiện chuyển các phần phần tử kiểu string trong 1 stream thành chữ in hoa/thường:

List<String> list = Arrays.asList("stack", "JAVA", "demo", "Function");
Stream<String> stream = list.stream();

// chuyển tất cả các phần tử của stream thành chữ in hoa

stream.map(new Function<String, String>() {
  @Override
  public String apply(String t) {
    return t.toUpperCase();
  }
}).forEach(t -> System.out.println(t));
System.out.println("---------------");
// Function với cú pháp Lambda Expression
// chuyển tất cả các phần tử của stream thành chữ thường

stream = list.stream();// lưu ý là stream ko thể dùng lại nên phải khởi tạo lại
stream.map(t -> t.toLowerCase()).forEach(t -> System.out.println(t));

Kết quả:

STACK
JAVA
DEMO
FUNCTION
---------------
stack
java
demo
function

Một số Function interface tương tự:

  • java.util.function.IntFunction<R>: dữ liệu chuyển về kiểu Integer
  • java.util.function.DoubleFunction<R>: dữ liệu chuyển về kiểu Double
  • java.util.function.LongFunction<R>: dữ liệu chuyển về kiểu Long

2.4. java.util.function.Supplier

package java.util.function;

@FunctionalInterface
public interface Supplier<T> {

    // method này không có tham số nhưng trả về một kết quả.
    T get();

}

Ví dụ: đoạn code dưới đây tạo ra 1 list gồm 10 số 1 cách random:

Random random = new Random();
Stream<Integer> stream = Stream.generate(new Supplier<Integer>() {
  @Override
  public Integer get() {
    return random.nextInt(10);
  }
}).limit(5);

stream.forEach(t -> System.out.print(t +" "));
System.out.println("\n--------------------");

// Sử dụng Supplier với cú pháp Lambda Expression:
stream = Stream.generate(() -> random.nextInt(10)).limit(5);
stream.forEach(t -> System.out.print(t +" "));

Kết quả:

4 9 8 5 8
--------------------
2 2 9 9 6

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

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

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

Làm thế nào tạo instance của một class mà không gọi từ khóa new?

Làm thế nào tạo instance của một class mà không gọi từ khóa new?

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

Như đã biết, trong Java để khởi tạo một instance của một class chúng ta sẽ sử dụng từ khóa new. Tuy nhiên, trong một số trường hợp chúng ta cần tạo một instance khi chỉ biết tên class hoặc private constructor hoặc không biết được số lượng tham số của constructor,… Với những trường hợp như vậy, chúng ta không thể gọi từ khóa new một cách trực tiếp mà sẽ sử dụng một số cách đặc biệt và chúng ta sẽ cùng tìm hiểu các cách giải quyết vấn đề này trong phần tiếp theo của bài viết.

Sử dụng Reflection khi biết tên class

Một trong những cách đơn giản và thường được sử dụng để tạo instance của một class là sử dụng kỹ thuật Reflection. Nếu bạn chưa biết về Reflection, hãy dành chút thời gian xem lại bài viết Hướng dẫn sử dụng Java Reflection.

Sử dụng newInstance() khi class có constructor không có tham số và phạm vi truy cập không phải private

package com.gpcoder.instance;

public class Employee {

    private int id;

    private String name;

    public Employee() {
        super();
    }

    public Employee(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

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

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Employee [id=" + id + ", name=" + name + "]";
    }
}

Tạo instance sử dụng newInstance():

package com.gpcoder.instance;

import java.lang.reflect.InvocationTargetException;

public class NewInstanceExample {

    public static void main(String[] args)
            throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException,
            InvocationTargetException, NoSuchMethodException, SecurityException {

        // Get class based on the given class name
        Class<?> clazz = Class.forName("com.gpcoder.instance.Employee");

        // Create a new instance with empty argument of constructor of a class
        Employee employee = (Employee) clazz.newInstance();
        employee.setId(1);
        employee.setName("gpcoder");
        System.out.println("employee: " + employee);
    }
}

Lưu ý:

  • Nếu không tồn tại constructor không có tham số, chương trình sẽ throw ra một exception như sau:
Exception in thread "main" java.lang.InstantiationException: com.gpcoder.instance.Employee
    at java.lang.Class.newInstance(Class.java:427)
    at com.gpcoder.instance.NewInstanceExample.main(NewInstanceExample.java:15)
Caused by: java.lang.NoSuchMethodException: com.gpcoder.instance.Employee.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.newInstance(Class.java:412)
    ... 1 more
  • Nếu constructor không tham số có phạm vi truy cập là private, chương trình sẽ throw ra exception sau:
Exception in thread "main" java.lang.IllegalAccessException: Class com.gpcoder.instance.NewInstanceExample can not access a member of class com.gpcoder.instance.Employee with modifiers "private"
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
    at java.lang.Class.newInstance(Class.java:436)
    at com.gpcoder.instance.NewInstanceExample.main(NewInstanceExample.java:15)

  Ngắm và bắn với thuộc tính watch trong Vue instance

  Toán tử instanceof trong Java

Sử dụng getConstructor() khi constructor của class là public

Chúng ta sẽ tạo instance của class Employee sử dụng phương thức getConstructor():

package com.gpcoder.instance;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ConstructorNewInstanceExample {

    public static void main(String[] args)
            throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException,
            InvocationTargetException, NoSuchMethodException, SecurityException {

        // Get class based on the given class name
        Class<?> clazz = Class.forName("com.gpcoder.instance.Employee");

        // Get all constructor of the class
        Constructor<?>[] allConstructors = clazz.getConstructors();
        for (Constructor<?> constructor : allConstructors) {
            Class<?>[] parameters = constructor.getParameterTypes();
            if (parameters.length == 0) {
               // Create a new instance without parameter
               Employee employee1 = (Employee) constructor.newInstance();
               employee1.setId(1);
               employee1.setName("gpcoder 1");
               System.out.println("employee1: " + employee1);
            } else if (parameters.length == 2) {
               // Create a new instance with two parameters
               Employee employee2 = (Employee) constructor.newInstance(2, "gpcoder 2");
               System.out.println("employee2: " + employee2);
            }
        }

        // Create a new instance with specific constructor of class
        Constructor<?> constructor = clazz.getConstructor(int.class, String.class);
        Employee employee3 = (Employee) constructor.newInstance(3, "gpcoder 3");
        System.out.println("employee3: " + employee3);
    }
}

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

employee1: Employee [id=1, name=gpcoder 1]
employee2: Employee [id=2, name=gpcoder 2]
employee3: Employee [id=3, name=gpcoder 3]

Cập nhật việc làm Java đãi ngộ hấp dẫn trên TopDev

Sử dụng getDeclaredConstructor() khi constructor của class là private

Ví dụ:

package com.gpcoder.instance;

public class PrivateEmployee {

    private int id;

    private String name;

    private PrivateEmployee(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "PrivateEmployee [id=" + id + ", name=" + name + "]";
    }
}

Sử dụng getDeclaredConstructor() khi các constructor của class là private:

package com.gpcoder.instance;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class PrivateConstructorNewInstanceExample {

    public static void main(String[] args)
            throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException,
            InvocationTargetException, NoSuchMethodException, SecurityException {

        // Get class based on the given class name
        Class<?> clazz = Class.forName("com.gpcoder.instance.PrivateEmployee");

        // Get the private constructor.
        Constructor<?> constructor = clazz.getDeclaredConstructor(int.class, String.class);

        // Since it is private, make it accessible.
        constructor.setAccessible(true);

        // Create a new instance with specific constructor of class
        PrivateEmployee employee = (PrivateEmployee) constructor.newInstance(1, "gpcoder");
        System.out.println("employee: " + employee);
    }
}

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

employee: PrivateEmployee [id=1, name=gpcoder]

Sử dụng Object.clone() để tạo một instance từ một instance khác

Để sử dụng phương thức clone(), class cần implement interface java.lang.Cloneable và override phương thức clone(). Chi tiết các bạn xem lại bài viết Object cloning trong java.

package com.gpcoder.instance;

public class Programer implements Cloneable {

    private int id;

    private String name;

    public Programer(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    protected Programer clone() throws CloneNotSupportedException {
        return (Programer) super.clone();
    }

    @Override
    public String toString() {
        return "Programer [id=" + id + ", name=" + name + "]";
    }
}

Tạo new instance từ clone()

package com.gpcoder.instance;

public class CloneExample {

    public static void main(String[] args) throws CloneNotSupportedException {
        Programer obj1 = new Programer(1, "gpcoder");
        Programer obj2 = obj1.clone();
        obj2.setName(obj2.getName().toUpperCase());

        System.out.println(obj1);
        System.out.println(obj2);
    }
}

Output chương trình:

Programer [id=1, name=gpcoder]
Programer [id=1, name=GPCODER]

Tạo new instance sử dụng serialization và deserialization

Chúng ta có thể tạo một instance cho một class bằng cách sử dụng Deserialization từ một data object đã được Serialization. Khi sử dụng deserialization, JVM sẽ không sử dụng bất kỳ constructor nào để tạo instance. Chi tiết các bạn xem lại bài viết Serialization và Deserialization trong java.

Giả sử chúng ta cần tạo instance cho class sau:

package com.gpcoder.instance;

import java.io.Serializable;

public class StudentSerializable implements Serializable {

    private static final long serialVersionUID = 1427461703707854023L;

    private int id;
    private String name;

    public StudentSerializable(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "StudentSerializable [id=" + id + ", name=" + name + "]";
    }
}

Bây giờ chúng ta sẽ tạo một đối tượng đã được Serialize và lưu vào một nơi nào đó (có thể lưu trữ ở một nơi nào đó tách biệt hoặc nhận từ một service khác). Sau đó, chúng ta đọc file này và tạo instance sử dụng Deserialize.

package com.gpcoder.instance;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class DeserializationNewInstanceExample {

    public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, IOException {
        File file = File.createTempFile("student", "txt");
        serialize(file);
        deserialize(file);
    }

    private static void serialize(File file) throws FileNotFoundException, IOException, ClassNotFoundException {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))) {
            StudentSerializable student = new StudentSerializable(1, "gpcoder");
            oos.writeObject(student);
            oos.flush();
            System.out.println("Serialized");
        }
    }

    private static void deserialize(File file) throws FileNotFoundException, IOException, ClassNotFoundException {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
            StudentSerializable student = (StudentSerializable) ois.readObject();
            System.out.println(student);
            System.out.println("Deserialized");
        }
    }
}

Output chương trình:

Serialized
StudentSerializable [id=1, name=gpcoder]
Deserialized

Sử dụng thư viện Objenesis

Objenesis là gì?

Một số hạn chế của các cách ở trên:

  • Với phương thức Class.newInstance(), class của chúng ta bắt buộc phải có constructor không có tham số.
  • Với Class.getDeclaredConstructor() hoặc Class.getConstructor(), chúng ta phải xác định chính xác số lượng tham số và kiểu dữ liệu của từng tham số.
  • Với Object.clone(), class của chúng ta phải implement một interface Clonable.
  • Với serialization và deserialization, class của chúng ta phải implement một interface Serializable.

Ngoài ra, một số trường hợp chúng ta có thể gặp phải khi tạo instance thông qua constructor như:

  • Trong constructor có throw exception, chẳng hạn private constructor của singleton hay util class có thể throw exception trực tiếp trong constructor.
  • Trong constructor gọi rất nhiều xử lý khác, nó làm chậm quá trình khởi tạo instance và chúng ta cũng không cần dữ liệu khởi tạo đó.

Để có thể tạo một instance cho một class mà không gặp bất kỳ hạn chế trên, chúng ta có thể sử dụng thư viện Objenesis.

Objenesis là một thư viện mã nguồn mở của Java, nó được sử dụng để tạo instance của một class đặc biệt mà không thông qua constructor.

Cài đặt Objenesis

Thêm thư viện Objenesis vào project vào project maven:

<!-- https://mvnrepository.com/artifact/org.objenesis/objenesis -->
        <dependency>
            <groupId>org.objenesis</groupId>
            <artifactId>objenesis</artifactId>
            <version>3.0.1</version>
        </dependency>

Ví dụ sử dụng Objenesis

Giả sử chúng ta có một class có constructor là private và trong constructor này có throw một exception.

package com.gpcoder.instance;

public class ProductFactory {

    private ProductFactory() {
        throw new UnsupportedOperationException("Cannot call the contructor directly");
    }

    public void doSomething(String factory) {
        System.out.println("Working on " + factory);
    }
}

Như bạn thấy, với những cách đã giới thiệu ở trên chúng ta không thể khởi tạo được instance của class này. Bây giờ hãy xem cách sử dụng Objenesis:

package com.gpcoder.instance;

import org.objenesis.Objenesis;
import org.objenesis.ObjenesisStd;
import org.objenesis.instantiator.ObjectInstantiator;

public class ObjenesisExample {

    public static void main(String[] args) {
        // Step 1: Create objenesis
        Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerializer

        // Step 2: Create instantiator with the specific ProductFactory type
        // Try to reuse the ObjectInstantiator objects as much as possible to improve performance
        // It can be shared between multiple threads and used concurrently
        ObjectInstantiator<?> instantiator = objenesis.getInstantiatorOf(ProductFactory.class);

        // Step 3: Create new instance of the ProductFactory type
        ProductFactory productFactory1 = (ProductFactory) instantiator.newInstance();
        ProductFactory productFactory2 = (ProductFactory) instantiator.newInstance();
        ProductFactory productFactory3 = (ProductFactory) instantiator.newInstance();

        // Step 4: Use the instances
        System.out.println("productFactory1: " + productFactory1);
        System.out.println("productFactory2: " + productFactory2);
        System.out.println("productFactory3: " + productFactory3);

        productFactory1.doSomething("factory1");
        productFactory2.doSomething("factory2");
        productFactory3.doSomething("factory3");
    }
}

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

productFactory1: com.gpcoder.instance.ProductFactory@5cad8086
productFactory2: com.gpcoder.instance.ProductFactory@6e0be858
productFactory3: com.gpcoder.instance.ProductFactory@61bbe9ba
Working on factory1
Working on factory2
Working on factory3

Lưu ý: Do Objenesis khởi tạo đối tượng không thông qua constructor nên các giá trị khởi tạo trong constructor sẽ không tồn tại. Do đó, chúng ta cần gán lại các giá trị cho đối tượng trước khi gọi các phương thức của nó.

Ví dụ chúng ta có một class Document. Class này ban đầu chỉ chứa thông tin về document. Sau đó, hệ thống cần xuất dữ liệu document ra file và mỗi loại document có cách xuất dữ liệu/ biểu mẫu khác nhau. Do đó, chúng ta thêm một field className để lưu thông tin tên concrete class. Chúng ta có cấu trúc như sau:

objenesis-example

Code chương trình:

Document.java

package com.gpcoder.instance.objenesis;

public class Document {

    private String title;
    private String author;
    private String className;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }
}

SelfDocumentGenerable.java

package com.gpcoder.instance.objenesis;

public abstract class SelfDocumentGenerable extends Document {

    public abstract void generateFile();
}

Concrete1SelfDocumentGenerable.java

package com.gpcoder.instance.objenesis;

import java.util.Date;

public class Concrete1SelfDocumentGenerable extends SelfDocumentGenerable {

    private Date createdDate;

    public Concrete1SelfDocumentGenerable(String title, String author, Date createdDate) {
        setTitle(title);
        setAuthor(author);
        this.createdDate = createdDate;
    }

    @Override
    public void generateFile() {
        System.out.printf("Concrete1: %s - %s\n", getTitle(), getAuthor());
    }
}

Concrete2SelfDocumentGenerable.java

package com.gpcoder.instance.objenesis;

public class Concrete2SelfDocumentGenerable extends SelfDocumentGenerable {

    public Concrete2SelfDocumentGenerable(String title, String author) {
        setTitle(title);
        setAuthor(author);
    }

    @Override
    public void generateFile() {
        System.out.printf("Concrete2: %s - %s\n", getTitle(), getAuthor());
    }
}

Như bạn thấy, mỗi concrete class có constructor với các tham số khác nhau, chúng ta không thể gọi từ khóa new một cách trực tiếp, không thể gọi phương thức newInstance() do không chắc chắn các concrete class có constructor không tham số hay không và cũng không thể xác định chính xác các tham số của constructor nên không thể sử dụng getConstructor(). Trường hợp này, chúng ta sẽ sử dụng Objenesis để tạo instance.

Do Objenesis tạo instance không thông qua constructor nên chúng ta phải gán lại các giá trị title và author cho phương thức generateFile() sử dụng.

DocumentGenerator.java

package com.gpcoder.instance.objenesis;

import org.objenesis.Objenesis;
import org.objenesis.ObjenesisStd;
import org.objenesis.instantiator.ObjectInstantiator;

public class DocumentGenerator {

    public static void generate(Document document) throws ClassNotFoundException {
        Objenesis objenesis = new ObjenesisStd();
        Class<?> clazz = Class.forName(document.getClassName());
        ObjectInstantiator<?> instantiator = objenesis.getInstantiatorOf(clazz);
        SelfDocumentGenerable selfDocumentGenerable = (SelfDocumentGenerable) instantiator.newInstance();
        copyProperties(document, selfDocumentGenerable);
        selfDocumentGenerable.generateFile();
    }

    private static void copyProperties(Document src, Document target) {
        target.setTitle(src.getTitle());
        target.setAuthor(src.getAuthor());
    }
}

ObjenesisDocumentGeneratorExample.java

package com.gpcoder.instance.objenesis;

public class ObjenesisDocumentGeneratorExample {

    public static void main(String[] args) throws ClassNotFoundException {
        Document document = new Document();
        document.setTitle("Doc1");
        document.setAuthor("gpcoder1");
        document.setClassName(Concrete1SelfDocumentGenerable.class.getCanonicalName());
        DocumentGenerator.generate(document);

        document = new Document();
        document.setTitle("Doc2");
        document.setAuthor("gpcoder2");
        document.setClassName(Concrete2SelfDocumentGenerable.class.getCanonicalName());
        DocumentGenerator.generate(document);
    }
}

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

Concrete1: Doc1 - gpcoder1
Concrete2: Doc2 - gpcoder2

Session, Cookie, Storage đơn giản mà dễ hiểu

Session, Cookie, Storage đơn giản mà dễ hiểu

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

Session, Cookie, Storage

Nhìn cái ảnh trên là thấy đơn giản mà dễ hiểu rồi đúng ko?

Tất nhiên không thể kết thúc bài viết ở đây được rồi. Giải thích chi tiết 1 chút nhé các bạn.

Thấy cái dòng đỏ đỏ ở giữa hình trên ko? Http is stateless – dịch ra nghĩa là “như lần đầu gặp gỡ” (hình như tên phim bộ của Tung Của), http vốn dĩ được mở khi client yêu cầu (request) gì đó đối với server, xong xuôi là ổng đóng luôn khi trả về response. Server thì cùng lúc phục vụ cả trăm nghìn thằng client => thế cho nên không thể trông cậy được vào thằng http để biết được client là thằng nào. Ví dụ ông vừa login vào Facebook => ông tiếp tục yêu cầu đăng bài post mới thì sao tôi biết được ông là thằng nào, chả nhẽ lại gửi tiếp username/password lên lần nữa. Méo ổn đúng không.

Vì đó session và cookie ra đời.

Session là phiên làm việc, được mở đầu khi bạn bắt đầu vào trang web đó, kéo dài trong suốt quá trình sử dụng đến khi bạn tắt web, tắt trình duyệt hoặc mất điện (tất nhiên là session còn phụ thuộc vào logic của dev làm ra cái web đó quy định, nhưng cơ bản là vậy).

Trên server để ông ý biết được request gửi từ client đến là của bà client nào thì trong cái request đầu tiên (dễ hình dung thì là lúc đăng nhập), ông ý sẽ tạo ra 1 cái gọi là session id (đoạn mã dài dài trên hình ấy), lưu vào phía server; rồi ổng sẽ tạo cookie lưu ở phía client chứa thông tin về cái bà client kia. Từ lần gửi request sau, bà client sẽ gửi cái session id ấy lên cho ông server biết bà ý là bà nào, cứ thế mà phục vụ cho tử tế nhé.

  Session là gì? Cookie là gì?

Trên lý thuyết mà nói thì chỉ cần ông server biết bà client là ai thôi, chứ bà client thì bà cần gì lưu lại thông tin; nên cần gì Cookie đúng ko? Thật ra thì bài toán không đơn giản như vậy. Ông server phục vụ 1 lúc trả chục, cả trăm, có khi có nghìn bà, nên ông ý không thể cứ đi mò trong đống sổ sách giấy tờ (database) để lấy thông tin cơ bản về tên tuổi địa chỉ của từng bà khi có yêu cầu được. Nên là những thông tin dùng đi dùng lại nhiều, hoặc là lịch sử bà ý đã xem gì, ăn gì, uống gì, bấm nút nào cũng sẽ được lưu vào cookie; giảm bớt cho ông server đi.

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

Cookie không chỉ sinh ra bởi server của website mà bạn truy cập, nó còn từ 1 thư viện bên thứ 3 mà server đó sử dụng.

Ví dụ bạn vào shopee tìm đồng hồ, ông google quảng cáo trong shopee lưu lại thông tin vào cookie là: “thằng này nó kiếm đồng hồ nè”, xong đó bạn tắt shopee đi rồi vào facebook. Ông facebook lại cũng sử dụng quảng cáo của google, lúc đó thằng google nó lại đọc được từ cookie đã lưu trước đó thì biết là thằng này vừa kiếm đồng hồ, thế là nó lại hiển thị quảng cáo đồng hồ. Lưu ý ở đây google quảng cáo là 1 bên thứ 3 chứ không phải là server của website bạn vừa vào. Vì vậy đừng ngạc nhiên nhé!

Tại sao giờ session lại ít được nói đến hơn.

Thật ra cũng không hẳn là ít hơn, mà do xu thế sử dụng token JWT React Single Application Web App, … và nhiều phương thức khác nên Session ít dùng hơn (nhất là với JS). Cookie thì vẫn được dùng để lưu thông tin phía client, hoặc lưu access token, refresh token. Bạn cũng có thể sử dụng localstorage để lưu. Cũng nên phân biết khái niệm session storage và session, vì session storage là lưu ở client nhé, méo liên quan gì phía server đâu.

  Đánh cắp Cookie bằng cách lợi dụng lỗi bảo mật XSS

3 thằng này đều phía client nhé, dùng để lưu các thông tin của bà client như đã nói ở trên. Phân biệt cũng đơn giản thôi.

Localstorage chả liên quan gì đến session cả, nên không có tự xóa được.

Cookie thì được cái là cả phía client và phía server đều đọc được, và nó có thể được thiết lập ở phía browser thời gian lưu trữ

Sessionstorage kết hợp 2 thằng trên lại, chỉ dùng trong phiên làm việc nhưng cũng chỉ đọc ở phía client.

Ngoài các ý trên thì còn 1 số yếu tố liên quan đến bộ nhớ, bảo mật nữa. Cụ thể mọi người có thể xem thêm dưới ảnh

LocalStorage, Session Storage và Cookie

Tài liệu về Session và Cookie thì nhiều lắm, nhưng trên là những ý mà mình hiểu. Bản thân trong các dự án mình tham gia không sử dụng nhiều với session và cookie lắm, hoặc có thì chỉ setup đơn giản, mọi người có thấy sai sót gì thì thông báo nhé.

Cảm ơn mọi người!

Bài viết gốc được đăng tải tại anywayblogs.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 Java Design Pattern – Intercepting Filter

Hướng dẫn Java Design Pattern – Intercepting Filter

Intercepting Filter Pattern là gì?

Intercepting filter pattern là một Java EE pattern, được sử dụng khi muốn thực hiện một vài xử lý trước (pre-processing) khi request được ứng dụng đích (target) xử lý hoặc sau (post-processing) khi response được trả về từ target.

Các Filter được định nghĩa và áp dụng trên yêu cầu (request) khi chuyển request đến ứng dụng đích thực tế (target). Các Filter có thể thực hiện xác thực (authentication), ủy quyền (authorization), nén dữ liệu (compressing), ghi nhật ký (logging) hoặc theo dõi yêu cầu (tracking) và sau đó chuyển yêu cầu đến các trình xử lý tương ứng.

Các Filter được thực thi một cách trong suốt, phía client và target không hề biết sự tồn tại của nó.

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

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

Intercepting Filter Pattern

Các thành phần tham gia mẫu Intercepting filter pattern:

  • Filter : chịu trách nhiệm thực hiện một vài xử lý trước khi request được target xử lý hoặc sau khi response được trả về từ target.
  • Target : là một đối tượng xử lý lý chính, một trình xử lý yêu cầu.
  • Filter chain : chứa một chuỗi các Filter sẽ được thực hiện trên target theo thứ tự được xác định.
  • Filter manager : quản lý các Filter và Filter Chain.
  • Client : đối tượng gửi request đến target hoặc nhận response từ target.

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

  Một số Patterns hay sử dụng trong React

Ví dụ sử dụng Intercepting Filter Pattern

Giả sử chúng ta có một ứng dụng cần ghi log, xác thực tất cả request đến hệ thống trước khi target xử lý. Chương trình của chúng ta như sau:

Intercepting Filter Pattern

HttpRequest.java

package com.gpcoder.patterns.other.filter;

import lombok.Data;

@Data
public class HttpRequest {

    private String clientIp;
    private String targetUrl;
}

Filter.java

package com.gpcoder.patterns.other.filter;

public interface Filter {
    void doFilter(HttpRequest request);
}

TrackingFilter.java

package com.gpcoder.patterns.other.filter;

public class TrackingFilter implements Filter {

    @Override
    public void doFilter(HttpRequest request) {
        System.out.println("Tracking request: " + request);
    }
}

AuthenticationFilter.java

package com.gpcoder.patterns.other.filter;

public class AuthenticationFilter implements Filter {

    @Override
    public void doFilter(HttpRequest request) {
        System.out.println("Authenticating request: " + request);
    }
}

Target.java

package com.gpcoder.patterns.other.filter;

public class Target {

    public void execute(HttpRequest request) {
        System.out.println("Executing request: " + request);
    }
}

FilterChain.java

package com.gpcoder.patterns.other.filter;

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

public class FilterChain {

    private List<Filter> filters = new ArrayList<>();

    private Target target;

    public void addFilter(Filter filter) {
        filters.add(filter);
    }

    public void doFilter(HttpRequest request) {
        // Do some pre-processing
        for (Filter filter : filters) {
            filter.doFilter(request);
        }

        // Execute actual processing by target
        target.execute(request);

        // Do some pos-processing
    }

    public void setTarget(Target target) {
        this.target = target;
    }
}

FilterManager.java

package com.gpcoder.patterns.other.filter;

public class FilterManager {

    private FilterChain filterChain;

    public FilterManager(Target target) {
        filterChain = new FilterChain();
        filterChain.setTarget(target);
    }

    public void addFilter(Filter filter) {
        filterChain.addFilter(filter);
    }

    public void filterRequest(HttpRequest request) {
        filterChain.doFilter(request);
    }
}

Client.java

package com.gpcoder.patterns.other.filter;

public class Client {

    private FilterManager filterManager;

    public Client(FilterManager filterManager) {
        this.filterManager = filterManager;
    }

    public void sendRequest(HttpRequest request) {
        filterManager.filterRequest(request);
    }
}

InterceptingFilterPatternExample.java

package com.gpcoder.patterns.other.filter;

public class InterceptingFilterPatternExample {

    public static void main(String[] args) {
        FilterManager filterManager = new FilterManager(new Target());
        filterManager.addFilter(new TrackingFilter());
        filterManager.addFilter(new AuthenticationFilter());

        HttpRequest request = new HttpRequest();
        request.setClientIp("127.0.0.1");
        request.setTargetUrl("/home");

        Client client = new Client(filterManager);
        client.sendRequest(request);
    }
}

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

Tracking request: HttpRequest(clientIp=127.0.0.1, targetUrl=/home)
Authenticating request: HttpRequest(clientIp=127.0.0.1, targetUrl=/home)
Executing request: HttpRequest(clientIp=127.0.0.1, targetUrl=/home)

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

  • Có thể thêm một vài xử lý trước hoặc sau khi request, response được target xử lý thực sự.
  • Giảm kết dính giữa các thành phần trong ứng dụng, mỗi filter chịu trách nhiệm một phần riêng.
  • Tăng khả năng tái sử dụng lại.
  • Dễ dàng thêm/ bớt filter mà không ảnh hưởng đến Business Logic.

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

Xem thêm:

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

Kỹ thuật tăng Database Performance, Availability và Scalability

Kỹ thuật tăng Database Performance, Availability và Scalability

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

Quay lại với chủ đề Database Performance, chủ đề không mới nhưng các kĩ thuật để cải thiện Performance thì luôn mới theo từng ngày.

Performance ở đây không chỉ nói về tốc độ, bản thân nó còn bao gồm khả năng mở rộng (Scalability) và tính sẵn sàng (Availability) của hệ cơ sở dữ liệu nữa.

Bài viết này tui hân hạnh giới thiệu với anh em 3 kĩ thuật giúp cải thiện Performance. Anh em đọc xong có góp ý gì thì comment cho tui với nhé.

1. Database Performance với Indexing

Database Indexing là một kĩ thuật không còn quá xa lạ với anh em. Với indexing, performance các câu truy vấn tăng lên rõ rệt. Mục này xin được phân tích kĩ hơn bằng cách nào mà Indexing lại có thể làm tăng Database Performance.

1.1 Movitation

Đầu tiên, với Indexing:

  • Speed up retrieval operations
  • Locate the desired records in a sublinear time

Chính vì vậy, nếu không có Indexing và khi table có một lượng data cực kì lớn, ta sẽ gặp phải vấn đề về Database Performance (cụ thể là Query Performance)

  • Require a “Full Table Scan” (Scan toàn bộ table để tìm record match)
  • Take a long time for large tables (Cần thời gian nhiều hơn đối với table có lượng data khủng)

Ví dụ dưới đây ta cần tìm kiếm cho các records có city là “Los Angeles”. Không có indexing, ta cần scan toàn bộ table từ trên xuống dưới để tìm ra được các records thoả mãn yêu cầu.

Database Performance

Hoặc với một trường hợp khác là vừa Scan vừa Sort theo Age. Số lần sort tối thiểu cần là 1 và vẫn scan toàn bộ table.

Database Performance

Nếu scan toàn bộ table và với một lượng data lớn. Việc full scan table có thể gây ra 2 vấn đề:

  • Become a performance bottleneck (trở thành một điểm chết về performance)
  • Impact our users’ experience (ảnh hưởng tới trải nghiệm người dùng)

  Công cụ performance test Jmeter
  Quản lý realm database theo hướng micro-service trong iOS

1.2 Index Table

Tới với giải pháp đầu tiên là Index Table. Vậy index table là gì?

Index Table is helper table, created from a particular columns/ group columns Index Table thực chất là một bảng hỗ trợ được tạo từ một cột hoặc một nhóm cột cụ thể

Ví dụ phía trên cho thấy Index Table bao gồm City và Row, row là thứ tự của dòng có giá trị City mà nó lưu.

1.3 Data Structures

Index Table cũng có Data Structures của riêng nó theo từng loại index. Mỗi loại index lại sử dụng một loại Data Structures riêng, từ đó improve được Database Performance.

  • HashMap
  • Self-balanced tree (B-Tree)

Ví dụ dưới đây là Index Hash Table và sử dụng HashMap, phía bên row là index của các row có giá trị của City là Los Angeles. Chính cái này làm tăng performance. Khi cần query thì chỉ cần lấy ở row số 1 và row số 3

Database Performance

Chi tiết hteme về database index anh em có thể tham khảo ở bài viết Database indexes : advantages and disadvantages.

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

2. Database Replication

Database Replication cũng là một kĩ thuật giúp cải thiện Database Performance. Bản thân từ Replication có nghĩa là nhân rộng. Cũng là bản chất của kĩ thuật này và tại sao áp dụng nó lại làm tăng tính Scalability của Database nói riêng và hệ thống nói chung.

Database Performance

Ví dụ như hình trên đây là mình hoạ cho một ứng dụng chỉ có duy nhất một Replica của Database. Ta có rất nhiều services và nhiều Server để thao tác với database.

Chỉ một database kiểu này biến nó trở thành (Single point of failure – một điểm chết). Trường hợp database này có vấn đề, toàn bộ hệ thống sẽ down.

Replication lúc này trở thành cứu cánh, giải pháp là Replication tạo ra nhiều hơn một các Database.

Database Performance

Khi một Replication down, request từ services lúc này sẽ chuyển hướng tới các Replica khác

Chính việc áp dụng Replication giúp làm tăng tính sẵn sáng của hệ thống (Availability).

3. Database Sharding

Database Sharding hay còn có cái tên khác à Databse Partitioning là một giải pháp khác giúp làm tăng Database Performance. Chủ yếu là ở phương diện Scalability (mở rộng).

Về cơ bản thì kĩ thuật này thay vì clone các Database thành các Replica khác nhau (bao gồm toàn bộ data) như hình dưới.

Database Performance

Thay vì clone ra như giải pháp Replication, Sharding là kĩ thuật chia toàn bộ Database thành các Shard nhỏ hơn. Khái niệm về Shard không dễ đâu nha anh em. Anh em có thể tìm hiểu thêm qua bài viết Dynamic Sharding – Nghệ thuật của locator.

Database Performance

Về adavantages thì Database Sharding cho phép ta:

  • Scale our database to store more data (lưu được nhiều dữ liệu hơn)
  • Different queries can be performed completely in parallel
  • Better Performance
  • Higher Scalability

Sharding cũng là giải pháp cho hệ cơ sở dữ liệu phân tán (Distributed Database). Vấn đề muôn thưở là Shard nào sẽ lưu đúng data mà ta cần. Request tới, nhưng lấy dữ liệu từ đâu?

Database Performance

Mé, cái này là câu hỏi lớn và cần một bài viết riêng mới giải thích cụ thể hơn cho anh em là làm như thế nào có thể “tìm được đúng tình yêu Shard của đời mình”?.

4. Tổng kết

Bài viết này tui đã giới thiệu cho anh em 3 kĩ thuật giúp tăng Database Performance bao gồm:

  • Một là Indexing
  • Hai là Replication
  • Ba là Partitioning

Có kĩ thuật nào khác nhờ anh em chỉ giáo giúp nghe.

5. Tham khảo

Today is great day for me when I learned a new thing – Thank you for your time – Happy coding!

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

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

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

Làm thế nào để viết bug dễ hiểu và hiệu quả

Làm thế nào để viết bug dễ hiểu và hiệu quả

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

Log bug là một công việc quan trọng và không thể tránh được trong kiểm thử phần mềm, một bug được log tốt, giúp cho người đọc có thể dễ dàng nhìn ra được vấn đề, không phải mất nhiều thời gian để tìm hiểu và trao đổi qua lại quá nhiều lần, bên cạnh đó cũng là để phòng ngừa và phát hiện những vấn đề nghiêm trọng xảy ra, liên quan và ảnh hưởng trực tiếp đến chất lượng sản phẩm phần mềm.

Về mặt lý thuyết, có lẽ các bạn đều biết được rằng bug đưa lên thì cần phải ngắn gọn súc tích nhưng vẫn phải đảm bảo cung cấp đủ các thông tin cần thiết. Ô mà như thế nào là ngắn gọn mà vẫn đầy đủ thông tin? Haha, mời các bạn bớt chút thời gian đọc tiếp nha!

Hình ảnh có liên quan

Yếu tố tâm lý: Đóng góp – đừng ra lệnh

Khi test mà bắt được con bug nào, tester vui mừng bao nhiêu thì Dev buồn bấy nhiêu. :)) Vì thế hãy luôn mang một tinh thần và mục tiêu là cùng đóng góp để xây dựng một sản phẩm chất lượng, đừng gay gắt ra lệnh, nó dễ làm ảnh hưởng đến tâm lý người nhận và dễ gây căng thẳng giữa hai bên.

  Các câu hỏi thú vị phỏng vấn kỹ sư kiểm thử phần mềm – Phần 1

  Làm thế nào để cải thiện kỹ năng debug?

Đừng log trùng bug

Một vấn đề khác, đó là việc log bug bị trùng, nguyên nhân thì do chủ quan hay khách quan đều có, nhưng dù là gì đi nữa thì bạn cũng nên hạn chế thấp nhất vấn đề này, một vài lần xảy ra sẽ khiến dev “mất niềm tin” ở bạn ngay. Vì vậy, cần kiểm tra và lọc kỹ thông tin trước khi log bug, một vài chục bug ta có thể nhớ được chứ khi đã lên đến hàng trăm thì không thể chủ quan được!

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

Cung cấp thông tin chi tiết, đầy đủ: What, How, When.

Điểm quan trọng nữa đối với việc log bug, đó là bạn phải cung cấp được thông tin liên quan đến bug đó như là điều gì đã xảy ra, nó đã xảy ra như thế nào nào? ở đâu, khi nào?

Ví dụ: bug này xảy ra khi bạn đã thực hiện các bước với test data như thế nào, và bạn đã thực hiện nó ở phần chức năng nào của hệ thống. Để từ đó người đọc sẽ hình dung, dễ dàng tái hiện và tìm bug theo mô tả này của bạn hơn.

Mỗi bug nên tập trung vào một vấn đề thôi

Trong một bug bạn chỉ nên tập trung vào một vấn đề cụ thể mà bạn gặp đó thôi, đừng nghĩ là mất công log một bug này nên là tranh thủ gom vài vấn đề vào chung luôn cho đỡ phải log tiếp, như vậy làm cho các vấn đề trở nên rắc rối, khó nắm bắt, nhiều khi bị lan man mất nhiều thời gian để có thể giải quyết và close được bug.

Một vài lưu ý lớn

Mỗi công ty/đội dự án lại có các cách quản lý bug khác nhau, các biểu mẫu và cách báo cáo khác nhau. Nhưng nhìn chung thì log bug chúng ta cũng đều phải đảm bảo và lưu ý một số yếu tố dưới đây:

1. Bug id: Yếu tố này giúp việc quản lý, tìm kiếm dễ dàng và nhanh chóng hơn. Đặc biệt đối với project mà số lượng bug trở nên quá lớn qua các build version.

2. Tiêu đề của bug: Đây sẽ là phần mà thường là ta sẽ đọc đầu tiên trước khi mở bug đó ra và đọc tiếp các mô tả bên trong, do đó phần này nên mô tả một cách khái quát nhất, đủ để người đọc có thể hình dung ra được vấn đề nhanh nhất có thể. Giúp người đọc có thể hiểu được và biết được là bug đã được fix hay đã gặp lần nào bao giờ chưa.

3. Mức độ nghiêm trọng của bug: Khi bug xảy ra, bạn có thể đánh giá độ nghiêm trọng của lỗi để gán cho nó trạng thái tương ứng, các trạng thái này có thể là Critical, Major, Minor, … tùy từng hệ thống, thường thì sẽ dựa vào chỉ số này để ưu tiên các bug nào sẽ phải được/nên được fix trước.

4. Môi trường/Nền tảng/Device test: Ở đây ta cần phải đưa ra thông tin cụ thể việc xảy ra bug đó khi bạn test trên môi trường nào, sử dụng device test nào: ví dụ như test trên Window 7, Chrome latest version…. Hay iPhone 7, iOS 9…., vì đôi khi thì bug đó chỉ xảy ra ở một số môi trường đặc biệt nào đó thôi, việc cung cấp các thông tin này cũng giúp cho đội Dev có thêm thông tin để tìm được ra được các vấn đề.

5. Mô tả lỗi: Phần này cung cấp thông tin đầy đủ và chi tiết về lỗi đã xảy ra, giúp cho Dev hiểu hơn về vấn đề. Đưa ra các bước theo đúng tuần tự thực hiện để có thể tái hiện lỗi:

  • Điều kiện đầu vào: Bao gồm các bước chuẩn bị, test data…
  • Test steps: Các bước thực hiện, nên đánh số 1, 2, 3, …
  • Kết quả mong đợi: Kết quả đúng cho case này là gì?
  • Kết quả thực tế: Thực tế nó đã xảy ra như thế nào, cần mô tả rõ ràng và đầy đủ kết quả thực tế đã xảy ra nhé!

Bạn có thể sử dụng dấu ngoặc vuông [ ] để chỉ tên chức năng thực tế trên hệ thống để dễ Dev dễ hình dung nhé!

6. Tài kiệu đính kèm: “Một hình ảnh bằng hàng nghìn lời nói”, do đó bạn nên đính kèm theo mỗi bug các hình ảnh liên quan trực tiếp đến nó, có thể highlight vùng lỗi lên để người đọc dễ quan sát hơn, hoặc bạn cũng có thể quay một video các bước đã thực hiện, cách này sẽ giúp ích rất nhiều trong việc tái hiện và hiểu bug. Ngoài ra nếu bạn có thể lấy được các log file thì cũng có thể đính kèm lên cùng với bug, rồi các tài liệu tham khảo liên quan khác, nếu cần thiết.

Một lưu ý nữa là bạn cần đảm bảo là đã sử dụng bản build test và điều kiện phù hợp tương ứng với test cycle. Và nhớ đọc kỹ lại một lượt bug để đảm bảo không mắc các lỗi về diễn đạt hay chính tả nữa nha.

Kiểm tra kỹ hơn trên các máy test khác để đảm bảo là nó không phải chỉ gặp vấn đề ở mỗi máy của bạn thôi, còn trên máy của người khác vẫn không vấn đề gì. Rồi cũng phải đảm bảo là bug này có thể tái hiện lại được.

Viết bug dễ hiểu và hiệu quả
Hehe, Chuyện tình lãng mạn chưa nè, nhớ đọc kỹ nhaaa!

Khi log một bug cần luôn phải nhớ rằng mô tả cần ngắn gọn, rõ ràng, dễ hiểu, cung cấp đầy đủ thông tin cần thiết, để có thể dễ dàng tái hiện bug, tránh mất thời gian để trao đổi quá nhiều lần. Điều này giúp bạn có ấn tượng tốt trong mắt các bạn Dev, mặc dù biết là bạn log bug thì họ cũng không hề vui vẻ gì! Hehe

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

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

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

Phân biệt Front End và Back End, điểm khác nhau là gì?

Phân biệt Front End và Back End, điểm khác nhau là gì?

Nếu bạn là một lập trình viên newbie, có thể bạn sẽ bối rối với các thuật ngữ như Front EndBack End. Đây là 2 thuật ngữ quan trọng trong một website bất cứ ai theo học lập trình web đều phải biết. Tuy nhiên, nhiều người vẫn chưa thực sự hiểu rõ sự khác biệt giữa chúng là gì và nhiệm vụ của từng phần là gì. Trong bài viết này, chúng ta sẽ tìm hiểu sâu hơn về Front End và Back End, cách phân biệt Front End và Back End chi tiết nhất. Cùng theo dõi nhé!

Phân biệt khái niệm Front End và Back End

Front End và Back End

Front End là gì?

Front-end là phần giao diện của website nơi mà người dùng cuối có thể nhìn thấy và tương tác trực tiếp. Tất cả những gì bạn có thể nhìn thấy trên website bao gồm: màu sắc, hình ảnh, văn bản, đồ thị, bảng biểu,… được gọi là phần front-end của trang web.

Những người chịu trách nhiệm xây dựng, phát triển những thành phần này được gọi là Front End Developer. Họ sẽ sử dụng các công cụ và ngôn ngữ lập trình như HTML, CSS, JavaScript để tạo ra giao diện người dùng trực quan và hấp dẫn, tương thích trên nhiều trình duyệt và thiết bị khác nhau.

Back End là gì?

Back End là phần người dùng không thể nhìn thấy được, có nhiệm vụ xử lý các nghiệp vụ phức tạp ở phía sau giúp phần front end hoạt động trơn tru. Thông thường, các phần này bao gồm cơ sở dữ liệu, máy chủ, và các tập lệnh khác được sử dụng để xử lý và lưu trữ dữ liệu. Mặc dù người dùng không tương tác trực tiếp với back-end nhưng họ sẽ tương tác gián tiếp thông qua front-end.

Các Back End Developer sẽ tập trung vào phía máy chủ trang web bao gồm: Databases, quản lý service,… Sử dụng các ngôn ngữ lập trình như Java, Python, Ruby, PHP và các framework như Node.js, Ruby on Rails và Django để phát triển các hệ thống website. Vai trò của một Back End Developer là cực kỳ quan trọng trong việc xây dựng một trang web, bởi vì họ đảm bảo rằng các ứng dụng phải hoạt động chính xác và đáp ứng được nhu cầu của người dùng.

  Những Câu Hỏi Phỏng Vấn Front End Thường Xuất Hiện Trong Các Buổi Phỏng Vấn

  Top 7 câu hỏi phỏng vấn Backend Developer

Kỹ năng của Front End Developer và Back End Developer

Front End DeveloperBack End Developer là hai vai trò quan trọng trong quá trình phát triển website. Mỗi vai trò đều có những kỹ năng đặc trưng riêng, dưới đây là một số sự khác biệt về kỹ năng giữa Front End Developer và Back End Developer:

Front End Developer

  • Thành thạo HTML, CSS và JavaScript để xây dựng giao diện người dùng tốt nhất có thể.
  • Sử dụng các framework như Angular, React, Vue.js, Ember để tăng tốc độ phát triển web.
  • Kỹ năng sử dụng JavaScript/jQuery để thêm các chức năng cần thiết và các plugin, extension  giúp việc phát triển trang web nhanh chóng và dễ dàng hơn.
  • Kỹ năng quản lý các Git và Version để theo dõi các thay đổi được tạo ra trong quá trình code hoặc kiểm soát các version.
  • Hiểu biết về UI/UX design và các nguyên tắc thiết kế.
  • Có khả năng sửa lỗi, tối ưu hóa tốc độ tải trang web.
  • Có kiến ​​thức về responsive designcross-browser compatibility.

front end developer

Tham khảo việc làm Back-end Developer Hồ Chí Minh hấp dẫn trên TopDev

Back End Developer

  • Thành thạo các ngôn ngữ lập trình như Java, Python, Ruby, PHP, C# để xử lý các yêu cầu phức tạp từ phía người dùng.
  • Có kiến thức về cơ sở dữ liệu và truy vấn dữ liệu, hiện nay SQL và NoSQL là hai loại cơ sở dữ liệu được sử dụng phổ biến nhất.  
  • Hiểu biết về mạng và máy chủ, bao gồm các giao thức web, lưu lượng truy cập, bảo mật và quản lý máy chủ.
  • Có kiến thức về một số thuật toán như: Depth First Search và Breadth-First Search, bubble sort, selection sort, insertion sort, merge sort, quick sort, thuật toán đệ quy và lặp,…
  • Có khả năng sửa lỗi và cải thiện hiệu suất website.
  • Nắm được một số kỹ năng khác như: Quản lý môi trường lưu trữ với CSDL, kiến thức về kiểm soát Git và,…

back end developer

Link ảnh tham khảo: https://www.liveabout.com/the-skills-you-need-to-be-a-backend-developer-2071184

Ngoài ra, cả Front End Developer và Back End Developer đều cần có kỹ năng tốt về giao tiếp để tương tác với các thành viên khác trong đội ngũ phát triển, kỹ năng giải quyết vấn đề, tư duy logic và sáng tạo.

Bảng tóm tắt so sánh Back End và Front End

Yếu tố

Backend Developer

Frontend Developer

Tính chất công việc Tập trung vào phát triển giao diện website để mang đến những trải nghiệm tốt nhất cho người dùng. Phát triển cấu trúc và chức năng của hệ thống, xử lý logic và dữ liệu từ phía máy chủ.
Ngôn ngữ lập trình Java, Python, Ruby, PHP, Node.js HTML, CSS, JavaScript, TypeScript
Nhiệm vụ Tạo và duy trì hệ thống sau đó cung cấp dữ liệu cho Frontend Developer Xây dựng giao diện người dùng và các tính năng tương tác
Mức lương Trung bình khoảng $81,000 USD/năm Trung bình khoảng $75,000 USD/năm
Thư viện Django, Laravel, Node.js, Ruby on Rails, Flaskkkk React, Angular, Vue.js, Ember.js, jQuery

Kết luận

Hy vọng bài viết này đã giúp bạn phân biệt được Front End và Back End, cũng như nhiệm vụ và vai trò của 2 vị trí Front End Developer và Back End Developer. Dù là Frontend hay Backend Developer, cả hai đều có vai trò quan trọng trong việc phát triển website.

Nếu bạn muốn trở thành một lập trình viên thành thạo, cần phải nắm vững những kỹ năng và công nghệ cần thiết cho từng vai trò. Với sự phát triển nhanh chóng của ngành công nghệ thông tin hiện nay, việc học tập và cập nhật kiến thức mới liên tục sẽ giúp bạn trở thành một chuyên gia trong lĩnh vực của mình. Chúc bạn thành công!

Bạn có thể quan tâm:

Tìm việc làm IT lương cao, đãi ngộ hấp dẫn trên TopDev!

Giới thiệu thư viện Apache Commons Chain

Giới thiệu thư viện Apache Commons Chain

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

1. Apache Commons Chain là gì?

Apache Commons Chain là một framework, một thư viện mã nguồn mở của Apache. Nó cung cấp API cho phép chúng ta dễ dàng cài đặt các xử lý tuân theo Chain of Responsibility (COR) pattern.

Chain of Responsiblity cho phép một đối tượng gửi một yêu cầu nhưng không biết đối tượng nào sẽ nhận và xử lý nó. Điều này được thực hiện bằng cách kết nối các đối tượng nhận yêu cầu thành một chuỗi (chain) và gửi yêu cầu theo chuỗi đó cho đến khi có một đối tượng xử lý nó.

Chain of Responsibility Pattern hoạt động như một danh sách liên kết (Linked list) với việc đệ quy duyệt qua các phần tử (recursive traversal).

2. Cài đặt thư viện Apache Commons Chain

Thêm thư viện vào project vào project maven:

<!-- https://mvnrepository.com/artifact/commons-chain/commons-chain -->
<dependency>
    <groupId>commons-chain</groupId>
    <artifactId>commons-chain</artifactId>
    <version>1.2</version>
</dependency>

3. Sử dụng thư viện Apache Commons Chain

Trong Chain framework, các đơn vị công việc trong một chuỗi các bước tuần tự được biểu diễn bằng các Command. Một chuỗi các lệnh (Command) tạo thành một chain. Chuỗi chính nó cũng là một Command có thể được thực thi. Chain được giữ trong danh mục (Catalog), từ đó chúng có thể được lấy tại thời điểm thực thi. Chain framework cung cấp các interface Chain, Catalog, Command, Fillter như sơ đồ lớp bên dưới.

  • Context : thể hiện trạng thái của ứng dụng, chứa dữ liệu được chia sẻ giữa các Command.
  • Command : thể hiện các đơn vị công việc. Command chỉ bao gồm một phương thức execute() với tham số là một Context và kiểu trả về là giá trị boolean. Kiểu trả về boolean: để xác định có nên tiếp tục xử lý hay không. Trả về true nếu đã hoàn thành, không cần Command kế tiếp xử lý, ngược lại trả về false.
  • Chain : nó extends từ Command. Chain có thể chứa một chuỗi tuần tự các Command/ Chain khác.
  • Filter : là một Command đặc biệt, có thêm phương thức postProcess(). Phương thức này được gọi sau khi phương thức execute() được gọi.
  • Catalog : các ứng dụng sử dụng Facade hoặc Factory hoặc DI để giảm sự phụ thuộc giữa các lớp. Các lớp có thể giao tiếp với nhau mà không cần thông qua tên lớp. Catalog cũng dựa trên ý tưởng đó, nó cho phép client có thể thực thi một Command thông qua định danh mà không cần biết tên lớp.

  Hướng dẫn sử dụng thư viện Jackson

  Cách sử dụng lệnh Xcopy trong CMD (Command Prompt)

3.1 Ví dụ sử dụng thư viện Apache Commons Chain

Tạo custom context để chia sẻ dữ liệu giữa các Command.

package com.gpcoder.context;

import org.apache.commons.chain.impl.ContextBase;

import lombok.Data;

@Data
public class MyContext extends ContextBase {

    private String property;
}

Tạo file constant đặt tên cho các command, chain. Chúng ta sẽ sử dụng tên này để lấy các Command từ Catalog và thực thi.

package com.gpcoder.constant;

public enum MyCommandNamed {
    CHAIN_1, CHAIN_2, CMD_1, CMD_2, CMD_3, CMD_4, EXCEPTION_HANDLER
}

Tạo file constant đặt tên cho các command, chain. Chúng ta sẽ sử dụng tên này để lấy các Command từ Catalog và thực thi.

package com.gpcoder.constant;

public enum MyCommandNamed {
    CHAIN_1, CHAIN_2, CMD_1, CMD_2, CMD_3, CMD_4, EXCEPTION_HANDLER
}

Tạo Command1, Command2: đây là command minh họa cho đơn vị công việc sẽ được thực hiện trong Chain.

package com.gpcoder.command;

import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;

import com.gpcoder.context.MyContext;

public class Command1 implements Command {

    public boolean execute(Context ctx) throws Exception {
        System.out.println("This is command 1: ");

        String property = ((MyContext) ctx).getProperty();
        System.out.println("+ property: " + property);

        String customValue = ctx.get("custom-key").toString();
        System.out.println("+ customValue: " + customValue);

        return false;
    }
}
package com.gpcoder.command;

import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;

import com.gpcoder.context.MyContext;

public class Command2 implements Command {

    public boolean execute(Context ctx) throws Exception {
        String value = ((MyContext) ctx).getProperty();
        System.out.println("This is command 2: " + value);
        return false;
    }
}

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

3.1.1 Ví dụ 1 – Thực thi 1 Chain

Tạo chain có 2 command: Command1 và Command2.

package com.gpcoder.example1_chain;

import org.apache.commons.chain.impl.ChainBase;

import com.gpcoder.command.Command1;
import com.gpcoder.command.Command2;

public class MyChain extends ChainBase {

    public MyChain() {
        super();
        addCommand(new Command1());
        addCommand(new Command2());
    }
}

Thực thi chain:

package com.gpcoder.example1_chain;

import org.apache.commons.chain.Command;

import com.gpcoder.context.MyContext;

/**
* Execute a chain example
*/
public class ChainStart1 {

    public static void main(String[] args) throws Exception {
        // Create context
        MyContext context = new MyContext();
        context.setProperty("property-value");
        context.put("custom-key", "custom-value");

        // Get the command
        Command command = new MyChain();
        command.execute(context);
    }
}

Output chương trình:

This is command 1: 
+ property: property-value
+ customValue: custom-value
This is command 2: property-value

3.1.2 Ví dụ 2 – Thực thi một Command được lấy từ Catalog

Tạo Catalog chứa các command và Chain cần sử dụng:

package com.gpcoder.example2_catalog;

import org.apache.commons.chain.impl.CatalogBase;

import com.gpcoder.command.Command1;
import com.gpcoder.command.Command2;
import com.gpcoder.constant.MyCommandNamed;
import com.gpcoder.example1_chain.MyChain;

/**
* CatalogBase is a collection of Chains and Commands with their logical names.
*/
public class MyCatalog extends CatalogBase {

    public MyCatalog() {
        super();
        addCommand(MyCommandNamed.CMD_1.name(), new Command1());
        addCommand(MyCommandNamed.CMD_2.name(), new Command2());
        addCommand(MyCommandNamed.CHAIN_1.name(), new MyChain());
    }
}

Lấy Command từ Catalog và thực thi:

package com.gpcoder.example2_catalog;

import org.apache.commons.chain.Catalog;
import org.apache.commons.chain.Command;

import com.gpcoder.constant.MyCommandNamed;
import com.gpcoder.context.MyContext;

/**
* Execute the specific command example
*/
public class ChainStart2 {

    public static void main(String[] args) throws Exception {

        // Create context
        MyContext ctx = new MyContext();
        ctx.setProperty("property-value");
        ctx.put("custom-key", "custom-value");

        // Get the catalog
        Catalog catalog = new MyCatalog();

        // Get the command
        System.out.println("Execute the specific command: CMD_1");
        Command command1 = catalog.getCommand(MyCommandNamed.CMD_1.name());
        command1.execute(ctx);

        System.out.println("\nExecute the specific chain: CHAIN_1");
        Command chain1 = catalog.getCommand(MyCommandNamed.CHAIN_1.name());
        chain1.execute(ctx);
    }
}

Output chương trình:

Execute the specific command: CMD_1
This is command 1: 
+ property: property-value
+ customValue: custom-value

Execute the specific chain: CHAIN_1
This is command 1: 
+ property: property-value
+ customValue: custom-value
This is command 2: property-value

3.1.3 Ví dụ 3 – Sử dụng Filter để xử lý exception

Tạo Command3 có throw một Exception:

package com.gpcoder.command;

import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;

public class Command3 implements Command {

    public boolean execute(Context ctx) throws Exception {
        throw new UnsupportedOperationException("Cannot execute Command4");
    }
}

Tạo Fitler để handle Exception:

package com.gpcoder.filter;

import org.apache.commons.chain.Context;
import org.apache.commons.chain.Filter;

public class CommandExceptionHandler implements Filter {

    public boolean execute(Context context) throws Exception {
        System.out.println("CommandExceptionHandler.execute() called.");
        return false;
    }

    public boolean postprocess(Context context, Exception exception) {
        if (exception == null) {
            return false;
        }
        System.out.println("Exception " + exception.getMessage() + " occurred.");
        return true;
    }
}

Tạo Chain với 2 Command: Command1 và Command3.

package com.gpcoder.example3_exception;

import org.apache.commons.chain.impl.ChainBase;

import com.gpcoder.command.Command1;
import com.gpcoder.command.Command3;
import com.gpcoder.filter.CommandExceptionHandler;

public class MyChain3 extends ChainBase {

    public MyChain3() {
        super();
        addCommand(new CommandExceptionHandler());
        addCommand(new Command1());
        addCommand(new Command3());
    }
}

Thực thi chain:

package com.gpcoder.example3_exception;

import org.apache.commons.chain.Command;

import com.gpcoder.context.MyContext;

/**
 * Filter for exception handling in Chains example
 */
public class ChainStart3 {

    public static void main(String[] args) throws Exception {
        Command chain = new MyChain3();
        chain.execute(new MyContext());
    }
}

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

CommandExceptionHandler.execute() called.
This is command 1: 
+ property: null
Exception null occurred.

Lưu ý: Filter Command phải thêm vào đầu chain để có thể handle exception cho các Command được thực thi phía sau.

3.1.4 Ví dụ 4 – Tạo Catalog từ file xml

Trong ví dụ 2, chúng ta tạo một Catalog bằng cách extend từ một CatalogBase. Chúng ta có một cách khác để tạo Catalog là xử dụng cấu hình catalog từ xml file.

Để sử dụng tính năng này, cần thêm các thư viện sau:

<!-- Use for the command config -->
<!-- https://mvnrepository.com/artifact/commons-digester/commons-digester -->
<dependency>
    <groupId>commons-digester</groupId>
    <artifactId>commons-digester</artifactId>
    <version>1.8</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.3</version>
</dependency>

Để dễ minh họa các trường hợp sử dụng cấu hình xml file, chúng ta sẽ tạo thêm một Command:

package com.gpcoder.command;

import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;

import com.gpcoder.context.MyContext;

public class Command4 implements Command {

    public boolean execute(Context ctx) throws Exception {
        String value = ((MyContext) ctx).getProperty();
        System.out.println("This is command 4: " + value);
        return false;
    }
}

Tạo file chain-config.xml trong thư mục /src/main/resources

<catalog>
    <!-- Single command "chains" from CatalogBaseTestCase -->
    <command name="CMD_1" className="com.gpcoder.command.Command1" />
    <command name="CMD_2" className="com.gpcoder.command.Command2" />

    <!-- Chains with nested commands -->
    <chain name="CHAIN_1">
        <command className="com.gpcoder.filter.CommandExceptionHandler" />
        <command className="com.gpcoder.command.Command1" />
        <command className="com.gpcoder.command.Command2" />
        <command className="com.gpcoder.command.Command3" />
        <!-- Lookup Command -->
        <command name="CHAIN_2" optional="true" className="org.apache.commons.chain.generic.LookupCommand" />
    </chain>

    <chain name="CHAIN_2">
        <command className="com.gpcoder.command.Command4" />
    </chain>
</catalog>

Tạo Catalog từ XML file:

package com.gpcoder.example4_xml_config;

import org.apache.commons.chain.Catalog;
import org.apache.commons.chain.config.ConfigParser;
import org.apache.commons.chain.impl.CatalogFactoryBase;

/**
 * Get catalog from the XML configuration file
 */
public class MyXMLCatalog {

    private static final String CONFIG_FILE = "/chain-config.xml";
    private ConfigParser parser;
    private Catalog catalog;

    public MyXMLCatalog() {
        parser = new ConfigParser();
    }

    public Catalog getCatalog() throws Exception {
        if (catalog == null) {
            parser.parse(this.getClass().getResource(CONFIG_FILE));
        }
        catalog = CatalogFactoryBase.getInstance().getCatalog();
        return catalog;
    }
}

Thực thi Command lấy từ Catalog trên:

package com.gpcoder.example4_xml_config;

import org.apache.commons.chain.Catalog;
import org.apache.commons.chain.Command;

import com.gpcoder.constant.MyCommandNamed;
import com.gpcoder.context.MyContext;

/**
 * Get the catalog from XML file and Execute the specific command example
 */
public class ChainStart4 {

    public static void main(String[] args) throws Exception {
        // Create context
        MyContext ctx = new MyContext();
        ctx.setProperty("property-value");
        ctx.put("custom-key", "custom-value");

        // Get the catalog
        Catalog catalog = new MyXMLCatalog().getCatalog();

        // Get the command
        System.out.println("Execute the specific command: CMD_1");
        Command command1 = catalog.getCommand(MyCommandNamed.CMD_1.name());
        command1.execute(ctx);

        System.out.println("\nExecute the specific chain: CHAIN_1");
        Command chain1 = catalog.getCommand(MyCommandNamed.CHAIN_1.name());
        chain1.execute(ctx);
    }
}

Output chương trình:

Execute the specific command: CMD_1
This is command 1: 
+ property: property-value
+ customValue: custom-value

Execute the specific chain: CHAIN_1
CommandExceptionHandler.execute() called.
This is command 1: 
+ property: property-value
+ customValue: custom-value
This is command 2: property-value
Exception Cannot execute Command4 occurred.
Bài viết gốc được đăng tải tại gpcoder.com
Xem thêm:
Tìm việc làm IT mọi cấp độ tại TopDev

30 tuổi có học lập trình được không?

30-tuoi-co-hoc-lap-trinh-duoc-khong

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

Công ty khởi nghiệp điển hình ở Thung lũng Silicon: một nhóm thanh niên 22 tuổi không có kỹ năng xã hội, viết code đến khuya, cố gắng khởi chạy một số ứng dụng được cho là sẽ thay đổi thế giới.

Hình ảnh này tượng trưng cho nhiều quan niệm sai lầm về ngành công nghệ. Giống như nhiều khuôn mẫu, có một số sự thật trong đó nếu bạn nhìn kỹ. Thậm chí ngày nay, vẫn có những công ty khởi nghiệp như vậy, và tất nhiên, nhiều câu chuyện thành công lớn nhất trong lĩnh vực công nghệ đã tuân theo mô hình này trong những ngày đầu thành lập.

Nhưng cũng có những công ty – nhờ nỗ lực hoặc ngẫu nhiên – đa dạng hơn nhiều. Trong số các loại đa dạng, giới tính và dân tộc thường được thảo luận nhiều hơn. Nhưng tuổi tác cũng đáng được quan tâm nhiều như vậy.

Vậy, 30 tuổi có học lập trình được không? Liệu 30 có quá già để bắt đầu một sự nghiệp mới trong lĩnh vực phần mềm?

Không bao giờ là quá muộn để học cách viết code. Nhiều người đã học các kỹ năng viết code ở độ tuổi 60 trở lên và có những người đã tìm thấy công việc mới là lập trình viên phần mềm. Nhưng nếu bạn đang học viết code sau 30 tuổi, có một số điều bạn nên cân nhắc để chuẩn bị cho mình thành công.

Tại sao những người trong lĩnh vực công nghệ lại quá trẻ?

Tôi đã không viết dòng mã đầu tiên của mình cho đến khi tôi 25 tuổi.

Tôi nhận ra rằng điều đó sẽ vẫn còn trẻ đối với bất kỳ ai trên 30 tuổi, nhưng ngay cả khi đó, tôi biết mình sẽ không bao giờ có thể cạnh tranh với những người đã học ở trường đại học, chứ đừng nói đến những người đã lập trình từ khi họ 6 tuổi.

Đây là điều khiến lập trình trở nên khác biệt so với các kỹ năng khác: nó đủ dễ hiểu và dễ tiếp cận để mọi người học khi còn nhỏ (nếu họ có đủ nguồn lực để làm như vậy). Và đây là lý do tại sao bạn có thể tìm thấy những người trong ngành công nghệ có kỹ năng lập trình nâng cao thậm chí trước khi họ tổ chức sinh nhật lần thứ 20 của mình.

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

30 tuổi có học lập trình được không?

Ưu và nhược điểm của việc học viết code sau 30

Bạn có thể nghĩ rằng sự tồn tại của những lập trình viên phần mềm trẻ như vậy là tin xấu cho những người thay đổi nghề nghiệp, nhưng điều đó không nhất thiết đúng.

Bạn vẫn hoàn toàn có thể học cách viết code và thay đổi nghề nghiệp thành công sang phát triển phần mềm sau 30 tuổi, và thực sự có một số lợi thế của việc học cách viết code sau này trong cuộc sống có thể giúp bạn có lợi thế hơn so với những người trẻ hơn.

Những mặt tích cực

Thay đổi nghề nghiệp nhanh chóng

So với các công việc lương cao khác mà bạn có thể học lại, học viết code rất nhanh. Khi các lựa chọn khác yêu cầu đào tạo chính thức kéo dài, chứng chỉ phức tạp hoặc thậm chí nhiều năm trong cuộc đời bạn để quay lại trường học, thì thực tế là bạn có thể thay đổi nghề nghiệp công nghệ chỉ trong vài tháng—và với các kỹ năng bạn có thể học hoàn toàn tại nhà—là một điểm cộng lớn.

Điều đó không có nghĩa là nó dễ dàng (học cách viết code và tìm công việc đầu tiên của bạn có thể sẽ là một trong những giai đoạn khó khăn nhất trong cuộc đời bạn), nhưng nếu bạn thấy đó là điều mình thích, thì sự chăm chỉ đó sẽ hoàn toàn được đền đáp.

Bạn đã có kinh nghiệm trước đây

Bất cứ điều gì bạn đã làm cho công việc cho đến thời điểm này, bạn đã đạt được những kỹ năng từ nó. Cho dù đó là tương tác với khách hàng, quản lý nhóm hay làm việc gì đó đòi hỏi một loại kỹ năng kỹ thuật khác, đừng nghĩ rằng điều đó là lãng phí.

Những người 22 tuổi với 15 năm kinh nghiệm viết code? Họ không có cái này.

Chắc chắn, họ có thể là những lập trình viên cao cấp, nhưng họ thiếu những kỹ năng mà bạn chỉ có thể đạt được thông qua sự trưởng thành và kinh nghiệm.

Có thể bạn có kiến ​​thức cụ thể về một lĩnh vực khác như luật, giáo dục, khoa học hoặc bất động sản. Đó là tin tốt! Đối với hầu hết mọi ngành mà bạn có thể tưởng tượng, luôn có một công ty khởi nghiệp xây dựng một sản phẩm công nghệ cho hoặc xung quanh ngành đó. Và bạn có thể cá rằng họ sẽ rất muốn có một người không chỉ có kỹ năng viết code mà còn hiểu rõ lĩnh vực của họ.

  Lời khuyên tốt nhất cho một lập trình viên mới vào nghề là gì?

Bạn đã có thời gian để phát triển các kỹ năng mềm

Bất chấp danh tiếng của ngành công nghệ là ngôi nhà của những thiên tài vụng về về mặt xã hội, những người thực sự thành công làm được điều đó bởi vì họ có nhiều thứ hơn là chỉ có khả năng kỹ thuật.

Nếu bạn có kinh nghiệm điều hướng các tình huống kinh doanh phức tạp, xây dựng sự đồng thuận trong nhóm, nói trước đám đông hoặc biết cách sắp xếp thứ tự ưu tiên công việc để dự án hoàn thành đúng hạn, thì những kỹ năng này sẽ giúp bạn vượt lên trên nhiều kỹ sư trong ngành công nghệ.

Việc làm Java Fresher hấp dẫn trên TopDev!

Nhiều kinh nghiệm sống hơn có nghĩa là nhiều dự án độc đáo hơn

Một điều mà bất kỳ lập trình viên nào cũng cần để được tuyển dụng là một cách để chứng tỏ rằng họ có thể viết code. Điều này thường được thực hiện thông qua các dự án; các công ty thích thấy rằng bạn có thể xử lý một vấn đề trong thế giới thực và xây dựng một phần mềm để giải quyết vấn đề đó.

Lợi thế của bạn ở đây là bạn đã gặp nhiều tình huống trong cuộc sống hơn một thanh niên 20 tuổi. Có lẽ bạn có thể xây dựng một trang web để quảng bá một sự kiện trong ngành của bạn cho công việc. Có lẽ bạn là cha mẹ mới và có thể xây dựng một ứng dụng để ghi lại kiểu ngủ của con bạn và trực quan hóa dữ liệu.

Vấn đề là, bạn có thể sử dụng những kinh nghiệm độc đáo của mình để tạo ra những dự án khác thường mà nhà tuyển dụng sẽ không nhìn thấy từ những ứng viên mới vào nghề trung bình của họ.

Nếu bạn có kỹ năng thiết kế hoặc quản lý dự án thì càng tốt. Bạn sẽ nhận được điểm thưởng khi nói về cách bạn lên kế hoạch và thực hiện dự án, đồng thời giải quyết vấn đề một cách hiệu quả mà không chỉ xây dựng các tính năng vì lợi ích của nó.

30 tuổi có học lập trình được không?

Những mặt tiêu cực

Các việc khác có thể cản trở việc học

Một điều bạn có thể có ít hơn so với những người trẻ tuổi hơn của bạn là thời gian rảnh rỗi. Cho dù bạn là cha mẹ hay đang bận rộn với công việc căng thẳng ở một lĩnh vực khác, bạn sẽ cần phải làm việc chăm chỉ hơn để dành thời gian và không gian cho việc học viết code.

Viết code đòi hỏi sự tập trung và nhất quán. Bạn sẽ cần những khoảng thời gian không bị gián đoạn khi cố gắng xoay quanh những khái niệm khó và bạn sẽ cần kiên trì với nó để thấy kết quả. Giống như bất kỳ kỹ năng mới nào với đường cong học tập, nếu bạn chỉ làm từng chút một, bạn sẽ gặp khó khăn để đạt được tiến bộ.

Bạn có thể sẽ phải làm việc với một người trẻ hơn bạn

Nếu mục tiêu cuối cùng của bạn là làm việc trong lĩnh vực công nghệ, thì bạn cần phải chấp nhận rằng sẽ có những người can thiệp hoặc quản lý bạn, những người có thể (trong một số trường hợp) trẻ hơn bạn hàng chục tuổi.
Đây có thể là một cú sốc nếu bạn đến từ các ngành truyền thống hơn, nơi tuổi tác thường tăng theo thứ bậc của công ty. Không có cách nào thực sự để giải quyết vấn đề này ngoài việc cố gắng chấp nhận rằng bạn sẽ quen với nó theo thời gian. Nếu điều đó làm phiền bạn, thì có một số loại công ty có nhiều khả năng có sự đa dạng về độ tuổi trong nhóm kỹ sư của họ và những loại công ty khác mà bạn có thể muốn tránh.

Một số công ty có thể không phù hợp

Theo nguyên tắc chung, công ty càng lớn thì bạn sẽ tìm thấy phạm vi độ tuổi càng rộng. Có một vài lý do cho việc này.

Một công ty gồm 4 người có thể mới được thành lập, thường là bởi những người bạn, những người có khả năng bằng tuổi nhau. Những loại công ty này cũng thường liên quan đến nhiều ‘hối hả’ hơn khi họ cố gắng khởi đầu. Điều này có nghĩa là thời gian làm việc dài hoặc không thường xuyên và thiếu sự đảm bảo về công việc (liệu công ty có tồn tại trong thời gian một năm không?). Phong cách làm việc và mức độ rủi ro này có thể khiến các công ty ở giai đoạn đầu như vậy không hấp dẫn đối với những người lớn tuổi với các cam kết như gia đình và thế chấp.

Các công ty lớn hơn có thể cung cấp sự ổn định hơn, giờ làm việc bình thường và các chính sách tốt hơn về nhu cầu gia đình và quỹ hưu trí.

Bạn có thể gặp chủ nghĩa tuổi tác

Ngành công nghệ có thể và đang tuyển dụng mọi người ở mọi lứa tuổi. Điều đó nói rằng, phân biệt tuổi tác vẫn xảy ra và không đảm bảo rằng bạn sẽ không gặp phải điều đó trong quá trình tìm kiếm việc làm của mình.

Tất nhiên, từ chối một công việc nào đó vì tuổi tác của họ là bất hợp pháp, nhưng—giống như hầu hết các hình thức phân biệt đối xử—việc này sẽ tế nhị hơn là công khai.

Xu hướng tuyển dụng thường tinh tế đến mức người phỏng vấn của bạn thậm chí có thể không nhận thức được chúng. Và đây là cách mà các công ty kết thúc với sự thiếu đa dạng – bởi vì mọi người thường ưu tiên những ứng viên giống họ nhất.

30 tuổi có học lập trình được không?

Mẹo học viết code sau 30

Nếu bạn thích viết mã, tuổi tác không phải là rào cản đối với việc học viết code hoặc tìm việc làm trong lĩnh vực công nghệ. Đây là những gì bạn có thể làm để tối đa hóa cơ hội thành công của mình:

  • Sắp xếp thời gian để học: Cho dù đó là giờ nghỉ trưa hay vài giờ mỗi tối sau khi bọn trẻ đã đi ngủ, hãy chỉ định một khoảng thời gian viết code không bị gián đoạn, nơi mà mọi người đều biết bạn đang vượt quá giới hạn và cần sự bình yên và tĩnh lặng.
  • Kết nối với các lập trình viên khác ở độ tuổi của bạn: Học với một người bạn hoặc tìm những người trực tuyến để chia sẻ hành trình của bạn. Mọi người ở mọi lứa tuổi đều học cách viết code và việc có những đồng nghiệp hiểu những thách thức riêng của bạn sẽ khiến quá trình này trở nên thú vị hơn.
  • Đừng so sánh bản thân với người khác: Học viết code không phải là một cuộc thi và nếu bạn nghĩ về nó như một cuộc thi, bạn sẽ chỉ nản lòng. Tập trung vào hành trình độc đáo, điểm mạnh và mục tiêu của bạn chứ không phải vào việc bạn có thể cảm thấy mình ‘thua kém’ bất kỳ ai khác bao xa.
  • Nhắm đến các công ty lâu đời hơn: Khi đến lúc tìm việc, hãy cân nhắc tập trung nỗ lực của bạn vào các công ty lớn hơn. Điều đó không có nghĩa là bạn không bao giờ nên làm việc cho một công ty mới thành lập, nhưng chỉ cần lưu ý rằng họ mang lại sự ổn định kém hơn và bạn có thể gặp khó khăn hơn khi cảm thấy mình thuộc về môi trường đó.

Kết luận

Như bạn thấy, không bao giờ là quá già để bắt đầu làm một việc gì đó. Cho dù bạn 30, hay thậm chí ngoài 30 tuổi, bạn vẫn có thể bắt đầu công việc lập trình của mình, chỉ cần bạn có đủ đam mê với nó. Ngoài ra, những kiến thức bạn tích luỹ được trước đây là một lợi thế rất lớn giúp bạn có đủ khả năng để cạnh tranh với những người trẻ hơn. Vì vậy, đừng bỏ cuộc, hãy theo đuổi đam mê, và thành công sẽ theo đuổi bạn.

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

Xem thêm:

Đừng bỏ lỡ hàng loạt IT job hot tại TopDev

Setup Eslint và Prettier cho dự án React theo chuẩn coding style guide của Airbnb

Setup Eslint và Prettier cho dự án React theo chuẩn coding style guide của Airbnb

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

Ai cũng từng phải trải qua giai đoạn code bị đồng nghiệp chửi, sếp chửi và mọi người chửi, sau khi push code lên cho mọi người review thì nhận được rất nhiều comments là “em phải sửa lại dòng này, dòng này phải viết như thế này mới đúng”, “Sao chỗ này em có dấu chấm phẩy mà ở chỗ này em không có dấu chấm phẩy”, “em có thể sắp xếp lại thứ tự import thư viện cho nó đẹp mắt hơn được không”, “Sao lúc em dùng tab và lúc em dùng space vậy?”, “Sao em đặt tên hàm có lúc là camelCase có lúc là PascalCase vậy?” v.v. Vậy lý do là gì để mọi người chửi mình như thế? Tại sao những người dẫn dắt team (Leader) không đặt ra chuẩn chung cho team để team follow theo. Khi không có chuẩn chung thì mọi người vừa mất thời gian review và trong dự án của mình nếu có 10 người thì không thể nào style code của 10 người đều giống nhau hết, có người code kiểu A, có người code kiểu B, có người code kiểu XYZ. Đó là vấn đề cần phải khắc phục ngay lúc này.

Chúng ta cần có một chuẩn chung trong dự án, và nếu thành viên nào code không đúng chuẩn chung đó, thì IDE của họ sẽ tự nhắc nhở họ. Có rất nhiều coding style guide khác nhau như: Airbnb, Idiomatic.js, Google JavaScript Style Guide, JavaScript Standard Style v.v. Trong bài viết này mình sẽ tập trung vào Airbnb style guide, đây là chuẩn mà mình thấy nhiều pro đề xuất sử dụng và mình cũng đang áp dụng chuẩn này vào các dự án của mình. Các bạn có thể truy cập vào trang của Airbnb https://airbnb.io/javascript/ ngoài Javascript style guide, Airbnb còn có Ruby style guide, CSS & Sass, CSS in Javascript v.v. Ở bài viết này mình sẽ chỉ nói về cách setup coding style guide cho dự án React, các bạn có thể vào đường dẫn này để tham khảo về các chuẩn mà Airbnb đề cập https://airbnb.io/javascript/react/, Ở đây Airbnb có đưa ra các tình huống thế nào là bad code và thế nào là good code.

Eslint là gì?

Theo trang chính của Eslint thì Eslint là một open source project nó giúp chúng ta phân tích, tìm kiếm và fix lỗi tự động trong khi code. Plugin của Eslint hỗ trợ hầu hết trên các Code Editor. Ngoài ra chúng ta còn có thể viết ra những custom rule và tích hợp vào Eslint nếu chúng ta muốn. Đây là trang chính của Eslint: https://eslint.org/

  Code ví dụ typescript, cấu hình eslint với prettier

  Chuẩn coding convention trong PHP với PSR

Prettier là gì?

Theo trang chính của Prettier thi Prettier là một code formatter, Nó sẽ ghi lại code của chúng ta dựa trên độ dài tối đa của mỗi dòng code mà chúng ta cấu hình, nó giúp code chúng ta trở nên đẹp hơn, sạch sẽ và nhất quán hơn, mà không làm ảnh hưởng đến logic code. Ví dụ:

Đoạn code này nó vừa trong một dòng nên Prettier sẽ giữ nguyên và ko format code.

foo(arg1, arg2, arg3, arg4);

Đoạn code này nó quá dài để hiển thị trên cùng 1 dòng nó sẽ phải format lại.

foo(reallyLongArg(), omgSoManyParameters(), IShouldRefactorThis(), isThereSeriouslyAnotherOne());

Đây là đoạn code mà Prettier đã giúp chúng ta format lại.

foo(

  reallyLongArg(),

  omgSoManyParameters(),

  IShouldRefactorThis(),

  isThereSeriouslyAnotherOne()

);

Các bạn có thể truy cập để đọc thêm tại: https://prettier.io/docs/en/

Tại sao phải setup Eslint và Prettier cho dự án?

Như mình cũng đã nói ở đầu bài, chúng ta cần đưa ra chuẩn chung khi code cho dự án, nó sẽ tiết kiệm được thời gian làm code review và giúp dự án trông có vẻ chuyên nghiệp và nhất quán hơn. Chúng ta không thể nào tự khẳng định rằng chúng ta code nhất quán từ đầu đến cuối mà không xảy ra bất kỳ sai sót nào, vậy nên Eslint và Prettier sẽ là công cụ đắc lực giúp code chúng ta và các thành viên trong team đẹp hơn, nhất quán hơn.

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

Khởi tạo dự án React với Eslint?

Khởi tạo dự án React bằng dòng lệnh sau:

npx create-react-app react-eslint-and-prettier-example-typescript --template typescript

Install eslint và các thư viện cần thiết

npm i -–save-dev eslint eslint-config-airbnb @typescript-eslint/eslint-plugin @typescript-eslint/parser

Tạo file .eslintrc và .eslintignore ngang hàng với file package.json

Nội dung của file  .eslintignore

build/*

.eslintignore sẽ giúp eslint hiểu là những folder nào và file nào mà eslint không nên scan qua.

Nội dung của file .eslintrc

{
  "env": {
    "browser": true,
    "jest": true
  },
  "plugins": [
    "@typescript-eslint",
    "react"
  ],
  "settings": {
    "react": {
      "pragma": "React",
      "version": "18.0"
    },
    "import/resolver": {
      "node": {
        "extensions": [
          ".js",
          ".jsx",
          ".ts",
          ".tsx"
        ],
        "moduleDirectory": [
          "node_modules",
          "./"
        ]
      }
    }
  },
  "extends": [
    "airbnb",
    "airbnb/hooks"
  ],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaFeatures": {
      "jsx": true
    }
  },
  "rules": {
    "no-console": "warn",
    "no-eval": "error",
    "react/react-in-jsx-scope": "off",
    "react/jsx-filename-extension": [
      2,
      {
        "extensions": [
          ".js",
          ".jsx",
          ".ts",
          ".tsx"
        ]
      }
    ],
    "import/extensions": [
      "error",
      "ignorePackages",
      {
        "js": "never",
        "jsx": "never",
        "ts": "never",
        "tsx": "never"
      }
    ]
  }
}

Giải thích về một số cấu hình trong file .eslintrc

env” nơi chứa những cấu hình cho environment, ở đây trong dự án nếu chúng ta có viết unit test bằng jest thì ta thêm “jest”: true vào. Còn “browser”: true khi trong dự án chúng ta có sử dụng các thành phần của browser như window object hoặc localStorage v.v. thì ta thêm “browser”: true vào để eslint không báo lỗi những dòng code này.

plugins“: Nơi đây chứa những plugin nào cho eslint config.

settings“: Nơi chứa những cài đặt, ở đây mình có cài đặt để nói cho eslint hiểu là mình đang dùng React version 18. “import/resolver” nơi nói cho Eslint hiểu root directory của dự án nằm ở đâu và các file extensions có trong dự án. Ở đây mình có khai báo “./” trong moduleDirectory, tương tự như tsconfig.json mình có baseUrl=”.” thì khi mình import ví dụ: import App from ‘src/App’ thì eslint sẽ hiểu src là folder nào.

extends”:  Cấu hình cho Eslint biết sẽ sử dụng những rule được kế thừa từ thư viện nào ở đây mình sử dụng những rule của airbnb và airbnb/hooks.

parserOptions”: nói cho Eslint hiểu mình sẽ sử dụng parser nào.

rules”: Cuối cùng nhưng không kém phần quan trọng đó là rules, mình có thể thêm các rule và cấu hình các rule tùy thích, có thể thiết lập cho các rule chỉ là warning hay sẽ thông báo error luôn.

Trong file package.json phần scripts chúng ta thêm 2 dòng này vào nhé:

"lint": "eslint . --ext .js,.jsx,.ts,.tsx"
"lint:fix": "eslint --fix .  --ext .js,.jsx,.ts,.tsx"

Nào hãy chạy thử bằng lệnh

npm run lint

Sau đó chạy lệnh sau để fix tự động

npm run lint:fix

Nếu Eslint không thể fix cho chúng ta lỗi được thông báo hãy đọc thông báo lỗi và tự fix bằng tay nhé.

Reorder import trong Eslint

Đây là rule mà mình thấy rất hữu ích, đôi khi chúng ta viết code chúng ta sẽ không để ý rằng, mọi người import thư viện và các file không theo một nguyên tắc nào cả nhìn vào rất khó chịu và xấu. Thế nên hãy sử dụng plugins simple-import-sort nó sẽ giúp chúng ta sắp xếp lại các import theo một quy tắc nhất định.

Để cài đặt được plugin simple-import-sort hãy chạy dòng lệnh này:

npm i --save-dev eslint-plugin-simple-import-sort

Ở phần plugins ta thêm vào simple-import-sort:

"plugins": ["@typescript-eslint", "react", "simple-import-sort"],

Ở phần rules ta thêm rule này vào:

"simple-import-sort/imports": [
  "error",
  {
    "groups": [
      // Packages `react` related packages come first.
      ["^react", "^@?\\w"],
      // Internal packages.
      ["^(@|src)(/.*|$)"],
      // Side effect imports.
      ["^\\u0000"],
      // Parent imports. Put `..` last.
      ["^\\.\\.(?!/?$)", "^\\.\\./?$"],
      // Other relative imports. Put same-folder imports and `.` last.
      ["^\\./(?=.*/)(?!/?$)", "^\\.(?!/?$)", "^\\./?$"],
      // Style imports.
      ["^.+\\.?(css)$"]
    ]
  }
]

Theo cấu hình này thứ tự ưu tiên sẽ là:

  1. React package được đưa lên đầu, ví dụ: import React from ‘react’;
  2. Sau đó là các thư viện từ node_modules, ví dụ: import { Button } from ‘antd’;
  3. Sau đó đến internal package ví dụ: như import App from ‘src/App’;
  4. Sau đó là side effect import ví dụ: import  ‘any-package’;
  5. Theo sau là import với relative path ví dụ: import Result from ‘../components/Result’;
  6. Tiếp theo là same-folder import ví dụ: import CustomModal from ‘./CustomModal’;
  7. Và cuối cùng là style import ví dụ: import ‘./styles.scss’;

Sau khi cấu hình xong hãy thử sắp xếp lại import một cách lung tung và để cho eslint reorder lại giúp bạn. Tính năng này thật cool phải không.

Full cấu hình tại thời điểm này:

{
  "env": {
    "browser": true,
    "jest": true
  },
  "plugins": ["@typescript-eslint", "react", "simple-import-sort"],
  "settings": {
    "react": {
      "pragma": "React",
      "version": "18.0"
    },
    "import/resolver": {
      "node": {
        "extensions": [".js", ".jsx", ".ts", ".tsx"],
        "moduleDirectory": ["node_modules", "./"]
      }
    }
  },
  "extends": ["airbnb", "airbnb/hooks"],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaFeatures": {
      "jsx": true
    }
  },
  "rules": {
    "no-console": "warn",
    "no-eval": "error",
    "react/react-in-jsx-scope": "off",
    "react/jsx-filename-extension": [2, { "extensions": [".js", ".jsx", ".ts", ".tsx"] }],
    "import/extensions": [
      "error",
      "ignorePackages",
      {
        "js": "never",
        "jsx": "never",
        "ts": "never",
        "tsx": "never"
      }
    ],
    "simple-import-sort/imports": [
      "error",
      {
        "groups": [
          // Packages `react` related packages come first.
          ["^react", "^@?\\w"],
          // Internal packages.
          ["^(@|src)(/.*|$)"],
          // Side effect imports.
          ["^\\u0000"],
          // Parent imports. Put `..` last.
          ["^\\.\\.(?!/?$)", "^\\.\\./?$"],
          // Other relative imports. Put same-folder imports and `.` last.
          ["^\\./(?=.*/)(?!/?$)", "^\\.(?!/?$)", "^\\./?$"],
          // Style imports.
          ["^.+\\.?(css)$"]
        ]
      }
    ]
  }
}

Cài đặt Prettier với Eslint?

Install prettier bằng dòng lệnh sau:

npm i --save-dev prettier eslint-plugin-prettier eslint-config-prettier

Bạn có thể cấu hình Prettier trong file .prettierrc nhưng ở đây mình sẽ cấu hình trực tiếp trong file .eslintrc luôn.

Phần “pluggins” bạn thêm prettier vào:

"plugins": ["@typescript-eslint", "react", "prettier", "simple-import-sort"],

Phần “extends” cũng thêm prettier vào:

"extends": ["airbnb", "airbnb/hooks", "prettier"],

Và phần “rules” thêm rule cấu hình prettier vào:

"prettier/prettier": [
  "error",
  {
      "printWidth": 80,
      "trailingComma": "es5",
      "semi": true,
      "no-mixed-spaces-and-tabs": ["error", "smart-tabs"],
      "no-unused-vars": ["error"]
  }
]

Cấu hình .eslintrc đầy đủ:

{
    "env": {
        "browser": true,
        "jest": true
    },
    "plugins": [
        "@typescript-eslint",
        "react",
        "prettier",
        "simple-import-sort"
    ],
    "settings": {
        "react": {
            "pragma": "React",
            "version": "18.0"
        },
        "import/resolver": {
            "node": {
                "extensions": [
                    ".js",
                    ".jsx",
                    ".ts",
                    ".tsx"
                ],
                "moduleDirectory": [
                    "node_modules",
                    "./"
                ]
            }
        }
    },
    "extends": [
        "airbnb",
        "airbnb/hooks",
        "prettier"
    ],
    "parser": "@typescript-eslint/parser",
    "parserOptions": {
        "ecmaFeatures": {
            "jsx": true
        }
    },
    "rules": {
        "no-console": "warn",
        "no-eval": "error",
        "react/react-in-jsx-scope": "off",
        "react/jsx-filename-extension": [
            2,
            {
                "extensions": [
                    ".js",
                    ".jsx",
                    ".ts",
                    ".tsx"
                ]
            }
        ],
        "simple-import-sort/imports": [
            "error",
            {
                "groups": [
                    // Packages `react` related packages come first.
                    [
                        "^react",
                        "^@?\\w"
                    ],
                    // Internal packages.
                    [
                        "^(@|src)(/.*|$)"
                    ],
                    // Side effect imports.
                    [
                        "^\\u0000"
                    ],
                    // Parent imports. Put `..` last.
                    [
                        "^\\.\\.(?!/?$)",
                        "^\\.\\./?$"
                    ],
                    // Other relative imports. Put same-folder imports and `.` last.
                    [
                        "^\\./(?=.*/)(?!/?$)",
                        "^\\.(?!/?$)",
                        "^\\./?$"
                    ],
                    // Style imports.
                    [
                        "^.+\\.?(css)$"
                    ]
                ]
            }
        ],
        "import/extensions": [
            "error",
            "ignorePackages",
            {
                "js": "never",
                "jsx": "never",
                "ts": "never",
                "tsx": "never"
            }
        ],
        "prettier/prettier": [
            "error",
            {
                "printWidth": 80,
                "trailingComma": "es5",
                "semi": true,
                "no-mixed-spaces-and-tabs": [
                    "error",
                    "smart-tabs"
                ],
                "no-unused-vars": [
                    "error"
                ]
            }
        ]
    }
}

Thế là đã xong, bạn hãy thử chỉnh sửa code, thụt dòng không đúng, xóa dấu chấm phẩy hoặc để một dòng code quá dài, Prettier sẽ giúp bạn format lại code khiến nó đẹp hơn. Bạn hãy thử chạy lệnh và chờ đợi kết quả:

npm run lint:fix

Tổng Kết

Tóm lại Eslint và Prettier là 2 trợ thủ đắc lực trong việc giúp cho developer điều chỉnh lại code của mình cho đồng nhất với team, và nhìn vào dự án nếu có eslint thì trông có vẻ rất chuyên nghiệp hơn so với dự án mỗi người code một kiểu.

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

Xem thêm:

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

ChatGPT liệu có làm lập trình viên mất việc? – Phần 1

ChatGPT liệu có làm lập trình viên mất việc?

Mới đầu năm 2023, sự ra đời của ChatGPT làm khuấy đảo không chỉ các ngành quan trọng như vận tải, chứng khoán, văn phòng. Bản thân ChatGPT cũng đang ảnh hưởng trực tiếp tới ngành công nghệ thông tin. Mọi người tin rằng với ChatGPT, rất nhiều lập trình viên sẽ mất việc bởi trí tuệ nhân tạo (Artifical Intelligence) sẽ thay thế lập trình viên để viết code.

Vậy có chăng ChatGPT sẽ khiến cho anh em lập trình viên bay luôn công việc? Nếu không, anh em lập trình viên cần chuẩn bị những gì để sống sót. Biến mình trở nên khác biệt, và còn có giá trị (valuable) hơn cả ChatGPT?

ChatGPT
Mới ra ChatGPT thôi đã sợ kỷ nguyên Robot giết chóc rùi. Huhu

Bài viết này xin mạn phép chia sẻ cùng anh em. Đầu tiên là lướt qua một số ví dụ mang tính kĩ thuật bên ngành, xem ChatGPT làm được gì, từ đó phân tích anh em lập trình nên làm gì để sống sót kỷ nguyên AI.

Dựa trên quan điểm cá nhân, có gì không phải anh em vui lòng comment. Mọi người thoải mái nêu lên quan điểm.

1. ChatGPT làm được gì như lập trình viên

Từ lúc có ChatGPT, không ít các anh em đã thử đặt các câu hỏi về lập trình cho ChatGPT. Câu trả lời từ ChatGPT là vô cùng ấn tượng. Vậy cụ thể ChatGPT làm được gì?

Bài viết này sẽ dẫn anh em đi qua một số câu hỏi. Các câu hỏi đó liên quan tới các phase trong quá trình phát triển phần mềm. Cụ thể như sau:

  • Nghiệp vụ BA (phân tích hệ thống, hiểu requirements, suggest requirements)
  • Nghiệp vụ thiết kế hệ cơ sở dữ liệu
  • Kiến thức cơ bản (kiểu như định nghĩa liên quan tới ngành phần mềm)
  • Câu hỏi về hệ thống đặc biệt (có ít thông tin để ChatGPT học)

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

>>> Xem thêm: Cách ứng dụng Chat GPT hỗ trợ cho công việc hiệu quả

2. Câu hỏi về kiến thức cơ bản

Ví dụ như apply design pattern vào source code. Nếu anh em chưa biết về singleton pattern. Đặt ngay câu hỏi cho ChatGPT.

Không chỉ nêu ra code như nào, ChatGPT còn cẩn thận chu đáo nói cho anh em biết về khái niệm của Singleton.

ChatGPT

Có code rồi, ChatGPT còn tỉ mẩn giải thích từng đoạn code trong đó. Nào là đảm bảo chỉ có instance duy nhất. getInstance() là gì. Rồi tại sao với đoạn code đó lại cho ra được một instance duy nhất.

ChatGPT

Rõ ràng mà nói, ở góc độ tra cứu thông tin hoặc tìm kiếm các thông tin chung chung về lập trình ChatGPT làm rất tốt. Bản thân một câu trả lời của ChatGPT tiết kiệm thời gian cho anh em tìm kiếm.

Thay vì bộ 3 câu hỏi với 3 lần tìm kiếm:

  • Singleton pattern là gì?
  • Ví dụ về singleton pattern trong Java?
  • Giải thích code singleton trong Java?

Giờ với ChatGPT, chỉ một câu hỏi thôi là có đầy đủ câu trả lời.

  Facebook giới thiệu LLaMA tạo siêu AI cạnh tranh với ChatGPT
  Fuzzy search là gì? Những điều cần biết về thuật toán fuzzy

3. Câu hỏi về thiết kế hệ thống đã có nhiều bên phát triển

Ở đây mình hỏi về thiết kế hệ thống bán vé cho rạp phim đi ha. Cái này đã có rất rất nhiều bên phát triển. Về concept và những thành phần phải phát triển cũng khá là rõ ràng.

ChatGPT

ChatGPT

Ú oà, ChatGPT cho câu trả lời không khác một BA (Business Analytics) có trình độ cao. Từng gạch đầu dòng có thể xem như một Epics. Nếu không có yêu cầu gì đặc biệt từ hệ thống, danh sách Epic được liệt kê ở ChatGPT không hề thiếu. Thậm chí còn có cả QR code scan, khách đặt lại vé đó nhiều lần.

Chu đáo hơn, ChatGPT còn quan tâm tới security, analytics cho system. Phải nói là cực kì chu đáo, đóng vai trò BA có kinh nghiệm nữa cơ.

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

4. Thiết kế Database

Thiết kế database đòi hỏi kinh nghiệm và được xem là công việc có tính chuyên môn cao. Cùng xem ChatGPT làm được gì nha anh em.

Phía dưới đây là câu trả lời thiết kế Database cho hệ thống bán vé.

ChatGPT

Movies
- movie_id (PK)
- title
- description
- duration
- rating
- poster_url

Theaters
- theater_id (PK)
- name
- location

Shows
- show_id (PK)
- movie_id (FK)
- theater_id (FK)
- start_time
- end_time
- price

Users
- user_id (PK)
- name
- email
- password
- phone

Bookings
- booking_id (PK)
- user_id (FK)
- show_id (FK)
- timestamp
- total_price

Seats
- seat_id (PK)
- theater_id (FK)
- row_number
- seat_number
- status

Booking_Seats
- booking_id (PK, FK)
- seat_id (PK, FK)

Ghê thiệt, không những define rõ ràng tất cả các table, khoá chính khoá ngoại liên kết như nào. ChatGPT còn giải thích cụ thể mục đích từng table, mục đích các khoá trong đó.

ChatGPT

Sau khi đã qua các bước chung chung phát triển hệ thống. Về cơ bản ChatGPT có thể cung cấp thông tin khá đầy đủ nếu những thông tin đó đã có đủ để ChatGPT có thể học.

Thử đi vào chi tiết hơn.

>>> Xem thêm: ChatGPT và những người bạn (Phần 1)

5. Code react component

Câu hỏi tiếp theo cho ChatGPT là thử code một react component sử dụng để lấy lên toàn bộ danh sách ticket.

ChatGPT

Dưới đây là đoạn code có được từ ChatGPT, bất ngờ là ChatGPT gợi ý một số field cần mapping lên list. Cần gọi API để lấy danh sách các ticket.

import React, { useState, useEffect } from 'react';
import axios from 'axios';

function TicketList() {
  const [tickets, setTickets] = useState([]);

  useEffect(() => {
    // Make an API call to fetch the list of tickets
    axios.get('/api/tickets')
      .then(response => {
        setTickets(response.data);
      })
      .catch(error => {
        console.error(error);
      });
  }, []);

  return (
    <div>
      <h2>Ticket List</h2>
      <table>
        <thead>
          <tr>
            <th>ID</th>
            <th>Movie</th>
            <th>Theater</th>
            <th>Show Time</th>
            <th>Price</th>
          </tr>
        </thead>
        <tbody>
          {tickets.map(ticket => (
            <tr key={ticket.id}>
              <td>{ticket.id}</td>
              <td>{ticket.movie}</td>
              <td>{ticket.theater}</td>
              <td>{ticket.showTime}</td>
              <td>{ticket.price}</td>
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );
}

export default TicketList;

Không những mapping id, movie, theater, showTime và price của vé. ChatGPT còn gợi ý về format JSON của API để mapping.

[  {    "id": 1,    "movie": "Avengers: Endgame",    "theater": "Cineplex 1",    "showTime": "2023-03-05 14:30",    "price": 10.99  },  {    "id": 2,    "movie": "Spider-Man: No Way Home",    "theater": "Cineplex 2",    "showTime": "2023-03-05 15:00",    "price": 8.99  },  ...]

Ví dụ về API thì khỏi bàn, anh em có thể dùng luôn làm mockdata để test.

ChatGPT

Về code thì ChatGPT trả lời như này là hơi run run rồi á anh em.

Ôi vãi thánh thần thiên địa

6. Hệ thống có business đặc biệt, ít biết

Được rồi, qua vài ví dụ trên thì một số anh em cũng nổi da gà vì giờ chỉ cần mix lại nữa thôi là khéo anh em thất nghiệp. Ra đường ngồi. Viễn cảnh nói thì xa vời chứ gần ngay trước mắt.

Thử lại tí nữa với hệ thống quản lý phòng khám đông y. Đông Y là tinh hoa của Y học phương Đông. Ít có ai phát triển. Hệ thống đông y cũng không phổ biến lắm.

Gòi, căng, nghĩ hơi lâu rồi á.

ChatGPT

Vẫn có kết quả về thiết kế hệ cơ sở dữ liệu nhưng khá chung chung và giống với tây y. Nguyên nhân là đông y có khá ít thứ để học. Phù, nhẹ hơn tí. Vậy cái gì đặc biệt hơn thì ChatGPT vẫn chưa làm tốt.

Dưới đây là DB thiết kế cho phòng khám đông y. Vẫn khá đầy đủ nhưng ChatGPT chưa thể hiểu được nghiệp vụ hệ thống để thiết kế DB chính xác hơn

Patients
- patient_id (PK)
- first_name
- last_name
- date_of_birth
- gender
- phone_number
- email
- address

Visits
- visit_id (PK)
- patient_id (FK)
- visit_date
- visit_reason
- visit_description
- visit_result

Prescriptions
- prescription_id (PK)
- visit_id (FK)
- prescription_date
- prescription_description
- prescription_quantity

Medicines
- medicine_id (PK)
- medicine_name
- medicine_description
- medicine_category

Suppliers
- supplier_id (PK)
- supplier_name
- supplier_address
- supplier_phone
- supplier_email

Medicine_Suppliers
- medicine_id (PK, FK)
- supplier_id (PK, FK)
- price
- in_stock

7. Tổng kết

Qua một số ví dụ ở trên, ChatGPT show up cho anh em thấy bản thân nó là một công cụ mạnh. Lập trình là công việc đòi hỏi tính chuyên môn cao, nhưng cá nhân mình đánh giá ChatGPT có thể hỗ trợ gần 60% khối lượng công việc.

Nếu công việc có tính chất đặc thù và đòi hỏi quan tâm vào chi tiết, ChatGPT có thể đóng vai trò như người hỗ trợ.

Với anh em coder chắc anh em sẽ nhận ra ngay, như component ticket list kia, ChatGPT đã hỗ trợ anh em khá nhiều rồi. Giờ chỉ có component theo style nào, frontend anh em có yêu cầu gì khác về UI hoặc về business thì code thêm thôi. Thời gian tìm kiếm thông tin giảm đi hơn một nửa.

Vậy anh em lập trình cần làm gì để không bị trí tuệ nhân tạo thay thế. Xin phép được viết bài nữa cho anh em nha. Bài này dài quá rồi.

Anh em có gì cứ feel free comment.

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

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

Xem thêm:

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

Top 5 câu hỏi phỏng vấn Drupal Developer không phải ai cũng biết

Top 5 câu hỏi phỏng vấn Drupal Developer không phải ai cũng biết

CMS – Quản trị nội dung, vấn đề mà bất kì trang web nào cũng phải đối mặt, mà để quản trị được thì Drupal là một trong những lựa chọn tốt, bài viết này cung cấp cho anh em top 5 câu hỏi phỏng vấn Drupal Developer. Giúp anh em tổng hợp kiến thức, tự tin hơn khi tham gia phỏng vấn vị trí Drupal Developer.

1. Drupal, cái tên lớn

Công nghệ thay đổi nhanh tới mức chóng mặt, CMS cũng thế, hiện nay anh em có thể liệt kê ra khoảng chục cái tên hỗ trợ CMS (quản trị nội dung hệ thống). Nhưng Drupal vẫn là cái đó đặc biệt, đã từng được dùng cho cả White House (nhà trắng), United Nations (liên hợp quốc) trong giai đoạn từ. 2007 đến năm 2018 trước khi chuyển qua wordpress.

Drupal là gì?

Sử dụng cho một trang web chính phủ không phải là điều đơn giản. Yêu cầu rất cao về bảo mật, độ dễ dàng trong quản lý nội dung. Anh em là Drupal Developer có thể thoải mái chém gió cái tao đang làm trước đây dùng cho nhà trắng tận bên Mỹ cơ.

Vậy Drupal là gì? Vẫn cứ phải quay lại khái niệm trước khi đi vào bộ câu hỏi phỏng vấn.

2. Drupal là gì?

Drupal là hệ thống quản lý nội dung (CMS – Content Management System), được viết dựa trên ngôn ngữ lập trình PHP, miễn phí và mã nguồn mở. Free anh em ạ, release theo GNU General Public License. Với Drupal, anh em có thể quản lý nội dung theo nhiều cách khác nhau với nhiều tuỳ chọn, tuỳ chỉnh.

Drupal là gì?
Nhìn đi anh em, Drupal 10 đẹp quá chời đẹp

CMS là thành phần quan trọng trong phát triển các ứng dụng web. Chính vì vậy anh em Drupal Developer cũng auto trở nên có giá.

  Top 3 Laravel CMS được đánh giá cao
  Drupal Developer là gì? Cần học những gì để trở thành Drupal Developer

3. Phỏng vấn Drupal Developer

Do là hệ thống quản lý nội dung (CMS), các câu hỏi phỏng vấn Drupal Developer thường liên quan tới cách sử dụng, mức độ hiểu biết cũng như thực hành Drupal.

Ngoài ra, nếu có các kinh nghiệm thực tế hoặc giải quyết các bài toán gặp phải trong quá trình sử dụng Drupal cũng là một điểm cộng lớn khi anh em tham gia interview.

Đầu tiên, nếu đã có một thời gian sử dụng Drupal anh em Drupal Developer sẽ hiểu rõ sự khác biệt giữa node và block.

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

3.1 Sự khác biệt giữa node và block trong Drupal

Lấy ví dụ luôn để phân biệt hai cái này cho dễ dàng ha. Node thì đơn giản rồi ha, nếu anh em quản lý CMS cho một blog, một bài đăng mới được hiểu là một node. Nếu Drupal sử dụng để quản lý một forum thì mỗi bài đăng trên forum được hiểu là một node.

Về phần block, block ở đây được hiểu là a piece of information (một khối thông tin) được trình bày ở một vị trí cụ thể trên trang. Một khối thông tin, mà gọi trắng ra là một vùng sẽ bao gồm left sidebar (thanh bên trái), header, footer và các thành phần khác. Một block có thể nằm ở bất cứ đâu trên trang.

Sự khác biệt giữa node và block trong Drupal

3.2 Điều gì khiến Drupal khác biệt với các CMS khác

Hiện tại về mảng CMS có rất nhiều platform khác đã và đang phát triển. Xu hướng hiện tại là headless CMS. Một số cái tên có thể nhắc tới là Strapi, Cosmic, GraphCMS. Các bên phát triển CMS này đều hỗ trợ truy vấn với Rest API và GraphQL. Vậy điều gì làm Drupal trở nên khác biệt? Người phỏng vấn cũng có thể hỏi tại sao em lựa chọn Drupal mà không phải các CMS khác?

Anh em có thể trả lời dựa trên mấy ý sau đây (có thể nêu thêm kinh nghiệm thực tế khi sử dụng nữa nhé)

  • Đầu tiên là sử dụng Drupal đơn giản để quản lý trang web, dễ maintain hơn.
  • Support nhiều hơn, dễ chỉnh sửa hơn
  • Hỗ trợ đa ngôn ngữ (cái này phải nói rõ hỗ trợ dễ hơn như thế nào, vì hiện tại các CMS khác đã support multi language với i18n)
  • Độ bảo mật cao hơn (cái này cũng cần phải nói rõ bảo mật như thế nào)

Về mức độ bảo mật, Drupal hỗ trợ CMS phiên bản cho doanh nghiệp. Có nhiều các trang web chính phủ sử dụng Drupal, chứng tỏ mức độ bảo mật nội dung của Drupal ở mức cao hơn so với các CMS khác.

Điều gì khiến Drupal khác biệt với các CMS khác

3.3 Hooks trong Drupal là gì?

Câu hỏi này tập trung vào sự hiểu biết của anh em về Drupal. Cũng là một câu hỏi thường gặp trong quá trình phỏng vấn Drupal Developer.

Drupal Hooks là cách để các modules có thể giao tiếp với Drupal Core. Hooks là một module riêng biệt trong Drupal. Một hooks là một hàm php có tên foobar(). Trong đó foo dùng để chỉ module và bar dùng để chỉ hooks.

Dupral Developer

3.4 Trong Drupal, caching hoạt động như thế nào?

Drupal quản lý CMS, mà website thì cần CMS để hiển thị. Chính vì thế, Drupal cho phép tăng tốc độ tải trang bằng cách sử dụng nhiều loại caching khác nhau bao gồm: page caching, block caching và lifetime cache page. Cùng đi qua lần lượt từng loại cache ha.

  • Page caching: cái này cache toàn bộ nội dung page (html và css, js,…) vào trong DB. Page caching giúp giảm số lượng truy vấn, lần trước gọi 1 lần sau cứ vào cache mà lấy thôi chứ không query nhiều block nữa.
  • Block caching: thay vì cache cả page thì trong page có nhiều khối nhưng anh em chỉ muốn cache một vài block trong đó.

3.5 Năm lớp trong Drupal System

Hệ thống Drupal chia thành 5 lớp. Cụ thể 5 lớp đó là:

  • Data (nodes, etc..)
  • Modules
  • Blocks and Menus
  • User Permissions
  • Themes and templates

Đi lần lượt từng lớp cho anh em nha.

Đầu tiên, lớp thấp nhất là data. Bất cứ thứ gì muốn hiển thị trên site, đều phải nhập vào ở dạng data. Mỗi bài viết, mỗi bài đăng trên forum được hiểu là một nodes.

Lớp thứ hai là modules, modules ở đây là các plugins hoặc một phần của Drupal core, xây dựng nên các tính năng cốt lõi của Drupal.

Lớp thứ 3 là blocks là menus, block tương tự như widget bên phía WordPress. Blocks là tổng hợp các thành phần mở rộng từ Drupal core, bao gồm cả API trong đó. Còn menus, menus là tập hợp các đường dẫn (links), mỗi link được hiểu là một menu item sử dụng để điều hướng trên web (navigation).

Lớp thứ tư là user permission, lớp này thực hiện phân quyền cho từng user, các actions được thực hiện theo từng role của user trong hệ thống CMS.

Lớp cuối cùng là Themes và templates. Một themes có thể có nhiều templates trong đó. Lớp này chủ yếu bao gồm XHTML và CSS. Về độ tuỳ biến thì có sử dụng các biến (variable php).

Năm lớp trong Drupal System

4. Tham khảo

Cảm ơn anh em đã dành thời gian – Thank you for your time – Happy coding!

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

Xem thêm: 

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

Fuzzy search là gì? Những điều cần biết về thuật toán fuzzy

Fuzzy search là gì? Những điều cần biết về thuật toán fuzzy

Chưa cần phải vội vàng tìm hiểu Fuzzy search hoặc thuật toán Fuzzy nha. Anh em cứ thong thả, nhâm nhi ly trà ta bắt đầu với câu chuyện nho nhỏ.

Tìm kiếm bằng Google, ôi dào, giờ tới cụ ông ngoài 70 cũng biết dùng, cụ không gõ được thì cụ nói với Google Assitance, ai mà chả xài được. Mà cái sự đời, già xài được thì trẻ xài được. Thằng Tèo học IT cũng thế, năm nay mới có đôi mươi, cậy mắt sáng nên nó ứ thèm dùng voice như ông nó. Ngồi cả ngày như cô hồn, chả buồn mồm cất lên câu nào. Tìm gì nó cũng gõ, tìm chỗ đá bida, nó gõ. Tìm nơi đá ph*, à nhầm đá gà, nó cũng gõ. Hot như ChatGPT nó cũng gõ nốt.

Gõ từ sáng tới tầm chập choạng chiều thì nó mới sực nhớ là nguyên ngày chưa ăn gì. Mà giờ lỡ xoá app shoppe đi rồi, lại lóc cóc ngồi gõ tìm ăn cơm gà. Đã lâu rồi nó chưa ăn cơm gà miền trung. Bao kí ức tuổi thơ ùa về, đĩa cơm gà mẹ nấu biết bao chan chứa tình yêu thương của mẹ.

Vốn cái sự đời, có thực mới vực được đạo. Tèo mắt nhắm mắt mở gõ “cơm ag mien trung”. Rõ ràng là gõ sai, nhưng kì lạ thay chị Google xinh đẹp vẫn hiểu. Độp phát ngay dưới là “Tèo, có phải mày muốn ăn cơm gà miền trung không?”, chị google đốp chát ngay với nó.

Ý lộn, đã là chị Google thì phải nhẹ nhàng chứ, xin sửa lại thành “Tèo, có phải tục tưng muốn ăn cơm gà miền trung không nè?”. Chị Google thỏ thẻ đáp.

Fuzzy search

1. Quyết chí

Quên cả đơn đói cồn cào, Tèo quyết tâm tìm hiểu xem làm sao, cơ sự thế nào, nguyên nhân do đâu mà chị Google lại khéo léo thế. Chị biết cả mình thích ăn cơm gà, mà tìm cơm gà chứ không phải cơm ag, ab.

Phen này quyết tìm ra cái bí mật ẩn sâu chôn dấu của chị Google. Tìm kiếm thêm hồi nữa với chị Google thì Tèo tìm ra từ khoá Fuzzy.

Ok, kết thúc lãng xẹt, ta vào bài hôm nay. Thuật toán Fuzzy search!

  Ứng dụng thuật toán và cấu trúc dữ liệu lúc đi làm
  Câu lệnh điều kiện trong Java

2. Fuzzy search là gì?

Vẫn là phân tích từ ngữ trước tiên, muốn nhớ lâu thì anh em nên nhớ từ. Bản thân từ khoá của thuật toán hay bất cứ định nghĩa nào đều có ý nghĩa hết.

Điển hình như Fuzzy, từ này thì có nhiều nghĩa, nhưng một trong số đó là nghĩa ngà ngà. Không phải ngà voi nha mấy anh hai. Ngà này là ngà trong ngà say rượu ấy.

Fuzzy search
Ngà này nè đồ quỷ xứ
Đâu suy luận xíu, à vậy tên cái thuật toán nó đùa nhau ghê. Say rượu thì làm sao gõ đúng được, mà dựa theo cái ví dụ trên chẳng phải là ông say rượu sẽ gõ tìm kiếm sai sao?

Tèo đọc tới đây có vẻ hơi cay, nhưng không sao. Cứ cho là tên cái thuật toán nó troll đi, cũng quyết chí tìm hiểu xem nó là cái gì?.

Ok định nghĩa

Fuzzy search is the process of finding strings that approximately match a given string. A fuzzy matching search algorithm will be able to find relevant strings even if your original string contains typo errors and misspellings. Fuzzy search là quá trình tìm kiếm các chuỗi gần khớp với một chuỗi đã cho. Thuật toán tìm kiếm Fuzzy sẽ tìm ra được các chuỗi không liên quan ngay cả khi chuỗi ban đầu có chứa lỗi đánh máy và lỗi chính tả.

Ngon, vậy là gõ sai nhờ Fuzzy search vẫn có kết quả. Mà còn suggest ra được kết quả gần đúng cơ. Thuật toán đúng ngon.

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

3. Sử dụng Fuzzy matching khi nào?

Fuzzy matching được sử dụng trong nhiều ứng dụng khác nhau. Chỉ riêng công cụ tìm kiếm mà nói thì công cụ tìm kiếm nào cũng có fuzzy matching. Thuật toán này giúp giải quyết sự phức tạp của chính tả.

Với các chị em có butter finger (tay vụng) thì fuzzy matching là vị cứu tinh. Gõ sai mà cũng hiểu thì còn gì nói nữa, quá tuyệt vời. Đôi khi fuzzy matching cũng được các công cụ tìm kiếm sử dụng để thu thập tìm kiếm người dùng. Tuy nhiên dữ liệu tìm kiếm này không đáng tin cậy (có thể do tiếng địa phương hoặc sự kết hợp giữa âm thanh và ngữ âm).

Fuzzy matching
Butter finger, từ thường được sử dụng cho những người vụng về.

4. Thuật toán đứng sau Fuzzy search

Fuzzy Search là tên thuật toán phổ biến và thường được sử dụng. Nhưng kì thực thuật toán giúp Fuzzy có thể tìm kiếm đúng với từ khoá nhập sai lại không phải tên là Fuzzy.

Có tới 6 thuật toán được sử dụng cho Fuzzy Matching. Nội dung bài viết này chỉ chú trọng phân tích thuật toán Naive Algorithm

4.1 Naive Algorithm

Trong số các thuật toán tìm kiếm theo pattern (theo mẫu) thì Naive Algorithm là thuật toán thường được dùng phổ biến nhất. Thuật toán này tìm kiếm tất cả các ký tự của chuỗi chính trong mẫu (pattern) được cung cấp. Bằng cách kiểm tra chuỗi nhập vào, ta có thể tìm thấy các chuỗi con (substring) ở trong đó.

Ngoài Naive, còn có các thuật toán khác được sử dụng. Tên của các thuật toán đó bao gồm:

  • Hamming Distance Algorithm
  • Levenstein Distance Algorithm
  • N-gram Algorithm
  • BK Tree Algorithm
  • Bitap Algorithm

Naive Algorithm

5. Ví dụ về Naive Algorithm

Naive Algorithm

Thuật toán Naive String kiểm tra tất cả các vị trí có thể có của pattern p[1..m] (m đây anh em hiểu là character index nha, từ 1 tới m, pattern p là chuỗi có độ dài m). Đem ra so sánh với mẫu string input vào t[1..n] (chuỗi string có độ dài n, t là input nhập vào).

Rồi, nhảy vào ví dụ luôn cho nó dễ hiểu vòng for ha.

// TEXT tìm kiếm
ACAACAA 
// PATTERN tìm kiếm
AAC

Lúc này giá trị n là length(T – Text) là 6. Giá trị m là length (P – Pattern) là 3. Cùng duyệt qua vòng for để tìm xem pattern xuất hiện ở đâu trong chuỗi text.

5.1 Step by step

Lần đầu tiên, P[0] == T[0] ok pass, nhưng ký tự thứ hai thì C với A lại không khớp.

Naive Algorithm

Nếu đã không khớp thì quay lại kiểm tra kí tự đầu tiên của P, với ký tự thứ hai của T, bắt đầu tại chính chỗ không khớp.

Naive Algorithm

Lần thứ hai này vẫn không khớp do A khác C. Lắc đầu quẹo phải phát nữa qua tới T[2]

Naive Algorithm

Lạy trúa khớp đây rồi, xanh rì như mạ mới gieo. Mà quên còn khúc cuối

Naive Algorithm

Khúc cuối thì lại không khớp rồi ha.

6. Tổng kết

Nội dung bài viết này giới thiệu về Fuzzy Search và thuật toán cơ bản nhất là Naive để tìm ra chuỗi con gần đúng nhất. Tuy nhiên thuật toán Naive còn tồn tại nhiều khuyết điểm như không thể tìm ra các chuỗi nếu như vị trí không liền mạch. Kiểu AABC mà BC ở phía trên chuỗi tìm kiếm lại không đứng cạnh nhau.

insertion:     bat → boat
deletion:      coat → cot
substitution:  coat → cost

Bài viết sau sẽ làm rõ hơn cho anh em vấn đề này.

7. Tham khảo

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

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

Xem thêm:

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

PL/SQL là gì? Hiểu sâu về PL/SQL

PL/SQL là gì? Hiểu sâu về PL/SQL

Anh em có cơ hội làm việc với hệ cơ sở dữ liệu Oracle sẽ không còn lạ lẫm gì với PL/SQL. Nhưng kiến trúc cụ thể của PL/SQL là gì? PLSQL có ưu nhược điểm gì không?

Bài viết dành cho anh em mới tập tành sử dụng PL/SQL nhưng cũng vô cùng bổ ích cho anh em đã có thời gian dài sử dụng.

PL/SQL là gì?
Ơ kìa, exception chỗ nào cũng cần được xử lý chứ

1. PL/SQL là gì?

Về SQL thì anh em không còn lạ lẫm gì. SQL là viết tắt của Structural Query Language (ngôn ngữ truy vấn có cấu trúc). Vậy PL trong PL/SQL là gì?

PL ở đây là Procedural Language extensions (phần mở rộng ngôn ngữ thủ tục). Bản thân SQL là cách thức giao tiếp chuẩn để làm việc với các hệ cơ sở dữ liệu RDBMS.

PL/SQL là thành phần mở rộng thêm. Thành phần này giúp khắc phục một số hạn chế của SQL, bênh cạnh đó PL/SQL cũng cung cấp các giải pháp ngôn ngữ lập trình toàn diện hơn giúp xây dựng các ứng dụng dựa trên hệ cơ sở dữ liệu Oracle.

PL/SQL

Chính bởi mục đích khắc phục một số hạn chế cố hữu của SQL nên PL/SQL là một ngôn ngữ bậc cao. Anh em có thể xem nó như là một ngôn ngữ lập trình.

PL/SQL
Procedure của PL/SQL sử dụng keywords như các ngôn ngữ tự nhiên, sao lại không giống code =)))

  Oracle SQL developer - Top 5 cách dùng thông minh

2. Đôi điều lưu ý về PL/SQL

Sau khi đã nắm được PL/SQL là phần mở rộng hơn của SQL, sử dụng để giao tiếp với hệ cơ sở dữ liệu Oracle. Tiếp theo đây sẽ là một vài lưu ý nhỏ cho anh em khi sử dụng PL/SQL

2.1 Embedded language – Ngôn ngữ nhúng

PL/SQL là ngôn ngữ nhúng, bản thân nó chỉ có thể thực thi trong hệ cơ sở dữ liệu Oracle. Do không thể hoạt động độc lập, anh em đừng nhầm lẫn nó với các ngôn ngữ lập trình khác như Java, C++.

Cũng chính vì phụ thuộc vào hệ cơ sở dữ liệu Oracle nên anh em khi sử dụng RDBMS khác như Postgres hay Maria, PL SQL lúc đó không có ý nghĩa gì nữa đâu nha.

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

PL/SQL

2.2 Hiệu suất cao

Bản thân PL/SQL là ngôn ngữ sinh ra để giao tiếp với hệ cơ sở dữ liệu. Nên so về hiệu suất, ở đây chưa bàn tới hiệu suất thực thi vì nó phụ thuộc vào hệ cơ sở dữ liệu.

Nếu chỉ so sánh về hiệu suất cách viết, độ dễ để viết thì PL/SQL hơn hẳn các ngôn ngữ khác như Java, Python, C++. Mặc dù các ngôn ngữ này đều có thể thao tác với hệ cơ sở dữ liệu thông qua ODBC.

  Oracle to Postgres, sự trỗi dậy của bầy voi!

Ngoài ra, nếu nói về hiệu suất, PL/SQL cung cấp FORALL, sử dụng FORALL sẽ mang lại hiệu suất tốt hơn so với việc thao tác bằng các ngôn ngữ khác.

PL/SQL

The FORALL statement issues a series of INSERTUPDATE, or DELETE statements, usually much faster than an equivalent FOR loop. Câu lệnh forall đưa ra một loạt câu lệnh INSERT, UPDATE hoặc DELETE, thường nhanh hơn nhiều so với vòng lặp for tương đương

3. Kiến trúc PL/SQL

Sơ bộ anh em có thể hình dung PL/SQL là ngôn ngữ hỗ trợ nằm ngoài Oracle, bằng cách nào đó ngôn ngữ viết bằng PL/SQL có thể được dịch ra thành SQL để thực thi ở hệ cơ sở dữ liệu Oracle. Vậy cụ thể kiến trúc PL/SQL như thế nào?

PL/SQL
Kiến trúc PLSQL

Theo như hình kiến trúc phía trên, PL/SQL sẽ chịu trách nhiệm biên dịch code anh em viết thành byte-code. Một đoạn code từ PL/SQL block được gửi tới PL/SQL Engine, đoạn code sẽ được biên dịch và thực thi ở Oracle Database Server.

4. Ưu nhược điểm của PL/SQL

4.1 Ưu điểm

  • PL/SQL cung cấp hiệu suất tốt hơn (cái này trong một vài trường hợp cụ thể thôi nha, không phải lúc nào cũng thế)
  • PL/SQL hỗ trợ Object-Oriented Programming concepts (nguyên lý lập trình hướng đối tượng), cho phép kế thừa, …) cái này tiện lợi cho anh em lập trình đã nắm vững nguyên lý OOP.
  • PL/SQL hỗ trợ nhiều công cụ phát triển Web (Web application)

4.2 Nhược điểm

  • Cái này thì chắc là xưa cũ rồi vì giờ máy anh em nào cũng mạnh. PL/SQL cần bộ nhớ nhiều (chạy tốn ram khá là khủng khiếp nha)
  • Ở các procedures thì tính năng debug không có, viết ra anh em phải debug bằng mắt chứ PL/SQL không hỗ trợ.

5. Ví dụ

Giải thích rồi, kiến trúc rồi. Giờ tới lúc cho anh em ví dụ về PL/SQL nha. Vì PL/SQL ở trên đã nói với anh em là giống như ngôn ngữ lập trình nên có một vài cú pháp anh em bắt buộc phải theo nha

Ví dụ như := là gán, 1..10 là từ 1 tới 10. Kết thúc vòng lặp thì phải là END LOOP.

-- available online in file 'sample1'
// Khai báo biến x bằng 100
DECLARE
   x NUMBER := 100;
BEGIN
   // Lặp i từ 1 tới 10
   FOR i IN 1..10 LOOP
      // Nếu i chia hết cho 2, i là số chẵn
      IF MOD(i,2) = 0 THEN     -- i is even
         // Thêm vào bảng tạm 1 dòng với cột thứ 3 kiểu chuỗi nói rằng i là số chẵn
         INSERT INTO temp VALUES (i, x, 'i is even');
      ELSE
         // Ngược lại thì cũng insert một dòng như i là số lẻ
         INSERT INTO temp VALUES (i, x, 'i is odd');
      END IF;
      // Tăng giá trị x thêm 100
      x := x + 100;
   END LOOP;
   // Chạy hết tất cả trong vòng for rồi insert một lượt vào DB, kiểu thực hiện toàn bộ câu iinssert một lần
   COMMIT;
END;

6. Tham khảo

Cảm ơn anh em đã dành thời gian – Thank you for your time – Happy coding!

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

Xem thêm:

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

List câu hỏi phỏng vấn NodeJS Developer hay và khó

List câu hỏi phỏng vấn NodeJS Developer hay và khó

NodeJS là một platform được viết bằng JavaScript để viết các ứng dụng Internet có khả năng mở rộng, đặc biệt là ở phía máy chủ web (server). Sự ra đời của NodeJS giúp các lập trình viên Frontend trước đây sử dụng JavaScript có thể dễ dàng học và viết code phía server cho Backend. Nhờ vậy mà nhu cầu tuyển dụng NodeJS hiện nay luôn ở mức cao và nhiều đãi ngộ hấp dẫn. Bài viết hôm nay mình cùng các bạn tìm hiểu qua list câu hỏi dành cho NodeJS Developer để có thể chuẩn bị buổi phỏng vấn một cách tốt nhất nhé.

Câu 1: NodeJS là gì? Nó có thể làm được những gì?

NodeJS là một môi trường để chạy các đoạn code JavaScript được xây dựng dựa trên Engine V8 của Chrome. NodeJS được tạo ra từ những năm 2009, là một mã nguồn mở hỗ trợ đa nền tảng.

Khác với hầu hết các chương trình JavaScript, NodeJS không chạy trên một trình duyệt mà chạy trực tiếp trên Server; điều này có ý nghĩa rất lớn đối với các lập trình viên học ngôn ngữ JavaScript khi giờ đây họ có thể dùng chính ngôn ngữ lập trình của mình để làm cả client và server; hay nói cách khác là trở thành một Fullstack Developer một cách dễ dàng hơn bao giờ hết.

NodeJS lập trình theo hướng sự kiện và mô hình I/O non-blocking; nó được đánh giá là nhẹ và rất hiệu quả; vì thế NodeJS có thể được sử dụng để xây dựng các loại ứng dụng khác nhau như ứng dụng web, ứng dụng thời gian thực (realtime), máy chủ API REST, …

Câu 2: Hãy giải thích về mô hình I/O non-blocking trong NodeJS

Blocking là khái niệm đề cập đến hành động chặn thực thi các hoạt động tiếp theo để chờ 1 hoạt động kết thúc; ngược lại thì non-blocking chỉ việc sẽ không chặn. Trong Node, Non-blocking chủ yếu đề cập đến các hoạt động nhập xuất dữ liệu (I/O – input/output); tất cả các function xử lý I/O trong thư viện chuẩn của NodeJS đều cung cấp phiên bản đồng bộ, bất đồng bộ và chấp nhận các hàm callback. 

Thay vì việc cần chờ các hoạt động nhập xuất dữ liệu thực hiện xong thì các hoạt động tiếp theo vẫn có thể được thực thi ngay lập tức; riêng luồng I/O ở trên sẽ được ủy quyền cho hệ thống để thực hiện riêng song song, khi hoàn tất sẽ thực hiện việc gọi lại function callback để xử lý hành động tiếp theo.

  NodeJS version manager: Quản lý đa phiên bản NodeJS trên máy tính

Câu 3: Lập trình hướng sự kiện là gì?

Trong lập trình, events là các hành động do người dùng hoặc hệ thống tạo ra, ví dụ như click một button, hover chuột lên đoạn văn bản, một lần người dùng upload tệp lên website, … Ứng dụng do chúng ta viết ra luôn phải quan tâm đến các events xảy ra bên trong, do người dùng hoặc từ các nguồn khác tác động đến để xử lý các hành động thực thi tương ứng.

Lập trình hướng sự kiện (event-driven programming) là mô hình lập trình mà trong đó luồng thực thi chương trình được xác định bởi các sự kiện (events). NodeJS xây dựng dựa trên lập trình hướng sự kiện, tức là source code viết ra để đáp ứng với các sự kiện tác động lên ứng dụng, chúng ta cần viết code lấy thông tin của các sự kiện cùng tham số đầu vào, tiếp đến là xử lý thực thi hành động và trả về kết quả tương ứng.

  Một thủ thuật nhỏ để tối ưu code nodejs

Câu 4: NodeJS hỗ trợ đa luồng không?

NodeJS ban đầu chỉ hỗ trợ đơn luồng (single thread) và chỉ xử lý nhiều hoạt động bằng các quy trình không đồng bộ và không hỗ trợ đa luồng. Bắt đầu từ version 13, NodeJS có bổ sung thêm 1 module mới được gọi là worker thread để support xử lý đa luồng.

Module worker thread giúp cô lập chức năng sử dụng CPU dung lượng cao thành một luồng xử lý riêng biệt và chạy trong chế độ nền (background mode) và sẽ không làm nghẽn bất kỳ các quy trình nào khác. 

Tuyển dụng NodeJS lương cao hấp dẫn cho bạn

Câu 5: NPM là gì?

NPM hay Node Package Manager là chương trình quản lý thư viện ngầm định trong môi trường NodeJS; nó bao gồm một command line từ client (npm) và cơ sở dữ liệu trực tuyến chứa các gói public và private còn được gọi là npm registry.

NPM mang đến cho lập trình viên NodeJS một kho thư viện mở được đóng gói dưới dạng các package. Các lập trình viên từ khắp mọi nơi trên thế giới có thể đóng góp các package, chia sẻ miễn phí và sẽ được sử dụng lại ở các dự án khác nhau bằng cách khai báo trong file package.json.

Câu 6: REPL trong NodeJS là gì?

REPL là viết tắt của Read, Eval, Print và Loop là một đặc tính của NodeJS cho phép lập trình viên viết code và chạy trực tiếp trên màn hình shell/console/terminal để debug, kiểm tra code mà không cần tạo ra bất cứ file hay folder nào.

Khi gõ code JavaScript lên màn hình shell, NodeJS sẽ thực hiện việc đọc thông tin (Read) và tự động lưu trữ trong bộ nhớ; tự động đánh giá cấu trúc dữ liệu và sự hợp lệ của các dòng lệnh (Eval); xử lý thực thi code sau đó in ra kết quả nếu có (Print) và hỗ trợ lặp lại các dòng lệnh trên để thực thi chương trình (Loop).

Câu 7: Các framework nổi tiếng chạy trên NodeJS

Với những ưu điểm của mình, có nhiều framework được tạo ra chạy trên nền NodeJS chủ yếu là hỗ trợ xây dựng ứng dụng phía server bằng JavaScript. Có thể kể ra một số framework như dưới đây:

  • ExpressJS: thiết kế để xây dựng các ứng dụng một trang (single page application), đồng thời cung cấp bộ tính năng phong phú hỗ trợ các ứng dụng web và di động. ExpressJS cũng thường được sử dụng để xây dựng các APIs một cách tối giản và nhanh chóng
  • KoaJS: đây cũng là một web framework và được phát triển bởi chính team phát triển Express. Koa nổi bật hơn ở khả năng sử dụng middleware theo từng tầng và kiểm soát lỗi tốt hơn. Ngoài ra phong cách code của Koa sáng sủa và dễ kiểm soát hơn so với Express.
  • Sails: là một MVC framework cho NodeJS giúp đơn giản hóa việc xây dựng ứng dụng, khả năng mở rộng mạnh mẽ.
  • Meteor: đây là một nền tảng cho phép xây dựng các ứng dụng kết hợp NodeJS với một frontend framework như Angular, React, … sử dụng MongoDB làm cơ sở dữ liệu mặc định

Câu 8: Stream trong NodeJS là gì?

Stream là các đối tượng cho phép bạn đọc dữ liệu từ một nguồn và ghi dữ liệu đến một đích. Trong NodeJS, Steam có 4 loại:

  • Readable: sử dụng cho hoạt động đọc
  • Writable: sử dụng cho hoạt động ghi
  • Duplex: sử dụng cho cả 2 mục địch đọc và ghi
  • Transform: là một kiểu Duplex Stream, hỗ trợ tính toán kết quả đầu ra dựa trên dữ liệu đầu vào

Kết bài

Trên đây là danh sách những câu hỏi phỏng vấn mà bạn thường gặp nhất cho vị trí NodeJS Developer. NodeJS thường sẽ được hỏi cùng các kiến thức liên quan đến JavaScript, vì thế bạn cũng nên chuẩn bị thêm các câu hỏi về ngôn ngữ lập trình này. Hy vọng bài viết đã mang lại những kiến thức hữu ích dành cho bạn.

Tác giả: Phạm Minh Khoa

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

Xem thêm việc làm Developer trên TopDev

Facebook giới thiệu LLaMA tạo siêu AI cạnh tranh với ChatGPT

Facebook giới thiệu LLaMA tạo siêu AI cạnh tranh với ChatGPT

ChatGPT thực sự đang là một hot trend công nghệ từ đầu năm 2023 cho đến nay. Với sự ra mắt ChatGPT ấn tượng của Microsoft thì các ông lớn khác cũng đã tham gia cuộc đua siêu AI này. Mới nhất thì ngày 24/2 vừa qua, CEO của Meta Mark Zuckerberg thông báo trên trang Facebook cá nhân của mình về một mô hình ngôn ngữ lớn mới được gọi là LLaMA giúp có thể tạo ra những chatbot siêu AI trong tương lai. Bài viết hôm nay chúng ta cùng nhau tìm hiểu những thông tin liên quan đến mô hình này nhé.

Chatbot AI là gì?

Chatbot là một hệ thống chat giao tiếp với người dùng thông qua các dòng text với mục đích để phản hồi các câu hỏi mà người dùng đưa ra. Chatbot truyền thống được xây dựng dựa trên các nguyên tắc và luồng hội thoại xác định từ trước; từ đơn giản như việc người dùng được yêu cầu nhấn vào các nút bấm hay phức tạp hơn bằng việc nhận diện ý định của người dùng qua một số keyword đã được lập trình sẵn. Cũng vì hạn chế về khả năng hội thoại và rập khuôn, kém tự nhiên khiến Chatbot truyền thống không được đón nhận từ người dùng.

Chatbot AI là gì?

Với sự phát triển của trí thông minh nhân tạo, Chatbot AI đã nâng tầm chatbot lên một thế hệ mới. Nhờ sự trợ giúp của AI, chatbot bây giờ có thể tạo ra các tương tác tự nhiên hơn, khả năng đa nhiệm, đa ngôn ngữ, xử lý một lượng dữ liệu khổng lồ với tốc độ cao để đưa ra phản hồi cho người dùng.

Điều đáng nói hơn là AI Chatbot có thể học ngay từ những cuộc trò chuyện với người dùng, từ đó quá trình học máy (machine learning) lại được bổ sung và hoàn thiện dần thêm. 

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

Hiện tượng ChatGPT

ChatGPT ra mắt vào cuối năm 2022, đầu năm 2023 thực sự tạo ra một cơn sốt trên toàn cầu nhờ việc nó có thể hồi đáp chi tiết và trả lời lưu loát trên nhiều lĩnh vực kiến thức khác nhau. ChatGPT sử dụng phương pháp học có giám sát supervised learning cùng với phương pháp học tăng cường reinforcement learning.

CHAT GPT

Hình dung một cách đơn giản thì ChatGPT như là một cỗ máy Google biết lựa chọn kết quả hợp lý nhất để đưa ra cho người dùng. Chỉ sau 2 tháng ra mắt, ChatGPT đã đạt được 100 triệu người dùng trở thành ứng dụng tiêu dùng phát triển nhanh nhất trong lịch sử.

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

Cuộc đua chatbot AI bắt đầu

Với việc phát triển thần kỳ của ChatGPT, các ông lớn khác cũng không thể ngồi yên. Google, ông lớn trong mảng tìm kiếm cũng có kế hoạch cho ra mắt chatbot Bard với mô hình ngôn ngữ lớn gọi là LaMDA. Và mới đây nhất, Mark Zuckerberg cho biết đã phát hành mô hình ngôn ngữ mới được gọi là LLaMA nhằm giúp các nhà phát triển xây dựng chatbot AI của mình.

LLaMA viết tắt của Large Language Model Meta AI – mô hình ngôn ngữ lớn về AI của Meta, nó hoạt động dưới dạng opensource, hoàn toàn miễn phí cho phép các nhà nghiên cứu, tổ chức chính phủ, xã hội sử dụng miễn phí. LLaMA tập trung hỗ trợ cho 20 ngôn ngữ dùng bảng chữ cái Latinh, đáng tiếc là Tiếng Việt của chúng ta chưa nằm trong danh sách này.

LLaMA và chatgpt

LLaMA của Meta có thế mạnh gì

Theo như Meta công bố, mô hình LLaMA có tối đa 65 tỷ tham số, bằng một phần ba so với ChatGPT nhưng bù lại nó được huấn luyện trên 1.400 tỷ từ, cao gấp 5 lần siêu AI của OpenAI.

Meta tuyên bố LLaMA có thể vượt trội các đối thủ trong một số tình huống cụ thể. Với 65 tỷ tham số, nó không hề thua kém Chinchilla70B và PaLM-540B của Google. Mô hình này cho thấy rất nhiều hứa hẹn trong việc tạo văn bản, trò chuyện, tóm tắt tài liệu bằng văn bản và các nhiệm vụ phức tạp hơn như giải các định lý toán học hoặc dự đoán cấu trúc protein.

Zuckerberg viết trên trang cá nhân của mình rằng Meta cam kết với mô hình nghiên cứu mở này và họ sẽ cung cấp mô hình này cho toàn bộ cộng đồng nghiên cứu AI. Điều này mở ra một tương lai cho những ngành nghiên cứu khoa học có thể sử dụng và phát triển nó một cách lớn mạnh hơn.

  Làm thế nào để biến ChatGPT thành một "chuyên gia"?

Tương lai của siêu Chatbot AI

Với sự tham gia của đầy đủ các ông lớn trên mặt trận công nghệ này, Microsoft với đầu tư vào ChatGPT và triển khai mô hình trên công cụ tìm kiếm Bing; Google thì đã có sẵn khả năng tìm kiếm tuyệt vời của mình đang phát triển Bard; và giờ đây là Meta Facebook với mô hình LLaMA đầy hứa hẹn. Ngoài ra còn các công ty công nghệ lớn đến từ Châu Á như Baidu đang có ý định tham gia cuộc chơi với chatbot có tên là Ernie Bot. Các sản phẩm này trước hết sẽ mang lại cho người dùng chúng ta nhiều lợi ích và trải nghiệm công nghệ tuyệt vời, sau đó chính là sự khẳng định vị thế của các ông lớn.

Hãy cùng chờ xem chatbot nào sẽ chiếm được thị trường trong tương lai và góp phần định hướng mô hình kinh doanh của các tập đoàn lớn trong thời gian sắp tới. Cảm ơn các bạn đã đọc bài, hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

Xem thêm tuyển dụng it mới nhất tại TopDev

Oracle SQL developer – Top 5 cách dùng thông minh

Oracle SQL developer - Top 5 cách dùng thông minh

Anh em có kinh nghiệm làm việc với nhiều hệ cơ sở dữ liệu, nếu đã làm việc với hệ cơ sở dữ liệu Oracle chắc không còn lạ gì Oracle SQL developer.

Oracle SQL developer là công cụ miễn phí do Oracle phát triển, giúp anh em làm việc với hệ cơ sở dữ liệu Oracle. Bài viết này giới thiệu tới anh em một số tính năng chính, cách sử dụng sao cho hiệu quả công cụ này.

Mong rằng bài viết này sẽ hữu dụng với anh em bước đầu làm quen với hệ cơ sở dữ liệu Oracle. Những anh em có kinh nghiệm cũng có thể tra cứu một số thủ thuật được đề cập trong bài viết.

Rồi, bắt đầu thôi anh em. Tiền đề là đã cài đặt và kết nối thành công vào DB Oracle thông qua Oracle SQL developer nha.

1. Oracle SQL Developer là gì?

Dành cho anh em mới bước đầu làm quen với Oracle SQL developer.

Oracle SQL developer là giao diện người dùng (Graphical user interface), cho phép người dùng và quản trị viên hệ cơ sở dữ liệu thực hiện các tác vụ liên quan tới hệ cơ sở dữ liệu. Là một công cụ giúp tăng năng suất, SQL Developer giúp người dùng tiết kiệm tối đa thời gian và tối đa hoá khả năng làm việc.

  Oracle to Postgres, sự trỗi dậy của bầy voi!

2. Schema Browser  – Tìm kiếm schema

Nếu DB của anh em có nhiều schema, Oracle SQL developer có hỗ trợ anh em tìm kiếm các schema đó nhanh chóng bằng cách vào Schema Browser.

Oracle SQL developer

Với schema browser, anh em có thể nhanh chóng tìm Tables, Views, Indexes, Packages, Procedures, Functions, Operators, Triggers, Types, Sequences, Materialized Views, Synonyms của cả cái schema đó.

Oracle SQL developer

Với Schema Browser, nhiều schema trong một DB giờ đây dễ quản lý và tìm kiếm hơn rất nhiều.

  Cài đặt PostgreSQL server sử dụng Docker

Ngoài ra, nếu trong schema có nhiều table với tên prefix, suffix giống nhau. Anh em có thể tìm kiếm contains chuỗi.

Oracle SQL developer

 

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

3. Find DB object  – Bắt tôi đi nếu có thể

Oracle SQL developer hỗ trợ tìm kiếm phụ thuộc (dependencies) của object (đối tượng) trong toàn hệ cơ sở dữ liệu.

Ví dụ ở table quản lý order anh em có lưu order id, nhưng trong synotyms cũng có, trong một views nào đó anh em cũng có dùng tới. Nếu không có tài liệu cụ thể thì làm sao biết order id đã được sử dụng ở đâu?

Find DB object có thể giúp được

Oracle SQL developer

Đầu tiên anh em chuột phải vào view, chọn Find DB Object. Phía dưới sẽ xuất hiện cửa sổ để tìm kiếm.

Trong cửa sổ này có thể lựa chọn schema search, kiểu của object. Sau khi đã lựa chọn xong thì anh em bấm search. Nếu DB anh em cực lớn, anh em có thể cho tìm kiếm chạy background

Oracle SQL developer

Sau khi đã tìm kiếm xong, anh em có thể thấy kết quả chi tiết objects anh em muốn tìm đã được sử dụng ở đâu, mục đích gì?

Oracle SQL developer

Như cái order id dưới đây thì nó được sử dụng trong trigger old line.

Oracle SQL developer

4. Database compare – Tìm sự khác biệt

Trong hệ cơ sở dữ liệu, anh em có thể tạo ra nhiều các schema. Vậy trường hợp muốn so sánh sự khác nhau giữa các schema anh em làm thế nào?

Rất may là Oracle SQL developer hỗ trợ Database Diff để tìm kiếm sự khác biệt giữa 2 schema. Để sử dụng tính năng này, anh em vào Tools -> Database Diff. Sau khi mở lên anh em lựa chọn database connection mình muốn.

Oracle SQL developer

Source connection là DB đầu tiên, Destination là DB thứ hai anh em muốn compare. Một số thông số khác để compare giữa hai DB như là Ignore Table (bỏ qua table, vị trí column).

Ở bước thứ hai anh em lựa chọn các kiểu object anh em muốn so sánh.

Oracle SQL developer

Bước thứ 3 nếu có objects nào đặc biệt anh em có thể lựa chọn. Tới bước cuối cùng thì kết quả so sánh sẽ hiện ra ở dạng tổng quát (summary).

Oracle SQL developer

Bảng so sánh tóm tắt sẽ hiện ra sau khi so sánh. Anh em có thể bấm vào chi tiết để xem sự khác biệt.

Oracle SQL developer

Như ví dụ dưới đây thì PKG_OE_CUST có ở database LOCAL_OE nhưng không xuất hiện ở LOCAL_PROD. Bất cứ objects nào có ở schema này nhưng không có ở schema kia sẽ được highlight lên bằng màu xanh.

5. Báo cáo (Reports) – Cho biết tất cả

Oracle SQL developer cung cấp report cho phép duyệt nhanh toàn bộ hệ cơ sở dữ liệu. Thay vì viết query truy vấn để kiểm tra bằng tay, anh em có thể sử dụng công cụ report của Oracle SQL developer.

Để sử dụng report, anh em vào Views -> Reports. Một cửa sổ sẽ mở lên bao gồm tất cả các reports đang có.

Đầu tiên là Invalid objects, báo cáo này cho biết tất cả các object đang sai, reports này hữu ích giúp đảm bảo trước khi lên production, anh em không có đối tượng nào đang bị sai trong hệ cơ sở dữ liệu.

Object Grants report – báo cáo này cho biết tổng thể các gán đã được thực thi cho các schema độc lập.

Ngoài các báo cáo tổng quan này, nếu anh em muốn tạo report riêng lẻ hoặc custom theo mục đích khác. Anh em có thể lựa chọn phần tạo report (Reports -> User Defined Reports). Sau đó chọn New Report. Ở cửa sổ này, anh em có thể thoải mái tạo các report theo SQL (tuỳ nhu cầu muốn report là gì?).

Sau khi chạy, kết quả report sẽ hiện ra dạng bảng như query, nhưng giúp anh em truy xuất dễ hơn về sau.

6. Pinning – Ở đâu cứ ở yên đó

Tính năng này trong Oracle SQL developer thực chất là tính năng nhỏ, nhưng cực kì hữu ích. Đặc biệt nếu anh em mới lần đầu sử dụng SQL Developer. Query thì anh em viết nhiều nhưng khi mở nhiều thì Oracle SQL Developer sẽ tự động đóng đi một vài cái.

Ví dụ anh em mở bảng oe.customers, sau đó mở thêm bảng oe.oc_inventories, lúc đó cửa sổ bảng customers sẽ bị đóng lại. Nhưng anh em vẫn muốn xem?

Lúc đó tính năng pinning trở nên hữu ích.

Bất cứ cửa sổ nào anh em muốn giữ lại, anh em có thể ấn vào icon hình kim ở phía trên. Lúc đó tab pin sẽ không bị đóng lại tự động, phải đóng bằng tay, tức là chỉ đóng khi nào anh em muốn đóng.

7. Tham khảo

Trong quá trình sử dụng sẽ còn nhiều hơn tips và tricks khi dùng Oracle SQL Developer. Hẹn anh em ra bài phần 2 sẽ bổ sung nhiều hơn các thủ thuật, cách dùng khác.

Cảm ơn vì anh em đã tập trung – Thank you for your focus – Happy coding!

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

Xem thêm:

Xem thêm tuyển dụng nhân viên it hấp dẫn trên TopDev

Các phần mềm giả lập Java dành cho máy tính tốt nhất

Các phần mềm giả lập Java dành cho máy tính tốt nhất

Java là một ngôn ngữ lập trình hỗ trợ đa nền tảng, nhất là trên các thiết bị di động, chúng ta có thể dễ dàng viết ứng dụng bằng Java sau đó build source code thành những tập tin .jar và chạy được trên điện thoại. Để có thể thử nghiệm các ứng dụng viết ra trực tiếp trên máy tính, các lập trình viên có thể sử dụng các phần mềm giả lập Java cho máy tính để có thể kiểm tra, thử nghiệm và tiết kiệm được thời gian. Bài viết hôm nay mình cũng các bạn tìm hiểu về các phần mềm giả lập Java phổ biến hiện nay nhé.

Phần mềm giả lập là gì?

Phần mềm giả lập là một chương trình cho phép hệ thống bắt chước giống như một hệ thống khác, chẳng hạn như phần mềm giả lập một điện thoại chạy trên máy tính. Chương trình giả lập cho phép các hoạt động bên trong nó chạy tương tự với trên thiết bị thật, có thể sử dụng các thiết bị ngoại vi được thiết kế riêng.

Chúng ta có thể dễ gặp các phần mềm giả lập nổi tiếng như: giả lập console để chơi các tựa game console trên máy tính, giả lập điện thoại để chạy được các ứng dụng smartphone trên máy tính,….

Lợi ích của việc sử dụng phần mềm giả lập:

  • Cho phép lập trình viên kiểm tra ứng dụng viết ra trên thiết bị “giống” thật nhất có thể để chỉnh sửa lại ứng dụng nếu cần
  • Phần mềm giả lập cho phép lựa chọn nhiều thiết lập về màn hình, phần cứng,… khác nhau, điều mà mỗi thiết bị thật chỉ cung cấp được 1 lựa chọn duy nhất. Từ đó có thể kiểm tra được các lỗi liên quan đến responsive, version hệ điều hành,…
  • Tiết kiệm thời gian ở giai đoạn kiểm thử, có thể tích hợp việc kiểm thử tự động trên các thiết bị giả lập.
  • Tiết kiệm chi phí trang bị thiết bị phần cứng

  Cách Thiết Lập Máy Ảo, Máy Thật & Khởi Chạy Ứng Dụng Trong Android

  Top 3 phần mềm giả lập Java trên Android tốt nhất

Giả lập Java trên máy tính

Giả lập Java trên PC là gì?

Giả lập Java trên máy tính thường được hiểu là việc tạo ra một môi trường trên máy tính để chạy các ứng dụng Java. Tuy nhiên, cụm từ “giả lập Java” có thể dễ gây hiểu nhầm, vì thực chất, việc chạy các ứng dụng Java trên máy tính không cần đến một “trình giả lập” theo nghĩa truyền thống và không yêu cầu phần mềm giả lập đặc biệt mà chỉ cần môi trường chạy Java (Java Runtime Environment – JRE) và các công cụ phát triển Java (Java Development Kit – JDK).

  Hướng dẫn giả lập Java trên iOS nhanh chóng và hiệu quả

Các công cụ và môi trường để chạy Java trên máy tính

  1. Java Runtime Environment (JRE): JRE là một phần của Java Development Kit (JDK) và bao gồm mọi thứ bạn cần để chạy các ứng dụng Java, bao gồm Java Virtual Machine (JVM), thư viện lõi và các thành phần khác.
  2. Java Development Kit (JDK): JDK bao gồm JRE và các công cụ phát triển như trình biên dịch javac, trình gỡ lỗi jdb, và nhiều công cụ khác. Để phát triển ứng dụng Java, bạn cần cài đặt JDK.
  3. Integrated Development Environment (IDE): Các IDE như IntelliJ IDEA, Eclipse, và NetBeans cung cấp một môi trường phát triển tích hợp để viết, gỡ lỗi và triển khai các ứng dụng Java. Chúng cũng đi kèm với nhiều công cụ và tiện ích để tăng hiệu suất phát triển.

Cách thức hoạt động

1. Cài đặt JDK và IDE

  • Bước 1: Tải xuống và cài đặt JDK từ trang web chính thức của Oracle hoặc các nhà cung cấp khác như OpenJDK.
  • Bước 2: Cài đặt một IDE yêu thích của bạn (như IntelliJ IDEA, Eclipse hoặc NetBeans).

2. Viết và biên dịch mã nguồn Java

  • Bước 1: Mở IDE và tạo một dự án Java mới.
  • Bước 2: Viết mã nguồn Java trong các tệp .java.
  • Bước 3: Biên dịch mã nguồn bằng công cụ biên dịch tích hợp của IDE hoặc sử dụng lệnh javac trong dòng lệnh.
public class HelloWorld {
 public static void main(String[] args) {
 System.out.println("Hello, World!");
 }
}

3. Chạy ứng dụng Java

  • Bước 1: Sau khi biên dịch, các tệp .class được tạo ra.
  • Bước 2: Chạy ứng dụng bằng cách sử dụng JVM. Điều này có thể được thực hiện thông qua IDE hoặc sử dụng lệnh java trong dòng lệnh

java HelloWorld

4. Debug và kiểm thử

  • IDE cung cấp các công cụ gỡ lỗi mạnh mẽ cho phép bạn đặt điểm dừng (breakpoints), theo dõi giá trị biến và kiểm tra luồng thực thi của chương trình.
  • Bạn có thể viết các bài kiểm thử đơn vị (unit tests) bằng cách sử dụng các thư viện như JUnit để đảm bảo rằng mã của bạn hoạt động như mong đợi.

Lợi ích của việc sử dụng môi trường phát triển Java

Các tính năng chính của các phần mềm giả lập Java:

  • Chạy các ứng dụng java trên PC
  • Người dùng thường sử dụng giả lập cho các game để trải nghiệm trực tiếp trên PC
  • Lập trình viên sử dụng để kiểm tra các ứng dụng Java được viết ra
  • Hỗ trợ bàn phím tương tự các thiết bị thật, bao gồm các phím bấm điều hướng và bàn phím số, chữ
  • Hoạt động mượt mà do cấu hình không đòi hỏi cao, có thể chạy đồng thời nhiều thiết bị, nhiều cấu hình máy

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

Các phần mềm giả lập Java trên PC tốt nhất

KEmulator

KEmulator là ứng dụng miễn phí giúp giả lập Java trên PC một cách dễ dàng. Dung lượng ứng dụng nhẹ, giao diện thân thiện với người dùng, có thể cài đặt hầu hết các game Java dành cho điện thoại. 

KEmulator

KEmulator cho phép giả lập các thiết bị điện thoại của nhiều hãng khác nhau, từ Nokia, Samsung, Sony,… với đầy đủ các dòng, phiên bản nổi tiếng của các hãng. KEmulator có thể chạy trực tiếp như một ứng dụng trên PC mà không cần cài đặt, nó hỗ trợ khá tốt cả các ứng dụng, game chạy online cần kết nối mạng Internet một cách bình thường. Việc tùy chính phím bấm phù hợp với yêu cầu thao tác trực tiếp trên bàn phím cũng là một ưu điểm mà KEmulator mang lại cho người dùng.

MicroEmulator

MicroEmulator

MicroEmulator là một lựa chọn giả lập nhanh và nhẹ, thích hợp cho các lập trình viên muốn thử nghiệm ứng dụng của mình. MicroEmulator nhẹ hơn khá nhiều so với Kemulator, ngoài ra nó còn hỗ trợ chuột giống như trên các điện thoại màn hình cảm ứng. Phần mềm này hoạt động với các thư viện đồ họa khác nhau như Swing hay SWT, hỗ trợ các chuẩn API từ Nokia, hỗ trợ MIDP 2.0, hỗ trợ FileConnection API,…

MicroEmulator cũng hoàn toàn miễn phí, hỗ trợ kéo thả để cài đặt ứng dụng một cách nhanh chóng và dễ dàng.

Sun Java Wireless Toolkit

Đây có thể xem là cây nhà lá vườn của Java do Oracle cung cấp, nó còn có tên khác là J2ME Wireless Toolkit.

Sun Java Wireless Toolkit

Ưu điểm lớn nhất của phần mềm giả lập này là khả năng tương thích với bất cứ ứng dụng Java nào nhờ sự hỗ trợ đến từ Oracle. J2ME tool hỗ trợ tốt nhất cho các lập trình viên trong việc theo dõi hoạt động của thiết bị, debug các hoạt động thực thi trên ứng dụng vì thế phần mềm này thường được sử dụng trong việc lập trình phát triển ứng dụng Java.

Kết bài

Hiện nay với sự phát triển của smartphone và các hệ điều hành trên thiết bị di động, việc giả lập Java để chơi game trên PC cũng ít hơn. Tuy vậy đối với lập trình viên thì đây vẫn là những công cụ hữu ích dành cho việc phát triển phần mềm bằng ngôn ngữ Java. Hy vọng bài viết đã giúp bạn có thêm những kiến thức về phần giả lập phần mềm, hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

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

Blockchain developer là gì? Giải ngố những hiểu lầm

Blockchain developer là gì? Giải ngố những hiểu lầm

Rất nhiều người hiểu sai về blockchain và blockchain developer. Mặc định rằng công nghệ blockchain nói chung và lập trình blockchain (blockchain developer) đều gắn chặt hoặc chỉ liên quan tới tiền kĩ thuật số. Thực chất blockchain có nhiều thứ có thể hiện thực hơn so với danh tiếng của nó.

Bài viết này sẽ giải ngố cho anh em công việc mà blockchain developer làm. Những hiểu lầm khi anh em bắt đầu với blockchain.

blockchain developerGiàu thiệt hay giàu chơi mà vàng đeo đầy người vậy trời.

Ok, giải ngố bắt đầu. Anh em cố gắng theo dõi nha.

Đầu tiên vẫn là khái niệm mà đôi khi anh em hiểu lầm về blockchain. Vậy blockchain là gì?

1. Blockchain là gì?

A blockchain is a type of database used to store and organize information. Traditional databases arrange information into rows and columns that make up tables. This makes the information easy for computers to recognize. With blockchains, however, information is digitally formatted and collected into clusters or blocks. Each block has a limited storage capacity.

Blockchain là một kiểu cơ sở dữ liệu được sử dụng để lưu trữ và sắp xếp thông tin. Khác với cơ sở dữ liệu truyền thống lưu trữ ở dạng hàng và cột trong bảng (cái này anh em nào đã dùng DB và SQL thì quá quen). Kiểu này dễ cho việc thu thập và xử lý thông tin. Với blockchain thì dữ liệu được lưu ở dạng số và chia thành các khối (blocks). Mỗi block có dung lượng lưu trữ giới hạn.

blockchain developerCentralized là tập trung. Mang ý nghĩa tất cả dữ liệu đều sẽ tập trung lại ở một chỗ.

Với blockchain thì ngược lại, như trên định nghĩa anh em cũng thấy đoạn “mỗi block có dung lượng lưu trữ giới hạn”. Nên đến khi hết dữ liệu ở một block dữ liệu sẽ được đem qua block khác. Vậy hai khối sẽ liên hệ với nhau như thế nào?

Câu trả lời là khoá (cryptography). Khoá này xác định và đảm bảo tính chính xác của thông tin mặc dù nó được lưu ở nhiều nơi.

blockchain developer

Với tính chất đột phá về cách thức lưu trữ dữ liệu chia thành các khối. Blockchain có rất nhiều ứng dụng:

  • Smart contract (hợp đồng thông minh)
  • Banking sphere (lĩnh vực ngân hàng)
  • Secure payments (thanh toán an toàn)

  Tiềm năng ứng dụng thực tế của blockchain & Web3
  Xu hướng phát triển của IoT hiện nay
2. Tại sao blockchain được ứng dụng nhiều

Do tính chất phi tập trung (decentralized) của blockchain. Thay vì toàn bộ dữ liệu nằm ở một chỗ và được quản lý tập trung thì tất cả được chia nhỏ ra. Tới đây một số anh em sẽ hỏi có khác cũng là khác cách thức lưu dữ liệu. Vậy tại sao blockchain nói chung và anh em blockchain developer lại có lương cao khủng khiếp?

Câu trả lời nằm ở chỗ công nghệ loại bỏ tính tập trung khi giao dịch.

2.1 Sổ cái

Tới đây phải cho ví dụ về sổ cái rồi.

Ví dụ, ông A gửi tiền cho ông B qua ngân hàng, gửi 10 đồng. Ngân hàng biết ông A có 20 đồng, trừ của ổng đi 10 đồng. Ông B có 5 đồng thì cộng thêm 10 đồng thành 15 đồng. Ok ngân hàng là bên trung gian, ta tin ngân hàng.

Vậy câu hỏi không có ngân hàng đừng ra trung gian làm nơi tin tưởng thì hai ổng giao dịch thế nào?

Câu trả lời là sổ cái. Ông A ghi vào sổ 20 đồng, ông B ghi vào sổ 5 đồng. Công khai cái sổ đó ra cho cả xóm biết, tức là mỗi lần giao dịch cả xóm sẽ biết ông A còn có 10 đồng thôi, ông B tăng lên được 15. Cuốn sổ lưu tất cả giao dịch đó là sổ cái.

Với sổ cái, ta loại bỏ đi đơn vị đứng giữa để tin tưởng là ngân hàng. Ông A khi muốn thêm bớt tiền gì đều phải được cả xóm đồng ý.

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

2.2 Các transactions

Chính nhờ sổ cái, blockchain vô hình chung loại bỏ đi cái tập trung của hệ cơ sở dữ liệu truyền thống. Tăng tính bảo mật nhờ xác thực của tất cả các node trước khi thêm vào mạng blockchain (mạng các chuỗi)

blockchain developer

Khi anh em tạo một transactions, blockchain sẽ tạo ra một block đại diện cho giao dịch đó. Sau đó các nodes trong hệ cơ sở dữ liệu sẽ kiểm tra xem transaction đó có hợp lệ không?. Nếu hợp lý thì transaction sẽ được thêm vào mạng blockchain hiện tại.

Sau khi đã thêm thắt đâu vào đó, transaction lúc này hoàn thành.

Transaction về tiền điện tử chỉ là một ví dụ nhỏ về ứng dụng blockchain vào trong các lĩnh vực khác nhau mà tiền điện tử là một trong số đó. Sau khi anh em đã clear phần này thì mình sẽ tìm hiểu tiếp thực chất phát triển blockchain bao gồm những công việc nào.

3. Blockchain development là gì?

À development sẽ viết trước còn blockchain developer cụ thể phải làm gì sẽ được phân tích sau nha anh em. Mình nhìn vào cái lớn trước.

Phát triển blockchain ở đây đề cập đến việc xây dựng, bảo trì và thiết kế các hệ thống sử dụng blockchain. Giải quyết các bài toán thực tế, ứng dụng vào các ngành nghề hiện tại dựa trên tính hữu dụng của blockchain.

Một ví dụ dễ hiểu là smart contracts đã nhắc tới với anh em phía trên.

Hợp đồng thông minh là các thỏa thuận được lập thành văn bản giữa hai bên, giống như các hợp đồng thông thường. Tuy nhiên, không giống như các hợp đồng thông thường, hợp đồng thông minh cũng là các chương trình được lưu trữ trên mạng các block của blockchain.

Hợp đồng bình thường anh em cần kiểm tra khả năng, năng lực của đối tác, các điều khoản và điều kiện. Nhưng với blockchain các chương trình này chỉ được kích hoạt để chạy khi cả hai bên đáp ứng các điều khoản và điều kiện đã thỏa thuận.

Việc tuân thủ hợp đồng dựa trên mạng blockchain giúp đảm bảo việc thực hiện hợp đồng đúng theo thời gian thực.

blockchain developerKý hợp đồng mà được cơ quan quản lý để mắt hộ cho trên mạng blockchain thì ai dám làm sai nữa đây.

4. Blockchain developer làm gì?

Sau khi đã hiểu về blockchain và ứng dụng blockchain vào các lĩnh vực khác nhau. Giờ là lúc anh em cần biết công việc của blockchain developer cụ thể làm gì?.

À thì blockchain developer chia thành 2 ông, theo đúng tính chất của công nghệ blockchain.

  • Core blockchain developer.
  • Blockchain software developer.

Ông đầu tiên là core blockchain developer, ông này thì phát triển và maintain kiến trúc của cả hệ thống blockchain. Đảm bảo cho nó hoạt động đúng chuẩn ứng dụng blockchain chứ không phải công nghệ nào khác.

Ông này thường define (protocols – giao tiếp), security patterns (cách thức bảo mật cho mạng blockchain), giám sát toàn bộ mạng blockchain.

Ông thứ hai là ông blockchain developer. Ông này phát triển phần mềm dựa trên công nghệ blockchain đã có. Về cơ bản thì ông này hiểu rất rõ về blockchain. Ví dụ như khi thêm hợp đồng mới thì cần thêm vào đâu, và như thế nào để thêm vào mạng.

Ngoài ra ông blockchain developer này cũng có thể trực tiếp phát triển Frontend và Backend để hiện thực ứng dụng bằng công nghệ blockchain. Kiểu như hiểu blockchain là thế, nhưng cụ thể trong từng lĩnh vực cần làm như nào thì phải nhờ ông này.

5. Cần gì để trở thành blockchain developer?

Sau khi đã hiểu rõ những sẽ làm ở vị trí blockchain developer. Giờ là lúc nói cho anh em biết cần gì để trở thành blockchain developers.

Với anh em mới bắt đầu hoặc đi từ con số 0 thì cũng đừng quá căng thẳng. Luôn có step by step.

5.1 Hiểu về blockchain

Rõ ràng, bản thân trong cái title đã là blockchain developer thì anh em cần hiểu về blockchain. Kiểu fundamentals (các nguyên tắc cơ bản). Mình khuyến nghi anh em theo học khoá này của Coursera

Cơ bản bao gồm mạng blockchain là gì?. Hiện thực blockchain như thế nào?. Một khi hiểu và có cái nhìn đúng về blockchain anh em mới tham gia vào các dự án blockchain được.

5.2 Các kỹ năng phụ trợ

5.2.1 Lập trình

Sau khi đã hiểu rõ về blockchain, những thứ cơ bản cũng như nâng cao liên quan tới công nghệ blockchain. Giờ là lúc anh em cần rèn luyện các kĩ năng đi kèm.

Đầu tiên tất nhiên là kĩ năng lập trình. Mã hoá, chuỗi và thêm mới hay đọc dữ liệu từ mạng blockchain đều phải hiện thực thông qua code. Nên lập trình chắc chắn là phải học.

5.2.2 Mật mã (Cryptography)

Không có mật mã thì công nghệ blockchain chắc chắn không thể hoạt động được. Chính vì vậy hiểu biết về mật mã là cần thiết để trở thành blockchain developer.

Việc hiểu biết về mật mã còn giúp blockchain developer làm đúng chức năng được giao. Đảm bảo bảo mật cho hệ thống cũng như các tính năng phát triển.

Về bảo mật anh em có thể tham khảo khoá Cryptography (khoá này rất nổi tiếng).

5.2.3 Cấu trúc dữ liệu (Data structures)

Để phát triển thành công các mạng blockchain, anh em cần có kiến thức về cấu trúc dữ liệu. Đồng nghĩa với việc phải làm việc với nhiều cấu trúc dữ liệu khác nhau (ví dụ như Merkle trees).

Chính vì vậy, sau khi đã hiểu về mật mã, anh em cần bỏ thời gian tìm hiểu về cấu trúc dữ liệu.

5.2.4 Kiến trúc blockchain

Khi đã thành thạo và nắm vững kiến thức về mạng blockchain. Anh em có thể tìm hiểu sâu hơn về kiến trúc blockchain. Hiện tại kiến trúc blockchain chia thành 4 loại: private, public, consortium (tập đoàn) và hybrid.

Hiểu về kiến trúc blockchain giúp anh em lựa chọn đúng kiến trúc cho đặc thù từng loại dự án.

6. Tham khảo

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:

Đừng bỏ lỡ Top việc làm IT mới nhất trên TopDev!

Hiểu sao cho đúng về kỹ sư hệ thống?

Hiểu sao cho đúng về kỹ sư hệ thống?

Kỹ sư hệ thống (System Engineer) là vị trí đòi khỏi lượng kiến thức khổng lồ, khả năng bao quát vấn đề, tư duy cũng như am hiểu về hệ thống mà họ đang quản lý.

Có thể nhiều anh em còn hiểu sai về vị trí kỹ sư hệ thống, chính vì vậy bài viết này cung cấp cho anh em cái nhìn toàn diện về Kỹ sư hệ thống. Vị trí nghe thôi đã thấy to này thực chất đòi hỏi những kĩ năng gì? Cần làm gì để trở thành kỹ sư hệ thống?

kỹ sư hệ thống
Một ví trị đáng tự hào khi từ Enigneer và có thêm chữ System

Okie, cùng bắt đầu với định nghĩa đầy đủ về kỹ sư hệ thống (System Engineer).

1. Kỹ sư hệ thống là gì?

Theo như định nghĩa từ Wikipedia thì:

Systems engineering is an interdisciplinary field of engineering and engineering management that focuses on how to design, integrate, and manage complex systems over their life cycles.

Kỹ sư hệ thống là một lĩnh vực trong kỹ thuật và quản lý kỹ thuật tập trung và thiết kế, tích hợp và quản lý các hệ thống phức tạp trong vòng đời phát triển.

Nghe thôi đã thấy to rồi ha, anh em nhớ giúp 3 ý chính.

  • Đầu tiên là design (thiết kế được hệ thống, phải đủ hiểu và đủ khả năng để thiết kế lên được hệ thống). Tất nhiên là tuỳ theo business.
  • Thứ hai là tích hợp (có thể coi là phát triển). Thiết kế ra được mà còn phải làm được cơ, thực chất không làm được hoặc không tham gia phát triển sẽ khó mà thấy những khiếm khuyết thúc thiết kế.
  • Quản lý hệ thống (phát triển xong rồi phải quản lý được, bảo trì được). Giống như máy móc, trong quá trình vận hành sẽ phát sinh vấn đề.

Chỉ 3 cái thôi cũng đủ ngao ngán cho khối lượng công việc mà Kỹ sư hệ thống cần đảm nhận.

À mà bài viết này chỉ đề cập tới Kỹ sư hệ thống (System Engineer) ở lĩnh vực là Technology thôi nha. Còn các lĩnh vực khác như Chemical (hoá học), Mechanical (cơ khí), Electrical (điện) cũng có kỹ sư hệ thống nha.

  8 Bước Trong Lộ Trình Trở Thành DevOps Engineer

  Lead Engineer trông như thế nào?

2. Ví dụ về kỹ sư hệ thống

Rồi, định nghĩa nắm rồi, làm nhiều cũng đã biết rồi. Nhưng để cụ thể và rõ ràng hơn về công việc của kỹ sư hệ thống, ta cùng tham khảo ví dụ sau:

Anh em có chiếc xe ô tô, hãng honda đi ha vì tui đang chạy chiếc honda:

  • Phần cơ khí ta có động cơ của xe, truyền động các kiểu con đà điểu,… – Thuộc về lĩnh vực cơ khí
  • Phần điện của xe ta có điện đèn, điện điều hoà, điện phanh tay điện tử,… – Phần này thuộc về Electrical (điện)
  • Phần phần mềm ta có Honda Sensing – Phần này thuộc về phần mềm (Software).

Giả sử mỗi phần đều có một ông kỹ sư (engineer), thì ông kỹ sư hệ thống là ông làm việc với tất cả các ông kỹ sư đó. Để làm việc thì bạn phải có hiểu biết trên các mặt. Nói chuyện với ông kỹ sư điện cứ lải nhải về phần mềm chắc chắn ổng sẽ cắm điện ổng giật cho.

Kỹ sư hệ thống là người có hiểu biết về tất cả những gì cấu thành nên hệ thống. Họ chịu trách nhiệm gắn kết các thành phần lại với nhau để làm ra một sản phẩm hoàn chỉnh.

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

kỹ sư hệ thống
Có kỹ sư hệ thống mới có xe ngon mà chạy nha anh em.

3. Công việc của kỹ sư hệ thống

À công việc kỹ sư hệ thống đề cập trong bài viết này chỉ là một số công việc thường ngày thôi nha.

Ở các lĩnh vực khác nhau công việc cần làm cũng sẽ khác đi.

  • Thiết kế, triển khai hệ thống (system) và các công cụ (tools)
  • Khắc phục sự cố nếu có liên quan tới hệ thống nếu có
  • Thực hiện nâng cấp hệ thống (nếu có)
  • Quản lý sao lưu, khôi phục
  • Quản lý version management cho hệ thống
  • Làm việc với các engineer ở các mảng khác nhau. Đảm bảo tất cả đúng theo thiết kế hệ thống ban đầu đề ra
kỹ sư hệ thống
Trăm công ngàn việc

4. Học gì để trở thành System Engineer?

Vị trí kỹ sư hệ thống yêu cầu cao về hiểu biết nên đầu tiên không thể bỏ qua là bằng cấp về kỹ sư hệ thống. Bản thân vị trí này có một số yêu cầu đặc biệt cần phải học.

4.1 Systems engineering degrees

Trước tiên anh em có thể lấy bằng cử nhân (bachelor) về hệ thống. Sau khi đã có kiến thức cơ bản về hệ thống thì có thể lựa chọn chuyên ngành nghiên cứu thông qua lấy bằng thạc sĩ.

Một số loại kỹ sư hệ thống anh em có thể tham khảo.

  • Transportation systems engineering – Hệ thống giao thông
  • Software systems engineering – Hệ thống phần mềm
  • Logistics engineering – Hệ thống vấn tải
  • Product development systems engineering – Hệ thống phát triển phần mềm
  • Biosystems engineering – Hệ thống sinh học
kỹ sư hệ thống
Product development system engineer chú trọng tới hệ thống phục phụ quá trình phát triển phần mềm (Product development life cycle)

4.2 Chứng chỉ liên quan tới kỹ sư hệ thống

Để showup năng lực, ngoài kinh nghiệm làm việc thực tế thì chứng chỉ là phương tiện hữu hiệu nhất cho anh em showup. Kinh nghiệm thực tế ở đây hiểu là kinh nghiệm làm việc, quản lý các hệ thống từ lớn cho tới nhỏ.

Về mảng kỹ sư hệ thống bên ngành công nghệ thông tin. Anh em có thể tham khảo một số chứng chỉ sau:

  • Microsoft Certified Systems Engineer (MCSE)
  • Certified Systems Engineering Professional (CSEP)
  • Cisco Certified Network Associate (CCNA)
  • Certified Information Systems Security Professional (CISSP)
  • CompTIA Network+
kỹ sư hệ thống
Cisco liên quan tới hệ thống mạng, CompTIA liên quan tới bảo mật và chứng chỉ của Microsoft đào tạo khá toàn diện kỹ sư hệ thống.

5. Chuyện lương bổng

Ồ tất nhiên là ông kỹ sư mà biết nhiêu, bao quát và kết hợp với ông System Management để đảm bảo có product thì tất nhiên là lương không thể thấp.

Theo glassdoor thì trung bình lương một ông System Engineer ở Mỹ dao động vào mức $112,323 / năm. Cỡ khoảng gần $10,000 đô / tháng.

kỹ sư hệ thống

So với mặt bằng chung, kiểu như Frontend hay Backend ở Google, Apple thì có thể vẫn bằng các lập trình viên ở các mảng Front hay Back. Tuy nhiên mức lương này chỉ là mức lương trung bình. Phụ thuộc vào số năm kinh nghiệm, lĩnh vực mà kỹ sư đó làm mức lương sẽ thay đổi lên hoặc xuống.

kỹ sư hệ thống

6. Tham khảo

Cảm ơn anh em đã chú ý – Thank you for your attention – Happy coding!

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

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

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