Home Blog Page 154

Tạo random số và chuỗi ngẫu nhiên trong Java

Tạo số và chuỗi ngẫu nhiên trong Java

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

Trong thế giới lập trình, việc tạo số ngẫu nhiên là một yêu cầu cơ bản và quan trọng, ảnh hưởng trực tiếp đến chất lượng và tính ngẫu nhiên của dữ liệu. Java, với sự đa dạng và mạnh mẽ của mình, cung cấp nhiều cách để sinh số ngẫu nhiên. Bài viết này sẽ giới thiệu ba phương pháp chính để tạo số ngẫu nhiên trong Java.

Hướng dẫn tạo số ngẫu nhiên bằng Java chi tiết

Để tạo một trình tạo số ngẫu nhiên (generator), đơn giản chỉ việc tạo một new instance của Random.

Random generator = new Random();

Khi sử dụng hàm tạo này, bạn sẽ nhận ra rằng các trình tạo số ngẫu nhiên thuật toán không thực sự ngẫu nhiên, chúng thực sự là các thuật toán tạo ra một chuỗi số cố định nhưng trông ngẫu nhiên.

Khi tạo một generator, nó sẽ khởi tạo chuỗi của nó từ một giá trị được gọi là “seed” của nó. Khi chúng ta sử dụng constructor không có tham số, nó sẽ tạo seed có một giá trị khác biệt với bất kỳ lời gọi nào khác của constructor này. Nhưng chúng ta không kiểm soát được giá trị đó là gì, hoặc thậm chí đảm bảo hoàn toàn rằng nó sẽ khác với seed được sử dụng bởi các lời gọi khác trên constructor này.

Nếu thích, chúng ta cũng có thể chỉ định một giá trị bất kỳ thuộc kiểu “long” để khởi tạo cho seed. Ví dụ:

Random generator = new Random(19900828);

Sau khi đã có generator, gọi các phương thức nextXxx() để tạo các giá trị ngẫu nhiên:

  • nextInt() : trả về một số ngẫu nhiên trong khoảng giá trị của int value (từ -2^31 đến 2^31-1).
  • nextInt(maxNumber) : trả về một số int ngẫu nhiên từ 0 đến giá trị < maxNumber.
  • nextLong() : trả về một số ngẫu nhiên kiểu long. Vì Random sử dụng giá trị seed chỉ 48bits, nên thuật toán random không thể trả về tất cả các giá trị thuộc kiểu long.
  • nextFloat(): trả về một số ngẫu nhiên trong khoảng 0.0 và <1.0
  • nextDouble() : tương tự như nextFloat() như độ dài phần thập phân lớn hơn.
  • nextBoolean() : trả về giá trị true, false ngẫu nhiên.

Ví dụ giới hạn giá trị Random Number

Đôi khi chúng ta cần số ngẫu nhiên nằm trong một phạm vi khác nhau. Chúng ta có thể làm cho các số ngẫu nhiên nằm trong một phạm vi rộng hơn hoặc hẹp hơn bằng cách nhân chúng với một hệ số tỷ lệ. Chúng ta cũng có thể đặt các số ngẫu nhiên nằm trong một phạm vi được chuyển sang các số lớn hơn hoặc nhỏ hơn so với ban đầu bằng cách cộng thêm (hoặc trừ) một phần bù từ các số ngẫu nhiên.

Ví dụ 1: chúng ta có một game có 4 người chơi, mỗi người có 1 số từ một đến 4. Chương trình của chúng ta sẽ random từ 1 đến 4 để lựa chọn người may mắn có số trùng với số được random. Đơn giản chỉ việc gọi hàm nextInt(4), hàm này sẽ trả về giá trị từ 0 đến 3, nên chúng ta cần cộng thêm 1 để có kết quả như ý muốn.

int value = generator.nextInt(4) + 1;

Ví dụ 2: Cần vẽ random một line có góc từ 0 đến 360 độ.

double value = generator.nextDouble() * 360.0;

Ví dụ 3: Random int number trong khoảng được chỉ định.

int value = generator.nextInt((max - min) + 1) + min;

Ví dụ 4: Trong một số ứng dụng đăng nhập bằng số điện thoại như Google, sau khi nhập số điện thoại, Google sẽ gửi một mã xác nhận số điện thoại gồm 6 số ngẫu nhiên. Chúng ta cũng có thể tạo số ngẫu nhiên này với Random.

int code = (int) Math.floor(((Math.random() * 899999) + 100000));

Lưu ý: Instances của java.util.Random là Thread safe. Tuy nhiên, việc sử dụng đồng thời cùng một đối tượng java.util.Random trong môi trường đa luồng (multi-thread) có thể gặp phải sự tranh chấp và hiệu suất kém. Thay vào đó hãy xem xét sử dụng ThreadLocalRandom trong các thiết kế đa luồng. Nếu cần Security random có thể sử dụng SecureRandom.

Tuyển dụng Java không yêu cầu kinh nghiệm

Các phương pháp tạo số random trong Java

Để tạo random một số ngẫu nhiên trong Java, chúng ta có thể sử dụng các hàm random trong Math class và Random class mà Java đã hỗ trợ sẵn.

Random số trong Java bằng Random class

Trong Java để tạo một số ngẫu nhiên chúng ta có thể sử dụng class java.util.Random đã được hợp trong JDK. Class này cung cấp nhiều phương thức để tạo các kiểu số ngẫu nhiên khác nhau, chẳng hạn như như int, float, long, và boolean.

import java.util.Random;

public class RandomExample {
    public static void main(String[] args) {
        Random rand = new Random();
        int randomInt = rand.nextInt(100); // Số ngẫu nhiên từ 0 đến 99
        System.out.println("Random int: " + randomInt);
    }
}

Sử dụng phương pháp Math.random()

Phương pháp Math.random() trả về một giá trị double ngẫu nhiên từ 0.0 đến 1.0.

public class MathRandomExample {
    public static void main(String[] args) {
        double randomDouble = Math.random();
        int randomInt = (int) (randomDouble * 100); // Số ngẫu nhiên từ 0 đến 99
        System.out.println("Random double: " + randomDouble);
        System.out.println("Random int: " + randomInt);
    }
}

Sử dụng lớp java.util.concurrent.ThreadLocalRandom

Lớp ThreadLocalRandom cung cấp một cách hiệu quả hơn để tạo số ngẫu nhiên trong các ứng dụng đa luồng.

import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomExample {
    public static void main(String[] args) {
        int randomInt = ThreadLocalRandom.current().nextInt(0, 100); // Số ngẫu nhiên từ 0 đến 99
        System.out.println("ThreadLocalRandom int: " + randomInt);
    }
}

Sử dụng phương pháp java.util.Random.ints()

Phương pháp ints() của lớp Random cho phép tạo ra một luồng các số nguyên ngẫu nhiên.

import java.util.Random;

public class RandomIntsExample {
    public static void main(String[] args) {
        Random rand = new Random();
        rand.ints(5, 0, 100).forEach(System.out::println); // 5 số ngẫu nhiên từ 0 đến 99
    }
}

Sử dụng lớp java.security.SecureRandom

Lớp SecureRandom cung cấp số ngẫu nhiên với độ bảo mật cao, thường được dùng trong các ứng dụng yêu cầu tính ngẫu nhiên mạnh mẽ như mật mã học.

import java.security.SecureRandom;

public class SecureRandomExample {
    public static void main(String[] args) {
        SecureRandom secureRand = new SecureRandom();
        int randomInt = secureRand.nextInt(100); // Số ngẫu nhiên từ 0 đến 99
        System.out.println("SecureRandom int: " + randomInt);
    }
}

Tạo chuỗi ngẫu nhiên – Random string

Có nhiều trường hợp chúng ta cần tạo chuỗi ngẫu nhiên, chẳng hạn tạo ra mã captcha để chống spam, gửi mã code xác nhận tài khoản, …. Có nhiều cách để tạo chuỗi ngẫu nhiên, trong bài này tôi sẽ hướng dẫn các bạn tự tạo chuỗi ngẫu nhiên và sử dụng thư viện Apache common.

Tự tạo chuỗi ngẫu nhiên

Để tạo một chuỗi ngẫu nhiên, chúng ta sẽ định nghĩa một chuỗi các ký tự được phép xuất hiện trong chuỗi ngẫu nhiên. Sau đó sẽ sử dụng Random để tạo một giá trị index ngẫu nhiên từ chuỗi đã định nghĩa trước đó. Cứ thực hiện random index và truy xuất ký tự từ index cho đến khi đầy đủ số lượng ký tự mong muốn.

Trong ví dụ này, tôi sẽ tạo 2 phương thức:

  • randomAlphaNumeric(): Tạo một chuỗi ngẫu nhiên chỉ bao gồm các ký tự từ a-z, A-Z và 0-9, không bao gồm các ký tự đặc biệt.
  • randomPassword(): Tạo một chuỗi password ngẫu nhiên bao gồm ít nhất 1 ký tự đặc biệt và 1 ký tự số.
package com.gpcoder.random; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; import java.util.function.Consumer; public class RandomStringExmple {     private static final String alpha = "abcdefghijklmnopqrstuvwxyz"; // a-z     private static final String alphaUpperCase = alpha.toUpperCase(); // A-Z     private static final String digits = "0123456789"; // 0-9     private static final String specials = "~=+%^*/()[]{}/!@#$?|";     private static final String ALPHA_NUMERIC = alpha + alphaUpperCase + digits;     private static final String ALL = alpha + alphaUpperCase + digits + specials;     private static Random generator = new Random()
     /**      * Random string with a-zA-Z0-9, not included special characters      */     public String randomAlphaNumeric(int numberOfCharactor) {         StringBuilder sb = new StringBuilder();         for (int i = 0; i < numberOfCharactor; i++) {             int number = randomNumber(0, ALPHA_NUMERIC.length() - 1);             char ch = ALPHA_NUMERIC.charAt(number);             sb.append(ch);         }         return sb.toString();     }     /**      * Random string password with at least 1 digit and 1 special character      */     public String randomPassword(int numberOfCharactor) {         List<String> result = new ArrayList<>();         Consumer<String> appendChar = s -> {             int number = randomNumber(0, s.length() - 1);             result.add("" + s.charAt(number));         };         appendChar.accept(digits);         appendChar.accept(specials);         while (result.size() < numberOfCharactor) {             appendChar.accept(ALL);         }         Collections.shuffle(result, generator);         return String.join("", result);     }     public static int randomNumber(int min, int max) {         return generator.nextInt((max - min) + 1) + min;     }     public static void main(String a[]){         int numberOfCharactor = 8;         RandomStringExmple rand = new RandomStringExmple();             System.out.println("randomString1: " + rand.randomAlphaNumeric(numberOfCharactor));         System.out.println("randomString1: " + rand.randomAlphaNumeric(numberOfCharactor));         System.out.println("randomString1: " + rand.randomAlphaNumeric(numberOfCharactor));         System.out.println("randomPassword1: " + rand.randomPassword(numberOfCharactor));         System.out.println("randomPassword2: " + rand.randomPassword(numberOfCharactor));     } }

Chạy chương trình trên nhiều lần, chúng ta sẽ thấy các kết quả khác nhau:

randomString1: 65cihDTo randomString1: GbEMJBVH randomString1: WJF7hZ3c randomPassword1: #f|XD/W3 randomPassword2: |M$=}=2A
  10 Java Web Framework tốt nhất
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Sử dụng lớp commons.lang3.text.RandomStringUtils

Một số phương thức hỗ trợ tạo chuỗi và số ngẫu nhiên trong lớp RandomStringUtils:

  • random(int count) : Tạo một chuỗi ngẫu nhiên có chiều dài là số ký tự được chỉ định, không giới hạn loại ký tự được trả về.
  • randomAscii(int count) : Tạo một chuỗi ngẫu nhiên có chiều dài là số ký tự được chỉ định, bao gồm các ký tự có giá trị ASCII từ 32 đến 126.
  • randomNumeric(int count) : Tạo một chuỗi số ngẫu nhiên có chiều dài là số ký tự được chỉ định, bao gồm các ký tự số 0-9.
  • randomAlphabetic(int count) : Tạo một chuỗi số ngẫu nhiên có chiều dài là số ký tự được chỉ định, bao gồm các ký tự chữ Latin (a-z, A-Z).
  • randomAlphanumeric(int count) : Tạo một chuỗi số ngẫu nhiên có chiều dài là số ký tự được chỉ định, bao gồm các ký tự chữ Latin (a-z, A-Z) và số 0-9.
  • random(int count, String input) : Tạo một chuỗi số ngẫu nhiên có chiều dài là số ký tự được chỉ định, chỉ bao gồm các ký tự được xác định trong input.

Ví dụ:

package com.gpcoder; import org.apache.commons.lang3.RandomStringUtils; public class RandomStringUtilsExample {     public static void main(String[] args) {         System.out.println(RandomStringUtils.random(4)); //          System.out.println(RandomStringUtils.random(6)); // 㚔쬩́㽩         System.out.println(RandomStringUtils.randomAscii(4)); // qe51         System.out.println(RandomStringUtils.randomAscii(6)); // MqQ^X\         System.out.println(RandomStringUtils.randomNumeric(4)); // 9808         System.out.println(RandomStringUtils.randomNumeric(6)); // 338756         System.out.println(RandomStringUtils.randomAlphabetic(4)); // kvMu         System.out.println(RandomStringUtils.randomAlphabetic(6)); // PeykyQ         System.out.println(RandomStringUtils.randomAlphanumeric(4)); // MavC         System.out.println(RandomStringUtils.randomAlphanumeric(6)); // fR2BEf         String input = "abcd1234!@#$%^&*()-=_+;:<>,.?/";         System.out.println(RandomStringUtils.random(4, input)); // 1)+(         System.out.println(RandomStringUtils.random(6, input)); // -c=,a,     } }

Sử dụng java.util.UUID

UUID (Universally Unique Identifier) hay còn được biết đến như là GUID (Globally Unique Identifier), là một chuỗi đại diện cho một mã định danh duy nhất, không thể thay đổi (immutable), và có giá trị dài 128 bit.

UUID được sử dụng để tạo tên file ngẫu nhiên, id session trong ứng dụng web, id transaction, …

Phương thức java.util.UUID.randomUUID() được sử dụng để sinh ra một chuỗi ngẫu nhiên có độ dài 32 ký tự (128 bit) được biểu diễn ở hệ hệ thập lục phân (hex: 0-9A-F) và 4 ký tự phân tách ().

Tạo số và chuỗi ngẫu nhiên trong Java

Ví dụ:

UUID uuid = UUID.randomUUID(); System.out.println("UUID: " + uuid.toString()); System.out.println("variant: " + uuid.variant()); System.out.println("version: " + uuid.version());

Chạy chương trình, chúng ta có kết quả như sau:

UUID: ef41d4cb-5d1b-4a83-a4c1-f1397e3fcdb7 variant: 2 version: 4

Như vậy chúng mình đã cùng nhau tìm hiểu các cách tạo số và chuỗi kí tự random trong Java. Cảm ơn bạn đọc!

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

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

Tester là gì? Kỹ năng cần thiết để trở thành một Tester

tester là gì

Bạn tò mò muốn biết về công việc chính của một tester? Cơ hội nào cho nghề kiểm thử? Bài viết này của TopDev sẽ giúp bạn hiểu rõ hơn về tester là gì, nghề kiểm thử đòi hỏi những kỹ năng nào, vai trò của người kiểm thử và các nhiệm vụ quan trọng mà người kiểm thử thực hiện trong quá trình phát triển phần mềm.

Tester là gì?

Tester là gì? Tester hay còn được gọi là người kiểm thử phần mềm là người chịu trách nhiệm đảm bảo chất lượng của phần mềm bằng cách phát hiện các lỗi và vấn đề, đồng thời xác nhận rằng phần mềm hoạt động đúng như mong đợi. Đây là một vai trò quan trọng trong quy trình phát triển phần mềm, giúp đảm bảo rằng sản phẩm cuối cùng sẽ hoạt động ổn định và đáp ứng được các yêu cầu của người dùng.

Nói một cách đơn giản, vai trò của Tester là kiểm tra sản phẩm và cung cấp báo cáo cho nhóm Developer về bất kỳ vấn đề nào cần cải thiện cho sản phẩm.

Tuy nhiên, trong ngành Công nghệ Thông tin, tuy cũng có 1 vị trí có chức năng là kiểm tra, thử nghiệm và kiểm định chất lượng nhưng khác với một Tester thông thường, Tester ngành IT có rất nhiều tên gọi khác nhau như Software Tester/ Technical Tester…

Tester sẽ có nhiều mảng như QA QC, đặc biệt là Manual TesterAutomation Tester.

Thực ra, đôi khi Tester không hoàn toàn xác định được tất cả lỗi của một hệ thống hay phần mềm, tuy nhiên họ sẽ dựa vào các nguyên tắc, quy luật để tìm ra lỗi bugs. Các nguyên tắc và quy luật này sẽ thay đổi tùy theo sản phẩm, phần mềm, tiêu chuẩn, kỳ vọng hoặc hoạt động mà sẽ có sự thay đổi khác nhau.

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

Vai trò của Tester là gì?

Vai trò của tester

Các Tester là người nắm vững các kiến ​​thức tổng quát, vững chắc về các công cụ và kỹ thuật, cùng với một số kiến ​​thức/kinh nghiệm phát triển phần mềm. Trong giai đoạn lập kế hoạch thử nghiệm và chuẩn bị thử nghiệm, các Tester thường xem xét và đóng góp vào kế hoạch kiểm tra, cũng như phân tích và đánh giá các yêu cầu và thông số kỹ thuật.

Họ thường là người tham gia hoặc chịu trách nhiệm hoàn toàn trong việc xác định các điều kiện thử nghiệm và tạo ra các thiết kế thử nghiệm, trường hợp thử nghiệm, đặc tả quy trình thử nghiệm và dữ liệu thử nghiệm. 

Sau đó, họ có thể tự động hóa hoặc giúp tự động hóa các bài kiểm tra. Họ thường là người giữ vai trò thiết lập môi trường thử nghiệm hoặc hỗ trợ quản trị hệ thống và nhân viên quản lý mạng làm việc đó 

Khi các thử nghiệm được triển khai và vận hành, các Tester được yêu cầu note lại quá trình kiểm tra, đánh giá kết quả và ghi lại các lỗi được tìm thấy. Họ giám sát thử nghiệm và môi trường thử nghiệm, họ sử dụng các công cụ cho công việc và thu thập các số liệu về hiệu suất.

Yêu cầu công việc của Tester

  • Hiểu sản phẩm cần được kiểm tra
  • Lập kế hoạch chiến lược thử nghiệm, để thực hiện các thử nghiệm và tìm ra các vấn đề tiềm ẩn
  • Phân tích ưu và nhược điểm của kế hoạch cụ thể, cũng như rủi ro liên quan đến từng thành phần và giao diện trong sản phẩm.
  • Check lại các code cần kiểm tra
  • Làm việc với các tập lệnh và công cụ tự động hóa
  • Luôn cập nhật các khía cạnh kỹ thuật của cơ sở hạ tầng dự án (ví dụ: trình duyệt, cơ sở dữ liệu, ngôn ngữ, v.v.)
  • Phân tích và ghi nhận về các vấn đề và cung cấp phản hồi thích hợp.

  Kinh Nghiệm Phỏng Vấn Tester Thành Công Được Áp Dụng Nhiều Nhất

Có thể nói mục tiêu được ưu tiên hàng đầu của các Tester là tìm ra được các lỗi phần mềm – báo cáo – khắc phục lỗi. Thông thường, mỗi loại sản phẩm khác nhau đều có chức năng khác nhau, cái khó của nghề Tester là phải có kiến thức tổng quát để có thể trả về báo cáo kết quả hiệu quả nhất cho team. 

Họ sẽ phải đóng vai là một người dùng và sử dụng sản phẩm, len lỏi trong hết tất cả các ngóc ngách của ứng dụng để tìm lỗi.

Việc test thử phần mềm rất quan trọng vì nếu có bất kỳ vấn đề hoặc lỗi nào trong phần mềm, nó có thể được xác định sớm và được giải quyết trước khi giao/ra mắt sản phẩm phần mềm. Sản phẩm phần mềm được kiểm tra sẽ đảm bảo được độ tin cậy, bảo mật và hiệu suất cao, giúp tiết kiệm thời gian, hiệu quả chi phí và mang đến sự hài lòng cho khách hàng.

Việc kiểm tra rất quan trọng vì khi một phần mềm vẫn còn lỗi được ra đời thì có thể gây tốn kém hoặc thậm chí nguy hiểm. Lỗi phần mềm có thể gây ra thiệt hại về tiền bạc và cả con người. Trong quá khứ đã có rất nhiều trường hợp đáng tiếc xảy ra vì đã không chú trọng các quy trình kiểm tra của Tester.

tester là gì

Lợi ích của việc vận dụng tốt vai trò Tester là gì?

Dưới đây là những lợi ích của việc tận dụng tốt giá trị của Tester:

  • Hiệu quả về chi phí: Đây là một trong những lợi thế quan trọng của Tester. Kiểm tra bất kỳ dự án CNTT nào đúng thời hạn sẽ giúp bạn tiết kiệm tiền của mình trong dài hạn. Trong trường hợp nếu các lỗi được phát hiện trong giai đoạn testing trước đó, thì chi phí sửa chữa sẽ thấp hơn.
  • Bảo mật: Đây là lợi ích nhạy cảm và dễ bị tấn công nhất của Tester. Mọi người đang tìm kiếm các sản phẩm đáng tin cậy, Tester giúp loại bỏ rủi ro và vấn đề khác.
  • Chất lượng sản phẩm: Đây là yêu cầu thiết yếu của bất kỳ sản phẩm phần mềm nào. Việc sử dụng Tester sẽ đảm bảo một sản phẩm chất lượng được cung cấp đến tay khách hàng.
  • Sự hài lòng của khách hàng: Mục đích chính của bất kỳ sản phẩm nào là mang lại sự hài lòng cho khách hàng của họ. Vì thế nên kiểm tra UI/UX đảm bảo trải nghiệm người dùng tốt nhất.

  Giao tiếp giữa Tester và Dev

Kỹ năng cần thiết để trở thành một Tester là gì?

Kỹ năng về công nghệ

Các Tester thường được yêu cầu các kỹ năng không liên quan gì đến tự động hóa, yêu cầu đối với một Tester là phải có sự hiểu biết rộng và thành thạo các công cụ có sẵn. Tuy nhiên, không phải ai cũng có thể thỏa mãn những tiêu chí đó, vì thế nếu thỏa mãn những tiêu chí cơ bản dưới đây, các bạn cũng có thể trở thành một Tester thực thụ.

Kiến thức cơ bản về Database/SQL: Tester là người có thể xử lý với các dự án làm việc với một lượng lớn dữ liệu trong nền. Dữ liệu này được lưu trữ trong các loại cơ sở dữ liệu khác nhau như Oracle, MySQL, v.v. Trong những trường hợp như vậy, việc có kỹ năng về Database/ SQL rất hữu ích!

Kiến thức cơ bản về lệnh Linux: Hầu hết các ứng dụng phần mềm như Web-Services, Database, Application Server đều được triển khai trên các máy Linux. Điều này yêu cầu các Tester phải có kiến ​​thức về các câu lệnh Linux.

Làm việc với các công cụ Test Management: Test Management là một khía cạnh quan trọng trong vai trò hàng ngày của Tester. Nếu không có kỹ thuật Test Management thích hợp, quá trình kiểm thử phần mềm sẽ thất bại.

Làm việc với các công cụ Defect Tracking: Đây là kỹ năng cực kỳ quan trọng vì các công cụ này sẽ quản lý các lỗi đúng cách và theo dõi chúng một cách có hệ thống bằng cách sử dụng các công cụ như QC, Bugzilla, Jira, v.v.

Làm việc với các công cụ Automation: Các công cụ tự động hóa như Selenium, Ranorex và Cucumber là điều cần thiết cơ bản khi trở thành một người Tester bất kỳ không chỉ Software Tester.

Kỹ năng mềm

Kỹ năng phân tích: Bất kỳ người Tester giỏi nào cũng có điểm mạnh là kỹ năng phân tích tuyệt vời. Chúng cho phép bạn chia nhỏ một hệ thống phần mềm phức tạp thành các đơn vị nhỏ hơn để hiểu rõ hơn về từng yếu tố riêng lẻ.

Kỹ năng giao tiếp: Khi làm việc trong một dự án hợp tác, kỹ năng giao tiếp tốt có thể giúp ích rất nhiều khi chuyển tiếp thông tin và cung cấp báo cáo về các bài kiểm tra bạn đã làm.

  Kỹ năng giao tiếp? Làm thế nào để cải thiện giao tiếp hiệu quả?

Kỹ năng tổ chức và quản lý thời gian: Software Tester đôi khi có thể trở thành một vị trí với nhiều khó khăn. Có thể quản lý hiệu quả khối lượng công việc hiệu quả trong thời gian ngắn đồng thời có thể mang lại lợi ích cho team Tester là một điều không hề đơn giản.

Phân loại Software Tester

Phân loại Software Tester

Có rất nhiều các phương pháp testing nhưng chỉ có một vài phương pháp tiêu biểu được các Tester thường xuyên sử dụng vì nhiều lợi ích khác nhau. Các phương pháp Kiểm thử Phần mềm được liệt kê dưới đây được xem là các phương pháp cơ bản trong testing.

  • Kiểm tra chức năng (Functional Testing)
  • Kiểm tra phi chức năng/Kiểm tra hiệu suất (Non-Functional Testing)
  • Kiểm thử bảo trì (Maintenance Testing – Regression & Maintenance)

Functional Testing

Trong phương pháp Functional Testing, còn có những phương pháp với chức năng chi tiết hơn như:

  • Unit Testing
  • Integration Testing
  • Smoke
  • UAT ( User Acceptance Testing)
  • Localization
  • Globalization
  • Interoperability

Non-Functional Testing

Trong phương pháp Non-Functional Testing, còn có những phương pháp với chức năng chi tiết hơn như:

  • Performance
  • Endurance
  • Load
  • Volume
  • Scalability
  • Usability

Maintenance Testing

Trong phương pháp Maintenance Testing, còn có những phương pháp với chức năng chi tiết hơn như: 

  • Regression
  • Maintenance

Các chứng chỉ trong ngành Tester là gì?

Trong tương lai, nếu bạn nào có định hướng đi theo con đường sự nghiệp của một Tester thì ngoài việc nên bổ sung các kiến thức cần thiết trong ngành mà còn nên sở hữu một hoặc nhiều các chứng chỉ dưới đây để nâng cao level của mình nhé!

Các chứng nhận đảm bảo chất lượng ngành Kiểm thử phần mềm (tên chứng nhận – nơi cấp)

  • CMST – Viện đảm bảo chất lượng.
  • CTM/CSTP/CATE – Viện quốc tế về kiểm thử phần mềm.
  • ISEB – Hội đồng hệ thống thông tin thi cử.
  • CTFL/CTAL – Hội đồng Văn bằng quốc tế.
  • CMSQ/CSQA/CSTE – Viện Đảm bảo Chất lượng (QAI).
  • CSQE/CQIA – Hiệp hội chất lượng Hoa Kỳ (ASQ).

  Các chứng chỉ Tester nên có để theo đuổi sự nghiệp

Truy cập ngay các việc làm IT đãi ngộ tốt trên TopDev

IT Helpdesk là gì? Mô tả công việc và Kỹ năng cần có

it-helpdesk-la-gi

Công việc IT Helpdesk có thể là một công việc tuyệt vời để bắt đầu dấn thân vào ngành IT, hiện đang được nhiều bạn trẻ CNTT quan tâm tìm hiểu. Vậy phạm vi công việc IT Helpdesk là gì, có quá rộng? Nếu theo nghề này thì có cơ hội thăng tiến hay phát triển đến đâu? Hậu dịch tìm việc làm IT Helpdesk liệu có quá khó? Hãy cùng TopDev điểm qua các thông tin quan trọng như mô tả công việc, kĩ năng cần có và cần chuẩn bị kiến thức như thế nào về vị trí IT đang hot này.

IT Helpdesk là gì?

IT Helpdesk là một bộ phận trong tổ chức có nhiệm vụ giải đáp và tư vấn giải pháp về các vấn đề liên quan đến kỹ thuật/ công nghệ về sản phẩm của tổ chức cho end-user. Đa số các công ty IT đều có bộ phận helpdesk để giải đáp và hỗ trợ người dùng. Phần tư vấn này sẽ được truyền tải qua email, điện thoại, website hoặc chatbot,… 

Ngoài ra, sẽ có bộ phận internal helpdesk (helpdesk nội bộ) làm các tác vụ tương vụ, nhưng sẽ hỗ trợ chỉ cho đội ngũ nhân viên trong công ty. Vị trí helpdesk chuẩn sẽ dùng một đầu contact point duy nhất để hỗ trợ khách hàng. 

Vai trò của vị trí này là phụ trách phối hợp ăn ý với các bộ phận liên quan như Technical để có thể hỗ trợ và giúp đỡ khách hàng giải quyết những vấn đề lỗi kỹ thuật, hỏng hóc,… một cách nhanh chóng và hiệu quả cao. Tiến hành theo dõi và kiểm tra hệ thống liên tục và xuyên suốt trong quá trình sử dụng để đảm bảo rằng việc bảo trì và khắc phục sự cố luôn được xử lý kịp thời và nhanh chóng.

Phân biệt IT Helpdesk và IT Support

Phần này hoàn toàn phụ thuộc vào quy mô tổ chức, loại hình dịch vụ/ sản phẩm cung như quy mô của đội IT – Technical của mỗi công ty. Thật ra không có một định nghĩa đúng hay sai về sự khác nhau của 2 vị trí này, do bản chất nó đều giống nhau. Bài viết này TopDev xin nêu tổng quát công việc và vai trò của IT Helpdesk như IT Support tại đa số mô hình các doanh nghiệp tại Việt Nam. 

Công việc của IT Helpdesk là gì?

Đây cũng không phải ngoại lệ: mỗi tổ chức công ty sẽ có một scope of work – công việc cho IT Helpdesk hoàn toàn khác nhau. Chưa kể là internal IT helpdesk (helpdesk nội bộ) hay IT Helpdesk cho end-user.

IT Helpdesk thường sẽ giải quyết troubleshooting các vấn đề IT và kỹ thuật nói chung. Vị trí sẽ giúp doanh nghiệp đảm bảo track và phát hiện kịp thời các vấn đề tiềm ẩn của sản phẩm/ dịch vụ. Nó cũng đảm bảo được hiệu suất và chất lượng của sản phẩm/ dịch vụ nói chung.

it helpdesk la gi

Nhân viên IT Helpdesk có nhiệm vụ chẩn đoán và giải quyết vấn đề phần mềm và phần cứng cho người dùng. Một số vai trò và trách nhiệm của IT Helpdesk bao gồm việc thuyết trình giải pháp đến cho khách hàng doanh nghiệp – cổ đông nhà đầu tư bằng các dữ liệu họ thu thập và xử lý được về một vấn đề cụ thể, từ đó có thể đưa ra các quyết định kinh doanh, đầu tư quan trọng như phân phối, sắp xếp, lên budget và các quy trình khác.

Nhiệm vụ chính của IT Helpdesk là tạo điều kiện và hỗ trợ quy trình doanh nghiệp được vận hành mượt mà và hiệu quả thông qua sự hỗ trợ toàn diện về cả phần cứng và phần mềm. Mức độ hỗ trợ này có thể linh hoạt tùy vào nhu cầu của mỗi doanh nghiệp. IT Helpdesk là cầu nối giao tiếp và trải nghiệm giữa doanh nghiệp và end-user.

Bên dưới là mô tả công việc IT Helpdesk tiêu biểu của một IT Helpdesk tại doanh nghiệp Việt Nam:

  • Hỗ trợ khách hàng và end-user gặp trục trặc về kỹ thuật với sản phẩm. Thường 2 bên sẽ giao tiếp qua điện thoại hoặc email. 
  • Áp dụng các kỹ thuật chẩn đoán và giải quyết vấn đề để xử lý sự cố qua phone, video call, live chat hoặc gặp mặt trực tiếp. 
  • Nói chuyện với khách hàng trực tiếp về sự cố và làm việc nội bộ/ team để cùng xử lý vấn đề 
  • Xác định giải pháp hiệu quả và trình bày / thuyết trình giải pháp cho user cũng như nội bộ để xử lý 
  • Thu thập và ghi lại tiến độ xử lý, tình hình và chất lượng, và để làm việc nội bộ và cập nhật các phần xử lý và fix vấn đề 
  • Thu thập và ghi lại các phản hồi cũng như phàn nàn từ khách hàng 
  • Đề xuất giải pháp pháp và cách xử lý vấn đề trong tương lai 
  • Hướng dẫn end-user sử dụng hệ thống và chương trình thành thạo 
  • Back-up dữ liệu, cập nhật và duy trì network 
  • Các nhiệm vụ liên quan đến Bảo hành, sửa chữa máy.

Kỹ năng cần có để trở thành một IT Helpdesk

Làm việc như một IT Helpdesk hoặc vị trí support là một công việc một bàn trợ giúp hay là một vai trò hỗ trợ là một cách tuyệt vời để được khai thác và phát triển cốt lõi của doanh nghiệp: phía khách hàng và phía sản phẩm. Trong một công việc IT Helpdesk, bạn có thể kết nối với khách hàng/ end-user, hiểu được trải nghiệm của họ với công ty của bạn, và hiểu về sản phẩm từ trong ra ngoài. Vì thế để trở thành một IT Helpdesk giỏi, bạn cần phải trau dồi những kỹ năng dưới đây để thực sự tiến xa trong nghề.

IT helpdesk cần học gì?

Công nghệ thông tin luôn cập nhật và thay đổi từng ngày. Nên để trở thành một nhân viên IT Helpdesk giỏi, bạn phải không ngừng học hỏi, sáng tạo, nâng cao kỹ năng nghiệp vụ và làm mới mình để có thể trụ vững với nghề này.

  • Vì đây là công việc sẽ hỗ trợ khá nhiều các vấn đề liên quan đến CNTT nên việc người làm việc ở vị trí cần có những kiến thức từ cơ bản đến chuyên sâu về hệ thống mạng network, server (như Windows, CentOS) và phần cứng máy tính là cần thiết.
  • Am hiểu quy trình làm việc gồm tiếp nhận, hỗ trợ xử lý sự cố và cung ứng dịch vụ IT cho người dùng.
  • Nắm vững các thông tin liên quan đến việc vận hành hệ thống của công ty. Đây là một trong những yếu tố quan trọng để các nhân viên IT Helpdesk có thể hỗ trợ, tư vấn cũng như giải đáp thắc mắc cho người dùng một cách nhanh nhất, phù hợp nhất.
  • Cũng như các vị trí khác trong ngành CNTT, IT Helpdesk cũng nên có khả năng đọc hiểu tiếng Anh để dễ dàng hơn cho bản thân trong quá trình đọc và xử lý tài liệu nước ngoài.
  • Luôn cập nhật những thông tin, kiến thức, xu hướng mới cũng như chia sẻ chúng với khách hàng và đồng nghiệp.

Theo khảo sát về các kỹ năng IT Helpdesk đang được săn đón của Zippia 2020

Ngay khi nhận được vấn đề, bạn cần phải hỏi đúng câu hỏi, và thu thập đúng dữ liệu để thu hẹp khoảng cách giải quyết vấn đề để nhanh chóng ra giải pháp. Quan trọng là bạn không bỏ qua bất cứ tình tiết nhỏ nào để tìm ra được cốt lõi vấn đề. Vì nhiệm vụ chính của một IT Helpdesk chính là hỗ trợ người dùng xử lý và giải quyết các vấn đề liên quan đến kỹ thuật, máy tính, phần mềm, mạng,… nên bắt buộc bạn phải có kỹ năng phát hiện ra các sự cố, vấn đề và nhanh chóng đưa ra những hướng giải quyết chúng. Bạn phải là người chủ động trong việc xử lý các sự cố này.

  Top 20 chứng chỉ IT được săn đón nhất trong ngành CNTT
  Mức lương Lập trình viên tại Việt Nam năm 2022

“Soft-skill is key” – Một vị trí IT yêu cầu nhiều Kỹ năng mềm 

Kỹ năng giao tiếp chuyên nghiệp

Một nhân viên IT Helpdesk cần có khả năng giao tiếp tốt hơn so với các vị trí IT thông thường khác. IT Helpdesk là người xử lý vấn đề nội bộ, hoặc là người truyền tải thông tin giải pháp đến khách hàng. Nghe khá giống tư vấn viên bảo hiểm, nhưng nghĩa đen mà nói thì IT Helpdesk sẽ cần có phong thái như thế: lắng nghe vấn đề, cung cấp giải pháp xử lý – theo một cách dễ theo nhất. Nhiều IT Helpdesk giỏi về chuyên môn, xử lý vấn đề nhưng lại thất bại ở khâu truyền tải đến khách hàng / đồng đội. Phần này bạn cũng cần phải khéo léo, kỹ năng giao tiếp ở đây là truyền đạt minh bạch đầy đủ nhưng cũng theo một cách dễ nghe – dễ chấp nhận, thì khách hàng / đồng đội mới follow giải pháp của bạn được. 

Có cách tiếp cận vấn đề đa chiều 

Công việc support này có thể khá khó với nhiều bạn, do cần nhiều sự kiên nhẫn và “bình tĩnh” nhìn nhận vấn đề, tuy nhiên, bạn không được có cái nhìn quá tiêu cực/ xấu về khách hàng hoặc đồng đội. Dù cho tình hình có trở xấu hay không thể đồng thuận, thì người nắm vị trí này phải là người tỉnh táo – phải giữ logic và tập trung vào việc giải quyết được vấn đề mới là quan trọng nhất. Khi có gió đừng nản lòng – Đừng than thở vấn đề trở nên quá tay, mà hãy vững vàng tìm giải pháp trước – đó là mục đích tại sao bạn ở vị trí này.

Tinh thần đồng đội – teamwork cao

IT Helpdesk sẽ không chỉ thực hiện mọi thứ một mình, đồng đội và các ban nội bộ cũng là một phần trong công việc của bạn. Workload và tình hình làm việc của teammate là cái đáng lưu tâm, bạn cần hiểu rõ họ đang làm gì và tốn bao nhiêu thời gian, và khi nào thì có thể hỏi nhờ support khi cần. Vì biết đâu có những trường hợp gấp rút ngẫu nhiên bạn chưa kịp chuẩn bị, thì teammate của bạn có thể hỗ trợ cùng bạn xử lý hay không. 

it helpdesk la gi

Kỹ năng thuyết trình

Với tư cách là một nhân viên IT Helpdesk chuyên nghiệp, bạn phải trang bị cho mình kỹ năng thuyết trình để có thể trình bày, giải thích cho khách hàng hiểu những sự cố, vấn đề mà họ đang gặp phải và hướng dẫn cách khắc phục chúng. Ngoài ra bạn cũng có thể thuyết trình, báo cáo một cách độc lập trong buổi họp mà không gặp phải những va vấp nào.

Có niềm tin vào sản phẩm

Một IT Helpdesk giỏi là phải hiểu sâu và tường tận về sản phẩm của bạn đang support. Bạn cũng cần rèn dũa cho mình Mindset của một Product Owner thì mới nhanh tác chiến khi có sự cố xảy ra. Hãy luôn tò mò, đặt câu hỏi về những thứ nhỏ, và hiểu rõ cách thức hoạt động của product, chứ không chỉ cách fix nó khi có vấn đề. Chính việc bạn tin và hiểu rõ sản phẩm cũng sẽ thể hiện rõ và mang lại cảm giác tích cực khi bạn giao tiếp và nói chuyện với khách hàng / đồng đội. 

“Chất hơn lượng” 

Khi bạn có một danh sách nhiều thứ cần làm, và biết rằng sẽ có nhiều thứ khác sắp tới nữa, thường sẽ có xu hướng giải quyết càng nhiều càng tốt chứ không thật sự giải quyết việc ngay. Quan trọng là phải tập trung xử lý tốt và chất lượng vấn đề, hơn là giả quyết cho đủ số lượng mới đảm bảo được hiệu suất công việc và trải nghiệm khách hàng tốt.

Chăm sóc và tôn trọng khách hàng/ end-user

Đây là vị trí để hiểu được khó khăn của khách hàng và tận dụng những nguồn lực, kiến thức và kinh nghiệm của họ để cung cấp những giải pháp tối ưu nhất cho end-user. Cần có tầm nhìn xa hơn chỉ là các tương tác 1:1 thông thường với khách hàng để giải quyết các vấn đề và từ đó giúp được nhiều khách hàng hơn nữa. 

Cơ hội việc làm và mức lương IT Helpdesk

Thu thập thông tin và các đóng góp phản hồi của khách hàng là công việc khá quan trọng, qua những thông tin nhận xét về sản phẩm dịch vụ công ty sẽ dễ dàng hơn trong việc rà soát, cải tiến và nâng cao chất lượng của sản phẩm dịch vụ hơn đồng thời phải thường xuyên chăm sóc và quan tâm tới khách hàng sử dụng sản phẩm dịch vụ của công ty. Mức lương của một IT Helpdesk hiện tại sẽ dao động trong khoảng: 360$/tháng.

Trở thành IT Helpdesk là một chuyện, để một bạn fresher mới ra trường có được vị trí Helpdesk ổn cũng không dễ. Nhưng đừng bi quan quá, vì có một fact nhỏ: Trong khi làm nghề IT Helpdesk, khi bạn phải tiếp cận, học hiểu và xử lý nhiều thứ vấn đề khác nhau thì cũng có thể xem là cơ hội để tìm hiểu kĩ hơn về khả năng và công việc mình thật sự thích trong mảng là gì hoặc một ngách để xây dựng sự nghiệp. Nếu bạn có kinh nghiệm làm việc inhouse cho một công ty, hoặc làm remote, điều này có thể thúc đẩy bạn khám phá các lựa chọn nghề nghiệp như:

  1. Network Administration: Khi bạn đã có kiến thức kinh nghiệm cộng với sự nâng cấp bản thân với các bằng cấp về network như CCNA, CCNP… thì không khó để bạn chuyển sang vị trí này.
  2. Database Administrators: Hiện tại trên thị trường công ty công nghệ Việt Nam không ít Database administrators đi lên từ kinh nghiệm IT Helpdesk và học hỏi thêm sâu về database.
  3. IT Security Specialists: Làm trong bộ phận Helpdesk là cơ hội để bạn tiếp xúc học hỏi các chuyên gia, nên nếu bạn chịu khó học thêm chuyên sâu về các kỹ thuật này thì vị trí này hoàn toàn khả thi.
  4. Helpdesk Technician Manager: Sau khi đã có lượng kinh nghiệm đủ lâu kèm với khả năng leadership và lên chiến lược, bạn có thể tiến lên vị trí Manage.

it helpdesk la gi

Tìm kiếm các vị trí tuyển dụng IT Helpdesk tại TopDev.vn

Những hiểu sai về IT Helpdesk

Có rất nhiều quan điểm sai lầm về IT Helpdesk. Nhiều người thậm chí không biết được nhiệm vụ chính của một IT Helpdesk là gì và nghĩ họ là superman, làm được mọi thứ. Các sai lầm có thể kể đến:

  • IT Helpdesk biết tất cả mọi thứ liên quan đến IT: dù là những người được user liên lạc đầu tiên khi có sự cố trong quá trình làm việc với máy tính nhưng Helpdesk không phải gì cũng biết. Họ có thể biết rất rõ những sự cố hay yêu cầu liên quan đến máy tính của bạn, hoặc network của bạn có vấn đề gì nhưng nhiều vấn đề họ cần phải chuyển cho các bộ phận khác xử lý. Ví dụ những vấn đề liên quan đến các ứng dụng, hoặc server…
  • Không có cơ hội phát triển: như trên đã đề cập, rất nhiều cơ hội phát triển cho người làm IT Helpdesk, miễn là có ý cầu tiến và luôn tìm mọi cơ hội để học hỏi
  • Không tìm được việc gì khác mới làm IT Helpdesk: làm gì cũng cần kỹ năng, kinh nghiệm và Helpdesk cũng vậy. IT Helpdesk là bộ phận vô cùng quan trọng trong IT.
  • IT Helpdesk đụng đâu xử lý đó, không cần quy trình tiêu chuẩn gì: điều này hoàn toàn sai. Helpdesk hay support team là một bộ phận của IT và có những quy tắc, tiêu chuẩn hay framework cần phải tuân theo như ITIL (Information Technology Infrastructure Library) cùng các tiêu chuẩn khác.
  • Làm Helpdesk là sửa cả điện nước, điện thoại các kiểu: chuyện này là khá phổ biến trong các công ty nhỏ. Thực tế IT Helpdesk không có chức năng như vậy và việc nhờ họ làm thì cũng giống bạn nhờ ai đó trong công ty làm việc gì đó ngoài chuyên môn. Họ có thể giúp nhưng đó không phải là nhiệm vụ của họ.

Một số tài liệu IT Helpdesk tham khảo:

Website và Sách 

Khóa học (cả miễn phí & có phí)

TopDev tổng hợp.

Tìm kiếm vị trí tuyển lập trình IT Helpdesk tại TopDev.vn

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

Tìm hiểu chi tiết về Spacing trong CSS

Tìm hiểu chi tiết về Spacing trong CSS

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

Khi các bạn code giao diện cho một dự án nào đó chẳng hạn, các bạn sẽ thấy rằng để làm khoảng cách giữa các phần tử thì sẽ có nhiều cách như margin hoặc padding hay gọi chung là spacing. Tuy nhiên mình thấy nhiều bạn mới học thì hay bị rối giữa việc dùng 2 thứ này, hôm nay mình lại tiếp tục research tìm nội dung về nó để viết cho các bạn, hi vọng sẽ giúp ích được cho các bạn phần nào trong việc cải thiện kiến thức hơn, thông suốt hơn về spacing để có thể làm chủ việc code tốt hơn.

Các loại spacing

Như mình đã nói ở trên thì trong CSS có 2 loại spacing đó chính là outer-space và inner-space mà chúng ta hay gặp. Trong bài viết này mình gọi tạm là outer và inner cho dễ hiểu nhé. Ví dụ như hình dưới đây khoảng trống bên ngoài là outer và bên trong là inner.

Tìm hiểu chi tiết về Spacing trong CSS

Ví dụ ở trên có class là element đi thì chúng ta có thể có CSS đơn giản như này với inner là padding và outer là margin. Đơn giản đúng không nào ?

.element {
    padding: 20px;
    margin-bottom: 20px;
}
.element:not(:last-child) {
    margin-bottom: 80px;
}
.parent {
  margin: 50px auto 0 auto;
  width: 400px;
  height: 120px;
}

.child {
  margin: 50px 0;
}

Cách Sử dụng Điện thoại giả Lập trong Android Studio

Cách Sử dụng Điện thoại giả Lập trong Android Studio

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

  Ứng dụng mới cực hot từ Google: Android Sunflower
  30+ công cụ phát triển ứng dụng Android chuyên nghiệp ( Phần 1)

Như vậy ở bài 3 các bạn đã biết tạo một Điện thoại giả lập trong Android rồi. Bài này Tui chỉ sơ qua cách sử dụng một số tính năng thường dùng (lưu ý là điện thoại thật như thế nào thì điện thoại giả lập y xì như vậy):

Cách Sử dụng Điện thoại giả Lập trong Android Studio

Khi viết phần mềm Mobile, ta cũng thường có các phần mềm có giao diện nằm ngang, máy ảo cũng hỗ trợ xoay ngang màn hình cho chúng ta test (Nhấn vào xoay màn hình):

Cách Sử dụng Điện thoại giả Lập trong Android Studio

Với Sinh Viên, thường phải làm báo cáo đồ án, thường phải chụp lại màn hình, thì nhớ bấm vào biểu tượng chụp hình ở trên (không cần dùng công cụ nào khác) nó sẽ đẹp.

Bây giờ ta vào cấu hình mở rộng (nút … cuối cùng đó):

Cách Sử dụng Điện thoại giả Lập trong Android Studio

  • Location: Kiểm thử về định vị, ta có thể giả lập điện thoại di chuyển bất kỳ vị trí nào trong hệ trục kinh độ vĩ độ. Chức năng này được áp dụng rất nhiều trong Google Map, GPS.
  • Display: Chỉnh xem các cách thức hiển thị màn hình điện thoại
  • Cellular: Kiểm thử về sóng điện thoại.
  • Battery: Kiểm thử về pin điện thoại.
  • Phone: Kiểm thử về telephony như nghe, gọi, nhắn tin trong máy ảo.
  • Finger Print: Kiểm thử cảm biến vân tay.
  • Virtual sensors: Kiểm các loại cảm biến như: gia tốc, con quay hồi chuyển, ánh sáng, tiệm cận, áp suất,…
  • Help: Hướng dẫn các phím tắt sử dụng trong máy ảo.
  • … và nhiều tính năng khác

Việc sử dụng thành thạo các chức năng trong máy ảo giúp ích ta rất nhiều trong quá trình kiểm thử phần mềm và đặt biệt giảm thiểu chi phí đầu tư ban đầu rất nhiều vì ta không phải mua điện thoại thật mà vẫn có thể kiểm thử được phần mềm.

Tìm việc làm android lương cao up to 2000 USD

Các bạn thử 2 tính năng của điện thoại ảo sau nhé: Gọi điện thoại, nhắn tin. Nó hoạt động y chang điện thoại thật, có tính năng này chúng ta có thể test phần mềm mà không cần điện thoại thật, đỡ tốn tiền. Khi nào vào Công ty thì họ phát cho mỗi đứa 1 cái phone mà làm.

Cách Sử dụng Điện thoại giả Lập trong Android Studio

Ta vào mục Phone, nhập dữ liệu rồi nhấn “SEND MESSAGE”–> thấy kết quả nó gửi luôn qua điện thoại nha.

Cách Sử dụng Điện thoại giả Lập trong Android Studio

Ta có thể nhấn vào “CALL DEVICE” để gọi điện thoại.

Cách Sử dụng Điện thoại giả Lập trong Android Studio

Như vậy Tui đã trình bày sơ qua cách thức sử dụng Điện thoại giả lập, bài sau chúng ta sẽ chạy phần mềm “HelloWorld” thần thánh lên điện thoại giả lập này.

Các bạn chú ý theo dõi nhé

Chúc các bạn thành công.

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

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

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

SOLID – Nguyên tắc 1: Đơn nhiệm – Single Responsibility principle (SRP)

Nguyên tắc 1: Đơn nhiệm – Single Responsibility principle

Bài viết gốc được đăng tải tại Vũ Công Tấn Tài

Chúng ta ắt hẳn đều đã có kiến thức về lập trình hướng đối tượng, nhưng việc vận dụng nó cách thuần thục và hợp lí thì không phải ai cũng biết. SOLID xuất hiện như là một trong những định hướng giúp các developer thiết kế hệ thống và phát triển phần mềm chất lượng hơn: code chạy tốt và trong sáng, dễ dàng mở rộng, dễ bảo trì trong tương lai, … SOLID là một trong những nguyên lí phát triển phần mềm sẽ được hỏi trong hầu hết các buổi phỏng vấn việc làm, nó cũng là nguyên lí mà tất cả các dev chúng ta nên biết và áp dụng nếu muốn cải thiện kĩ năng của bản thân. SOLID gồm 5 nguyên lí chính:

  1. Single Responsibility principle.
  2. Open-Closed principle.
  3. Liskov substitution principle.
  4. Interface segregation principle.
  5. Dependency inversion principle.

Bạn có thể tìm hiểu tổng quan về SOLID ở bài viết này. Trong bài này, mình sẽ đi sâu phân tích nguyên lí đầu tiên: Đơn nhiệm – Single responsibility principle (SRP). Bắt đầu nào!

  SOLID là gì? Áp dụng SOLID để trở thành lập trình viên giỏi
  Solidity cơ bản - Tạo 1 Contract cơ bản (P1)

Nguyên tắc thứ nhất nói gì

Phát biểu: Mỗi lớp chỉ nên chịu trách nhiệm về một nhiệm vụ cụ thể nào đó mà thôi.

Nguyên tắc này nói về việc: đơn nhiệm. Để hình dung một cách đơn giản, nếu bạn là một người phát triển phần mềm, thì bạn nên tập trung vào việc viết code và các vấn đề liên quan đến phần mềm, các việc lặt vặt như lau dọn văn phòng, đóng mở cửa văn phòng .v.v.. thì hãy để cho người khác làm ( ví dụ như công ty sẽ thuê người lao công để làm các việc này). Phân công công việc theo chuyên môn như thế vừa giúp bạn tập trung vào công việc để đạt được hiệu quả cao, vừa giúp văn phòng sạch sẽ hơn (vì người lao công sẽ lau dọn sạch hơn bạn ^^).

Nguyên lí này không chỉ áp dụng cho lĩnh vực IT và cho hầu hết mọi điều trong cuộc sống: mọi thứ chỉ nên tập trung vào chuyên môn của mình, nếu bạn ôm đồm quá nhiều việc một lúc thì kết quả đạt được sẽ không cao. Tấm hình sau minh hoạ cho việc này:

SOLID – Nguyên tắc 1: Đơn nhiệm – Single Responsibility principle (SRP)

Hãy thử xem xét, với quỹ thời gian có hạn trong ngày, một mình bạn vừa phải làm công việc chính để có thu nhập nuôi gia đình, vừa phải lo chăm sóc con nhỏ, cho con bú … lại phải nấu nướng, giặt giũ, chăm vườn, tưới cây, … khi đó mặc dù có thể làm được nhiều việc một lúc, nhưng khả năng cao là bạn sẽ chẳng hoàn thành được tốt việc nào cả.

Nếu muốn các công việc đều được hoàn thành với hiệu suất cao, hãy thử chia nhỏ công việc ra và giao cho những thành viên khác trong nhà. Bạn tập trung đi làm kiếm tiền, quần áo dùng máy giặt để giặt, vườn cây thì thuê nhân viên vệ sinh dọn dẹp và chăm sóc, … Như vậy chắc chắc các công việc khác nhau đều được hoàn thành với một hiệu quả tối đa.

Áp dụng trong lập trình như thế nào?

Trong phần mềm cũng vậy, khi bạn thiết kế một phần mềm, để cho việc bảo trì và mở rộng dễ dàng sau này, bạn nên thiết kế theo hướng đơn nhiệm: mỗi lớp chỉ nên chịu trách nhiệm về một tính năng duy nhất. Nếu xuất hiện đoạn code mà không thuộc về trách nhiệm của lớp, thì nên tách đoạn code đó ra một lớp xử lí khác.

Hãy xem một ví dụ sau, chúng ta có một lớp học sinh với các hàm đơn giản như lấy thông tin học sinh, nộp đơn học bổng, …

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Student
{
   private string name;
   private int age;
   string getStudentInfoJson()
   {
      return json_encode( array(name, age) );
   }
   string getStudentInfoHtml()
   {
      return "<span> Name: " + name + ", age: " + age + "</span>";
   }
   int applyForScholarship()
   {
      try
      {
         // Trying to apply for scholarship
      }
      catch
      {
         //write error to log file
         system.Out.print("Error_log.txt", "Error getting scholarship!");
      }
   }
}

Nếu thiết kế lớp học sinh như vậy thì đã ổn chưa nhỉ?

Tất nhiên, đoạn code trên có thể chạy đúng yêu cầu của phần mềm. Thế nhưng! Dường như lớp Student đang ôm đồm quá nhiều việc: cung cấp thông tin cá nhân, định dạng cấu trúc của thông tin cá nhân, ghi log, apply xin học bổng ..v.v.. Điều này vi phạm quy tắc đơn nhiệm. Về mặt logic xử lí, có một số câu hỏi mà chúng ta có thể thắc mắc: học sinh thì có nhiệm vụ gì mà phải đi định dạng dữ liệu nhỉ? Sau này nếu muốn định dạng ghi log từ file thành DB thì như thế nào? Đổi định dạng format thông tin log thì sẽ sửa code làm sao? …

Áp dụng quy tắc đơn nhiệm của SOLID, sẽ tốt hơn nếu ta xây dựng thêm các lớp riêng biệt làm nhiệm vụ format data và ghi log. Chúng ta sẽ thực hiện refactor lại đoạn code ở trên, code mới trông sẽ như thế này:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Student
{
   private string name;
   private int age;
   string getName()
   {
      return name;
   }
   int getName()
   {
      return age;
   }
   bool applyForScholarship()
   {
      try
      {
         // do something here
      }
      catch
      {
         ExportLog log_control = new ExportLog();
         log_control.exportLogToFile( "error_log.txt", "Error getting scholarship");
      }
   }
}
class Formatter()
{
   string formatInfoJson(string name, int age)
   {
      return json_encode( array( name, age ) );
   }
   string getStudentInfoHtml(string name, int age)
   {
      return "<span> Name: " + name + ", age: " + age + "</span>";
   }
}
class ExportLog
{
   void exportLogToFile(string filename, string error)
   {
      //write error to log file
      system.Out.print( filename, error );
   }
}

Như bạn thấy đó, việc tách bạch nhiệm vụ giữa các lớp khiến code trở nên rành mạch, dễ đọc, dễ bảo trì và mở rộng hơn rất nhiều. Sẽ dễ dàng để mở rộng ra các cách format mới sau này, hoặc cũng rất dễ để  đáp ứng yêu cầu về nhiều cách xuất log hơn nữa khi chương trình được mở rộng.

Kết luận

Nguyên lí này trông có vẻ đơn giản, nhưng thực ra cần rất nhiều thời gian và luyện tập để có thể sử dụng thành thục nguyên lý này. Tuy nhiên cũng không nên vội vàng, hãy để thời gian để bạn “ngấm” được ý nghĩa thực sự của nguyên lý này.

Về mặt kĩ thuật mà nói, đoạn code trên vẫn còn có thể trở nên tốt hơn nữa nếu chúng ta áp dụng các kĩ thuật khác trong SOLID, nhưng mình chỉ đang muốn nhấn mạnh ở đây tính đơn nhiệm của chương trình.

Chúng ta mới chỉ áp dụng một quy tắc đầu tiên của SOLID – quy tắc đơn nhiệm – vào thiết kế phần mềm thì code đã trở nên trong sáng và hữu dụng hơn rất nhiều. Có thể dễ dàng hình dung được, nếu các anh em developer chúng ta đều nắm vững và áp dụng các quy tắc này, thì phần mềm của chúng ta sẽ tốt lên rất nhiều.

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

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

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

Tổng hợp vector trong C++

vector-trong-c++

C++ là ngôn ngữ mạnh mẽ nhờ tính linh hoạt, gần gũi với ngôn ngữ máy. Bên cạnh đó còn có khả năng lập trình dựa trên mẫu có sẵn (template). Sức mạnh của C++ nằm ở STL (Standard Template Library) – một thư viện template dành cho C++ tổng hợp các cấu trúc dữ liệu cũng như giải thuật và các vector trong C++ được xây dựng một cách tổng quát cho nhiều trường hợp.

Bộ thư viện này thực hiện toàn bộ các hoạt động ra vào của dữ liệu (iostream), quản lý mảng (vector) và hầu hết các tính năng của các cấu trúc dữ liệu cơ bản như (stack, queue, map, set…). Ngoài ra, STL còn bao gồm các thuật toán cơ bản: tính tổng, tìm min, max, sắp xếp (với đa dạng thuật toán sắp xếp), thay thế các phần tử, tìm kiếm (tìm kiếm bình thường và tìm kiếm dười dạng nhị phân). Toàn bộ những tính năng trên đều được cung cấp dưới dạng template nên việc sử dụng chúng cực kỳ tiện lợi và phù hợp với nhiều tình huống. Nhờ vậy, STL làm cho ngôn ngữ C++ trở nên “xịn xò” hơn.

Nhưng nói đến STL thì sẽ là bài tập rất dài nên hôm nay mình sẽ chỉ đề cập đến vector thôi.

Vậy Vector trong C++ là gì?

Không giống như array (mảng), chỉ một số giá trị nhất định có thể được lưu trữ dưới một tên biến duy nhất. Vector trong C++ giống dynamic array (mảng động) nhưng có khả năng tự động thay đổi kích thước khi một phần tử được chèn hoặc xóa tùy thuộc vào nhu cầu của tác vụ được thực thi, với việc lưu trữ của chúng sẽ được vùng chứa tự động xử lý. Các phần tử vector được đặt trong contiguous storage (bộ nhớ liền kề) để chúng có thể được truy cập và duyệt qua bằng cách sử dụng iterator.

vector-trong-c++

Vì sao nên dùng Vector

Nếu bạn đã phát chán việc quản lý mảng động qua con trỏ trong C++ hay chán phải tạo mảng mới, copy các phần tử qua mảng mới, rồi lại xóa mảng cũ mỗi khi bạn muốn resize kích thước mảng động trong C++. Thật thừa thải, tốn thời gian và đó là thời điểm ta nhận ra C++ còn có vector.

Một số điểm nổi trội của Vector

– Bạn không cần phải khai báo kích thước của mảng ví dụ int A[100]…, vì vector có thể tự động nâng kích thước lên.

– Nếu bạn thêm 1 phần tử vào vector đã đầy rồi, thì nó sẽ tự động tăng kích thước của nó lên để dành chỗ cho giá trị mới này.

– Vector còn giúp cho bạn biết số lượng các phần tử mà bạn đang lưu trong đó.

– Dùng số phần tử âm vẫn được trong vector ví dụ A[-6], A[-9], rất tiện trong việc cài đặt các giải thuật.

  Hướng dẫn lấy Date và Time trong C++
  Tổng hợp vector trong C++
Giới thiệu literals và operators”]

Vector có thứ tự trong C++ không?

Không có vector nào không được sắp xếp trong C++. Các phần tử vector được đặt trong bộ nhớ liền kề để chúng có thể được truy cập và di chuyển qua các iterator. Trong vector, dữ liệu được chèn vào cuối. Việc chèn một phần tử vào cuối sẽ mất thời gian chênh lệch, vì đôi khi có thể cần mở rộng vector. Việc xóa phần tử cuối cùng chỉ mất thời gian không đổi vì không xảy ra thay đổi kích thước. Chèn và xóa ở đầu hoặc giữa vector là tuyến tính theo thời gian.

Các vector được lưu trữ trong C++ như thế nào?

Để tạo một vector, bạn cần thực hiện theo cú pháp dưới đây:

Cú pháp:

#include <vector>
//...
vector<object_type> variable_name;

Ví dụ:

#include <vector>
int main()
{
    std::vector<int> my_vector;
}

Vậy là chúng ta đã có một vector với mỗi phần tử có kiểu dữ liệu (object_type) là int. Sau đó bạn có thể gắn giá trị cho vector như này:

vector<int> my_vector = {1,2,3,4,5}

Hoặc bạn cũng có thể tạo một vector rồi gán giá trị của một vector khác cho nó bằng cách:

vector<int> my_vector = {1,2,3,4,5};
vector<int> your_vector = my_vector;

Cơ chế ngăn chặn rò rỉ bộ nhớ của Vector

Khi một biến vector rời khỏi phạm vi đoạn code mà chương trình đang chạy, nó sẽ tự động giải phóng những phần bộ nhớ mà nó kiểm soát (nếu cần). Điều này không chỉ tiện dụng (vì bạn không cần tự tay giải phóng bộ nhớ), mà nó còn giúp ngăn ngừa lỗi rò rỉ bộ nhớ (memory leaks).

Xem hàm dưới đây:

void doSomething(bool earlyExit)
{
	int *array = new int[3]{ 1, 3, 2 };

	if (earlyExit) // thoát khỏi hàm
		return;

	delete[] array; // trường hợp hàm thoát sớm, array sẽ không bị xóa
}

Nếu biến earlyExit được gán là true, mảng array sẽ không bao giờ được giải phóng, và bộ nhớ sẽ bị rò rỉ.

Tuy nhiên, nếu biến array là một vector, điều này sẽ không xảy ra, bởi vì bộ nhớ sẽ được giải phóng ngay sau khi biến array nằm ngoài phạm vi đoạn code mà chương trình đang chạy (bất kể hàm có bị thoát ra sớm hay không). Điều này làm cho vector an toàn hơn nhiều so với việc bạn phải tự chú ý đến việc giải phóng bộ nhớ.

Vector tự ghi nhớ độ dài của mình

Không giống như mảng động được tích hợp sẵn của C++, cái mà không biết được độ dài của mảng mà nó đang trỏ tới là bao nhiêu, std::vectors tự theo dõi độ dài của chính nó. Chúng ta có thể lấy được độ dài của vector thông qua hàm size():

#include <iostream>
#include <vector>

void printLength(const std::vector<int>& array)
{
    std::cout << "The length is: " << array.size() << '\n';
}

int main()
{
    std::vector array { 9, 7, 5, 3, 1 };
    printLength(array);

    return 0;
}

Output:

The length is: 5

Tương tự với array, hàm size() sẽ trả về một giá trị thuộc kiểu nested type (kiểu dữ liệu lồng) là size_type, nó là một số nguyên không dấu.

Các hàm của Vectors trong C ++

Vector trong STL cung cấp cho chúng ta nhiều chức năng hữu ích khác nhau.

1. Modifiers
2. Iterators
3. Capacity
4. Element access

Modifiers

1. push_back(): Hàm đẩy một phần tử vào vị trí sau cùng của vector. Nếu kiểu của đối tượng được truyền dưới dạng tham số trong push_back() không giống với kiểu của vector thì sẽ bị ném ra.

ten-vector.push_back(ten-cua-phan-tu);

2. assign(): Nó gán một giá trị mới cho các phần tử vector bằng cách thay thế các giá trị cũ.

ten-vector.assign(int size, int value);

3. pop_back(): Hàm pop_back () được sử dụng để xóa đi phần tử cuối cùng một vector.

ten-vector.pop_back();

4. insert(): Hàm này chèn các phần tử mới vào trước phần tử trước vị trí được trỏ bởi vòng lặp. Chúng ta cũng có thể chuyển một số đối số thứ ba, đếm số lần phần tử được chèn vào trước vị trí được trỏ.

ten-vector.insert(position, value);

5. erase(): Hàm được sử dụng để xóa các phần tử tùy theo vị trí vùng chứa

ten-vector.erase(position);

ten-vector.erase(start-position, end-position);

6. emplace(): Nó mở rộng vùng chứa bằng cách chèn phần tử mới vào

ten-vector.emplace(ten-vector.position, element);

7. emplace_back(): Nó được sử dụng để chèn một phần tử mới vào vùng chứa vector, phần tử mới sẽ được thêm vào cuối vector

ten-vector.emplace_back(value);

8. swap(): Hàm được sử dụng để hoán đổi nội dung của một vector này với một vector khác cùng kiểu. Kích thước có thể khác nhau.

ten-vector-1.swap(ten-vector-2);

9. clear(): Hàm được sử dụng để loại bỏ tất cả các phần tử của vùng chứa vector.

ten-vector.clear();

Ví dụ:

/ Modifiers in vector 
#include <bits/stdc++.h> 
#include <vector> 
using namespace std; 
   
int main() 
{ 
    // Assign vector 
    vector<int> vec; 
   
    // fill the array with 12 seven times 
    vec.assign(7, 12); 
   
    cout << "The vector elements are: "; 
    for (int i = 0; i < 7; i++) 
        cout << vec[i] << " "; 
   
    // inserts 24 to the last position 
    vec.push_back(24); 
    int s = vec.size(); 
    cout << "nThe last element is: " << vec[s - 1]; 
 
     // prints the vector 
    cout << "nThe vector elements after push back are: "; 
    for (int i = 0; i < vec.size(); i++) 
    cout << vec[i] << " "; 
   
    // removes last element 
    vec.pop_back(); 
   
    // prints the vector 
    cout << "nThe vector elements after pop_back are: "; 
    for (int i = 0; i < vec.size(); i++) 
        cout << vec[i] << " "; 
   
    // inserts 10 at the beginning 
    vec.insert(vec.begin(), 10); 
   
    cout << "nThe first element after insert command is: " << vec[0]; 
   
    // removes the first element 
    vec.erase(vec.begin()); 
   
    cout << "nThe first element after erase command is: " << vec[0]; 
   
    // inserts at the beginning 
    vec.emplace(vec.begin(), 5); 
    cout << "nThe first element emplace is: " << vec[0]; 
   
    // Inserts 20 at the end 
    vec.emplace_back(20); 
    s = vec.size(); 
    cout << "nThe last element after emplace_back is: " << vec[s - 1]; 
   
    // erases the vector 
    vec.clear(); 
    cout << "nVector size after clear(): " << vec.size(); 
   
    // two vector to perform swap 
    vector<int> obj1, obj2; 
    obj1.push_back(2); 
    obj1.push_back(4); 
    obj2.push_back(6); 
    obj2.push_back(8); 
   
    cout << "nnVector 1: "; 
    for (int i = 0; i < obj1.size(); i++) 
        cout << obj1[i] << " "; 
   
    cout << "nVector 2: "; 
    for (int i = 0; i < obj2.size(); i++) 
        cout << obj2[i] << " "; 
   
    // Swaps obj1 and obj2 
    obj1.swap(obj2); 
   
    cout << "nAfter Swap nVector 1: "; 
    for (int i = 0; i < obj1.size(); i++) 
        cout << obj1[i] << " "; 
   
    cout << "nVector 2: "; 
    for (int i = 0; i < obj2.size(); i++) 
        cout << obj2[i] << " "; 
}

Output:

vector-trong-c++

Bạn có thể thấy cách sử dụng các hàm thuộc nhóm Modifiers mà chúng ta đã nghiên cứu ở trên qua ví dụ thực tiễn.

Iterators

  1. begin(): đặt iterator đến phần tử đầu tiên trong vectorten-vector.begin();
  2. end(): đặt iterator đến sau phần tử cuối cùng trong vectorten-vector.end();
  3. rbegin(): đặt reverse iterator (trình lặp đảo) đến phần tử cuối cùng trong vector (reverse begin). Nó di chuyển từ phần tử cuối cùng đến phần tử đầu tiên

    ten-vector.rbegin();

  4. rend(): đặt reverse iterator (trình lặp đảo) đến phần tử đầu tiên trong vector (reverse end)

    ten-vector.rend();

  5. cbegin(): đặt constant iterator (trình vòng lặp) đến phần tử đầu tiên trong vectorten-vector.cbegin();
  6. cend(): đặt constant iterator (trình vòng lặp) đến phần tử cuối cùng trong vectorten-vector.cend();
  7. crbegin(): đặt constant reverse iterator (trình lặp đảo liên tục) đến phần tử cuối cùng trong vector (reverse begin). Nó di chuyển từ phần tử cuối cùng đến phần tử đầu tiênten-vector.cbregin();
  8. crend(): đặt constant reverse iterator (trình lặp đảo liên tục) đến phần tử đầu tiên trong vector (reverse end)ten-vector.crend();

Ví dụ 1:

#include <iostream> 
#include <vector> 
   
using namespace std; 
   
int main() 
{ 
    vector<int> vec1; 
   
    for (int i = 1; i <= 10; i++) 
        vec1.push_back(i); 
   
    cout << "Understanding begin() and end() function: " << endl; 
    for (auto i = vec1.begin(); i != vec1.end(); ++i) 
        cout << *i << " "; 
 
    return 0; 
}

Output:

vector-trong-c++

Trong ví dụ trên, chúng ta có thể thấy cách sử dụng hàm begin() và end(). Đầu tiên, chúng ta xác định một vector là vec1, chúng đẩy lùi các giá trị trong đó từ 1 đến 10 bằng cách sử dụng vòng lặp for. Sau đó, chúng in các giá trị của các vector của chúng tôi bằng cách sử dụng vòng lặp for, chúng tôi sử dụng hàm begin() và end() để chỉ định điểm đầu và điểm cuối của vòng lặp for của chúng tôi.

Ví dụ 2:

// C++ program to illustrate the 
// iterators in vector 
#include <iostream> 
#include <vector> 

using namespace std; 

int main() 
{ 
    vector<int> g1; 

    for (int i = 1; i <= 5; i++) 
        g1.push_back(i); 

    cout << "Output of begin and end: "; 
    for (auto i = g1.begin(); i != g1.end(); ++i) 
        cout << *i << " "; 

    cout << "\nOutput of cbegin and cend: "; 
    for (auto i = g1.cbegin(); i != g1.cend(); ++i) 
        cout << *i << " "; 

    cout << "\nOutput of rbegin and rend: "; 
    for (auto ir = g1.rbegin(); ir != g1.rend(); ++ir) 
        cout << *ir << " "; 

    cout << "\nOutput of crbegin and crend : "; 
    for (auto ir = g1.crbegin(); ir != g1.crend(); ++ir) 
        cout << *ir << " "; 

    return 0; 
}

Output:

vector-trong-c++

Ví dụ 3:

// CPP program to illustrate working of crbegin()  
// crend() 
#include <iostream> 
#include <vector> 
using namespace std; 

int main () 
{ 
  // initializing vector with values 
  vector<int> vect = {10, 20, 30, 40, 50}; 

  // for loop with crbegin and crend 
  for (auto i = vect.crbegin(); i != vect.crend(); i++) 
    cout << ' ' << *i;  //printing results 

  cout << '\n'; 
  return 0; 
}

Output:

50 40 30 20 10

Capacity

  1. size(): hàm sẽ trả về số lượng phần tử đang được sử dụng trong vectorten-vector.size();
  2. max_size(): hàm trả về số phần tử tối đa mà vector có thể chứaten-vector.max_size();
  3. capacity(): hàm trả về số phần tử được cấp phát cho vector nằm trong bộ nhớten-vector.capacity();
  4. resize(n): Hàm này thay đổi kích thước vùng chứa để nó chứa đủ n phần tử. Nếu kích thước hiện tại của vector lớn hơn n thì các phần tử phía sau sẽ bị xóa khỏi vector và ngược lại nếu kích thước hiện tại nhỏ hơn n thì các phần tử bổ sung sẽ được chèn vào phía sau vectorten-vector.resize(int n, int value);
  5. empty(): Trả về liệu vùng chứa có trống hay không, nếu trống thì trả về True, nếu có phần tử thì trả về Falseten-vector.empty();
  6. shrink_to_fit(): Giảm dung lượng của vùng chứa để phù hợp với kích thước của nó và hủy tất cả các phần tử vượt quá dung lượngten-vector.shrink_to_fit();
  7. reserve(n): hàm cấp cho vector số dung lượng vừa đủ để chứa n phần tửten-vector.reserve(n);

Ví dụ:

#include <iostream> 
#include <vector> 
   
using namespace std; 
   
int main() 
{ 
    vector<int> vec1; 
   
    for (int i = 1; i <= 10; i++) 
        vec1.push_back(i); 
   
    cout << "Size of our vector: " << vec1.size(); 
    cout << "nCapacity of our vector: " << vec1.capacity(); 
    cout << "nMax_Size of our vector: " << vec1.max_size(); 
   
    // resizes the vector size to 4 
    vec1.resize(4); 
   
    // prints the vector size after resize() 
    cout << "nSize of our vector after resize: " << vec1.size(); 
   
    // checks if the vector is empty or not 
    if (vec1.empty() == false) 
        cout << "nVector is not empty"; 
    else
        cout << "nVector is empty"; 
   
    return 0; 
}

Output:

capacity-vectors-in-c++

Chú ý: Khi thay đổi kích thước mảng vector, các giá trị của phần tử hiện có cần giữ nguyên, thì các phần tử mới được khởi tạo bằng giá trị mặc định của kiểu dữ liệu mảng.

Chúng ta có thể thấy cách hoạt động của các hàm capacity như đã thảo luận ở trên.

Element access

  1. at(g): Trả về một tham chiếu đến phần tử ở vị trí ‘g’ trong vectorten-vector.at(position);
  2. data(): Trả về một con trỏ trực tiếp đến (memory array) bộ nhớ mảng được vector sử dụng bên trong để lưu trữ các phần tử thuộc sở hữu của nóten-vector.data();
  3. front(): hàm dùng để lấy ra phần tử đầu tiên của vectorten-vector.front();
  4. back(): hàm dùng để lấy ra phần tử cuối cùng của vectorten-vector.back();

Ví dụ: 

// C++ program to illustrate the 
// element accesser in vector 
#include <bits/stdc++.h> 
using namespace std; 
  
int main() 
{ 
    vector<int> g1; 
  
    for (int i = 1; i <= 10; i++) 
        g1.push_back(i * 10); 
  
    cout << "\nReference operator [g] : g1[2] = " << g1[2]; 
  
    cout << "\nat : g1.at(4) = " << g1.at(4); 
  
    cout << "\nfront() : g1.front() = " << g1.front(); 
  
    cout << "\nback() : g1.back() = " << g1.back(); 
  
    // pointer to the first element 
    int* pos = g1.data(); 
  
    cout << "\nThe first element is " << *pos; 
    return 0; 
}

Output:

vector-trong-c++

Thực hiện nén nhiều giá trị bools

Vector còn có một thủ thuật hay ho khác là sử dụng một cài đặt đặc biệt dành cho vector kiểu bool mà nó có thể nén 8 giá trị booleans vào trong chỉ một byte (amazing!!) Quá trình này đã được cài sẵn, tất cả những gì bạn cần chỉ là sử dụng nó như một tính năng hỗ trợ khi lập trình. Thủ thuật này cũng sẽ không ảnh hưởng gì đến cách mà bạn sử dụng vector.

#include <vector>
#include <iostream>

int main()
{
    std::vector<bool> array { true, false, false, true, true };
    std::cout << "The length is: " << array.size() << '\n';

    for (int i : array)
        std::cout << i << ' ';

    std::cout << '\n';

    return 0;
}

Output:

The length is: 5
1 0 0 1 1

Kết

Với những cú pháp mẫu và ví dụ thực tiễn trên, chúng ta kết thúc phần tìm hiểu về vector trong C++. Tôi hy vọng bạn đã phân biệt được các hàm khác nhau của vector và nắm được cách hoạt động của từng hàm. Vì vector hỗ trợ rất tốt trong việc thao tác với mảng động, đảm bảo an toàn và dễ dàng hơn. Bạn nên sử dụng vector trong hầu hết các trường hợp đụng tới mảng động.

Nguồn kiến thức về vector bạn nên tham khảo:

Có thể bạn muốn xem thêm:

Xem thêm việc làm C++ Developer tại TopDev

Trắc nghiệm tính cách MBTI, bạn đã biết chưa?

MBTI

Có nhiều phương pháp được giới chuyên môn sử dụng để trắc nghiệm cá tính ứng viên. Từ đó, họ xem xét mối tương quan giữa các yếu tố về giá trị để đánh giá các thiên hướng. Đồng thời, khai thác tiềm năng phát triển của họ trong từng lĩnh vực tương ứng. MBTI là một trong các phương pháp được ưa chuộng nhất.

Phương pháp trắc nghiệm tính cách MBTI được nhà tuyển dụng dùng để xác định nhóm thiên hướng của các ứng viên. Điều này không những giúp lựa chọn các ứng viên phù hợp; mà còn giúp ứng viên nhận ra tố chất của bản thân mình.

Cùng TopDev tìm hiểu xem có những điều gì thú vị xoay quanh phương pháp trắc nghiệm MBTI nhé!

1. Trắc nghiệm MBTI là gì?

Trắc nghiệm tính cách MBTI (Myers-Briggs Type Indicator) là một phương pháp sử dụng hệ thống bộ câu hỏi nhằm kiểm tra tâm lý, tính cách của một cá nhân trên cơ sở các đáp án tương ứng của họ. 

MBTI

Thách thức được đặt ra nhằm mục đích phân tích, khám phá chiều sâu của họ trên từng khía cạnh. Bài trắc nghiệm tính cách này còn nhấn mạnh vào sự khác biệt về mặt tự nhiên. Mỗi người là mỗi một cá thể riêng biệt, không trộn lẫn với bất kỳ ai.

Từ sự nhìn nhận về bản thân thông qua MBTI, mỗi cá nhân sẽ hiểu hơn về bản thân. Đồng thời, có cơ sở để lựa chọn nghề nghiệp chính xác với nguyện vọng.

MBTI ngày này được phát triển dựa vào nền tảng tâm lý học. Những học thuyết khoa học được vận dụng để tạo ra bài kiểm tra MBTI ngày một được chuẩn hóa hơn.

Trong mỗi con người luôn có ẩn chứa những sức mạnh mà bản thân họ đôi khi chưa nhận biết được. Thông qua trắc nghiệm MBTI, bạn sẽ nắm bắt được rõ đâu là thế mạnh mình sở hữucần khai thác nhiều hơn. Từ đó, bạn biết cách đầu tư để phát triển sức mạnh của bản thân một cách tốt nhất. Cụ thể, dựa trên kết quả, bạn có thể thiết lập được hệ giá trị gồm những điểm mạnh – điểm yếu của bản thân.  

2. 4 tiêu chí nền tảng trong trắc nghiệm MBTI

2.1. Tri nhận thế giới thông qua Sensing (Giác quan) / Intuition (Trực giác)

Cặp xu hướng Sensing (Giác quan) / Intuition (Trực giác) chính là xu hướng đối lập nhau về cách mà con người tiếp nhận các sự việc, hiện tượng xung quanh họ.

Mọi thứ được tìm hiểu qua các giác quan cụ thể: màu sắc, hình ảnh (thị giác); mùi vị (vị giác), âm nhạc (thính giác),… Tất nhiên, quá trình phát triển tri nhận luôn có sự cộng hưởng để quá trình ấy diễn ra thật sống động. Mọi thứ đều được ghi nhận, tổng hợp và phân tích.

Ở một giai đoạn cao cấp hơn, các trực giác tạo ra các xung nhịp về sự tri nhận đến bộ não. Đây là lúc các xung nhịp ấy được chuyển hóa, được tri nhận thông qua sự diễn dịch, lí giải, liên kết các hình ảnh. Từ đó, các suy đoán, phán đoán tương lai được hình thành.

2.2. Quyết định lựa chọn giữa 2 bàn cân: Cảm xúc (Feeling) hay Lý trí (Thinking)

Phần lý trí trong bộ não con người được đánh giá cao nhất. Nó đóng vai trò tìm hiểu các tiêu chí đúng – sai, trái – phải,… Từ tìm hiểu ban đầu, sau đó suy luận một cách logic mới trực tiếp cho đáp án cụ thể, đảm bảo tính khoa học nhất có thể. 

  Trí tuệ cảm xúc là gì và áp dụng như thế nào trong ngành Nhân sự
  Tư duy cầu tiến (Growth Mindset) - Yếu tố nhà tuyển dụng đang tìm kiếm

MBTI

Sự đối lập luôn tồn tại và phần cảm xúc là một biểu hiện như thế. Phần cảm xúc xem xét sự việc trên tổng thể những cảm xúc: yêu, ghét, giận, hờn,… Đồng thời, các yếu tố đó có sự tác động qua lại lẫn nhau. Đó là bản chất của vấn đề cảm xúc do não quyết định.

2.3. Xu hướng con người Extraversion (Hướng ngoại)/ Introversion (Hướng nội)

Nếu Hướng ngoại (Extraversion) thể hiện xu hướng ứng xử của một cá nhận với thế giới bên ngoài thì Introversion Hướng nội (Introversion) lại phản ánh cách họ ứng xử với chính bản thân họ. 

  • Hướng nội là hướng vào nội tâm, gồm cả ý nghĩ, tư tưởng, trí tưởng tượng.
  • Hướng ngoại là hướng về thế giới bên ngoài gồm những hoạt động, con người, đồ vật.

Xem thêm: Những điều doanh nghiệp cần “lưu tâm” khi làm việc với Gen Z

2.4. Trải nghiệm thông qua các nguyên tắc (Judging) và tính linh hoạt (Perceiving)

Đây là nhóm cuối của trắc nghiệm MBTI test. Tiêu chí này phản ánh cách thức con người lựa chọn để tác động với thế giới bên ngoài của họ.

Xem thêm: Phân tích con người – Chiến lược quan trọng trong ngành Nhân sự 

Nếu bạn là người đại diện cho tiêu chí này, bạn sẽ làm việc dựa trên các nguyên tắc. Việc tổ chức theo hệ thống, có kế hoạch với những sự chuẩn bị rõ ràng là điều bạn hướng đến.

4 tiêu chí vừa nêu trên chính là cơ sở để vạch ra 16 tính cách MBTI, bạn có thể tìm hiểu sâu hơn trong đề mục tiếp theo.

3. Khám phá 16 tính cách MBTI

3.1. Nhóm Analysts 

Bao gồm 4 nhóm tính cách: INTP, ENTP, ESTJ, ENTJ.

 

MBTI

3.2. Nhóm Diplomats

Bao gồm 4 nhóm tính cách: INTJ, INFP, ISFJ, INFJ.

MBTI

3.3. Nhóm Sentinels

Bao gồm 4 nhóm tính cách: ENFJ, ENFP, ISTJ, ESFJ.

MBTI

3.4. Nhóm Explorers

Bao gồm 4 nhóm tính cách: ISTP, ISFP, ESTP, ESFP.

MBTI

4. Lời kết

Trắc nghiệm cá tính đơn thuần là một phương pháp giúp bạn giới hạn phạm vi nhận diện tiềm năng. Bạn có tận dụng và phát triển được chúng hay không là do chính bạn. TopDev hy vọng các bạn sẽ biết được đâu là thiên hướng của bản thân mình. Xác định được những điểm mạnh sẽ giúp các bạn lập kế hoạch hoàn thiện năng lực một cách tốt nhất. Chúc các bạn thành công!

Bạn có thể tham khảo thêm Bài test tính cách trong công việc – Workplace Personality Test do Saramin x TopDev phát triển để đánh giá tổng quan về tính cách của bản thân và sự phù hợp với môi trường công việc ngành CNTT nói riêng và các ngành nghề khác nói chung. 


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

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

Xem thêm việc làm Developers hàng đầu tại TopDev

Làm gì để có được một công việc tốt sau khi tốt nghiệp

Làm gì để có được một công việc tốt sau khi tốt nghiệp

Bài viết được sự cho phép của tác giả Vũ Công Tấn Tài

Bạn phấn đấu rất nhiều và phải vượt qua những kì thi căng thẳng để được đặt một chân đến giảng đường đại học, nơi bạn tin rằng (hoặc chí ít là được nói rằng) đây sẽ là nơi đảm bảo cho bạn một tương lai tương lai tươi sáng. Bạn dành khoảng thời gian tương đối dài (khoảng 3 – 4 năm) để học hỏi những kiến thức chuyên môn hoặc các kĩ năng bổ trợ (toán, ngoại ngữ, …). Có bao giờ bạn thắc mắc rằng: liệu có phải cứ vượt qua hết các kì thi ở trường và có trong tay tấm bằng đại học là sẽ đảm bảo được một việc làm tốt, một công việc có thu nhập cao?

Là một người đã từng trải qua thời đại học, mình hiểu được rằng các bạn sinh viên hiện nay đang rất thiếu những thông tin và kĩ năng cần thiết để bước vào công cuộc tìm kiếm công việc phù hợp và xây dựng sự nghiệp sau đó. Nhà trường thì chỉ liệt kê danh sách các môn học ở từng học kì, thầy cô dạy cũng ít khi nói gì thêm về môi trường doanh nghiệp bên ngoài, các thông tin trên internet thì quá ít thông tin hữu ích và xác thực. Đó là một vài lí do khiến mình muốn chia sẻ với các mọi người về việc làm thế nào để có được một công việc tốt khi ra trường. Điều này cũng có thể có ích đối với những bạn đang làm việc và muốn có một công việc khác tốt hơn.

  Sinh viên IT “tốt nghiệp” với nỗi lo “thất nghiệp”

Đầu tiên là phải xác định được hướng đi

Hướng đi, hay còn có thể nói là mong muốn của bản thân trong lĩnh vực IT, bởi thị trường hiện nay đang có rất nhiều con đường cho bạn lựa chọn. Nếu chọn đi làm ở các công ty, bạn có thể theo hướng phát triển ứng dụng Web, ứng dụng mobile (iOS, Android), bảo mật, quản trị hệ thống mạng, cơ sở dữ liệu … Một số ngành mới cũng khá hot như: phân tích data, xử lí AI về nhận dạng, … Nếu bạn chưa muốn đi làm vội mà muốn theo hướng nghiên cứu, có thể chọn lựa việc học tiếp lên Cao học, rồi xin thực tập và làm việc trong các viện nghiên cứu, trường đại học, hoặc đi du học (học bổng ở hướng nghiên cứu này khá nhiều) .v.v…

Tùy vào từng hướng đi cụ thể mà sau đó chúng ta mới xác định được cụ thể những việc cần làm, tuy vậy có những điểm chung mà tất cả chúng ta đều phải nắm dù có đi theo con đường nào đi nữa. Về việc học lên cao hơn nữa ở các bậc học sau đại học, theo suy nghĩ chủ quan của mình (và có tham khảo một vài anh chị có kinh nghiệm), trừ khi bạn muốn đi theo con đường nghiên cứu hoặc cách ngành nghề nặng tính học thuật như xử lí dữ liệu lớn bigData, nhận dạng, AI, … thì việc học lên cao hơn không phải là lựa chọn tối ưu ở môi trường làm việc tại Việt Nam. Tập trung và thực hành những công nghệ mới và học hỏi kinh nghiệm từ những người đi trước đôi khi sẽ phù hợp hơn với một lập trình viên phần mềm.

Nắm vững những kiến thức cứng

Đây là thứ mà bạn được dạy nhiều nhất ở trường. Dù bạn có theo hướng nào: Web, Mobile hay AI, … bạn cũng cần nắm những kiến thức căn bản trong lập trình như: kĩ thuật lập trình, lập trình hướng đối tượng, cấu trúc dữ liệu và giải thuật, cơ sở dữ liệu căn bản. Đây là những môn học và kiến thức nền tảng, những kiến thức này thuộc dạng “trường tồn với tháng năm” và không dễ bị thay đổi trong 1 sớm 1 chiều được.

Nếu bạn là sinh viên mới tốt nghiệp, học tốt các môn này ở trường là một lợi thế để nhà tuyển dụng chú ý bạn. Nếu bạn đã đi làm rồi, chắc hẳn những kiến thức này sẽ giúp ích cho bạn rất nhiều trong quá trình tìm hiểu và áp dụng những công nghệ mới để giải quyết những vấn đề thực tế trong đời sống. Ở mức Fresher hoặc Junior, việc ít kinh nghiệm và hiểu biết về công nghệ có thể được châm chước, nhưng thiếu các kiến thức nền tảng sẽ rất khó để bạn có thể vượt qua vòng phỏng vấn cho một vị trí tốt.

Chú ý quá trình làm việc nhóm ở trường

Phát triển phần mềm là một công việc của tập thể, vậy nên các công ty cũng rất chú trọng tới kĩ năng làm việc nhóm của bạn. Làm việc nhóm ở đây không phải là cái gì đó quá lớn lao, đơn giản chỉ là cách mà bạn thực hiện đồ án môn học cùng với nhóm như thế nào, tổ chức nhóm và phân công nhiệm vụ cho từng thành viên như thế nào, làm thế nào để mọi người cùng làm chứ không bị hiện tượng “gánh team”, nếu có vấn đề phát sinh (thầy cô thay đổi đề, có bạn nghỉ, …) thì nhóm sẽ giải quyết thế nào, là một thành viên trong nhóm bạn có tích cực trao đổi và bàn bạc không hay chỉ thụ động chờ người khác phân công, …

Những câu hỏi ở trên thật ra sẽ rất dễ để trả lời nếu bạn có làm việc nhóm 1 cách nghiêm túc khi còn đi học. Đôi khi những bài học rút ra từ thất bại còn được đánh giá cao hơn khi bạn đã hoàn thành môn học đó một mình. Đọc đến đây chắc mọi người cũng sẽ biết được một sự thật là các “thánh gánh team” sẽ không hề được đánh giá cao. Vậy nên chưa chắc gì bạn giỏi kĩ năng cứng mà đã được công ty tuyển dụng chú ý đâu nha. Thái độ và khả năng hợp tác của bạn là một yếu tố sẽ được cân nhắc rất nhiều.

Học các môn học có chương trình đào tạo tiên tiến và hợp thời

Với sự thay đổi nhanh chóng của công nghệ hiện nay, dẫu cho chương trình đại học vẫn bị đánh giá là hơi “lạc hậu” nhưng không phải là không có những môn học hợp thời. Ngoài việc tập trung cho các kĩ năng và môn học nền tảng kể ở trên, thì bạn cũng nên đăng kí học những môn học “hiện đại” hơn như: lập trình thiết bị di động, phát triển ứng dụng web (java, PHP, nodejs, …), các hệ thống xử lí phân tán, thiết kế giao diện phần mềm, NoSQL … Đây là những môn học gần như bắt buộc đối hoặc là rất cần thiết với các bạn muốn đi theo hướng Web hoặc mobile sau này.

Bạn có thể học những môn học này ở trường, hoặc nếu không được dạy ở trường, bạn có thể học thêm ở trung tâm hoặc các khóa học online. Các khóa học online về những công nghệ hiện đại này có rất nhiều trên internet. Hãy tận dụng thời gian rảnh rỗi của bản thân để học hỏi thêm, nếu nắm vững những kiến thức nền tảng và cả những kiến thức về các công nghệ hiện đại nữa, thì bạn sẽ có điểm cộng rất lớn trong mắt các công ty đó.

Thực tập ở cty muốn làm việc.

Đừng nghĩ rằng khi còn đang đi học là bạn không có cơ hội có được kinh nghiệm thực tế. Ngược lại, bạn có thể xin đi thực tập ở các công ty về lĩnh vực bạn muốn theo đuổi sau này để có được kinh nghiệm làm việc cũng như cái nhìn thực tế hơn. Hiện nay hầu hết các trường đều tổ chức cho sinh viên thực tập ở cuối năm 3 hoặc năm 4, vậy nên hãy tận dụng các cơ hội này để có được kinh nghiệm thực tế.

Làm gì để có được một công việc tốt sau khi tốt nghiệp

Nếu như trường bạn không tổ chức thực tập thì sao? Không sao cả, bạn hoàn toàn có thể nộp hồ sơ đến thẳng công ty để xin thực tập cũng được. Các công ty cũng sẽ rất sẵn lòng hỗ trợ những sinh viên năng động trong công việc. Trên internet hiện nay có trang intership.edu.vn cũng rất hay đăng các thông tin về thực tập, các bạn sinh viên có thể tìm kiếm cơ hội của mình ở đây. Ngoài ra bạn có thể tham khảo các công ty hàng đầu tại Việt Nam dưới đây:

  TOP 100 Công Ty Tốt Nhất Việt Nam Ở Thời Điểm Hiện Tại

Cách tốt nhất để chuẩn bị cho công việc ở một công ty nào đó là hãy làm việc cho họ ở vị trí thực tập sinh, như thế bạn có thể hiểu được nhiều hơn về công việc và cả công ty đó. Bạn có thể thực tập một vài tháng hè, sau đó trở lại trường học nốt chương trình còn lại, rồi liên hệ lại công ty sau khi đã ra trường, các công ty cũng hay có những ưu tiên dành cho các bạn từng thực tập lắm đó.

Tham khảo việc làm thực tập sinh IT dãi ngộ tốt trên TopDev

Kết lại

Thị trường việc làm ngày nay đang rất thiếu những người có kĩ năng và thái độ làm việc tốt, mình nhấn mạnh lại là “những người có kĩ năng và thái độ tốt” nhé vì thực trạng cũng đang có rất nhiều người đang thất nghiệp. Giữa muôn vàn người đi tìm công việc, việc học vững các kiến thức ở trường cùng các kĩ năng làm việc nhóm và kinh nghiệm có được khi đi thực tập sẽ làm những điểm nổi bật giúp bạn tạo được chú ý với các nhà tuyển dụng hơn.

Để làm được những điều trên, bạn cần chủ động hơn trong các nhiệm vụ của mình. Hi vọng các bạn sẽ có cái nhìn cụ thể hơn chút xíu về con đường tương lai sau này nhé.

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

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

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

Designer nên làm gì trong việc tối ưu hiệu năng Website

Designer nên làm gì trong việc tối ưu hiệu năng Website

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

Mấy ngày nay toàn viết bài về tối ưu hệ thống. Hôm nay mình cũng viết bài về tối ưu hệ thống nhưng sẽ hướng đến designer. 1 trong những đối tượng mà mình cũng rất thích.

Như chúng ta đã biết, hiện nay tỉ lệ image đang chiếm đến 50% trên toàn bộ các trang web trên thế giới.

  10 kênh Youtube học lập trình không thể bỏ qua dành cho Junior Web Developer / Designer
  5 ứng dụng Android tuyệt vời dành cho Android Developer và Designer

Việc hiệu năng trang web giảm cũng kéo theo rất nhiều thứ theo nó. Ví dụ như trải nghiệm người dùng thấp, doanh thu giảm. Đây là 1 ví dụ của Pinterest sau khi tối ưu thành công hiệu năng web mobile.

Qua đó chúng ta thấy được, 1 khi trải nghiệm người dùng tốt thì mọi thứ cũng đều trở nên tốt đẹp hơn. Trong đó có cả doanh thu đấy.

Designer nên làm gì trong việc tối ưu hiệu năng Website

Kết quả sau khi dùng Progressive Web App

Do đó, không chỉ developer mà ngay cả chính designer cũng cần phải có trách nhiệm trong vấn đề sử dụng image website cho hiệu quả.

Hiện nay website trên toàn thế giới đang có xu hướng càng ngày càng nặng hơn. Theo như thống kê của httparchive.org cho chúng ta thấy, cách đây 7 năm (2012/02/15) kích thước trung bình của website là 986 KB. **Thời điểm thống kê (2018/02/15) thì nó đã đạt đến **3686 KB.

Chỉ trong vòng gần 6 năm mà website đã nặng lên gần **373.8%. **Điều đó chứng tỏ website trên toàn thế giới đang có xu hướng xấu đi.

So với những năm trước đó thì video cũng chiếm 1 phần không nhỏ trong website, thế nhưng thằng đang chiếm nhiều nhất lại là image.

Designer nên làm gì trong việc tối ưu hiệu năng Website

Tại sao hiệu năng website lại quan trọng?

Designer nên làm gì trong việc tối ưu hiệu năng Website

Theo như thống kê Google/SOASTA năm 2017 cho thấy:

  • cứ khi tốc độ tải trang tăng từ 1s -> 3s thì tỉ lệ người dùng rời khỏi trang web tăng 32%
  • cứ khi tốc độ tải trang tăng từ 1s -> 5s thì tỉ lệ người dùng rời khỏi trang web tăng 90%
  • cứ khi tốc độ tải trang tăng từ 1s -> 6s thì tỉ lệ người dùng rời khỏi trang web tăng 106%
  • cứ khi tốc độ tải trang tăng từ 1s -> 10s thì tỉ lệ người dùng rời khỏi trang web tăng 123%

Từ đó ta thấy được hiệu năng của trang web có mức độ ảnh hưởng to lớn như thế nào. Nó không chỉ ảnh hưởng đến trải nghiệm người dùng mà còn ảnh hưởng đến doanh thu của công ty (người dùng rời khỏi trang web tăng -> doanh thu đương nhiên sẽ giảm).

Lí do tại sao website lại càng nặng?

Nguyên nhân chủ yếu khiến website nặng là do hình ảnh trên trang web chưa được tối ưu. Vậy nguyên nhân nào khiến nó chưa được tối ưu?

Đầu tiên, khi design và phát triển 1 website thì rất khó có thể biết được trách nhiệm của desinger kết thúc ở đâu? và trách nhiệm developer kết thúc ở đâu?

Ví dụ như việc nén hình ảnh để tối ưu tốc độ thì ai sẽ là người làm? Designer hay là Developer sẽ làm?

Thông thường thì designer sẽ chọn ảnh và sau đó nhờ developer upload lên server? Hay là khi upload ảnh lên server thì hệ thống sẽ tự đống nén ảnh?

Thứ 2, hầu hết các desinger đều không biết hiệu năng của website đang tồi tệ đến mức độ như thế nào? Bao nhiêu image đang có kích thước quá to và nó đang ảnh hưởng đến trải nghiệm của người dùng như thế nào?

Thứ 3những tool, những kĩ thuật về việc nén ảnh như pro thì designer hầu như không biết. Có lẽ đây là 1 trong những lí do chính.

Làm thế nào có thể tối ưu image website như pro?

Để làm được điều này thì trước khi quyết định sử dụng image trong website, thì các bạn hãy trả lời những câu hỏi dưới đây nhé.

Có cần xử lý toàn bộ hình ảnh không?

Hình ảnh là 1 trong những bộ phận khá quan trọng trong website. 1 website mà toàn chữ chắc chẳng ai muốn đọc cả.

Thế nhưng 1 website mà có quá nhiều ảnh thì lại làm hiệu năng của website bị giảm xuống. Do đó mà trước khi thêm 1 ảnh nào đó vào trong website thì hãy thử nghĩ xem thật sự hình ảnh đó có cần hay không?

Nếu cho vào thì nó có làm content hay hơn không? Hay chỉ làm cho website trông đẹp hơn?

Ảnh có phải loại vector hay không?

Hình ảnh mà bạn đang xử dụng có phải loại vector hay không? Nếu hình ảnh bạn đang dùng là loại vector thì đừng nên export nó ra dạng PNG hay JPG. Hãy nên export nó ra dạng SVG cho nhẹ nhé.

Designer nên làm gì trong việc tối ưu hiệu năng Website

Hiện tại hầu như browser nào cũng support SVG. Nên các bạn cũng không cần phải lo lắng cho điều này.

Hình ảnh có nền trong suốt không?

Hình ảnh mà được lưu dưới dạng PNG sẽ luôn nặng hơn hình ảnh được lưu dưới dạng JPG. Nếu hình ảnh của bạn không cần nền trong suốt thì khi đó hãy export ra dạng JPG nhé.

Hình ảnh đã được nén tối đa chưa?

Đa số designer đều nói trong Photoshop hay Pixelmator có cái option là “Save for Web”. Nếu export ảnh mà chọn option này thì cũng nén ảnh OK rồi.

Thế nhưng so với các tool TinyPNG hay JPEGmini thì option “Save for Web” không phải là lựa chọn hợp lí.

SVGOMG

Đây là 1 trong những ứng dụng web, có thể dùng trực tiếp ở đây. Ứng dụng này có thể giúp ta xoá 1 vài thông tin không cần thiết từ file SVG.

Ở trong những editor về graphics như photoshop thì luôn luôn có 1 vài thông tin về metadata, comment, 1 số hidden element. Những thông tin này có thể là nguyên nhân gây file SVG bị phình to.

Nếu xoá những thông tin này đi sẽ giúp giảm kích thước SVG khá tốt. Đặc biệt là không làm mất đi chất lượng hình ảnh.

TinyPNG

Đây cũng là 1 trong những ứng dụng web, có thể sử dụng trực tiếp tại đây.

Nếu như bạn có hình ảnh nào cần làm trong suốt background thì tool này là 1 tool khá hữu ích.

JPEGmini

Đây là 1 trong những tool nén ảnh JPG tốt nhất từ trước đến nay mà mình đã dùng. Nó có thể nén hình ảnh đến 50% mà mắt thường nhìn vào cũng không thể phân biệt được đâu là ảnh gốc và đâu là ảnh đã nén.

Bạn có thể tải ứng dụng này tại đây. Tuy nhiên ứng dụng này là bản mất phí, dùng được cho cả Window lẫn Mac.

Hình ảnh có cần phải responsive hay không?

Nếu bạn nghĩ, trang web của bạn không cần thiết phải hiển thị hình ảnh responsive đến cho người dùng thì cái này là hoàn toàn sai nhé.

Hiện tại tỉ lệ user dùng mobile càng ngày càng tăng lên. Nếu họ dùng wifi để kết nối đến thì không vấn đề gì. Nhưng đa số thời gian họ ở bên ngoài và dùng 3G, 4G để lướt web.

Khi đó tốc độ mạng cũng như băng thông sẽ bị hạn chế. Nếu phải load hình ảnh nặng thì UX sẽ không tốt. Do vậy việc cung cấp 1 hình ảnh nhẹ hơn trên mobile là 1 điều cần thiết.

Hiện tại đa số các hệ thống CMS như wordpress đều support responsive cho image.

Để hiểu sâu hơn về tính responsive trong image, các bạn có thể tham khảo bài viết này.

Kết luận

Nếu xử lý hình ảnh trong website 1 cách cẩu thả sẽ là nguyên nhân chính gây phá hoại trải nghiệm người dùng, và có thể làm cho công ty của bạn mất tiền do nó ảnh hưởng tiêu cực đến hiệu suất.

Thật may mắn có rất nhiều công cụ, kĩ thuật giúp desinger làm được điều này.

Nếu các bạn có lời khuyên nào cho việc xử lý hình ảnh trên webiste thì hãy để lại lời nhắn ở phần comment bên dưới nhé.

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

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

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

Công nghệ trong ngành Bảo hiểm InsurTech: Góc nhìn từ Phó Tổng Giám Đốc Công Nghệ Thông Tin AIA Việt Nam

Cover Letter

Công nghệ trong Ngành bảo hiểm nói chung hay InsurTech nói riêng đang có tiềm năng vô cùng lớn tại thị trường Việt Nam. Trò chuyện cùng TopDev TV, anh Nguyễn Quang Trung (Bill), hiện đang là Phó Tổng Giám Đốc Công Nghệ Thông Tin AIA Việt Nam, sẽ chia sẻ một số góc nhìn về công nghệ và tiềm năng của thị trường này.

Phó Tổng Giám Đốc AIA

  • Anh Nguyễn Quang Trung (Bill), sinh ra ở Việt Nam nhưng đã làm quen với cuộc sống tại đất nước Pháp từ năm 10 tuổi.
  • Đến năm 2009, anh quay về Việt Nam và làm việc cho đến hiện tại, từng kinh qua các tập đoàn lớn như IBM, GNT và 4 năm gần đây là làm việc tại AIA Việt Nam.
  Kết hợp công nghệ vào Logistic thế nào là tối ưu?
  Business Intelligence (BI) là gì? Trò chuyện cùng chuyên gia Trường Phan để hiểu hơn về vai trò của BI trong hệ thống

Con đường sự nghiệp trong ngành InsurTech

Anh nghĩ career path của mình của hơi đặc biệt. Anh bắt đầu làm việc từ năm 19 tuổi, khi chỉ vừa bắt đầu vào đại học. Những ngày đầu, anh nhận thấy môi trường và cách học Công nghệ thông tin ở Pháp không phù hợp và cho mình thế nên anh quyết định vừa đi làm, vừa đi học. Anh đi học 2 tuần và đi làm 2 tuần. Cứ như vậy trong suốt 2 năm và đạt được bằng đại học đầu tiên. Sau đó, anh đi làm chính thức. Bởi tại thời điểm ấy, ngành IT chưa phổ biến nên ban ngày thì anh làm việc, còn ban đêm thì anh lại đi học thêm để đạt được tấm bằng Master Degree.

Sau quãng thời gian đó, anh làm cho một tập đoàn khá lớn về Consulting Service, đó là Altran Europe. Anh làm cho tập đoàn này khoảng 6 năm. Tại đó, anh đã được làm nhiều project như ngành automobile (ngành ô tô) cho Mercedes; ngành pharmaceutical (ngành dược) cho Sanofi Aventis ; và rất nhiều tập đoàn lớn & lĩnh vực khác nhau tại Pháp.

Tại sao anh lại đặt Head Title trong Profile của mình là CxO thay vì chức vụ hiện tại là CTO hay CIO? Có phải CxO này là Chief Experience Officer?

Về điểm này anh nghĩ, thực ra chữ CXO chỉ mới phổ biến trong vài năm vừa qua thôi. Còn về title của anh, chữ CxO là chữ x nhỏ chứ không phải X to. Trên thực tế, chữ CxO này của anh ý nghĩa là bởi anh không không nghĩ anh là một người chỉ biết, làm mỗi về Technology. Bởi trong thế giới hiện tại, đòi hỏi rất nhiều người có khả năng làm việc linh hoạt (Agile) để có thể quản lý được hết công việc trong một project (dự án) hay trong một business (doanh nghiệp). 

Xem thêm Gặp gỡ Nguyễn Sơn Tùng CTO Viec.co – Quán quân StartupViet 2019

Vì thế, chữ CxO ở đây mang ý nghĩa thể hiện sự linh hoạt; trong một quá trình, anh có thể làm cả về công nghệ, kinh doanh, tài chính, chiến lược, marketing,… Tóm lại, CxO nghĩa là anh có thể làm việc linh hoạt trong nhiều công việc khác nhau. Nhưng điều ấy không có nghĩa mình là chuyên gia trong toàn bộ các lĩnh vực ấy. Chuyên môn của mình vẫn là về công nghệ, tuy nhiên mình vẫn có thể phát triển được những xu hướng khác .

Áp dụng công nghệ vào Bảo hiểm

Ứng dụng công nghệ vào các sản phẩm bảo hiểm như thế nào?

Khi một gói sản phẩm bảo hiểm nhân thọ (life insurance) được đưa ra thường sẽ tập trung vào 3 điểm: 

  • Đầu tiên phải biết khách hàng họ là ai?
  • Thứ 2 là khả năng tài chính của khách hàng như thế nào ? (Financial Situation Status)
  • Thứ 3 là tình trạng sức khỏe của họ khi mua bảo hiểm (Medical Health Status)

Từ đó, công nghệ có thể được ứng dụng vào 3 yếu tố này.

Anh có thể chia sẻ thêm về các công nghệ trong ngành bảo hiểm được áp dụng cho 3 yếu tố trên được không?

Để áp dụng công nghệ trong bảo hiểm thì mình áp dụng ở đây là OCR (nhận dạng ký tự quang học), voice recognition, facial recognition và tiếp theo  là cả Machine Learning và AI. Đặc biệt trong AI thì mình sẽ áp dụng nó cho AI Underwriting (thẩm định bảo hiểm). 

Ứng dụng trong Underwriting đó là mình làm sao automation (tự động hóa) và validate (xác nhận) tất cả thông tin của khách hàng. Từ chứng minh nhân dân mình có thể nhận diện ra được mà không cần tự input vì nó không có nhiều vấn đề phát sinh.

InsurTech Công nghệ và Bảo hiểm

Thứ 2 là mình có facial recognition để mình biết được người đó còn sống (alive) hay không. Điểm thứ 3 là công nghệ AI áp dụng facial recognition để mình biết một hình chụp trên chứng minh nhân dân cách đây 10 năm so sánh với một người hiện tại thì match bao nhiêu % với nhau. Đó là những gì AI đang áp dụng cho AI Underwriting.

Tiếp theo đó là Claims Automation Processing (Tự động hóa Quá trình yêu cầu bồi thường bảo hiểm). Cũng là việc xem process trên những công nghệ cũ nhưng nay mình có thể làm tự động qua API và AI để rút ngắn thời gian trong Insurance Claim Process (quy trình yêu cầu bảo hiểm xử lý)

Tập đoàn bảo hiểm AIA Việt Nam có sử dụng công nghệ chatbot không?

Thành thật mà nói, Chatbot là một công nghệ rất hot hiện tại và anh nghĩ tất cả mọi người đều muốn sở hữu chatbot. Tuy nhiên, chatbot mà thực sự hiệu quả thì anh nghĩ là chưa có. Tại AIA Việt Nam cũng đã thử nghiệm và đã có một chatbot. Tuy nhiên, một chatbot để đưa cho end-user, một khách hàng thực sự sử dụng thì hiện tại vẫn chưa thành công.

Tại sao chưa thành công? Vì điểm thứ nhất, xu hướng và tư duy sử dụng của khách hàng Việt vẫn chưa quen sử dụng qua Chatbot. Điểm thứ 2 đó là công nghệ AI phía sau Chatbot phải thông minh. Để xây dựng một Chatbot đáp ứng nhu cầu ngoài FAQ thì hiện tại điều này đang rất phức tạp và chưa thành công được.

Hiện tại, AIA Việt Nam đang ứng dụng công nghệ Chatbot cho phần internal (nội bộ) của mình để hỗ trợ quá trình bán hàng hay bộ phận HR (được process hóa, FAQ – Frequently Asked Questions, câu trả lời thông minh dựa trên process đã có) và trong tương lai mình cũng sẽ triển khai điều đó cho internal workforce (nội bộ) hoặc salesforce (đội ngũ bán hàng) của mình.

startup công nghệ trong bảo hiểm

Theo anh vì sao Insurtech vẫn chưa phát triển tại Việt Nam?

Đầu tiên nên làm rõ, trong lĩnh vực bảo hiểm có 2 loại là Bảo hiểm nhân thọ (life insurance) và phi nhân thọ (non-life insurance). Insurtech trên thực tế đang được áp dụng rất nhiều và ứng dụng cho ngành non-life insurance (bảo hiểm phi nhân thọ). Một trong số những startup Insurtech mà anh thấy sản phẩm của họ làm rất tốt, đó là Lemonade, dù là Startup nhưng cách họ tiến hành Customer Experience (CX) đã khiến sản phẩm của họ có chỗ đứng trong ngành InsurTech. Đương nhiên, những business hay những sản phẩm như của Lemonade có thể áp dụng được ở Việt Nam hay không là tùy thuộc vào mindset (tư duy) và Customer Experience (trải nghiệm khách hàng) nữa. Ở Việt Nam, Fintech thành công trong lĩnh vực payment (e-wallet) thì đã có những cái tên như MoMo, Zalopay,… Tuy nhiên về Insurtech ở Việt Nam thì vẫn còn tương đối chậm, bởi phần nhiều liên quan đến vấn đề thâm nhập thị trường.

InsurTech Công nghệ và Bảo hiểm

Trau dồi kiến thức IT để theo đuổi mảng bảo hiểm như thế nào?

Anh nghĩ là không chỉ liên quan đến bảo hiểm mà đây còn là những xu hướng, nhu cầu sắp tới trong lĩnh vực IT.

  • Đầu tiên là về Technology risk, đó là một điểm quan trọng mà mình có nhiều biến đổi.
  • Thứ hai là học những công nghệ mới như Cloud ComputingDevOps.
  • Thứ ba là tất cả những gì liên quan đến Data Analytics, Machine Learning, AI.

Tất cả những công nghệ này trên thực tế sẽ là những công nghệ được áp dụng cho tất cả nền tảng đang có digital transformation journey và đặc biệt là cho những tập đoàn lớn.

Bài viết dựa trên chuỗi TopDev TV – Ep22 do TopDev thực hiện

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

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

Cover Letter là gì? Cách viết một Cover Letter chuyên nghiệp

Cover Letter

Bạn đang gặp khó khăn vì chưa biết rõ mình cần phải làm gì khi viết Cover Letter (Thư xin việc)? Đừng lo lắng, TopDev sẽ giúp bạn tìm hiểu rõ hơn Cover Letter là gì và cách để tạo ra một thư xin việc chuyên nghiệp.

Cover Letter là gì?

Cover Letter với nhiều tên gọi khác như: application letter hay thư xin việc, là một dạng tài liệu dài một trang được gửi đến nhà tuyển dụng với những mô tả về thế mạnh cũng như các kinh nghiệm bản thân liên quan đến vị trí ứng tuyển.

Chất lượng của một Cover Letter là yếu tố quyết định việc nhà tuyển dụng có nên xem CV (Hồ sơ xin việc) của ứng viên hay không? Vì vậy, thư xin việc có một vai trò rất quan trọng. Việc sàng lọc ban đầu là cần thiết, bạn hãy thể hiện mình là một ứng viên tiềm năng thông qua một Cover Letter chuyên nghiệp nhé!.

Tạo CV online miễn phí

Cấu trúc cơ bản của một Cover Letter

Để tạo được một thư xin việc chuyên nghiệp, trước tiên bạn cần biết được cấu trúc cơ bản của một Cover Letter.

Cover Letter

Sau đây là những phần nội dung cần có để tạo lập nên một thư xin việc:

1. Phần giới thiệu: Cần được viết chỉn chu, cẩn thận ngay từ ban đầu. Điều này tạo sự để thu hút, chú ý của người quản lý tuyển dụng. Mục tiêu của phần giới thiệu là bạn cần lý giải tại sao bạn mong muốn có được công việc, vị trí này.

2. Phần trọng tâm: Đây là phần chủ chốt để bạn thể hiện bản thân một cách tối đa. Hãy thông minh và có tư duy chiến lược trong việc trình bày những nội dung. Một phần trọng tâm đạt hiệu quả cao nhất sẽ bao gồm ít nhất 2 đoạn văn bản mô tả chi tiết về trình độ học vấn, kỹ năng, kinh nghiệm làm việc,… Nhà tuyển dụng sẽ xem xét kỹ phần này để đánh giá mức độ phù hợp của bạn.

3. Phần kết luận: Hãy kết thúc lại lá thư xin việc với những dòng mô tả ngắn gọn. Lưu ý là bạn đừng quên gợi nhắc người quản lý tuyển dụng liên hệ với bạn (được gọi là lời kêu gọi hành động).

Một Cover Letter chuyên nghiệp sẽ như thế nào?

Bước đầu tiên là bạn cần đảm bảo một Cover Letter đúng chuẩn về bản chất truyền đạt của nó. Tức là Cover Letter phải tóm tắt được nhanh chóng tại sao nhà tuyển dụng họ nên chọn bạn. Thông qua Cover Letter và sự kết nối với CV, nhà tuyển dụng cần thấy ở bạn sự định hình về phong cách cá nhân, năng lực chuyên môn và sự phù hợp với vị trí mà họ đang tìm kiếm. Tất nhiên, nhiệm vụ của bạn là làm thế nào thuyết phục nhà tuyển dụng để họ nắm bắt dễ dàng hơn những gì bạn có.

Cover Letter

Nếu xem xét hai mẫu văn bản trên, chắc chắn nhà tuyển dụng sẽ lựa chọn Mẫu 2. Tại sao lại như vậy. Vì đơn giản, nội dung được khai thác và dẫn dắt trực tiếp về vấn đề. Đó là một biểu hiện của tính chuyên nghiệp trong Cover Letter.

Tính chuyên nghiệp còn được thể hiện ở khía cạnh trọng tâm. Tức là bạn cần đi thẳng vào vấn đề. Thể hiện cho họ thấy tại sao họ nên chọn bạn. Loại bỏ những thông tin không cần thiết, hãy tỉ mỉ và thông minh trong cách chọn lọc nội dung muốn truyền tải.

Bên cạnh đó, những kỹ năng hay kiến thức chuyên ngành đáp ứng các vị trí tuyển dụng nên được đưa vào Cover Letter một cách thích hợp. Hãy nhớ mọi thứ không quá nhiều, đơn giản nhưng không hời hợt. 

Cách viết Cover Letter hoàn hảo

Nhiều thắc mắc đã được đặt ra như: Tôi nên viết những gì trong thư xin việc của mình? Tôi phải thể hiện điều đó như thế nào? Tôi nên viết nó một cách quá chi tiết chăng? Đừng quá lo lắng vì TopDev sẽ giúp bạn giải đáp những câu hỏi đó.

Cover Letter

Bước 1: Đặt chi tiết liên hệ của bạn (và của nhà tuyển dụng) vào mở đầu

Chi tiết liên lạc

Để mở đầu thư xin việc, những nội dung bạn cần quan tâm là:

  • Tên và họ của bạn
  • Địa chỉ email của bạn (đảm bảo rằng nó chuyên nghiệp và không phải huycute0599@gmail.com)
  • Số điện thoại của bạn
  • Địa chỉ thư tín (Email) của bạn (Tùy chọn)
  • Liên kết hồ sơ Linkedin của bạn (Tùy chọn)

Dưới thông tin chi tiết liên hệ của bạn, bạn cần bổ sung:

  • Thời gian
  • Họ và tên của người cơ quan doanh nghiệp/tổ chức tuyển dụng 
  • Địa chỉ công ty
  • Số điện thoại của công ty
  • Tên người quản lý tuyển dụng hoặc địa chỉ email của công ty

Bước 2: Xây dựng phong cách xưng hô chuyên nghiệp

Lời chào mở đầu

Hãy tạo ấn tượng ban đầu tuyệt vời bằng cách gửi Cover Letter của bạn cho một cá nhân bằng tên thật của họ.

Ghi nhớ, bạn nên loại bỏ những kiểu “chào làm thân” đại trà và phản ánh sự lười biếng của bản thân. Một lời chào mở đầu thiếu sự chân thành sẽ làm giảm đi cơ hội trúng tuyển của bạn.

Trong trường hợp bạn chưa chắc chắn về chức danh hay tên gọi thật của họ, đừng ngại xác thực. Cách hiệu quả nhất là thử kiểm tra trang web của công ty. Check trên nền tảng Linkedin, thậm chí là gọi điện hoặc gửi email cho bộ phận nhân sự để hỏi. Nếu vẫn nhận thấy chưa rõ ràng, hãy làm theo những mẹo sau:

  • Nếu bạn không chắc chắn về chức danh của nhà tuyển dụng (như Ông, Bà, Bà, Tiến sĩ, v.v.), bạn có thể loại bỏ nó khỏi phần chào của mình. Ví dụ: “Jane Smith thân mến” là một cách có thể chấp nhận được.
  • Nếu bạn không thể tìm ra người tuyển dụng là ai, bạn có thể đoán. Ví dụ: nếu bạn đang ứng tuyển vào vị trí nhân viên nhân sự, bạn có thể gọi tên Giám đốc nhân sự.
  • Nếu bạn không thể tìm thấy tên của bất kỳ ai, bạn có thể gửi địa chỉ đó cho bộ phận. Ví dụ: “Kính gửi Phòng Nhân sự” là sự lựa chọn không tồi.

Một số ví dụ điển hình về màn chào đầu chuyên nghiệp

  • Gửi Jane Smith
  • Gửi cô Smith
  • Kính gửi Phòng Truyền thông – Marketing
  • Kính gửi [Tên công ty] Nhà tuyển dụng

Bước 3: Thu hút người quản lý tuyển dụng bằng một lời giới thiệu mạnh mẽ

Đoạn giới thiệu quan trọng

Nhiều ứng viên cho rằng họ quá khổ sở về việc tìm ra cách bắt đầu thư xin việc của họ. Nhưng trên thực tế, nó không quá phức tạp như họ nghĩ. Bạn cần lưu ý, một thư giới thiệu hiệu quả, thu hút nhà tuyển dụng có thể bao gồm những đặc điểm sau:

–  Vị trí công việc: Tên vị trí bạn đang ứng tuyển

–  Tên công ty: Tên công ty bạn đang ứng tuyển

– Ý định ứng tuyển: Thể hiện được nhiệt huyết của cá nhân bạn đối với vị trí bạn mong muốn ứng tuyển

Ngoài ra, bạn có thể làm làm cho phần giới thiệu của mình thêm sự thu hút bằng cách thêm một số mô tả về tính cách, đam mê hoặc điểm nhấn về nghề nghiệp. Tính cách luôn là điều quan trọng mà nhà tuyển dụng mong muốn thấy ở bạn. Tuy nhiên, nên chắc chắn rằng mọi thứ có chừng mực. Một số cách bạn có thể sử dụng để xây dựng chiến lược giới thiệu thư xin việc độc đáo là: 

  • Thể hiện tình yêu của bạn đối với công ty
  • Làm nổi bật thành tích trong quá khứ
  • Thể hiện niềm đam mê với công việc của bạn

Bước 4: Chứng minh rằng bạn là ứng viên hoàn hảo cho công việc

Đây là bước thuộc phần trọng tâm để bạn nắm bắt cách viết cover letter chuyên nghiệp. Và như chia sẻ ở trên, đã đến lúc bạn trình bày một cách thuyết phục tại sao bạn là người phù hợp với vị trí, công việc đó. 

Lưu ý về những chia sẻ

Để chỉ ra cho nhà tuyển dụng thấy bạn là một ứng cử viên tuyệt vời, hãy ghi nhớ ba điểm sau:

1. Mạnh dạn, nhưng đừng khoe khoang: Một lá thư xin việc mạnh mẽ thì điều cần truyền tải chính là sự tự tin. Để chứng minh bạn là ứng viên tốt nhất cho công việc, hãy đưa ra những minh chứng về năng lực và thể hiện nó trong thư xin việc của bạn. Đừng nói những điều thiếu thực tế so với khả năng thật sự của bạn.

2. Trung thực và không thêu dệt: Sự chân thật rất quan trọng. Đừng nói dối hoặc thậm chí kéo dài sự thật về những trải nghiệm cá nhân của bạn. Vì điều này chỉ làm bạn tụt lại mãi phía sau, không bao giờ tiến bộ được.

3. Tránh liệt kê những thông tin không liên quan: Thư xin việc của bạn nên được điều chỉnh cho phù hợp với công việc và công ty bạn đang ứng tuyển. Thư xin việc (và sơ yếu lý lịch) của bạn nên phản hồi tin tuyển dụng. Đồng thời, đề cập trực tiếp đến các kỹ năng và trình độ được nhà tuyển dụng nêu ra.

Quan tâm đến những kết quả thực tế

Các nhà quản lý tuyển dụng sẽ có cách kiểm chứng thư xin việc của bạn để tìm xác thực rằng bạn là ứng viên hoàn hảo hay bạn cố thể hiện mình. 

Để tăng độ tin cậy, bạn có thể sử dụng các thành tích gần đây để chứng minh (bằng các con số cụ thể) rằng bạn có các kỹ năng để hoàn thành công việc. Cụ thể như sau: 

  • Thành tích nghề nghiệp: Hãy chỉ ra những số liệu chứng tỏ bạn đạt những thành tích về số lượng doanh thu, lợi nhuận, giá trị về sự hài lòng,…
  • Khen ngợi về chuyên môn: Bạn đã nhận được những đánh giá như thế nào từ cấp quản lý hoặc đồng nghiệp của mình
  • Giải thưởng chuyên môn: Bạn đã nhận được giải thưởng gì sau những nỗ lực, cống hiến? 

Trau dồi và rèn luyện các phẩm chất

Ý nghĩa về lợi thế luôn được đặt lên bàn cân của nhà tuyển dụng. Bạn đừng quá lo lắng và e dè khi kinh nghiệm bản thân chưa đủ. Đừng lo ngại vì trên thực tế, người quản lý tuyển dụng còn đánh giá thư xin việc trên cơ sở khai thác những phẩm chất khác, chẳng hạn như:

  • Thành tích học tập (và các thành tích khác): Bạn có bằng cấp (cử nhân, thạc sĩ hoặc tiến sĩ không?). Kết quả GPA của bạn như thế nào? Suốt quá trình học tập và trải nghiệm, bạn có đạt học bổng nào không? Bạn có tham gia thực hiện các luận án khoa học chuyên ngành nào đó hay chưa? 
  • Các hoạt động ngoại khóa: Bạn đã từng trải nghiệm công việc bán thời gian nào chưa? Các hoạt động tình nguyện, dự án xã hội nào mà bạn đã tham gia? Bạn có theo đuổi sở thích và đam mê không?
  • Động lực bản thân và thiết lập mục tiêu: Các mục tiêu ngắn hạn và dài hạn của bạn là gì? Công việc bạn đang ứng tuyển có ý nghĩa gì đối với mục tiêu bạn đã đề ra? 

Hãy nhớ rằng bất kỳ thông tin nào bạn đưa vào phải liên quan đến công việc bạn đang ứng tuyển . Ví dụ, trải nghiệm các cuộc thi về công nghệ sẽ là câu trả lời thuyết phục khi bạn ứng tuyển các vị trí trong ngành IT.  

Bước 5: Đánh giá sơ bộ và hoàn thiện nội dung thư xin việc

Khi viết thư xin việc, hãy thể hiện mình là một ứng viên lịch sự và tự tin. Dù là đoạn cuối cùng nhưng bạn vẫn phải đảm bảo sự cẩn thận, tỉ mỉ. Để có thể hoàn chỉnh chiếc Cover Letter một cách hiệu quả, bạn hãy lưu ý những vấn đề sau:

Xem thêm: 5 lưu ý để viết đánh giá hiệu suất của bạn

  • Cảm ơn người quản lý tuyển dụng đã xem xét sơ yếu lý lịch và thư xin việc của bạn
  • Khái quát lại lý do tại sao bạn là một ứng viên tiềm năng
  • Nhắc lại niềm đam mê của bạn dành cho vị trí, công việc đó
  • Lịch sự yêu cầu họ gửi cho bạn lời mời phỏng vấn

Bước 6: Khép lại Cover Letter bằng một màn chào kết thúc chuyên nghiệp

Ký tên vào thư xin việc của bạn với một lời chào kết thúc chuyên nghiệp:

Bạn có thể sử dụng các cách ký tắt thư xin việc chuyên nghiệp sau đây:

  • Tôi – Em cảm ơn
  • Trân trọng – Trân trọng cảm ơn
  • Cảm ơn –  Xin cảm ơn
  • Chân thành cảm ơn – Xin chân thành cảm ơn

Sau cùng, bạn hãy tạo hai khoảng cách giữa lời chào và nhập tên đầy đủ của bạn.

Bước 7: Kiểm tra lại Cover Letter

Đã đến lúc xác nhận mọi thứ đang đúng quỹ đạo của nó. Liệu thư xin việc của bạn có thật sự đúng quy chuẩn và tạo được sự ấn tượng chưa? Hãy tự hỏi mình những câu hỏi sau đây:

Định dạng thư xin việc của mình đã đúng chưa? 

Một Cover Letter chuyên nghiệp sẽ có 200-350 từ được sắp xếp trong một khoảng trống trên một trang A4. Kiểu phông chữ phải đồng nhất, mức độ chênh lệch không quá nhiều. Khoảng cách lề tạo cảm giác thuận mắt nhất của thư xin việc là từ 1’’ – 1,5’’.

Rà soát nội dung và các lỗi cần thiết 

Văn phong – giọng điệu trong thư xin việc là một yếu tố quan trọng. Lưu ý rằng bạn không nên viết thư xin việc một cách quá trang trọng. Sự nhầm tưởng này không làm cho Cover Letter của bạn chuyên nghiệp hơn. Mặt khác, nó lại khiến cho thư xin việc trở nên cứng nhắc và khó để nắm bắt các thông tin.

Để cải thiện tức thì văn phong – giọng điệu thư xin việc của bạn, hãy thử những cách sau:

  • Tránh dùng các danh ngữ sáo rỗng, chẳng hạn như “suy nghĩ khách quan” và “sức mạnh tổng hợp”
  • Chọn các từ ngữ đơn giản, không chứa nhiều sắc thái quá trang trọng

Bạn nhớ đọc lại thư xin việc và rà soát các lỗi về dùng từ, chính tả, cách diễn đạt, ngữ pháp câu. 

Nếu phát hiện câu cú quá dài dòng, hãy lượt bớt những thông tin không quan trọng. Nếu nhận ra cách diễn đạt quá lủng củng, hãy sửa lại ngay để thông điệp về thông tin của bạn được nhà tuyển dụng nắm bắt một cách tốt nhất.

Gợi ý các mẫu template Cover letter/mẫu thư xin việc

Tải ngay những mẫu CV đẹp dành cho lập trình viên tại đây

Cover Letter

cách viết cover letter
Mẫu cover letter xin việc cho người đã có kinh nghiệm

Tăng hiệu quả ứng tuyển bằng cách tạo CV Online hiệu quả trên TopDev

cover letter IT
Cover Letter cho dân IT

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

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

OpenCV là gì? Học Computer Vision không khó!

opencv la gi

Nếu bạn có hứng thú muốn biết về nhận dạng khuôn mặt hoặc video stream, đến computer vision hoặc build một đường pipeline hoàn chỉnh cho việc phân loại ảnh; kiểu gì cũng sẽ đụng đến OpenCV ở đâu đó trên đường học và thử. Vậy OpenCV là gì?

Sự thật là việc học về OpenCV đã từng khó khăn hơn giờ gấp 100 lần. Tài liệu thì khó tìm, chả biết đau để định hướng. Tutorial cũng khá khó theo và không hoàn thiện. 

Tin tốt là để hiểu được OpenCV không còn quá khó khăn như thế nữa, việc nghiên cứu OpenCV đã trở nên dễ dàng hơn nhiều. Hôm nay hãy cùng TopDev tìm hiểu những định nghĩa, tính năng và phạm trù cơ bản nhất của OpenCV để hiểu hơn bạn cần làm gì tiếp thao và tìm kiếm thông tin ở đâu để nắm chắc OpenCV.

OpenCV là gì ?

opencv

Project OpenCV được bắt đầu từ Intel năm 1999 bởi Gary Bradsky. OpenCV viết tắt cho Open Source Computer Vision Library. OpenCV là thư viện nguồn mở hàng đầu cho Computer Vision và Machine Learning, và hiện có thêm tính năng tăng tốc GPU cho các hoạt động theo real-time.

OpenCV được phát hành theo giấy phép BSD (*), do đó nó miễn phí cho cả học tập và sử dụng với mục đích thương mại. Nó có trên các giao diện C++, C, Python và Java và hỗ trợ Windows, Linux, Mac OS, iOS và Android. OpenCV được thiết kế để hỗ trợ hiệu quả về tính toán và chuyên dùng cho các ứng dụng real-time (thời gian thực). Nếu được viết trên C/C++ tối ưu, thư viện này có thể tận dụng được bộ xử lý đa lõi (multi-core processing). 

* Giấy phép BSD: dành riêng cho các loại mã nguồn mở nhằm cho phép sử dụng miễn phí và hạn chế tối đa các rào cản luật lệ thông thường. Giấy phép BSD là một giấy phép đơn giản chỉ yêu cầu tất cả các mã được cấp phép theo giấy phép BSD nếu được phân phối lại ở định dạng mã nguồn.

OpenCV có một cộng đồng người dùng khá hùng hậu hoạt động trên khắp thế giới bởi nhu cầu cần đến nó ngày càng tăng theo xu hướng chạy đua về sử dụng computer vision của các công ty công nghệ. OpenCV hiện được ứng dụng rộng rãi toàn cầu, với cộng đồng hơn 47.000 người, với nhiều mục đích và tính năng khác nhau từ interactive art, đến khai thác mỏ, khai thác web map hoặc qua robotic cao cấp.

Ứng dụng của OpenCV là gì? 

OpenCV được sử dụng cho đa dạng nhiều mục đích và ứng dụng khác nhau bao gồm [1]

  • Hình ảnh street view
  • Kiểm tra và giám sát tự động
  • Robot và xe hơi tự lái
  • Phân tích hình ảnh y học
  • Tìm kiếm và phục hồi hình ảnh/video
  • Phim – cấu trúc 3D từ chuyển động
  • Nghệ thuật sắp đặt tương tác

Tìm hiểu thêm các API hàng đầu của Computer Vision TẠI ĐÂY

Tính năng và các module phổ biến của OpenCV

Theo tính năng và ứng dụng của OpenCV, có thể chia thư viện này thánh các nhóm tính năng và module tương ứng như sau:

  • Xử lý và hiển thị Hình ảnh/ Video/ I/O (core, imgproc, highgui)
  • Phát hiện các vật thể (objdetect, features2d, nonfree)
  • Geometry-based monocular hoặc stereo computer vision (calib3d, stitching, videostab)
  • Computational photography (photo, video, superres)
  • Machine learning & clustering (ml, flann)
  • CUDA acceleration (gpu)

opencv

OpenCV có cấu trúc module, nghĩa là gói bao gồm một số thư viện liên kết tĩnh (static libraries) hoặc thư viện liên kết động (shared libraries). Xin phép liệt kê một số định nghĩa chi tiết các module phổ biến có sẵn [2] như sau:

  • Core functionality (core) – module nhỏ gọn để xác định cấu trúc dữ liệu cơ bản, bao gồm mảng đa chiều dày đặc và nhiều chức năng cơ bản được sử dụng bởi tất cả các module khác.
  • Image Processing (imgproc) – module xử lý hình ảnh gồm cả lọc hình ảnh tuyến tính và phi tuyến (linear and non-linear image filtering), phép biến đổi hình học (chỉnh size, afin và warp phối cảnh, ánh xạ lại dựa trên bảng chung), chuyển đổi không gian màu, biểu đồ, và nhiều cái khác.
  • Video Analysis (video) – module phân tích video bao gồm các tính năng ước tính chuyển động, tách nền, và các thuật toán theo dõi vật thể. 
  • Camera Calibration and 3D Reconstruction (calib3d) – thuật toán hình học đa chiều cơ bản, hiệu chuẩn máy ảnh single và stereo (single and stereo camera calibration), dự đoán kiểu dáng của đối tượng (object pose estimation), thuật toán thư tín âm thanh nổi (stereo correspondence algorithms) và các yếu tố tái tạo 3D.
  • 2D Features Framework (features2d) – phát hiện các đặc tính nổi bật của bộ nhận diện, bộ truy xuất thông số, thông số đối chọi.
  • Object Detection (objdetect) – phát hiện các đối tượng và mô phỏng của các hàm được định nghĩa sẵn – predefined classes (vd: khuôn mặt, mắt, cốc, con người, xe hơi,…).
  • High-level GUI (highgui) – giao diện dễ dùng để thực hiện việc giao tiếp UI đơn giản.
  • Video I/O (videoio) – giao diện dễ dùng để thu và mã hóa video.
  • GPU – Các thuật toán tăng tốc GPU từ các modun OpenCV khác.
  • … và một số module hỗ trợ khác, ví dụ như FLANN và Google test wrapper, Python binding, v.v.
  Sự khác nhau giữa AI, Machine Learning và Deep Learning
  Sử dụng Machine Learning để visualize customer preferences

Chọn ngôn ngữ nào để lập trình OpenCV?

OpenCV hiện tại hỗ trợ nhiều ngôn ngữ, mỗi ngôn ngữ có thế mạnh riêng, vậy thì tùy theo nhu cầu mà chọn ngôn ngữ cho phù hợp.

C++: Đây là ngôn ngữ phổ biến nhất hiện tại vì nhanh, nhiều option, nếu bạn có IDE là Visual Studio quá tốt. Các thiết lập của nó rất hữu ích cho sản phẩm sau này, mặc dù ban đầu mới đụng tay khá phức tạp

Python: Ngôn ngữ được dùng nhiều để demo / test OpenCV do tính ngắn gọn, ít phải thiết lập. Bên cạnh đó, nếu dùng Python thì cũng có thể code được trên nhiều hệ điều hành.

Android: Hiện tích hợp sẵn camera, tiện lợi nên có thể sớm trở thành xu hướng của OpenCV 

Java: Nhanh và đa nền tảng, tương tự C++

C#: Code tiện lợi, dễ dàng, có thư viện đa nền tảng là EmguCV hỗ trợ. Có một điểm trừ là EmguCV yêu cầu người dùng phải copy toàn bộ file *.dll của lib đi kèm với ứng dụng nên làm ứng dụng sẽ khá nặng.

Tùy theo nhu cầu và tính chất của công việc / dự án mà bạn hãy chọn ngôn ngữ phù hợp. Ví dụ có thể xử lý hình ảnh bằng C++, thiết kế UX / UI thì chuyển sang C# cho dễ thiết kế. Riêng demo chương trình có thể chạy ngay bằng Python hoặc android. Ngôn ngữ nào cũng có điểm cộng điểm trừ, hãy cân nhắc tuỳ project cho phù hợp.

Cách setup OpenCV[4]

Đầu tiên, tải OpenCV tại địa chỉ https://opencv.org/releases.html. Ở đây, tác giả sẽ sử dụng OpenCV cho windows (Win pack)

Sau khi tải xong, click vào file vừa tải và tiến hành cài đặt. Trong ví dụ này, mình sẽ cài đặt OpenCV tại ổ E

Sau khi cài đặt xong, thư mục OpenCV sẽ xuất hiện tại ổ E:

Cài đặt OpenCV cho Python

Sau khi cài đặt xong OpenCV, trong thư mục build của openCV, thư viện OpenCV của python đã được chuẩn bị sẵn.

Copy file cv2.pyd vào trong Lib/site-packages của thư mục gốc của Python2.7

Thư viện OpenCV cho python sử dụng numpy. Để cài đặt numpy, hãy cài đặt pip và sử dụng pip để cài đặt numpy.

Tải file get-pip.py tại địa chỉ: https://bootstrap.pypa.io/get-pip.py

Cài đặt pip: python get-pip.py
Cài đặt numpy: pip install numpy

Cài đặt OpenCV cho C++ từ Source Code

Build thư viện OpenCV từ Source Code bằng CMake

Tại trường “Where is the source code”, chọn địa chỉ source code trong thư mục OpenCV vừa cài đặt là E:/opencv/sources, và trường “Where to build the binaries” tại một thư mục sẽ sử dụng để build. Ở đây mình chọn là E:/opencv/build/x86.

Sau khi chọn xong ấn vào nút Configure. Các bạn chọn genertor bằng MinGW Makefiles
Chú ý: Khi hiển thị config lên, các bạn nhớ bỏ chọn dòng ENABLE_PRECOMPILED_HEADERS

Ấn nút Generate

Sau khi CMake tạo xong, các bạn hãy chạy lệnh mingw32-make từ thư viện MinGW vừa cài.
Nếu các bạn muốn chạy nhiều core (tăng tốc thực hiện), có thể thực hiện lệnh mingw32-make -j4 (-j4 ở đây mang ý nghĩa build trên 4 core CPU)

Chú ý: Khi gặp phải lỗi khi build module videoio, hãy mở đến file cap_dshow.cpp và thêm dòng code sau trên đầu file
#define STRSAFE_NO_DEPRECATE

Tự học OpenCV ở đâu?

Không thiếu tài liệu ngon để khởi động đâu! Bạn hoàn toàn có thể bắt đầu từ các tài liệu và document chính thức từ OpenCV luôn.

  1. Nếu bạn làm trên C và C++ bạn có thể follow các document sau:

2. Nếu dùng Python thì tham khảo kho tài liệu này:

  • OpenCV-Python Tutorials

***Tải đầy đủ file hướng dẫn ở đây: http://docs.opencv.org/opencv_tutorials.pdf

Ngoài ra, có một cuốn sách về OpenCV khá lâu rồi nhưng còn rất “ngon”:  http://www.cs.haifa.ac.il/~dkeren/ip/OReilly-LearningOpenCV.pdf 

Ngoài ra có rất nhiều hướng dẫn có sẵn. Giống như một ngôn ngữ lập trình thôi, bạn nên bắt đầu viết chương trình dùng OpenCV ngay sau khi bạn bắt đầu học. OpenCV hỗ trợ nhiều IDE để làm việc. Microsoft Visual Studio là hỗ trợ tốt nhất tốt nhất. Nhận thêm các visual studio và OpenCV và configure theo link sau:

Installing & Configuring with Visual Studio

Bạn có thể sử dụng Code Blocks hoặc Eclipse hoặc các IDE khác cũng được nhưng Visual Studio tốt bởi vì nó là dễ sử dụng hơn và là một IDE mạnh. Viết application là việc quan trọng nhất của bất kỳ ngôn ngữ lập trình hoặc thư viện nào. Vì vậy, đừng chần chừ mà tìm hiểu và code luôn. Bắt đầu viết application ngay khi bạn bắt đầu học. Nếu bạn gặp bất kỳ lỗi hoặc nhầm lẫn hoặc nghi ngờ nào, có rất nhiều diễn đàn có sẵn để support cho OpenCV, nơi bạn có thể làm rõ tất cả các thắc mắc:

Ngoài những cái này thì nếu bạn có phải làm việc về xử lý hình ảnh thì quá tốt vì từ đó bạn nhanh hiểu hơn về cách thức và cơ chế hoạt động của OpenCV.

Một số tài nguyên bên lề cho bạn tham khảo dưới đây, miễn đừng lười nhé!

Website / Blog

Khóa học (cả miễn phí & có phí)

  • Chính chủ OpenCV: https://opencv.org/courses 
  • Udemy: Tổng hợp các khoá OpenCV từ Python, C/C#, đến các khóa chi tiết theo mục đích như hình ảnh – gương mặt – video.
  • Datacamp: Có một số khóa miễn phí về Face Recognition, Python có thể tham khảo.
  • Learn OpenCV: Self-made blog tập trung về Face Recognition
  • Pyimagesearch: Tổng hợp các khoá học từ Computer Vision, Deep Learning, và OpenCV.

Tư liệu tham khảo:

[1] https://developer.nvidia.com/opencv

[2] https://docs.opencv.org/master/  

[3] https://thigiacmaytinh.com/nen-lap-trinh-opencv-bang-ngon-ngu-nao/

TopDev tổng hợp. 

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

Xem thêm tuyển dụng lập trình IT mới nhất trên TopDev

9 lỗi JavaScript các lập trình viên hay gặp

lỗi JS

Tác giả: Dipto Karmakar

JavaScript là ngôn ngữ script (ngôn ngữ kịch bản) được dùng để thêm các chức năng và tương tác trên web. Với những newbie từ các ngôn ngữ lập trình khác thì JavaScript khá dễ hiểu với một vài tutorial.

Khi bắt đầu với JavaScript, có một vài lỗi cơ bản mà nhiều lập trình viên hay gặp phải, bài viết này sẽ liệt kê 9 lỗi này và đề xuất solution cho từng loại.

Nhầm lẫn giữa assignment (=) và equality (==,===) operators

Đúng như tên gọi, assignment operator (=) được dùng để gán giá trị với biến. Dev hay nhầm nó với equality operator (toán tử). Ví dụ:

const name = "javascript";
if ((name = "nodejs")) {
    console.log(name);
}
// output - nodejs 

Tên biến và chuỗi ‘nodejs’ không được so sánh trong trường hợp này. Thay vào đó, chuỗi ‘nodejs’ được gán thành giá trị của biến và kết quả console trả về là ‘nodejs’.

  JavaScript là gì? Làm thế nào để trở thành lập trình viên JavaScript?

Với JavaScript, biểu tượng 2 dấu bằng (==) và ba dấu bằng (===) được gọi là comparison operator (toán tử so sánh). Đoạn code phía trên là cách hợp lý để so sánh các giá trị:

const name = "javascript";
if (name == "nodejs") {
    console.log(name);
}
// no output
// OR
if (name === "nodejs") {
    console.log(name);
}
// no output

Sự khác nhau giữa những comparison operators này, 2 dấu bằng thì thể hiện loose comparison còn 3 dấu bằng thì là strict comparison. Trong loose comparison, thì chỉ so sánh mỗi các values (giá trị), nhưng với strict comparisons, thì so sánh giữa values (giá trị) và data type (kiểu dữ liệu).

Đoạn code phía dưới sẽ giải thích rõ hơn

const number = "1";
console.log(number == 1);
// true
console.log(number === 1);
// false

Biến số được gán với chuỗi giá trị là 1. Nên khi so sánh với 1 (hay kiểu number) với ==, nó sẽ trả về true bởi vì cả hai giá trị đều là 1.

Nhưng khi so sánh với ===, nó sẽ trả về false bởi mỗi giá trị có data type khác nhau.

Mong đợi callback xử lý synchronous (đồng bộ)

Callbacks là một trong những cách JavaScript xử lý các hàm bất đồng bộ. Promises và async/await là phương thức thích hợp để xử lý các hàm bất đồng bộ vì nếu dùng nhiều hàm callback (callback lồng vào nhau) sẽ dẫn đến callback hell.

Callback không xử lý đồng bộ, nó là chức năng được thực hiện sau khi một chức năng khác đã thực hiện xong. 

Một ví dụ chứng minh là hàm setTimeout sẽ sẽ gọi hàm callback như là lệnh đầu tiên và nhận lệnh thời gian (đơn vị ms) là lệnh thứ hai:

function callback() {
​​    console.log("I am the first");
​​}
​​setTimeout(callback, 300);
​​console.log("I am the last");
​​// output
​​// I am the last
​​// I am the first

Sau 300 mili-giây, lệnh callback được gọi. Nhưng trước khi lệnh này hoàn thành thì dòng code còn lại sẽ chạy, đó là lý do vì sao lệnh console.log được chạy trước.

Dev hay nhầm callback là bất đồng bộ, ví dụ như callback trả về giá trị được dùng cho toán tử khác như sau:

function addTwoNumbers() {
​​    let firstNumber = 5;
​​    let secondNumber;
​​    setTimeout(function () {
​​        secondNumber = 10;
​​    }, 200);
​​    console.log(firstNumber + secondNumber);
​​}
​​addTwoNumbers();
​​// NaN

NaN sẽ là output bởi vì secondNumber không được xác định. Cái lúc chạy firstNumber + secondNumber, secondNumber vẫn là không xác định vì chức năng setTimeout sẽ chạy sau lệnh callback 200ms.

Cách tốt nhất để tiếp cận nó là thực hiện các dòng code còn lại với lệnh callback:

function addTwoNumbers() {
​​    let firstNumber = 5;
​​    let secondNumber;
​​    setTimeout(function () {
​​        secondNumber = 10;
​​        console.log(firstNumber + secondNumber);
​​    }, 200);
​​}
​​addTwoNumbers();
​​// 15

Xem thêm việc làm JavaScript lương cao tại TopDev

Sai references tới this

this là khái niệm dễ nhầm lẫn nhất trong JavaScript. Để thành thục this trong JS, bạn cần hiểu rõ cách nó hoạt động vì nó khá là khác so với những ngôn ngữ khác.

const obj = {
​​    name: "JavaScript",
​​    printName: function () {
​​        console.log(this.name);
​​    },
​​    printNameIn2Secs: function () {
​​        setTimeout(function () {
​​            console.log(this.name);
​​        }, 2000);
​​    },
​​};
​​obj.printName();
​​// JavaScript
​​obj.printNameIn2Secs();
​​// undefined

Kết quả đầu tiên là JavaScriptthis.name trỏ chính xác về tên thuộc tính của object. Kết quả thứ hai sẽ là undefinedthis bị mất tham chiếu tới các thuộc tính của object (bao gồm cả tên).

Lý giải cho việc này là do this phụ thuộc vào cái object gọi function chứa nó. Có từng biến this trong từng function nhưng cái object nó trỏ tới sẽ được xác định bởi cái object mà đang gọi nó.

Cái this trong obj.printName()​ trỏ thằng tới obj​. Cái this​ trong obj.printNameIn2Secs​ trỏ thẳng tới obj​. Nhưng cái this trong cái function callback setTimeout​ sẽ không trỏ tới bất kỳ object nào bởi vì không có object gọi nó.

Với object được gọi là setTimeout thì những cái như obj.setTimeout...​ sẽ được thực hiện. Vì không có object nào gọi cái function đó cho nên object mặc định  (window) sẽ được dùng.

name không hiện diện trong window, dẫn tới undefined

Cách hay nhất để giữ các reference tới this trong setTimeout là dùng bind, call, apply hay arrow function. Không giống với các function khác, arrow function không tự tạo this cho riêng nó. Cho nó ví dụ bên dưới sẽ giữ reference tới this:

​​const obj = {
​​    name: "JavaScript",
​​    printName: function () {
​​        console.log(this.name);
​​    },
​​    printNameIn2Secs: function () {
​​        setTimeout(() => {
​​            console.log(this.name);
​​        }, 2000);
​​    },
​​};
​​obj.printName();
​​// JavaScript
​​obj.printNameIn2Secs();
​​// JavaScript
  JavaScript có thể làm được nhiều hơn bạn nghĩ!

Bỏ qua tính mutability của object

Không như những kiểu dữ liệu nguyên thủy như string, number, trong JS objects là kiểu dữ liệu tham chiếu. Ví dụ trong các object key-value:

const obj1 = {
​​    name: "JavaScript",
​​};
​​const obj2 = obj1;
​​obj2.name = "programming";
​​console.log(obj1.name);
​​// programming

obj1obj2 có cùng tham chiếu tới vị trí memory chứa object đó.

Trong các mảng:

const arr1 = [2, 3, 4];
​​const arr2 = arr1;
​​arr2[0] = "javascript";
​​console.log(arr1);
​​// ['javascript', 3, 4]

Lỗi hay gặp là bỏ qua đặc tính này của JavaScript và dẫn tới một số error. Ví dụ, 5 object đều có cùng tham chiếu tới cùng object, một trong số object này có thể can thiệp vào thuộc tính codebase có quy mô large-scale.

Khi điều này xảy ra thì bất kỳ nỗ lực nào truy cập vào thuộc tính ban đầu sẽ trả về undefined hay thậm chí là xuất hiện error.

Cách giải quyết là luôn tạo một reference cho từng cái object mới khi muốn nhân bản một object, và rest operator (...) là giải pháp thiết thực nhất.

Ví dụ, trong object key-value:

​​const obj1 = {
​​    name: "JavaScript",
​​};
​​const obj2 = { ...obj1 };
​​console.log(obj2);
​​// {name: 'JavaScript' }
​​obj2.name = "programming";
​​console.log(obj.name);
​​// 'JavaScript'

Trong các mảng:

const arr1 = [2, 3, 4];
​​const arr2 = [...arr1];
​​console.log(arr2);
​​// [2,3,4]
​​arr2[0] = "javascript";
​​console.log(arr1);
​​// [2, 3, 4]

Lưu array và object trong browser storage

Đôi lúc với JS, lập trình viên sẽ tận dụng localStorage để lưu các value. Nhưng lỗi hay mắc nhất ở đây là cố lưu arrays và object trong localStorage, mà localStrorage thì chỉ chấp nhận strings (chuỗi).

Để lưu object, JS chuyển object thành một string. Kết quả là [Object Object] cho các object và string được cách ra bởi dấu phẩy cho những thành tố array.

Ví dụ:

​​const obj = { name: "JavaScript" };
​​window.localStorage.setItem("test-object", obj);
​​console.log(window.localStorage.getItem("test-object"));
​​// [Object Object]
​​const arr = ["JavaScript", "programming", 45];
​​window.localStorage.setItem("test-array", arr);
​​console.log(window.localStorage.getItem("test-array"));
​​// JavaScript, programming, 45

Khi các object được lưu như thế này, sẽ rất khó khăn để access chúng. Với ví dụ object, access object như .name sẽ dẫn đến error. Bời vì [Object Object] giờ là string mà không có thuộc tính name.

Cách hay nhất để lưu objects và arrays trong local storage là dùng  JSON.stringify (để đổi objects thành strings) và JSON.parse​ (đổi strings thành objects). Như vậy việc access tới object sẽ trở nên dễ dàng.

Phiên bản đúng của đoạn code phía trên sẽ là:

​​const obj = { name: "JavaScript" };
​​window.localStorage.setItem("test-object", JSON.stringify(obj));
​​const objInStorage = window.localStorage.getItem("test-object");
​​console.log(JSON.parse(objInStorage));
​​// {name: 'JavaScript'}
​​const arr = ["JavaScript", "programming", 45];
​​window.localStorage.setItem("test-array", JSON.stringify(arr));
​​const arrInStorage = window.localStorage.getItem("test-array");
​​console.log(JSON.parse(arrInStorage));
​​// JavaScript, programming, 45

Không dùng những value mặc định

Set default value (giá trị mặc định) trong hàng ngàn variables là cách hay nhất để ngăn chặn các error không mong muốn. Ví dụ của một lỗi thường gặp:

function addTwoNumbers(a, b) {
​​    console.log(a + b);
​​}
​​addTwoNumbers();
​​// NaN

Kết quả sẽ là NaN bởi vì aundefinedbundefined. Nếu dùng default values thì có thể ngăn những error như thế này. Ví dụ:

function addTwoNumbers(a, b) {
​​    if (!a) a = 0;
​​    if (!b) b = 0;
​​    console.log(a + b);
​​}
​​addTwoNumbers();
​​// 0

Thay vào đó, default value trong ES6 có thể được sử dụng:

​​function addTwoNumbers(a = 0, b = 0) {
​​    console.log(a + b);
​​}
​​addTwoNumbers();
​​// 0

Ví dụ này tuy đơn giản nhưng nhấn mạnh tầm quan trọng của default value. 

  JavaScript Arrays và Objects thật ra không khác gì sách và báo

Đặt tên biến không phù hợp

Ừ đó, dev giờ vẫn mắc lỗi này. Đặt tên thì khá phức tạp nhưng không có lựa chọn nào khác. Comment là good practice trong lập trình nên đặt tên biến cũng vậy. Ví dụ:

function total(discount, p) {
​​    return p * discount
​​}

Biến discount thì cũng được nhưng còn p hay total? Total của cái gì? Cho nên:

function totalPrice(discount, price) {
​​    return discount * price
​​}

Đặt tên biến phù hợp sẽ giúp những contributors dễ dàng nắm được cách hoạt động của project.

Kiểm tra giá trị boolean

const isRaining = false
​​if(isRaining) {
​​    console.log('It is raining')
​​} else {
​​    console.log('It is not raining')
​​}
​​// It is not raining

Thường thấy cách kiểm tra giá trị boolean như đoạn code phía trên, dù ổn nhưng error sẽ xuất hiện khi test một vài values.

Với JS, loose comparison của 0false sẽ thành true, còn 1true sẽ thành true. Điều này đồng nghĩa nếu isRaining1, isRainingtrue.

Đây cũng là lỗi hay gặp trong objects. Ví dụ:

const obj = {
​​    name: 'JavaScript',
​​    number: 0
​​}
​​if(obj.number) {
​​    console.log('number property exists')
​​} else {
​​    console.log('number property does not exist')
​​}
​​// number property does not exist

Dù có thuộc tính number, nhưng obj.number trở về 0. đó là value false, vì vậy block else được thực hiện.

Cho nên trừ khi bạn chắc về chuỗi value được dùng, boolean value và các properties trong object nên được test như thế này:

if(a === false)...
if(object.hasOwnProperty(property))...

Nhầm lẫn giữa Addition và Concatenation

Dấu cộng (+) có hai chức năng trong JS: phép cộng hay nối. Cộng là dành cho số còn nối thì cho chuỗi, nhiều dev hay xài nhầm cái này. Ví dụ:

const num1 = 30;
​​const num2 = "20";
​​const num3 = 30;
​​const word1 = "Java"
​​const word2 = "Script"
​​console.log(num1 + num2);
​​// 3020
​​console.log(num1 + num3);
​​// 60
​​console.log(word1 + word2);
​​// JavaScript

Khi thêm chuỗi và số, JS chuyển số thành chuỗi, và nối tất cả value. Khi thực hiện cộng số thì diễn ra quá trình toán học rồi.

Kết luận

Dĩ nhiên là còn rất nhiều lỗi khác rất hay gặp, nên hãy luôn update bản thân thường xuyên. Học hỏi và phòng tránh các lỗi này sẽ giúp bạn build app và tool có giá trị hơn.

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

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

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev ngay!

Nghe người trong cuộc kể lại hành trình thực tập tại Gameloft – “Đại gia ngành Game Mobile”

việc làm gameloft

Vào ngày 04/09 vừa qua, Gameloft đã chính thức khép lại chương trình thực tập LEAP 2020 với nhiều cảm xúc lắng đọng trong từng thành viên.

Được biết đến là một trong những thương hiệu nhà tuyển dụng hấp dẫn nhất do sinh viên ngành CNTT bình chọn, Gameloft Việt Nam luôn đặt việc phát triển tài năng trẻ lên hàng đầu. Để hiện thực hóa sứ mệnh đó, Gameloft đã triển khai LEAP Program trong nhiều năm liền.

LEAP là chương trình đào tạo và thực tập thường niên của Gameloft Việt Nam dành riêng cho các bạn sinh viên ngành CNTT và đặc biệt là các bạn có niềm đam mê với lĩnh vực công nghệ “hot” nhất nhì trên thế giới – lập trình game. Khác với những năm trước, thay vì chỉ tập trung vào ngôn ngữ C++ và engine Cocos2dx thì năm nay LEAP đã mở rộng thêm ngôn ngữ C# và engine Unity –một trong những engine phổ biến nhất hiện nay.

Tuyển Game Master hấp dẫn lương cao đến 3000USD

Khởi động từ tháng 7, chương trình LEAP tại TP. Hồ Chí Minh đã thu hút hơn 250 đơn đăng kí từ các bạn sinh viên năm 3, 4 khối ngành Công nghệ. Trải qua sau 2 tuần thử thách và tuyển chọn gắt gao, ban tổ chức đã tìm được 18 ứng viên chính thức trở thành Leapers cùng gia nhập vào đại gia đình Gameloft.

18 ứng viên chính thức trở thành Leapers cùng gia nhập vào đại gia đình Gameloft

Trong khuôn khổ LEAP Program, các bạn sinh viên sẽ được trau dồi kiến thức chuyên môn bài bản dưới sự dẫn dắt của các đàn anh giàu kinh nghiệm. Bên cạnh đó, các bạn còn được tiếp cận với quy trình và công nghệ làm game tiên tiến, cũng như rèn luyện kĩ năng và thực hành trên các thiết bị hiện đại. Đặc biệt, các bạn còn có cơ hội trở thành nhân viên chính thức tại Gameloft chỉ sau 2 tháng thực tập.

Các bạn Leapers đang tập trung code game

Ngoài ra, Gameloft cũng chú trọng trang bị cho các thực tập sinh những kỹ năng mềm cần thiết như viết CV, làm việc nhóm, giao tiếp hiệu quả,… Dựa vào những kiến thức đó, Leapers sẽ áp dụng vào việc sáng tạo những tựa game mới từ khâu lên ý tưởng, gameplay, thiết kế đồ họa, coding, fix bug cho đến việc hoàn thiện game. 

Gặp gỡ Tường Vỹ – thực tập sinh LEAP 2020 tại Studio TP. Hồ Chí Minh: “Tham gia vào chương trình LEAP, em đã có cơ hội tự sáng tạo sản phẩm game của riêng mình. Đây cũng là lần đầu tiên em được trải nghiệm quy trình làm game chuyên nghiệp, chuẩn quốc tế ở Gameloft. Mặc dù công ty phải trải qua giai đoạn work-from-home do dịch COVID-19 nhưng trải nghiệm của em về LEAP vẫn không bị ảnh hưởng.”

Tìm việc làm Game đãi ngộ tốt trên TopDev

Một thực tập sinh khác, bạn Hồng Huy – sinh viên năm 3 trường Đại học Bách Khoa cho biết:

“Điều em tâm đắc nhất ở LEAP là sự nhiệt tình của các anh mentors và trainers. Trong suốt quá trình sáng tạo game, các anh đã cùng ăn cùng ngủ với tụi em trong một thời gian dài và luôn sẵn sàng hỗ trợ khi có vấn đề xảy ra. Chắc chắn là sau khi tốt nghiệp, em sẽ quay lại nơi đây để được đồng hành cùng “500 anh em” tại Gameloft.”

Chương trình LEAP 2020 khép lại với nhiều cảm xúc lắng đọng

LEAP Program hứa hẹn là một chương trình thực tập không thể bỏ lỡ dành cho các bạn sinh viên đam mê lập trình game nói riêng cũng như các bạn có định hướng nghề nghiệp trong ngành công nghệ nói chung. Hãy cùng theo dõi fanpage của Gameloft (Gameloft South East Asia – https://www.facebook.com/GameloftSEA/) để không lỡ duyên với bất cứ chương trình hấp dẫn nào. Và khi cơ hội tới, ngại ngùng gì mà không mạnh dạn “Join the game!” các anh tài nhé!

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev ngay!

Hướng dẫn viết Chrome Extension tự động duyệt bài viết khi scroll

Hướng dẫn viết Chrome Extension tự động duyệt bài viết khi scroll

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

Mấy nay lướt lướt Facebook thấy nhiều bài viết đang chờ được duyệt trong nhóm quá. Là một người Mod quản lý nhóm cũng như duyệt các bài viết đúng nội quy là có các #hashtag hợp lệ. Vào cứ lướt lướt scroll rồi kiểm tra bài viết có hashtag chưa thì bấm nút Approve, thấy lười lười nên suy nghĩ có cách nào khi scroll mà thấy bài viết đó có hashtag hợp lệ thì tự động nhấn duyệt luôn không ta ? Thế là mình nghĩ ngay đến Chrome Extension.

  30 tiện ích Chrome cho designer và dev
  Một số mẹo vặt dành cho Developer trên Chrome

Chắc trên mạng có nhiều rồi cơ mà mình chỉ dùng đơn giản và chỉ dùng cho bản thân mình mà thôi cho nên lên mạng tìm tòi mày mò cách viết Chrome Extension ra sao và ngồi mày mò viết ra được một extension đơn giản để tự động duyệt các bài viết hợp lệ cho các thành viên một cách nhanh gọn lẹ. Nên hôm nay vui vui chia sẻ cho các bạn biết cách tạo ra một extension như cái của mình như thế nào luôn nhé. Bắt đầu thôi nào.

# Thiết lập

Các bạn mở phần mềm VScode hoặc phần mềm soạn thảo code nào mà các bạn đang dùng. Sau đó các bạn tạo một thư mục tên gì cũng được, ở đây mình đặt là approve, sau đó mình tạo một file có tên là manifest.json, đây là file bắt buộc dùng khi viết Chrome Extension nhé.

Ở đây các bạn chú ý ở các mục như content_scripts chỗ matches nghĩa là nếu đường dẫn có dạng https://*/* thì extension chúng ta mới chạy được, * có thể là tên trang web, đường dẫn…, file content.js là code chúng ta sẽ làm sau, default_icon là ảnh cho extension kích thước 19×19, default_popup là khi các bạn muốn nhấn vào extension thì nó ra cái khung, chỗ này để các bạn có thể làm thêm UI hiển thị thêm chức năng. Cuối cùng là perrmissions: [“activeTab”] là quyền truy cập vào tab mà các bạn đang mở ấy.

Tiếp đến là các bạn tạo các file lần lượt là popup.html nội dung để trống cũng được do trong extension này chưa cần dùng tới, và file content.js để xử lý khi scroll ở trang duyệt bài của Admin. Cấu trúc thư mục lúc này gồm có các files như icon.png, popup.html, manifest.json và content.js.

# Sự kiện scroll

Khi scroll thì chúng ta sẽ dùng sự kiện scroll cho window như sau

Tuy nhiên có một vấn đề là khi các bạn sử dụng sự kiện scroll và mỗi khi các bạn scroll thì hàm sẽ chạy liên tục mỗi mili giây như vậy không tốt chút nào, mình muốn khi scroll thì sau khoảng 0,25s mới thực hiện hàm đó.

Để giải quyết vấn đề này thì mình có đọc trên mạng cách xử lý đó chính là sử dụng debounce. Hiểu nôm nà là nó sẽ không cho phép một hàm được gọi nhiều hơn một lần trong một khoảng thời gian nhất định. Điều này đặc biệt quan trọng khi chúng ta muốn gán xử lý cho một sự kiện mà sự kiến ấy xảy ra liên tục rất nhiều lần trong một khoảng thời gian ngắn trong trường hợp này là scroll.

Chúng ta có code debounceFn như sau:

Đồng thời mình viết riêng một hàm có tên là handleApprove, để khi scroll sẽ gọi hàm này. Lúc này ta có code như sau:

Mình dùng cái debounceFn bọc cái hàm handleApprove lại và mỗi lần scroll sau 0,25s thì mình mới gọi hàm handleApprove

# Kiểm tra nội dung hợp lệ

Khi mình vào trang quản lý các bài viết đang được chờ duyệt, mình F12 lên và kiểm tra code của Facebook thì mình thấy rằng các bài viết là thẻ div có attribute role là article, và đều nằm trong một thẻ div cha có id là pending_queue. Lúc này mình viết đoạn code để lấy toàn bộ các bài viết đó như sau

Và mình code tiếp thế này

Mình sẽ kiểm tra xem biến postList có phần tử nào không, nếu có ít nhất một phần tử tức là .length > 0 thì mình sẽ xử lý tiếp. Mình tạo một biến content = "" để khởi tạo nội dung. Sau đó mình dùng vòng lặp for duyệt qua danh sách các bài viết ở postList, và mình kiểm tra tiếp trong HTML của facebook có thẻ div với data-testid="post_messsage" là nội dung mà các thành viên soạn thảo khi đăng bài. Ví dụ

#fe_question Xin chào các anh chị, cho em hỏi là….

Thì mình dựa vào các phần tử trong postList ở đây là postList[j] và chọn tới thẻ div với data-testid="post_message" và lấy nội dung chữ bên trong với phương thức textContent. Tiếp đến mình viết thêm một hàm có tên là isValidContent với tham số truyền vào là biến content để kiểm tra nội dung hợp lệ hay không thì mới duyệt. Hàm này có nội dung như sau

Trong hàm này mình khai báo một biến là validHashtags là mảng chứa danh sách các hashtags hợp lệ của nhóm, sau đó mình dùng vòng lặp để chạy qua mảng hashtags này và kiểm tra nếu nội dung truyền vào tức là biến content sau khi chuyển sang in thường bằng phương thức toLowerCase() và kiểm tra nếu nó chứa một trong các từ khoá đó bằng phương thức includes, thì trả về true. Không thì hàm này sẽ trả về false.

Quay lại đoạn code trên mình đã nói tới khúc này. Nếu isValidContent trả về đúng thì sẽ chạy đoạn code bên trong. Thì mình lại mò tiếp HTML của Facebook xem cấu trúc chỗ nút Approve là gì thì thấy nó là thẻ a và có attribute là ajaxify có chứa từ approve.

Lúc này từ phần tử mình đang xét tới, mình truy vấn tới thẻ a đó bằng cấu trúc là a[ajaxify*="approve"] *= nghĩa là có chứa từ approve, và cho chắc cú thì mình kiểm tra là nếu có nó thì nó sẽ trigger sự kiện click(). Như vậy là xong. Toàn bộ code trong file content.js lúc này sẽ như sau.

# Sử dụng

Ở đây mình chỉ sử dụng ở máy mình, không có đăng lên cho ai sử dụng cả cho nên mình sẽ chỉ cho các bạn cách dùng dưới máy tính các bạn hoặc các bạn có thể chia sẻ thư mục cho bạn bè bạn để sử dụng cũng được như sau.

Các bạn nhấn vào chỗ 3 chấm dọc của Chrome trên cùng bên phải, dropdown xổ ra chọn more tools sau đó chọn mục Extensions. Tiếp đến các bạn chọn mục Development mode bên góc bên phải, lúc này thanh Development mode hiện xuống bên trái, các bạn chọn load unpacked và chọn folder mà các bạn đã tạo hồi nãy, ở đây mình đặt là approve.

Bây giờ mỗi lần mình vào trang quản lý bài viết chờ duyệt và scroll xuống là sẽ tự động duyệt bài viết, đơn giản và cũng tuyệt vời chứ nhỉ.

Như vậy là xong, các bạn có thể dùng extension được rồi, nếu các bạn là admin hay mod gì đó có thể test thử nhé. Nếu có lỗi gì hay hỏi thêm về kiến thức Extension hay bài viết mình có sai sót gì mong được các bạn góp ý. Chúc các bạn một ngày tốt lành

Lưu ý mỗi nhóm sẽ có một rule khác nhau và hashtag khác nhau, bài của mình chỉ áp dụng vào group mình đang quản lý, có thể group các bạn khác, các bạn có thể thay hoặc thêm chỗ validHashtags sao cho phù hợp nhé. Nếu các bạn muốn tự làm extension đa dạng, mạnh mẽ hơn nữa thì có thể lên Youtube tìm kiếm từ khoá Chrome Extenstion Tutorial nhé.

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

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

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

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Tôi đã kiếm tiền bằng việc freelancer ở đâu?

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

Freelancer là một công việc tự do, phù hợp với những người đã có kinh nghiệm làm việc và muốn có thêm thu nhập ngoài việc làm ở trên công ty. Bài viết này tôi sẽ giới thiệu về một nền tảng kiếm tiền mà tôi hiện tại đang làm đó là Fiverr. Vậy Fiverr là gì?

  Là Freelance Developer, bạn nên "định giá" bản thân như thế nào?
  Những kỹ năng cần thiết cho freelancer

Fiverr là gì ?

Fiverr là một network freelancer rất lớn trên thị trường quốc tế, là nơi giao dịch giữa người cùng cấp dịch vụ và người muốn thuê dịch vụ. Fiverr nó sẽ khác với những trang freelancer khác, những trang freelancer khác thì người muốn thuê họ sẽ đưa công việc cụ thể lên, người cần việc họ sẽ vào chào giá. Còn riêng fiverr thì người cần việc sẽ tạo ra một dịch vụ, người muốn thuê họ sẽ xem dịch vụ của mình và tiến hành order.
Ví dụ : Tôi là một lập trình viên và tham gia vào nền tảng fiverr, kinh nghiệm của tôi là lập trình web thì tôi sẽ tạo ra một dịch vụ có tên là “I will make web for you”. Người nào mà muốn làm web thì họ sẽ thấy dịch vụ của bạn và sẽ liên hệ với bạn

Hướng dẫn tạo tài khoản Fiverr

Click vào link ĐĂNG KÝ FIVERR , sau khi click sẽ hiển thị ra giao diện bên dưới.

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Step 1 : Ở bước này sẽ nhập email của bạn và nhấn Continue

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Step 2 : Nhập một username và password sau đó chọn Join. Lưu ý password phải là chuỗi bao gồm chữ hoa, chữ thường, ký tự số, ký tự đặc biệt và phải dài hơn 7 ký tự.

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Step 3 : Verify để chứng minh không phải là BOT

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Step 4 : Sau khi verify thành công thì Fiverr yêu cầu bạn phải vào mail để kích hoạt tài khoản

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Step 5 : Sau khi nhấn active từ mail thì sẽ nhận được thông báo kích hoạt thành công như hình.

Chỉnh sửa thông tin tài khoản

Sau khi kích hoạt thành công thì trên thông báo có mục edit your profile, bạn hãy nhấn vào đó.

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?
[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Khi nhấn vào edit your profile thì sẽ di chuyển đến màn hình này, ở đây bạn chỉ cần nhập vào FullName và nhấn Save Changes.

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Ở góc phải trên của màn hình có một cái icon, nhấn vào đó nó sẽ mở một popup nhỏ có chữ Profile. Nhấn vào Profile sẽ di chuyển vào chi tiết thông tin của tài khoản.

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Ở đây bạn sẽ tick vào I’m a freelancer và nhấn Save Changes

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Tiếp theo thì bạn sẽ kéo chuột xuống phía dưới và thêm các kỹ năng mà bạn có, trường học của bạn và các chứng chỉ khác nếu có. Đây là thông tin mà khách hàng họ sẽ xem thông tin của bạn, đây cũng là yếu tố để khách hàng có chọn bạn để thực hiện yêu cầu của họ hay không. Một profile không có gì thì chắc chắn là không đạt độ tin tưởng rồi phải không nào.

Cách tạo Gig

Ở fiverr có một khái niệm gọi là Gig. Gig ở đây có nghĩa là dịch vụ của bạn muốn cho người khác thuê. Ví dụ tôi sẽ có một Gig (dịch vụ) tên là “I will coding java for you”.

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Để tạo Gig thì tại Profile nhấn vào “Create a New Gig”, lần đầu đăng ký tài khoản sẽ có một vài trang giới thiệu, bạn hãy đọc kỹ và sau đó nhấn Continue.

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Nếu chưa cập nhật thông tin thì fiverr sẽ yêu cầu cập nhật một số thông tin chi tiết, bao gồm tên đầy đủ, avatar và mô tả về tài khoản và các thông tin khác. Những thông tin nào có dấu * màu đỏ là bắt buộc phải có. Các bạn làm theo hết tất cả các bước nhé.

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Sau khi hoàn tất các thông tin thì sẽ ra giao diện của đăng ký Gig như bên trên. Tiếp theo chúng ta sẽ điền thông tin của Gig

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

GIG TITLE : Luôn bắt đầu là từ “I will” cái này là mặc định có sẵn của Gig. Tiếp theo sau đó sẽ điền tên nội dung dịch vụ mà bạn muốn bán. Ở đây tôi sẽ ghi là “create website for you”
CATEGORY: Ở mục này sẽ chọn PROGRAMMING & TECH và WEB PROGRAMMING. Có rất nhiều loại category khác, tùy theo kỹ năng của bạn là gì thì sẽ chọn tương ứng
SERVICE TYPE : Chọn WEB APPLICATION
GIG METADATA : Ở mục này thì tôi sẽ chọn program language là PHP
SEARCH TAGS : Mục này bạn sẽ nhập vào php, html, javascript. Tùy theo ngôn ngữ của bạn là gì.
Sau khi nhập xong nhấn Save continue

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Ở đây điền đầy đủ thông tin của gói BASIC, trong này sẽ có 3 gói là BASIC, STANDARD, PREMIUM. Tùy theo mức độ làm kéo dài bao nhiêu thời gian thì sẽ chọn gói tương ứng. Ở đây tôi chỉ hướng dẫn điền thông tin cho gói BASIC
Name your package : Tên của gói dịch vụ của mình (thường sẽ điền giống tên của Gig)
Describe the details of your offering : Mô tả thông tin chi tiết về lời đề nghị của bạn.
Day delivery : Chọn số ngày hoàn thành dự án.
Price : Chọn số tiền cho dịch vụ của mình
Sau khi điền xong thì chọn Save continue

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Briefly Describe Your Gig : Nhập mô tả chi tiết về Gig của bạn, ví dụ như dịch vụ của bạn cung cấp là gì, những công nghệ bạn sử dụng trong dự án….Sau khi điền xong nhấn Save Continue

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Ở bước này là những lời nhắn nhủ mà bạn muốn nói với khách hàng khi order dịch vụ của bạn. Ví dụ khách hàng cần chuẩn bị cái gì, thông tin, tài liệu gì để bạn có thể dễ dàng làm việc. Sau đó nhấn Save Continue

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Ở bước này, bạn cần chuẩn bị một tấm ảnh để làm ảnh đại diện cho Gig của mình. Sau khi chọn xong nhấn Save continue.

[Chia sẻ] Tôi đã kiếm tiền bằng việc freelancer ở đâu?

Ở bước cuối cùng chọn Publish Gig. Như vậy là đã tạo thành công Gig của mình. Khi bạn quay lại profile của mình thì sẽ thấy có một Gig đang Active.

Làm sao để người khác biết đến và thuê Gig của mình

Khi mới tham gia fiverr thì ban đầu tôi cũng không có người thuê, tuy nhiên cũng may mắn là có một vài người liên lạc. Lúc đó tôi làm với giá rất rẻ, được đánh giá 5 sao, việc đánh giá này dùng để tăng độ uy tín với những người khác. Lúc độ uy tín tăng thì họ sẽ thuê mình. Việc người khác biết đến thì họ sẽ tìm những dịch vụ trùng với tên Gig mà chúng ta cung cấp, hoặc chúng ta sẽ đem link dịch vụ đi các group, forum nào đó để quảng bá dịch vụ của chúng ta.

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

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

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

Mục tiêu phát triển nào bạn đặt ra vào 5 năm tới? – Phần 2

mục tiêu phát triển

Trong phần 1, TopDev đã đề cập với các bạn về việc tự nhìn nhận giá trị bản thân và hiểu được mong muốn từ nhà tuyển dụng. Bài viết hôm nay sẽ có những phân tích sâu hơn về cách thức giải quyết thách thức từ nhà tuyển dụng: Mục tiêu phát triển nào bạn đặt ra vào năm 5 tới?

Mọi thách thức được đặt ra như nhằm mục đích khai thác mục tiêu phát triển của mỗi ứng viên. Bằng cách đưa ứng viên vào các tình thế áp lực trong buổi phỏng vấn, nhà tuyển dụng muốn thấy được năng lực thật sự của họ.

Hãy lưu tâm và nắm bắt những điều sau đây nhé! Vì nó có thể giúp bạn trả lời được thách thức từ nhà tuyển dụng đấy.

Đâu là đích đến trong cuộc sống của bạn?

Tại sao phải trả lời câu hỏi này? Nếu đọc kỹ phần 1, bạn dễ nhận thấy đích đến trong cuộc sống có mối liên quan lớn đến các giá trị bạn đang sở hữu. Vấn đề nằm ở chỗ bạn có nhận ra được nó hay không? 

mục tiêu

Do vậy, hãy bắt đầu đặt câu hỏi tại sao với những gì bạn đang theo đuổi. Bạn học tiếng anh hay một ngoại ngữ khác bên cạnh chuyên môn, vì sao vậy? Không phải bạn muốn tạo ra thế cân bằng trong cuộc chơi nghề nghiệp hay sao?

Bạn tham gia nhiều sự kiện, workshop về công nghệ, gặp gỡ các chuyên gia đầu ngành nhằm mục đích trau dồi thêm kiến thức bổ trợ cho quá trình làm việc sau này. Dù thứ bạn làm nhỏ nhặt hay to lớn, tất cả đều phải có một đích đến. Đó chính là nơi hoài bão của bạn được thực hiện.

24 tiếng trong 1 ngày vẫn cứ thế trôi qua. Liệu bạn đã từng dành cho bản thân một ít thời gian để ngẫm lại: Bạn mong muốn điều gì? Bạn làm gì để thực hiện nó? Bạn cần có thêm những gì để đủ bản lĩnh theo đuổi và thực hiện ước mơ?

Điều quan trọng là bạn cần nhận ra niềm vui với những thứ bạn theo đuổi. Hãy sống để trải nghiệm, đừng sống chỉ để tồn tại.

Hoạch định các mục tiêu phát triển cụ thể

Tại sao phải lên kế hoạch thực hiện các mục tiêu?

Bạn khó chạm đến thành công nếu chỉ dựa vào các mục đích. Xác định được mục đích là điều tất nhiên phải thực hiện. Song, việc tìm ra các mục tiêu cụ thể lại rất quan trọng. 

  Bài toán thành công: Đâu là những bí quyết cần nắm bắt?
  Khám phá phong cách hợp tác của bạn

mục tiêu

Việc hoạch định các mục tiêu giúp bạn tập trung hơn vào quá trình khai thác bản thân. Bạn sẽ biết mình cần làm gì để thiết lập các mục tiêu cụ thể. Từ các mục tiêu, bạn có những kế hoạch rõ ràng hơn tương ứng với từng nhiệm vụ.

Không những thế, bạn còn chủ động hơn trong việc tìm các yếu tố phù hợp với bản thân. Đồng thời, bạn biết cách phân bổ chúng hợp lý để thuận tiện trong việc tiếp thu những cái mới. Đó là nước đi thông minh để đảm bảo quá trình giải quyết nhiệm vụ không bị gián đoạn.

Chẳng hạn như bạn muốn trở thành một lập trình viên giỏi, bạn cần phải biết những kỹ năng nào cần rèn luyện. Tiếp thu các kiến thức nền tảng về ngôn ngữ lập trình là bước đi đầu tiên.

Bên cạnh đó, bạn đã sẵn sàng tâm lý để đối mặt với những áp lực trong ngành hay chưa? Hãy lập kế hoạch thực hiện các mục tiêu vì nó là cơ sở quyết định mức độ thăng tiến của bạn trên hành trình nghề nghiệp.

Mục tiêu phát triển ngắn hạn và dài hạn

mục tiêu

Đừng lo sợ, hãy đặt ra 3 mục tiêu cho bản thân gồm: Mục tiêu ngắn hạnmục tiêu dài hạn. Tất nhiên, các mục tiêu phát triển đều phải liên quan đến sự nghiệp của bạn.

Mục tiêu ngắn hạn là được bạn lên kế hoạch; triển khai thành các nhiệm vụ có mối liên hệ với nhau. Bạn cần đảm bảo hoàn thành chúng từ 1-2 năm hoăc 2-3 năm. Tùy vào khả năng mỗi người, nó có thể kéo dài hơn. Song, mọi thứ đều có giới hạn riêng và mục tiêu ngắn hạn cũng không ngoại lệ. Đừng để tình trạng trì trệ xảy ra. Đây là khoảng thời gian bạn nên tập trung vào những việc nhất thiết phải thực thi, tránh làm ảnh hưởng đến tiến độ phát triển.

– Đối với mục tiêu dài hạn, bạn cần tích lũy đủ vốn kinh nghiệm. Đồng thời, đợi đến một thời gian chín muồi để phát triển bản thân một cách toàn diện

Hãy quan tâm đến sự thăng tiến!

Những mục tiêu đã có, những kế hoạch thực hiện đã được hoàn thiện. Vậy làm thế nào để bạn đạt được những mục tiêu đó? Điểm mấu chốt chính nằm ở sự thăng tiến. Thăng tiến trong sự nghiệp chính là đích đến của nhiều người, dù ở bất cứ lĩnh vực nào. Và tất nhiên để đạt được sự thăng tiến, bạn cần trải qua từng giai đoạn và chạm đến từng nấc thang khác nhau trong sự nghiệp.

Xem thêm: Để thăng tiến, cần phải có chiến lược!

Chằng hạn như mô tả chặng đường phát triển của một ứng viên trong ngành nhân sự. Nếu may mắn trúng tuyển vào vị trí nhân viên tuyển dụng. Từ đây, họ cần đặt ra những nấc thang trên hành trình vươn tới đỉnh cao sự nghiệp. 

Hiên thực hóa sự thăng tiến bằng những “nấc thang nỗ lực”

Những nấc thang đầu tiên, bạn cần phải đảm nhận hoàn hảo các nhiệm vụ của một nhân viên tuyển dụng. Bạn có thể trải nghiệm các khóa học nâng cao chuyên môn. Điều này tạo ra cơ hội để bạn biết thêm nhiều kỹ năng như: quản lý, tổ chức, điều phối, hoạch định chiến lược nhân sự,…

Các vị trí trưởng phòng/chuyên viên nhân sự, giám đốc nhân sự, lãnh đạo nhân sự cấp cao,… đều là đích đến mà nhiều người ao ước. Và tất nhiên, mọi thứ đều được đánh đổi bằng sự nỗ lực.

Xem thêm: Những lý do làm kìm hãm sự thăng tiến của bạn

mục tiêu

Thực tế cho thấy, nếu bạn không muốn thăng tiến thì môi trường sẽ thúc đẩy bạn. Chính môi trường làm việc với sức ép cạnh tranh lớn, tự bạn sẽ phải nỗ lực để thăng tiến. Kỹ năng là một thứ quan trọng đảm bảo về chất lượng chuyên môn của bạn. Tuy nhiên, để đạt đến những mục tiêu cao hơn, cái bạn cần nhiều hơn thế. Bạn thật sự phải quan tâm đến nhiều yếu tố khác nhau như: giao tiếp, xây dựng – phát triển các mối quan hệ, lãnh đạo – quản lý con người,..

Hãy đi lên bằng sự cố gắng! Mỗi nấc thang là mỗi mục tiêu bạn cần vượt qua để chứng minh rằng sự thăng hoa trong sự nghiệp của bạn là đều có lý do.

Lời kết

Chính các giá trị bạn đang sở hữu sẽ giúp bạn nhận ra được đâu là thế mạnh bạn cần phải phát huy. Hãy vạch ra cho bản thân các kế hoạch cụ thể để chinh phục những mục tiêu. Khi hiểu được tầm quan trọng của việc nhận ra các giá trị, bạn sẽ biết cách phát huy tiềm năng mình một cách tốt nhất.

Thách thức: Mục tiêu nào bạn đặt ra vào 5 năm tới sẽ không còn là khó khăn đối với bạn nữa. Cách trả lời phù hợp nhất – thông minh nhất sẽ đến từ cách thức bạn thể hiện bản thân có những gì. Và quan trọng, TopDev hi vọng bạn phải thật sự sống đúng với những điều bản thân mình theo đuổi. 

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

Xem thêm việc làm ngành it hàng đầu tại TopDev

[P1] Tổng quan về Distributed Systems

Tổng quan về Distributed Systems

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

Đây là bài viết mở đầu trong series bài viết về đề tài Distributed Systems. Dự định của mình là sẽ thực hiện loạt bài viết tương đối chuyên sâu về các chủ đề: Distributed Systems, Microservices, Transactions, Event sourcing, CQRS, Domain Driven Design, và nếu có thời gian, có thể sẽ đề cập đến cả Blockchain nữa.

  System Admin là gì? Mô tả công việc vị trí System Administrator
  Discord đã lưu trữ hàng tỉ messages mỗi ngày như thế nào

Sơ lược

Một “hệ thống phân tán” (Distributed Systems-từ giờ xin được phép sử dụng từ gốc tiếng Anh) được định nghĩa là một tập hợp các tiến trình điện toán (process) độc lập, được kết nối với nhau bởi một hệ thống mạng (network) để các process này có thể truyền nhận thông tin (‘process’ ở đây được định nghĩa là một đơn vị điện toán được vận hành với một không gian bộ nhớ-memory space-riêng biệt, không trùng lặp với các process khác). Các process này phối hợp hoạt động với nhau như một thực thể duy nhất đối với người dùng bên ngoài nhằm thực thi một nhiệm vụ nào đó. Dựa theo định nghĩa này thì nhiều process trên cùng 1 máy tính cũng có thể được coi như Distributed Systems (DS). Dĩ nhiên trên thực tế, người ta quan tâm đến việc vận hành nhiều máy tính cùng với nhau, cho nên chúng ta có thể ngầm hiểu là các process này chạy trên các máy tính riêng biệt.

Tuyển dụng System Engineer lương cao

Vậy tại sao chúng ta cần tìm hiểu về DS? DS xuất hiện rất phổ biến trên thực tế. Hầu hết các ứng dụng ngày nay, đặc biệt là các ứng dụng Internet, đều được triển khai dưới dạng DS. Việc triển khai phần mềm, đặc biệt là những hệ thống lớn, trên nhiều đơn vị máy tính (thay vì chỉ dùng một máy tính duy nhất) có rất nhiều lợi ích, VD như:

  • Cung cấp nhiều tài nguyên hơn khi hệ thống cần xử lý lượng công việc lớn hơn.
  • Chỉ dùng một đơn vị máy tính đồng nghĩa với rủi ro phần mềm bị sập (crash) nếu máy đó gặp sự cố. Dùng nhiều đơn vị máy sẽ cho phép bạn tiếp tục vận hành phần mềm kể cả khi sự cố xảy ra.
  • Khi hệ thống của bạn trở nên phức tạp và cần sự kết hợp từ nhiều thành phần khác nhau, sử dụng DS cho phép bạn chia nhỏ một hệ thống to thành nhiều đơn vị nhỏ. Mỗi đơn vị có thể hoạt động độc lập, thậm chí có thể được phát triển bởi các team khác nhau với các chuyên môn khác nhau.
  • Người dùng hệ thống có thể có sự phân tán về mặt địa lý trên toàn cầu. Để đảm bảo chất lượng dịch vụ và hạn chế độ trễ thì hệ thống máy cũng cần được phân tán để có thể có mặt ở gần người dùng nhất có thể.

Xây dựng Distributed Systems có gì khó ?

Tuy mang đến nhiều lợi ích như kể trên, DS cũng làm cho việc phát triển và vận hành trở nên phức tạp hơn, do đặc tính phân tán của nó. Để xây dựng một hệ thống DS hoạt động tốt, chúng ta sẽ phải giải quyết rất nhiều bài toán, tùy thuộc vào đặc thù của hệ thống đó. Có thể kể ra một vài bài toán thường gặp như:

  • Bài toán về xử lý sự cố (failure): Với một hệ thống máy tính lớn thì việc máy móc gặp trục trặc hay sự cố là điều thường xuyên xảy ra. Xử lý sự cố để không làm ảnh hưởng đến hệ thống (hoặc ít ra là giảm thiểu ảnh hưởng) là vấn đề cốt lõi nhất trong việc xây dựng DS.
  • Vấn đề đồng thuận về dữ liệu (consensus): Xây dựng DS đồng nghĩa với việc dữ liệu của hệ thống cũng sẽ bị phân tán. Điều này gây ra trở ngại nếu chúng ta muốn hệ thống làm việc như một thực thể thống nhất, vì các máy đôi khi sẽ bất đồng với nhau về mặt dữ liệu.
  • Vấn đề bất đồng bộ về mặt thời gian: Mỗi máy tính trong hệ thống có một đồng hồ riêng biệt, và không nhất quán với nhau về mặt thời gian. Đồng hồ máy tính cũng thường xuyên xảy ra tình trạng chạy lệch pha (clock drift). Sự bất đồng bộ này có thể dẫn đến sai lệch về mặt logic của hệ thống. VD như, nếu một ứng dụng nhắn tin không thống nhất được về mặt thời gian, thứ tự tin nhắn của người dùng có thể sẽ sai lệch giữa người dùng này với người dùng kia.
  • Các vấn đề khác như vấn đề bảo mật, vấn đề giao tiếp, vấn đề lưu trữ và sao lưu dữ liệu…

Có một điều thú vị trong lĩnh vực DS, đó là các bài toán kể trên hầu như không có lời giải lý thuyết nào đáp ứng được yêu cầu một cách hoàn hảo trên (sẽ được bàn luận sâu hơn trong các bài sau). Tuy nhiên điều này không có nghĩa là chúng không có những cách giải quyết phù hợp trong thực tế, tùy vào từng hệ thống cụ thể. Hầu hết các tiến triển gần đây trong lĩnh vực DS đều nhắm đến việc xây dựng những lời giải thực tế cho những hệ thống với mục đích cụ thể.

Các kiểu sự cố trong Distributed Systems

Như đã nói ở trên, sự cố trong vận hành hệ thống xảy ra một cách thường xuyên. Sau đây là đoạn lược dịch lời Jeff Dean, một kĩ sư trưởng tại Google:

Trong trung tâm dữ liệu (data center) của Google, mỗi năm một cluster sẽ xảy ra khoảng 1000 sự cố máy, hàng ngàn sự cố ổ cứng, trung bình một sự cố về nguồn điện khiến cho khoảng 500-1000 server bị sập trong vòng khoảng 6 tiếng đồng hồ. Ngoài ra, trung bình 5 rack sẽ gặp trục trặc, làm mất đi một nửa số packet được truyền tải, làm ảnh hưởng đến khoảng 5% số server tại bất kì thời điểm nào.

Vì sự cố xảy ra thường xuyên như vậy, nên các hệ thống DS cần có cơ chế tự động xử lý khi gặp phải tình huống xấu, vì không phải lúc nào con người cũng có thể can thiệp một cách kịp thời. Để giải quyết được vấn đề này thì chúng ta cần hiểu được hệ thống có thể gặp phải những kiểu sự cố nào.

Sự cố về máy (node failure)

Mỗi máy tính vật lý, do nhiều nguyên nhân khác nhau, có thể gặp sự có trong khi hoạt động. Người ta chia các sự cố này thành một vài loại chính:

  • Fail-stop: Đây là kiểu sự cố khiến cho process trên máy dừng hoạt động (dừng tính toán cũng như truyền nhận tin). Nguyên nhân sự cố này có thể do máy bị sập (lỗi phần mềm, lỗi hệ điều hành …), lỗi phần cứng, hay những nguyên nhân bên ngoài (vd như mất điện chẳng hạn). Đây là kiểu sự cố thường gặp nhất, nên khi người ta nói đến ‘failure’ mà không nhắc gì thêm thì thường được ngầm hiểu là kiểu sự cố này. Hầu hết các thuật toán được phát triển trong DS đều nhằm đối phó với kiểu sự cố này.
  • Fail-recover: Process có thể ngừng hoạt động trong một thời gian nhất định, nhưng sau đó phục hồi hoạt động trở lại. Nguyên nhân của kiểu sự cố này có thể là do máy tự động reboot do một nguyên nhân nào đó. Thường khi nhắc đến kiểu sự cố này, người ta mặc đình rằng máy có khả năng lưu trữ thông tin vào ổ đĩa cứng và phục hồi thông tin này sau khi sự cố xảy ra.
  • Byzantine failure: Sự cố mà máy tính không hoạt động theo đúng yêu cầu đề ra. VD như, máy có thể gửi tin tùy ý, hay thay đổi trạng thái tùy ý, không giống những gì được lập trình. Đây là kiểu sự cố khó chịu nhất, có thể xảy ra khi hệ thống gặp trục trặc không rõ nguyên nhân (vd như RAM có thể bị hỏng khiến xảy ra tình trạng bit-flip), hay do hệ thống bị kể xấu tấn công.

Sự cố về network

[P1] Tổng quan về Distributed Systems

Mạng máy tính cũng là một sản phẩm vật lý và vì vậy cũng có thể xảy ra sự cố. Một kiểu sự cố thường gặp là sự cố “chia cắt mạng” (network partitioning), được mô phỏng bởi hình trên. Sự cố này xảy ra đường truyền của một hoặc nhiều server bị chia cắt khỏi phần còn lại của hệ thống, khiến hệ thống bị chia cắt thành nhiều phần không thể giao tiếp với nhau. Trên thực tế, trong các data center, một cluster máy chủ thường được kết nối với nhau bởi một hoặc nhiều cục switch. Sự cố của cổng switch hoặc dây dẫn có thể dẫn đến việc một hay nhiều server bị ngắt kết nối, dẫn đến tình trạng partitioning kể trên.

Ngoài ra, một vài sự cố mạng khác có thể kể ra như việc latency bị tăng cao (do congestion control), hay network adapter của các server gặp trục trặc …

Thiết kế Distributed Systems để sẵn sàng xử lý các sự cố

Do sự cố xảy ra thường xuyên và đa dạng như đã kể trên, hệ thống DS cần được thiết kế để có cơ chế tự động xử lý sự cố, đảm bảo việc vận hành không bị gián đoạn hay sai sót. Sau đây mình sẽ trích đoạn một bài báo khoa học có tên là “Về việc thiết kế và triển khai các dịch vụ Internet”, của tác giả James Hamilton (khi đó làm việc tại Microsoft, hiện tại là kĩ sư trưởng tại Amazon Web Service):

Thiết kế hệ thống để xử lý sự cố là khái niệm cốt lõi khi phát triển các dịch vụ quy mô lớn, bao gồm nhiều thành phần nhỏ. Những thành phần này sẽ thường xuyên gặp sự cố, và đôi khi sự cố này có thể dẫn đến sự cố kia. Khi hệ thống được triển khai trên khoảng 10,000 server và 50,000 đơn vị đĩa cứng, sự cố sẽ xảy ra nhiều lần trong một ngày. Nếu sự cố nào cũng cần đến con người can thiệp, hệ thống sẽ không thể vận hành một cách trơn tru và tiết kiệm được chi phí. Do đó, hệ thống cần có cơ chế đối phó với sự cố mà không cần con người can thiệp. Cơ chế này cần được kiểm tra một cách thường xuyên. Một cách đơn giản để kiểm tra là cố tình gây ra sự cố thường xuyên trong quá trình vận hành hệ thống. Điều này thoạt nghe có vẻ vô lý, tuy nhiên, nếu cơ chế sự cố không thường xuyên được sử dụng thì chúng sẽ không hoạt động khi cần thiết.

Nói thế để thấy rằng, khi phát triển một hệ thống DS, vấn đề sự cố luôn phải được coi như một phần của bài toán, và chúng ta tuyệt đối không được mặc định rằng sự cố không bao giờ xảy ra.

Distributed Systems là một lĩnh vực tương đối sâu rộng và trong một vài bài viết thì khó mà chúng ta có thể đề cập chi tiết hết về các chủ đề được. Sau đây mình chia sẻ một vài nguồn thông tin để các bạn có thể tìm hiểu sâu hơn về lĩnh vực này:

Trong phần sau, mình sẽ bàn về bài toán đồng thuận (Consensus), một bài toán cơ bản nhất trong Distributed Systems.

Bài viết gốc được đăng tải tại dhhoang.github.io

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

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

Cách tạo Điện thoại giả Lập trong Android Studio

Cách tạo Điện thoại giả Lập trong Android Studio

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

Ở bài 2 các bạn đã biết cách tạo 1 Project trong Android Studio rồi. Nhưng làm thế nào để chạy được phần mềm này lên điện thoại? Đâu phải ai cũng có điện thoại đúng không? làm thế nào để không có điện thoại mà vẫn test phần mềm bình thường?

  10 tài liệu lập trình Android miễn phí từ cơ bản đến nâng cao
  30+ công cụ phát triển ứng dụng Android chuyên nghiệp ( Phần 1)

Bài này Tui sẽ hướng dẫn các bạn cách thức tạo một Điện thoại giả lập trong Android Studio để thay thế điện thoại thật. Giúp bạn tiết kiệm chi phí mà vẫn học được bình thường.

Và Lưu ý thêm, từ Android 5.0 thì máy tính phải hỗ trợ ảo hóa, do đó các bạn nhớ kích hoạt ảo hóa lên nhé. Thường các dòng máy mới thì nó có sẵn tính năng này, nhưng đôi khi nó vẫn chưa được kích hoạt lên trước nhé, tùy dòng máy là chuẩn BIOS hay chuẩn UEFI mà các bạn tìm chỗ chỉnh, xem bài này để kích hoạt ảo hóa.

Từ màn hình trong bài 2, ta chọn AVD Manager (có 2 cách):

  • Vào Menu Tools-> chọn AVD Manager
  • hoặc nhấn biểu tượng AVD Manager trên thanh toolbar

Cách tạo Điện thoại giả Lập trong Android Studio

Lúc này màn hình Android Virtual Device Manager sẽ hiển thị ra như dưới đây:

Cách tạo Điện thoại giả Lập trong Android Studio

Ở màn hình trên, bạn thấy Android Studio của Tui có sẵn 3 điện thoại giả lập (do Tui làm trước đó).

Của bạn thì không có gì nha vì chưa tạo bao giờ. Bạn sẽ nhấn vào nút “Create Virtual Device”, màn hình Virtual Device Configuration sẽ xuất hiện ra như dưới đây:

Cách tạo Điện thoại giả Lập trong Android Studio

Trong mục Category chọn Phone

Trong danh sách điện thoại, lựa chọn Resolution vừa phải thôi, nó có rất nhiều chủng loại. Nhưng lưu ý là khi tạo máy ảo nó chiếm như máy thật trong Laptop. Nên Tui đề nghị các bạn chọn Nexus 4 (4.7″) cho nó nhẹ nhàng.

Sau đó nhấn Next, Android sẽ yêu cầu chọn System Image (là lựa chọn phiên bản Android SDK, OS version):

Cách tạo Điện thoại giả Lập trong Android Studio

ở màn hình trên, Bạn thấy của Tui có version thì có chữ Download, có cái thì không. Cái nào không có chữ Download tức là đã tải thành công rồi, Cái nào có chữ Download kế bên tức là chưa tải gì cả. Của bạn thì thường là toàn bộ 100% có chữ Download kế bên do bạn chưa cài bao giờ.

Bạn chọn phiên bản rồi nhấn Download nhé, phiên bản nào cũng được miễn là >=26 (Cái Project HelloWorld đình đám của bạn chọn min là 26, và cũng là đề nghị của Google). Phần mềm của bạn chỉ có thể chạy được với các điện thoại có API >=26 trở lên.

Tuyển android không cần kinh nghiệm

Giả sử bây giờ Tui muốn dùng bản R, Tui sẽ bấm vào chữ Download:

Khi nhấn Download thì có ra màn hình SDK QuickFix installation:

Cách tạo Điện thoại giả Lập trong Android Studio

Bạn thấy dung lượng khoảng hơn 1 GB. Ráng ngồi đợi cho nó tải xong nhé, khi nào xong ta sẽ thấy màn hình như dưới đây:

Cách tạo Điện thoại giả Lập trong Android Studio

Bạn bấm Finish nhé, lúc này nó quay lại màn hình chọn System Image, và rõ ràng chữ Download thần thánh kế bên R đã ra đi không kèn không trống. Tới đây ta bắt đầu làm điện thoại ảo được rồi:

Cách tạo Điện thoại giả Lập trong Android Studio

Ta chọn R -> rồi bấm Next.

Cách tạo Điện thoại giả Lập trong Android Studio

AVD Name: Là tên của máy ảo, thích đặt tên gì cũng được.

Sau đó nhấn FINISH luôn nha

Lưu ý: Mới học thì đừng có tỏ vẻ nguy hiểm chỗ này, bên trong nó còn nhiều cấu hình khác như là RAM, SD card…. bằng cách nhấn vào Show Advanced Settings:

Cách tạo Điện thoại giả Lập trong Android Studio

Các thông số ở đây nó y chang như điện thoại thật, bạn mà táy máy nâng nó lên thì ổ cứng của bạn sẽ bị sài hết nha.

Do đó cứ để mặc định ban đầu, nhấn FINISH luôn nghe không. Sau khi bấm FINISH, tên máy ảo này sẽ xuất hiện vào danh sách dưới đây:

Cách tạo Điện thoại giả Lập trong Android Studio

Mỗi một máy ảo nó có các nút: Chạy, Sửa….:

Cách tạo Điện thoại giả Lập trong Android Studio

Ta bấm vào biểu tượng hình Tam giác để chạy điện thoại nhé (lần đầu chạy hơi lâu nhé, ráng chờ):

Cách tạo Điện thoại giả Lập trong Android Studio

Trước mặt chúng ta là 1 điện thoại giả lập nó y chang như điện thoại thật nha: Nó có thể nhắn tin, gọi điện thoại, kiểm tra Sensor, Google map…

Như vậy các bạn đã tạo được Điện thoại giả lập thành công, bài học sauTui sẽ trình bày sơ lược cách sử dụng máy ảo trước khi chúng ta chạy phần mềm “HelloWorld” thần thánh lên nó.

Các bạn chú ý theo dõi nhé

chúc các bạn thành công.

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

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

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