Home Blog Page 50

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

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

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

Những năm trở lại đây, Internet vạn vật (IoT) đã có bước phải triển vượt bậc nhờ sự kết hợp với các xu hướng công nghệ mới như nền tảng trí tuệ nhân tạo AI. Chuyển đổi số diễn ra ở khắp mọi nơi, trong từng ngõ ngách của cuộc sống xung quanh hàng ngày. Để đồng bộ việc tích hợp giữa IoT và dữ liệu, một xu hướng công nghệ mới đã ra đời gọi là Digital Twins (Cặp song sinh kỹ thuật số). Bài viết hôm nay chúng ta cùng tìm hiểu về xu hướng công nghệ mới này nhé.

Digital Twins là gì?

Digital Twins là một công nghệ thực hiện việc nhân bản kỹ thuật số của tất cả mô hình ngay thời điểm hiện tại, hay nói cách khác là nó cung cấp một bản sao chính xác của thế giới vật lý cùng với cập nhật theo thời gian thực tương ứng. 

Khái niệm này được giới thiệu và phát hành lần đầu tiên bởi NASA từ năm 2012, với những tiêu chí đặt ra cho Digital Twins trên một hệ thống mô phỏng chiếc máy bay. Trong đó tiêu chí quan trọng là có thể mô phỏng tích hợp đa vật lí, đa tỷ lệ, xác suất của một phương tiện hoặc hệ thống được chế tạo thông qua sử dụng các mô hình vật lý tốt nhất hiện có, cập nhật cảm biến, lịch sử đội bay,… để phản ánh tuổi thọ của chiếc máy bay song sinh tương ứng của nó.

Digital Twins là gì?

Trong quá trình nghiên cứu và phát triển, Digital Twins cho thấy sự hiệu quả và hứa hẹn trong nhiều lĩnh vực ứng dụng sản suất hay kinh doanh; công nghệ này như là một chiếc cầu nối giữa thế giới thực và không gian số. Với sự phát triển của IoT, số lượng các thiết bị trong thực tế kết nối với Internet ngày càng nhiều; các nhà phát triển tham vọng có thể xây dựng được gần như hoàn chỉnh một bản sao số hóa tái hiện lại được không gian, thời gian và vật chất trong cuộc sống; từ đó đưa ra các mô phỏng, dự đoán có tính chính xác cao hơn. 

  IoT là gì? Những ứng dụng tuyệt vời của IoT trong cuộc sống

Các yếu tố cấu thành nên Digital Twins

Các yếu tố cấu thành nên Digital Twins

Để xây dựng, tạo ra một đại diện ảo sinh đôi, chính xác của một sản phẩm, một hệ thống bao gồm cả các hành vi theo thời gian thực; các yếu tố mà một hệ Digital Twins phải có bao gồm:

  • Cảm biến: thu thập dữ liệu và cung cấp cho đại diện ảo trong suốt quá trình hoạt động vật lý trong thế giới thực.
  • Dữ liệu: dữ liệu từ các cảm biến, từ bản vẽ thiết kế, từ hiểu biết về hệ thống hay những thông tin từ môi trường giúp hệ thống ảo vận hành chuẩn xác như thật hơn.
  • Bộ truyền động: mỗi hành động trong thế giới thực đều phải được phản ánh chính xác đến bản sao song sinh của nó và ngược lại, để những tác động lên bản sao số có thể thay đổi được lên chính bản thể vật lý của nó, chúng ta cần xây dựng những bộ truyền động chịu sự can thiệp của con người.

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

Chu trình kỳ vọng

Theo nghiên cứu của Gartner, hãng nghiên cứu thị trường hàng đầu, tháng 8 năm 2022, công nghệ Digital Twins nằm trong top 10 xu hướng công nghệ chiến lược 10 năm sắp tới. Công nghệ này hiện vẫn đang trong giai đoạn khởi đầu, các công ty công nghệ sử dụng IoT hiện nay cũng đang tìm cách triển khai Digital Twins.

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

Chu trình kỳ vọng

Lợi ích mà Digital Twins mang lại

Với khả năng tạo ra bản sao số tương ứng với sản phẩm vật lý, lợi ích đầu tiên dễ thấy nhất của công nghệ sao chép sinh đôi số này là việc có thể giúp doanh nghiệp đánh giá sản phẩm một cách chi tiết và chính xác trước khi đưa ra thị trường. Hệ thống xây dựng lên sản phẩm số với lượng dữ liệu cung cấp lớn, đầy đủ các mặt của thiết bị vật lý, từ đó mang lại khả năng phân tích dữ liệu một cách toàn diện.

Digital Twins cũng mang lại khả năng giám sát, theo dõi và điều khiển từ xa cho người dùng; đồng thời giảm tối đa chi phí dành cho rủi ro của việc sản xuất. Nhờ khả năng số hóa mang lại cho chúng ta những kịch bản khó xảy ra để kiểm thử, lưu lại các bản ghi để làm cơ sở cho những hoạt động phục hồi và lưu trữ kiến thức.

Lợi ích mà Digital Twins mang lại

Ứng dụng trong thực tế

Dù vẫn trong giai đoạn đầu của quá trình phát triển, Digital Twins cũng đã có những ứng dụng thực tế rõ rệt kết hợp với sự phát triển của AI, Machine Learning và IoT trong cuộc cách mạng công nghiệp 4.0. 

Mô hình smartcity Virtual Singapore 3D

Đây là một bản sao kỹ thuật số có thể tương tác được của thành phố Singapore, được hiển thị dưới dạng hình ảnh 3D. Smartcity này cho phép chính phủ quan sát hoạt động của toàn bộ cơ sở hạ tầng thành phố theo thời gian thực; theo dõi mọi thứ, phân tích từ tình hình an ninh, mật độ dân cư hay tình trạng không khí.

Mô hình smartcity Virtual Singapore 3D

Ứng dụng vận hành hệ thống khám phá vũ trụ của NASA

Nasa hiện nay ứng dụng Digital Twins để vận hành, bảo trì và sửa chữa hệ thống khi khám phá vũ trụ. Các nhà khoa học của NASA cần phải làm việc với các máy móc trong không gian vũ trụ, nơi mà nó gần như không thể hiển diện thực tế và vì thế bản sao số này vô cùng hữu ích

Tập đoàn Chevron sử dụng trong các mỏ dầu

Tập đoàn Chevron đang sử dụng công nghệ này để dự đoán các vấn đề bảo trì trong các mỏ dầu và nhà máy lọc dầu của mình. Công ty đặt mục tiêu có các cảm biến được kết nối với hầu hết các thiết bị giá trị cao vào năm 2024 và hy vọng rằng việc ngăn chặn sự cố trên các thiết bị quan trọng nhất của họ sẽ giúp tiết kiệm hàng triệu đô la mỗi năm.

Kết bài

Có một cuộc cách mạng về AI nói chung và Digital Twins nói riêng đang âm thầm diễn ra. Công nghệ ngày càng mang lại cho chúng ta nhiều sự tiện lợi trong cuộc sống. Dù còn nhiều thách thức nhưng công nghệ Digital Twins sẽ có nhiều bước đột phá trong thời gian tới. Hy vọng bài viết đã mang lại cho các bạn những kiến thức hữu ích về xu hướng công nghệ mới này, hẹn gặp lại các bạn trong bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

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

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

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

Lâu rồi chưa viết tutorial cho anh em. Tự thấy có lỗi với những anh em newbie với Reactjs. Bài viết này hướng dẫn cụ thể, bao gồm cả giải thích cho anh em từng bước xây dựng web app với Reactjs.

Trước khi bắt đầu với Reactjs, anh em nào chưa có kiến thức với HTML, DOMJS chắc phải quay lại học sơ mấy môn này đã ha.

Xây dựng web app với Reactjs

Okie bắt đầu thôi nào anh em ơi!

1. React virtual DOM

Chắc hẳn một số anh em sẽ nghe tới DOM, Virtual DOM trong quá trình xây dựng web app với Reactjs. Vậy DOM và Virtual DOM là gì?.

DOM là Document Object Model, là cây HTML của chúng ta, là nội dung được hiển thị lên chính trên trang web. Trong quá trình xây dựng web app với Reactjs, ta thường thao tác với cây DOM, giúp thêm hoặc xoá các object vào cây DOM.

web app với reactjs

Ví dụ như đoạn code dưới đây, cây DOM sẽ thay đổi khi người dùng nhập số vào textfield.

const update = () => {
  //   JavaScript
  const element2 = `
    <h3>JavaScript:</h3>
    <form>
      <input type="text"/>
    </form>
    <span>Time: ${new Date().toLocaleTimeString()}</span>
  `;
  document.querySelector('#root2').innerHTML = element2;
};

setInterval(update, 1000);

Ở đoạn code này, có 2 object trên dom sẽ thay đổi. Đầu tiên là input, khi anh em gõ vào input, giá trị của input trên DOM sẽ thay đổi. Thứ hai là Time, do có hàm Interval sẽ lặp đi lặp lại mỗi giây nên giá trị thời gian cũng sẽ liên tục cập nhật trên DOM

Xây dựng web app với Reactjs

  Cài đặt và sử dụng Storybook cho ReactJS

  ReactJS – Tìm hiểu về Component Life Cycle

2. React element và JSX

Ở phần 1 trong từng bước xây dựng web app với Reactjs, anh em đã biết DOM và cách mà DOM thay đổi. Trên DOM sẽ có danh sách các thẻ sau đây.

<div>
  <form>
    <input type="text" />
  </form>
  <span>Time: ##:##:## PM</span>
</div>

Với Reactjs CreateElement, anh em có thể tự xây dựng được web app. Một công cụ khá hay là babeljs.io. Với công cụ này, các element trên html có thể auto convert ra JSX. Tức là dùng reactjs, anh em có thể thử dùng babeljs tại đây.

Xây dựng web app với Reactjs

Phía bên phải là nội dung html thuần anh em paste vào. Phía bên trái là code đã được convert để ReactJS có thể hiểu được.

Sửa lại một chút đoạn code ở phía trên. Tương tự như việc tạo từng element trên DOM, đoạn code phía dưới khai báo element1 bao gồm đầy đủ các object html.

let element1 = (
  <div>
    <form>
      <input type="text" />
    </form>
    <span>Time: {new Date().toLocaleTimeString()}</span>
  </div>
);

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

3. Khởi tạo project reactjs

Reactjs hỗ trợ khởi tạo project mới bằng cú pháp create-react-app. Với create-react-app, reactjs sẽ tạo ra project mặc định và một số module cần thiết (babel, Webpack). Những công cụ này là cần thiết để xây dựng web app với reactjs.

Trước khi thực hiện câu lệnh này, anh em cần cài đặt nodejs và npm.

Anh em thực hiện chạy 2 lệnh npm-v và node-v để kiểm tra cài đặt nodejs và npm đã thành công hay chưa. Lưu ý phiên bản tối thiểu của node phải là 14.0.0 và npm là 5.6 nha anh em

Rồi, giờ thì vào terminal, chọn thư mục Desktop hoặc Downloads (tuỳ anh em). Chạy câu lệnh

npx create-react-app react-todo-app

Câu lệnh này sẽ tạo ra project react-todo-app bao gồm tất cả các file cần thiết để bắt đầu với Reactjs. Thư mục sẽ có cấu trúc như sau

react-todo-app
    ├── node_modules
    ├── public
    │    ├── favicon.ico
    │    ├── index.html
    │    ├── logo192.png
    │    ├── logo512.png
    │    ├── manifest.json
    │    └── robots.txt
    ├── src
    │    ├── App.css
    │    ├── App.js
    │    ├── App.test.js
    │    ├── index.css
    │    ├── index.js
    │    ├── logo.svg
    │    ├── reportWebVitals.js
    │    └── setupTest.js
    ├── .gitignore
    ├── package-lock.json
    ├── package.json
    └── README.md

4. Ý nghĩa từng thư mục

Đầu tiên là node_modules, thư mục này chứa các file có liên quan tới dự án xây dựng webapp bằng reactjs. Bao gồm thư viện, các file cần thiết từ bên thứ 3.

Index.html chứa nội dung mà ứng dụng web app sẽ xuất hiện.

Thư mục src chứa các file anh em sẽ phải làm việc cùng. File index.js là file chính, đóng vai trò là điểm đầu vào của toàn ứng dụng.

Package.json chứa các script và thông tin các module cần sử dụng trong dự án. File gitignore chứa những thành phần sẽ bị bỏ qua khi anh em commit source lên git.

5. Thêm source

Anh em mở file index.js, thêm vào đoạn code sau. Từng bước từng bước rồi sẽ xây dựng được web app với Reactjs thôi anh em. Đừng lo.

import React from 'react';
import ReactDOM from 'react-dom/client';

const rootElement = document.getElementById('root');

const root = ReactDOM.createRoot(rootElement);
root.render(<h1>Hello from React application</h1>);

Trong đoạn source này, anh em thấy React và ReactDOM đã được import. Root element là root của cây DOM, có id là root. Sau khi có root element, ta gọi phương thức createRoot từ ReactDOM để tạo ra cây DOOM doot có 1 object với id là root.

Sau đó render ra duy nhất một thẻ h1 có nội dung là Hello from React application.

Mở file package.json lên anh em sẽ thấy một số script như sau:

"scripts": {
  "start": "webpack serve --config webpack.dev.js",
  "build": "webpack --config webpack.prod.js"
},

Lưu lại source ở file index.js và start với lệnh npm start. Anh em sẽ thấy kết quả như sau (chaỵ ở port 3001)

Xây dựng web app với Reactjs

6. Tham khảo thêm về xây dựng web app với reacjs

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 thêm Việc làm IT hấp dẫn trên TopDev

Top 6 nguyên lý thiết kế microservices cho lập trình viên có kinh nghiệm

Top 6 nguyên lý thiết kế microservices cho lập trình viên có kinh nghiệm

Với anh đã có kinh nghiệm thiết kế, phát triển các hệ thống có áp dụng các nguyên lý thiết kế microservices không còn là điều xa lạ.

Tuy nhiên với các anh em mới bắt đầu, việc áp dụng tốt các nguyên lý thiết kế microservices sẽ giúp anh em phát triển tốt hệ thống. Hệ thống cũng có thể scale up, scale down tốt về sau.

Bản thân các nguyên lý đã được đúc rút ra từ rất rất nhiều các lập trình viên có kinh nghiệm khi họ sử dụng microservices. Chính vì thế, anh em nên bỏ chút ít thời gian đọc và ghi nhớ các nguyên lý thiết kế này.

Các cụ dạy rồi, học từ cái ông đã làm sai, đã gặp vấn đề luôn là cách học tốt mà.

nguyên lý thiết kế microservices

1. Single Responsibility Principle

Với anh em developer đã có kinh nghiệm thì nguyên lý này cũng không phải mới mẻ gì. Single Responsibility Principle là chữ S nằm trong SOLID. Mà SOLID thì quá nổi tiếng trong giới phần mềm.

Nội dung của nguyên lý này nói rằng mỗi microservices mà anh em thiết kế hoặc implement chỉ nên handle một công việc (handle only one thing). Microservices chỉ nên giao tiếp với microservices để hoàn thành task của nó. Nhưng về mặt lý thuyết, bản thân nó vẫn chỉ handle một việc duy nhất. Chính vì chỉ xử lý một việc duy nhất, nó đáp ứng được S trong SOLID.

Ví dụ: Anh em đang thiết kế hệ thống ecommerce. Thương mại điện tử yêu cầu người dùng đăng nhập, cho phép người dùng thanh toán đơn hàng. Trường hợp này ta cần hai microservices, một để xác thực người dùng (Authentication Service), microservice thứ hai dùng để thanh toán (Payment Service). Không nên viết một Service duy nhất mà ở đó xử lý cả việc Authentication và Payment.

  Phát triển phần mềm theo kiến trúc microservice
  Microservices: Cưỡi ngựa xem hoa

Single Responsibility Principle

2. Decentralized Data Management (Dữ liệu phi tập trung)

Trái ngược với dữ liệu tập trung (Centralized). Nguyên lý này trong thiết kế microservices khuyên ta nên thiết kế sao cho dữ liệu không tập trung ở một nơi (Decentralized).

Mỗi microservices nên quản lý dữ liệu của riêng nó. Việc mỗi microservices tự quản lý được data mà nó cần đảm bảo sự độc lập, khả năng mở rộng và độ tin cậy.

Anh em có thể đặt câu hỏi tại sao lại nói về độ tin cậy? Độ tin cậy ở đây được hiểu là khi một microservices khác down (hoặc gặp bất cứ vấn đề gì), các microservices được tin cậy vẫn có thể hoạt động bình thường (do bản thân không có liên kết gì với các microservices khác).

Decentralized Data Management

Như hình trên đây thì 3 microservices User, Messages, Friends. Bản thân mỗi microservices có một database riêng, MessageDB có thể dùng MongoDB, trong khi Users với Friends dùng các RDBMS khác?

Tới đây một số anh em có thể thắc mắc. Ủa rồi keep cho data độc lập ai chả muốn, nhưng nếu cần data ở microservices khác thì sao? Chẳng lẽ cứ giữ khăng khăng như thế? Đây đây, cái số 3 đây sẽ giải quyết vấn đề này.

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

3. API-Driven Design

Nguyên lý thứ 3 trong nguyên lý thiết kế microservices là API-Driven. Bắt đầu với định nghĩa API-Driven ha.

API-driven development is the practice of designing and building APIs first, then creating the rest of an application around them.

Phát triển API-driven là thực hành thiết kế và xây dựng API trước, sau đó với xây dựng phần còn lại của ứng dụng xung quanh các API đã làm

Nguyên lý này vô cùng hữu ích khi thiết kế, xây dựng và làm việc với mô hình microservices. Theo nguyên lý này, microservices nên thiết kế xung quanh API. Mỗi microservices cung cấp rõ ràng một bộ API để giao tiếp với các microservices khác.

API-Driven Design

4. Stateless

Để hiểu được nguyên lý này, anh em cần phân biệt được sự khác nhau giữa Stateful và Stateless.

Stateless

Trong các điểm khác biệt, có một điểm anh em cần lưu ý. Stateless sẽ không quan tâm tới state hiện tại của request. Nếu một microservices xử lý giỏ hàng của khách hàng trong hệ thống ecommerce, services đó sẽ không quan tâm trạng thái hiện tại của request là gì. Bản thân nó sẽ luôn xử lý request bằng cách lấy toàn bộ giữ liệu giỏ hàng và tiến hành bước tiếp theo.

Chính sự không quan tâm tới state hiện tại giúp bản thân microservices độc lập, có thể scale up và có độ ổn định cao.

Nhưng trong quá trình phát triển microservices. Giữ cho stateless không phải là dễ nha anh em.

5. Loose Coupling

Loose Coupling trong nguyên lý thiết kế microservices cũng giống như Loose Coupling trong hướng đối tượng (Object Oriented Design). Nguyên lý này nhắm tới việc loại bỏ một vài class, package và module.

Loose Coupling cũng mang ý nghĩa lỏng lẻo. Nguyên lý này nói rằng các microservices nên được liên kết lỏng lẻo với nhau, không nên liên kết chặt chẽ với nhau. Việc không có mối liên kết chặt chẽ giữa các microservice đảm bảo khả năng scale cho các microservices.

Loose Coupling

Như hình bên trái, các microservices có mối liên hệ chặt chẽ với nhau. Việc này dẫn tới các microservices bị phụ thuộc vào nhau, khó trở nên độc lập. Ngược lại, Loosely Coupled cho phép các microservices chỉ có một vài liên kết giữa các microservices.

6. Auto scaling

Nguyên lý cuối được đều cập liên quan tới nguyên lý thiết kế microservices là Auto-scaling (tự động mở rộng).

Thực chất một hệ thống khi lựa chọn áp dụng microservices, bản thân hệ thống đó đã cân nhắc hoặc ít nhất là có nhu cầu về scale (mở rộng). Bản thân mỗi microservices phải có thể tự mở rộng khi có nhiều hơn các request. Giảm bớt các instance đi trong trường hợp chỉ có số ít các request.

Ví dụ: nếu số lượng user truy cập tới microservices tăng, bản thân microservices phải tự mở rộng được. Khi user giảm truy cập, các instance trước đó phải được xoá bớt đi.

Hiện nay, Kubernetes có thể đáp ứng yêu cầu này. Nên lúc thiết kế anh em nhớ cân nhắc yếu tố Scaling để tận dụng tối đa Cloud, các công cụ như Kubernetes

Auto scaling

Cụ thể như thế nào sẽ viết rõ cho anh em trong bài viết khác ha. Bài viết này chỉ nói về các principles (nguyên lý thôi)

7. Tham khảo thêm về thiết kế microservices

Một số cuốn sách cũng như tài liệu hay về nguyên lý thiết kế microservices anh em có thể tham khảo

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

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

Xem thêm:

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

Agile là gì? 5 thuật ngữ Agile nên biết (giải thích)

Agile là gì? 5 thuật ngữ Agile nên biết (giải thích)

Anh em lập trình viên, Product Owner, BA, QC nếu đã tham gia một số dự án apply mô hình phát triển phần mềm Agile chắc không còn lạ gì về khái niệm Agile cũng như những thuật ngữ liên quan tới nó.

Bài viết này ngoài việc giải thích lại về Agile, còn cung cấp cái nhìn thực tế trong quá trình làm việc với mô hình này.

Mong sẽ giúp đỡ được nhiều hơn các anh em mới bắt đầu hoặc đang tìm hiểu mô hình Agile.

Thuật ngữ agile

Thôi thì biết hay chưa biết ta đều nhắc lại cái định nghĩa cho nó máu. Làm nhiều chứ đôi khi hỏi định nghĩa lại nói không ra. Coi lại cho chắc.

1. Agile là gì?

Theo như định nghĩa tới từ ông Atlassian thì Agile được nghĩa như sau:

“Agile is an iterative approach to project management and software development that helps teams deliver value to their customers faster and with fewer headaches. Instead of betting everything on a “big bang” launch, an agile team delivers work in small, but consumable, increments. Requirements, plans, and results are evaluated continuously so teams have a natural mechanism for responding to change quickly.”

Agile là cách tiếp cận lặp đi lặp lại để quản lý dự án và phát triển phần mềm giúp các teams (teams này là team bao gồm đầy đủ thành phần nha) đem tới cho khách hàng giá trị nhanh hơn, ít bị đau đầu hơn. Thay vì đặt được vào “big bang” kiểu như demo fail, thì agile giúp cho các nhóm thực hiện các công việc nhỏ, có thể xử lý được. Các yêu cầu, kế hoạch và kết quả được đánh giá một cách liên tục giúp các nhóm thích ứng nhanh hơn với các yêu cầu thay đổi liên tục

Tạm cho cái định nghĩa từ ông Atlassian (công ty sản xuất phần mềm ở Úc, chuyên cung cấp phần mềm cho phát triển phần mềm, quản lý dự án,… Cũng coi như là một bên uy tín khi nói về Agile.

  12 nguyên tắc trong Agile

  Thay đổi tư duy về kiểm thử theo Nguyên lý Agile

1.1 Túm gọn ý chính

Túm cái váy lại, có mấy ý chính anh em cần chú ý về Agile:

  • Agile là các tiếp cận và lặp đi lặp lại (cứ hết 2 tuần, 1 tuần tuỳ theo quy định lại cứ quay lại từ đầu). Từ đầu là từ đầu cách thức làm việc, chứ không phải từ đầu của kết quả, xoá code đi viết lại thì toang.
  • Agile giúp cả team và khách hàng (customer) bớt đau đầu. Ok, thay vì làm 3 tháng rồi demo cái bùm fail, không đúng ý khách hàng. Sai requirement.
  • Agile chia nhỏ khối lượng công việc giúp phù hợp với team, giúp team có thể hoàn thành trong thời gian ngắn

Thuật ngữ agileNếu không thay đổi nhanh, có thể toang từ PO cho tới dev vì không đúng ý khách hàng.

Cái nữa do khối lượng công việc nhỏ và nghiệm thu đánh giá trong từng giai đoạn ngắn, nên có gì thay đổi cái là anh em quay xe ngay. Xe nhỏ dễ quay đầu hay bẻ lái

2. Thuật ngữ Agile

Sau khi đã hiểu rõ agile là gì, kế tiếp là các thuật ngữ liên quan tới Agile. Thuật ngữ Agile ở đây được hiểu là các từ khoá thường được sử dụng trong mô hình này.

Không phải chém gió nhưng theo số liệu thống kê thì hiện nay có tới 86% lập trình viên làm việc với mô hình Agile. Mô hình này có nhiều điểm ưu việt, apply từ công ty á tới âu. Trong nhiều loại hình dự án.

Tuy nhiên, nếu mới bắt đầu, anh em đôi khi còn lạ lẫm với một vài thuật ngữ. Thôi thì ta đi từ từ từng bước, từng bước.

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

Thuật ngữ agile
Số liệu từ Stackoverflow. 85.4, má chém gió với anh em rồi. Làm tròn tí chắc ok mờ.

3. Thuật ngữ Agile thường dùng

3.1 A-E: Acceptance Criteria to Epic

Định nghĩa về AC, AC ở đây dịch là tiêu chí chấp nhận nha anh em.

“Acceptance criteria are a set of conditions that software must meet in order to be accepted by a customer or stakeholder.” Tiêu chí chấp nhận (AC) là tập các điều kiện mà phần mềm phải đáp ứng để được khách hàng hoặc các bên liên quan chấp nhận.

Rồi, anh em được đưa cho cái task A, ấn vào nút B sẽ đi tới vào màn hình C. Vậy AC sẽ là

  • “ấn vào B sẽ đi được tới C”
  • “nút B xuất hiện ở màn hình A”
  • “nút A ấn được”

Nếu có logic gì thêm anh em có thể viết vào, tuy nhiên lưu ý rằng “accepted by a customer or stakeholder). Viết cho ông nào có quyền chấp nhận thì chú ý viết cho các ông đó hiểu nha. Cái AC viết ra cho ai thì phải xem người đó sẽ hiểu ở mức độ nào. Đừng đem logic code hay thứ gì đó quá sâu về kĩ thuật vào trong AC.

AC gần như là bắt buộc phải có, để cả PO, cả BA cà QC và Dev đều biết cái đó như thế nào sẽ gọi là xong.

Thuật ngữ agile
Không chời tới cuối ngày cuối tháng hết giờ thì đốt bỏ AC nha.

3.2 Backlog Refinement

Okie cứ định nghĩa trước mà quất nha. Backlog Refinement là thuật ngữ Agile khá quan trọng.

“It’s a Scrum meeting where the Scrum team organizes the backlog to make sure it’s ready for the next sprint or iteration. In other words, it’s like spring cleaning… but for Scrum teams!”

Đầu tiên thì nó là một buổi meeting. Thành phần tham dự bao gồm cả Scrum team. Ở buổi meeting đó cả nhóm sắp xếp lại công việc tồn đọng. Hiểu và chuẩn bị để đảm bảo rằng nó hoạt động cho lần chạy tiếp theo (Sprint tiếp theo). Nói cách khác nó giống như dọn Sprint nhưng cho Scrum teams.

Anh em chú ý một khúc quan trọng ‘make sure it’s ready for the next sprint or iteration’. Đảm bảo sẵn sàng cho Sprint tiếp theo. Các yếu tố cần cân nhắc bao gồm:

  • Team development đã hiểu đúng requirement và cần làm gì chưa?
  • Team BA, PO đã hiểu đúng những gì khách hàng expect trong Sprint này?
  • Effort của team, velocity của team có đủ hay chưa?
  • Có ai nghỉ không?. Nếu thiếu effort thì cần bao nhiêu là đủ?

Thường những meeting như Backlog Refinement rất dài. Dài nhưng mà bổ ích, thà là hiểu với nhau tất cả để bắt đầu còn hơn tới cuối cùng miss understand.

Backlog Refinement
Đem lên, đem lên Sprint chứ không kéo xuống Backlog nha các đại ca.

3.3 Daily Scrum

Daily Scrum là thuật ngữ Agile phổ biến nhất. Theo như định nghĩa:

“It’s a daily meeting usually hosted by the Scrum master. Every morning, the Scrum team gets together for 15 minutes to discuss their day ahead.”

Daily Scrum là buổi gặp mặt hằng ngày, trưởng tổ chức là ông Scrum master. Vào mỗi buổi sáng, scrum teams gặp mắt trong 15 phút, xem nay sẽ làm gì, qua đã làm được gì.

Chính vì Agile chia nhỏ công việc nên việc thực hiện meeting hàng ngày là yếu tố cần thiết. Để nắm được xem có gì khó khăn, đã làm gì. Anh em mới bắt đầu với Agile không nên quá stress vì tinh thần của Agile không quá stress. Vì tinh thần Agile sẽ nói tiếp ở mục sau.

  • What they plan to do today (hôm nay anh em dự định sẽ làm gì)
  • What they did yesterday (hôm qua anh em đã làm gì)
  • Issues they have encountered (những vấn đề nào anh em đang gặp phải)

Về cơ bản daily mọi người chỉ chia sẻ với nhau từng đó. Nếu có khó khăn gì thì raise lên để biết. Anh em cứ mạnh dạn nói vì Sprint rất ngắn. Nếu có khó khăn hoặc bất cứ vấn đề gì trong quá trình làm thì phải raise lên.

Đâu có ai bảo là phải đứng đâu trời. Ngồi nằm gì cũng được vậy.

3.4 Epics

Epics là thuật ngữ Agile thường biết tới nhiều hơn ở vị trí BA và PO. Nhưng anh em lập trình viên, QA, QC nếu muốn biết bức tranh lớn. Tức là nhóm chức năng lớn cũng có thể tìm hiểu về Epics.

“An epic is a big idea or feature that can be broken down into smaller user stories. Much like how large ‘epics’ like Lord of the Rings are split into 3 books.

Epic là ý tưởng lớn hoặc tính năng lớn có thể bẻ nhỏ ra thành các user stories. Giống như chúa tể những chiếc nhẫn chia thành 3 phần.”

Ví dụ rõ hơn: Nếu Epics là improve UI (cải thiện UI) thì nó là nhóm tính năng lớn, nhiều việc cần làm. Chia nhỏ thành 3 users stories là “Thêm giỏ hàng”, “Cải thiện tốc độ load”, “Thay font chữ”, …

Thông thường nhìn vào Epics, hoặc danh sách các Epics sẽ biết định hướng tương lai của phần mềm. Đôi khi làm Agile Sprint quá ngắn, cái nhìn xa trông rộng để liệu cơm gắp mắm nó mất đi. Lúc đó ta có Epics.

3.5 Scrum of Scrums

Scrum of scrums là thuật ngữ Agile sử dụng khi có nhiều scrum team hoạt động. Nhiều team nhưng chung product. Về khái niệm thì cũng đơn giản thôi.

It’s a special Scrum meeting for large Scrum teams. 

Là scrum meeting đặc biệt cho team scrum lớn.

Thông thường khi team scrum đã lớn hơn 12 người, thường được chia nhỏ thành các scrum team nhỏ hơn (từ 5 tới 10 người). Mỗi nhóm sẽ bốc một ông ra làm đại sứ, họp hành với các scrum team khác.

Cũng có daily nhưng không phải trong team. Các ông đại sứ gặp nhau để report tiến độ, nêu ra các vấn đề. Việc họp này đảm bảo product lớn chạy êm, chạy xuôi.

Nói cho oai thì như đi họp hội đồng bảo an. Mỗi ông một ghế.

4. Tổng kết

Bài viết này mình đã nêu ra 5 thuật ngữ Agile phổ biến. Tuy nhiên còn nhiều nữa các thuật ngữ khác, nếu có thời gian sẽ viết tất cả cho anh em. Agile là mô hình tốt, hiểu thêm về nó giúp anh em làm việc năng suất cao hơn, không quá stress và tự tin lựa chọn mô hình này khi phát triển phần mềm.

Chắc phải ra series 2 cho anh em, cứ ăn dần 5 từ khoá một cho nó dễ nhai. Không quá ngộp.

5. Tham khảo

Tham khảo thêm về Agile.

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 thêm tuyển dụng CNTT hấp dẫn trên TopDev

Top 15 câu hỏi phỏng vấn Python lý thuyết + thực hành

Top 10 câu hỏi phỏng vấn Python Developer không thể bỏ lỡ

Trong những năm gần đây, với sự phát triển của AI, xử lý dữ liệu big data,… thì Python luôn là một trong những cái tên mà các nhà tuyển dụng săn đón nhiều nhất ở các ứng viên với mức đãi ngộ cao. Để chuẩn bị cho một buổi phỏng vấn tốt nhất, hôm nay mình cùng các bạn đi qua top 10 câu hỏi phỏng vấn Python Developer thường gặp nhất nhé.

Câu hỏi lý thuyết

Câu 1: Bạn có thể nói gì về Python?

Python là một ngôn ngữ lập trình bậc cao được thiết kế với cấu trúc cho phép người sử dụng viết mã lệnh với số lần gõ phím tối thiểu, nó được đánh giá là dễ học, cấu trúc rõ ràng, phù hợp và thuận tiện cho người bắt đầu học lập trình. Python ra mắt lần đầu năm 1991, ban đầu chỉ chạy trên nền Unix , sau đó mở rộng sang mọi hệ điều hành từ DOS, Windows, MacOS, Linux,… Đến nay thì Python vẫn luôn được xếp hạng là ngôn ngữ lập trình phổ biến nhất.

Python dựa trên trình thông dịch, là một ngôn ngữ kịch bản hướng đối tượng và tương tác. Nhờ tính đa năng của nó nên Python được sử dụng trong rất nhiều lĩnh vực đa nền tảng như Web, Machine Learning, Big Data, các mô hình khoa học,…

Câu 2: Những ưu điểm của Python và vì sao nó được ưa chuộng trong lĩnh vực AI, BigData

Ngoài ưu điểm về cấu trúc rõ ràng, cú pháp gọn, đẹp, dễ đọc thì Python còn mang nhiều tính năng ấn tượng cho người dùng:

  • Mã nguồn mở: Python hoàn toàn free, mã nguồn mở và thân thiện với người dùng. Cũng nhờ đó là Python có một cộng đồng support lớn mạnh, sẵn sàng hỗ trợ các lỗi nhỏ nhất. 
  • Đa nền tảng: Python chạy được hầu như trên các nền tảng phổ biến nhất, từ Windows, MacOS, Linux và trên cả các nền tảng OS từ Unix sinh ra. Nhờ đó Python tạo được ra các ứng dụng từ nhỏ đến lớn một cách đa dạng.
  • Kho thư viện module khổng lồ: với hơn 300 thư viện module cùng nhiều tính năng khác nhau giúp các lập trình viên tiết kiệm thời gian làm việc một cách tối đa. Nhiều module trên Python như xử lý ảnh, xử lý số liệu, tính toán, … trở thành tiêu chuẩn vì sự đầy đủ của nó.
  • Năng suất cao: Python tích hợp hết các quy trình, framework unit test đầy đủ để cải thiện hiệu năng và chất lượng của ứng dụng.

Với những ưu điểm trên, Python là ngôn ngữ lập trình phù hợp với các xử lý dữ liệu lớn, phức tạp; đồng thời có nhiều lợi thế với các module tích hợp có sẵn cho việc tính toán, xử lý số liệu; phù hợp với các yêu cầu của ngành AI, Big Data.

  Viết chương trình Xoá các File trùng lặp bằng Python

Câu 3: Các kiểu dữ liệu cơ bản trong Python

Python hỗ trợ các kiểu dữ liệu cơ bản bao gồm số (integer và float), boolean và string. 

Với dữ liệu số, ngoài việc hỗ trợ integer và float; Python cũng hỗ trợ biểu diễn các số ở hệ nhị phân (cơ số 2), bát phân (cơ số 8) và thập lục phân (cơ số 16). Để biểu diễn được chúng, ta thêm các tiền tố xác định như 0b, 0x, 0o tương ứng.

Ngoài ra Python còn tích hợp sẵn module complex cho việc xử lý số phức, viết dưới dạng x +yj (x là phần thực, y là phần ảo; module decimal cho việc xử lý số thập phân với độ chính xác cao (float chỉ hỗ trợ độ chính xác tối đa 15 chữ số phần thập phân)

Với kểu boolean thì Python quy định True có giá trị là 1 và False có giá trị là 0. Vì thế trong Python thì 1 == True và 0 == False.

Python không có kiểu dữ liệu ký tự (character) như một số ngôn ngữ khác; lúc này để biểu diễn 1 ký tự thì chúng ta sử dụng một chuỗi (string) có độ dài là 1.

Câu 4: Kiểu dữ liệu mutable/immutable trong Python

Mutable là những kiểu dữ liệu mà giá trị của dữ liệu có thể thay đổi được, bao gồm: List, Set, Dictionary. Ngược lại với kiểu dữ liệu immutable thì giá trị của dữ liệu không thể thay đổi được gồm: Chuỗi, Tuple, Số.

Ví dụ như List và Tuple là 2 loại dữ liệu tương đồng nhau, có thể xem Tuple là một List không thể chỉnh sửa được). Thông thường Tuple sẽ được sử dụng để lưu trữ những thông tin mà bạn không muốn thay đổi trong quá trình thực thi, chẳng hạn như các thông tin thiết lập (giới tính, quốc gia, dân tộc, …). Sử dụng Tuple giúp tiết kiệm bộ nhớ sử dụng hơn so với List. List cần được lưu trong 2 khối bộ nhớ: 1 có kích thước cố định để lưu biến, và 1 có kích thước biến đổi để lưu trữ dữ liệu.

Để khai báo List chúng ta sử dụng ngoặc vuông: [1,2,3]; còn tuple sẽ sử dụng ngoặc đơn (1,2,3)

Việc làm Python lương cao hấp dẫn trên TopDev

Câu 5: Phân biệt shallow copy và Deep copy trong Python

Khi chúng ta sao chép 1 đối tượng bằng toán tử gán (=), Python sẽ chỉ xử lý việc trỏ biến mới đấy vào cùng 1 đối tượng đã có trên bộ nhớ; đây chính là shallow copy (sao chép tương đối). Điều này dẫn đến việc khi bạn thay đổi giá trị của một biến thì cũng sẽ ảnh hưởng đến biến kia do cùng trỏ vào một đối tượng. Lưu ý shallow copy không thực hiện trên các dữ liệu cơ bản (primitive type).

Deep copy hay sao chép tuyệt đối là một tính năng cho phép bạn tạo ra 1 đối tượng mới hoàn toàn, nghĩa là trong bộ nhớ sẽ tạo thêm 1 vùng nhớ lưu trữ đối tượng giống với bản ghi gốc. Deep copy hữu ích khi sử dụng sao chép danh sách (list) hay các kiểu dữ liệu dạng tập hợp các objects.

Câu 6: Làm thế nào để xử lý đa luồng trong Python

Python cung cấp thread modue và threading module để bạn tạo và thực thi một thread, handle xử lý các tác vụ đa luồng. Mỗi thread trong Python đều có vòng đời gồm 3 giai đoạn: bắt đầu, chạy và kết thúc. Thread có thể bị ngắt (interupt) trong quá trình chạy, hoặc có thể tạm thời bị dừng (sleeping) trong khi các thread khác đang chạy (trạng thái yielding).

Để start một thread chúng ta dùng phương thức thread.start_new_thread bằng việc import module thread. Chúng ta cũng có thể sử dụng module threading với nhiều hỗ trợ mạnh mẽ và cao cấp hơn được Python thêm vào từ version 2.4. Ngoài các phương thức có trong module thread, threading còn cung cấp một số method khác như activeCount, currentThread, hay các phuowg thức triển khai đa luồng như run, start, join, …

  Viết 1 Test Case Đơn Giản Với Python Selenium WebDriver

Câu 7: Phân biệt break, continue, pass khi xử lý vòng lặp trong Python

Giống như hầu hết các ngôn ngữ lập trình, Python cung cấp 2 từ khóa break và continue cho việc kết thúc vòng lặp hiện tại (loop) mà không cần kiểm tra biểu thức điều kiện. Trong đó, break sẽ kết thúc vòng lặp chứa nó ngay lập tức, không thực hiện tiếp các lệnh tiếp theo sau break. Trường hợp break đặt trong nhiều vòng lặp lồng nhau thì nó sẽ thực hiện việc kết thúc vòng gặp gần nhất.

Continue thì sẽ bỏ qua phần còn lại của đoạn mã bên trong vòng lặp trong lần lặp hiện tại, nghĩa là sau continue thì vòng lặp vẫn sẽ tiếp tục chạy lần lặp tiếp theo. 

Pass là một câu lệnh khá đặc biệt và ít gặp trong các ngôn ngữ lập trình khác. Pass có nhiệm vụ giữ chỗ cho vòng lặp để đoạn code sẽ được thêm vào sau trong tương lai. Thực tế thì pass không có tác dụng gì khác ngoài việc “không làm gì cả” trong vòng gặp, chỉ để tránh lỗi cú pháp nếu bạn khai báo 1 vòng lặp rỗng (không thực hiện câu lệnh gì) trong Python.

Câu 8: Cách sử dụng hàm any và all trong Python

any() và all() là 2 function sử dụng để check điều kiện trong 1 mảng kết quả, any sẽ trả về true khi tồn tại 1 giá trị true trong mảng truyền vào; ngược lại thì all chỉ trả về true khi tất cả các giá trị trong mảng truyền vào trả về true.

any() và all() được ứng dụng nhiều trong việc xử lý check điều kiện của các dữ liệu dạng List, Tuple hay Array nhằm kiểm tra điều kiện thỏa mãn của 1 thuộc tính trong tập dữ liệu; any tương đương với điều kiện OR và all tương đương với điều kiện AND

Câu 9: Kể tên một số thư viện, framework phổ biến cho Python

  • Flask: framework xây dựng ứng dụng Web, được thiết kế nhẹ và mang tính module, nó được phân loại là 1 microframework vì không yêu cầu các công cụ hoặc thư viện cụ thể nào.
  • Django: framework hỗ trợ phát triển Web, được đánh giá là 1 trong những framework Python tốt nhất và được sử dụng để phát triển nhanh chóng các API.
  • NumPy: thư viện cung cấp rất nhiều tính năng hữu ích cho các phần xử lý ma trận, mảng đa chiều; cung cấp khả năng vector hóa các vận hành về toán giúp cải thiện hiệu suất và tốc độ thực thi.
  • Scipy: thư viện phần mềm dành cho đại số tuyến tính, thống kê.
  • Matplotlib: 1 thư viện của Python với khả năng visualizations mạnh mẽ trong việc xây dựng biểu đồ, diagram, charts,…

Câu 10: Compiling và Linking có vai trò gì trong Python

Như đã nói, Python là 1 ngôn ngữ thông dịch; nhưng không chỉ thế, cơ chế của Python cho phép nó có thể compiling biên dịch các phần mở rộng mới trong source code của bạn mà không gây ra lỗi. Điều này giúp Python có khả năng mở rộng code cao, không bị ảnh hưởng đến các phần xử lý khác.

Sau quá trình biên dịch thư viện mở rộng, linking liên kết sẽ móc nối phần mở rộng đấy với những phần source code còn lại trong chương trình của bạn.

Câu hỏi thực hành

1. Câu hỏi về list

Khởi động bằng một câu tương đối nhẹ nhàng với hai dòng code. Hầu hết các developer mới làm quen với Python cũng đều thấy thở vào nhẹ nhõm với câu hỏi này.

Tuy nhiên, trả lời đúng hay không thì còn chưa chắc

listA = ['1', '2', '3', '4', '5', '6']
print list[10:]
  • A – Index Error
  • B – []
  • C – 6

List chỉ có 5 phần tử, xong chưa?. Kết quả là:

Cần phải chú ý dấu hai chấm (:). Cái bẫy nằm ở đây, nếu gõ listA[10], kết quả chắc chắn là IndexError (do array chỉ có 6 phần tử). Tuy nhiên trường hợp này lại đang cố gắng slice List, nên kết quả không bao giờ là Index Error.

Các công việc python bạn nên tham khảo

2. Câu hỏi về append trong list

 list = [ [ ] ] * 3
list[0].append(1)
print(list)
list[1].append(2)
print(list)
  • A – [[1], [], []] và [[1], [2], []]
  • B – [[1], [1], [1]] và [[2], [2], [2]]
  • C – [[1], [1], [1]] và [[1, 2], [ 1, 2 ], [ 1, 2 ]]

Đáp án: C

Tại sao lại C. Cái bẫy là bẫy từ đầu ở chỗ [ [ ] ] * 3, cú pháp này tạo ra 3 phần tử trong list. Nhưng 3 phần tử này không độc lập để edit dữ liệu theo từng index.

[[]] * 3 chính xác tạo ra 3 item trong một list nhưng là references to the same list. Tức là cả ba đều tham chiếu tới cùng một giá trị.

list[0].append(1) đầu tiên nạp ba thằng giá trị 1 cho kết quả [[1], [1], [1]] . Bồi thêm phát nữa list[1].append(2) cho ra kết quả [[1, 2], [ 1, 2 ], [ 1, 2 ]]

Cái này thì như cái trick (thủ thuật thôi). Bạn nào cứ siêng đọc một loạt câu hỏi phỏng vấn Python thì nhớ, tiếp tục thôi nào

  Tại sao nên chọn Python để lập trình Web App?

3. Python có multi-threading không? Có cách nào viết code Python chạy parallel không?

  • A – Chắc là có, cũng như Java – Parallel Stream các kiểu đồ (bạn nào chưa biết có thể đọc thêm về Parallel Stream tại Kieblog)
  • B – Làm gì có – chưa đọc câu nào phỏng vấn Python mà bảo có multi-threadting hết
  • C – Có multi-threading nhưng không triển khai parallel được

Đáp án là B. Không có.

Python có một cái gọi là Global Interpreter Lock (GIL). GIL đảm bảo rằng chỉ có duy nhất một thread được thực thi tại một thời điểm nhất định.

Ngoài ra, Python cũng có một cái gọi là Python’s threading package.

4. *args**kwargs là gì? Sự khác biệt?

Không có ABC. Câu này thuộc dạng câu hỏi phỏng vấn Python dễ nhất rồi đấy!

*args được sử dụng khi ta KHÔNG BIẾT CHÍNH XÁC bao nhiêu đối số (arguments) được pass qua cho function. Hoặc khi ta muốn pass arguments là một list, một loại data đặc biệt.

**kwargs sử dụng khi BIẾT CHÍNH XÁC bao nhiêu arguments được truyền qua cho function.

Cũng có thể sử dụng *bob và**billy nhưng cũng khá ít người dùng.

5. Đoạn code sau cho kết quả là?

def extendList(val, list=[]):
list.append(val)
return list

list1 = extendList(5) #1
list2 = extendList(555,[])
list3 = extendList('Z') #3

Các giá trị được in ra lần lượt ở #1 và #3 là:

  • A – [5, ‘Z’] và [5, ‘Z’]
  • B – [5] và [‘Z’]
  • C – [5] và [5, ‘Z’]

Đáp án là A.

Trường hợp list1 và list3, nó chỉ truyền duy nhất một arguments. Đối với các câu hỏi phỏng vấn Python, cần nhớ rằng arguments trong def được tính toán khi function được define (định nghĩa ra). Chứ không phải lúc được gọi extendList()

Chính vì define một lần, nên ở lần gọi list1 và list3, nó lấy giá trị list cũ append giá trị mới vào -> Đáp án A, không lăn tăn.

Kết bài

Như vậy chúng ta đã đi qua top 15 câu hỏi phỏng vấn Python Developer thường gặp nhất, hy vọng bài viết này giúp bạn trang bị kiến thức tốt và tự tin hoàn thành buổi phỏng vấn Python sắp tớ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:

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

Top 5 câu hỏi phỏng vấn .NET Developer

Top 5 câu hỏi phỏng vấn NET Developer

Có là dot NET hay dot NET core thì anh em cũng cần nắm vững một số kiến thức cơ bản để tham gia phỏng vấn .NET Developer. Thời thế đổi thay nhưng những kiến thức cơ bản luôn cần thiết và cần nhớ bền, nhớ vững trong đầu.

phỏng vấn NET developer

Nói là lựa chọn vậy chứ hiện nay hầu hết các vị trí tuyển dot NET đều yêu cầu kinh nghiệm ở cả dot NET và dot NET CORE. không khó để tìm ra các JD (job description) kiểu như này.

  • Technical requirements:
  • .NET (C#, Visual Basic.NET) – 5 years+
  • .NET Core
  • API’s
  • SQL Server – 3 years+
  • Microservices / Messaging
  • Event-Driven / Distributed System

Bài viết này giới thiệu tới anh em top 5 câu hỏi phỏng vấn .NET developer. Giúp anh em tham khảo, tổng hợp lại kiến thức và hiểu biết của mình. Chuẩn bị tốt cho buổi phỏng vấn chưa bao giờ là thừa đúng không anh em?

Ok, bắt đầu ngay thôi nào!

1. .NET framework hoạt động như thế nào?

Câu hỏi đâu tiên, đập ngay vào là .NET hoạt động như nào. Tưởng dễ mà không dễ tẹo nào. Cụ thể thì .NET framework hoạt động như thế nào?.

Như bao ngôn ngữ khác, anh em viết code .NET với C# hoặc VB bằng ngôn ngữ tự nhiên, thông qua Native compiler rồi đem tới CIL (common intermediate language), intermediate là trung gian. Tức qua bước trung gian này từ ngôn ngữ tự nhiên sẽ chuyển qua ngôn ngữ code.

phỏng vấn NET developer

Sau khi qua bước này, CLR sẽ làm việc để compile toàn bộ nội dung từ CIL thành mã máy, lúc này machine có thể hiểu được và thực thi.

Về mặt bản chất việc compile từ mã code qua mã máy giống với các ngôn ngữ khác, đều dùng Just In Time(JIT) compiler để biên dịch qua mã máy. Tuy nhiên anh em lưu ý .NET compiler code qua file có định dạng dll hoặc exe.

Anh em chú ý hoạt động như thế nào thường là câu hỏi được hỏi khi phỏng vấn .NET developer nha.

  Mẫu bảng mô tả công việc lập trình .NET

2. Thứ tự events thực thi của page life cycle?

Câu hỏi thứ hai phỏng vấn .NET hỏi về life cycle. Câu này đánh mạnh vào kinh nghiệm làm việc thực tế. Nếu anh em đã có thời gian debug từng event trong life cycle tất nhiên sẽ nhớ được.

  • Page_PreInit
  • Page_Init
  • Page_InitComplete
  • Page_PreLoad
  • Page_Load
  • Page_LoadComplete
  • Page_PreRender
  • Render

Về thứ tự thì anh em nhớ là init luôn đầu tiên, khi nào init xong thì mới tới load, load hết xong xuôi tất cả đâu vào đấy rồi mới tới render.

TOP các vị trí .NET job lương cao tại đây

phỏng vấn NET developer

3. Boxing và unboxing trong .NET?

Xin thưa boxing không phải là uýnh lộn trong .NET. Trả lời lèo nghèo coi chừng toang.

Boxing is the process of converting a value type into a reference type directly.

Boxing là quá trình chuyển đổi giá trị từ kiểu giá trị sang kiểu tham chiếu

Trong khi đó unboxing

Unboxing is the process where reference type is converted back into a value type.

Unboxing là quá trình chuyển đổi kiểu tham chiếu ngược trở lại thành kiểu giá trị

int a = 10;      // a value type
object o = a;     // boxing
int b = (int)o;   // unboxing

Trong ví dụ này biến á từ kiểu giá trị int được chuyển thành object, có thể tham chiếu là o. Sau đó được chuyển ngược lại thành kiểu giá trị và gán vào biến b.

Vẫn là một câu hỏi đơn giản phỏng vấn .NET developer. Vậy sao không nhào qua tí về OOP, để xem .NET khác gì so với các ngôn ngữ khác khi so sánh giữa Abstract và Interface?

4. Sự khác biệt giữa Abstract và Interface trong .NET

Câu hỏi Abtract, Interface nó như cái gì đó default và cơ bản khi phỏng vấn bất cứ ngôn ngữ lập trình hướng đối tượng nào.

Cụ thể anh em có thể tham khảo bảng so sánh dưới đây:

Abstract class Interface
Sử dụng để khai báo properties, events, methods và fields Trong interface không thể khai báo các field.
Nhiều loại hình access biến như public, private, protected được hỗ trợ bởi Abstract Với interface thì chỉ public được hỗ trợ
Với Abstract thì bản thân nó chấp nhận kiểu static Interface không hỗ trợ kiểu static
Abstract không hỗ trợ đa kế thừa Interface hỗ trợ đa kế thừa

Về kế thừa và đa kế thừa thì dễ hiểu vì interface là can-do, tất nhiên một objects (đối tượng) có thể làm can do nhiều thứ khác nhau. Còn abstract là is-a, tức là cái gì đó. Việc cho phép đa kế thừa với interface và không cho kế thừa với abstract .NET giống với các ngôn ngữ lập trình bậc cao khác.

phỏng vấn NET developer

Nói chung là đi phỏng vấn .NET developer hay Java hay Python mà ở vị trí Backend thì thường anh em sẽ được hỏi câu hỏi này. Nếu có thể đưa ra ví dụ cụ thể giải thích Abstract và Interface nữa thì càng tuyệt.

5. Sự khác nhau giữa từ khoá ref và out

Khác với một số ngôn ngữ lập trình phổ biến như Java chỉ hỗ trợ pass by value .NET hỗ trợ cả pass by reference và pass by value. Nhưng sự khó hiểu giữa ref và out thì khác hẳn so với hai cái pass ở trên kia. Cả hai đều là pass by reference, nhưng vẫn tồn tại một số điểm khác biệt.

Quay lại với câu hỏi.

ref keyword is used to pass an already initialized variable to a method as a reference type, facilitating bi-directional data passing.

Từ khoá ref sử dụng để giá trị của biến vào function thông qua hình thức (pass by reference). Tiếng việt gọi là tham chiếu. Dữ liệu 2 chiều. Tại sao hai chiều hồi sau sẽ rõ.

out keyword is used to pass a variable as an empty container that can store multiple values to a method as a reference type. out keyword allows uni-directional data passing, as the container passed using out keyword doesn’t need to be initialized beforehand.

Trong khi đó từ khoa out sử dụng để chuyển giá tị của biến vào trong vùng chứa dưới loại tham chiếu. Với từ khoá out, biến được chuyển vào mà không cần khởi tạo vùng chứa.

Chu choa, nghe hơi căng. Thôi ví dụ gấp.

5.1 Ví dụ về ref và out

using System;
class GFG {
	// Main method
static public void Main()
{
 // Khai báo biến
 string str3 = "Kien";
 // Gọi hàm với từ khoá ref
 initializeString(ref str3);
 Console.WriteLine("Chào {0}", str3);
}
 
 
// Dùng từ khoá ref khai báo kiểu reference 
public static void initializeString(ref string str1)
{
       if (str1 == "Kien") {
           Console.WriteLine("Chào Kien dep trai");
       }
       
       // Vì biến là reference nên khi khai báo lại cái nó mất ngay
       // Tưởng đẹp nhưng không ngờ khi khai báo lại phát nữa thì anh Kiên lại xấu như quỷ 
       str1 = "Anh Kien xau nhu quy";
}
}

Kết quả khi chạy chương trình anh em sẽ nhận được 2 dòng chữ:

  • Chao Kien dep trai
  • Độp phát ngay sau đó là “anh Kien xấu như quỷ”

using System;
class GFG {
	// Main method
static public void Main()
{
 // Khai báo biến
 string str3 = "Kien";
 // Gọi hàm với từ khoá ref
 initializeString(out str3);
 Console.WriteLine("Chào {0}", str3);
}
 
 
// Dùng từ khoá ref khai báo kiểu reference 
public static void initializeString(out string str1)
{
       str1 = "Kien dep trai";
       
       // Check parameter value
       if (str1 == "Kien dep trai") {
           Console.WriteLine("ok dep trai that");
       }
}
}

Giá trị out put của đoạn code này là;

  • ok dep trai that
  • Chao Kien dep trai

Một ví dụ khác của out

// C# program to illustrate the
// concept of out parameter
using System;
  
class GFG {
  
    // Main method
    static public void Main()
    {
  
        // Declaring variable
        // without assigning value
        int G;
  
        // Pass variable G to the method
        // using out keyword
        Sum(out G);
  
        // Display the value G
        Console.WriteLine("The sum of" + 
                " the value is: {0}", G);
    }
  
    // Method in which out parameter is passed
    // and this method returns the value of
    // the passed parameter
    public static void Sum(out int G)
    {
        G = 80;
        G += G;
    }
}

Output của chương trình này

  • The sum of the value is: 160

In ra cả hai dòng chữ như này cho ta thấy cả out và ref đều là kiểu tham trị. Tức là vào và ra function thì giá trị của biến đều thay đổi. Vậy điểm khác nhau của out và ref là gì?.

   
Parameter truyền vào function thông qua hình thức ref cần được khởi tạo trước Parameter truyền vào function thông qua hình thức out không cần được khởi tạo trước
Không cần khởi tạo giá trị trước khi trả về cho function gọi Cần khởi tạo để trả về vì lúc đưa vào đã không có gì còn trả ra không có gì thì toang
Hữu dụng khi giá trị vào hàm ra hàm phát là thay đổi mãi mãi luôn, không cần quay lại giá trị cũ như pass by value Không cần khởi tạo nên nhận vào một nhưng trả về 3,4,5. Hữu dụng khi hàm trả về nhiều giá trị

Câu này đem đi phỏng vấn .NET developer mà trả lời trôi chảy thì cũng khá là khoai đó chơ.

6. Tham khảo thêm câu hỏi phỏng vấn .NET developer

Trên đây là 5 câu hỏi phỏng vấn .NET developer. Mong rằng với các câu hỏi này, anh em có thời gian tổng hợp lại kiến thức. Chuẩn bị tốt nhất cho buổi phỏng vấn .NET developer.

Anh em có thể tham khảo thêm một số bài viết sau:

Cảm ơn thời gian của anh em – Thank you for your time to read – Happy coding!

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

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

 

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

 

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

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

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

Đôi khi chúng ta cần phải ghi lại trạng thái bên trong của một đối tượng. Điều này là bắt buộc khi thực hiện tại các điểm kiểm tra và cung cấp cơ chế hoàn tác cho phép người dùng có thể khôi phục từ các lỗi. Chúng ta phải lưu thông tin trạng thái ở đâu đó để có thể khôi phục các đối tượng về trạng thái trước đó của chúng. Nhưng các đối tượng thường đóng gói một phần hoặc tất cả trạng thái của chúng, khiến nó không thể truy cập được vào các đối tượng khác và không thể lưu ở bên ngoài. Public các trạng thái này sẽ vi phạm nguyên tắc đóng gói, có thể làm giảm độ tin cậy và khả năng mở rộng của ứng dụng. Trong những trường hợp như vậy chúng ta có thể nghĩ đến Memento Pattern, nó sẽ giúp chúng ta giải quyết vấn đề này.

Memento Pattern là gì?

“Without violating encapsulation, capture and externalize an object’s internal state so that the object can be returned to this state later.”

Memento là một trong những Pattern thuộc nhóm hành vi (Behavior Pattern). Memento là mẫu thiết kế có thể lưu lại trạng thái của một đối tượng để khôi phục lại sau này mà không vi phạm nguyên tắc đóng gói.

Dữ liệu trạng thái đã lưu trong đối tượng memento không thể truy cập bên ngoài đối tượng được lưu và khôi phục. Điều này bảo vệ tính toàn vẹn của dữ liệu trạng thái đã lưu.

Hoàn tác (Undo) hoặc ctrl + z là một trong những thao tác được sử dụng nhiều nhất trong trình soạn thảo văn bản (editor). Mẫu thiết kế Memento được sử dụng để thực hiện thao tác Undo. Điều này được thực hiện bằng cách lưu trạng thái hiện tại của đối tượng mỗi khi nó thay đổi trạng thái, từ đó chúng ta có thể khôi phục nó trong mọi trường hợp có lỗi.

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

  Template Method Pattern - Khuôn mẫu cho tất cả

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

Các thành phần tham gia mẫu Memento:

  • Originator : đại diện cho đối tượng mà chúng ta muốn lưu. Nó sử dụng memento để lưu và khôi phục trạng thái bên trong của nó.
  • Caretaker : Nó không bao giờ thực hiện các thao tác trên nội dung của memento và thậm chí nó không kiểm tra nội dung. Nó giữ đối tượng memento và chịu trách nhiệm bảo vệ an toàn cho các đối tượng. Để khôi phục trạng thái trước đó, nó trả về đối tượng memento cho Originator.
  • Memento : đại diện cho một đối tượng để lưu trữ trạng thái của Originator. Nó bảo vệ chống lại sự truy cập của các đối tượng khác ngoài Originator.
    • Lớp Memento cung cấp 2 interfaces: 1 interface cho Caretaker và 1 cho Originator. Interface Caretaker không được cho phép bất kỳ hoạt động hoặc bất kỳ quyền truy cập vào trạng thái nội bộ được lưu trữ bởi memento và do đó đảm bảo nguyên tắc đóng gói. Interface Originator cho phép nó truy cập bất kỳ biến trạng thái nào cần thiết để có thể khôi phục trạng thái trước đó.
    • Lớp Memento thường là một lớp bên trong của Originator. Vì vậy, originator có quyền truy cập vào các trường của memento, nhưng các lớp bên ngoài không có quyền truy cập vào các trường này.

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

Ví dụ Memento Pattern quản lý trạng thái của một đối tượng

Ví dụ đơn giản bên dưới cho phép chúng ta lưu trữ trạng thái của một đối tượng và có thể phục hồi lại trạng thái của nó tại một thời điểm đã được lưu trữ.

package com.gpcoder.patterns.behavioral.memento.state;

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

class Originator {
    private String state;

    public void set(String state) {
        System.out.println("Originator: Setting state to " + state);
        this.state = state;
    }

    public Memento saveToMemento() {
        System.out.println("Originator: Saving to Memento.");
        return new Memento(this.state);
    }

    public void restoreFromMemento(Memento memento) {
        this.state = memento.getSavedState();
        System.out.println("Originator: State after restoring from Memento: " + state);
    }

    public static class Memento {
        private final String state;

        public Memento(String stateToSave) {
            state = stateToSave;
        }

        public String getSavedState() {
            return state;
        }
    }
}

class MementoExample {
    public static void main(String[] args) {
        List<Originator.Memento> savedStates = new ArrayList<>(); // caretaker

        Originator originator = new Originator();
        originator.set("State #1");
        originator.set("State #2");
        savedStates.add(originator.saveToMemento());
        originator.set("State #3");
        savedStates.add(originator.saveToMemento());
        originator.set("State #4");

        originator.restoreFromMemento(savedStates.get(1)); // This point need roll back
    }
}

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

Originator: Setting state to State #1
Originator: Setting state to State #2
Originator: Saving to Memento.
Originator: Setting state to State #3
Originator: Saving to Memento.
Originator: Setting state to State #4
Originator: State after restoring from Memento: State #3

Ví dụ Memento Pattern với ứng dụng quản lý tọa độ các điểm ảnh

Trong ví dụ bên dưới chúng ta sẽ tách biệt các thành phần của Memento Pattern ra từng class riêng lẻ để tiện quản lý. Chương trình cho phép chúng ta có thể khôi phục lại dữ liệu tại một thời điểm đã lưu trữ trước đó.

Originator.java

package com.gpcoder.patterns.behavioral.memento.point;

public class Originator {

    private double x;
    private double y;

    public Originator(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public void setX(double x) {
        this.x = x;
    }

    public void setY(double y) {
        this.y = y;
    }

    public Memento save() {
        return new Memento(this.x, this.y);
    }

    public void undo(Memento mem) {
        this.x = mem.getX();
        this.y = mem.getY();
    }

    @Override
    public String toString() {
        return "X: " + x + ", Y: " + y;
    }
}

Memento.java

package com.gpcoder.patterns.behavioral.memento.point;

public class Memento {

    private double x;
    private double y;

    public Memento(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }
}

CareTaker.java

package com.gpcoder.patterns.behavioral.memento.point;

import java.util.HashMap;
import java.util.Map;

public class CareTaker {

    private final Map<String, Memento> savepointStorage = new HashMap<>();

    public void saveMemento(Memento memento, String savedPointName) {
        System.out.println("Saving state..." + savedPointName);
        savepointStorage.put(savedPointName, memento);
    }

    public Memento getMemento(String savedPointName) {
        System.out.println("Undo at ..." + savedPointName);
        return savepointStorage.get(savedPointName);
    }

    public void clearSavepoints() {
        System.out.println("Clearing all save points...");
        savepointStorage.clear();
    }
}

MementoPatternExample.java

package com.gpcoder.patterns.behavioral.memento.point;

public class MementoPatternExample {

    public static void main(String[] args) {

        CareTaker careTaker = new CareTaker();
        Originator originator = new Originator(5, 10);
        originator.setX(originator.getY() * 51);
        System.out.println("State initial: " + originator);

        careTaker.saveMemento(originator.save(), "SAVE #1");

        originator.setY(originator.getX() / 22);
        System.out.println("State changed: " + originator);

        originator.undo(careTaker.getMemento("SAVE #1"));
        System.out.println("State after undo: " + originator);

        originator.setX(Math.pow(originator.getX(), 3));
        careTaker.saveMemento(originator.save(), "SAVE #2");
        System.out.println("State changed: " + originator);

        originator.setY(originator.getX() - 30);
        careTaker.saveMemento(originator.save(), "SAVE #3");
        System.out.println("State saved #3: " + originator);

        originator.setY(originator.getX() / 22);
        careTaker.saveMemento(originator.save(), "SAVE #4");
        System.out.println("State saved #4: " + originator);

        originator.undo(careTaker.getMemento("SAVE #2"));
        System.out.println("Retrieving at saved #2: " + originator);
    } 
}

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

State initial: X: 510.0, Y: 10.0
Saving state...SAVE #1
State changed: X: 510.0, Y: 23.181818181818183
Undo at ...SAVE #1
State after undo: X: 510.0, Y: 10.0
Saving state...SAVE #2
State changed: X: 1.32651E8, Y: 10.0
Saving state...SAVE #3
State saved #3: X: 1.32651E8, Y: 1.3265097E8
Saving state...SAVE #4
State saved #4: X: 1.32651E8, Y: 6029590.909090909
Undo at ...SAVE #2
Retrieving at saved #2: X: 1.32651E8, Y: 10.0

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

Lợi ích:

  • Bảo bảo nguyên tắc đóng gói: sử dụng trực tiếp trạng thái của đối tượng có thể làm lộ thông tin chi tiết bên trong đối tượng và vi phạm nguyên tắc đóng gói.
  • Đơn giản code của Originator bằng cách để Memento lưu giữ trạng thái của Originator và Caretaker quản lý lịch sử thay đổi của Originator.

Một số vấn đề cần xem xét khi sử dụng Memento Pattern:

  • Khi có một số lượng lớn Memento được tạo ra có thể gặp vấn đề về bộ nhớ, performance của ứng dụng.
  • Khó đảm bảo trạng thái bên trong của Memento không bị thay đổi.

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

  • Các ứng dụng cần chức năng cần Undo/ Redo: lưu trạng thái của một đối tượng bên ngoài và có thể restore/ rollback sau này.
  • Thích hợp với các ứng dụng cần quản lý transaction.

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